ucblogo-6.1/0000775000175000017500000000000013601427050011110 5ustar jjcjjcucblogo-6.1/logolib/0000775000175000017500000000000013601420003012526 5ustar jjcjjcucblogo-6.1/logolib/ycor0000664000175000017500000000007213563251612013443 0ustar jjcjjc;;; -*- logo -*- to ycor output last pos end bury "ycor ucblogo-6.1/logolib/xcor0000664000175000017500000000007313563251612013443 0ustar jjcjjc;;; -*- logo -*- to xcor output first pos end bury "xcor ucblogo-6.1/logolib/while0000664000175000017500000000024213563251612013576 0ustar jjcjjc;;; -*- logo -*- .macro while :while.cond :while.instr if not run :while.cond [op []] op se :while.instr (list "while :while.cond :while.instr) end bury "while ucblogo-6.1/logolib/until0000664000175000017500000000023613563251612013624 0ustar jjcjjc;;; -*- logo -*- .macro until :until.cond :until.instr if run :until.cond [op []] op se :until.instr (list "until :until.cond :until.instr) end bury "until ucblogo-6.1/logolib/unburyname0000664000175000017500000000012413563251612014652 0ustar jjcjjc;;; -*- logo -*- to unburyname :names unbury namelist :names end bury "unburyname ucblogo-6.1/logolib/unburyall0000664000175000017500000000006113563251612014502 0ustar jjcjjc;;; -*- logo -*- to unburyall unbury buried end ucblogo-6.1/logolib/transfer0000664000175000017500000000101513563251612014311 0ustar jjcjjc;;; -*- logo -*- to transfer :transfer.limit :transfer.template :transfer.init output cascade.2 (ifelse emptyp :transfer.limit ~ [[emptyp ?2]] ~ [list "transfer.end.test :transfer.limit]) ~ :transfer.template [] [butfirst ?2] :transfer.init end to transfer.end.test :the.condition.expression if emptyp ?2 [output "true] output run :the.condition.expression end to ?in output first ?2 end to ?out output ?1 end bury [transfer transfer.end.test ?in ?out] ucblogo-6.1/logolib/setpen0000664000175000017500000000061313563251612013766 0ustar jjcjjc;;; -*- logo -*- to setpen :pen_data ifelse equalp first bf :pen_data "reverse ~ [penreverse] ~ [ifelse equalp first bf :pen_data "erase ~ [penerase] ~ [penpaint]] ifelse equalp first :pen_data "penup [penup] [pendown] setpensize first bf bf :pen_data setpencolor first bf bf bf :pen_data setpenpattern first bf bf bf bf :pen_data end bury [setpen] ucblogo-6.1/logolib/savel0000664000175000017500000000021413563251612013577 0ustar jjcjjc;;; -*- logo -*- to savel :cont :file [:oldwr writer] openwrite :file setwrite :file po :cont setwrite :oldwr close :file end bury "savel ucblogo-6.1/logolib/rseq0000664000175000017500000000016113563251612013440 0ustar jjcjjc;;; -*- logo -*- to rseq :a :b :n output map [[x] :a + :x * (:b - :a) / (:n - 1)] iseq 0 :n - 1 end bury "rseq ucblogo-6.1/logolib/reverse0000664000175000017500000000024013563251612014137 0ustar jjcjjc;;; -*- logo -*- to reverse :in [:out ifelse listp :in [[]] ["]] if emptyp :in [output :out] output (reverse bf :in combine first :in :out) end bury "reverse ucblogo-6.1/logolib/remove0000664000175000017500000000014513563251612013765 0ustar jjcjjc;;; -*- logo -*- to remove :thing :list output filter [not equalp ? :thing] :list end bury "remove ucblogo-6.1/logolib/remdup0000664000175000017500000000013613563251612013764 0ustar jjcjjc;;; -*- logo -*- to remdup :list output filter [not memberp ? ?rest] :list end bury "remdup ucblogo-6.1/logolib/reduce0000664000175000017500000000040013563251612013731 0ustar jjcjjc;;; -*- logo -*- to reduce :reduce.function :reduce.list if emptyp bf :reduce.list [op first :reduce.list] op apply :reduce.function (list (first :reduce.list) ~ (reduce :reduce.function bf :reduce.list)) end bury "reduce ucblogo-6.1/logolib/quoted0000664000175000017500000000014313563251612013767 0ustar jjcjjc;;; -*- logo -*- to quoted :stuff if wordp :stuff [op word "" :stuff] op :stuff end bury "quoted ucblogo-6.1/logolib/queue0000664000175000017500000000021413563251612013611 0ustar jjcjjc;;; -*- logo -*- to queue :the.queue.name :the.item.value make :the.queue.name lput :the.item.value thing :the.queue.name end bury "queue ucblogo-6.1/logolib/push0000664000175000017500000000021213563251612013442 0ustar jjcjjc;;; -*- logo -*- to push :the.stack.name :the.item.value make :the.stack.name fput :the.item.value thing :the.stack.name end bury "push ucblogo-6.1/logolib/pots0000664000175000017500000000007113563251612013453 0ustar jjcjjc;;; -*- logo -*- to pots pot procedures end bury "pots ucblogo-6.1/logolib/pops0000664000175000017500000000007013563251612013446 0ustar jjcjjc;;; -*- logo -*- to pops po procedures end bury "pops ucblogo-6.1/logolib/popls0000664000175000017500000000006613563251612013627 0ustar jjcjjc;;; -*- logo -*- to popls po plists end bury "popls ucblogo-6.1/logolib/popl0000664000175000017500000000025313563251612013442 0ustar jjcjjc;;; -*- logo -*- to popl :names ignore error catch "error [po pllist :names] local "err make "err error if not emptyp :err [(throw "error first bf :err)] end bury "popl ucblogo-6.1/logolib/pop0000664000175000017500000000026213563251612013266 0ustar jjcjjc;;; -*- logo -*- to pop :the.stack.name local "result make "result first thing :the.stack.name make :the.stack.name butfirst thing :the.stack.name output :result end bury "pop ucblogo-6.1/logolib/pons0000664000175000017500000000006313563251612013446 0ustar jjcjjc;;; -*- logo -*- to pons po names end bury "pons ucblogo-6.1/logolib/pon0000664000175000017500000000025313563251612013264 0ustar jjcjjc;;; -*- logo -*- to pon :names ignore error catch "error [po namelist :names] local "err make "err error if not emptyp :err [(throw "error first bf :err)] end bury "pon ucblogo-6.1/logolib/poall0000664000175000017500000000007013563251612013574 0ustar jjcjjc;;; -*- logo -*- to poall po contents end bury "poall ucblogo-6.1/logolib/pllist0000664000175000017500000000020413563251612013773 0ustar jjcjjc;;; -*- logo -*- to pllist :names if wordp :names [output (list [] [] (list :names))] output (list [] [] :names) end bury "pllist ucblogo-6.1/logolib/pick0000664000175000017500000000013113563251612013411 0ustar jjcjjc;;; -*- logo -*- to pick :list output item (1+random count :list) :list end bury "pick ucblogo-6.1/logolib/pen0000664000175000017500000000021013563251612013243 0ustar jjcjjc;;; -*- logo -*- to pen op (list (ifelse pendownp ["pendown] ["penup]) ~ penmode pensize pencolor penpattern) end bury [pen] ucblogo-6.1/logolib/namelist0000664000175000017500000000017613563251612014310 0ustar jjcjjc;;; -*- logo -*- to namelist :names if wordp :names [output list [] (list :names)] output list [] :names end bury "namelist ucblogo-6.1/logolib/name0000664000175000017500000000017513563251612013413 0ustar jjcjjc;;; -*- logo -*- to name :name.value.input :name.variable.input make :name.variable.input :name.value.input end bury "name ucblogo-6.1/logolib/mdsetitem0000664000175000017500000000017213563251612014463 0ustar jjcjjc;;; -*- logo -*- to mdsetitem :index :array :val setitem last :index (mditem bl :index :array) :val end bury "mdsetitem ucblogo-6.1/logolib/mditem0000664000175000017500000000020613563251612013745 0ustar jjcjjc;;; -*- logo -*- to mditem :index :array if emptyp :index [op :array] op mditem bf :index item first :index :array end bury "mditem ucblogo-6.1/logolib/mdarray0000664000175000017500000000041713563251612014131 0ustar jjcjjc;;; -*- logo -*- to mdarray :sizes [:origin 1] local "array make "array (array first :sizes :origin) if not emptyp bf :sizes ~ [for [i :origin [:origin + (first :sizes) - 1]] ~ [setitem :i :array (mdarray bf :sizes :origin)]] output :array end bury "mdarray ucblogo-6.1/logolib/map.se0000664000175000017500000000063613563251612013660 0ustar jjcjjc;;; -*- logo -*- to map.se :map.se.template [:template.lists] 2 op map.se1 :template.lists 1 end to map.se1 :template.lists :template.number if emptyp first :template.lists [output []] output sentence (apply :map.se.template firsts :template.lists) ~ (map.se1 bfs :template.lists :template.number+1) end to ?rest [:which 1] output bf item :which :template.lists end bury [map.se map.se1 ?rest] ucblogo-6.1/logolib/map0000664000175000017500000000062713563251612013252 0ustar jjcjjc;;; -*- logo -*- to map :map.template [:template.lists] 2 op map1 :template.lists 1 end to map1 :template.lists :template.number if emptyp first :template.lists [output first :template.lists] output combine (apply :map.template firsts :template.lists) ~ (map1 bfs :template.lists :template.number+1) end to ?rest [:which 1] output bf item :which :template.lists end bury [map map1 ?rest] ucblogo-6.1/logolib/macroexpand0000664000175000017500000000054613563251612014776 0ustar jjcjjc;;; -*- logo -*- to macroexpand :expr local [name inputlist macro.result] make "name first :expr make "inputlist bf :expr if not macrop :name [(throw "error (se :name [is not a macro.]))] define "%%%$%macro.procedure text :name make "macro.result run fput "%%%$%macro.procedure :inputlist erase "%%%$%macro.procedure op :macro.result end bury "macroexpand ucblogo-6.1/logolib/localmake0000664000175000017500000000021413563251612014415 0ustar jjcjjc;;; -*- logo -*- .macro localmake :name :value output (list "local (word "" :name) "apply ""make (list :name :value)) end bury "localmake ucblogo-6.1/logolib/iseq0000664000175000017500000000033213563251612013427 0ustar jjcjjc;;; -*- logo -*- to iseq :a :b if not (:a > :b) [output iseq1 :a :b] output map [[x] -1 * :x] iseq1 (-1 * :a) (-1 * :b) end to iseq1 :a :b if :a > :b [output []] output fput :a iseq1 :a + 1 :b end bury [iseq iseq1] ucblogo-6.1/logolib/invoke0000664000175000017500000000020713563251612013762 0ustar jjcjjc;;; -*- logo -*- to invoke :invoked.function [:invoke.inputs] 2 .maybeoutput apply :invoked.function :invoke.inputs end bury "invoke ucblogo-6.1/logolib/ignore0000664000175000017500000000006513563251612013754 0ustar jjcjjc;;; -*- logo -*- to ignore :stuff end bury "ignore ucblogo-6.1/logolib/gensym0000664000175000017500000000027213563251612013773 0ustar jjcjjc;;; -*- logo -*- to gensym if not namep "gensym.number [make "gensym.number 0] make "gensym.number :gensym.number + 1 output word "g :gensym.number end bury [[gensym] [gensym.number]] ucblogo-6.1/logolib/foreach0000664000175000017500000000123713563251612014102 0ustar jjcjjc;;; -*- logo -*- .macro foreach [:foreach.inputs] 2 catch "foreach.catchtag ~ [op foreach.done runresult ~ [foreach1 bl :foreach.inputs last :foreach.inputs 1]] op [] end to foreach1 :template.lists :foreach.template :template.number if emptyp first :template.lists [throw "foreach.catchtag] apply :foreach.template firsts :template.lists .maybeoutput foreach1 bfs :template.lists :foreach.template :template.number+1 end to foreach.done :foreach.result if emptyp :foreach.result [op [stop]] op (list "output "first (list first :foreach.result)) end to ?rest [:which 1] output bf item :which :template.lists end bury [foreach foreach1 foreach.done ?rest] ucblogo-6.1/logolib/for0000664000175000017500000000155313563251612013262 0ustar jjcjjc;;; -*- logo -*- .macro for :for.values :for.instr ~ [:for.var first :for.values] ~ [:for.initial run first bf :for.values] ~ [:for.final run first bf bf :for.values] ~ [:for.step forstep] ~ [:for.tester (ifelse :for.step < 0 ~ [[:for.initial < :for.final]] ~ [[:for.initial > :for.final]])] local :for.var catch "for.catchtag [op for.done runresult [forloop :for.initial]] op [] end to forloop :for.initial make :for.var :for.initial if run :for.tester [throw "for.catchtag] run :for.instr .maybeoutput forloop (:for.initial + :for.step) end to for.done :for.result if emptyp :for.result [op [stop]] op (list "output "first (list first :for.result)) end to forstep if equalp count :for.values 4 [op run last :for.values] op ifelse :for.initial > :for.final [-1] [1] end bury [for forstep forloop for.done] ucblogo-6.1/logolib/find0000664000175000017500000000060213563251612013406 0ustar jjcjjc;;; -*- logo -*- to find :find.template :template.list [:template.number 1] ~ [:template.lists (list :template.list)] if emptyp :template.list [op []] if apply :find.template (list first :template.list) [op first :template.list] op (find :find.template bf :template.list :template.number+1) end to ?rest [:which 1] output bf item :which :template.lists end bury [find ?rest] ucblogo-6.1/logolib/filter0000664000175000017500000000077313563251612013764 0ustar jjcjjc;;; -*- logo -*- to filter :filter.template :template.list [:template.number 1] ~ [:template.lists (list :template.list)] if emptyp :template.list [op :template.list] if apply :filter.template (list first :template.list) ~ [op combine (first :template.list) ~ (filter :filter.template bf :template.list :template.number+1)] op (filter :filter.template bf :template.list :template.number+1) end to ?rest [:which 1] output bf item :which :template.lists end bury [filter ?rest] ucblogo-6.1/logolib/filep0000664000175000017500000000021113563251612013561 0ustar jjcjjc;;; -*- logo -*- to filep :filename ignore error catch "error [openread :filename close :filename] output emptyp error end bury "filep ucblogo-6.1/logolib/fileQ0000664000175000017500000000021113557147341013530 0ustar jjcjjc;;; -*- logo -*- to file? :filename ignore error catch "error [openread :filename close :filename] output emptyp error end bury "file? ucblogo-6.1/logolib/erpl0000664000175000017500000000010513563251612013426 0ustar jjcjjc;;; -*- logo -*- to erpl :names erase pllist :names end bury "erpl ucblogo-6.1/logolib/ern0000664000175000017500000000010513563251612013250 0ustar jjcjjc;;; -*- logo -*- to ern :names erase namelist :names end bury "ern ucblogo-6.1/logolib/emacs.debug0000664000175000017500000000162613563251612014652 0ustar jjcjjc;;; -*- logo -*- to emacs.debug :file_elisp_code :trace_or_step localmake "wr_elisp_code writer if namep "printwidthlimit [ localmake "pw_elisp_code :printwidthlimit ern "printwidthlimit] openwrite :file_elisp_code setwrite :file_elisp_code bury [[] [wr_elisp_code pw_elisp_code file_elisp_code trace_or_step] []] (foreach contents run (list :trace_or_step) [PROCEDURES: VARIABLES: PROPERTIES:] [[names debugged title] [pr :title pr [] pr map [[name] [op ifelse memberp :name :debugged [(word "\( :name "\))] [:name]]] :names pr []]]) close :file_elisp_code setwrite :wr_elisp_code if namep "pw_elisp_code [make "printwidthlimit :pw_elisp_code] end bury "emacs.debug ucblogo-6.1/logolib/edps0000664000175000017500000000007213563251612013422 0ustar jjcjjc;;; -*- logo -*- to edps edit procedures end bury "edps ucblogo-6.1/logolib/edpls0000664000175000017500000000007013563251612013574 0ustar jjcjjc;;; -*- logo -*- to edpls edit plists end bury "edpls ucblogo-6.1/logolib/edpl0000664000175000017500000000010413563251612013407 0ustar jjcjjc;;; -*- logo -*- to edpl :names edit pllist :names end bury "edpl ucblogo-6.1/logolib/edns0000664000175000017500000000006513563251612013422 0ustar jjcjjc;;; -*- logo -*- to edns edit names end bury "edns ucblogo-6.1/logolib/edn0000664000175000017500000000010413563251612013231 0ustar jjcjjc;;; -*- logo -*- to edn :names edit namelist :names end bury "edn ucblogo-6.1/logolib/edall0000664000175000017500000000007213563251612013550 0ustar jjcjjc;;; -*- logo -*- to edall edit contents end bury "edall ucblogo-6.1/logolib/do.while0000664000175000017500000000021113563251612014173 0ustar jjcjjc;;; -*- logo -*- .macro do.while :while.instr :while.cond op se :while.instr (list "while :while.cond :while.instr) end bury "do.while ucblogo-6.1/logolib/do.until0000664000175000017500000000021113563251612014216 0ustar jjcjjc;;; -*- logo -*- .macro do.until :until.instr :until.cond op se :until.instr (list "until :until.cond :until.instr) end bury "do.until ucblogo-6.1/logolib/dequeue0000664000175000017500000000027213563251612014126 0ustar jjcjjc;;; -*- logo -*- to dequeue :the.queue.name local "result make "result first thing :the.queue.name make :the.queue.name butfirst thing :the.queue.name output :result end bury "dequeue ucblogo-6.1/logolib/crossmap0000664000175000017500000000077513563251612014330 0ustar jjcjjc;;; -*- logo -*- to crossmap :cm.template [:cm.lists] 2 if emptyp bf :cm.lists [op cm1 first :cm.lists 1 []] op cm1 :cm.lists 1 [] end to cm1 :cm.lists :cm.level :template.vars if emptyp :cm.lists [op (list apply :cm.template :template.vars)] op cm2 first :cm.lists end to cm2 :cm.thislist if emptyp :cm.thislist [op []] local :cm.level make :cm.level first :cm.thislist op se (cm1 bf :cm.lists :cm.level+1 lput first :cm.thislist :template.vars) ~ (cm2 bf :cm.thislist) end bury [crossmap cm1 cm2] ucblogo-6.1/logolib/cond0000664000175000017500000000150513563251612013414 0ustar jjcjjc;;; -*- logo -*- .macro cond :cond.clauses localmake "cond.result cond.helper :cond.clauses if equalp first :cond.result "error [(throw "error last :cond.result)] output last :cond.result end to cond.helper :cond.clauses if emptyp :cond.clauses [output [[] []]] if emptyp first :cond.clauses [output [error [Empty COND clause]]] if equalp first first :cond.clauses "else ~ [output list [] butfirst first :cond.clauses] ignore error catch "error [localmake "cond.result run first first :cond.clauses] localmake "cond.error error if not emptyp :cond.error [output list "error item 2 :cond.error] if not memberp :cond.result [true false] ~ [output list "error fput :cond.result [not TRUE or FALSE]] if :cond.result [output list [] butfirst first :cond.clauses] output cond.helper butfirst :cond.clauses end bury [cond cond.helper] ucblogo-6.1/logolib/combine0000664000175000017500000000020113563251612014075 0ustar jjcjjc;;; -*- logo -*- to combine :this :those if wordp :those [output word :this :those] output fput :this :those end bury "combine ucblogo-6.1/logolib/closeall0000664000175000017500000000011413563251612014262 0ustar jjcjjc;;; -*- logo -*- to closeall foreach allopen [close ?] end bury "closeall ucblogo-6.1/logolib/case0000664000175000017500000000102713563251612013403 0ustar jjcjjc;;; -*- logo -*- .macro case :case.value :case.clauses [:caseignoredp "true] catch "case.error [output case.helper :case.value :case.clauses] (throw "error [Empty CASE clause]) end to case.helper :case.value :case.clauses if emptyp :case.clauses [output []] if emptyp first :case.clauses [throw "case.error] if or equalp first first :case.clauses "else ~ memberp :case.value first first :case.clauses ~ [output butfirst first :case.clauses] output case.helper :case.value butfirst :case.clauses end bury [case case.helper] ucblogo-6.1/logolib/cascade.20000664000175000017500000000015413563251612014213 0ustar jjcjjc;;; -*- logo -*- to cascade.2 [:cascade2.inputs] 5 op apply "cascade :cascade2.inputs end bury "cascade.2 ucblogo-6.1/logolib/cascade0000664000175000017500000000221413563251612014052 0ustar jjcjjc;;; -*- logo -*- to cascade :cascade.limit [:cascade.inputs] 3 if numberp :cascade.limit ~ [if lessp :cascade.limit 0 ~ [(throw "error (se [cascade doesn't like] :cascade.limit [as input]))] ~ make "cascade.limit `[greaterp :template.number ,[int :cascade.limit]]] local [cascade.templates template.vars cascade.final] make "cascade.templates [] make "template.vars [] make "cascade.final [?1] cascade.setup :cascade.inputs op cascade1 1 :template.vars end to cascade.setup :inputs if emptyp :inputs [stop] if emptyp bf :inputs [make "cascade.final first :inputs stop] make "cascade.templates lput first :inputs :cascade.templates make "template.vars lput first bf :inputs :template.vars cascade.setup bf bf :inputs end to cascade1 :template.number :template.vars if apply :cascade.limit :template.vars [op apply :cascade.final :template.vars] op cascade1 (:template.number+1) (cascade.eval :cascade.templates) end to cascade.eval :cascade.templates if emptyp :cascade.templates [op []] op fput (apply first :cascade.templates :template.vars) ~ (cascade.eval bf :cascade.templates) end bury [cascade cascade.setup cascade1 cascade.eval] ucblogo-6.1/logolib/buryname0000664000175000017500000000011613563251612014310 0ustar jjcjjc;;; -*- logo -*- to buryname :names bury namelist :names end bury "buryname ucblogo-6.1/logolib/buryall0000664000175000017500000000007613563251612014145 0ustar jjcjjc;;; -*- logo -*- to buryall bury contents end bury "buryall ucblogo-6.1/logolib/backslashedp0000664000175000017500000000012213563251612015107 0ustar jjcjjc;;; -*- logo -*- to backslashedp :char op vbarredp :char end bury "backslashedp ucblogo-6.1/logolib/backslashedQ0000664000175000017500000000012213557147341015056 0ustar jjcjjc;;; -*- logo -*- to backslashed? :char op vbarredp :char end bury "backslashed? ucblogo-6.1/logolib/`0000664000175000017500000000534013563251612012711 0ustar jjcjjc;;; -*- logo -*- to ` :backq.list [:backq.depth 0] if emptyp :backq.list [op []] if equalp first :backq.list "` ~ [op fput "` fput (` first bf :backq.list :backq.depth+1) (` bf bf :backq.list :backq.depth)] if and wordp first :backq.list equalp first first :backq.list ", ~ [op backq.unquote (bf first :backq.list) (bf :backq.list) :backq.depth] if and wordp first :backq.list memberp first first :backq.list [" :] ~ [op backq.word (first first :backq.list) (bf first :backq.list) (bf :backq.list) :backq.depth] if wordp first :backq.list ~ [op fput first :backq.list (` bf :backq.list :backq.depth)] op fput (` first :backq.list :backq.depth) (` bf :backq.list :backq.depth) end to backq.word :backq.symbol :backq.word :backq.rest :backq.depth if emptyp :backq.word ~ [output fput :backq.symbol (` :backq.rest :backq.depth)] if not equalp first :backq.word ", ~ [output fput (word :backq.symbol :backq.word) (` :backq.rest :backq.depth)] localmake "result backq.unquote (bf :backq.word) :backq.rest :backq.depth if wordp :result [output word :backq.symbol :result] output fput (word :backq.symbol first :result) bf :result end to backq.unquote :unquote.symbol :unquote.rest :unquote.depth localmake "unquote.splicing "false if not emptyp :unquote.symbol [ if equalp first :unquote.symbol "@ [ make "unquote.splicing "true make "unquote.symbol butfirst :unquote.symbol ]] if :unquote.depth=0 [ if emptyp :unquote.symbol [output backq.combine run first :unquote.rest (` bf :unquote.rest :unquote.depth)] output backq.combine run :unquote.symbol (` :unquote.rest :unquote.depth) ] if emptyp :unquote.symbol ~ [output fput (ifelse :unquote.splicing [",@] [",]) fput (` first :unquote.rest :unquote.depth-1) (` bf :unquote.rest :unquote.depth)] if backq.all.commas :unquote.symbol ~ [output fput (ifelse :unquote.splicing [",@] [",]) fput (` (list :unquote.symbol first :unquote.rest) :unquote.depth-1) (` bf :unquote.rest :unquote.depth)] output fput (ifelse :unquote.splicing [",@] [",]) ~ fput (` (list :unquote.symbol) :unquote.depth-1) ~ (` :unquote.rest :unquote.depth) end to backq.combine :this :those output ifelse :unquote.splicing [se :this :those] [fput :this :those] end to backq.all.commas :word if emptyp :word [output "true] if equalp first :word ", ~ [if emptyp butfirst :word [output "true] if equalp first butfirst :word "@ [output backq.all.commas bf bf :word] output backq.all.commas butfirst :word] output "false end bury [` backq.word backq.unquote backq.combine backq.all.commas] ucblogo-6.1/logolib/Qrest0000664000175000017500000000013513557147341013573 0ustar jjcjjc;;; -*- logo -*- to ?rest [:which 1] output bf item :which :template.lists end bury "?rest ucblogo-6.1/logolib/#0000664000175000017500000000014413563251612012611 0ustar jjcjjc;;; -*- logo -*- to # if not namep "template.number [op repcount] op :template.number end bury "# ucblogo-6.1/logolib/Messages.zh_TW0000664000175000017500000000550113601420003015253 0ustar jjcjjc; UCBLogo message file version 6.1 ; Error messages -- position in this file corresponds to error number ; Lines starting with semicolon don't count in the line numbering ; and may be added at will. Logo: 嚴重的內部錯誤。 超出容量 堆疊溢出 海龜超出邊界 %p 不喜歡用 %s 做為輸入 %p 並沒有輸出到 %p 給 %p 的輸入不足 %p 不喜歡用 %s 做為輸入 給 %p 的輸入太多 你沒說要如何做 %s 太多的 '(' %s 沒有任何值 預料之外的 ')' 我不知道要如何 %p 找不到 %p 的抓取標記 %p 已經定義過 停止中… 已經滴落 檔案系統錯誤: %p 假設你的意思是 IFELSE,而不是 IF %p 被本地的程序呼叫所掩蔽 擲出 "Error %p 是一個基本詞 無法在程序之中使用 TO 我不知道如何去 %p %p 而沒有 TEST 預料之外的 ']' 預料之外的 '}' 無法啟始圖形 巨集程式傳回 %s 而不是一個串列 你沒有說用 %s 做什麼 可以在程序之中只使用 %p APPLY 不喜歡用 %s 做為輸入 END 於 %p 中在多列指令之內 Logo: 耗盡記憶體。 %p END 在多列指令之內 不當的可選輸入預設表示式: %s 無法在 RUNRESULT 之內使用 OUTPUT 或 STOP 假設你的意思是 '%p',而不是 %p 我無法開啟檔案 %p 檔案 %p 已經開啟 檔案 %p 沒有開啟 Runlist %s has more than one expression Variable name %s is defined both dynamically and in current object ; Non-error messages (no numeric error code for these) 謝謝你使用 Logo。 祝你今天愉快。 對不起,Mac 上沒有 shell。 輸入 EXIT 來回到 Logo。 位於 %s\n%s 抽出迴圈 暫停中… 停止 輸出 找不到檔案: %t\n 無法 KEYP,在這個系統上沒有 FIONREAD 沒有足夠的記憶體 我無法開啟那個檔案 檔案已經開啟 檔案沒有開啟 Pprop 歡迎使用 Berkeley Logo 版本 %t 你必須在一個程序中使用 OUTPUT 或 STOP。 警告: 記憶體不足以執行垃圾資訊收集器。 GC 已停用 - 儲存重要資料並離開! %s 已定義\n Make %s %s to %p\nend\n\n Plist %s = %s\n 沒有可用的說明。\n 在 %p 上沒有可用的說明。\n --更多-- ; Logo special words, used mostly in Logo-generated messages ; TRUE and FALSE are generated by predicates and accepted by IF etc. 真 假 ; End of a procedure end ; Some names of primitives treated specially in the evaluator ; (You still have to COPYDEF them to match any changes here.) 輸出 停止 跳到 標記 如果 若非 定 .巨集 ; Special CATCH tags 頂層 系統 錯誤 ; How no-value prints in error messages 沒事 ; Outputs from SCREENMODE 文字螢幕 分割螢幕 全螢幕 ; Outputs from PENMODE 繪圖 抹除 反相 ; Outputs from TURTLEMODE 迴轉 圍牆 視窗 ; HELP turns infix operators +-*/=<> into these 和 差 積 商 等於 小於 大於 不大於 不小於 不等於 ; Object stuff 名稱 類別 自身 授權證 起始清單 存在 ucblogo-6.1/logolib/Messages.sp0000664000175000017500000000533613601420003014650 0ustar jjcjjc; Spanish version of Berkeley Logo messages file 6.1 ; Error messages -- position in this file corresponds to error number ; Lines starting with semicolon don't count in the line numbering ; and may be added at will. Logo: Error Interno Fatal. no hay espacio desborde de pila tortuga fuera de los lmites a %p no le gust recibir %s %p no entreg nada a %p %p necesita recibir ms cosas a %p no le gust recibir %s demasiadas cosas entre parntesis () No dices qu debo hacer con %s demasiados parntesis '(' %s no tiene un valor todava parntesis ')' inesperado no s cmo realizar %p no puedo encontrar la etiqueta LANZA para %p %p ya est definida Parando... DRIBBLE est activado Error del sistema de archivos: %p Asumo que queras decir SIOTRO, no SI %p cubierta por local en llamada a procedimiento ATRAPA "Error %p es una primitiva No puedes usar PARA dentro de un procedimiento no se cmo realizar %p %p sin PRUEBA corchete ']' inesperado llave '}' inesperada no pude inicializar grficas Macro entreg %s en lugar de una lista No dices qu debo hacer con %s Solo puedes usar %p dentro de un procedimiento a APLICA no le gust recibir %s FIN dentro de una instruccin multi-lnea en %p Logo: Falta de Memoria. %p FIN dentro de una instruccin multi-lnea Mala expresin por defecto para parmetro opcional: %s No puedes usar RESPUESTA o ALTO dentro de ACTIVARESULTADO Asumo que queras decir '%p', no %p No puedo abrir archivo %p Archivo %p ya est abierto Archivo %p no est abierto Runlist %s has more than one expression Variable name %s is defined both dynamically and in current object ; Non-error messages (no numeric error code for these) Gracias por usar Logo. Que tengas un buen da. Lo lamento, no hay 'shell' en la Mac. Escribe EXIT para retornar a Logo. en %s\n%s Lazo ERRACT Pausando... se detuvo responde Archivo no encontrado: %t\n No se puede usar TECLAP, no hay FIONREAD en este sistema No hay suficiente memoria No puedo abrir ese archivo Archivo ya est abierto Archivo no est abierto Pprop Bienvenido a Berkeley Logo versin %t Debes estar dentro de un procedimiento para usar REPUESTA o ALTO. Advertencia: No hay suficiente memoria para ejecutar el recolector de basura. GC deshabilitado - Guarda informacin importante a disco y sal! %s definido\n DA %s %s PARA %p\nFIN\n\n Plista %s = %s\n No hay ayuda disponible.\n No hay ayuda disponible para %p.\n --ms-- cierto falso fin respuesta alto saltoa etiqueta si siotro para .macro toplevel sistema error nada ; Outputs from SCREENMODE textscreen splitscreen fullscreen ; Outputs from PENMODE paint erase reverse ; Outputs from TURTLEMODE wrap fence window ; HELP turns infix operators +-*/=<> into these sum difference product quotient equalp lessp greaterp lessequalp greaterequalp notequalp ucblogo-6.1/logolib/Messages.fr0000664000175000017500000000534013601420003014630 0ustar jjcjjc; French version of Berkeley Logo messages file 6.1 ; Error messages -- position in this file corresponds to error number ; Lines starting with semicolon don't count in the line numbering ; and may be added at will. Logo : erreur interne fatale Plus assez de mmoire Dbordement de pile Tortue en dehors des limites %p n'aime pas l'argument %s %p ne donne pas de valeur %p Pas assez d'arguments pour %p %p n'aime pas l'argument %s Trop de choses entre les ( ) Vous ne dites pas ce qu'il faut faire de %s Trop de '(' %s n'a pas de valeur ')' inattendue Je ne connais pas la procdure %p Pas de CATCH correspondant l'tiquette (tag) %p %p est dj dfinie Arrt... Dj en train d'appliquer DRIBBLE Erreur systme de fichiers: %p Supposant que vous voulez dire SINON (IFELSE) et non SI (IF) %p masque dans un appel de procdure Throw "Error %p est une primitive Impossible d'utiliser POUR (TO) dans une procdure Je ne connais pas la procdure %p %p sans TEST ']' inattendu '}' inattendu Impossible d'initialiser le graphisme La macro retourne %s au lieu d'une liste Vous ne dites pas ce qu'il faut faire de %s Ne peux utiliser %p que dans une procdure APPLY n'accepte pas l'argument %s FIN (END) dans une instruction multi-ligne dans %p Plus de mmoire (fatal) %p FIN (END) dans une instruction multi-ligne Expression par dfaut de l'argument optionnel errone: %S Ne peux utiliser RETOURNE (OUTPUT) ou STOPPE (STOP) dans RUNRESULT Supposant que vous voulez dire '%p' et non %p Impossible d'ouvrir fichier %p Fichier %p dj ouvert Fichier %p non ouvert Runlist %s a plus qu'une expression Variable name %s is defined both dynamically and in current object ; Non-error messages (no numeric error code for these) Merci d'utiliser Logo. Bonne journe! Dsol, pas de shell sur le Mac. Tapez EXIT pour revenir Logo dans %s\n%s ERRACT boucle Pause... arrte sort Fichier non trouv: %t\n KEYP impossible, pas de FIONREAD sur ce systme Mmoire insuffisante Impossible d'ouvrir ce fichier Fichier dj ouvert Fichier non ouvert Pprop Bienvenue dans Berkeley Logo version %t Vous devez tre dans une procdure pour utiliser RETOURNE (OUTPUT) ou STOPPE (STOP) Attention: mmoire insuffisante pour lancer le ramasse-miette Ramasse-miette dsactiv - Enregistrez vos donnes et quittez! %s dfinie\n Faire %s %s pour %p\nfin\n\n Plist %s = %s\n Aide indisponible.\n Pas d'aide disponible pour %p.\n --plus-- vrai faux fin retourne stoppe goto tiquette si sinon pour .macro toplevel system error rien ; Outputs from SCREENMODE textscreen splitscreen fullscreen ; Outputs from PENMODE paint erase reverse ; Outputs from TURTLEMODE wrap fence window ; HELP turns infix operators +-*/=<> into these sum difference product quotient equalp lessp greaterp lessequalp greaterequalp notequalp ucblogo-6.1/logolib/Messages0000664000175000017500000000531113601420003014220 0ustar jjcjjc; UCBLogo message file version 6.1 ; Error messages -- position in this file corresponds to error number ; Lines starting with semicolon don't count in the line numbering ; and may be added at will. Logo: Fatal Internal Error. out of space stack overflow turtle out of bounds %p doesn't like %s as input %p didn't output to %p not enough inputs to %p %p doesn't like %s as input too many inputs to %p You don't say what to do with %s too many ('s %s has no value unexpected ')' I don't know how to %p Can't find catch tag for %p %p is already defined Stopping... Already dribbling File system error: %p Assuming you mean IFELSE, not IF %p shadowed by local in procedure call Throw "Error %p is a primitive Can't use TO inside a procedure I don't know how to %p %p without TEST unexpected ']' unexpected '}' couldn't initialize graphics Macro returned %s instead of a list You don't say what to do with %s Can only use %p inside a procedure APPLY doesn't like %s as input END inside multi-line instruction in %p Logo: Out of Memory. %p END inside multi-line instruction Bad default expression for optional input: %s Can't use OUTPUT or STOP inside RUNRESULT Assuming you meant '%p', not %p I can't open file %p File %p already open File %p not open Runlist %s has more than one expression Variable name %s is defined both dynamically and in current object ; Non-error messages (no numeric error code for these) Thank you for using Logo. Have a nice day. Sorry, no shell on the Mac. Type EXIT to return to Logo. in %s\n%s Erract loop Pausing... stops outputs File not found: %t\n Can't KEYP, no FIONREAD on this system Not enough memory I can't open that file File already open File not open Pprop Welcome to Berkeley Logo version %t You must be in a procedure to use OUTPUT or STOP. Warning: Not enough memory to run garbage collector. GC disabled - Save important data and exit! %s defined\n Make %s %s to %p\nend\n\n Plist %s = %s\n No help available.\n No help available on %p.\n --more-- ; Logo special words, used mostly in Logo-generated messages ; TRUE and FALSE are generated by predicates and accepted by IF etc. true false ; End of a procedure end ; Some names of primitives treated specially in the evaluator ; (You still have to COPYDEF them to match any changes here.) output stop goto tag if ifelse to .macro ; Special CATCH tags toplevel system error ; How no-value prints in error messages nothing ; Outputs from SCREENMODE textscreen splitscreen fullscreen ; Outputs from PENMODE paint erase reverse ; Outputs from TURTLEMODE wrap fence window ; HELP turns infix operators +-*/=<> into these sum difference product quotient equalp lessp greaterp lessequalp greaterequalp notequalp ; Object stuff name class self licenseplate initlist exist ucblogo-6.1/helpfiles/0000775000175000017500000000000013601420024013055 5ustar jjcjjcucblogo-6.1/helpfiles/ycor0000664000175000017500000000011713600031207013753 0ustar jjcjjcYCOR (library procedure) outputs a number, the turtle's Y coordinate. ucblogo-6.1/helpfiles/xcor0000664000175000017500000000011713600031207013752 0ustar jjcjjcXCOR (library procedure) outputs a number, the turtle's X coordinate. ucblogo-6.1/helpfiles/writer0000664000175000017500000000016313600031207014314 0ustar jjcjjcWRITER outputs the name of the current write stream file, or the empty list if the write stream is the screen. ucblogo-6.1/helpfiles/writepos0000664000175000017500000000011013600031207014644 0ustar jjcjjcWRITEPOS outputs the file position of the current write stream file. ucblogo-6.1/helpfiles/wrap0000664000175000017500000000063513600031207013755 0ustar jjcjjcWRAP tells the turtle to enter wrap mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will "wrap around" and reappear at the opposite edge of the window. The top edge wraps to the bottom edge, while the left edge wraps to the right edge. (So the window is topologically equivalent to a torus.) This is the turtle's initial mode. Compare WINDOW and FENCE. ucblogo-6.1/helpfiles/wordp0000664000175000017500000000012113600031207014125 0ustar jjcjjcWORDP thing WORD? thing outputs TRUE if the input is a word, FALSE otherwise. ucblogo-6.1/helpfiles/word0000664000175000017500000000014413600031207013752 0ustar jjcjjcWORD word1 word2 (WORD word1 word2 word3 ...) outputs a word formed by concatenating its inputs. ucblogo-6.1/helpfiles/window0000664000175000017500000000061613600031207014312 0ustar jjcjjcWINDOW tells the turtle to enter window mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move offscreen. The visible graphics window is considered as just part of an infinite graphics plane; the turtle can be anywhere on the plane. (If you lose the turtle, HOME will bring it back to the center of the window.) Compare WRAP and FENCE. ucblogo-6.1/helpfiles/while0000664000175000017500000000053213600031207014110 0ustar jjcjjcWHILE tfexpression instructionlist (library procedure) command. Repeatedly evaluates the "instructionlist" as long as the evaluated "tfexpression" remains TRUE. Evaluates the first input first, so the "instructionlist" may never be run at all. The "tfexpression" must be an expressionlist whose value when evaluated is TRUE or FALSE. ucblogo-6.1/helpfiles/wait0000664000175000017500000000037013600031207013744 0ustar jjcjjcWAIT time command. Delays further execution for "time" 60ths of a second. Also causes any buffered characters destined for the terminal to be printed immediately. WAIT 0 can be used to achieve this buffer flushing without actually waiting. ucblogo-6.1/helpfiles/vbarredp0000664000175000017500000000134113600031207014604 0ustar jjcjjcVBARREDP char VBARRED? char BACKSLASHEDP char (library procedure) BACKSLASHEDP char (library procedure) BACKSLASHED? char (library procedure) outputs TRUE if the input character was originally entered into Logo within vertical bars (|) to prevent its usual special syntactic meaning, FALSE otherwise. (Outputs TRUE only if the character is a backslashed space, tab, newline, or one of ()[]+-*/=<>":;\~?| ) The names BACKSLASHEDP and BACKSLASHED? are included in the Logo library for backward compatibility with the former names of this primitive, although it does *not* output TRUE for characters originally entered with backslashes. ucblogo-6.1/helpfiles/usealternatenames0000664000175000017500000000022413600031207016516 0ustar jjcjjcUSEALTERNATENAMES (variable) if TRUE, causes Logo to generate non-English words (from the Messages file) instead of TRUE, FALSE, END, etc. ucblogo-6.1/helpfiles/uppercase0000664000175000017500000000020313600031207014762 0ustar jjcjjcUPPERCASE word outputs a copy of the input word, but with all lowercase letters changed to the corresponding uppercase letter. ucblogo-6.1/helpfiles/untrace0000664000175000017500000000011113600031207014432 0ustar jjcjjcUNTRACE contentslist command. Turns off tracing for the named items. ucblogo-6.1/helpfiles/until0000664000175000017500000000053313600031207014134 0ustar jjcjjcUNTIL tfexpression instructionlist (library procedure) command. Repeatedly evaluates the "instructionlist" as long as the evaluated "tfexpression" remains FALSE. Evaluates the first input first, so the "instructionlist" may never be run at all. The "tfexpression" must be an expressionlist whose value when evaluated is TRUE or FALSE. ucblogo-6.1/helpfiles/unstep0000664000175000017500000000011113600031207014307 0ustar jjcjjcUNSTEP contentslist command. Turns off stepping for the named items. ucblogo-6.1/helpfiles/unburyonedit0000664000175000017500000000033713600031207015532 0ustar jjcjjcUNBURYONEDIT (variable) if TRUE, causes any procedure defined during EDIT or LOAD to be unburied, so that it will be saved by a later SAVE. Files that want to define and bury procedures must do it in that order. ucblogo-6.1/helpfiles/unburyname0000664000175000017500000000017213600031207015165 0ustar jjcjjcUNBURYNAME varname (library procedure) UNBURYNAME varnamelist command. Abbreviates UNBURY NAMELIST varname(list). ucblogo-6.1/helpfiles/unburyall0000664000175000017500000000011313600031207015010 0ustar jjcjjcUNBURYALL (library procedure) command. Abbreviates UNBURY BURIED. ucblogo-6.1/helpfiles/unbury0000664000175000017500000000026313600031207014325 0ustar jjcjjcUNBURY contentslist command. Unburies the procedures, variables, and property lists named in the input. That is, the named items will be returned to view in CONTENTS, etc. ucblogo-6.1/helpfiles/type0000664000175000017500000000205413600031207013762 0ustar jjcjjcTYPE thing (TYPE thing1 thing2 ...) command. Prints the input or inputs like PRINT, except that no newline character is printed at the end and multiple inputs are not separated by spaces. Note: printing to the terminal is ordinarily "line buffered"; that is, the characters you print using TYPE will not actually appear on the screen until either a newline character is printed (for example, by PRINT or SHOW) or Logo tries to read from the keyboard (either at the request of your program or after an instruction prompt). This buffering makes the program much faster than it would be if each character appeared immediately, and in most cases the effect is not disconcerting. To accommodate programs that do a lot of positioned text display using TYPE, Logo will force printing whenever SETCURSOR is invoked. This solves most buffering problems. Still, on occasion you may find it necessary to force the buffered characters to be printed explicitly; this can be done using the WAIT command. WAIT 0 will force printing without actually waiting. ucblogo-6.1/helpfiles/turtlemode0000664000175000017500000000013513600031207015163 0ustar jjcjjcTURTLEMODE outputs the word WRAP, FENCE, or WINDOW depending on the current turtle mode. ucblogo-6.1/helpfiles/ts0000664000175000017500000000035013600031207013424 0ustar jjcjjcTEXTSCREEN TS rearranges the size and position of windows to maximize the space available in the text window (the window used for interaction with Logo). The details differ among machines. Compare SPLITSCREEN and FULLSCREEN. ucblogo-6.1/helpfiles/transfer0000664000175000017500000000145413600031207014630 0ustar jjcjjcTRANSFER endtest template inbasket (library procedure) outputs the result of repeated evaluation of the template. The template is evaluated once for each member of the list "inbasket." TRANSFER maintains an "outbasket" that is initially the empty list. After each evaluation of the template, the resulting value becomes the new outbasket. In the template, the symbol ?IN represents the current member from the inbasket; the symbol ?OUT represents the entire current outbasket. Other slot symbols should not be used. If the first (endtest) input is an empty list, evaluation continues until all inbasket members have been used. If not, the first input must be a predicate expression template, and evaluation continues until either that template's value is TRUE or the inbasket is used up. ucblogo-6.1/helpfiles/tracedp0000664000175000017500000000057613600031207014432 0ustar jjcjjcTRACEDP contentslist TRACED? contentslist outputs TRUE if the first procedure, variable, or property list named in the contents list is traced, FALSE if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can TRACEDP [[] [VARIABLE]] or TRACEDP [[] [] [PROPLIST]]. ucblogo-6.1/helpfiles/traced0000664000175000017500000000012613600031207014241 0ustar jjcjjcTRACED outputs a contents list including all traced named items in the workspace. ucblogo-6.1/helpfiles/trace0000664000175000017500000000061613600031207014101 0ustar jjcjjcTRACE contentslist command. Marks the named items for tracing. A message is printed whenever a traced procedure is invoked, giving the actual input values, and whenever a traced procedure STOPs or OUTPUTs. A message is printed whenever a new value is assigned to a traced variable using MAKE. A message is printed whenever a new property is given to a traced property list using PPROP. ucblogo-6.1/helpfiles/towards0000664000175000017500000000025113600031207014461 0ustar jjcjjcTOWARDS pos outputs a number, the heading at which the turtle should be facing so that it would point from its current position to the position given as the input. ucblogo-6.1/helpfiles/to0000664000175000017500000000726213600031207013431 0ustar jjcjjcTO procname :input1 :input2 ... (special form) command. Prepares Logo to accept a procedure definition. The procedure will be named "procname" and there must not already be a procedure by that name. The inputs will be called "input1" etc. Any number of inputs are allowed, including none. Names of procedures and inputs are case-insensitive. Unlike every other Logo procedure, TO takes as its inputs the actual words typed in the instruction line, as if they were all quoted, rather than the results of evaluating expressions to provide the inputs. (That's what "special form" means.) This version of Logo allows variable numbers of inputs to a procedure. After the procedure name come four kinds of things, *in this order*: 1. 0 or more REQUIRED inputs :FOO :FROBOZZ 2. 0 or more OPTIONAL inputs [:BAZ 87] [:THINGO 5+9] 3. 0 or 1 REST input [:GARPLY] 4. 0 or 1 DEFAULT number 5 Every procedure has a MINIMUM, DEFAULT, and MAXIMUM number of inputs. (The latter can be infinite.) The MINIMUM number of inputs is the number of required inputs, which must come first. A required input is indicated by the :inputname notation. After all the required inputs can be zero or more optional inputs, each of which is represented by the following notation: [:inputname default.value.expression] When the procedure is invoked, if actual inputs are not supplied for these optional inputs, the default value expressions are evaluated to set values for the corresponding input names. The inputs are processed from left to right, so a default value expression can be based on earlier inputs. Example: to proc :inlist [:startvalue first :inlist] If the procedure is invoked by saying proc [a b c] then the variable INLIST will have the value [A B C] and the variable STARTVALUE will have the value A. If the procedure is invoked by saying (proc [a b c] "x) then INLIST will have the value [A B C] and STARTVALUE will have the value X. After all the required and optional input can come a single "rest" input, represented by the following notation: [:inputname] This is a rest input rather than an optional input because there is no default value expression. There can be at most one rest input. When the procedure is invoked, the value of this inputname will be a list containing all of the actual inputs provided that were not used for required or optional inputs. Example: to proc :in1 [:in2 "foo] [:in3 "baz] [:in4] If this procedure is invoked by saying proc "x then IN1 has the value X, IN2 has the value FOO, IN3 has the value BAZ, and IN4 has the value [] (the empty list). If it's invoked by saying (proc "a "b "c "d "e) then IN1 has the value A, IN2 has the value B, IN3 has the value C, and IN4 has the value [D E]. The MAXIMUM number of inputs for a procedure is infinite if a rest input is given; otherwise, it is the number of required inputs plus the number of optional inputs. The DEFAULT number of inputs for a procedure, which is the number of inputs that it will accept if its invocation is not enclosed in parentheses, is ordinarily equal to the minimum number. If you want a different default number you can indicate that by putting the desired default number as the last thing on the TO line. example: to proc :in1 [:in2 "foo] [:in3] 3 This procedure has a minimum of one input, a default of three inputs, and an infinite maximum. Logo responds to the TO command by entering procedure definition mode. The prompt character changes from "?" to ">" and whatever instructions you type become part of the definition until you type a line containing only the word END. ucblogo-6.1/helpfiles/throw0000664000175000017500000000306013600031207014142 0ustar jjcjjcTHROW tag (THROW tag value) command. Must be used within the scope of a CATCH with an equal tag. Ends the running of the instructionlist of the CATCH. If THROW is used with only one input, the corresponding CATCH does not output a value. If THROW is used with two inputs, the second provides an output for the CATCH. THROW "TOPLEVEL can be used to terminate all running procedures and interactive pauses, and return to the toplevel instruction prompt. Typing the system interrupt character (alt-S for wxWidgets; otherwise normally control-C for Unix, control-Q for DOS, or command-period for Mac) has the same effect. THROW "ERROR can be used to generate an error condition. If the error is not caught, it prints a message (THROW "ERROR) with the usual indication of where the error (in this case the THROW) occurred. If a second input is used along with a tag of ERROR, that second input is used as the text of the error message instead of the standard message. Also, in this case, the location indicated for the error will be, not the location of the THROW, but the location where the procedure containing the THROW was invoked. This allows user-defined procedures to generate error messages as if they were primitives. Note: in this case the corresponding CATCH "ERROR, if any, does not output, since the second input to THROW is not considered a return value. THROW "SYSTEM immediately leaves Logo, returning to the operating system, without printing the usual parting message and without deleting any editor temporary file written by EDIT. ucblogo-6.1/helpfiles/thing0000664000175000017500000000047013600031207014112 0ustar jjcjjcTHING varname :quoted.varname outputs the value of the variable whose name is the input. If there is more than one such variable, the innermost local variable of that name is chosen. The colon notation is an abbreviation not for THING but for the combination thing " so that :FOO means THING "FOO. ucblogo-6.1/helpfiles/textsize0000664000175000017500000000033613600031207014661 0ustar jjcjjcTEXTSIZE (wxWidgets only) outputs the "point size" of the font used in the text and edit windows. See SETTEXTSIZE for a discussion of font sizing. See LABELSIZE for a different approach used for the graphics window. ucblogo-6.1/helpfiles/textscreen0000664000175000017500000000035013600031207015162 0ustar jjcjjcTEXTSCREEN TS rearranges the size and position of windows to maximize the space available in the text window (the window used for interaction with Logo). The details differ among machines. Compare SPLITSCREEN and FULLSCREEN. ucblogo-6.1/helpfiles/text0000664000175000017500000000055013600031207013764 0ustar jjcjjcTEXT procname outputs the text of the procedure named "procname" in the form expected by DEFINE: a list of lists, the first of which describes the inputs to the procedure and the rest of which are the lines of its body. The text does not reflect formatting information used when the procedure was defined, such as continuation lines and extra spaces. ucblogo-6.1/helpfiles/test0000664000175000017500000000042313600031207013756 0ustar jjcjjcTEST tf command. Remembers its input, which must be TRUE or FALSE, for use by later IFTRUE or IFFALSE instructions. The effect of TEST is local to the procedure in which it is used; any corresponding IFTRUE or IFFALSE must be in the same procedure or a subprocedure. ucblogo-6.1/helpfiles/tag0000664000175000017500000000026413600031207013555 0ustar jjcjjcTAG quoted.word command. Does nothing. The input must be a literal word following a quotation mark ("), not the result of a computation. Tags are used by the GOTO command. ucblogo-6.1/helpfiles/sum0000664000175000017500000000012513600031207013602 0ustar jjcjjcSUM num1 num2 (SUM num1 num2 num3 ...) num1 + num2 outputs the sum of its inputs. ucblogo-6.1/helpfiles/substringp0000664000175000017500000000033513600031207015201 0ustar jjcjjcSUBSTRINGP thing1 thing2 SUBSTRING? thing1 thing2 if "thing1" or "thing2" is a list or an array, outputs FALSE. If "thing2" is a word, outputs TRUE if "thing1" is EQUALP to a substring of "thing2", FALSE otherwise. ucblogo-6.1/helpfiles/stop0000664000175000017500000000030313600031207013761 0ustar jjcjjcSTOP command. Ends the running of the procedure in which it appears. Control is returned to the context in which that procedure was invoked. The stopped procedure does not output a value. ucblogo-6.1/helpfiles/steppedp0000664000175000017500000000060313600031207014623 0ustar jjcjjcSTEPPEDP contentslist STEPPED? contentslist outputs TRUE if the first procedure, variable, or property list named in the contents list is stepped, FALSE if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can STEPPEDP [[] [VARIABLE]] or STEPPEDP [[] [] [PROPLIST]]. ucblogo-6.1/helpfiles/stepped0000664000175000017500000000013013600031207014436 0ustar jjcjjcSTEPPED outputs a contents list including all stepped named items in the workspace. ucblogo-6.1/helpfiles/step0000664000175000017500000000065713600031207013763 0ustar jjcjjcSTEP contentslist command. Marks the named items for stepping. Whenever a stepped procedure is invoked, each instruction line in the procedure body is printed before being executed, and Logo waits for the user to type a newline at the terminal. A message is printed whenever a stepped variable name is "shadowed" because a local variable of the same name is created either as a procedure input or by the LOCAL command. ucblogo-6.1/helpfiles/startup0000664000175000017500000000021313600031207014476 0ustar jjcjjcSTARTUP (variable) if assigned a list value in a file loaded by LOAD, that value is run as an instructionlist after the loading. ucblogo-6.1/helpfiles/standout0000664000175000017500000000204613600031207014643 0ustar jjcjjcSTANDOUT thing outputs a word that, when printed, will appear like the input but displayed in standout mode (boldface, reverse video, or whatever your version does for standout). The word contains machine-specific magic characters at the beginning and end; in between is the printed form (as if displayed using TYPE) of the input. The output is always a word, even if the input is of some other type, but it may include spaces and other formatting characters. Note: a word output by STANDOUT while Logo is running on one machine will probably not have the desired effect if printed on another type of machine. In the Macintosh classic version, the way that standout works is incompatible with the use of characters whose ASCII code is greater than 127. Therefore, you have a choice to make: The instruction CANINVERSE 0 disables standout, but enables the display of ASCII codes above 127, and the instruction CANINVERSE 1 restores the default situation in which standout is enabled and the extra graphic characters cannot be printed. ucblogo-6.1/helpfiles/st0000664000175000017500000000005313600031207013424 0ustar jjcjjcSHOWTURTLE ST makes the turtle visible. ucblogo-6.1/helpfiles/ss0000664000175000017500000000035113600031207013424 0ustar jjcjjcSPLITSCREEN SS rearranges the size and position of windows to allow some room for text interaction while also keeping most of the graphics window visible. The details differ among machines. Compare TEXTSCREEN and FULLSCREEN. ucblogo-6.1/helpfiles/sqrt0000664000175000017500000000011513600031207013766 0ustar jjcjjcSQRT num outputs the square root of the input, which must be nonnegative. ucblogo-6.1/helpfiles/splitscreen0000664000175000017500000000035113600031207015332 0ustar jjcjjcSPLITSCREEN SS rearranges the size and position of windows to allow some room for text interaction while also keeping most of the graphics window visible. The details differ among machines. Compare TEXTSCREEN and FULLSCREEN. ucblogo-6.1/helpfiles/sin0000664000175000017500000000011113600031207013562 0ustar jjcjjcSIN degrees outputs the sine of its input, which is taken in degrees. ucblogo-6.1/helpfiles/showturtle0000664000175000017500000000005313600031207015216 0ustar jjcjjcSHOWTURTLE ST makes the turtle visible. ucblogo-6.1/helpfiles/shownp0000664000175000017500000000020013600031207014306 0ustar jjcjjcSHOWNP SHOWN? outputs TRUE if the turtle is shown (visible), FALSE if the turtle is hidden. See SHOWTURTLE and HIDETURTLE. ucblogo-6.1/helpfiles/show0000664000175000017500000000024213600031207013756 0ustar jjcjjcSHOW thing (SHOW thing1 thing2 ...) command. Prints the input or inputs like PRINT, except that if an input is a list it is printed inside square brackets. ucblogo-6.1/helpfiles/shell0000664000175000017500000000247313600031207014115 0ustar jjcjjcSHELL command (SHELL command wordflag) Under Unix, outputs the result of running "command" as a shell command. (The command is sent to /bin/sh, not csh or other alternatives.) If the command is a literal list in the instruction line, and if you want a backslash character sent to the shell, you must use \\ to get the backslash through Logo's reader intact. The output is a list containing one member for each line generated by the shell command. Ordinarily each such line is represented by a list in the output, as though the line were read using READLIST. If a second input is given, regardless of the value of the input, each line is represented by a word in the output as though it were read with READWORD. Example: to dayofweek output first first shell [date] end This is "first first" to extract the first word of the first (and only) line of the shell output. Under MacOS X, SHELL works as under Unix. SHELL is not available under Mac Classic. Under DOS, SHELL is a command, not an operation; it sends its input to a DOS command processor but does not collect the result of the command. Under Windows, the wxWidgets version of Logo behaves as under Unix (except that DOS-style commands are understood; use "dir" rather than "ls"). The non-wxWidgets version behaves like the DOS version. ucblogo-6.1/helpfiles/sety0000664000175000017500000000021413600031207013761 0ustar jjcjjcSETY ycor moves the turtle vertically from its old position to a new absolute vertical coordinate. The input is the new Y coordinate. ucblogo-6.1/helpfiles/setxy0000664000175000017500000000021313600031207014150 0ustar jjcjjcSETXY xcor ycor moves the turtle to an absolute position in the graphics window. The two inputs are numbers, the X and Y coordinates. ucblogo-6.1/helpfiles/setx0000664000175000017500000000022013600031207013755 0ustar jjcjjcSETX xcor moves the turtle horizontally from its old position to a new absolute horizontal coordinate. The input is the new X coordinate. ucblogo-6.1/helpfiles/setwritepos0000664000175000017500000000047513600031207015376 0ustar jjcjjcSETWRITEPOS charpos command. Sets the file pointer of the write stream file so that the next PRINT, etc., will begin writing at the "charpos"th character in the file, counting from 0. (That is, SETWRITEPOS 0 will start writing from the beginning of the file.) Meaningless if the write stream is the screen. ucblogo-6.1/helpfiles/setwrite0000664000175000017500000000241713600031207014652 0ustar jjcjjcSETWRITE filename command. Makes the named file the write stream, used for PRINT, etc. The file must already be open with OPENWRITE, OPENAPPEND, or OPENUPDATE. If the input is the empty list, then the write stream becomes the screen, as usual. Changing the write stream does not close the file that was previously the write stream, so it is possible to alternate between files. If the input is a list, then its first element must be a variable name, and its second and last element must be a positive integer; a buffer of that many characters will be allocated, and will become the writestream. If the same list (same in the .EQ sense, not a copy) has been used as input to OPENWRITE, then the already-allocated buffer will be used, and the writer can be changed to and from this buffer, with all the characters accumulated as in a file. When the same list is used as input to CLOSE, the contents of the buffer (as an unparsed word, which may contain newline characters) will become the value of the named variable. For compatibility with earlier versions, if the list has not been opened when the SETWRITE is done, it will be opened implicitly, but the first SETWRITE after this one will implicitly close it, setting the variable and freeing the allocated buffer. ucblogo-6.1/helpfiles/settextsize0000664000175000017500000000102413600031207015370 0ustar jjcjjcSETTEXTSIZE height command (wxWidgets only). Set the "point size" of the font used in the text and edit windows to the given integer input. The desired size may not be available, in which case the nearest available size will be used. Note: There is only a slight correlation between these integers and pixel sizes. Our rough estimate is that the number of pixels of height is about 1.5 times the point size, but it varies for different fonts. See SETLABELHEIGHT for a different approach used for the graphics window. ucblogo-6.1/helpfiles/settextfont0000664000175000017500000000052013557147341015406 0ustar jjcjjcSETTEXTFONT fontname command (wxWidgets only). Set the font family used in the text window to the one named by the input. Try 'Courier' or 'Monospace' as likely possibilities. Not all computers have the same fonts installed. It's a good idea to stick with monospace fonts (ones in which all characters have the same width). ucblogo-6.1/helpfiles/settextcolor0000664000175000017500000000206313600031207015540 0ustar jjcjjcSETTEXTCOLOR foreground background SETTC foreground background command (wxWidgets only). The inputs are color numbers, or RGB color lists, as for turtle graphics. The foreground and background colors for the textscreen/splitscreen text window are changed to the given values. The change affects text already printed as well as future text printing; there is only one text color for the entire window. command (non-wxWidgets Windows and DOS extended only). The inputs are color numbers, as for turtle graphics. Future printing to the text window will use the specified colors for foreground (the characters printed) and background (the space under those characters). Using STANDOUT will revert to the default text window colors. In the DOS extended (ucblogo.exe) version, colors in textscreen mode are limited to numbers 0-7, and the coloring applies only to text printed by the program, not to the echoing of text typed by the user. Neither limitation applies to the text portion of splitscreen mode, which is actually drawn as graphics internally. ucblogo-6.1/helpfiles/settemploc0000664000175000017500000000037013600031207015157 0ustar jjcjjcSETTEMPLOC path command. Tells Logo to write editor temporary files in the specified directory rather than in the default directory. You must have write permission for this directory. The format of a path depends on your operating system. ucblogo-6.1/helpfiles/settc0000664000175000017500000000206313600031207014123 0ustar jjcjjcSETTEXTCOLOR foreground background SETTC foreground background command (wxWidgets only). The inputs are color numbers, or RGB color lists, as for turtle graphics. The foreground and background colors for the textscreen/splitscreen text window are changed to the given values. The change affects text already printed as well as future text printing; there is only one text color for the entire window. command (non-wxWidgets Windows and DOS extended only). The inputs are color numbers, as for turtle graphics. Future printing to the text window will use the specified colors for foreground (the characters printed) and background (the space under those characters). Using STANDOUT will revert to the default text window colors. In the DOS extended (ucblogo.exe) version, colors in textscreen mode are limited to numbers 0-7, and the coloring applies only to text printed by the program, not to the echoing of text typed by the user. Neither limitation applies to the text portion of splitscreen mode, which is actually drawn as graphics internally. ucblogo-6.1/helpfiles/setscrunch0000664000175000017500000000203413600031207015160 0ustar jjcjjcSETSCRUNCH xscale yscale adjusts the aspect ratio and scaling of the graphics display. After this command is used, all further turtle motion will be adjusted by multiplying the horizontal and vertical extent of the motion by the two numbers given as inputs. For example, after the instruction "SETSCRUNCH 2 1" motion at a heading of 45 degrees will move twice as far horizontally as vertically. If your squares don't come out square, try this. (Alternatively, you can deliberately misadjust the aspect ratio to draw an ellipse.) In wxWidgets only, SETSCRUNCH also changes the size of the text font used for the LABEL command to try to keep the height of characters scaled with the vertical turtle step size. For all modern computers For DOS machines, the scale factors are initially set according to what the hardware claims the aspect ratio is, but the hardware sometimes lies. For DOS, the values set by SETSCRUNCH are remembered in a file (called SCRUNCH.DAT) and are automatically put into effect when a Logo session begins. ucblogo-6.1/helpfiles/setreadpos0000664000175000017500000000047413600031207015156 0ustar jjcjjcSETREADPOS charpos command. Sets the file pointer of the read stream file so that the next READLIST, etc., will begin reading at the "charpos"th character in the file, counting from 0. (That is, SETREADPOS 0 will start reading from the beginning of the file.) Meaningless if the read stream is the screen. ucblogo-6.1/helpfiles/setread0000664000175000017500000000057013600031207014431 0ustar jjcjjcSETREAD filename command. Makes the named file the read stream, used for READLIST, etc. The file must already be open with OPENREAD or OPENUPDATE. If the input is the empty list, then the read stream becomes the keyboard, as usual. Changing the read stream does not close the file that was previously the read stream, so it is possible to alternate between files. ucblogo-6.1/helpfiles/setprefix0000664000175000017500000000072513600031207015015 0ustar jjcjjcSETPREFIX string command. Sets a prefix that will be used as the implicit beginning of filenames in OPENREAD, OPENWRITE, OPENAPPEND, OPENUPDATE, LOAD, and SAVE commands. Logo will put the appropriate separator character (slash for Unix, backslash for DOS/Windows, colon for MacOS Classic) between the prefix and the filename entered by the user. The input to SETPREFIX must be a word, unless it is the empty list, to indicate that there should be no prefix. ucblogo-6.1/helpfiles/setpos0000664000175000017500000000021613600031207014314 0ustar jjcjjcSETPOS pos moves the turtle to an absolute position in the graphics window. The input is a list of two numbers, the X and Y coordinates. ucblogo-6.1/helpfiles/setpensize0000664000175000017500000000040413600031207015167 0ustar jjcjjcSETPENSIZE size sets the thickness of the pen. The input is either a single positive integer or a list of two positive integers (for horizontal and vertical thickness). Some versions pay no attention to the second number, but always have a square pen. ucblogo-6.1/helpfiles/setpenpattern0000664000175000017500000000024213600031207015672 0ustar jjcjjcSETPENPATTERN pattern sets hardware-dependent pen characteristics. This command is not guaranteed compatible between implementations on different machines. ucblogo-6.1/helpfiles/setpencolor0000664000175000017500000000116513600031207015340 0ustar jjcjjcSETPENCOLOR colornumber.or.rgblist SETPC colornumber.or.rgblist sets the pen color to the given number, which must be a nonnegative integer. There are initial assignments for the first 16 colors: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey but other colors can be assigned to numbers by the PALETTE command. Alternatively, sets the pen color to the given RGB values (a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color). ucblogo-6.1/helpfiles/setpen0000664000175000017500000000034413600031207014277 0ustar jjcjjcSETPEN list (library procedure) sets the pen's position, mode, thickness, and hardware-dependent characteristics according to the information in the input list, which should be taken from an earlier invocation of PEN. ucblogo-6.1/helpfiles/setpc0000664000175000017500000000116513600031207014121 0ustar jjcjjcSETPENCOLOR colornumber.or.rgblist SETPC colornumber.or.rgblist sets the pen color to the given number, which must be a nonnegative integer. There are initial assignments for the first 16 colors: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey but other colors can be assigned to numbers by the PALETTE command. Alternatively, sets the pen color to the given RGB values (a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color). ucblogo-6.1/helpfiles/setpalette0000664000175000017500000000062513600031207015155 0ustar jjcjjcSETPALETTE colornumber rgblist sets the actual color corresponding to a given number, if allowed by the hardware and operating system. Colornumber must be an integer greater than or equal to 8. (Logo tries to keep the first 8 colors constant.) The second input is a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color. ucblogo-6.1/helpfiles/setmargins0000664000175000017500000000136513600031207015161 0ustar jjcjjcSETMARGINS vector command. The input must be a list of two numbers, as for SETCURSOR. The effect is to clear the screen and then arrange for all further printing to be shifted down and to the right according to the indicated margins. Specifically, every time a newline character is printed (explicitly or implicitly) Logo will type x_margin spaces, and on every invocation of SETCURSOR the margins will be added to the input x and y coordinates. (CURSOR will report the cursor position relative to the margins, so that this shift will be invisible to Logo programs.) The purpose of this command is to accommodate the display of terminal screens in lecture halls with inadequate TV monitors that miss the top and left edges of the screen. ucblogo-6.1/helpfiles/setlibloc0000664000175000017500000000050413600031207014757 0ustar jjcjjcSETLIBLOC path command. Tells Logo to use the specified directory as its library instead of the default. (Note that many Logo "primitive" procedures are actually found in the library, so they may become unavailable if your new library does not include them!) The format of a path depends on your operating system. ucblogo-6.1/helpfiles/setlabelheight0000664000175000017500000000106713600031207015770 0ustar jjcjjcSETLABELHEIGHT height command (wxWidgets only). Takes a positive integer argument and tries to set the font size so that the character height (including descenders) is that many turtle steps. This will be different from the number of screen pixels if SETSCRUNCH has been used. Also, note that SETSCRUNCH changes the font size to try to preserve this height in turtle steps. Note that the query operation corresponding to this command is LABELSIZE, not LABELHEIGHT, because it tells you the width as well as the height of characters in the current font. ucblogo-6.1/helpfiles/setitem0000664000175000017500000000033313600031207014451 0ustar jjcjjcSETITEM index array value command. Replaces the "index"th member of "array" with the new "value". Ensures that the resulting array is not circular, i.e., "value" may not be a list or array that contains "array". ucblogo-6.1/helpfiles/sethelploc0000664000175000017500000000033113600031207015137 0ustar jjcjjcSETHELPLOC path command. Tells Logo to look in the specified directory for the information provided by the HELP command, instead of the default directory. The format of a path depends on your operating system. ucblogo-6.1/helpfiles/setheading0000664000175000017500000000024413600031207015113 0ustar jjcjjcSETHEADING degrees SETH degrees turns the turtle to a new absolute heading. The input is a number, the heading in degrees clockwise from the positive Y axis. ucblogo-6.1/helpfiles/seth0000664000175000017500000000024413600031207013743 0ustar jjcjjcSETHEADING degrees SETH degrees turns the turtle to a new absolute heading. The input is a number, the heading in degrees clockwise from the positive Y axis. ucblogo-6.1/helpfiles/setfont0000664000175000017500000000050713600031207014464 0ustar jjcjjcSETFONT fontname command (wxWidgets only). Set the font family used in all windows to the one named by the input. Try 'Courier' or 'Monospace' as likely possibilities. Not all computers have the same fonts installed. It's a good idea to stick with monospace fonts (ones in which all characters have the same width). ucblogo-6.1/helpfiles/seteditor0000664000175000017500000000025313600031207015002 0ustar jjcjjcSETEDITOR path command. Tells Logo to use the specified program as its editor instead of the default editor. The format of a path depends on your operating system. ucblogo-6.1/helpfiles/setcursor0000664000175000017500000000047613600031207015040 0ustar jjcjjcSETCURSOR vector command. The input is a list of two numbers, the x and y coordinates of a text window position (origin in the upper left corner, positive direction is southeast). The text cursor is moved to the requested position. This command also forces the immediate printing of any buffered characters. ucblogo-6.1/helpfiles/setcslsloc0000664000175000017500000000027513600031207015162 0ustar jjcjjcSETCSLSLOC path command. Tells Logo to use the specified directory for the CSLSLOAD command, instead of the default directory. The format of a path depends on your operating system. ucblogo-6.1/helpfiles/setbg0000664000175000017500000000024213600031207014102 0ustar jjcjjcSETBACKGROUND colornumber.or.rgblist SETBG colornumber.or.rgblist set the screen background color by slot number or RGB values. See SETPENCOLOR for details. ucblogo-6.1/helpfiles/setbackground0000664000175000017500000000024213600031207015631 0ustar jjcjjcSETBACKGROUND colornumber.or.rgblist SETBG colornumber.or.rgblist set the screen background color by slot number or RGB values. See SETPENCOLOR for details. ucblogo-6.1/helpfiles/sentence0000664000175000017500000000036313600031207014606 0ustar jjcjjcSENTENCE thing1 thing2 SE thing1 thing2 (SENTENCE thing1 thing2 thing3 ...) (SE thing1 thing2 thing3 ...) outputs a list whose members are its inputs, if those inputs are not lists, or the members of its inputs, if those inputs are lists. ucblogo-6.1/helpfiles/se0000664000175000017500000000036313600031207013411 0ustar jjcjjcSENTENCE thing1 thing2 SE thing1 thing2 (SENTENCE thing1 thing2 thing3 ...) (SE thing1 thing2 thing3 ...) outputs a list whose members are its inputs, if those inputs are not lists, or the members of its inputs, if those inputs are lists. ucblogo-6.1/helpfiles/scrunch0000664000175000017500000000027313600031207014447 0ustar jjcjjcSCRUNCH outputs a list containing two numbers, the X and Y scrunch factors, as used by SETSCRUNCH. (But note that SETSCRUNCH takes two numbers as inputs, not one list of numbers.) ucblogo-6.1/helpfiles/screenmode0000664000175000017500000000015513600031207015125 0ustar jjcjjcSCREENMODE outputs the word TEXTSCREEN, SPLITSCREEN, or FULLSCREEN depending on the current screen mode. ucblogo-6.1/helpfiles/savepict0000664000175000017500000000061513600031207014620 0ustar jjcjjcSAVEPICT filename command. Writes a file with the specified name containing the state of the graphics window, including any nonstandard color palette settings, in Logo's internal format. This picture can be restored to the screen using LOADPICT. The format is not portable between platforms, nor is it readable by other programs. See EPSPICT to export Logo graphics for other programs. ucblogo-6.1/helpfiles/savel0000664000175000017500000000030313600031207014106 0ustar jjcjjcSAVEL contentslist filename (library procedure) command. Saves the definitions of the procedures, variables, and property lists specified by "contentslist" to the file named "filename". ucblogo-6.1/helpfiles/save0000664000175000017500000000111413600031207013733 0ustar jjcjjcSAVE filename command. Saves the definitions of all unburied procedures, variables, and nonempty property lists in the named file. Equivalent to to save :filename local "oldwriter make "oldwriter writer openwrite :filename setwrite :filename poall setwrite :oldwriter close :filename end Exceptionally, SAVE can be used with no input and without parentheses if it is the last thing on the command line. In this case, the filename from the most recent LOAD or SAVE command will be used. (It is an error if there has been no previous LOAD or SAVE.) ucblogo-6.1/helpfiles/rw0000664000175000017500000000123413600031207013430 0ustar jjcjjcREADWORD RW reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, READWORD outputs the empty list (not the empty word). READWORD processes backslash, vertical bar, and tilde characters in the read stream. In the case of a tilde used for line continuation, the output word DOES include the tilde and the newline characters, so that the user program can tell exactly what the user entered. Vertical bars in the line are also preserved in the output. Backslash characters are not preserved in the output. ucblogo-6.1/helpfiles/runresult0000664000175000017500000000057313600031207015050 0ustar jjcjjcRUNRESULT instructionlist runs the instructions in the input; outputs an empty list if those instructions produce no output, or a list whose only member is the output from running the input instructionlist. Useful for inventing command-or-operation control structures: local "result make "result runresult [something] if emptyp :result [stop] output first :result ucblogo-6.1/helpfiles/runparse0000664000175000017500000000043213600031207014636 0ustar jjcjjcRUNPARSE wordorlist outputs the list that would result if the input word or list were entered as an instruction line; characters such as infix operators and parentheses are separate members of the output. Note that sublists of a runparsed list are not themselves runparsed. ucblogo-6.1/helpfiles/run0000664000175000017500000000022613600031207013604 0ustar jjcjjcRUN instructionlist command or operation. Runs the Logo instructions in the input list; outputs if the list contains an expression that outputs. ucblogo-6.1/helpfiles/rt0000664000175000017500000000017113600031207013424 0ustar jjcjjcRIGHT degrees RT degrees turns the turtle clockwise by the specified angle, measured in degrees (1/360 of a circle). ucblogo-6.1/helpfiles/rseq0000664000175000017500000000035113600031207013751 0ustar jjcjjcRSEQ from to count (library procedure) outputs a list of COUNT equally spaced rational numbers between FROM and TO, inclusive. ? show rseq 3 5 9 [3 3.25 3.5 3.75 4 4.25 4.5 4.75 5] ? show rseq 3 5 5 [3 3.5 4 4.5 5] ucblogo-6.1/helpfiles/round0000664000175000017500000000006713600031207014132 0ustar jjcjjcROUND num outputs the nearest integer to the input. ucblogo-6.1/helpfiles/rl0000664000175000017500000000110213600031207013407 0ustar jjcjjcREADLIST RL reads a line from the read stream (initially the keyboard) and outputs that line as a list. The line is separated into members as though it were typed in square brackets in an instruction. If the read stream is a file, and the end of file is reached, READLIST outputs the empty word (not the empty list). READLIST processes backslash, vertical bar, and tilde characters in the read stream; the output list will not contain these characters but they will have had their usual effect. READLIST does not, however, treat semicolon as a comment character. ucblogo-6.1/helpfiles/right0000664000175000017500000000017113600031207014114 0ustar jjcjjcRIGHT degrees RT degrees turns the turtle clockwise by the specified angle, measured in degrees (1/360 of a circle). ucblogo-6.1/helpfiles/reverse0000664000175000017500000000017413600031207014455 0ustar jjcjjcREVERSE list (library procedure) outputs a list whose members are the members of the input list, in reverse order. ucblogo-6.1/helpfiles/rerandom0000664000175000017500000000071213600031207014607 0ustar jjcjjcRERANDOM (RERANDOM seed) command. Makes the results of RANDOM reproducible. Ordinarily the sequence of random numbers is different each time Logo is used. If you need the same sequence of pseudo-random numbers repeatedly, e.g. to debug a program, say RERANDOM before the first invocation of RANDOM. If you need more than one repeatable sequence, you can give RERANDOM an integer input; each possible input selects a unique sequence of numbers. ucblogo-6.1/helpfiles/repeat0000664000175000017500000000013413600031207014256 0ustar jjcjjcREPEAT num instructionlist command. Runs the "instructionlist" repeatedly, "num" times. ucblogo-6.1/helpfiles/repcount0000664000175000017500000000051513600031207014640 0ustar jjcjjcREPCOUNT outputs the repetition count of the innermost current REPEAT or FOREVER, starting from 1. If no REPEAT or FOREVER is active, outputs -1. The abbreviation # can be used for REPCOUNT unless the REPEAT is inside the template input to a higher order procedure such as FOREACH, in which case # has a different meaning. ucblogo-6.1/helpfiles/remprop0000664000175000017500000000017113600031207014463 0ustar jjcjjcREMPROP plistname propname command. Removes the property named "propname" from the property list named "plistname". ucblogo-6.1/helpfiles/remove0000664000175000017500000000016213600031207014274 0ustar jjcjjcREMOVE thing list (library procedure) outputs a copy of "list" with every member equal to "thing" removed. ucblogo-6.1/helpfiles/remdup0000664000175000017500000000033113600031207014271 0ustar jjcjjcREMDUP list (library procedure) outputs a copy of "list" with duplicate members removed. If two or more members of the input are equal, the rightmost of those members is the one that remains in the output. ucblogo-6.1/helpfiles/remainder0000664000175000017500000000023313600031207014744 0ustar jjcjjcREMAINDER num1 num2 outputs the remainder on dividing "num1" by "num2"; both must be integers and the result is an integer with the same sign as num1. ucblogo-6.1/helpfiles/refresh0000664000175000017500000000036513600031207014442 0ustar jjcjjcREFRESH (command) tells Logo to remember the turtle's motions so that they can be used for high-resolution printing (wxWidgets) or to refresh the graphics window if it is moved, resized, or overlayed (non-wxWidgets). This is the default. ucblogo-6.1/helpfiles/reduce0000664000175000017500000000253313600031207014252 0ustar jjcjjcREDUCE template data (library procedure) outputs the result of applying the template to accumulate the members of the data input. The template must be a two-slot function. Typically it is an associative function name like SUM. If the data input has only one constituent (member in a list or character in a word), the output is that consituent. Otherwise, the template is first applied with ?1 filled with the next-to-last consitient and ?2 with the last constituent. Then, if there are more constituents, the template is applied with ?1 filled with the next constituent to the left and ?2 with the result from the previous evaluation. This process continues until all constituents have been used. The data input may not be empty. Note: If the template is, like SUM, the name of a procedure that is capable of accepting arbitrarily many inputs, it is more efficient to use APPLY instead of REDUCE. The latter is good for associative procedures that have been written to accept exactly two inputs: to max :a :b output ifelse :a > :b [:a] [:b] end print reduce "max [...] Alternatively, REDUCE can be used to write MAX as a procedure that accepts any number of inputs, as SUM does: to max [:inputs] 2 if emptyp :inputs ~ [(throw "error [not enough inputs to max])] output reduce [ifelse ?1 > ?2 [?1] [?2]] :inputs end ucblogo-6.1/helpfiles/redefp0000664000175000017500000000014313600031207014243 0ustar jjcjjcREDEFP (variable) if TRUE, allows primitives to be erased (ERASE) or redefined (COPYDEF). ucblogo-6.1/helpfiles/readword0000664000175000017500000000123413600031207014607 0ustar jjcjjcREADWORD RW reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, READWORD outputs the empty list (not the empty word). READWORD processes backslash, vertical bar, and tilde characters in the read stream. In the case of a tilde used for line continuation, the output word DOES include the tilde and the newline characters, so that the user program can tell exactly what the user entered. Vertical bars in the line are also preserved in the output. Backslash characters are not preserved in the output. ucblogo-6.1/helpfiles/readrawline0000664000175000017500000000071413600031207015277 0ustar jjcjjcREADRAWLINE reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, READRAWLINE outputs the empty list (not the empty word). READRAWLINE outputs the exact string of characters as they appear in the line, with no special meaning for backslash, vertical bar, tilde, or any other formatting characters. ucblogo-6.1/helpfiles/readpos0000664000175000017500000000010613600031207014432 0ustar jjcjjcREADPOS outputs the file position of the current read stream file. ucblogo-6.1/helpfiles/readlist0000664000175000017500000000110213600031207014601 0ustar jjcjjcREADLIST RL reads a line from the read stream (initially the keyboard) and outputs that line as a list. The line is separated into members as though it were typed in square brackets in an instruction. If the read stream is a file, and the end of file is reached, READLIST outputs the empty word (not the empty list). READLIST processes backslash, vertical bar, and tilde characters in the read stream; the output list will not contain these characters but they will have had their usual effect. READLIST does not, however, treat semicolon as a comment character. ucblogo-6.1/helpfiles/reader0000664000175000017500000000016313600031207014242 0ustar jjcjjcREADER outputs the name of the current read stream file, or the empty list if the read stream is the terminal. ucblogo-6.1/helpfiles/readchars0000664000175000017500000000075013600031207014736 0ustar jjcjjcREADCHARS num RCS num reads "num" characters from the read stream and outputs those characters as a word. If the read stream is a file, and the end of file is reached, READCHARS outputs the empty list (not the empty word). If the read stream is a terminal, echoing is turned off when READCHARS is invoked, and remains off until READLIST or READWORD is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. ucblogo-6.1/helpfiles/readchar0000664000175000017500000000073613600031207014557 0ustar jjcjjcREADCHAR RC reads a single character from the read stream and outputs that character as a word. If the read stream is a file, and the end of file is reached, READCHAR outputs the empty list (not the empty word). If the read stream is the keyboard, echoing is turned off when READCHAR is invoked, and remains off until READLIST or READWORD is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. ucblogo-6.1/helpfiles/rcs0000664000175000017500000000075013600031207013571 0ustar jjcjjcREADCHARS num RCS num reads "num" characters from the read stream and outputs those characters as a word. If the read stream is a file, and the end of file is reached, READCHARS outputs the empty list (not the empty word). If the read stream is a terminal, echoing is turned off when READCHARS is invoked, and remains off until READLIST or READWORD is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. ucblogo-6.1/helpfiles/rc0000664000175000017500000000073613600031207013412 0ustar jjcjjcREADCHAR RC reads a single character from the read stream and outputs that character as a word. If the read stream is a file, and the end of file is reached, READCHAR outputs the empty list (not the empty word). If the read stream is the keyboard, echoing is turned off when READCHAR is invoked, and remains off until READLIST or READWORD is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. ucblogo-6.1/helpfiles/rawascii0000664000175000017500000000036613600031207014607 0ustar jjcjjcRAWASCII char outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing themselves. To find out the ASCII code of an arbitrary keystroke, use RAWASCII RC. ucblogo-6.1/helpfiles/random0000664000175000017500000000067413600031207014267 0ustar jjcjjcRANDOM num (RANDOM start end) with one input, outputs a random nonnegative integer less than its input, which must be a positive integer. With two inputs, RANDOM outputs a random integer greater than or equal to the first input, and less than or equal to the second input. Both inputs must be integers, and the first must be less than the second. (RANDOM 0 9) is equivalent to RANDOM 10; (RANDOM 3 8) is equivalent to (RANDOM 6)+3. ucblogo-6.1/helpfiles/radsin0000664000175000017500000000011413600031207014254 0ustar jjcjjcRADSIN radians outputs the sine of its input, which is taken in radians. ucblogo-6.1/helpfiles/radcos0000664000175000017500000000011613600031207014251 0ustar jjcjjcRADCOS radians outputs the cosine of its input, which is taken in radians. ucblogo-6.1/helpfiles/radarctan0000664000175000017500000000043213600031207014736 0ustar jjcjjcRADARCTAN num (RADARCTAN x y) outputs the arctangent, in radians, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or pi/2 or -pi/2 depending on the sign of y, if x is zero. The expression 2*(RADARCTAN 0 1) can be used to get the value of pi. ucblogo-6.1/helpfiles/quotient0000664000175000017500000000055413600031207014654 0ustar jjcjjcQUOTIENT num1 num2 (QUOTIENT num) num1 / num2 outputs the quotient of its inputs. The quotient of two integers is an integer if and only if the dividend is a multiple of the divisor. (In other words, QUOTIENT 5 2 is 2.5, not 2, but QUOTIENT 4 2 is 2, not 2.0 -- it does the right thing.) With a single input, QUOTIENT outputs the reciprocal of the input. ucblogo-6.1/helpfiles/quoted0000664000175000017500000000020713600031207014300 0ustar jjcjjcQUOTED thing (library procedure) outputs its input, if a list; outputs its input with a quotation mark prepended, if a word. ucblogo-6.1/helpfiles/queue0000664000175000017500000000044313600031207014125 0ustar jjcjjcQUEUE queuename thing (library procedure) command. Adds the "thing" to the queue that is the value of the variable whose name is "queuename". This variable must have a list as its value; the initial value should be the empty list. New members are added at the back of the list. ucblogo-6.1/helpfiles/px0000664000175000017500000000020713600031207013426 0ustar jjcjjcPENREVERSE PX sets the pen's position to DOWN and mode to REVERSE. (This may interact in system-dependent ways with use of color.) ucblogo-6.1/helpfiles/push0000664000175000017500000000044313600031207013760 0ustar jjcjjcPUSH stackname thing (library procedure) command. Adds the "thing" to the stack that is the value of the variable whose name is "stackname". This variable must have a list as its value; the initial value should be the empty list. New members are added at the front of the list. ucblogo-6.1/helpfiles/pu0000664000175000017500000000010613600031207013421 0ustar jjcjjcPENUP PU sets the pen's position to UP, without changing its mode. ucblogo-6.1/helpfiles/product0000664000175000017500000000014113600031207014454 0ustar jjcjjcPRODUCT num1 num2 (PRODUCT num1 num2 num3 ...) num1 * num2 outputs the product of its inputs. ucblogo-6.1/helpfiles/procedures0000664000175000017500000000036413600031207015156 0ustar jjcjjcPROCEDURES outputs a list of the names of all unburied user-defined procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.) ucblogo-6.1/helpfiles/procedurep0000664000175000017500000000013113600031207015143 0ustar jjcjjcPROCEDUREP name PROCEDURE? name outputs TRUE if the input is the name of a procedure. ucblogo-6.1/helpfiles/printwidthlimit0000664000175000017500000000023213600031207016230 0ustar jjcjjcPRINTWIDTHLIMIT (variable) if a nonnegative integer, indicates the maximum number of members in any one list that will be printed by PRINT, etc. ucblogo-6.1/helpfiles/printout0000664000175000017500000000026313600031207014665 0ustar jjcjjcPRINTOUT contentslist PO contentslist command. Prints to the write stream the definitions of all procedures, variables, and property lists named in the input contents list. ucblogo-6.1/helpfiles/printdepthlimit0000664000175000017500000000022313600031207016215 0ustar jjcjjcPRINTDEPTHLIMIT (variable) if a nonnegative integer, indicates the maximum depth of sublist structure that will be printed by PRINT, etc. ucblogo-6.1/helpfiles/print0000664000175000017500000000062713600031207014141 0ustar jjcjjcPRINT thing PR thing (PRINT thing1 thing2 ...) (PR thing1 thing2 ...) command. Prints the input or inputs to the current write stream (initially the screen). All the inputs are printed on a single line, separated by spaces, ending with a newline. If an input is a list, square brackets are not printed around it, but brackets are printed around sublists. Braces are always printed around arrays. ucblogo-6.1/helpfiles/primitives0000664000175000017500000000035013600031207015171 0ustar jjcjjcPRIMITIVES outputs a list of the names of all primitive procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.) ucblogo-6.1/helpfiles/primitivep0000664000175000017500000000034013600031207015165 0ustar jjcjjcPRIMITIVEP name PRIMITIVE? name outputs TRUE if the input is the name of a primitive procedure (one built into Logo). Note that some of the procedures described in this document are library procedures, not primitives. ucblogo-6.1/helpfiles/prefix0000664000175000017500000000013013600031207014267 0ustar jjcjjcPREFIX outputs the current file prefix, or [] if there is no prefix. See SETPREFIX. ucblogo-6.1/helpfiles/pr0000664000175000017500000000062713600031207013426 0ustar jjcjjcPRINT thing PR thing (PRINT thing1 thing2 ...) (PR thing1 thing2 ...) command. Prints the input or inputs to the current write stream (initially the screen). All the inputs are printed on a single line, separated by spaces, ending with a newline. If an input is a list, square brackets are not printed around it, but brackets are printed around sublists. Braces are always printed around arrays. ucblogo-6.1/helpfiles/ppt0000664000175000017500000000010313600031207013575 0ustar jjcjjcPENPAINT PPT sets the pen's position to DOWN and mode to PAINT. ucblogo-6.1/helpfiles/pprop0000664000175000017500000000020613600031207014136 0ustar jjcjjcPPROP plistname propname value command. Adds a property to the "plistname" property list with name "propname" and value "value". ucblogo-6.1/helpfiles/power0000664000175000017500000000015413600031207014134 0ustar jjcjjcPOWER num1 num2 outputs "num1" to the "num2" power. If num1 is negative, then num2 must be an integer. ucblogo-6.1/helpfiles/pots0000664000175000017500000000021713600031207013765 0ustar jjcjjcPOTS (library procedure) command. Prints the title lines of all unburied procedures in the workspace. Abbreviates POT PROCEDURES. ucblogo-6.1/helpfiles/pot0000664000175000017500000000037713600031207013611 0ustar jjcjjcPOT contentslist command. Prints the title lines of the named procedures and the definitions of the named variables and property lists. For property lists, the entire list is shown on one line instead of as a series of PPROP instructions as in PO. ucblogo-6.1/helpfiles/pos0000664000175000017500000000014213600031207013576 0ustar jjcjjcPOS outputs the turtle's current position, as a list of two numbers, the X and Y coordinates. ucblogo-6.1/helpfiles/pops0000664000175000017500000000021513600031207013757 0ustar jjcjjcPOPS (library procedure) command. Prints the definitions of all unburied procedures in the workspace. Abbreviates PO PROCEDURES. ucblogo-6.1/helpfiles/popls0000664000175000017500000000022413600031207014133 0ustar jjcjjcPOPLS (library procedure) command. Prints the contents of all unburied nonempty property lists in the workspace. Abbreviates PO PLISTS. ucblogo-6.1/helpfiles/popl0000664000175000017500000000023513600031207013752 0ustar jjcjjcPOPL plname (library procedure) POPL plnamelist command. Prints the definitions of the named property list(s). Abbreviates PO PLLIST plname(list). ucblogo-6.1/helpfiles/pop0000664000175000017500000000030513600031207013574 0ustar jjcjjcPOP stackname (library procedure) outputs the most recently PUSHed member of the stack that is the value of the variable whose name is "stackname" and removes that member from the stack. ucblogo-6.1/helpfiles/pons0000664000175000017500000000020713600031207013756 0ustar jjcjjcPONS (library procedure) command. Prints the definitions of all unburied variables in the workspace. Abbreviates PO NAMES. ucblogo-6.1/helpfiles/pon0000664000175000017500000000023313600031207013572 0ustar jjcjjcPON varname (library procedure) PON varnamelist command. Prints the definitions of the named variable(s). Abbreviates PO NAMELIST varname(list). ucblogo-6.1/helpfiles/poall0000664000175000017500000000017113600031207014106 0ustar jjcjjcPOALL (library procedure) command. Prints all unburied definitions in the workspace. Abbreviates PO CONTENTS. ucblogo-6.1/helpfiles/po0000664000175000017500000000026313600031207013417 0ustar jjcjjcPRINTOUT contentslist PO contentslist command. Prints to the write stream the definitions of all procedures, variables, and property lists named in the input contents list. ucblogo-6.1/helpfiles/pllist0000664000175000017500000000042513600031207014310 0ustar jjcjjcPLLIST plname (library procedure) PLLIST plnamelist outputs a contents list consisting of two empty lists followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input. ucblogo-6.1/helpfiles/plists0000664000175000017500000000026713600031207014323 0ustar jjcjjcPLISTS outputs a contents list consisting of two empty lists (indicating no procedures or variables) followed by a list of all unburied nonempty property lists in the workspace. ucblogo-6.1/helpfiles/plistp0000664000175000017500000000042613600031207014315 0ustar jjcjjcPLISTP name PLIST? name outputs TRUE if the input is the name of a *nonempty* property list. (In principle every word is the name of a property list; if you haven't put any properties in it, PLIST of that name outputs an empty list, rather than giving an error message.) ucblogo-6.1/helpfiles/plist0000664000175000017500000000050213600031207014130 0ustar jjcjjcPLIST plistname outputs a list whose odd-numbered members are the names, and whose even-numbered members are the values, of the properties in the property list named "plistname". The output is a copy of the actual property list; changing properties later will not magically change a list output earlier by PLIST. ucblogo-6.1/helpfiles/pick0000664000175000017500000000013213600031207013722 0ustar jjcjjcPICK list (library procedure) outputs a randomly chosen member of the input list. ucblogo-6.1/helpfiles/penup0000664000175000017500000000010613600031207014124 0ustar jjcjjcPENUP PU sets the pen's position to UP, without changing its mode. ucblogo-6.1/helpfiles/pensize0000664000175000017500000000031613600031207014455 0ustar jjcjjcPENSIZE outputs a list of two positive integers, specifying the horizontal and vertical thickness of the turtle pen. (In some implementations, including wxWidgets, the two numbers are always equal.) ucblogo-6.1/helpfiles/penreverse0000664000175000017500000000020713600031207015155 0ustar jjcjjcPENREVERSE PX sets the pen's position to DOWN and mode to REVERSE. (This may interact in system-dependent ways with use of color.) ucblogo-6.1/helpfiles/penpattern0000664000175000017500000000006713600031207015163 0ustar jjcjjcPENPATTERN outputs system-specific pen information. ucblogo-6.1/helpfiles/penpaint0000664000175000017500000000010313600031207014610 0ustar jjcjjcPENPAINT PPT sets the pen's position to DOWN and mode to PAINT. ucblogo-6.1/helpfiles/penmode0000664000175000017500000000014113600031207014423 0ustar jjcjjcPENMODE outputs one of the words PAINT, ERASE, or REVERSE according to the current pen mode. ucblogo-6.1/helpfiles/penerase0000664000175000017500000000010213600031207014573 0ustar jjcjjcPENERASE PE sets the pen's position to DOWN and mode to ERASE. ucblogo-6.1/helpfiles/pendownp0000664000175000017500000000011013600031207014622 0ustar jjcjjcPENDOWNP PENDOWN? outputs TRUE if the pen is down, FALSE if it's up. ucblogo-6.1/helpfiles/pendown0000664000175000017500000000011213600031207014444 0ustar jjcjjcPENDOWN PD sets the pen's position to DOWN, without changing its mode. ucblogo-6.1/helpfiles/pencolor0000664000175000017500000000075013600031207014623 0ustar jjcjjcPENCOLOR PC outputs a color number, a nonnegative integer that is associated with a particular color, or a list of RGB values if such a list was used as the most recent input to SETPENCOLOR. There are initial assignments for the first 16 colors: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey but other colors can be assigned to numbers by the PALETTE command. ucblogo-6.1/helpfiles/pen0000664000175000017500000000023313600031207013560 0ustar jjcjjcPEN (library procedure) outputs a list containing the pen's position, mode, thickness, and hardware-specific characteristics, for use by SETPEN. ucblogo-6.1/helpfiles/pe0000664000175000017500000000010213600031207013375 0ustar jjcjjcPENERASE PE sets the pen's position to DOWN and mode to ERASE. ucblogo-6.1/helpfiles/pd0000664000175000017500000000011213600031207013375 0ustar jjcjjcPENDOWN PD sets the pen's position to DOWN, without changing its mode. ucblogo-6.1/helpfiles/pc0000664000175000017500000000075013600031207013404 0ustar jjcjjcPENCOLOR PC outputs a color number, a nonnegative integer that is associated with a particular color, or a list of RGB values if such a list was used as the most recent input to SETPENCOLOR. There are initial assignments for the first 16 colors: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey but other colors can be assigned to numbers by the PALETTE command. ucblogo-6.1/helpfiles/pause0000664000175000017500000000150213600031207014113 0ustar jjcjjcPAUSE command or operation. Enters an interactive pause. The user is prompted for instructions, as at toplevel, but with a prompt that includes the name of the procedure in which PAUSE was invoked. Local variables of that procedure are available during the pause. PAUSE outputs if the pause is ended by a CONTINUE with an input. If the variable ERRACT exists, and an error condition occurs, the contents of that variable are run as an instructionlist. Typically ERRACT is given the value [PAUSE] so that an interactive pause will be entered in the event of an error. This allows the user to check values of local variables at the time of the error. Typing the system quit character (alt-S for wxWidgets; otherwise normally control-\ for Unix, control-W for DOS, or command-comma for Mac) will also enter a pause. ucblogo-6.1/helpfiles/parse0000664000175000017500000000031513600031207014111 0ustar jjcjjcPARSE word outputs the list that would result if the input word were entered in response to a READLIST operation. That is, PARSE READWORD has the same value as READLIST for the same characters read. ucblogo-6.1/helpfiles/palette0000664000175000017500000000027413600031207014441 0ustar jjcjjcPALETTE colornumber outputs a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the color associated with the given number. ucblogo-6.1/helpfiles/output0000664000175000017500000000042513600031207014341 0ustar jjcjjcOUTPUT value OP value command. Ends the running of the procedure in which it appears. That procedure outputs the value "value" to the context in which it was invoked. Don't be confused: OUTPUT itself is a command, but the procedure that invokes OUTPUT is an operation. ucblogo-6.1/helpfiles/or0000664000175000017500000000116313600031207013421 0ustar jjcjjcOR tf1 tf2 (OR tf1 tf2 tf3 ...) outputs TRUE if any input is TRUE, otherwise FALSE. All inputs must be TRUE or FALSE. (Comparison is case-insensitive regardless of the value of CASEIGNOREDP. That is, "true" or "True" or "TRUE" are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a TRUE or FALSE value. List expressions are evaluated from left to right; as soon as a TRUE value is found, the remaining inputs are not examined. Example: IF OR :X=0 [some.long.computation] [...] to avoid the long computation if the first condition is met. ucblogo-6.1/helpfiles/openwrite0000664000175000017500000000162613600031207015021 0ustar jjcjjcOPENWRITE filename command. Opens the named file for writing. If the file already existed, the old version is deleted and a new, empty file created. OPENWRITE, but not the other OPEN variants, will accept as input a two-element list, in which the first element must be a variable name, and the second must be a positive integer. A character buffer of the specified size will be created. When a SETWRITE is done with this same list (in the sense of .EQ, not a copy, so you must do something like ? make "buf [foo 100] ? openwrite :buf ? setwrite :buf [...] ? close :buf and not just ? openwrite [foo 100] ? setwrite [foo 100] and so on), the printed characters are stored in the buffer; when a CLOSE is done with the same list as input, the characters from the buffer (treated as one long word, even if spaces and newlines are included) become the value of the specified variable. ucblogo-6.1/helpfiles/openupdate0000664000175000017500000000101413600031207015140 0ustar jjcjjcOPENUPDATE filename command. Opens the named file for reading and writing. The read and write position is initially set to the end of the old file, if any. Note: each open file has only one position, for both reading and writing. If a file opened for update is both READER and WRITER at the same time, then SETREADPOS will also affect WRITEPOS and vice versa. Also, if you alternate reading and writing the same file, you must SETREADPOS between a write and a read, and SETWRITEPOS between a read and a write. ucblogo-6.1/helpfiles/openread0000664000175000017500000000020013600031207014565 0ustar jjcjjcOPENREAD filename command. Opens the named file for reading. The read position is initially at the beginning of the file. ucblogo-6.1/helpfiles/openappend0000664000175000017500000000032513600031207015131 0ustar jjcjjcOPENAPPEND filename command. Opens the named file for writing. If the file already exists, the write position is initially set to the end of the old file, so that newly written data will be appended to it. ucblogo-6.1/helpfiles/op0000664000175000017500000000042513600031207013417 0ustar jjcjjcOUTPUT value OP value command. Ends the running of the procedure in which it appears. That procedure outputs the value "value" to the context in which it was invoked. Don't be confused: OUTPUT itself is a command, but the procedure that invokes OUTPUT is an operation. ucblogo-6.1/helpfiles/numberp0000664000175000017500000000012713600031207014450 0ustar jjcjjcNUMBERP thing NUMBER? thing outputs TRUE if the input is a number, FALSE otherwise. ucblogo-6.1/helpfiles/notequalp0000664000175000017500000000027613600031207015015 0ustar jjcjjcNOTEQUALP thing1 thing2 NOTEQUAL? thing1 thing2 thing1 <> thing2 outputs FALSE if the inputs are equal, TRUE otherwise. See EQUALP for the meaning of equality for different data types. ucblogo-6.1/helpfiles/not0000664000175000017500000000030213600031207013573 0ustar jjcjjcNOT tf outputs TRUE if the input is FALSE, and vice versa. The input can be a list, in which case it is taken as an expression to run; that expression must produce a TRUE or FALSE value. ucblogo-6.1/helpfiles/norefresh0000664000175000017500000000060413600031207014773 0ustar jjcjjcNOREFRESH (command) tells Logo not to remember the turtle's motions, which may be useful to save time and memory if your program is interactive or animated, rather than drawing a static picture you'll want to print later (wxWidgets). In non-wxWidgets versions, using NOREFRESH may prevent Logo from restoring the graphics image after the window is moved, resized, or overlayed. ucblogo-6.1/helpfiles/nodribble0000664000175000017500000000013613600031207014740 0ustar jjcjjcNODRIBBLE command. Stops copying information into the dribble file, and closes the file. ucblogo-6.1/helpfiles/nodes0000664000175000017500000000146313600031207014114 0ustar jjcjjcNODES outputs a list of two numbers. The first represents the number of nodes of memory currently in use. The second shows the maximum number of nodes that have been in use at any time since the last invocation of NODES. (A node is a small block of computer memory as used by Logo. Each number uses one node. Each non-numeric word uses one node, plus some non-node memory for the characters in the word. Each array takes one node, plus some non-node memory, as well as the memory required by its elements. Each list requires one node per element, as well as the memory within the elements.) If you want to track the memory use of an algorithm, it is best if you invoke GC at the beginning of each iteration, since otherwise the maximum will include storage that is unused but not yet collected. ucblogo-6.1/helpfiles/names0000664000175000017500000000024313600031207014102 0ustar jjcjjcNAMES outputs a contents list consisting of an empty list (indicating no procedure names) followed by a list of all unburied variable names in the workspace. ucblogo-6.1/helpfiles/namep0000664000175000017500000000011613600031207014076 0ustar jjcjjcNAMEP name NAME? name outputs TRUE if the input is the name of a variable. ucblogo-6.1/helpfiles/namelist0000664000175000017500000000043013600031207014611 0ustar jjcjjcNAMELIST varname (library procedure) NAMELIST varnamelist outputs a contents list consisting of an empty list followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input. ucblogo-6.1/helpfiles/name0000664000175000017500000000015313600031207013717 0ustar jjcjjcNAME value varname (library procedure) command. Same as MAKE but with the inputs in reverse order. ucblogo-6.1/helpfiles/mousepos0000664000175000017500000000065613600031207014661 0ustar jjcjjcMOUSEPOS outputs the coordinates of the mouse, provided that it's within the graphics window, in turtle coordinates. If the mouse is outside the graphics window, then the last position within the window is returned. Exception: If a mouse button is pressed within the graphics window and held while the mouse is dragged outside the window, the mouse's position is returned as if the window were big enough to include it. ucblogo-6.1/helpfiles/modulo0000664000175000017500000000023013600031207014272 0ustar jjcjjcMODULO num1 num2 outputs the remainder on dividing "num1" by "num2"; both must be integers and the result is an integer with the same sign as num2. ucblogo-6.1/helpfiles/minus0000664000175000017500000000050613600031207014134 0ustar jjcjjcMINUS num - num outputs the negative of its input. Minus sign means unary minus if the previous token is an infix operator or open parenthesis, or it is preceded by a space and followed by a nonspace. There is a difference in binding strength between the two forms: MINUS 3 + 4 means -(3+4) - 3 + 4 means (-3)+4 ucblogo-6.1/helpfiles/memberp0000664000175000017500000000043713600031207014433 0ustar jjcjjcMEMBERP thing1 thing2 MEMBER? thing1 thing2 if "thing2" is a list or an array, outputs TRUE if "thing1" is EQUALP to a member of "thing2", FALSE otherwise. If "thing2" is a word, outputs TRUE if "thing1" is a one-character word EQUALP to a character of "thing2", FALSE otherwise. ucblogo-6.1/helpfiles/member0000664000175000017500000000051513600031207014250 0ustar jjcjjcMEMBER thing1 thing2 if "thing2" is a word or list and if MEMBERP with these inputs would output TRUE, outputs the portion of "thing2" from the first instance of "thing1" to the end. If MEMBERP would output FALSE, outputs the empty word or list according to the type of "thing2". It is an error for "thing2" to be an array. ucblogo-6.1/helpfiles/mdsetitem0000664000175000017500000000022013600031207014765 0ustar jjcjjcMDSETITEM indexlist array value (library procedure) command. Replaces the member of "array" chosen by "indexlist" with the new "value". ucblogo-6.1/helpfiles/mditem0000664000175000017500000000022313600031207014254 0ustar jjcjjcMDITEM indexlist array (library procedure) outputs the member of the multidimensional "array" selected by the list of numbers "indexlist". ucblogo-6.1/helpfiles/mdarray0000664000175000017500000000056413600031207014444 0ustar jjcjjcMDARRAY sizelist (library procedure) (MDARRAY sizelist origin) outputs a multi-dimensional array. The first input must be a list of one or more positive integers. The second input, if present, must be a single integer that applies to every dimension of the array. Ex: (MDARRAY [3 5] 0) outputs a two-dimensional array whose members range from [0 0] to [2 4]. ucblogo-6.1/helpfiles/mapdse0000664000175000017500000000216713600031207014257 0ustar jjcjjcMAP.SE template data (library procedure) (MAP.SE template data1 data2 ...) outputs a list formed by evaluating the template list repeatedly and concatenating the results using SENTENCE. That is, the members of the output are the members of the results of the evaluations. The output list might, therefore, be of a different length from that of the data input(s). (If the result of an evaluation is the empty list, it contributes nothing to the final output.) The data inputs may be words or lists. In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. ucblogo-6.1/helpfiles/map0000664000175000017500000000227313600031207013561 0ustar jjcjjcMAP template data (library procedure) (MAP template data1 data2 ...) outputs a word or list, depending on the type of the data input, of the same length as that data input. (If more than one data input are given, the output is of the same type as data1.) Each member of the output is the result of evaluating the template list, filling the slots with the corresponding member(s) of the data input(s). (All data inputs must be the same length.) In the case of a word output, the results of the template evaluation must be words, and they are concatenated with WORD. In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. ucblogo-6.1/helpfiles/make0000664000175000017500000000043613600031207013720 0ustar jjcjjcMAKE varname value command. Assigns the value "value" to the variable named "varname", which must be a word. Variable names are case-insensitive. If a variable with the same name already exists, the value of that variable is changed. If not, a new global variable is created. ucblogo-6.1/helpfiles/macrop0000664000175000017500000000011513600031207014256 0ustar jjcjjcMACROP name MACRO? name outputs TRUE if its input is the name of a macro. ucblogo-6.1/helpfiles/macroexpand0000664000175000017500000000067113600031207015305 0ustar jjcjjcMACROEXPAND expr (library procedure) takes as its input a Logo expression that invokes a macro (that is, one that begins with the name of a macro) and outputs the the Logo expression into which the macro would translate the input expression. .macro localmake :name :value op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]] end ? show macroexpand [localmake "pi 3.14159] [local "pi apply "make [pi 3.14159]] ucblogo-6.1/helpfiles/lt0000664000175000017500000000017713600031207013424 0ustar jjcjjcLEFT degrees LT degrees turns the turtle counterclockwise by the specified angle, measured in degrees (1/360 of a circle). ucblogo-6.1/helpfiles/lshift0000664000175000017500000000025613600031207014274 0ustar jjcjjcLSHIFT num1 num2 outputs "num1" logical-shifted to the left by "num2" bits. If num2 is negative, the shift is to the right with zero fill. The inputs must be integers. ucblogo-6.1/helpfiles/lput0000664000175000017500000000040613600031207013764 0ustar jjcjjcLPUT thing list outputs a list equal to its second input with one extra member, the first input, at the end. If the second input is a word, then the first input must be a one-letter word, and LPUT is equivalent to WORD with its inputs in the other order. ucblogo-6.1/helpfiles/lowercase0000664000175000017500000000020313600031207014757 0ustar jjcjjcLOWERCASE word outputs a copy of the input word, but with all uppercase letters changed to the corresponding lowercase letter. ucblogo-6.1/helpfiles/logoversion0000664000175000017500000000013313600031207015343 0ustar jjcjjcLOGOVERSION (variable) a real number indicating the Logo version number, e.g., 5.5 ucblogo-6.1/helpfiles/logoplatform0000664000175000017500000000015413600031207015505 0ustar jjcjjcLOGOPLATFORM (variable) one of the following words: wxWidgets, X11, Windows, or Unix-Nographics. ucblogo-6.1/helpfiles/log100000664000175000017500000000007013600031207013717 0ustar jjcjjcLOG10 num outputs the common logarithm of the input. ucblogo-6.1/helpfiles/localmake0000664000175000017500000000022413600031207014726 0ustar jjcjjcLOCALMAKE varname value (library procedure) command. Makes the named variable local, like LOCAL, and assigns it the given value, like MAKE. ucblogo-6.1/helpfiles/local0000664000175000017500000000107613600031207014076 0ustar jjcjjcLOCAL varname LOCAL varnamelist (LOCAL varname1 varname2 ...) command. Accepts as inputs one or more words, or a list of words. A variable is created for each of these words, with that word as its name. The variables are local to the currently running procedure. Logo variables follow dynamic scope rules; a variable that is local to a procedure is available to any subprocedure invoked by that procedure. The variables created by LOCAL have no initial value; they must be assigned a value (e.g., with MAKE) before the procedure attempts to read their value. ucblogo-6.1/helpfiles/loadpict0000664000175000017500000000040013600031207014571 0ustar jjcjjcLOADPICT filename command. Reads the specified file, which must have been written by a SAVEPICT command, and restores the graphics window and color palette settings to the values stored in the file. Any drawing previously on the screen is cleared. ucblogo-6.1/helpfiles/loadnoisily0000664000175000017500000000022613600031207015326 0ustar jjcjjcLOADNOISILY (variable) if TRUE, prints the names of procedures defined when loading from a file (including the temporary file made by EDIT). ucblogo-6.1/helpfiles/load0000664000175000017500000000115013600031207013714 0ustar jjcjjcLOAD filename command. Reads instructions from the named file and executes them. The file can include procedure definitions with TO, and these are accepted even if a procedure by the same name already exists. If the file assigns a list value to a variable named STARTUP, then that list is run as an instructionlist after the file is loaded. If there is a variable LOADNOISILY whose value is TRUE, then TO commands in the file print "PROCNAME defined" (where PROCNAME is the name of the procedure being defined); if LOADNOISILY is FALSE or undefined, TO commands in the file are carried out silently. ucblogo-6.1/helpfiles/ln0000664000175000017500000000006613600031207013413 0ustar jjcjjcLN num outputs the natural logarithm of the input. ucblogo-6.1/helpfiles/listtoarray0000664000175000017500000000022513600031207015354 0ustar jjcjjcLISTTOARRAY list (LISTTOARRAY list origin) outputs an array of the same size as the input list, whose members are the members of the input list. ucblogo-6.1/helpfiles/listp0000664000175000017500000000012113600031207014125 0ustar jjcjjcLISTP thing LIST? thing outputs TRUE if the input is a list, FALSE otherwise. ucblogo-6.1/helpfiles/list0000664000175000017500000000023013600031207013746 0ustar jjcjjcLIST thing1 thing2 (LIST thing1 thing2 thing3 ...) outputs a list whose members are its inputs, which can be any Logo datum (word, list, or array). ucblogo-6.1/helpfiles/lessp0000664000175000017500000000016113600031207014124 0ustar jjcjjcLESSP num1 num2 LESS? num1 num2 num1 < num2 outputs TRUE if its first input is strictly less than its second. ucblogo-6.1/helpfiles/lessequalp0000664000175000017500000000017713600031207015163 0ustar jjcjjcLESSEQUALP num1 num2 LESSEQUAL? num1 num2 num1 <= num2 outputs TRUE if its first input is less than or equal to its second. ucblogo-6.1/helpfiles/left0000664000175000017500000000017713600031207013737 0ustar jjcjjcLEFT degrees LT degrees turns the turtle counterclockwise by the specified angle, measured in degrees (1/360 of a circle). ucblogo-6.1/helpfiles/last0000664000175000017500000000022113600031207013736 0ustar jjcjjcLAST wordorlist if the input is a word, outputs the last character of the word. If the input is a list, outputs the last member of the list. ucblogo-6.1/helpfiles/labelsize0000664000175000017500000000066013600031207014754 0ustar jjcjjcLABELSIZE (wxWidgets only) outputs a list of two positive integers, the width and height of characters displayed by LABEL measured in turtle steps (which will be different from screen pixels if SETSCRUNCH has been used). There is no SETLABELSIZE because the width and height of a font are not separately controllable, so the inverse of this operation is SETLABELHEIGHT, which takes just one number for the desired height. ucblogo-6.1/helpfiles/label0000664000175000017500000000017613600031207014063 0ustar jjcjjcLABEL text takes a word or list as input, and prints the input on the graphics window, starting at the turtle's position. ucblogo-6.1/helpfiles/keyp0000664000175000017500000000105113600031207013745 0ustar jjcjjcKEYP KEY? predicate, outputs TRUE if there are characters waiting to be read from the read stream. If the read stream is a file, this is equivalent to NOT EOFP. If the read stream is the terminal, then echoing is turned off and the terminal is set to CBREAK (character at a time instead of line at a time) mode. It remains in this mode until some line-mode reading is requested (e.g., READLIST). The Unix operating system forgets about any pending characters when it switches modes, so the first KEYP invocation will always output FALSE. ucblogo-6.1/helpfiles/keyact0000664000175000017500000000125713600031207014265 0ustar jjcjjcKEYACT (variable) if nonempty, should be an instruction list that will be evaluated whenever a key is pressed on the keyboard. The instruction list can use READCHAR to find out what key was pressed. Note that only keys that produce characters qualify; pressing SHIFT or CONTROL alone will not cause KEYACT to be evaluated. Note that it's possible for the user to press a key during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting KEYACT to the empty list. One easy way to do that is the following: make "keyact [key.action] to key.action [:keyact []] ... ; whatever you want the key to do end ucblogo-6.1/helpfiles/item0000664000175000017500000000053613600031207013742 0ustar jjcjjcITEM index thing if the "thing" is a word, outputs the "index"th character of the word. If the "thing" is a list, outputs the "index"th member of the list. If the "thing" is an array, outputs the "index"th member of the array. "Index" starts at 1 for words and lists; the starting index of an array is specified when the array is created. ucblogo-6.1/helpfiles/iseq0000664000175000017500000000024513600031207013742 0ustar jjcjjcISEQ from to (library procedure) outputs a list of the integers from FROM to TO, inclusive. ? show iseq 3 7 [3 4 5 6 7] ? show iseq 7 3 [7 6 5 4 3] ucblogo-6.1/helpfiles/invoke0000664000175000017500000000032313600031207014271 0ustar jjcjjcINVOKE template input (library procedure) (INVOKE template input1 input2 ...) command or operation. Exactly like APPLY except that the inputs are provided as separate expressions rather than in a list. ucblogo-6.1/helpfiles/int0000664000175000017500000000032313600031207013570 0ustar jjcjjcINT num outputs its input with fractional part removed, i.e., an integer with the same sign as the input, whose absolute value is the largest integer less than or equal to the absolute value of the input. ucblogo-6.1/helpfiles/increasefont0000664000175000017500000000026413600031207015462 0ustar jjcjjcINCREASEFONT DECREASEFONT command (wxWidgets only). Increase or decrease the size of the font used in the text and edit windows to the next larger or smaller available size. ucblogo-6.1/helpfiles/ignore0000664000175000017500000000023713600031207014265 0ustar jjcjjcIGNORE value (library procedure) command. Does nothing. Used when an expression is evaluated for a side effect and its actual value is unimportant. ucblogo-6.1/helpfiles/iftrue0000664000175000017500000000030313600031207014272 0ustar jjcjjcIFTRUE instructionlist IFT instructionlist command. Runs its input if the most recent TEST instruction had a TRUE input. The TEST must have been in the same procedure or a superprocedure. ucblogo-6.1/helpfiles/ift0000664000175000017500000000030313600031207013556 0ustar jjcjjcIFTRUE instructionlist IFT instructionlist command. Runs its input if the most recent TEST instruction had a TRUE input. The TEST must have been in the same procedure or a superprocedure. ucblogo-6.1/helpfiles/iffalse0000664000175000017500000000030513600031207014407 0ustar jjcjjcIFFALSE instructionlist IFF instructionlist command. Runs its input if the most recent TEST instruction had a FALSE input. The TEST must have been in the same procedure or a superprocedure. ucblogo-6.1/helpfiles/iff0000664000175000017500000000030513600031207013542 0ustar jjcjjcIFFALSE instructionlist IFF instructionlist command. Runs its input if the most recent TEST instruction had a FALSE input. The TEST must have been in the same procedure or a superprocedure. ucblogo-6.1/helpfiles/ifelse0000664000175000017500000000047213600031207014252 0ustar jjcjjcIFELSE tf instructionlist1 instructionlist2 command or operation. If the first input has the value TRUE, then IFELSE runs the second input. If the first input has the value FALSE, then IFELSE runs the third input. IFELSE outputs a value if the instructionlist contains an expression that outputs a value. ucblogo-6.1/helpfiles/if0000664000175000017500000000143513600031207013401 0ustar jjcjjcIF tf instructionlist (IF tf instructionlist1 instructionlist2) command. If the first input has the value TRUE, then IF runs the second input. If the first input has the value FALSE, then IF does nothing. (If given a third input, IF acts like IFELSE, as described below.) It is an error if the first input is not either TRUE or FALSE. For compatibility with earlier versions of Logo, if an IF instruction is not enclosed in parentheses, but the first thing on the instruction line after the second input expression is a literal list (i.e., a list in square brackets), the IF is treated as if it were IFELSE, but a warning message is given. If this aberrant IF appears in a procedure body, the warning is given only the first time the procedure is invoked in each Logo session. ucblogo-6.1/helpfiles/ht0000664000175000017500000000030013600031207013404 0ustar jjcjjcHIDETURTLE HT makes the turtle invisible. It's a good idea to do this while you're in the middle of a complicated drawing, because hiding the turtle speeds up the drawing substantially. ucblogo-6.1/helpfiles/home0000664000175000017500000000014113600031207013724 0ustar jjcjjcHOME moves the turtle to the center of the screen. Equivalent to SETPOS [0 0] SETHEADING 0. ucblogo-6.1/helpfiles/hideturtle0000664000175000017500000000030013600031207015142 0ustar jjcjjcHIDETURTLE HT makes the turtle invisible. It's a good idea to do this while you're in the middle of a complicated drawing, because hiding the turtle speeds up the drawing substantially. ucblogo-6.1/helpfiles/help0000664000175000017500000000140113600031207013724 0ustar jjcjjcHELP name (HELP) command. Prints information from the reference manual about the primitive procedure named by the input. With no input, lists all the primitives about which help is available. If there is an environment variable LOGOHELP, then its value is taken as the directory in which to look for help files, instead of the default help directory. If HELP is called with the name of a defined procedure for which there is no help file, it will print the title line of the procedure followed by lines from the procedure body that start with semicolon, stopping when a non-semicolon line is seen. Exceptionally, the HELP command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. ucblogo-6.1/helpfiles/heading0000664000175000017500000000007613600031207014402 0ustar jjcjjcHEADING outputs a number, the turtle's heading in degrees. ucblogo-6.1/helpfiles/greaterp0000664000175000017500000000017213600031207014611 0ustar jjcjjcGREATERP num1 num2 GREATER? num1 num2 num1 > num2 outputs TRUE if its first input is strictly greater than its second. ucblogo-6.1/helpfiles/greaterequalp0000664000175000017500000000021113600031207015633 0ustar jjcjjcGREATEREQUALP num1 num2 GREATEREQUAL? num1 num2 num1 >= num2 outputs TRUE if its first input is greater than or equal to its second. ucblogo-6.1/helpfiles/gprop0000664000175000017500000000023413600031207014126 0ustar jjcjjcGPROP plistname propname outputs the value of the "propname" property in the "plistname" property list, or the empty list if there is no such property. ucblogo-6.1/helpfiles/goto0000664000175000017500000000032613600031207013751 0ustar jjcjjcGOTO word command. Looks for a TAG command with the same input in the same procedure, and continues running the procedure from the location of that TAG. It is meaningless to use GOTO outside of a procedure. ucblogo-6.1/helpfiles/global0000664000175000017500000000104513600031207014240 0ustar jjcjjcGLOBAL varname GLOBAL varnamelist (GLOBAL varname1 varname2 ...) command. Accepts as inputs one or more words, or a list of words. A global variable is created for each of these words, with that word as its name. The only reason this is necessary is that you might want to use the "setter" notation SETXYZ for a variable XYZ that does not already have a value; GLOBAL "XYZ makes that legal. Note: If there is currently a local variable of the same name, this command does *not* make Logo use the global value instead of the local one. ucblogo-6.1/helpfiles/gensym0000664000175000017500000000017413600031207014304 0ustar jjcjjcGENSYM (library procedure) outputs a unique word each time it's invoked. The words are of the form G1, G2, etc. ucblogo-6.1/helpfiles/gc0000664000175000017500000000164613600031207013400 0ustar jjcjjcGC (GC anything) command. Runs the garbage collector, reclaiming unused nodes. Logo does this when necessary anyway, but you may want to use this command to control exactly when Logo does it. In particular, the numbers output by the NODES operation will not be very meaningful unless garbage has been collected. Another reason to use GC is that a garbage collection takes a noticeable fraction of a second, and you may want to schedule collections for times before or after some time-critical animation. If invoked with an input (of any value), GC runs a full garbage collection, including GCTWA (Garbage Collect Truly Worthless Atoms, which means that it removes from Logo's memory words that used to be procedure or variable names but aren't any more); without an input, GC does a generational garbage collection, which means that only recently created nodes are examined. (The latter is usually good enough.) ucblogo-6.1/helpfiles/fulltext0000664000175000017500000000122013600031207014642 0ustar jjcjjcFULLTEXT procname outputs a representation of the procedure "procname" in which formatting information is preserved. If the procedure was defined with TO, EDIT, or LOAD, then the output is a list of words. Each word represents one entire line of the definition in the form output by READWORD, including extra spaces and continuation lines. The last member of the output represents the END line. If the procedure was defined with DEFINE, then the output is a list of lists. If these lists are printed, one per line, the result will look like a definition using TO. Note: the output from FULLTEXT is not suitable for use as input to DEFINE! ucblogo-6.1/helpfiles/fullscreen0000664000175000017500000000122513600031207015142 0ustar jjcjjcFULLSCREEN FS rearranges the size and position of windows to maximize the space available in the graphics window. The details differ among machines. Compare SPLITSCREEN and TEXTSCREEN. Since there must be a text window to allow printing (including the printing of the Logo prompt), Logo automatically switches from fullscreen to splitscreen whenever anything is printed. In the DOS version, switching from fullscreen to splitscreen loses the part of the picture that's hidden by the text window. [This design decision follows from the scarcity of memory, so that the extra memory to remember an invisible part of a drawing seems too expensive.] ucblogo-6.1/helpfiles/fullprintp0000664000175000017500000000067313600031207015205 0ustar jjcjjcFULLPRINTP (variable) if TRUE, then words that were created using backslash or vertical bar (to include characters that would otherwise not be treated as part of a word) are printed with the backslashes or vertical bars shown, so that the printed result could be re-read by Logo to produce the same value. If FULLPRINTP is TRUE then the empty word (however it was created) prints as ||. (Otherwise it prints as nothing at all.) ucblogo-6.1/helpfiles/fs0000664000175000017500000000122513600031207013410 0ustar jjcjjcFULLSCREEN FS rearranges the size and position of windows to maximize the space available in the graphics window. The details differ among machines. Compare SPLITSCREEN and TEXTSCREEN. Since there must be a text window to allow printing (including the printing of the Logo prompt), Logo automatically switches from fullscreen to splitscreen whenever anything is printed. In the DOS version, switching from fullscreen to splitscreen loses the part of the picture that's hidden by the text window. [This design decision follows from the scarcity of memory, so that the extra memory to remember an invisible part of a drawing seems too expensive.] ucblogo-6.1/helpfiles/fput0000664000175000017500000000035113600031207013755 0ustar jjcjjcFPUT thing list outputs a list equal to its second input with one extra member, the first input, at the beginning. If the second input is a word, then the first input must be a one-letter word, and FPUT is equivalent to WORD. ucblogo-6.1/helpfiles/forward0000664000175000017500000000021413600031207014441 0ustar jjcjjcFORWARD dist FD dist moves the turtle forward, in the direction that it's facing, by the specified distance (measured in turtle steps). ucblogo-6.1/helpfiles/form0000664000175000017500000000124613600031207013746 0ustar jjcjjcFORM num width precision outputs a word containing a printable representation of "num", possibly preceded by spaces (and therefore not a number for purposes of performing arithmetic operations), with at least "width" characters, including exactly "precision" digits after the decimal point. (If "precision" is 0 then there will be no decimal point in the output.) As a debugging feature, (FORM num -1 format) will print the floating point "num" according to the C printf "format", to allow to hex :num op form :num -1 "|%08X %08X| end to allow finding out the exact result of floating point operations. The precise format needed may be machine-dependent. ucblogo-6.1/helpfiles/forever0000664000175000017500000000023713600031207014452 0ustar jjcjjcFOREVER instructionlist command. Runs the "instructionlist" repeatedly, until something inside the instructionlist (such as STOP or THROW) makes it stop. ucblogo-6.1/helpfiles/foreach0000664000175000017500000000172413600031207014413 0ustar jjcjjcFOREACH data template (library procedure) (FOREACH data1 data2 ... template) command. Evaluates the template list repeatedly, once for each member of the data list. If more than one data list are given, each of them must be the same length. (The data inputs can be words, in which case the template is evaluated once for each character.) In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. ucblogo-6.1/helpfiles/for0000664000175000017500000000266613600031207013600 0ustar jjcjjcFOR forcontrol instructionlist (library procedure) command. The first input must be a list containing three or four members: (1) a word, which will be used as the name of a local variable; (2) a word or list that will be evaluated as by RUN to determine a number, the starting value of the variable; (3) a word or list that will be evaluated to determine a number, the limit value of the variable; (4) an optional word or list that will be evaluated to determine the step size. If the fourth member is missing, the step size will be 1 or -1 depending on whether the limit value is greater than or less than the starting value, respectively. The second input is an instructionlist. The effect of FOR is to run that instructionlist repeatedly, assigning a new value to the control variable (the one named by the first member of the forcontrol list) each time. First the starting value is assigned to the control variable. Then the value is compared to the limit value. FOR is complete when the sign of (current - limit) is the same as the sign of the step size. (If no explicit step size is provided, the instructionlist is always run at least once. An explicit step size can lead to a zero-trip FOR, e.g., FOR [I 1 0 1] ...) Otherwise, the instructionlist is run, then the step is added to the current value of the control variable and FOR returns to the comparison step. ? for [i 2 7 1.5] [print :i] 2 3.5 5 6.5 ? ucblogo-6.1/helpfiles/font0000664000175000017500000000012413600031207013743 0ustar jjcjjcFONT (wxWidgets only) outputs the name of the font family used in all windows. ucblogo-6.1/helpfiles/firsts0000664000175000017500000000061413600031207014313 0ustar jjcjjcFIRSTS list outputs a list containing the FIRST of each member of the input list. It is an error if any member of the input list is empty. (The input itself may be empty, in which case the output is also empty.) This could be written as to firsts :list output map "first :list end but is provided as a primitive in order to speed up the iteration tools MAP, MAP.SE, and FOREACH. ucblogo-6.1/helpfiles/first0000664000175000017500000000040213600031207014123 0ustar jjcjjcFIRST thing if the input is a word, outputs the first character of the word. If the input is a list, outputs the first member of the list. If the input is an array, outputs the origin of the array (that is, the INDEX OF the first member of the array). ucblogo-6.1/helpfiles/find0000664000175000017500000000155413600031207013725 0ustar jjcjjcFIND tftemplate data (library procedure) outputs the first constituent of the data input (the first member of a list, or the first character of a word) for which the value produced by evaluating the template with that consituent in its slot is TRUE. If there is no such constituent, the empty list is output. In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. ucblogo-6.1/helpfiles/filter0000664000175000017500000000177213600031207014274 0ustar jjcjjcFILTER tftemplate data (library procedure) outputs a word or list, depending on the type of the data input, containing a subset of the members (for a list) or characters (for a word) of the input. The template is evaluated once for each member or character of the data, and it must produce a TRUE or FALSE value. If the value is TRUE, then the corresponding input constituent is included in the output. ? print filter "vowelp "elephant eea ? In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. ucblogo-6.1/helpfiles/filled0000664000175000017500000000062313600031207014240 0ustar jjcjjcFILLED color instructions runs the instructions, remembering all points visited by turtle motion commands, starting *and ending* with the turtle's initial position. Then draws (ignoring penmode) the resulting polygon, in the current pen color, filling the polygon with the given color, which can be a color number or an RGB list. The instruction list cannot include another FILLED invocation. ucblogo-6.1/helpfiles/fill0000664000175000017500000000036313600031207013730 0ustar jjcjjcFILL fills in a region of the graphics window containing the turtle and bounded by lines that have been drawn earlier. This is not portable; it doesn't work for all machines, and may not work exactly the same way on different machines. ucblogo-6.1/helpfiles/filep0000664000175000017500000000023513600031207014077 0ustar jjcjjcFILEP filename FILE? filename (library procedure) predicate, outputs TRUE if a file of the specified name exists and can be read, FALSE otherwise. ucblogo-6.1/helpfiles/fence0000664000175000017500000000040213600031207014054 0ustar jjcjjcFENCE tells the turtle to enter fence mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move as far as it can and then stop at the edge with an "out of bounds" error message. Compare WRAP and WINDOW. ucblogo-6.1/helpfiles/fd0000664000175000017500000000021413600031207013366 0ustar jjcjjcFORWARD dist FD dist moves the turtle forward, in the direction that it's facing, by the specified distance (measured in turtle steps). ucblogo-6.1/helpfiles/exp0000664000175000017500000000007013600031207013571 0ustar jjcjjcEXP num outputs e (2.718281828+) to the input power. ucblogo-6.1/helpfiles/error0000664000175000017500000000066113600031207014134 0ustar jjcjjcERROR outputs a list describing the error just caught, if any. If there was not an error caught since the last use of ERROR, the empty list will be output. The error list contains four members: an integer code corresponding to the type of error, the text of the error message (as a single word including spaces), the name of the procedure in which the error occurred, and the instruction line on which the error occurred. ucblogo-6.1/helpfiles/erract0000664000175000017500000000023213600031207014255 0ustar jjcjjcERRACT (variable) an instructionlist that will be run in the event of an error. Typically has the value [PAUSE] to allow interactive debugging. ucblogo-6.1/helpfiles/erps0000664000175000017500000000014413600031207013750 0ustar jjcjjcERPS command. Erases all unburied procedures from the workspace. Abbreviates ERASE PROCEDURES. ucblogo-6.1/helpfiles/erpls0000664000175000017500000000014513600031207014125 0ustar jjcjjcERPLS command. Erases all unburied property lists from the workspace. Abbreviates ERASE PLISTS. ucblogo-6.1/helpfiles/erpl0000664000175000017500000000025613600031207013745 0ustar jjcjjcERPL plname (library procedure) ERPL plnamelist command. Erases from the workspace the property list(s) named in the input. Abbreviates ERASE PLLIST plname(list). ucblogo-6.1/helpfiles/erns0000664000175000017500000000013613600031207013747 0ustar jjcjjcERNS command. Erases all unburied variables from the workspace. Abbreviates ERASE NAMES. ucblogo-6.1/helpfiles/ern0000664000175000017500000000025413600031207013565 0ustar jjcjjcERN varname (library procedure) ERN varnamelist command. Erases from the workspace the variable(s) named in the input. Abbreviates ERASE NAMELIST varname(list). ucblogo-6.1/helpfiles/erf0000664000175000017500000000017413600031207013556 0ustar jjcjjcERASEFILE filename ERF filename command. Erases (deletes, removes) the named file, which should not currently be open. ucblogo-6.1/helpfiles/erasefile0000664000175000017500000000017413600031207014741 0ustar jjcjjcERASEFILE filename ERF filename command. Erases (deletes, removes) the named file, which should not currently be open. ucblogo-6.1/helpfiles/erase0000664000175000017500000000034513600031207014101 0ustar jjcjjcERASE contentslist ER contentslist command. Erases from the workspace the procedures, variables, and property lists named in the input. Primitive procedures may not be erased unless the variable REDEFP has the value TRUE. ucblogo-6.1/helpfiles/erall0000664000175000017500000000020313600031207014072 0ustar jjcjjcERALL command. Erases all unburied procedures, variables, and property lists from the workspace. Abbreviates ERASE CONTENTS. ucblogo-6.1/helpfiles/er0000664000175000017500000000034513600031207013410 0ustar jjcjjcERASE contentslist ER contentslist command. Erases from the workspace the procedures, variables, and property lists named in the input. Primitive procedures may not be erased unless the variable REDEFP has the value TRUE. ucblogo-6.1/helpfiles/equalp0000664000175000017500000000155513600031207014275 0ustar jjcjjcEQUALP thing1 thing2 EQUAL? thing1 thing2 thing1 = thing2 outputs TRUE if the inputs are equal, FALSE otherwise. Two numbers are equal if they have the same numeric value. Two non-numeric words are equal if they contain the same characters in the same order. If there is a variable named CASEIGNOREDP whose value is TRUE, then an upper case letter is considered the same as the corresponding lower case letter. (This is the case by default.) Two lists are equal if their members are equal. An array is only equal to itself; two separately created arrays are never equal even if their members are equal. (It is important to be able to know if two expressions have the same array as their value because arrays are mutable; if, for example, two variables have the same array as their values then performing SETITEM on one of them will also change the other.) ucblogo-6.1/helpfiles/epspict0000664000175000017500000000061113600031207014445 0ustar jjcjjcEPSPICT filename command. Writes a file with the specified name, containing an Encapsulated Postscript (EPS) representation of the state of the graphics window. This file can be imported into other programs that understand EPS format. Restrictions: the drawing cannot use FILL, PENERASE, or PENREVERSE; any such instructions will be ignored in the translation to Postscript form. ucblogo-6.1/helpfiles/eofp0000664000175000017500000000017313600031207013732 0ustar jjcjjcEOFP EOF? predicate, outputs TRUE if there are no more characters to be read in the read stream file, FALSE otherwise. ucblogo-6.1/helpfiles/emptyp0000664000175000017500000000015613600031207014320 0ustar jjcjjcEMPTYP thing EMPTY? thing outputs TRUE if the input is the empty word or the empty list, FALSE otherwise. ucblogo-6.1/helpfiles/edps0000664000175000017500000000011113600031207013724 0ustar jjcjjcEDPS (library procedure) command. Abbreviates EDIT PROCEDURES. ucblogo-6.1/helpfiles/edpls0000664000175000017500000000010613600031207014104 0ustar jjcjjcEDPLS (library procedure) command. Abbreviates EDIT PLISTS. ucblogo-6.1/helpfiles/edpl0000664000175000017500000000015013600031207013720 0ustar jjcjjcEDPL plname (library procedure) EDPL plnamelist command. Abbreviates EDIT PLLIST plname(list). ucblogo-6.1/helpfiles/edns0000664000175000017500000000010413600031207013724 0ustar jjcjjcEDNS (library procedure) command. Abbreviates EDIT NAMES. ucblogo-6.1/helpfiles/edn0000664000175000017500000000015313600031207013545 0ustar jjcjjcEDN varname (library procedure) EDN varnamelist command. Abbreviates EDIT NAMELIST varname(list). ucblogo-6.1/helpfiles/editfile0000664000175000017500000000103213600031207014561 0ustar jjcjjcEDITFILE filename command. Starts the Logo editor, like EDIT, but instead of editing a temporary file it edits the file specified by the input. When you leave the editor, Logo reads the revised file, as for EDIT. EDITFILE also remembers the filename, so that a subsequent EDIT command with no input will re-edit the same file. EDITFILE is intended as an alternative to LOAD and SAVE. You can maintain a workspace file yourself, controlling the order in which definitions appear, maintaining comments in the file, and so on. ucblogo-6.1/helpfiles/edit0000664000175000017500000000266713600031207013740 0ustar jjcjjcEDIT contentslist ED contentslist (EDIT) (ED) command. If invoked with an input, EDIT writes the definitions of the named items into a temporary file and edits that file, using an editor that depends on the platform you're using. In wxWidgets, and in the MacOS Classic version, there is an editor built into Logo. In the non-wxWidgets versions for Unix, MacOS X, Windows, and DOS, Logo uses your favorite editor as determined by the EDITOR environment variable. If you don't have an EDITOR variable, edits the definitions using jove. If invoked without an input, EDIT edits the same file left over from a previous EDIT or EDITFILE instruction. When you leave the editor, Logo reads the revised definitions and modifies the workspace accordingly. It is not an error if the input includes names for which there is no previous definition. If there is a variable LOADNOISILY whose value is TRUE, then, after leaving the editor, TO commands in the temporary file print "PROCNAME defined" (where PROCNAME is the name of the procedure being defined); if LOADNOISILY is FALSE or undefined, TO commands in the file are carried out silently. If there is an environment variable called TEMP, then Logo uses its value as the directory in which to write the temporary file used for editing. Exceptionally, the EDIT command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. ucblogo-6.1/helpfiles/edall0000664000175000017500000000011013600031207014051 0ustar jjcjjcEDALL (library procedure) command. Abbreviates EDIT CONTENTS. ucblogo-6.1/helpfiles/ed0000664000175000017500000000266713600031207013403 0ustar jjcjjcEDIT contentslist ED contentslist (EDIT) (ED) command. If invoked with an input, EDIT writes the definitions of the named items into a temporary file and edits that file, using an editor that depends on the platform you're using. In wxWidgets, and in the MacOS Classic version, there is an editor built into Logo. In the non-wxWidgets versions for Unix, MacOS X, Windows, and DOS, Logo uses your favorite editor as determined by the EDITOR environment variable. If you don't have an EDITOR variable, edits the definitions using jove. If invoked without an input, EDIT edits the same file left over from a previous EDIT or EDITFILE instruction. When you leave the editor, Logo reads the revised definitions and modifies the workspace accordingly. It is not an error if the input includes names for which there is no previous definition. If there is a variable LOADNOISILY whose value is TRUE, then, after leaving the editor, TO commands in the temporary file print "PROCNAME defined" (where PROCNAME is the name of the procedure being defined); if LOADNOISILY is FALSE or undefined, TO commands in the file are carried out silently. If there is an environment variable called TEMP, then Logo uses its value as the directory in which to write the temporary file used for editing. Exceptionally, the EDIT command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. ucblogo-6.1/helpfiles/dsetsegmentsize0000664000175000017500000000100013600031207016204 0ustar jjcjjc.SETSEGMENTSIZE num command. Sets the number of nodes that Logo allocates from the operating system at once to num, which must be a positive integer. The name is dotted because bad things will happen if you use a number that's too small or too large for your computer. The initial value is 16,000 for most systems, but is smaller for 68000-based Macs. Making it larger will speed up computations (by reducing the number of garbage collections) at the cost of allocating more memory than necessary. ucblogo-6.1/helpfiles/dsetitem0000664000175000017500000000056413600031207014623 0ustar jjcjjc.SETITEM index array value command. Changes the "index"th member of "array" to be "value", like SETITEM, but without checking for circularity. WARNING: Primitives whose names start with a period are DANGEROUS. Their use by non-experts is not recommended. The use of .SETITEM can lead to circular arrays, which will get some Logo primitives into infinite loops. ucblogo-6.1/helpfiles/dsetfirst0000664000175000017500000000064413600031207015013 0ustar jjcjjc.SETFIRST list value command. Changes the first member of "list" to be "value". WARNING: Primitives whose names start with a period are DANGEROUS. Their use by non-experts is not recommended. The use of .SETFIRST can lead to circular list structures, which will get some Logo primitives into infinite loops, and to unexpected changes to other data structures that share storage with the list being modified. ucblogo-6.1/helpfiles/dsetbf0000664000175000017500000000074413600031207014254 0ustar jjcjjc.SETBF list value command. Changes the butfirst of "list" to be "value". WARNING: Primitives whose names start with a period are DANGEROUS. Their use by non-experts is not recommended. The use of .SETBF can lead to circular list structures, which will get some Logo primitives into infinite loops; unexpected changes to other data structures that share storage with the list being modified; or to Logo crashes and coredumps if the butfirst of a list is not itself a list. ucblogo-6.1/helpfiles/dribble0000664000175000017500000000057213600031207014407 0ustar jjcjjcDRIBBLE filename command. Creates a new file whose name is the input, like OPENWRITE, and begins recording in that file everything that is read from the keyboard or written to the terminal. That is, this writing is in addition to the writing to WRITER. The intent is to create a transcript of a Logo session, including things like prompt characters and interactions. ucblogo-6.1/helpfiles/dodwhile0000664000175000017500000000054113600031207014577 0ustar jjcjjcDO.WHILE instructionlist tfexpression (library procedure) command. Repeatedly evaluates the "instructionlist" as long as the evaluated "tfexpression" remains TRUE. Evaluates the first input first, so the "instructionlist" is always run at least once. The "tfexpression" must be an expressionlist whose value when evaluated is TRUE or FALSE. ucblogo-6.1/helpfiles/doduntil0000664000175000017500000000054213600031207014623 0ustar jjcjjcDO.UNTIL instructionlist tfexpression (library procedure) command. Repeatedly evaluates the "instructionlist" as long as the evaluated "tfexpression" remains FALSE. Evaluates the first input first, so the "instructionlist" is always run at least once. The "tfexpression" must be an expressionlist whose value when evaluated is TRUE or FALSE. ucblogo-6.1/helpfiles/dmaybeoutput0000664000175000017500000000137313600031207015526 0ustar jjcjjc.MAYBEOUTPUT value (special form) works like OUTPUT except that the expression that provides the input value might not, in fact, output a value, in which case the effect is like STOP. This is intended for use in control structure definitions, for cases in which you don't know whether or not some expression produces a value. Example: to invoke :function [:inputs] 2 .maybeoutput apply :function :inputs end ? (invoke "print "a "b "c) a b c ? print (invoke "word "a "b "c) abc This is an alternative to RUNRESULT. It's fast and easy to use, at the cost of being an exception to Logo's evaluation rules. (Ordinarily, it should be an error if the expression that's supposed to provide an input to something doesn't have a value.) ucblogo-6.1/helpfiles/dmacro0000664000175000017500000001106713600031207014252 0ustar jjcjjc.MACRO procname :input1 :input2 ... (special form) .DEFMACRO procname text A macro is a special kind of procedure whose output is evaluated as Logo instructions in the context of the macro's caller. .MACRO is exactly like TO except that the new procedure becomes a macro; .DEFMACRO is exactly like DEFINE with the same exception. Macros are useful for inventing new control structures comparable to REPEAT, IF, and so on. Such control structures can almost, but not quite, be duplicated by ordinary Logo procedures. For example, here is an ordinary procedure version of REPEAT: to my.repeat :num :instructions if :num=0 [stop] run :instructions my.repeat :num-1 :instructions end This version works fine for most purposes, e.g., my.repeat 5 [print "hello] But it doesn't work if the instructions to be carried out include OUTPUT, STOP, or LOCAL. For example, consider this procedure: to example print [Guess my secret word. You get three guesses.] repeat 3 [type "|?? | ~ if readword = "secret [pr "Right! stop]] print [Sorry, the word was "secret"!] end This procedure works as written, but if MY.REPEAT is used instead of REPEAT, it won't work because the STOP will stop MY.REPEAT instead of stopping EXAMPLE as desired. The solution is to make MY.REPEAT a macro. Instead of actually carrying out the computation, a macro must return a list containing Logo instructions. The contents of that list are evaluated as if they appeared in place of the call to the macro. Here's a macro version of REPEAT: .macro my.repeat :num :instructions if :num=0 [output []] output sentence :instructions ~ (list "my.repeat :num-1 :instructions) end Every macro is an operation -- it must always output something. Even in the base case, MY.REPEAT outputs an empty instruction list. To show how MY.REPEAT works, let's take the example my.repeat 5 [print "hello] For this example, MY.REPEAT will output the instruction list [print "hello my.repeat 4 [print "hello]] Logo then executes these instructions in place of the original invocation of MY.REPEAT; this prints "hello" once and invokes another repetition. The technique just shown, although fairly easy to understand, has the defect of slowness because each repetition has to construct an instruction list for evaluation. Another approach is to make MY.REPEAT a macro that works just like the non-macro version unless the instructions to be repeated include OUTPUT or STOP: .macro my.repeat :num :instructions catch "repeat.catchtag ~ [op repeat.done runresult [repeat1 :num :instructions]] op [] end to repeat1 :num :instructions if :num=0 [throw "repeat.catchtag] run :instructions .maybeoutput repeat1 :num-1 :instructions end to repeat.done :repeat.result if emptyp :repeat.result [op [stop]] op list "output quoted first :repeat.result end If the instructions do not include STOP or OUTPUT, then REPEAT1 will reach its base case and invoke THROW. As a result, MY.REPEAT's last instruction line will output an empty list, so the evaluation of the macro result by the caller will do nothing. But if a STOP or OUTPUT happens, then REPEAT.DONE will output a STOP or OUTPUT instruction that will be executed in the caller's context. The macro-defining commands have names starting with a dot because macros are an advanced feature of Logo; it's easy to get in trouble by defining a macro that doesn't terminate, or by failing to construct the instruction list properly. Lisp users should note that Logo macros are NOT special forms. That is, the inputs to the macro are evaluated normally, as they would be for any other Logo procedure. It's only the output from the macro that's handled unusually. Here's another example: .macro localmake :name :value output (list "local ~ word "" :name ~ "apply ~ ""make ~ (list :name :value)) end It's used this way: to try localmake "garply "hello print :garply end LOCALMAKE outputs the list [local "garply apply "make [garply hello]] The reason for the use of APPLY is to avoid having to decide whether or not the second input to MAKE requires a quotation mark before it. (In this case it would -- MAKE "GARPLY "HELLO -- but the quotation mark would be wrong if the value were a list.) It's often convenient to use the ` function to construct the instruction list: .macro localmake :name :value op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]] end On the other hand, ` is pretty slow, since it's tree recursive and written in Logo. ucblogo-6.1/helpfiles/difference0000664000175000017500000000040013600031207015064 0ustar jjcjjcDIFFERENCE num1 num2 num1 - num2 outputs the difference of its inputs. Minus sign means infix difference in ambiguous contexts (when preceded by a complete expression), unless it is preceded by a space and followed by a nonspace. (See also MINUS.) ucblogo-6.1/helpfiles/dequeue0000664000175000017500000000031213600031207014431 0ustar jjcjjcDEQUEUE queuename (library procedure) outputs the least recently QUEUEd member of the queue that is the value of the variable whose name is "queuename" and removes that member from the queue. ucblogo-6.1/helpfiles/deq0000664000175000017500000000063313600031207013553 0ustar jjcjjc.EQ thing1 thing2 outputs TRUE if its two inputs are the same datum, so that applying a mutator to one will change the other as well. Outputs FALSE otherwise, even if the inputs are equal in value. WARNING: Primitives whose names start with a period are DANGEROUS. Their use by non-experts is not recommended. The use of mutators can lead to circular data structures, infinite loops, or Logo crashes. ucblogo-6.1/helpfiles/definedp0000664000175000017500000000020213600031207014550 0ustar jjcjjcDEFINEDP name DEFINED? name outputs TRUE if the input is the name of a user-defined procedure, including a library procedure. ucblogo-6.1/helpfiles/define0000664000175000017500000000147613600031207014242 0ustar jjcjjcDEFINE procname text command. Defines a procedure with name "procname" and text "text". If there is already a procedure with the same name, the new definition replaces the old one. The text input must be a list whose members are lists. The first member is a list of inputs; it looks like a TO line but without the word TO, without the procedure name, and without the colons before input names. In other words, the members of this first sublist are words for the names of required inputs and lists for the names of optional or rest inputs. The remaining sublists of the text input make up the body of the procedure, with one sublist for each instruction line of the body. (There is no END line in the text input.) It is an error to redefine a primitive procedure unless the variable REDEFP has the value TRUE. ucblogo-6.1/helpfiles/decreasefont0000664000175000017500000000026413600031207015444 0ustar jjcjjcINCREASEFONT DECREASEFONT command (wxWidgets only). Increase or decrease the size of the font used in the text and edit windows to the next larger or smaller available size. ucblogo-6.1/helpfiles/ddefmacro0000664000175000017500000001106713600031207014731 0ustar jjcjjc.MACRO procname :input1 :input2 ... (special form) .DEFMACRO procname text A macro is a special kind of procedure whose output is evaluated as Logo instructions in the context of the macro's caller. .MACRO is exactly like TO except that the new procedure becomes a macro; .DEFMACRO is exactly like DEFINE with the same exception. Macros are useful for inventing new control structures comparable to REPEAT, IF, and so on. Such control structures can almost, but not quite, be duplicated by ordinary Logo procedures. For example, here is an ordinary procedure version of REPEAT: to my.repeat :num :instructions if :num=0 [stop] run :instructions my.repeat :num-1 :instructions end This version works fine for most purposes, e.g., my.repeat 5 [print "hello] But it doesn't work if the instructions to be carried out include OUTPUT, STOP, or LOCAL. For example, consider this procedure: to example print [Guess my secret word. You get three guesses.] repeat 3 [type "|?? | ~ if readword = "secret [pr "Right! stop]] print [Sorry, the word was "secret"!] end This procedure works as written, but if MY.REPEAT is used instead of REPEAT, it won't work because the STOP will stop MY.REPEAT instead of stopping EXAMPLE as desired. The solution is to make MY.REPEAT a macro. Instead of actually carrying out the computation, a macro must return a list containing Logo instructions. The contents of that list are evaluated as if they appeared in place of the call to the macro. Here's a macro version of REPEAT: .macro my.repeat :num :instructions if :num=0 [output []] output sentence :instructions ~ (list "my.repeat :num-1 :instructions) end Every macro is an operation -- it must always output something. Even in the base case, MY.REPEAT outputs an empty instruction list. To show how MY.REPEAT works, let's take the example my.repeat 5 [print "hello] For this example, MY.REPEAT will output the instruction list [print "hello my.repeat 4 [print "hello]] Logo then executes these instructions in place of the original invocation of MY.REPEAT; this prints "hello" once and invokes another repetition. The technique just shown, although fairly easy to understand, has the defect of slowness because each repetition has to construct an instruction list for evaluation. Another approach is to make MY.REPEAT a macro that works just like the non-macro version unless the instructions to be repeated include OUTPUT or STOP: .macro my.repeat :num :instructions catch "repeat.catchtag ~ [op repeat.done runresult [repeat1 :num :instructions]] op [] end to repeat1 :num :instructions if :num=0 [throw "repeat.catchtag] run :instructions .maybeoutput repeat1 :num-1 :instructions end to repeat.done :repeat.result if emptyp :repeat.result [op [stop]] op list "output quoted first :repeat.result end If the instructions do not include STOP or OUTPUT, then REPEAT1 will reach its base case and invoke THROW. As a result, MY.REPEAT's last instruction line will output an empty list, so the evaluation of the macro result by the caller will do nothing. But if a STOP or OUTPUT happens, then REPEAT.DONE will output a STOP or OUTPUT instruction that will be executed in the caller's context. The macro-defining commands have names starting with a dot because macros are an advanced feature of Logo; it's easy to get in trouble by defining a macro that doesn't terminate, or by failing to construct the instruction list properly. Lisp users should note that Logo macros are NOT special forms. That is, the inputs to the macro are evaluated normally, as they would be for any other Logo procedure. It's only the output from the macro that's handled unusually. Here's another example: .macro localmake :name :value output (list "local ~ word "" :name ~ "apply ~ ""make ~ (list :name :value)) end It's used this way: to try localmake "garply "hello print :garply end LOCALMAKE outputs the list [local "garply apply "make [garply hello]] The reason for the use of APPLY is to avoid having to decide whether or not the second input to MAKE requires a quotation mark before it. (In this case it would -- MAKE "GARPLY "HELLO -- but the quotation mark would be wrong if the value were a list.) It's often convenient to use the ` function to construct the instruction list: .macro localmake :name :value op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]] end On the other hand, ` is pretty slow, since it's tree recursive and written in Logo. ucblogo-6.1/helpfiles/cursor0000664000175000017500000000041713600031207014317 0ustar jjcjjcCURSOR outputs a list containing the current x and y coordinates of the text cursor. Logo may get confused about the current cursor position if, e.g., you type in a long line that wraps around or your program prints escape codes that affect the screen strangely. ucblogo-6.1/helpfiles/ct0000664000175000017500000000006213600031207013404 0ustar jjcjjcCLEARTEXT CT command. Clears the text window. ucblogo-6.1/helpfiles/cslsload0000664000175000017500000000026213600031207014604 0ustar jjcjjcCSLSLOAD name command. Loads the named file, like LOAD, but from the directory containing the Computer Science Logo Style programs instead of the current user's directory. ucblogo-6.1/helpfiles/cs0000664000175000017500000000020713600031207013404 0ustar jjcjjcCLEARSCREEN CS erases the graphics window and sends the turtle to its initial position and heading. Like HOME and CLEAN together. ucblogo-6.1/helpfiles/crossmap0000664000175000017500000000154313600031207014632 0ustar jjcjjcCROSSMAP template listlist (library procedure) (CROSSMAP template data1 data2 ...) outputs a list containing the results of template evaluations. Each data list contributes to a slot in the template; the number of slots is equal to the number of data list inputs. As a special case, if only one data list input is given, that list is taken as a list of data lists, and each of its members contributes values to a slot. CROSSMAP differs from MAP in that instead of taking members from the data inputs in parallel, it takes all possible combinations of members of data inputs, which need not be the same length. ? show (crossmap [word ?1 ?2] [a b c] [1 2 3 4]) [a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4] ? For compatibility with the version in the first edition of CSLS, CROSSMAP templates may use the notation :1 instead of ?1 to indicate slots. ucblogo-6.1/helpfiles/count0000664000175000017500000000041113600031207014124 0ustar jjcjjcCOUNT thing outputs the number of characters in the input, if the input is a word; outputs the number of members in the input, if it is a list or an array. (For an array, this may or may not be the index of the last member, depending on the array's origin.) ucblogo-6.1/helpfiles/cos0000664000175000017500000000011313600031207013557 0ustar jjcjjcCOS degrees outputs the cosine of its input, which is taken in degrees. ucblogo-6.1/helpfiles/copydef0000664000175000017500000000066213600031207014435 0ustar jjcjjcCOPYDEF newname oldname command. Makes "newname" a procedure identical to "oldname". The latter may be a primitive. If "newname" was already defined, its previous definition is lost. If "newname" was already a primitive, the redefinition is not permitted unless the variable REDEFP has the value TRUE. Note: dialects of Logo differ as to the order of inputs to COPYDEF. This dialect uses "MAKE order," not "NAME order." ucblogo-6.1/helpfiles/continue0000664000175000017500000000066013600031207014626 0ustar jjcjjcCONTINUE value CO value (CONTINUE) (CO) command. Ends the current interactive pause, returning to the context of the PAUSE invocation that began it. If CONTINUE is given an input, that value is used as the output from the PAUSE. If not, the PAUSE does not output. Exceptionally, the CONTINUE command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. ucblogo-6.1/helpfiles/contents0000664000175000017500000000033113600031207014632 0ustar jjcjjcCONTENTS outputs a "contents list," i.e., a list of three lists containing names of defined procedures, variables, and property lists respectively. This list includes all unburied named items in the workspace. ucblogo-6.1/helpfiles/cond0000664000175000017500000000202713600031207013724 0ustar jjcjjcCOND clauses (library procedure) command or operation. The input is a list of lists (clauses); each clause is a list whose first element is either an expression whose value is TRUE or FALSE, or the word ELSE, and whose butfirst is a Logo expression or instruction. COND examines the clauses in order. If a clause begins with the word ELSE (upper or lower case), then the butfirst of that clause is evaluated and CASE outputs its value, if any. Otherwise, the first element of the clause is evaluated; the resulting value must be TRUE or FALSE. If it's TRUE, then the butfirst of that clause is evaluated and COND outputs its value, if any. If the value is FALSE, then COND goes on to the next clause. If no clause is satisfied, COND does nothing. Example: to evens :numbers ; select even numbers from a list op cond [ [[emptyp :numbers] []] [[evenp first :numbers] ; assuming EVENP is defined fput first :numbers evens butfirst :numbers] [else evens butfirst :numbers] ] end ucblogo-6.1/helpfiles/commandline0000664000175000017500000000016313600031207015266 0ustar jjcjjcCOMMANDLINE (variable) contains any text appearing after a hyphen on the command line used to start Logo. ucblogo-6.1/helpfiles/combine0000664000175000017500000000022513600031207014413 0ustar jjcjjcCOMBINE thing1 thing2 (library procedure) if thing2 is a word, outputs WORD thing1 thing2. If thing2 is a list, outputs FPUT thing1 thing2. ucblogo-6.1/helpfiles/co0000664000175000017500000000066013600031207013403 0ustar jjcjjcCONTINUE value CO value (CONTINUE) (CO) command. Ends the current interactive pause, returning to the context of the PAUSE invocation that began it. If CONTINUE is given an input, that value is used as the output from the PAUSE. If not, the PAUSE does not output. Exceptionally, the CONTINUE command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. ucblogo-6.1/helpfiles/closeall0000664000175000017500000000015613600031207014600 0ustar jjcjjcCLOSEALL (library procedure) command. Closes all open files. Abbreviates FOREACH ALLOPEN [CLOSE ?] ucblogo-6.1/helpfiles/close0000664000175000017500000000032513600031207014105 0ustar jjcjjcCLOSE filename command. Closes the named file. If the file was currently the reader or writer, then the reader or writer is changed to the keyboard or screen, as if SETREAD [] or SETWRITE [] had been done. ucblogo-6.1/helpfiles/clickpos0000664000175000017500000000031713600031207014610 0ustar jjcjjcCLICKPOS outputs the coordinates that the mouse was at when a mouse button was most recently pushed, provided that that position was within the graphics window, in turtle coordinates. (wxWidgets only) ucblogo-6.1/helpfiles/cleartext0000664000175000017500000000006213600031207014771 0ustar jjcjjcCLEARTEXT CT command. Clears the text window. ucblogo-6.1/helpfiles/clearscreen0000664000175000017500000000020713600031207015265 0ustar jjcjjcCLEARSCREEN CS erases the graphics window and sends the turtle to its initial position and heading. Like HOME and CLEAN together. ucblogo-6.1/helpfiles/clean0000664000175000017500000000022513600031207014061 0ustar jjcjjcCLEAN erases all lines that the turtle has drawn on the graphics window. The turtle's state (position, heading, pen mode, etc.) is not changed. ucblogo-6.1/helpfiles/char0000664000175000017500000000017313600031207013716 0ustar jjcjjcCHAR int outputs the character represented in the ASCII code by the input, which must be an integer between 0 and 255. ucblogo-6.1/helpfiles/catch0000664000175000017500000000172013600031207014062 0ustar jjcjjcCATCH tag instructionlist command or operation. Runs its second input. Outputs if that instructionlist outputs. If, while running the instructionlist, a THROW instruction is executed with a tag equal to the first input (case-insensitive comparison), then the running of the instructionlist is terminated immediately. In this case the CATCH outputs if a value input is given to THROW. The tag must be a word. If the tag is the word ERROR, then any error condition that arises during the running of the instructionlist has the effect of THROW "ERROR instead of printing an error message and returning to toplevel. The CATCH does not output if an error is caught. Also, during the running of the instructionlist, the variable ERRACT is temporarily unbound. (If there is an error while ERRACT has a value, that value is taken as an instructionlist to be run after printing the error message. Typically the value of ERRACT, if any, is the list [PAUSE].) ucblogo-6.1/helpfiles/caseignoredp0000664000175000017500000000032213600031207015440 0ustar jjcjjcCASEIGNOREDP (variable) if TRUE, indicates that lower case and upper case letters should be considered equal by EQUALP, BEFOREP, MEMBERP, etc. Logo initially makes this variable TRUE, and buries it. ucblogo-6.1/helpfiles/case0000664000175000017500000000147213600031207013717 0ustar jjcjjcCASE value clauses (library procedure) command or operation. The second input is a list of lists (clauses); each clause is a list whose first element is either a list of values or the word ELSE and whose butfirst is a Logo expression or instruction. CASE examines the clauses in order. If a clause begins with the word ELSE (upper or lower case), then the butfirst of that clause is evaluated and CASE outputs its value, if any. If the first input to CASE is a member of the first element of a clause, then the butfirst of that clause is evaluated and CASE outputs its value, if any. If neither of these conditions is met, then CASE goes on to the next clause. If no clause is satisfied, CASE does nothing. Example: to vowelp :letter output case :letter [ [[a e i o u] "true] [else "false] ] end ucblogo-6.1/helpfiles/cascade0000664000175000017500000000512213600031207014363 0ustar jjcjjcCASCADE endtest template startvalue (library procedure) (CASCADE endtest tmp1 sv1 tmp2 sv2 ...) (CASCADE endtest tmp1 sv1 tmp2 sv2 ... finaltemplate) outputs the result of applying a template (or several templates, as explained below) repeatedly, with a given value filling the slot the first time, and the result of each application filling the slot for the following application. In the simplest case, CASCADE has three inputs. The second input is a one-slot expression template. That template is evaluated some number of times (perhaps zero). On the first evaluation, the slot is filled with the third input; on subsequent evaluations, the slot is filled with the result of the previous evaluation. The number of evaluations is determined by the first input. This can be either a nonnegative integer, in which case the template is evaluated that many times, or a predicate expression template, in which case it is evaluated (with the same slot filler that will be used for the evaluation of the second input) repeatedly, and the CASCADE evaluation continues as long as the predicate value is FALSE. (In other words, the predicate template indicates the condition for stopping.) If the template is evaluated zero times, the output from CASCADE is the third (startvalue) input. Otherwise, the output is the value produced by the last template evaluation. CASCADE templates may include the symbol # to represent the number of times the template has been evaluated. This slot is filled with 1 for the first evaluation, 2 for the second, and so on. ? show cascade 5 [lput # ?] [] [1 2 3 4 5] ? show cascade [vowelp first ?] [bf ?] "spring ing ? show cascade 5 [# * ?] 1 120 ? Several cascaded results can be computed in parallel by providing additional template-startvalue pairs as inputs to CASCADE. In this case, all templates (including the endtest template, if used) are multi-slot, with the number of slots equal to the number of pairs of inputs. In each round of evaluations, ?2, for example, represents the result of evaluating the second template in the previous round. If the total number of inputs (including the first endtest input) is odd, then the output from CASCADE is the final value of the first template. If the total number of inputs is even, then the last input is a template that is evaluated once, after the end test is satisfied, to determine the output from CASCADE. to fibonacci :n output (cascade :n [?1 + ?2] 1 [?1] 0) end to piglatin :word output (cascade [vowelp first ?] ~ [word bf ? first ?] ~ :word ~ [word ? "ay]) end ucblogo-6.1/helpfiles/bye0000664000175000017500000000010313600031207013551 0ustar jjcjjcBYE command. Exits from Logo; returns to the operating system. ucblogo-6.1/helpfiles/buttonp0000664000175000017500000000035613600031207014477 0ustar jjcjjcBUTTONP BUTTON? outputs TRUE if a mouse button is down and the mouse is over the graphics window. Once the button is down, BUTTONP remains true until the button is released, even if the mouse is dragged out of the graphics window. ucblogo-6.1/helpfiles/buttonact0000664000175000017500000000150213600031207015001 0ustar jjcjjcBUTTONACT (variable) if nonempty, should be an instruction list that will be evaluated whenever a mouse button is pressed. Note that the user may have released the button before the instructions are evaluated. BUTTON will still output which button was most recently pressed. CLICKPOS will output the position of the mouse cursor at the moment the button was pressed; this may be different from MOUSEPOS if the user moves the mouse after clicking. Note that it's possible for the user to press a button during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting BUTTONACT to the empty list. One easy way to do that is the following: make "buttonact [button.action] to button.action [:buttonact []] ... ; whatever you want the button to do end ucblogo-6.1/helpfiles/button0000664000175000017500000000050113600031207014307 0ustar jjcjjcBUTTON outputs 0 if no mouse button has been pushed inside the Logo window since the last call to BUTTON. Otherwise, it outputs an integer between 1 and 3 indicating which button was most recently pressed. Ordinarily 1 means left, 2 means right, and 3 means center, but operating systems may reconfigure these. ucblogo-6.1/helpfiles/butlast0000664000175000017500000000033213600031207014454 0ustar jjcjjcBUTLAST wordorlist BL wordorlist if the input is a word, outputs a word containing all but the last character of the input. If the input is a list, outputs a list containing all but the last member of the input. ucblogo-6.1/helpfiles/butfirsts0000664000175000017500000000065713600031207015035 0ustar jjcjjcBUTFIRSTS list BFS list outputs a list containing the BUTFIRST of each member of the input list. It is an error if any member of the input list is empty or an array. (The input itself may be empty, in which case the output is also empty.) This could be written as to butfirsts :list output map "butfirst :list end but is provided as a primitive in order to speed up the iteration tools MAP, MAP.SE, and FOREACH. ucblogo-6.1/helpfiles/butfirst0000664000175000017500000000033513600031207014643 0ustar jjcjjcBUTFIRST wordorlist BF wordorlist if the input is a word, outputs a word containing all but the first character of the input. If the input is a list, outputs a list containing all but the first member of the input. ucblogo-6.1/helpfiles/buryname0000664000175000017500000000016413600031207014623 0ustar jjcjjcBURYNAME varname (library procedure) BURYNAME varnamelist command. Abbreviates BURY NAMELIST varname(list). ucblogo-6.1/helpfiles/buryall0000664000175000017500000000011213600031207014444 0ustar jjcjjcBURYALL (library procedure) command. Abbreviates BURY CONTENTS. ucblogo-6.1/helpfiles/bury0000664000175000017500000000050713600031207013763 0ustar jjcjjcBURY contentslist command. Buries the procedures, variables, and property lists named in the input. A buried item is not included in the lists output by CONTENTS, PROCEDURES, VARIABLES, and PLISTS, but is included in the list output by BURIED. By implication, buried things are not printed by POALL or saved by SAVE. ucblogo-6.1/helpfiles/buriedp0000664000175000017500000000057613600031207014442 0ustar jjcjjcBURIEDP contentslist BURIED? contentslist outputs TRUE if the first procedure, variable, or property list named in the contents list is buried, FALSE if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can BURIEDP [[] [VARIABLE]] or BURIEDP [[] [] [PROPLIST]]. ucblogo-6.1/helpfiles/buried0000664000175000017500000000012613600031207014251 0ustar jjcjjcBURIED outputs a contents list including all buried named items in the workspace. ucblogo-6.1/helpfiles/bl0000664000175000017500000000033213600031207013373 0ustar jjcjjcBUTLAST wordorlist BL wordorlist if the input is a word, outputs a word containing all but the last character of the input. If the input is a list, outputs a list containing all but the last member of the input. ucblogo-6.1/helpfiles/bk0000664000175000017500000000026513600031207013377 0ustar jjcjjcBACK dist BK dist moves the turtle backward, i.e., exactly opposite to the direction that it's facing, by the specified distance. (The heading of the turtle does not change.) ucblogo-6.1/helpfiles/bitxor0000664000175000017500000000017113600031207014306 0ustar jjcjjcBITXOR num1 num2 (BITXOR num1 num2 num3 ...) outputs the bitwise EXCLUSIVE OR of its inputs, which must be integers. ucblogo-6.1/helpfiles/bitor0000664000175000017500000000015413600031207014117 0ustar jjcjjcBITOR num1 num2 (BITOR num1 num2 num3 ...) outputs the bitwise OR of its inputs, which must be integers. ucblogo-6.1/helpfiles/bitnot0000664000175000017500000000011613600031207014275 0ustar jjcjjcBITNOT num outputs the bitwise NOT of its input, which must be an integer. ucblogo-6.1/helpfiles/bitand0000664000175000017500000000015713600031207014244 0ustar jjcjjcBITAND num1 num2 (BITAND num1 num2 num3 ...) outputs the bitwise AND of its inputs, which must be integers. ucblogo-6.1/helpfiles/bg0000664000175000017500000000022013600031207013362 0ustar jjcjjcBACKGROUND BG outputs the graphics background color, either as a slot number or as an RGB list, whichever way it was set. (See PENCOLOR.) ucblogo-6.1/helpfiles/bfs0000664000175000017500000000065713600031207013562 0ustar jjcjjcBUTFIRSTS list BFS list outputs a list containing the BUTFIRST of each member of the input list. It is an error if any member of the input list is empty or an array. (The input itself may be empty, in which case the output is also empty.) This could be written as to butfirsts :list output map "butfirst :list end but is provided as a primitive in order to speed up the iteration tools MAP, MAP.SE, and FOREACH. ucblogo-6.1/helpfiles/bf0000664000175000017500000000033513600031207013370 0ustar jjcjjcBUTFIRST wordorlist BF wordorlist if the input is a word, outputs a word containing all but the first character of the input. If the input is a list, outputs a list containing all but the first member of the input. ucblogo-6.1/helpfiles/beforep0000664000175000017500000000056413600031207014427 0ustar jjcjjcBEFOREP word1 word2 BEFORE? word1 word2 outputs TRUE if word1 comes before word2 in ASCII collating sequence (for words of letters, in alphabetical order). Case-sensitivity is determined by the value of CASEIGNOREDP. Note that if the inputs are numbers, the result may not be the same as with LESSP; for example, BEFOREP 3 12 is false because 3 collates after 1. ucblogo-6.1/helpfiles/backslashedp0000664000175000017500000000113113600031207015420 0ustar jjcjjcVBARREDP char VBARRED? char BACKSLASHED? char (library procedure) outputs TRUE if the input character was originally entered into Logo within vertical bars (|) to prevent its usual special syntactic meaning, FALSE otherwise. (Outputs TRUE only if the character is a backslashed space, tab, newline, or one of ()[]+-*/=<>":;\~?| ) The names BACKSLASHEDP and BACKSLASHED? are included in the Logo library for backward compatibility with the former names of this primitive, although it does *not* output TRUE for characters originally entered with backslashes. ucblogo-6.1/helpfiles/background0000664000175000017500000000022013600031207015111 0ustar jjcjjcBACKGROUND BG outputs the graphics background color, either as a slot number or as an RGB list, whichever way it was set. (See PENCOLOR.) ucblogo-6.1/helpfiles/back0000664000175000017500000000026513600031207013703 0ustar jjcjjcBACK dist BK dist moves the turtle backward, i.e., exactly opposite to the direction that it's facing, by the specified distance. (The heading of the turtle does not change.) ucblogo-6.1/helpfiles/ashift0000664000175000017500000000026613600031207014262 0ustar jjcjjcASHIFT num1 num2 outputs "num1" arithmetic-shifted to the left by "num2" bits. If num2 is negative, the shift is to the right with sign extension. The inputs must be integers. ucblogo-6.1/helpfiles/ascii0000664000175000017500000000045313600031207014072 0ustar jjcjjcASCII char outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing vbarred punctuation, and returns the character code for the corresponding punctuation character without vertical bars. (Compare RAWASCII.) ucblogo-6.1/helpfiles/arraytolist0000664000175000017500000000027313600031207015357 0ustar jjcjjcARRAYTOLIST array outputs a list whose members are the members of the input array. The first member of the output is the first member of the array, regardless of the array's origin. ucblogo-6.1/helpfiles/arrayp0000664000175000017500000000012513600031207014274 0ustar jjcjjcARRAYP thing ARRAY? thing outputs TRUE if the input is an array, FALSE otherwise. ucblogo-6.1/helpfiles/array0000664000175000017500000000106413600031207014117 0ustar jjcjjcARRAY size (ARRAY size origin) outputs an array of "size" members (must be a positive integer), each of which initially is an empty list. Array members can be selected with ITEM and changed with SETITEM. The first member of the array is member number 1 unless an "origin" input (must be an integer) is given, in which case the first member of the array has that number as its index. (Typically 0 is used as the origin if anything.) Arrays are printed by PRINT and friends, and can be typed in, inside curly braces; indicate an origin with {a b c}@0. ucblogo-6.1/helpfiles/arity0000664000175000017500000000040713600031207014131 0ustar jjcjjcARITY procedurename outputs a list of three numbers: the minimum, default, and maximum number of inputs for the procedure whose name is the input. It is an error if there is no such procedure. A maximum of -1 means that the number of inputs is unlimited. ucblogo-6.1/helpfiles/arctan0000664000175000017500000000031013600031207014242 0ustar jjcjjcARCTAN num (ARCTAN x y) outputs the arctangent, in degrees, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or 90 or -90 depending on the sign of y, if x is zero. ucblogo-6.1/helpfiles/arc0000664000175000017500000000033313600031207013544 0ustar jjcjjcARC angle radius draws an arc of a circle, with the turtle at the center, with the specified radius, starting at the turtle's heading and extending clockwise through the specified angle. The turtle does not move. ucblogo-6.1/helpfiles/apply0000664000175000017500000000054313600031207014127 0ustar jjcjjcAPPLY template inputlist command or operation. Runs the "template," filling its slots with the members of "inputlist." The number of members in "inputlist" must be an acceptable number of slots for "template." It is illegal to apply the primitive TO as a template, but anything else is okay. APPLY outputs what "template" outputs, if anything. ucblogo-6.1/helpfiles/and0000664000175000017500000000117413600031207013545 0ustar jjcjjcAND tf1 tf2 (AND tf1 tf2 tf3 ...) outputs TRUE if all inputs are TRUE, otherwise FALSE. All inputs must be TRUE or FALSE. (Comparison is case-insensitive regardless of the value of CASEIGNOREDP. That is, "true" or "True" or "TRUE" are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a TRUE or FALSE value. List expressions are evaluated from left to right; as soon as a FALSE value is found, the remaining inputs are not examined. Example: MAKE "RESULT AND [NOT (:X = 0)] [(1 / :X) > .5] to avoid the division by zero if the first part is false. ucblogo-6.1/helpfiles/allowgetset0000664000175000017500000000043713600031207015336 0ustar jjcjjcALLOWGETSET (variable) if TRUE, indicates that an attempt to use a procedure that doesn't exist should be taken as an implicit getter or setter procedure (setter if the first three letters of the name are SET) for a variable of the same name (without the SET if appropriate). ucblogo-6.1/helpfiles/allopen0000664000175000017500000000021113600031207014424 0ustar jjcjjcALLOPEN outputs a list whose members are the names of all files currently open. This list does not include the dribble file, if any. ucblogo-6.1/helpfiles/`0000664000175000017500000000244513600031207013224 0ustar jjcjjc` list (library procedure) outputs a list equal to its input but with certain substitutions. If a member of the input list is the word "," (comma) then the following member should be an instructionlist that produces an output when run. That output value replaces the comma and the instructionlist. If a member of the input list is the word ",@" (comma atsign) then the following member should be an instructionlist that outputs a list when run. The members of that list replace the ,@ and the instructionlist. Example: show `[foo baz ,[bf [a b c]] garply ,@[bf [a b c]]] will print [foo baz [b c] garply b c] A word starting with , or ,@ is treated as if the rest of the word were a one-word list, e.g., ,:FOO is equivalent to ,[:FOO]. A word starting with ", (quote comma) or :, (colon comma) becomes a word starting with " or : but with the result of running the substitution (or its first word, if the result is a list) replacing what comes after the comma. Backquotes can be nested. Substitution is done only for commas at the same depth as the backquote in which they are found: ? show `[a `[b ,[1+2] ,[foo ,[1+3] d] e] f] [a ` [b , [1+2] , [foo 4 d] e] f] ?make "name1 "x ?make "name2 "y ? show `[a `[b ,:,:name1 ,",:name2 d] e] [a ` [b , [:x] , ["y] d] e] ucblogo-6.1/helpfiles/ALL_NAMES0000664000175000017500000000575113600031207014343 0ustar jjcjjcword list sentence se fput lput array mdarray listtoarray arraytolist combine reverse gensym first firsts last butfirst bf butfirsts bfs butlast bl item mditem pick remove remdup quoted setitem mdsetitem .setfirst .setbf .setitem push pop queue dequeue wordp word? listp list? arrayp array? emptyp empty? equalp equal? notequalp notequal? beforep before? .eq memberp member? substringp substring? numberp number? vbarredp vbarred? vbarredp count ascii rawascii char member lowercase uppercase standout parse runparse print pr type show readlist rl readword rw readrawline readchar rc readchars rcs shell setprefix prefix openread openwrite openappend openupdate close allopen closeall erasefile erf dribble nodribble setread setwrite reader writer setreadpos setwritepos readpos writepos eofp eof? filep file? keyp key? cleartext ct setcursor cursor setmargins settextcolor settc increasefont decreasefont settextsize textsize setfont font sum difference minus product quotient remainder modulo int round sqrt power exp log10 ln sin radsin cos radcos arctan radarctan iseq rseq lessp less? greaterp greater? lessequalp lessequal? greaterequalp greaterequal? random rerandom form bitand bitor bitxor bitnot ashift lshift and or not forward fd back bk left lt right rt setpos setxy setx sety setheading seth home arc pos xcor ycor heading towards scrunch showturtle st hideturtle ht clean clearscreen cs wrap window fence fill filled label setlabelheight textscreen ts fullscreen fs splitscreen ss setscrunch refresh norefresh shownp shown? screenmode turtlemode labelsize pendown pd penup pu penpaint ppt penerase pe penreverse px setpencolor setpc setpalette setpensize setpenpattern setpen setbackground setbg pendownp pendown? penmode pencolor pc palette pensize penpattern pen background bg savepict loadpict epspict mousepos clickpos buttonp button? button to define text fulltext copydef make name local localmake thing global pprop gprop remprop plist procedurep procedure? primitivep primitive? definedp defined? namep name? plistp plist? contents buried traced stepped procedures primitives names plists namelist pllist arity nodes printout po poall pops pons popls pon popl pot pots erase er erall erps erns erpls ern erpl bury buryall buryname unbury unburyall unburyname buriedp buried? trace untrace tracedp traced? step unstep steppedp stepped? edit ed editfile edall edps edns edpls edn edpl save savel load cslsload help seteditor setlibloc sethelploc setcslsloc settemploc gc .setsegmentsize run runresult repeat forever repcount if ifelse test iftrue ift iffalse iff stop output op catch throw error pause continue co wait bye .maybeoutput goto tag ignore ` for do.while while do.until until case cond apply invoke foreach map map.se filter find reduce crossmap cascade transfer .macro .defmacro macrop macro? macroexpand allowgetset buttonact caseignoredp commandline erract fullprintp keyact loadnoisily printdepthlimit printwidthlimit redefp startup unburyonedit usealternatenames logoversion logoplatform + - * / = < > <= >= <> ucblogo-6.1/docs/0000775000175000017500000000000013601427074012046 5ustar jjcjjcucblogo-6.1/docs/ucblogo.info0000664000175000017500000075623013601426472014373 0ustar jjcjjcThis is ucblogo.info, produced by makeinfo version 6.6 from usermanual.texi.  File: ucblogo.info, Node: Top, Next: INTRODUCTION, Prev: (dir), Up: (dir) This is a TeXinfo version of Berkeley Logo User Manual Original written by: Brian Harvey * Menu: * INTRODUCTION:: * DATA STRUCTURE PRIMITIVES:: * COMMUNICATION:: * ARITHMETIC:: * LOGICAL OPERATIONS:: * GRAPHICS:: * WORKSPACE MANAGEMENT:: * CONTROL STRUCTURES:: * MACROS:: * ERROR PROCESSING:: * SPECIAL VARIABLES:: * INTERNATIONALIZATION:: * INDEX::  File: ucblogo.info, Node: INTRODUCTION, Next: DATA STRUCTURE PRIMITIVES, Prev: Top, Up: Top 1 Introduction ************** * Menu: * OVERVIEW:: * GETTER/SETTER VARIBLE SYNTAX:: * ENTERING AND LEAVING LOGO:: * TOKENIZATION::  File: ucblogo.info, Node: OVERVIEW, Next: GETTER/SETTER VARIBLE SYNTAX, Prev: INTRODUCTION, Up: INTRODUCTION 1.1 Overview ============ Copyright (C) 1993 by the Regents of the University of California This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . This is a program that is still being written. Many things are missing, including adequate documentation. This manual assumes that you already know how to program in Logo, and merely presents the details of this new implementation. Read 'Computer Science Logo Style, Volume 1: Symbolic Computing' by Brian Harvey (MIT Press, 1997) for a tutorial on Logo programming with emphasis on symbolic computation. Here are the special features of this dialect of Logo: Source file compatible among Unix, DOS, Windows, and Mac platforms. Random-access arrays. Variable number of inputs to user-defined procedures. Mutators for list structure (dangerous). Pause on error, and other improvements to error handling. Comments and continuation lines; formatting is preserved when procedure definitions are saved or edited. Terrapin-style tokenization (e.g., [2+3] is a list with one member) but LCSI-style syntax (no special forms except TO). The best of both worlds. First-class instruction and expression templates (see APPLY). Macros. Features *not* found in Berkeley Logo include robotics, music, animation, parallelism, and multimedia. For those, buy a commercial version.  File: ucblogo.info, Node: GETTER/SETTER VARIBLE SYNTAX, Next: ENTERING AND LEAVING LOGO, Prev: OVERVIEW, Up: INTRODUCTION 1.2 Getter/Setter Variable Syntax ================================= Logo distinguishes PROCEDURES from VARIABLES. A procedure is a set of instructions to carry out some computation; a variable is a named container that holds a data value such as a number, word, list, or array. In traditional Logo syntax, a non-numeric word typed without punctuation represents a request to invoke the procedure named by that word. A word typed with a preceding quotation mark represents the word itself. For example, in the instruction PRINT FIRST "WORD the procedures named 'FIRST' and 'PRINT' are invoked, but the procedure named WORD is not invoked; the word W-O-R-D is the input to FIRST. What about variables? There are two things one can do with a variable: give it a value, and find out its value. To give a variable a value, Logo provides the primitive procedure 'MAKE', which requires two inputs: the name of the variable and the new value to be assigned. The first input, the name of the variable, is just a word, and if (as is almost always the case) the programmer wants to assign a value to a specific variable whose name is known in advance, that input is quoted, just as any known specific word would be: MAKE "MY.VAR FIRST "WORD gives the variable named 'MY.VAR' the value 'W' (the first letter of 'WORD'). To find the value of a variable, Logo provides the primitive procedure 'THING', which takes a variable name as its input, and outputs the value of the accessible variable with that name. Thus PRINT THING "MY.VAR will print 'W' (supposing the 'MAKE' above has been done). Since finding the value of a specific, known variable name is such a common operation, Logo also provides an abbreviated notation that combines 'THING' with quote: PRINT :MY.VAR The colon (which Logo old-timers pronounce "dots") replaces 'THING' and '"' in the earlier version of the instruction. Newcomers to Logo often complain about the need for all this punctuation. In particular, Logo programmers who learned about dots and quotes without also learning about 'THING' wonder why an instruction such as MAKE "NEW.VAR :OLD.VAR uses two different punctuation marks to identify the two variables. (Having read the paragraphs above, you will understand that actually both variable names are quoted, but the procedure 'THING' is invoked to find the value of 'OLD.VAR', since it's that value, not 'OLD.VAR''s name, that 'MAKE' needs to know. It wouldn't make sense to ask for 'THING' of 'NEW.VAR', since we haven't given 'NEW.VAR' a value yet.) Although Logo's punctuation rules make sense once understood, they do form a barrier to entry for the Logo beginner. Why, then, couldn't Logo be designed so that an unpunctuated word would represent a procedure if there is a procedure by that name, or a variable if there is a variable by that name? Then we could say PRINT MY.VAR and Logo would realize that 'MY.VAR' is the name of a variable, not of a procedure. The traditional reason not to use this convention is that Logo allows the same word to name a procedure and a variable at the same time. This is most often important for words that name data types, as in the following procedure: TO PLURAL :WORD OUTPUT WORD :WORD "S END Here the name 'WORD' is a natural choice for the input to 'PLURAL', since it describes the kind of input that 'PLURAL' expects. Within the procedure, we use 'WORD' to represent Logo's primitive procedure that combines two input words to form a new, longer word; we use ':WORD' to represent the variable containing the input, whatever actual word is given when 'PLURAL' is invoked. ? PRINT PLURAL "COMPUTER COMPUTERS However, if a Logo instruction includes an unquoted word that is *not* the name of a procedure, Logo could look for a variable of that name instead. This would allow a "punctuationless" Logo, *provided that users who want to work without colons for variables choose variable names that are not also procedure names.* What about assigning a value to a variable? Could we do without the quotation mark on 'MAKE''s first input? Alas, no. Although the first input to 'MAKE' is *usually* a constant, known variable name, sometimes it isn't, as in this example: TO INCREMENT :VAR MAKE :VAR (THING :VAR)+1 ; Note: it's not "VAR here! END ? MAKE "X 5 ? INCREMENT "X ? PRINT :X 6 The procedure 'INCREMENT' takes a variable name as its input and changes the value of that variable. In this example there are two variables; the variable whose name is 'VAR', and whose value is the word 'X'; and the variable whose name is 'X' and whose value changes from 5 to 6. Suppose we changed the behavior of 'MAKE' so that it took the word after 'MAKE' as the name of the variable to change; we would be unable to write 'INCREMENT': TO INCREMENT :VAR ; nonworking! MAKE VAR (THING VAR)+1 END This would assign a new value to 'VAR', not to 'X'. What we can do is to allow an *alternative* to 'MAKE', a "setter" procedure for a particular variable. The notation will be ? SETFOO 7 ? PRINT FOO 7 'SETFOO' is a "setter procedure" that takes one input (in this case the input 7) and assigns its value to the variable named 'FOO'. Berkeley Logo allows users to choose either the traditional notation, in which case the same name can be used both for a procedure and for a variable, or the getter/setter notation, in which variable 'FOO' is set with 'SETFOO' and examined with 'FOO', but the same name can't be used for procedure and variable. Here is how this choice is allowed: Berkeley Logo uses traditional notation, with procedures distinct from variables. However, if there is a variable named 'AllowGetSet' whose value is TRUE (which there is, by default, when Logo starts up), then if a Logo instruction refers to a *nonexistent* procedure (so that the error message "I don't know how to ..." would result), Logo tries the following two steps: 1. If the name is at least four characters long, and the first three characters are the letters 'SET' (upper or lower case), and if the name is followed in the instruction by another value, and if the name without the 'SET' is the name of a variable that already exists, then Logo will invoke 'MAKE' with its first input being the name without the 'SET', and its second input being the following value. 2. If step 1's conditions are not met, but the name is the name of an accessible variable, then Logo will invoke 'THING' with that name as input, to find the variable's value. Step 1 requires that the variable already exist so that misspellings of names of 'SETxxx' primitives (e.g., 'SETHEADING') will still be caught, instead of silently creating a new variable. The command 'GLOBAL' can be used to create a variable without giving it a value. One final point: The 'TO' command in Logo has always been a special case; the rest of the line starting with 'TO' is not evaluated as ordinary Logo expressions are. In particular, the colons used to mark the names of inputs to the procedure do not cause 'THING' to be invoked. They are merely mnemonic aids, reminding the Logo user that these words are names of variables. (Arguably, this nonstantard behavior of 'TO' adds to Logo beginners' confusion about colons.) To a programmer using colonless variable references, the colons in the 'TO' line are unnecessary and meaningless. Berkeley Logo therefore makes the colons optional: TO FOO :IN1 :IN2 and TO FOO IN1 IN2 are both allowed.  File: ucblogo.info, Node: ENTERING AND LEAVING LOGO, Next: TOKENIZATION, Prev: GETTER/SETTER VARIBLE SYNTAX, Up: INTRODUCTION 1.3 Entering and Leaving Logo ============================= The process to start Logo depends on your operating system: Unix: Type the word logo to the shell. (The directory in which you've installed Logo must be in your path.) DOS: Change directories to the one containing Logo (probably 'C:\UCBLOGO'). Then type UCBLOGO for the large memory version, or BL for the 640K version. Mac: Double-click on the 'LOGO' icon within the "UCB Logo" folder. Windows: Double-click on the 'UCBWLOGO' icon in the 'UCBLOGO' folder. To leave Logo, enter the command 'bye'. On startup, Logo looks for a file named 'startup.lg' in the system Logo library and, if found, loads it. Then it looks for 'startup.lg' in the user's home directory, or the current directory, depending on the operating system, and loads that. These startup files can be used to predefine procedures, e.g., to provide non-English names for primitive procedures. Under Unix, DOS, or Windows, if you include one or more filenames on the command line when starting Logo, those files will be loaded before the interpreter starts reading commands from your terminal. If you load a file that executes some program that includes a 'bye' command, Logo will run that program and exit. You can therefore write standalone programs in Logo and run them with shell/batch scripts. To support this technique, Logo does not print its usual welcoming and parting messages if you give file arguments to the logo command. If a command line argument is just a hyphen, then all command line arguments after the hyphen are not taken as filenames, but are instead collected in a list, one word per argument; the buried variable 'COMMAND.LINE' contains that list of arguments, or the empty list if there are none. On my Linux system, if the first line of an executable shell script is #!/usr/local/bin/logo - (note the hyphen) then the script can be given command line arguments and they all end up in ':COMMAND.LINE' along with the script's path. Experiment. If you type your interrupt character (see table below) Logo will stop what it's doing and return to top-level, as if you did THROW "TOPLEVEL. If you type your quit character Logo will pause as if you did 'PAUSE'. wxWidgets Unix DOS/Windows Mac Classic toplevel alt-S usually ctrl-C ctrl-Q command-. (period) pause alt-P usually ctrl-\ ctrl-W command-, (comma) If you have an environment variable called 'LOGOLIB' whose value is the name of a directory, then Logo will use that directory instead of the default library. If you invoke a procedure that has not been defined, Logo first looks for a file in the current directory named 'PROC.lg' where PROC is the procedure name in lower case letters. If such a file exists, Logo loads that file. If the missing procedure is still undefined, or if there is no such file, Logo then looks in the library directory for a file named 'PROC' (no '.lg') and, if it exists, loads it. If neither file contains a definition for the procedure, then Logo signals an error. Several procedures that are primitive in most versions of Logo are included in the default library, so if you use a different library you may want to include some or all of the default library in it.  File: ucblogo.info, Node: TOKENIZATION, Prev: ENTERING AND LEAVING LOGO, Up: INTRODUCTION 1.4 Tokenization ================ Names of procedures, variables, and property lists are case-insensitive. So are the special words 'END', 'TRUE', and 'FALSE'. Case of letters is preserved in everything you type, however. Within square brackets, words are delimited only by spaces and square brackets. '[2+3]' is a list containing one word. Note, however, that the Logo primitives that interpret such a list as a Logo instruction or expression ('RUN', 'IF', etc.) reparse the list as if it had not been typed inside brackets. After a quotation mark outside square brackets, a word is delimited by a space, a square bracket, or a parenthesis. A word not after a quotation mark or inside square brackets is delimited by a space, a bracket, a parenthesis, or an infix operator '+-*/=<>'. Note that words following colons are in this category. Note that quote and colon are not delimiters. Each infix operator character is a word in itself, except that the two-character sequences '<=', '>=', and '<>' (the latter meaning not-equal) with no intervening space are recognized as a single word. A word consisting of a question mark followed by a number (e.g., '?37'), when runparsed (i.e., where a procedure name is expected), is treated as if it were the sequence ( ? 37 ) making the number an input to the ? procedure. (See the discussion of templates, below.) This special treatment does not apply to words read as data, to words with a non-number following the question mark, or if the question mark is backslashed. A line (an instruction line or one read by 'READLIST' or 'READWORD') can be continued onto the following line if its last character is a tilde ('~'). 'READWORD' preserves the tilde and the newline; 'READLIST' does not. Lines read with 'READRAWLINE' are never continued. An instruction line or a line read by 'READLIST' (but not by 'READWORD') is automatically continued to the next line, as if ended with a tilde, if there are unmatched brackets, parentheses, braces, or vertical bars pending. However, it's an error if the continuation line contains only the word 'END'; this is to prevent runaway procedure definitions. Lines explicitly continued with a tilde avoid this restriction. If a line being typed interactively on the keyboard is continued, either with a tilde or automatically, Logo will display a tilde as a prompt character for the continuation line. A semicolon begins a comment in an instruction line. Logo ignores characters from the semicolon to the end of the line. A tilde as the last character still indicates a continuation line, but not a continuation of the comment. For example, typing the instruction print "abc;comment ~ def will print the word 'abcdef'. Semicolon has no special meaning in data lines read by 'READWORD' or 'READLIST', but such a line can later be reparsed using 'RUNPARSE' and then comments will be recognized. The two-character sequence '#!' at the beginning of a line also starts a comment. Unix users can therefore write a file containing Logo commands, starting with the line #! /usr/local/bin/logo (or wherever your Logo executable lives) and the file will be executable directly from the shell. To include an otherwise delimiting character (including semicolon or tilde) in a word, precede it with backslash ('\'). If the last character of a line is a backslash, then the newline character following the backslash will be part of the last word on the line, and the line continues onto the following line. To include a backslash in a word, use '\\'. If the combination backslash-newline is entered at the terminal, Logo will issue a backslash as a prompt character for the continuation line. All of this applies to data lines read with 'READWORD' or 'READLIST' as well as to instruction lines. A line read with 'READRAWLINE' has no special quoting mechanism; both backslash and vertical bar (described below) are just ordinary characters. An alternative notation to include otherwise delimiting characters in words is to enclose a group of characters in vertical bars. All characters between vertical bars are treated as if they were letters. In data read with 'READWORD' the vertical bars are preserved in the resulting word. In data read with 'READLIST' (or resulting from a 'PARSE' or 'RUNPARSE' of a word) the vertical bars do not appear explicitly; all potentially delimiting characters (including spaces, brackets, parentheses, and infix operators) appear unmarked, but tokenized as though they were letters. Within vertical bars, backslash may still be used; the only characters that must be backslashed in this context are backslash and vertical bar themselves. Characters entered between vertical bars are forever special, even if the word or list containing them is later reparsed with 'PARSE' or 'RUNPARSE'. Characters typed after a backslash are treated somewhat differently: When a quoted word containing a backslashed character is runparsed, the backslashed character loses its special quality and acts thereafter as if typed normally. This distinction is important only if you are building a Logo expression out of parts, to be 'RUN' later, and want to use parentheses. For example, PRINT RUN (SE "\( 2 "+ 3 "\)) will print 5, but RUN (SE "MAKE ""|(| 2) will create a variable whose name is open-parenthesis. (Each example would fail if vertical bars and backslashes were interchanged.) A normally delimiting character entered within vertical bars is 'EQUALP' to the same character without the vertical bars, but can be distinguished by the 'VBARREDP' predicate. (However, 'VBARREDP' returns 'TRUE' only for characters for which special treatment is necessary: whitespace, parentheses, brackets, infix operators, backslash, vertical bar, tilde, quote, question mark, colon, and semicolon.)  File: ucblogo.info, Node: DATA STRUCTURE PRIMITIVES, Next: COMMUNICATION, Prev: INTRODUCTION, Up: Top 2 Data Structure Primitives *************************** * Menu: * CONSTRUCTORS:: * SELECTORS:: * MUTATORS:: * PREDICATES:: * QUERIES::  File: ucblogo.info, Node: CONSTRUCTORS, Next: SELECTORS, Prev: DATA STRUCTURE PRIMITIVES, Up: DATA STRUCTURE PRIMITIVES 2.1 Constructors ================ * Menu: * WORD:: * LIST:: * SENTENCE:: * FPUT:: * LPUT:: * ARRAY:: * MDARRAY:: * LISTTOARRAY:: * ARRAYTOLIST:: * COMBINE:: * REVERSE:: * GENSYM::  File: ucblogo.info, Node: WORD, Next: LIST, Prev: CONSTRUCTORS, Up: CONSTRUCTORS word ---- WORD word1 word2 (WORD word1 word2 word3 ...) outputs a word formed by concatenating its inputs.  File: ucblogo.info, Node: LIST, Next: SENTENCE, Prev: WORD, Up: CONSTRUCTORS list ---- LIST thing1 thing2 (LIST thing1 thing2 thing3 ...) outputs a list whose members are its inputs, which can be any Logo datum (word, list, or array).  File: ucblogo.info, Node: SENTENCE, Next: FPUT, Prev: LIST, Up: CONSTRUCTORS sentence -------- SENTENCE thing1 thing2 SE thing1 thing2 (SENTENCE thing1 thing2 thing3 ...) (SE thing1 thing2 thing3 ...) outputs a list whose members are its inputs, if those inputs are not lists, or the members of its inputs, if those inputs are lists.  File: ucblogo.info, Node: FPUT, Next: LPUT, Prev: SENTENCE, Up: CONSTRUCTORS fput ---- FPUT thing list outputs a list equal to its second input with one extra member, the first input, at the beginning. If the second input is a word, then the first input must be a one-letter word, and FPUT is equivalent to WORD.  File: ucblogo.info, Node: LPUT, Next: ARRAY, Prev: FPUT, Up: CONSTRUCTORS lput ---- LPUT thing list outputs a list equal to its second input with one extra member, the first input, at the end. If the second input is a word, then the first input must be a one-letter word, and LPUT is equivalent to WORD with its inputs in the other order.  File: ucblogo.info, Node: ARRAY, Next: MDARRAY, Prev: LPUT, Up: CONSTRUCTORS array ----- ARRAY size (ARRAY size origin) outputs an array of SIZE members (must be a positive integer), each of which initially is an empty list. Array members can be selected with 'ITEM' and changed with 'SETITEM'. The first member of the array is member number 1 unless an ORIGIN input (must be an integer) is given, in which case the first member of the array has that number as its index. (Typically 0 is used as the origin if anything.) Arrays are printed by 'PRINT' and friends, and can be typed in, inside curly braces; indicate an origin with {a b c}@0. *Note ITEM:: , *note SETITEM:: , *note PRINT:: .  File: ucblogo.info, Node: MDARRAY, Next: LISTTOARRAY, Prev: ARRAY, Up: CONSTRUCTORS mdarray ------- MDARRAY sizelist (library procedure) (MDARRAY sizelist origin) outputs a multi-dimensional array. The first input must be a list of one or more positive integers. The second input, if present, must be a single integer that applies to every dimension of the array. Ex: (MDARRAY [3 5] 0) outputs a two-dimensional array whose members range from [0 0] to [2 4].  File: ucblogo.info, Node: LISTTOARRAY, Next: ARRAYTOLIST, Prev: MDARRAY, Up: CONSTRUCTORS listtoarray ----------- LISTTOARRAY list (LISTTOARRAY list origin) outputs an array of the same size as the input list, whose members are the members of the input list.  File: ucblogo.info, Node: ARRAYTOLIST, Next: COMBINE, Prev: LISTTOARRAY, Up: CONSTRUCTORS arraytolist ----------- ARRAYTOLIST array outputs a list whose members are the members of the input array. The first member of the output is the first member of the array, regardless of the array's origin.  File: ucblogo.info, Node: COMBINE, Next: REVERSE, Prev: ARRAYTOLIST, Up: CONSTRUCTORS combine ------- COMBINE thing1 thing2 (library procedure) if THING2 is a word, outputs WORD thing1 thing2. If THING2 is a list, outputs FPUT thing1 thing2. *Note WORD:: , *note FPUT::  File: ucblogo.info, Node: REVERSE, Next: GENSYM, Prev: COMBINE, Up: CONSTRUCTORS reverse ------- REVERSE list (library procedure) outputs a list whose members are the members of the input list, in reverse order.  File: ucblogo.info, Node: GENSYM, Prev: REVERSE, Up: CONSTRUCTORS gensym ------ GENSYM (library procedure) outputs a unique word each time it's invoked. The words are of the form 'G1', 'G2', etc.  File: ucblogo.info, Node: SELECTORS, Next: MUTATORS, Prev: CONSTRUCTORS, Up: DATA STRUCTURE PRIMITIVES 2.2 Data Selectors ================== * Menu: * FIRST:: * FIRSTS:: * LAST:: * BUTFIRST:: * BUTFIRSTS:: * BUTLAST:: * ITEM:: * MDITEM:: * PICK:: * REMOVE:: * REMDUP:: * QUOTED::  File: ucblogo.info, Node: FIRST, Next: FIRSTS, Prev: SELECTORS, Up: SELECTORS first ----- FIRST thing if the input is a word, outputs the first character of the word. If the input is a list, outputs the first member of the list. If the input is an array, outputs the origin of the array (that is, the _index of_ the first member of the array).  File: ucblogo.info, Node: FIRSTS, Next: LAST, Prev: FIRST, Up: SELECTORS firsts ------ FIRSTS list outputs a list containing the 'FIRST' of each member of the input list. It is an error if any member of the input list is empty. (The input itself may be empty, in which case the output is also empty.) This could be written as to firsts :list output map "first :list end but is provided as a primitive in order to speed up the iteration tools 'MAP', 'MAP.SE', and 'FOREACH'. to transpose :matrix if emptyp first :matrix [op []] op fput firsts :matrix transpose bfs :matrix end *Note MAP:: , *note MAPdSE:: , *note FOREACH::  File: ucblogo.info, Node: LAST, Next: BUTFIRST, Prev: FIRSTS, Up: SELECTORS last ---- LAST wordorlist if the input is a word, outputs the last character of the word. If the input is a list, outputs the last member of the list.  File: ucblogo.info, Node: BUTFIRST, Next: BUTFIRSTS, Prev: LAST, Up: SELECTORS butfirst -------- BUTFIRST wordorlist BF wordorlist if the input is a word, outputs a word containing all but the first character of the input. If the input is a list, outputs a list containing all but the first member of the input.  File: ucblogo.info, Node: BUTFIRSTS, Next: BUTLAST, Prev: BUTFIRST, Up: SELECTORS butfirsts --------- BUTFIRSTS list BFS list outputs a list containing the 'BUTFIRST' of each member of the input list. It is an error if any member of the input list is empty or an array. (The input itself may be empty, in which case the output is also empty.) This could be written as to butfirsts :list output map "butfirst :list end but is provided as a primitive in order to speed up the iteration tools 'MAP', 'MAP.SE', and 'FOREACH'. *Note MAP:: , *note MAPdSE:: , *note FOREACH::  File: ucblogo.info, Node: BUTLAST, Next: ITEM, Prev: BUTFIRSTS, Up: SELECTORS butlast ------- BUTLAST wordorlist BL wordorlist if the input is a word, outputs a word containing all but the last character of the input. If the input is a list, outputs a list containing all but the last member of the input.  File: ucblogo.info, Node: ITEM, Next: MDITEM, Prev: BUTLAST, Up: SELECTORS item ---- ITEM index thing if the THING is a word, outputs the INDEXth character of the word. If the THING is a list, outputs the INDEXth member of the list. If the THING is an array, outputs the INDEXth member of the array. INDEX starts at 1 for words and lists; the starting index of an array is specified when the array is created.  File: ucblogo.info, Node: MDITEM, Next: PICK, Prev: ITEM, Up: SELECTORS mditem ------ MDITEM indexlist array (library procedure) outputs the member of the multidimensional ARRAY selected by the list of numbers INDEXLIST.  File: ucblogo.info, Node: PICK, Next: REMOVE, Prev: MDITEM, Up: SELECTORS pick ---- PICK list (library procedure) outputs a randomly chosen member of the input list.  File: ucblogo.info, Node: REMOVE, Next: REMDUP, Prev: PICK, Up: SELECTORS remove ------ REMOVE thing list (library procedure) outputs a copy of LIST with every member equal to THING removed.  File: ucblogo.info, Node: REMDUP, Next: QUOTED, Prev: REMOVE, Up: SELECTORS remdup ------ REMDUP list (library procedure) outputs a copy of LIST with duplicate members removed. If two or more members of the input are equal, the rightmost of those members is the one that remains in the output.  File: ucblogo.info, Node: QUOTED, Prev: REMDUP, Up: SELECTORS quoted ------ QUOTED thing (library procedure) outputs its input, if a list; outputs its input with a quotation mark prepended, if a word.  File: ucblogo.info, Node: MUTATORS, Next: PREDICATES, Prev: SELECTORS, Up: DATA STRUCTURE PRIMITIVES 2.3 Data Mutators ================= * Menu: * SETITEM:: * MDSETITEM:: * dSETFIRST:: SETFIRST * dSETBF:: SETBF * dSETITEM:: SETITEM * PUSH:: * POP:: * QUEUE:: * DEQUEUE::  File: ucblogo.info, Node: SETITEM, Next: MDSETITEM, Prev: MUTATORS, Up: MUTATORS setitem ------- SETITEM index array value command. Replaces the INDEXth member of ARRAY with the new VALUE. Ensures that the resulting array is not circular, i.e., VALUE may not be a list or array that contains ARRAY.  File: ucblogo.info, Node: MDSETITEM, Next: dSETFIRST, Prev: SETITEM, Up: MUTATORS mdsetitem --------- MDSETITEM indexlist array value (library procedure) command. Replaces the member of ARRAY chosen by INDEXLIST with the new VALUE.  File: ucblogo.info, Node: dSETFIRST, Next: dSETBF, Prev: MDSETITEM, Up: MUTATORS .setfirst --------- .SETFIRST list value command. Changes the first member of LIST to be VALUE. WARNING: Primitives whose names start with a period are *dangerous*. Their use by non-experts is not recommended. The use of '.SETFIRST' can lead to circular list structures, which will get some Logo primitives into infinite loops, and to unexpected changes to other data structures that share storage with the list being modified.  File: ucblogo.info, Node: dSETBF, Next: dSETITEM, Prev: dSETFIRST, Up: MUTATORS .setbf ------ .SETBF list value command. Changes the butfirst of LIST to be VALUE. WARNING: Primitives whose names start with a period are *dangerous*. Their use by non-experts is not recommended. The use of '.SETBF' can lead to circular list structures, which will get some Logo primitives into infinite loops; unexpected changes to other data structures that share storage with the list being modified; or to Logo crashes and coredumps if the butfirst of a list is not itself a list.  File: ucblogo.info, Node: dSETITEM, Next: PUSH, Prev: dSETBF, Up: MUTATORS .setitem -------- .SETITEM index array value command. Changes the INDEXth member of ARRAY to be VALUE, like 'SETITEM', but without checking for circularity. WARNING: Primitives whose names start with a period are dangerous. Their use by non-experts is not recommended. The use of '.SETITEM' can lead to circular arrays, which will get some Logo primitives into infinite loops. *Note SETITEM::.  File: ucblogo.info, Node: PUSH, Next: POP, Prev: dSETITEM, Up: MUTATORS push ---- PUSH stackname thing (library procedure) command. Adds the THING to the stack that is the value of the variable whose name is STACKNAME. This variable must have a list as its value; the initial value should be the empty list. New members are added at the front of the list.  File: ucblogo.info, Node: POP, Next: QUEUE, Prev: PUSH, Up: MUTATORS pop --- POP stackname (library procedure) outputs the most recently 'PUSH'ed member of the stack that is the value of the variable whose name is STACKNAME and removes that member from the stack.  File: ucblogo.info, Node: QUEUE, Next: DEQUEUE, Prev: POP, Up: MUTATORS queue ----- QUEUE queuename thing (library procedure) command. Adds the THING to the queue that is the value of the variable whose name is QUEUENAME. This variable must have a list as its value; the initial value should be the empty list. New members are added at the back of the list.  File: ucblogo.info, Node: DEQUEUE, Prev: QUEUE, Up: MUTATORS dequeue ------- DEQUEUE queuename (library procedure) outputs the least recently 'QUEUE'd member of the queue that is the value of the variable whose name is QUEUENAME and removes that member from the queue.  File: ucblogo.info, Node: PREDICATES, Next: QUERIES, Prev: MUTATORS, Up: DATA STRUCTURE PRIMITIVES 2.4 Predicates ============== * Menu: * WORDP:: * LISTP:: * ARRAYP:: * EMPTYP:: * EQUALP:: * NOTEQUALP:: * BEFOREP:: * dEQ:: EQ * MEMBERP:: * SUBSTRINGP:: * NUMBERP:: * VBARREDP::  File: ucblogo.info, Node: WORDP, Next: LISTP, Prev: PREDICATES, Up: PREDICATES wordp ----- WORDP thing WORD? thing outputs 'TRUE' if the input is a word, 'FALSE' otherwise.  File: ucblogo.info, Node: LISTP, Next: ARRAYP, Prev: WORDP, Up: PREDICATES listp ----- LISTP thing LIST? thing outputs 'TRUE' if the input is a list, 'FALSE' otherwise.  File: ucblogo.info, Node: ARRAYP, Next: EMPTYP, Prev: LISTP, Up: PREDICATES arrayp ------ ARRAYP thing ARRAY? thing outputs 'TRUE' if the input is an array, 'FALSE' otherwise.  File: ucblogo.info, Node: EMPTYP, Next: EQUALP, Prev: ARRAYP, Up: PREDICATES emptyp ------ EMPTYP thing EMPTY? thing outputs 'TRUE' if the input is the empty word or the empty list, 'FALSE' otherwise.  File: ucblogo.info, Node: EQUALP, Next: NOTEQUALP, Prev: EMPTYP, Up: PREDICATES equalp ------ EQUALP thing1 thing2 EQUAL? thing1 thing2 thing1 = thing2 outputs 'TRUE' if the inputs are equal, 'FALSE' otherwise. Two numbers are equal if they have the same numeric value. Two non-numeric words are equal if they contain the same characters in the same order. If there is a variable named 'CASEIGNOREDP' whose value is 'TRUE', then an upper case letter is considered the same as the corresponding lower case letter. (This is the case by default.) Two lists are equal if their members are equal. An array is only equal to itself; two separately created arrays are never equal even if their members are equal. (It is important to be able to know if two expressions have the same array as their value because arrays are mutable; if, for example, two variables have the same array as their values then performing 'SETITEM' on one of them will also change the other.) *Note CASEIGNOREDP:: , *note SETITEM::  File: ucblogo.info, Node: NOTEQUALP, Next: BEFOREP, Prev: EQUALP, Up: PREDICATES notequalp --------- NOTEQUALP thing1 thing2 NOTEQUAL? thing1 thing2 thing1 <> thing2 outputs 'FALSE' if the inputs are equal, 'TRUE' otherwise. See 'EQUALP' for the meaning of equality for different data types.  File: ucblogo.info, Node: BEFOREP, Next: dEQ, Prev: NOTEQUALP, Up: PREDICATES beforep ------- BEFOREP word1 word2 BEFORE? word1 word2 outputs 'TRUE' if WORD1 comes before WORD2 in ASCII collating sequence (for words of letters, in alphabetical order). Case-sensitivity is determined by the value of 'CASEIGNOREDP'. Note that if the inputs are numbers, the result may not be the same as with 'LESSP'; for example, BEFOREP 3 12 is false because 3 collates after 1. *Note CASEIGNOREDP:: , *note LESSP::  File: ucblogo.info, Node: dEQ, Next: MEMBERP, Prev: BEFOREP, Up: PREDICATES .eq --- .EQ thing1 thing2 outputs 'TRUE' if its two inputs are the same datum, so that applying a mutator to one will change the other as well. Outputs 'FALSE' otherwise, even if the inputs are equal in value. WARNING: Primitives whose names start with a period are *dangerous*. Their use by non-experts is not recommended. The use of mutators can lead to circular data structures, infinite loops, or Logo crashes.  File: ucblogo.info, Node: MEMBERP, Next: SUBSTRINGP, Prev: dEQ, Up: PREDICATES memberp ------- MEMBERP thing1 thing2 MEMBER? thing1 thing2 if THING2 is a list or an array, outputs 'TRUE' if THING1 is 'EQUALP' to a member of THING2, 'FALSE' otherwise. If THING2 is a word, outputs 'TRUE' if THING1 is a one-character word 'EQUALP' to a character of THING2, 'FALSE' otherwise. *Note EQUALP:: .  File: ucblogo.info, Node: SUBSTRINGP, Next: NUMBERP, Prev: MEMBERP, Up: PREDICATES substringp ---------- SUBSTRINGP thing1 thing2 SUBSTRING? thing1 thing2 if THING1 or THING2 is a list or an array, outputs 'FALSE'. If THING2 is a word, outputs 'TRUE' if THING1 is 'EQUALP' to a substring of THING2, 'FALSE' otherwise. *Note EQUALP:: .  File: ucblogo.info, Node: NUMBERP, Next: VBARREDP, Prev: SUBSTRINGP, Up: PREDICATES numberp ------- NUMBERP thing NUMBER? thing outputs 'TRUE' if the input is a number, 'FALSE' otherwise.  File: ucblogo.info, Node: VBARREDP, Prev: NUMBERP, Up: PREDICATES vbarredp -------- VBARREDP char VBARRED? char BACKSLASHEDP char (library procedure) BACKSLASHED? char (library procedure) outputs 'TRUE' if the input character was originally entered into Logo within vertical bars (|) to prevent its usual special syntactic meaning, 'FALSE' otherwise. (Outputs 'TRUE' only if the character is a backslashed space, tab, newline, or one of '()[]+-*/=<>":;\~?|' ) The names 'BACKSLASHEDP' and 'BACKSLASHED?' are included in the Logo library for backward compatibility with the former names of this primitive, although it does _not_ output 'TRUE' for characters originally entered with backslashes.  File: ucblogo.info, Node: QUERIES, Prev: PREDICATES, Up: DATA STRUCTURE PRIMITIVES 2.5 Queries =========== * Menu: * COUNT:: * ASCII:: * RAWASCII:: * CHAR:: * MEMBER:: * LOWERCASE:: * UPPERCASE:: * STANDOUT:: * PARSE:: * RUNPARSE::  File: ucblogo.info, Node: COUNT, Next: ASCII, Prev: QUERIES, Up: QUERIES count ----- COUNT thing outputs the number of characters in the input, if the input is a word; outputs the number of members in the input, if it is a list or an array. (For an array, this may or may not be the index of the last member, depending on the array's origin.)  File: ucblogo.info, Node: ASCII, Next: RAWASCII, Prev: COUNT, Up: QUERIES ascii ----- ASCII char outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing vbarred punctuation, and returns the character code for the corresponding punctuation character without vertical bars. (Compare 'RAWASCII'.)  File: ucblogo.info, Node: RAWASCII, Next: CHAR, Prev: ASCII, Up: QUERIES rawascii -------- RAWASCII char outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing themselves. To find out the ASCII code of an arbitrary keystroke, use RAWASCII RC.  File: ucblogo.info, Node: CHAR, Next: MEMBER, Prev: RAWASCII, Up: QUERIES char ---- CHAR int outputs the character represented in the ASCII code by the input, which must be an integer between 0 and 255. *Note ASCII:: .  File: ucblogo.info, Node: MEMBER, Next: LOWERCASE, Prev: CHAR, Up: QUERIES member ------ MEMBER thing1 thing2 if THING2 is a word or list and if 'MEMBERP' with these inputs would output 'TRUE', outputs the portion of THING2 from the first instance of THING1 to the end. If 'MEMBERP' would output 'FALSE', outputs the empty word or list according to the type of THING2. It is an error for THING2 to be an array. *Note MEMBERP:: .  File: ucblogo.info, Node: LOWERCASE, Next: UPPERCASE, Prev: MEMBER, Up: QUERIES lowercase --------- LOWERCASE word outputs a copy of the input word, but with all uppercase letters changed to the corresponding lowercase letter.  File: ucblogo.info, Node: UPPERCASE, Next: STANDOUT, Prev: LOWERCASE, Up: QUERIES uppercase --------- UPPERCASE word outputs a copy of the input word, but with all lowercase letters changed to the corresponding uppercase letter.  File: ucblogo.info, Node: STANDOUT, Next: PARSE, Prev: UPPERCASE, Up: QUERIES standout -------- STANDOUT thing outputs a word that, when printed, will appear like the input but displayed in standout mode (boldface, reverse video, or whatever your version does for standout). The word contains machine-specific magic characters at the beginning and end; in between is the printed form (as if displayed using 'TYPE') of the input. The output is always a word, even if the input is of some other type, but it may include spaces and other formatting characters. Note: a word output by 'STANDOUT' while Logo is running on one machine will probably not have the desired effect if printed on another type of machine. In the Macintosh classic version, the way that standout works is incompatible with the use of characters whose ASCII code is greater than 127. Therefore, you have a choice to make: The instruction CANINVERSE 0 disables standout, but enables the display of ASCII codes above 127, and the instruction CANINVERSE 1 restores the default situation in which standout is enabled and the extra graphic characters cannot be printed.  File: ucblogo.info, Node: PARSE, Next: RUNPARSE, Prev: STANDOUT, Up: QUERIES parse ----- PARSE word outputs the list that would result if the input word were entered in response to a 'READLIST' operation. That is, PARSE READWORD has the same value as 'READLIST' for the same characters read. *Note READLIST:: , *note READWORD::  File: ucblogo.info, Node: RUNPARSE, Prev: PARSE, Up: QUERIES runparse -------- RUNPARSE wordorlist outputs the list that would result if the input word or list were entered as an instruction line; characters such as infix operators and parentheses are separate members of the output. Note that sublists of a runparsed list are not themselves runparsed.  File: ucblogo.info, Node: COMMUNICATION, Next: ARITHMETIC, Prev: DATA STRUCTURE PRIMITIVES, Up: Top 3 Communication *************** * Menu: * TRANSMITTERS:: * RECEIVERS:: * FILE ACCESS:: * TERMINAL ACCESS::  File: ucblogo.info, Node: TRANSMITTERS, Next: RECEIVERS, Prev: COMMUNICATION, Up: COMMUNICATION 3.1 Transmitters ================ * Menu: * PRINT:: * TYPE:: * SHOW:: Note: If there is a variable named 'PRINTDEPTHLIMIT' with a nonnegative integer value, then complex list and array structures will be printed only to the allowed depth. That is, members of members of... of members will be allowed only so far. The members omitted because they are just past the depth limit are indicated by an ellipsis for each one, so a too-deep list of two members will print as [... ...]. If there is a variable named 'PRINTWIDTHLIMIT' with a nonnegative integer value, then only the first so many members of any array or list will be printed. A single ellipsis replaces all missing data within the structure. The width limit also applies to the number of characters printed in a word, except that a 'PRINTWIDTHLIMIT' between 0 and 9 will be treated as if it were 10 when applied to words. This limit applies not only to the top-level printed datum but to any substructures within it. *Note PRINTDEPTHLIMIT:: , *note PRINTWIDTHLIMIT:: If there is a variable named 'FULLPRINTP' whose value is 'TRUE', then words that were created using backslash or vertical bar (to include characters that would otherwise not be treated as part of a word) are printed with the backslashes or vertical bars shown, so that the printed result could be re-read by Logo to produce the same value. If 'FULLPRINTP' is 'TRUE' then the empty word (however it was created) prints as '||'. (Otherwise it prints as nothing at all.) *Note FULLPRINTP:: .  File: ucblogo.info, Node: PRINT, Next: TYPE, Prev: TRANSMITTERS, Up: TRANSMITTERS print ----- PRINT thing PR thing (PRINT thing1 thing2 ...) (PR thing1 thing2 ...) command. Prints the input or inputs to the current write stream (initially the screen). All the inputs are printed on a single line, separated by spaces, ending with a newline. If an input is a list, square brackets are not printed around it, but brackets are printed around sublists. Braces are always printed around arrays.  File: ucblogo.info, Node: TYPE, Next: SHOW, Prev: PRINT, Up: TRANSMITTERS type ---- TYPE thing (TYPE thing1 thing2 ...) command. Prints the input or inputs like 'PRINT', except that no newline character is printed at the end and multiple inputs are not separated by spaces. Note: printing to the screen is ordinarily "line buffered"; that is, the characters you print using 'TYPE' will not actually appear on the screen until either a newline character is printed (for example, by 'PRINT' or 'SHOW') or Logo tries to read from the keyboard (either at the request of your program or after an instruction prompt). This buffering makes the program much faster than it would be if each character appeared immediately, and in most cases the effect is not disconcerting. To accommodate programs that do a lot of positioned text display using 'TYPE', Logo will force printing whenever 'SETCURSOR' is invoked. This solves most buffering problems. Still, on occasion you may find it necessary to force the buffered characters to be printed explicitly; this can be done using the 'WAIT' command. WAIT 0 will force printing without actually waiting. *Note SETCURSOR:: , *note WAIT::  File: ucblogo.info, Node: SHOW, Prev: TYPE, Up: TRANSMITTERS show ---- SHOW thing (SHOW thing1 thing2 ...) command. Prints the input or inputs like 'PRINT', except that if an input is a list it is printed inside square brackets. *Note PRINT:: .  File: ucblogo.info, Node: RECEIVERS, Next: FILE ACCESS, Prev: TRANSMITTERS, Up: COMMUNICATION 3.2 Receivers ============= * Menu: * READLIST:: * READWORD:: * READRAWLINE:: * READCHAR:: * READCHARS:: * SHELL::  File: ucblogo.info, Node: READLIST, Next: READWORD, Prev: RECEIVERS, Up: RECEIVERS readlist -------- READLIST RL reads a line from the read stream (initially the keyboard) and outputs that line as a list. The line is separated into members as though it were typed in square brackets in an instruction. If the read stream is a file, and the end of file is reached, 'READLIST' outputs the empty word (not the empty list). 'READLIST' processes backslash, vertical bar, and tilde characters in the read stream; the output list will not contain these characters but they will have had their usual effect. 'READLIST' does not, however, treat semicolon as a comment character.  File: ucblogo.info, Node: READWORD, Next: READRAWLINE, Prev: READLIST, Up: RECEIVERS readword -------- READWORD RW reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, 'READWORD' outputs the empty list (not the empty word). 'READWORD' processes backslash, vertical bar, and tilde characters in the read stream. In the case of a tilde used for line continuation, the output word _does_ include the tilde and the newline characters, so that the user program can tell exactly what the user entered. Vertical bars in the line are also preserved in the output. Backslash characters are not preserved in the output.  File: ucblogo.info, Node: READRAWLINE, Next: READCHAR, Prev: READWORD, Up: RECEIVERS readrawline ----------- READRAWLINE reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, 'READRAWLINE' outputs the empty list (not the empty word). 'READRAWLINE' outputs the exact string of characters as they appear in the line, with no special meaning for backslash, vertical bar, tilde, or any other formatting characters. *Note READWORD:: .  File: ucblogo.info, Node: READCHAR, Next: READCHARS, Prev: READRAWLINE, Up: RECEIVERS readchar -------- READCHAR RC reads a single character from the read stream and outputs that character as a word. If the read stream is a file, and the end of file is reached, 'READCHAR' outputs the empty list (not the empty word). If the read stream is the keyboard, echoing is turned off when 'READCHAR' is invoked, and remains off until 'READLIST' or 'READWORD' is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. *Note READLIST:: .  File: ucblogo.info, Node: READCHARS, Next: SHELL, Prev: READCHAR, Up: RECEIVERS readchars --------- READCHARS num RCS num reads NUM characters from the read stream and outputs those characters as a word. If the read stream is a file, and the end of file is reached, 'READCHARS' outputs the empty list (not the empty word). If the read stream is the keyboard, echoing is turned off when 'READCHARS' is invoked, and remains off until 'READLIST' or 'READWORD' is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. *Note READLIST:: , *note READWORD::  File: ucblogo.info, Node: SHELL, Prev: READCHARS, Up: RECEIVERS shell ----- SHELL command (SHELL command wordflag) Under Unix, outputs the result of running COMMAND as a shell command. (The command is sent to '/bin/sh', not 'csh' or other alternatives.) If the command is a literal list in the instruction line, and if you want a backslash character sent to the shell, you must use '\\' to get the backslash through Logo's reader intact. The output is a list containing one member for each line generated by the shell command. Ordinarily each such line is represented by a list in the output, as though the line were read using 'READLIST'. If a second input is given, regardless of the value of the input, each line is represented by a word in the output as though it were read with 'READWORD'. Example: to dayofweek output first first shell [date] end This is 'first first' to extract the first word of the first (and only) line of the shell output. Under MacOS X, 'SHELL' works as under Unix. 'SHELL' is not available under Mac Classic. Under DOS, 'SHELL' is a command, not an operation; it sends its input to a DOS command processor but does not collect the result of the command. Under Windows, the wxWidgets version of Logo behaves as under Unix (except that DOS-style commands are understood; use 'dir' rather than 'ls'). The non-wxWidgets version behaves like the DOS version.  File: ucblogo.info, Node: FILE ACCESS, Next: TERMINAL ACCESS, Prev: RECEIVERS, Up: COMMUNICATION 3.3 File Access =============== * Menu: * SETPREFIX:: * PREFIX:: * OPENREAD:: * OPENWRITE:: * OPENAPPEND:: * OPENUPDATE:: * CLOSE:: * ALLOPEN:: * CLOSEALL:: * ERASEFILE:: * DRIBBLE:: * NODRIBBLE:: * SETREAD:: * SETWRITE:: * READER:: * WRITER:: * SETREADPOS:: * SETWRITEPOS:: * READPOS:: * WRITEPOS:: * EOFP:: * FILEP::  File: ucblogo.info, Node: SETPREFIX, Next: PREFIX, Prev: FILE ACCESS, Up: FILE ACCESS setprefix --------- SETPREFIX string command. Sets a prefix that will be used as the implicit beginning of filenames in 'OPENREAD', 'OPENWRITE', 'OPENAPPEND', 'OPENUPDATE', 'LOAD', and 'SAVE' commands. Logo will put the appropriate separator character (slash for Unix, backslash for DOS/Windows, colon for MacOS Classic) between the prefix and the filename entered by the user. The input to 'SETPREFIX' must be a word, unless it is the empty list, to indicate that there should be no prefix. *Note OPENREAD:: , *Note OPENWRITE:: , *Note OPENAPPEND:: , *Note OPENUPDATE:: , *Note LOAD:: , *Note SAVE:: .  File: ucblogo.info, Node: PREFIX, Next: OPENREAD, Prev: SETPREFIX, Up: FILE ACCESS prefix ------ PREFIX outputs the current file prefix, or [] if there is no prefix. *Note SETPREFIX:: .  File: ucblogo.info, Node: OPENREAD, Next: OPENWRITE, Prev: PREFIX, Up: FILE ACCESS openread -------- OPENREAD filename command. Opens the named file for reading. The read position is initially at the beginning of the file.  File: ucblogo.info, Node: OPENWRITE, Next: OPENAPPEND, Prev: OPENREAD, Up: FILE ACCESS openwrite --------- OPENWRITE filename command. Opens the named file for writing. If the file already existed, the old version is deleted and a new, empty file created. 'OPENWRITE', but not the other 'OPEN' variants, will accept as input a two-element list, in which the first element must be a variable name, and the second must be a positive integer. A character buffer of the specified size will be created. When a 'SETWRITE' is done with this same list (in the sense of .EQ, not a copy, so you must do something like ? make "buf [foo 100] ? openwrite :buf ? setwrite :buf [...] ? close :buf and not just ? openwrite [foo 100] ? setwrite [foo 100] and so on), the printed characters are stored in the buffer; when a 'CLOSE' is done with the same list as input, the characters from the buffer (treated as one long word, even if spaces and newlines are included) become the value of the specified variable.  File: ucblogo.info, Node: OPENAPPEND, Next: OPENUPDATE, Prev: OPENWRITE, Up: FILE ACCESS openappend ---------- OPENAPPEND filename command. Opens the named file for writing. If the file already exists, the write position is initially set to the end of the old file, so that newly written data will be appended to it.  File: ucblogo.info, Node: OPENUPDATE, Next: CLOSE, Prev: OPENAPPEND, Up: FILE ACCESS openupdate ---------- OPENUPDATE filename command. Opens the named file for reading and writing. The read and write position is initially set to the end of the old file, if any. Note: each open file has only one position, for both reading and writing. If a file opened for update is both 'READER' and 'WRITER' at the same time, then 'SETREADPOS' will also affect 'WRITEPOS' and vice versa. Also, if you alternate reading and writing the same file, you must 'SETREADPOS' between a write and a read, and 'SETWRITEPOS' between a read and a write. *Note READER:: , *note WRITER:: , *note SETREADPOS:: , *note SETWRITEPOS::  File: ucblogo.info, Node: CLOSE, Next: ALLOPEN, Prev: OPENUPDATE, Up: FILE ACCESS close ----- CLOSE filename command. Closes the named file. If the file was currently the reader or writer, then the reader or writer is changed to the keyboard or screen, as if SETREAD [] or SETWRITE [] had been done.  File: ucblogo.info, Node: ALLOPEN, Next: CLOSEALL, Prev: CLOSE, Up: FILE ACCESS allopen ------- ALLOPEN outputs a list whose members are the names of all files currently open. This list does not include the dribble file, if any.  File: ucblogo.info, Node: CLOSEALL, Next: ERASEFILE, Prev: ALLOPEN, Up: FILE ACCESS closeall -------- CLOSEALL (library procedure) command. Closes all open files. Abbreviates FOREACH ALLOPEN [CLOSE ?] *Note FOREACH:: , *note CLOSE::  File: ucblogo.info, Node: ERASEFILE, Next: DRIBBLE, Prev: CLOSEALL, Up: FILE ACCESS erasefile --------- ERASEFILE filename ERF filename command. Erases (deletes, removes) the named file, which should not currently be open.  File: ucblogo.info, Node: DRIBBLE, Next: NODRIBBLE, Prev: ERASEFILE, Up: FILE ACCESS dribble ------- DRIBBLE filename command. Creates a new file whose name is the input, like 'OPENWRITE', and begins recording in that file everything that is read from the keyboard or written to the terminal. That is, this writing is in addition to the writing to 'WRITER'. The intent is to create a transcript of a Logo session, including things like prompt characters and interactions. *Note OPENWRITE:: , *note WRITER::  File: ucblogo.info, Node: NODRIBBLE, Next: SETREAD, Prev: DRIBBLE, Up: FILE ACCESS nodribble --------- NODRIBBLE command. Stops copying information into the dribble file, and closes the file.  File: ucblogo.info, Node: SETREAD, Next: SETWRITE, Prev: NODRIBBLE, Up: FILE ACCESS setread ------- SETREAD filename command. Makes the named file the read stream, used for 'READLIST', etc. The file must already be open with 'OPENREAD' or 'OPENUPDATE'. If the input is the empty list, then the read stream becomes the keyboard, as usual. Changing the read stream does not close the file that was previously the read stream, so it is possible to alternate between files. *Note READLIST:: , *note OPENREAD:: , *note OPENUPDATE::  File: ucblogo.info, Node: SETWRITE, Next: READER, Prev: SETREAD, Up: FILE ACCESS setwrite -------- SETWRITE filename command. Makes the named file the write stream, used for 'PRINT', etc. The file must already be open with 'OPENWRITE', 'OPENAPPEND', or 'OPENUPDATE'. If the input is the empty list, then the write stream becomes the screen, as usual. Changing the write stream does not close the file that was previously the write stream, so it is possible to alternate between files. If the input is a list, then its first element must be a variable name, and its second and last element must be a positive integer; a buffer of that many characters will be allocated, and will become the writestream. If the same list (same in the '.EQ' sense, not a copy) has been used as input to 'OPENWRITE', then the already-allocated buffer will be used, and the writer can be changed to and from this buffer, with all the characters accumulated as in a file. When the same list is used as input to 'CLOSE', the contents of the buffer (as an unparsed word, which may contain newline characters) will become the value of the named variable. For compatibility with earlier versions, if the list has not been opened when the 'SETWRITE' is done, it will be opened implicitly, but the first 'SETWRITE' after this one will implicitly close it, setting the variable and freeing the allocated buffer. *Note PRINT:: , *note OPENWRITE:: ; *note OPENAPPEND:: ; *note OPENUPDATE::  File: ucblogo.info, Node: READER, Next: WRITER, Prev: SETWRITE, Up: FILE ACCESS reader ------ READER outputs the name of the current read stream file, or the empty list if the read stream is the terminal.  File: ucblogo.info, Node: WRITER, Next: SETREADPOS, Prev: READER, Up: FILE ACCESS writer ------ WRITER outputs the name of the current write stream file, or the empty list if the write stream is the screen.  File: ucblogo.info, Node: SETREADPOS, Next: SETWRITEPOS, Prev: WRITER, Up: FILE ACCESS setreadpos ---------- SETREADPOS charpos command. Sets the file pointer of the read stream file so that the next 'READLIST', etc., will begin reading at the CHARPOSth character in the file, counting from 0. (That is, SETREADPOS 0 will start reading from the beginning of the file.) Meaningless if the read stream is the keyboard. *Note READLIST:: .  File: ucblogo.info, Node: SETWRITEPOS, Next: READPOS, Prev: SETREADPOS, Up: FILE ACCESS setwritepos ----------- SETWRITEPOS charpos command. Sets the file pointer of the write stream file so that the next 'PRINT', etc., will begin writing at the CHARPOSth character in the file, counting from 0. (That is, SETWRITEPOS 0 will start writing from the beginning of the file.) Meaningless if the write stream is the screen. *Note PRINT:: .  File: ucblogo.info, Node: READPOS, Next: WRITEPOS, Prev: SETWRITEPOS, Up: FILE ACCESS readpos ------- READPOS outputs the file position of the current read stream file.  File: ucblogo.info, Node: WRITEPOS, Next: EOFP, Prev: READPOS, Up: FILE ACCESS writepos -------- WRITEPOS outputs the file position of the current write stream file.  File: ucblogo.info, Node: EOFP, Next: FILEP, Prev: WRITEPOS, Up: FILE ACCESS eofp ---- EOFP EOF? predicate, outputs 'TRUE' if there are no more characters to be read in the read stream file, 'FALSE' otherwise.  File: ucblogo.info, Node: FILEP, Prev: EOFP, Up: FILE ACCESS filep ----- FILEP filename FILE? filename (library procedure) predicate, outputs 'TRUE' if a file of the specified name exists and can be read, 'FALSE' otherwise.  File: ucblogo.info, Node: TERMINAL ACCESS, Prev: FILE ACCESS, Up: COMMUNICATION 3.4 Terminal Access =================== * Menu: * KEYP:: * CLEARTEXT:: * SETCURSOR:: * CURSOR:: * SETMARGINS:: * SETTEXTCOLOR:: * INCREASEFONT:: * SETTEXTSIZE:: * TEXTSIZE:: * SETFONT:: * FONT::  File: ucblogo.info, Node: KEYP, Next: CLEARTEXT, Prev: TERMINAL ACCESS, Up: TERMINAL ACCESS keyp ---- KEYP KEY? predicate, outputs 'TRUE' if there are characters waiting to be read from the read stream. If the read stream is a file, this is equivalent to NOT EOFP. If the read stream is the terminal, then echoing is turned off and the terminal is set to 'cbreak' (character at a time instead of line at a time) mode. It remains in this mode until some line-mode reading is requested (e.g., 'READLIST'). The Unix operating system forgets about any pending characters when it switches modes, so the first 'KEYP' invocation will always output 'FALSE'. *Note EOFP:: , *note READLIST::  File: ucblogo.info, Node: CLEARTEXT, Next: SETCURSOR, Prev: KEYP, Up: TERMINAL ACCESS cleartext --------- CLEARTEXT CT command. Clears the text window.  File: ucblogo.info, Node: SETCURSOR, Next: CURSOR, Prev: CLEARTEXT, Up: TERMINAL ACCESS setcursor --------- SETCURSOR vector command. The input is a list of two numbers, the x and y coordinates of a text window position (origin in the upper left corner, positive direction is southeast). The text cursor is moved to the requested position. This command also forces the immediate printing of any buffered characters.  File: ucblogo.info, Node: CURSOR, Next: SETMARGINS, Prev: SETCURSOR, Up: TERMINAL ACCESS cursor ------ CURSOR outputs a list containing the current x and y coordinates of the text cursor. Logo may get confused about the current cursor position if, e.g., you type in a long line that wraps around or your program prints escape codes that affect the screen strangely.  File: ucblogo.info, Node: SETMARGINS, Next: SETTEXTCOLOR, Prev: CURSOR, Up: TERMINAL ACCESS setmargins ---------- SETMARGINS vector command. The input must be a list of two numbers, as for 'SETCURSOR'. The effect is to clear the screen and then arrange for all further printing to be shifted down and to the right according to the indicated margins. Specifically, every time a newline character is printed (explicitly or implicitly) Logo will type X_MARGIN spaces, and on every invocation of 'SETCURSOR' the margins will be added to the input x and y coordinates. ('CURSOR' will report the cursor position relative to the margins, so that this shift will be invisible to Logo programs.) The purpose of this command is to accommodate the display of terminal screens in lecture halls with inadequate TV monitors that miss the top and left edges of the screen. *Note SETCURSOR:: .  File: ucblogo.info, Node: SETTEXTCOLOR, Next: INCREASEFONT, Prev: SETMARGINS, Up: TERMINAL ACCESS settextcolor ------------ SETTEXTCOLOR foreground background SETTC foreground background command (wxWidgets only). The inputs are color numbers, or RGB color lists, as for turtle graphics. The foreground and background colors for the textscreen/splitscreen text window are changed to the given values. The change affects text already printed as well as future text printing; there is only one text color for the entire window. Command (non-wxWidgets Windows and DOS extended only). The inputs are color numbers, as for turtle graphics. Future printing to the text window will use the specified colors for foreground (the characters printed) and background (the space under those characters). Using 'STANDOUT' will revert to the default text window colors. In the DOS extended ('ucblogo.exe') version, colors in textscreen mode are limited to numbers 0-7, and the coloring applies only to text printed by the program, not to the echoing of text typed by the user. Neither limitation applies to the text portion of splitscreen mode, which is actually drawn as graphics internally. *Note STANDOUT:: .  File: ucblogo.info, Node: INCREASEFONT, Next: SETTEXTSIZE, Prev: SETTEXTCOLOR, Up: TERMINAL ACCESS increasefont ------------ INCREASEFONT DECREASEFONT command (wxWidgets only). Increase or decrease the size of the font used in the text and edit windows to the next larger or smaller available size.  File: ucblogo.info, Node: SETTEXTSIZE, Next: TEXTSIZE, Prev: INCREASEFONT, Up: TERMINAL ACCESS settextsize ----------- SETTEXTSIZE height command (wxWidgets only). Set the "point size" of the font used in the text and edit windows to the given integer input. The desired size may not be available, in which case the nearest available size will be used. Note: There is only a slight correlation between these integers and pixel sizes. Our rough estimate is that the number of pixels of height is about 1.5 times the point size, but it varies for different fonts. See 'SETLABELHEIGHT' for a different approach used for the graphics window.  File: ucblogo.info, Node: TEXTSIZE, Next: SETFONT, Prev: SETTEXTSIZE, Up: TERMINAL ACCESS textsize -------- TEXTSIZE (wxWidgets only) outputs the "point size" of the font used in the text and edit windows. See 'SETTEXTSIZE' for a discussion of font sizing. See 'LABELSIZE' for a different approach used for the graphics window.  File: ucblogo.info, Node: SETFONT, Next: FONT, Prev: TEXTSIZE, Up: TERMINAL ACCESS setfont ------- SETFONT fontname command (wxWidgets only). Set the font family used in all windows to the one named by the input. Try 'Courier' or 'Monospace' as likely possibilities. Not all computers have the same fonts installed. It's a good idea to stick with monospace fonts (ones in which all characters have the same width).  File: ucblogo.info, Node: FONT, Prev: SETFONT, Up: TERMINAL ACCESS font ---- FONT (wxWidgets only) outputs the name of the font family used in all windows.  File: ucblogo.info, Node: ARITHMETIC, Next: LOGICAL OPERATIONS, Prev: COMMUNICATION, Up: Top 4 Arithmetic ************ * Menu: * NUMERIC OPERATIONS:: * NUMERIC PREDICATES:: * RANDOM NUMBERS:: * PRINT FORMATTING:: * BITWISE OPERATIONS::  File: ucblogo.info, Node: NUMERIC OPERATIONS, Next: NUMERIC PREDICATES, Prev: ARITHMETIC, Up: ARITHMETIC 4.1 Numeric Operations ====================== * Menu: * SUM:: * DIFFERENCE:: * MINUS:: * PRODUCT:: * QUOTIENT:: * REMAINDER:: * MODULO:: * INT:: * ROUND:: * SQRT:: * POWER:: * EXP:: * LOG10:: * LN:: * SIN:: * RADSIN:: * COS:: * RADCOS:: * ARCTAN:: * RADARCTAN:: * ISEQ:: * RSEQ::  File: ucblogo.info, Node: SUM, Next: DIFFERENCE, Prev: NUMERIC OPERATIONS, Up: NUMERIC OPERATIONS sum --- SUM num1 num2 (SUM num1 num2 num3 ...) num1 + num2 outputs the sum of its inputs.  File: ucblogo.info, Node: DIFFERENCE, Next: MINUS, Prev: SUM, Up: NUMERIC OPERATIONS difference ---------- DIFFERENCE num1 num2 num1 - num2 outputs the difference of its inputs. Minus sign means infix difference in ambiguous contexts (when preceded by a complete expression), unless it is preceded by a space and followed by a nonspace. (See also 'MINUS'.)  File: ucblogo.info, Node: MINUS, Next: PRODUCT, Prev: DIFFERENCE, Up: NUMERIC OPERATIONS minus ----- MINUS num - num outputs the negative of its input. Minus sign means unary minus if the previous token is an infix operator or open parenthesis, or it is preceded by a space and followed by a nonspace. There is a difference in binding strength between the two forms: MINUS 3 + 4 means -(3+4) - 3 + 4 means (-3)+4  File: ucblogo.info, Node: PRODUCT, Next: QUOTIENT, Prev: MINUS, Up: NUMERIC OPERATIONS product ------- PRODUCT num1 num2 (PRODUCT num1 num2 num3 ...) num1 * num2 outputs the product of its inputs.  File: ucblogo.info, Node: QUOTIENT, Next: REMAINDER, Prev: PRODUCT, Up: NUMERIC OPERATIONS quotient -------- QUOTIENT num1 num2 (QUOTIENT num) num1 / num2 outputs the quotient of its inputs. The quotient of two integers is an integer if and only if the dividend is a multiple of the divisor. (In other words, QUOTIENT 5 2 is 2.5, not 2, but QUOTIENT 4 2 is 2, not 2.0 -- it does the right thing.) With a single input, 'QUOTIENT' outputs the reciprocal of the input.  File: ucblogo.info, Node: REMAINDER, Next: MODULO, Prev: QUOTIENT, Up: NUMERIC OPERATIONS remainder --------- REMAINDER num1 num2 outputs the remainder on dividing NUM1 by NUM2; both must be integers and the result is an integer with the same sign as NUM1.  File: ucblogo.info, Node: MODULO, Next: INT, Prev: REMAINDER, Up: NUMERIC OPERATIONS modulo ------ MODULO num1 num2 outputs the remainder on dividing NUM1 by NUM2; both must be integers and the result is an integer with the same sign as NUM2.  File: ucblogo.info, Node: INT, Next: ROUND, Prev: MODULO, Up: NUMERIC OPERATIONS int --- INT num outputs its input with fractional part removed, i.e., an integer with the same sign as the input, whose absolute value is the largest integer less than or equal to the absolute value of the input.  File: ucblogo.info, Node: ROUND, Next: SQRT, Prev: INT, Up: NUMERIC OPERATIONS round ----- ROUND num outputs the nearest integer to the input.  File: ucblogo.info, Node: SQRT, Next: POWER, Prev: ROUND, Up: NUMERIC OPERATIONS sqrt ---- SQRT num outputs the square root of the input, which must be nonnegative.  File: ucblogo.info, Node: POWER, Next: EXP, Prev: SQRT, Up: NUMERIC OPERATIONS power ----- POWER num1 num2 outputs NUM1 to the NUM2 power. If NUM1 is negative, then NUM2 must be an integer.  File: ucblogo.info, Node: EXP, Next: LOG10, Prev: POWER, Up: NUMERIC OPERATIONS exp --- EXP num outputs e (2.718281828+) to the input power.  File: ucblogo.info, Node: LOG10, Next: LN, Prev: EXP, Up: NUMERIC OPERATIONS log10 ----- LOG10 num outputs the common logarithm of the input.  File: ucblogo.info, Node: LN, Next: SIN, Prev: LOG10, Up: NUMERIC OPERATIONS ln -- LN num outputs the natural logarithm of the input.  File: ucblogo.info, Node: SIN, Next: RADSIN, Prev: LN, Up: NUMERIC OPERATIONS sin --- SIN degrees outputs the sine of its input, which is taken in degrees.  File: ucblogo.info, Node: RADSIN, Next: COS, Prev: SIN, Up: NUMERIC OPERATIONS radsin ------ RADSIN radians outputs the sine of its input, which is taken in radians.  File: ucblogo.info, Node: COS, Next: RADCOS, Prev: RADSIN, Up: NUMERIC OPERATIONS cos --- COS degrees outputs the cosine of its input, which is taken in degrees.  File: ucblogo.info, Node: RADCOS, Next: ARCTAN, Prev: COS, Up: NUMERIC OPERATIONS radcos ------ RADCOS radians outputs the cosine of its input, which is taken in radians.  File: ucblogo.info, Node: ARCTAN, Next: RADARCTAN, Prev: RADCOS, Up: NUMERIC OPERATIONS arctan ------ ARCTAN num (ARCTAN x y) outputs the arctangent, in degrees, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or 90 or -90 depending on the sign of y, if x is zero.  File: ucblogo.info, Node: RADARCTAN, Next: ISEQ, Prev: ARCTAN, Up: NUMERIC OPERATIONS radarctan --------- RADARCTAN num (RADARCTAN x y) outputs the arctangent, in radians, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or pi/2 or -pi/2 depending on the sign of y, if x is zero. The expression 2*(RADARCTAN 0 1) can be used to get the value of pi.  File: ucblogo.info, Node: ISEQ, Next: RSEQ, Prev: RADARCTAN, Up: NUMERIC OPERATIONS iseq ---- ISEQ from to (library procedure) outputs a list of the integers from FROM to TO, inclusive. ? show iseq 3 7 [3 4 5 6 7] ? show iseq 7 3 [7 6 5 4 3]  File: ucblogo.info, Node: RSEQ, Prev: ISEQ, Up: NUMERIC OPERATIONS rseq ---- RSEQ from to count (library procedure) outputs a list of COUNT equally spaced rational numbers between FROM and TO, inclusive. ? show rseq 3 5 9 [3 3.25 3.5 3.75 4 4.25 4.5 4.75 5] ? show rseq 3 5 5 [3 3.5 4 4.5 5]  File: ucblogo.info, Node: NUMERIC PREDICATES, Next: RANDOM NUMBERS, Prev: NUMERIC OPERATIONS, Up: ARITHMETIC 4.2 Numeric Predicates ====================== * Menu: * LESSP:: * GREATERP:: * LESSEQUALP:: * GREATEREQUALP::  File: ucblogo.info, Node: LESSP, Next: GREATERP, Prev: NUMERIC PREDICATES, Up: NUMERIC PREDICATES lessp ----- LESSP num1 num2 LESS? num1 num2 num1 < num2 outputs 'TRUE' if its first input is strictly less than its second.  File: ucblogo.info, Node: GREATERP, Next: LESSEQUALP, Prev: LESSP, Up: NUMERIC PREDICATES greaterp -------- GREATERP num1 num2 GREATER? num1 num2 num1 > num2 outputs 'TRUE' if its first input is strictly greater than its second.  File: ucblogo.info, Node: LESSEQUALP, Next: GREATEREQUALP, Prev: GREATERP, Up: NUMERIC PREDICATES lessequalp ---------- LESSEQUALP num1 num2 LESSEQUAL? num1 num2 num1 <= num2 outputs 'TRUE' if its first input is less than or equal to its second.  File: ucblogo.info, Node: GREATEREQUALP, Prev: LESSEQUALP, Up: NUMERIC PREDICATES greaterequalp ------------- GREATEREQUALP num1 num2 GREATEREQUAL? num1 num2 num1 >= num2 outputs 'TRUE' if its first input is greater than or equal to its second.  File: ucblogo.info, Node: RANDOM NUMBERS, Next: PRINT FORMATTING, Prev: NUMERIC PREDICATES, Up: ARITHMETIC 4.3 Random Numbers ================== * Menu: * RANDOM:: * RERANDOM::  File: ucblogo.info, Node: RANDOM, Next: RERANDOM, Prev: RANDOM NUMBERS, Up: RANDOM NUMBERS random ------ RANDOM num (RANDOM start end) with one input, outputs a random nonnegative integer less than its input, which must be a positive integer. With two inputs, 'RANDOM' outputs a random integer greater than or equal to the first input, and less than or equal to the second input. Both inputs must be integers, and the first must be less than the second. (RANDOM 0 9) is equivalent to RANDOM 10; (RANDOM 3 8) is equivalent to (RANDOM 6)+3.  File: ucblogo.info, Node: RERANDOM, Prev: RANDOM, Up: RANDOM NUMBERS rerandom -------- RERANDOM (RERANDOM seed) command. Makes the results of 'RANDOM' reproducible. Ordinarily the sequence of random numbers is different each time Logo is used. If you need the same sequence of pseudo-random numbers repeatedly, e.g. to debug a program, say 'RERANDOM' before the first invocation of 'RANDOM'. If you need more than one repeatable sequence, you can give 'RERANDOM' an integer input; each possible input selects a unique sequence of numbers.  File: ucblogo.info, Node: PRINT FORMATTING, Next: BITWISE OPERATIONS, Prev: RANDOM NUMBERS, Up: ARITHMETIC 4.4 Print Formatting ==================== * Menu: * FORM::  File: ucblogo.info, Node: FORM, Prev: PRINT FORMATTING, Up: PRINT FORMATTING form ---- FORM num width precision outputs a word containing a printable representation of NUM, possibly preceded by spaces (and therefore not a number for purposes of performing arithmetic operations), with at least WIDTH characters, including exactly PRECISION digits after the decimal point. (If PRECISION is 0 then there will be no decimal point in the output.) As a debugging feature, (FORM num -1 format) will print the floating point NUM according to the C printf FORMAT, to allow to hex :num op form :num -1 "|%08X %08X| end to allow finding out the exact result of floating point operations. The precise format needed may be machine-dependent.  File: ucblogo.info, Node: BITWISE OPERATIONS, Prev: PRINT FORMATTING, Up: ARITHMETIC 4.5 Bitwise Operations ====================== * Menu: * BITAND:: * BITOR:: * BITXOR:: * BITNOT:: * ASHIFT:: * LSHIFT::  File: ucblogo.info, Node: BITAND, Next: BITOR, Prev: BITWISE OPERATIONS, Up: BITWISE OPERATIONS bitand ------ BITAND num1 num2 (BITAND num1 num2 num3 ...) outputs the bitwise AND of its inputs, which must be integers. *Note AND:: .  File: ucblogo.info, Node: BITOR, Next: BITXOR, Prev: BITAND, Up: BITWISE OPERATIONS bitor ----- BITOR num1 num2 (BITOR num1 num2 num3 ...) outputs the bitwise OR of its inputs, which must be integers. *Note OR:: .  File: ucblogo.info, Node: BITXOR, Next: BITNOT, Prev: BITOR, Up: BITWISE OPERATIONS bitxor ------ BITXOR num1 num2 (BITXOR num1 num2 num3 ...) outputs the bitwise EXCLUSIVE OR of its inputs, which must be integers. *Note OR:: .  File: ucblogo.info, Node: BITNOT, Next: ASHIFT, Prev: BITXOR, Up: BITWISE OPERATIONS bitnot ------ BITNOT num outputs the bitwise NOT of its input, which must be an integer. *Note NOT:: .  File: ucblogo.info, Node: ASHIFT, Next: LSHIFT, Prev: BITNOT, Up: BITWISE OPERATIONS ashift ------ ASHIFT num1 num2 outputs NUM1 arithmetic-shifted to the left by NUM2 bits. If NUM2 is negative, the shift is to the right with sign extension. The inputs must be integers.  File: ucblogo.info, Node: LSHIFT, Prev: ASHIFT, Up: BITWISE OPERATIONS lshift ------ LSHIFT num1 num2 outputs NUM1 logical-shifted to the left by NUM2 bits. If NUM2 is negative, the shift is to the right with zero fill. The inputs must be integers.  File: ucblogo.info, Node: LOGICAL OPERATIONS, Next: GRAPHICS, Prev: ARITHMETIC, Up: Top 5 Logical Operations ******************** * Menu: * AND:: * OR:: * NOT::  File: ucblogo.info, Node: AND, Next: OR, Prev: LOGICAL OPERATIONS, Up: LOGICAL OPERATIONS and === AND tf1 tf2 (AND tf1 tf2 tf3 ...) outputs 'TRUE' if all inputs are 'TRUE', otherwise 'FALSE'. All inputs must be 'TRUE' or 'FALSE'. (Comparison is case-insensitive regardless of the value of 'CASEIGNOREDP'. That is, 'true' or 'True' or 'TRUE' are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a 'TRUE' or 'FALSE' value. List expressions are evaluated from left to right; as soon as a 'FALSE' value is found, the remaining inputs are not examined. Example: MAKE "RESULT AND [NOT (:X = 0)] [(1 / :X) > .5] to avoid the division by zero if the first part is false. *Note CASEIGNOREDP:: . * Menu: * OR:: * NOT::  File: ucblogo.info, Node: OR, Next: NOT, Prev: AND, Up: LOGICAL OPERATIONS or -- OR tf1 tf2 (OR tf1 tf2 tf3 ...) outputs 'TRUE' if any input is 'TRUE', otherwise 'FALSE'. All inputs must be 'TRUE' or 'FALSE'. (Comparison is case-insensitive regardless of the value of 'CASEIGNOREDP'. That is, 'true' or 'True' or 'TRUE' are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a 'TRUE' or 'FALSE' value. List expressions are evaluated from left to right; as soon as a 'TRUE' value is found, the remaining inputs are not examined. Example: IF OR :X=0 [some.long.computation] [...] to avoid the long computation if the first condition is met. *Note CASEIGNOREDP:: .  File: ucblogo.info, Node: NOT, Prev: OR, Up: LOGICAL OPERATIONS not --- NOT tf outputs 'TRUE' if the input is 'FALSE', and vice versa. The input can be a list, in which case it is taken as an expression to run; that expression must produce a 'TRUE' or 'FALSE' value.  File: ucblogo.info, Node: GRAPHICS, Next: WORKSPACE MANAGEMENT, Prev: LOGICAL OPERATIONS, Up: Top 6 Graphics ********** Berkeley Logo provides traditional Logo turtle graphics with one turtle. Multiple turtles, dynamic turtles, and collision detection are not supported. This is the most hardware-dependent part of Logo; some features may exist on some machines but not others. Nevertheless, the goal has been to make Logo programs as portable as possible, rather than to take fullest advantage of the capabilities of each machine. In particular, Logo attempts to scale the screen so that turtle coordinates [-100 -100] and [100 100] fit on the graphics window, and so that the aspect ratio is 1:1. The center of the graphics window (which may or may not be the entire screen, depending on the machine used) is turtle location [0 0]. Positive X is to the right; positive Y is up. Headings (angles) are measured in degrees clockwise from the positive Y axis. (This differs from the common mathematical convention of measuring angles counterclockwise from the positive X axis.) The turtle is represented as an isoceles triangle; the actual turtle position is at the midpoint of the base (the short side). However, the turtle is drawn one step behind its actual position, so that the display of the base of the turtle's triangle does not obscure a line drawn perpendicular to it (as would happen after drawing a square). Colors are, of course, hardware-dependent. However, Logo provides partial hardware independence by interpreting color numbers 0 through 7 uniformly on all computers: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white Where possible, Logo provides additional user-settable colors; how many are available depends on the hardware and operating system environment. If at least 16 colors are available, Logo tries to provide uniform initial settings for the colors 8-15: 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey Logo begins with a black background and white pen. * Menu: * TURTLE MOTION:: * TURTLE MOTION QUERIES:: * TURTLE AND WINDOW CONTROL:: * TURTLE AND WINDOW QUERIES:: * PEN AND BACKGROUND CONTROL:: * PEN QUERIES:: * SAVING AND LOADING PICTURES:: * MOUSE QUERIES::  File: ucblogo.info, Node: TURTLE MOTION, Next: TURTLE MOTION QUERIES, Prev: GRAPHICS, Up: GRAPHICS 6.1 Turtle Motion ================= * Menu: * FORWARD:: * BACK:: * LEFT:: * RIGHT:: * SETPOS:: * SETXY:: * SETX:: * SETY:: * SETHEADING:: * HOME:: * ARC::  File: ucblogo.info, Node: FORWARD, Next: BACK, Prev: TURTLE MOTION, Up: TURTLE MOTION forward ------- FORWARD dist FD dist moves the turtle forward, in the direction that it's facing, by the specified distance (measured in turtle steps).  File: ucblogo.info, Node: BACK, Next: LEFT, Prev: FORWARD, Up: TURTLE MOTION back ---- BACK dist BK dist moves the turtle backward, i.e., exactly opposite to the direction that it's facing, by the specified distance. (The heading of the turtle does not change.)  File: ucblogo.info, Node: LEFT, Next: RIGHT, Prev: BACK, Up: TURTLE MOTION left ---- LEFT degrees LT degrees turns the turtle counterclockwise by the specified angle, measured in degrees (1/360 of a circle).  File: ucblogo.info, Node: RIGHT, Next: SETPOS, Prev: LEFT, Up: TURTLE MOTION right ----- RIGHT degrees RT degrees turns the turtle clockwise by the specified angle, measured in degrees (1/360 of a circle).  File: ucblogo.info, Node: SETPOS, Next: SETXY, Prev: RIGHT, Up: TURTLE MOTION setpos ------ SETPOS pos moves the turtle to an absolute position in the graphics window. The input is a list of two numbers, the X and Y coordinates.  File: ucblogo.info, Node: SETXY, Next: SETX, Prev: SETPOS, Up: TURTLE MOTION setxy ----- SETXY xcor ycor moves the turtle to an absolute position in the graphics window. The two inputs are numbers, the X and Y coordinates.  File: ucblogo.info, Node: SETX, Next: SETY, Prev: SETXY, Up: TURTLE MOTION setx ---- SETX xcor moves the turtle horizontally from its old position to a new absolute horizontal coordinate. The input is the new X coordinate.  File: ucblogo.info, Node: SETY, Next: SETHEADING, Prev: SETX, Up: TURTLE MOTION sety ---- SETY ycor moves the turtle vertically from its old position to a new absolute vertical coordinate. The input is the new Y coordinate.  File: ucblogo.info, Node: SETHEADING, Next: HOME, Prev: SETY, Up: TURTLE MOTION setheading ---------- SETHEADING degrees SETH degrees turns the turtle to a new absolute heading. The input is a number, the heading in degrees clockwise from the positive Y axis.  File: ucblogo.info, Node: HOME, Next: ARC, Prev: SETHEADING, Up: TURTLE MOTION home ---- HOME moves the turtle to the center of the screen. Equivalent to SETPOS [0 0] SETHEADING 0. *Note SETPOS:: , *Note SETHEADING:: .  File: ucblogo.info, Node: ARC, Prev: HOME, Up: TURTLE MOTION arc --- ARC angle radius draws an arc of a circle, with the turtle at the center, with the specified radius, starting at the turtle's heading and extending clockwise through the specified angle. The turtle does not move.  File: ucblogo.info, Node: TURTLE MOTION QUERIES, Next: TURTLE AND WINDOW CONTROL, Prev: TURTLE MOTION, Up: GRAPHICS 6.2 Turtle Motion Queries ========================= * Menu: * POS:: * XCOR:: * YCOR:: * HEADING:: * TOWARDS:: * SCRUNCH::  File: ucblogo.info, Node: POS, Next: XCOR, Prev: TURTLE MOTION QUERIES, Up: TURTLE MOTION QUERIES pos --- POS outputs the turtle's current position, as a list of two numbers, the X and Y coordinates.  File: ucblogo.info, Node: XCOR, Next: YCOR, Prev: POS, Up: TURTLE MOTION QUERIES xcor ---- XCOR (library procedure) outputs a number, the turtle's X coordinate.  File: ucblogo.info, Node: YCOR, Next: HEADING, Prev: XCOR, Up: TURTLE MOTION QUERIES ycor ---- YCOR (library procedure) outputs a number, the turtle's Y coordinate.  File: ucblogo.info, Node: HEADING, Next: TOWARDS, Prev: YCOR, Up: TURTLE MOTION QUERIES heading ------- HEADING outputs a number, the turtle's heading in degrees.  File: ucblogo.info, Node: TOWARDS, Next: SCRUNCH, Prev: HEADING, Up: TURTLE MOTION QUERIES towards ------- TOWARDS pos outputs a number, the heading at which the turtle should be facing so that it would point from its current position to the position given as the input.  File: ucblogo.info, Node: SCRUNCH, Prev: TOWARDS, Up: TURTLE MOTION QUERIES scrunch ------- SCRUNCH outputs a list containing two numbers, the X and Y scrunch factors, as used by 'SETSCRUNCH'. (But note that 'SETSCRUNCH' takes two numbers as inputs, not one list of numbers.) *Note SETSCRUNCH:: .  File: ucblogo.info, Node: TURTLE AND WINDOW CONTROL, Next: TURTLE AND WINDOW QUERIES, Prev: TURTLE MOTION QUERIES, Up: GRAPHICS 6.3 Turtle and Window Control ============================= * Menu: * SHOWTURTLE:: * HIDETURTLE:: * CLEAN:: * CLEARSCREEN:: * WRAP:: * WINDOW:: * FENCE:: * FILL:: * FILLED:: * LABEL:: * SETLABELHEIGHT:: * TEXTSCREEN:: * FULLSCREEN:: * SPLITSCREEN:: * SETSCRUNCH:: * REFRESH:: * NOREFRESH::  File: ucblogo.info, Node: SHOWTURTLE, Next: HIDETURTLE, Prev: TURTLE AND WINDOW CONTROL, Up: TURTLE AND WINDOW CONTROL showturtle ---------- SHOWTURTLE ST makes the turtle visible.  File: ucblogo.info, Node: HIDETURTLE, Next: CLEAN, Prev: SHOWTURTLE, Up: TURTLE AND WINDOW CONTROL hideturtle ---------- HIDETURTLE HT makes the turtle invisible. It's a good idea to do this while you're in the middle of a complicated drawing, because hiding the turtle speeds up the drawing substantially.  File: ucblogo.info, Node: CLEAN, Next: CLEARSCREEN, Prev: HIDETURTLE, Up: TURTLE AND WINDOW CONTROL clean ----- CLEAN erases all lines that the turtle has drawn on the graphics window. The turtle's state (position, heading, pen mode, etc.) is not changed.  File: ucblogo.info, Node: CLEARSCREEN, Next: WRAP, Prev: CLEAN, Up: TURTLE AND WINDOW CONTROL clearscreen ----------- CLEARSCREEN CS erases the graphics window and sends the turtle to its initial position and heading. Like 'HOME' and 'CLEAN' together. *Note HOME:: .  File: ucblogo.info, Node: WRAP, Next: WINDOW, Prev: CLEARSCREEN, Up: TURTLE AND WINDOW CONTROL wrap ---- WRAP tells the turtle to enter wrap mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will "wrap around" and reappear at the opposite edge of the window. The top edge wraps to the bottom edge, while the left edge wraps to the right edge. (So the window is topologically equivalent to a torus.) This is the turtle's initial mode. Compare 'WINDOW' and 'FENCE'. *Note FENCE:: .  File: ucblogo.info, Node: WINDOW, Next: FENCE, Prev: WRAP, Up: TURTLE AND WINDOW CONTROL window ------ WINDOW tells the turtle to enter window mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move offscreen. The visible graphics window is considered as just part of an infinite graphics plane; the turtle can be anywhere on the plane. (If you lose the turtle, 'HOME' will bring it back to the center of the window.) Compare 'WRAP' and 'FENCE'. *Note HOME:: .  File: ucblogo.info, Node: FENCE, Next: FILL, Prev: WINDOW, Up: TURTLE AND WINDOW CONTROL fence ----- FENCE tells the turtle to enter fence mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move as far as it can and then stop at the edge with an "out of bounds" error message. Compare 'WRAP' and 'WINDOW'. *Note WRAP:: .  File: ucblogo.info, Node: FILL, Next: FILLED, Prev: FENCE, Up: TURTLE AND WINDOW CONTROL fill ---- FILL fills in a region of the graphics window containing the turtle and bounded by lines that have been drawn earlier. This is not portable; it doesn't work for all machines, and may not work exactly the same way on different machines.  File: ucblogo.info, Node: FILLED, Next: LABEL, Prev: FILL, Up: TURTLE AND WINDOW CONTROL filled ------ FILLED color instructions runs the instructions, remembering all points visited by turtle motion commands, starting _and ending_ with the turtle's initial position. Then draws (ignoring penmode) the resulting polygon, in the current pen color, filling the polygon with the given color, which can be a color number or an RGB list. The instruction list cannot include another FILLED invocation. (wxWidgets only)  File: ucblogo.info, Node: LABEL, Next: SETLABELHEIGHT, Prev: FILLED, Up: TURTLE AND WINDOW CONTROL label ----- LABEL text takes a word or list as input, and prints the input on the graphics window, starting at the turtle's position.  File: ucblogo.info, Node: SETLABELHEIGHT, Next: TEXTSCREEN, Prev: LABEL, Up: TURTLE AND WINDOW CONTROL setlabelheight -------------- SETLABELHEIGHT height command (wxWidgets only). Takes a positive integer argument and tries to set the font size so that the character height (including descenders) is that many turtle steps. This will be different from the number of screen pixels if 'SETSCRUNCH' has been used. Also, note that 'SETSCRUNCH' changes the font size to try to preserve this height in turtle steps. Note that the query operation corresponding to this command is 'LABELSIZE', not 'LABELHEIGHT', because it tells you the width as well as the height of characters in the current font.  File: ucblogo.info, Node: TEXTSCREEN, Next: FULLSCREEN, Prev: SETLABELHEIGHT, Up: TURTLE AND WINDOW CONTROL textscreen ---------- TEXTSCREEN TS rearranges the size and position of windows to maximize the space available in the text window (the window used for interaction with Logo). The details differ among machines. Compare 'SPLITSCREEN' and 'FULLSCREEN'. *Note SPLITSCREEN:: .  File: ucblogo.info, Node: FULLSCREEN, Next: SPLITSCREEN, Prev: TEXTSCREEN, Up: TURTLE AND WINDOW CONTROL fullscreen ---------- FULLSCREEN FS rearranges the size and position of windows to maximize the space available in the graphics window. The details differ among machines. Compare 'SPLITSCREEN' and 'TEXTSCREEN'. Since there must be a text window to allow printing (including the printing of the Logo prompt), Logo automatically switches from fullscreen to splitscreen whenever anything is printed. In the DOS version, switching from fullscreen to splitscreen loses the part of the picture that's hidden by the text window. [This design decision follows from the scarcity of memory, so that the extra memory to remember an invisible part of a drawing seems too expensive.]  File: ucblogo.info, Node: SPLITSCREEN, Next: SETSCRUNCH, Prev: FULLSCREEN, Up: TURTLE AND WINDOW CONTROL splitscreen ----------- SPLITSCREEN SS rearranges the size and position of windows to allow some room for text interaction while also keeping most of the graphics window visible. The details differ among machines. Compare 'TEXTSCREEN' and 'FULLSCREEN'. *Note TEXTSCREEN:: .  File: ucblogo.info, Node: SETSCRUNCH, Next: REFRESH, Prev: SPLITSCREEN, Up: TURTLE AND WINDOW CONTROL setscrunch ---------- SETSCRUNCH xscale yscale adjusts the aspect ratio and scaling of the graphics display. After this command is used, all further turtle motion will be adjusted by multiplying the horizontal and vertical extent of the motion by the two numbers given as inputs. For example, after the instruction SETSCRUNCH 2 1 motion at a heading of 45 degrees will move twice as far horizontally as vertically. If your squares don't come out square, try this. (Alternatively, you can deliberately misadjust the aspect ratio to draw an ellipse.) For all modern computers, both scale factors are initially 1. For DOS machines, the scale factors are initially set according to what the hardware claims the aspect ratio is, but the hardware sometimes lies. For DOS, the values set by 'SETSCRUNCH' are remembered in a file (called 'scrunch.dat') and are automatically put into effect when a Logo session begins.  File: ucblogo.info, Node: REFRESH, Next: NOREFRESH, Prev: SETSCRUNCH, Up: TURTLE AND WINDOW CONTROL refresh ------- REFRESH (command) tells Logo to remember the turtle's motions so that they can be used for high-resolution printing (wxWidgets) or to refresh the graphics window if it is moved, resized, or overlayed (non-wxWidgets). This is the default.  File: ucblogo.info, Node: NOREFRESH, Prev: REFRESH, Up: TURTLE AND WINDOW CONTROL norefresh --------- NOREFRESH (command) tells Logo not to remember the turtle's motions, which may be useful to save time and memory if your program is interactive or animated, rather than drawing a static picture you'll want to print later (wxWidgets). In non-wxWidgets versions, using NOREFRESH may prevent Logo from restoring the graphics image after the window is moved, resized, or overlayed.  File: ucblogo.info, Node: TURTLE AND WINDOW QUERIES, Next: PEN AND BACKGROUND CONTROL, Prev: TURTLE AND WINDOW CONTROL, Up: GRAPHICS 6.4 Turtle and Window Queries ============================= * Menu: * SHOWNP:: * SCREENMODE:: * TURTLEMODE:: * LABELSIZE::  File: ucblogo.info, Node: SHOWNP, Next: SCREENMODE, Prev: TURTLE AND WINDOW QUERIES, Up: TURTLE AND WINDOW QUERIES shownp ------ SHOWNP SHOWN? outputs 'TRUE' if the turtle is shown (visible), 'FALSE' if the turtle is hidden. See 'SHOWTURTLE' and 'HIDETURTLE'. *Note SHOWTURTLE:: , *note HIDETURTLE:: .  File: ucblogo.info, Node: SCREENMODE, Next: TURTLEMODE, Prev: SHOWNP, Up: TURTLE AND WINDOW QUERIES screenmode ---------- SCREENMODE outputs the word 'TEXTSCREEN', 'SPLITSCREEN', or 'FULLSCREEN' depending on the current screen mode.  File: ucblogo.info, Node: TURTLEMODE, Next: LABELSIZE, Prev: SCREENMODE, Up: TURTLE AND WINDOW QUERIES turtlemode ---------- TURTLEMODE outputs the word 'WRAP', 'FENCE', or 'WINDOW' depending on the current turtle mode.  File: ucblogo.info, Node: LABELSIZE, Prev: TURTLEMODE, Up: TURTLE AND WINDOW QUERIES labelsize --------- LABELSIZE (wxWidgets only) outputs a list of two positive integers, the width and height of characters displayed by 'LABEL' measured in turtle steps (which will be different from screen pixels if 'SETSCRUNCH' has been used). There is no 'SETLABELSIZE' because the width and height of a font are not separately controllable, so the inverse of this operation is 'SETLABELHEIGHT', which takes just one number for the desired height.  File: ucblogo.info, Node: PEN AND BACKGROUND CONTROL, Next: PEN QUERIES, Prev: TURTLE AND WINDOW QUERIES, Up: GRAPHICS 6.5 Pen and Background Control ============================== The turtle carries a pen that can draw pictures. At any time the pen can be UP (in which case moving the turtle does not change what's on the graphics screen) or DOWN (in which case the turtle leaves a trace). If the pen is down, it can operate in one of three modes: PAINT (so that it draws lines when the turtle moves), ERASE (so that it erases any lines that might have been drawn on or through that path earlier), or REVERSE (so that it inverts the status of each point along the turtle's path). * Menu: * PENDOWN:: * PENUP:: * PENPAINT:: * PENERASE:: * PENREVERSE:: * SETPENCOLOR:: * SETPALETTE:: * SETPENSIZE:: * SETPENPATTERN:: * SETPEN:: * SETBACKGROUND::  File: ucblogo.info, Node: PENDOWN, Next: PENUP, Prev: PEN AND BACKGROUND CONTROL, Up: PEN AND BACKGROUND CONTROL pendown ------- PENDOWN PD sets the pen's position to 'DOWN', without changing its mode.  File: ucblogo.info, Node: PENUP, Next: PENPAINT, Prev: PENDOWN, Up: PEN AND BACKGROUND CONTROL penup ----- PENUP PU sets the pen's position to 'UP', without changing its mode.  File: ucblogo.info, Node: PENPAINT, Next: PENERASE, Prev: PENUP, Up: PEN AND BACKGROUND CONTROL penpaint -------- PENPAINT PPT sets the pen's position to 'DOWN' and mode to 'PAINT'.  File: ucblogo.info, Node: PENERASE, Next: PENREVERSE, Prev: PENPAINT, Up: PEN AND BACKGROUND CONTROL penerase -------- PENERASE PE sets the pen's position to 'DOWN' and mode to 'ERASE'. *Note ERASE:: .  File: ucblogo.info, Node: PENREVERSE, Next: SETPENCOLOR, Prev: PENERASE, Up: PEN AND BACKGROUND CONTROL penreverse ---------- PENREVERSE PX sets the pen's position to 'DOWN' and mode to 'REVERSE'. (This may interact in system-dependent ways with use of color.) *Note REVERSE:: .  File: ucblogo.info, Node: SETPENCOLOR, Next: SETPALETTE, Prev: PENREVERSE, Up: PEN AND BACKGROUND CONTROL setpencolor ----------- SETPENCOLOR colornumber.or.rgblist SETPC colornumber.or.rgblist sets the pen color to the given number, which must be a nonnegative integer. There are initial assignments for the first 16 colors: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey but other colors can be assigned to numbers by the 'PALETTE' command. Alternatively, sets the pen color to the given RGB values (a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color).  File: ucblogo.info, Node: SETPALETTE, Next: SETPENSIZE, Prev: SETPENCOLOR, Up: PEN AND BACKGROUND CONTROL setpalette ---------- SETPALETTE colornumber rgblist sets the actual color corresponding to a given number, if allowed by the hardware and operating system. Colornumber must be an integer greater than or equal to 8. (Logo tries to keep the first 8 colors constant.) The second input is a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color.  File: ucblogo.info, Node: SETPENSIZE, Next: SETPENPATTERN, Prev: SETPALETTE, Up: PEN AND BACKGROUND CONTROL setpensize ---------- SETPENSIZE size sets the thickness of the pen. The input is either a single positive integer or a list of two positive integers (for horizontal and vertical thickness). Some versions pay no attention to the second number, but always have a square pen.  File: ucblogo.info, Node: SETPENPATTERN, Next: SETPEN, Prev: SETPENSIZE, Up: PEN AND BACKGROUND CONTROL setpenpattern ------------- SETPENPATTERN pattern sets hardware-dependent pen characteristics. This command is not guaranteed compatible between implementations on different machines.  File: ucblogo.info, Node: SETPEN, Next: SETBACKGROUND, Prev: SETPENPATTERN, Up: PEN AND BACKGROUND CONTROL setpen ------ SETPEN list (library procedure) sets the pen's position, mode, thickness, and hardware-dependent characteristics according to the information in the input list, which should be taken from an earlier invocation of 'PEN'. *Note PEN:: .  File: ucblogo.info, Node: SETBACKGROUND, Prev: SETPEN, Up: PEN AND BACKGROUND CONTROL setbackground ------------- SETBACKGROUND colornumber.or.rgblist SETBG colornumber.or.rgblist set the screen background color by slot number or RGB values. See 'SETPENCOLOR' for details. *Note SETPENCOLOR:: .  File: ucblogo.info, Node: PEN QUERIES, Next: SAVING AND LOADING PICTURES, Prev: PEN AND BACKGROUND CONTROL, Up: GRAPHICS 6.6 Pen Queries =============== * Menu: * PENDOWNP:: * PENMODE:: * PENCOLOR:: * PALETTE:: * PENSIZE:: * PEN:: * BACKGROUND::  File: ucblogo.info, Node: PENDOWNP, Next: PENMODE, Prev: PEN QUERIES, Up: PEN QUERIES pendownp -------- PENDOWNP PENDOWN? outputs 'TRUE' if the pen is down, 'FALSE' if it's up.  File: ucblogo.info, Node: PENMODE, Next: PENCOLOR, Prev: PENDOWNP, Up: PEN QUERIES penmode ------- PENMODE outputs one of the words 'PAINT', 'ERASE', or 'REVERSE' according to the current pen mode. *Note ERASE:: , *note REVERSE:: .  File: ucblogo.info, Node: PENCOLOR, Next: PALETTE, Prev: PENMODE, Up: PEN QUERIES pencolor -------- PENCOLOR PC outputs a color number, a nonnegative integer that is associated with a particular color, or a list of RGB values if such a list was used as the most recent input to 'SETPENCOLOR'. There are initial assignments for the first 16 colors: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey but other colors can be assigned to numbers by the 'PALETTE' command.  File: ucblogo.info, Node: PALETTE, Next: PENSIZE, Prev: PENCOLOR, Up: PEN QUERIES palette ------- PALETTE colornumber outputs a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the color associated with the given number.  File: ucblogo.info, Node: PENSIZE, Next: PEN, Prev: PALETTE, Up: PEN QUERIES pensize ------- PENSIZE outputs a list of two positive integers, specifying the horizontal and vertical thickness of the turtle pen. (In some implementations, including wxWidgets, the two numbers are always equal.) PENPATTERN outputs system-specific pen information.  File: ucblogo.info, Node: PEN, Next: BACKGROUND, Prev: PENSIZE, Up: PEN QUERIES pen --- PEN (library procedure) outputs a list containing the pen's position, mode, thickness, and hardware-specific characteristics, for use by 'SETPEN'. *Note SETPEN:: .  File: ucblogo.info, Node: BACKGROUND, Prev: PEN, Up: PEN QUERIES background ---------- BACKGROUND BG outputs the graphics background color, either as a slot number or as an RGB list, whichever way it was set. (See 'PENCOLOR'.)  File: ucblogo.info, Node: SAVING AND LOADING PICTURES, Next: MOUSE QUERIES, Prev: PEN QUERIES, Up: GRAPHICS 6.7 Saving and Loading Pictures =============================== * Menu: * SAVEPICT:: * LOADPICT:: * EPSPICT::  File: ucblogo.info, Node: SAVEPICT, Next: LOADPICT, Prev: SAVING AND LOADING PICTURES, Up: SAVING AND LOADING PICTURES savepict -------- SAVEPICT filename command. Writes a file with the specified name containing the state of the graphics window, including any nonstandard color palette settings, in Logo's internal format. This picture can be restored to the screen using 'LOADPICT'. The format is not portable between platforms, nor is it readable by other programs. *note EPSPICT:: to export Logo graphics for other programs.  File: ucblogo.info, Node: LOADPICT, Next: EPSPICT, Prev: SAVEPICT, Up: SAVING AND LOADING PICTURES loadpict -------- LOADPICT filename command. Reads the specified file, which must have been written by a 'SAVEPICT' command, and restores the graphics window and color palette settings to the values stored in the file. Any drawing previously on the screen is cleared. *Note SAVEPICT:: .  File: ucblogo.info, Node: EPSPICT, Prev: LOADPICT, Up: SAVING AND LOADING PICTURES epspict ------- EPSPICT filename command. Writes a file with the specified name, containing an Encapsulated Postscript (EPS) representation of the state of the graphics window. This file can be imported into other programs that understand EPS format. Restrictions: the drawing cannot use 'FILL', 'PENERASE', or 'PENREVERSE'; any such instructions will be ignored in the translation to Postscript form. *Note FILL:: , *Note PENERASE:: , *Note PENREVERSE:: .  File: ucblogo.info, Node: MOUSE QUERIES, Prev: SAVING AND LOADING PICTURES, Up: GRAPHICS 6.8 Mouse Queries ================= * Menu: * MOUSEPOS:: * CLICKPOS:: * BUTTONP:: * BUTTON::  File: ucblogo.info, Node: MOUSEPOS, Next: CLICKPOS, Prev: MOUSE QUERIES, Up: MOUSE QUERIES mousepos -------- MOUSEPOS outputs the coordinates of the mouse, provided that it's within the graphics window, in turtle coordinates. If the mouse is outside the graphics window, then the last position within the window is returned. Exception: If a mouse button is pressed within the graphics window and held while the mouse is dragged outside the window, the mouse's position is returned as if the window were big enough to include it.  File: ucblogo.info, Node: CLICKPOS, Next: BUTTONP, Prev: MOUSEPOS, Up: MOUSE QUERIES clickpos -------- CLICKPOS outputs the coordinates that the mouse was at when a mouse button was most recently pushed, provided that that position was within the graphics window, in turtle coordinates. (wxWidgets only)  File: ucblogo.info, Node: BUTTONP, Next: BUTTON, Prev: CLICKPOS, Up: MOUSE QUERIES buttonp ------- BUTTONP BUTTON? outputs 'TRUE' if a mouse button is down and the mouse is over the graphics window. Once the button is down, 'BUTTONP' remains true until the button is released, even if the mouse is dragged out of the graphics window.  File: ucblogo.info, Node: BUTTON, Prev: BUTTONP, Up: MOUSE QUERIES button ------ BUTTON outputs 0 if no mouse button has been pushed inside the Logo window since the last call to 'BUTTON'. Otherwise, it outputs an integer between 1 and 3 indicating which button was most recently pressed. Ordinarily 1 means left, 2 means right, and 3 means center, but operating systems may reconfigure these.  File: ucblogo.info, Node: WORKSPACE MANAGEMENT, Next: CONTROL STRUCTURES, Prev: GRAPHICS, Up: Top 7 Workspace Management ********************** * Menu: * PROCEDURE DEFINITION:: * VARIABLE DEFINITION:: * PROPERTY LISTS:: * WORKSPACE PREDICATES:: * WORKSPACE QUERIES:: * WORKSPACE INSPECTION:: * WORKSPACE CONTROL::  File: ucblogo.info, Node: PROCEDURE DEFINITION, Next: VARIABLE DEFINITION, Prev: WORKSPACE MANAGEMENT, Up: WORKSPACE MANAGEMENT 7.1 Procedure Definition ======================== * Menu: * TO:: * DEFINE:: * TEXT:: * FULLTEXT:: * COPYDEF::  File: ucblogo.info, Node: TO, Next: DEFINE, Prev: PROCEDURE DEFINITION, Up: PROCEDURE DEFINITION to -- TO procname :input1 :input2 ... (special form) command. Prepares Logo to accept a procedure definition. The procedure will be named PROCNAME and there must not already be a procedure by that name. The inputs will be called INPUT1 etc. Any number of inputs are allowed, including none. Names of procedures and inputs are case-insensitive. Unlike every other Logo procedure, TO takes as its inputs the actual words typed in the instruction line, as if they were all quoted, rather than the results of evaluating expressions to provide the inputs. (That's what "special form" means.) This version of Logo allows variable numbers of inputs to a procedure. After the procedure name come four kinds of things, _in this order_: 1. 0 or more REQUIRED inputs :FOO :FROBOZZ 2. 0 or more OPTIONAL inputs [:BAZ 87] [:THINGO 5+9] 3. 0 or 1 REST input [:GARPLY] 4. 0 or 1 DEFAULT number 5 Every procedure has a MINIMUM, DEFAULT, and MAXIMUM number of inputs. (The latter can be infinite.) The MINIMUM number of inputs is the number of required inputs, which must come first. A required input is indicated by the :inputname notation. After all the required inputs can be zero or more optional inputs, each of which is represented by the following notation: [:inputname default.value.expression] When the procedure is invoked, if actual inputs are not supplied for these optional inputs, the DEFAULT VALUE EXPRESSIONs are evaluated to set values for the corresponding input names. The inputs are processed from left to right, so a default value expression can be based on earlier inputs. Example: to proc :inlist [:startvalue first :inlist] If the procedure is invoked by saying proc [a b c] then the variable 'inlist' will have the value [A B C] and the variable 'startvalue' will have the value A. If the procedure is invoked by saying (proc [a b c] "x) then 'inlist' will have the value [A B C] and 'startvalue' will have the value X. After all the required and optional input can come a single "rest" input, represented by the following notation: [:inputname] This is a rest input rather than an optional input because there is no default value expression. There can be at most one rest input. When the procedure is invoked, the value of this INPUTNAME will be a list containing all of the actual inputs provided that were not used for required or optional inputs. Example: to proc :in1 [:in2 "foo] [:in3 "baz] [:in4] If this procedure is invoked by saying proc "x then 'in1' has the value X, 'in2' has the value FOO, 'in3' has the value BAZ, and 'in4' has the value [] (the empty list). If it's invoked by saying (proc "a "b "c "d "e) then 'in1' has the value A, 'in2' has the value B, 'in3' has the value C, and 'in4' has the value [D E]. The _maximum_ number of inputs for a procedure is infinite if a rest input is given; otherwise, it is the number of required inputs plus the number of optional inputs. The _default_ number of inputs for a procedure, which is the number of inputs that it will accept if its invocation is not enclosed in parentheses, is ordinarily equal to the minimum number. If you want a different default number you can indicate that by putting the desired default number as the last thing on the 'TO' line. example: to proc :in1 [:in2 "foo] [:in3] 3 This procedure has a minimum of one input, a default of three inputs, and an infinite maximum. Logo responds to the 'TO' command by entering procedure definition mode. The prompt character changes from '?' to '>' and whatever instructions you type become part of the definition until you type a line containing only the word 'END'.  File: ucblogo.info, Node: DEFINE, Next: TEXT, Prev: TO, Up: PROCEDURE DEFINITION define ------ DEFINE procname text command. Defines a procedure with name PROCNAME and text TEXT. If there is already a procedure with the same name, the new definition replaces the old one. The TEXT input must be a list whose members are lists. The first member is a list of inputs; it looks like a 'TO' line but without the word 'TO', without the procedure name, and without the colons before input names. In other words, the members of this first sublist are words for the names of required inputs and lists for the names of optional or rest inputs. The remaining sublists of the TEXT input make up the body of the procedure, with one sublist for each instruction line of the body. (There is no 'END' line in the text input.) It is an error to redefine a primitive procedure unless the variable 'REDEFP' has the value 'TRUE'. *Note REDEFP:: .  File: ucblogo.info, Node: TEXT, Next: FULLTEXT, Prev: DEFINE, Up: PROCEDURE DEFINITION text ---- TEXT procname outputs the text of the procedure named PROCNAME in the form expected by 'DEFINE': a list of lists, the first of which describes the inputs to the procedure and the rest of which are the lines of its body. The text does not reflect formatting information used when the procedure was defined, such as continuation lines and extra spaces.  File: ucblogo.info, Node: FULLTEXT, Next: COPYDEF, Prev: TEXT, Up: PROCEDURE DEFINITION fulltext -------- FULLTEXT procname outputs a representation of the procedure PROCNAME in which formatting information is preserved. If the procedure was defined with 'TO', 'EDIT', or 'LOAD', then the output is a list of words. Each word represents one entire line of the definition in the form output by 'READWORD', including extra spaces and continuation lines. The last member of the output represents the 'END' line. If the procedure was defined with 'DEFINE', then the output is a list of lists. If these lists are printed, one per line, the result will look like a definition using 'TO'. Note: the output from 'FULLTEXT' is not suitable for use as input to 'DEFINE'! *Note TO:: , *note EDIT:: , *note LOAD:: , *note DEFINE:: .  File: ucblogo.info, Node: COPYDEF, Prev: FULLTEXT, Up: PROCEDURE DEFINITION copydef ------- COPYDEF newname oldname command. Makes NEWNAME a procedure identical to OLDNAME. The latter may be a primitive. If NEWNAME was already defined, its previous definition is lost. If NEWNAME was already a primitive, the redefinition is not permitted unless the variable 'REDEFP' has the value 'TRUE'. Note: dialects of Logo differ as to the order of inputs to 'COPYDEF'. This dialect uses "'MAKE' order," not "'NAME' order." *Note REDEFP:: , *note SAVE:: , *note PO:: , *note POT:: .  File: ucblogo.info, Node: VARIABLE DEFINITION, Next: PROPERTY LISTS, Prev: PROCEDURE DEFINITION, Up: WORKSPACE MANAGEMENT 7.2 Variable Definition ======================= * Menu: * MAKE:: * NAME:: * LOCAL:: * LOCALMAKE:: * THING:: * GLOBAL::  File: ucblogo.info, Node: MAKE, Next: NAME, Prev: VARIABLE DEFINITION, Up: VARIABLE DEFINITION make ---- MAKE varname value command. Assigns the value VALUE to the variable named VARNAME, which must be a word. Variable names are case-insensitive. If a variable with the same name already exists, the value of that variable is changed. If not, a new global variable is created.  File: ucblogo.info, Node: NAME, Next: LOCAL, Prev: MAKE, Up: VARIABLE DEFINITION name ---- NAME value varname (library procedure) command. Same as 'MAKE' but with the inputs in reverse order.  File: ucblogo.info, Node: LOCAL, Next: LOCALMAKE, Prev: NAME, Up: VARIABLE DEFINITION local ----- LOCAL varname LOCAL varnamelist (LOCAL varname1 varname2 ...) command. Accepts as inputs one or more words, or a list of words. A variable is created for each of these words, with that word as its name. The variables are local to the currently running procedure. Logo variables follow dynamic scope rules; a variable that is local to a procedure is available to any subprocedure invoked by that procedure. The variables created by 'LOCAL' have no initial value; they must be assigned a value (e.g., with 'MAKE') before the procedure attempts to read their value. *Note MAKE:: .  File: ucblogo.info, Node: LOCALMAKE, Next: THING, Prev: LOCAL, Up: VARIABLE DEFINITION localmake --------- LOCALMAKE varname value (library procedure) command. Makes the named variable local, like 'LOCAL', and assigns it the given value, like 'MAKE'. *Note LOCAL:: , *Note MAKE:: .  File: ucblogo.info, Node: THING, Next: GLOBAL, Prev: LOCALMAKE, Up: VARIABLE DEFINITION thing ----- THING varname :quoted.varname outputs the value of the variable whose name is the input. If there is more than one such variable, the innermost local variable of that name is chosen. The colon notation is an abbreviation not for 'THING' but for the combination thing " so that :FOO means THING "FOO.  File: ucblogo.info, Node: GLOBAL, Prev: THING, Up: VARIABLE DEFINITION global ------ GLOBAL varname GLOBAL varnamelist (GLOBAL varname1 varname2 ...) command. Accepts as inputs one or more words, or a list of words. A global variable is created for each of these words, with that word as its name. The only reason this is necessary is that you might want to use the "setter" notation 'SETXYZ' for a variable 'XYZ' that does not already have a value; GLOBAL "XYZ makes that legal. Note: If there is currently a local variable of the same name, this command does *not* make Logo use the global value instead of the local one.  File: ucblogo.info, Node: PROPERTY LISTS, Next: WORKSPACE PREDICATES, Prev: VARIABLE DEFINITION, Up: WORKSPACE MANAGEMENT 7.3 Property Lists ================== Note: Names of property lists are always case-insensitive. Names of individual properties are case-sensitive or case-insensitive depending on the value of 'CASEIGNOREDP', which is 'TRUE' by default. *Note CASEIGNOREDP:: . In principle, every possible name is the name of a property list, which is initially empty. So Logo never gives a "no such property list" error, as it would for undefined procedure or variable names. But the primitive procedures that deal with "all" property lists ('CONTENTS', 'PLISTS', etc.) list only nonempty ones. To "erase" a property list *note ERASE:: means to make it empty, removing all properties from it. * Menu: * PPROP:: * GPROP:: * REMPROP:: * PLIST::  File: ucblogo.info, Node: PPROP, Next: GPROP, Prev: PROPERTY LISTS, Up: PROPERTY LISTS pprop ----- PPROP plistname propname value command. Adds a property to the PLISTNAME property list with name PROPNAME and value VALUE.  File: ucblogo.info, Node: GPROP, Next: REMPROP, Prev: PPROP, Up: PROPERTY LISTS gprop ----- GPROP plistname propname outputs the value of the PROPNAME property in the PLISTNAME property list, or the empty list if there is no such property.  File: ucblogo.info, Node: REMPROP, Next: PLIST, Prev: GPROP, Up: PROPERTY LISTS remprop ------- REMPROP plistname propname command. Removes the property named PROPNAME from the property list named PLISTNAME.  File: ucblogo.info, Node: PLIST, Prev: REMPROP, Up: PROPERTY LISTS plist ----- PLIST plistname outputs a list whose odd-numbered members are the names, and whose even-numbered members are the values, of the properties in the property list named PLISTNAME. The output is a copy of the actual property list; changing properties later will not magically change a list output earlier by 'PLIST'.  File: ucblogo.info, Node: WORKSPACE PREDICATES, Next: WORKSPACE QUERIES, Prev: PROPERTY LISTS, Up: WORKSPACE MANAGEMENT 7.4 Workspace Predicates ======================== * Menu: * PROCEDUREP:: * PRIMITIVEP:: * DEFINEDP:: * NAMEP:: * PLISTP::  File: ucblogo.info, Node: PROCEDUREP, Next: PRIMITIVEP, Prev: WORKSPACE PREDICATES, Up: WORKSPACE PREDICATES procedurep ---------- PROCEDUREP name PROCEDURE? name outputs 'TRUE' if the input is the name of a procedure.  File: ucblogo.info, Node: PRIMITIVEP, Next: DEFINEDP, Prev: PROCEDUREP, Up: WORKSPACE PREDICATES primitivep ---------- PRIMITIVEP name PRIMITIVE? name outputs 'TRUE' if the input is the name of a primitive procedure (one built into Logo). Note that some of the procedures described in this document are library procedures, not primitives.  File: ucblogo.info, Node: DEFINEDP, Next: NAMEP, Prev: PRIMITIVEP, Up: WORKSPACE PREDICATES definedp -------- DEFINEDP name DEFINED? name outputs 'TRUE' if the input is the name of a user-defined procedure, including a library procedure.  File: ucblogo.info, Node: NAMEP, Next: PLISTP, Prev: DEFINEDP, Up: WORKSPACE PREDICATES namep ----- NAMEP name NAME? name outputs 'TRUE' if the input is the name of a variable.  File: ucblogo.info, Node: PLISTP, Prev: NAMEP, Up: WORKSPACE PREDICATES plistp ------ PLISTP name PLIST? name outputs 'TRUE' if the input is the name of a _nonempty_ property list. (In principle every word is the name of a property list; if you haven't put any properties in it, 'PLIST' of that name outputs an empty list, rather than giving an error message.)  File: ucblogo.info, Node: WORKSPACE QUERIES, Next: WORKSPACE INSPECTION, Prev: WORKSPACE PREDICATES, Up: WORKSPACE MANAGEMENT 7.5 Workspace Queries ===================== * Menu: * CONTENTS:: * BURIED:: * TRACED:: * STEPPED:: * PROCEDURES:: * PRIMITIVES:: * NAMES:: * PLISTS:: * NAMELIST:: * PLLIST:: * ARITY:: * NODES:: Note: All procedures whose input is indicated as CONTENTSLIST will accept a single word (taken as a procedure name), a list of words (taken as names of procedures), or a list of three lists as described under the 'CONTENTS' command above.  File: ucblogo.info, Node: CONTENTS, Next: BURIED, Prev: WORKSPACE QUERIES, Up: WORKSPACE QUERIES contents -------- CONTENTS outputs a "contents list," i.e., a list of three lists containing names of defined procedures, variables, and property lists respectively. This list includes all unburied named items in the workspace.  File: ucblogo.info, Node: BURIED, Next: TRACED, Prev: CONTENTS, Up: WORKSPACE QUERIES buried ------ BURIED outputs a contents list including all buried named items in the workspace.  File: ucblogo.info, Node: TRACED, Next: STEPPED, Prev: BURIED, Up: WORKSPACE QUERIES traced ------ TRACED outputs a contents list including all traced named items in the workspace.  File: ucblogo.info, Node: STEPPED, Next: PROCEDURES, Prev: TRACED, Up: WORKSPACE QUERIES stepped ------- STEPPED outputs a contents list including all stepped named items in the workspace.  File: ucblogo.info, Node: PROCEDURES, Next: PRIMITIVES, Prev: STEPPED, Up: WORKSPACE QUERIES procedures ---------- PROCEDURES outputs a list of the names of all unburied user-defined procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.)  File: ucblogo.info, Node: PRIMITIVES, Next: NAMES, Prev: PROCEDURES, Up: WORKSPACE QUERIES primitives ---------- PRIMITIVES outputs a list of the names of all primitive procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.)  File: ucblogo.info, Node: NAMES, Next: PLISTS, Prev: PRIMITIVES, Up: WORKSPACE QUERIES names ----- NAMES outputs a contents list consisting of an empty list (indicating no procedure names) followed by a list of all unburied variable names in the workspace.  File: ucblogo.info, Node: PLISTS, Next: NAMELIST, Prev: NAMES, Up: WORKSPACE QUERIES plists ------ PLISTS outputs a contents list consisting of two empty lists (indicating no procedures or variables) followed by a list of all unburied nonempty property lists in the workspace.  File: ucblogo.info, Node: NAMELIST, Next: PLLIST, Prev: PLISTS, Up: WORKSPACE QUERIES namelist -------- NAMELIST varname (library procedure) NAMELIST varnamelist outputs a contents list consisting of an empty list followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input.  File: ucblogo.info, Node: PLLIST, Next: ARITY, Prev: NAMELIST, Up: WORKSPACE QUERIES pllist ------ PLLIST plname (library procedure) PLLIST plnamelist outputs a contents list consisting of two empty lists followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input. *Note CONTENTS:: .  File: ucblogo.info, Node: ARITY, Next: NODES, Prev: PLLIST, Up: WORKSPACE QUERIES arity ----- ARITY procedurename outputs a list of three numbers: the minimum, default, and maximum number of inputs for the procedure whose name is the input. It is an error if there is no such procedure. A maximum of -1 means that the number of inputs is unlimited.  File: ucblogo.info, Node: NODES, Prev: ARITY, Up: WORKSPACE QUERIES nodes ----- NODES outputs a list of two numbers. The first represents the number of nodes of memory currently in use. The second shows the maximum number of nodes that have been in use at any time since the last invocation of 'NODES'. (A node is a small block of computer memory as used by Logo. Each number uses one node. Each non-numeric word uses one node, plus some non-node memory for the characters in the word. Each array takes one node, plus some non-node memory, as well as the memory required by its elements. Each list requires one node per element, as well as the memory within the elements.) If you want to track the memory use of an algorithm, it is best if you invoke 'GC' at the beginning of each iteration, since otherwise the maximum will include storage that is unused but not yet collected.  File: ucblogo.info, Node: WORKSPACE INSPECTION, Next: WORKSPACE CONTROL, Prev: WORKSPACE QUERIES, Up: WORKSPACE MANAGEMENT 7.6 Workspace Inspection ======================== * Menu: * PO:: * POALL:: * POPS:: * PONS:: * POPLS:: * PON:: * POPL:: * POT:: * POTS::  File: ucblogo.info, Node: PO, Next: POALL, Prev: WORKSPACE INSPECTION, Up: WORKSPACE INSPECTION po -- PRINTOUT contentslist PO contentslist command. Prints to the write stream the definitions of all procedures, variables, and property lists named in the input contents list.  File: ucblogo.info, Node: POALL, Next: POPS, Prev: PO, Up: WORKSPACE INSPECTION poall ----- POALL (library procedure) command. Prints all unburied definitions in the workspace. Abbreviates PO CONTENTS. *Note CONTENTS:: .  File: ucblogo.info, Node: POPS, Next: PONS, Prev: POALL, Up: WORKSPACE INSPECTION pops ---- POPS (library procedure) command. Prints the definitions of all unburied procedures in the workspace. Abbreviates PO PROCEDURES. *Note PO:: , *note PROCEDURES:: .  File: ucblogo.info, Node: PONS, Next: POPLS, Prev: POPS, Up: WORKSPACE INSPECTION pons ---- PONS (library procedure) command. Prints the definitions of all unburied variables in the workspace. Abbreviates PO NAMES. *Note PO:: , *note NAMES:: .  File: ucblogo.info, Node: POPLS, Next: PON, Prev: PONS, Up: WORKSPACE INSPECTION popls ----- POPLS (library procedure) command. Prints the contents of all unburied nonempty property lists in the workspace. Abbreviates PO PLISTS. *Note PO:: , *note PLISTS:: .  File: ucblogo.info, Node: PON, Next: POPL, Prev: POPLS, Up: WORKSPACE INSPECTION pon --- PON varname (library procedure) PON varnamelist command. Prints the definitions of the named variable(s). Abbreviates PO NAMELIST varname(list). *Note PO:: , *note NAMELIST:: .  File: ucblogo.info, Node: POPL, Next: POT, Prev: PON, Up: WORKSPACE INSPECTION popl ---- POPL plname (library procedure) POPL plnamelist command. Prints the definitions of the named property list(s). Abbreviates PO PLLIST plname(list). *Note PO:: , *note PLLIST:: .  File: ucblogo.info, Node: POT, Next: POTS, Prev: POPL, Up: WORKSPACE INSPECTION pot --- POT contentslist command. Prints the title lines of the named procedures and the definitions of the named variables and property lists. For property lists, the entire list is shown on one line instead of as a series of 'PPROP' instructions as in 'PO'. *Note PPROP:: , *note PO:: .  File: ucblogo.info, Node: POTS, Prev: POT, Up: WORKSPACE INSPECTION pots ---- POTS (library procedure) command. Prints the title lines of all unburied procedures in the workspace. Abbreviates POT PROCEDURES. *Note PROCEDURES:: .  File: ucblogo.info, Node: WORKSPACE CONTROL, Prev: WORKSPACE INSPECTION, Up: WORKSPACE MANAGEMENT 7.7 Workspace Control ===================== * Menu: * ERASE:: * ERALL:: * ERPS:: * ERNS:: * ERPLS:: * ERN:: * ERPL:: * BURY:: * BURYALL:: * BURYNAME:: * UNBURY:: * UNBURYALL:: * UNBURYNAME:: * BURIEDP:: * TRACE:: * UNTRACE:: * TRACEDP:: * STEP:: * UNSTEP:: * STEPPEDP:: * EDIT:: * EDITFILE:: * EDALL:: * EDPS:: * EDNS:: * EDPLS:: * EDN:: * EDPL:: * SAVE:: * SAVEL:: * LOAD:: * CSLSLOAD:: * HELP:: * SETEDITOR:: * SETLIBLOC:: * SETHELPLOC:: * SETCSLSLOC:: * SETTEMPLOC:: * GC:: * .SETSEGMENTSIZE::  File: ucblogo.info, Node: ERASE, Next: ERALL, Prev: WORKSPACE CONTROL, Up: WORKSPACE CONTROL erase ----- ERASE contentslist ER contentslist command. Erases from the workspace the procedures, variables, and property lists named in the input. Primitive procedures may not be erased unless the variable 'REDEFP' has the value 'TRUE'. *Note REDEFP:: .  File: ucblogo.info, Node: ERALL, Next: ERPS, Prev: ERASE, Up: WORKSPACE CONTROL erall ----- ERALL command. Erases all unburied procedures, variables, and property lists from the workspace. Abbreviates ERASE CONTENTS. *Note CONTENTS:: .  File: ucblogo.info, Node: ERPS, Next: ERNS, Prev: ERALL, Up: WORKSPACE CONTROL erps ---- ERPS command. Erases all unburied procedures from the workspace. Abbreviates ERASE PROCEDURES. *Note ERASE:: , *note PROCEDURES:: .  File: ucblogo.info, Node: ERNS, Next: ERPLS, Prev: ERPS, Up: WORKSPACE CONTROL erns ---- ERNS command. Erases all unburied variables from the workspace. Abbreviates ERASE NAMES. *Note ERASE:: , *note NAMES:: .  File: ucblogo.info, Node: ERPLS, Next: ERN, Prev: ERNS, Up: WORKSPACE CONTROL erpls ----- ERPLS command. Erases all unburied property lists from the workspace. Abbreviates ERASE PLISTS. *Note ERASE:: , *note PLISTS:: .  File: ucblogo.info, Node: ERN, Next: ERPL, Prev: ERPLS, Up: WORKSPACE CONTROL ern --- ERN varname (library procedure) ERN varnamelist command. Erases from the workspace the variable(s) named in the input. Abbreviates ERASE NAMELIST VARNAME(LIST). *Note ERASE:: , *note NAMELIST:: .  File: ucblogo.info, Node: ERPL, Next: BURY, Prev: ERN, Up: WORKSPACE CONTROL erpl ---- ERPL plname (library procedure) ERPL plnamelist command. Erases from the workspace the property list(s) named in the input. Abbreviates ERASE PLLIST PLNAME(LIST). *Note ERASE:: , *note PLLIST:: .  File: ucblogo.info, Node: BURY, Next: BURYALL, Prev: ERPL, Up: WORKSPACE CONTROL bury ---- BURY contentslist command. Buries the procedures, variables, and property lists named in the input. A buried item is not included in the lists output by 'CONTENTS', 'PROCEDURES', 'VARIABLES', and 'PLISTS', but is included in the list output by 'BURIED'. By implication, buried things are not printed by 'POALL' or saved by 'SAVE'. *Note CONTENTS:: , *note PROCEDURES:: , *note PONS:: , *note PLISTS:: , *note POALL:: , *note SAVE:: .  File: ucblogo.info, Node: BURYALL, Next: BURYNAME, Prev: BURY, Up: WORKSPACE CONTROL buryall ------- BURYALL (library procedure) command. Abbreviates BURY CONTENTS. *Note CONTENTS:: .  File: ucblogo.info, Node: BURYNAME, Next: UNBURY, Prev: BURYALL, Up: WORKSPACE CONTROL buryname -------- BURYNAME varname (library procedure) BURYNAME varnamelist command. Abbreviates BURY NAMELIST 'varname(list)'. *Note BURY:: , *note NAMELIST:: .  File: ucblogo.info, Node: UNBURY, Next: UNBURYALL, Prev: BURYNAME, Up: WORKSPACE CONTROL unbury ------ UNBURY contentslist command. Unburies the procedures, variables, and property lists named in the input. That is, the named items will be returned to view in 'CONTENTS', etc. *Note CONTENTS:: .  File: ucblogo.info, Node: UNBURYALL, Next: UNBURYNAME, Prev: UNBURY, Up: WORKSPACE CONTROL unburyall --------- UNBURYALL (library procedure) command. Abbreviates UNBURY BURIED. *Note BURIED:: .  File: ucblogo.info, Node: UNBURYNAME, Next: BURIEDP, Prev: UNBURYALL, Up: WORKSPACE CONTROL unburyname ---------- UNBURYNAME varname (library procedure) UNBURYNAME varnamelist command. Abbreviates UNBURY NAMELIST VARNAME(LIST). *Note UNBURY:: , *note NAMELIST:: .  File: ucblogo.info, Node: BURIEDP, Next: TRACE, Prev: UNBURYNAME, Up: WORKSPACE CONTROL buriedp ------- BURIEDP contentslist BURIED? contentslist outputs 'TRUE' if the first procedure, variable, or property list named in the contents list is buried, 'FALSE' if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can 'BURIEDP [[] [VARIABLE]]' or 'BURIEDP [[] [] [PROPLIST]]'.  File: ucblogo.info, Node: TRACE, Next: UNTRACE, Prev: BURIEDP, Up: WORKSPACE CONTROL trace ----- TRACE contentslist command. Marks the named items for tracing. A message is printed whenever a traced procedure is invoked, giving the actual input values, and whenever a traced procedure 'STOP's or 'OUTPUT's. A message is printed whenever a new value is assigned to a traced variable using 'MAKE'. A message is printed whenever a new property is given to a traced property list using 'PPROP'. *Note STOP:: , *note OUTPUT:: , *note MAKE:: , *note PPROP:: .  File: ucblogo.info, Node: UNTRACE, Next: TRACEDP, Prev: TRACE, Up: WORKSPACE CONTROL untrace ------- UNTRACE contentslist command. Turns off tracing for the named items.  File: ucblogo.info, Node: TRACEDP, Next: STEP, Prev: UNTRACE, Up: WORKSPACE CONTROL tracedp ------- TRACEDP contentslist TRACED? contentslist outputs 'TRUE' if the first procedure, variable, or property list named in the contents list is traced, 'FALSE' if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can 'TRACEDP [[] [VARIABLE]]' or 'TRACEDP [[] [] [PROPLIST]]'.  File: ucblogo.info, Node: STEP, Next: UNSTEP, Prev: TRACEDP, Up: WORKSPACE CONTROL step ---- STEP contentslist command. Marks the named items for stepping. Whenever a stepped procedure is invoked, each instruction line in the procedure body is printed before being executed, and Logo waits for the user to type a newline at the terminal. A message is printed whenever a stepped variable name is "shadowed" because a local variable of the same name is created either as a procedure input or by the 'LOCAL' command. *Note LOCAL:: .  File: ucblogo.info, Node: UNSTEP, Next: STEPPEDP, Prev: STEP, Up: WORKSPACE CONTROL unstep ------ UNSTEP contentslist command. Turns off stepping for the named items.  File: ucblogo.info, Node: STEPPEDP, Next: EDIT, Prev: UNSTEP, Up: WORKSPACE CONTROL steppedp -------- STEPPEDP contentslist STEPPED? contentslist outputs 'TRUE' if the first procedure, variable, or property list named in the contents list is stepped, 'FALSE' if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can 'STEPPEDP [[] [VARIABLE]]' or 'STEPPEDP [[] [] [PROPLIST]]'.  File: ucblogo.info, Node: EDIT, Next: EDITFILE, Prev: STEPPEDP, Up: WORKSPACE CONTROL edit ---- EDIT contentslist ED contentslist (EDIT) (ED) command. If invoked with an input, 'EDIT' writes the definitions of the named items into a temporary file and edits that file, using an editor that depends on the platform you're using. In wxWidgets, and in the MacOS Classic version, there is an editor built into Logo. In the non-wxWidgets versions for Unix, MacOS X, Windows, and DOS, Logo uses your favorite editor as determined by the 'EDITOR' environment variable. If you don't have an 'EDITOR' variable, edits the definitions using 'jove'. If invoked without an input, 'EDIT' edits the same file left over from a previous 'EDIT' or 'EDITFILE' instruction. When you leave the editor, Logo reads the revised definitions and modifies the workspace accordingly. It is not an error if the input includes names for which there is no previous definition. If there is a variable 'LOADNOISILY' whose value is 'TRUE', then, after leaving the editor, 'TO' commands in the temporary file print 'PROCNAME defined' (where PROCNAME is the name of the procedure being defined); if 'LOADNOISILY' is 'FALSE' or undefined, 'TO' commands in the file are carried out silently. If there is an environment variable called 'TEMP', then Logo uses its value as the directory in which to write the temporary file used for editing. Exceptionally, the 'EDIT' command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. *Note LOADNOISILY:: , *Note EDITFILE:: .  File: ucblogo.info, Node: EDITFILE, Next: EDALL, Prev: EDIT, Up: WORKSPACE CONTROL editfile -------- EDITFILE filename command. Starts the Logo editor, like 'EDIT', but instead of editing a temporary file it edits the file specified by the input. When you leave the editor, Logo reads the revised file, as for 'EDIT'. 'EDITFILE' also remembers the filename, so that a subsequent 'EDIT' command with no input will re-edit the same file. 'EDITFILE' is intended as an alternative to 'LOAD' and 'SAVE'. You can maintain a workspace file yourself, controlling the order in which definitions appear, maintaining comments in the file, and so on. In the wxWidgets version, 'EDITFILE' asks whether or not you want to load the file into Logo when you finish editing. This allows you to use 'EDITFILE' to edit data files without leaving Logo.  File: ucblogo.info, Node: EDALL, Next: EDPS, Prev: EDITFILE, Up: WORKSPACE CONTROL edall ----- EDALL (library procedure) command. Abbreviates EDIT CONTENTS. *Note CONTENTS:: .  File: ucblogo.info, Node: EDPS, Next: EDNS, Prev: EDALL, Up: WORKSPACE CONTROL edps ---- EDPS (library procedure) command. Abbreviates EDIT PROCEDURES. *Note EDIT:: , *note PROCEDURES:: .  File: ucblogo.info, Node: EDNS, Next: EDPLS, Prev: EDPS, Up: WORKSPACE CONTROL edns ---- EDNS (library procedure) command. Abbreviates EDIT NAMES. *Note EDIT:: , *note NAMES:: .  File: ucblogo.info, Node: EDPLS, Next: EDN, Prev: EDNS, Up: WORKSPACE CONTROL edpls ----- EDPLS (library procedure) command. Abbreviates EDIT PLISTS. *Note EDIT:: , *note PLISTS:: .  File: ucblogo.info, Node: EDN, Next: EDPL, Prev: EDPLS, Up: WORKSPACE CONTROL edn --- EDN varname (library procedure) EDN varnamelist command. Abbreviates EDIT NAMELIST VARNAME(LIST). *Note EDIT:: , *note NAMELIST:: .  File: ucblogo.info, Node: EDPL, Next: SAVE, Prev: EDN, Up: WORKSPACE CONTROL edpl ---- EDPL plname (library procedure) EDPL plnamelist command. Abbreviates EDIT PLLIST PLNAME(LIST). *Note EDIT:: , *note PLLIST:: .  File: ucblogo.info, Node: SAVE, Next: SAVEL, Prev: EDPL, Up: WORKSPACE CONTROL save ---- SAVE filename command. Saves the definitions of all unburied procedures, variables, and nonempty property lists in the named file. Equivalent to to save :filename local "oldwriter make "oldwriter writer openwrite :filename setwrite :filename poall setwrite :oldwriter close :filename end Exceptionally, 'SAVE' can be used with no input and without parentheses if it is the last thing on the command line. In this case, the filename from the most recent 'LOAD' or 'SAVE' command will be used. (It is an error if there has been no previous 'LOAD' or 'SAVE'.)  File: ucblogo.info, Node: SAVEL, Next: LOAD, Prev: SAVE, Up: WORKSPACE CONTROL savel ----- SAVEL contentslist filename (library procedure) command. Saves the definitions of the procedures, variables, and property lists specified by CONTENTSLIST to the file named FILENAME.  File: ucblogo.info, Node: LOAD, Next: CSLSLOAD, Prev: SAVEL, Up: WORKSPACE CONTROL load ---- LOAD filename command. Reads instructions from the named file and executes them. The file can include procedure definitions with 'TO', and these are accepted even if a procedure by the same name already exists. If the file assigns a list value to a variable named 'STARTUP', then that list is run as an instructionlist after the file is loaded. If there is a variable 'LOADNOISILY' whose value is 'TRUE', then 'TO' commands in the file print 'PROCNAME defined' (where PROCNAME is the name of the procedure being defined); if 'LOADNOISILY' is 'FALSE' or undefined, 'TO' commands in the file are carried out silently. *Note STARTUP:: , *Note LOADNOISILY:: .  File: ucblogo.info, Node: CSLSLOAD, Next: HELP, Prev: LOAD, Up: WORKSPACE CONTROL cslsload -------- CSLSLOAD name command. Loads the named file, like 'LOAD', but from the directory containing the Computer Science Logo Style programs instead of the current user's directory. *Note LOAD:: .  File: ucblogo.info, Node: HELP, Next: SETEDITOR, Prev: CSLSLOAD, Up: WORKSPACE CONTROL help ---- HELP name (HELP) command. Prints information from the reference manual about the primitive procedure named by the input. With no input, lists all the primitives about which help is available. If there is an environment variable 'LOGOHELP', then its value is taken as the directory in which to look for help files, instead of the default help directory. If 'HELP' is called with the name of a defined procedure for which there is no help file, it will print the title line of the procedure followed by lines from the procedure body that start with semicolon, stopping when a non-semicolon line is seen. Exceptionally, the 'HELP' command can be used without its default input and without parentheses provided that nothing follows it on the instruction line.  File: ucblogo.info, Node: SETEDITOR, Next: SETLIBLOC, Prev: HELP, Up: WORKSPACE CONTROL seteditor --------- SETEDITOR path command. Tells Logo to use the specified program as its editor instead of the default editor. The format of a path depends on your operating system.  File: ucblogo.info, Node: SETLIBLOC, Next: SETCSLSLOC, Prev: SETEDITOR, Up: WORKSPACE CONTROL setlibloc --------- SETLIBLOC path command. Tells Logo to use the specified directory as its library instead of the default. (Note that many Logo "primitive" procedures are actually found in the library, so they may become unavailable if your new library does not include them!) The format of a path depends on your operating system.  File: ucblogo.info, Node: SETCSLSLOC, Next: SETHELPLOC, Prev: SETLIBLOC, Up: WORKSPACE CONTROL setcslsloc ---------- SETCSLSLOC path command. Tells Logo to use the specified directory for the 'CSLSLOAD' command, instead of the default directory. The format of a path depends on your operating system. *Note CSLSLOAD:: .  File: ucblogo.info, Node: SETHELPLOC, Next: SETTEMPLOC, Prev: SETCSLSLOC, Up: WORKSPACE CONTROL sethelploc ---------- SETHELPLOC path command. Tells Logo to look in the specified directory for the information provided by the HELP command, instead of the default directory. The format of a path depends on your operating system.  File: ucblogo.info, Node: SETTEMPLOC, Next: GC, Prev: SETHELPLOC, Up: WORKSPACE CONTROL settemploc ---------- SETTEMPLOC path command. Tells Logo to write editor temporary files in the specified directory rather than in the default directory. You must have write permission for this directory. The format of a path depends on your operating system.  File: ucblogo.info, Node: GC, Next: .SETSEGMENTSIZE, Prev: SETTEMPLOC, Up: WORKSPACE CONTROL gc -- GC (GC anything) command. Runs the garbage collector, reclaiming unused nodes. Logo does this when necessary anyway, but you may want to use this command to control exactly when Logo does it. In particular, the numbers output by the 'NODES' operation will not be very meaningful unless garbage has been collected. Another reason to use 'GC' is that a garbage collection takes a noticeable fraction of a second, and you may want to schedule collections for times before or after some time-critical animation. If invoked with an argument (of any value), 'GC' runs a full garbage collection, including GCTWA (Garbage Collect Truly Worthless Atoms, which means that it removes from Logo's memory words that used to be procedure or variable names but aren't any more); without an argument, 'GC' does a generational garbage collection, which means that only recently created nodes are examined. (The latter is usually good enough.)  File: ucblogo.info, Node: .SETSEGMENTSIZE, Prev: GC, Up: WORKSPACE CONTROL .setsegmentsize --------------- .SETSEGMENTSIZE num command. Sets the number of nodes that Logo allocates from the operating system at once to NUM, which must be a positive integer. The name is dotted because bad things will happen if you use a number that's too small or too large for your computer. The initial value is 16,000 for most systems, but is smaller for 68000-based Macs. Making it larger will speed up computations (by reducing the number of garbage collections) at the cost of allocating more memory than necessary.  File: ucblogo.info, Node: CONTROL STRUCTURES, Next: MACROS, Prev: WORKSPACE MANAGEMENT, Up: Top 8 Control Structures ******************** * Menu: * CONTROL:: * TEMPLATE-BASED ITERATION::  File: ucblogo.info, Node: CONTROL, Next: TEMPLATE-BASED ITERATION, Prev: CONTROL STRUCTURES, Up: CONTROL STRUCTURES 8.1 Control =========== Note: in the following descriptions, an "instructionlist" can be a list or a word. In the latter case, the word is parsed into list form before it is run. Thus, RUN READWORD or RUN READLIST will work. The former is slightly preferable because it allows for a continued line (with '~') that includes a comment (with ';') on the first line. A TF input must be the word 'TRUE', the word 'FALSE', or a list. If it's a list, then it must be a Logo expression, which will be evaluated to produce a value that must be 'TRUE' or 'FALSE'. The comparisons with 'TRUE' and 'FALSE' are always case-insensitive. A runlist can consist of either a single expression (that produces a value) or zero or more instructions (that do something, rather than output a value), depending on the context: PRINT IFELSE :X<0 ["NEGATIVE] ["POSITIVE] ; one value in each case REPEAT 4 [PRINT "A PRINT "B] ; two instructions * Menu: * RUN:: * RUNRESULT:: * REPEAT:: * FOREVER:: * REPCOUNT:: * IF:: * IFELSE:: * TEST:: * IFTRUE:: * IFFALSE:: * STOP:: * OUTPUT:: * CATCH:: * THROW:: * ERROR:: * PAUSE:: * CONTINUE:: * WAIT:: * BYE:: * dMAYBEOUTPUT:: MAYBEOUTPUT * GOTO:: * TAG:: * IGNORE:: * back-quote:: * FOR:: * DOdWHILE:: DO.WHILE * WHILE:: * DOdUNTIL:: DO.UNTIL * UNTIL:: * CASE:: * COND::  File: ucblogo.info, Node: RUN, Next: RUNRESULT, Prev: CONTROL, Up: CONTROL run --- RUN instructionlist command or operation. Runs the Logo instructions in the input list; outputs if the list contains an expression that outputs. *Note READWORD:: , *note READLIST:: .  File: ucblogo.info, Node: RUNRESULT, Next: REPEAT, Prev: RUN, Up: CONTROL runresult --------- RUNRESULT instructionlist runs the instructions in the input; outputs an empty list if those instructions produce no output, or a list whose only member is the output from running the input instructionlist. Useful for inventing command-or-operation control structures: local "result make "result runresult [something] if emptyp :result [stop] output first :result  File: ucblogo.info, Node: REPEAT, Next: FOREVER, Prev: RUNRESULT, Up: CONTROL repeat ------ REPEAT num instructionlist command. Runs the INSTRUCTIONLIST repeatedly, NUM times.  File: ucblogo.info, Node: FOREVER, Next: REPCOUNT, Prev: REPEAT, Up: CONTROL forever ------- FOREVER instructionlist command. Runs the "instructionlist" repeatedly, until something inside the instructionlist (such as 'STOP' or 'THROW') makes it stop. *Note STOP:: , *Note THROW:: .  File: ucblogo.info, Node: REPCOUNT, Next: IF, Prev: FOREVER, Up: CONTROL repcount -------- REPCOUNT outputs the repetition count of the innermost current 'REPEAT' or 'FOREVER', starting from 1. If no 'REPEAT' or 'FOREVER' is active, outputs -1. The abbreviation '#' can be used for 'REPCOUNT' unless the 'REPEAT' is inside the template input to a higher order procedure such as 'FOREACH', in which case '#' has a different meaning.  File: ucblogo.info, Node: IF, Next: IFELSE, Prev: REPCOUNT, Up: CONTROL if -- IF tf instructionlist (IF tf instructionlist1 instructionlist2) command. If the first input has the value 'TRUE', then 'IF' runs the second input. If the first input has the value 'FALSE', then 'IF' does nothing. (If given a third input, IF acts like 'IFELSE', as described below.) It is an error if the first input is not either 'TRUE' or 'FALSE'. For compatibility with earlier versions of Logo, if an 'IF' instruction is not enclosed in parentheses, but the first thing on the instruction line after the second input expression is a literal list (i.e., a list in square brackets), the 'IF' is treated as if it were 'IFELSE', but a warning message is given. If this aberrant 'IF' appears in a procedure body, the warning is given only the first time the procedure is invoked in each Logo session.  File: ucblogo.info, Node: IFELSE, Next: TEST, Prev: IF, Up: CONTROL ifelse ------ IFELSE tf instructionlist1 instructionlist2 command or operation. If the first input has the value 'TRUE', then 'IFELSE' runs the second input. If the first input has the value 'FALSE', then 'IFELSE' runs the third input. 'IFELSE' outputs a value if the INSTRUCTIONLIST contains an expression that outputs a value.  File: ucblogo.info, Node: TEST, Next: IFTRUE, Prev: IFELSE, Up: CONTROL test ---- TEST tf command. Remembers its input, which must be 'TRUE' or 'FALSE', for use by later 'IFTRUE' or 'IFFALSE' instructions. The effect of 'TEST' is local to the procedure in which it is used; any corresponding 'IFTRUE' or 'IFFALSE' must be in the same procedure or a subprocedure. *Note IFFALSE:: .  File: ucblogo.info, Node: IFTRUE, Next: IFFALSE, Prev: TEST, Up: CONTROL iftrue ------ IFTRUE instructionlist IFT instructionlist command. Runs its input if the most recent 'TEST' instruction had a 'TRUE' input. The 'TEST' must have been in the same procedure or a superprocedure.  File: ucblogo.info, Node: IFFALSE, Next: STOP, Prev: IFTRUE, Up: CONTROL iffalse ------- IFFALSE instructionlist IFF instructionlist command. Runs its input if the most recent 'TEST' instruction had a 'FALSE' input. The 'TEST' must have been in the same procedure or a superprocedure. *Note TEST:: .  File: ucblogo.info, Node: STOP, Next: OUTPUT, Prev: IFFALSE, Up: CONTROL stop ---- STOP command. Ends the running of the procedure in which it appears. Control is returned to the context in which that procedure was invoked. The stopped procedure does not output a value.  File: ucblogo.info, Node: OUTPUT, Next: CATCH, Prev: STOP, Up: CONTROL output ------ OUTPUT value OP value command. Ends the running of the procedure in which it appears. That procedure outputs the value VALUE to the context in which it was invoked. Don't be confused: 'OUTPUT' itself is a command, but the procedure that invokes 'OUTPUT' is an operation.  File: ucblogo.info, Node: CATCH, Next: THROW, Prev: OUTPUT, Up: CONTROL catch ----- CATCH tag instructionlist command or operation. Runs its second input. Outputs if that INSTRUCTIONLIST outputs. If, while running the instructionlist, a 'THROW' instruction is executed with a tag equal to the first input (case-insensitive comparison), then the running of the INSTRUCTIONLIST is terminated immediately. In this case the 'CATCH' outputs if a value input is given to 'THROW'. The TAG must be a word. If the tag is the word 'ERROR', then any error condition that arises during the running of the instructionlist has the effect of THROW "ERROR instead of printing an error message and returning to toplevel. The 'CATCH' does not output if an error is caught. Also, during the running of the instructionlist, the variable 'ERRACT' is temporarily unbound. (If there is an error while 'ERRACT' has a value, that value is taken as an instructionlist to be run after printing the error message. Typically the value of 'ERRACT', if any, is the list '[PAUSE]'.) *Note ERROR:: , *note ERRACT:: , *note PAUSE:: .  File: ucblogo.info, Node: THROW, Next: ERROR, Prev: CATCH, Up: CONTROL throw ----- THROW tag (THROW tag value) command. Must be used within the scope of a 'CATCH' with an equal tag. Ends the running of the instructionlist of the 'CATCH'. If 'THROW' is used with only one input, the corresponding 'CATCH' does not output a value. If 'THROW' is used with two inputs, the second provides an output for the 'CATCH'. THROW "TOPLEVEL can be used to terminate all running procedures and interactive pauses, and return to the toplevel instruction prompt. Typing the system interrupt character ( for wxWidgets; otherwise normally for Unix, for DOS, or for Mac) has the same effect. THROW "ERROR can be used to generate an error condition. If the error is not caught, it prints a message ('THROW "ERROR') with the usual indication of where the error (in this case the 'THROW') occurred. If a second input is used along with a tag of 'ERROR', that second input is used as the text of the error message instead of the standard message. Also, in this case, the location indicated for the error will be, not the location of the 'THROW', but the location where the procedure containing the 'THROW' was invoked. This allows user-defined procedures to generate error messages as if they were primitives. Note: in this case the corresponding CATCH "ERROR, if any, does not output, since the second input to 'THROW' is not considered a return value. THROW "SYSTEM immediately leaves Logo, returning to the operating system, without printing the usual parting message and without deleting any editor temporary file written by EDIT. *Note EDIT:: .  File: ucblogo.info, Node: ERROR, Next: PAUSE, Prev: THROW, Up: CONTROL error ----- ERROR outputs a list describing the error just caught, if any. If there was not an error caught since the last use of 'ERROR', the empty list will be output. The error list contains four members: an integer code corresponding to the type of error, the text of the error message (as a single word including spaces), the name of the procedure in which the error occurred, and the instruction line on which the error occurred.  File: ucblogo.info, Node: PAUSE, Next: CONTINUE, Prev: ERROR, Up: CONTROL pause ----- PAUSE command or operation. Enters an interactive pause. The user is prompted for instructions, as at toplevel, but with a prompt that includes the name of the procedure in which 'PAUSE' was invoked. Local variables of that procedure are available during the pause. 'PAUSE' outputs if the pause is ended by a 'CONTINUE' with an input. If the variable 'ERRACT' exists, and an error condition occurs, the contents of that variable are run as an instructionlist. Typically 'ERRACT' is given the value '[PAUSE]' so that an interactive pause will be entered in the event of an error. This allows the user to check values of local variables at the time of the error. Typing the system quit character ( for wxWidgets; otherwise normally for Unix, for DOS, or for Mac) will also enter a pause. *Note ERRACT:: .  File: ucblogo.info, Node: CONTINUE, Next: WAIT, Prev: PAUSE, Up: CONTROL continue -------- CONTINUE value CO value (CONTINUE) (CO) command. Ends the current interactive pause, returning to the context of the 'PAUSE' invocation that began it. If 'CONTINUE' is given an input, that value is used as the output from the 'PAUSE'. If not, the 'PAUSE' does not output. Exceptionally, the 'CONTINUE' command can be used without its default input and without parentheses provided that nothing follows it on the instruction line.  File: ucblogo.info, Node: WAIT, Next: BYE, Prev: CONTINUE, Up: CONTROL wait ---- WAIT time command. Delays further execution for TIME 60ths of a second. Also causes any buffered characters destined for the terminal to be printed immediately. WAIT 0 can be used to achieve this buffer flushing without actually waiting.  File: ucblogo.info, Node: BYE, Next: dMAYBEOUTPUT, Prev: WAIT, Up: CONTROL bye --- BYE command. Exits from Logo; returns to the operating system.  File: ucblogo.info, Node: dMAYBEOUTPUT, Next: GOTO, Prev: BYE, Up: CONTROL .maybeoutput ------------ .MAYBEOUTPUT value (special form) works like 'OUTPUT' except that the expression that provides the input value might not, in fact, output a value, in which case the effect is like 'STOP'. This is intended for use in control structure definitions, for cases in which you don't know whether or not some expression produces a value. Example: to invoke :function [:inputs] 2 .maybeoutput apply :function :inputs end ? (invoke "print "a "b "c) a b c ? print (invoke "word "a "b "c) abc This is an alternative to 'RUNRESULT'. It's fast and easy to use, at the cost of being an exception to Logo's evaluation rules. (Ordinarily, it should be an error if the expression that's supposed to provide an input to something doesn't have a value.) *Note OUTPUT:: , *note STOP:: , *note RUNRESULT:: .  File: ucblogo.info, Node: GOTO, Next: TAG, Prev: dMAYBEOUTPUT, Up: CONTROL goto ---- GOTO word command. Looks for a 'TAG' command with the same input in the same procedure, and continues running the procedure from the location of that 'TAG'. It is meaningless to use 'GOTO' outside of a procedure.  File: ucblogo.info, Node: TAG, Next: IGNORE, Prev: GOTO, Up: CONTROL tag --- TAG quoted.word command. Does nothing. The input must be a literal word following a quotation mark ('"'), not the result of a computation. Tags are used by the 'GOTO' command.  File: ucblogo.info, Node: IGNORE, Next: back-quote, Prev: TAG, Up: CONTROL ignore ------ IGNORE value (library procedure) command. Does nothing. Used when an expression is evaluated for a side effect and its actual value is unimportant.  File: ucblogo.info, Node: back-quote, Next: FOR, Prev: IGNORE, Up: CONTROL ' - ` list (library procedure) outputs a list equal to its input but with certain substitutions. If a member of the input list is the word ',' (comma) then the following member should be an instructionlist that produces an output when run. That output value replaces the comma and the instructionlist. If a member of the input list is the word ',@' (comma atsign) then the following member should be an instructionlist that outputs a list when run. The members of that list replace the ',@' and the instructionlist. Example: show `[foo baz ,[bf [a b c]] garply ,@[bf [a b c]]] will print [foo baz [b c] garply b c] A word starting with ',' or ',@' is treated as if the rest of the word were a one-word list, e.g., ',:foo' is equivalent to ',[:Foo]'. A word starting with '",' (quote comma) or ':,' (colon comma) becomes a word starting with '"' or ':' but with the result of running the substitution (or its first word, if the result is a list) replacing what comes after the comma. Backquotes can be nested. Substitution is done only for commas at the same depth as the backquote in which they are found: ? show `[a `[b ,[1+2] ,[foo ,[1+3] d] e] f] [a ` [b , [1+2] , [foo 4 d] e] f] ?make "name1 "x ?make "name2 "y ? show `[a `[b ,:,:name1 ,",:name2 d] e] [a ` [b , [:x] , ["y] d] e]  File: ucblogo.info, Node: FOR, Next: DOdWHILE, Prev: back-quote, Up: CONTROL for --- FOR forcontrol instructionlist (library procedure) command. The first input must be a list containing three or four members: (1) a word, which will be used as the name of a local variable; (2) a word or list that will be evaluated as by 'RUN' to determine a number, the starting value of the variable; (3) a word or list that will be evaluated to determine a number, the limit value of the variable; (4) an optional word or list that will be evaluated to determine the step size. If the fourth member is missing, the step size will be 1 or -1 depending on whether the limit value is greater than or less than the starting value, respectively. The second input is an instructionlist. The effect of 'FOR' is to run that instructionlist repeatedly, assigning a new value to the control variable (the one named by the first member of the FORCONTROL list) each time. First the starting value is assigned to the control variable. Then the value is compared to the limit value. 'FOR' is complete when the sign of '(current - limit)' is the same as the sign of the step size. (If no explicit step size is provided, the instructionlist is always run at least once. An explicit step size can lead to a zero-trip 'FOR', e.g., FOR [I 1 0 1] ...). Otherwise, the instructionlist is run, then the step is added to the current value of the control variable and FOR returns to the comparison step. ? for [i 2 7 1.5] [print :i] 2 3.5 5 6.5 ? *Note RUN:: .  File: ucblogo.info, Node: DOdWHILE, Next: WHILE, Prev: FOR, Up: CONTROL do.while -------- DO.WHILE instructionlist tfexpression (library procedure) command. Repeatedly evaluates the INSTRUCTIONLIST as long as the evaluated TFEXPRESSION remains 'TRUE'. Evaluates the first input first, so the INSTRUCTIONLIST is always run at least once. The TFEXPRESSION must be an expressionlist whose value when evaluated is 'TRUE' or 'FALSE'.  File: ucblogo.info, Node: WHILE, Next: DOdUNTIL, Prev: DOdWHILE, Up: CONTROL while ----- WHILE tfexpression instructionlist (library procedure) command. Repeatedly evaluates the INSTRUCTIONLIST as long as the evaluated TFEXPRESSION remains 'TRUE'. Evaluates the first input first, so the INSTRUCTIONLIST may never be run at all. The TFEXPRESSION must be an expressionlist whose value when evaluated is 'TRUE' or 'FALSE'.  File: ucblogo.info, Node: DOdUNTIL, Next: UNTIL, Prev: WHILE, Up: CONTROL do.until -------- DO.UNTIL instructionlist tfexpression (library procedure) command. Repeatedly evaluates the INSTRUCTIONLIST as long as the evaluated TFEXPRESSION remains 'FALSE'. Evaluates the first input first, so the INSTRUCTIONLIST is always run at least once. The TFEXPRESSION must be an expressionlist whose value when evaluated is 'TRUE' or 'FALSE'.  File: ucblogo.info, Node: UNTIL, Next: CASE, Prev: DOdUNTIL, Up: CONTROL until ----- UNTIL tfexpression instructionlist (library procedure) command. Repeatedly evaluates the INSTRUCTIONLIST as long as the evaluated TFEXPRESSION remains 'FALSE'. Evaluates the first input first, so the INSTRUCTIONLIST may never be run at all. The TFEXPRESSION must be an expressionlist whose value when evaluated is 'TRUE' or 'FALSE'.  File: ucblogo.info, Node: CASE, Next: COND, Prev: UNTIL, Up: CONTROL case ---- CASE value clauses (library procedure) command or operation. The second input is a list of lists (clauses); each clause is a list whose first element is either a list of values or the word 'ELSE' and whose butfirst is a Logo expression or instruction. 'CASE' examines the clauses in order. If a clause begins with the word 'ELSE' (upper or lower case), then the butfirst of that clause is evaluated and 'CASE' outputs its value, if any. If the first input to CASE is a member of the first element of a clause, then the butfirst of that clause is evaluated and 'CASE' outputs its value, if any. If neither of these conditions is met, then 'CASE' goes on to the next clause. If no clause is satisfied, 'CASE' does nothing. Example: to vowelp :letter output case :letter [ [[a e i o u] "true] [else "false] ] end  File: ucblogo.info, Node: COND, Prev: CASE, Up: CONTROL cond ---- COND clauses (library procedure) command or operation. The input is a list of lists (clauses); each clause is a list whose first element is either an expression whose value is 'TRUE' or 'FALSE', or the word 'ELSE', and whose butfirst is a Logo expression or instruction. 'COND' examines the clauses in order. If a clause begins with the word 'ELSE' (upper or lower case), then the butfirst of that clause is evaluated and 'CASE' outputs its value, if any. Otherwise, the first element of the clause is evaluated; the resulting value must be 'TRUE' or 'FALSE'. If it's 'TRUE', then the butfirst of that clause is evaluated and 'COND' outputs its value, if any. If the value is 'FALSE', then 'COND' goes on to the next clause. If no clause is satisfied, 'COND' does nothing. Example: to evens :numbers ; select even numbers from a list op cond [ [[emptyp :numbers] []] [[evenp first :numbers] ; assuming EVENP is defined fput first :numbers evens butfirst :numbers] [else evens butfirst :numbers] ] end  File: ucblogo.info, Node: TEMPLATE-BASED ITERATION, Prev: CONTROL, Up: CONTROL STRUCTURES 8.2 Template-based Iteration ============================ The procedures in this section are iteration tools based on the idea of a "template." This is a generalization of an instruction list or an expression list in which "slots" are provided for the tool to insert varying data. Four different forms of template can be used. The most commonly used form for a template is 'explicit-slot' form, or 'question mark' form. Example: ? show map [? * ?] [2 3 4 5] [4 9 16 25] ? In this example, the 'MAP' tool evaluated the template '[? * ?]' repeatedly, with each of the members of the data list '[2 3 4 5]' substituted in turn for the question marks. The same value was used for every question mark in a given evaluation. Some tools allow for more than one datum to be substituted in parallel; in these cases the slots are indicated by '?1' for the first datum, '?2' for the second, and so on: ? show (map [(word ?1 ?2 ?1)] [a b c] [d e f]) [ada beb cfc] ? If the template wishes to compute the datum number, the form '(? 1)' is equivalent to '?1', so '(? ?1)' means the datum whose number is given in datum number 1. Some tools allow additional slot designations, as shown in the individual descriptions. The second form of template is the 'named-procedure' form. If the template is a word rather than a list, it is taken as the name of a procedure. That procedure must accept a number of inputs equal to the number of parallel data slots provided by the tool; the procedure is applied to all of the available data in order. That is, if data '?1' through '?3' are available, the template '"PROC' is equivalent to [PROC ?1 ?2 ?3]. ? show (map "word [a b c] [d e f]) [ad be cf] ? to dotprod :a :b ; vector dot product op apply "sum (map "product :a :b) end The third form of template is 'named-slot' or 'lambda' form. This form is indicated by a template list containing more than one member, whose first member is itself a list. The first member is taken as a list of names; local variables are created with those names and given the available data in order as their values. The number of names must equal the number of available data. This form is needed primarily when one iteration tool must be used within the template list of another, and the '?' notation would be ambiguous in the inner template. Example: to matmul :m1 :m2 [:tm2 transpose :m2] ; multiply two matrices output map [[row] map [[col] dotprod :row :col] :tm2] :m1 end The fourth form is 'procedure text' form, a variant of lambda form. In this form, the template list contains at least two members, all of which are lists. This is the form used by the 'DEFINE' and 'TEXT' primitives, and 'APPLY' accepts it so that the text of a defined procedure can be used as a template. Note: The fourth form of template is interpreted differently from the others, in that Logo considers it to be an independent defined procedure for the purposes of 'OUTPUT' and 'STOP'. For example, the following two instructions are identical: ? print apply [[x] :x+3] [5] 8 ? print apply [[x] [output :x+3]] [5] 8 although the first instruction is in named-slot form and the second is in procedure-text form. The named-slot form can be understood as telling Logo to evaluate the expression :x+3 in place of the entire invocation of apply, with the variable 'x' temporarily given the value '5'. The procedure-text form can be understood as invoking the procedure to foo :x output :x+3 end with input '5', but without actually giving the procedure a name. If the use of 'OUTPUT' were interchanged in these two examples, we'd get errors: ? print apply [[x] output :x+3] [5] Can only use output inside a procedure ? print apply [[x] [:x+3]] [5] You don't say what to do with 8 The named-slot form can be used with 'STOP' or 'OUTPUT' inside a procedure, to stop the enclosing procedure. The following iteration tools are extended versions of the ones in Appendix B of the book 'Computer Science Logo Style, Volume 3: Advanced Topics' by Brian Harvey [MIT Press, 1987]. The extensions are primarily to allow for variable numbers of inputs. * Menu: * APPLY:: * INVOKE:: * FOREACH:: * MAP:: * MAPdSE:: MAP.SE * FILTER:: * FIND:: * REDUCE:: * CROSSMAP:: * CASCADE:: * CASCADEd2:: CASCADE.2 * TRANSFER::  File: ucblogo.info, Node: APPLY, Next: INVOKE, Prev: TEMPLATE-BASED ITERATION, Up: TEMPLATE-BASED ITERATION apply ----- APPLY template inputlist command or operation. Runs the TEMPLATE, filling its slots with the members of INPUTLIST. The number of members in INPUTLIST must be an acceptable number of slots for TEMPLATE. It is illegal to apply the primitive 'TO' as a template, but anything else is okay. 'APPLY' outputs what TEMPLATE outputs, if anything. *Note TO:: .  File: ucblogo.info, Node: INVOKE, Next: FOREACH, Prev: APPLY, Up: TEMPLATE-BASED ITERATION invoke ------ INVOKE template input (library procedure) (INVOKE template input1 input2 ...) command or operation. Exactly like 'APPLY' except that the inputs are provided as separate expressions rather than in a list.  File: ucblogo.info, Node: FOREACH, Next: MAP, Prev: INVOKE, Up: TEMPLATE-BASED ITERATION foreach ------- FOREACH data template (library procedure) (FOREACH data1 data2 ... template) command. Evaluates the TEMPLATE list repeatedly, once for each member of the DATA list. If more than one DATA list are given, each of them must be the same length. (The DATA inputs can be words, in which case the template is evaluated once for each character.) In a template, the symbol '?REST' represents the portion of the DATA input to the right of the member currently being used as the '?' slot-filler. That is, if the DATA input is '[A B C D E]' and the template is being evaluated with '?' replaced by 'B', then '?REST' would be replaced by '[C D E]'. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc. In a template, the symbol '#' represents the position in the DATA input of the member currently being used as the '?' slot-filler. That is, if the data input is '[A B C D E]' and the template is being evaluated with '?' replaced by 'B', then '#' would be replaced by '2'.  File: ucblogo.info, Node: MAP, Next: MAPdSE, Prev: FOREACH, Up: TEMPLATE-BASED ITERATION map --- MAP template data (library procedure) (MAP template data1 data2 ...) outputs a word or list, depending on the type of the DATA input, of the same length as that DATA input. (If more than one DATA input are given, the output is of the same type as DATA1.) Each member of the output is the result of evaluating the TEMPLATE list, filling the slots with the corresponding member(s) of the DATA input(s). (All DATA inputs must be the same length.) In the case of a word output, the results of the template evaluation must be words, and they are concatenated with 'WORD'. In a template, the symbol '?REST' represents the portion of the data input to the right of the member currently being used as the '?' slot-filler. That is, if the DATA input is '[A B C D E]' and the TEMPLATE is being evaluated with '?' replaced by 'B', then '?REST' would be replaced by '[C D E]'. If multiple parallel slots are used, then (?REST 1) goes with '?1', etc. In a template, the symbol '#' represents the position in the DATA input of the member currently being used as the '?' slot-filler. That is, if the data input is '[A B C D E]' and the template is being evaluated with '?' replaced by 'B', then '#' would be replaced by '2'. *Note WORD:: .  File: ucblogo.info, Node: MAPdSE, Next: FILTER, Prev: MAP, Up: TEMPLATE-BASED ITERATION map.se ------ MAP.SE template data (library procedure) (MAP.SE template data1 data2 ...) outputs a list formed by evaluating the TEMPLATE list repeatedly and concatenating the results using 'SENTENCE'. That is, the members of the output are the members of the results of the evaluations. The output list might, therefore, be of a different length from that of the DATA input(s). (If the result of an evaluation is the empty list, it contributes nothing to the final output.) The DATA inputs may be words or lists. In a template, the symbol '?REST' represents the portion of the data input to the right of the member currently being used as the '?' slot-filler. That is, if the data input is '[A B C D E]' and the template is being evaluated with '?' replaced by 'B', then '?REST' would be replaced by '[C D E]'. If multiple parallel slots are used, then (?REST 1) goes with '?1', etc. In a template, the symbol '#' represents the position in the DATA input of the member currently being used as the '?' slot-filler. That is, if the data input is '[A B C D E]' and the template is being evaluated with '?' replaced by 'B', then '#' would be replaced by '2'. *Note SENTENCE:: .  File: ucblogo.info, Node: FILTER, Next: FIND, Prev: MAPdSE, Up: TEMPLATE-BASED ITERATION filter ------ FILTER tftemplate data (library procedure) outputs a word or list, depending on the type of the DATA input, containing a subset of the members (for a list) or characters (for a word) of the input. The template is evaluated once for each member or character of the data, and it must produce a 'TRUE' or 'FALSE' value. If the value is 'TRUE', then the corresponding input constituent is included in the output. ? print filter "vowelp "elephant eea ? In a template, the symbol '?REST' represents the portion of the DATA input to the right of the member currently being used as the '?' slot-filler. That is, if the data input is '[A B C D E]' and the template is being evaluated with '?' replaced by 'B', then '?REST' would be replaced by '[C D E]'. In a template, the symbol '#' represents the position in the DATA input of the member currently being used as the '?' slot-filler. That is, if the data input is '[A B C D E]' and the template is being evaluated with '?' replaced by 'B', then '#' would be replaced by '2'.  File: ucblogo.info, Node: FIND, Next: REDUCE, Prev: FILTER, Up: TEMPLATE-BASED ITERATION find ---- FIND tftemplate data (library procedure) outputs the first constituent of the DATA input (the first member of a list, or the first character of a word) for which the value produced by evaluating the TEMPLATE with that consituent in its slot is 'TRUE'. If there is no such constituent, the empty list is output. In a template, the symbol '?REST' represents the portion of the DATA input to the right of the member currently being used as the '?' slot-filler. That is, if the data input is '[A B C D E]' and the template is being evaluated with '?' replaced by 'B', then '?REST' would be replaced by '[C D E]'. In a template, the symbol '#' represents the position in the DATA input of the member currently being used as the '?' slot-filler. That is, if the data input is '[A B C D E]' and the template is being evaluated with '?' replaced by 'B', then '#' would be replaced by '2'.  File: ucblogo.info, Node: REDUCE, Next: CROSSMAP, Prev: FIND, Up: TEMPLATE-BASED ITERATION reduce ------ REDUCE template data (library procedure) outputs the result of applying the TEMPLATE to accumulate the members of the DATA input. The template must be a two-slot function. Typically it is an associative function name like 'SUM'. If the DATA input has only one constituent (member in a list or character in a word), the output is that consituent. Otherwise, the template is first applied with '?1' filled with the next-to-last consitient and '?2' with the last constituent. Then, if there are more constituents, the template is applied with '?1' filled with the next constituent to the left and '?2' with the result from the previous evaluation. This process continues until all constituents have been used. The data input may not be empty. Note: If the template is, like 'SUM', the name of a procedure that is capable of accepting arbitrarily many inputs, it is more efficient to use 'APPLY' instead of 'REDUCE'. The latter is good for associative procedures that have been written to accept exactly two inputs: to max :a :b output ifelse :a > :b [:a] [:b] end print reduce "max [...] Alternatively, 'REDUCE' can be used to write 'MAX' as a procedure that accepts any number of inputs, as 'SUM' does: to max [:inputs] 2 if emptyp :inputs ~ [(throw "error [not enough inputs to max])] output reduce [ifelse ?1 > ?2 [?1] [?2]] :inputs end *Note SUM:: , *note APPLY:: .  File: ucblogo.info, Node: CROSSMAP, Next: CASCADE, Prev: REDUCE, Up: TEMPLATE-BASED ITERATION crossmap -------- CROSSMAP template listlist (library procedure) (CROSSMAP template data1 data2 ...) outputs a list containing the results of template evaluations. Each DATA list contributes to a slot in the template; the number of slots is equal to the number of DATA list inputs. As a special case, if only one DATA list input is given, that list is taken as a list of data lists, and each of its members contributes values to a slot. 'CROSSMAP' differs from 'MAP' in that instead of taking members from the data inputs in parallel, it takes all possible combinations of members of data inputs, which need not be the same length. ? show (crossmap [word ?1 ?2] [a b c] [1 2 3 4]) [a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4] ? For compatibility with the version in the first edition of CSLS (1), 'CROSSMAP' templates may use the notation ':1' instead of '?1' to indicate slots. *Note MAP:: . ---------- Footnotes ---------- (1) 'Computer Science Logo Style'  File: ucblogo.info, Node: CASCADE, Next: CASCADEd2, Prev: CROSSMAP, Up: TEMPLATE-BASED ITERATION cascade ------- CASCADE endtest template startvalue (library procedure) (CASCADE endtest tmp1 sv1 tmp2 sv2 ...) (CASCADE endtest tmp1 sv1 tmp2 sv2 ... finaltemplate) outputs the result of applying a template (or several templates, as explained below) repeatedly, with a given value filling the slot the first time, and the result of each application filling the slot for the following application. In the simplest case, 'CASCADE' has three inputs. The second input is a one-slot expression template. That template is evaluated some number of times (perhaps zero). On the first evaluation, the slot is filled with the third input; on subsequent evaluations, the slot is filled with the result of the previous evaluation. The number of evaluations is determined by the first input. This can be either a nonnegative integer, in which case the template is evaluated that many times, or a predicate expression template, in which case it is evaluated (with the same slot filler that will be used for the evaluation of the second input) repeatedly, and the 'CASCADE' evaluation continues as long as the predicate value is 'FALSE'. (In other words, the predicate template indicates the condition for stopping.) If the template is evaluated zero times, the output from 'CASCADE' is the third (STARTVALUE) input. Otherwise, the output is the value produced by the last template evaluation. 'CASCADE' templates may include the symbol '#' to represent the number of times the template has been evaluated. This slot is filled with 1 for the first evaluation, 2 for the second, and so on. ? show cascade 5 [lput # ?] [] [1 2 3 4 5] ? show cascade [vowelp first ?] [bf ?] "spring ing ? show cascade 5 [# * ?] 1 120 ? Several cascaded results can be computed in parallel by providing additional template-startvalue pairs as inputs to 'CASCADE'. In this case, all templates (including the endtest template, if used) are multi-slot, with the number of slots equal to the number of pairs of inputs. In each round of evaluations, '?2', for example, represents the result of evaluating the second template in the previous round. If the total number of inputs (including the first endtest input) is odd, then the output from CASCADE is the final value of the first template. If the total number of inputs is even, then the last input is a template that is evaluated once, after the end test is satisfied, to determine the output from 'CASCADE'. to fibonacci :n output (cascade :n [?1 + ?2] 1 [?1] 0) end to piglatin :word output (cascade [vowelp first ?] ~ [word bf ? first ?] ~ :word ~ [word ? "ay]) end  File: ucblogo.info, Node: CASCADEd2, Next: TRANSFER, Prev: CASCADE, Up: TEMPLATE-BASED ITERATION cascade.2 --------- CASCADE.2 endtest temp1 startval1 temp2 startval2 (library procedure) outputs the result of invoking 'CASCADE' with the same inputs. The only difference is that the default number of inputs is five instead of three.  File: ucblogo.info, Node: TRANSFER, Prev: CASCADEd2, Up: TEMPLATE-BASED ITERATION transfer -------- TRANSFER endtest template inbasket (library procedure) outputs the result of repeated evaluation of the TEMPLATE. The template is evaluated once for each member of the list INBASKET. 'TRANSFER' maintains an "outbasket" that is initially the empty list. After each evaluation of the template, the resulting value becomes the new outbasket. In the template, the symbol '?IN' represents the current member from the inbasket; the symbol '?OUT' represents the entire current outbasket. Other slot symbols should not be used. If the first (ENDTEST) input is an empty list, evaluation continues until all inbasket members have been used. If not, the first input must be a predicate expression template, and evaluation continues until either that template's value is 'TRUE' or the inbasket is used up.  File: ucblogo.info, Node: MACROS, Next: ERROR PROCESSING, Prev: CONTROL STRUCTURES, Up: Top 9 Macros ******** * Menu: * dMACRO:: * dDEFMACRO:: * MACROP:: * MACROEXPAND::  File: ucblogo.info, Node: dMACRO, Next: dDEFMACRO, Prev: MACROS, Up: MACROS .macro ====== .MACRO procname :input1 :input2 ... (special form) .DEFMACRO procname text A macro is a special kind of procedure whose output is evaluated as Logo instructions in the context of the macro's caller. '.MACRO' is exactly like 'TO' except that the new procedure becomes a macro; '.DEFMACRO' is exactly like 'DEFINE' with the same exception. Macros are useful for inventing new control structures comparable to 'REPEAT', 'IF', and so on. Such control structures can almost, but not quite, be duplicated by ordinary Logo procedures. For example, here is an ordinary procedure version of 'REPEAT': to my.repeat :num :instructions if :num=0 [stop] run :instructions my.repeat :num-1 :instructions end This version works fine for most purposes, e.g., my.repeat 5 [print "hello] But it doesn't work if the instructions to be carried out include 'OUTPUT', 'STOP', or 'LOCAL'. For example, consider this procedure: to example print [Guess my secret word. You get three guesses.] repeat 3 [type "|?? | ~ if readword = "secret [pr "Right! stop]] print [Sorry, the word was "secret"!] end This procedure works as written, but if 'MY.REPEAT' is used instead of 'REPEAT', it won't work because the 'STOP' will stop 'MY.REPEAT' instead of stopping 'EXAMPLE' as desired. The solution is to make 'MY.REPEAT' a macro. Instead of actually carrying out the computation, a macro must return a list containing Logo instructions. The contents of that list are evaluated as if they appeared in place of the call to the macro. Here's a macro version of 'REPEAT': .macro my.repeat :num :instructions if :num=0 [output []] output sentence :instructions ~ (list "my.repeat :num-1 :instructions) end Every macro is an operation -- it must always output something. Even in the base case, 'MY.REPEAT' outputs an empty instruction list. To show how 'MY.REPEAT' works, let's take the example my.repeat 5 [print "hello] For this example, 'MY.REPEAT' will output the instruction list [print "hello my.repeat 4 [print "hello]] Logo then executes these instructions in place of the original invocation of 'MY.REPEAT'; this prints 'hello' once and invokes another repetition. The technique just shown, although fairly easy to understand, has the defect of slowness because each repetition has to construct an instruction list for evaluation. Another approach is to make 'MY.REPEAT' a macro that works just like the non-macro version unless the instructions to be repeated include 'OUTPUT' or 'STOP': .macro my.repeat :num :instructions catch "repeat.catchtag ~ [op repeat.done runresult [repeat1 :num :instructions]] op [] end to repeat1 :num :instructions if :num=0 [throw "repeat.catchtag] run :instructions .maybeoutput repeat1 :num-1 :instructions end to repeat.done :repeat.result if emptyp :repeat.result [op [stop]] op list "output quoted first :repeat.result end If the instructions do not include 'STOP' or 'OUTPUT', then 'REPEAT1' will reach its base case and invoke 'THROW'. As a result, 'MY.REPEAT''s last instruction line will output an empty list, so the evaluation of the macro result by the caller will do nothing. But if a 'STOP' or 'OUTPUT' happens, then 'REPEAT.DONE' will output a 'STOP' or 'OUTPUT' instruction that will be executed in the caller's context. The macro-defining commands have names starting with a dot because macros are an advanced feature of Logo; it's easy to get in trouble by defining a macro that doesn't terminate, or by failing to construct the instruction list properly. Lisp users should note that Logo macros are _not_ special forms. That is, the inputs to the macro are evaluated normally, as they would be for any other Logo procedure. It's only the output from the macro that's handled unusually. Here's another example: .macro localmake :name :value output (list "local ~ word "" :name ~ "apply ~ ""make ~ (list :name :value)) end It's used this way: to try localmake "garply "hello print :garply end 'LOCALMAKE' outputs the list [local "garply apply "make [garply hello]] The reason for the use of 'APPLY' is to avoid having to decide whether or not the second input to 'MAKE' requires a quotation mark before it. (In this case it would -- 'MAKE "GARPLY "HELLO' -- but the quotation mark would be wrong if the value were a list.) It's often convenient to use the ` function to construct the instruction list: .macro localmake :name :value op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]] end On the other hand, ` is pretty slow, since it's tree recursive and written in Logo. *Note TO:: , *note DEFINE:: , *note APPLY:: , *note STOP:: , *note OUTPUT:: . * Menu: * dDEFMACRO:: * MACROP:: * MACROEXPAND::  File: ucblogo.info, Node: dDEFMACRO, Next: MACROP, Prev: dMACRO, Up: MACROS .defmacro --------- *Note dMACRO:: .  File: ucblogo.info, Node: MACROP, Next: MACROEXPAND, Prev: dDEFMACRO, Up: MACROS macrop ------ MACROP name MACRO? name outputs 'TRUE' if its input is the name of a macro.  File: ucblogo.info, Node: MACROEXPAND, Prev: MACROP, Up: MACROS macroexpand ----------- MACROEXPAND expr (library procedure) takes as its input a Logo expression that invokes a macro (that is, one that begins with the name of a macro) and outputs the the Logo expression into which the macro would translate the input expression. .macro localmake :name :value op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]] end ? show macroexpand [localmake "pi 3.14159] [local "pi apply "make [pi 3.14159]]  File: ucblogo.info, Node: ERROR PROCESSING, Next: SPECIAL VARIABLES, Prev: MACROS, Up: Top 10 Error Processing ******************* * Menu: * ERROR CODES:: If an error occurs, Logo takes the following steps. First, if there is an available variable named 'ERRACT', Logo takes its value as an instructionlist and runs the instructions. The operation 'ERROR' may be used within the instructions (once) to examine the error condition. If the instructionlist invokes 'PAUSE', the error message is printed before the pause happens. Certain errors are "recoverable"; for one of those errors, if the instructionlist outputs a value, that value is used in place of the expression that caused the error. (If 'ERRACT' invokes 'PAUSE' and the user then invokes 'CONTINUE' with an input, that input becomes the output from 'PAUSE' and therefore the output from the 'ERRACT' instructionlist.) It is possible for an 'ERRACT' instructionlist to produce an inappropriate value or no value where one is needed. As a result, the same error condition could recur forever because of this mechanism. To avoid that danger, if the same error condition occurs twice in a row from an 'ERRACT' instructionlist without user interaction, the message 'Erract loop' is printed and control returns to toplevel. "Without user interaction" means that if 'ERRACT' invokes 'PAUSE' and the user provides an incorrect value, this loop prevention mechanism does not take effect and the user gets to try again. During the running of the 'ERRACT' instructionlist, 'ERRACT' is locally unbound, so an error in the 'ERRACT' instructions themselves will not cause a loop. In particular, an error during a pause will not cause a pause-within-a-pause unless the user reassigns the value '[PAUSE]' to 'ERRACT' during the pause. But such an error will not return to toplevel; it will remain within the original pause loop. If there is no available 'ERRACT' value, Logo handles the error by generating an internal THROW "ERROR. (A user program can also generate an error condition deliberately by invoking 'THROW'.) If this throw is not caught by a CATCH "ERROR in the user program, it is eventually caught either by the toplevel instruction loop or by a pause loop, which prints the error message. An invocation of CATCH "ERROR in a user program locally unbinds 'ERRACT', so the effect is that whichever of 'ERRACT' and CATCH "ERROR is more local will take precedence. If a floating point overflow occurs during an arithmetic operation, or a two-input mathematical function (like 'POWER') is invoked with an illegal combination of inputs, the 'doesn't like' message refers to the second operand, but should be taken as meaning the combination. *Note ERRACT:: , *note THROW:: , *note ERROR:: , *note CATCH:: , *note PAUSE:: , *note CONTINUE:: .  File: ucblogo.info, Node: ERROR CODES, Prev: ERROR PROCESSING, Up: ERROR PROCESSING 10.1 Error Codes ================ Here are the numeric codes that appear as the first member of the list output by 'ERROR' when an error is caught, with the corresponding messages. Some messages may have two different codes depending on whether or not the error is recoverable (that is, a substitute value can be provided through the 'ERRACT' mechanism) in the specific context. Some messages are warnings rather than errors; these will not be caught. Errors 0 and 32 are so bad that Logo exits immediately. 0 Fatal internal error (can't be caught) 1 Out of memory 2 Stack overflow 3 Turtle out of bounds 4 PROC doesn't like DATUM as input (not recoverable) 5 PROC didn't output to PROC 6 Not enough inputs to PROC 7 proc doesn't like datum as input (recoverable) 8 Too much inside ()'s 9 You don't say what to do with DATUM 10 ')' not found 11 VAR has no value 12 Unexpected ')' 13 I don't know how to PROC (recoverable) 14 Can't find catch tag for THROWTAG 15 PROC is already defined 16 Stopped 17 Already dribbling 18 File system error 19 Assuming you mean IFELSE, not IF (warning only) 20 VAR shadowed by local in procedure call (warning only) 21 Throw "Error 22 PROC is a primitive 23 Can't use TO inside a procedure 24 I don't know how to PROC (not recoverable) 25 IFTRUE/IFFALSE without TEST 26 Unexpected ']' 27 Unexpected '}' 28 Couldn't initialize graphics 29 Macro returned VALUE instead of a list 30 You don't say what to do with VALUE 31 Can only use STOP or OUTPUT inside a procedure 32 APPLY doesn't like BADTHING as input 33 END inside multi-line instruction 34 Really out of memory (can't be caught) 35 user-generated error message (THROW "ERROR MESSAGE) 36 END inside multi-line instruction 37 Bad default expression for optional input: EXPR 38 Can't use OUTPUT or STOP inside RUNRESULT 39 Assuming you meant 'FD 100', not FD100 (or similar) 40 I can't open file FILENAME 41 File FILENAME already open 42 File FILENAME not open 43 Runlist [EXPR EXPR] has more than one expression.  File: ucblogo.info, Node: SPECIAL VARIABLES, Next: INTERNATIONALIZATION, Prev: ERROR PROCESSING, Up: Top 11 Special Variables ******************** Logo takes special action if any of the following variable names exists. They follow the normal scoping rules, so a procedure can locally set one of them to limit the scope of its effect. Initially, no variables exist except for 'ALLOWGETSET', 'CASEIGNOREDP', and 'UNBURYONEDIT', which are 'TRUE' and buried. * Menu: * ALLOWGETSET:: * BUTTONACT:: * CASEIGNOREDP:: * COMMANDLINE:: * ERRACT:: * FULLPRINTP:: * KEYACT:: * LOADNOISILY:: * PRINTDEPTHLIMIT:: * PRINTWIDTHLIMIT:: * REDEFP:: * STARTUP:: * UNBURYONEDIT:: * USEALTERNATENAMES:: * LOGOVERSION:: * LOGOPLATFORM::  File: ucblogo.info, Node: ALLOWGETSET, Next: BUTTONACT, Prev: SPECIAL VARIABLES, Up: SPECIAL VARIABLES allowgetset =========== ALLOWGETSET (variable) if 'TRUE', indicates that an attempt to use a procedure that doesn't exist should be taken as an implicit getter or setter procedure (setter if the first three letters of the name are 'SET') for a variable of the same name (without the 'SET' if appropriate). * Menu: * BUTTONACT:: * CASEIGNOREDP:: * COMMANDLINE:: * ERRACT:: * FULLPRINTP:: * KEYACT:: * LOADNOISILY:: * PRINTDEPTHLIMIT:: * PRINTWIDTHLIMIT:: * REDEFP:: * STARTUP:: * UNBURYONEDIT:: * USEALTERNATENAMES:: * LOGOVERSION:: * LOGOPLATFORM::  File: ucblogo.info, Node: BUTTONACT, Next: CASEIGNOREDP, Prev: ALLOWGETSET, Up: SPECIAL VARIABLES buttonact --------- BUTTONACT (variable) if nonempty, should be an instruction list that will be evaluated whenever a mouse button is pressed. Note that the user may have released the button before the instructions are evaluated. 'BUTTON' will still output which button was most recently pressed. 'CLICKPOS' will output the position of the mouse cursor at the moment the button was pressed; this may be different from 'MOUSEPOS' if the user moves the mouse after clicking. Note that it's possible for the user to press a button during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting 'BUTTONACT' to the empty list. One easy way to do that is the following: make "buttonact [button.action] to button.action [:buttonact []] ... ; whatever you want the button to do end  File: ucblogo.info, Node: CASEIGNOREDP, Next: COMMANDLINE, Prev: BUTTONACT, Up: SPECIAL VARIABLES caseignoredp ------------ CASEIGNOREDP (variable) if 'TRUE', indicates that lower case and upper case letters should be considered equal by 'EQUALP', 'BEFOREP', 'MEMBERP', etc. Logo initially makes this variable 'TRUE', and buries it. *Note EQUALP:: , *note BEFOREP:: , *note MEMBERP:: .  File: ucblogo.info, Node: COMMANDLINE, Next: ERRACT, Prev: CASEIGNOREDP, Up: SPECIAL VARIABLES commandline ----------- COMMANDLINE (variable) contains any text appearing after a hyphen on the command line used to start Logo.  File: ucblogo.info, Node: ERRACT, Next: FULLPRINTP, Prev: COMMANDLINE, Up: SPECIAL VARIABLES erract ------ ERRACT (variable) an instructionlist that will be run in the event of an error. Typically has the value '[PAUSE]' to allow interactive debugging. *Note PAUSE:: .  File: ucblogo.info, Node: FULLPRINTP, Next: KEYACT, Prev: ERRACT, Up: SPECIAL VARIABLES fullprintp ---------- FULLPRINTP (variable) if 'TRUE', then words that were created using backslash or vertical bar (to include characters that would otherwise not be treated as part of a word) are printed with the backslashes or vertical bars shown, so that the printed result could be re-read by Logo to produce the same value. If FULLPRINTP is 'TRUE' then the empty word (however it was created) prints as '||'. (Otherwise it prints as nothing at all.)  File: ucblogo.info, Node: KEYACT, Next: LOADNOISILY, Prev: FULLPRINTP, Up: SPECIAL VARIABLES keyact ------ KEYACT (variable) if nonempty, should be an instruction list that will be evaluated whenever a key is pressed on the keyboard. The instruction list can use 'READCHAR' to find out what key was pressed. Note that only keys that produce characters qualify; pressing 'SHIFT' or 'CONTROL' alone will not cause 'KEYACT' to be evaluated. Note that it's possible for the user to press a key during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting 'KEYACT' to the empty list. One easy way to do that is the following: make "keyact [key.action] to key.action [:keyact []] ... ; whatever you want the key to do end  File: ucblogo.info, Node: LOADNOISILY, Next: PRINTDEPTHLIMIT, Prev: KEYACT, Up: SPECIAL VARIABLES loadnoisily ----------- LOADNOISILY (variable) if 'TRUE', prints the names of procedures defined when loading from a file (including the temporary file made by 'EDIT'). *Note EDIT:: .  File: ucblogo.info, Node: PRINTDEPTHLIMIT, Next: PRINTWIDTHLIMIT, Prev: LOADNOISILY, Up: SPECIAL VARIABLES printdepthlimit --------------- PRINTDEPTHLIMIT (variable) if a nonnegative integer, indicates the maximum depth of sublist structure that will be printed by 'PRINT', etc. *Note PRINT:: .  File: ucblogo.info, Node: PRINTWIDTHLIMIT, Next: REDEFP, Prev: PRINTDEPTHLIMIT, Up: SPECIAL VARIABLES printwidthlimit --------------- PRINTWIDTHLIMIT (variable) if a nonnegative integer, indicates the maximum number of members in any one list that will be printed by 'PRINT', etc. *Note PRINT:: .  File: ucblogo.info, Node: REDEFP, Next: STARTUP, Prev: PRINTWIDTHLIMIT, Up: SPECIAL VARIABLES redefp ------ REDEFP (variable) if 'TRUE', allows primitives to be erased ('ERASE') or redefined ('COPYDEF'). *Note ERASE:: , *note COPYDEF:: .  File: ucblogo.info, Node: STARTUP, Next: UNBURYONEDIT, Prev: REDEFP, Up: SPECIAL VARIABLES startup ------- STARTUP (variable) if assigned a list value in a file loaded by 'LOAD', that value is run as an instructionlist after the loading. *Note LOAD:: .  File: ucblogo.info, Node: UNBURYONEDIT, Next: USEALTERNATENAMES, Prev: STARTUP, Up: SPECIAL VARIABLES unburyonedit ------------ UNBURYONEDIT (variable) if 'TRUE', causes any procedure defined during 'EDIT' or 'LOAD' to be unburied, so that it will be saved by a later 'SAVE'. Files that want to define and bury procedures must do it in that order. *Note EDIT:: , *Note LOAD:: , *Note SAVE:: .  File: ucblogo.info, Node: USEALTERNATENAMES, Next: LOGOVERSION, Prev: UNBURYONEDIT, Up: SPECIAL VARIABLES usealternatenames ----------------- USEALTERNATENAMES (variable) if 'TRUE', causes Logo to generate non-English words (from the 'Messages' file) instead of 'TRUE', 'FALSE', 'END', etc. Logo provides the following buried variables that can be used by programs:  File: ucblogo.info, Node: LOGOVERSION, Next: LOGOPLATFORM, Prev: USEALTERNATENAMES, Up: SPECIAL VARIABLES logoversion ----------- LOGOVERSION (variable) a real number indicating the Logo version number, e.g., 5.5  File: ucblogo.info, Node: LOGOPLATFORM, Prev: LOGOVERSION, Up: SPECIAL VARIABLES logoplatform ------------ LOGOPLATFORM (variable) one of the following words: 'wxWidgets', 'X11', 'Windows', or 'Unix-nographics'.  File: ucblogo.info, Node: INTERNATIONALIZATION, Next: INDEX, Prev: SPECIAL VARIABLES, Up: Top 12 Internationalization *********************** Berkeley Logo has limited support for non-English-speaking users. Alas, there is no Unicode support, and high-bit-on ASCII codes work in some contexts but not others. If you want to translate Berkeley Logo for use with another language, there are three main things you have to do: 1. Primitive names 2. Error (and other) messages 3. Documentation For primitive names, the easiest thing is to provide a startup file that defines aliases for the English primitive names, using 'COPYDEF': COPYDEF "AVANT "FORWARD This should take care of it, unless your language's name for one primitive is spelled like the English name of a different primitive. In that case you have to turn 'REDEFP' on and be sure to copy the non-conflicting name before overwriting the conflicting one! "Primitives" that are actually in the Logo library, of course, can just be replaced or augmented with native-language-named Logo procedures and filenames. Of course Logo programs will still not look like your native language if the word order is dramatically different, especially if you don't put verbs before their objects. For error messages, there is a file named 'Messages' in the 'logolib' directory with texts of messages, one per line. You can replace this with a file for your own language. Do not add, delete, or reorder lines; Logo finds messages by line number. The sequences '%p', '%s', and '%t' in these messages represent variable parts of the message and should not be translated. (%p 'PRINT's the variable part, while %s 'SHOW's it - that is, the difference is about whether or not brackets are shown surrounding a list. %t means that the variable part is a C text string rather than a Logo object.) If you want to change the order of two variable parts (no reorderable message has more than two), you would for example replace the line %p doesn't like %s as input with %+s is a lousy input to %p The plus sign tells the message printer to reverse the order; you must reverse the order of %p and %s, if both are used, to match. The plus sign goes just after the first percent sign in the message, which might not be at the beginning of the line. The sequence '\n' in a message represents a newline; don't be fooled into thinking that the 'n' is part of the following word. Some messages appear twice in the file; this isn't a mistake. The two spaces before 'to' in 'I don't know how\ \ to' aren't a mistake either. The message containing just '%p' is for user-provided error messages in 'THROW "ERROR'. The message "'\ \ in %s\n%s'" is the part of all error messages that indicates where the error occurred if it was inside a procedure; you might want to change the word 'in' to your language. '%s defined\n' is what 'LOAD' prints for each procedure defined if the variable 'LOADNOISILY' is 'TRUE'. "'to %p\nend\n\n'" is what 'EDIT' puts in the temporary file if you ask to edit a procedure that isn't already defined. Also in the 'Messages' file are lines containing only one word each; the first of these is the word 'true'. Some of these words are recognized by Logo in user input; some are generated by Logo; some are both. For example, the words 'TRUE' and 'FALSE' are recognized as Boolean values by 'IF' and 'IFELSE', and are also generated by Logo as outputs from the primitive predicates such as 'EQUALP'. The word 'END' is recognized as the end of a procedure definition, and may be generated when Logo reconstructs a procedure body for 'PO' or 'EDIT'. I've used capital letters in this paragraph for easier reading, but the words in the 'Messages' file should be in lower case. If you replace these with non-English words, Logo will _recognize_ both the English names and your alternate names. For example, if you replace the word 'true' with 'vrai' then Logo will understand both of these: IF "TRUE [PRINT "YES] IF "VRAI [PRINT "YES] The variable 'UseAlternateNames' determines whether Logo will _generate_ other-language names - for example, whether predicate functions return the other-language alternates for 'TRUE' and 'FALSE'. This variable is 'FALSE' by default, meaning that the English words will be generated. You might wish to have English-named predicate functions generate English 'TRUE' and 'FALSE', while other-language-named predicates generate the alternate words. This can be done by leaving 'UseAlternateNames' false, and instead of defining the other-language predicates with 'COPYDEF', do it this way: to french.boolean :bool if equalp :bool "true [output "vrai] if equalp :bool "false [output "faux] output :bool ; shouldn't happen end to make.french.predicate :french :english :arity define :french `[[[inputs] ,[:arity]] [output french.boolean apply ,[word "" :english] :inputs]] end ? make.french.predicate "egal? "equal? 2 ? pr egal? 3 4 faux ? pr egal? 4 4 vrai ? pr equal? 3 4 false ? pr equal? 4 4 true The third input to 'make.french.predicate' is the number of inputs that the predicate expects. This solution isn't quite perfect because the infix predicates ('=', '<', '>') will still output in English. If you want them to generate alternate-language words, set 'UseAlternateNames' to 'TRUE' instead. Some of the words in this section of the 'Messages' file are names of Logo primitives ('OUTPUT', 'STOP', 'GOTO', 'TAG', 'IF', 'IFELSE', 'TO', '.MACRO'). To translate these names, you must use 'COPYDEF' as described earlier, in addition to changing the names in 'Messages'. You should be consistent in these two steps. Don't forget the period in '.macro'! For documentation, there are two kinds: this manual and the help files. The latter are generated automatically from this manual if you have a Unix system, so in that case you need only translate this manual, maintaining the format. (The automatic helpfile generator notices things like capital letters, tabs, hyphens, and equal signs at the beginnings of lines.) The program 'makefile.c' may require modification because a few of the primitive names are special cases (e.g., 'LOG10' is the only name with digits included). If you don't have Unix tools, you can just translate each helpfile individually. A period in a primitive name is represented as a 'D' in the filename; there are no files for question marks because the 'HELP' command looks for the file named after the corresponding primitive that ends in 'P'.  File: ucblogo.info, Node: INDEX, Prev: INTERNATIONALIZATION, Up: Top INDEX ***** [index] * Menu: * *: PRODUCT. (line 6) * +: SUM. (line 6) * -: DIFFERENCE. (line 6) * .defmacro: dMACRO. (line 6) * .eq: dEQ. (line 6) * .macro: dMACRO. (line 6) * .maybeoutput: dMAYBEOUTPUT. (line 6) * .setbf: dSETBF. (line 6) * .setfirst: dSETFIRST. (line 6) * .setitem: dSETITEM. (line 6) * .setsegmentsize: .SETSEGMENTSIZE. (line 6) * /: QUOTIENT. (line 6) * <: LESSP. (line 6) * <=: LESSEQUALP. (line 6) * <>: NOTEQUALP. (line 6) * =: EQUALP. (line 6) * >: GREATERP. (line 6) * >=: GREATEREQUALP. (line 6) * ': back-quote. (line 6) * allopen: ALLOPEN. (line 6) * AllowGetSet: GETTER/SETTER VARIBLE SYNTAX. (line 127) * allowgetset: ALLOWGETSET. (line 6) * and: AND. (line 6) * apply: APPLY. (line 6) * arc: ARC. (line 6) * arctan: ARCTAN. (line 6) * arity: ARITY. (line 6) * array: ARRAY. (line 6) * array?: ARRAYP. (line 6) * arrayp: ARRAYP. (line 6) * arraytolist: ARRAYTOLIST. (line 6) * ascii: ASCII. (line 6) * ashift: ASHIFT. (line 6) * back: BACK. (line 6) * background: BACKGROUND. (line 6) * before?: BEFOREP. (line 6) * beforep: BEFOREP. (line 6) * bf: BUTFIRST. (line 6) * bfs: BUTFIRSTS. (line 6) * bg: BACKGROUND. (line 6) * bitand: BITAND. (line 6) * bitnot: BITNOT. (line 6) * bitor: BITOR. (line 6) * bitxor: BITXOR. (line 6) * bk: BACK. (line 6) * bl: BUTLAST. (line 6) * buried: BURIED. (line 6) * buried?: BURIEDP. (line 6) * buriedp: BURIEDP. (line 6) * bury: BURY. (line 6) * buryall: BURYALL. (line 6) * buryname: BURYNAME. (line 6) * butfirst: BUTFIRST. (line 6) * butfirsts: BUTFIRSTS. (line 6) * butlast: BUTLAST. (line 6) * button: BUTTON. (line 6) * button?: BUTTONP. (line 6) * buttonact: BUTTONACT. (line 6) * buttonp: BUTTONP. (line 6) * bye: BYE. (line 6) * cascade: CASCADE. (line 6) * cascade.2: CASCADEd2. (line 6) * case: CASE. (line 6) * case-insensitive: TOKENIZATION. (line 10) * caseignoredp: CASEIGNOREDP. (line 6) * catch: CATCH. (line 6) * char: CHAR. (line 6) * clean: CLEAN. (line 6) * clearscreen: CLEARSCREEN. (line 6) * cleartext: CLEARTEXT. (line 6) * clickpos: CLICKPOS. (line 6) * close: CLOSE. (line 6) * closeall: CLOSEALL. (line 6) * co: CONTINUE. (line 6) * combine: COMBINE. (line 6) * commandline: COMMANDLINE. (line 6) * comments: TOKENIZATION. (line 10) * Computer_Science_Logo_Style: OVERVIEW. (line 6) * cond: COND. (line 6) * contents: CONTENTS. (line 6) * continue: CONTINUE. (line 6) * copydef: COPYDEF. (line 6) * Copyright: OVERVIEW. (line 6) * cos: COS. (line 6) * count: COUNT. (line 6) * crossmap: CROSSMAP. (line 6) * cs: CLEARSCREEN. (line 6) * cslsload: CSLSLOAD. (line 6) * ct: CLEARTEXT. (line 6) * cursor: CURSOR. (line 6) * decreasefont: INCREASEFONT. (line 6) * define: DEFINE. (line 6) * defined?: DEFINEDP. (line 6) * definedp: DEFINEDP. (line 6) * delimiters: TOKENIZATION. (line 10) * dequeue: DEQUEUE. (line 6) * difference: DIFFERENCE. (line 6) * do.until: DOdUNTIL. (line 6) * do.while: DOdWHILE. (line 6) * dribble: DRIBBLE. (line 6) * ed: EDIT. (line 6) * edall: EDALL. (line 6) * edit: EDIT. (line 6) * editfile: EDITFILE. (line 6) * editor: EDIT. (line 6) * edn: EDN. (line 6) * edns: EDNS. (line 6) * edpl: EDPL. (line 6) * edpls: EDPLS. (line 6) * edps: EDPS. (line 6) * empty?: EMPTYP. (line 6) * emptyp: EMPTYP. (line 6) * eof?: EOFP. (line 6) * eofp: EOFP. (line 6) * epspict: EPSPICT. (line 6) * equal?: EQUALP. (line 6) * equalp: EQUALP. (line 6) * er: ERASE. (line 6) * erall: ERALL. (line 6) * erase: ERASE. (line 6) * erasefile: ERASEFILE. (line 6) * erf: ERASEFILE. (line 6) * ern: ERN. (line 6) * erns: ERNS. (line 6) * erpl: ERPL. (line 6) * erpls: ERPLS. (line 6) * erps: ERPS. (line 6) * erract: ERRACT. (line 6) * error: ERROR. (line 6) * errors: ERROR CODES. (line 6) * exp: EXP. (line 6) * fd: FORWARD. (line 6) * fence: FENCE. (line 6) * file?: FILEP. (line 6) * filep: FILEP. (line 6) * fill: FILL. (line 6) * filled: FILLED. (line 6) * filter: FILTER. (line 6) * find: FIND. (line 6) * first: FIRST. (line 6) * firsts: FIRSTS. (line 6) * font: FONT. (line 6) * for: FOR. (line 6) * foreach: FOREACH. (line 6) * forever: FOREVER. (line 6) * form: FORM. (line 6) * forward: FORWARD. (line 6) * fput: FPUT. (line 6) * fs: FULLSCREEN. (line 6) * fullprintp: FULLPRINTP. (line 6) * fullscreen: FULLSCREEN. (line 6) * fulltext: FULLTEXT. (line 6) * gc: GC. (line 6) * gensym: GENSYM. (line 6) * getter: GETTER/SETTER VARIBLE SYNTAX. (line 6) * global: GLOBAL. (line 6) * goto: GOTO. (line 6) * gprop: GPROP. (line 6) * greater?: GREATERP. (line 6) * greaterequal?: GREATEREQUALP. (line 6) * greaterequalp: GREATEREQUALP. (line 6) * greaterp: GREATERP. (line 6) * heading: HEADING. (line 6) * help: HELP. (line 6) * hideturtle: HIDETURTLE. (line 6) * home: HOME. (line 6) * ht: HIDETURTLE. (line 6) * if: IF. (line 6) * ifelse: IFELSE. (line 6) * iff: IFFALSE. (line 6) * iffalse: IFFALSE. (line 6) * ift: IFTRUE. (line 6) * iftrue: IFTRUE. (line 6) * ignore: IGNORE. (line 6) * increasefont: INCREASEFONT. (line 6) * int: INT. (line 6) * invoke: INVOKE. (line 6) * iseq: ISEQ. (line 6) * item: ITEM. (line 6) * key?: KEYP. (line 6) * keyact: KEYACT. (line 6) * keyp: KEYP. (line 6) * label: LABEL. (line 6) * labelsize: LABELSIZE. (line 6) * last: LAST. (line 6) * leaving ucblogo: ENTERING AND LEAVING LOGO. (line 6) * left: LEFT. (line 6) * less?: LESSP. (line 6) * lessequal?: LESSEQUALP. (line 6) * lessequalp: LESSEQUALP. (line 6) * lessp: LESSP. (line 6) * line-continuation: TOKENIZATION. (line 10) * list: LIST. (line 6) * list?: LISTP. (line 6) * listp: LISTP. (line 6) * listtoarray: LISTTOARRAY. (line 6) * ln: LN. (line 6) * load: LOAD. (line 6) * loadnoisily: LOADNOISILY. (line 6) * loadpict: LOADPICT. (line 6) * local: LOCAL. (line 6) * localmake: LOCALMAKE. (line 6) * log10: LOG10. (line 6) * logohelp: HELP. (line 6) * logoplatform: LOGOPLATFORM. (line 6) * logoversion: LOGOVERSION. (line 6) * lowercase: LOWERCASE. (line 6) * lput: LPUT. (line 6) * lshift: LSHIFT. (line 6) * lt: LEFT. (line 6) * macro?: MACROP. (line 6) * macroexpand: MACROEXPAND. (line 6) * macrop: MACROP. (line 6) * make: MAKE. (line 6) * map: MAP. (line 6) * map.se: MAPdSE. (line 6) * mdarray: MDARRAY. (line 6) * mditem: MDITEM. (line 6) * mdsetitem: MDSETITEM. (line 6) * member: MEMBER. (line 6) * member?: MEMBERP. (line 6) * memberp: MEMBERP. (line 6) * minus: MINUS. (line 6) * modulo: MODULO. (line 6) * mousepos: MOUSEPOS. (line 6) * name: NAME. (line 6) * name?: NAMEP. (line 6) * namelist: NAMELIST. (line 6) * namep: NAMEP. (line 6) * names: NAMES. (line 6) * nodes: NODES. (line 6) * nodribble: NODRIBBLE. (line 6) * norefresh: NOREFRESH. (line 6) * not: NOT. (line 6) * notequal?: NOTEQUALP. (line 6) * notequalp: NOTEQUALP. (line 6) * number?: NUMBERP. (line 6) * numberp: NUMBERP. (line 6) * op: OUTPUT. (line 6) * openappend: OPENAPPEND. (line 6) * openread: OPENREAD. (line 6) * openupdate: OPENUPDATE. (line 6) * openwrite: OPENWRITE. (line 6) * or: OR. (line 6) * output: OUTPUT. (line 6) * palette: PALETTE. (line 6) * parse: PARSE. (line 6) * pause: PAUSE. (line 6) * pc: PENCOLOR. (line 6) * pd: PENDOWN. (line 6) * pe: PENERASE. (line 6) * pen: PEN. (line 6) * pencolor: PENCOLOR. (line 6) * pendown: PENDOWN. (line 6) * pendown?: PENDOWNP. (line 6) * pendownp: PENDOWNP. (line 6) * penerase: PENERASE. (line 6) * penmode: PENMODE. (line 6) * penpaint: PENPAINT. (line 6) * penpattern: PENSIZE. (line 6) * penreverse: PENREVERSE. (line 6) * pensize: PENSIZE. (line 6) * penup: PENUP. (line 6) * pick: PICK. (line 6) * plist: PLIST. (line 6) * plist?: PLISTP. (line 6) * plistp: PLISTP. (line 6) * plists: PLISTS. (line 6) * pllist: PLLIST. (line 6) * po: PO. (line 6) * poall: POALL. (line 6) * pon: PON. (line 6) * pons: PONS. (line 6) * pop: POP. (line 6) * popl: POPL. (line 6) * popls: POPLS. (line 6) * pops: POPS. (line 6) * pos: POS. (line 6) * pot: POT. (line 6) * pots: POTS. (line 6) * power: POWER. (line 6) * pprop: PPROP. (line 6) * ppt: PENPAINT. (line 6) * pr: PRINT. (line 6) * prefix: PREFIX. (line 6) * primitive?: PRIMITIVEP. (line 6) * primitivep: PRIMITIVEP. (line 6) * primitives: PRIMITIVES. (line 6) * print: PRINT. (line 6) * printdepthlimit: PRINTDEPTHLIMIT. (line 6) * printout: PO. (line 6) * printwidthlimit: PRINTWIDTHLIMIT. (line 6) * procedure?: PROCEDUREP. (line 6) * procedurep: PROCEDUREP. (line 6) * procedures: PROCEDURES. (line 6) * product: PRODUCT. (line 6) * pu: PENUP. (line 6) * push: PUSH. (line 6) * px: PENREVERSE. (line 6) * queue: QUEUE. (line 6) * quoted: QUOTED. (line 6) * quotient: QUOTIENT. (line 6) * radarctan: RADARCTAN. (line 6) * radcos: RADCOS. (line 6) * radsin: RADSIN. (line 6) * random: RANDOM. (line 6) * rawascii: RAWASCII. (line 6) * rc: READCHAR. (line 6) * rcs: READCHARS. (line 6) * readchar: READCHAR. (line 6) * readchars: READCHARS. (line 6) * reader: READER. (line 6) * readlist: READLIST. (line 6) * readpos: READPOS. (line 6) * readrawline: READRAWLINE. (line 6) * readword: READWORD. (line 6) * redefp: REDEFP. (line 6) * reduce: REDUCE. (line 6) * refresh: REFRESH. (line 6) * remainder: REMAINDER. (line 6) * remdup: REMDUP. (line 6) * remove: REMOVE. (line 6) * remprop: REMPROP. (line 6) * repcount: REPCOUNT. (line 6) * repeat: REPEAT. (line 6) * rerandom: RERANDOM. (line 6) * reverse: REVERSE. (line 6) * right: RIGHT. (line 6) * rl: READLIST. (line 6) * round: ROUND. (line 6) * rseq: RSEQ. (line 6) * rt: RIGHT. (line 6) * run: RUN. (line 6) * runparse: RUNPARSE. (line 6) * runparsing: TOKENIZATION. (line 10) * runresult: RUNRESULT. (line 6) * rw: READWORD. (line 6) * save: SAVE. (line 6) * savel: SAVEL. (line 6) * savepict: SAVEPICT. (line 6) * screenmode: SCREENMODE. (line 6) * scrunch: SCRUNCH. (line 6) * scrunch.dat: SETSCRUNCH. (line 6) * se: SENTENCE. (line 6) * sentence: SENTENCE. (line 6) * setbackground: SETBACKGROUND. (line 6) * setbg: SETBACKGROUND. (line 6) * setcslsloc: SETCSLSLOC. (line 6) * setcursor: SETCURSOR. (line 6) * seteditor: SETEDITOR. (line 6) * setfont: SETFONT. (line 6) * seth: SETHEADING. (line 6) * setheading: SETHEADING. (line 6) * sethelploc: SETHELPLOC. (line 6) * setitem: SETITEM. (line 6) * setlabelheight: SETLABELHEIGHT. (line 6) * setlibloc: SETLIBLOC. (line 6) * setmargins: SETMARGINS. (line 6) * setpalette: SETPALETTE. (line 6) * setpc: SETPENCOLOR. (line 6) * setpen: SETPEN. (line 6) * setpencolor: SETPENCOLOR. (line 6) * setpenpattern: SETPENPATTERN. (line 6) * setpensize: SETPENSIZE. (line 6) * setpos: SETPOS. (line 6) * setprefix: SETPREFIX. (line 6) * setread: SETREAD. (line 6) * setreadpos: SETREADPOS. (line 6) * setscrunch: SETSCRUNCH. (line 6) * settc: SETTEXTCOLOR. (line 6) * settemploc: SETTEMPLOC. (line 6) * setter: GETTER/SETTER VARIBLE SYNTAX. (line 6) * settextcolor: SETTEXTCOLOR. (line 6) * settextsize: SETTEXTSIZE. (line 6) * setwrite: SETWRITE. (line 6) * setwritepos: SETWRITEPOS. (line 6) * setx: SETX. (line 6) * setxy: SETXY. (line 6) * sety: SETY. (line 6) * shell: SHELL. (line 6) * show: SHOW. (line 6) * shown?: SHOWNP. (line 6) * shownp: SHOWNP. (line 6) * showturtle: SHOWTURTLE. (line 6) * sin: SIN. (line 6) * splitscreen: SPLITSCREEN. (line 6) * sqrt: SQRT. (line 6) * ss: SPLITSCREEN. (line 6) * st: SHOWTURTLE. (line 6) * standout: STANDOUT. (line 6) * starting ucblogo: ENTERING AND LEAVING LOGO. (line 6) * startup: STARTUP. (line 6) * step: STEP. (line 6) * stepped: STEPPED. (line 6) * stepped?: STEPPEDP. (line 6) * steppedp: STEPPEDP. (line 6) * stop: STOP. (line 6) * substring?: SUBSTRINGP. (line 6) * substringp: SUBSTRINGP. (line 6) * sum: SUM. (line 6) * tag: TAG. (line 6) * temp: EDIT. (line 6) * template: TEMPLATE-BASED ITERATION. (line 6) * test: TEST. (line 6) * text: TEXT. (line 6) * textscreen: TEXTSCREEN. (line 6) * textsize: TEXTSIZE. (line 6) * thing: THING. (line 6) * throw: THROW. (line 6) * to: TO. (line 6) * towards: TOWARDS. (line 6) * trace: TRACE. (line 6) * traced: TRACED. (line 6) * traced?: TRACEDP. (line 6) * tracedp: TRACEDP. (line 6) * transfer: TRANSFER. (line 6) * turtlemode: TURTLEMODE. (line 6) * type: TYPE. (line 6) * unbury: UNBURY. (line 6) * unburyall: UNBURYALL. (line 6) * unburyname: UNBURYNAME. (line 6) * unburyonedit: UNBURYONEDIT. (line 6) * unstep: UNSTEP. (line 6) * until: UNTIL. (line 6) * untrace: UNTRACE. (line 6) * uppercase: UPPERCASE. (line 6) * usealternatenames: USEALTERNATENAMES. (line 6) * vbarred?: VBARREDP. (line 6) * vbarredp: VBARREDP. (line 6) * wait: WAIT. (line 6) * while: WHILE. (line 6) * window: WINDOW. (line 6) * word: WORD. (line 6) * wordp: WORDP. (line 6) * wrap: WRAP. (line 6) * writepos: WRITEPOS. (line 6) * writer: WRITER. (line 6) * xcor: XCOR. (line 6) * ycor: YCOR. (line 6)  Tag Table: Node: Top78 Node: INTRODUCTION513 Node: OVERVIEW746 Node: GETTER/SETTER VARIBLE SYNTAX2811 Node: ENTERING AND LEAVING LOGO10580 Node: TOKENIZATION14048 Node: DATA STRUCTURE PRIMITIVES19996 Node: CONSTRUCTORS20243 Node: WORD20553 Node: LIST20761 Node: SENTENCE21016 Node: FPUT21380 Node: LPUT21709 Node: ARRAY22064 Node: MDARRAY22778 Node: LISTTOARRAY23263 Node: ARRAYTOLIST23542 Node: COMBINE23854 Node: REVERSE24144 Node: GENSYM24375 Node: SELECTORS24591 Node: FIRST24881 Node: FIRSTS25242 Node: LAST25921 Node: BUTFIRST26164 Node: BUTFIRSTS26497 Node: BUTLAST27107 Node: ITEM27434 Node: MDITEM27862 Node: PICK28101 Node: REMOVE28286 Node: REMDUP28495 Node: QUOTED28809 Node: MUTATORS29028 Node: SETITEM29367 Node: MDSETITEM29682 Node: dSETFIRST29932 Node: dSETBF30459 Node: dSETITEM31043 Node: PUSH31531 Node: POP31908 Node: QUEUE32191 Node: DEQUEUE32570 Node: PREDICATES32856 Node: WORDP33169 Node: LISTP33362 Node: ARRAYP33551 Node: EMPTYP33747 Node: EQUALP33968 Node: NOTEQUALP35000 Node: BEFOREP35318 Node: dEQ35841 Node: MEMBERP36350 Node: SUBSTRINGP36764 Node: NUMBERP37121 Node: VBARREDP37329 Node: QUERIES38114 Node: COUNT38355 Node: ASCII38713 Node: RAWASCII39109 Node: CHAR39455 Node: MEMBER39690 Node: LOWERCASE40137 Node: UPPERCASE40379 Node: STANDOUT40623 Node: PARSE41787 Node: RUNPARSE42132 Node: COMMUNICATION42500 Node: TRANSMITTERS42717 Node: PRINT44349 Node: TYPE44873 Node: SHOW46072 Node: RECEIVERS46338 Node: READLIST46557 Node: READWORD47250 Node: READRAWLINE48038 Node: READCHAR48637 Node: READCHARS49258 Node: SHELL49902 Node: FILE ACCESS51332 Node: SETPREFIX51758 Node: PREFIX52466 Node: OPENREAD52668 Node: OPENWRITE52908 Node: OPENAPPEND53966 Node: OPENUPDATE54300 Node: CLOSE55024 Node: ALLOPEN55341 Node: CLOSEALL55585 Node: ERASEFILE55840 Node: DRIBBLE56084 Node: NODRIBBLE56610 Node: SETREAD56818 Node: SETWRITE57365 Node: READER58845 Node: WRITER59065 Node: SETREADPOS59287 Node: SETWRITEPOS59742 Node: READPOS60196 Node: WRITEPOS60380 Node: EOFP60561 Node: FILEP60791 Node: TERMINAL ACCESS61038 Node: KEYP61322 Node: CLEARTEXT62029 Node: SETCURSOR62202 Node: CURSOR62636 Node: SETMARGINS63018 Node: SETTEXTCOLOR63916 Node: INCREASEFONT65141 Node: SETTEXTSIZE65461 Node: TEXTSIZE66117 Node: SETFONT66461 Node: FONT66895 Node: ARITHMETIC67065 Node: NUMERIC OPERATIONS67311 Node: SUM67706 Node: DIFFERENCE67919 Node: MINUS68298 Node: PRODUCT68760 Node: QUOTIENT68982 Node: REMAINDER69476 Node: MODULO69748 Node: INT70006 Node: ROUND70315 Node: SQRT70473 Node: POWER70653 Node: EXP70859 Node: LOG1071015 Node: LN71172 Node: SIN71321 Node: RADSIN71492 Node: COS71673 Node: RADCOS71850 Node: ARCTAN72036 Node: RADARCTAN72353 Node: ISEQ72754 Node: RSEQ73036 Node: NUMERIC PREDICATES73366 Node: LESSP73595 Node: GREATERP73842 Node: LESSEQUALP74096 Node: GREATEREQUALP74367 Node: RANDOM NUMBERS74636 Node: RANDOM74823 Node: RERANDOM75384 Node: PRINT FORMATTING75946 Node: FORM76122 Node: BITWISE OPERATIONS76886 Node: BITAND77099 Node: BITOR77352 Node: BITXOR77587 Node: BITNOT77836 Node: ASHIFT78040 Node: LSHIFT78328 Node: LOGICAL OPERATIONS78593 Node: AND78764 Node: OR79579 Node: NOT80343 Node: GRAPHICS80625 Node: TURTLE MOTION82989 Node: FORWARD83253 Node: BACK83511 Node: LEFT83794 Node: RIGHT84022 Node: SETPOS84248 Node: SETXY84493 Node: SETX84732 Node: SETY84971 Node: SETHEADING85211 Node: HOME85492 Node: ARC85728 Node: TURTLE MOTION QUERIES86025 Node: POS86273 Node: XCOR86488 Node: YCOR86669 Node: HEADING86854 Node: TOWARDS87032 Node: SCRUNCH87318 Node: TURTLE AND WINDOW CONTROL87631 Node: SHOWTURTLE88059 Node: HIDETURTLE88260 Node: CLEAN88588 Node: CLEARSCREEN88861 Node: WRAP89150 Node: WINDOW89695 Node: FENCE90224 Node: FILL90611 Node: FILLED90962 Node: LABEL91492 Node: SETLABELHEIGHT91740 Node: TEXTSCREEN92453 Node: FULLSCREEN92857 Node: SPLITSCREEN93657 Node: SETSCRUNCH94059 Node: REFRESH95093 Node: NOREFRESH95462 Node: TURTLE AND WINDOW QUERIES95957 Node: SHOWNP96223 Node: SCREENMODE96547 Node: TURTLEMODE96795 Node: LABELSIZE97030 Node: PEN AND BACKGROUND CONTROL97580 Node: PENDOWN98438 Node: PENUP98660 Node: PENPAINT98856 Node: PENERASE99058 Node: PENREVERSE99281 Node: SETPENCOLOR99582 Node: SETPALETTE100371 Node: SETPENSIZE100910 Node: SETPENPATTERN101309 Node: SETPEN101613 Node: SETBACKGROUND101988 Node: PEN QUERIES102304 Node: PENDOWNP102560 Node: PENMODE102757 Node: PENCOLOR103005 Node: PALETTE103694 Node: PENSIZE103990 Node: PEN104357 Node: BACKGROUND104630 Node: SAVING AND LOADING PICTURES104877 Node: SAVEPICT105105 Node: LOADPICT105653 Node: EPSPICT106057 Node: MOUSE QUERIES106615 Node: MOUSEPOS106806 Node: CLICKPOS107351 Node: BUTTONP107671 Node: BUTTON108026 Node: WORKSPACE MANAGEMENT108435 Node: PROCEDURE DEFINITION108759 Node: TO109007 Node: DEFINE112888 Node: TEXT113839 Node: FULLTEXT114303 Node: COPYDEF115146 Node: VARIABLE DEFINITION115739 Node: MAKE115990 Node: NAME116386 Node: LOCAL116597 Node: LOCALMAKE117302 Node: THING117604 Node: GLOBAL118033 Node: PROPERTY LISTS118685 Node: PPROP119552 Node: GPROP119790 Node: REMPROP120045 Node: PLIST120269 Node: WORKSPACE PREDICATES120676 Node: PROCEDUREP120928 Node: PRIMITIVEP121167 Node: DEFINEDP121527 Node: NAMEP121785 Node: PLISTP121982 Node: WORKSPACE QUERIES122362 Node: CONTENTS122932 Node: BURIED123273 Node: TRACED123470 Node: STEPPED123666 Node: PROCEDURES123870 Node: PRIMITIVES124237 Node: NAMES124590 Node: PLISTS124862 Node: NAMELIST125154 Node: PLLIST125551 Node: ARITY125960 Node: NODES126326 Node: WORKSPACE INSPECTION127226 Node: PO127496 Node: POALL127792 Node: POPS128036 Node: PONS128314 Node: POPLS128581 Node: PON128863 Node: POPL129155 Node: POT129447 Node: POTS129834 Node: WORKSPACE CONTROL130085 Node: ERASE130689 Node: ERALL131060 Node: ERPS131314 Node: ERNS131552 Node: ERPLS131780 Node: ERN132016 Node: ERPL132324 Node: BURY132634 Node: BURYALL133178 Node: BURYNAME133419 Node: UNBURY133693 Node: UNBURYALL134007 Node: UNBURYNAME134222 Node: BURIEDP134511 Node: TRACE135018 Node: UNTRACE135592 Node: TRACEDP135778 Node: STEP136281 Node: UNSTEP136830 Node: STEPPEDP137013 Node: EDIT137523 Node: EDITFILE139160 Node: EDALL140014 Node: EDPS140212 Node: EDNS140422 Node: EDPLS140622 Node: EDN140826 Node: EDPL141070 Node: SAVE141310 Node: SAVEL142022 Node: LOAD142313 Node: CSLSLOAD143082 Node: HELP143388 Node: SETEDITOR144266 Node: SETLIBLOC144555 Node: SETCSLSLOC145001 Node: SETHELPLOC145339 Node: SETTEMPLOC145684 Node: GC146051 Node: .SETSEGMENTSIZE147102 Node: CONTROL STRUCTURES147725 Node: CONTROL147922 Node: RUN149408 Node: RUNRESULT149691 Node: REPEAT150186 Node: FOREVER150378 Node: REPCOUNT150677 Node: IF151126 Node: IFELSE152029 Node: TEST152444 Node: IFTRUE152843 Node: IFFALSE153146 Node: STOP153469 Node: OUTPUT153756 Node: CATCH154135 Node: THROW155259 Node: ERROR156965 Node: PAUSE157489 Node: CONTINUE158449 Node: WAIT159004 Node: BYE159341 Node: dMAYBEOUTPUT159503 Node: GOTO160451 Node: TAG160766 Node: IGNORE161037 Node: back-quote161295 Node: FOR162727 Node: DOdWHILE164309 Node: WHILE164757 Node: DOdUNTIL165197 Node: UNTIL165648 Node: CASE166085 Node: COND167015 Node: TEMPLATE-BASED ITERATION168170 Node: APPLY172712 Node: INVOKE173202 Node: FOREACH173535 Node: MAP174650 Node: MAPdSE176005 Node: FILTER177302 Node: FIND178462 Node: REDUCE179465 Node: CROSSMAP181017 Ref: CROSSMAP-Footnote-1182076 Node: CASCADE182114 Node: CASCADEd2184967 Node: TRANSFER185317 Node: MACROS186232 Node: dMACRO186412 Node: dDEFMACRO191554 Node: MACROP191676 Node: MACROEXPAND191867 Node: ERROR PROCESSING192417 Node: ERROR CODES195241 Node: SPECIAL VARIABLES197619 Node: ALLOWGETSET198346 Node: BUTTONACT199041 Node: CASEIGNOREDP200036 Node: COMMANDLINE200470 Node: ERRACT200741 Node: FULLPRINTP201064 Node: KEYACT201654 Node: LOADNOISILY202498 Node: PRINTDEPTHLIMIT202828 Node: PRINTWIDTHLIMIT203167 Node: REDEFP203508 Node: STARTUP203799 Node: UNBURYONEDIT204104 Node: USEALTERNATENAMES204541 Node: LOGOVERSION204927 Node: LOGOPLATFORM205189 Node: INTERNATIONALIZATION205449 Node: INDEX212116  End Tag Table ucblogo-6.1/docs/usermanual.ps0000664000175000017500000341544213601426467014610 0ustar jjcjjc%!PS-Adobe-2.0 %%Creator: dvips(k) 5.999 Copyright 2019 Radical Eye Software %%Title: usermanual.dvi %%CreationDate: Fri Dec 27 16:11:35 2019 %%Pages: 115 %%PageOrder: Ascend %%BoundingBox: 0 0 612 792 %%DocumentFonts: CMBX12 CMR10 CMR12 CMMI12 CMMI10 CMSY10 CMSL10 CMTT10 %%+ CMB10 CMSLTT10 CMTI10 CMR7 CMSL9 CMR9 CMMI9 CMTT9 %%DocumentPaperSizes: Letter %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips -t letter -o usermanual.ps usermanual.dvi %DVIPSParameters: dpi=600 %DVIPSSource: TeX output 2019.12.27:0911 %%BeginProcSet: tex.pro 0 0 %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/CharBuilder{save 3 1 roll S A/base get 2 index get S /BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]{Ci}imagemask restore}B/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /dir 0 def/dyy{/dir 0 def}B/dyt{/dir 1 def}B/dty{/dir 2 def}B/dtt{/dir 3 def}B/p{dir 2 eq{-90 rotate show 90 rotate}{dir 3 eq{-90 rotate show 90 rotate}{show}ifelse}ifelse}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{/Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT)(LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse} forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{ BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat {BDot}imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B /M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M} B/g{0 M}B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{ 0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: texps.pro 0 0 %! TeXDict begin/rf{findfont dup length 1 add dict begin{1 index/FID ne 2 index/UniqueID ne and{def}{pop pop}ifelse}forall[1 index 0 6 -1 roll exec 0 exch 5 -1 roll VResolution Resolution div mul neg 0 0]FontType 0 ne{/Metrics exch def dict begin Encoding{exch dup type/integertype ne{ pop pop 1 sub dup 0 le{pop}{[}ifelse}{FontMatrix 0 get div Metrics 0 get div def}ifelse}forall Metrics/Metrics currentdict end def}{{1 index type /nametype eq{exit}if exch pop}loop}ifelse[2 index currentdict end definefont 3 -1 roll makefont/setfont cvx]cvx def}def/ObliqueSlant{dup sin S cos div neg}B/SlantFont{4 index mul add}def/ExtendFont{3 -1 roll mul exch}def/ReEncodeFont{CharStrings rcheck{/Encoding false def dup[ exch{dup CharStrings exch known not{pop/.notdef/Encoding true def}if} forall Encoding{]exch pop}{cleartomark}ifelse}if/Encoding exch def}def end %%EndProcSet %%BeginFont: CMTT9 %!PS-AdobeFont-1.0: CMTT9 003.002 %%Title: CMTT9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTT9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTT9 known{/CMTT9 findfont dup/UniqueID known{dup /UniqueID get 5000831 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTT9 def /FontBBox {-6 -233 542 698 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT9.) readonly def /FullName (CMTT9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 43 /plus put dup 60 /less put dup 62 /greater put dup 98 /b put dup 99 /c put dup 103 /g put dup 108 /l put dup 111 /o put dup 117 /u put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E6BABDA4215500A0 42D1A3D0D02C0C98BB1D6ED0B7791274C38B038FC7921FF1FB8FAE7258C09259 4B8E1BD9EDCEDE9ADAD9BD9598EEA9691589649A9A21539161E374075BEE3457 689F308A4A7AC9F2FE4B301A6C36B0442FB92E3B002623493DC087800B5A0521 0DB96A23175AC584DE166F59142779F26FEE9783E28DE49FC3A8D6583EE63FBA 610DA773CA18ACE6F64A4867A1A7817120ABF9DE4D17782866E6CB6B65A9F6D8 3667C8D3E61E5356E35343FDD4C6436DF73934470916CB5F0ECEA6BFF092E735 C7C355B56189D1DD5715EC97E50145FFC17BB1497315A9585D713A7A6DFC7933 995468EFD0F59E3C15865B87925A3F2930E20D5A35970E2C44F1629FA16E00EE EE21EFC50D49F5BC02300D0A7BB85E649CB4E2E828C8B1C5469463013E71D723 2CB11BCBAC191AC751A2AF7FC228395CE9472DC1809052012AEC2CD66695DAF0 4CA04234F0187F4116C93F59A7F1F8123DE87F111853B785A20CA8B49B3B0CEC B11AD345E1A11578D2EFEB0536D125237086CC8CD9F34A5137AC5DDFD8746014 D74AAE8239B81ACF65F379CF2153B06A238A2D767F294CAE0D79228F0B7D45CE 510AC9657A1776202FEF42F96D476E7DF407786AEA12DEA0013D3B4C5D0640F5 BC5BB72C34066270399CE595827175B23B25072723BD24E07F6BCD9EF0175DEF 93714BAA53960F81103CFB731CED4A267B53727BCA3C97B0BA5004055D4EF0EC F725658E53AC86E4061B489AD4154915C3981B3B703E1E2A8D390CCECCA99385 45EBE35441B062D7D12DAB2B31569387187D74A4043FD71F1C6D352EAE0F6757 4345FBFB6DB15CAE47CAC4BAE47AECAE5FF5EC19057DCEFA1B23F47364ABDF47 088A7C6A2AE26B10459B6D41CB69182FD1472F326CE3A15B59255D1DE3B616D8 9D1F12561038839781E657C896B8C58A32DF5AEA23732A0966D96C68C988ED7A 09B7E2C8F9F3D0D56879764781566299A4EDD3588BDF70E3D924D25074F30988 E35BDD827AE4D0B4A06F55A9976BF0DB3C0B1D09CD08E8CB168B50617691638C 0EC1A791C228177D4FFB021EC3DF5082CA3487AD2EFC8DE9466A690ADDB4C52A FE2A6DB4CC275CD33D9136E735279FBB2008D59E667905EBB04326EC33C98B2C 94744B7F540D86E90DED64572ECF1EAD3A58EC101642B245A9C7232DC8FB8741 03F97883BB32FB955C22F878FA0FD114451A3B3859B0B5537AFAB73AEC7DB2BF 409E1FB41D473714F6BEA73CB085139879FA31710E01915C2938C37BAD6D7D71 45B897E00857D3931A489EAC7B42BCE4E65F73F67FE027CE482DC47598ABCB95 39E98DA8ECA3E23F0799D5963ABA6E2984DEACBE7B46B40ADC6213E0F4D08971 58F68C946C748E4B4217CBA2391BE2086C9758F4E32C9B6413E48D84D33A6E85 84747029C0A9C9B92841D217A902BA8EB333999D62FDA9F82BFC8ED11F67988A 0CAE42182E414A9766AFFF4B046A09D476F8E3F15A8C7829BEE982D8350BDF5F F215F2BBBF68D4B567BAB798B9604C79306C475926E9FEC0F07A99F43473C6FD B15AC29C3D07FEBAD1BAFF75AAF2FBE94F104F1DBF838044FAD94B661B06AECD D9AEBD02B60CA4546DD6B5B5C1A3833ED07845671CEFCA8955CE0DE5DB8FC93B 3306683CBFB8E5B79A863DE78D455DE9D592043C2686F88A43140F8B9F3B553B 7047420E93E753829F8D47AC7621CFE3626F271E31F0019CC02D0B57F67BB47D 8CFB63E902EA3231C00EC66EEC0D30FE8394558BD3535C888C4CEFC6EB72E737 712ADC6300162D5D79BEE0CA1F6E4127A0BC90656C01692F6D82C85550AFC97E C2693E379160FDB9636FA41AE9C75B7F6643B05971C6D67CE30971D590FC07B3 E0B36B4D1C7F25110B5DA2130D574FA292B47322975A2BADBDB39AAE69BDDBDA A880F9AAB580117708C79204DFFDC08BF4A48919B5C22228845CE8C3109E93AC 2479E523B8A1C12A6E541118F121DC6B4EAED83491A03192D5C3A2A45D1A2467 757E7B377C635CF5CAE11A7CB49D49F3A1BB2286090B5F0E4F89869D1771D50C 54B5C5E091E3048A2C194F0ED00DD64FB95BAC6FA9D61ECD093ED416DA3A4981 DB07CFF17C4F55C62DF628EBFF06FAC3F3D3F91C30EBB34052BE1A08F5EDA4B9 08977197950A282B84E21D43C64BE3AE4BCE22C70E7D392DE09D89B7F23351AD 6AD37225C12BA79EC9951F5DA1E505DB26200190ADE0E549305B7530CB86EFD2 A896F13A97E51754F70B609CB4511CEFC38BA579C071E9510A49982389980DC5 336D6C4A2DB100DFEC4055C7AA9C55880F94FBEA9EB280BEF66CB8E1E38A359D E5AFB12B540CD599085ADDA7FC2C72E7C873015773FFEECA2C596B75BC39A3EB 3C43FA2E53C0D7993042F3D652BCC483E48B7F6C94C3FF6D38E276086A6AE67A E5A571B9C72E0D7824E0BC2ADF51A393B9E334649F786EC1923C854382B89627 1B9E701AE5A6C42E672B2C6A33C8BBCA8F69B9061E787D6B92183F20CF4C3903 FF5417427B84798C82BE28D2C81624E3920CA61EC9EADB364B5A6E50E49A1A72 A9A090A1FCD84814B8B2708AD787D2B5015DA1305874F58C5EB62F843685FCB6 465FCA80176CAB2B2FE65E0A270BCE1E3DB97564BEDFAE5CA44395A8DF4505C0 3E103CC3B914359B2870DA6CD30382EAE8949131CFE31E9E75C3E47A3834BB32 CF183D4A8B9001710D0A11390C9DAD116196568591D38C2AF4ADD852F31494EF 573462759A35415900360882739789D6B89ACEFA251C5ED90ED704DD7C3C80CA 9F6CDED69537D201D520C99E69EEAD5D3C0EB84C166660B3C190166D93EDFE6D 15BCB6DC5CDCA825E48D33845CC2FB15291AAB823F25CF8BB0A1EAED8BEC524D D9CA016027141FAC9D35B64FB9C224552F29EF6B32497254E319090E698FD8A5 15491CDFE1B988C79A0E3B9D01E12FF084E9FA86CCAE02A3EE6F2917B61A2CC1 64B8CAF309D1AB48A34227A7729DFF99CB6EC282E3FAEDD2673779AA7E4C1789 D93FDC37FE95F087C5F88F53D30A2DA9C913BF205FC6BDD060A40184F4AAEB3C D080D63B89CA3DEFF310D09EF0A83F3914BD5B7932980ECE139EF0313C20B4C8 576EE0FE3F28FAF4D3CE7CD0890BC824A85B8EF4636BDF1EF1BB519F93D36540 ED09FAF93FD71992CA2CE2E83F5355162ECEB32AD218092F45D5A61A44E67135 EF0453589CECDC6962D0E8DA7E7567603BAF50B2C8F1CA65EA5320984E7D69AC 9A7D3D7F92565D79E8C9DD2D92CCA7DE9CD058545E9F98AA47904D70E1897099 3C4C852B3BA131DDD348433C336BDF5FBDFB62120DDEAEB3255E3207B0C84A0A 1ECF9EC869DB9BFA3693B03FCB27C5A5D3CDD62630DEDE91B4DD5B9784BF0BDD FC6EEC3FA7ACA9E15FAE47CDD9B7FCD2BF0EFA10716F08C0AF25FF67CB6F9598 C607D2FCA452417D2C69DC808A9441A66492394C3450BD30632AE739EAD654BA 4343459CA36B6D5B2C12C39495952F2EF93D82C73E33236785A79609E260C4E0 CF3A3C950DE71DDC3939D42DB1CB1CA917CEAD56979A70F8F3B207C805319FA7 3C000AE2B21D711A6D78C7BFB901334DC06F59EAB6D94B507734C27971F8458D D00193645AB92FB8FE163D5C51AE4F40BDB4F2C51691E76EE0636F071F37AAA9 BA78BD12459CA499210EB0CE2F8BD317387797C33F5933AE7A6264DA06B4A6A6 1188326147A16B205D1F965872DED7D8EDB3294FAD2FCDF0D423329E9CCF879D 4E0B966D509F45527F7609DD09694D286F6FF7535EF8971B7DFBAF608A19D442 C133207EB1152ABBD11C455D0977F66A9B73E51381D1CA4B66E87C0C7175A63D 80C699A052F00C41DAEF42E7A40E07B1B14107AB0787E24E17C1462960E3C54C AE73BE4924464FB177EC62F116B2822842541543EFF7ABDDEE197D6BD8F8D4E6 59175D8C5957550B70BE775AD52FFF6E7C00DA7CDC16E1DF7446BB5D8FD82647 3E9F87D5EA365C82A2D991321ECB14A9E3AEADC5A56665DF7072D6DAE402BCB6 14D92B17F9E063E4E9D8D239C91F5C7C0BCD2FBD936C9D4A0B57659420343B59 B395BBD1AB5B6003F653699D57E7581F9813CC98D4F072FB78899D6DECC42D34 F2787EDEA64058B46C4BFAA2BB96E9BE5CACE8D91E4C080ADFC0FA0D4A29C6B8 54FEA9E11DBCF53D9CA40A21AE5076451EDAB3593E56B6D453DC8EAB8C78B588 34D4C4F36861B5649BC1E9F3091E704BDA7613ED45C911DFECA74EEA05165191 825F95A947CAF382FBAF01F3B8B041ACCDF39718D7DC5BA6CA12BB20EEE96439 BF2E2628AA3BD2C91998E6247A690FCB0CC95F286F427345CC4F1115BA3A6E54 4743355F2CC991CBDFF5725902C1F5A6DEFDC8638A26EA456C33C27773D6214F 66536CD2E44FD253531732D5A8C44B336B1BB47B0477350EB8CF74889B93402E 2356A9CAAFCA562315D8E0B3F42F08932CB87BA2499A875AFA08D11DA73B38AF F46D03B7F639A8D7BF88CF07FFF4E91716DCCE6E2CCAB60A64D5E40EFD8B336A 1BFCC4CB04F49DE1FBDE7AA5B2092A6EDBD913D161A3271AB6411622D0E14416 37F81E0102F5B0F2F9A2B27819E4BACD7C50E29D6291AE5B0973C657761545A6 741729620EF2BF1046B3913399C10982EE5F4142CF461EA31042E432CC79A1A1 39C607D22E45A6DEC008CB4BF6007CDE9DD5802B49A62C8E02A6D448B64177CC 887AD71D171B99E7ABE2085B37D90B3BD8513995D9A57F53184DA474F6DB5E49 B73E04CC214EA5398DF7D7541F94E623E8687B511640457A48A68E9D9D6584CD 15B57CC044D8091C771D175F2EEDD411099BC8F7B4317DC503BB5E405AEEB526 5E6E1B1F2705275D274E012A98F66075CEB90AFC648B964DDC0E9C4AE7B24CE1 80B051022E5781A533A21DCFB97893847D685137EAD85BA708A7E118C72FA839 A9E460B5D17365A0AF1F53A98319FB64A5819B087F554BC056C4BE44113A5404 BEF759F890C1CA5E7AE156F4F8106FDB4F8DFCCC640976983EADB30976344048 2A86D7B2AF4A01CA736B98D52ACE392AD4BECE7E61C710B08B66F01857CA460B B8376E257113E10F6DEDF14CE2A4E6A99ECBCD302C36CADB713D849EAE9EB598 F29DC98531D793B79F83091F9B136809E006F34E423D528CC4309AFFB3EEB47B 9A9DE4D5B25CE953345C326BCBE2B4912641780637783084D3D12693F8135483 CBB0AC4EE0B5610D7CEB7DF205830BDB9BB404DC1B28FB0824CC187B26C19A91 DA0025EC739BF3993700101D042DED86D67F5FB87912CFC51AA7DF53F2162D62 6314A2CE13810D0B8D81F45771391A236422CFA0F35F7A0CDF14ACB2724AA57B 7C2C28D53029B1146558610E0CFBBF72A85AB9BA308F846228F299F13F68E8F7 D963B2EE9EF7D4C21690632B640BDDAD0556EFA4EFBF035F13377ABB5CBC280B 9E0C12AACB153C93351E5BA95A7D149010E204950A59C7FC6581D9703468C1E9 EFAE37E7E6ACB892B3F8D1248D9A4A72F642FECC5E0B25C15EEB921EDDE84D12 0E524FE6133C4921FF4921242392C12FBE69744D53739F7E849C1B96C4020AB2 1FF10DEA608F111749E2FBD8DBCB17F353DCB3075B4F4B8186963EFE95A76A10 85AA5BB6DB4095291974221829A8E436680F4860E01C3843BE5BB3101D0869C0 EFCE08D187BC04F58C7A450A59093680A0F09E8E3F12DF5223E7EAFEFA01978F D8354753A68022CC92C71F2CA732DADAA8A466D4AAE5999B0DC077715671F518 E6277741F44AE798EE50DF44CCF71FCF8BC71F76374005FEBC4883C6EDA854B0 88C0C2B476709AA809ECE41AE786DB1A32B3FBBCC14921673578D3514C8CA842 E1FF90BE33F7B93ADF6BFB8B1AFBBD080783BEF056A6BFAEF676F7BF9F2DFCC8 01D255A9F0391951210D60D4D4DCA93AA858B38C0D7B8FD740D5FC6F277C2A68 54CC2DE1F40B6347201FCA2A0A91822708D820CE645C3E4E5A09FE25721AB33A 97871ED448F38FC5A349D81F402B34461D840D5768BFC6849439AB6115104F78 B87115B1DAE12542EA898F86ACE247709817850B067F537E6137196101D46DD2 D842EA03EF4501E34074E8458E638ACC4EB349A7430AB035BEF2DD4CE00554F9 18F9FE32A55AC1E7E50D64AAFDA278D77A7149C59DC5B1E3064A4B281A54C9CE A5EA94ABEAE4C6D5674C208ABC72563976487136AF2E21F835BEFD232D7F0D13 1D19932367F51D5379934DA7F1635AC51EE5CEBFA63D4D32F018DEF13624EE62 31DAE68A08DBE3B4FDAAFC75291C8C6CC7A657E3C7453C7D1461A36E88E633D5 408253B673AD87A9FB2D0F56DF1305916D14D5DD62051E27BCE09CEE9A1F14AF 1D7164BA5FB6E6EC8D38750F7E28BE330909F303ECDEE692E347DE13C8C2F82E 29C8BE6EFD76546F362A12A1C2DC12389EA95ACB4DCBE95620F0C193EAD91B33 BAAC5801AE827B9AB3FCE5D11D1D7854F8FA8A31670119CC0CA98628F801838B AAC7EF90AC5466BE69CE3E3CD9951A5EB9AC08014285422F6DA6F6E221BB30F8 0042A11F2E4B765BB0D142AD52F4D85785EA71B2E1CE20728B9E9306CE93268D 99B822A5AB5232EC7E26EE1160850AD3905864A01357F22722B6A54D4EBE58CE 480EAD9FBF068EE965AC4B5FD2FA8CCB91ECFC6E90B9C49268CA0B0FDAD23ADC D5A74B41149BB08454054C451AD0DA4CCF8B60F2EBD061AA03A011D548B6B481 FAB00AF9225BB5463F27FD67333FB51F8664536267E95CFAA0BE3BC1B8F889CB 587A3A4FA2B45864F07E11372C9507A625C0030EF7030A0B4D931BCC48F6DD51 A4D1F63FDC4B59C1CB18E6242E9F4B4B8AD9755B870FE60D640181FB7EB8120C C56F51DC8C47FCC6318C2145EDCBEFA7BC4253315BA67FD2B3D4AF6A9F3F229C AB75B592EADE15B1FB5FDBA1C0F786BD21A51506B7A2E42C2D086BA6F84D1B3D AC7531545F0B01346831FF36A52CAC1E390F99AEDC265B44B0FC9C581BBA6BE4 48B723811EBCAEA5FEFAEA7E5B987F2C7B3E9A65D2D14A7B74F099401C57E367 385352D0776D2A908F7A5A2E4D4160946C5591397877025C8C387CA413EFED56 8B142E8341E349DB4DBA422A4FEE56A573972A0C66590175158E48850A9F7F38 4B95726787B8F969FDBC97491CC81CABC976CD00A27D1DFCA7CF467A956C1C6C 839817AEF8794B6151FAE9261119DD5DB787DC9D3B420FD325ED6599FACADE0C 320D54C2E0D296537E22C1783670A9D9BECAEC63853EC2F05A990260DC189D63 7CCC0BDDF2CF7585071ABAC14630666737041194D0777EA4292AE60BD7F7100E DB568C90F0D899EA006CA423CFFD6EC70A5D3D8AC43C747DBAD3B02219E47D8D DE030631F4678C357A58ECC52782B31B50CFD44EC33F41585E51B27E3997D33F 461BEF897220AEC80007F13C5A1EE3A0430CA899047DF944831F8B010A7DE74A BFD26001472DC00CDC9F17CC435F61ADAD4E9AE062ED477FC621FDDF9242C449 1BB3F77FDD1519A251B663A693D84B42BF0962F537757F38CE5C5D56B98AB10A 3B70C8AE8D52DCAFCEC22E7B09D3C4EFDA1841C74CA975E4F8294F7BDC796500 0ABE197ED3737A65F7BAE601C91DB3983EAE11DA3EA18ABBBA3650DC361C2E77 EF9F97618B0C337A906FF39926D2B0B7883ABBA650816C4C6B34EEA836994EEA AFEDDE56E0099D0E09EB88EB093544B9BF4871200746A0409C475FC4232A38D8 F3105B0FF44E4F132378DD12D9E796412FD0F9478322215E9F59E69396C35AC4 097C4995B60BF4D8B3AFD0A002B3A6E4FA114131410D5658999B86DFDD3005F3 AED1FA8F077AD1F27EA249221585703F20FB70E37A26C6C3F2E101693C94612B 65BF89F37AA3C10A40EE8E49915F1A1B95D2193D8003DECEF9D76FDAA33B1AA9 CEDCB21C2A3B05747FB3ABDBD904B66EEC60CED2867442F5FE445587EB8BAC34 2210D5B0ED5550C4B54109A1B5D3696111A1457BE695A3CF1A5C16878D44BE38 107E327EC40A072AD969B0353ACDECB582C109585F829065A21C707F25D57644 5C5771F654CF59FB94240B438B67BF12069B6B063B65B26A95C303BCF8989ED9 DCB3811DC9FC88ECB05B7F242C7967523F4E4CF388F7FD97FD9C3E748326E043 DB30B8626F521129838A88FCC0B568A662516CF7768DDE321B4A1404AD2D82F3 5A9C76632524E10B9B8390F72AB65858B8D950BE71C11CF910DBFC410EB93102 9F830D6E1DD28E26476D6CDDDDD8EBC7EDA8813D1F6877E8C3FCDE9A87AEFF93 8F1585CE08A335C78209EB9E1FDD6F24DDE1B93E15F0C048B3B82124C17D03A2 CB0C622F1010138DDF4B00C68121CEFE9C3B78054031CFCC48E9CA3297D009A0 14365E96559B6BBFB5B95B278A956D013FB0402EF23E5CBAB8C8E2EDEB93A3C9 C22B1AA5893120EA0A3D50695150D9A6EF272147AD1239CD0AE4755F85F73190 CD9051FB1788F3A64774A5557CDFAA2C458E4193B1ED1F1B193702C91F8D54CB A6BB0D352F43A51F77174A2D513AB0AD5D98FA69DB8A0FC1C4981B8A622BF268 D53A04DFC941386ACFD9964BADD9B063AF92ADF9EFA24BD00538BFBA9053DA6D 0B9BADA1CB0959C55126C6D6D23DBBBE9BC79149B669D65CDA66BD47E8760EA5 528F180FFD8CD36D4F8F2B9D9934118D99D3662E2B6095D68100549B7AD0E0CA 002AD074821B07F48A56ABD3413647050F2BF20692904961CBFDC6A54607B10B 859012C7D9D5F69CCBDCFEF7350B57B40492AB591C0FC47B1D40345732AA8077 D5590065F4E85078CF54BDE4E6E97DCC0ECD38A8DBAC8FAE031AEFF80AF69D18 C3161F6AB96C71CE7CE759D6CB582825C69082C5125937F5662F97BDC23F79A0 DF017FA1C37C1DF476F519873F9D89D5017BBBAAE1919F37E3D3A08F9F359C70 AE82C86CDB9D11C76D67C18ECACE07E04F58D4EEBF5647C1C594814694CB758F 7A5D85D20287E5C02E9EFF76E63BCBDA2E1337054628E59888AC5533E92C7365 1E42F6101B5EC48CB15C642A32CE3E3A13996EFED98F0D54D93AB30D8C5FF72F 04980B4BB0B5039E85EA4FBCB984296CE16732A9573D63C7A34DBDD73B5BD6CB 4C31E2E134442B83AC6AC766D367B40C3ED40C5269E12333B277BFDE0C1999A2 AFE89EEC651ED7C8B230B8D1FD5EC0F46288FE5392F646D96A9EE512A08B7D89 087E0749B630145979848BC10EAA3EA115A4675883DB16F8AF3BBD3AED582B65 B59509DBB77237A31B170380031A3B1A5CD0753A5164F46878CDDF4854B7A778 4DADC81320EC69505C03FB315C87B1F1A776E1292D64967F8DCF791F0AE33819 0C4805EB88F88024A7D648A4E2A1943472B4BFE9D55C7BDBC36CBBFF215EE6BB F0728C19B50DB45966A9F6C2FDA05851E3BB008CE9172C12E483B5F8E2CBD84A 8BA22214FBA6F5F1A3BA3C5D3D413E1A1B9D15CE9E65C27D8E4C30DA8E4B7826 812D486796624B2E8465D9934CFB9DCD2C6042060FAF6D1D838788FB703B542C 89E503135E00AE34388264E105E8DFB7D09C3DBA0C5ED7FF1B2BB8C5F1273FBE F073AF1149BECA1C82E27BC1386B98A6A72BE86EFCD9F29DCA362FB14D72CC6D 506D60EA52A269718C90DD4E8AE6D420332A757F95BEA13478EBEAC439ECC46F DC03815FD28E46480B0DD907FBDD83AB72558BAFDBF5D5D5D4CC9C31054B7A1C 3DAB4B11FFB91C7D1869B5068BB6624907B272F97C4C07AA902032BDA74CD7B4 16A5FFF5C1E7E514EB445A0C445E036E0122DC24CC9E8B36A776F8F032BF38BF ADFD97A3F8888745D656CEF0F53E29BAEEEDDAFFF66151A9CDE4D1937762C4B6 BCD0B783F77B0C9503F69F59CE95F945AFAD4E0C300074C8FC709274C1929537 725749609D06F9521F77703F5130EC073F6788CA053DD0D52D8E6888B43DAD48 6432C71A2B352116FD4FB624140BA1506DEE4CBF91C020E3C05F75 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI9 %!PS-AdobeFont-1.0: CMMI9 003.002 %%Title: CMMI9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI9 known{/CMMI9 findfont dup/UniqueID known{dup /UniqueID get 5087384 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI9 def /FontBBox {-29 -250 1075 750 }readonly def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI9.) readonly def /FullName (CMMI9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBD07FC5A8862A8DB 7E2B90C16137614CDAFB584A32E50C0935109679E31306B8BDD29F1756946A67 7A7C2D9BA6FAB9B20A424AA0E6F4BA64C2801C2FB5A1156CBEED0ACB95F697B8 BC2A6E6AA7EB1F9FD8E3C9B1A16697EE1F0E7400421A7765AB218FC837A49365 82DC6B2C877A7DA84A81E6126EE96DB25C17A207D3020A045DCDAA064360DFFC E3CD50E21ED239D2A6450D04F879A26443ADEB6A20ACC504989876476C7D1A74 91564FEA1F4CC2C8C8FDF666DB537F315AE1886C73CB5B00E67E7B398A6C018E 540EAEE98BB8136C4F044EDD63C33431D2CF9740F051DF365A4045D9D8782112 7BB5D494D9235BA98CF2F30CB119F5A904C32AD04C960C43FC1F5FD8DA7D90D8 93AFB59F3FF4F796481AE2A7548F948FECFC6C127C4D3F159B08F206AE8C296D EE470DB2F879EA79475E029D22D7A8535C09A18689DB0609CC233E5199C02756 972CC9C94D9FCE264DEE5D75C8D651E4E2D1189AD9588CB815722BB5EE3C379A 6F31C2E6AE1AE4CCEB29766190AFA20EA937114978752189F1A9F42B39483149 796FCFA123BA9CCD1D9BE28289660BCAE16C40B5B504058D55CFCBFB4F4E3D94 DDBF39F157E63946534DA81C018B1C01B9F10DDB55E0A5C2B3985ED1977C039B D6755EA42CD09E27751E159C30B93F376DBE61CD3AED34BA36A768F232EB3B80 E3E6B77C4A48D408217818E398B83D995AB6BC871F20991DF57313D6EB0C793D 0F28088EBDB7F38DAF7E01AAB3476EC24D7BB38A9889A7D3038D930FF4289B83 F54A7BE1E2D98A3822098D2E4D067A0D400C20C0B2B4BBD74C13ED1B827490F9 ECF48F8C3994C1C5AAC9CF783BFA4F307528F51EAB55F961808A42ED53F00C97 72A432EAEDCFCFB622389BDA707B6ACC9433B065CF29EBFE93AD14B8ECD5F47F F073F11822C49B8BE924CDFA6348C3A75E9BB9BF3F31C41716B34794B28CDAC9 4DB8B087E180A9B3B17680F73D9C12C8D86A922C948093629F5D7F542ED882A1 692F4F6696865E53E3E2DD43B2D5E8C989CFAA5CA5C4C5999045E170BDE9921C BACD6F2863F5553EAB2BA2D4A9034729EC0C4201DE90DA89B0A27C5A5C974109 4E37BFB3F46B3A506169FB0C68E1CAFC844419A8D261A1FD86A3BB78E33D5FB1 CFC687A5975987CE45155E5FDFAF0CC5FD5568CB1C26212F92E88255F0549F59 41B33125946DE43436BEC00804063FBF03EC796E3361B1C852EC3038D107F80A 9198968265D5488B26D7670B22C2D75EDFFD1B7B4AAFA36DFD94640C9D0E2D20 5BCA18683EFB91834A3939AB8EB60E2F09655BE003582634C52770DA9668C292 2E02929D812EE2B0CC65F020064AD5BDAC5F5693B30508F40ED8E20E87149BD5 8DD41AFF83FD1944804017DC5A04512E593549FFFAE501131CE2FDB65EFD0B8B 33809CBAEE411B3941C241550B9C30DD28088708F1C0CC3125CBEDCD985EAD28 03313741F67DB5744A87B381147D5BA70AE1145C27F794854628D87D6C1ECCA1 749E3465B950175D3C3F40E344297BD92D3190041A4392033A79BEAEAABB8DBE CC14E39612F43721CFAE6F79074429221CA588AA2501DE520A464DE157A03AFE 3C082FAE7628FC0C57FFC61D0330AE6332D20FDBB09BF36848FE05E782D6379F 64F9C82C45402481B0A35989027F9756BF5A79DA2D96E10F39167ADB4305578F 90B509B6891338FA1D67DCFD61804AA6621526B2EE4769589A2646581712AC05 DA6E98D16494F07D612743058F54FEE516BD89A8EC3E03F9D7F905175D3412C8 F7329077FD6EB25213F3CAC94BA0C3363B759401B6EF7548C7D709F3241D030D 4EB46A1AE81863C412BDDAEA6084C37143A4C5E41BC646315B1CD09F934186CF 49D1D8239E363A435307030BD79536B50B723A39DD763DB539F24A10DDA12BD4 E467339D2D6DB177D6FC539FA77D2DE4118EBAC161E928749F7C753ADEF86117 58619F1155C563DF2E11ACA8347908B98113AED58FCD0394150EEC94B7F986EE 88BF7171D208D8F1774B1DD478F0C2958AE372D257E7EDF0F6B5D6059CC4D5D3 B00FCBD2E9CBE79235B9A5A3E943CC27AABB58728C95C7DBD4F4A1F8A4DA99AE 7377B0CC0BFBD454794398AE0D5F7281771FFE87B25A819F36E692286A42D776 01794A43CA9BB30FB8FFDAAF014F909A369E34C2F6C75B7D4EB9DB0580E33F46 19654443AFF8384B95600B86FF8E41FEFD032355626D60C7507C058EF832DF41 194B48A36F11082D1DCF4723E21401E0C7447AABFAB4639B26E3D2730E348F55 53EBFF39CDD03E06E2FA5FB379603C879EDB7E1A10F89695C9C47DEEE52BE0A3 F446F187AB9D7E93E6F9387F21129034F36DF40605D28FD526AF82CA9D232BE4 412567F06B38ECCD496EF40A7B243E46C9FEBA4F1BF4B1ECA029C5EC239353D6 C0B100BF7E7DB33BD1277DE104F15AA19F37340A777741AD1AD693BC76DA48CC C6F83CD84591ECFEE375979972B0FAC4C10B625E4BFB261B9FFFA83C31DA0108 4FFB6377466E9739E0EB64424BD9FC7239C7DD834EC6788A0F97FE714AF92831 E1BA36A8A9E24739F1DC82DC26CC3CE28C210AA7C569B19E1784D663A0CA4E81 AFF43E86D6F5F63778847700072CEB77A4EB946DC1F23DBC00BCE773203F76DF 00F0B085F31420672974DDC642D885E95BA6BBE43E1CA8ABF464D9881CDECC7A E98E31B9754C9B72A8BD5CF6D4D214DBC3BA7A0CDF6635953F5AC1E7639C4A91 C7AECE4C75CA3389C348F656FC2CC96C84C85A926237B6504DB51937C9CFCDAC B75C31ED570D180757884E27757783DB2D5F35ECC48C496CDA342D49AA947BF8 2FDAD2F19DFE8CD1C76A8FA08F33681F3E12E229D7DAB45BE3A3F258B5ED4980 F15340CF20D965252843E026803E8AEE736EC41CCA82167401977AB719AA2F50 0B791EEAA82027B3C712D2EB9D14BF8F94FBDE2227609BCAC41EC08DE2BAC023 28352F913F7DF08D4E1C66E83F764578B22B4EB7191E852B91ADCCB1BCFDB1F4 E63DFD152E86FA9DE9BC8908130EFDE29CC4401339C05B5B9764CF8EFF14951A C6C13AF979546996BF22F2B96D3D585B90CD27DADEC78914DA48432C6ACBDD42 20EF583FD41F2F6D6D10C3DF7DD077304B5940BB0462656E306CBD91EB9B756B 7014B1884A36201EC582FC9345C386043DD2818FC301EF78791C1D7854F8FACE 5DE9801DE9F59D5B4271E003AB897B2EF49501589D681D59CFFD9B03F722EEF4 74ABD29997515DA3591496B62666744EA76DCA45504F8075C0652D6779DBEAE4 90430C2945FBD60AD53B51DDBEFC7ED703C418B4B244C8FFA5A3C1B7600C5A55 3EBDB93C16AC191C3A28EB2279BD3F0D67C826BC6A73D3C0AD02262368AB4621 98A1605F2887BC5880E1AF2780330E0FD01D7CAACBB0F008A42C427F38236066 54799594E515B289044BAC4DADF8B3686B4372C5110201221FDA923F131E07E7 93C44BAD406838BA4D1C277EF74098B8C0EDC41EEDD58C195D7DFF5FEDBF96FC 19CEBC6C3006DD2CBF76916B4298BB915663C2F61AFD7747E03A03BD7280197A 9DA590E3D081C6F53DBF94E8D6FDDDD910A70AB18A0F6D48A590FFAB314D6CFD E3FB20C1F3C91063F00726A2C13A3D48323F9854839405E5A29D66A43E6E2B84 A8B3765F1D817071D4D6FF42BC785C2D11AB2B9452F141696CE19C6AFB9777DB 107D6E22D8CC6C26440BC48248AD8805C4329D46BF433741CB519B21663392DA 5DC7FC9BF37E5BC396BFADD7263D09F6B4D69594AB386B7BDFCF3BACB97A0E08 22013E716E642592A20136CF9CFD61D4E515D80E06A4CB4FC9D9B916C93CEA95 B83B98C48CF36C1D02291D4F5C0419338D64E33C90C90EDD2BA3B96D70FAFE0D 403A060CFF448D3E28A9B1E3916018465E86095BAAB4706CF7ED350D7C554789 D7F4FE5F180767DE8739259E68CF142040BE1E2E8C6152DE3417C1FAEA7584B6 20781DC4A9796431EE713DAC4E713C839D7A4FDC8AB6BFEFFE767AFD8B67FDA6 943AD387E5D3BCB09039ADB64ECC2BE2620C6EC269E708DD06C311F450099E33 AF46AEC644222E7DC4DBB9371EE12CFBC4F9B27AB46AD1DA96CE006E1DF8291F A550A93026CBFFC1087B134EC6EA76F5E109CDA58FF47338A0039A786A575F70 B8A03A4F9C8D07A4C856C77D9BCC8E3EAA740172D0C2D0A15BA35C9E5717D7FA 2691774DDE730BB9D7C70D7AE103DB8D35F3728470C76EBA0E670634E1A0BA84 2FA102BAD7271DF2680D86A4CA6FC353869987700E5E3FD778165456033D624F E9B3E80EBF431ACC934AA0357E824B8AD73E222B510DE8445C55C07C8E5DE46D E478F832BDDECAF2EBB11941DCF84CCD887043FAED9AA90D12BC8CA9A0C8D94F 8D3BF1F80B14B6CAE6BB1C6AA405AA64BB94D5A82CFEA548BA070796A02F9642 87326D066101435AB9EB40BA9EA9E61B363F5F5E3B924369796E8B78DE3414A4 2B79C6A13ECB2F34E6299658D07D2B3DEF3D4383CE009A927F0EF5C196652842 D96B857AB5E905201E7E8BA21A5EBED1FC6863BA9A1A6E5390407F75055E2EEC 512FBDB3E82CEA13663F1A1944DA072C765D8CED06AB461470C5723BDC1271D4 4D1D049D3EB131743F1EC9A6ADDAA038ACA2C41D139DC6A84EC3C61AC7F1E559 6155CC2F49171F6E07CF56D721D9728E87FC7DCBCAC46455A3694C765FE807E9 9CBC2D304AF37E0F28CCB22F239541B53A4D24D09C662559267467EA487BD33A 0BEFD4899B581D20582930703A868655C31BE935364CA6A95FBCB22CB714C040 9718824DFE97929D0482430726CCB5A5307957DD2432A9B6271E849148DEB76B FAA290FF6D0B18DC5B76407852E81C105EC6CFAB0F620C6DC9DA555A33C167B1 430A8BC338BFC7D75B7099CC906AD923FA107C74D3FBB719D77A4E5A685FF9D8 56424EE4AA074434B809D894ED50F6A60A035C5223EA25DD8983B9B34210DABE 718D7B2BEB293FF1B63CFB1CBDAFC69552963D90F5E3FF533A3FDBB626E9FAA3 F3C119E5E01C7BFF832A033C3515BF049E29558B1DAD652F2888E339E67D15AE 95F9BD14E3253DFE9072B24C0E7E85025B71096AF51C86AECB2921126A43156B EC812B32B1164BD9B2B947D503C015616DBF2024F5C8CB3236C1DCA653D661FE 6B1C19A22D272A176B7F1B7F9E67AF40DB0EFD4940E58B2A050249CA4E55CAF7 6ACFD84FB46FEF952D18552B3972D79D808B4C263B8C7E1BB647A2D03E102867 630D5C3F2C917F765A4F6FB8106BA6A9D0093E27A4CB6049C2371287D94B5111 6E7020776EBD744C6C920464BBBC0AC206033E8240017F8CCB112596ECD7CAFA 89950CF43FD87ACA750C03A778A37FBCE9C82C2F5ABB135BB02DA8E8C0D24475 3BEA9D79372D0022FF1ABD378C151417DBC69FE5C9CA38D23A3900E34BF924A2 90777ACDC37930B67DD44A2E76DDBD9B89598D5F626BFD325A978D277265DA47 38CFAF16E7FF1946E15F41CA73F7B4B02E5AE8FC4C37B115BC567E4EEEFEFC34 EC8974B1465AE57759EDDA28DD38A9210871D35D331AE1BE6097C3EC21C770C9 B25D040B2ECCC3AEB1EA1BF99E0C2C0F192C13BB9152CFCF75332E03F9CEC376 9B8C285A35F53655BE38713E09AE34BA2DA9C06FA42A6FD2D00CBF2AFD2BADB9 1571629C65DA38A431710CF5B01FCA68E8B8569922FBC3F9B64A5509B6F677AF 1B97E91FFFEB6308AB68AC58F9BA43DB5E764021E75B56170EB44C2C0A7DB86C 62B8982256D3621EBE3DB3994DBF5C5A14CF34B4AF3BD5697F8E3203085DE9D5 84B0598169760B925463E93DC87CE70AF4C2DF0F4287D2F2069847BCCF7A37A2 AD451D5ACE4DBCCB2E14D5DF38B226952E7446BF87BEC736EF3D5AE793304618 D66D3299AB9F9CA1D13F134FAEDF36750046E27706C7CBD8E0877BB6276E5196 BC2A355D109C0253644918E1CC11B717DE6FBDA201E769812752888CD66268F6 4ACF4A9449378F9F9923D584BA1B51F33663BE7A306887BC14A37E3C5A4654E6 531D6EB63DE3946BD8BA95CFB037991174F36D61D842071E6625605CAA350A24 FE551025D10871FE0E2599A63900C8520EF4911C53A03897C8BEE152451708E2 43FCF4E700C583A5E8DBCC03BF9CAB864DBD19E1760945DEA0EC0BA38BEA8256 D3A8D4F70F6685A99C6BD2BA8B412A26C002D76138CFCC7DF6802931E5D97BA6 0151F6A4C572235B4196B22B7B2D14B32886DF0D2CA8A277ABAAC53B63F64CE4 E4C088192AAB674497E8AF81961359C389B51F4A257373D907C615030BFBEF53 DBD99058FD06E352450B658478C10454AC8FC0232B70D5CB916981978053E358 99D322A07294748BA427FFD1E45C909171017B52B7C742FD77A8560852D819DD 8DD53211A14D7B2FD11E42941722FD3985D627FDAF87EB57326A0D290B5077D1 8A4230BEB40523A8565F95E0D44F036A571DB698EDD9D94FEC9512369E5E5E73 A3CA5C142617944F4F99C0697ED088ACAC007FCE06E5A6EDE7D0E03A3399DCE5 362271BC31533866BA79FD1FB3F608B22CCD4111FFB1BA35D920A23AD157C6B3 C3DAE11069D5E46DEDA7158C6478D8B8C0D9DC237CDF0CC6633911673C43FB79 E4F9B7F27495201E5ADE66255BC2CBE9D9F237DECB62A19D62CB41A1C92432D2 07F0629E913A71B3F1AAF8B8C5AC66D3C8605A48F8913E39C859E163DB1DBC8F 0ACFEE80A40B6172032E95A76B752B873FB4DF23CF3A655AF1A1B88C8DC156C6 190DE72973950565454C0A188A33395FD3D529A88F2B578356DE8EBBC12F04C4 5B899F667D9E6F3A4EC6DD8DE71FD4C2E2B6D56823EE4E0526679D71FF1B868D F261489F06F97B010CCBE640E2F57BA3DC3332B329F7958394BA9777D833AB50 005E8E9232547104065ACE33396772B0E0BD66D2C6CC54DEDD071E444D8C95F8 6F88B31E20FDB80F77C83151B7E25BD3736B4F9BDC52EE78C41E9475E5A6D94C D348AB42F5E36B4F167D29EBDFBD43B03F77EB296B06A36880FF17D412E77EA9 F2E7C25FD05E16BEC6732681EA21AC3FF6893B93FC09316A370CDDB86D9E6087 F6042C3F9ECD742778389170F5F041329782FB9F9702F7533E51F355F71825AE 2BF4F8FE50D413AC9A20C41B42537FDBE8DDC5A5C793D3760C1EE13716068752 F0AF10812250BEDFB4D7133FD58F4587BACD572505C84A7D3802D27443175FE0 0D89C3398B55176D8642AFBAB5CBCDFD6220C8488564B4306D74A58CD2921AAD 73CF803C754DAC2F30A5324886E273064FA51781D5BC596BFEDDCE3982EA1AA2 62CA7BAA1B16C6EBB99B2AAC4E6C9CEFB3D10F19987045C4918DB239E6E63D79 5F44B9D097118D081153AFF96E5EB39CBFBB99A3BE30909F614869031358EB98 F07A97EA78AE50375941B2474DB46AF3305F2B208D45921F93743A6CB8AC584F 6BEBE25ECAADD5A789EF60C9F54446687E7B030DA3E5243189F02BA46BFD28B7 DC14822E136AC7E40CE20458DDBF356488045C95907363864CD6943643BF0109 EE027A3091C11EA392EA91320EBFEA3B857370AD8EB86D73F035A476F7058222 E8CDE78CA1AA9EA69A8AA6EBFF3E67324C567B914134DE042D6F8F18A9373107 536E8D90189917D343F5299024239E2EC1D2D177D82DC8E344A7CF2AC71AEC18 36F139E7A4EB59A67192BCA9ED0EB25DE13032F6FEAFC3B1F4FC81BB0EDC41DF B9EB92618667C59EA499B788CD26C2137D70F1B0AF793AF5AD0D0941F2E746E3 F5A7F0288BC1EE11E982EAAE763CA422D72FBBC0D754AD58FBF92629DC8866A0 431213513744DB48E52EFC89C83FEB082588E4F30D7DA77BB598E51CAE7E4900 5CD570C914EFBA426BAFF7A56FC775ECF5BE13F2C42E51EF96784E5201C0B64C 074AC229FF0BFDF71E6D5E08D8755D2C12B770B6466A9C9C61C15582DCD2FF78 E9E74DC2B1CAA344EC0339EBFF92CD2CC1D62E2FA8FF15E7459A83C6CFA58A77 2F1A40BD276E76B675FD6834052B33BF9190F04DF6AA5FA3BB7D77A88DD5B600 324C5E28216F47682EC29EABF35BA842BA2294A3D72B126EBB852AB741186C9F FC84B12DC4A6CEC08F2D03EE61B65C845841EE17F1B765649A 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR9 %!PS-AdobeFont-1.0: CMR9 003.002 %%Title: CMR9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR9 known{/CMR9 findfont dup/UniqueID known{dup /UniqueID get 5000792 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR9 def /FontBBox {-39 -250 1036 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR9.) readonly def /FullName (CMR9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 42 /asterisk put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 61 /equal put dup 63 /question put dup 65 /A put dup 67 /C put dup 71 /G put dup 76 /L put dup 83 /S put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9AF72336CC4AD340 15A449513D5F74BFB9A68ABC471020464E3E6E33008238B123DEDE18557D712E ED5223722892A4DAC477120B8C9F3FE3FD334EACD3E8AABDC3C967C61FF003B4 B10C56D6A490CE9594D57A2D431B9E5E10FE3D8832E227A7087611431ABCD029 85F4865E17E17F8CFBD2CADC97E0A8820E3ACEC873F31464466A9545E967E53C DBDDB8478E69063FBB891566BAF88B7660A4405B16834761F041CCF7650AF955 F9E853AA9F5F4382E1FE7D0C5BB4023818A2383F91249D48CE021250EC9EEB1D 2835E18FB73026250B32A8849067D5E2258797C917F998F2D4121D96560C5FB5 B5D3471216639A8671B6DFAC5E3554EC36D9A72518525A795590C74DD70DA3A7 78BFC43E51D6F2BA52F17D4DD00D389D3983EC54912AFF73684A8A7E345537B7 E62361C04A47859DA084BC72EA53512DC54132EB2EE671793603015652EAFDE3 41C4B6B679BD60AEC5153EA0D2200CB1D097DAD770F5F31E6FC475A225995277 B867B731D5401E2D02B85BA85158C80FF7E2BBCC42B98AC867E67D25DB656072 55A0D32AB7AA483A5A9686CEA4E2B3031D90D84DB3E2DEE7706C91BA81CB8DAA 700E5F61E07D6998C9552C81B66FD10A10033D49EF3BCB0FF22ED0A3737523C9 8F851C61C4BF8A213BF6EC70C956AE48B5BD276CC0437C72BF6515B10739919A F00F6ADD2798CB211668842349171A5AEB0664D2C44397E55A4A9EBDF54A3EF4 FBBCDAD9DAEF4B0CAEF7112FA828F2F8D9F633D37E5516AB5ECEA87342EF8DC4 3A50548490F5BC9A8A1F98AC7AEAD9D913BFA10CA86D73AEB5BACC1FEEFDCC15 B3655522CCA2C772E902FAB2A6FC153597D52763EB44AB7489FF061F7F58E8F2 AEAAF4D17F36CBFC00D3C653F335D14240C87DB4339DA9D30A5BD1F502BC9013 461B9DB2FBEEC01BB18990439A0E9CA6576BC9CF6B1A3DB9386C4A5D4AA6A5DC CFA45FB75F22E10ECB72565DB441A194902C91427B4F676E531C661F7A2C3C85 CD534D1C89B6779B2EDC8E44667B992C20C70B663BFBF680A6CF4383EB7CA26C 4D1F06B5EF4025BBE65795F1EDB5CCB97050872D6C07BC2974F905ACDB7A765F 291365D6C8152153E7F017A25FB4476C60FD9EAF9A121633DBEAC32F62850223 D6418566AB350F90F4B35F19598478F76B63E347D4C61E203D4DB8ECB9889181 C387F4B663A502C638761D2782BB96EAC81A0108D7BD6938F67FEBB69218D115 D8E89CFABCE15C6ACC7FEB983332A51A6A73CF4E341574F366713D7FB29956D9 9BF238A87483D37E526A2EA2F101EDD34E34CB92730DCA7235AA0027189BE405 2DAB4AA021A30C28B26C50808E1E965C02F6212EC7C72F5683339425A7739380 A422E6191ED8453AF0CAAA424AE44DFA7CC5C2F6EAA8D73A5101D8E9517DBCFB 2858D0E8ECB7DC430EF23A9E4428CB7DED8D035D6050251AC101A2D0E884721E 2F21E573F948048BB8FF888911C508CC198BD750083B339500C426AFCD5634A6 AAAC1C7E91249667B231BBFC64B4317192FE07FE9DA0DDB5E517D097AAE46577 9555F29D45C67CDE9812CAD03F220B20519F2FF32DCA56A554D4296FE2D1F3FB B209B5270E0E695EA5A0EF1144957CE045881AEB8D05D72CE57F4D34617AED67 0D3AF0472CD8D60933651626550366E300E72A9C89ACD475C2E2ED9BD44B472D 9DAFE943F8E02A6DC38E447EED964624C37C3130E48211CA279BB6A0BD59466B 42F3D89B5746F29E084E22CF58395AF0F29E55113F3A3F2F52CB3A6DF3D026D0 C81754B8E2E4A15F6943BE9D0087D5166060734FD07C4C57D7C7D90E8C9C1F35 623CEEE3ABAE75E1A18A1E3B50B7266BD2D8E812CFEB4A46B856885B185640D6 B9C22179551002B94282F57FB433B7FF157D2F0D240836B72AF4A331668AE5D4 E6B85415F4E8B9D2F9AF90FAFAA0A3866DF417CA5A31348CF9B41B8F5F4D2F97 CCF7ADE851B5E2E2F6E319AAF5792EBB9DA2C6AA8B73D889F3CDAA42932CDA7D 07A7E59183CD89520DDFC36E5D513BFD8AD0886046585F29B4D7F42CC0C27AA7 53915AB1167D292FE91957E94A57FEE2D49C20C9070ECD736BDEE0F046E60350 EA539DC298156A4E0D019E7D481FDDA6861E20678516AB80ABEC1F09B126BCB9 52E8272A06BB6DD87ACFC423B4A4FC9A3DC8DCAEBB807C5F748F1FF8B17B8B88 F426206BF1B7B7D239D26BC3CF0776C467A98CFBBCA5FB6145D5900137ED19DC D002F10704AA680EC753C22E29AAB15712EF22AF73D80820A1EEE953463D4EA3 81FAF99518D4FD0F862A324FC44C4B9542A92C5B60CC983CC8F647CE5BDB4D6D B92B380E0E5F7208A9CD91FA9A469548162C761C1BA05AC9D60B766764D821B6 B4E17F56CE455F06EA1EE2D38FE47581746C4C5FBA63AEE2B58E877D1A8FA83A 31C972D53B64E92EEEA147426A92CFBF76FC614119C6E9C6476FD6A069C803BF E949FBE50B5AB1F1463F9747E8D353F7BBD991C4F90F920BC9407D8E24720293 846D052214E60390C3CB926D38C83AF697425D80C2B4FC4706615B905516B733 46ACA325CEA68FB21B2D17CF0B68BA4DF249368625CF83441EDBF2B86C957C1E 44CD722BD2537CE84FBA07EC7AE15C840041B9F7F3040072E6084CD55B301C08 A64A53BD4D3DC30DCAC6C152F316ABC59B8EE978793EBD568849DCC2A75A495A BC83470D503F8E389F54B4A4A31624E83C601B43AC1E52CB811FAA7CA6B644A5 1AE0BFD4FC774C9C9DFC2769ABFA9C83F900BE2DD4010416053A1D4874E6ECF4 D86E44B4CAB15D53E5630C144B0C15B58DAAD785BA298B1893D1B09BA5D40344 6678FD2D17FF6674433C976D6DAC659175CED26139967C9B2B9CFFD78FC2570A E5142141C2888DBF2DC8503F9137CE7CB21A1EBC2D65BF33FCEFBC85C9CB736E 24E8595CE934AB032CC70BD6A3B0F3BDBFBBE185512FDB7BE3D4A6620478453E 75D044BF770B44C9741E31985E6DAF5A318D7BED12B02A4BCFE60D25EF12843D EFC9BAE2A3F2EFAD66D7858E83EB46BB09D2FF8AE9C43844A7001C86ED97AF51 C511E3A89A1BE349FF5215D1A57843EF51456B9838133846F19BE79AAA5C1AB0 5F400E5E8E7B0BF96EFCA3B8F0894BE589F2C9FB6C97BD16D38F0A237CD4F034 099C41F85C7E2C7BEC8E02C4F327306A53B4B48B26A8926670CEEF96F6DF2281 7C2DAD99EF8B81BBB777227C2475AE7400DC393D9C0445E925DB1E955950F7AE 53E9AC4306794239346A419F7B5DF4168382EF5956B81F83BD4BB7635B3BCC84 7D84D05AEDC02D14675D777CD19B08124001A4F4EA96990D96000C082A12F00F 7FEF793A7FA69D56D3A38D012168C5458B667190AFE80E02C816CAFF0A71953C D80B085CD286027E2FDBB05452AA762FD7C813B2E19A79C74190E04E746C4933 CE1E300CAF5DD53B08110509BDA404EF07FA1BC5224BF1205DE8E0C3276A13DD 866675103B960C5F36644F96B4FAC16F5D6E91F74629B318FCCC8E8CB13EB76B B0B7B90718D913A52A04732EA3667674994A325A7973C601A7DDD50F658E0826 ACB8E53D4914B0274AED98D7BC3B2B7F9D48A7ECC2F8ABEE05CF2C4F2B90360B B7DF779EAF3E103D1D83EDBE32DDA873768D8C37DC10A5354A94B4153049AD64 FF3E0BB51AB91D7C0B4134D8731CD0270DAAF19BED9EAD800A14B65B68EEE89B 40DD624111670DDC7C030DEFE0D1B96420E249332445C155BA96231C88E70643 D526BDF3CA1E05FEE72CE2B881CFC01ED780C10E89F0828AD55FE29043BC56E8 2750A6DD15AADD54492F6092618F4CC6A31766B17FC60766D18C307EFC9BB787 39047DAD6B38419EFBA46B4E2C932F97451FE78AD75FA90DE409FC6DD46585D2 1941F5ED47A8FBAEF5A917A240959E8D9F9917DEA3247D9CAE6BF7A88DB4C4A4 F9F5A6DCE542420A032FF3392FE0F3357B51F884D6181583A554F75B1DF192E9 253CC828FF06B0D992D5316435980B044BB191508C7C45CD90F797F88856424B 14A5707459C50EDCF3E3D8D1667AAA83015405354CE744C66D9A5728F29E0085 6DBF740717FA0799E3BCC4ED7841588B496A5E549B953A7FD288B4A045DB611E E3B2F35963FF18ACCB1C968BEEA2CBF52B3999AAF89A05320BB2E97F52CFE06B 9F10E3A79865A3059A957F97972D80ADF678A36E2B586C101FC6AFA4D137C13E EE7102C9B8EF78CB057F8B7476F146E8FF5C897FD5503DD198128CFF7B5FB339 FAD0AF0EA967F77B07B367A4AC9F668F8BED99B98E87FAC750EE045602D76C3F 289FC9D97694C96AAC0AD1BD3FA94DF2CBCEA24B40F47B9B59E54EECEE7AC4C3 A3F5D19160E4C1EA830D57FBE10D8D46AC5CA0260F22FAA45236F0F542BEA9C5 5A88F878F68B36114E0573900C65E305462B22A3429A17C7A567694414DDDA46 5F30542B8FD4F00F6C295B2E8D3A986B953D96822DB2ECD48E8BB1763434E652 152EF3717F5E7FA10FF0B01D9F64E22C5DBD7254629658887BACEC0ABDE972EE 67299FB84A05B3EFE22B6976DB4CCA384232DDAE38C31623A4E39EA2E82C1EA3 BBB68F1A7DBF405DEC37CB7203A895C36A44BD2D63F45B3888AF91D37B510A59 3C921BB44DA620892AD87B665F69F6FA510B071ECC403CB2BE2F54B3969C9E88 713244BC97C1466DA8216DA7600C221E7E7EF5C789D2E12B36422023A03E11BF 2790FD6062FE6BF62F5010A92F0A104B76E255A0975E04F6F20F760881BDA7F5 D834D1D328B6EC19AA7D5E5678A84C74C82553DBE8BB5765E84F5A8789032143 6020940B4B8D45FC3433D356E28C25F42D0C19F911213D85951B2B00D01B77BB A4C72E964F9D95422BEDE582A05CD52E03D28A996E6CC8FCD910CBAB728073F9 F9FAEED5470FFA55930447C5BA816F826F983D53EC9941EC8364B3060FD74C95 26D4F5CA753B574FD2FA4D1D333785241D8741B79E628BC852FDC35478C5ED9A C1BE88C5EE7302816E65C12B58EA16FEDD4672EB3E24B6EDAD5DCE263BA8A970 350B651E5A9F3C281D85BC3F44EADD0D93402E36489BA5185E7D388974B0B700 70575188BB610CCA20F081E2CBDA13DCC6F72567962ADB342E02C1E763B673C5 F7384E24C6E1730A3A790D690A2103AEF88E0C1D4480DC9B25E5C8C9E1919C95 F83320179B4C7C4A26D559BFB24D7D596FB73758C9990C451E77FCDDD17763B8 9C30A9534E3CB6680D3D419D4B70B0B0A0D160FCCDE169714E373F65B7144CC2 DB9A44E041211E1517D3148E65A2486CBE5E74E625261CCF65392FB4F3091473 F9E8DF327D59A58558E5C9F7190DB577D5DC658F5E36258291C708B3D224653D 064BB6079F91293FC733710893AD1C96169B30CBFE4E9D52E7EFAE4AFEE68FEF 1AFD5E7E9DFCE8DE332B0FDC0514F9B3090AC85BBFB527FD8034DD33E9576325 A8769AE09AF1BA792447DDD932B98FC9486B39E0B04DDB3EFB7A30DA0940B33E E27490E0E841E87B1C90E5248A91742ABEDC10F43A8AF0F9C5B4A4930B1AADAF 01874B9AC3B8D0DBECCDA6CD7E96471FAA15CB7F8A599C5746327CE392224C3C 40BD60AF97BCA6FF6FCAB2FEA114D7300B89E91C3BC92D5B3E2C83BB37992D8C 72F661EFD0AA034C738C019DFB79BF40651A1A34BC1EB9F5AAF58F8B3DA32645 24AFF8636486F08BC21533B5FF7391B0679A78DFDCB03DAF6BB7475A1D51DAC1 EE4BE9B986655D1FDB6936445EF99B58B303FE79F11275EEA96A9F6808EA8775 D873D1052FAC93769789C700F20EB2ED6D15676F6E563A769CA9298E463FC311 83281483B1C953370D196727A6A0E66D32D9480AB1B6DCA77868C1A2D5DB6483 5F31EB6B18EEFEF1CDC31533E69B0AFC6B30FC9912DC89BAAEEADC30BE14F448 1A6B70D36A5D9B01799BEEA686066114910842D022EB464A9A1E8F0A5628BA69 AA9A1925CCADD44703BC67A89F3B48E4680726DC4360274185CF3C8AB747A8FC 4B928AD62B092EFE48B01E33ED756DB696171FDB775396BBA138E056F71EDAE3 7A1E4CC272B8418114B0E81DE0BC43DB3C133167344488820A92DF10FFA26FB9 65FCA2C87D302E956DE6B4FE145145440C83DB43A68F8B29A592B127BDF49063 B7F11E155CD4CAE305525BEA56B7C412A6260426407BD892A3F2B444AC3421E6 FB6E6425EB5C3053C5644666B80405530FA0012B54557327C98E0F4F064099A6 4ACAAFC1870359C1B6FBE7606BB8A26026AE20C212210449905E628AF1B20490 8CE908B7EF3E3DB551C85AEB0F7FEB6A8D215B97998E5DD9C7CCFB2A9402B8B6 1770D4023777D4B45A73F471355353412C51D4CE71FAD1E0AFBD87B5F86307F3 10D0B94F1194EFFB64AD5DA54A4200490F609CA8B912E149F8217ABB1E9EBB3B C4470E7365CF5E1E761AA1945044B225BD53D142F6588C50E0644740F7DD55E4 8F73201E5354A8BC78339211AFC4935F44701FBA043AAC4BA4698E9D7700029A C79F992F62627C91EB855F64C4B251718FDA71EDAF082A0C7B00550949D617A0 7071FB14F05620CCF2180941341D8E60FC88823438FD728A4042AFA8B853107F 852F631518B61B234565291B5D5B89DA818DEE3AE3B68A2869DFA63255CC882C 3B16BBA08FCE3632E57FF7A07F857A1F0FDCADAB39D77960BD827CCC8661A997 648BF5BEBC0FD2286C2A112A8DEB9CCB6330A049170D5D68EEEEA011D3EF3EBD 855236B9380087CBBB6BE24191F728B7EAC5B50F7A547AA0989B7C7D3437DBCE 1669341264E290646F2C8C5A3ACAAC7CB63DC692FAAE13E9B40E8BD39FE16A0C 1660CE66872D061056C04DDDC265C024BEF8B7E3C3AEE76FE5C9702002C28BE0 B180295EE00E567FA2E5CD1638226D24A7C732E1BD8103B476EF5702768689C7 D4FCD47F2AB94A2B1FBAE6ABF87B09E7713C773FB65CA83F7318035B332B9F99 24A2C8897527021321D003AAD7C273E4BFA2710B9BB26C2CFD3D9A5D7ED1096C 552D50028AE2476FCD6D12A5D0A897521313ED1A3A8456A70C16EAA50A3E6733 6DC89FEC56AB54A579EF264377A103939D5EE00A90B4F2206D0023AF9491FBE0 800C6540FC945199E20E945F46CEEA2E885F6800B9DF042BCEF4291A4B1A62C8 6A7ACFF872B25FA3AE69E0093F3D0FF13A3313430C06F1AF94D500431566F659 E8C859A5F80F5BD2E85C8E32603D3745628E8FE6FBC50FA68F9C3811A2BEFEA4 5852CAE2AE5AAD3230ED050593BAD0A9581EB7B327C6916B8FC348F4C23E6FA2 00FA28AAACCB3091C1D83F7BB88672A53A2EA3B8C7C24374E400C57F0F01019F E52D5C47F389D4C9AF126F4080F9AB8D1C8F470932BBECCEC72A9796F6E965A4 82057DDB43D68298A00880D4C2E2496F26F015FD83C5549215753459310339B7 6B2961EEEE74DA31FEC8E2BDDA42D4080A32372AC372524BDDA580EF6634ACE3 128C69D04D890DCA337212B109585C665AA83EFE47D5BABC2627A86EAD11BF7D 744176652C7F9497785A7A06A994ED8414BBE8B26E74D48CB83FA24AAFBDD507 84A90195EA3D77BCE8C2BEDDD1DC52E8164DF15D65B916EBDF3A8A76849653DF AE3CAF9561AF3B705F75B9E5DFD6758DB65A2FD54683759912E0D0035CFBCD86 5D22CE175F9E50FA2301ADBCFAAB2B89B8917307766C4D228198F718DBA1B2E4 BBB59748043483206B2C87D3A6A95880E47C868308F390EBB8A2F7925D14E782 6F40A532E02978A494F370A732947755C8CC6FDD9F7092778849B9887820EF5F 67871FAD992447F76CF16F85D0A04140B7A29CE125D733D197D58FD4186D335B DBD88456EC1A698AFBEE2418D715F0A4CFADC0E9D88F83AF8B6CA0AF8A510C59 E63798EB43CAD793E287BF3CAD7E8CAE1E9BB5F52171A78D4463B995CF637964 5825941C8B7E1B1408619FCA686B5792D720974ED9249ECE9FE8FCC567D66582 903C00361D3E72B158C3AD92707D0FA8D6ACE4E66AFD3916267CE37DAD4D1373 D818CE3F6952EAB0E1C9F7328D9A2C4EC787117853336A14E258D14211E2100A 636C28C34EF07F0E59BABCD25E48D57FC896D57DFFCF445C5F8015B05CBC1E06 3BBCEB0ED5F63317937B6E3D5ED2A177CAAC366A85E33B1D60649626A1EAC051 CAF959945AC0B31D21C930C20A2C4EB6B7D7B2A078E2140075279B962D6D0A0E E253AC638B9D0E758FCD57D9685EE33312C1A0A5CF1762F57C0C7236EF014B54 7DB1B8C3CE37A262AD69A31F5A1E4C2BCF7C4310523B30CCA645B8DA15419438 C2D541657DC32658E7F14C18F6048F3DFBBE365542B2411B2B72CF35172C6264 534AC64D3DEB13D303AF97D51A071EC797D611DC571CD4A5E4B308CFF0F78CF2 8A475ED04DCCE94CB6A54B5D27A8719A0B094E42D3B5FA1D967E96405E690437 6F9F1F155B7FA0873D8AF3D270825B0EF286176436B0B820176667500E587821 56ED77373459669911695E73E63BF4D510C4E7701979B23EF39FD99184A9408D 68E3D41F7F57F05CEF384408644F205FF751E5D6FBE61E3F311D919EECDB4F31 F756461AD5DA5910521533282982BFCF345E03E778E246B3B724F052F2CA575F D9D3E3D30AC17A26B475E05C704BD74D1D01F18E577035FF3493BD3612697568 EA0D83DDD7E1D83FAE2FDECFF5AFC8ADB38BEDA28D35D73282D4F1F9A15C4403 B7C69C7DD0C608DE99FEE68796482566340746AE5C0A6C9F3D11C444DB6BEC4C F3670414C2A7245444DD74DFBBA2160A55193E29D6D60714F18E68A97DBD6005 F4BDAE5FDE71C4B9090C87F63042A37E8F77BEB36A2E98DD78E2EC22A2130727 C28079F6A3B511988F94FCA110EC6C53602434BF4C310532D16EAA27D6698E8B 721D263A0B11C7D838FBEAA161792D77986A9D6CC09F8424A127C4A31F098233 4E7A923E67C7B4AE7B8AEDDC17BD74D054CBDAE8152EDC442E9ADA41D438ABBB 26B25B523D8694507F2248F649117CA18CA40F45FAA766E2FA55FBEF47F851BD 9183426FAC81E5336F5D8D9742DCC1369B201B4DA7CEAB1DDDDE85C4E0C47FC8 30F224182D3C59603B9AED05B97DD06C993D12D566927F29AB2440EB92A6A824 1D7FAD7672DA246C481A75226FC30DE2682CCEB4FDE1275728AF9156CBD1433A 4AB019CCD756FC47DEAE51534A8DB46016B0548AF522549852EFA94867E63CC0 3ED3A5C17C70BBC9515DBB6667A5D2F37229EEC652612CE1B974CA7BE2405309 6A1DCF2D6B62DFBC35987EC5FCFCE134936AC7C49676D3326F01080F241EA8BD 1E7D62E428A3895B80C589BF9525E6588D3D2FA727910ABAF5108036BAE35A09 6057B47F7788095820D3C9EF826C2CABEFDC3B5E213AE7C4ADD622E4C0AC7BC4 A507719FBFD066BEBF80A5D81CC2AE21BE2B99735B8D97F7A25142F698F4B47A CEC34F01DE7F278B4BFC7BA7ACE348CE799D3BFF11CD94CFFC8AF0A6EC543FB7 5D1649D0A7A3AE2DDCA9D8DFCC07E2FBB9C4A68DC3887E0A00795C37141E2C35 22DC637479D3849AF17E0D79D0F6E08CB53D454000CB7A404F8786EC7357E67F 692A507E9D9856B6E5B9BF421E82C137E1F28BD5C658D024E6575D804D542B9E 1FDD366E1A6DF13E9D0DD75DBBECE3D63C883D519A826B246A0A2F8510DBCDD2 B76FC45D40CFEC0BABA78B91B5C01229AF428F3F75B7A3095E862E1E5DC6F39C 3E36157A223C06F87F30465B40B3FE91A166DE2DD3774D903024217DA6C56E25 1D40D59342EACF7F0F039C12D8CCF516AA58ED351621C368BA40F4B9E6455261 765317BD77C0842991601FA203AE3415AEEA37E86909CDFD42FEB80EE19EBFF0 D3BDE9B4FB0A540610BDB59FC4EFF8586BC529911DFFB6FA3628B1EB9E085C90 1D9F3B89CE8CA2F28C335202490169EBA332D051E15344DE683298529202F18C 584BF5F2330AFCE8FF92E2DF9B35F469AC8E15247FADD310C58FC911D294EE7E 91E866841763FCCB8CF7909488B3C1295FB343D52859CE320C6B0B3E6E3EA6EF 0DE68E1B1121A3693BBEE1AFA053BFC357952138D5AE6D9A725012689A9AEFAE AD65E7F5D1FC332C16C8D21C2640DC6BE3179B50B077DFD0DD1901FB57909918 D07EA763A0BF731B73836E6207CAABEED9DA54E2E47F4AA44281D48EF2B51849 E9DE6485CD320984F6AB0F628E6B995EB81344A5E312766C0B33052E169F1309 E56D6F9F6A8B4E34F9BAD50E1C9875B73F1C4845B171784E274122AB056C8263 2A309D4E49F37A7E46F76221C76058EEC75AC30A07E898452AE1EA4DFFEDE5C3 BB23007D06E2AD2EAEC84A3320379E4617257DB42AD345D26AFB16A8B78CF2FF ECC694D26DF8E1BF01A9449A0575448924C19DB2E80E179662AC7B986B4B41AE 303D7F47D3352C5B67BF906EF4C27E9A892221DA44DACAA262C73A0257B98EE2 8D390F3F22044C5B843B6CFD084CC92CA7343C7BB6AD93B953F7F57E5E59EE02 AAB8F3961B0B0E5F2DB3B4AFD3E23F2C1AF5CA9FF85C1F32681F61A1E123C36F 61CAD763BE8CD0CB7716D6AF6E1A71D16FB180584CB2DE91604E47D78706C0B4 995021060EF03AA03F1D6B27D11AE246058999849FB4BC68BE034E8FB6733B03 5BD042D0E5D3B585946474143A2FD98E1E99CBAEBD8D89692DCB088C97B2F73C 50E85D9F06B5A77EC3D07B2FCC0EA0A36D0F0DE1E33F5EF3BC0A123A43B3E0F7 FF7E18CFA7C1D643F777E936D8EC9413AF96A27F0746ADD7AFB243AFE878B12D A6296EA3D611A35876961EB8AD8A29161B825CC6F4F07C4CC838EFA3CA2888B2 42AD01BE691BC90F8D8B202B06FFB4B0C84E1E772F704E8D66BBDCDC8E568F5E 38B3132CD91BBF6AD81898EE92E7E8B632B0D940859ECE2B16859B7A9EB5C17F DCCE331D9A35DB1FE9ECCA7AC696EFA22DFD59A9F69834C7F2E3F702783B9E9A 4CE27289A1D2B25A5BDE466FD2A82BFE3FD02463ED1E34AE9BD94DCA24C86739 4240477AAC467412C6A48414E0444D17175C2AC443E7A2CE4797535171FF0DE2 D62CC2DC88CF096461E1A77F54F9FB92456202A456326374B044F382E4ECE78E F9B765C32C5472DD088CDEBED85D05C3F1DFF4A610607C1CB11E7150A05C0330 263370B333587FD49F9BA75EF9454D781854D461B2681AAC16ACDE52AD043E3D BA420E0226F933754D5C04F9E865B717FE5176BB73C0DA6476DA9D20F340B21D 5EEC463FC122F799DB3829D9EFB19CE237570AD52B9285CB496CD0A05E56E704 1BCC3590E981C86230DFA113634153D0B8D900D860EAE1442BB94C81E9A5098F B1BA065CAB9859B53682D50E48E25FD08D3531157C3752D28836CFE45EEFC71A B4A6056F2CD233FBA5D57BEC2E9782DEBE7F1C6277C4939D8595AAE5B24C7D60 8EF7AFB8C434D6EEE36095F1483A343F7151F4E37271016EEACAFAE4B8CD685D 56E8DA0CA59B596CD431460FF025B716B7C2E52A3E457F8F6F13BC6F762AFBE3 5307847599B02E5AFAC09E43C3913675BF7D7299BC7F3730E9B8C369A2359A62 52EB56D06253248491D4A463094635F4BA237A0B4D74566E8A3461546FCAE5D8 97C6C07D083CC30B6B4E982275486D807BE4F93FBD867F6450A14A0CB7B47854 90AC19703529D7818DB9C230C73B74C434FDEDF1533E67926C208BAE6108B9A4 61462F841C697CAD64DADCC8647BF4EC0ADBB33C7A0EEBEC27CF641C2F05595B 5DD4A0D98B5D1B079A62E8EBD91B97605F4FB8D0AF595B424F58F203135B358B 325347B39037DC654967D55ABBBFD1DFDCFB8508833D6C8C230069291C19AE37 C73182DFF94E764249CDBCABF5403FD25CF9DDD089436C5FED1BC62458BC3F3A 7F1765CBF1F6FF004D037459C5A95040F06BA80192BACBBC497DCBC23ABFEA08 878C96AE215BE167083176AA5E0CD4A1030E4DB93709FFA1FCEEE53FECFD5544 304783D571450F7FE5E47861CF9C7A8DF2888F8ED12FF9921EF174A1024982C5 0DF05D4C2FECB74802BE2032721BD823A776679888E45C5AC2A1424DE222BADA 8050DEEA928A8E7977678E247A9413093258E2250EDE4DCE7032BE3FE592EC4C 4D527FFF68F5AB4E365F99A4641DC84303331B5256A5504DBA6B65E3D76B2077 EA99F57D0B4640C0F5E0FE47D7D23007AE4FB148C2223854B74AB097E568DFC5 4AA7FAF03D6C47F4AA203C35E4FB58C5BA1C4F674EF7F1E8F14229A637DD7D3C 31F6EAD24B5240F36A044A9EF731E464904DAECD8C7BC97889565DEC55D62D9E 422827DA4A006BD99EAF4C3A66A541DFA748986C94A3509B36C32F13B22B86AE 5DA40DB760684294DEFCF9ACFE18EC04CBF2DE60CEC18CC7FCFA5019C0A9C1A6 B6C63E19B0285AE8378878B8C08B957165C3011775E98EE72B525F30DCAC46ED F35C8246B2B4D1A301E7278AFE22FB06061AE48AFF2E1C3DF99DF428C6383ABA 92D910DFDBD9A4991AD228A10EE174C4943C531F089644681ADBE03E1637A6FB 6053ADB5F082D7C684D5878DF2C8A326B049BAF9F0DEE2CA37562D52A6ABE618 E68F353F17B7CFFAA60A01DC92EF20C4D928513B44BCB66D98A23C9B63A2AE0E 61F20296524B7D1B5B090B4B43841DF1C4E7903E25861D107060E22A267AE180 DD286FECDAEAE17699CC86669259677A648AB1C0F18A2D802690F8BA1296AEEA 4E9638AC9C30DDE73F38BEB21A0076B12322EC98B39FE602978591CDEE11BFB7 F299B5369F2292FDEE2EFC9E96A6739CD30962885295470934B2500881C0CD30 C40A5084AFA8A975DB06DB081CB51F96F84E342606389EFF2626C684911A1F15 7315F7F0792561C97980857A03E60F3FBE538ACBE0953EEB54A8A514CF0FFEC9 4ECDAA1DCAC6355EB45A5E211170396ABBF4BA4BCEB33CA807836361DB4ADB8C CA177D68BD6F326C24A776A19EE67574DD1BC7155BC690A42C69FCD6E2D1BC41 1C2CB7ECF4F42688F43EBB03298F8D9BE1F86894C94CF52088F5883886B8861D 3E8065FACF4DD72E0DDFD8FEF4CCC1023A53FDECD4997A9ADE5E232C9EE20156 1F7093DD7916E4CADCF2F157EB1662963564B1A7B4B302311EC2454E723F21F0 5E21A663ACB5D4A4023D1D180CB41D37431D40CE27A90F6D1B95B282BDB8880B 1E41059B0FE4937B0E337AE9556C3DA967DB1DD77AEF8D321EE3C35F24530470 23C2ED5757BBF99DED4260327C46458721C371A6CAFE5EB75C879AE2404C65C5 85352351438EE9A0369D9D425DEC1A19958CBD921949AB9B848A1AC7F57C7CDC 2CCA8E76782334080EB10D95217E1C733B4F34B13D99E42A652159E372DF28BB 7DB8ACE2FAF02F9EC8259248DF2DEC362A207AC9958C871189F90F92F535891A BAECE0C5BF4FE6AAB3C3ED5F129822F8936EDB6E34570F8DFB05A4CC6D2D8A22 E030752FC63E65DD947AD71CAD4076DD5FB801EB61C32DC5FEC584C18FB104B9 75CD26C2A6214FA4AFAC55075074DD7896BC92D30D57949D3234D19B99359591 A1F97B11CAE04C49E21AEC0F48BC7E27925D094EF342274BE8BF5ED1A7ED8287 CE82FE0A8AB4ED4565B530C2683C32A61BD7EE32D5366069FC68CDE6EF866486 37D9362BC73CF628390FE6E360B7166DE96868009112FEF99D87D4BB7339BDB0 0691FF29E8EDE4EE96F7932B15FA39CAC1B617858F923C99CE7A87D42665D0FD 5FFE9EC17CF65934B6382500E12B5C35FC29AE031ABFB34B1FFF88AE0EDF8066 0A26092BCBE4F1426A1E8AE7F80170BD31A8F12DF2559B023B8453BF2F94ACDB D90AC685CD5DEEB27B3BAF5595AB7C2686C6D83CF422235C6A2E45EE48E711E7 76D8638CB2E6BE585A23B0AED5740858A67432D9EE0B47435337C550CA93A28E 43D769816E791A1AF6626711181A3CFB306741B038B6DEC3B02A231ABCC93362 AF10691ED995ADE83237741AFB803C367E1A2455A00CDE3F4FBDA821EE68DB7C 6953534FA33EA29CBE2AB98C1F877AD361463310B63756F6AC6AD4A5B049CEA8 60126C239A676687B580B23B56D6DCEBC8E892F642884631D77EF9ED302A15B2 1E6F44AD1A3AE19BD656440F2A8B4188B5D3EA8A0F5F793AEE0ADEECFC9147AB B12C3B6FA8F9F13B21899D8C72270A9A8C0C8B45D8054019604336FC43B313B1 52AC7FFF33C798DF4B4AE5FD8A3CFE761BBCEC62F2451729F4218C5270CA7B1D 32DFFF684B63E7C614B9D76A3D836CC798C2AEC29A61DE50908984ABF886DE99 2599FAAB885371A0C8F67D5C10E6155EC19052E239025111F464A77B7A3D9FB2 5948E2EF71614A3A93D43F24CE28B949E64DC21695A948391ECCA87808F043F5 074A4EC055D3D8768DA28293609D7B55FC8D7DDA1AD21F66C8BE1F88A757EC9B 8FDB08C994CFF4084769BBB927DAAFC971DE8C3BFFB0ADF93B7ADE98EBA1B743 D60A6E6BBFF8BED00162B65A41701CD213D747E753FDB45D2758B21652B17FE0 85009A99020F895FB1DC543715112BFCCF66B40C1450C7E8F75C477F1C06A6BC B4B6EA39DC0C8D2EC13F4CD5FABB394CEEAC4A96E29FFD980B20AD0E1D5557F4 6356219DE1FE81830D956622BAC320206D92B627C0EBD0C06931B0DBA2CF1BB5 EBF04712F72CB5255DE6200FED72DAA66599B2E8D82E4425A5A6827E27BB63F5 9EF06F5DD146DB9DD8C39FE87899A06172AC6E542433119BB52796F356C872D9 3CF4A080BCA50D68F00ED66EEE9E011B7D5CA43A1FB87548B3D7960786B7C2C8 15C91E0A81384344C7F44789CC04F4D39CE769664A71EE34ABE6036511E93BF6 DABE7C1DD7841A8AECBDA22818B77E7FF5832CEEF775B710119768A161379210 C3B9118289943D8F5965D02E77BD8ACE985EDF38C4EE4C1D6E80F5CDDD79D29A 423E4A8CFD3CCB7EB1B37863A3C1DF818D9B66A8EE2D404286305139BEC2803F 10005084E3BAA010F2F99192987ADB30E59C63A630E0F46B90CB0A68BEBE3BB9 A0BB87774A7B5CA6D43C1CAAFF6290836F21D6FC24F8DB2D16C72CADF17BD524 5A121F453426FDDBBF5BB8BD9E8D148AAEDFFBD334A461C5CF21CED54A756D6C E17CD95AA1666518D5201DB3E856971047BE2B31183F3B15F8565FE93CCFC440 439800EC2B56D0C814ABF234C5C1E6AB8541E8E65CE2648EA09BAC1D0948A11E 75B54422ACAF3F2EA72AE19526E7E84BAFC7B766F5E0AD64A8A3D9103C2CAD9C 0E3C33BD2AE8ED1A015BCE37E35DE5593B7AE5BCB5C214173FB07E8785D4A4C6 7EFB4ED128F3B200CC4718B969CA59863FFFDB70CE4AAC29AD0609797B0695EB C6E95791868A325535B60D4EDB97A23CF748890E58CC3455C16C7ADA4B3A9326 5D55C427383DCEB92B1A026DC129C9EBCA7958B63B7D0326EBEA0C52194A829C B64C3BE8149B359B4D08E5428184583E6FDB06125A8EB5D2B850DCF8ADA49C2F A21D04020A3D9925F33FD8DDA2B4EB90A29639B4A414139CAE64D0B89CBFAB45 30702408BF13D1EE651E2C31EDD838EBF73691D1C753CA8B9ECB423E668294A2 A2D5586EC14C324761336EA2772E7264A8383D92BC645E528DA69BC8DAAD6197 CB67137E49D6010F255754AE094F5CE636B6836BD079857DE7F7B1544CB87284 140A292FB646DEFBE4A75984993DC52E321A477C3BA40AFE69B70251CD8E2244 C79C6D964B38AE3721095BE9ADAFD38A8FFF003B269C3BCEDA588142C2CB6F9F 2841845CB62FDFE501095876615F4949D3A6A5FD3709CD54322C7A89D11A4CCB 41D5462A17ED85CB5BA4FBC96F212281D50B4AA65669DAE30F0D433DC210A4C8 9BB56A2C3B2CBDAC14BB656CA62F13C22450011A4C5CE149D5D8DC35A2B7DD4C 82768B951AB0A5284A62E66EB0494BC967620AB8B612216AE8A88D733AF4A5F1 16D6A150A5FB347D6F14B65FD457C4AA08AC156968B2CC69626BA3CF6E6C50B3 C139FE73E1C58A786564AB5378513C31CB70AAC674A78342F7D3FBFD48B96B12 C50609E00F7FE01F2C757F532B670F2BD36D54C5B72FAB15AE08EFF7F881A89F 31C8EB0C5538FD38250DE778AE4E3083B132AB509CAB926460F13D315F9F359E C1A0450A8880E3798F55B98E23B7AD448FDCC3BB55836A5C980F2B9EF2FE3A97 75B5FF571A64B422044572CB04DFF19CD95DF02D7378466CDB23BA00BB20EFD9 C5A910CDA62F28F79D92151601632EE6CDA851C6AAB20A54520E86517D6CD7A0 FAAADF88E8A428003F5A7900984F084AAB5F3D6C039766D67C8C1E9D6C0FD50C 9419B378DD73BDB303C647BFB0C89CD211D3B88BFFDB5D6F0D8C0851C091EE6A 2D4D81F8EBC8FA0DFA507CCEE5926E0AE259D6E2B18C0BF172C1E26DC1660075 6E1722297755097991F3B493F95A78AB96E9EB815F7BF8713B887075C6593399 691AE3D691E90359585A05C7F7249F6965FC230D6A9E8D0CDD79E9D7B542D424 B5C6EB36FFEBBD1DB07D3545AAF8EC2B1DF80EDA533331377533ABA307E49258 348057E9A7D7E209B29277B9C487B60FD25E2EA429B7E1B315CDA539580432E6 75E414DBFA0E21649456474606B11420597D2F40BA5E8EC02A40A0EDAD22B83C D4BB54DD637AFD2372B53D8069B94B0894C62B71B35CDA184A1DE9A8A0EDDFEC 340EC75D2F544A808A85CC8B5A20D8B523A34449E514689A53A95C83F56D8234 0007808A36602148BE62BC3573919A80A804611785ACA46B1F73DD2E97C7507A 559C8EC03E3978C9AB2F54BB28DBF2D3D90393A06B74122D0ABCA664CA4FF21B B23CBA831CA64D75586E0C0DD25299BF63401FAAD6286836F7EB228AF2C3C4F0 56B67ED406011DAFEA9E2A2F793F67F6FBE65CBDFC6E0B5CB07D0202A9604D81 503262D1EF2EB0FAA46EA8A60E9B576EBACBDF746FD9ED96299CB1F01760C098 6F31B08221A3F315C215CAC9D57E1053DA25CEC54D235E72229CD146F572C01E 8260B164CEA0CF9C0538AE28FC65618C36AAF14262B1CEBCE890D0386657F098 9EF0301FE23E272FD43D9092421D9FF00D5CC9C85A2A129ACD5474A52CB848AE ACEC9FAD1B72FFE722E17B32C561AEAD79F4878A3A3A907D4687B167513B0299 73AF8E76E1C321423596A749D87ACF1557D978ABB7A21647AF85E983BCBF573B 8E6602F32B23F174852E4E11613D35D0652888FB4F4936BF6FAEA43166758B90 60C1849E16DE5FD3597D76CC3430D2FC7BF579A538D83E52DE9D9D4EB88D5F9B A57E3227665750F831E54144A73EA91EFE52B16DE2D8679C5BE332E9D8D20C6A 0B62FF6898CFA6D553B0273869FB2EFA3474EB88B7B1D731CD9F2FED700CE240 AF757A17E181193DAF8A05006BF914F5CE48907DABD5226932DB9AAE21047A73 7338FB3CEE9F499E338CAAADF4901B9AD4B4AC8F01EAF249E2D00B9FBCF1D4E1 41D8613957F26EC53D39CB4211EEBEFB842F2C6D1CD05A55CC0CF08A6AD977CF 4C477C9A21DF2D86AE78BAF04EDA6F132923A29822986A1C68A2D396FF312D4F 70B9DE50303A9B1DFB532DC330EB84C12F96DBE1A790C3A499EE738ABCA2205D 5BF03BDDD9298E4741A57AC86E9B81847AEC4D6B6B2FAD501453CB0CD79B448C E42EABAE26CC94EE3FCDFCFA84B163C81EB6124C8E847F4A8A3B37BE1524418D 18F970179E758296EBEFDF6BE72BB9BD84771199CB163783E3580AD6943F91AC 5F3822A16E1D495AAAACFBA1E4365EC08CD521596C706CE7D1136224688BC5BB 109154A78C0396EA010B6827328C153504926AA52FEC6F684105F459862E7DDD ACEA2F4FCDFDEEDE74F077299545B6C7E5BA9FE3F55DD9A2DBCFC092AAAB81CA EA5D6C6ABE667AD5052F9EC5B021CF164CB3397C539C91F3FD1AFB8E976D161C ADEC402B77BE69D008A2C126E98B10AC8D7814D1495F4900A6F96D4A390AED7A 453D0A031FEF9FD44CAC2FBD25CBC2F740E3671F30928BCD9B574F1B4387E41C 51B50D38D6B39F3C0B387B74D18AAAF3E14CAEACF98AC83EE560EB65B51FEB90 F487F3B42C2F2D8341B9493EE0CBC712877C4381634F610ACCB0F12229541A09 02AAC38012A35A0D46DF8ECD7CECBE5326DDCDF6382C43B08C569E326D2EAEC5 D3579A09DD98CF344F70299873E3693017848878E250D844CD759BA8492DF710 9BE0F1764A0C11EF72A64BE353AF058FFD4B738E2F56C48F5EF4DC935262D1C3 0CB2C9FCB0690900ED333F530EF1117A0065CC87EFB75994D2A52848630F9B80 9C71C946EB77EDF17D1C3352544B781BDA5CE3B951B00E7FEB4572AFBEF56F25 9B5B8BD2FFD8F645B0F4DBC60B7935F867C7C75F8113A72D96D144947BBCD721 9CC4B8A5D4BEB119EFF6AF6C0E79982836B969ED562FCCC833442E447DBAAD1F 507291CE09F5073D3E6A5E485F32A01F8487932A162C699B706EB439AB6105A4 B270FFD580F203B277CD2A96750FF5129201F8673B57E0F64346574827B1A96F AE97A18AAA5AEE5A2A17C7CC7ABD33DE297B18374134672947FBE770D2E0EACF 065BBEAD4A9C8E5BCA380365FC3E1B28526DDE6E70598F9B2B5A4CD3C7B3165C F1D3F8919B9939F98A7DC1CA3EC1322782A4A68A2C7F5371E97E5D8A091E71BE 54E37E90FA02DA599A1F42B8FF3CDB6A3F26F2ADDCE5C70C376B1BB4D62F4087 BB4B573E612239CD67654F0B753FB2DE3C9578CB618727E4F1C34124BE86FBFA 1AA14508BFBA93DF1DB3956833A7734B997CA9CE44BEC6A4FF9E6D4BA6F85907 013C3666129655AA54C7136BB4039EC7452CB6B0129547CE1A11D344DE05502B 4AE58E7D255A41500045B4E8111A6116B899C4C69118A06F4AC6D819088D50C6 C5823DF9225C1EAD06568170AEA6CBCD5BD77B328D1D1187D9726E4EE5CD1E24 214C01E87D8BAFD3A869E3A8E8C9EF9080678B740EBCB649CD3BE25D624CB615 95C6570CE1C58B0F9FB28A3F8A80114932D85162C10DC19F5A964EE38BCF49BF 76C752C6A62EA227DBD6139431C1218CF49884B47271DFA6A8868DCA70C98E50 68D4CF47BC98FE627A89875DBB93664887D1A2329332D6DFDD03A08591599C74 A4673641B23260E82ECFEEDDF1292BC29BAAF0E11FCEF4DB2F577A214CDACE15 D99C4790B47BF42F60D53A6C2EB0393A82D0F40CB2AB5999373B816AC43F2DD7 5D9A23A54768C6FD9C1BE3FE834A3412C3E8DA389992F0D608624CBDFE533616 329BC1F83F4AB9E4495A52B3A6A5CA400197E003CF1FE9242447CFCBC85E1282 24966482B3FD5FC8A46DC37114CEDE5E4FD0B5F1265A3884AF083922C490B3F0 0ABF1E7F2985C05F1C023BEC3CE2BC3E02750BA9A5686944CD08CF32D0ABB37E 882ABE579B32DFEABD76946211DD0113B49B8C3CF494B2A34FF1E267F5AE95E3 5379329665C6D4E69F0096C07BBEEC5AEC2BBAEBE174F2F5F1BDE92E0E573B4E BD2627EAF77B9F2592BF374E3ECA98FC0541A4B608CF2B60EFEBCF9905274D70 00889FC4854032F89D970FAA56E50F0814A0F165EF3D441DA13412B2B7C3F6A5 CFD71D3290810EDCFA1DC6F6128EECA561A89E4CFC448DB195DC67E5C4FEE96C 8D4DF87F56860B2BF511CF16A81A86CF4FD58FA15DE127003CDC98D60FA2526F E6B19C2B3A942F6AEA8BAC163D6A2F4077633E55E7835B3F243321CBE7D54AAB 6510F4F5DAD47F4C08C89D530A4C208F1903721CEEA92AED07A2943395F092B2 307C6543F15F070D776E5A51A69342029EDDFFA3A758B620A7D8038D79FF6584 655BB33168A78A70F051333E389F3F3B739D941FC6AF5A5DF5F95A76FB21D6F8 C415D4B5A449079E9FDBF158523A4FD60F4A12976872F5393A0FAE984B071D5C 2DCF85AF530820B7D60B34C5A416B37353F6F6106BE4C0EBCD6F3F1082E2E211 8384C504DB8AC14D42C78CFC4FDC6F0ED07729789760F061BF6066D9A88FAE6A 8B0BEABC39B31E2D566D89BEA2D307965B48FE774D35EFB7F7903BFCDCA5929C 8AFCA1DF612681BF917519B83CEA20120F249FAC32132BEBE9FB89A70F5E9EDD 4E2A01A5DEFA3C815F4EF44DD5BA5E8D84CE5054DAB66874BD67598214066B89 CC52BC795964D20C76343A5A0D2CA6044CF00392FF2CB07BADF65126D444B350 5661CA9E519C6105711007F73F456415D72F3896E090E339FE5C2B36F0EE59AE 224746F3F7BE85935B7FFE957B930DC6FA7B70E7A6723C015F58D49AE0317B3C B70E5831969AEC18F08724CBA2132049A2D72D2F0BB9018BC9A5E732D92929E4 66683D1DA2DD80683B5B1B60B134AF26B3B9078106D3B3BB6B2FE5966C224CD5 CF9D1BAFFCAD0B4AFBBF88D08CE01C59112E61875F9CD4C8CDC57A0BBC9081B8 DC747944395CBCC7D5D8E03A069F4D50D46AC6F98C3773872C3A9212BEEF7154 66395D45E1A135E448BAB6F027BE02DC41F323519251D7D3DCBA6C92531ED68B 09E5AD04E9C4D658751B9DCB7CB7713788FE3701589F5E4D6B5ADBE9C5032A6D 6E1EA1EB1943367CC7365E7AFEFB34C30F7F77B0D8E0C8EFEECDA5137EF51E50 F0150EF243362DE37240524665371064FAFC473ED29949351A94891B392FB523 1A401F51EE19A006E6A3102C777194EAE7C1FBC46A2D851D8089A5DF7BF3E848 331292F87E0D31EEF9F6B017AB3F7C800A15CBA34DF50BAFAFEA5DCB51B82ACA C2598293EC06774B7B506BF3A266DFFAB2F5FC0D193F766E3AF47515643E1A53 612997253B4740A9E15B1B9DB88E7074E9C2A06420449456EF2EE9960071A735 463D769A1529DA8FE6400A113B2C011B98B86BF78D202BE34BDE99459602C272 4758ED8EDCF869892B13FB673E51F3479C0926075E9523899A6A9274E034063C E15BE966F3E688612BFF1A69BD8E137328BEDE5587D611C890968614A23D536D 0C8BB6C7A7B675A9713520E34C23728ED3B261E47A91E5EA33991B1A04DD6F7B 87DE1D47A2D2096E3FB4DD6310CD106F8702C8A84CD16C2A9EAEBE38F67A5028 874EBC19AF2094BEC68FDC25E68C9E2EF7770EBD6C69D2C1A452EC4EC0F49F34 6CCD9B4023332181505F194E1F1333C063F714895D1EDA793AB71D0D566BF352 7A65630B0E8F2353FBBB2676F6FAC0F372E90FDD6E480386BDABB2145DB695BE 5769E2A3CC667FBA352C9278B03520CF30BD1D84AE91BC84942821B4035FB4B7 377B1B4B71D4AD9A00903100F160F6647C7F74D79C5A8175758F61A296E1B1A6 8CFF11CD1C0D79AF89198FA9F29ECE0D4FB0962550238976852BBA20AAEB7C1A 0B12C5D83D157D176D78A1DC8A5647B07ABD669D59A7C53EF95B888B1982C405 FDB4E0AB18F33DFBB128F01F89D8D0B76A5E8C5171654C7401941D003317F5C2 56156E482C3ADEE87D61E02F45CFBB98D291292FB3BBDD811062372E20C3ECF0 0136A85A14C5790289021012EAA1ED7BF6BA71D177CFCDA1BB22E2E6EBFD768F 6AA641C8B1356CDBD7C2AE8F21F29DBCD546341F860CC9E36FF51AB09472A25C 87ABEA9744F1BBD80BEB8F45906F62AFAEFEA8E3E3FE6EB1A3A98A30996A6B65 F240B2ADB7C95DFA477B37B48D64D24C109664E2E630A2FA577054F07C70698A 4FA02A77FAC43D63A45CB60AB620244453807B6390DA4DD2F3E3D47A691545BC 208C2836AB794C059ECCEC7F2A9BD04A21562F025AC6948005DCA269F2C926C5 40B7E252AA7F7C707B8293866468E51F5213ADED3680D08627E7201B6076CB97 1BFA7B7B4098AF63AC2A84800089B04FAF2088200AF13EE125E79AF702341AAE 559D60B7C4A04E6670BC98BD77C42D64EDFE41A627152A7DD2003505DE4C76D7 B8C81A3026E997E813DFF174DE463D25BD6E0B16AA31925ADD94C833D97840E6 769F89A78C17ACEE219A53E43178C0DE73E2E788ABEE172D57263E82F3D410B0 C8379CFCB8C8B9221112FD0105D71BDF413E9BFDCD9663D25EFABC209F08D3CF 23F02E5A5A59DEC8CA302DC74EC2EB8E0BFCEF3ED01F780BC0014EADB19082BE 83A0950764B2FBE500ADD51CADFE1CE5841B7B50ADF05395066BEC82ADD6BC01 1F6A6307212D32B34E6B18C777B80E69B1E080A0CD32BEC890506FFB3EC595E5 CA6998459702E6D63583D2C19BD5014BB715322469B59BC9CB4401B99D3CBB92 E68702A96130575FEFADF62F4D5AD8C72A46DDAD10095F11559DC2A57A959BD8 FF401A02178431C47EF1A7AB7C01ABFE023D54E3AB9B5F70337A4EDE49966F11 2015149114134BFB10D16E065F61F5392B90D1FD76B52A5B5B6A285DA39E233B D42A5513E9B7A5E598CCA172253399E56D52B3954F0F377CB7732285239E91E9 7CD4B28E3C5836FC9514F50E859BE72325E42531B8751ED54E39FD40054C8CE0 264F469D1B37C74FEA9CC89B6D0A1AEEBE18F040F59A076C2884CADB8A6D51CD 184583A257A5E86A17AB9760D6219CFEA0B0F38A8FB1BF339187ED5E3048CD9E 2BF3AB681954CC9C479F8F304C365EE4E9281B615D749784EA16A04CF83AFFCB 2B1F90BEF2C4 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSL9 %!PS-AdobeFont-1.0: CMSL9 003.002 %%Title: CMSL9 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSL9. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSL9 known{/CMSL9 findfont dup/UniqueID known{dup /UniqueID get 5000797 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSL9 def /FontBBox {-61 -250 1150 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSL9.) readonly def /FullName (CMSL9) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 67 /C put dup 76 /L put dup 83 /S put dup 99 /c put dup 101 /e put dup 103 /g put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 116 /t put dup 117 /u put dup 121 /y put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C 02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D 46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A 4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC706FFBAD8F64C4B 4198909DF28702E889F2DFA1FB9AA175E65D5B8FD3EC28297FC91D644E95B337 039276A8EF44BBF9AE8C27910AC03F70F9022CCBACD01DF6D2A5247F8050414D 20008C564BD55A841F12DDF816DBFC3D5CA2AAC9A64235CACF7F17A81AB28785 F6C95B135A2B9A4B15795B114AFC7FBDEA4B5A49E61ABF7CF1CE129C2F4882A5 4DECB2F07A9C7EEB2D3B896F5C5C77290881B0C903969A059671DBE2BBC2B72C 6ED6DF41413AD37609C430EA2BCB630D41BCA9439CBBAC12FECD18D1A7C7A123 D7613A87CD73488E2EE66DBD78440949A0919E0EED78EBA35409DFF589EA71E4 CB9C7669FBD96E7DEA501605AA8868B98243F09DF73C4DD85720F14DB4FF402C B689D1131CAA96A50D26ED450D7D1E9D2D05885B63872B0906AB8429EE94B494 DBD181BF2A622D5193FE630D1427270C6B456D2EF8A9C4045A90B4584BC95F58 0FA668DE006C18595C16BD20CE73928B39A8CFCB9C58B38EB2E72BD69E2326E8 951C60E3E55537FBB804363D3D608A3D7FD71A5CA0B37F2E7FD34C2524BD3A92 8686BBEDBC07D7AE6D4ECC940EDB5ED234445D98A6BF7F92B23AB7B501D79148 BDB9DE83AC86873C061F07A012168DC92B1C7C52AE2041696895D7200DB28B90 2A6396CF1CD6B827E309CF79F68DCC92A12F4C0762671E025D60AE1F591C57C0 580F521B41B8187F057C40C03EF9AB27DC90A3CA0434E7A4ECED9F83A32A37E9 ECE1016828B54008F73DB0C48B407095D800DDFEBD044EE8AC9535B9092C3EBF 37135F79983DB2F3AF9509D57A11092EE30FDF9FD10599C4D18C926D2DB941F5 E19D1B4CAFECE138CF9991DA0B109AA841106C89DC7E2872AF52937AB85DC1B7 06BCFC4705747CAE32E061EDE0C1EDB35E7ED8A307C241F6E11EC14DCCF04745 693C30DECFEC4087B692D0495AB3870D0D5F001CC29F0CE5C0FFEF417D3F89EA 3D4BF5398AB7DDBFF6AA1DA49B856654F9D529C29E67884A48119148CCDCFAD4 09C7B4CD263DEB25029A0D2EF53EC59675A76DF70757D71BC30E82E94327DC96 828162ADCC70CCF0FE0CA9DC088B0C1FAF498DEE93C7038403B742D393F882F7 8F2C37565E266274E4033F4DD024DEA90D24B0E5FA96A0B6FCCCA0DB9F268E10 646C4507F1BBE75F5D014C264AD9F50CE4892C9189F6A60C26012F5EC8B4839B 57BEE5B2F0F79AA8873BF61D8017AB3CEDA5006F838B436212C115DCCC1BD581 EB86C4C67F97934C9B0BB46DF9A2BA09C06429F74490BBC6DE00898CDB1C83A4 3EFF3810104D7B96E70F0BC9DAEB019BD56DC293CCB28EFE9FCD1E571B5D85C6 55D79A0F4F26FF98AE764742D28B64DF642A9BEC15EE85929EEC9E662F74C8D3 ED995C8BC3CEF54656E4E3CBD3E91C3323A4AE755C0A56DE2FDEB64FF2F8F5C5 6600C9A94E6E8348E7E47181565B47180E8010A29F962A609C15689E75D53934 44FFA7BB0763642336FDFBF8C45704A6BA10AE06C7CB62CF4FA17D50A99F180D A936DABA5F2E625A45BFB670DC5D54045D83CF071531537896D2AF608FC6BC85 70484384898B04B5E9F40F731468FF4FAC27206984BF54177F19BB899C758A66 E8CC1B6324C99E5CAD172B3FCC901312307AF69D3D933A5041DA93BC8F65A816 73073444397A754A4C6D1768B4F9BE952FC835E60D9412DFB62B0891943F00AB 002038C0E22D22599A13AECE302C3A5EEA58DC8B781B1E558B49948EBC949C06 71D5C102B91B352CC3CD453A76742F8A9E244279E71838CD79E556AADC6D4A56 A66FBA05A2C284F74B053F79445F1A9C0ADA5261942C15B0C20D8F9A9899999B 70620939956A7A011E9A9A53F7FDF15BA0174FA85221383B6EB2AB94AA55DC86 637A0871674885F5F937AB1ECBF5149F3C469B9A454DE86E0949396DF314E6A8 9E4044B3F11425647AF7D1EB89E42D8BDA43A1E6A7B991E9B6D5776B2A6BBE1C 573A4780B1486ADE26A9B12CCBB73DBC87A1F171AB0F013A5409A4945406C1AB 92C082211B597EC3AB4A56DEB6851336AC9E65F84C79E2466170EF9360A210DC 5D71686D5B88A0B3B789240D722438315E667DB5425554C9B2BED3C3FB5A6AEA 07DE5132A1732AA95FB309BB86A87003524F9FE1072307B2EE046921520699C8 61DB4364F342F5A7D29F4B1D0EB04F86B259BC2ED0FA22F8E5A54A7E876A6327 E01E22A5B40897CBB71F36F02BA648AA1D06662637C1CA48C469C80A6168EC23 966863583673A6B291A18A56941AD768683B85FE2BA65EA4D0EDDAA2833443C5 337C537671D74C30BD343EAFAA0A4F0B8DBB62E35E926782EAEBEE313F92538C 99E3E620CE7832FCFAFE3B051975E7E76BFB1085A9CD2194FC119E2AC91DD517 5E17AB570B33A27CE5E2FEF0356A6B0E32D7584AE7B9041A452EC64CACB10799 E694FEDB87CCB82C288FE809B0F4997FA9A6C1683B29CA03E15C017F3A301543 5581AC58C6A9A0E34FF5E77A091A7ADB44B597A1EA5768B34F869521006A10D7 67E462E70A2C20021683FBABC1DAEB1CE1DD7FAE43721306492770BEEFC96FD5 8F69C60D81082136FD9F9A7FC0910E9D36E483131E95B1587F1725E2E80031C4 730FD118482964289E153B9B91B91FF190C86B020AAA97CB7DE843C54827D4DB 365741D530D33F46CA483DD183480CB148E24C0039E44EAE0CD7433BBA81C8D0 766EDBB15B4DE1A5AE8000881CF01BCC835FC20D1F8250E66BE78265D3B437F1 FB7CB10A2CEDB6A6814AD48C365F51C1C55ACBFE2BF4BEAD06C6E86FD2FF4DB7 CB7DCCC01CA2DEEAC1E8AE4D6546CE8B6D704A38E895C32CF7B644A04E1D2AE1 A5C759FF1CA4A832A93060DC5570245A5D769988A86731B3137A5AB0688B2E7E 58189EC3A60C138DF4277831397B4EBE4F1B390182F2EAF332200C7F6A9FF312 02D1A0451EA9DDA7B5BB217441ED2A88B2B63C7D27F2EE65EB4E6FD20348CA54 75D79E0207093C987CB79C04708CA8500DA58A27F21FD95E2C9E02926710D013 BC2F118CF2A43B2820C29758EFEB5DB30BAFB0E087D0BC0C42F36AFDF491B640 4D01F38F9218CF25BEB38AB91D7E943E8EC9A9A9277F02EF057B51AB3989AEE6 7945CA22634DB32DECC1E18D9901A37A05B3395F9E28E2BD394C86CE470CF465 D9FAFCB4747C5E168C9EA017D8F1901989F076173D61AAB8D0ECA85ED04E2012 DFA4B89525947FCB6B4A17FD9805E5EAA888326C3281B34CF76152D047ADA492 1E1ABC03289F49D682133D46D304A02905E397F0678A469DCDC8CC516263AF58 913BC2874DC4407E53FFE8CEE90056387A32B169ADEB0F7ABFA9AA5A6229C998 5644C47AF6930AA016CAA265C7B05691604F04FBDFD43BA3D2F3FD36CA761BA2 5BC7445B4F6380C06A40EFCB4A6A9D501B1ECA0AAD0CBA97C6D726F6DA2E076F 6CEBD3EB8096C9AFAAC641A3F87066A882064C2B0C21DA8926CEE57C9AEAF611 31C99FE3E6D3B691BD55AB8D488CDAAA0E8C2A72B057CFF65C1EEF0EA031A2C9 D9E38DF696C11600B8D9EE07DF6CFF3CB112342020771F124BED5059D8D97E56 7E1A057552227D80D3CC51C011D736F8A19622D3E72E232CEACDDDB126E2CA6D 96A143BC63A0066505D5BCC353E086279229E01CD8F69EEF69E26823E4B7FFEF 589476CED8547DC0C3F7F1702A169FCAFA3D88EAC3ED08DF8043324B6D6BB481 4FC534FF50FFEA0D3F8A93D9D40929FAD7202AB500C047B2F013BB351040B8E6 BC513403629AF692145E59A5E518DE768B5210BED9D72CA2B8A36DEEF730C755 5332F126F59EA348E5366FCCCB88E7AD4E1E2EC21F240F12867716FCE6907AFE 5F3F6EC4E155096E6418CB525E1BB0C61E23553A1AEF9268D81A76BE23A2D85D 8C72FCB6662EAFADE3C325A39BFA1A1EE05A1B8075AB66047A293976A626B5C9 09F95D42CF9357E3522EEB028AD48174D14938C5E11E5B808FDF747B41C2D5BA 11FAF9F65E4F82EE60CACFC23CA860BB47FBEF3463B622BA9DB82CAF75640993 F6339111A1303156DEBA684B5940BB59DDE383BF01CF444028F9FB60AEF34959 38176F1EB5353F1CE8248098FC760ACC07B2139DDECA158DA9D69FE374E63E14 418A2FB18595442E81D18CF85321316601DB24DE54DBBCE0E8CEF81F3A4EC5B7 9D05894A70BDC5117AFA0B642974B4A826FA64D8334CD2D19D16DF9E617384FA E42A517F62C0A5B34EAA7AB7772716E31261598E3BB2DC426E52EA2AC31B74C3 39C33EBA019EC687B7FF694AF4E7DC3018B122C6B01985FBF7317B9C29E340D2 EBAE10F30F8A0840753F4A73FE5917DF79EFB4A9DDEBDBF5A309472E5FC89571 E0BF21A3CF13CD2FE84CC0A3313A6A2AFA92E750EA8E11DFE6EFB4BCD50B5FCF EBDBCCAD8010D14C36C91F0629DFEFBD7EF7AA277BEA1170302E60C4FDECFACB 979C35A026B703DBBEAFDB89A50243A657ECCF9A16D0491EF3453F946AE188F1 CD7AD2FCAC0A2ED2A868974D5D51371395D509B71925AAF535F3246AA9EE6899 52A7C6CACAFEB437C5B31AA73F58CA48766DF6C4D806641CF424AEA5160998CB C73E1D4869A5D7BB4662F4A73743BBFD8EFFB371A8DC5606B1A0C7F70C025FF4 7E8B362860D6864E7B7F85D215C547543D7B039AA07F8135BD4441D393A86D21 A73E30D863F36CF991BB022A8D74BEF4C88A19AF37BF8241E6C6827C328E13CE 410F2105A94702F1B5F575A2710A271BA244D1787DC15FFCCCD7D666E900E8F9 1F5EDE7531043AA339CCF97481BE36E53409E4EE454F72B42C8DA78E6B241850 060CE2C0933EFA45E4901952B819BF14C9ED7D15797506FF81065E7D46789EDA 34005123FF1CEDF111B2E3145E502612930E8E26408F6A8E2409BF62650FEBB1 A15C98097CE83852D3782249D763092DE94C6C05A6912970B3A809578A69D8D0 792BD8107C1ECA0954BB1709C73F2879EAE3994927EAC8BFA1BFF11AFB382F3F 8680EBE0DA5F5143C37C9EE4DF21A8EC23BB3D1ABACC474568FEC8E229641B9B CC19408FC1CA59F56B1AA815C3AF151514045BB4E2634B60543CFF6AB61AAA9F 175C9630D68F336CE178ABA458EF07937EE412AC56EB8EAD8DEACEB5D5FCA45E 58A297DF1E7E9AB7105DDCA38557A7508416A159A10864809C853F0FEB49D79C CA26EAE48112337D5F62A60A3EB9C86444A9DF4FFBE9F3763E683683CB429E14 896C43487C3B9EFBC14CB09540F13B6140834F87027F5A31F166BD26DCF19BCA C3EF4B6BD6A610C9D38C2ADEA1F63D5C9AB59A146FCD9473B2FEF9A0F37BF9C2 C9A9176CF23425B2ADEF0399F608CC71FAAEBFA07185EE94EF4A7E3F8D43A31B 855C4ED42ABF17F10C5744F64FFE51D0784DA589EC2942CA9506128F5F951667 CFDBF28184F69C38FD418D02F5E1F546E74A74549CE962F00423A86AC4BCCA5A 2383D83000B802CE258BC8BE22881518B4A485D8EE33C632F38041B8CA5D469A 75104DD5B7E7375023F6F8FDF4E348EFB00B1A55C10B394DCAAB87BE84D3142F D172E17115A09F29319329E22E652967C67C621145C510B7617103DFF2970DCB CF2EFC9B820F2C78FB902021E93E19E48A09F24C71D8E5181AE8C654D72F513B A0452A4B5232F15926FCDFDCD8D8CF64F9BF15A5533033986E3C326A5C5504CA 560D50EF0EC5CC5409E928EC541EE0A931CC159C55C03ACDA7C177C05D72F0F2 DAECFDD9476118467C0689C7F55AF0312F3F8680B6332B017194B74FE9034D35 F2B42CFAB4497533786EBA218D3BA699DEEC1D3600822826BC34DC5002EC67E3 6C5EA3AE332D4D4E995E1216D755B07417CCE2F0E0A8C50870CFA33A95A050EC 8A230B446E9C46DCC4FD1185500AD432AC3F41C61133A366AD8F23260136B72F 0AD4AC80AB5AE776A81D2D57E0C3AD28CD8A38065134E3A416FC75A3CA4BFC7F 1ED5DD3E0F890042FA257E06F3073E832475FF9D42FD462E1394961ADA8B71B8 2E0BD527786511AF2A9F3058A619E78C01317DD19DD7D3B3D8D3F6E39CBD39F2 5F60F1A5C6DB389EA554ED283B8C8AEF1013C917AF69950C5D1FFAD294DFEC71 001ACB3870E1B541E2D892EF72F7E726E029973283E6218AE2660379B977014E FD1B97E4D4341F9831D4F399DBDD11F6E717803BCA06C842EB23D668C89765BC 4F89F7C2C0919D983174D1DA69D4AA27AF05C43F513B856C15DE6B199F093EBF 2A46A47422A444FEEF7384ACC9CC0161582E336CCB0762CD88B7A21386C797CA E6CF26EDF6133C0E4D6A3972556721AB5DCBE1F2EC8CB180A557601A8B86BDE5 45A50319A3621DE010389CBD16A32C6F2BFE2F107F0FE17AF448D49DDF247E9E C130F3D414B5F046AAC808607530239BCFB5C871899C24FAE159506652DAFA4C F2F2B61CB88E9E320D85838E8343213CFED5A5354DF5CF0756908C5676A8C919 74D26319709A29BB17C7590C405817EFD042D75A95BA4504C99161A4CDBF7AC2 D1DDE99FDA9C04BA88D54B0741705BAE7EFA68EF7AF6B99F31AD9FC16B60E685 79EE02CCEE2B5702DADE3EEE8A81C3EBF75D9D909621A2EE707EA0E2855F64C4 B251718FDA71EDAF082C65647AAE6E7E5835CD5BEB23418066783DF21F9CEAB2 A0BC38217D5BEE9F31AF8206693ECC93B3879D12A067A92CDFEA59A190ECA4F1 039D4AB46180D368A71F1DCAF637E51EA61EDF0CD2D4378427258422A8F3B770 33D6C0FDD0434525E105EB38284F189FAB7AE3C546379E200264E1711EE50B04 B21CB5CF0DA936E5816392BE2A89A4D15F0F4A39DE5232BE9E00BC2B24B1BC2C C355DACA7371CBA346313DD7C5655314AB9A098321B406208CAFD741E8833C49 8328588853B1F2E38498DD13E948689B0FEEC5DDBEF9576C29DB283E22AE9376 66D6B4B443AFBFE40E6F01D2699F28A28EFE45B108562244C2DE591147882E0C 2B776020075A39CDC9CA5D353D7DE2CAD3BFE5E76D7D81BAE3A7954A7E7096ED 8C92D4A787E0403D8469511A39E8AB2BAC7F9D098FE2D4E79416E0F3EBC990E9 9B9C27467FE13DCEE8999D4430730A053AF37FB0988B9F02981C0666C336F163 D4C810E2C19CBB865A1F18E5E1FF007825A7DCC19B445300AD85D72A15D58C14 ECF0B0475EA6B10BA5073D0CF7511E072DC938B969D4196B1A94CD8E5F09B49D 94A4BE1C06A910D35A724596E0F862468FEE5373F69F7C9C4418F0B487393E01 9CCA7B80E94FAA33F5100209C10240F00D9C2DC3035008AFFA5150A269CBECA4 04CC805A1D6D590CC4FDFF6EAC2E81F770407A354C7B4AF0B07EA45B15F23EE7 9B4B0F8C84156170A3B688A3E45B4F21E7B35B96BD6C371EF75F5D07408D5C37 0225DBBB43DE22AE5D0A5FCEB5684FEB86C566FE98E712D2692B82A49F30059F 0463647E0C8FBEF6EE2C2DF00BC5D44086CB8BF2C8C06235659D485187975B49 4E4179A596BD5A43F8408D849C05AD1B5FDAF83B330E9871F06C6A970F56CF5D 180F38F2D30C06AF91EE5FADB3952CDC2C512818687629130EE49177B25855D6 3D888ED4F0EA504279AF45B4232877F40E32014DA3D8CAED305B081ABC08CC4D BB16719F966E48CA12609401CE98EA9E96EAE15514C346482612685E241C5927 0331DB08A5D8B5A8FB8D1D54A5B5F6FA72DABD6F0BE35D3BB7C8F2A54DFDE784 B13C19BBBA2F94973EE4F7F6CB902A72B9B93CBF9D29631E96E2DAC881903407 023C9720B78295A435E9CE18B233FFC1BB425B1D5F4CACEEA1762D3819379399 929BD5F4B48C7D2832A3448D52AB976D3FF702EB90048E65ACBE0D326788ABAA 74A26601B9C1AD466E2B1D07496159EDB2A537B6B339B4AF889342876BBAADC9 11327D6B165ABE46CA6D905ACACD7F03541375829455F352FA371D74EC2BBB6E F575A45F3F5D785DA27182ABFACF08274845D9BB216E5967423C9CD023FDD9E4 0EB993C1AA1177FEDFC5174511EC37889D7BD5EB3AB4F92F169408E55B709FE1 C29A83B7D7F048B21776309B23409AD65438C515EC957D96F56D4B697F04457E 7C06D4330591531D064CF2AAF7A31DE24FA89D39F18DB60752A5B150BE2E146E CBDD161B377B233B86667561DF1B19ECB15C31DA77BBFE053DB660D6731411FD 9D91BA4F014DA9B56FDB01C4F4A90B2CAB98ADEA3202BC31C580B282DED0E1A4 63D327C7FB9858F73D4430FE7135E32A91D61396CC390E162704825C4D4EA226 CB89806C6B230D8011A24122CF18F9B50E89A3C7E19FE4DD72DB70185DE2A7D0 4A682B108276979B242057DB75BF688690E71E9491F4C45EC85B663CDEC51C3B A43B5342F4A0C6AC4E4EDC213A4D40A711531DCE09AAE61995815C97A46BF370 E0541DA22B04C24BF3197DC595B49C4EDC67E501599159B5B5410B2AA3F7A487 F9E34CBE3BE73739C983AD2DCC173EBF44F9EA4CC8433F55B34DA837564B16B2 0480BBDDEF18F0DD8044EABBFDAF3AC05A70C04975D1B0EECF25321BF18EEB74 895C48241C026F95A55139E2CD912E33E3C02A5DB6B79992DC55E1D3CAA5F674 D0165EB58C3E3DCEF64B9726E2154221DDD2C0C269D20593201D23879B5D2926 82D6FD5C40468D86E2E1C3990BD2DC5757A29FF26D58AECA3AE8A6CF1998A649 FB1965031F021E4D789FD52E782CD54D8EE552660E3CAB7039E9CF0FECB3CFE7 073599708AEF7B6BB07689F5234AE8F2E45AD71403A1D1BEBF35A10C2FCB7CAB E8BD2B6B6E83C9604D363E03529773C2D51467532A9924C9D5E5682E35D31E69 A0D3CAACECC38EEA98B5CAFA8C8E28E9847EB1AE63337702FEA1B7AC29DF7768 844930ECCF6DA3E0C310D4934710441F84C59F567B89423E09F0E513E102AB52 02E758D9A04D9609EE72E37CD5E3DA51AF19253A3E48599A40522345CDD2D045 974E926FE20FC076ACBDC0B4C1CA91F4128F19F55BD59FD86F2C21DE87C25869 6617A04613819FE076ABAE7FE05A9047FA14D012F8BC2C2F0640BDEFB6393568 F1E2D4A66D00D61E1752446A7C9DE540926594AD9E1914F0EE45540CEF931EC4 F673917F67C9B05C7D64EAC7F1BC01F96F426FB388D2714FBF1C9243F03F6472 BD9F87FFFB84F53FD6BBC1B445066A1DF51BDA991A19E93A712F2A36093175D0 0EB23DA43ABAB3CFDE4877E44CD55777726777B354C04904BCBC2C064F425657 B6F8AE1C70FB742697AF3009CE00DA0172244CA1E16EA9752EB3281C70E51BD7 BBFE6D854BE2A9B43AFA08D92E6AFBD6CD80E3FEFDC42D695F109BA098B51735 F0811C3A1D8648747160225EA08BDE011BECDEEA109DF615F2D1EBD8D6A67240 07BC022EC136FE712ACB778EC7598DCA338C9DD8DB9C677DC6D80243E5915633 A56DC0825CBB7442BD6C77F2EDE3BC233A2A4C75181104C4672280C1ED087FF8 F8BC92AF26B35A554E970B5D8B9C780A3D127DF5EAD89000A8912A6418C4EE65 C701C5EF0A2998388C4E41558F8301C0C3B320E51B6A55F28F9B14008107E0C5 2D3E213A3BFA5B630E2D2D2F18273DE8AD88F2BF61A2D1BC1A3F9FE253192E00 7190B273C438898B2C1028A32DD6E54F3E36515DB7229B12ABB42701BA6B7BB7 5B8F25CC15EC5DA2669D130260EE46D6A3832AF97D91C88B2FBAA632825543D0 F601C0AC1EF15DE2A6DAC6200BD945AD98D4F0FA3D09D029409CBCC83B6B0EA6 FCC3C0AB439606B39D21D3D7E26394824BEC041410C496FCE30C0215A6C5CD14 A39D71AD201A24EC90247BF6FE571664597DCDE6DB740C3CF2FD9C140E017CDA A7E3004E6633354753D0ECEF9E650EA9A8CA7DE2B73531532A22755875F113C0 E56464719934B4342C23CEAEB613F1670DD293F8536557AAA0370E782521FB85 4E96473A24F4CF2D77D172573A1374AF16547E994ABA07077B3DF4167D29EBB4 3FD9A3F359BC79F11ED2D5367EB44FCAE9AF711937665446A98DD8B84C1CC9DE 2AC35C7C0787BC4E1E584FBBEB11EB8FBBFE0A46F56E47BDD75581A07F3D6C73 04E5C0C88AD5FFCA0C25AB0438EE312648E87723E1DEACC55F917138B5174ED7 81961B693198C5F07EF40326664DBE21BCF7C28047F28853548FB6A3056F0A73 3FA52822CF2095D8BB008ADFF7B271C7C7ABF095A36B5D0C6A7FB71C5A4CCAAC 40274160225E0B31680535785A73B5025DDDE924C799225C9FB9BA0822DC0E75 18BF1A22E96747E9F159DBBDFEED8DC3CE7648116AB3F8CF2C1B3BB74A7DA7EC 64DFE226C33748B5B1201A3CA1258C3E433F9E37CEABAA17A1E246FEA43B1EF7 377E06E6696E4CD2C6A8DEB3A2CBE12C6A311FEE63DFFCA866496383EF30F510 DA3B603629329FE1A5C35E7E6925D11C9BA9DF415D7118496211DC013BBB0693 B4EC86011CB010CBE95584C1E3C1D91E2D8F91578CFD8F9637BCD8B441C4DFA1 7633177DD32ABE03E06C8098FF1F0CA2155B59A82B418CB757E452920378572E 0A145641A097D06BD3A79EAA620007D166B28962406F301EDD703F4640E3601A 04B829F2DE5362C9AE8201D45EAE788A3CB2A7076F4155C8C9FFB017F4C2F8FE 14E6EAE57CEB1E073B8076FA20440DFA3D33FBB555DBEEE31D8D9358F531F79C 81883E8EE651E9F455E4DC2A7C8E50B17D80AADE21C9B58674E6A8A7E52BCB1F AE3F60145090071D717D6AA16AC61BB1FD12CE7018B2D85CD33B387A5AA98575 32E69F83C874561D725EBF676CC1B05592D1CFF99D65EB55FED760C92BE227CD CCA4E827B7C5510654F806D6F297DCD3779B48612ACF5BB4ED5546D187F9BD39 3E139096A6CCBF8F76F9C3CCD6EAC68D63990F4C13AD29DE20946AAA0ACFB218 01610AE37B317F452ADBA125617EC27CA524FDFFC594D8DB3FDB720C1174E5FB 39E149D700CE692494D22EC758D446B54E365E93843F7D04537C96DDC80FAAA5 526258B0972F7208572B6ED7E8CAF674CF878C040B549F2DA592AF920FD0310A A448FCDFA378C72B9417ACDADCD4A1A05F2B6B697C816F4EB662A7385C972AAD A642E82C83037B658D4A23B228BEDBEEA6CFE918DAB5E49C80CEAF42AF56C61B CC701C67CF7FBFB4B3378AD8AD70BC7617382E1E770941670827822C71DDCC5A BA9E3DE027000BEAE27E93D7D902F04E19A7DEC57E06804C0B4745DFCEED73E8 CA54E2A9C489E221513E05992FB412B732F24F35A7EC83E2F170F19B61AF4E52 CBCFBAD3E11CAB7FC6F9CB95458590E7F687758CB5E40FAD2BD0461A02444515 29A35554DFE508BE8E6F10D41E46A2F32B9DAE4D8C2CDC620958C1D1BD7825D0 D830E8A70D745773FAE7D855CA532BA7C3335460C0D4F75A658FE96267484D02 5142D2B092C7DA9B6BBCBBB3D7E1EA42CFA5EDD1C772396CECEBF4C69675132C 0CD6E24C1421E7BF38E1BB3887540285B90B3B431B0B74560517826918B8628C 64D3D7C1D5B03199F3D6283EAB88938BACCE2EEF7F48B71087DF3E3863FC1A52 E0B7AE69DFC9B95B2342CF40363FC5AFEDE3506909EDE8ADC816B7435A7A245E D943593EEA300B1C122B62E54A55D4F18B5A25EE9A83A01FC7D2E83740787A4C D3263044F8E5EA051316CC59A612BE700415430825660AC6773D96B6686A927F 2FF553567481A950338022D8E3BCAD9D5236ECBC7C27994EEECDCE22D46F05EC 699994576F8D3B59305ED12CD4BCB4EC00D49AECEE47BE4421A95E6BF8D7A4A8 A69E7E3F04AE9C10452E7E11548EF8AF37A918F79966D08B552BED3B77A674D1 5A75DBC7B31CBEECBE348E8A671B243ACD43A5D2BAD3E7285BFDF2F96B3595C6 FC73E1E7F4820F342AEF676881BA7FC96A0FDFDEC901E8F6876984EF311CA6FD 5A1B62D3EB0F30D4B6842FF7DA20B724E3A53F1D010A38E2BD141FC2C035DE8D F38179E7A7284D4C5B008BB03DEBD5471DE274B748DF3E2F2937B9CBD79CCE1E B56FB4A9572D8CD6A0EE374EE5F5CE1831DF2997553A0F5171C236DFB653B9C2 695A2C4E1FB0881E93B39CCB5853A0621F01E0C905B17C73ADA37E572AE22114 C21F56F0BFBD231AA1A0298DEBE62E813BFC2B38D7271617430284D42817C587 A095985DBA9769BA6DA12012842E392B0B5B2277BC28EAA94814DF9423C8D606 29F919998D773CD24A09BE879604F5DC731664250CFDFA51A75579D72FDB4C1E 9C73133D0F2137AADC64C41B6100FC65240356EE32E55BD67301151C642D9B5D ADF3F9124BC28F9A15EF192AF3E911FECCAA1A8217F2D2AE91278D9441AE0B37 221A7CDF501627D432AEBFC0B2E352A4DE43BD2772725937DC10F6F4FA64A205 7AF0C482668EB7E6EF72960D88984A16C006E9087D992F7C717BBC46181DA1D7 04112AD658D9A27FD25323A35846D9EB2A835D 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR7 %!PS-AdobeFont-1.0: CMR7 003.002 %%Title: CMR7 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR7. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR7 known{/CMR7 findfont dup/UniqueID known{dup /UniqueID get 5000790 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR7 def /FontBBox {-27 -250 1122 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR7.) readonly def /FullName (CMR7) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 49 /one put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB981ABA2ACC9A23A5 3E152596AF52983541F86D859FC064A0E3D5FC6647C3CAB83AD4F31DDA35019C CDB9E3DD3FEBD4C2B36BA3CF6E6C7DA85E25D8A31A9BAD39BDF31FD0D1790707 9DE6A078E8A409D8295F642DF492AC4F86AC84383B0F4C6BAA7C22AD5A898A71 D6CB34D2CD12266C486B75E75A69C14819DD9BB8159088E04D4717E576B8482D BDA52110AC8B8A80E4E9D58F470EEBD3CF44A1E1EE8DA318FFF3611B02534FC9 F4018C7C57E80570D2F634D98BE5D5EC6D95051157F0EA94A3D12BE0B4B79939 F82F8D73136D3337C44E314B0B16CB030D9A12E01FB667105F334C3EE965E5A3 D410D2F1531547A4497C355AEEB295CD3C5334BEE5232992960B757594B89F3E 52095042DBE6B4DA3C3AD50CA95EA9EBADA10630B500CF1FCCA7D60306743681 7E428D33B7F7C40B425CD58E4CD8AB474BCE6A307BC6C6EBC15A8A96E0E2977E A33389154536F5C5D8CF036D07F24094E779E5ACBE5502C92892F10F4C6DB627 C7EC4C7BF20B39418A8A85D7FD9B0EAAFD871DDD41F93BDE5FE619AFB8711824 DE890E62C1969A6FE28DD3578AF43D58A728FAFF0B9FAA640962C8F35A26F76C 67F3548D6DB54A25CEB368B47F97EA2B0C4D7C0E7894A4F0C823C6C1922CF9DC 10E05600556F1C7C9AFB33A2DB6F8730F70D6BF94B1FB0887451F2FFEEF3584F DFADCFA9A2D4846B8F0E51620E1327D994CDF973B837D10C90FF76DE22B47CD5 EE3183898D156861AB4DFAD34A1E3FA260B8164E6680BF58413A553E88F6100B C4F4E8E972C81A5F88A7DBCDC308B4C3581BCDE13877B976B1F84330839FE5CF C78551620EB803DF94A5C921F8EE24F7EF8FC4C3E1653514212631F54F90E3DC E9EAF96E998F340C4F729ECF7AB430FDB7C0BE3DF2C0D23015820E28B743CAD7 7F0AE95413C3EEABBC69E852F53EE1DC260D7F1E712BECEF2F18437DB23D8E74 2902AAFBC733AC5BAA452DD6F3671859AD836C8564E99CDC4183D8495AFD99D6 1F0D65B6588CE7546717911E25BDCA6C2649E3A7466A3E2DA7C7994A30AB4449 672EFD00632EFA8629C1AFB7D53D801028F77C864869FE636213A69173003EA6 BE1ABA95EB07B13D1594BEFCC95ECB0A9CFA9892EE0677D6B6C250855762B7A7 8E4E022640F93169DFA0303A0D5E73BF3E0F4D4AAD10FD7E4EB20532BA30371F E9F480F9513432946F9828AFB5D4AEAFA5829B2CB544E5EB634C4537EF7DF08A A1CFD94A52DCF0E7CE4C5EFFB01E6D50558B75DB4C8D5512B06080F27BE62E01 2EEA6A0357441401458C842D3DD4C35B8F561D816B336216CE0C14BF77648AF5 E33912CF95872A1E1AB9A18980A0B29A881D13397C15E1CBA5D3E0B27943EBE2 F3003D15EB446BCFC1C231832475D5B7AA19E4CFDE119D6CD62D053C6D29C333 5F729791D17B3F7108074EEF4D1BD101CB33E01004532CB0D716D2E54D169C6E 80163E70C0E9081F31A1ECBAE079D2A518B790B0CB2CD03DFD034A0F4788E800 B0CD2DC1FAFDD487C2F381EBAB2A2F3F3AF82021B211DC9CD2FBA6A1BB3D4AEA 4C7F3D9A5C21DFF284CCB827D205A69638E98D5DD8E36AFC1A4481B5CB2A2E8F D6C838DA6F81990F5ED928DC7457501B5C979FF4CD20A830896A460C5DB13D56 A3B2B5D9B292374A9BF392894DD99FCD6A1E655AB395E839F074D1596488700C 4E2891C8AEEF66568E82A8B826F9A28FF84D4D9BDA21F638EAF96880B4EBE0D8 081982F34831A03BEE81FC177700C2360D2A48915EC40D5FE85B400E175D5AF1 067FA0097904FB647757BB44B4042D30D1557BD0F7922D731142FD682139CEB7 58CA4C8C240A0B86B1888CACC507E24E04020BF1882BD9B4CAECFA97DB24D7F5 AD64C69454027F198BA35881B94EE9159A2D73E450C3BDAED66B886D6DEBC84B 653E165176228F88993F12A170775A8D7038BDF2FE8DC1F7B98BDC02D1E6686E 9B834F6C0AD90780B17DFE25F0A4E470CBA84E73F2D22BEE09A040F14CFA2C14 0FDA5A5149B5FAFFE49F55EEFC43831BC43A8326FEE9C7F469C0FC3B000884FA 41DA7318EB57262CB96FC4EC7F16CA07FE1C3BE8C2DBC8A8135953D6DDF20BDF 75A2B6D26074FCE752BD32FB9F5CA797775E8DB9BB9786B469A3CD65A0D9DDDA C2A166E454A94860EEF5B5C12172DDFC576A03F6E6F8A735FF21A3E9CCB4CAA1 3064893487697986A42CB5888B2B0A79FA3C74E8187BDDF7BEAB884B70B8D4AA AC6615745AEB906E08BF831CFDE222F58D02B428D55E9D5A3CDE74E42D8A2CB7 E1A3A9439B678AD438793ABBEB72B21C58981DAF3EDCE4BB93D95F4A1E943BBC B3A012DE92FED4F232A3A7D60CE60B605151F9C7C18A5C653E5D6D15E5B49A63 73E7A339504D0ACC74B8B116EA88C3EBA2CC631AAB29F761E5F062966AD2FD28 7FFE52FA8A115DBE23E471094FFB3CBAFBDF11B7E9058313F2D069B2CE98A962 64645738F02A31E2F2AC11628724034ADBCEE012721EBF0A567893411F950410 B20754A7510D041FFA6144AC9CC46D846B82581F20BBD001D34D9764010824BE 61C30D05E5C5D100A24F1917F01799CF5BC4E50FCECFEA732CB50196825F0E08 8A1EC868C6D4357857EE2957E081A0E4372E31A8ABEF23C3F2EA0FEE57DE4D08 61C570175C41AA0C7A3A579ADF593F18B4AE3782D2552E4E0759C32E059EE741 2D8191E381731769F6648B3581CAF11DAE46471896666F18F02918B0860BDA3C BD5DE777672447C23C62ACFC2611ED5239D6A266FDA6031EBC5A530C1A2FF7A6 B4380B9A4C877267854AD1F1677CB5433F28894ADF93D39EAB94541A8D232E08 22D082D0951A60F62B87DC028714EC74133A4D65F7D0D1296C0E189C4A42AA98 28E8AE7ECBB9FC8DFABCC6EEB1E9FB06227F90808EF31331CCC5D4C9A6182181 047902DC9FD0444FB94B60FC74F3B677758088CE6A159D940C5CF682335E756A 8BACF06AD7225D49B0002392C889B0FE2C71311D2596F4903D12FA20BA2FFE25 A0804B4BC282929BE31E0F46B34532CB5795A65218CFAE21F390792DA67775C7 B91A2BF4C16DE4F6551DAE3A5827F616BE9040EE6B1008DA2F99A01EF66D697A 6CD1A44E0A15D1F39EA8025E886A68A1E9C334327C7703EE721E497CA924AC90 7723106D913C5ED4BA4FC743CEA8D0F5172526107DA65775C0B1B77179D336C2 9B09B608D80B1A1E87CA1A84A833A00D980D919BFF56F6390E9D5B45E9935CF5 E69D003564462F750F7DCE02DC23CC215A0696B74D8BD3156A392A94F557655E 00BFAA035647568ED66157FACC585E411F7F428569C147DC43F6E4FDE693D0F3 9917BEFEDF61FB980B85515FF6424824E2D995B05CA1E5D3E8BD8D3281DB7CE4 E54923E84058FFC0A8A2C491327D0F87CE4C352B724167CEE224DABA3B95757E 4A419594BE4F92E78BA6D35D4C93D31ECC3134B24A45DC32445725BB044F09A3 AA8C31EFC0A2944ACE2F2CE054CF24DB350FB3C71115518C24BDC0F7E54250AF 9D3378D38480E1CB9029F31570C619A28F065CA4FED5665EDB96712ABEB33B9B 4232C00C1B0215F08D53F7E430887035AC25BEAF06942FD1B6C442253C887AB7 D694C1A6115C8990B4CAF1E81DD1FDDD6B03C00055BE956BE7FD8A4E1049AE69 EDA8593CBA8C4A41E046C689FBBF9F1B64E5856A7FB1C61EC815A56DE2A8ED33 41F370B8203D4E5B19C63AE9E6E0D26F4F3814B5AF48AD30EC9B8402C941FDD9 722FCAFC638FBB835F83DC77F93D367266FA7DFFFCB567EF82B1695AB4D94D09 B18AC041811027229DF431F5CB2BBF6ACCE9D500C8F075A74590641C1A607C56 D2B8624797BCD9C91C3177818691FBB4744EDB6056464A0B95B8D63F7C22309B 82D6126E2057BCC9FE5566D96B7A9B201A09B0D3252A5494C8CA2C8BA8A13C29 37EF2A882D61DA708C279F663D88A8E2999A0F3B6F98C49901A7631BF7708B67 54D0B4C52BF4BE0DA0439E6763A7C9D639AD4092E77B13D3510DAE1475C978AC 796F9B2AAD3BFF35C5A3E19B5E2BF704B3BBDF68CE48BA4FA2496D60E58888EA 28AE12D00E9F0816FAC190590A865BB58569A91BF0345D01230ABA361442006D BA2C90EC2036BBAB79EBAFC3F217DBD5854C519235F9627A1C3C71D21ED38AEF 0BB40F3B86BB9F09A3F309473D8757AB7E638DC1C59A7F9BCD49DE4107A2E54F 422767FB94048987847205584309397F554744690ACFFDF5902FE5DB355930B8 71863217830DD7A563B0B3A4025ACE75B0E777B4414B62A13B50C54E0E6D47E9 D43BF769B9411B74E1069BF71BA873B4B8973EC9BA492A5DEA58D267872BB246 10AA67B143D0E2223FFB4991E583E629413CC894C3FA4869B72D19CE1A0CEC8C 0FF5E5A3EC1FCB7D3C4289813F0D249A11B55104BD60B2A89BEF44CC77CCDA9A 065B8B83B4F4253AA1D535290DCFAA4773452D110D2B3370F9E2FE5432B54A9E 644EB3BA9BFF62347F376839024CD5EF3C5DFD30F412DD5474B7933E6A1AB63B 4B12F2417C72D0543C26A263AEA53E5BAEBD67E23553A72E949DEC556BEB5D09 C4D7A89B14FE4EC68D0E3E9D65A64B285E53590F418EDA8175113CA375A29930 DDCF4C71ABB26CEB800C2C2B253AC1F53651C88A56ABE5A74F3B54CB4FFDDB92 60AD7272BA25EC2F6FB759AA6E1E7964FB55AD09F4EB25DE45FD01833947BD05 6266AA8ABB7DD792941C7A070FCF3A4636FBF8921C70298D42FE92F079DBA2AD 6149D9CF9EF7264DE6DFCD4429949B15EA90B596340713BD61926DDB2BB23BE8 F9DE38A31620A817420A245946E551463960A8C5C7295E3B3D6A59BCDF5E472A 40B7A2CDDAA43CD8AAFC411D037142579D11054A903E102DF0D0C7B5BB854DBA F3F086AF991F7F5D5C730F8F9AF213F25786F3EC0E54530FF912F4876FDE16B6 A07D0DC4FC46EC6363BCB68B83ACC448B801EC43FDD2F8BE0E93D809FF81E38E 176AE17C67C85FEA58EC95435434C49A950AA955D8B20989C550AB1F1C31B7FF 99422E1F48FB7D6F327C6DBC4695A03903DB275B94CB39386E46579271870A25 21823E75C377E9D5B46655E8CD8F986372CF8BA846423E26582315A9D19E0BF5 305C32B2A0EAC3ECB275B1D8BE11A37ADF524944219D94EA2C5DBDA768828B6D 775DA8CDB09E0570E4ADDF462EFD8D3FA3F86B1DEECDFFB699AF6507257C1879 16FC615868C2D51F03CD57BA38D42995D9164B257441210084DC409B6EE4C119 0B2E17B0A8D5326DD0010E4A325D5F77BF935693BC90A00A28C7B5F74817DA39 F47A41E32F4F92AA04D30D810F7B1484EB53AD8CFC8CE8928B570314E0F713F8 AF127227190F9C16BB73D2A217FF801C391A29095DA5E4974D137A0CAA7DE702 E20DD4755B1D78739756A5E7EC3542B96AD6844199FFA2F5F2E9C64E2DA4FB2A ED79869F745C59D235438251BC2E6D26112AAED20E06021D1AB896EE1F1DD2EB 437FBD4A25E42245C5A647493FCC9922E6DD7AF57D5D482921D1CBD6F0F02949 C27777144751C1E72F4EE2BC343D4AE7A8A8758123B54FB1A026144C643651EF 0907A376945E19A8FC7F98A034832A5820A481B0823F980F59623E0511593FEA BDE6EFBCC0383242CBD4954027B075B21F10472059A480D6E5ED01C3B07461CE 9810251A5C5643EC7403130C2246E8616CEA25EAC7A0076731FEA8CC43BCE3BE 933FCE61067F5FD402E67E2B9DAD954AA77C5BC86BC5E4BCE2ED676D8D8EC7D0 ABC5C86D82180B9D5D7451C71B5149B6B67883578DE9909317928C0A92E3205E F23015400A1763A6FBF67FDE3318AD2696685A1832FC31CF38589EBC7CA1C818 60D2B2211E04EFCCEA88D9A9082E82951EEB123924A267CB03C48889032F2892 4227E217FA28F87E01CBF27BF1EA60641A4238258CB7AA355908FE36D90F5CAD FE992D03A33E47CA9AEBEFDA57793F39DC6A9E85D5B289F6B862B35DBCF82E43 5CD6A862F6FFAC36478C384C3BDB0148CB1FEDF55969C776E77917635B5A65EB F2AD351D21CD3822D43289FE8EB0FED58182997097C7E9F4373553AE1CA92083 EDE3BBE6C3BC7009D15AB5FEC6A59E9FD1BCC7B2099CA15FEF083B9CBF7B890E CDDDE6BA0AFF306C76500C945DC91BD533FF9A585CEEDEF79238C54E6168001E 26FEB29E523EE501BFA4F60B782B1499B07084C35A2434B4D29D3D8E2C8F945F A9922443B68D07DF7EAA1F4CDEFFC438B597D8943E231B5216808A85F30EDC81 9DF5DD22F54A45335B4C2203887475F39D247F0E7347BACFEAF220ED82F9263A 6488E73C1910023E505FDEB143006C1A351D441AC57F9D52D2C6D63D78C75605 999885676BBBAD56074298E0BFDACBA1830BA58E87F436CC670EE8EB1870154D 72DDBBF3794F8CAAA3F1E11DE29752DD99EAC695838A19BB67A1FA3829B6E0BC 5301610A0351AAA749F456AE31ADD87D6ABADCDD1FB3CE81C3713F48780DF407 530CB284B2AC709F52EE7AD647DEF9FA4D2A867CCEF728F3D40CF34C28D21527 10160B3DAFB5FE16AFC9D36C6EC4021FC189005862082BEA60AC72B63AD27D72 FAF3C2D89DA2648FC4C65104A069212D87144E8533CD86A6D73DC7CD9DBA25CE 7DA53B000266F3871B24663C77723703315C5E4A89DFCDBAB384AE7EB2F455AE AB191FED406F7F6EC9E5B8276EF5C4CBA041AC7E8BCEC7CAE840154BDCA3232F 15711ABD1E867A434E9787CA0A6D1F197597DA27ED2402CB2D84ED082E8D3A39 81E6EB270DCA4E7A90E2BEBD3CBB3A2BE3CAB926192D7292CC16845B6399A543 BCFD224BB52F21352732DB5154FA3442733066CDC3E186D8AA97CD801DFBE43A 116C86889BE198DA88CA978B8C40ACB67E8F7BA499DE68A6FF0DC72C3D00BA1A B378B39610F15CA026F95ED8155CE3FFFFA2E2FEB352DBE14CEE1669F2387B70 55B91185FBBED764266215D518716EDA3DFC9E5DB6B148A553E75AE5E38E1CFC 6EF47B314D54CF24BC13856F4F7C976BB91D143DE32FF49BFFC87E17885A1893 BA1B8E441B08EFC04F7D103C1FFBB665194B3D0920473740C55FB1C50EBCF717 A2359B687FCEAD65616EE89A68F8D91AFACAA0B238EE4AF0279AF5BE5294C3DE A7E1F5E6248C0210E7D40683F04B12A933C746ECB517CF94BBCC6E4CF49AC715 D8005AFECBDFB7A6B417DB8A28F8E9EAF39CEC1CA64DF37A5E66A76C26F721F8 A63B003A040A62F87DCF61B298F960D510BEFA453F118E59E7DE8CA3DD002EF0 127EAF733D5C61B5132348D280F84D159809CC71A3C6F7373BBFD8D6EF715D34 0016DEFF14AA5F960BF1BB9AC304A1823722843547BB4CA5EA4C41C6C2701C8F 7BDC810443F9DF34BA469A3260009B799871BAF8523C8763544DCD0B382D44C5 F75046AFF85F0B5A3188C2EE786CEEE5496A5AF4BCB0B429CAFC403FB983EFE3 61FD9F52ADFC38E07A0FD7BACBA530D2E4DAB2592AA9564843E7E2305047F060 C5FE4243FA8FDF1B5D4F61ACA7850A604FBC6D6970959752695C90F78961B4E2 C8CFA41082B1A37405AABCEE5BA3DC2B9EA76F486117B84728EC6D8AE6379CCB 402C2AA89078EC992C00D53151E9D82C65643F549A572A20F05107A41BE5AC57 8EDE92AE20B05E2D0C98151CC92D5389A675DFE39DF546A33A84A4C534337ADE B17C34E09145B37CE1EB1D10D42CC8D6E6B127A3809F7202381FDB88D42084CD 0AEAEB8A8288CB56870EA2BE9D0B9DC8291021CA561E2BA388DA3494E433E0EE 5E69DA51D0AC505C9F71562D3E9750F23CF14D2C8ECF0692FBBCB4A92B48B4B0 AA2163A447D5FBE86D961AE4D4251149F11C4BC269E10B48E8C42DC2484EDE87 6540CB8A5EA2494148D09CC9D5014EB73C29368A3945AAA1BA4C17BF640D2A0D 414293480FD600A77D37471828C4645C5A4AC4729F4EA76FC946810B4968EB0A 719D8F3E61D2B740AE9A33E9F02982A13ED4B6ED0C6C4A93A9E9EC045D0CDADF DC01ABAD0BD95692907C04F06F06F1BF6259C8E71099FB64B4FE263D06C5854B 070C8B864D8ACA6EBF440DE14DA34A2A548C9F1557C70A4D718F4F881707851A 6DCC39BD8791D806F5DE551CDF8612C7EE6707D554CD826CF352CA634FCFAFC7 232F32B3F0EE3D2577915BEB212005E06625FFC9F49383C9C64F51B6541F6AC6 12D2359547103898D05E52CE54B46835 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR10 %!PS-AdobeFont-1.0: CMR10 003.002 %%Title: CMR10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR10 known{/CMR10 findfont dup/UniqueID known{dup /UniqueID get 5000793 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR10 def /FontBBox {-40 -250 1009 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR10.) readonly def /FullName (CMR10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 13 /fl put dup 14 /ffi put dup 33 /exclam put dup 37 /percent put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 63 /question put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 91 /bracketleft put dup 93 /bracketright put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put dup 124 /emdash put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9B8591E5F01442D8 569672CF86B91C3F79C5DDC97C190EE0082814A5B5A2A5E77C790F087E729079 24A5AC880DDED58334DD5E8DC6A0B2BD4F04B17334A74BF8FF5D88B7B678A04A 2255C050CB39A389106B0C672A1912AFA86A49EFD02E61E6509E50EE35E67944 8FC63D91C3D2794B49A0C2993832BC4CDC8F7BD7575AD61BCDF42E2E421AA93E 3FF9E4FAD980256D8B377043A07FC75D6169338028692CCA8CD1FE92FD60AD26 D57B7519B80A8F8DCE9CEE5CDF720AF268D3C14099498A843D76E3B6C0328F24 D36EFE7F5C4E5B5C612786200C8DE3A41EE5F1FFAF4097653CFCDC8F4FD32E0B 03EDB3E413283B9EFB0AC33B055617005BC9B0057FD68C52D1B0E67F0C571685 767F2AA85ADE4E0104A1C777733D5E318A22A9944336E5B98D965E50D31F357A 8B6EA5A0EA98E1B027CE68C2EDB149EDDD04ED74A1B3D206D471A0C11C11449B DE190BBFEBC08C9E1B7513B43DA3134D6B11A2516E6E86B67F68C970A320D05E 94FEC57FB347606DF89989C33482BD09D011C55AA920319E7B26A205D3D0F004 22466F09C0482A164CFB27EF6ED2B040ECCC3DCAF345B5A73676F193D43123B7 72FD6CFC5E37930E61EBD5A6307E4DE70194E6384EC0D79DB6AD86D3B319A31C 8B0589D0FE28241D8ACE280D0530EE99C80723E560BB72AE9D53F4713181F491 344B06D3027BA4E9E94D4305BE1D817197C54C8FF56CD6964165F6448ECC8A8A 64B48B4F0FD69299A137589E2491A283509B21A3A5772F75B7602A9F60AE559B 07A58436D04222C73EAEA72DE9A5A441F88D27C11F4F91255EFE280E91A4ACAC 1E98A4E5E6C57B9AE86FD218C3CD8F24A4104156A80F13821384E529783C52C8 78B94AB3A0096090867ED32E8A30980E737922037F75F062BD83BF4F5929BC51 CC22AEE2DBBAAA001CFFBFF41D258424FAD888FFF1BEAB796A44E3126159E120 7E4025C676CF94888A1971AEF8B6764B3AF4A92D36FAF6FC56FD049710EE3782 BC2CD84FE2473F133BE03C1346B875463F126DCAB15C7A9BCC9A727D23611462 4E8D2BFD2466600285D79518712B8681ABCD69608E6AA9578F7BD771EC36E01A 5A17BC17E375020ECA59B43790ABEB9DF5F4FBBEF807E5699EFEAC563E1ACC5D EFA336E75DE6D8248E9381BB110884FDC89C2F9A41EBBC9A8A1F98E6A41F68BE EE30E25CA148C1EFF42DFF8C214A6537AB11F260B8C329A4947B5FC8DC9C5622 4DF7BF4FBFB00380D47BABB03BC30627AA74103E553F55278F538EDD8C1E64CE 0F1398CA0AB5A86630139B4A7E8FC02804CAFF3830114640AE50D2FDA3B561B5 C63AD7EE3347804CBB40FB1E77A6C89735DD870351C3A1811591AB493251B904 314F65791963C0412377C1D02362C5E9655F1C3D4803CD379A8EF24C48218C2E DF1165840462BF37DDE1B8D5FF09FA2C3B261E2F1A65ECFBE5D4EAD43B52C029 EEB3948CB8A252CBAF545C8FA1C31E920E23A12DD7222CEF2D2A513BD758EA13 DA33BF5FBF1D734653EB83DA2D374A5B9A0CE316F24EE375D6DF6BDA49954C2E DB25A88821193636119D469BA66E5DAA9C92520FD4F84426A4E54273FA469084 7517817A6EE3E21176D333825E88046F50B3CF6938AF9BA79A2F51398239EB91 1A2D07F7FCD948427FF62F40FF95E39FE1A1AA8451411563FD5388472251C155 69BDE9283B41900B21EB1190D06E6B13B7794FED020D2C1BDD205AE77B084BCE EF628249398B496DE85B406FC2E1939EF00DFC84C07E26CF72EC401BAAE756E5 7F6673216E7560D1C2A723CB405EE5CA474A07F61B81F8836482F73DC9516D67 CE0CB770EAD755B6B356198B4B97EBB29C63456953270CCC8D5650C1D006E69D 38DE2DFEAB27DAD50A817F0D645D30AF5B75A7B53CBD3D2B8D87BD0A7E525AF3 22F7ADDFCE31716914C2318260C2E2B4664893921B68C5A93334A361D94A759C 0D7B146D6FD94F0442D672BDA0F6432E18F3C5DFA37ADA378D95B75F413C9ED1 BB5C606A3EC7DFB3F796F59B0478C13FD1900381EFE0BB5242D5B5D34D03AF1D 4BDC93EAF8020E26CA23C8B0E7DDEBBC6762A557067A4CE05A524188A8F02E2F 3625DA38DFCF381727887F5646A3995A8A38A5FB1E5D5EBB395FDD0B7C8E71AD B48EEDB62AB2CE99D121435EFBBFCEEA69AE9ED8238B60CC7288DE33C766CDFE 15B767B4AE2E6CE0965E77272AC9F86023DA620548CFAC85BC751C44218A29C9 849F1C2DCBDFAD895B54E51A569952ED50F82DC8A19F367E7E44643854EFD6B3 FCAEB04E55E4661C82D31E2932611748480EF61FB2FBFB0CFB940BEA81AFCD84 4C6A6332D7A600170E38A8EAFCD4F93DC153C43175434C86BC747348FAC61B76 1FEC9027C1A193E55C80F1F20B5317AA0A05AAA36AE235F6E49F06E570FEE798 84857D7552EA92EF3EFAD52DE39C2F8F43C59E3A957B7B926FC95FC4B60186DF 7F3523EE2AB74E294C8C4BCD8B4975E84849E0FBDA6C0B0F24A636DFA578B122 CF97BC5089E21E9F5298D1C9F30CB8BAFF6A3A11BB4D9A0A5CF2B18D055C44CA 4FD4D8FE1AF3630907DE7E585AA811F9CD11FB2C8FC791851D651009FA5DF20B 3C33FD2FF848A9E3F5652BD294965A332DD3F246C91B0ADA34017FF2451D1394 F9C3C95AAC6EC8062BE98E8914D51DA6A164AD13938693D446044859D03A949D F9AC5DF4A000CDA98BB516D762CB9F6D44B5268FD0C26E88BC4A760C0F75A140 DEBDECA4F511128B7D2805872160C55236F0A0FA7637FF0D4E94AC079CD3C8A7 D03A5A56F26B0438B577C46011A10532FEBCAD14FBD6032E224F45691A726886 56F305231EB2FCDF59C8BBFCB5DBD2D093A0E84D62AC93A2312CA69295E937C4 8DBA1802B85F54B5E7E6D6216A918F911FF705D3B5CF055F1D873B96283A0B53 59344D910CD396D883F6F7836BA65FAB4393A773A8F6BC298069E5BA38210EED 49C9D920F718E3FCE692527DC7CCE6963BF744F2C91BC5952564196D60574E86 87A0FAB21F2DB2BD5A51D7FBD8FC19946D24E5A228462C4772F978E650ADCE3B 8D66B9C21279C531CA1C3A8ECE3420BB65837287A7222CC3673A2A5F8BBFDB60 C719CD073EF9A23675198462C7C87B24CC92D6AEE5C25AC63855CC3281494342 D28F3D2FDE0C183486769A4FD5B0143193D31FCB2C2A14E487BBD96D0BADBB64 D1B56021C363A795BF10E2DB448261C363A54A4AC1182B470C457AA82DF3F5D1 F4B329806141EBD53CAE309319B94133D7EBDC2D0453A905ADD207364371E178 0A95C2686E3B34C4A978BFC0EE968C39ABA00889BC5149162C2B54483D44FD3B 5CFF41F611C7E03B94945F414560E874D7CF27FFD0630890D7D7EA66CBD15448 229059E1C436BB33D69552B5367AB5D53591C4678D0C704DD3EA23F5D9E8A7AC 17D003C19E333E726FFFA2961F33C70F429085F7BFE3E2510F59B78F58B19CB4 01B48E184BAD9020FECCE3AF52048A056981DAEA02AE78197E65855DDB170616 F54278395D9EA50DC83761AE759F9CDEF9E1948E7002414FC05286ED793E6662 3347F2A9AF8917493D7305B92CF93E8E9185F70015F5594084298A6C2F9FD3C0 689F262AC9FEDC9B89577ECDE92F08D3142209FBCE7B5C0A840CC767BCA56C20 4E4E545E2BE4D21C53855CEE4CD0AB35D1A604C0FFFF77DBAE4289752276559F A05FEE65F45ECAF44E95E23FAB6052195C7948AF0B1126482D4E02D72BF8AB03 DE0F1A632F7672AD9DDE70EDC82AA993678A82BEAD0BC2649C4707FD8509810D 364B5C6FE0E10772E95288C622C2F06C634F4DF8C7FD1432BC9310D5F24FEE3F 7AB324863D6DABAA1576E70643CA79EF4D7DF4105093D66CEE0F3B87D2164A7F 26EA05F5C4645B22D3E1BFD2219657712C168FD90DE801FB0F32759E80DEC1E1 43CEEB19FED12D757205043FC98FEC62D6A8D8B97BC083B4A0E985AF7850D6FD 8716B9957C1C35A0675BC53DF672C425C79F43FDABAEE7D63F092CF271C9A9D7 C41F40C4189510987887942E60A412B3EEC84C9A6E1AC7D54D528F5604B72C08 94B7882621A5BF1F325B92FF96B80878CC550D1AE4D8196E41CB1251856609A5 C4D3BD05A922D0D45E039D9450DEF8490A3E924E41434194910BF60BA1B08BE1 B41824345627745541A4F1703E956328F6227D11C74946B38CFB096139979E56 4E723B889B44C6D78673868C89912F8B4F0B4B485F1587A637B630F92E6072D5 7F3B44EA6FD96BBD4FC28A6C1D90805E3BE3E42A7BC9C880762966C55BC04E01 204D083AE976FAE6F37C94F27E68F8C0F28D52B17F6C0FD7C9150701FD78F8CE B8E8DC9260E3974005EB5CA728171F482D765016C94D4ADFE4A42EF42212BC56 7E4EEEE8B0D2A7856CD4E44F55C0BAB762F92CB8D64C17022D4BF3A47C12F5E6 279FC23101FEE93753653CE8CEDC3B75C9CCB29BF1D4554C6120DE8EE750FCBB E38B5D915206974962E320362E59B3F21B3AB1875703191043D03284D4467346 CFF2F98CEB4845B73ED8E003E0DC94251B73E13A9B51A3F1430BCF6A21EB9B7A 65E17FA411F53BE6432F1506232B8159E008FA257F884A4A01AC53BE91754D78 BF14A5B0FBFB9C31BF4908355F8A762052968DF526D118708CCB0B7CB5BEE285 6DAB6CD2E3934178E60BECB11AAB5478623CF6C50C92F8BB5D1A583609028FA7 B8A53B791BDC9EF76A124F3F7641857E4BEA0837CB36176EC9A522EA7F41B8D3 63C37D1145367BD300F17B54522A834BBB74DE12BF9EB26ACE6F24A046D58F89 4D4B7DF74875F1A0C1C9D97BE0849593D7B398EB4B00BEBC8C8D1497B6EF831A A35380FFB7F1AFA4D888AA52C9482E8B1755CC209905F98F40D95B44D4DCBCB6 67423D1BC2F3560FF0A8B4F0CAC352A4EE2C1D946E45AAEC8A6AD40303F3382C DF0756BFA3B1ED64C169E56ED1C760F2FF0E24DC5C9F41306EF8D2628153D30A 5DCB0791126BEFD4947D7EF08301FE015F2B0008DFFCBF9F2D4D859FD43EC7D9 C5BE237E9BF6665B7B1BEBB362F0C0C3A8D86010B9C97FA741C97C2E0513386C 9C26C235B14DD2A58BFDAC7B5F63DB4DA6D5D37D0098175A9071590E1DF66A3D B8173A047C29D7D35557F06132CC920B5460B8AFC11D23D09A4E45D089F5EB51 963FA1A6256E359D485107FD143B2BF21FDE9DA5744BC2615E86C31C89470CF0 D06C6397D9FCCB316EA9989430240759D2C4945D941F159FC02327F34B042BAB B5C3A47C78E8C1A6FBCD396B1A51CC4B020B8AD401841EDABACECDB482D6EC5B 72D2BFEB4556720FADD49D07307C8B22ACB7E310CA4151A85C71EEF70E8D15DE B3B00F26E0E166C14647A65ADA228A3D1C89025BE059306565DB1B1EFC37D358 8C1EB024254AFD049BA977BD4C2C605050E17940A89D0D4C5D963E792320F5DB 3706682E03D25D9E02487247819551465092CC22B6B56E93F3AB528038FEC3F0 668F866707A19B0463BE706EC729D2EE1653AAC7E29BD25BFB3241D4792F5152 ED415B4E7FA92C2EE5A22E27E8B75542C492E56D811C192E95542A6FE0BFE5A5 69273C2ABED4300D491B92D2AECDD278404CB84B1BB1BD7AFEC858215837D118 C0E928BE7E07CFEEB51A6D21375B772B8248C994564014015232A0DA4BEA1754 3274F407FED0837A236371F1A32056240F2015B1E7F4B2CA72C6B58610A66F13 407CFFBA5E0A2893C1F572D50F51286E9133B5A84239C9493B0574E77D281D01 11D00683354A000C9700EAFBC1FD104EA19DFCB87470190E7E2CE26E3A6FD0FF 2620B87B82AC8686B6206B530F17E9348BC7D04B948348802CE53A312443DB87 4DBBA5313A6A2A8DAB8A1CC9A594FF8C299281C0A261C8CB2226B732FBEEDE40 2C6ACC74A1A61379E2E1CD5548CD908268A32FA83D8504C442EA0E183ADBF7FF 9FD09C037AB03516ECCA93FF048235BD11A25DB07F164512A079C5392AC7F889 CE96AE5C8D9580BCAFCC087C35E76EED1A671E87C12E3045E15A687134736DF8 DA984772AFD189D68571A2ED7256F1E204230E41D3D9DD876F938951714A3973 0CA9310489F8E807C1C7A4E51AEA5BC030610A5D7263FF7E0F9FDE3E5E37A362 5B919000BD94D978583B942EB79CF2BEAC33FEBC9A67272EB10865BA8FB75FD7 9D280AB59F91B96C16C982DE848D76D8FA8620DFD7C80B7DEAE7264350D6FB3A EF04794DA3305844A7CF718F6D1A4A3AFF6826173A076A1372ABFC54ED3AC6C2 09C9287FC830556CA694E21CA5342ECA7B10C90AFC4783D841D7B1E34FA3DB7A 2B706F3E21B0FBAB23E7257962FC3BC309CEA2C7239A9D6B44CC96825115ABD2 AF9A2566D2F3382C01569FBDB94C8D664A5DA0F7DC3DD140CA77C743D7BC1420 324ECF9E4780280EB119885E96A6C619CE3C0C8E1E264E2DEB137E5DC8149786 486D65667ECF47B1A1E20E9E6E4FC8323E0BC8E61BDD3BCDFC6575C69C03E31A EFFC290472CBBD049DE3F840AEE37A2486034240F80E75D8A79E0762377DF660 52B12EAA16D678990B11A9BFBC03C1D4FCDA9FD4FFBB3E88352438102F10B7C5 9F04C013B6575B5E948FAB58EA691984A0E54E6B9F3F505FFFEF74D06FA1CDF3 4B8A95904C8A2763AA8AF5B71D00F5DE09DC1CDF87A08B6D181453063E14C12D B7BB3775A6E2A901636273D9EEB833EA8CF20FD83AE899E28DADE10EEEC20BD7 BD93085A4B1AC80AC1AE8280C14767F1A487BD066007A0D050317BD081131A14 6EA0898ED59E46DA7B6254BDCCBC660686E2EDA0E77A705A653733BB5C5497D0 B130359F866CF293FB6EF0C2AC5BAA2DB0DED045E2DED3A2612D078333260359 16CF0CCB272D34767EA069E0F0B0D42327A18529D72E890EDA6195C2688438ED E9ACDBEED41E81CA8EB5E43C2B09CE266EFCA03F2D7FF57F12B06F9E54FCC6A6 546676F6FFC5B8B7D3F0982B6FF0D21D949309F0C0B175CC1D0976F8C55C6AED 6E821C39041E22D91AB30922F2B2EC2746BC7DAB484991542FBC82D87B487507 559AB466F73EE23C2D3194DC5CE4C9AE66D3164613AC5CBB3DB501B64DA7C91B C7ED2EE9027FC0906820B35D4F2CF66C4F9CE4A884B7C07155BCA884ECA5EB3A ABB83F84DB1F5639599DC7D3F51241AB5D95C3BCB7AB1EC90B4BC989F74FB354 04B2D7366A34D335A47B8C00C05CB423482BF6C7970A95545424A08AFF9A035B 7F83F52B65A9799CE76E303B85664B624C65E9CA58184C7BE2BB9D9C86A4DE5A 8165EE3DA2E652B5022EE7893896BABD88931DE1D538F615787645DF5ACBBA0B A8E5B899A37321AA7D4B283AC9234978C2DD81813A1EE5DB6EC170DAC1B6EF02 94892635B498765C07A38D2E9DB0B7581B11056C28278F89B0E60998379C07EB C0EAEDC32AA69B8B836F92A61AFD35688315B2C3F860632FC13E4BDFB63214BC 41CC6859EAB3AC3034449213CAB99FA1D216563419CD6D6CE4E1B56F33E6C654 7AA9DCB5B05FC068DF02AC32408C8010AD004F6CCA9887830927F8CBCD49CDB5 18CAC1EAFF815FF2F6F527F936948201565003022C6C7390B4E3C2B219FB4F76 9F12BD25CA7B3B61D1A2F8DFEE795D04D5428B42FB66E0C254AF7B7A10CEF7FD E5ADA5E217BE24851180E9A1700FBA66C7D2B0D7BFDE4F4EED1D24B821A40947 5620363657F6D048E651A689822CF815E72FC8AE9D835BE31D1DD8B54C9A717F 4DC319B4B59AE073936EA40B070524C7E71D5A7B64436DA107749746B516E29F E3BBCB8F8C473E706670E11E5B221716F315FF097CD1841D0069FA69EA1898FF 9F9EC2518C77806A19730C97F54BEAD604548D553D4A6EDB247853225E24E7E9 89D71F6BC94DB986467E755CCC99069B313F5745B02B4BB608A39F0A0A732B87 7EA2DED68219754BF1FBCA350327572D769C962EF9242132D93A5C8E9725D8D3 AAAEC15ED0F362471AA58488620156F3474FA59CA080EA96FE995D2B3DEEADF3 3141D157481C66507725ACA5953CBBE1ACEE7E3F02C72C6552D15EB3D612730E 61A06A43575568DC3CF3844BABF04CA767E2995196097015E0C4F622C4356B6B F41DBAFD797A4B9D7AC22332C552043EF98913D0D9B50CA6B7CDAF903BC5C04F D20A952BA5CC35B646ACD0A287C956B98C450051AF6AAF79DF37F8954473F8F6 652BF03AE2AE82B99D820CF93F5FC0BA17EBD7AF90313E70594EB5C354023BFA 07912408F1757319C7288E99872B907D5AB583B082EEED8AB079C63E38B07D11 6744856E689A479CB3A8BC081F33CB06755926204981DC0A45B3ACC18F6865BB EE2C50DB43B62E3630FC1D9B1FFB3BFFAA6D0A20C0381ADF48E4D916BEE85BA2 BB40F538F55C11D50F882B73913840B45161262BC8B0012694C3EF26452F9B77 2CD7C7AD6BFEEAFE31C8A721C2D46AA00C10681BA9970D09F1E10DDC250E2AC3 9A160EC8C9654FCEB36AC2B586E978D54744FC8A0E963D8EF6E228ADD22D093B B889CF6B19B051C243541591BA42B0738C360E479BF8D58E5318CD72CC4BB057 439C03CB5C9E7751731A4A86351C8B082E81EE08E8D3D565E42987DDAD250347 45F7B23B1DDA74A819B97ACC0587E3EC7907B15F83B2FE2DEBC3EC9499DCC6EF 390F64979D77A4C7CF94230D61E627529201F1A70E2887098E096AA5851D8B0E 229CCB625FD1336C8286D6411916911E0AB125CACB618E58B0206B8ECADB5439 AB712A9101FE2D8C879D563E0DB257BC36012C409E168D5E173BAF353164E7EB 30E8B709068CE066960AC2C49A0F464678859A030787464AC057A37CD992F0C4 8AA6FC3293D5D156BDB3A3D59D187984CE5032346BEA635B0822CA65809E1C8D 9500FEA9C21627AA0EE4E0A0302B131977468FEA4EA466656C57B03FF9B78E1B 6E1C682B9371B0E052C34963D94F33D2DE0FDE4F3607034AFA89C4E33CF45E8F 2351E839ABB8FE5B53054F863C7D984B3A18E6756521B384E131521A2D3C45FF 7F17198F6477BB26F006F989FDBEF6EE6B8290123A8B67E6AE0A93F92F34EFC3 5F225CC49082B1E571E0D872B58F17B9099DCD36CE1EF108F582E00D0BC6A657 C2EADEBEDE78F569345254A24CC597B395DFF1E6E181D854EE5B492BB36224BA 5CC66BA12954746992009BA80F4AF54C461140EA0A2558B74D749818C4EF9BD3 377E8CAE6C4E59330F9906C6732A1BAFD4B9C9EE0CC4F25889CCCD84E33191C2 27B269CAE6BC5F117865D1A0249B1623133EE28F654F40ABCF794C19DB379D67 01D997DD370BE73E380D857FEE3B047213AEDC309C0EB1D7F4B8C68B999BEB87 D4DD2A5B0203EA36BE785AD589B451B5B6F03994AE6C121CC80F1E1B7F5A7A12 69E21DB5A18C616A4F5CEBA8228BCAE6DC89F652D5C6424C6D08B436FA24FE21 EA8A6CD551D99EE3FB77B449F439CCE7D614F4858AC86F20192952329577BC07 041B903BF7E365C038FF8C8003F82A76F834D2E4E93E18318251B7C0149C9A18 3791320CB5EE247EAA68EC3C5832338F7E40BFD80D1C98764EF3528561AC7B97 23F2030B76D00312B88EB47470118E6D7588C7500011FCBCD1B1310C75AC850F 442368417A464E02AA7FCDE07FF213B5F8FCF7156859F14F2F59994DAEC9A3D2 8BD9809FEE07FD469D98961541EBE06FA21B47A2C431ED3DEFC7267AD9DE87E2 3C22BB9FE903A205E1854AD4364CB8A30547FBF908AE01D336DE209D7EFDECC8 DD734D1B603806116DD724CC6E5CCECDB7A7F6BFA1CCA0C93C9789159A49FEDE F296CE3177297B6935C9C444D049E9EDA646059ACB312861AAF8B74926921453 DE8DF32965E05BCD2E05A00C46F28D9F6293E8614966D592377BAEFD8E3EE8BF B0B49AAA80337080E6B8A614DDB8D22DA94EFC15B94DFC1DE2085C84C59389AC A7E9F90140A3918609C50C6302709B3E80DC852B57327ACA35C0B7C20B224874 5501CFAA4364CF4FBA590AF5C42C194788D20A0F3158339B30839EE1330B772B 45312FAFA673968722570335B137D3CF2C960CC7D5E2185366ED89C6ACC6BFCE 546D522706D88C86E9D2025950BAC6904F07CC14331792901E33FAB70C500F52 51C675944D912D9E83FB04D869E7BD5905A58D195FFA880074DE4D9DAB467129 8B2512C9CD68EAD718912A34D5936819DD96AEE121BD19ADF4936D2D0C1BD29C D34D59DCF7E38BF93A153BF09FE8B66BA041C93BE6E1413C60408C67F7721480 078B472415DD3C77E804646C4EBC7B0BE56149531BECD859C9885E7F6A0CAD31 2745BE043E9D7814ADDB4F11958EAE8CDD61CDE8805FE28B9ADBBFBF46CC1C06 0E5E26BE8A2FD3FFAB6BDB3005D8EBA6244D7FC742F2469DADBB6B1DD7A53027 18DC0832719C5CF5A966F3C351EFC43325645A713451A9078D16C83F84BCA13F 8FA438CD0BA8072F77A9DD12C1E6BA2744484B29AA9F4207B309B40FACF815D5 7DCC4E9459BE76B471D10BD5C1D8B506F44466627797B15FBC27F7BB331AD06A BEBE440B9B422E64C4098278B09BFF9FEF74CEE16D20985BFEE25F4498D3409F B5326B24C471AD74BB3D3F527348574CCF9343ADDA08156FB1E6117FB21C28F5 A7D8FA473DD7934595BD996F6023A64DBFDC1A5FD40718656FDD7147856CA466 C9A8EBCD6C3AD71A1949F049CA5E9CC4B52E9708971E3D5449F4B83337F89036 4233928D394014B590502491310ED1EFBDE13544B856AD10C73FF2BCBC1A77C1 9C9BDB4426791F3F1AFB3DA7D5102726376DB1B59C3C5C29787ECF7D6F16559B 6F53829103F9CA4A8E886635E3C15ECA68CDDBDEB160D881C5399AF150512C77 25EACDC016EAE6ED423CAD02879BE4835313E327FC396053909C6A7377787ADD A3BACA9E0323984E651B1BEE0D66BBA9B2EE9650552271020C3EA3AE33607DB3 2A00177997B674DB8BB3B4F180DAA1225A5FD10426E41BEB159CCB26A5AE326C F8ABC225B0E400BEF294AD0BE5A53330133C6A49079FD6CBD1448CF3CF858250 964F7992A0A0FCD1A7DAC82D9AC0DE5B6E8F976AE892F309B8C321B1C0DC2573 2D1D32A81B1F3940FB445134A9805F40B3D58F5379462C08C8815468D510CF0A 7D1C3FB6DEF5F9EC63842E755189F121BB394F9D38159C8472F52061DD6BBF5B 9EB427971B66A395B1A0E706142F8CBDD8B9B7D49A543784C643439EFCCB1509 810F54EF1C711F25E4FBAEBDE4472FE62256225EB95052B0AE924C28A2573457 E8A6007303A2EF4488692E726C0552827DA03147024D5F05F3BBCF3B6A8C0682 8A5BA823D60EC8238F998B1B1A5993F4CACEFCE5A95981BF8F7854D840AD4869 1C2A47DF050682758E63D76466BFD474A1072E5118DAAEAA603F431B2BCB28A7 373F882024097E79F7F36CA5654039F3BF5AF7B3AA3A23F60FFDCD875289AD49 1783F252E49C557477B38A59E24E7B14727B086F276472546502151433C7C0C9 A772CFAB8FC2983315F8958917FF69818184661E8D470C8FCE3F0BA030F6FD91 E9E6D45D26EE8ED5416A5920E7B96226EDF5FA4B9CF430BC88CB98E48400E200 BFCEADE1C3F1D6CAA60E567EBAA85F039D55905E4B79231DA61A01A62FB03473 A98E06CFB9BFA5C78ECDD2D12DC0BC5D72B748B35F2A2E1C3A14A4D70E8AAEB2 9BADA2F4CB29BE8BCB7082E6A6B298930DE5E32CBC4CDB2F96BC83B299026182 81E6114425A53ADCD64C3CF94A981A4F8D672068803A05DECD9D47E4669BA5F9 5D63AFDEF1F0A9EDB0A4EDBC3BEF219FD72CE493015040707B90C41AFF770000 1FC8B865D2B412DA43EB1E3294D0592B54D919E311B6ADE903B29FA533B77E32 09DF9F815677B7721C9975CBA346DF160E6EC54CB82CA6C64DCE305DE7C1B59D C216EC7BB0A046CA1EEDC05579758BF0B155C120793D45A042BEDA99274FED76 37768AFD7C810A26976D58B5075762D53910DE1DA605903AF95F141F936A12E7 B8F14ECE0CB00DACB0D7046F1E7824AD6323EAC3C38E7D508BCF6743C3635285 99618210AE1EEA6234DD65C073356906B917BE7D4DCC8E5F7C5C9D170AF11674 F3535DAB490E0F75FF3C27952DC2E1C41060B26D517EFE0990B7BB874D2CF298 0D9F4CB6065F164A5242790F04BB0C6B188309F9D6D536E9E73129FBC6B353DA 579452BB18A9DE8C69ED7F226EBF70304BE2152EB0CA2128E1708C396CEAFC22 C750752A6B8411994A37C56480C6961D4C4CC460B35AC4D1CDD791A3F0084111 BBC8F14FBB57279B0CE70B4E7DDC5D0E3F9E07539C802EFADF8215647C83B8B4 4042F08D696EE8F2F9A7D5DF58FC76BEF1996FC06001C3EF1704C19C8475FBF1 66585A792DFEF401B8D0CD24F900DAC40CEAED9290A078C85A84003435A91198 648A941C64D121703FC4C9FC601FEA3FC202C8BBF25F14A83128F3DAB193E6D0 FF39BA1FC881AE331C0DD1774CFC5FCECEFE203EAF10EFF73FB2764C83F7FDA2 17D78AAA03C4FCB684F78E2D55679A84199E0DE0F4CBD156EF33E97194898E79 8EBD917EC50BAB143CC336AD03A59D54180A4873C309956ED97338A37788730D 6AE8D68D1DAB3574F6F89C5D822800B7A981377FA71F5F1CD1D76C771CE96E5F B5DCA941912954205BD370F381F41A160000450B7E7133F12D3815AA654F23FE F0BA6874525EBC4520ECC4E4931D2FCA7F3925001E64CFD87C5AECC839B5A799 005E94BDEF8EF4B9C11030E9978842E561295F51E894B910C7A1F2D63398A761 555A356CE58C01C9258CC71C2E0CAB82CF10882D3DB8A684222B6C3C2D5E4402 2CCB56D2D8AA7450D22A8FF7418B1748B2B229488CF16B26821428DDB621513C D600F05283B9AA073BE1ABA1EADF87CEDAED33938759F5E4E7C446BB08D42023 B94C5E028ACF5D50D74D647D3426CED4E7C95929334C5531FBCFA817E4A6455E 7BDE5043CC675A1A6CD75D3F1CC2B9579E4850B92B50B55E2297CA36425BFFFF CCEE6AFA0276E2611B64E03C632FAFA673968722570EDB2E12DDBD84D00D951D 4CF9596CF11351DB63BD8D127DBE714883A2C2ADF1F00F45FDB144BEF35888E8 7E3AF5D52D9B9454A951BB4ECDA998E7BAB4626F68D056E73FBDF15640CB97B6 668B44516E314EDF4F4361872DFA822171A97298789FF51B3C937571D05F2C9A D80582F27BA5BBF83AD7F94E4D2A33221CC91F75DD1A3FF147BA0044564E9823 AD5EFFD56982FEFC64E0CE5669C3216F7ACA6101C99FBF7D9B552475FE671E64 A0F7EDC4467F8F7D6682BAE783836252925949EE6541FE6ACFCD485E3264D233 04392EC1A7FF189B34CD3C5FD0740304486FA047441F0C93B173559B52850A36 07E3A4F53DBE3356BE4305F8CD2F03BDFD3E6E19171F40ACAF3EAB362D65C77F 144AE81EDB3E91C3296FD7A7FD486C351962654ECC12890FFA2021DF3D07B1D8 5966F499A59E3F8F3C1C9CB26730CC1CA91F2C0336DBE026B577A8DD48AC6296 9C74440792BC6CC210B85FFECAF3486A148DEDCE12C650BCE860BEAE63306DD3 E85379630741E9AA38E6D681775574A9C47C809A6A2300B20C5BDFCF8A06F58E 34BEE5BD7316A7691308674C31C01D072596D490DC5E4C9DA73CBDFAB0AD9DF8 B7E284EA0E0E24702BDACA920D8417EF0704F5B135A55991A6D6A1EA41DDD4F6 224A453BB6D2AC630043F135D3A87CB949BF09C3E3961992B0B814AB033802BA 3687C6484E22C0DA6DCA0EAB6F57922F908B8DF9AC87F07014E2D1960E8FBA72 C6874B0257506A2ACA18ED34D89677F225399649B74825524E664CA8249F8D4A 0D030D6EA5A4E3622BF9ABA9ABF1ADE79C0098A1E137C778E34C5370277EDD79 4F5D2A2B62F1744AF6B4928FAD544869BAFE10CB653839DAF80F186BE2D54C98 86CE37E89F7690D4274F61436D0FE52083485A2279FFBEAB7DE8C6C2F01C172A 1CAF8F21A6B6BBCC0574A458CBD93483D0872524DDB7210AAA0C8B3E53672E5F 3BC7CECDC503A758CD74E8C0D04F5934BCE704CBC4A59A013FAB5C230B07188A 593895A7F9D5477343D819C289525C70014E16322BF76B5853B9FC5A55CD3336 1F8544A93935613E3BA61CB8B1879039BE5D54DC2C72D349A5809436B857B7E8 D102CF0D60FB8CF0E6C9E98E1EB82DC081A372A5AB7CB1CF1B6B45E880D414E2 3FD2ABC318DFD74EBE2704CDCD7685875C86B61D0CEA2802E54152BF928A3EE3 ABAE82DCC81805F3FA3EE36FCD230DC3B9BA6E11AC2FD21DCBCBAFDF18324AB3 7E68874FC5775550B20C2E601D880DB82AFF44590412E692AFFAB3E58F7C38E5 925730B3F0778B8E4C7A1491CF58C1A3F476525875AC3DB2F0AEDDFFDC26AB78 88FCAB6BE27A1D7BDD4BFEAE7B5AD6767912152AF32493A2789018DB4E91F332 6A24D7D82B5F64B4D488B4250F493665A00C1201FB3C89786B12CCDBE862C750 E8383F78EEE2DA335090B59D663C6F38308BA53C84B370860106D6EEEAE4A8F5 0CF21AFE4CCD772D05046AB1710650B3E046586BBB7FD4028A3FACE9191B2BEE 4EF7101FD01202DE534C513CD96427AD7D0129D64D94BDEF1B44A694BC4C55A9 65AFA1DF87CCE415E7354D9B2D8AAE8EC6A48509A9B4A9A015BA1C9995FD819B 139A091E3872855E3E4E74236AAEFF3E12FEF04D54EEB9ED998DFF7C0A2C1C61 7D894C03E96AB62F0E91764E85E048D9CB61AF4271C6FC00B5BA86C48A9BA096 64019B612AADF0333876B949E9A454594FBD70BECE9C8979CD4192A33D6BE91C D33BBE98FBD04AF336C50DFA70F1206F2D372285D244A26757B6A1D52506754E 36095CF62022AE27112A695B2006AE919672675D9DB400844A5E02C8816D59E4 A29C13ADA719E5815A1BA85C8520FC2DDE9614DD117AB3D25813A8FF37669A07 1B34B46A922EF5EE121ECBC4A8218904FB441EDFA0CFBEF818FEF7223554473F DB90649AD0E2806ABCF7E2D30656F3549BC033F6D1A5B6E1D8A2493E2F649142 77A8F663A2C3A792016C587A97A3DB262E3F7E550E6415CA165ECA95E9775202 164B8DE872A37A322B05D4F1E0F7507F1DFD6B79BF9E068A6EB4329582329E2C DA61D7589EE41C21C07B153393C87A3F0579876EAF01B3E555DB9D6F8A1EF5C3 6A5B37A01A2D02266BAE8AB55828273DD32EF93D5F7C1C443D043BA35509C398 73E29BA3BCC12B217935E6EC831FD2BF0EE7C3172D8A544242ABCD6D7C90A62C ADC6A77A9D14972BCFDEB8257546730FF67BC3451D056B6A92A1B4544E2829AB 354AD6F077BC812A2A2491E92E8C22F971D36C681D694F0F66655F6ABEE8D780 9E7743FFA2D4506D1321F566D32C2EBF5AF9FB80055346287A6AF330C22C9DC4 D8241D8CFF5C536843AC49FF433BE402B5E4EFF908AF81788E960E7D6EB6EEA0 CA74671E2D5E4CB5BADDB3221710CFFBBB59139E2D26EF44E56CA680138D97D2 64D86208081585CD9A31CE5251EE1D3A55395AE938B51380EF1B6C7880625028 E95B9AC2AC1AB7ACF58776E95FD084EBFD02DCE0E067966AED6E96395D399EB2 968D0360FF6ED5C66164E88E2E7A8E19C275AFCBE8902F51F58226AAA56DB14E 95A6EB9F0245269A62DF36568745EE767A8A1905F38C8F9D4F95DE5F9A92E73F 8724590D81873D531DF4FB4C9BBE77D75CC68B6493BF2B6483298CDD53190AB3 4F923CE0750A61C5D0F26829E5364CE9DE8935AFE17D8D6D3ECF81D2C670DBE3 34ADB99F56D8944B8BDC3CD6FA7E4B8604E5BBD0548E64010A46460B177C0190 58C8B5D4E441FA05297E00AB84D48E4F22267588C0F4A5BB27B11367DD2E6EAF 050A90CC422043B8EA488EA2957165B6AFD42B7C1C48977C5DAB396A2485FEFB E3D25FC76CA2DF3FD6CBA230386281B0716D361064E06E6A586F2F2C75636831 9691E490A23B0C4CCAF9CF30161550607362D7C30FB43371B986D9F1D55C7E30 2B836B700D0A23B122EC00AAF3FE16624136201CDE6D4D3EC8A07D6AB6F5A52A B5B7E04AADCE5D79141D9E6DD0EF9183B9E686E6AC1262E38F32C09D99662E4E D7CD8DDA5C28423FB00795B7D33815AD0F6EAF49C650A834FCC33D67A75F8043 F7E8476CC6CC841791195C9D41F935D6C2B1E89A8792288E6B3890D998B7EB6B 4A02A5C98104F8D3B0BECD94110CA1F0CD0BCD50F73792B8FE0775D632FFC535 DAA2F69994670F712EA7FA244712B1E9D80F98EAF5063E373A08D1838F2EF6AE 513C65DBD62C3D4DB499AA5B70C388FE84C209D37E2E4F28401CBFD04DEFFA91 23A8DC03CADED084F601AD5F9464C70670F41EF9FCDA7D070526C96481E0B4E7 AEDF070745A4FA25CDA050C64AB38ACE589201579BF45031623F15C474FF9827 D070065083557D47356D321931C6BF5DB02D3B25E205F4197D2F510412651D48 999980E676384958D73FA51DF67198A045C5D624B425B143874B160F4127D197 E625AE14F496FE491E7860252C57F0548D2FABC6A2F9181AF803312712BAF167 F7E588FDDFEB1171C139ED53876D39F27A0B4E285AC37BF483BD197AB2C1E6BB 276FD0C64CE25F78AE5674F33F53CE5D7B8E4B698CA39FC7771C7D99C9A99B0A ABDF4313A8031445DB5EC1CE57566D996A14CA459D3B9B4637A92F3A703AFA39 B7C23B2C24BCD94CE91F4D0C670A6912C9F046EBD58FBEC204CF9B71AAE4A475 2F9BDE24EBEB609E7E33869D640EE96C91A5AAF1547B42806D5E65874DA42E4E 728BA8261BC9D191ECA5E108A7338E212327737F486BDFBF184E3B93ED2721E9 25782B029050903F85BCBA4AB8EC682632E5B4F072D8979AC3F6034DC16E5CA9 53B8DA63D095D0E955A8E0639861B9792C92F4059F87530C3AC4F2B9FFC3E67D DA40497193F4E4EB75FAD0B7862839484EE51712B0129E5CAE050FBD1DDD53B4 347BDAB6E7584F67558194EC0F9892886B5530CE817B56867B32DAD6CCB38D9A 9EDE0F98A9BEA0BAF254FFA2FAAC4A1CACCB6C2DC49AD044A93ED62AC448635A 43F78FEDB5D64561268A4E014C450FA73A447CF042ED7B82687056B1BBFF5140 C2BE6C22AB13F93ECB0AEC3B46B2150DE67F61D1874DF74FF72B8FD2D17EF3C1 9A19B24EBD5CD2970881C215788D94C8C45AD1FAD10A5177BDCF5CCB8DBC068B 82FF2DD1251BF3EE5842E485EEAF1A4153107D176839AC351C1A8B2075C14CC6 44F8DF394DA12BC8B71F0185337B10C7CC40AEDFF6949E3F7AC9EAFA461FBDC3 4E53E9AC3CBC490F002173F64D06CBFC01F0EA13D43B6FBE9AF4357F28357071 A6C4FA83F885FAFF6444DB885C0054C4DB2747C1999177236718608AC5D90D8A BF20CF381C271ED9ACF84A5CCF3F8779FABCEA3FC4A9D8BD2E4577B6049AAC65 0191BB9B24EED5879A770C751E3DED90F740E596100160A0428FD3ECA0DECFB5 2B3776DB05B5C60C9357B5EC08DFE7D4613BE616DC0F43B1E54F2BED31C9E5A1 8150DF6E8C105C5C9A4D68C5632FAA424D403BAF0E0B1A6C03300D77A79B557D B0CA610BA2EDABA4D5AC84F45130C1C8379566C21FA581E86060A0BB8CF05C6E 56D50A3FBE6D956C3213A431D383B500E1D4CBEA4663B86DACA0172A7D58A69B B63A589C233A98C7D58DDCE11A5169E545C97B52E999B50E529A285B0FA36373 9B3B410F65665013CD331B6046F6DEC02DA94358A50663A816A445E471619330 C166A1AF0859F1ED753CB78387468BBAB37C8EC8FC6B42DD14F22BD3DBBC2631 22187EDA894DC54FF817C15B208F76758BA19F58F7ABD7F2996C2448800DD163 91C471F61B8312B598638337E276F4D8D3DA6093302F4CD206DB7BA2137AD9E2 DE4CA012373ECC61DB093F6B26E33A7950A6239F408D2B6C7ADE207154E316C6 F7FBF8D6024F7C9E734893FC1419157DD1E89F9B35B99172B2AD0BCC85342EB8 9762235165062D5C4C846FF65C947290BE56E2DEAED44045CCBC2795AD0FDB5F 47BDFC2FDD333FA4D703215059D2BC6A786A0407A35C9605DCD6DABD9687B454 35E449761C9B7BE7ED5F6E2740D188A930121D50156B98AFCC50D0D7598A965E C9FAE438A579EBA81C049E77CC224F49177ED483C9C4CB04F060CC329145F1AA 0BB3D89779711311B76F33391EA29545FA902872338B73428180B82EB7B3B98B C9177661E329C59E746AC8A9A69D236591DABA9890814C0F6868671F423455C6 2C35E36C2FD620185D6558696AE1EE2DC93FF5B59BCA5D9A3A925B2736DE206E A0E1EFECE2BE6E857EF419616A0D2E8391958775C0E203886C69CFFF5729FA04 706500599F7D6C85F4AEE6240E978692391EB30540E6F053D2CB18CD4656D798 6D81EA86764045302FD39B466A1D0A5FDD3FD3CA99E0022D44649BE2CDE251B5 0F2ED532775DC6F30ED37C3C85847E28D48F545D88FE3F65AD79AAEC52884A2F 13A48CA1D8F47345C9F037494922A8652ACC7DD93EF61ABC90479BFBD28E6116 8775EDC63197D6B5A78173F07E3FD7A1CA1A284FCBCE6E04C721AE9EB9475762 8C50313F073D169266BB3987DC061D4A46A251070D67D108BAEC6C9D6EA71BDF 5509AAAE94DF75006F4112A07167A55AFDC0C731EE3157C1A84E0D0AE50C1FE5 ED9B9589D0DBD3DE8BB0B69EF50322064E7A15A70FB590D88C960D15113BD945 B560818C6621EBE1986A654B517EEE2447D4442F11C067D219565BE656D17486 6CEF11B58A04C1B2C480A183A377566365686138C6F19B4DAE1DDF8E6C62238D 56C01032132601CD7EDC543747B3A51EF4BBBA4B3531855AD86ACDFA182BD0E8 11807A71FF011801D1487F4031379D5F88663ECEEFEC33FB709EDBE34C105E9D 0DAFD5214CE401B6B74936CF756916176ADC58458DF8C341CDAF22C2E56ACDB2 A38970E1D95A50CA4671A0D83078E9BCF6AA1964D3CB0CCFB20CAC3823DB7F88 9DFBA28864C8F70E23B53ED1465D3A003CEB00A0BAB6083DE3B3E28BD267DE9E E27E2E166BA0248DBA29D27EFABB95A488067B59A899091699D3AE86E103B997 E2470F1D4A3BEB77C234D10193FADFF2EFD7DCFD06B05F6A4AD4136085B7B7F9 13F84BBC797DAC7D91E95F652C37135BB67D1E0DDB8E72A8B9068DC7D8E23529 EAE0AC524B2AD0F9478322215E9FF951AA9A38B53051A2A795603FD2E05A1A7B E470BFE07D58ED2B4D240A62FD0A3FD2A3EA1EEB600172BFC34B97D8A9DFCBD0 BCF7FA7E8A1C9EE38DFD24A3F938E504580D5A4846DC234C6771038B2A9109D0 0337F20A65EB0B1F645541518D21E00C51F7DCD35B5455CE177C3D2C94A42430 90E29321C345C7F3F049CE1710065A2F7612305EE2989C9BCFD6A7D250A25A0A F011B225DCFC1045A2BE79CDC0C20FE4AE6B02432B932A42C850E1BF62D1ECB2 3872A976133A0C1BE5A2802BFDD27DF28E04A27AE8060AF69DD42B77865E17E1 7F9D6407D9E7398DD99A002C512AE6EDF8545F842C527B64D5F4A2FB801168A7 2CD96EA6070F102B5AA62BFFDBE4CEB2962341816AC4C883EE616582C8843692 529B587C04E3BF2C3354149153847503D20FB7DE5BFB6F8E9D6D847A9B543258 74AA75296FBA3F4D437EA8650CAC1FB7553B07FC08BCF64BDA2A9312BE31E478 8002D54DEA52E029E7AE20A695B8DFB8A4B9A904A9DBAF3ED443E932F28CD722 7C8DF6340EB47754AFB097BAC127D28E1692B62813C97D803F7CE308E51B0DCF 2D6DB2163AFCB14B3A3DF9D8ADEF240E6DB48BC5D0E7E248F6265A6C61898786 2D7916F88CD73AA77324B20EACF9431901E07CF2AA2315DE07A4C045C39CF793 D68DCE8C2C179F980EBE23231E190806B98071E2A48FDD4CB6246EE8C67EC198 DA52181D69AE83DE11FFF1D03CABAA22C512941E34D15BEC65F166439EE99C47 ADA658DE0321798B25B1B56FCE9856EBC2BFD45B12543C13CAA3614816E57C55 9A79C99E3B7012136FC790CD70C4F1B8CFD47C98B3DE6114DA73A0CCE130AF05 C882ACC3DF46ECE961277DE46D17FBC00D20D2F3763F0215A353A2B08BDC9F12 8A5B23D8225B07268864828D60CC8C0C179269FB9D0E2368E84EEC059E270B7F 3BA17868A6E988CB0439B54340BC9FD770D9D4104696886D655D61705CEB32B7 5260F478AC37C157BE334A3E139230AB21EF19F21EE37E3E6E39A22AA003071B 030A4A09CB2F51F7D0BBE83470254428E3FD3798348C7B8465C94D852476DFFD B831E552620AACFC9C3C36C33F838E48A30BA4768F4C0C515F8C8E4662563330 D27AFAA023B97C36DBF9475F865D351D6734F444572D4451C13EC55C615A15BD 498A2EC2F733E5139383C9EFA4FE5E43AAB873E05564F41DE73ED7B2A6AFCDC1 92D0BAC0331EA939EA307D8BF146879C2F65EF38562104B881F91A64291D250C 00C6FF4C6FF99BAD53463AD4150DF9ED3AB9A1DF8B8BE723BA2B56A72AD797DF 286765E677E51A24ED812F3C988BF3ABA93C096CCA7C54627C02033177FAB50E 0AB9FFC291999D9F3CF8DEB3F04D4266BC16EC17989C109A3F6B0F03E412E1A1 B94F0EC606E11A9FC051F3FADD2D5D5F50FC8B3C7E53C4B8A0749A1DDF1F3C05 19C54E4CEBF106F66CC433CE2B0E5FC5D0F445A64301B0DF34D08122EAF74CE5 D5E07A6FF513ABDE6F6AB44056373F68C5FDC645680904CF1FBB29216B3BD13F 2638478ABE06C108A864D4915E77FADB354D61A3A16F63869B1E3EEE97EEA001 AA385BEC5924085692E9770DFD45BC655122851E97CB0A5AA548FB9A5DB64AE8 BC281BE87273E77754C21EF783AED640E24878A8EA27B4E30D7008032B1E44ED F3C8E24B6C9C4B1BD6F94FFF9FDA73B73A7A2274D249E64A28C53A8C23D94A59 5B38E6326C87774B16C71E387F99A421BE011E9FF673D571B8FE5BB8BD96290D 5209364542B5367E982E0E370B3D8166241370D04365C8A7E9BE0F679BC9331D B380BF9C5C63318FB924F06D1B500C1BEE9EB8387896E62BA6B3F00F82DA5530 0CFC6635DB2E383FB899FA832F682E6973E61868B1E4B59C6865D659EF661680 57405F1EE16A0B5BCACA764A8F8B53FC5429205AD3B6C1D86CED07C9A1C6E3AF A1DA999B089947B27A52E7D4D0F0A4D13061D19AB65B955C72AC09A5803568B9 797FC404BE2C668AD29CF194ADA282B0D904BC4673666498661D5A67413A1275 1E333DC5ACFC8A010C5BA31318404D76A7C31A434AF3B4CA4CD6591832F67EDA 290E1E98E145A3854EB3102A28A9455550A85E8286BCB3960DB00A35A01384E7 425D02E35C8F96973F356EAE0EB226D38FF9B105A9409306E80202664B6E07CD 4E3BCB5A728D2E23C856FA4A31C6208BA9C941F0567A65339E2BC7C0685A7FD9 A0470899ECB983E1708A2E2598D1B17EF577B9DEC01DFB9777F4BBB6DC4069F8 13711253D038610592776D52B2943508BD5676F14B62EE02DB1CDFE295442E51 49B8A2097F82A9890ACEF4D2496C30467F89E0118FA9A85401FC5781CD3BB8FF 4940005F809A9AB9084BBC0CB1E5DE32096DC7EFD8B2B25A3AD235845B2CF464 E05954038DA72ADA6BDF3087A0236449115E170812A3A9DCBADABDB4D7EC7D81 99B68214DE4CC6CCF81BD8523E93888BDC786C815E74242A3F001710672BBF10 FE81A5702BD62151EAAC930FDD6AAFCD353638F7AB0D66D4BC10F7F3D2FEF6D9 73E783C4D6C5190B8341612DA99F94F9D5435A3AEA557C8821EF785B0AA30887 77D10AC58117F87ACB5D049C0E033214C852B2D3C4066C4F3FC6D119E78FF1FB 15980C38C62D210A142ADEA167FB4EC37BFA1E828E71C4C491C9A94622E4AF8C 8ACED241953DB58ED2E20625DF53868E08320643D5FFC4EBE93758271AE35B4E 803E4A972DB1E00759042B5432A8BA7DC9B877F0D82B343502273A308F50C461 1AA5215CDE0F6310025BB5B3ED04ECADE81A3D497873D27AD5B1E0B4C3954650 2E64267290CDA82AE1C05B47BE70E8C5BB8F2E5CA9866BEE012434BABBEAD38C C98FDE2862FA6AA8C5D0997E32D19E719A1F53F71ACAF88F705C3046DF880687 8474C2DA7C73A5C662B009EED071B1173C1ED59EA94E21B888750AD5B753EBD3 3D68495F4F75E4986676E25F82A746D714D79B63DF3B685F7F2CFFCEC07E9C31 01FA7CA4A52C538A966FAE8578E42D2B956A10A6EB4D56CAD4FF92E99B178A34 7E865554A18BF0292CD25EAE2188138CC33D270E4884AAE86CB7AD92A47C842A ACE87CA1B4CAF2DE07645264DE1F0218A451062EBBCEB92CDBB80C7C53C80346 F24B8481F3B8494FA454BB1AAC3943F9E53ACDC6BDD7693AAF3273AA7FAA9402 186417D573C68F3C370520D6C35784543785540C815C789F534025DB338B1D0D 85A26A6291B7AF87D168EB28CC1010B66E059F4E2B68244FF35C1B53FADF2C8E 6DF11CE6A8555E6865353B7FBEC43D9C615790C684E841CE6472CE1344CA2017 F7BAAB95DE30E6BECA8442CB623A8F0E5FF04F906F23EFB6806C8D68601E496E 32367CC9D254043FF2BB1B1F800502F2BDDCC5FE4CE7349AD95C16E65AB744B6 FD253B221E082B3236BFE8AF883BC6AED36B4DD932E43D3573A13283DA12A198 6EC6B54A28AC46088A5695DE78F25EA6ABB436A400DC53AC216C01DA8B4A3831 564DDCF17B955CDCC37CA05EAD97D4AB9E5B9B4ED20BD09D33D75A7126AE7C7B 2B8EFB44B911DD98D2705CE5DBE80029E85F1505D735B9A7DF3664216C5276D2 21E303414328D31F08842BD582C305D0922162AF9DB17587C5FC55A7789E527E EB43313A3841CAA3744C732B0A64176D9D9EE5D5978C12F6019A8EFB0B58BCCB B1798A87AD789D7A1A0355C13BC219C426A4F884EE955F031521B2FCB9A96154 DDB591672927AC2413DE4F15D6FBCAA7FC72D3B1A94A79F63FD17EDE4234981D 514E1514CAAA39F2624E4A6D4B9F6FA1ACCAFEA036348AAB13481AB4FCF7D08E 61C393A58BDA7E1E27CB13D8DFAD0E803A24A45696CFB1D0CB97B43F144061EE 53A6C8805FDA2799139A82B2A4C83F8BC11392D1E775929B91E44417338C31C1 344E2F7C985C03BC36ADDAA327EE1C2C39165468003C997D0215D94F4A4B4C0B 128E14ACBD957E3C2C36B8065DC578CCB2E436E7A8619CF3F48A3FE5F4CF84D0 212F812931AD6252A8FCCA33797C9642AB1F8FBB8A4F0B498D44964C45290423 163A7340E9423F8942DDEDEE6E1FD5EE9C00BB1712A05D625B3B75D63C449EAF 96438DE3D56905879B39C338D51801E834A438361ECAD75D85579CACA00C83DD D8F53A587DA9463BA3DB07052A539DACB330560FA30AE77E239ADC1E1ADE16FF 555AA32195EA2DC865D1173A7234EBE565B08C25E6D2E012DEE128ECD369410A D22F2354DDDBA62461C0B25DAA28A61F7CA33A5D405253921E83916C01E5ECC9 BDCCDE9A8E9F83028F47F61154549ED5E9211CA29E46553BFBC1A066BDAA0F69 88F420764C3A102D1CF352A4E54A649EBDD587D56FB89FD9BECD7F1DA1FE2A0E 5FDCC9F741B624B0C641B6F17414B0F0E9791E794C4FD628577F55F7F4806403 62A61280CF59699EFDC74B618330C720457BD73038C8514DBD4B479A7AE28317 348C5016A2FB5795CC7D0EE46646BFBD0FABC8D9D20BBF133A4C2456A51BD68A 4696A528534AF2ABE6A503DC76D2C6633BD227A02ACC62A5313B9DA70B4BE5BA D8BFEFF3DD4224A6C6D96BD2322217DB0450A68C788EAA618404CB7AEF9CB75B AD39F59092A13C9EFF7FEDDD5F1C872B80000949C6FF418F40838CC3371AD625 BF2A51F46EA2F451F29381AE8C719E96B544772E43DC60DBE33575ED357C59BF 146469C50880EFCEB8D91A76A942A52C5E20BA7213ED6D12580D4E12F8D5C8D0 E731ADCB6DA94D1C498A1C8CA3B88F5DC29063E043CB1610ED9CC0EFEA122B3F 9DEBD2FAF31FA8C16D39B41049D5586DBAE9F3BB680CCE74A053416241090D01 79929A5D17047641E9E01145EF04C59DCA92C99C72A6E450FDD462AA97CD724F 91E452A6C7BAF10F9663F370BD82F1DF6821808F3EE971F8AD22F10129B55D3C 69E43F8EFD8DCFE64D191BDCEB6F3813ECFEC667021FE72EBAA04083F8773490 ED73F110C094FD55BED46748C22BFD936C952ADFAEFDD97BD87B20D791780AD6 CDAA8652BE4F068EB14040FA01CAF3F15246AD0487A2728432B37CDE9ADE14DC 6D8AC1DD9CD3A5333C5F1A0ACDCC181A050655CFDB8596083A64E819D17C5E5A DD32462B04B346523B1D2FE542BB3267C06C3A45F451BF28E32A8930D145CD4B 394119EC00A4502DEE350BA643EFB74F01F32A7015975DBC98B448530A6779E6 638E42999F51636FDABD6B58F8E3995339F7FF3A9F52241F9917E32A3F610B66 C711882BE72751B7B73886C167C626D934DDA1387E89D9A13B88628935C5E699 1032DB69EE9D00EE530D2BB5F5B45053FED98719EEE851E1A36DDBD83FF86B80 F5FC12216105DCECF8C4AF41A96E412E0C2F1866F53139131638AE35A73911B1 D96C8B8FA40C246CA8E92795271F99EF9285EFDA72715F52300D473FBBE977F5 C5DAFE04BDA286BCEA940E3FA2BD7FAAF157480021D1211C2096AB1974A154D0 091121E018EA0399880B21A26081670B26887BF14959D4A21FD139836F412654 4A51084977F044FEB4810393F8418C32E0A2A0C03302D333D1EC32C188F311A1 924CF48A2FDE0700430AEAD23F3FA4B230472208A940EBBDB7826237F4B6F730 71268A49C220DFA4B9FC0144CDFBAA4602E33EF7541AFC3D5472F4525FE4F74E D4CE53389021E711C9AA8F0FAFB674A8F62C2D317FD8091258DF35B0D69A0ACF 64C2BC79342811FD4D8A04E08A5D6DE5B96C1900E69370B6D0321A2A8D315D78 5F761E5BDD3343A66D5CD0C809827F0265C6FDB14EEFBB75A907967AF5ED715E 149A91F8213D915C6C60FD33FE48C36645F4F476A130319A1AE332F73DD76EDE FE02F7E97ABB3D11F2E850435699C0747A3CBDDF002C25C051E1C7DB92E01147 0F9E309FDCE30E6ED8D78F1583F5F8F74A2BC4355B6D9DD29AA0D57D9A8652C8 6F9F33766FF16CDABD7799ED6BD399950C2C728EE95AD880B1A4EA0042E5B198 BF647F5BAB61CB57F8F2450E265BFEE67F5BDC4A8C97779F64B6959AB1E23A2B F752CEDEAE0834ADDAAF780986A11687EC66FE8FA4610D606713788A0C34EE60 3E3A9538B618AC2EFFCF16E5BB18DFDC3EBB84602E03743E72E7D0CC314FB595 54929DA6924DCCBE64045721CE6A9A5116A3F2B7D78B8E7FBE7B79FC55EC1645 1655C9087A602D1CC33010CD8C369E7DC96FA6FCDAC2EC05ABBF5DB82E1718D0 5AF629101D5D7635E1E2D378EEA123456E311F4237F4A165CFAE5F2E2F83A0F3 9A0BFAF5C7B6AA4CF14E40590D3DC9A7C67395092377734DE58E150427CC6BDE 166ACE44227ECB056AFC5A11BDF44260CEEF1C53B8935978197789967A92B1F3 575B41613D87E926B9B1AF03E68648392B7CB2BEA66D0D7619BA23B47EBC5DB0 7DC2A8997B30BB7F63F98E9D70DD2F945777A74D7B36F8BC00571C96CCDC1397 CC4E531507B135C71F263AB868F87E02A47C7D8A95E4638E7E3BF14180DA09BD EF281A8ABFA5DFEA3F412C87E5B45F24D87418C1E397824D73C2D785650ED15D 868B011E1AEE36AFB32DAB82F28AC23958148447CBD2E57283AF4742299D8B86 5FAB70AF4ACBD8FE6C00CD62922FF0A88E9B3B95EEEF82A31322E79D8E3548F5 82899214A4A862FABBD1937E4E3FE6CCFFAEDA522E9EF53E33BEDF7EFFC992CB 8CEA8DABE083475DB864376158931D93B618F8D98CDED544817DCDB2345C9F76 9B307736432DEFE14FB16735AD7B87C42EA7844A47AEF6DAD0CADFC78780E5B9 80D00C2BAA6BC12F94AAF87C2F863D3392D9F92AA698BB6DF8D6B8F18D87BCEA 4C7EE1686F079F72EE734640428B001491E8EACADA1CEF26D90A007E056D8549 A0BBC0E350FD74B4253FA84608F6AA0823472BE190F6A7B948F68D5369103BBD 85C3510CEE91926FE5F96A8907C6AB5B3D7A8B6EA04F03F3113B3A06A01D7D7A EA934D5B664727CB5552E26336426D31BD1191A1F9BD3CAC8AF1B63087F0280C 0F3AA2D139E58912BDDD402938BDCB9FCF874D286E2945C8E90EAF47335277AD 275B6E0BCB59EEE72E6D8CDDEC3974294C1422C0961AAE2812AB1C43EC9F4AC1 B3E81D1FC06DACF6FF4F17693FAD1662AD2462B44B4157A687038C0913FB7DE2 E25559696F3F2AF579ABB9E4D33E41D238E64A2C1A9C21E2118846B3C8E48F3B F1CCE7C305E1A30B4C111985CCB81208B37C2903F6FF365BC13F2D019C9C37D2 30EE003AD8965C39C14F3AED85C9613F7B4E5BC7ED87B6BDFF41E555CB1D8AB8 885273D918594A9EE3CE4CE6657AE5B9D1C9458178B028CA1BC3EE5171A3B469 9AF79D4DA51588FB9C44F39AFD47EDA2D7EB4F428D3035558BBA0B4A59C9D2E6 F185EEB6E5AE26B2FF74373905334F0BAF7D741B8631A37DBFF50E1E1FAEA402 2C6A959C879A580D812CA95035AA131227A82CC3BADD2EE20443E015713E7DCB 6A3081D8CBAE7851494015A45228722B41C9BB55ED390FF7770D7035D7FB95AE 5D47CB35C2272F160205D45BE690844C19A3F51405036248D6D22E78BC00889C D844262C896F702C95FA32B3655741CFB6B8009B9F0AC1779086BF12CCE3FBF6 3B1742ADB061693F435FA9C7C1D3CECF190E8209996E5CF77BF2ABEE806E6CB4 E52C2FF68E0BA2CE1FF476B79D331CAEAA6A7882B6C8BD29303A14CFF0B1BC59 192EBC1F5285CD33EF9C2741B7007E8739207B277C56B9F16401DF3C47A63F54 1F756BA350D118B614F80E597374DF58C3FB2CBEC0E6B64FCB43E8F1837294D7 1C62192C21A1B13AA3D99EEE9BDA3C1260BD8294CD57A3CA28A7C95F455AADBE F0F3188B03C0B37642A194DCC713BA71DE2D8F4C0222D6DAAD080E281827A6DA B9D69AF02BDFB7676745C789A1F554FE455E18D7C452E76340E2EDC4CC1FEA9B CCF9E5BA381E7CD5D724A9ED5D67D4CB05B84D93D4F992685D805F8AA2E14AB6 FC24CD4BC55BCF5167F04EEF8984B89525B86DAB0BACCFE8E2087835F97D723E 395B146FBBD0204B434D03C11A8DB623999DA546C6D59602A64EF3100CAF29FC 90DE84CA9247EDF0B86E217AF81AB66CE1CCC33F1B16293CE7B944ADDA61D21F 88DE7D88CDCB64D07F5DB3D224B0FDF0249F7994404D0D841CF9D1D195A806B9 01240ADAA122DA3D71358F97523D50613DFF6A1ADCCDDE00364E5EC8EAB91EBB 3FE2B21231EE2BB5282FF32FDFBEBCC4AFCEB01DBFA77CA4945A682DC36FC571 9E1F040D2234E66892AB639D732AA96ABAC67D7D2FDF9F04C143866E0692968E 9C9F2A99250D63A71179A1F1AADFC6BEA07E93C31D65C8145E568CF0DCEF6B10 AE1D59B44BA81DCDE76BE16C64A700F56CF617A19972249155776C8A644EC2D4 AB53475CF5BADE6E81A5ECD1A1046737171883CFE039338AD5CE6471DFBB0155 45E9261A77E1E65B2242673BD1BA9E06EEAB9DADF4747A891BD71D790B1BA056 E8187E798A396DB3F793D4ECDF9B170B065ECFF82E8D0D02C08AB3A55F9C3905 2227EC2D3F83FE25C558B230C99F2F4629BBD1C2E828632CC28ED15800DD301C E08863112329C1343E6303395A5DAC0F42B539828FCE80816EAAFF49975FD10F 3C11EF15F18D8D4DDD45406753B56AA6523B0DDE9BF9C10B114AD1322FDFBC08 35B00E31C82E25F2E8FE53C7685B54C96EC543684A16AF61AEF71E5E7CF777F5 D53851499E5726D6C1CBF14C55DB9A6514528C446DAFB6C4040E64089B67C506 879570E8B7B456D3721863F51222E598771611E4DC399D654733A481D12ACB1B B8763CBA5D136D44A90FCFB132E1FC73D4FC8E4FE4422C75625219CFE8D19DAE 6BEF53F775C3F0C98DF1D38D01951ED18E6FF1FE715BC62E88975B06E1A824FE 3C9B06860B2E2027D2FB7C234246E76A341EA2A08135E0A5FBE858F733620C01 2D1A5E0B51E6A453CA3AC534B531AE6E7BBB45C4E3A9FCD844D1AF73D6E0FB8E 763F3437E3E10211276D7EBFED351AE39762421B8FD068AAC3497698DC06295F DDDBDD0C69C170F72522355B31BCCFFED407B29DF77BBF6BA345FBF521B2A162 F14F6F2B3C2C59F94EE65551DF9DB2C360B524270BD2B1F6F9AD92CDAEAB8D6D D88DBB2A5AD5CA819DC231576EBDD027A409A9F84266FE231B1E28D13B260441 D80F3B209053DA646AB67B2A09D1968D9A487C68B23E2A60042E386E78E49FB3 C494B06DFF795FC8E32F99019CD9949F1D22C528EC95EC31D544BA1C24EB6C7E 1AAC7645FDFEC4B5405E2D87ED96D4B83EA553AAA4B8F18B1A910A7E2606EDD5 F62E89A85E86335396F0B92A77E052E6D0E338AFBDC22986F7B815713D56F9CC 16130DB86BC7C4E364CA177ADDA52C703C00AC5DC8D067CD01A558B54F1A8D08 DF8FF7E3524621449EA31DDB0306CFB576E4C96F747E4971C58EC10CE5F99593 F07773084A4469C25DB78190ECA208F8726104C93CE942337A8FD375E0EB1063 29C4B1E209DAA51B9E3FDF778C9B9E07A0A9D194276D751C6453F61F525575BC 3F455DC6324D325D5DEA338117B15E1819130E7BF552E25EFA72743F22CB39BF A1C80BEE5B88A82831C09C2E169B8E9DF020424DA030884EF479893253E9AEAA AF844A248E61A2478A80392912A0F9B51041980A0FE474E5998CE21F39638327 88012E94736F0E7EA79CD7AABEB9DB789AFAB18489E02D5F24012CEEF1782699 E44331E974B3EB94874EA520D67FFFC83E07F7378F10E0A02E40ADA24B0DE0DB 8572F987290B0266FD525F886CD5E98F98BD228776436F1B26AA3BA413651322 497AB64CBDD53075BEB674EA626F64E058D487FA6D2F37BBD5FB2B3E751CA2A8 2AFD96B44ABADBFE1F693A90AC5BDE2BD28D1F512C5B8EEADFA9DD4708310249 57A5F67E8550F58B64A3D1CF11188448543A5B516966B086C68CDACB47983ADE 0B326023EEE941C506C8AF4739A2E2EF3864E5CA7FDA79E02E713897F001E7AB 1CCF83662A1A7F6146EEED7A55EA85B7310B770DAABC52A9EAE899CE527E3C86 83FAC398C5AA348FA0EF5811BA8157F77871BFFB182C6E22168FF258D72DA626 A1D2884546110832E8A3378B06CE7C0DAE688A6989D4D7D6D8FC0230D2875A42 545953351AD3762E137B901E378A1616DED4561873E14C430645A32AD0D5B3C2 31CC3362D23C435FC49BAF1E84590BB9AD937294F1C955BAE96F8B24C7131F03 0525CA6822CD9953B80163BC13442CDD102F0847038CF99F3EEA2C11BA93AB10 0A4E0BE49F8769A9EEBBD96C649894888F458F381C6D831F81C1F39DDC7034CE 0D1AE41026FCA99B5094F7438CBCE27D17A6B5D2D5C3C44E2A06BB61D9194D17 E8F149F322EF3BF002419953A3082BA5AFEB9EC6FAE3EF5527641231133DDC2A BDDC6B90914B5D550DBE1D5A23799A76CC6E815A169ABFC7CBDA88ABBECE480D 67CE309E0F82FBF23AC36BD4EF0E8C07BC553D23F7E0F557C991D2ADFA9C25F5 EC7F22D79E26E5CB7D2D21AF4AF18111A5F5F3B2A128F763176F47559E5C9C74 39AECB928F464306C3BC8F33326FEB4D1FFAE472F8ECFA883BC8317D565A7B93 D31E8B4B9D722C354D93937FC79A04C63F17035791E8EF5A66BF12F0F49F382D 8768828BA0E7830848B90A6115B708D23B48500B891D82AB2D9BEF0273A1342C 5A61A7230B906C747CF0ACD329EFF0C2C9F5D5B49FC77144EE2AFF285AE6AF06 50799013049271ACFEFDD2661335DF203AB8BC85FB6E36526FF27DACE7044821 E088F49CCED3399BFDB5AFE86CC877FB334E5F81A6FA5AA7B8E49BDFD40DA4B2 CCA2197E60FEF37684558677A7ADFFCA036010D83893152773699303816FF929 F291D0FDE4D80928BE34C250A47026386A44230A9C3D9E321E504DC14FED9405 2F6FCE73B6AAB578B5C41AD33CBB7FD4D846CC90DAE455166BDEFB0A66DBF1C5 A4723EEB5DC0EE0B860C93012CF2F90B575BECA88889C66ECC7B3AE21263B307 E26DE9EE9FE42C98B1DFE765817FBCD92436047E9CFDFCB48AA0497F27276752 3F19E4246994209EECBC54673710093ECB28C13ACF4635AEC058B28053FC8E8E 8F1CA9085DCEA4047415474060FF08555690B01C10D0C513FA052D36F52B05EA BC7896B500EAE1F683D473275DE1019CEC4096C28BDAB4EF252358A4F9A0C081 90FC788B994A543C4F4923FB98A7FA56E21D7BD1225F478C1005E9665205B385 6D53C84B030E763482206FCB76E498CB61187CBABF1CBA89E7F2999F56F7FE2A E2888082A755B970373F60824D13F7965217CD119B66A47A76247A455D8EDF0B 8A1347CD21B798183B09FA0BD132B7A12C68A694A15112A89C06ED098AAF398E 245B15B6BB1403637A9F2D5113383D53E8790DE8BE78FEC1E53A6F666794321A 797A0095BFA3A7698E807E6F1855F10B43A98CA6159DA511E96275A31DFF0BEE 19CFC8CAB286A1AD9ED32E7CE4FDF1149D1A807EE0472A2B28EE3CA7B85FF89B 948FB8E0BF5550C2914089B185F285C1F1609CC455E9C8BC904083F4BF0F876C 17FDFA738E033533A3E756939A1E6CC9B9A3FE546F3690A43724D224C019BE91 77FD8748E0D56237296DA1F0661BC9B825325AA0F0A035E5F45E6AB2C7810291 4AA19AF68D9C89D74FE1FFD601C14C2F7F753F6D3BBF0E6DD367EBD15898D988 60E30E7D03C9D65B49C4BEBFF1A1D49F773D8A89816C4B8B4189B9C06D3CE371 44A7C82407FB910971AFE489F41468D1D35CD032268AF1FE17EA91AD0A11C9D0 87D891D9BE8B95509BAE42DA7DDD5282560E071E44C1369FA2288ED8430E09B0 3A7AC05B30286B58833FE33564325A077814029EED0788AB184235F4D1CC5E4A 366697C2F6201013439D8589DA64CAA99F0E4A54BF80258A6DD25C0D7EDDF43A 2684CA7D3C3088D6F3FE3C95A01883F494BE83B72CBB61F14333902057AFFAE4 2891F487D84CCF43697B1E25A615FC219532362A4F5803AF1BD57FE65BD9081B 5B79805AA5D31E7F4ACFFB08E14476ABC95877446E0BE00E49092F3476FC2357 E9D9D66CD9A7118BBF649D8304EA6ED85FF7CC46EA4CFECE849D6C8A260F4B45 4E41FED01D36D5B01062122BC8B964A6B0F385EDF27328003151B08DCC19980C 0C63238EA0C4A14210F5453CB872FF7CD1887D5830660A920F5040B57F690877 15454E54AA899ECE4676D8AF34F05939049C03D35BE51459690B9C5A5BE00159 8FE59B742D1EEE6AF3839F1E18390CCF0AFB5103EC4D37CCA6781345DBB10464 98F41065B0385505341A337AC1C178E75A34F3D4FFE4866C44EC8A7C4D71AC38 5E0B86B1DAC722EE9498E5BB7C288ACA80286C639DB86761CADEE8095925F119 2555E0307F5996011A3A8105F3E53D6D0474F964C49D30F04CB9F5255D3C48A5 266282747E787B07627987D4262D1BF650A4CC3F114D36297FBE5557F48C05B6 BE1EB91EE148D9EAA3C990FFF7DCE9D6BF5138F6B00401D5B1DF64149AF91050 73D96AE4C527714ADDEE067F9AD85BCE0E481CEE0CEDFF986E2474CA13ADC01A F032959D084B7FFCC447F2A4C1D9EBD5A19C754DCC60836CEFCA4CE01389C3C7 49F1BB4A3C6281652F1A5BA9A5E4E275E937398DF086FD93F26B2C38B8BF73E8 5DA1794E7A0EBDE69437A7DA3EDB0656D0AF19C3F97566DBDEC4FEE34F705C4A 133170D941D5CAF36A78BCD7E7556357E2CAE27BF4780ABFB891D2E6416BD302 9D8A2B8DCA879FDC07A36F77549B474187F655BB6A4693AEE8325D8401E912D8 4290C59BAB46BC97157D98C3451AE5EAF52AFAD02B8081AD39C79D1FFA78970B C086CE62F721D301564723C0578A4AED45293CC8E04F5BB83D7D0B9FECDE4903 21C2F7E3B4C44C69EAE5134CF2A5FC71EDBE8B15E3D984CD6ABD4ACFF37A9DCF 8F857AE04AA16C323F003695D9C5BD6C034DA015D6E1322264845E295796A90A 2F79A703232A09840B3C80870367F27A7E26AA4766297D9672CB2D0CE3593F76 4BBB3355B88EF5958732B4E7DC338B4855023BD1CB595212900B1999F24EB072 C9983415950CCF6E2FAA220B7FACB989416E6AA9FA9B2D800FE5CCF9CCCD6B15 73A5314636CE719475C77931D249EF75D29CE0A985F5F4F0BDDA7709BCCD526F A9F364E6C97DB81D2D65562043996B59E09748124D89F156D7C5C79F534135DF EBBA0263AA5E31A5B0A9A057C344A08AADBDA8A6607AD89E838E71EEABB9A5B1 0368A841C071F92C24E096E77E0A4D4B09779A1AAFB4171C93F747849B46449C 38805CB3857F9391D1D9B5490D7E8295D5EB42A145165E1D934FE3C7E90057BE 86CF7B9025A743925E342F9C942AE3AB4F0DEF49DC8A2D500F882145D4E2425D 5059C79A637385978B26CA799538293325566E1ACA022DD856155E4100712140 1E86145BA9AD4EADBFFD7884293FB5D834307214064698D889B8407FD066A001 B4B320E6F44032DED09FAAE2F1FCC2E17683A8AD719D8C1260A53456BEF8783D DB8204046370451C04C4F09EE933A61E9B5E48ED356E8EB30A4D7150DC090F2B 7074356E75788B2A5C2EEBB69F5EC91CDD5144B5372CF5516C0A142941C9A7D2 113CD352CC4DBB03BF1007C5C6FBE3F53A599942EB961CF9C652836FAD861589 0BF19EF2F5C78924756847CC7770FE5D6B772DBB69E0F3C2E6F1E18F50BEA2B8 C9ADE7B3A410F3A7FE116BB0E0F75FC3825ED52CEB32A0B0281E2F8A02DA7941 36C5F05BC6EAF564C163AF1C56DE91FA504BC24388E5CD07FE5AAFF2FA89EB2B EDF7BF86776F44F4A01EA9C14BF552CCD414D4CE08175A90667C7FC035F1EFC0 200F8FB343F86E14723967A55ECCBD7977F2D50809F7D1B862C5D376E08C267A FBC093D975972787E0A8B9AF3FEB0A566831DB30F9FE2F3B9316FCEDD9B57D65 C7FEAEBB388988016A723C3B64C7806B4FC62176DECEE2D9C6AB0EDF0E3D0B9F 856BC4743AB94F3F64BED14EBD6344FA5BD9B7CCB261BD9363400A384D84395C FB1C0E9DA0FD3FE1A89C37DEC36D34BBA96097A8CBFDC189DA1CDAB759EF5F43 CBF4C08DF24519DB36CAD6DBFECEDFEF17DBBA7E18C1175C1861418169FF8698 B62CC132FDF59DD648E0FEA537C272E7862ADBC26DFE2508AE9A91044DD21403 9F3563529708798000AAF5D2A8A00DC0926FCD03421FB3BCF4673389ED01522F DE532EFAE22F338246B3F502E1D383005579056409C7E755FF98640A19816A75 66CAC12A2D3EA67E130AD4E4B22DF1F523BFF730BC02EDFDAE5FD4E9B9B03E52 664DD10B3DB81E7A26AEB31ED8F00E810B7E9CC13E9756 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTI10 %!PS-AdobeFont-1.0: CMTI10 003.002 %%Title: CMTI10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTI10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTI10 known{/CMTI10 findfont dup/UniqueID known{dup /UniqueID get 5000828 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTI10 def /FontBBox {-35 -250 1124 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTI10.) readonly def /FullName (CMTI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 97 /a put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C 02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D 46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A 4B60D020D325E4C2450F3BCF59223103D20DB6943DE1B57C5FD29DA32D34C95E 2AB2ADB3F60EEB0600C8ADE15A2380DE10AC5AAD585FBD13097B1A7E8E210D4A EE96785449E07F0C8EBC2EC5EFBFD0897DFDC15E5BFAC9584D8DE95C5AB288CD 8AD8B9BEF0B8E5F887B3B0B331542FC8184DCCB753DB6ACEEF98B85756B988DF CAF1AE0DBE7D37D5F44A2E760AAE3A5197C27B15E32275A64946C3E4D0476FD2 7FDE148C788DD2106F7C825E270588AC05B57E625AB17BDD02306F9E5FC851DC 32A5A6EDC43C770A71419B2C0C8074EF3F222C8A2097CD81A91F333A521B3A09 482A4FE1CB231CE344AD126AA284C3280AAC3AD162CF0EE241BFB4C8F20502FF 118507F5D1B5FD898571015E73E5CF2281085072E00D401F6F59761EEC3E8381 1F26F75DB66C504AB6BABA87D121B1E7040A07AA2FE01F80DBC246CC03C4B2DC C2A715980C52B7F96BC1A78FCC7F4F52EEED5F705E08FC1E5BBFCAD121FA88AA 8EBE58172C162AF409DBB0728F14923ED02A65EA24E5D52B6AD07777455A70A4 61833D3789C719BA92E901232599767E423D5AD9C807670BE0E7B5CFF8256A20 C7BF7214FFE0342809570F5966A2C43E784F35015D9040BA34FEAB6A6F089504 3A40A9E9D711A2721D3F4998371430FB3C94BFC619559B97D49627BB630F4B70 9D0A8FE4E916235335C3962F3CFDB04C4A3CF714DB5E260F4E66FFF2F27CEF2A D4AA26BBCAED23B8BDC98F8F453BA27AD7758537561E766B82DC3032E92A9EB0 125D98A22C5466AF069BF72A9BFA052A8628FEC6A6AD0B711DFFEDE3AA2D7CE8 34EA487038EF50F953B8B4471CBA6FC3C53877EC1BC94582B1123EDF44B4056A 30F49394BDE22CDAD7F01951C7013D26979277D18EFA594E8F4F2B5E615187D9 39E842EC28461B9ABA52020A127D2CB9002A673A435B13C10602EEFDBBA6BD49 9DDEAB9E68D655443A5C2492BA061C1391A51592BA8C353A6F6A0708E8860184 2B5D031D2CAB87D618E9F6F7A0BF3F66B3FD5A25BB91F7F1F5F99CFF56EFF4FF 0A35C55658001ED2E97B26C869292F6274D433A5443179DBB8EE987196306348 3F9E87C6422AFFDD30080C9AC4EE7FE5E2DCBFEE4974331F4AAE479FD8806D4D 9C2B85FC69EB0453AD827A1E767E5C484BDFBF5C8D6E2B3C96298B390F22D757 802643A79D5E29CF3AEDF0E12CFBECA4663444FC87F2027571DBA9ECF688BF28 FF0DDB3AEDBA0FB28447CB4B5D5205F40C1E7A525FD7373392EEFFD910AC82D0 98E71660A1B3227C4A2592F3E853CA4CDF64DF19A52582E167234F4036FAAAB9 5446BE102DE2BF43E82F0112C2A20F15A3F92C6571AC761665A905362C4F8BDF AC8705519C99862CD9C0D75113C4AB5FBB83C880E46B82715B5628890D9103AD A2329638B95D93C4DECDC5E6C588C9D5183EE6FC28FAF9825F02DCA567306D93 5440987A81B51EE7291107A08F201C609FEF91A8F0587E8B13D4BAF74A5A6815 DE9E4441F46AF8E1DDDFA2D611C889614040B144A5EC064DEE4638C04EAB2E37 4CA8F50FB8C4D65BB296DCCCD39F1F554CFBED96670A91F515CA10EF896874BC 8EF48C6447752C70FF5A06F928DB55586354076773BFF7E94C4C3A7A1C1F421B A9B4E3936EC26E0C19BBBFC90F021E877F54B62108F6DD1C7F6D5B8E64FC9362 E173F01BF2904B7E5A08B3543611562C2714099DE7D4FA330DB148B560A9601F 42A84452811CE213DCE782A0D7809CFD954D6BC1EBF2BA4D1B18F50FA8174C96 3E0120E266AD5DDB40B3F6798AC28CDC5C3C4BC34583528F5B5DC8A222B80B59 A3A93DC715D061EC6915E6E6E21A25425C25E8747C60F170D61047108826F96F 7830E220C108B441B6EA3198E33C49BAD8D43086E49F5A2BC7958A1A8CD011C4 49045193394696EC3DDD0BE084E8F2E9F0B9496F035C0DEC1CE11409DF566428 D50043CFF5CDD1092F6E0807E660B68163BCA738E8D98FC6EE3F713164CD204C 0BA84FFF4F33F47BC31750B448603D7ADB9AE92FA91AEBBBEC0DCD66980E6955 CEB425ED07115B24E40F53B29B9D840842EAC691B4F591F866DF27556474B485 1C6F53DD72499847109B16C7093984A6B8487D4F3870DD517945CD90E648C1BB 8A6861E540FCF9D75B984B5009B5CC760CBE297042C240DD624111670B703388 6FE6FC0E89C6B4C88F51DFF3913D0CC1FB4770C8CBEADD4B86393605C0B6C468 83CA5594754411B6FC331EF56D7CD6D247FAE42E966583C29239A8F862348D29 60B177984B6B957E733DB4D275015691D91443BBB13C2DA96097A29733CDB284 42F89C85A7A743338C9DD3BBC4EE53F695E5163E6E1ABE5791ABF100B198B9B2 1C21E2FA2FB4AFE7F9BB2D381260CDD3A2CC05BF513AA1E80ED69FA27BC5ED5A 21445BF00BC2F997B356D94AF13736C6D3B0613EB6F4CD96A685FEB672661DCA 206105EDC3CA07900676EB2FAB37F48D2E8207BDE1463894DA3C5B1488AC1EE9 D39DAF691648048F5D7A384B8927F8DA2BE3602669F71D80686E427F395134E7 7ADCC611BA91AD4B7A0237213C60CF2C905359C90795230344FC3C50A22BD44B 55B2044792509F50F5C21F53D9F9E9F063ADBED3AB99E2613B23334FE8DF70B4 6120F2EDF69F50BE793EE145B9FF9C73179DE640FC2ACEB5C6617F918CEEB762 4CD81E665B2E544864D13230B058717B207D3CC5D6647D5343DB4D0356082392 871EFFA896631A7E0D6477942B632074A9A4EF7B09D4701B1639BAAB4E03A40E 9B54A7A4F845CD63F88831EBFA4FB847847CB98F3455CB5957F2E0A0F5623645 DBB5C5564C7F8B117D6E27E65C0F3EA81AE67B4AE4B201E7C4FB0A8364FE53F5 41A7CE8F834C2C4B322809B353A5E63BBA7BF3B7DC1A85EA700BD287C2BD3FC8 2832B0BB4695FC937FF5EF06FCD87DCE6DE793C2B1EE10E6450352C17726155F 220D550B1759E15AB2C1D5968E52C8080CD280E99D3CCC0E80C2EF8BBFD96001 A226FEED7311EFB4B67F424B557A877379A15BCA54780F0CD2CCA00400B9B39D 981C6B552AFD2506D1B23618FA9AE6D8143CD7198A8482CB416CCE62B992347F 337D505A4078713BBD91E5535BD58EF0351EBDCD749CC24D4AD39F8CECD7D6C8 139756680A4C03A58B3374CEC658D30160AE4863A3938A891BB59CBE02BB451B 1BA4B2B6E68AB61DEB85F95E3C909B8B66E220B9F18280161C279F10F7093CDC 100A53D542F071CC0A5AF834DC1D18738F5DD62A5573E884E1FFD22BD810828A 1EA47F8218C15A2E97CBC609927DA3CC2B802EA4A0D7EB57627C135E3B065905 F97597D818A2C5CC6F328AD25AD11FA50F1E4FE637980B7474D6F85A521892FB 72989AABEBE02A2D0EFE88A6F67AC29F5D8DDFEDAAF465C439983C6B84389FF7 A6434462BEB7B07DBE4BBA61ACD4A60C55B5C0AAE527DE381DFECA2E6BAFDC8D 310364ECB42CAFF72BA93C067B2F02D1CA7C34AE7CDC46787A0E234C8BE8A928 7A6F3DDE0338FAD532A9886E8E3525B85DD39364AB03EC4C0DD25DC179CC1989 1BE232E387E857C78332D834679195E10F1E7B87B7966DA3B2238F53D1E13FE2 8F55ED6A92A750C7250C9B91E29796621E7E9520373214D7DA81B2875A986D33 80382AFF6DE1F829F048E57664D9C4ACE91E4684A51023943A4964AB5657D610 3A5405EFD4CFD1EBA684243E15093C9667797BB47617B66054EE02C41FFEC45C C1BAE8AD56B00D323FCB1D2744F061FA16E161988741A319B1564E04BA210996 4F9F02A3268CABE450D166A763F5284954564A1C86B76544C5F5ACDFE0D758DB 865A1CFCF9FE8CD5F9C3B2998C56468FD52DF8EE60C6935A3D221EAEC7714E3B 301371C7DDA0B03A2416238F2B47BAD3A2C5021C886DF51C695AF9C87A864B48 3BB3FE0B355EED5454B59B25A0D8A1B8CBD356C24F64D9B55E16C30C011365C9 1E0380753BA3EDC0868788D5F50B9353D0227BCEE1BE36998B2622C0759BD66B E4444250589F9CEDE766D8B940770CB6B89503E925B35C00CBEC2873D2DC4A29 0823FB7A3717B69A7DEDBAAECC067949932728E89BEECAA91DE3AF9BF070B9C0 30EEFA8C0A55C8388CAA2F0515915C98E67FA095BB98967D14B0DCAFA9622E4E 2E0EBFC768D80585ACDF28D8A5C2B6EE2FE7AAF62FFB90F569F84A0903996DF0 C1D5723366C436E4088F3E2BB9B47F9789052A71CF5C49908CDC1DDA194BFB89 14D7E3D7D4D72A150FD6FFD8303E9DE5A97A71B808B8BDF2AE466F31BF5D7A4A 44F81230BBE2B456A221E2F72A8B59F8FEA8D31F8A005A5BD93B9F49CFDC3DCC CE2B67090460F632271C7157BDC2F05BC2749FD562FC28682A616A52D1B67654 DF78B7843A9EC26A7DE2EB168F874904C2915B97534B2D4D9F74A9573A771D34 9F7BC855E8F794621BF6AD471BCC347E2DF5F620F5C209E33A4CBF1EA85AEA87 4492A77342DD33EF615FF34037D660B713C908786D9022051B825226545827A3 2AD1B05D654DB6E6D261B4E8AF0933AD1F0FCFC7201E1A7C1B4199F160C38676 21ABA2DDF1CEB655B3EC3226E0B122976EEA998F7A5241F062E54AD1DFD6ED26 47C99A439E0AE95415059179867CDD3F0FF751F3141309F40E00A6C7C28433E4 F649BCD5DAA64177580E05C495EE7BCBCC5FBF104DAF360CC2711386655B26F9 D349D887EEB32ADE595241560FD5924A1745A22E6A01DB9C285EF14596EBFF0F 03F36EB2E0A7C3864F819EF7B0855121292D49482F046A55CD7271FE03F02EA5 886864D9D8EC22A68C23089EAEFFF03DED6484D8C341861EF8B6FD3C5BDF5AC8 352DA4E13A1E30D0CB71E090E9CFB9AB2CAFD0CA7C34AE7D8E3B2EB4666834BD 9CCD1AC2108348AFEF6071796F4BB2FFA4A67ED917E76A109FA2DC2A30D744A0 9AE653A748C1D18FB52595D84E87F1C1FB6B2F32667FE203262C66627AEFFED3 92B23861E5EB238BB4EDCE09DAE1C65BAFC198CDD1B45D42CDF93E16BB82D35F 821E9E49067E966AFAB2AB52928F8DD6359984071FC37AA652FB834A09E5BD93 3AFAE161140E74C6531E413E8FBBFC42BFE8A464B71EB1D8CAA93B33D7BCC3B0 47C7EEFCD3E9FCF26FF9441DD9BDE68D77AD7251C06BBB9A2103049E8827CAF0 F26BEF33F656A690235DEEC623CC519AFA82DE2AE16FB99F780FD7D8290DA40B 9B604AEF36B529FD184239E7D50561A07428D28E51B55546590A1AEAD4B7F2B1 AB8C5B9022C1FA03E33F8F409B24911AB8BFCF6EF4A8E415263C789F89063E71 C0910DC20347469380B7FC1EEB87D4CED7F4A361E58B61C91AFCABA35C03F978 B9FB5257C31657EE48504C355CE893FE3C553274C641DBC4004F5D5B879CC5ED D3F21F867F6DF054127067DE86189F0B59A1B90FDABCDFEE61423609D888EEFD F4A1367129962110C651D9481CEDDB8C5C2576A59AED64E95F7ED042AEAE2F7E 81AC0C408E593DC30DCAC334EDE9EE27D932B98F040DDCD195D6155607DD2038 970EB78221A94C52BD4F0EAC65F1FC10E5DAA93C17266F351669CAE56F42B68C 6D01E1EA03AE554D63CE76D800FDD9CFD89F80A241EAEFF7EDFA41794EA25CE7 97BD5028464D2CD45B53834B4AEF8BF0B9E7C6ECDEACEC887E8790A47A93F668 A9095E5FA1116A122C0E5B74E2226C654D3187C6CFD8807917820423DA3EC1DE AA020EEEF2280C44A15209EE2F3FC1776875308CEAD38571E7BF889F287E4594 971A83605E0B4169D4A23EE790515223DF8724054EDAD905F57918FC0BC64F96 514B4BF7DC9BA79E763C22C977FB6146B10D26FEA1BAA7BAF21312F78D1625A7 8E242D743471DB5821408AB786E4A7EA9D35E30E85533C617689F95758FB2C7C 392E759C299DCCE36689686DE0C4DCE32649493650BA194A6208C5EAB670B170 3F2C70BF0EF0E3BE2FB0A79224FF4ECECD6BB3388C6D06867A0E5E3DB93C1B2F 464C23E44D3132E7D4086E3B59B1D13F49EB4772DEDF8EDC4F603217233FB7BE C13C28648E9AA51D53F11FB896839F97AEDD8834BCA53CB0021AE91FD8E95E2E F8A094093AF556B9639F508A401542B06821FF9DE1A745FE9AC5CACD5E8E1053 911442FC15CA5333751ABFE2C617D38FA1DC332BFEF44AE569DC631C93EC54D6 261583A695F5A392867A57F59B741EFCD2DCFECBC55D1EA5F2317601C9DFE9ED D1EA466210FFA905A8F85BD58B98991BEA58DFD1CDED5C9B086D42CCE632DADA 147941917B879139E016B0DDEB8446BA017FC8EE5A354533D667B0835F5D027D C2D580C16B80B3D05CC92C0465CAE077729F0A15B2DAFC89DCD349B3F81D0516 C65526EB5C10E45A8A85D716EE35FB9AB201FD7C89ADE5AD925A174169DA20FB 61E96C73A143DF964C20589EF24A0FCFE6195317F2FA0D2249C0D8E649C3D9AD FF13332EA2E4C9CD36D8443EC8F027B61CEF92C6A6B72DD4ACBACC16E429A9A3 F5F29C1631360E32F8C1C93ACB22F810B86D2969A7480F486F62F8488BEEC74C 2C1AF13BB92BC578E8CD30BEA6BC8CB68ED730F54CED0167605FA76AD7B7E88C 7AE7688E598F91C471BD65A542E96D64B1EAF19FB4F1234308C48C2DC86E2193 11ABDB4C6189C6F201627C693691A86DD07FF55C30FDB3F72381E09C6080FD7C 9182762E5001E30F52A216E0B71E4D2D4E2F3B20F95DF3A11FDB2D2B5B5FAA66 C46226D5E0C77066349770514E5675550FAC9394FB27CD2C2F974F1FD58C04A3 1EF53A8AB3B2202CCA1CEFA66228E1480A0709436C44BD3319C40CF888AE4692 5DBBB52B15CF3A518F627F672135A24D5DB9B2EBEF04C860AECF231EBB5A3BF5 6DCCD5E72FE4B6DD29E896691868A7DE4120AD06AC573F5608B8449B38E71CA0 EB5CDA3F942482EA7973661170F81DC88D54DD5B92323F46F833DFA757107E9E F62A47CC50FAA1B68ED535C3E0E1073532A05ED339C8D70B3B9864808ABACD23 AA95E9FDA43D54C66A675FA074E0A5B8777D3C07850A09087F36852B5351F35D 8BC4DDFCA35CF29CD5E3DE118A741FAC4DED36847F2E2C6CFE08669301722D94 376F540982958074E7F1383C409652F6C99DA39FE90B38221E75BC1ECB93ABF6 B00F410A0C5651DB418566AB350FDA1789AFD88286AF3BCB42B98386F7BC144B 02DEB8940D20A6B3062F0C4244EABC50923390064F1D027A8BACC3DE45156E56 4A942D1B87F1C4A76B0D4D6801AE792CCAE3009BF25368B31B6AD5476FBD3BFF 9759EF463EF5E78E10B7BF64005B2ABE0E8813950A08A1808587A98E0021D0DD 751AD515E8278F1A0759E85D8A084490BBB0F8206484AA36388B1013643D3198 3509078847BDAE08E76FA5BF3E3A73C323CE093DCC148E3C02C2DE1E26C94D5A 40EC8308ECB02FF7DD04EC1005A2A0DC74D4E587F10A3EF349E828F69FD38962 2F0C74D5DAB3ED6CC9F97008ACCE74C086A503948DEF1AAF58FC8BEC703CD360 D32098A56AC776B1BD08442052A2A4EF6C8798F7CDC102AF1A2009657254762A 0793F79A39DCD6ADBAA5EC84A7ED6018BBE727E5D477893D84F157074B24C13E 8D4881C7DF8ADC13EBA0D89745EF93B7616EC5355600BB0D2B630AABA3CF2946 AFFD0B2B724EF0F28393F2034B2E69DA5061426805353EB4D80E20739BC4C510 6C45275B8261DCBA10DE1D104B12F46ACD230977EE7D7D1D35D2814139E38C4B CA6937CCFA653349B1EF64A98457F7B4B5D8F2978F16ECCEF7054905863AA46E DD524CB33459220C71E9EFA7845A3A760A507B3D3ABC525B35930B613710A13D 098832C58EBBC8B0CA6AD516E6385792C59220331D0922A1F6F838A8DE13C337 900462F952EABBDC2EB1FBF94A66186C177501453CD3FE3582073DD86F04406B 41B6AEB440DA475E13240445D46726A6D45185D56BAB8807CEC8A8F7CE1AD149 7CE2E1BB5DE4E5B9592241DD136479A65905FD0062C91DFF7349874BFEA5D9EA 2F610ADB9AE7757B2307A1BB9D6797D9F9C4844A59841C7C7682105E23A374BC A91885E7410F56F60C29AB8B417E2D6092F8BB70A2DD5DEDD4BA1077D7CC62FD EA43428C6F79C332342E15F75B08A1ED360B3511F823E75AD49BA7AE63B19238 2AFE8FAC2715E2FDC895E95036D23127557837506A3B542B0E4651CE2B89C252 31EE8ADC26E2C04E8E30A9CA12F066CE01953BE7867171FF6C7E834742C36C3B 58E74E4B482CB85FD4D24DB03D753F260A585D552CDC9E1941446F2F5B45FF24 2DA4932B973139F328E7E92828B900BFD398B6F41DAA0D6861C66AA7F5E3299C 87A5925CE0E0F9E09AAE0792954A1F2C0AAA8288DEEFFE579E38A3CE8A943EB4 55322A87C1634074EBEC25F724DC1BCC1BC10458CA6C4395659B0DB6B612C151 557CC669D8DC37769E59A5AC6BF061C79FEE265DBB59520EB8FFEA273601D1E8 2984B8AE31AE343F37D03E2BF97DC48AFE50BB6138C7B9F9B5E28672A37BD8F5 8F8C98DC43DB22C6537028798198E2D3B0453ED72487267D653DD50F1BBBDA92 833A987A95FC1F275B90B581B4BB62B6863A4CFAE37F715EDF3EA5A33679FEB6 4847ABB4B3D170C275B9F1AC3156D731198DACE0B051674E85B758500AC9FBEE ECC75EBBD85F8D62AAA328FB09C6526F853077AEF7EFBFC2B6A29D6D508B1E19 EAFA4C67EEE44045B9F15B9762B3DDF5CE5C18B23A5C2F73A1F6DF7F8679AB78 843AA41FD2A7DC02B45B729EB76C66A89F5F76E5C4A0C0563B1EC5E75D72EE35 A7F1FC89216B60D82F6F2B8DBE85E4FF4D63712C689E696F60B52AB622C2A4F9 37C380775EDB72638D3F81F61D8D74C76D813DDFFF35ABD9A502F2BC7FF65754 2A8660A5A53E0CDC2E8A95B6E33CA153EB711DC796D313C8183D707D3F0E3EE8 BA65E0FCE3F1C07F3D93F77056688B5496AE35A6BA0B59619DE78640A8C3F7D9 7DC5E94894E1E63A7D80600B945B1CCA50F1B85F57673C6CE09EFC4E229D4635 48AB466118D273BAF7C1B52A067A88C00EBFA7FCB378F1575BC0145F294E6F7F 8007602C6560476FA20BDB91831B22404DB1C4C167594B1216C25226D262FEC6 F5D0DBAC4B8D743C669CFF2068CB9BCD2DAE8CD6EE1B33BBF7514C4941AFCDD6 89B75F67339B25AB6E267BCCC5E2118879AACCECB5CC2865802BDB4D7581F5A0 E81AB0F7AA143FDBE743E16D028E46BDA94AC2CBA77DBEFBFA32E462EBCDBDC5 B86B63333A0C05C65D4B351948D03668F7A86A8A1388C4604675EA7384F3398E 49404AFCE19832C975A668FBDC29D06268085022982F01A2DA1DA8B8DD5F4584 75F98D7606BD6A45A403CC026A4BD1AFA63E1BC1034C1F617E14A1EE9543BF7E 1ADB8019F7AFE089150EBFC613C414955363C43E0D82ACBB01251C070E7F1040 602A58B2BF55094DF2BCD2689320899F987472681D0933A4BE78C2ED69D76E60 2C437D4D3EA9C8D25588F1689224D92CDC65AC636325718AF7EA47946CFF07C2 DC0FF0BE3642ABB0CC38BEB60E00B41D45DCEE44A71F11B99CC4CC22C5A0C62C 074F3C2FB093560B7FE9B3AAEAF3B563D1D646046174516991A196A915CE6918 CEBF16946487E546C6E433A5C5B9FB7D5B97F2B4B202F892CF5121199EB48642 4448B45EDB617EDB931969D53B9C200E954B4A6DA6617E3A56D72EF332FB941F 4694BAF21CAF8473EE2767CB5434E955C5A08DB04F67508AA1F5CFAE25FBC9B3 9FA855CBF2DFBD04C656532230B8A2A0B33C7EC74BF3EB2877DA369035C976C2 F3227355AE2E740152A344AC5E0CB3D04A1D4273A54A35BF8B1F247973158C4E 2ADCC0E93E456A8F099F28C99EE6497EDBAD4A0E7937FAD55FF114586FF56F02 D7DE3994628E4816B2D61DEAB7427A15A585A40D5265580554C3B7A1FAE1B645 D618BA8F51C8572A3C959ED2A13F5B62DD9A812D1FD8ADA501CCEE4F58152542 43EDBDC9EC1B6FD2AC479A302F73DB2E2F3CF2CEC0B0AFBA06C1EB69A4A076D7 06D32210E65F67ED3D0E2784B8FDA6FEEA00BDFB8C6CEDEE7AF8E2CC30A8BE5F B643B6375D2037FBD62ADC2B10D8EA7C133B2DE94B5A751458EAEF80010BF3DD 54B72E9650B1EE08DFA9B45720A75868222391FA43CF73739A779AC730156445 0BC9E8C78E5B289CFFF04C1FF3126BAE530989C4BD241064D9A4B0048CDB19C2 6E20AE063A9780D60F15F3DA61BD984A2ADD49D9825AEE01A4EC28CE7455481D B7D866DCFE0979D53E5DDD44FDF55DA9BC2D323523A13BD6822E7CB4266CF536 33BD0768CA779BA49F179BFE52D6347CB8AC96D2BC4E16B7BDAB90D8363EA44D D8733E3662FCBC9205C8EB145A9D704126521D91B95D756569BBE07A4A479C1F 4DCB535FE60231C628FCE3585EE0E1D9408F17C4A1F19997FBE548B283B0BA6B 16BD0E076A281EA00AB715EBE4DBD260A661AB7DA7E7C55C1857D0E8AB19D848 99172B98BBCEED958BEFF355024A0B0B2E730B3679C77B68E454AF56C5DF0025 BE3EE9B580D4984F51E7FB383A3207DE76DE8894610FCC853A4DC9767F628C39 C1615F316E3BFE70DA735E2394B96CDCA5138CC8360DE3D112E3490006DE8BCD 4C8E81E55D20B1665FA8B720F2447A53D1A5E4897691F3A55C802E60A1A6AC45 A832871BC8CEC7C963D447951CB702459D2B796F37D722417848C96DB1A13A29 6C8820EDD58ADF3E3BE02E8C169EB9BE8DB10DFD813649018C459D88A1BE8D1F 6FDC2E893B188C5B90AC7179FCC80D88E6ABF41A29B064AACB63DAE6AE009EB6 7BAC15BCE8C902708181173DF337FDE7EBCC44DFB92AE722C326065E316ABFD3 5DA03E988591C12F125410982D1001BE5DA550C757A00B58D718EC687EF68D81 4D21AFD9D5A2856BECC7F67B1C6B889127A6F7120F04A222B79D434E5AA1EB50 007B631E822C2E247B08D7EAA2F2B846212435A5D3933AF3BE62BC4C4D9B7D3A 5728E936A7FA9330E7C9E1EFA3137553D29558948D3912DE643A62C30FFB6015 B6AD73086A81EE38C7D9B4F0BE057C733CDC54FAE47097BED2AFCFF5663136CF 705756339C11DA308AAE546C55018FB4B3A11C2AB4595385DEC0F3EC7AA88E00 EF58B0B23C7846E34E979F78D58C9C7BA5DDC954CD15ED03998CA0B1B4CD6A0D 519F0277617C98BDEE6AA998512D023FA82434AD2FE30184670F3402FD01D12B 59455492F4EE25404FA4EB0C60AF179A0EFA6C0E0CF3B4204839BF787AD72463 C6675702F5C3C7F95EA7342E759FB680091FFCE92FF9BD9EAF8E988236BA6609 38DEE0BDD8E23AD9B5E64CE96D629134FB5F1B65BBD24434070F6D31730221B1 53E0EF522DC1214E044C151A7EDCBD10FDD37B53D298544B51FD1702401528E5 C9B16C362F2E972B57850531C7A22A0DA77D93D1DBC2B587FA95160E4C129753 27DE7EDCC3D19687263A77845A8C17CF0D8591EEE2E7617B83A51FDEA9A2FF09 1E2BC377338D35927703DC93E2A5889D4D9B3C5DA5A6C6B9D020BA92C1661387 9E9C052DA27216C4665F1C486062B958328608A2D173F517C2211A8CFD745F8C 3B346F19A8537CBBAB4EE9972E3E1A6B3167D4C9D2617F79FCDEB09101E8DA01 8762E351ECC7C22B6FB12FAB781163DB77595C0335CA966A0051724B329F83CA 9A1F64FD140FA2123E541FCBF0C69D3E44DB6AC8045322CC1A42113498B7CAEF 40AE5E4B38118DC8542AFFE926E2EB1E0D9E0586DB562414094CDE778B9D1070 E55EB5E96E653377FB543D8FE9BC3EF2C1C6DB56FDEFA32596A68D112833565B F55F6FDF597E097C0A70D8E839DDD62D14AB15CC0652691A7319D9D879C931D1 037ED199C7A03CD5C1B02AA188C4BA637D3E77243F884AE90424495FCA4E51B1 672D2C7C4353874BC805D7CAFF2237F7DB5F2D21FA67FB1861FC566049BB8DFF 34D056759DF8426DBD87420D808D9EC7F4F2149D79B7F7DFC6926101F8A47E82 A6040FAA8F151CA288979D90A4C61A3401F36E39ABC0D07C5F42290BAE9EF538 40B0DD22B8611B3B86C9B12660340FDC2A28331A5EF7085943DC5D5D3BE21378 AEA7A727E99B5417951B561EAB124D09EAA238E75FE6C3612A64E1A9839C43F1 FA5A95A5BE119B66A07A569923568D8D104811E38EF84230851911E14264905A 4A772D094E592E7BF81877A38933D39DDE5FE98F81774CB5B993DDDB4C965293 83A05E7BE4FCE1E87739653CF865A2255B0CBA3EC503744637B56387D04C379D F78DDC7CF0AEEE6D5CD287E4B4C50AA529CA3230A6028251F7D24658AEA31DDC DC88517A3ECF174C6B0E802B6F69F9FC26DA11AD6DB7311B06A5073781FE13E8 502B39641ED843AE0D813CB10846F3FFBAE9792E536B51139B3552F059438E6D 049C54F2089C7ADB3986796FA6A3D74165603D03DFDEF92CEF618D21075215D5 36688ACAD1DB685E8433502603D8E82B16BCA294D4C7E19C0F4B2ADDA3305FFF 6FD982F9D8272C9E228AEF5DC87FBC0CD4E5F532A3F0BC61F7AEF0FA2228EF5B 5BB1E4488F9CE66BF63808181D7C51F5E79E1FF3FD4721B188F3190BD1B9F366 1A4A00FCFBAB24685B83D3C5DE9FEAAB3ED18E46B78440E1E0663A4C4625D989 D32899B54F8A4FAD8F300D282A52B0FB78EDD4F43E56E8B38A5F5297AE9A9A2B E68BB7664FC396278083814C47A122B2CD07A4B7B42E0F5376EF0C7E68839A39 1BEF06940F8D5DD66AC761E4BAE2A54487A84A1FE08291C3EDEECE11D8E6C4AA AB05B0E4AFC16753DBD3FE8D85249109D71361ED8923137AD58D2C4226620C77 3ED75E93070770398AFD91A2ECEB48DAB6DAFC01F3DF70D9E885FC027688D8FA FA623BC35F1CB166C946545E9A8FDE477F837005EEC76A459687628AE3538C5E FCDA039F95D584C11CF6B2BA1CEFD7D94D31D75F91AAE8A30B1453E5B3C532BC 16E96BB12EF0AC5599D08DB46DA273A78D76D9D161779312D527AFB92B1BDA5D 45E272130C6A3BCAC1FB45F76ABC3D432A4FBE9733FC66E517502F49DB2C4A05 A5C7EAE971AC96547CAEC331E40C1C8D3BF7B63DAE97E033164D8FA69FF8A6AB E7F9A8EABBFC04C591821C78C90332B8ADFFB818BF709D2BCFF786DF5B37C0BB C2518844E0E317DF468C98A99EFE2FDF288ADD095C9C58010AEC94E6F0234E82 F0B7A3C47CA8362C4828675563054C664DEF08962DC0D4852858D57EA7F6B205 9331AF5D5E3E1BBCB0ED6294A5AC291B8087C55739F0ED009375DB5E8B8EE86C 20D4EDBF4044F0E2929271BA7AF2CB6D1BAFD31B1347B069314A14A135E704F1 634779B816C958FEA5BAEDB48E17C97BB38E6D156722CBD7F2A0F19241429FB3 7FC731A33275079D44B06F747C28FDE92A85B313855413F499CEB0067C8B4930 6B6611ED9D2CB24F5D7A45AAE0BC19187383290467E1FFBA733CB130BAF97FB4 CF696EE6612B34AB9B7ABEE927F1A8BEC23C44A8F922E1F116F78CCC68FAC360 598D65D1D64604617451694D212A1A098941D1D37A5B6961174AA6A0F8B7B705 C68AC4597AD0E2C63A175E635FD18D84D051B4387621426CDFAD0DEB314215E8 446CD10573FE1F98B2CD143E0FE90EF843B88F9D64C458BA0E2D435F50B16628 45744D86C264A430E7862079828E4E501F6929B7D92E9EB7442A47268F9CCE0C A16419FBB716F269FDD046F0C574682E9EBA5395B2CB68FB3FF4848C380C66AA CC168AAD75DC3993AF58B35069BD035A9C3B56FCF60D8AD6AA5FD6562BE1532E 34B3124CDA46FA95C8FBE19BECE40305ACD0D9CBC243038BC5197FF74C3C42AA F95DA6536774A1597850258504BC28246B578720CEB96B92A2089EE13B063A22 25D44E32729DE85DAAD8660D880AB4D9F685624CC2D3CC276601AD1291F29A36 5E79C1264A599AA709C176D429DF8003A95DA1371EFBF0996B397A822CBE8844 D9321725AA45F935861EB5965E990EB17049A9F346E8C3B9C82C77D9D790E0C9 54DF7224471779577C7FDE786F380C558CBFF19EF3FA8BEF015FF18F6AC7A3AE 6A8611AE64A0AD57B40FAEC485C195120731A1CB7D8536F82C89CF433F86EB39 E8068871A263187C1951E05F475B818EC35E5305D2B444DC6AEA40B927809B8A D5EE398D401299C0B9EF1AF30B77D2A7D9A63B65B6D3E70DFB65C48E3DFB713A 406D0D5BBE9D1350BB27D1021D1AADD67C5692FFC06E61AF4314478C385DE2BF 6B27DC8A782878684EB49E9A37502B40FD80F4796CAD7259D95E36FAFC15F8D6 4AC5CD57CF42F497081BA4160750066AD3E151C59242D4DAEFFBEFD915EE9F48 A11F660DAD310F690205F376C4FC11C9D0A1B495515CCE69DB6A4434EE170162 B6A4CEA256CFB945559952EAFA6DC838DEB9C503C9F8D0897E3105A13F65E2EA DF2A3AC3FDC0E3BD04D91BEA499D5A426CAC850B8290B59490A0713B90F2E150 357313BBA2FCAB5F8F7BC25C6A1F17B6AE9F76DD151BFE67181775E7A19C48E6 2FD0BB1E3D1B0A1EA62D52764687661F16073DE0803A319EC39B59FFC4B90E99 ABC0A4B6B0A86488B9976D688331C86B1A9EB6DD1A51C43A246945445A283B8A 5C8D00137574577A80293BC1E7ECB281F454EED7E436C3D611933D1763017317 1F24EA08110FF007B742994198F9B4FFEB9478538CBA86ABC11CCB948C00E563 D09F2662456FADD44127A30FF6C23F9692B78F94F0E9542B45E2D8D06BC10AB8 4369B661048BF3B379B7B477D9400EF6CEA6BF1F4B551C01DB882F61929DE464 B6D6A47DA001EB74A18B47630B026987943193449C6971BF10D8EDDAF19F1198 1E63FD3A6D3C4C139FB4B16A4B3C287F3B85319F130634A962DCF0CEEC7F6569 A64343D61A397BE317EFC0C52154B3B8C5CC719D353EDA252E286E0433C6EC8A 2F9BFF490ABD285D14FF43D1E3C53AF0D14AC0286C2ED5FA3043236EEA53EA21 B7656BB88D8CF8FA7E22FAD2160743E1D7370DAA882B71A46C09884A2B82A338 7F3987A8D178E9CA3C829AE37294FB0961397840F9951613B52C5BFC2D85D927 2828A1E88F0ADA15E7E78594A433C23C9C0139E9BD42037D2DCC0FEE51C02DC6 F2DD536908300B1E3E3C7DD43557F57C38957546E34499B741CBE5233AC1D4CC 48024FFCFDBD81A74A8CBD90C7447D5E70CBDD12BE7503A4C83544902B800F50 7826BE0BEB6409A1F699EA102F5FDAA33397219C6A8302D61B934C8AC8784615 E7EEC84C9A33C338335929FAA72ED0DEC04E6177F6102E0777D170A2FEFFF509 C34D853BA5D054BA22D1F3583BDB1F1F 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMBX12 %!PS-AdobeFont-1.0: CMBX12 003.002 %%Title: CMBX12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMBX12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMBX12 known{/CMBX12 findfont dup/UniqueID known{dup /UniqueID get 5000769 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMBX12 def /FontBBox {-53 -251 1139 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMBX12.) readonly def /FullName (CMBX12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 42 /asterisk put dup 43 /plus put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 61 /equal put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /endash put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2D43A151FEE81296FBE 0CF37DF6A338C826464BA5198991445EC4BE80971DB687336AE8F74B516E333D 2D8AB74D362C559AAE6ACFAE49AEEF4F52E28C869222C1301D041E7A0BC1B608 1BF728EF9E98F3A12EB2714E7F16B14E055FE1FA0EEFB058860ACADEDA9D0E4C 42E3C6F1E4869471BFAA3760175F3FBD842755A9D7847EBF605F18293B42F557 FBE2715002669091BB033E1AAD657532F34F7C66E4F04D63ABB07E6CB9D9AEAE 78EDE8B79DD9BC87A1FF445EAA05B5572BB880E69F4DE1F82D7F0E9980AB0C18 22C448B0B1722D3CC33C56FF287CECB80658B3AF5E7675BE82CEFF3DAD5942EE A03C955FF979E41E54BCFB5316A9AB8945C403A73180D0961416EC9C92F49811 4B91BC4C788392994587517718521E416D469F69952149FF7F9224377EBA1065 4A727BF806A112A7B45B0A1BA1D5A23683960575368D9EAC8C04753BF7465AF7 95F25C258C63E4FDFFD0B412FD381946AA38C0B961652BCEC30322C47BF4755D 9F91880688AF066E32FFB22E1A52DE741307AD3ED830D6BAA1D1F562919666DC 5E8FD9862AC8600B0AE0BC7FC779252AAC57248744ACC8A8AAFA836BCF09B0DF 9253DFBB1CB77EA8A59D42D1B18FF25E9AED72FA62FEC3F126F030F5D7DED9C3 CF60FE890BA4A48E39E687BFFAEAB96AE542A6387F6624486037C8924002A511 BEE5FBFD780AC1D4BEC3FBC47A930BAD0280D444259528B6C565DE11DE36BB65 9BADC55C1EDA1A80458E98896D782DFB5C137897419602809F9BF8CA39F00C68 EFB9E076FB324C2963F23CBFED28B9EF70EAA4E4B903225D1F199A7162AB239A D92D71C18B1B682D04C6A48926275BCB16D413B2A0E953E1257E0B12D8B717CE 2EC84CFBC046A4338A69F454A469B12118E562B4F56C5FFB3CA5D357513E6FFE 947A564B229C7FD873057D5C7CDF03E958294A1003B37D8DF565A70A00A3734B 0138AE5277D383D10C2BD853EF806D3CCDC47739F0E374A3DF3B63638B949ED6 4EC25869DC1C0B1F4DBDFFCC97382841D8F10F3635C792139A1EC462FDBA379C BE0990CA2E70FE73137AFBBF30CA54954D7E7377CC50BDD780DDD4C7FDC77AD2 F3EB1169F14A0041F18160F43C24FAF556DB5D621709FBC544CE55424F7446D4 6AC07A51C8CD5161AB0AD5084A96FB35D77F1CA155147DEF8D7A590EA6939514 D4A226588295CE0007BA8A550895511C8D80BBE5CDFB8A50D249C3BDCA974415 F5557914A9B805782F399E4078DDB6264F1A49A9A5BA45E284A5196E9828EBA8 481D357B8D9E6ECA631A6204439FDFACE7D7E6A2392726107CB7D2517CD19A24 FBE592C119626DB221BBB635B6EB84845C16A9585282E34958B961F4A543AF9D 419B6A9105BF185FC767712D923437BE08A9C0EB92AB6792DBDC671029B6FCA6 7F717FCE379C0F3B51C6CF042A762ED04898FBB4B0105C3C4ADDDC18C51BAA3B 70A93666669547081D9246732CFF74C83EE90DA17F5B4F8BAF47FE4D81590988 2858C9B96071341FA0A0D23BDD4947FC9BC2297913CFBD4FD6CA4303AB3179AE 0203F1BD502065F90CE9BEA3B52DAFE4A29446082EA0E6B1D7AF1F31D0AD02CC 9A7FACE2CA86E5FE0F6A425B28A5940ECA306891CECDB3CFC7A5BBC76B5D9E8A C754379ADE80B4D72CE493010317BF21A0CF4A0A55C1246218839DCA3F4D626D 1F4161D38F54AD5142C1CEE95C61D8BB10FAD4B772F4955777AFDE8AE5A837C2 A2BBB11D0BF5DA2E63D0B75ED421DBA9C789B281B01846B65DC572BA69591969 21265DB722AE86BD8CAA3D887C975A617ACEDDFB7AAB341F47532AC0F354A530 7662C089DA3939588774FFA16FC4A52555DED6D6F51DE718BF5F345C23C90198 17B77CB8B5D53A5CE7A79F3E286B6A59F3F6178AC8BF15C0A15C1A8A95D03B60 30EBE53DE328CE085CD9A1D49C69AA299C5B58B24334A546F6E274C1B534DC8F 3289553F560C2F81E413ADB92FA0E7DD1C2F39D5FD268EBA97AB7335ECF28257 96B4EADB7D0778706CB41C7E9C882760E7670936774A1088FFB2011115FDADB3 B69EBD5108760762521C25C968C3E282DC3400001AC8FB1EA27FF643E3025950 1D617BB8BB321281708E496277E11DD3AE0023DA9F25AD06B39C7CF527FED27B 57397E88D3DF70EE4FCCEFC8A0927D6B05517E571B3E70ECC99F3CBA32CCD4DE B8BF22626B6C94FE65598A88AB90D238461EBD9A098DADEA4091AF1CDD7560EC 8E1B9BC2321686E1759E6B8A270C8CB4A254F7368039602EAEAB86ED21CDED91 8F2DB9889F46981C494C7EAF5E819B91C129F0740B8002B510014985E5791F59 B16879CC6521D8E9F1C4C1890AC85A78022BE614BEFF318AB2616F0C3F02405E BB425D1555472A2642BA7686E431DC3FB8A1688B76660D9957C3FDE8D58109AC 21B1234C9DDF3F0FAF93BCF7B2F88A001F23162E1A13E5E9118D51B485B70A91 D0CBC39CF44413FD8686D9030782DAB58064F5B987E0402AF5B264B17BD31BD4 FDF63951BECD73ACA6138854EF35B062D01F33073850D9C09A818828C581241F A625AB3638081DD0F00F946BE5450D38489CECEA4E66B4D85CC8AE0157E2AEE4 A22A9313829F24D573101D84CC1784D1CED7DFAD5DD966601370C6CCBB723082 A86BBAF0A5D867D0D2E3CA16E14E5109A29EF02649C47E12E88B3B397D65CACA DEB9940B92100744D686066F8250FF30E5F13D81428EE238A2E4E07ACE0F5C38 7D79D4A336D0D26AF9C2B84088ED8ECDF94A1E3FADB45AFDAB46CAD6FF950B0F 07AA2CDF82374DA76C56D29C80138841EB13F0D02ADD32F88B23E282ECC845F9 BB9AAECE9CDC644AC2D49577A92307A83A99434F6493156DF25DBF0FCF2EC21E 8C50A312C3D19E0609C0038554CF4FEF3ACEB7A833FD54B06EF0D617C2971C89 E4C06075B09B84A4F78A82152B9A9C540B1D881313C2C74F20ED064A9606EC2C B56D7BB4797F1EEF4A9B13579CCF311FA4A4DFA62D80FDB7F535CC6526D1AAE5 45C008EAF024B48C377522F74D939A475970533E645B1BFA81997549AFF26F67 2AAE6C2EFA357DB3B525276EF330905688777057F4E4CBF584520A534A8587E5 5A8360891E75A15205E8ADAC4A4E5A6E27D0C4A7D492216E4BC023AB027F37AF A8DC7579BA50204D5F45A51460C5BD8A5A7F87668CA6451137F2F59E117BBE28 5C40820882A5546FA76F0CF49F8A6EC445F0647CC3227C400F56E7E9B84A6975 E85E243CC1666DBAFF4E07EEAF3AF71BDACB30DAEA792F2B8504CAB071544F01 5D66243D529C479D276FE22F7E275D9E7FA9C6EECA18716B2F213916E32C1D94 6E32397B41AC6779543218E506569E3544803BBF9B404A983EBA62A494187B30 8D3DFA4E1237A2E5E08224A60492C09ADAD8775B7CDB830520829BA164209ACB BCDEB2D574CEBFB7AE4BE72DF4EB1945FEF2458761AD8DCC0D378AEB7DA002C6 9C14A665DAAA532B0ABA98D7BFB5A6151FF6703385AF7AE8FD315A492FCCDBCB B825707F9566B3B4943A3C61C3DEFDC31A843A2D67AB06891F3E110DD8C73D3B B5E4151B51D9F13905D7D94DB9ABBFCAF35F43B6EEE256B1A80ED6D1739D8D5E 8C767F6F0E8704C5345D028A2A6DAFD9BB7AA048B8B895FE9423A7ACE858BADD 595CB074A128DAFE08FDFFD6BDAC0114159A702FDCBF8013804B0CAEAD7AF38E FAF086A3248AD4FCA1401A85AE2F72E3E6956DC0996FE8ADB18F89B14A208A15 13F81AF73D0DB72F78C4DA634ADE3C73756CAE6AF2E149C26316DFD93370BE1A FB4A79F77A67C07CB0A53C78367F21661D4AFE9E27328E077B522B50FD9AE2E3 DA087BE481515B5DD7BF894A96A84A6C78874100505B7DDE1D22EFCE8D58B3AB 313AB5495F72E2CA4E6AE22C0CB854302B9990372F1661D9F0A517F90686F248 C5643008B3D29F7296E5C8FD4049886662EFDD4106E17C879F5D41CE84F87E89 F6A3117C968B95A35940CC29C43E1E0DEF51C1E46B676301F40D59615C3F73DD DE37B72FF7105DB84227DA5241583272AB1C3CD97AE11C1EE98FFDB5E5F44844 8FC41BEA5C54B26341AFF6830D9D0A5A2901B0653D8BD0746838194D240FF753 E99750D3383373F453723D86BE97B571B8B84D8696089B5CFDD53E6C562A2197 A8C4FB0CC690C27761A816B441029D3D306245052E0C41B53025D8CB7267CFE3 C17FDFE348E765326F91AEB700CC49162DF748171214252CBC821493DD01AA20 417D66DF47EBEFFF3E9BB2B0A2BE7D9B8C68BD570FC2EB0FA54CECC318F04C43 19598BDE93F2F13DC7847354C99059AB20593EE51E94F9D4E9241869D605AAF4 9D9B5FD88C3798A039A67993C5EC68B6326B132E647F67EACCA7F7AE7F718D85 12666E90D7C73EF210E344964A38228B236679A2B18F5E081234CAA2458F8D83 3F0CA308D19663CB12EB904076EF88E556407C33C9380A6A3D68A9EFE65387C1 A1BCD2D26DFD2AC0881EC30E81C0A4E76C244A2BD822EE88C4A60B480D107E68 90E419A1F512E865BA922A7830909BC2611A80931CB2E9344529586726614D94 3AC5200FB9FF68AD9686506C5EFA8788C0AD0251AFE7F95E84683380CDB421C5 B1A783B6D5F3A6BD1BC1C14B363DB01C87C0796DCDD5BECF41A1A9F43183CF6B 82C2AE49F0BFDC5DEF7729F2E638EE6EA9E4D059EB9BB1B992AD8C82D501A550 1BF73CBBFE740179B54E193E84A55DCD61B343C1852780FFB44248FC9426AC94 AA2B3FE20FBA30F6C4D1E0FF3EDCDD8C0F57CCB50CDB0EFE2E04A8927E239C1D 9B026C7929BB48461D4D695FFC766C8A0E545B1BCC2AA068D1865333108E7985 2D93F9B00EA0A90939D0D3840D59B6CC0CE2C147B2E1A9A4F14270FE3ACF51D5 99F7349106165AD627CBBB0ABA01ECC6D3A14C1DC1ED23A9DB9865BB4396C51A 31ECD001EAC94B33C34E29C5611148EF3E55DD61813470B8F3CE32564C749414 3C93C77EA5A3538A0B5AE3FC4DA32813B06772E0E48E25BB39F3F6FDCC077E86 F86FA50E18FD19EB2F37311CE87F18F3BC85CE7FD71CA92D5C3264E34E04A2E5 70C79D99F54D6C6D9D527AE45EBB48411221134587D2253E7C8ED7658EDCA34E 5E768DD14E0200470F73C44D006CE8CB35DE1CA3EC10ADC668B0662A7774C891 84EC95A31DD872F0728D9F65CA80940080E04630BE4DEC77A2C49E3913C39978 BF145F8832AF2C4385EBCDB15F9D32C22CBA0CF950877717D6F1591D7C0B8047 8C9BFCB16AF7124ED83137695F3D69228DB633053208C29E0ABA1B06A7FB3EE7 5625CB44927E2DA6E038A6E62DEBDA2D96A03177982D8FA33BAAF4426E05F4B7 9C1748B3FF7691F9888E7FF864A10B9DF761A41E6B5CFAD2BDD7E1C4924AC97B F4B352705316DD1A58637CC12D71C18A5CA691AB2AA8F171590EC24582B1123E 94D4DC587D8F99E18A711776BF4013C96446BFECFEE4C809EA94B169088024DE 0CBD20199A915AA406F0BD5F3D63D1467C49B4691AEBBB35ED6624F2D7BB74BC E80FD92B9FD04DD9C2BE9B6FD29EC7EC07FAB447511C61DD299C783BC09AE2A4 7B3CBCA6A20C6631D06D0B2E2482A50612BB7C29B7E7D0A205EB0E8436702581 596BC996ABD58CD8D5BAAE4B1478195CAFF98FE0141287296C4EFB8D2E7A8442 F0A3AA9F9264329982532295A176BA1867EF732BBAC49AF485D9D0F7130F617E 7F7DEEF935874D55A22240F8EDE4F247D5F73481373A392D40A8076BD91079E1 1CE5998BA13D48D56B49A92B4A18430E316405D2E2E391B496A1934671FF1785 AF42BA3B2D14B8E04014437FD194455C50289DFBA61B5C377BCBDADA48E82DEE 4E70EF5E9DC03064907BCB8BE4D59DE069FB0C0CB140DA54708E630767313F9F 744594AD8A499CFEF733E640A11FD74E46A749F9C7D18D49251BF85C6EB4668D 67598C31A8F90922FEAEAD4B83B6E7184567DC798E4BA1C4C9B3461A478D63CA 054F13B502DACB674EB49D6BB935E5EC82BF99FDA7D47C581AD7F940DF4FC6FA 6C6D25D647033AC69505F0CAC58DE99087F365531A6283CB89CB644688963C3B 8B2203A94294E58739EF23C7803630A1F9121D62BE1977DE2F41687C8CAF87FE CBD7AD3B98E0D95C8C6E1A7CCB0E09465AA874DC90A0F5DB2C5E7C130297FD39 EFE63B0350B5139D09E6864D22C3F1150B29196E40EEF9723E71158B7ECFB8E4 C426FEDCD439420B7F1C251FADA347C9A2C49738B5A17922E1EA93CA7B125B76 57449EAA9C1D591CAD327D0E98EF2D44D614EE9ED49DD31ACAC0B956620B6BA5 5BF6D08CA7541059D5ED2EF00AE2EE95488F5645BF6837D9241C0D3959B7580F C9ECB2BCF3E65C07D52EC9CFB21C11CD4C883E44C173214C900C44D2E1E43DD1 CE8DFE3DA93C38B548BC4EC46FF91F30CFB97525E1FD4E77686433B20BABF8D2 848C1CDF1BCF185CFD7A81D2D4BB826E837E2AF35CFC4F419F698DB0C43E9F9C B0FB628AC9A3CBE9B1FF4A067016E70333E78B32AB2D89C483834B31F5808FDB 77492E099F1504DABCA5722C7860CDCEDB2DDEB512FFCC7D287F4945FD711F28 87BC3D36173566B81FC2C1290C717A09697DAC6072408E20926D39270121CE58 3EF97CE12EDD7F87F2C8CFE36C3C0400869C0D813B71C425343EE0CDF717BDD8 409D5297D0F8F7FDEB0257C0A391F5635E0DB1116058942FF3E7C94D5F2873A7 A3B0ADAFC3835AF2BE474E6741319BC6695FB37F59AEE388F81F6E66F910000B 72E6BA7531B4378CEFEEDC79CCF4947BA1703823B5AB4F4AD73D9615C66C489D 99D68E49C9BF765B7FC547BAB9640D51D5A7A2396507AB5A4DFF3D14F52422CD 8FCFEAA06A56C6C7FFCD29C9A7A59DDD2A909A9363FE5F1E9629616D25ED38CB E754C059E4379318CC491C3B1A90128693AC53F80F8210FAEA7EE638902A7D3C 82B95B3F5AE340EC1B648DBB9FB679D6E80B7F426D8671FE7136D97F51E2D2F3 C9CE9183E4061CA40091A2A70DBB9ECBB19CE3F65ADD0FB346B54BAB182E2CD0 EAF4C0F402C25573FB344EA771B297BEB615FCD0595172E84ED2A62FF8962634 23C19076C2A9ECEED5135994EB397303A9619C76DC55E032DA83FBA441BD484A 59F70A5110A8927F6239A14D4E223E189A5462E4A92EAEFFA4B961A2A32B320F C2B4E8C1821FA67A655B5042C15E4DE1FB3652B55078DB123573C4E986B19DB0 1C5131F3DFAB271C30A5476B4A19D8FC922E31879C34BAED94C07A4841B8209C 403369FB8E842610D1EB4662B6171A4465FD0E819964F62EC5B0ADC92F08CF90 1DE0B410FFBAD16F6D355E8AD72CCF67961EDB6CDA82398021007C2D0462E893 75EB0710AE4A6CDD15077C9DEFC5774EF4A657734D703CE42174259B58E5277E 0DF26BF59AF8D1A3E7DC12E3C12AA4B67CF35B19962F6950C2020B698D971B35 82FF84E72F72FBB0C54A112BADBAE6C4CAA358BDE6A705AB59332C3850CA3D25 C7564499BC1319121CE0D93218210C68080AFF33420E3CB3A48BF9EB66BC07C8 A79D8CD8E78C200FF7CFA3DAED0B9E87E6141C88B436D8FCBA50AC195FCBB9BC 9512B95FE3A37FFAAB39850FCEBD4D50A243EA416E73F53B4B00F3B6EAE0CA06 0693AFFF8191C1AD2A5129C8A8DDDD492F8EC8B7B93CCD6D4F240785E515C128 D7AC38F14C1FF204DB89A8805F8D737644DED6E8EC6A58365DFAC56200AA22A9 8F20DE1C232DE4E818CB9D2D3330ADFD72C1B5146849142B447900FDB1DA01E5 C1BD63FB69472D782C659F7862671FEDEEAED3617266DBD34AC593EF6F483D5D AE56A502F9E66041D58C14FD6E83DEDA7DBA041726D78EFCF51152DE72B51F2B B65060004FC8F67755EBA2F10A2D3E496FA3BC3B664ED03F496AC074B7425C21 18FE971025F8553EDFEFBDA53A475B36DBAB73D08985749FD3B0F0C32108EF87 BE0C8DA94598691F774407E4D36D336BC9883D0FBB46C8D8F786780BC5EACB9A 0875E368521C0D91FEFF43DFA0932B65C1FF7776FC2AD3CC8496259C1C31048A EDBD06FD79BAEAB05CCF5B81D99CD34D142C6895FA79F354B447141CD77CD1AD 6B8D17AFDDDF80DB7020402FF8E0B391AF827DAB714D59E44C0E2851E6FE82CD 6AA69212F7C45DD001CDD50B275589987D84CDB8C3DC2E76D6E4580021DC664A 6C84E6C046E5AF8FDCC119B80A5EC7C64969039A12A564240DBB49F9DDDB3245 0E92DFC065FA0E060B74861EE6FE2775768A1FF5880FC66196E14BEDB1F65004 B5D058DAB819A8F97D7AE7B96D405B313732214E7CB3433EE62822AD7C122016 14CF0CA416DD0C8CC52AAF5F0DC7D2774A596576CFC3FA1AC6540F965925CD73 D646A46AC3CA67C187FEF721EA82F4E33003E19047E7F16EEDF0F899CF8026C4 E42BBBCAA4BA883ACD7E634EE5ABB43710DB33F0AF5071B7D55081B05E93E84B 391C7A2CC8F14A25909155C60AD3A7D89E93F775514599426D4D87FC524EE365 53B25CCB2D35985FB66BE3F1BCA4D43697890568FB0917ED3D18130252C944E3 D0ABC82041D7DB7B94A58002D8ABF46AA859FC6C0345E8724DA8265BAA869940 AA0CBDB222205A15F9B31BC73AA509F257BECC4B8793FF1CAD79BA6AD39B420B 5F0B432C85F081570881A67DEEDAA9FA5E64676643A126470CB76C57774B8E22 EAB865029028F7278671154819D8FF3925C8B96D8A2063E9E41109630900DE21 0CFACB6601648A0B0F4279389DC957546B353AF941416700BBAAD52C1177EF5A D958F44E227DD89154BA88BAFF663E5C7A38321B88D3FC0EDE4ED5F09C76DB2E D34957E6CABF0CB1B8E2FD2A9705FD839D9C9EA07397853ABC6D4AC871FBD967 CE62F33F0C59263F0301CB2A2CA008F5CB611AF37564EEA16D705686D0246643 8A4215A77338C540C626F29E0F220E483E98E9D91CBB39783738A14DDB491CF3 28E8260DA2C420D2D3782BB4FA0A53B60E515E2BD1D50ECEFDFBBDDAE79B378B 0EFFD133945F20C738ECCDA45856C618771E454B187813317F141DD9C3811E52 9C7D6836D39278F6FC1920EA5E05AAB5E47C81B59BB906B3474D305738E6D082 03173510B0E67094DEA3CDB858DD35F928A50DB13A65DC74D8FB45A631D6D0C9 8EDAFB1014157F0047468DF5678A9F060BAAA83A79291FE0434E4BD09280E010 FA54EA4E5B06924DED18D39E95AEA3B090C6980216CF5F7DAA4462008D3352FC 1FA5EC3319050E59301D74321132449495A51A8710D0262FD777FEA85CD03F61 E69AFBC6D9AA8CA27939FEC1424A70547336BD954A37B81F707E8F17C803CECE C051439850DDD815A71B8880C61831E5452CBDBAA40BAA49D38C648276CD24A3 6D4B177FDE10D1C09DD0105DA01C37A05C01F8E30F2868FA062A5AA60C64BFE2 2C6C0824021B8057D38AC1ACB02BA580A17E2932FC05585AB9CA8DB88A0200CA B1C9A89C8F28584A4A7715DCE5138CCD2C6C9166BE9B75F0CC7067BEFE5EFD71 67A9051264F0AC54D70F8EFCA15C3BF3D7F5970E2DB5D9D3E84699C0CE6C07A0 E70691A3BF3E11298177FF1913379C6FB571F522E006E8EE8FFD8CC4623DF5E4 04A28B7E1CF0A147D62E4C4F64C265879D331F7BF669A0513F31B98BF5BE4378 1191BD99F3BA11A2E81C906B4D942DBCECF68FF9D34A41EA24E73E1E507391BF 4B21ACEF1D2A95839991C4178C160BA391DD9EC604377B418C0BF7F936B049CC 836C9758A492E8BBED76CEEB360DB64163C8691EBCF50E27266A6482A23C7FEA 32CDF2360B2FEA765B68E59E9F71E42222435BC627AA2822DE34DED1F4236E43 2A32FB66F503C386B3E0EDD69D9E5A63D5B32CBD9934CACC792CEEC8A7EC09A8 60156E73E4A4B3CFF5B4ED81B1AD13E0696481351DB352646B2D472B07E613C4 798B2B0E0730954D479A4318AB0CCD1E4801757E9685BD1DBCE1C4CE1880D438 0FB208BE5D40C944282110D9199E1F7936079B903A26A2F2367DC43414D4B4EA 5338F9CAE3D54B8ED8BE537C49AB61437B0E66428B64A4029AB054FC4C1642CE 6BDFE68ACC14A51B4324D55FAE529C2655619561D71FB556B952CFB7FB830E4E 822564682B893EAC86362504A872BAA165D41821F5328D58224055BA314EC939 52F2ACFE5EFF0A35A8980C6B2C5E7E973B10F39859DA6F8B3ED3E801EC6B0945 20E652C0247D253B3C5743D182FCE4A585CA386730D3F80AC9787B09DD91B5B4 CEDCAA96061851DCC1FB5FBCE349629AF9CFE62B400AE0ABC1C8AA569A4EF6D7 C6E19840D7A7A3B295630C430315D82C6B041701A8F9D902703EA9157E9A1F08 39FFCF683587E4B1DB503C5524C744CFAC96E510EDCB09D5F31303715382D1FB AA8B7D60220582720365C79AFA39A12A1FEF794E0BFA0F53FBC2292ABF8B6544 EA0F6502F5C33A29434390F08711B1850369B95BA8D14F3B8169419FFD11A6AB 8625BCAB6FA3E7C5C381142367633C6504E073C1C57D47E31ED2D99F9A87E307 CB0D50FC65A55CA2CE35711BBD6888A332C1635C9E09247A5262E8FB20D28B1B E4CFD41588A8E70A16F6C3B0B303DEDA9D5414EF5AD239D9062BD33B8ADFFC14 71E41B8546A2BFB756E8DBB87C1EFFE8C378C7EF8E35304B7C83F126FCE4E21D 441C427EA1809079EACC46F86B01D39ED1F02A6ACD6C73FFF7A236608CDFC815 E7BC688E6001FC4917FEA25A7DE53163F61560C55F424B1C16AB8A99643BB315 709B06F7E6D20476801708095DEBF008B75512161C34252729D71B492413C410 B7A144991C62F142AC0FF513155727DD54F4F6921A654DA54ADEC09595821AA6 F19B74747472B3B612BA7AFEB545E338CA91C6D1902CF1A6FD530C8C3A7F15C6 B96503B95FABA843515D5284DED6F1EB1709108C43D2E153A8EED888D8A35151 E9460907C5D04D0E6916F7A095088F82AB92ACA2515A7D46152B1974A5AD8151 0BE3CEB4ACCDAD9B744D5B43FB8BE26BAB05F39A01695C9CE609F32CD1F2F4AE EF704A5E8F6E523AD7DC0F40B2B6F4478BDBEB25DF6DB5A92D97C4BBA4E620AC A17B6D51060F589153C33203CA82BDA5B7A8CE3974ADED22FC9981C20C2B6F79 206780C7D03E6808D7001D1C951A99CD1F6DCD4D04B4590962DE18B7DA23AFB7 6456295820B734A1D3931AE8E6111F5F415533D80D0F2EDDC36DC19A265067E7 3F41123B686E52AD4F98C3315007A37AC2044AF7520B8BBC9B5D58312B625E21 D70C8033B0563B6478FB97A3008764FB7DDB737B5993D27834DA23A3DD24A32A B05A35681AFB8A49609DCCF8441D5A9DB3B21D2E50F1349741132AABA2C0EF21 506A7CB5F8DC3B6D5B9B02F65F449C6DC5B35B096DD08D40112D27A2FF373E45 0261F069765CFB339C897B8A5574206E319E43DD22591B188A74469A1710F1D7 94DE643F802D386A313E5B020CBAE9E32C7FF16829508E553BBF1C513E1D6977 23808EBE8AD6FFBBC0A5E3B678D06B75AC5671821C2C0F7A5CFBAB4F80DF4F28 3EB73E29420136C71B30DA7024A49684B9D004E56E1B3097B046485C729EB833 AB56EFCB5155996CCDE1668C2F7EBDA1E81CC5B06C6B16D9EDE7998CB3F0E3EB D870C6360225CBD0B0522C7530BBAABD5E9023DADA7CCC10EA4D93FE6A1757C6 57BC57E540E9AE01B9BA81851F128F5AD26E3A9B786CE30CCE56931A09980286 83F76849EBF89803AAAE21F4468799CABC40926BF53AB6FCE504ABBA2F3865EF DC6CB8099E35FA38C2095DDCC874A92CDF75E96A16FECA626F8CEA924DCCAE4F 5AD678289B0377E2A1A1009805978AAAF2CDD8FB9D08ED50AFC5F85B3E82A2A9 0BF782B72FD9DCA6979F4668275F3C7C6EB9BA57ABE40A85DEF52A40F98B91BA 0CE05BFCBFEB7620C95D2BB11173374770B834B847A9B2E94E51C58330B9516A 3A5BD6F718FF9E29D68CA4BB61DF064C9A08D24907A26DA16CBF861A9087C8DE 36916648AA47D1CB96CF2171FDE3F5AC6CF51D517D939B3BDCE9DA8D616BD7A7 D1F73EB18ED5668F20FE55D781915E4180D563A78A31BA3F43436519A8518546 DFBDDF8EB29E4B461CF057565C167371FCA62E6F61BB3E5D9C7E7B020DD8FE18 B373003707BE7F2781DFF5AB4DD448794537FAB497830A1477BBC91BB9CDD5EA 032069FA12107CC729CC32853F761949F20B1430FA09420CBC06B10001FF883A B31A0F3E250C4CECC05D8A313AB9EB6E49113EFACD03ACF645B7D6A9B6B369B0 110E3875320A74A8CCC0D24589499C9CC32069D43D69043C875A16B4508AE9E6 0D27CEA5E258F42DCEBDAD88C7EC324A26D0744A894A4E29F819282AA5464CB1 CA8C48C1F95AC8BE1BFF77D38346075A65E4E73E02CAB3606E3C0299485A6DA9 92E98E79CCC112B271FF66AD4940BE919D7236F5703D6A57FE5215FC48C1D29E 57F1CDF3980C4DE523F48169E540C02E3A5389B17DD113990BBC6D24C2F5C780 069C273BAF9C96061BB02AF5E619871EEE6996C859349FE11641F13D09D3C152 8F07810995F78A71780377F827BFFB2110C0C565E25AA92164E3E7C5E8568D2A E352394108DBFEEFD8C03629FF477AC6D727B61FD32843164A77FDA669078BDB 56E04A2836F73878B44E108E38D4DE0D6609634A22CE23AABF7724BA4CFECB58 38CC4F288F75EF43018A9ECC1E75FDB5659F8FCD5ABBD733898FD1C4C8C39EF1 AC1EBCA312EA44CD7A357A2B3219B5C0FB14B2716728D5E575059689CEFDEDEC 93273CF09CF14706B9044D3540E29F781F1CDF133C341E927F2AA3B7ADE81E51 4FCC4D537D6ECBB4488A1DEC8C15915804E003EE91A32EDBF37103AD0FB845BB 11C5F3DF9EB549BA3A77260179470E4CA75EA5B866CFF25775E88B76F23F093E C2B37C510C641E03A5542A977C85337C3929423D01FAF1A888CB5C628487E8C2 2590911270CF6C765F5A16CD88886D6CD3CA95DD4BB916B283F670D895D0CD49 48CBEC34BBECC56E95099BA8BAC34C81645A7EAF046A55F1458C9E9EA5D63BC0 C45FD00554128515BDD5D645980A52C5806F3E143C9B669747B0B0C4E33CC76F 6228082A0A12B57816643297816E90A4E899E0B7174214D1B944D4B488C4F368 856AA99F918596E4F63BE3F8F39BC6320670391FE62B06D36B94863676B532FE 7C6724D435CD63404225F7997A672AE9CF5353C673C5455BC7281B7122AECEAA E0E3627F82F76F27966B0D8B11B91DF24C6295779A721C3865F328EAE433EEE8 E752BAE9299E709FD297A7E5AEE9F7B30FCC9AA1CB1FEED2BDCA434C63D8B365 99353392BD6233545718FB18B0446F838352F9A2BBC85AEC46F4AEA9A1493AFC 7A008638885D7CF99B5886E1F71255584F0BA2538EEE815D8812AE4319D59D40 82B2CF3EB5AC183B11C7D19AE25A5C5A1EFF7DFBC80C44F8E49A3DBA23CD0F25 4CD8A11ED7C78D56077A3DDDE960B93751A902181BD3E8F69BD53DF22798BFF7 BBE500C832858EB426D2E07862CA3B6B8596689E3133DE43533EAF36261BCE94 279AA8E693A47395F78F984F1D9619CC9B9CCEB3FF958160F638279E1FAFC5BE 8D575659123872C83A75AA40A67CE775C342007D8F9FDD0AEF44A875E9605B86 5C38CD3B3D6EA61ABF5BC6E17DAD431562871D7A73A1D119D0E8EEA22F43C5B0 6DA9FAF38278AE4C85692C5FC63309A8A59D1B0E583364B4744B413BBCDAE507 CC8D9854830FC381C771D2CAD42A081C5474194FD0DFADB68AF832133CD2337D 6CF68E9C06C67379E81C321DC8FBC6C4814CDC54957A443522D2B2BF3D466B4E 6937825C8CF0E345B02F822E854554D855B1CE696EAAA5CB7991A1C6A426D79F C619C0F022CDAE2DB5A8191C68328DCB6A3395A81A787271BE5DDEDE693FC22E 23A07893C805F33273E17801D9C3DF3702F77D313A0703B273A97195761A73B2 AF4FA57C264FFFDBFB8103DCB4D4B975752B21FB7B2D108734522F89E6B7EACE 7810B15CB3A24C28F43FCEA13BDD1CAA4FE3EFDF7D290EF55A72972638722333 015766275C9D8087B6DE0351E142B8C7D76EE170710EEDD9E9ECF2D96D0DF27A 6B1E97BE7D30E1379F54636D2EF190D9BFA6E78E0C1C9CB7E2710B223077AF8F 1A4F6A86BFBC8673C436132339689F2F092E49A41902C411115D754E4BEA6B77 F33B76035548AC054D6BF36D5617070155B56500FEF46B486F5FFCF756442F44 EAE6EA59261A4A8DEF08794D3DA7299F6AC05C2C4F5F38686EFCADA6BA92E9FF 6EAFDC36828EC54ACE96FF29006DC14EB646BEA5DB4F2E0D64506FF55D854973 EC4A39FA25F16D25FFD98A5EB111E83440251F1A53808F394684619B645E679F 78FBE2345F269EADCBADCD1710682B18BD72642F0879B86426F79413272D4576 D00EEEB161B67044756C494094019D62B81BCA6608FAF4879C2F1C21873F0628 B03656FF2568E7C13AEA1575E4510039CC6207936B3BF8484D4B38201A44D9CD 9736B66A96F9E2671D258CDE28AC40E61A52E61B3D4E2B8C85D2751E9294D33B A9C1FF99CD4BAA4706EA8DC96C0864BD3E7B5651F441A96DC2E5607600AD85E6 390AC0F358BE1CD227A41AECC66EBC444ECDA998E7CE33DD24F1B809B8F1FD44 C96D8ADB268E9BAEA57B3AC6B5FAC63F5B6DF4E529B79375FC3B5726D6F2CD8A 568BD287D3D8D76A9F5E0F04490CD4ADB13D419C49781B2C65AAD679BF24981E BA3EAC85C874D63B20FA777487A0FD514740101F753A44B890C51000D718344D 66496F21134D84CE17CBDD364CD2E7E5595DCEC32950F3BF8331D3AEAF2ABA92 EA27ED48956E43AB5D6FB9A6CA5232ADF9A8734471BD9552E990388D5F9E8F56 84AEC1E22DD5C7CF1D7F3A1BB3EC43782E52A8B9123AE975EA6B45AE81725180 EEBD194DBEFDDFEBE4DFE065AB293EE9A40BE0B61CE640D413723B1744A02125 90FBA48793F26B91D5891EF67E7650669BECE1785CCCBBB7DF01D2D5D556B40A FDDE30243C0787BCB019C68C00BB1ACAF585961859039BA34D45FD9688680A07 021F0B0AD971DDAA8C05DF8D9D57DFAF4D73C3FB70EF583DB8E01F1B69298383 0E4FE35AD965A16C61D03DC79A2990237BE994CA857A90EC7AD0E933CE541C47 7CB9D5F4D17A98047760D79DE62DEF08F5ECF461D4216149C80AA38C5C420404 F3373AEDD35C7002F4F305C3641AFFB293F353DC0508A4521165EBDA0325A786 42313643F5CB797AB28CB88942C82B91585C13207141B29C34C4EEA501C0437F 1E819892DCBC1ED7C5EFB9DF00D6F39956E306ABA2F28E862662D3577BABF3DD DBB8D014DB8F15A203FC651FE6EF2FBA87759733081699186C266F63CCF14338 7A0A0C6FB0677B0A9AD02A23D8683BDE40E08745E6F4CB4F10EFC43BAE8D0E1D AE62D73656657DDCAAE0F8B5E0387AA1CE60300C3BCFB534FA3BA000FF6441EF C75D09985C24CD249B45F2988477189BF02F6339CB6EE878DF3A2C93F3942D0D F112E81721C48B2DB55C16E1E35E11EC907C413DB96684115CF1FFBA9C9ED873 0556CEB062EFD308CF77BB0CC6995180AA791508B37C2903F6FF361D31F69AE7 D958D3863D0D3141E65D850459476DB0BD2D965DF687456FC74505EB7ACF36CA 1E48E40BEB049577D81B5E2C057A81358FFB649BFCC375A73600F634DAF2CF28 691FD266BEE7F1A2BDA8B86F3D5310439A335C5F827C81FD49090FA6020CCFB6 4C44F67A871686226E000538960AC4B78F7BC946E26671F3C19B4481621BA399 DBA2C104A338F9C3FEC3353ADD61CC00DD9FD19A6166662FDEDBCFA4E16D6813 37A15D0E9BA012DB596CAEA690DD3CB5CE40BC07392DD6F63F295CEB50D7839C 12ADA2B662EA90EB530EBCEE5622646A606507AF5F81BF6B7D52143B1B29756F 7B3C0AC839EF4C04A487B20B7662677D7CAB60769F812B913E1970788AFAE1F1 E23EDD92B14F85D284D48909EE074A792189B3D8D6E20E6DEDB8E493FFD73A43 C73710D04D716F123F1C2FD5DABC769E38F7578119B83F163F7E4493AE19DEB0 C255F8883AE3832361E195771739F9975F2A8E73D8F860FA685995A85D72D1C8 689286CA858CB728FD81FA9EE17091CCDAD004E30BAAF0F59265118904A06FD3 AD8078E63DE189BCF831A9AEBEA67742361F8A614378B4017041DC012ADFF137 C4052C69319F1E74CAF425136C8A4B9E63DCD87E35F28F6497C5C98717614774 53C16DA73097D5E3B892D946FE43FF461325E252B2665D9AD3C59233AC124451 268443F95C86D197228D4E4E0DFC04EB9DA75B958A412850F1D0B456EA90B7E5 76639596394E75835745303E5406C141B3A955FFBE9EBF4BDA07B8D9C1F6E3B5 33CDA073F14923D7FED740BF990900602B31A02EE6A544A0B905C8A0086AC490 4BC743CF9D16FADBBF6D869CF78D2DC396C8543576F6A28512EB1C7398340AFD 8A0C8496562AAF277CB8A4EBA4BF16D225AAC63822B118F024FD40A0B4344B43 50F11DBB5C4F0C4956C004AD67EE88514C9DD8FF4AA41B6C1F8F99B39D7D951E 89AA8AD441AEBAE370338FCEC0965F4766264D80F20F37AD837F73E36F2923B2 978F3104B9EC3095B8EBA377DD71DEC0E365724D39B939E2A618D356AD834286 178B1EE80C8B1BE28EE6335E610C98902FBAA8B68C5B473479911AE08D2B0357 580FA35C2F36D58A5B38AE9020E45A5609BE469A3C68D7A88515B1F1EE3B43E7 929593347BADF77B1E2E03D6AA4603422BA012828D6078E6E8EC84F1E8451E51 BBA8B100FA0B3FC1695C88E2EB41942B282FBC43111FD929F48FCE72E3A7218C D4408B8C2C81C67B732B4F8270ECC03990FF9FB0A8F3DDAD862056CC4FE5BD5E AA69491C641990B948E1C633D08D0876D4B56F3BDB323F39D41E5B142B352FC8 2D5E960657C7F58CDD253CEDBD8BC2775BA6BC0948C8182ED0C54E85A65856C0 FF51D207F791F3DB07C0CC18F7BA41C54AA717673E2E5D48969ECA35BE60A23B 056B223CBA20D123F0604088B609D12BA650679EBEB6FEAA63B508BF28A12DD7 920CFA95964AE1C1A21500C265EA7395546FA168CC0CC692FB95D2C88355BD54 EBC912E04B7090C563EF0A39DB72EFEE679418F0327B22B00BB217EF076BD7BA E9DB1F9381E32618E2366DCE90832A98A9D597BD88230C4FA049F907755D5C50 0B7E9FB8AD9C1F9AE23DF09368210E3B9F07C99082EDDB8F6AF87C4701BC75C4 A1B3C25F84423DF62A072C36FEDD996A94B1113906663D85BE52F5184CB04369 2B52802C7EC50271156B4EC388865C175514B165DB3EF42B847766C2622D6602 A56440454F2827387BDED69681E6105C11E7FAAF09C96588885635A9783F1E14 C7CBF9C15CA00C36D8C5C29FB1A6386F081EE664D399B1B5AA9450F3C277F206 B6F35776C4153F67FEA3CB07AD9BD79592C665CC0F8BF95CC4D17F1A670A465F 1050F4D7BE25BB11FEF6A9267A28E44BBB273DFA3372F73AD6E2C6A8E39FB012 B87863AF7BA2DA438EDA16A052479B107E61F3D74F816DB08941727902D2BDC9 2618B875A70F4627756644C3ACDC4581370E952135140FCA6E8EDB54B2530C2F 3E1343F16132456527D409F7469994A89342E86CBCBAE3281DE70CA02AC80E06 92482DFD8C6BC276CA89F092D6702EFD245D9AAA9FB11EDCCB57C45DF747FC0F C76A0FF0078E8AA4034A541EDD6B21E342873069529A62EE455A66B0979E4CC3 E0E2AEF76EE4EB5216FED9BEEB488715BB1497534A3A125E96E49383181EB26B 704BCC2179C428025E953E22EDA68750BEF7D488498F0A99C9625C87D8CBC064 090781FBA578BD1AB4F9E72D0056AF33EAB64A3C605AF9D78C2F48A661DEC7C4 770AF1A17B1B8E9415DDFA30BCA34661A3A286EF3EB5093CE9244D6CF9C490FA D677E759225C76DFA0073268BB20A1D2C85DB07BBD62A140FAD381BF4B9B3D58 5DD791F33D8E2680135843FC85EF7D5D9FD782623E79EC244C623F604074D7EB 8FC831F9437E40F1C73A1E7A8AC2C6E1C9E00BC9A32D127C5D7591C3E4AA6B6E 33A3AA245A6C81A32FCE315D63C3EC2DB2CEF5323CFC86B24FBC10A0A0C6951F 83F63193B4CFA8E89FC6413346F8473ECD76A785B6BA34D05558E63630039292 1127D865F6FF87A1D917A67289F9800C43152DFB8106D995A5A79F34B86832A1 00B4EECD64D1A661153D34C1B9D68F86AAD4724AC31216DB601B5EC8A3659AAE D1250059AD25E0FC50B01C7207081BFB3E10B2A7EA80892167DB28C45558EC3C 8D0A268E8ABD63491D79CA4CC62CC5B3CE6EE785E3839F0737F08F1897097E04 FDF08D4BE560F61C74ADFDA0E994AC8EA0DEE28772BB7149CC97305C1131D45C A3A14CAABA744D248024AF8714A922D349302EB2091DBCD97289E605351755B9 62D76337937010DF6AEA670483F1F1176D139DD96EA0EF27878C1B92C19C7E0C 8D2D97913D7C12054B70B7E3D2AA33DD5E853D3F3A5327F4F8DBD466188650D3 151009C7FEA778B2CFCE8BC7D7F3043B9FB9DF9A15D997A0D0D9369A986B349B 8C946899F3EB2D2D47F7518EFFA18F72CB63014A94E6E927B53EB91F48FA1629 8F27753269DC43667BD80592228216E3CB1C60064AE7A6D7ED9FF8C3B6CE21CD 2A75C836F63DBACAC5C0E41AB672D809DDF0DCD13EB72575B00737ED1A2C0919 988E59E79DF69D65A692466D30E154235891120B8A80F3C5CE68023B2C433552 72E629D7247B15F19FBD2B464DE3051A2B468ACB319AE77B0B45B6459D4C6800 48CF171A2E1694A7355F6B65F4D8530E7BAB3AF7C410167F2FC51DC028304E41 B51651448C8CA0F68E283AF9A086DCD463B788FC0C4CBC1A0D2B13E9FFFD0874 12F1AABF993C2D0378E063FC05C6441627FE8380188A5D1A5EB1BE2642229718 1DF766C7EA15C77059389DC208A69A01374C6AF61D449F8DF5B3025AAE60D238 50F98EAD4F6EC247FB8B5822CAB4AE23CD1BC0FEFB933880B37B09FD9B7FB5CA 007FC49152B5E11C244167FE132B1A15D38EF5C57AEB0B1A9A965962880ECAF9 070459139AC8CF1B5F525DBE6E62F7810EF377A396F1EA81A70158B4663B36AD EC562233319284FC782BE40F103C13D6E53DCB11DF0D59C8602D3C18761A7D1E 241FAF65C715CE84DC3970507600A08B04AF41D2AEA00538F35241187DB6A4BC 46F6BB6B32ADAD5A097625287035B8600722FA2120DE920599D53EA36F1D5839 9B07AD7D75CB5090B0B540267FAAE6B6C251733A193F6BD068197ADA9149A32D 1BD1BF3E86CCC237F63D031C8948C0143919CD49A48335CFAFB9E1AB388B1B9D ADCE55DADD8EC3FD83798CAA9559E9A9B378196B988FBAF2A8ACC073D0D68180 B3E584F59B06ABE3A3B44101FE7B59CDC08139CF0F587D1DF5014411B7FE7645 ECAC2A1A59A4EC15C572C6B1FD3532DFC1B82E33381DC40D1AD31275F56CE791 38AFC925C3FFF5F658C73FAB99152819DF376A1166D2EC61B2EF7108D7B39B24 466AAB4718612029CA3CB119FF54AB1982E5D04B928C018477D107652B707A63 5C6D755D8043E8ACC6FA79F45CDF39CD935C716FCC2845675ED7AC740F09B8FC FECA8B787A587C18DAF7ABF900DA579C36971FD0A4A0D709792C1211AC0BEC3A 9BC7CEF59EF6CF7FEA023327B2234DBD5DBD3014B00DDFE0F65AF4AB7AF1837B F58CAB907ED3D6EB3353BB9B40A18BD99405C83FF10F0C2A4B74D3DD1ADA51F1 6906620F8591776C6BC7C521EEFA6FE61E9ED0DC5822FB55DF74A772A6F0CB73 9E36F44181E2BDF3DCEE8627AF3BF0148D82182D2542025A0A7A9A15FB8917FC 970841709C65CC5F56CC5A2DFE6CCF5B9C673F5475F8B6792011A72A10291265 CE1DFC13AE64D23C249B4176ECF8C05DB6C8903CCFEA9BE58DF99816A0896C6A 4817040D4721409FDD3819C98C39E76159D5ABBCAF6C2A1ABE2D31AD843D1CCB 6D719FB471C9ABD415ACEF640E2369938CD4B469CA2E091F28388A87247137C9 22BF1A7988B114227F272B488EE4087EB7B8980851C4E95B900369124106F079 13169F7EC69680E4B7C31AFC9236D41B56D409B7F8B79E47376C5D66B68EE662 6B74BEF826DAD28F0FE6B50A42539A76A68A98AE71C36A6302FE9286735843F3 0D81B0F14F6DD7F78F1CBD34572AE4562879BB8EA1BF9463F6E3355A66C2327D D70F39356D1D4F3CBA39F7476FF40202DA281661E687D9B631FF573BE78C0EA7 2B4FE9D9187A3135BB1ABA7E1E41EA2A9D51BECBF7378A51598E46CF94176F37 CAE7885F1216C10A12F917845EC9DB9C8EE5030112192253FFFF135E6B37FBD7 CB20AB6BFCBDD95D8B02CC2B628F3D4B17D67950DB422B9991D9B0F514204E89 1F9862EA39AFE6985574FE3D10CF8F148A9AB02FD8650C1423D8E5521F2A0B85 71BC8D7BCABA246D21C00D13A550B7BCBDF427241627984E3A342497E7F3B52F E06187848D2EA987E32FD1B86973ACD2D7254AB17E16E35A07D371B61E603E65 894EB234CE31E4E1EDBB3D43B58125E3366BCA54A438FED5D8581B503C61CE29 D9E6B4B81BD89C82D81A4D936FFF620E3BB1423F8788A42210226DE1644C9BAD 7239A2BF758CA4B8F4344C4BE254136B4788C69F6406DF653C413D21937CD152 86D83183B9DD8C9B884E41F00D60039B13D3294B0B8B551B158E7BE5B0C37466 2ACDDE57EC9BE7B468826CA85E6929017793AAAD6E5FE2F78C12CEA22D718CE0 1FF6BC4061E462A031D1B352091D665E4DEC21A7D8C37D28DE53B8F9266BE5A9 744E98A6031571587CB21665000BF75E24911F5C2EBCCE7E3FA5B5D5DCC62A3F 0AA508C86BE4A46D42971149127ED195BA7BEEFE3CD1F16767580AFCA5007F00 21CD90533EA8D9256871E65A72F0B0C5281E359F475C37750FBEA4A3FD8FA77A D87AA1C8A41D79607C221C7D567175FC38EFA1C0FB3C144FEEF7519CF9BF5247 445DEF9307E19B4D461BE69B5C4B308C68EEDE3EA718815D0EF875975DC48F82 4AC78517BCC82B3175FDBFE5601572EF0B6293A5B89349C04BF6057168E9819B DE1918268525017C1938D74B1A629F0B7BE164F33A2978D8E3E03A74D004406F 6657F8D958772240A23882856B3A7717EDF6B1FA5F907E9600C85CF64986B5FA 3055B0C94A5D78128BE06FED37D59F4BDF72B45F63529B37449C07CA9705E561 A6FC0BCE1672BC8C48F3EA9A6048DD2F3CC3F075B0B7E50DB361361FE8E73BA3 0275AD21C7A2980B7246224F5A2D3C89333E56CE76C522311FD375FC7AD2033F 2D9285202F821B68C8F362DAA73E95EE43B3C22A667ADB116066DD94CDB1098B 07E447909D05D145EB75E415892A6EBF8436E670627AAE1C114B8FD651C1CAC1 17D530C152D80402BAF2E18EBA5F3C7795791EC9AF0ECB0963B1F153C6C02A42 7722049FA470788598A4D255BDACE3283A2F0EFD2B9C3CD409612ABB68195084 4A2D7EFEF09E8BFF84975C42B70C9FBDCA46EF05D63ABC8E5D852F592B861691 E8233102AE3D36DDF37C0CE7E1BE83E85C4C6A162DA2E33481854F834B6B59A0 B173835F520CEFA14EBBEEF8D9B23133AE1DEC52C853CDCC32D2E46A3626C906 866351426C2C878C8E53B7D179F0B5BC6FDF61799ED6923CFEC478A105BECC5F 2B2B27499F3A9D74359208DAD44DB572C5584ED8F522D97EB86CFE2A7C85EF56 9E59A1644A3BAAD0E309994828BB7AE6FFEA9A224AF7E84A584D4E92B366DDBF 1BC80D772A54E8A574723CF7BC0309FF2559A8CF0CE17DB1C69DAA582A0B3DE9 3EBBE1ACEE7E3F02C710DEBE7846BBE68F768CCA1CA2955ACB920AC2148D6508 8240A0D359249AC736DDA8CBE99E464DDC900D8C6834CA46CE6245CAA48F706E F5E0CE23FADAE34F77D5C97BB8B12E1A19B84C731744CCCE075CDBDB1B83136F 694D1D3E9B9E4FA997CEBF4133E260320CB320BA1BBF92179FD9297AF6DD84F2 242E5799386F87F3CC7775D8C3F04CB4409F601194989E1BB476461E1E60BBC7 BA9EA06507227AED0D06A82963093BCA4C1B429673995D674C26EF07DC262EB0 F7F43A192BF67ACAEEBE8ACC22F8141C25283941CF5E84892C98E9BB533415CD B8510A811DCA2F62DBCDAB9DAC829031A958993D8B50E90DE4F8F7747039545F CAD20C1011CDE9BF50C04E85BBFB2BDEFA95F9A6D1992F646F8704713CC1DDEB E1B41B23F57484E2BFBB25875476CAE6CA114133657BF783E6371A60C581B59D 4FF71DA8CA45B9FB636799C51A61AF20439F7D504F1064DD207DB85CAAB14CD1 DC69C65FEA29E50049F03169BE05DE53990644932A3AC40C2E506A43B0CC29B3 1D47B69F942F11B279F0F086050DD5ED85D6C22AD506B0489D14E9F222650D3C B0E7278935442352EFF8CB6932DE5E5CF7E96EEC71739BD7EF5A037F07699339 4126BCE565F5D0FFA88D668C77B91E8DB3C4DEAC72A67C0AF91B70F6E284DD79 8F68EABF99400E7033797501C5D6C090BE545FE5AE0E085B9108CD31E51C76B4 F0660F00E9C85F460EF961F34BD48A1C9C0B880E14D8255C5A351A373F2AC4D3 B7E71799C96EDC42227C9AC70A77F05B5B542D87123ECD18F96BB6320F795DBC 818A64F480272B30BB0B8B4BEB76F99070AD3FCD952DCFA16F0A61A576875668 BCBE9F5FB0B562AA82C6A593E397BEAE8669DDECFEDFCB810F8A58EC96D18FEA 739A40C94D88EA4371FDCE0A56DC01B13D727EBDBFB590BF0C13C6E82244710E 5BC13A6F93833B6986029EEB068ADD9855B57AD6EC1257D6290858DF66F03172 D17C58D8112DDB96A25ED403ABCA9AAB3801FCD4071AC7BBEEDF334D4202C893 4F6702BA9CB59DC038B1030C8627458145EF9192BAB50C260652464074C00D89 97F6495915C84E4F1FAB2DFA6FC964D835311F9B2CFBB584C4640BC2D82ABB44 3263E66ACC2D3267F04971FFD5D3A388D9CA0020D1D561318B869042A2F1F39A FD3416E76200CC183074518DCF6CE18AE3A12FC670D18D95EFDCD4C3E3F4C875 4080D8657A576CBF20007BB97DC92E27B31CD018A33F3012A4424E00738F4D30 E65272B5AFD4743CE337175872947517DC6FC3E13B71F9CC4D5DAF555AB7B304 3010582D4E985B887BB5236CAF91E96FC59E4FF38E75A333DD0A628A807B2A81 C2A3835B976FC84ECD4F48A2AB3538B192FD54A8EA6379A5CC1075BAD0A2870A EEBE7DCBF494C0243965C300C31E8A5106238A783F5A881B423A2D4ADE5CAF42 9D1A7FCB274E4042B0672C2D0D1B3D647CF108084178BC6AF966DF3B3387F55E 42189D550A9F98A2C7CD199AFB668BAA82DCB81D368ECF45AF14D956C2F649A1 2689DE896236BAF20C47D5A8A8AE61847E04813B1E05B55F077AB6B255332E03 3F7710489664B88E9968D98E6ED0A517703D1812DC303EF830607C40591A1478 3766D56B34B2E3EFF7436828BE40A4903F79D2BBB113AFE2997D5312A050A011 680056FC2D709D1410C3D7A9C8572FBB64FFF7BF62C0BBF97AE7C6C4425839D7 8C6661D75DE9B9A06FE94562AAE8E1155FFD89A3979A18F9B735BD39CF6C8A51 B5B9591FD89AAF3970AD59395EB8B93F94FCA54C368F279D7B80503BE96282F8 F37ADCAD9776B1C452C6A48B267C55D6FD5CC993139296FB0F6F546C0728B93E E55841EEB6B4C0F6DDD3989E34B7167B7BDAFC3BBDC4BEB4824E4013519DA4BE 5E2B4CEB7E3C79FDEC749F5185B6507083A1BF03481A6AB419299DE2B624D67E D06D712EA4C9DD4E94FEC24D13590D49240C164A3E76AA2E6CB1408D3E586AF1 689FE77C7CDC3BFF58901BA55072982D0A9BF2B3A4C9DC7735097AA3F9AEBC36 A5E4BD0EF0CE56E44417199BFAAD73789D5046CF8120E78C3D9678FE7CD4CB5A 73AACA7FB0E6BCF99A39B95E5A7E4216CE77375AA2EC91B36CD40ED75DB6B348 5592D5BFDC37A921D19D1D2EA9AAA5A4228A5A685B7FA8A819D939156C717030 0F5B687CA6D2520935709696DF0697B3DBFBE485AE12D9D6F532F01DC89E12A6 06986AABE9CB6B62D93856334041F6CBE9BCB646242DF01887C4684940B05422 C8755ACB088820F6A557F5A1FB754881CF572232EB422CFDAB64DD664C0A3A33 A0A637DD401D22216C04644E4ED2AE11617AE7C912039281BDE1A7257D4C46D0 A7E236B601CFFEEEEA281DB322634FFDC1DB71EDF6EE1AC0426ED25F8B2BBC85 804150A29896E91746108960F795D629A608CD3CA2727402918722E5A9ABFFDB D8A9F87C8B38619F9DB7C19CFAA1650A640BE2D178BAE106E2FD595EE046816B B3B949C2EA8BFA4C6A15EC9F33F4BECC30B8C369BCC7E9F128DF6BCAE65394EE 8E99E45A901210A2FCA804BD47C3D4933E9253163A8F59BDCAC8CD5382FF29A5 2B684F2C0DE413FD2F6BE988403C5C250C4FEBD4AACDF7AD5EE6EF9294D6E526 DD281D03D3E0D0C641240A6C74D9BA33DC0D48427924A528DD88955B39DE0D16 C3265D29A6730B72C9BD9C55C0852444FA8A0C8998A0D65735748B33488DF27C 6E31FE4AD02278250A13368CC9A0B32E513BB053133FC74E99CE9938A071C7E0 C5258AC054475982BD7D6B37DB9FCEA4CCF12BFB073000B49D7A7718F8E03EA6 F3B4CBCDA3EA92548E74C08B96BC3CBA181F9180E9366374EFFF32158B35D548 8A759A6A64BA560E0506F7488AF43713820C4201D8B420A7437F6310AC2F71B9 015863E426EC3007B25AC0ABB8D19302A0F625231544F70BABF24444E6290532 483DC8E9D798D77A647E1CA933E7FF893EA475A40358003722E0ACCD583FF154 13EA1394E200E18C9FCF2AC725670B69DBF580FC7EE0FA17A3A95A4837017712 CA56AE3AAAFFA809474877CB74E5703B93021FAEC250138BFEEDDD52B200F809 3B2CA29EEE8AEB52EE344F2BF99C271C49EB6E52857C50B50BE0F9592551D121 13BBB87DE978BEBACA05C55D04A134D64C1923A47EC5D15B5B67BAED131DCA3D E7E368509FA4C00EF172505CF83282D850E89A40D42CB13EE9E91FE208CA7FE3 A1EA4CBBAF99694EC756A509BFF5BB68FA4AFBDBE7F8072794D6CDDFBB3333ED C153274B671CF5C1FF02D65B2818408E6847B4D511EFD51E2FC67A220C1DE247 09C7851851F53B9275A7E7E09879173045E4BEE56BBEC390669451E92F36D076 BB8261608FF56AC94E99FA1DC0829B22B2BCDD4A9713DE4DE7200CD9B5E64328 E0197B1311F314AC5DA464D8043BC75821F822EE9CC9DA9CB54E3C68E16DBB3C 083D3DED6B4AEE93D8B3859D5DAB5C35B9495C56BD21CC02464D310832E13810 B31917D6015253E21967D6838656BEF164C7450FEBE5B1725B46147BF777FF59 D185B6529B310C69D21A8BF8C75A2A50F6841E523C8086BD8BF55601185D82DB 98442DEF79508F6D9966BD545C3A186DA760245200F2BA8FAAEB10DFEEF674B7 09450FDBD2F581BED13227C1495232987F811CBBD7280CDF4B9720343B57F7EC BFF59960C7219B9F6F31D4EB8AE7C0B00B1C24523A282235062FF10632B01D06 AB5C530F1B8BAAD69198B55A64B65089A1A9BA899676E9958A6D5B53006B93FC 7F92EF0EA33D31E6FE624124953E9D82FBE6604CD465E088D37370ED26D3C63C C52E7B8F476C68C526C47191B97857807B0A04879AD01191C778EDF12182BD4F E7F75ACFFBA4BFCA1D179AC05D5E50D2C41AFD9A8CBCC948779F13003838E47B 7FE2D7A726551BD7CD41E3EC91B501007CE9CD807668DA29F8614799DF092A4B 6B5599EF8F77642F10D6077FB3AD1A7C113AACC65297D7B30828BE2E66E82AF0 3252B24262EF8861EB1772FE5156F8549A8FE9C3BD4967C000B264511F5837BE 186F49929D4789 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSLTT10 %!PS-AdobeFont-1.0: CMSLTT10 003.002 %%Title: CMSLTT10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSLTT10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSLTT10 known{/CMSLTT10 findfont dup/UniqueID known{dup /UniqueID get 5000800 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSLTT10 def /FontBBox {-20 -233 617 696 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSLTT10.) readonly def /FullName (CMSLTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 40 /parenleft put dup 41 /parenright put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE33C33655F6FF751F340A8D6C01E3 2E02C24E186BA91B34A1F538959D4450CB683EAE5B034D030186901B458D3777 6B3942BD2E07121385120248891AEC2EB33C4E3A0CF00828D0F130C31A918C18 979FE94379C648EF21ABF659253E43CD1253866F157F1DF85AE7E8714F061B1E ABA3AD094FE8D6293916FA82EE4F486C7E513A06D4C9BE44306A8287970B4ABF B6D1F9274A5A0BB6ECF713ADBD1260D5D6C4420D357FD486470A74B2F0621B59 A9373ABECDBF32FA68AABB66FAB0C970A3354A335FEDDA1C288245E6C890B8DA 3D0EB953283ABFE372221EEB1586B0167F634E3F29CADCAB484B81A243CE1E3F D5106AD6BDB1AEC91123377F816711CB9D5140120FEA84B8205B79D1569509FC 6B671211985CEF51691C45A168740BD826464B2CB0ABC575E7D453161328F80F 3AF1C99EC219010EC6C95E0A8D1909719CF18BE424967E90DF67537220E60C3C 4345B154D08F9EA684710E659DFFB0BA1B7FDDCD519305900A5E1CDA219A6C90 DF8BD712A3686DAB90344E8784C7A9AF3318550285039B701B9FA1D3A3C3B6C2 753F1E794A3463A173C99A9EC0E2AB5737134CEC2C97CD6A37E38692ADB4B131 54697B7BBBB23680C72CE96066D8007B90AF0FC5958232AB4F21826691E9874D 107F47DAC1026298D787989BD77CB43A09FC95F6997DB00D8483AE9C2716CBD3 7CDF02DA34FDA2F0754ED0968270E118DDD8BAAAA65C41D699E2BCC2556AA231 328187D2F50FD518CF458B0BA1F7DBAF4B231CFD61D5DC56335B53C3013BCCC9 85690E19E992ACE55EEF2BA7A75DEE6DC33933C226FC1494269B7CA4CBAE987C 2C787386400172AE3F44AE47115F4117EED866713BDDCA4A7AF658C49F913CB7 308635000043F63BA210410A66E192289592882C477B2EEA0B2A339F0E7CF450 CA0EF79D3A6C28598825CA03FD688DA60C95EF707C6E67CB7E57DE7A80545195 739ACBDF27069F34C9E0216C3D17CFE7A652B910FCC9B9AECC2E646809C22D93 FAFAD465DE794755AFF5BEC17160C9563B5C51D07022E2D3A256FB5CACE131D6 F4B30F591A0419D957D8F0DCAA0A8D65A8D83422AD7C2613FF13A302E152B312 3F1ABB45E42084EAC894FE335C07324849C9736D00C872C4551997DB889AF17A A52C5AA77DEB548B0103B77F65717F70B90C1BBAEA7BCB4959F32851A9882A3F 55673F24103D6BF7FB3AD3EC3CC50FD8FBB4A6B13C3D278174320713A7B327CC A71F01E50840B33D0FC3F5F6A6F2B0F2D0E38494B1C73096A430510F927235FB 69E931DA8CE5415EE88D0248565E3347353621A48F7948AC9EAB5F5057541B50 82BA955D90BBC82E582FD71904445A59186022FB928015235B60830DA59813D0 8DA3FC306C43FF8BB2CB6772B1F7BA3C1AA4B2343E7DA7E065EA53A4E5E28DC8 0790F2D5CFB203CB135A08DCC9702B59A63290444F202756E55B9FB053F773D6 0F69C63E74DE593E49186FF4304E8FA76C3E3006358DE549E946DB69431981E8 1261C9C9A884E4EC708F69E6AF5D22C5BAC49F2AE85903E3D48D03B7B97054F1 D2937A0C685D912D6D20A75A77712164DCBF8FE4D5460DACE139C5A934EEA09F B94DBF168A4BC03A9D689936D833018FF43837DF9519AD10F357F00BC068E737 170FC9FC6715165F733A0B6FADB9ABB48B845167DBE6D771C916577FC2132863 767DC6E3D460E779254194AA690983184D934F5E858C1176B3862B69B42EBE7D EC9AC4E020085D474093F7694C8A8C2025D4B0163E29320C384D62A9F3FBCB1F AB5A374EF3DBA48AC2147A207AEFE8B78BECEBC55C97B538F3A0FF4589D171E3 826342C8A5186224FEE54E4C6AD5EB02BCB4088B132FA1A48362824BEF161235 8E661DCFDFD8429C65CCEF63902D0E07C2FEC1DC2756D942F13FECCB7E8A8048 345338F24B7808E46A04A915C111F939E2669A12FAC0BA4F74B832EAC83EABEE 67E2817C058E69C2010F2572FDD15194CD8DF0FE9F827D349C0444A18D1A86FD 802BC120A5114FA3523C221242C7E767B0AAF6AD15DA1561CE8EB18A2401D71E 20481FA5F1E247CB5288F47795A6A3A3BB186E89EAAC4A54AC91405427136127 5B151203426830F7CADABDB3FF63B40CA29CF8E667E71615869978E99E6F3F07 0170EACDE3DC62DC05681D7680E2E96C30002AE34A4E5EAEDF88577601A82C36 22D625A03B0451D7BBAAAE0C396711500E94A482EA787495073F16A76D1657DC 4EA7C7B83BC30CE7F145B65B6E2ADC207D192CE3B5FEF7031F4BD64F57E1BEFF CCFFE06F1E4ECA48B442DF413766A70DA626359183A9B24C70419487423C816B 4BCB067E661E47E172563090D6328BD738D2B0FE41A0C1D7A47576A79BAFC880 0473229D134F998909898301CEF50A82B627A9A06DF59D0B9C530EC5D877F1E5 220D3A1ABD2ACBFDF1933F92B3137B22B9F95A961D93B729307749A50D8A6403 7AD0F9C40743E39B8D198CFCF7C033D99440D46D821D97545B930EF92E7AE005 27F2FC766FDD4790FD1913C7A13328E73E587618ABD9008022C5C6C23935CEFE B5ECA2CEBA1D25DD846B48423F7186E03B1F61C8F1D5AC95CE03C83B2F221300 7A761D6CB5F7F9251D3F9A7F4B25B99EE7A1347ED3059A811A82A35A033E9B07 A4FB2A95009576F48665605C478E5F6C1B135016FEB4AE6A6BE4B4359836E04D 45AA11366992162973FB6266547C2E570B8F56F6D992D2C0F63950A16839FE10 F56E59D93A37573E3268C5892C9F3358753D1FAD6379E82BE740FA17236E96F7 C53A2FF785FAB86AD17EB1DE8A6AA9C69B91C9D9B43B5188E51F6939FEC21B65 AF17DCE95DD3BA4F1DD51F0BD5E5869A1ECA7398B6E664EB0D189181E9C23012 DC1E54C146842A90909DBEC03B79B58909205F2CB2A7F83C66B437D7F7DB9781 FF0C67F004E979C95B706D8D85255CCD827CF6196D847DB380B56980109E96CA 997157BE78A4F758CE59D78158A854EF2C20099438F74777D3B0298D45BA86D4 3C0AC30C984718FD62ABA0567AF0A70C1DD41953E3E7212D5C562085177E650A 2ACD49940551E3F7619B4CC31DBF67AC15D938619B95DBF66E6D1300B1BB8605 31C4011379FB5388CA49E4A9BD6C921560CB8D513F8716A0733D2A7D77E62D22 A69B54E9048CA168D210816E613CF6357706EF6B118A1263B858B7E19AA98891 43BD675B06C893579957BAB97199ACB82C080593ECB8B66A7334779CC16E4D0D 4AF365CA6AF9727AE29417B61A5FD52452873B1D666044F8E7C1F6C6AA3397B5 94A5780F4005FB5E41698FADD1594B505A58253D68D2AE3320E22165D198050E 425820CC0A43FF1D61F168D87CDD30C14D387610B6CDB63BAA39B3EC9B3CA616 FF1CC679227749DED3DDEA26B4D97C633090DCB8D8A6E5E07E3579E4A99BF1D5 51E43D1D7F139C9CB1D76D8F693A3F23A74EFBE79F01E0B850BC6B6C7F62C2E9 859469A144853434895D73DA6BD2B348A48BA80E79327ABD96539F2EA2209852 E1BF6B0B819D7C68A9A1D0F6F39416E3EC4AC21DCD3C51D3B5B8D417EFAE165F 2A7E0B76E558AC9F685A76FEC7E3C73CD607D9025DE6113BE5D0401887A53910 82A813B026A502B51D484797D9D7E79A25B6624940AEDB4A15F2C73CA1AF60FA 22D15BFBF268EB044FAE17822511AC6580D1D74DBA3C3335217780B29FEE792D 200B00B8CD888A8BFF15D938FC758BB5CD9B3E08E1AC6CD1669E663BE86711A5 892684DFCAF70C11E803164994BDAD89128AAD6461D4558AC2ECA3E05EB56D32 0290AB16A6DF7133DDCBDEAE89C6CD83552792E23CBF567D57E46548EEB0A140 437492B53C14419B6FE7E64AC23923A9E85F56A9DF209DC4E6BCAF1E045F9CA3 BB904BFA150F4083C18B0CB5580450CDB657EA768E71222C71DA911A722AB9D9 E18B6847F417125C40EA8A0CA1F551A4548712D098209C78DF9C3F78605E5402 DA2DBE2218E49B819296D5AC88D17DDBA982E171733D1E9E295B3157C9B90BF1 CE68CB185947D1E3D7544155B741296D14B064BEFD3E6AF25C74006CF6800551 80FCAAEE6FC9105E1674EDFE68C45617D8D3E2264CD395EE94EDD017EB85884F FDF530EDF4F3F14750CA066F149E688FAF8EF4B5FE6AB515CD298E8D170346CA 9B32BAD1D86DC147BD12EBEDF6CE1E749C5B48314F512470A568C172C35CFA41 031E34586A89404CB5372D7B2C7A6D96F420D4D7C2D4C08184F4AF86B4536A90 9367598424112A7B05D7107B23695CBCD569002290599E0FF4EC5C852C31F5F3 9BD56BB840DC17DEEA579E7A7A9F764788D4E3774BD523D21267869224D68891 4523070E80A123B58F7B579866332FC38A41A5915EC06F2D14FBE4A6CAF59AEB 57E98D661637EBB885AA5D74AD429CCFF64E5149815E7350118E6385F4C74E0B 2EB474A6DED021D429F01C9B0634A09250C40E22B3BFE1B7246D18116D585F39 0E06E9B5F27A6CB77C8E9462189CB900CFEF08F798CAE15FBD94587F33816EE9 03FB2DA6826EB69D8C284AB9F7B00630D0420EB6E35E0E288BA25F5C2345C067 22412633898AF99C2FB232D1469025BF262B567F29A05F4816FE8EEF5F02BD79 06202F6A1E3E5D4B3C91BA8D5FF53D5136BF70E5FAEF441A7310CA83721711FC 39EE48BFB2FF287234B1A6102AF146B10A632A53AF97E11FFAC3A2A86BBAE3BD E0459ECF0305366078066F2CC628A3918E775E4236651B3D817AF1684B07A163 A0142D16F55D2FB5F2255A8813B8E54EF3E801E95A4A226AB8C0476AC5EDCAD6 9258ACB6F7C0CBDD298A0B816560622A1871FBE2FAEBFE697A8216A0D8FE30C6 B1BA6C3E975F78182743842E7F851064037394142AC91B2530FB1D511EB20F3F 79EDD8B7E1579D35F6E7B2883C47A46B6C1A458BECD6BE58AAFD834A7D82A553 2FE4E66878E4699856DEDE964F454638F768AEDB595A883E380408F558015FB5 8720954ECE2704AFAD4D62E8BB2657C4FA920D72248B3F762B2F12D125B796AA 1C4BD6B42D766EC1C9B2C7AA4B6A3474BF753742DE8AB76D0AB0DD9A20EE2DCA 0F34CB25995ED3183759CA83ABC32B8BDF0B06EF169252587971F7D37463BFA2 BE36B2E45559DD73DE7CBE29DE92B9BE6B9F8093F934BA311D81E18A8DA92FC3 312E3FAB43C53E803975981F0076EBB8F257C123908450661B6FA79E7ECE98F3 B0A94E0DE3A4DCC8E0FEC106CDEDAA297A75BF1E40F3C2419BF72A644F452E2F 9A8793810319885EB3AB23B1E80E8B62A889311355C73722C18E62711A7E6A16 A5B923408444B13F6522FECA9A60B067EE332B83E1A69CD835C9D69B5D8859D6 91F9276863D2E2E8193641E4239F4ED15E2C482C735BF5434BAA454EC2830C1F 7CF766DAC9E924F17F03093132627673BA3D99DC2DBFC89E5BA032C16D3C1C8D 78B3C464081044DB53C7A29E925F4157EEEE928C8E28EDA5F0A4BB6E0042D8AC 7595C350645118172D04FBF06B2C9A9F3603A54B57999E2960C993724CCD6A09 766BDF73F66E07FCA9BD09079CE8010E6CFECBE2E5DE1EA4E280AB78D5184C11 016385007CB5AC0BC95955A1E88EA1A1D8EFEA886007708BA063F556D9284D4D C764E75CECA51BEE3D35DFCEBF6175953D30FDAC00F23B1721A1DD577945B5E3 8176A21A649D907B5F63C71718ECF32ECCF1B26BF15AF694F1045CF98FC75278 E9782ACD3D83CBDBEE690D29B3176E745AAE436382D258CB22F3DEDD02E441FC 6A9931AC2F61156DE258DAAD5EDAD41E6C0DFC902173168BB4F51DFA7EA615C8 B0F92FDB118378CBAC3D56B6B9BB0883C0C14EAA67396AAA7987222A132B7959 44FC1E9D6DB6D549DFBEF8D2DD8C53DD3B66935FC239E74E2C440CCA13C068EB C4A3B69F499F573D076E2C92E24F2C69B806591B0807CD903E078683854963EE 5125C3640860CEF37BE186DB781475554BFE6C528A9633AD5772BD53244E24AB 42CA2D1123AF45FA257940CE611D83014DF04E60220E9AF27CB2A2247BBB004A F5722A5EF058FDC7DC2B6ED1406649DBAA58DF2ED3A91483D60F11C4A39BAF57 CB1E320A987B790672CDD3E3BEF4A67032244DED2FF4588B2072CDABFEB36009 9F4BCBEE16F811A44CEC77F8AE873C90C0F4C975E51014ECBD45A56A63F034C2 82212977023A132E5C88AAA826D841FDE9CBCE7A01E4B6F0EBDDB9A69EFEBD72 0B41EDA807CEDB791084047624BC11CE10B7A0A311272EFC9E013FA374D97EA5 F7998FD908748CA72D8CABFD0F01220C2114D3B462B22FB71A23B284B1CBC7D9 EA20BE71F8ACCED21F096009A14A7C7B51450BA51514707EB46B9FAAB31CFBEA E1DDA6F5D9AF0B6E7D05A1EEEEECD606427B0F2363D1B882B50140466B9D3CBD D00DB06DDD1BD4681E367DAA4B7C405C6281B67FFF794041738FC6A01D261CDD F6E0A330985F2CA782CBCC02B6F4EE5993434F656B91A51CC03B1D73FFA6629F 14F6075EBFD83B702D8844A96CFB5C14051595BC7DB2218156A6DEDA5C98CAD8 BEB5284D9D9F86406A8C1AE85857185991C360E5F44DEF352A1F301207BE94C2 9A3A11BA468FACB3FA2D683419C44EFDD7C8F1079659F3ABD89D7F168B1591E5 6105F9B3FA481BA953CD34CCFE73E427D3AFC46E5C58C2981198BA284DB8B37A 6647BEAA561799877DD6858FCA71CA6003F2961FAA529906673EA94D82D78116 4DAC81011FD175DA707C1E15D4B6FF19F8720A4E05E6E103E2DE880FA9C192BE C5ABE7C311C2ECCBCE8F9713DBA74AEC37A61C8F21F271B35F0F7C88B182525B A4183377597ACDA9A6E2F181725D427795B975BC4168A408D292CAA484BD1B8C 9DC62E737ABC805C8FCB7E96454DA032B601345570EAE0379BDA84BB6D15D780 42FA1E068A7D62F152B43B788513E13724666FAB4E2B4F04B0448194E46582CE 7389BAF0D1DD4435BAA6B82AC305C04686B89FD51197C721D941BD2893596024 1598E6C2BD84527EDA6FAB782033E4BB4F964FBACD96CAEC3F3CF89CBABF6B4D 4D3AD14A03D4BE931632BB03BC2B92842FAD51A19A756892D5B978DB695D0540 CC9D030C612E2B201D60D09F56332DD0BA1351EE62816C21A35C33DC11B37BE4 D2F164ACD836A5CA1553CBC733E3B159860454B17064B4E22D3764FF6293BC81 CFA3B2325C8E072857F6FF4ADAA8818247D431A28D3C5FDFBFB24A6CAA327AC1 0B3630C84ED9F0D33B8255A3CAA9C5A0C79F7BF6BA3B9801C3BD0B30AEF7CCA9 92F25E332EA97A7CC653C93D1497992D6B76363885B92ADE34C2A33E30A3B1A0 57E9C16D8CEC189565808D3FAC92973C71CDE74DE9D8781CCAF88747758014C4 5B62667D4D2CC5EBEBE77C5AD00C6A69D1819F5A786964501E077EB3BBEA52A4 57729AEDF35253F7E1D31F2DD1587BC15CCFC1B0CA930DA83E2031B099A38158 8D1849E7145AC74777A3C7136DEABB0C787E5A218309A65EC7D128147EDE3AE0 C0AC039B56F767A22555CFCC12DCBC7F5A5A3B4E86EF5A69EEA93DF0BAF2A3F3 7504F5C6A7A67388D2F9045BD755BEB7DFBC2EED679497EBEC808BE20FDCB5C7 B586463BBB898DECCCF7249E9047DA943FAF0718A2050FCFDF8A4C2029FBA674 EA64003AC03A847185936FC375CC67B3006EA681F61F640C3640A78D0C7FF521 D477981E23E5956BAF42252463FDBEC49BB560A9428D248B0C5250CFA2A49CD9 DBCEF73123C13BA382D3CF6A7B8A8CA3191D379A659F0E2C6E9CAFE9DA2AC074 F622E397A2F7C73347364AE249B11AE2C34AA7F0D27B5F35D548D5AD1228597D D16A478C901D3A34D870BA39F770885B7DE62298F0114752435050E99EA4E5E0 56B965EA185E8DF96B9FE97EE23DD45AADBFE02B427222B9FC99DA94FB2648B8 46BD30F881BAD3820DCA4D8093BA0FE70E03482CC063B751439125623FA7AE40 52DB2A380D89D5E37BF264CC73DA9A1540031587F481A0F146C6ED6F3F2957FA 19477F075ACF608CD94CE466C1FC3EDAEA3ED25C96FE89A7CBFE528A33C4E84D 465FE6FB031B48D904C5120D428D6B51F3232847CB0B7521E5CEA887FFC56F02 0882B3BB7F5B0B954E7078DE3E31D8AE65F9EA55F4C169DB7C35DB9645617AFE 078E03BF9A1BCE4E489AC9495A1E6CC7D1FFDCC03CEC1A32490186FE8B53B09B DBA7F0E23C8F5E5270D039B409D504203A458EEF12C035039A8AA12C719C0339 F766BE6275511D585F82E9D4AC9B5424312755C4B74383FD094BBB24817D6291 4663BAB0C9AF29F46951712C354B1EB67CF3FFF6DB1FD83F056774CC7F2283B2 49B075479604C9B3041E12DE774C78A0BAF5E980BB2F48FACC5C5887AB343376 2E25129FC0592682151714AFE84107E4D3E2C5A25B70D5D07B4E19220921EE7D 2A520E12F9780A7F601BDCF84562F771F0A7E180A21EE514C8EEABCADB02719E 2C02FCAD1C7215079C80E34AF3EA0D87E37A9AA16CD1BBD2CDBA09846F9CE4D4 62A486FFC090BDD0858DE33DA0674FC370E766B0B33871B0F16C864650F2DBFF 5B71E1041E49348F91E20FD314A7896E9BB0279B7448F931EF9CAE9B51592A14 3E8D5A1561AA72918BAC98346426AEECE163C1ABCAF9EE0F3A0187E5FBAF0647 74D1FEEA16C776858282538BEDD421404F60E5837988EBD3318CA33C66A359FE 71686AE812AA5E44E49C62D17965C82E73B743B6838392F629F419BB3E10009E A85A34BB943118C52BFAA7660096EAB8417CE8AB8CD2AAB549A0A7DF3E9E987D B0831FFFF5778B4F449A6B7814B4A07C65F457289DE2B8BB0BBF430BFC23B0AB 176908CCFF613C92E86038726F75673A8D00D12E4DA6AECD4A849017F07E0E17 C61358AA583C4713E3863E58FF82366B8C01C988FD13E33323F9691C01824002 68051C46AAA52E1616B8C711600D78AFA99EA878B748F94D5A6B1CFA4269195F B2C7423A5ACF04A3986138D6B7D7314DB54AFCA00E030EBD0D0D989F81D95255 E5904E11B9192ECAE7EFAD77B22691E50542ED4BEF14093682C891840F56869E D3C72D24D2A083035A9164203FBB017C8E14AEF625BBE5FFE812C8BC170ED15B D79534EBBAAD031765A5E6E94C523CBBCC5B553C7D61372851EE7FE6EBAA51E7 FDC0660330EB81BF9A5D3287488BEE9497C405A2622C0197D23D0783B50139A5 CE481AF237B115B3F976D9B912F3445D61EAADB027A5C0D6B6E96B9AF5408DB9 F22DF80258309A0E1A1D5A3EE694DE6890B7A1AF779892BFA076AACB4DA18EFA 6258C89FEED941DE1873B05BACE2F48A170C82B29DCB0BE3B497473473E7C8C0 C08438EC3B5FEDE6A23BB1C17A38DD8EC0936C886B35703A915273152A124491 BBB2FC3D9B59C27C7D5DD6761D2B49A02851125098928AAF3B65BD4892EFD98A DE592FD0CD02D62032640B756EEE5E7D6588DF90E233EDD635DC771C8F2D6E35 10427E7911804920DFC6ACEC050E8E2E409FD1491EACC62B2975722E12EC904F 07D13A2974F9E739C9D464E7CBC91CBAAA3C4B530D33DCC631E528CD5FC8C5C5 1E6FD0558E77F3B33F5B42E4DBFD0C294C52CD44538D35406153A72117E42A63 8E653501FA32BEB4EFFD872DF5CF580C7C25A93727426B69036A37E9E0164CF4 906D496D8BDD273D7FFB63EF4BF7E57C56802D8CE42A0144A6097FF479585B0C 37198DAF97A58B4B67AD441ADC84B195B7E0F280A2FBAED1F4B9389BC1F7D749 B9202B0558C20A4E83E11A9AE75603B5A6F7D6A6F6F592177B7C92082A2E20B8 503BFD8296CC3AC5D7AB5C1712CF0E88137A066E99F930D696000092E6211B5C 5F6C24D1D94CE6298742D0CB13AABFDE03DEB274D4F77ECC9D88DFC3250ACCC1 3525A05C05E508503B8401A15F0D20444A9B94338BC81261311760979ADF7A7A C384AB22B4C3B86FD8B9EB028B6E93256D758B4F9BFE59AE043531A549F62B8F 7662A1EF17E57F47CA429EC5D3134CA7A6F2AA2FF61E799FA059B619BB19682E 0AE7705026F05F4E6CA42CCF96F6C12FB545CC42B181B027F786D77AC9F255C6 05D46A7BA00FD80AE9126BF80E1E3063C821FF37E3183A0ECC0D5E6C732D37FA 414C402C3CF3ADC3A1BF066358533EC14931A229BD7B81E501AA08E66EAA2AF8 5F8EF4CA7FE478CC9F5DD643137870C774CFFF91551B1EB48073D3144B634BC1 B973AD51B8F382E8A9B0CD99A7DAD7FD2206EDB5561CF2C33402CCF4A74F9F51 029F1BCB221B3D4931AF93E66B4A33232E92A565F16975F3036BDBE2DAAAED3C 32E59C074684BB340FC413E6389DF4B5FBEC6AC7F6F02A25ED8022F6311EC2C5 34AA5CA6E436AE468754CE4B475AB270DA9119BBDC2AD70D98E879CDCCD96E41 FD6722AA207A5394BCEAD598A26DD15DFECEAA15ADF5DED652E673FF9FCC1CE6 2D8AD0C88BD87ED2F662860502EC2D742A47ADB049DEB714141A10B4A424C31A FC91F766DAC0662C82CA7EF65D96C09F6CD6386ED8470387B8307D41BAC7D604 11A4058DDB8A859664FE08854BC75F6E30CEA3F19125A9B3FD677AE95A24F31B 69D00DB0BCD6F997312DE90862533CC11C8E0E19DA68890362C7F1A0B83F9B90 2C9D0C19A6BF64878AE98E05AAACCA125702C82BE9262156F6ED7727C705AA9C 52DC4D5491E424D4F1F9A13ECB72FC1EBF998533231FECAC66F998AB8183CB50 F01CAF47ADA5AABA636DDFB86A6693CC2CB628186A74F2C4D8C145D6B8030251 E9C13E04524FAD32571737B844BCD9DD8ED0292BEAF2D6CC70CBFC3E8A2B4492 10218BCFA0C0F4B1EAC0F1B1D30322CD8A2BD43C490AE3AFD35FA6FECB5B06F2 F904ACDE8BD6D97A67F4C025C9AB39D9EC45F00310CFE84DBDDEC4F8825BC54E A5B18471ACB93D20CCDF07FEA76DD1580F307A688179C08887311188B38D71B1 0F60F81EF9A2626E4BEDF23BF393BEF89AB9A7184191D0AE11C63D05A35C63BA 03E2B6A7B71B176F8CED2DF4386961CB087E9E5C01682586A31AA32C49688252 0611165AAFB00329557BEEC400B00AD07EF04BC71EB4330EF66E2D37DC0511F1 800B44AB01187EDE19C3B6A6191ECB1A52EA8DFD7FF3E1EE73D27E826107CCED 79726BC08471F9134DB60FEAB01AE14D83B9CAC23FFE8C57A8161FD245CEA44E F2EF7FA3E27DE92201ABA25E300D700167D992168D3A5C1E31B037F45CBA4764 A02A8475FBB8CD06BE17255F439C05582E54481BBABE7D64F00AFC61F5DC3F2E D1A0307EF7838E5FF1933D342978B46FFF1CBEA88B3233AC36555DDF80AD82BD 3AFA30A393521ADB30064563AD48421D04FF148533671989C8C1D503510BB918 81A2E9134E43358A1B71FF2A443F9FFA003E8339027D9B2B6357759929964D0D 17B4588264A56BA25EC9F36130C62FB8ACC8EA6123C0C4634286BADBEF2EE6EF 93CB7C21E5210825732E78A6B2332E7694933125B5BBF7317486CAD235B08356 D58CB54B962C93BFB237E3C235DB0C3371A4DFE21F0C27F91F6AA63A452E49C8 173DA61E87DDDB9BE4D3FD7BC6DEB5AABB14350213C795B3AC7BA4388362D3B7 E946719B75C763CDF9F4CAE68117BB1D0B81B6B95A1E0AD09C0FCA9D5517C995 ECC749C85F3CBDB012B09034D778ABB671718D5B134B3A255C4298315F79EEC9 865CF5415E39B5118FCF7182903CAF98DD9AC41858ED8DF6104D82149CB4D7CF F8C154CBC1971768F96CB0BD183C04475BFB798D8EC283BA742771D8A0E3443E 82C742F0FEB08C2B914C782C94BBBB63F8FC4CEB1E6692EA93C6A157B942D7D4 299D29E81E11A6C7A5DC756D8775479E0D0CB3E39C2BF9AE1F9738DD8C17AB15 A23BFDCC86873EE3179028A4570CB59F5C6CF5452A239BA63B838E113EE75357 7DA848EC08EFE3166A844EEE7C83A1329D35930AAA74A477AF4695E5CFD2FEBE B5AD12FBF6CCA169E6F802084FE74F8F90632627265547DBEED60B5225389366 8EAABB36D27819A1EAA9539A45B7A8524277FF23AE763FDB9A1558D62F806BBB 678DA9331060C5709110BB5818CC2182047E5593D1EEEF80F2A5CA977018A32D 2CB62DDA2B1637180BD2648252DE53675BF15540DD278DF093BD63C603A41F4A 772F81340013C069C035B333F6026DF1C92A63A2019A8C2856E43FE6E50B8CC1 B7818C5E3E1B30FE57A5C818B33711296A24180EE392D4AF1BBB1467E58B4140 0F244F1C151973EB4A1FD1AED6FD8DBBB228AC1DF16CEA30979563540CC2DE84 CF1FF63FDA296162143BF74C7A33CF80058E710FDDB60679CF276DDEC28197F7 6228C3C469CE1FF71799BE49809D434287E8542A527AFBD761711ABDFBBE445A B42C5D79346C808DB4F1ED74605554DE554501C6D1E325C4F1739B46C286738A 9C55426D37A1F5B809127EBBD1FC2AE924E798DBF59BC02EDDD1860C40F453EB DE2E785815105A03FD23C3DB2DDD7989D5EC50E677DECE6D88930A83ED601551 9DF45E1A532BFF946D215600B890886B522C01440C59FA25C92E812AAC1475A7 5FBD2B973EAE58773D11C6D2F0061185DB715BF581BA9141457DB63BA3E1F1E2 38A338EDF19705E7089BDD9C1EAE6D72382DB213D33005A5C931F70558479FD5 C6BCE1FD085A24B3CCBE619DB51AA73442AEAD2D068CA51DEE0B004FA521BDEA 3F99F65AAEE9A2A75EAFFAF6283A59F68B924FEB9B1A5F4E6A04484002BA620F 87C1CB22CFABB044C51759F4720388DDD17EE42F9B0F29500C3F1213D07494EF 2EFE0CC7B5D4FE2721615F87CE994A8D338D2BB3A8509A4B7F170A66517DEBE5 788AB2BA6A6F9CCDDB6E214055BEAC804920F8DB32E64D40BBEAAC3063B008A2 D0EBDEA498D534F3622D13F1CFE37B99C663C9F7B80A95F78069E0592B6D7099 EA1A2596566365F2FE9CFCA54934F663AE3CE5BF9060B5BEB0C21A4694A3100D E525529F35332D9A06DCEBF2C9372D34C02006FBE71CA80B0B1E6E39556D32C8 1C309C72BFD7F5356D485A5C3BD36DBE762F32986495E58EFBBA1BBC1819AD50 A5F542E67A2FE7497849077D8249CB81D3E1A1CFDBF0809350606633E4F9BC6C 3ECDCE5662D75AAD25F028260DAE6732A23918FBD1A23E9340E954BC78F46710 22A7B62FBC3AC143DCACDB8FD64E2A3C16FD8DD31928CA63DCF949F1952BBF3E BD7D414BF011B4D6350ED78591A059B9D1F7ABB5D74E4DCE808144CEB9FBD47C E38417D829CFCDBF1C38286F71699F548DA1F69856171F703F62AA289FEB3BFD FF6FBBDAD0D164B01B9D29A5369AAA674400752E6C30D3712B5D13DE2833CDBD D2371EA136A5EFD1F6F3733BFE459345EBA25D61FA727907DE4A92D0A8166127 D4DEF02080AA107B30883AF1FCD7CE50A2C2BBF53E99DF0CB9C7A55EA5873B72 08201B751A6F7D22C6B928E2A123E4B5BF7264F91DEBB1A8D156DF602DD4F8E1 B48A32DAD90312E76BC8341B99BDE127392D51DF3825A2BB2819A043D2AB5F01 8FD0F7124B3955A77C1346083A05C277E7F25978DFC11DB3335F78E01810CB95 6DE4D804205E569B2DE75424423486CE9F48A43A877149C76734FAA33109C3E1 6C444978E252A5B28973C494C1B4AC0FF652204B8431EAE62A4C01BB6E76219F 47A58785503068DA3437E97B22C0449982FC8379CA70EEB395CDF05687529723 666C697BB0F6F4056AFD 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMB10 %!PS-AdobeFont-1.0: CMB10 003.002 %%Title: CMB10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMB10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMB10 known{/CMB10 findfont dup/UniqueID known{dup /UniqueID get 5000761 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMB10 def /FontBBox {-62 -250 1011 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMB10.) readonly def /FullName (CMB10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Bold) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 46 /period put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2D432E1428FB6D5BDAF 3F02C975AA4E0072BE5F8CC7D3D59BA3FD04709FC9E52189F55C7747056EDBF5 F85CCBDB1DDE9F9163AC7158EE8DBFBE8D94A46510118ECE6A280C4872F448F2 E6A6B36AE3224FA448DAF204D1C998D010C6BF52DDCC45831DF1EC22528B00C7 70525CAC9F6BAD892E7D5C81295A2AEFA8A5E4B6BA2C4EF61FD3FECFA2A8551B DC84DAC597222341E762620D3D3C1A4AFF2F6D68C4813004318FDBBDE23AE224 617F7BC1F3846943E915624D6BBFC555E2EDD013F190492F03CB64E5F2403723 7A2D4652BFFAD1FAA1DBA4538F2C3E608367BF95E09B853A2BBF9930D9B3BE46 0BFBEF05DA75DF3D8E11A09D472A9E45C626428A1A599C111ADDEC7A4E70407A 014F792395A2A12303EF51698D487854EA15000AB08BCCA8B2E35A5018F5460C 9B223315D7B838BFEB224E8D1DC9A0C1077DA31F5FCE0D9D499EB0507B90E9A0 1F92FB5FBB8D40568C1E8B8CD6E1DD27CAE6E107AEAC5696CFEB19091B40FD77 7A4B4F0F261702BFF5E2320C62EB5C6E9DDE142E9FC7DEAB99D90297AE0F15A7 04C0E3B39FBC85CB6B92BDA7917698230B5374D9159807ED1D07947D95802693 A856C84812ABD3EBA336B88CC8F37288CAB59790B0882A4ED6815FF6D7A1BB35 5C7B7437D2ED76E806813478007886ED1009A1E73CCE210FFA69A20D6E05A713 F6EFAB133D146B0EBD547CD29FFE7870973C1E71854C1C643BADC69974BE360A 4CF84FAB098EA3DCD2DD8B2FAAD19429B0ACC7C312B03E6446F1C1D51E6AB45F 72F11FFA078DF3196EA970B24B1BE607571795A2FDC2EE7194E9422C483799EE 23E16A737951BB935EE2C2BF008B6190E0138D551E75C9E6D0EA48E64E9750C4 BAAE32B894BE25D092CFAE894230430E43C585D0F06636C8D56BB80A4597A0AA 547FBCF12821C20F0E62369E1A9CD2343B8A8647B2FBB1F4C86CAB1F7A14669B 69DC857F9BC7538A864E523C2DF7C830315E0907CB17C8FB6E412A2A9E88317C 0026A6A402B36BDC433015AEBAD775835E5ADB4EE75FD8CA06C199E000CEDF93 00692F29C5394DEE45DFF2D42872B1370C8D4A14E144FF36163C849F9339AB97 EA87BD445733162A34E609BA1E92DC92F9AC892E7A0B39AB0FFE517856491695 56155FF0C2B231EF1314CD4A146EDB1CA9AF7DD546CACDE1E6B49BF0D4ACBC09 55C85E2D38DF84E0B779642F7E9C26CE19EDBF328104B9E803D1B03F3FC24C4C 9EF0D27C8E5AFA420A63981C000A0C1F0B3D3F853FF300EEC524C586376AF998 DF4ED5AA16D8E298C159C2A3E33048D4EF192A11287F69B11BE24D49A033B334 83CB8783383F92EFB9E3BE84CEF37796BA4211E534B0360970B9C57EA7CB54FB F582789A83113ADD2415B3F84AC4ECA15DC70878A32559198DAE67B083B0EE6D 68A92511FA8FD6BA88A42769E3FBBBBDFDAD61F99A6C274B48CB044D16FD5953 44F1503D8D1D6DBAC41C1246A71EBCEE5B1F0DCE3EE7E3A99792DD8FFBD94DD4 3A5ED347A62D301B6739AD2BCCC7C57378C29FA5A83759E7AC6F1505DF6C0E16 71587914F698608AD93ABEC43611DE709ABC3F1C0A1343CBED5F09DDB4FACE0A 8BBA9DE5B85FE9B4365358DFE877BBFD9AF08BC60BAD7C41433BBDBA17EA9A7B 92F76358612FE44F43A85588DAACCF7846ECF5C58B22F18120F895317609AFA1 06E88CA1D73C4CD5098CF44093207C31F46977B6D22665AACAD5A169906640F6 3DFFEB3937BD6CE1501C52783743F8F6110DF43ECF512D49A55379432CAB1C33 7C38B7A38DDB91F0683A052378CBED8BDE4E6DC32FFF6D723A4D1469D32AEDA9 FBF89B9604656DD0D44ADFAC39BA893808676E1E08444CE56F6CAFF3E93D8D41 F164049193BA11AF94B43515BC79D6A538C00B08FB518EB67C27E73380A651DC 4B244E8A2E4ED405EA5C7EEDDB09D44C458A883C839B98D9D6A2209516E0310C AD777536190ED06F47EB2ED61C53A2E0AD0CA4E4035324DE75F272B1CA6BC1FB B912807B7331D932DADA30F1975A1C9A8B55604EEE8A0CB514C6CAEECAF9C46B 5D5563E8934B421EA1CCE3B96412D78DBEEABA59FC603CC6ECF65BDB5B66EAF9 14B852CC04286EBEDD560713090BC417A10BB834944E007F45B61AD6E6150B9C 10A6FBA56C1B45EA5F9A5379B1A0788513DD4100B82BD61D89E6841A26B362B1 D4762EAF4FF3BEABD882700BE9832115405728C5292BE942F871661EB0E6B29D 430CB271A090B6F5399184F21ED6728171B1783C982E61DB7C0BF90CBC1482CE C6982B4F0AA39076B64CCA5A71BE73CA65F2CB60B89AFACA957EF8E6429F2182 CA36220F80EEC5D01AD7061DF45CC5109D9F0B7E2B6DB9D6C6326A45DC6C05D1 E81B636A82592D99C7B7ADA0E958A0D7570BFF1830017A6241AD62C53D4CB36C 583672FBA265142DCE545F4855CA3D9E528143AAC66EBC9527B76EE43B4F4E2B B209BD265D6AEF18D168CA7BA2CEC40DF86FF352029597A5A3B2941D467DF229 50C788D4276C5B400F360AB596E35983262A215047C9714912B2E69CABC0DBDF BF6925E19EDF3A6638CF5794722C8B92C6DCF5853DF288B9DA52A2152F98227C FC04D3C318E7D942E9D33582A490888F0C1CC1A8C4474091B4956222DE467632 33CF5DB7DA165B59A648AC6945687B0ADB83EF5B286CC469B2C9E4AE92ACAE8E 86E4C62A092B8F6C05EB2ED346DAA7C573A03760ADB3CD55B6C794FF4463BAC4 2F4A738F9C4237107C503A7EBF4F4BB4380DBB64F5F5C9B268111752FD2204CF F25085683D071FB4149A64426859D407936A3D1E2C627652C126D8F9264E2919 960ACB9DD61BDF973492CDB1FD20EA81E06BECF5E164A8ABAC12926DE1CBC0FC 6693737B4875F465B5623C899FE129B3A52A2BDF104F8B8429890AC870580C7D B078A9E26C322D1A8AC1C6B2BF340813D989EE8D054882B965905D33EC3F4278 DC41BE055E0E5F73B5A1F45E9E69718F5E155B4EA30B28BD28C52C6C322F2E84 674CE600D699CEE1D2CFB7212BD8168B45824890273A0AAE4757D112980DF2DC C3026300B4BBC9B081817AC7F4D48B309E66CC7455708C772A08EF6FAC829363 E27AEBC3E7D0A91984C05935B16E102E81D6AAAC347E38EBA40125543263BCA6 9C6F4AD6BF8C3A90279FCA4A99D9290C3B8E0DEBB4B2DF932F66FD47AAC3094B 7582FF8265CFF8BBC7F79C8C74B1FF94B26F3817A39B5FFC6BB562BF6DBF9CEC 31CC3BE4D7E431D41D55D96C4F020486F993781828E9E8850192F9F6BA350AAA 5E292210B0EFA4061EC8BD6EE15E3FAA4AB2F54110D17D29BA32C0D28559FF32 D164DCC98EAC78822D6D6AC6F4871D47290A11C83670374F072A9DC723096C89 EA584D43BBB13584D9B8B1820C415DA2E0DCA1B50655E81B47B9AC8343DD8FAF 95F4771ABF81361EBFA9259EE8901F31C21E95DD22FE04BDB77D23DA561FFCE5 A7708647AAF65FBA2FD95E843D839E5734D4C08A215180C7244924E002A965D8 AB29470A1B86065B4133A9A6EBA05EF1AC67DFB5ED8DD8C11450233D2624EFEF 3E6D3DCA7E23ADF174BC83AF25A1D7529E52D39C27DA86A2DF4BE4F8A96361CE 7025BC1954C75A765ABC95B4AFE0AF5474653E6808F85893BE6ECA1A37F8B666 05A9E9FBAADB0DD86848D6FC48A1000FAB396F756513798E09D29ED6DBCC8466 40181BB71C92CAAF8E240E16304DB9F4B0FB6880004A0F9AF6228E60646647D1 669577DA709B4FDB8721B95B07B4599652A303FFCEBF858A41F08BF3B83EBD31 74EFA947A8ABFC7467D6CC544B655A7BD4B6A4F5EA9BF11CFC9CDCE14FEEDEC5 9116A3FEF962932F8B105BC4C51744916E8976815AC286B1E682D83091E9C533 839223A68B9D977C41107F597E05C3D8C1C3E79542A990B0E8E22F34BBDD8E47 B6C2CAF54B72E8F0E8A41DB343934FD2C33B6D77AF2E9061C4E76BF258CFD615 30AEAECE9D04569D358541C346C922A01D017BCE85D4F083AA9B6939D85EEF29 335D1BDCC9E6D5F7F58EC2BA2D8CE50CCB38AE6A2DE2F695B76831F8F591BEC4 EC6391563D18E4169151F552B5E1601B1DDA6F93E5C8B5F4FE63F5E002AA3C15 E0C8DE2C735EE00E9A2A01530FF37B7FEB0FB182A4E381CF1BBC80D743209814 F99002980CEBCBE3E677005766CE1D0AF4DCC9F103499D1961771FFBF01B833F 1701EF6EB1A381A287F73E519C01084241335905661B2E8B86B398C88F39BBC5 09FACC1344E15CC7685708BCB3F43EAD4E24A84AA0687FCE0A2178D9BA84EBB9 68E8A727DAF9A0B28A7CA3B119798603F9BBC6728C5A6B4BFC84C95DC4F36839 C2649E364CEA39A4EDBBA4C0E27C61648D38CA46B64E8CE797CA3464C80214EE 28A1E58B387AE0A663A39F04F57899ED62FB0E542EA108AC32490B4B2BC068F6 2087BE9C9C3CBFDD80F2E632BC4C971A79A0A3C3A5607B997223A9F6373EE51F C58EBEE7756A391C91758A1F6567F532A5EB762A2927F57CF9F0E845E4F66B3D 8100D1795B706FD32944CEF24A054650EC911A54A22F4F35E3034AC70F07C98B 8DD43BE9F7D68C50D6449791F5331A189706D9CD18417348B9F296D8D01368E3 2523FCC0EF33B998FE925B4CC7BE329B32D6AF791BFFACB60E4874412C8C8676 34914A453A592C7614AEE5001DF3E5E8D9335A155C65174B940E1AE61ACBCBD8 A41D7E1C6FC0680E094ECF65C60CE714E6EB2A1897D8A3F39FF58D64EF7E9A41 4CD8E55BE32CE8CA29239A9BE3FD6B1DD5CA5A035AB1FE57CAFACB8A39B6A877 C853BE6BAAEF5714982FBFA414EC128B61326B60D83076E690FDCBE3D2AD256B FA7A15B804402826684AAD933E94853CD0CDEA3CCA7DC833E486F431EC4764DB F3FB244DB99FA0CA2FA14DFA75A326385B3AF92AF8E4C6D437DC3DCC07FAF25B 6C0F270333ED377B08E498BC3004C25C7A991DAC9A3E0D1FC43E2EB6996C7269 7A864CEF35FE312DD8F87E37AC69490299CEF9B059EC7E7492D1D6E5640E0AC6 35B97F7A629B6B7CDF3BF86D2B518EA807B03E4F79DEA59C84D98E4C94102EE3 71A29649ED75F5ED02EFEED8064E2D54E8F9CA0C4284B987B81B7F41FD7DCAC4 FB9C3ED70774F9FD09F3321CE1D0319C1129F5868DABBD183045984748C8A3E4 53E085818729A1353B13C78E63E837DE483E9E2ABFDAD16534420BE4D7976D35 F56B86EEB90F663E9778A6E0CD698E6324EC2D19901972B74EDAB8F4073E4F37 89082F08735E8345BA167B2B76C77703C586CA5DAF41C0DD0E231184DECD8A9C DE8FD239B6CC636507A5BE6EE5283C06A1D8D59E98A31AA76F4D358DBC641DE2 ECE3D9F2D262FE2E878E909A950A7642A3F59995519D541B96D459F24F12682A 9AE61FC08CF436D9DF060DAAA90884A1281B370A2F824704B5347FEC65E14E7E 3D212E29723427BBB12C1CB91B28CA47D6FA8259A875EDAE4B49C33B2F73938A 784C1E7A7F21873CAD55A868A1451B070A3F259A983293289B131E07C903D7A6 3CC66CEF8C4D2B6736282896A2683EEB944B67240CAC5FBD8A1392A875245A9E 2611B511909A041846063E465473D41958104E92519C0F86706AD640FC6CEA10 620C9718C4589D9D562D8810CF6F461B776D5A1B040F8272D43C029C2A695D2E 86CF508C4AB11104E575E13C2EF56914E241279BE0558CD3D59D25BF13CE8212 3D7AD1F25FA5A9155AA06306C7CD0F49E3498856318B0ADF279731E1769839EF 98657EE73CF07B0585EECB67F5FF609E0E3DA1B78F6A8FBE2F2E0C051237AB4B 1587DD72BBFD962E865EAE0CAF1A5C592F5019C7533BAF297C0F78F3287838D6 CEBFC8B5969486A5134DA76B4961C8056E1EF1F2AD17F19D7998175D66B3149A 2CF21CCABA281EA0345EF50C1EBE7004ED495C6D03963B639A66638A43C049C6 DCD311B5F86EBC814BE42D432EEC87B861FCBA9C8729FA5AE87E20C5B30B8E5A BB41189A42B9853CA408BA01A559CAB722AAC3DA28E70AD79E1BBC8B6FCC937C 180B5C2E20B03D3FBAC60C83F765CDCDB3146FE5C0B02911F6E120D63EDFB0B0 86CCF83C2AB62922450206D3701588B54A8B232126BE120432E6BB2E25C50B13 708D742A44E20176C54FF89F4589B10D5396C94625AEA1914AC168899FE7AE9A 7D90DA67A5EF3DDA25CCBB18DBAC3AF4AB889528A381542185821B96CCFB4302 987611DD5B5B8514FDD7F5148D1BAC9C34567F75EDAB317E0B8A7A76604A42F3 1D46332C4791006DD1AB657308CDBBC7314592707EB163326E345C2C5EA05B33 01FEA5B7A346E6B1B6EF58B692150C6116B149B6A26B493674337A9C1CB4F42B A7A80AC587F9BBD7A487F407EBBF9978840A01B5E7E772DF7EF28481E7AD14F2 424816AAA958320A0E6F318C757A474F7B05AC0F570094372CDE877B479AE3F4 90C257A2B3F443DE43D8A58594BE8D4B5C7E5E075ACFB1AFAD4C06415266E168 FB38C1CA256287953EDAB1D40537A3633CB52FECF3D35BEB8C2C6CBEECB54BBA CD6E043EEF68A21D7639FAB8D1006B1119CF92350D9773502F7554B4B3036EA3 D747596506FC674DC01ADEA9B45ADC43B9E6947235E9BA30FF462252038D91D1 D908E9132A946FD03B86A08885AC44CEE72F0E27AA63A901F2DCCB86D87702D9 A66F35F06D6640115B075B0260FB116E24E795E24DAE988CD48A95FFD3116E92 63D02221D272531186E2AAB74496FB78A4064C9C9772608C49D46E40FE28088E B5109171E7AF69599BD8BC1186C196EB11FB4132F5C9FC1395220392E17B66E2 32215E54E9483196341D6DC691FCCEFBD00DFF4C095FA8AB36A374BD5E1F5082 730A698AAB7B57A5399196ABCF7B7963E2970CCAC5E9A5EC552CDBE1E2EE1968 B81CF5BDDFF9D385C9C1FFD726A0C52A4CB0C8121E77AEA16157C1EDCD1AEFF5 5607E8F5C44072DC54332B95AF28417E2D45B4685F270821EB6C455AC147F938 50CC9F7F2006D933D0664AADBF5D7E3E6DAD57527AB59DDD13BCA392B059FAD2 E7833AD00F62EB89CD7BECA9DD479F7CD7C981859EF43CBB1EC1681081B58A39 2CEC9FEC039082771E1BF48968431F72817C8156D0D6B65DD33D472BCC49496D 1F5FB1796892C6A45BCC65BECF41D8604B811824739647D87A7B28FDB3574478 9807DA2557F411E0BA7479F31B9E3BBE6F3CAAA653883A9D2BEF2073F47F057A CFD20BE1371F17F5B6F0A9520F2EFCC3C04A24EC272C43E1F587ACDAFEAD7076 6139D04FD9A50F67301D7765109C76D6270D2DECC94017A877EF386AC7F625C0 ABCA9A6D15D71AF7A5889403DDB83EDE87EF5A69EEA97995CC1601160B296750 32AD8D65A456F5471AD4536F1AF41A4D370203F897686CAE7C89577D3A843E90 9C08CF3E3D489625256DA5E0984BF971E0D8D251AE5B09C17883CE07750051DF 770B920AABB2E80A4944EF613891B4EC3F9E214339AEDFDD5DD15240933DC82C D878BCB743ACBB562A41BBD86191E1129718826681FD12981D4159C7432DC3D9 AD4C6C478EEEA0A34030BDD0B9122E8AE5F0B473AC5A48346D56C2DE42815D19 FE378D252960D3F56654B31C58CBBBE0D634FF6EB81295809AF12222C58345C0 4595590B2DAEF5F3CCACE8AD4CE8585DF4099665B05B32FC49160ED307573D18 6C4D88C07CCD1BD4A0179BDDE6524D8CC9A70318578646EE6F4DE040C56C90C3 C5C5827A77DB584E95F55F083D07AF133B31DB611D1831D93180F66A13E86AAD 573C57B42DA521764563F69E7D4E26057622C17A17BEFFE96B9154CF9B9E70BE 65FBCF5161148906B811C05B6AF2EBF80DD90786B4C19754DFBE0653F3D80F49 365D5006829FED63CB9571B219B38753D90DA82647B305ABCBD6C49ED9DEE464 62D60676F891DC1CBC2613C7770AFF963ADCA396EB26D886FADD7D7ABF910EE4 798D537E8542C599D4E6BDF99D27BD64EDF7574B612B85EAAB846B6EC144DE2F 325FAAA3E3C33421B8006C3C64A5D62DDAFF65940AB969F230D73427A7ADE48C 3B1DF3C1C46E700BC54CCAB03493FA821ADC072B7248417EA0A93D1D2A093EE9 CEDDF8E223B73B8A2E27EDB47BF7C8E0D56EA5BD1C6BA2B25457BA5AF39B237C 53D3A144BEAEB0143DFD3F101FD403EB5F1A285297E4042CED3C6454DF867088 F91626D3F3F8F8A3B85B962FB53987C26F1FA074AC3A7790BF5C7ABF3F1E973E 8B4F9198A41BB4AF09672D4A6BEE934D4D7AA08F73669697FFD19E8EFE5EB5B0 91B0CB9B6C926AE14394A3AFB53017F95E626B314CFA98699815D901214BC133 9CA09DA8137B75BD8C0ADBAA011672F9A9A210C2C383693E2965049768ED3383 153CE37E6E1433416C5AC2E1D9211DA84A1FEB1E0E83021C9EFDC5DABA4D1FC9 A1BE6BBF23B4CB5A92035C798B392151649A05E6F64C2F48D791B4F7050A732B 877EA2DED692DBDAC4EA574650C168D56DC90509611412DB6C32B058D8E98F6D 61CFE1EEB20D4900AD7B5E80FDA1C75A2B7229FAF75F60647C5853D443345D4C 21A39B04B1A6DD43610011CA2B3335283016049958FBAD1E4DD788D61E4204D2 9C90EAE850686B98BDA64011CB520CB4121B98ED40B3ECFD3F3A8CB93F01AE9A 3E637812762D2E90AB3C94B33FEE92536D6EAC8ED08BBBE2D227DAE1B2BE04DA 1175ADE3924D3E600FCC07476E31DF9A6CF114FF0A8AC3060F322C7F0F454C5B 7AEFAA0F633E990F2B17715AC9B8ADAB6AE180CACF6394E08D0FD32E768017ED FE94E7B51D37DD5FBE126CA72A4ABFF2095695EA9C81A2DE3819998AA72B36FC 08269B565D331BD12FEA970B92E33134AF510D721956F7200E0931E7EA2A228C 0BB2F0CB65CC706C55BA98D7A44EA94CE8A66AB626F98167FC520222CF74BB7C 6757A3C80D91B332A45A33A9585FD096798F5650B58AFAE41BA4E68B7F48B0E3 AC4F0ECD905E82C163E098B54F6C36CEF2DF0ADC369A6183443550BA0E4C0C96 7DCEBC1E7B5C9A8B407A41D47F3622E662703FCA529E713271A12E2ABE261E5D D86A00846DF67B1B5CAF404032DF21CB087D752BD06F1D34E04A9F4C040F27C3 5886B900E46CB8010FE26797F5003D3FF96A54DEFF591470BF62A15BF82446C8 7047C1FDC3D175D700F9E093A3099E03085DE0B74DDF97285A6B0B5E6BCC51E7 5E701892A1381F91A6AA6CF11E5B00B92450B92202F5B34494B43811C43E5101 EEB76CD56E0810AE5994B92CAEA55877B99C5467986DF645FD74F1DEA11B9A87 5F5429F9D7816AF6C4CF1B8785F7A060AB07D4FDBD2C7F48B8CE022CD275D9D8 0FCB00A8F9BE46275E9868BA12EB21024A6BEB219A0F146BC9853A39DADFBEF7 0B53971F86AA0543D1743C03D5D29EA154A73A964FBECFBBA046F05A523B333D AF32E893AF5AA7477CCAD01006CE00FBCF3E1702B0B0D9AAC4A415FF1B338E8E FF1953F984B007BCCE2E60761DFA04DAD42019B3394473779CA309AF2D38E183 808CD6B3F7BDD33AF34224C90D61B10E164C863CC94400E1BB7E500F9B2CA1BD 94E62B31BE3B162DAFE838BE8AB2696715437292B081798C39E033E0E5101A7D 010A02D0C18AAC594ADD59E6EFAB5AC2BC64E2362D492E8749C57F1DA579B4C9 EC38A60B42E13DC1FAC7F33405967C8C0DF9E3A77B44679063F18352C6586258 1DC60026E8373DB8AC59D26761DED98C804A76FEE28B8741ECAABFD263D27311 77D1E331D24E092F86B88F362AF2874B8C72189C8A499992D0DA85D67C496BB7 A87D310FC3F01D640D81F3BA4EE66E1D478AA9DDC5FCF31096C1B01A3C8D0FA2 84DEF5666D6C6AB2A620A0BB0C8F0120CE480ED1CE940AEECACAD9A8CF645E2A 41C7B1A59181674D2CADA6C97D13F6F3059FCA1A3CEAF752656DB632A97FE071 EE90F287F45B5D4AC0729F4924F582EA2B29AFF55657B462B1BD32EF9A2C24E4 68FCFF05BB4350A863C07A5ABD8A8F0EFDDD9AFBFA33FB9B126C523A151DC195 D5CA53FFE49A27797FF885CBD3F2B220A2A907DEED744C2CA8BDDBDA45DBE401 1D1AF9CB3C186C72E6FD42F7C0239BA70C49686FB916E8B9CD0EE418F27414FC 58CC65D05A02C274CC905577A83266C3C2267C9B92F1010D7E48696316782D8E C4CDE9B6E41CE823684603945270F6D20C6F014BBF06E8199FF93E1AE495525D EA8807B8E93C5B7225B59C9AF64651795A36E0EA382C2E624D817D421FBC27E0 ED1DFF7FB7112C05C92A32A6AF52443CDC694FCF3E227691A54E1EF15059D47C 3240B0D4A30AA8ECE2E8F994FD3480B905D570909BCF72057C71EAC51D80970D 9DB2ED6E8E1496B750BDE4261C8C6DC568DDD7394443414937A78B3CE5D16FC7 43B4C21F9934BF05A7F66A4C89B88D47EA450DB06A3B656720FB2DFADEE43DB9 9829B74C4E99E611A83A470E8E78B25B56BA61FBB55AB152B4B2BD7B7C4B9D2D DE5418F59B90B30A635410D6DFF96392FA013941CE3FE236F36E17DF66E431A6 7EB141FFCD75D858B6F2E2E2B6A2A0411ACD013E3F2920B3B7351BE0BB90485A 04951D059D3847AFD7E78ABDB5F4474AEAB3AD301A23326255C96B85D50B7F35 BAF4A52F2E1BAA77E8FCFF43887C97FCDC98F3E22AEAAF5958EF303E5DC75FEC 639F8E71356A1049D8F58E6DD3CAF0134F9EB757AE973DAEEF1559BEB858C8AB F3D984ADD23663E554A2ECF89F1A158242FD59D0A6CA35CAA7D0BDEF9DC2AFA6 87C6D78DEBAA40BE7B09D1A38CD8181CE1F016B45A830CD0ADE074FB640DF7AD 21A8FC8C961AB0B60B8303D345C947328CD8B4AC44920C2BE36820C363750D2D 10AF360B1C0DBDE0DE6EF35D367E8E75287AE16245679BFFD2BAA25DC78EA1D0 5643A9624C2824384AF3E3B4A9AB9A40792335E1BDE6A40F6381B99EC130A788 2EC7EFF054B23833450BFB5DD46400C653254DD552AB44FA2D98EF4CCC46E585 4B64D7F73CA41729B374937634B24837D53C3A27E7DAEA1C574643FFEEC76A03 7D9FF16D2B3E42E4C87008C3F201745A3AAF247051ACE238C6B6B1A4116F902C 278BFFDFFABB73495EC7CC8B72C984E3BDAE77D4C2C140E6749B450CBAD5C04F 6726A2BA90080440783FB11F971D1F066BF206FD3B2DE3A6C8F62BADEAD81EC6 B399D50FF326D73D7EFBF33914852D909DC7F8C55A74D5C063E69D488BD435F0 60BE57AA99957B0BAC5A2492F818C65620B390317A8F1B09D9D3E84912CCE3B6 0E65EC5EA2950D0177E0334B031EEACAE0ED9C2E5923DE53B98F692240CFDED7 F7309B8E1EADDD10E6165590BDD9DB6A16135B6928B8E66331B1E25CC4886BF0 7E65B4FBA586EE65A27CCE1660608AAAC634FC4A36ADD91AF25A410A03A83118 E976C66C142230974C5B9DBDB4756064C71AFB16FAA66AC04BA370A0DC986C21 F2CB3DB2A04E0A2A922DCF7600E6B652D9A6273BB2EFA8075EE0732316A033F2 9DC886C7704EA215AB9146CCBC1BAF95DAC2100149A33831938E9392DE5B7F2A 64F61784CCD9F755935727722DE8F0DF4E74242B573AB5BAA58DB14BAFC500E9 E9F5A92609D2052F97F9054E7F1FD2115485B36D7D9838D9C480FB38604DFEE8 DD52391B2B2B1A25A0832A798EF4645583F20C27E7D7719ED6B55886D53FF31A 0CFD99BC53C8A7F22A87E79D243A9EB44326A2E4BE42287612E8AAEBA99FB82D 4F24883115C2958E930AD4765A75519077E19124573178D956A08901984089FF 1EF4D0E8B9E6C267B4DF07D919576AE6557E72FD8C26AD55C2A5D863D0855630 178B49E1A3D115C2DB2C0E31FD17866D9AE0F8A0F9918B21CD24FC8F1748B016 B4BADAD49C377C414376EC297E273A8AF1A4064B01B4FC9D7FABE43449BFE2B6 2B143C626EF988557C954AC052AFC10B0EB95146A84D0DCDEDC9A6D429E5CB3C 5AEC09B6BFA9ED92AE14D7A738F09BA6490E779A1F89EA62523A5788C3B548C1 70028665F320F5CA3D0892365690D051977413CBEA3BBACAF90D9BDD253A1472 9E112F672FC62B7CD430FE7206E6AAE04648D1F42B5B9B4CFD65E7E59E941614 F4B6D61A8E322FE3711AC7519A59D20618802B1733D4687339899E998F4D034E 2FE75F3D436EB1EAFEC00D95739E315B04CF325FCC9E91C582B00E95A994850B E05798D3444E2ED2BB1D04B30CE5F48DDC07E52E85A0200216C3D6E1B34D5A46 7888A4467A18D414E0F1C1709D05FE1DF304F993EA10117799FE4824940D0742 187276798C9A1BA59C74066E88967CACDB72444056E3CE8E12EEC45859DFA602 8B587D9516B389A974272FA8941740F400DF1401B03DF768CE29D03055125F99 0A595205DFD2E3D669D3D8A9FE11A0BEA40C303E25C72080F1CDEBB5F490EF0B B6753763F2C512507CA2FB722DAD7F817B68F383D23C1A6A7550B4B22C757C63 AB81E1590BE4AA618FA9BBB7A463F3F2DC46DD4CEDF3542C0E0D796639C372FA D500F5A2BA3C351434CC25132BECA471BB588230923D97D0F0103673A9BBD22E A390FB6F34B436DEE54F03D609F5C94F9D02E639BF387E295B48BAC23D776293 9B9566DB85932E1E038F5CCCEFC45B623B7D33EAE1B4C1F083274F2033FC5447 CCC4EF9C7BFCEE57084591B55F20D0DBB0FA211818385949DE88F58B90CE314C 1B5A97CB72FC2917F4E8DA6E2355781BDB86818F76DF7443578640483800671E ACCD36B1080EA38036B40B98E51AB07EE806FE6FB9039EE1E90E92D6CD76CBCF 74A29EE81713D82CC4A183ED86D2D2BF962B383F751D2D209644ECB4AA27FFEC 142E04D4F3296A34C730D44AD435BA7E2D972A75CE10C38C1274685BE231DFE1 D90C8B8AC0E7AC2888810BD6A2AF05E6F655EB4248B2578D533FCD37B4509EEF B3D6DF37391E54C0336CB97BF90F30169DE940552B354911C5CB386766338358 2C5C7EC2B6D5A19327B32399CC1061394E110E5D5D8BD6BFD67B494A515A2FDC 503ACCA44740E4569787BF400066D01300DB840030D50F6E97AB8B1CBB383A67 77EEE66C66C2E389D72403C3513FE40086D969185A9841AAE7A2214A6B524822 96BFAC3CD02131906A8A5E2AAA99BC19C3515E22C47D33D650480C567E159390 4DE2189ADBF0D76A205C3F4FB98A75C1A4BE5CF904B3BF89421EAEFF4190561B 79C7BC74C750459642D64018A4B17D3350245AF98357305BCBB5D4368D9F93D6 F6AFBB6C5D60E354925CBBF87B2CDDBDC05DE872F4B808AE47C57635261A6108 6BDB1B14E023F5F376AD17F9FBBAEE5C1F155458FB53FEE818DFF8D64D8D64E7 4BA5806409E71089C309BAA2A0C263C15E88A651946D30BF09B330924EA444E0 48849753868661FF237ACE0B6F9FB54EA8F0C8FBF65A75185CD3EDCF51F554B8 7D8EA7A1332316F0F6F0594D36C10657F79CA9090C11E7FB96EF92639E1B9AC8 B5BE8EB8DC85F54D7BECF17616FDAF220DBCB9A02E3FAD395BE6590C6EC9BF81 D959176E5E2FED7B99BEA411CE1C6FA3CC17CC938C39D62D00678F71387F764E A23B4A5FB9F8E41091CC44E81E8F282CA943845BD0B6EE96080EC5F7D00BA5D6 24589300826705E6FDEACFDBD4EFBD4AAF5032A97216D3D1ACA0A5C00ED28FDC E63F1F269410770500C9BDC17B7C06EBB180A4D42FCB74B109C961298E05AE5D D632E95DF45FEB1C77185C5287AFB8A2768E29A9A0B0810ECF127EBAF328AC0E 70F24DAED98E712D2BF7B171A595FD37397F1F4555BAAEE212B23AD8359FCB09 108A8D92509E193B47B96999C06A33D42BBE9D4552D5DB137810359BCA4ABCF3 90D01B5CA17744F35695B5037226C12A1A5AEF2C0F1382E9F2913A74C7F1B8FD C2AD02DFE9480EFC56C06633F834A6F3F14BB4D78C1707442932644761496F6E 6B96CE6F69B92F23FE88229569ABF178F08C56678DA57FC082628E8DA7C655EF 5B644EBAB03C17F8AC6003C743A06C8830479469A5115F8CB101084B83FC665E A9663932A50BDFC8F8155CF47097148CF450D5F6185469235E5B9F94BC99DB9B 63FAC208E69FCEB2805D85BB7D44DCE3FF8DFE5A913C3A9D09586A0EA52F5D82 D3888B556B08824313A3285410C650127A7D1943F4FB3885E467550FF92E28EC 4CF113555EC4D53F853558CCDB3BC95A899AC515294569680E19F913CF926F7D 6A24A6683C3898A3DF0E2C83610EB37B6E8BF54CD8A4C020F06702F018760AAC 906A1BEE78D556200F71719AAB0BE71F7EBF90124EB8C07D069FA980A6C392B5 DB882D82A0FE052B9DFA 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMTT10 %!PS-AdobeFont-1.0: CMTT10 003.002 %%Title: CMTT10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMTT10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMTT10 known{/CMTT10 findfont dup/UniqueID known{dup /UniqueID get 5000832 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMTT10 def /FontBBox {-4 -233 537 696 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMTT10.) readonly def /FullName (CMTT10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch true def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 33 /exclam put dup 34 /quotedbl put dup 35 /numbersign put dup 37 /percent put dup 39 /quoteright put dup 40 /parenleft put dup 41 /parenright put dup 42 /asterisk put dup 43 /plus put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 47 /slash put dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 58 /colon put dup 59 /semicolon put dup 60 /less put dup 61 /equal put dup 62 /greater put dup 63 /question put dup 64 /at put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 71 /G put dup 72 /H put dup 73 /I put dup 75 /K put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 81 /Q put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 88 /X put dup 89 /Y put dup 90 /Z put dup 91 /bracketleft put dup 92 /backslash put dup 93 /bracketright put dup 96 /quoteleft put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 106 /j put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put dup 123 /braceleft put dup 124 /bar put dup 125 /braceright put dup 126 /asciitilde put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794DDF2E5ECEBA191DB82B3 7A69521B0C4D40495B5D9CE7A3AF33D17EE69979B82B715BAD8A5904C5DE0260 6C15950CCF6E188A0CDF841EB68E5A2F88253E382140F87C87E55C9EA93B8C89 14A36CDF630D6BE7CD36DBDCE22B21778E8648B97B7EC6742EB5114BDF0454B0 0EA7B1FE236C84C0E5308C871F67B973892890557AA12E00B2C20C71F516C397 3F3BBD14A1D0149CA064391056E45E9470FC7F6F556ABC82653B3C8049AB5CF4 BA83C8F2158C236B2FFD4208846013BAF4165E8BB8D334C8FF2E8D74AF5DAB2F D44788869B08399421AAA900ECC6A2D594641C121660D4B5F512938994C18DD0 FCD9B008F68F0351D21ED735B2740CB1E0C1CCD25EB548C35B844601D98828DB 556F71D07E081A593FF12DAF83676492A0FFE16E95717A07082B43A966C1EE8F 8A59E1255E1705C43A23CF29A5E4A6547C93F1680A870EE7BAD8CF74D838CD5E F806911D8FE4262ED8E7F5BC58B92C9C6D74F8AD45FBB021EC7E97393018B9DB B1B84E7B243ADB05ADD3F1DB3692ADC5D47FEC7DF93080669E63281F1576B673 125EDF08016664BE73364F65389F7C3B66623AD1754ECBEF9E5CE6948D933787 A5674279ACB2EBECD3B4E6361419AB32028A27670C9F3E18B746A10B00AF6D77 4EC00E3BE521C02A99AE5BAA98F793EB1228952BE67934B91472E01AF7B816BC 56D7F19F631A1927846D800C107B1E9CBFF9D2DD513B4A8CE2E0DFD77B1ED178 E43FA7052765E9FAF89989D490D8FEF6C536EC0D4AE27A74F474B98DA9E6B92F 15E063DB260571979A5DE2423920CE1F59F56EB11E00E3BB9D466A8263E1E385 2014BEFDA8D1EA3EDA04BE32AEE6CD15C5C010A1DF7F705A2C0C18E87C8DCCE9 05D9163181CBA56C0FAC8C06A2990554C8E759D076B01BBEADE3B5FB8B551390 6C8E4A2A1C6E7D9C708614626F3770C0AB7DD2027469C77975C27576065862AD 04E5E50CEBE907E3E991FA0C627302C0E207B4D5992BEBAB5853AD1C0D271728 C76F40A79392ACCA7358F948AC65DC823CFDA59E1FF69CEBB6B7EC3CF21669E4 70D999508F9C49E2D9F8818CA53C977D93E15FBBBAF75B1E84F0BA62BCC4BAFA 4EEC82D804C8A8C0210F3E5E258BB1F6921AF02BA9861BAD5C3D5FC8CEFABA8A A607E547B802096F7AEB09FBA99C83C9A494B94408DD607CA6561A6E6660C473 62CF8D35F31D052F6C6C8138A8E1430CBA7EA6973D6D510C1A06B3FBD79D9364 240C1A00272DA44B89A9FE8D5BF36DC1B5EBB4A78ADBE9C5EDB485F093D9517D 69E1AC9A8E6C9D7C324E3797CFEAD9A18E82E03F69B2CED7D5DDCD1A218BF2E2 ED2293AE999FE2A4B5213A10083EE0407BCF8007670B8C737EAB30311C868D84 121149ACB4A27F3ED6C0C181C98AAAF51B105F264B5672D7F745131ABAB5BEA4 0C9B43C0DD9116D6DC61F90BE72018F290D26D5E9D341055CAF09C9F45333CDB D45B7954271767F638EEC499F7B53C2CC5774EA7A7F024C4CABFB93D9CB1856A 0C671A4ECA7C62EA5242648A84E7F3AFB9547A0AFC29593CFCE6D8B873A78157 D337CABD291431C0A2CE1F37E0CD7340567AC206FF98E4B5A6410F70F750451C 550EFB54AA259A1B236CA9CB730D2CEF125EC65D959441F7CC9768F777B44844 CC9842A307C72B740680ACBBF6AA35FA7A94825069BF7696ED81A371A9E5475A 9D997F2DFAD339AADF797F7E03E654234455AC3D17702A420EE0A597BA31BDE4 FEB8DBA7C61D311CC90441A620164DC22DC2D373973EF84CC553453AB1B3337F 7B39983B8DFFB3A9425F119B45C1CD37A76F905777B3154CA6200792F1759D06 E017890F4041A385F2238E3C48B6C8EE6F5258463FDBFF7AC762F6C4363926D6 50F004D473B7B7F73CA686B559C2885F1AA761653C727A77D73431E9D110E76A 2E55C68CD50F43997C9B2FC4710F8C8540909829E215678E63BB8363C4B8AF05 9986102BB36580D9CA95CD216B7C321822CB41B2E0422CD077F3B55E0246FDB2 44D5976F67296B5B0BE4B06F6E43535C21164E6C5089C3E9BA2D6B30888C57DE 49DC8D9D46C0D5EDC47ACF2C03B72DE3B69512508539019B759280BABEA12BC9 385308A0395C4CD33182A10A5A229743379C2075D82D8BFCE4A66E1AA087A091 8F5372684FA5037D1B92D50CD9CB4F50AD4F8EE7D51F1C9E63C721CB5B9BD011 6F0A8DD4FDCD2B008F223A1036D90F0F3B252487DE7898F9AFBB3A9D9CD49E0C EF4ADAD5155A98D2125ED5A3D3907F67301649519419F33CD942E8DDEAC1BDA0 E90C431B198F646766A8FA9F8D1561B57E126EF604838C0C1966655CF31FB7EB C8CCC434FC1C96046D38203E1791EC824A3D7AED85C029288D4608CA7668A2BE 484C99639F121845B22EEFCE0A3B808261921AA042AE19E641769E91277BEC29 4594082CCB3058F90FAC4A700A8A827ACA00FCF574ABC8EB7DBCECD97F2B22C0 0AA19E8739B81AF8C6F621D69B8E6F29BAE233FBA655A0AF5BDFD7F5C6B9167C 6BC7AB693D45EF2AD999F5DA3CEFA39BA48A17EE6D9F2C4DAB91AE3F0044DC3F 5D5506CE4675AA928B0092D6F173644F91295216D8BBB14CDDE0AD524A4D545C 1B5E284A3BF0396664081CFB4F186A84A0D24D61E82F4767C1E55A0642720CF3 909FA1AB8EAB78030B59BEA067DEDBD2F1D0340E790AB2777DB18248521934A8 BB38A58B7F633DEA4291B0D5D13E9A882C974697CC6D3B49E030C94EA29B5506 CC29C44D01B4751B453A46A9F6BF3BF135AE87A4CE232AF57B66578310DE41E0 2A6AC422117F1963C4D7CC306BD25A6E724E51921779F22F029733122E23E2F0 CB340008813ABB104380C80A492B3FC6D0BB07CB8D8409E9576891EF6E5C9D08 EB8320DFA31BAFFBD336D0C2BBC3D3B2D30368B9860768FC080D30569C7F7811 0EBEDA2962476113625EEB555490B8CE4C5F99D74ED10F738C61854CFF8B41C6 9402E56BE8856144A1A05D0B05F4CB7EF728B2F4F5A439F18C3B68CEFA41E59A D8308ADC92EC1289DC84CF48D2CDEFF509A145BF945E1E00D552D329EBD2A7C4 21D58082CC8FA790E981F4AC8EAB99950678FD3A7DA3DF13778681B208DD71A0 7C3CBD0664B37C9EDC6B601D79A2C51FB54DAEE849F93209793849104E722D3F 52DFAF7047EEEDDFE744787A5801E4AC2C3D58EC5DDC15FCEE03990C53B0C57A FC54F125A04C8E4A0ADAA725808C587E7DAFB9F784FA2875689979D316DC22BD AA36B306A1ABCF907B63C6476737B746099973CAEA8C1E2C5C41F27E0F7DE8D7 F0D942E34E92F43FE902653D4D2EBB6F3B9F7928B1550A82AF234D45D028F429 067652BD3D391BF423AE72B9CB1E8D91E898161BE3A7849D456A861A2046711E E934DC59442AE7D81661CE8EF727D8D7DDC0270E937E40F896AEAE6171661431 C1025C53172F9D366834BA0054FBFD84503FBAE328B6FDEA180F8EA35B1DA937 5CC3B8F00C206908C2FFFFA6A7AC6915D15EA44BDCF29E2BFCFD4A849535F19B 0D307C696BE8205C7D84B9C77F02EF27D911056EDBB4080E4D3ED72788666CAD CD91B0ECE27A177DB23320A7FA9C31408B4D02D2A4B1CC6DDE1A6CAC3D8EC1EC 2226EC98E51046D1EC26FA20EE62D24747D83CF4941DCE5CCEEC0DBE387149CD E05B19FFCAFC0D117F9A3E60DCD4C815228D98EF95EB559AD0ACC0D50FFDF714 56C3C812EA5ADBB013BBD956A7C4CC0ED7D3E25D5C9AF5E626F18297F75D4957 F5B0B33379114B903FE98BCF35C3FF76FEE1D9AEB711F2962276531F7380EE3F E368720E0292A170A15C5539B1FC7BB954EE2624B504CB8C805B8D31AC38307F 0513606F09211AE64DAC447693B2A0AD15E9A64C34F5A911ECD0ABCA90E9791D 67C6BD202B0858EF96E7722305B8AC02B01AB1706CC6AE875A8DDD15EE349046 EAA65005E7866B506EDFB7A5A2AFD5C9E9DCC821A79EE9C1EA2C7BBA32A40BC7 CEC26DB1AC473C8C3960ACEC581B37D6569E8C8C42950BAB7930B65E1570E3F8 9A7FA719F1DCFDA45A3BF2AAB32C9A93BA3552608A61C623DE59BCB346E87EF5 9CF025A87803161221C5C1C6F6B3403712C76E9D755C7BD68D7F2DC03C14CDF0 C1BBED1D648B905B4B17037B7263C1EA7A7F06FAAC4E09E08483A8D714C19861 327CD9C32DDF850302DD6DDE24912D00C22ECDF3CDFB18FA831A41A7488EC203 F564CFE30D506F0829A96D35A7E09C3DCD107D589B627A15B55C5D6649126BEC 60B88C55ECCBB4E680265D9EAB4CE22965D3B1AF759B01ACB0D0E6C92B6B4EFD A81E6A648708979487FC591CF09631310D46891423F4EC159A73E30D8DD147A4 B0EACF6D45D18CD16CEB8176F03ABCB41F2234747B9733C8FAF34AE5D43D3BA5 0CE0FACFC9B087F84FB6C68678BC6E76022B1526D6E5B3A48EC1A110BD75F45F 1C4DC6D39F254976453F57DF873B7D635C80C42026DE020E5BAFE0DA0D54D1E1 DC634D2621BA184347E5252F645A6A1DB7657C48124186F0E4C644077457C24D 55753C651A9A7B6349867641464B515B821349C795A645420508673B93750D0C 7A3B33EB1F09782033742AE8F3A23FC02284E6C03818FADD1731361542E3FA3E 75B8D52B668C3E18A4AE967D0FC3157083D952AFB8144D549E69EAAC51C279C5 E5D88A0D9D53013DFFB4352A1598FF84DCDE6FA32FC377306B9B92C0F96EE149 8CD55E7B2445B86CCA7A547FA732D52D59025129FD8C6333AC0DF4F0CFF6287E F2036D5DBBB3B91B92F12FEBE0B61A313A4DB5A9CF0BB3DDB781A56FEBFFACCB 8CB9D1D3DBDBC4CB6AAE6769E470582403CB920630221B68BCB625CD4605FA8F D3D5B7A1A28D15E44B38E92E906C138E72C15B86F64C38E23BF0440052A8C914 54397F49DBED99D0AF7CEA3B0A05FF37C2D7EAE1412567E6776333237C31E3C0 49949EC8BFD6E0F6446CE2D4DCD2C1524A288818CC5D159BF8463A847AE4A2B9 CC8C58F822804B81B13BF4F2DEB6229C4F51F093075581791D02C36A13B855A0 34900AA7CD4F1A797652656FE3A8425A38F421C4CC0ACA1CDD44FA6B31219276 1CDE1CD63D6A58CE705CB56CCA1260F9B86E989019071563A9B4C274A87558CA 6EF1660D574EDA276801F0057740E2C3B80D253D697736484D892CE1AB128B8A DECD69712F5E70E895FBAA927E8194D792A04AB6CE205E04E38A433BBB793FB4 E8BBC4279D58A223C6673D909D6AFECD246E66A52F4CB35E5931D24C828489BD 4ECAF621A220D8ECF702BEB01C4FC7510197D3F6D15321EC87175ADBA6434ECD 2B5A306E91375CAD22CD94301763E4A8B981472890422C5488FCD523C9CB17DC ED22FBF12D5F7525D0D6BCFE8CE85B0DFB1D6F989C267FFBA0A996D309E4A934 3DB54A9D29C88B9D55D7300DA3D46419256C5A07A2A529A8DE8BD1727281F5FE 97033D861E0531B14E811378EC1AF1CC7EE9BA2B07D935843D3053F673979F8C FAFD59D555B56CE338F606747238B22BD62C42BB7238FEA335678D474A643570 A9E7B4970E8C541CE9DBC7BF70ED7BA33639D6744A18379455029E934C95E2EF 639C4848CE9A0879B51649FAB023A71782444B451F92A34CB8A124270CCF86D4 D18EEF5C1D2B2A29012613851C49F50702D63BACF95EE2AB4D72B375E0A62615 E0991E130A67ECBA9E05329B740708F1CB148724C3A6E5E3AEC1F88EBCA398D2 1CA8827C977D72734310233176D1AE26C55CF2CEACA62223315C28FCF6305C7E A22414D4739A059F552F1F9372CCCA5FED4F9AC987942848EB498900269511F3 F408CBEA0659B954F5F1B18AE4FB270213646F9B28AE4439D2BA2D3E0AAAA780 5E530E4EFC8A060EB979E12191044509DA0C14397AFF949E12DC970658D5EAF5 4EA963F5BC1407A32F3837CA6A24B7F3D60EB8E6222B702E25ED903F9D21AE50 664A095009BDEAF4B78DAF94E5A55D48366CABF07791A1684B2F54EA69070844 4F031AF8DF416C2D3679F8BA038B0DC9DD0400CA6B34667BCBBC07E62C1668A8 35A8C57C9048A7227E672E89681B54D662079A189A9E96A3CA96D8DD10189B04 1DA49BA2729F1CA585B1BD5C467295285D52E47CA904235A1A3E48EFAE9EB6F6 01374125CE89D53C276858668CF45D2F092DDCAA52418E0BB94C2B8266B4D88A 5D911507BB1DDA3D8F6E7C14A91CA11AE799EC42E993098E18CADA70BD2A1D82 2C39326C6E3F9E84CD9758B9AE43D79BF99E6A0CD713E95B3D9B7DB90D127DE0 DAFEBF850CAAACBD860B5DEF2082F1ADA64B44B193C4A1417BE221FDCA36456C BE5934C8CE3ED55AE3A11697C2D682B7D0F72D48976451D205783BE25DBD2507 39C14FFB4BB828DFD187104F38A7F11D5F0698C11E8C1D4F107CACE573FDC4B1 C56FDAE47024D6FD16A2FEABB434CA320300FC4B6C1B6CA08F76C60B7C08A665 99F404DBA8A2A1EB18EF6750E4EC186E31561A3F080BA6562967546715859481 7BA782940F5C5D06626D6F6A412CA7C13820EC7C1DF23E15E5829F698CF617BE D940523E4EE4ADECEC48C24297DBAD528BA1DCE7AC335A1D15D55415B108EFC8 6D45030D27B3EA63B2B4CD771DBE66AE0218ABB1153D4B7482289D1313CEF184 5C960B1E3C3C953912CC6F4521D1E15636C1545EEE457EFB87B88C9E43CC2F38 6BC4BC96969F4FF28ABB06F4454C01CEF1B6DC538F1E832FC1666D977E5A881B F72F1B4C7DD4BE167A5535F1163A0706F9A0B26400178DF8A128FB5EBE6A7B81 E478AD183EC06622B591337B9F1872AAEA356F4FC67EE767B34CB5A4D90702D9 39FB846947F4096FB3DCF16EC81455164783BA0B5D723060DAFF411B68307E81 7BEA1D9A47A5AA3D648E618C83C60F060029E6EC4D46B045FA7415BAB2AD0AA5 ED9C729C24136F6AF61E6409C0B5CA760B16225641E268A68CFB8260BBEAFC77 6626EBD97195E77CAB425CFB0096D805D9EE699E41680D095AE9FA10122A7882 2F00F495C9EB2102DF0D3E61833BC0A2E468C5CF7AB430FDB7C0BE3DF2C0D230 1580BAA25D65F599378D873165482A1FBB224AEA89C6BCCFBDBA42AE1C5DCF41 06969F585CD3B737D1388D6359F5468D88FCD2279BDB270F6A858FB7D2ABDEFE 5EE8FB79FA437F8F50237B92C307B73B0DCB808D07A9C3255CB9B3B17039CE5A 288103D05D132863FB522A02CEE3839EF9AF7F07D99732F0B8B384745369FB3E 7901166478F4A16076A1504C5E98D17408494E270BBF4470ED12B4332422679F 759F1D93984D7E506D16950DB6C2682FE1379EFFA6F6C95DD71F6E55BE3EF6AF E0CB25388EEB436E6527806FC75484133F6E561DEB979D5C1FFEFDAF2A6D964E 03BAE0BD593C2992AD84569C81050F7A793C5263E50C2F50B98C4CC703EAE17A 6AEDAACE312DAFAF5278D125B6EFC5587484F61DAFF46B87B7C9B1EEDECA4859 314A9A9E2248467DE1E54D90DD671660B9040B3E0DD982260822177EFD757266 74A16C83A7FB168016A320D3DF3BD7726F1F4EC90EE5DFE810C96B099FD4368D 906AE4699049EFD37E8EF058D4B97BF71106445AADD4FC6E90615A0066823A36 673B8DE32322BBE861AE251226B4385AB28702831270DBD25D666FBB0AD7B96E A44E891EA1EAF0F87013AFC982E33D67A28E96E0C9CB99B9E4192536830D9901 931A8CAFA41289633B20BA3BD7AA3414B6DA8D57CCF2FBE39920CC06361F075B CC40335DB9A0071CFF77F6B7BB47F3100DBDC9C4A58C2B81EC99E8E966AF3390 E3FBCC28BA1D79961C8A1584266454DF772FBA99664D74D4A89FC82FFEDFCFE1 4C9E4A04291E803D142E37E7ACA66AB279378F2F192FFB2B5BBAD18B95F03136 2CB594A3D6D3F8576B90A6C4DAD6D6C8EE07AF682F925F01D0B26CBA347C03BE F3B0585CF4539FDC66915E22117078CC94D621F31DCB3E021998A5D6EE94CA4B E214D07517283D56973D8E4367392BF6C1150DEBF459D141AE0941C1C8C5CFBE E735D796E365A1B0F60BB4CF2801EAFE4889EE5F338D3C4885368281B3C95CCE 251C28A90D318A8A0384439B38D63B94757252062EA44E88509FDD2E75FAAB71 7329622828B2785C1A8B26351BC7448C1719C88FE99BCB73F7DEA427FBFCDF4F 00EE079B0C712F7D2C8DF98D4830A9D8C8B70A8C5D54BC1DF433517EE593A104 F3E083BFE49E9CFC4269A86B58AAAC141930A2B4193F74FACC1EFAFD38D3EDD8 A6672E3068F4E5FDC99AAA254345C99C06076420E55715665046450EF164C524 F4DCCDE02254E23815458E7F703D2377C26B73B78B9ED3E42F346F6CD79F7F36 55235A7018C0F600C8828A06AA35100F143FF18F738D2A61D1555F907D04E5F6 3A71729A13D3193A46D67488EEF8E05B5BEF2538E8633B7DD321E56DF4B1C765 0630C432BAC0E607C1EE5D3872008F9AC757992A6A028625EC7A119C50104A35 4F85E83600D55508E00BB0FE0C1257769C8BEA7D15C90C0727C76CC3E25AF16A 8C64BB2C7917D7CF37BA170E3CFBF0C0DE305E7AD2C9148073A860D205AE370E 3B7357956F55F7CAC4E40CE6E055A2B64148A3F5692642D746ECEC4B91C16CA8 E4C21AC96F55B9C7706EA87C2A4C5D8707C8787892EA867529EA500AB8CF86E6 483031F98EF3E46056FE085A0BBE449DC1472CEC5F128205B3E22EBC6C5F7B0E 49916539D897D900C10EB6B5399326C9020D50349BA90A6860DC939EE6B00CD2 FE2D40ACC785B67F1972701CCAA045ADE5245DD627628FF3A08324C85357222E 5B02DFC74B3341F7EC24A9DEACAA1A235FDEEFE33E1D796B6FBB910B766B0D3E E1B26D92F5308780C78C427E05EEA52DBCDED5DB9F8CE9060A239E33E812D091 5CAD9206027739C3F200C7062691B4826035454E3297E848B6696E20AA6E58AB 8635FAA52222D538660039D6EAD9A628CD40469B06D33486429269E1DAA5CA44 BF4AACCDFAE5EBCE215C6633C7A4E65E59BB4D23F82F28E3F465A4055EBD6EFC 0CDF28B330A74B096A7ADE50764CAE7D47740ED9B146CD7B88AB50F1B3EC9BD7 C452BC22248C030713661580D7C1B148BA84A004E1E3CEA5B87990117B137E0E 1D1E3FD028AEB7212D5697830BE0986BD86BA865BB91CDE9EE3A8E6519606AB0 D9971CAE4E1AAAD52E4279CEDF3F73B7850D6155E5208D976A95E1F5DE279F75 A02F0A5C2744AE025D648188A4A72D8DC565D4EC246FB2DE029A1BAB6E8626E7 E9F37654A16ED76B03429AAC5AB56708D357E427319C2A9DA7AEE1F42E318D22 EEA07C674BCA1DA029B62D2421EFF607FF661A2BCDCDB921F0330F79285EF2C6 9ABA2961683B8417500045C04D9AA5FDB4685C29D7AB457A0B8FFED9CA8AB09F 1B12C92102878CA490490A92C46057B1351BF5739DB1E84021C79C5F01E1821D EB5196B001ACC2FC58200531F4F543625B48E6E7069C71BD328D00718C343010 FAFDE4E42652F1B85F57673C6CE01527AC776BCAB381A6D5F3E19897849080A4 C07A44D9EF09309A682485948E71DD8192E20B3AF17AA50A1DA43BD429CD5A3C 3C5BA184988B79E6516A5A79F8546B054E6C593569B06CBB27085F3E9FAA661B 9545DD9E83CFC95B422DC004C06CEB92442AA9CECE35C2864AF8460726FADC19 D1336FE20AA87127CABCB55C8B1FF97107BD3B363954DA70EC09FA20CEA73FE7 6A18ED8E23A4D524A0D895531C1710AE6D5E859D222005B5C1BD8684BC375EE1 7294BC39F53DD1E246A8A0268271A1A6C794D2BF5104A698EE46D52565FBCE8B FE5BBD601FF304C7352F57C70ED2E4636596B9AAAD9C980FC6F26BBCCB7E5F91 8B5FEF8FB94AC13C96808920ABE02E1CC984E555FDC1F94DA32C17391B3849E1 959EBF03C244FC755990D6B1A595675B46E868390360B3EA5B3B6A7B7D0ACED1 1B683A175252D468CCF773F355664D08C3FEEA566C58B9A12595C5AF84FCC2ED E05DF412F5D3AF86B7EECB1ABD6D78E210D30567F54154E1515374FE8CA0090D EF9D4C2A02E416EE1EBFBDBE5AEE9EFFB5252EA74E92E3925484E3FAB5FD5725 A4AFA6359A7EFDF53A501C5F1AA8ACAFCFC45E6AE23615DCB016E5CA27652359 E23A78FBA971992FF0ACEF2A9FF066B0E556B72CE4DB6D530564D016C4A42A35 AAA3DFAC1F8A92E3B0D8C1A90D72D46BE8DE9BC9FAFD2392C817B8F77AF78208 3BE9955D6BA949093D4FA511C1FE61719E1D3195F35171694A6F7CAD4242AE6C 6350C9D9DEB639F7CAC3AF8745E362DA62B47B6B47F3619442969BCB65AB49C4 DE54A05AFB1A56FD61DE0F7B8736BEC21596E7BE9162F7021770007759CDB6B3 F043ABF38627F8E3F28096A95B9ACED41A69510258B3B0EC215D3B97D732628F 8268DBDA125579AC4A1AB0AD237FADD310C58FC91152867BF478C3B1EEDF31FD 465E0DC3FAA0B00ABB648ECF22AE7B01B5A403A9C5E8546E530DD792041F5563 C747B981FE4D6A8F705D21634B1043B885806930D7FB643C75937C01DB7CB38F 2ED4560B462F8F8823BA37A8156C28A9BA46C2B6A928553E7F0FD020E638964C C3BF7B295FB8E3118D6B48AFADFBE51ABFD87188E74C6DF68D995036387E96CE B9141126E41351E349B6168CFEF0A15D36F518F77427F93E41B13D8D3488037D 23055702D827919E507FFD79F31A554D8BF98B73AEFB2DE8450D5DAE2B051741 92BA300399DC7C9D39B41E36C19D3F971643C30882E920EB1C184D20519BA04C 30D6D272C54B540EFC74B8D8FDBE6424EE94CA9DEA379AA87B4A5BF316058A0D 0E44B7792BD911A57DFB222D928E7ACD9AC312637F18CE4FBB8564E3BC81D7E7 8C44DEAEF089F110F63D0AEFBC21FB9A01CBD40AE0A6F25531307FA0CC1BA819 8E219104B22197EA0490DBA6CD2973828B6A2F5F7C21508CB8481ECD5FA685C5 4DEFD60094B86D044E5A7B06FFCD91A63A1E16885DB58C63E995857D2195D6EA 0CF0B00E37CC7576229A6A644510454A0ACF25E184D17B31533BB8231F68C420 FD60883C426CB8F850262C7E4143A2BFEC536592EA74BA9B988DFC26674F020B FEC74F60D2CDA8FFCE3D416E9130DE565100A33E0287C97F6D09DFC2072A1532 D0C6F578F44321E7598836361184802F7A7FD0AD7CC66FF7FA7D349FBD703955 63ACA757F1244C6B5E42383A78B3E79FFA352B84D6311D458FF8C66E8D8D0D1D 441FC2ACFEE9D6D55AAB05E26731AEE49A7DA8ECD985A8142D0327F2E408AA7C E37C552E31ED846ABF5A19F4E6235F4D57B09AE9016F59D98ACFED6CCF8FBC76 535D2555402589E731B07DE8B126E37F9B68DC215246FBCA7F60AAFA4E615C23 6795611C82BB195B1CD17A3E866B59B442B5D8B56994A975D3415B6398620F37 DD48892641C06B5A86065AB94A8C01CBF57487CEA8099E0A772286A6B9B2A4B4 19AA2A1B591A4E9824FAB3007D9FC4885699E4BB7666E0572359645CE99CB2DC 8231B147804275753E881CCEFFAB17B751A9B260725660ADB4395678A6A90D5B 0DD85EACAE2FDDCE250F72D210C4404A5C224AEE1BE964673656C91E5197B236 C2D4C1B5828458DE7827F3C333028689F2CBAA5F39269A9DBE9A16913B667C08 1595235F72C7CCFCF5C3E0BABD5E9AE4AA18FEA427CDFF3ACB71DBA51C7D154B 28A83E2D1D18142B0F204A9C56914F6F35C4463AC9E56D3B2AEE45814E0D891C 389C65CF38D9C4FE3B45535F8FABC1DA1B2950E26BD5DD99FD599854B612400E E755532E2FC631F591C1E2B384B19816CB9D2D3330ADFD72BD01EE1673E5F511 61F29853E4ACFC83B46ED3AECC0C2E4B9C27067E7FF176BEDEC69B2064389D89 F5DBDE7AA6207968FC3F4ED1C38422777E62DF906458B1F08F51DA52156F3175 92CBE989E5188A14121B682152E4368330257EDEC35B04F69D869A7CB26F9A83 AF7B4CAB03710F68F14F80D542C311584722CF7EF34ECF35CBE550F888D5F35C 4793C5BAE8AC57802AE37F4D29265D6742891D2A998BAC0F6DD8A632905D64C9 9236D52857A23FA98FAE253590E159C5DC0128FC37D13BBF10FEB8BF2D3B4450 4EA7498B4827F79D3225F1B69670F09B34502E8B3BEFC7380576F15571581B70 DD694C9B57AD31A6A352F0D71F3AF6C0D0D62AB8325331E4B5D90AED4A91ED7F 915E793C672D5C4619A1A45F697FC6FBB17D2783CA175588AB3BEA337ADC3BF2 93E429D53D9C1E4D8AFD47ADF1ECEFE91BB430BB82C126551D160E1E0209D15A 416882B3112465C34069418D5A7CD2A3E7407ADE0CEB473EA894BBB2C61B435D 224BF6807EF558B4B6BFA015498A0AA8E20650FF8B223B05A75EF90F00B3DAD0 BF6744A4F7393C18B2E5AC2D1B98ECC6895AD845865ADAF40D37DDC9BC1E8F6A 3A71B6BF9089D5ABFDF58D8E1AB4074D34E8D3DD699BA97BFFF9D271B841D0B5 F9D45F3CBDF39C8DC00C1B7EB7E4905E0857898F0EF8A25C0F65BA70DA9600E0 21B1B97BEE78691E0DF8A2A187200E40AC0DF5C0367D76BAF5E6557C22C81E83 B75069832E3636D0B323C19798D6BD282FE778252B8B10E129BCD420D239254A 768346826C43E0B06AE9CB77878FD9C693952D622009D111754FB755284433A6 872D9A71920EBBFEFAF82E3C0B7DE08C8775752C0C0CBCCB4E8949D644D08038 DA242706D86FB07E8530A716D14D3DFD209DEEF8C57131E786A3ABBB70D4D2CB 2A2D325174FCDC2C95FEDC414B732A6443A5EBEB73A05FA36F40BFE1B179AA5F 2D755A6BCBC11358F443307185515A06940230DCD7ED97F0606B53E3C34B9FB1 C8F39CC8B55D8005BCB873C5904E6E5C329BC2A930F8C523434E74B8EE9CE143 B329CF719C1048ED4AA3DCEC97AC428C7D346EC3B91095F286F308F5EC59F4CD C7C2D3870E9440294AA2EA9064806DDAF3F89CCA7D963A27DC2231EFF4C17D6F 60F07C6E49ABE459A6A179E497DAAA4134C3BBAE240AB84C3F66DEF1ABE981D6 4510AC402A9713996A4374BD437316A0803E32A91D75D56958C9F540DD8B14D7 ABFA2B87DE40DFBAAC58427A62159267ACDE7C43E99B22C0DE5509C76F2C5ECA 70B682A5496833E7ED9926BDD69742D3966AE9DC82EAAA01950A49F7114B8F66 8B99EFDC8F5FDB2299F4CBDDB056290347008D74A248D0042F3C61E135D08E42 18CB93207B2CE81D94C2676913DE5861C37BC7171D252C23E8C24FF05094DF84 1F9B45509E54F173DCC14F9FE29DF01299ECB634D59566569E080E3AD650CC2F 840FF8AB13412121294EB7CB9900845E3CCEB420AC27E7E1519A6A69DE1F8112 8BF3F1C0E924202D59B69F329689053EF05F3059624C7A4C8F8564CD2BBD1A6B 9CF2F83684804BAFCE3DD2B1B8A93DB9937722FB88F028D4D172666DB7B2CC1B EA2D7A7B0B4D53F1DA00F8D05C7B2C285A4E84993D337B3229DDD991B3F3EA3F A7639721120EE39336F9651C2F9144665198091F6AD5A2453D014CF7349E9A8C 95A28191EA3B8E27C354AFB8F6F0B0A4E6744EA1B72C6FC4C10EEE1F983BD904 81796D0DBDA3A50D399A216A7DDBC5E16784912C3664AFFE019241A8583B44FF E90A5DC6A734F1A8138B5452517922DB7032C48EF30F9276906EAAFB84BC0C60 EFF0EE67AF4F8A7B6449A558A8458A88CD4A620386D2DBFEAFE17239680D39A7 66194AA4158DDE3945E5E88CBF3987F4F22FA5546410F5ABCD9808CD94C678F8 92BDD49F06AC145AECE04CD13F1467AFF74C42A9A9BBDC2D9D8FA49A6B1525AD E300EDDD7FC5FDB5C1F8130CED470E04EA8EC29E6585138777544270BCC9660A 58A6C9E7AEB2DD334C81CAE743006D5BC9E8B18DA640010BB9D2E3DB280A9FF4 3A3530FB6AB8F7ACD4C38C38C355C27BFC8CE84999425C61150086B32CE61E19 2D2FEE441D0859F92E515CE61865701FFA7C800D7E288E0C9019C14CEBB1892C 169D39294216C73E19D9990F5242D3FF20375761DF756CD4C0622C54C6CF9209 F00D060487B7A420A2F74F49198A001921B23E4385D9AEA7D7FA51827C5774CF 4586E54ADBAA0333EBF55134511C33E3A0E1689B771551040E966DC85D2DA2A4 B6D35D7B9A5D4C12674D39472792E5F60279AE5AAEBECD2050C5F35A6AD54D55 F1460A95B6C280FB97B284598ADA5D0F6A21704BFA2AC68DDCB388E398137897 B9F1D60A5BF172B150E87C8FD26CD774574D56EF2FA880EAC6E509E5C6E65709 F997FF0C88B88A98255D590A783205F091854C6497DB64F71D6DDDC97A1CBE92 47449B181835E64FF2ACA03C6CF02D4780A49FF6365E9ADA231A04CBFA9288DD 7D9F2CBBFEBD4047D0DF1624FDECB54B34B145DADAD9696304056DE89B386169 A64F5178C3BEBDCC00F5B8A9E21C053A12537F0DB71F3D1B1565339512905730 14593ACFD2762C6D5A32DBCEC9477341CB72E5AB2263BB088ACA6E0FE6164DA7 FF01007C8852E1A56911E3756D2474BFF5D4A7E566FCEAC95F1511E0C1072E43 51C871DB35D073DDE60A22498537E6E0C36F897FF853E6677B99F866796353B0 77A7D197478713F67F1CA46FB341953601706352B2ACB891F3C8A38916D9A5A3 909F8A3F1678EAEA21ACEACE1754C6E6696796C1AE1215F7FE96E438E676EC3A 504D9FA5BB8BF813CB9DB27C171885A6AD33A3431FA98FF364AEE6062CBFF6CD 42FFCA8B2F9623A7582EE20474F8D8413E1829BA175BE41F15C5334D96666702 06D992F765B2A106DE02AD28A5F2254070307F58FDB19AD4ECEE93ED21A3B3C4 29DE954FE84131365211E66B83ECB97431E51AB6F64B9E99DB2BBB08A5586E20 D9CC68EAAB1B8949EF4DE724B1C2E437C9AA79C1DBFA2B4E1876AAE7CB339DC8 B6ED4BFEE7D764C81BF0F59949ED252D4EA0FFD272CE91D68A8519A8C3CDC487 1AB1C9F582D8340B42384EC7946F7A0A5EBDF1D983899D7E9DD4668243496821 922F896FE87A4AC3503ADF012B1C1C99DFD17BD225B932905889DDCB81AA786B B4E6A04405E05B5FB1C28E623FCF5DF99F9BB175AF9CB4B2419607FAC26495D8 F92FA50A6C736077F129F89912762C566B4401F530FAE35D32D21AECAB4FBABE F3B26B162ADA99F7532B5F9F2E2A15F1EFC5E09307E82022F1B6378B4CDC76D9 6E6DF79EEB8D942A85EAF5F4E2A6916A93D3BA87BB8079448993BFDEFEB67CFB F3D205F0C385DA6AF211FA4ACFB34A5A6449E301A06F90423257669F94619666 80E79F0B5042DCEE36AAEF0213EF6065A068E4CD15F55352855EE99C36E69A4C DE32F5933BC0E3FBB54ECDF1445EB9A5EDADAC9E6ADCF53D16B507DEA27AB281 20100F8FDA316664508E801F247D7E76DFCF5AA3DEC71D15E1B0ADF19EEA2E15 8C9E4C269FBFCEC4F4A302E33F79BF93917E6291EB8313401AF67628ADFB40B9 A69AB35EA87C0A54172B6AB53099FDAB1E9606C399B647DD997877F3987D2C8B F15078D6C9BECAE5BE63232F1B7EC2923D4126FE2A71C75649FB64968A81CFE0 83D4C5CCDF5BDEC342C701E43A20B40764CEAEA0F15870AAC8383C84EC537108 B427BEA75301DEC9A6CE3E0E2C4AAD727B396001FB7CE25B3E64B1376E2E38CE 4EE8387931EB437F3A429A1A57F8B289D4FF1372570241A3FBEBA82AF5EB3996 89F8E49FF564921263612813D4E75E9A51A5101F95AC0A1A3EB71351FE34126B 98AA093FA911E3C123DF14FDE4E931E8A25EB1EC7CCBBF342D37D9661FAF14E8 75EA0F3B6AE79BAA46E2F86816163568C48DBE6219FA4E797D300E246ADC29D5 56FE46FBA176F188433531BE887377F87E60BD00FD87F9E971C8E48862E37EA7 466F89691F806D02440633FFEE14A68AAB05E06314CA496A54B7DB6B0CD7370B 94503D3F7F6AADBE08F6DBF159C404D0F422B116F9DA97C19CBC38E74DEF11C9 A37FFE569B2A790A3C3EE7B1BAD0A35CACF3296865532E056B9629989809E76E 9926E0F8C546288354898009400F972C9783E0E926BDFEFF6AB88EB0A1164989 6C6198C7433BEDBBC5E3F2FCD8562ACC21572D82913A2F952DF1A482B5796740 C4E29390297226F6D1B2FE6EF2388193E21D45C113E659BDA97137D653CD2C02 103C80A034C94170A3E3FB88804CC62326AFD2578394E460017461B19124A9E4 7F4F5A8ADDE5DD4EF2B3450BECC0DFA2F5C905D6DC5933E22C995B5870C582A0 2C67C43CB6907AE90351366D72EB7E9E4A84718989B3C0A65D0D9E220D4247F6 6F4E9772289820D022DD9C2BC1C24BB8F8B27483F85C9760451F60FDFF3E3379 465434458C4EC5BBA34D7C9C3A47B945865DF8F6E5202A7738ACBA182DCCC220 CDD03BE5D9D1B2E0DC2094ADEFE093C4304BE0874C7A874DCC749584FBC86080 E04D34DEBDCD099CE69EE0E2A1CA8FD1C8210940543D29F42B29A90B160EC3F9 8E1E07FF4AC12924FC7A69DD6D77D6124D75B84C50CCF4FADCFFBDAE8EA946F5 81B1A52C748687433A569DFFFD088950578397A2548CF7A4CCE4D6B7F6485476 B3151F93C85A108647C7CBE6C4220FAF016660F4D7A105B6C0BF9A2CDDEC900F 9BF122A2A58BEC808B1A19D81AE5958DB7260F0D5F024E678FB2A0DBBD4B369E 211375B1DCB6C9E3C9FB34F62E53BB4E74A54003A162BFE6B4A39C579CEB11CF D3AAEDA2345AF5753FFA4A987B4FE2B105078151DC8C408F438AF082C9D149AA 4A69BBDB9B01D3C7AC2306C44CB9EC872F28C801467E26A0BBEC23F47CBE20C1 C07B0A46F9B8B86DD1BF084798E9A1F5ECFE5F136E881CFEE14AB4461A17AB11 FFA8505DF80EE1B6314FD7E3E1215B5840C65015CD28970F2668E1A919092C64 6FE3E9A2C160BB32C12595C6631CF765C7EEED4F2A2FD2BE5793F3B7BD20FF97 9689C5C3B54B26DD62150563E244A52443BA8047CCA86A6F6FDD62862F9601F8 93381A75F388B257E6DCC83696DBA8013EB84DFDAA2A5C00AABC64FDC0A2BDBF A143FFB6D1681770FEE43EF764BBF2DAA12E70E00989A1ACC6747481D44763E4 F3044913F3218C4D4CD7BEBA74BE789E1E7F029A0A265398278AD6C46F81A932 CCB421953B78469C68127EB07900A4EF7E402D8B4EFCC35A6438F998B9566C2C A1CA582810A4487E31F094DA115104E115E8BC232180A6C5041BB1FB4CEE3FAB DFC7789CE83C71F7AAED92B2E346DB204E103BCE050983EB7DBA4720E3C63CF1 FE5E436D502AB8BC3E26F082B9DFAFDA9FF8BC430DFA7FB845AB66F783F02E71 20312408D5B00EBC511E2078863E18BB8733C4A8F3002BA213A243DA3BC0D717 09A0E1FA513B91970D78E023084FD3740D783B0C4385E0286ADF9AFD50E6BC7E 1F605CA1D36EA085664B6CE5193CEDA77EAD0B2C9C19810DF4EC618080630947 685C72F51875C00EECD315B36A6551AA701F612AB41263C27809BDDC07FB95E6 861D063AF0D23AB28D932EEFF2E3D726F7793A1A83A0C3E917263667D667BD21 516A42BF85024D7ABB19E0F902B8F2787EFF3B7033B8641FAEADA88A251F28E6 A9B33CC69A797E4C6AFFBE12CEB1E47606671914754FC5E7460CDCD9CB5668EC 72F11BF946130FA48FC18D7D378B164C4FBD6CE8FC7E0458A4F1C2DFAFB8C565 0F6DC2FF6444ED77AF327FA3A057EC5064C685F7BD83B2EB3BCB16D6D77615D2 E131FA81E6619F8D354BD9AE921D208363CB3C98C4B71E3D310EB91AB7E60BBE 66A56E4EFF52CBA724F208857748A35A471E875381B8AC21F13E82BAD3B80B69 B0E15F74632924DBD753CAF012654BD5640A2693305D3A4246D2212B994DE0AF 78CA1A0D46FC0CB4EB2331FB631B7158685B110371715915CD3B0BDC8B036B8F 32DD5D7835EE4CA1943008D5AB70B6AE0F860241248069E5B9530BA85B0AC99F 1A05445D311E553C1D7AAB85015841E31525D69C511BD4CC8A73286521398196 D5C58B51340FC91A7A7BC09C68AABE4D55D60227EEF56F85F37660DB805EAB44 9AD43057EEBE7A8B6FBD558FC14581DF91B10DB5B60A5055543FB599EDFFC8FF 951C1C30285141FA9402977674F6B7314C1CE92E0653507C813C15EAB47372F0 091C521472B2DE9553613AE83C701C9BD7DB856673018F04586BAB0B40D4B5F8 C4551690D8FA50DFDAB8C83C8F51006D24E0E1811127D1A31A152C5B5D489F3E 99251E6F6E0A2D805939F15B608A79BA351501369313BBF232322F6869008840 7EAB6476B8F929B02E50FEF3F5C561402C8C4970C754E9DCF2F46CFA88DA513D BD5F71AF01B84DE211D3130C0028722E9412526DE349B087E7B852742ADB2A83 7D7FD4D3F7DEC56FF9479F352ED7CDD4160A7A8DB18841875D25E8EC1433CF7A 000812E8482EDF538BF4BB6C4A88793EC13D6AEC8BE77E519EB5E07434004FC1 14019CD0C168AF2E3C9EC7FC56FAC4127592C37C61463DED1A13D735E6633FA3 F025B4270B86F2999A198B066B2019C7B1AF189101F0249883B53DDB43E82BE6 C2D95E816986D5B454E073AA4D51072F367C81BED4AD0F4578F24214BC6E8954 88ADE27AEE124715C8040326A27F3E679182090CA931C4C041CB94913493D5A2 B1DCB3142BD23501B071C5BDA9A7E7F49CFF0805791E5F9C4F44F5F70FF016F8 34BC23D1370C26EE9C526439692F2D535BBF25BCB387A23883862220766C7006 3C3234A96DA45AE48F88DB17BC561B245AA7F9D4CF47B0F95C1FFCD2F0B65DD6 E11FD00743FEDE47A66D6D115979A304596AACFE91BDF0C366DE828F3082CD90 6A2E96A573696315A204B2199E1B07D6D52804F0564A19FBF1A7037D8E0289F5 1D1D899A14F660DE468E8783B201D543BA87C8DACCB29E60889C3FD4AE413D94 67E7C41802C9134BA366936C717B565B5AA40A5D93B77368FB3FA1232F8D266A 83CA12BC5AE89E0C52B0D4C095035B1CC2847C9C167B566C92E7C1E98061C77C 97443C4DDDF7FE0A2D0D708BE6C76AE37B552E1F37CF24EDD1224A959FBDDC0E 6818C8812021EF40A35F01EBB9A29945142368FB7BD60CFDCADB5A0C0BE412EF 0B19213719AEB11AD11A2D6CD0AEFE661D3C966F7848B3ECBF38219A7B2B6706 F033D3CA580689DEB2D052414B2B50F8B7224BC9D6027988B0ADCDC228CEB89F 6A0FD4EB7C2E36914BFBA82B0AA5E27D662EA1F3523EE02B5A25A10861B3C1BD D9F4EC0C64968D6E5D36C2CCB59602947C31F97C7B6544DCB2A24E55122D9CE1 A8943904D9F3655D5C6C5CDD4C0EDF0C469BE6FF73AD92566038D7561D55C9E0 3EBB58EC9BDE5BD8CF9F2949F005015BBF1EFA6CE58C556C0050A3358F4F91A4 9C5A3EE29E58ACEFCD76D4150CF801B4687452FE0A55227554AD7806C2CA9FED F117D7F0866966582A79AA324963DF6F8027F879EA899F602F099571A8D5DE0E 4602A8E42DCB677005B290051AA27F4FB4D940665344EE4643E51D2D2C68A956 CEF8362E62E4382EC0DB179E5A3529B8A073205B4F6BF51CC73543DD28E834DE B00B3C06F412D71F084588C21F815FBBFCC257A53669F7F6E4268639014D7265 BB18985C6DB6F33842F7F9E2F9D2B712E489F7890BE1712FFBB514E5CAD0B32B CC316511AB0DA252A799FFBA0CD102EB00B9B4E9D379112423F8D3D2506A2E91 7FCB37061116DD7181AD5D71A390D6D9D8BB2CC51EF3A71EF49BE5BBC68B446C 3D550E22110F07001C1C5FDE95073B2FD0D1009483E322D8680CC39A75D46C1F 358089CDC645C81AB187EA00D26138D4C8AE88862CE3F8417201F0D2CDFC67A4 294CD95FA86B01871F6DA392D1314CF4FC8B4C43ED043871D75F83B5B1E0FC1E CB325159E6D3C6130CC56F66D85A29EE83FDC4106486D1DA9475246BC780AB0E 4B6EFECCCF5E9F98ED9F5BFD84D317A4CA82482C3305D1CD37F2A00E9CEB194F EAB6227878AB0014DC322F5FBFD543DC27A17E9566F2BA1A136613ED20E9A537 41A2921C1A6FD9D4C3C327DB607FBE07AEB867DEEE3323364E4FEA4ACF98359B 8659A369750972524C4D395BB7B484353D0F928D4061B2E4071E8EEDC6575535 D2BEC084521F443A263C375E264D9CC5E1E0C2049E07859ECD40359A409B4B19 F3D15F6C72DD33DBCBD85B7B18618522B37EB08FAD5E497A431C378B57067330 A70A4F898936C4A3E3DEC2AA6EABCEC836E7C786E5FC8D4FD9620A2712D4DE93 36A85503F6CAC67F579F425F31F743393D4F7A22691C76EA06FE5A0C8E7A942E 03C4DF71BE48C7484595CC46C21982B6DEF162EABBD09412C92F74DA41A52930 8C74148D242286F6D58B92A4308C22A8749615F89290B17E709A93E053C6DD5E 79CB5A247D852EBE915BD695FB6D3C7EBFF9914D157B64A87F8910156B66E65D 44990D5EF500705FA6F0B2E33B166BDF7E00141FEE758EDDE3FB2B5604367902 DDF13E952614FFFCE8372BF782C632CD2D0500239F1E979A05B7A7FFF12B9883 E8C52B0D49A836C488E56E71BCE37E9C1B30E4BF11A876F48D5868873B1B19EC 11E85DFD85CA77814F27FD1A99A7A6CFB599C662825A2F0E1FE74D1398E80DAE E13D55B0C1BEBBF080906487873BDB326368290ACBE173A3B3F280918CA7FB98 47F6A9E44827D1F033AAA4BCB735524A5A9399218C3F356720A8DF0317592B9D CC1851B19ECB89B9DA9A9364BF74EC580CED0D01513FDADCAE4B612E454970E9 01DB786B79D82E32325E5575224243545947247948A9932BF9B5ECEAA526706A 28503DA9D9143DB3F0D413E37E238C74AD7046731C87F7AA2EA26329B56822A2 05CD4A1FBE8D5A3A8B283D39D4C31BFA116009AAD34A8407ACA6BD02EA23E8D2 A2E310373C20A2A221F72CC4B61D85523BFA440F1F70C4290D5402D233824134 777BE7D88DF334C4DF9C2F04AABFA8F192FBF037AA3A6EF93B6E35C85E068D81 E4E3383FD868785EFFBBFEBE58A0AAFC421086FA5FC2C2C93019AC34B88E5870 7C1A5E83B30E4F1A03163BBC732EED39705CA3C6BE7ECBDD1632715AB5E27041 A077769E8C78AD41B07F2323877FB3398D6F108D8E089E897AF205EA57BB23EB 3D18BDFDCDDC1F506481561C26591DA62202CB2B2D29919B18980E2467327448 6F94E0C35803774283429AB4A8ADD14BDBED4658CBDD2CD9A8978E26C723FC2B 9FAA66D6F2B4BF09EE037B2D9F097F61529F5BA4FBEA0462CC6A157D5852245C D747C311E21BCF86AC07C6F4C8F4454CFEB308EEF69E64E8F9427306725A1A0B 2D98BF75ADA81FB5DE7E142712F2EFFB12A6AB11A90CA144D3FEB86D2A41867A 757388C01B84BAC1F853DEE84F4657634E46C8D0EBC779198741230640558B5C A93E8EB7F3E8C8E08CE667C9CA3ECFF4718D8C95993F09EAC527AC2A0BF43C33 45B6EAF4FC0BD2B989C435133E5FA328CBB5B9828E1DC5CAEAB4822E8582E5A1 0203795764393268E23084096E799376AA5F3FD66802AE2DCF9B5FFAB2CF4ED4 171BAF725B98274C801C42A09822243BF34FEE1E6D5AF0C965B4DC022B7C75E2 2BED93E46335BDEFD9C0887BD2F4B9DDFAA8A611D08D2B4DFC7231664151CDDC 9AB3979FFCF5CCF3547BE3CF7ACD7B3F7FB4EAEE8E7A5A96C5AE44D5C2847DB6 B94C8DF1A1975843022AFD5867B7B7AFEFBAF75735D55EC54C51C9BC359AA764 BDB22E1669B08BCAE58F05591D065603C9E99C6AD9B0A35937B09F55C14D1F94 CCFE26E47562CA305C9D52A4CE2322C46D65B974ACE0FCD1D32328DC871D004A 936FEB1844AAF6A173A0D9E6CE4B031789314B4B269A63D263C9C299AF634203 F7773341E22C0A111CCE1E45D67B4EDC4DED78A43210AFBFF31A798F6A8868CC 77B30B36F91F6D8812743AE393E02E013C9319A79D1AF5C23E9DC4E473FB5E77 D45DB39C1C671FE821DCDC2AA15FC33A39DE31EABBB6314EF0D10857670EEFCA D5A1A08DF17F0CFB155C65D190CC5B78D2E11B539C385E6696E8FDD86BA4EF21 1676115FF8852E6ACB51CC3869B4AA7FD13E263C254924E8B89DE60CF6E1E7A1 7B1A47F383F95F02951B2720237E203834D5B29A2A9936AFA8A1B9A3182818C4 56CE2AB942A0A6241D1668C40AAAE14679EAC68329375FAF2C926A10D9DE1C1E 64CC3A09ED9F19E65A98EA7CEB5D108734021CF12A5ADA363596A32F5AC12D36 52C2CA7AB258076FC61C0342E94A0D65EB50861608BC0B5965C4B15D651FA8B7 206C355DF63F30A930EA014D7FF519FF2C2380E21AD1124B005D2424670F2064 48867711236493BC955D8FA9E7B8ADFD0BE3FB86A91E16C693FB8BC4F9CB56AB 37B0D8EF0E8FA0200D94A6DB6563F1DD64AD4A3A7176DD95E8E3BE1F7726E40D C426003955001D21EC5AEE357333AF6499C5CD36B9584350647F378FF548D0B7 DECC04E11BB6EB5DD234D8ABDBC457DF8451001154E69A0286A44FD12D1EF639 A65696C4027CCA82376038679ABD510D703605E9E7AFE4F0C89AE54D920347CD 0AA402618616C4D65B3BE19E6D1C3639571F1B011B292832C874E4C934D42A91 471B4A6A15CCCA34DF7BA3D416004990046A130BC26394FE05B2BDA091B64D71 0AE81574E54A011CC505351161D00AC755FED2884426986DE25498F3A7357ED8 46892A1DBB9A3DD617ED28C4FA760346C34C090D5BBA1D59795A532870050922 211886F945A8DBC5E628A810FD736179BD7F8BB737251DFC41DD5119781E1013 823074E22C00D6AB77820D123CB1E654D0A86E5699601ED2B85F3E4ADCBDE858 960857BB621D26AE19E2454CD5EE31E165A75E27349DDAEA9DCC2B130B0D6EAE DBA0C0CCFD9EABAC9B0FABE48690961ADC4A3D8913989062664DC3DD23E27C8E 74FC0A811786E119021CE134DD7148FF51872FB0AAC98535C9EB33F68ECF09C0 0F951626DB88E06E1ED02B277A79FD9B3239DCBB78D70C9C9AC5353B38D25DC7 F686D934D4B46B63B3A6CCB2403A907EDE9658AACC3D02D64BCC9810B909FBBF 96D1C8EF7BBC67C5AF2B494F085FFD5F47204E485456F40C539375537B77BCF5 BA50EFFE576E8019CF156599D111C0CE46C678C987677891CF6D8ACCE0AB0E43 6534F134252F1E3B9021515BD905B22F05B441395ECD808A658A415EC0F881D1 04A1AAA048417CD33ABDA7E803F7E8F0685AEA4A0F3CB8AA0E13D5777EDA5F2E 4B7E6F0D1124B7FC2B9164F46146A3F038A9CD4433BC7BCD17E5B771FA22C636 4D42DB9F6A514960D46701C97885943B917E126A3087EE9D89D1A0B320A3D5A5 6B91677D25C9A4C8F86B3CB708BD78274C1CA4DD81B8FE049FAC670A30394A02 C1711EF0811306D168A9E62F99183A7AB1DEC61AF543D17CF34FE54EAD645C48 27ED944872EC8DF8D3507211BD6B7B4FC1282E10EEE47887BF0FDA99F42F18CC 04DEEEF17FB3F659EB88D58A84FF4AEE918AB78D0DCD393BD0A54811C058F7FE F55C3F169AF4A861561AEE7DD6B0B608C3A0FBFC585C34FB9A22D7934595BD99 38133B34A1F3AD250DEAAF88E7DD106498ED2F1CA1E669282D24F7200A5A86B3 328E6F3E5074BF8BB71771B4815A8BCFCB25BA22AE9A0D1ED29AD6B8801A326C 12C9090D8DB8935F576B68976C129801DB742E179692B0A50859DE885BC08FEA 99AF1185EC33C8AD627FF56878677CC3C2B472E5015010FA689ACFB8DF7BA213 7AD9E2DE4CA06555C71C3EAC161500887C23A0AF5B0CC922461C08D92A5FB00B 0E2D57C7D882C02673EFF49B9CAA88A1F1B1EB956EB291A4C19A0D27BF0DDDC0 F50F78D14BFEF781EB50469E9D27661FF42D24DEECF3BE0EA937997626FB4143 6906F4775A9EF59C6186C4DF71646646EE22E7471296C00D7F033C4AAC3E18B0 2EA7D99030953987DF4B01179653C6151B497E98C7EFBD12D80EE0C8FD2F4571 26CBF6F95ED949A049903E3A19911FFCE9F261E93B4F7110BE110C373802A80A 7D862B2758A811884AD50F4F7ACE9D7B0CA1AE944C76FCB8283637E3D7AB3C4C DED6932F1D69900AE1A6148ADAE58DDC20CBD0A79896E6AE5669D746DEC75829 42E6972D6BC1206AE1445E983F57F2329E85BC937806E6285DAAAFF5CE02F061 E4EB342BC0F3C0A591E24A9158A02F950FEE8A1D3B9A5E2F9EC4ADC96DB1E033 8B88043DD65596AA48FE813249631C8D09798119877C60C3C337170ED106FB8D FA318D5A9AB80DD136BF6003A8CA0D2363714402D6C97F9AFAF598193287343F 08B5E7EC2B4F1DB9D81C20802E60C5626F7E436B7BA230D6125B9C10FBE8E001 E5C7A1D4B2FC9947B128A6BB72A7954A944F4D2832632E8ABE0A4737659FF2D0 9E648FC78156340E42E81B0EFC6911CF2CADD591F7EA8809DA22BD9E9A51FEB3 168B28B0A5378CF2A16E947021B5FE4F181A4F341419C793F0EEE573F362A3DC FE5F7CD8D114713BBF4880B64ECF1E5F1D4173AD935C013EDBEC55F8CBE91E71 07E62F4C93192C734B06CCD95C4D3EFCD076415520A0C3F167A9DAFFFA285BED 8B4F57889620F29BA77D82D0197EFF87CC94602BDBCF3D3080D4C461943896A9 85BD1A8DAE3044F707D8EF6AAFDB1EC2FD606C6F5D1E4D1E52E5A6B36CD05F0A 8FBDE9D1CD1C50B0AC2DB3093F9F3749B84F646344D3775C14635BE400DC8564 85667C7E502E31DD20C5087D67034AD86C7EC9A40997B3DC348356F9164DD511 E8790CB693E72B1DF8837EEF7203EFEDD6224A735839DFA7D4AF01DE361B7133 01CE6707376858E523A914D47AE931545CC0959A50740A388728F524A69DEF1A 3A5979CD3BAB1C759D3127BFF24755B52622706BD7F2BC2882EEFAB1E67B7ED5 DD2607D8354C00FCCA0586E8AA1EAFDDD2C5E756A6ECCBC0081A874D2137A487 20D901C63755971A87C1426A926E1E8C3BA2B39554D0A598F93D8D9AA476C5F9 95E21D135088841EDCCD5A3DC4C2DD8B2F648C278EC1B7BFA855C16771B24BE6 5283E6C56C2062C0AAB9FCCC5676FE27C73AFCAB5784960D054832931FEF5F0F 0DF98379806A2A163467278FF81AE9E04F53781C10554C7033B87DDF6F87A8AC 247951BBCA2B926E7532A9FF56BA52425C3270FD5D78D0B43130B6FAC6D29C05 4A1B2BED399E78812E92503F7582EC52FF00C50A05FB43DC17FB51A8855BF46A B97E6416F1B3C4EF515C47769AA51D8E3F7C91499933A205FDAA5C4D28D810A3 9608AAE16DEDF452510C4FDF80B4B2DE19070C7CF6217AC7ABD1A9C7041F4165 B7129EDE403246E0EF6FE5F48569170E7E82D871B4E7F5A435CC4E63EE61649C FC8FF64FE55DC7A1FB9DD1F30C0C34904BBB300BA250EEC78377345EF8AD7279 F18D66A5BB7B29A131CB32A4DFE546B959C84827EA2D4EC801B78F8B12C2B28A 050B50216CD2BC31D93EF817E50EAAC983E8760422F76397E18568A3E7DD9CF4 B500F5770F1D83F2F3049791BC78E3F61850475C28B616F8777DE7BDC83B4F55 7BC54D6CDA8BB5D2366BE8DA1E241E14AC266D11F7A63A550B45786074316F61 045794EA6CDEE9A2A514B3B03DE76A00ED15505063D8C805D9AD48B565A01E37 F726F4F58F3423010407E04A92B3AB194DA6FAC9EEBD60C27620263E5D935B36 24C7A81FC0E30AAE78DF1E1767072C3C2B4706C13A6BA0C9E8267553365CCFE9 0676788B1E1F157A476EB616659C92C1345F56E45A4C5D70C6123F1061C20CF5 A960F3F621D19432B6DDFC58E08F99D3CC6FC47279329B96749EFF7BD3FCCE4B 1C3D7705F02F0036D2E70511084E057D39507F7DD34B957334163AC09174CBE1 A536435BB70269E0652448B7D762AFDFCF938410FF90004C5EED290EB5E23D03 D82CF3FA29090D4876ECAE404AF566A2BC9E7EF59D9A3404C8D9486529D7D207 934FDBE807EDAC900046004370534172592BFC68CBFA6B9E855DBBB09250F4C5 F49216AFCA75E6FF040269A9055044DD5F8A06150ADECCFE38DFC01537B94B96 C991B0F6A631AD72B230AB6CE381BA86774C295D810B1628C93E0582AD995C93 B4E471887F7FD40BCA8EC4AB9C04BCC67661174181EC748308411FBAC8C28F84 9BC5D0F3077E3648934F6415E83BA0CC31E3C3A9A5D2ED47FCA8BCDB9AF70A11 2F18F889050AEFDC36A7FA9EE6DCD66D90B5C89A6926C04BA7CF8CCA48BEC58D 395269D51C3FC3D31E7AB8DD4201052BE1E040FCA7EC9FD05AAC576CA300F8FE 5B8E5057CB84D99800A65FF9252A9F87F4E2396C61216855C9E608662AA8C857 36D9AACB593DBB098CFD30D764DC2B03D8F61B3377A860D205AE370E3B20E46C 8716275FC8D087CE46CC8CD57914064BACD8EE6BE71236EA7F202402253F6D0E 3D94C17FD58BBF962DC888FCAEE733DC389B50EAAFD0278C05ACE5013D38831E 0D56143445386B5F0057CE493A1E43F5E183AF28A9957B0D1EFBDEC09DB23C02 28C0A0F6ED3983DB02E90A6AC614B57EC9015A15E875CD57BFB0EDF6866A6D50 7288234AFA8760F4A0C6965673F7B9E7A808A8452DC26CD864B10EE4A84C33F2 5FF5D9FC2D769850D291C9D92C2C11B632BE7DBD9251B9C2DF1E832031D9D844 2FB422C342F0B09E999DFABF2769638B8A4714DFA0B4D5FE265C76F88CE456AB 81EA3C5A5E8188ECE15037DE8F90DE2979EF222F33CBFA71DB743E53792A82EF 705273BB8AA0C18C07713D570EE3B28FF28F2A05CE912376B33134C3F22276DF AF516CEDCE54FBC7B5A887C3DBF21BB249BDA63D8DF8FCD28857B34679FAA530 DAEFD79637B9B32AE86A36BF68CD240C8ED729EAB51818092750AE51C937CA2C 34FD00D8E46C0FA296C3945EDBBC15D5219C42A9A4531C0E22297937DE7BD837 12DA74F0CF5E179AE8C508E6359DAF087120461D356ED61CC39BAFB7395C8919 66C7638BB4E15199C717C8C05CC4220DFEE45400330B0CAAB3BB65EF612725A3 E92859B716CF343B2F4CC97ED2B00B43F2B07F5B892035FA59071C9C33EAB6AB 3E97EDBA2F69C89769BD689697E58910922CF54DB9A819AA9D8E9A43F49EE395 E6B2FC8FD4E8CBB9B67BEA205471F959748221C60D486C2D084547F51B50D38D CE2CA4B5EDA26186571202B5600A9C08BE263D687B56086603F6DEDFE7AECE18 CE98F11163951F5C1DCB4989FDC9008A9555B70C24ADE31A27D9A7B2A07D6325 36606CAE8434E07A996BD009C67AA670B94658FFB0C87F36006C2CE52ADC3E49 636815548512E452D88EAF7972E829BED5CB96D26335445D58FB8AD9E697E4D7 4386DD1CD14D53E2B9250AEB769F5364CF73DA67D1C1E10F897970D5C88BBCD2 0D98CB35D74ABF98BCEBEC87FB92FF198F8C90B0A38EA9ED42EF5F146D57D028 7DCF7709B15DD7C624737305FB10E16669B6B52A0E66B66667CE1FF0A984E7AB DC26ADE1C860F00AA525550C2C90B0DC6E1B6BB2B0657F0565328BCF58BB10C8 DDFF66F1364D78F3E75DACB5008B13F2A6557192F5C88148DE47D617E9020C37 83052F3597ED4D5D954990DFD7817CC7F5FAE42D1EA81FA95AF407A889C15889 B98F65AA30ECB2C0177706AB78A555F981C5140594B7B3674A02FDDAF982B559 B5A3F07C4B1B09F3761E14D7355489AE19F175D8AEB2B58391C2DB8292DB93CA 6511709A729159ABD86C54588C3E02DAA21DEEC6B5BFAA6800403E753250EA75 9DC615185F5F11BFCDBB8A71B8009A4FD3D12EFBE9BFF9397C1B7F0C5F743D77 4465FACE6E3C170F69B588F885D0BD236CF8B09CBFA7347F062F98FF48A38E08 2F8FE3BFC199336AB66FA95CE2C14BDAC1AC4F5637F6EA645DCA1A10DEA04FC6 0F8D9E8F947A675C69D67E7846261889B2FBD751726395EE676E91406183DE14 D9D650ABD88AC3F4381E4B6E032FD269607A0AC256B073D32DE4EFFC4388C276 86A7EB16D5CCBB1678A77B9F900850A3185A86F9DBDDF8BD71A85D22F7A2ECED 4CFFF7180DB94F4CAF0FBC92E973E7A84BFBFDF8158A5B4712635A3D5120BE2F 5DBB638F3051A88D57FEF0888CDEFB05E64F9D16C6F87FBB050C630422B5860C AFF9F5F1725923C223CC45D77EEBD0FC5ECE4BDEEBE3F775BDE2F48F3B0DD3D6 5AEA814987C6BC85DC9F8912A7A378EA92776D8AF9FC16C81C97251A02336ADA 68D81A34F4946723576547B21349D4E2DC5A7CB581CFB6A875293A3256214A85 F00CDAB2C30BE98C741208BA561E7B9D5CEA8F2078B93F12D20F3890A40CF434 9395A7BAF3F8E896EF257EFC68A90375D9B5B43E86EB6FF32CE4418B32E511B0 E3121D976749E3CDDADC76438D6ECB69FB3AEA014262BEDCF080398D41F8BE22 A29858574A8EDA035E7E980FD6D6C2F6FA750225184FF579C1CA0828151CE013 476368CF6CE7D45C6B832124854F819F4FCBE35516BB9B158EDA42EF72C3EEB6 E75F13C0B8A918A8072BF87FC4CA2917DAD7B6C8446BBDB044AC85492281ED6F D51779A8CA5B26DBAD4B298A359C26BCB7C51EA2AB41B27A4A601809F4607FF8 42D30828188BAAF90D50ED50AEC902CEE7A5A4DD1A5C81A28EF735D9E207FB9E EDCB509F3B1C94D17047B08110075BA648C251DC09DF50D0582EF2C620F9C763 70C39E3722FBEC5430A09968A5942280BC552ECD04E22AC67DBD809C1A05A2E5 68AF158DFF3B70C25A1DE0364D627B3D03CA9390D2E4F31D1C48BE3BB7CA56AE 38EE5D04A039E7396A22314A03BFE0CF4955681227AF37FE7E07C53C1CFFACC3 46E122A8141E60812180067C5624718EA63FAFE0754DE3E6F781EE2F53896665 9729D0DF217CAE4CBC5A3A428288A5A1704DA95D5FE7E90E493E2A8B850F31C1 FF149DFFE3AC494FD181C38B5056786DB98BE2AFEC50649440FAB4AAC626D80A 9D6F6B762861E6F1E79F9C3D29858D6087DB8C98C627D85FFC29B9B3D91922 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSL10 %!PS-AdobeFont-1.0: CMSL10 003.002 %%Title: CMSL10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSL10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSL10 known{/CMSL10 findfont dup/UniqueID known{dup /UniqueID get 5000798 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSL10 def /FontBBox {-62 -250 1123 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSL10.) readonly def /FullName (CMSL10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -9.46 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 11 /ff put dup 12 /fi put dup 44 /comma put dup 45 /hyphen put dup 46 /period put dup 49 /one put dup 50 /two put dup 51 /three put dup 58 /colon put dup 65 /A put dup 66 /B put dup 67 /C put dup 68 /D put dup 69 /E put dup 70 /F put dup 72 /H put dup 73 /I put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 82 /R put dup 83 /S put dup 84 /T put dup 85 /U put dup 86 /V put dup 87 /W put dup 89 /Y put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 102 /f put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 113 /q put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 119 /w put dup 120 /x put dup 121 /y put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE32340DC6F28AF40857E4451976E7 5182433CF9F333A38BD841C0D4E68BF9E012EB32A8FFB76B5816306B5EDF7C99 8B3A16D9B4BC056662E32C7CD0123DFAEB734C7532E64BBFBF5A60336E646716 EFB852C877F440D329172C71F1E5D59CE9473C26B8AEF7AD68EF0727B6EC2E0C 02CE8D8B07183838330C0284BD419CBDAE42B141D3D4BE492473F240CEED931D 46E9F999C5CB3235E2C6DAAA2C0169E1991BEAEA0D704BF49CEA3E98E8C2361A 4B60D020D325E4C2450F3BCF59223103D20DB6943DE1BA6FC8D4362C3CE32E0D DCE118A7394CB72B56624142B74A3863C1D054C7CB14F89CBAFF08A4162FC384 7FEDA760DD8E09028C461D7C8C765390E13667DD233EA2E20063634941F668C0 C14657504A30C0C298F341B0EC9D1247E084CC760B7D4F27874744CDC5D76814 25E2367955EA15B0B5CD2C4A0B21F3653FCC70D32D6AC6E28FB470EB246D6ED5 7872201EF784EE43930DC4801FC99043C93D789F5ED9A09946EC104C430B5581 299CB76590919D5538B16837F966CF6B213D6E40238F55B4E0F715DBD2A8B8B8 80A4B633D128EB01BB783569E827F83AF61665C0510C7EA8E6FC89A30B0BC0EB 5A53E5E67EF62D8855F6606E421BD351916549C569C7368AAFB714E22A023584 8B1D6B52FC6F635E44058690002C6BA02CEC21C54CC8875B408A8BB84F445894 5D6B3E4841CA20AF852A660FE9C832F773691DC6F7197FF3DEAEE97418A5ED2F F2AE65300416227CD3BB03C29003C770CD7D2A7A2E4C1DCA193651C2CDDBF93B 966938788694BFB562AB0010268955FC3555E5984CCAB0A9B7590C77C9BC713E A29E5BD7193A4E971D1752DDD0F0AA4648E7E87BBCE66A1E836C715C408B07A5 9EB56BEFD4596706CF839BA4CFA90CAD4038C1E006B51913279A2C31FBEE5BD4 A7D74F9103CE6124F5B439CB860987DF44FE17EF88EF1BF62C67060D25696BCD 94ADF08F04E349CEBDF9D3389D870D94CC05E393B3F4362A13A6A672EE5E8F5A DFE7046AFE3EBAEA58FFEBA4A47BF61F92E2003756DA643CCF2C9DFCCAB62669 E3C2A18D690B64D907F50BCA155A85E47C3A6954C6FF7ACA36D8DFCE777B7929 5F5D5F787B9C247ABF13D6D7B4A8F06BA25CCB342F8A5071325CDA86AD71BA23 8A9695C7D1D50D0AAC267AB7CDBA7AAF46A264B7B081B7E79AD937FEE4969FD5 155A99E652461EFFB4BD010E5885631E2B2497D6B8C43CE77D7D47FE201DD46E 4482FFDCE150A1183C22C004A0AF0E1F42AA6804E038E1DFC8B0A3CE26B52038 44D2E7F759DA5C252489E5525963D68BC27C82247BEB18818C7D4CF0BC5CC97D 8C701034B8DF798DD4CE36C3F8B1FD40B2DA14EA75583852875031AF8C909EE0 04495FDCD04B05A5EFEBA56A8CAC1F57F1B8AB91FB25C81CD51EE69D6E0F52CC A0E12CF7E3187D67DF71A599FFD895FAA7BF80E2E6B96592BE77AE96905BAF0F F547355A36C443797DDA7C414AA606CF9153E03450B77D1BA4088D739DF55F07 111B9E11AF37F45B6EDE6D7AC126E05886A57C83886DA87761BE600DEECD1344 8A82BD652BE7ABFE6A0F50ED7C6F4EE12CDFD80CA7A5518692F267C51C3FE76C 567BB8DDBE09A2AF901F79AD02B435287CB8057B3D5EE6655071F67B00438728 C4C3EBD648BAF650993AFE5E2B29074A99ED0FB725D9B8CE8B0292B08A280214 C3AF252BEEAD30C88F72E322FAC3E9D78A1038F5DFC41F7BF1AE3744A0677094 51B77C2D630B67853FE5E975A395C06A4D4DA744040B272C2B88D8B7ED3A2C01 66F503C9DFD3C7DDAC865900D2A4F2CDF517F449851DB1963468D0266D7A3E58 9F6B2A1843E6444274F16A9930302DACD8D2BC4588765099A86BCCD8A31DF0E6 2853114DFF2D19F812F19AE6C2E419D7AC1BC024D1195074FD0C6717BFB389A4 4D5428E7BB2E4F9E9FDEDED7BDCBDD3460805AEA0B5F6460C2FDF19273CE5BA7 5D3AAE0DB94C6AFA8339646191C23B0149E7CBF136FC4C844E025A38935DF256 0A0A6466A45EE8B9B23B6A055856FB084F87C73BA28F1883E3B184CD813C72F9 233B78CA4E125ABD26F29B92CD9DF39D6FDC2A217E2B6B45D9B0A4D536790A5D BC0903069565A442FA7466414D948AC432C6B75D8D0E1DBB217CA3DC38A52DEF 62E9D5AE9E753956C13819D93148C7683BE4F71B80BC066D8C19FC807FB1C086 B49215DCF56A91A42089F0D063B9981925691F7DDE3237403AC714F5CC3ACA88 DB2F1DD205578C00472FD70C8BA4F752E3923ACF3164D442A6B639902ED060D0 C5777BC20F9A3BDA60FA3BC986C38136FBD2E8F910E32EF36377C9CC187F4AFA CCEC423DB925B378522B748BDF12D523804CABA83CB5A7ED69FAB9AAB75EE8FC 38D9866E3754C4E2F2B9AEFA804044D878DED0E114EA0E9682FCF38F6628E63D FE1C1B5615E54FAE8684566EDC4B616F76EEFD6207E0386F06D3BFFA26425F24 303CC7C8A8D7021E7D09B202616988287838C3DBCE3179B4FB5C726E603A47F2 8248CB508F327D1291CF3F08F7C88298DC2D0F778D24304EFCF6E074182BF5B1 8E6551811FD6991971692108E289B61053D6DCBA2925B3903E8916EBD09D97A2 C6D08E89DE4C0CDF7185E1E00DF456B249F0BFC686E04FDAAD2772DC2C39DD53 9C23A41471267F53A87E5C2B8CBCDB66CE0B9844BC506428E6150B48D2FA6363 4FDB2CEDFBAE0B7DBCE4D83E29B2955F8966272CB865EDB360C8A8C19EC62A29 03066483E4083524A1E8D80FE3867BC1AA91753C26ACBE8489AB0E3330206212 93E07ED473DBF457EB8489E66FB4B8ED8A9EA8911CF9308CFE3E6D6F36810EE8 91CCB11BD548617B2C683C354452B9229E7C9E68828BBEC324420DF7C188CCE0 FBB514547553A7E9B38AC265783891F42DA472388569C8E7594F7E8810895A27 06E456902A8D9F65CA808F1FD475D011C4572F8A654BA01D67942226A663D179 95149FFF41A9F55AE84EEB9A6A39C017D7E4FD6EFEEE7FF3CE847CDB064A4954 9DCD273B810E0F259501BA4003A3EC1ABA6E13D24C0B57FF82D6DF077833B6A2 7EA54801BA81DB961C261689C0887FAD83771E55D3D137AFBB21779397E11972 6C6CA922F45AFA5C0526863A5AD8B9C0775CCBA17FFD37A44CED4710884DBC31 5C9D3F5441595B86CF7CA2EEE42AE87896E9E60EBF5F35C2B7FDBF9A9CDAE262 3F48396F0F741E9DDF1D4FEF75E68AFB020D06CC29B3A7B2ED819D1AABC12B91 CA2A65F1AFDDA2F3FB322E0268DBBA024663E49EFF076455338FE31A16B04EC1 797EAB0B49AFFB906A0690A1E8E2F5314773E1CCFFF43E6FB3875AC907F0C5D0 DCB9BCC127014D472463560CA0CB1C2CE614D94177C7A52A5B089316689C8112 CA57E35D716D956DBF9013B1E5B9626456B1433C8C15FA906458F957133B9E19 8D46DC3AC015F7602538C2AE3927C6DDBACF38E59220C2F5AF36B68DE9117C51 04CF7DF32B1AF55B87D1D8A5F4BCFEC66F63B32B6548DEDA3AAB06C5310E4757 78AFF947DA22809B360FE535506A554DDDE5A6F2411246653710ECE5CD3185BE 730520A766C47E1ED01890059882BE1432586864E1A86A7F586438C8DD35C00F 021A741ED47E0F16DB6070ED0C50038632CA4AC2975578A8372A080CC0447C79 CEABDF2BCD5E78564247B0F0025F556DA8FB62125227849EACFB724A4AE3EF57 90C07A5B27D2E59425F56BF8AD84C5F5310FEB1BC73D536339FC2E6A5BE2DAFD 97FC835E0D52F680F80ACA37DB498AACF152B9B44626CD89E3302C3EE1623EE0 F998FA78305960AAB9F483F731F5F67A8C963C23DB8E48FB804EF8B86FAFE7F9 4C09641915FA7E3930AC922682313408BC1607C76751CEEAFD660206A39CF394 40ABE2A313AB7D5FD6444E219DC5C26734D322BA268D330AC17959A390D6C8E7 3A155095BDD66516DAD5D65519A7FB871ECDA77061EFB21F359158B4470EF79B 362C35C06B85C9A9505C8361939C6AC013F2CFE8EEF46FD8CB4452AAB3EF1FA7 DC066557BADC2ADDDF7DDC2A0E1DD4A357E27A2073427EACF9B9035DA5272136 7DF37E26D96ED4B2ACD60596E039BCB15E259C72FEB3344E3EEE3D4F17DF4233 04C1416BCADE80BD483DD8C9AF979E1C7D50C4CF015870703F88B92C4FE46AB8 DE6717B55C460C805B391B84333097E116F4A51F631FAFAB34CFC925BEE8B72B C9FD5F5A79D8F2295FBFAE649DC6AB47794AC7D73431FFE5BE992F2B5AC67049 B5208251C0E442385A9FACF25E3A98D7F5D4C2A1ABDC600AABE84769CA83350F 9B87F71CEAD3600E02FF9AC03C1B5C21C84F911511A0CF0111BAC7605EE31229 3C526A79D943D92E1CC3C38ABE82D560CFD4172F318030852A5FCC0534B8B3FE D7365987C8B48A072907B26CDC2108130A33233E8E0BB5FDF14FB55098A10EA2 B51AD9EFB119F82B08D256D396D3263FBD9DBF172D43A90ACD1A31F3E89E8571 74BE98B9560E2CD661A2F93C69FEA3FF26B00772AE2C2C24B98D3D122EA2AA8A 44652CCDF4EF4F01CA7D62A976E23E8A86291F43BFAF38FD9C325E70F9C36CB5 A181DAD30156E98339E6A0498D3420B7BB3B4E651A9090D4A17604AE386273A8 3D4AE8CC18345E6E19DF06BA848F203F74B161D6A8882991CBA7385F308696A1 BEEB0130D938A764B98A2001A38489B1334025EA848CA44A116D64926D460D64 01159E77EA7ED9ECE7BA77635BE564A4ED89315BDFF54ACE6AA1A26591D13CD4 6D6425CA7933769B842192858D10998509396829263290A3A7CFEBBDA3EE6CDD DF1E492AECDFF7941B53573F01F623CA0A5ECC9D05A3D0954F7AE8CE94AC3B2A CD4E27519B2E16F033EB732AA024BBAF74626DB55DC74B1FDDB07FAE98B4AC5C 683CFD8744F361838D343B657EBF52DEEE7AEA7565C5BEEFE455DDDBC4DCCA7D 87D6D769C5ECCF14118A14A85A86865777C8E28F953160D5E82844AE54D541DF 550D5F1519E183E0C42BE88F0458CE8087F2CD4B1B49A8E9E3D127C4A4CB74A6 2E73BF4CC317781D03FF04BC36AC0E4AF99E2ACAD20F6F8029DE8A035DAB40DB 17D237850BCDD05931FF4B0FE2D0B79EC5A88FE0236271CCB075BD194AA25AFB 3FB93A5206F61A14602E4EB6F1C31C654527CE0C02D04314DF9AFD710D0EBB9E F8721B97F5FB18E27507E1F800B5509A58A1A8296C72B7B73F99B6CFE42E9C2F B63B3555475E562672645CD374BCDE937A9B05A157FB3E74C8297507253E957B 1A9DC421946734CEFA3D5EE357DAC7E9DE17A5BDDEF6B2D2A740BC58128FC514 61154664412BA1C05209EC992A77B7CA45AB7C0EEBF590A5B5652866008CDEF7 124A3003AE6A7CF9DF3C72750CBD281358CD2FF25B162B78CBB971DB3477F8D2 ECA3EE9CBC90323B2C236E375337EA0848CD7CB5781A2B0A42DE7E4D99DB2746 0B26796CEE129D23C76794B7CE21C13C7D4A998B752C8CF43A4821B736EBE246 D2A2BD7BA3351FBCD1B0A501EC1EAABE60D06DA2FE39BE1F0AD629769FDDC933 F9D02F9686EC8C2D7455C26AF4DD3F6860B2289E3A30E1C254AD17D731CB73B2 BF4DFE90CAEECE3ED0CD3FB4C8F4C7BE1C056AB4E9B95781A8968E3CC1010003 75DFBC4AB9F6B27C5A9AD88D94441A8ADF09EB275E5F0E5E6F3BFEA0FA8C308A 8593ABA0645ECA8FDC3F0E264B35D4B0DDB86B93CD8A047FC409E18196B501C3 B003622999C47BAC04FD1ABD8AD359C977766E9643EF3BD6385306B08EE3E13E 7DA5A06AE33D17A3D574C6390DB6E9429754B210F0C349C359559C7EAA2350BD F61D4D8A92B1AF697BC620FA0351E67E0D9F41A95A47EE0BF210C2C48691901F F905F65693DCB85BE412F097480F6A7266AE0A928729DA0F691CBFFF3B276EA7 322BCD2206D96E3DAFDFB992CA8F2955F0E8B882729DFF840569D12E4DA1775E 523AA734552AAB6F2F16B89B39F1A3FF0E07EA08D13E612F201716C67F327017 6C041760DA30374434808273062C1FFA2C47B3FB578807BC26537F542040FF77 66C995EF3E8B08B09FCD3EE89C30F157158A739606D2CEAA26694A4F1CEA6633 B54933141CB85C60AB262E2D4E824A3B85C2BEF810DD774F296AB37D0BAE7182 5648CD18556ACB124246A75474B232D712C2358908B5D9A76F82C626BFDE01A1 093B8FA6AA0B32F2CDEF737B28BC0448FF816DDB5812131DA0DD5979D77C3838 B978CC3F6778A4BFCE9A7087EFB19749285AE4C92B99A6649DA349A2E0889D72 6D4FC664522F06C8C4D86D30BA43ED4E42211217D01636A4E17E2A132D26F394 EC34EA12D84594AED9C6CDBBC0908860F39B240FA7D7B3003DB10322498691CF A294C0FC7ACC0BAD1EED3E9D60AAE3F7429695892D1A21CEBF062C6129B33966 8B2EF6E932F9891DE6028B81C5E9B23278D35B7F0D83989BCBA25E20E9D503DE 144DC485F09A4EFA1268AC5E4B551C5B2F1D51E9B9B9C0FEE585204F869D0BE0 7287D7570A12940A47C1F51AC6134F03B415C30E147C49F89228855D093EE55F 172711F37776E97A99CC4B36E2F10713E36FB279FD3FA5A0EB9F3938F42E2BB9 254EB8F0C0F30391735019E02BFDA21D9813C6A22279B898EAF01AA892B14DC6 5912B9275167AB46EBC420836CC1A5F38A4EB47C039A7BCA62BC3FCE4199FC71 011DD6E5FFA0F3D7F04AC02AF91B9249B9F993AE346572329DA852115BEF8460 B94690E790003586F473F37EAB5AC2922F5F663EE2C3C0C336A8DB71650631AC 0A923A389AC911CB215EC2EC7D50CF8AEFD59EBFFA53A9F1FFB7E6215F17093E 3975F186FE23BB5FA5474C11408FABD223E1E6F62035B5A5C1AEFD8899F00FFB E729C2D5FD551E80716CEA4E8281660286A802AAE8D5834F37F2EAC46297E57E 993B09251DD7789D3467417E393B7DEABD06676B96241B0E43ED1A1A9FC3B12E 0D34B2B0792B79AA648FE9450C3B209FB6D7D91F50C52A5DAB0BC81A8B698BD9 18946EFF691912D7348D48FE68CD876FC6F71F81165D0C3272DA1A992308D9E0 ED6D0A4DAD679AF495F62B78D462B463BD4A40931172290C615B3B3B6B47E45F CEBB85E0A6AB6832067CA6D403C239530D07F199788AA4DD52553836851C5228 1072406F6D7323A334E7A7FCA588897C4FBA6D4F7DEB65525EFB74E539C988C3 A685A98752F7198E77E456A545F0D23A1BEF81EF58B02D289CF980A3F17BEC8A 6F83DD90C4A917EB0E5E2B444A608E2E9D2FF80620E16AC1D7775C0A10C1299B BEE0E1AB24C50647E5CA1DA65CFF3B2C295F0644CA7826E1DC6FADEA93D66A20 DE852F20AD224D28DB900519EB1569837139C833F24B799F7EBE3FDC14235323 1D0BCD4991C861F38DF413A5A5588B73AEC3BBFDB885CE17BB3E97B4E6A79761 93EC8418C2BC4725CD61B5E30C07352F647C3FD50083878C13CFAC241DDCB082 E53703D182068727F9EB6FACEC25F6D901D7309ED7370867E34E267519E22D62 4FC7093448BD0D6B1C43D318A3E14C92032325C132AE0FF7ED707E1FA4A955FB F5224BE0045CB14ECC321D0F333FE24EEFCC504F7C756451D7693C3E6CA87526 4912E1B6DB935BDE76FBFAFCA4ED473F1D2618812CFF25A6859C626A216603C1 361BE3E071FCFEC2D4BF2FEBDE07DBD56A1BFF8303901168FA06488BA6B76F36 95B0A90D7724E9ADB567C2ADC65CF3482CF47FD1D16F70AA19A97D0F9EFC611C AEA5E1ACCDA7FB2DF05E9480936281484BC329F0B771775E73F7FD72FE3F45F0 50ADBD03932B38F37A8F0A66B2F739EA3AC8811C8F514E68C5643E4AFF485C81 88475A523D7FCCA5C8809BD49846C77795A38DC6406082000236A4D2628B5932 AB7916D44EC2210CB941B143FB218EDE899E4C47E0081BD91A7BAA1D80F1562B A19D442C49D1295FE662395CA9143CB136751300AB9F9341255A9BA1323DDE0B DB92E2D787DB0F57D7600215E8FC23ED8E1F0D3764780499D425D7824DE64B3F 988AB0C9ED06E600942526F12590D8A239B8AC70E319262AF6A41B2D45B2C200 5DDD22E105A1F4AE4D2529C9B9A1CFBA75207C66D0B692FE7C9CEED9A54EE660 7CA1534C4D5B05FC33F83790ECFD7641DF3FB94289E2A1F6E611ADF045E0AF3C 46E2F650CC36E969855BFA34B66B0C13481151129AA93F8003F666C963A5086C 8F7DA89ED6D2616BEC5F71C3D5C65C821419AF3C96D8B886441B1B129C103CE9 71961454C9E8EEAB50A684882F5AFA6776BEB4765C6ED70B686F135C483E6923 656E924A1A3AE8B1C8F2534E57EF4B62EB5F60AD32CE002FE7F15CBA8F8D641E 848C586A3C6883B9E80168018E04A8BA99621D80DC7A610C3D0373172253EFC7 39D756DF796BEBCF86194A56E68366D6B183B9D280D500A2507D68D4F087873C 9696261BA4B1504F28F2E2081983545DB432BC23B3E4DE6BD05255B88DBA72E3 B7790CA90ECEA5CD733A8B4DFB8275386B0DC0984C1383635675696AECECD71E 9E1C957D9C75A7C96112FD17B1A06CF01C44CAEDC78C8BABDBB6D19CD7625622 334FA99C36F2E006B6BC5E2CECD68B99019393E16B7B906386BD41314D044FE0 62508D026B7772AC9EDD047D2967BD9846FC4043B6698F02B70A2652BF2F137D 84AA78D072E4B968FFA0B2CF7BFD807EC89FE33D86E8CC0D9E064EB1915E3D98 FF72969C3B7B489111702EBA80E9B9159B9ED14C09E78462829A5AA528580DE8 A1D7D829C91D8BB18DDE9CB58C26E9EAFFED25C3F6FCCA04C5B8C14A5CA5BEAE 3CB1AFF33E37F67479F8EF80A3A42C4F99C634C7928A96ECD45037EB2C615439 75E59C5AD602F8E4B4D0DD4DACD409DD84038ACE999C340F2C3E25859EE5568E E8FC05CC34E2DBAA7E12879B250EE4167B002F447BFD9F04E0AB6FC261321479 0EE541F3EDB08F2EF7A78E6E3117B847F6BE016942F970C48B1E268529A1966B 07F225E9316403E25F6EB285A30FC3B458CF677CDEEDBCB9444B0C1C4DF74147 DB4D3C03CFAABC2668AD8B6766D9136992C16465C537BF6F389BADA2E113AEC4 7CAC0B2EC47A707B59BC1057EFC24157BE07F3AE76618A39871F61F40EBB75EE 9CCB06D5B1C6EA58170CE73190B9252F6B32168F3DF4E2B864A572351F4F90D6 0A809879697EF76079F4B270D0DD59A33127186A2C97D8DC487C32DC00D12B09 2735FD215C5B2AF6302B8AD8354C733184690BBA948518C31CD2F9F774181C15 F41559823B91029F3DD0611BAAC314BBC5DF2013AD97D5443E09FD9AE4785206 26CDFFC2C44D66268EC1055CC860D6556FBC9DDC3DB6F0A809D3394159CF75B6 5FB6D4482504D95ABE756F7125673EB0250477C6BF5AB75B87D38EBACEC4ECB0 74F22D8CF8432A0F731CAEB885FBF3FD2624CDCEE3DC38EEEBB6A0355E301B71 8AAC1B36759B4F720B7EBD274CAA04908F8E04B5D7DC0464B82809C3B63BAD6A 196ABF77C0B25FA3595786043A1E7EDE37F7BDC6F002041E60272037E7EB77DA 3B0B2859F670B0AAC17CCAD6353FDFDB59DC1122CE5BD1D295694B9F64616282 5A6705C890402099EDBEE2F991BE0B2C192FEFA2971D6DB9DFB5912F8BA0EE0C 20776F06E61A31AD75817800B9D39CFAF29670B21599C52E2F1A6E98E40B7DBF D7D92DDE4B0DA61C030106FFC3E6CA7D8C6B4C477805261767E15D92BFD9B964 F31D7DC6EAFFE2E89727149100E539C2382994098C36944CBFF6305C11194740 776C523E39B378A0B99A5D43B505DFDE03CCC5709F6D808D7A7B30FB2F30031E 37B334EF2461FC64C6AE34F0689DCDC25BF04417F8961B9F7057F02C05CC9D9E ABF0A641F994893D033509BD02A6CD1BE2E607C2D4D71B58DF12E33A7A46F188 74211F9300167194E5B4FA268E63F547B486173A2F853AC326B8A61CAC51A162 D9B181EFDFA6CB37C7E4B756266FA018964AF695E2C6606D7DE79C7EB7347FBF 1378FDA7AB648DD9B822F23F5174A9EED545EE1C04CB2CB5A78AEBC5E627D1A0 D02A6BD2764D6184720129B116594A771A46BA773DC6C5FACB1101F9EC3C3868 16098C9816A259778701B8DD9E2C5BDCB070D59017A1853C7B6BD34BDDF23D01 35F7DFCA8B3370C27C03D47A93500A9E662F859355107C5C612723892FD5751A 7830207308C1E232B777E871904196D5033EEC97DCD1D2939F66C36110D1D7E1 C961E4B7C088AA0BBE7CD364C96B146D7A4AD35ECAD2A1D8712BC2B1F24A5B32 99293181EE74C1CD9C60C194E66697EEEB90B1DB8CB71D553C6329F30BA63391 1C353F03D8E1C467DEDED81BEB7C36198CF188D2912931A06E06BDE383D4ACC6 2AB677732135164A9A4F3A84B8BBF8AE06C4749BCACA0C0085206F7AED6C7A91 8D65C783CC2BC7499F6FC01FF679579555E38A91FD1091D84C3B430FBE9C878B 2E877CD7734D3874C474455095B4C88E0FABF311B2CA0BDC257E949102B7AE2C BB3836440D73915B658995F4A3E1763CA5153B5ED8F73AF9DE880E5422182B0B AC8AB381656F33683417A3C605302FC833C42075C80049D94056D61FF0E45937 7C45700BC551B371EFFA3E6FE0F152908B4D4EB47F522DF949B2B8C5F4EFD536 056ACF5A3085E09841FC381F9487C27840E0CDA2223D0CD8576571D9FA115E34 B5EC89D37AF45A25C9339BB05457DD1ADB2CF2F0E1898F19275395FD56B6A363 3E5D2E31F050BA43E4772D2F1D9E515B498D037517E9EE632C8AB242F9971247 07023AF7ED66EBACDB2DFA4A5B6C51E703D3FCB18582A78B0811A8900A28B57F D84A279AAF475D548240685F65262F8AEBE1AAEB00F0C6E59619C0D8D6C5D62A 8A5C1B479F5F565101A287B5644F876141DAF7652BE40E11EF2F4544740B3F7F C4B4E8AA84B52F44BEE6A6E14A13D0EE8CB34AA45AA36869F284B6A86EB878D1 2E4DA9E19DD6DE91F4599FE3DCDDA922A15AE2B6E4B8DF04244F58A74A11A3C3 570BE49A0789996AC4AFFE22886386FFF321B6C9575DBEE6670FE4670DE0F852 07352FFB53F32C1A5658720330CD804F69854C47184C17B8D1987B8C67526A88 FA33EF980D2722FB6593C1DBBF11549C51BF00F6D3D6338DCA737D7AA6A6F4C1 69121629983EB6DEF32CCA29C8B240318919CD17973713B9BD09270C5D043103 CF00AB9A097EECEC8A838D75714966530EE6A63A94BC9376C95C2F8D3C3EF43D 6EDBEEC52315F2F01E57B5DF8267B546838B5698AE1D6A58C74AE99888770848 FBC19653F161B6AB4AA022B883088E76616743CEE823ECAE7CAD7BD711845459 9986619A68AACB5D06AA5508E21578072E0A2FE33DCF30BF115B93E9304497C4 80F09DACADECC3A4E043F2954BE782A4A47B1E6E592BD692E0631D8C1C40CF4C A11EBFB47F5037F6AF3101B3091D1CFD2C340F64FDBA900CE5B6598C5C536EDA 3C6D7EDF4EFB9FE35B31D0368A01D62372E8C42BC6F00D2ED27C335C645F76D0 22CE7CD5B44FED1FD2D3CB4764D32854BDE0234B54D188D51C6D3FE9B789BD16 72084C525F40A91E83357893AA5211EAEDEDB035F4FA8DD715332FDBF2A5007E ACEC49C4BA72CB4A23F21B3ACF6F22F2DCC456CF156B0AEE2B4C4EC7CF28552D 253E17C73021F1C771784610B3D0538CA799C584DC86A90FDA1BA3D283416B15 0137A7BB913080946AB256345B75B2E73FC40AE79806808157F9D8FADA44E95D 1D54777F3EE01EA6238C822D66D1F456213FEED4E3E6DE9265BCC493684CA540 16A35D7364D7802EF9792A95259CFA1EB3E86E684C897F5B93F8682754E37CB4 AEA75411BB15B3B132B1119E1C0E79F9B1217218E21F15079CE3BCADA5819A57 AD11736D6D5B3D07DAE0FD014D04F6B87B07A83D1FFD7566584A42919E125BF3 14677F840C0AD5A1C4523ECD2AA3CF97B613989716D98C89C6C444A8556D50F9 26F6DF4AEA28F43BE8B6F1A3C9DA8C4C7CCB6A9EB48B90797C1FB1A9472D219B CD86D3273D25AD686F61B79089667A83057AD83F4B64867BCFCF5A3F6453B41E 31EB41F6ED391857C14784BF1411EFDE42C92A8FF48AF28081410FDB0E3C2044 0A21DB74092AF9FFD68244D866B04BDA8B912D812D9AC3979E11C5F5196E1CEE C35417728F3DE5D6AB0F40A41ED756CD8886607DCF7CA51E69F43D0E264CCA89 ED16688C3183A78C6347ECDB7A98FE4A3444AC357C39E99644EDD2A437AED0E4 E668338328DB73F302A217DD5AA4732D596DC44269284501E140EF3ED7A11E75 3212238D4C1C5AD807931E4320951740A3D6EAC82CAB38E86C21BE47D7EA2F75 80F0C3B900E16EE0B7E7B2D75620AEC25C80ACCA0E12C0D1636FAF87C37FD628 26729DFB0FCAC30F26268AB820B42F998289B8AA810BDB74FF4141C37CB3BA01 02B453368A944D31CA819FEEDAA611D658DBD78CB23E3B870F3EE433814690F8 F267ECC3F84890AD1721FB19E9233EA2349D3A872C6C7347048907E0E3C103B4 06D9AF4AD03087281F5199F6F9D9DD1E82E0E4AD08C7092BB27F0E3B3669C363 6F94285DDEF54443E2AA00DAB98ED5E8E75267F509DD44FAD1B716A7B4F9BABD D2CE270B65888B06E63FC1B434C9C06C8488BCF511CEB13A2EF1DBA22259CF47 E092A76F1EEBE7B683826C60FD5936A99F0ECCE5568B710F1A566C5D7840EC85 7FAD5C66C43C4947B9AE64063F0EBFD7ACE6B33F1B14016C0841E7D209F2AFB5 23DD2A14801F31C2A9D38E9D5B8AB3A27F02136764B0FD87FFD72D3E974282EE E3D5F73D3D8A5FA892D77F681ED14100A0F052016F2EFAE1111C8E0CE934878B F3D0F6D53A435B192BD3EDB29DBACAB7965F9B1201FF820C8DBEE7930FBDBD8E FB9B92ADAAC8C87390E831A2ACFF606C6E6E6665ED5DCB97047C08FCF9BC2CEF 68349BEE89FA4CF40D78A21F34589B86603DC82E7FEDCC3D920E6C92ABBEDE59 812DFE1E0B7AB964CCD623B7A654A6B90B4B9BCF550F8D867CEE19C2FF29A5A6 F5C7E4CBC1E1A6672B852CCBE2FE12A7658C3B4528EEC90AA840BB177A184CFF 5252747FEB6BE425A11E5F549C2CCE60C5628E9EB4DEA5331A42BCBEAD0CA405 E88E03863FA67D9CBC381C27BF6DC9B9D0186A6AF0231A2D893C4A9EFAB09F0A 46306A823C1597486A1B1E51C78A5A5AA7A7963926355667B0D4B44A0F049AAA C777FED482D04AD723965826065F786ACEF0E189A08036FD583E2C847DC626C0 FAA6E85A1BE50AFA97D8A109F667A92A7B4B45BC559C972144E61E57C465A87B E65AF2B13D8D83675155F934712478DFD234B2D2B9F58AD1514C54D6F61EFE57 F8DBC7F62552AEFCEED31B8B4192782402D4F737A2725FC02EAEBDE1146A4FC2 44D0D16B12F9B9D181C0A853E4FF1E61767189E78B920A02FB968356A93D064A 8E7DBCFB3EB302AF9F91A5730B7275B47CAD0F8B7382CEF9799E179E1A3E2D6E 417743C8079BEBC86CDB6620B0E7BA1C2F665A34BC2DCFCE4FA0E9268D7A4A57 14BE2EA2B0B3F8456A954D2AA8C639075968CF49812AF44C27A6F0DADA2517BE 42AA9BFFCB2FE1E817CF642528F97818D1E2E31E4DF83753AE4E71969AC87690 0DAF22E7184F784F84554B684AB741642C85EE960AA2572D9A630B49218B5363 42880BB92CD0E42ECF3752FB8E40BBB3D60683D599D4F225A9A39889ED857951 9B721005315D86102583555140BE869846819368B9CAF76590B14AA04B30D190 D09EF84377FC2EF9050894E9AC3D50AA7E3A80D753836031F5036B6653BB3813 78FC9B0A50B27CD53E837E77D044AD69A10B2DB184C57562ED933372CD0ABDDA 98A2DD12BA0EBB65C40F080B50070EFD0B9A3FA4BC6BC1BA18B690609C1B3E41 B2B73020280014B498B093FCE67436FE1FB286FBB292F8251C6D63DFCC0FD0E2 73F16DC299E307A15D540EB0CE80683EF679A353816FA0F9C9E4C12A74E602C3 59CC87E09B987040CF2A3D19E3FF1C878AA4CBBA5E26429DC743C40F6DD0A06F 010CBCA2D3F0D3052C23F61FB4BADA2EC81CD65404D4E34B87562ABDA1D3A444 38D80E5EB8B5FD3FCB09DAC2B0B14A7D05F558A80FEB0BB2FDEBC9880CFC7EE3 39BFE6F1CCDF04FE0643B5DD29CF46BC063A338F2BA04A7FEEE77EFF23778AE0 450C0880D22C83F4844E6B5B70217C0FC9C3E2B762C26D2AA578BF350E56E441 C001917B00B797A8B181EDB476D678115F4FBD7B0E68DB673446843A3D4060F5 5E28E1EF4CA56404B66C3760BB3AD181EAF6D931408A4642F83E74347307CB41 C24871501A09E7034D24846816013C63622C2B3988C7BD537E8B606EFE38C54F 3E79BDF8699F2AA4D442EDBC4CD77E22B0713E6E91321EF2B562B112080C5853 4AC61A1A1A9E7427C53DDA5FA3C6D6C673DCF6D8806DA63353E959ABB5F5252B 4700FB68AB5B760A40CB9CFA57A34E2797B9573F35330844FBA50829A6BC9733 E2BFA19CE0FCE16C1753841F941C8C0D8F04CAEBDD03C81DB87961B40E206879 726AAFD5671F2ECC4171FE8420E0DBC0C3A37264D6AC158960353B0A8872D8C6 3C2AA0A855516B189FDF6254B79C7DEFC5E7D996C9CB4AB6CA3607507CD09A9A 6F69135921712F33F79FB7F9B25E07792BC2448A5429448D95000550D703A380 9738F3C6D96A080004CEE63E312DE9144462ED6A6937AC05C45C43D3594930EB 4987200452E7B545FC08BE7780FE43AC969B2E526FD85200608E8045730A5100 EEEA7DF27E7DDE1EA5DAF4014EAA62F99A4C0DB70DE22408DEDDEE9CC72B5898 C4AACF3DF1247AFAE1D084673C615FF175987BA8D330F48B0E5FF7C6D35A40F7 D9DD91FB136FCBBAE98903C966A790512B68E3FF81C29DEAE761FDBC0968C5AA B0AB1A379DA59C87324B6FDE73F49FEA51C5DCCF18B02400EC9EF1089E329DE0 00A5EDBAE2521FD26EF268BBB3301CA9B795626F827BDC36A65D65CF1CB46C41 6FF7E189874F799DD98CE43562639B493F5AF82658ACA3C04373864BC6D55D32 17FCB7BB39D43D965A21250814A4B66743443C7269E67820821E5D8734B879CB BA42D56291741117C96E0A6184945BB666141D19710F7352A6F812BCFAE7C08F 6D8B66A6EF0D12D9C24E010870327A8D6581E73DD3F495530E7B9CDAED36856F 767DF09A22079197B489BE15977A6FA73E75D13C57FFEAF1336FAB9F3B249492 6484450DE0AFB8DBF96DF34D3D8B14A793849E46C038FD7472DC9FF42D793FDD 4E17286FC47044F069C320E87A5266F3E4E931E8A25EB1EC4BE4E7244BB14335 C17CF0D201C6852748F4DE22E4CB24FE79B477140E94C8C6CF7F53388AEE3681 098F28E1EB9E69DE94EC99CF9EC7DBEAE159A686F1B5F46152764F77D1772460 39698047DAEB0D326FF041C2CB27D13E7B5D0A25C8B719F6B28AAE6A3F7BF76F 35D47C474B1531F52A4E629F5465001A80EAC11C19A5C10FF2A66C667861F0FD 265D37F9B8C1057B627E86E6F17BD77760A627A755F8B481993158F8EC26513A AB956B6F48EAB3474DE5979C45382867983AEA46D9768EBF70222AF86CE5BEEA 1F4BFFA0930EBE58C1B501B64B8EC8CFB1DE7A6E8143C45428A049D73311419B 3019BD3B173852E1D6AD5072D9E61280935156743BDCDD9F2DC5347EB740D73E 6E7211841BF5C9FE5F54347134FD2A2922FC8BB2BB65B9E7BD9875A393C38E49 A047FD642883BEA60BC0713BA27942A58F91421447596D817FA380E31736EFEE 2056436720CCD7B12D622E7A25B7960B5BBF0B883C5951C5C94A25D6FDD745C7 9ABC8FE7E1D3344F6AF62C5D12B160FC204DB2CAACBC9349E7A31CCB9C06911C 14331E485BF4BFF2ED8F5C1E7FE952C244D78B37B01C68A920121FBD4CE22928 FC90C050A35703F8239278DD20436AD0453F39615D2B0FA40080E6254CDA2E6A 446C30736E7B04F1B25C34E5FAD63918D006C2663528FFB9C01E4C43A7A14A88 352461FF3BDD2EA58C8B26E1FFF72FC68CBE2C3023ABAD67AD1393F865C3FBD1 FD27029473F4561893D38A06E7309EDFCCA3C3DA080A5448A57AAAA1CE0589CF F7D37D9EE422B6650087D6A40AC99F35BD6B817B6FD64AEEECB5047C2B2B7DA2 112DD9A861B10B602B94E210B6ED964BD4E6B2DDB5A1223B6E5B365EAC014D4F B55480AECB3D7E303BD9F06665623774FD0D8BE92AE9205FD97D19AA4EF8D79C C73747FFE96D322BB13C29DE7E3451BD29A88BAFAE1FAA3800A66C4B23F8C2C9 413EC105B8C1E37B6F0E24E2881655106C24FB2948D80E693C96960AEBDBBF72 6802AF92EB4210EA486996BD96ED56E2E3775643B215579A5FACC833F8165F12 FDD1CF96D9AA8A8824BB43CCE6A4F7B35A321C3901FB3A4704951EBDF065200D C60F0724B90C111CD165D09701EB04079F8E9A0A2A9E5B453F4DB2401D128E56 2FB20024A02512AF433C491ECB141D1869154B83836B429542FA11F42462C943 54238F1CBB82ECFB9C3197584BB11B3798137279A73BFE9CE9089C141E6BABED 0FF686DCCA423C3950EBB34FBCC56B2B9C5AAE14156D5DD6A82E1788ABFB70FC 47EB604B7277588F93FF573E3859E18DD39ABBD10B1F7028697E1747A35B8E0D E09870CCBF0CCA39D777AA5D09E1AD302771F4FC5796E281B0649DCFCEFD6AEA 24006A5834E98ED57E0459C1F7AF210A002E4E220B39FF671BA9739335C7F8AD 45F81F7455362F6A7B90D311C563EAC012C5E37E446B01C8BEC8A299C49D571B ABD1094CCF2FBE7064D0CC0F20C2F3AA56384300F918D26CD935A270D21B7CE9 8E858D42559BC7ECE6E7DE94272EFD727F8A66D1B9051618C62582D3778EB86D B7EB01B5066E697C2246B3D0DFB6701D3CA8799ABCA098EDB67185A494450C2F E181118238987A11170CA17640C8AABA8C1A30144BC6CB7038193E43E3849A69 C00A216B7FFE53276B6614E96CB98EFC9203D2E42670B62A0FF93618CEC8793A 66250F4EABCBAF2E092FA31A961F7DEF81A88EB1FCF1235F098E9C180E46C9D1 250ACDAB09F4C0564A0139F545A1F54767ADD4C3A535314B9E4B184A84DBE481 1F7AADFE0622452DFD1E50A4C814AC8A7898A2837A589069AD2D06ED121402AF 67B6637676146A2DE12BAAE3AF6F4F4890AFBB51F84353A37165050B2CFD5146 43C7DA37C461C67CB403303D21850FEFA9F6374900AFD038589771C2FA82F15D 335AE7E77B669C7B0175E1458423D9C5212CA0ED0736F091BBDFD18E3ADB4F0A 92F3B5648B4FC8CB033AA0DEBAD27791CA122AC7A565EEC24753D00086EE9829 6D8CD612546EEA5DB930DF880B98FB18B525139A57425309E16B9D8DAE5F85FB 7D755DCBB68F1127D0D8FF7133539317395087E274076013A2D23640AB5B8D4D 8F0FFACF5D4302E9FCAE52B52A3D6AB89F75C6EF073389056A4BCE656D9CD34B 77A7BEC1DE06E1BABE7B2877E5BC0255C0B061814850AA4E40F543161F069F9B 90E37C774D60EB58CB06E9CEC991963D8C681292CE27BBC664C2AC5DD2FD96F6 DF9FFF0BE8F2304E58FD0FB6B72C315A7A328D6B91B65F6A7FD54CDFC8579F35 D9A4A558400472F1F78BDF9828FA47B8F2B81AE0B9BD7AE769A85C80F24C941E 3808F97EDA28B59E15330593E3092483397C77AFDB09B1829DAC3447415FFF1F F8299A02C713A05BC2C5AF517EFB73EFF2F8EA67B953F74094A36A00E2E9AA10 6E37A0B88E346034F2930E2729957ECA1C68B124F64D7A3F5C75B9B22E52C049 3ED559B8126891BEE1BAC6631F53748E97F5142345439BEB39CC633A8334C9F6 1D7E38BF88BF6B6F6CFB72E0718812AFF71180DF31F6C430434DBC62DD8304B7 8E7DDC28C377AAA8E9290010DB66EDA36C601E31728296ED9FCE378C74A5DB52 6F1FA85BD8AA34F3D109D5E7A41C0A8F008B91E44CBF555FF74A74D828954F05 139D802F6AE04A85730C79D816BA61AF326D5C44DB6E2F54759958A9C94E4E05 1A59266160BF9FF1A57FDFC046C7ED3780C73C897C3D97BA657C20578B29D199 CA857E13A6E827EDB070D54AF9E30E3BC9DEFCF6B67A066C2035A8C9AD1EA1B2 78F57063004DE62A97D4AB86A2581435566031AAFF0904EE0D92CDA93A2E7263 FE19EF30EB7F9A18372DD91C1BFA06129BCDC35229F2085D780ED607201F4CB7 5B639F48C7C15A292984E88199D9D21FC2C3377F7B12A0CE48E1DF0413FA2DE3 EA1D90AAB878E6EA21A1B3E163E7C11EABCE081B28952F2C52AEB813C01E4CE3 A3D27162CFEF07F93366094B50612A312A874A1E4DC97359228E9E57FE4D1391 7DB6D9C7DC0F0A3647349A0BBF35397E1C201633BF6F70A5AC61E2428275BBBD 0A2C736D5CA8F63070D8FE9BF523DC0050FEDA34CA19D805C80C9F9D67BB0B7A 3EFE7F72419A401C2A5BE285BFF637D78FF0AA62E25D68531B855C4D8BD7C5C2 480BCE497BA7869FE522837DD4E2D82F34203D19B0364DE03458C91E8D9045F0 78BEA566B35E4D997AC3192665879EB46719B704DC9D13FB7BFFF465F4453B7C 31F305EEBE91E4750D6DB706A912941A52336F85D3FFAB24E513B8FB13D633A7 0E9FD89C5C52D7107587BE8472C885C8D34E6A53C9092C5E2CEBD093C8BF1CDC E99259FDE6C32FD2F94865F73D997317789C7AE9A3519C515FC92632FD9F9251 959475A557BC3D84C3541F044CBB41A0DF238B70C65AC86BED9A2E3905F6E935 5FFCAB2D0A8694F762EB8B579F5E10EAB7D9DC2BCB0AFE50C0629458663CDCE0 DCBCCA2FDA7E4B47FD10F8BB66F717C1431EEEA9E2F7612BDCB9BF6D23AB68CC A16A2210601FC6214C55A99C06E3AE450F1DD4BE8F5B7FDA83BCC53AE74BDA3A F494E088B1EBC025151AE00E4A605F49D13940F2720C88BBC9456C9918361945 E8156B28DB320DF3569AA1F20CA391E24749F2A32DBCB1FD83F4E6FB7C7698B9 CE4B1F2107EDD654DABD39DB889014F9B5F2082BCF5B11DC821CA742E0AC7B0B E87E71871A8E059001DF60A7B73E4E2B0CC7517B254D86BEECFCBEAE1AE8D737 E3633A9B4F77815ACD56745742C282464D23EB3EF79E50155A59795068642953 4ACD59365DAF0696D2F7D927045C093B078AC77F842A80602A653E1329123724 1CD816451AF64648F3876F71A15A36F8F222B552ABC90219E679B47B1EE8F63A 73A50B817166434676A20E19184A6F3974102508CDB10D98ECE5D0ED9EDA5E1D EF274A12DC31A61B04A24FA82E22F9FD63BD12524A660871743309D67510F6F1 127D9EBBCC45A75DB13613A939BE94D4D9E9E03C67CD2C785C575E7D009D6DE9 B41CC6103EDD44987BE676E230E568090168EB0BD821F8B995A7B153557EC97E 2F26B93566BE3E704F024FCF557462E89947CF3EDE42845233D0BB4B458D0AF5 83598840B9A5D09E22D7B19D768C2D9DE826E9B7B426F5A275204BE4B15FB2DC E19B19D1A5ACDD112DBDD52A13D595A4FC5CA923820B1A2C7463A9519F7112EB A274D49D9DA6636D48337107E425C463D54B630DA2847EC1484E8379B9CFDF55 A6F65F855EA63CF8025AE452D6DC73922B4A2993C33DF3A8F5334865849F96C0 45CC50FE6111CCB443B343C018F034AC1985204489C46AF77069A62D148AC49A 8BE359FBCEB2A93929B92F90FE9FDE88B72606B3F1889FCB079D9A14B438F0F2 0C0496674B9BC3C412AFAE97291470830026AB3163F66F4AE030D1B10B0EDBB7 EF47B7741FDE8468DBAEEE257A3560E90DB916EB799245B60C28F6BE0DC77BC7 F7CE33138D82FC4F8A923A27DBE29D769D3F6197CE1C473161E5883D234676AC 55F1FEED186566F6B21815E1D8B5ED66E6170E4AB1D80B7533E66E8882355F35 FE636CD3A8516E6937F64B3690F877012355F09C1FEB31C80044B4F156FAE3A1 4704B6A66267491C9F36C01A83F2ACAB608D02AD1C332BAB677F1039D5E81F87 F735C9F7835D03C3F4069EFA89A254D69AE7953325ECAE58C7E31EE977DCD427 A78ADB28062C251A40E51A49DC7B10A8CCDFE3BFA60416B3B1857264C047C9EC 1757543978CCBCD31FAC3FCA0061A8210733382CCA5D3ADFD7B1E0F4CC468A2F B2062095C1D28C7A3E511C98C0B104E8D23FAFA8396AE7294AE78DB4C72F470D 6128135DBA895FC900FAC32DC769E5F0EC90BB801D91E541FF5AB245A2CE5C45 4BCBC624FA6E1E37A1698FB4EF7AC2A9D5B5B647E179E61BEC74700EB8AD2B2C B725DBED07F9061113F6BDC8D2875E913F93BEBF07575429162F52BD9D0EF5C1 A8E769A12D8ECACFF530B61D9D60BE2DCE297D0862D85C487A5BC18EFFEEA50A 49D8A6A95926E29CAFB9CF2BDCA44F1B95F4ECBA331CC4CD38C55398E896E522 8BDFC99DFF9545559949ECFBE38AA75741712E422BEF58B19EBBB118FF59951E 13E3852935ADD691993E963C7F5BAF3317BBDAAC8EE3DB0FD83821E66B7A802F 49511B3A1A5D98B345B85EA3F9A28E9CEAF24C9717C0EFCE732018052EDCAC52 DEF68B77DE42407F61860FA3F1EBFAA68DD2259D56C2CD8768EC48A78F439F87 72D2B4EEF7740FF74AD424D090892385DC1465CB07D1E82D1EA7ED3ACD2534C6 575ECADAEDEE6F1B7E1F4E41E8CA5DBBCDD2C561FF874DD7193FCC2C73ADF6EE C0B1EA5BB5FF8196FDD11158D32E837802CAD6557A0F20714741A3FDCB22362E 5E8FFE7E62994CF72B7E5C73E4EFF135567CB897BE673537C6DB2AD66E314553 00EE61DC228462911E9E3C4FE36EDA857690C9513AD841CCE5568F9F08DCB89F 97BECC281172459C0FC06490FFD4A89FF5388AE804C51B6A2BAF3A72599FEB7D DD5BB072E876DBD743B6FB09F6484D55B1363B8B257ABCEF4F4CF07F6E28FCF9 08716E8D1228FC0A39F6797DE1E5B41D71D64E94259CF70D4556E1CFDDC532E7 7B53D22B6732BD9642A519CF7F1DED94634C0BFB1938FB8A187FF5806ACE9E87 E65336E65EAFBE57982E22E781BCD8FD231A70421C4F9D3743A88D7E59D06982 670258BF42255EE38E32096666B0CA87217B09054B401E804C8B70056FD4DB21 F24F3536D093C162C63A7323161A79F8E99498CBFC064DB4850D7D9B2A6B31DC B1822802CBCCCFB0A52B7A5479672C424ADA2DF7E9CFCA05B6A4F7A90426A532 67D899B51DAA5265975C3CF76F9411A0BF254B02A55DAA0270D762CD7B8F6A60 8CB1F0049F3B2D23FC158ADADB906D7B046B3C16626D686FEDF679220EF2E1BC 91843E21D04C9697595B4A5E4845BF4F267CABAAD17A112C080AC4EE278FAB7A 1398E645636546AB9A19D5C32171DCE8B62CEC9AE673888F421EDBBA9DB4B2DD 391C0DB01990AF99C3AF93F933DEEB1130A92781E767E7B12C78A17AD73CD338 5827B0B9D9F7E31EA89A855F2069FBDB053E845E9664B22A07D71DB036B7D132 326D9F920839BD204AEFD90FF6662BBD2C0D69ED02A365E7FFE93F5631E1A5E3 78D8546EDE7E12274FAB3C910432711A72E6B77A02A2844D1EAA20BA5017C000 D2AE8A8800AFB2F61F767CD2C6CB2A1072C4EF6196C3B283A33E31F119728B2B 486D11181FF9F9E4A127D59FAC0651758064D0E7A55A1DCB843180EED5ADECE3 CCAFAE1C2C09EA82DF6ED8F41F0AC63C57097080828987907EBF17350E804151 D20C9873C47647FD395E12CF6F42243C234413B027E98FBED0F149D513DF380B 8E178DF46C8D0A1B21C5FD4C6C779563877EF1962DF0DEC85EA1FADA15F63216 2AE87C7061DAE0C6496801639118DBABCAE5256A81143DF991F7E1FAAD69760D 4060957197CA0B132137F444A879EE2874A483F475DFBD8C23C207F9DC5913CD BC0CADACAA01ABD4520D24DFEE3E1EE1C2630DE7FA30424BEDAC5D407AD4C431 6936808A64F246AB3290FBD915337A562DC62B31D745C3B4361384A4913AE91B C0277F2B3B25884E8A9D14CA90EBF7295656B0B4873EB27709723ABE4411FE8B D63007DA70EC6C445301560B46653974EF4821E130C4C518BAE8AEF320956C84 4AE1BD9A9090D45D91BBA00CE7454D6D68C382AE11208030A145EBF97A0A58B9 7007E108C0DD58E0B56F7331AC0B620E9A802D4CB08FD4B78E9DDC73AB6CE370 40CBA5DF2EAFCF6FEAA79DF4F5A2A485231E7556E6444AE3530A9796086C5CC8 E3500A782D3138D232F8117CC07BA5C793B04A61150F0069DA07411916F86A9E 7A70E106C9CD4EA1D524A0CDC9575A300742C10B3342A4BE00357ABCFA06F62F 63735D9FDBB769014EB7D026C3F25A0DE547315A92E195B8017D12692A37E6BF 739BF6CEC107ADFBC029A15689726DDF8927A11A7955D403C928A64AA853EBE8 4D40CBDD6B3A635F8D42B3D822CE51B9A0C791B99782DB650951D2D6F8C0EAB1 C79BE20AA1E94C977A17446EDBFE88E63E5BF372B951EF247BEDEEF5D7D07A28 9539EA5B8997B4BBCD505C70F244719C7DA0DD49E0461C973DD40C6DC898D3D5 EF24D73B280E29ED4F35B75D6BB8310DFA527F8D77186021D0A5C354EF28836B 7F372F57E15F81639914D6BC1D20DDDB805DF9A25662A0BC856C05DBE92CAFD6 9A835B900B8591E0336EDD73DD5AF329B41A428F9D62E11DCEE0D128AD916E59 AA2C90E2975141CD7E2CDB20651E43A9A42428740FCC3839BF8C0E7F051EC15A 2F61B87DA2615433C1D40D0594A6A4AAB045DE1A7E37360E0850132104859146 987F5984D321AC929E33D7C10E29952E525FA6477D3E8A1DC65A04AB545BECB3 65CEF3D4A6F613DBD74DE4AB848DB96260CC57475AD1B1AAC1AA77A72097C8E1 E7152AC7F88985E4CA64E7BF1C9886603EB500A057799F1A158D98C5D40C2D85 C6F40314E3561731FC43680930D4186265B3EC9EDD1039B29F691C9A539DCDCD 6F52D1A34CB75B2CE57AFCDDA93345FED35A982F6978705EA84ABE4459742709 34972E8BAEA062B75872542781457B0EEB5F3DFAE3447715A49680099CBF5F96 ED1E241DBF4CDC8FB0DF2857C247074D4FCFEAEA535835D8643E1CF15A66695B D35FBC76CABBBF03C6D46DBFE525098DF0512DE8953BA493D1C2F5F3E2EE8551 E9A2D716D8E2EC90D269B5A47FB89765AAB623537F3B21D4C63145D70C5BFA50 EA822EB1FB47C6E2A264D85D5B6BD2B60956449AAB8484AE8C066AF02C6A0D7D 7B09DC741C521747B85A1C0C9527CA36A58AA56167404558E9BE6F1A226CDED8 C9EFDF29A02CE006A3882E3D98EE73F13FE946BCC151C4A915DE06BB4A29C994 B6A4F5CF22E4B24C20950543D0A4E90E367979743ACB585C705E5F4FB004EB88 A9A0D044F8B1806A28C1CC6070FB835E7C5B5307A6F1F8523E200FA5ADE5A55E B6466565715160144543081619E9AF3E969F27B78AC0896ED5B37516D2D428C3 2459710E1FDFD0492DCE46C805FB042F51E7823924C592D2044D4BE09C391642 AC99C56CD92E17D725BE1D387C1B78729C0256BC44B156354D0CDD354FFE526E 4007D823F44C07A11C8CE7986BD87A36AB0BFE5B4AD3104C31AD4E2B088A2231 77E25D841467424D05398CAE32A07196059A8ECC5871AC47F104D5CA793F3E56 0C6CB116A9C39C70550666C2F3B60F96A51F8D6F388F8E78D6529EDDCC75FA96 E47318DD866D1B5FB0916262B3445D0BB5686F399C14FA30969EA1E944E404C7 45BBB253FEA8ECBFF31249E2C2C24C4F6C3DCB07EF17BD5689483C6AF6AFE0FE F05F1D5D3F416158A7E6689809398E3EAA65605388A308661B39D1065E73F1FE 66536ABDDB44F045771314AEF2F2440A3DFC68915D6C2B2EA7868E32BBF7816D 311CA89BE96039B0BDB71F836E075828F188FC9E540DB7B66BB48EABE4D4EBBC 955B290196B67980359F47D2A6DF199CBB26398F68D23C54CE7153AB9E60531B 3FCA0B4D5C701996F9AE8BBDE40706156424827C23C63E2ACC5FBB305ED75280 71DDE98E22556C54E7529E94D45C02539651B566519A3270770A4643B0A9054D FC56AE943565A1338DD352AD3D1DB4203B8089D572BD7FDE0C0A416E9EF113AE C495AF7DFC580E2660FD4782FE723C8A19992231198DA855192E75B46B78BCBB 9AEB1B2DCEA01608C283C403C4119C38A4C9A814F6D3E2CA26A27B13D84CC184 5049B092707789A918CD538A9DEBD1D9BBDFAE3795E2352CB20104EBBB64D434 5D69E8E06D27E100C7E3FB6AD33AE22BA712F9F8B6291DED9DD6A681ACA54208 6E8FF8F59EA221EA5B79B3AD4509582651FD02FFC40D3EF34098102A33E106D1 78330C63286232E171403EC83A558D77A9FBF5E1DFA11337DE9E8BB8CC4C47BA 13D666AD34D2EAA145842334478970008338075D4CC919ACE44690B2F34A09DA 8A4B418D62D7D6E7F006306D527D4F3D68ADFEC19044945CBB31DE9272C4800C AD3B25EDC80EA92AE5AB0D5F53934D00009A286CB3B54343A4CC4A8CFDC01CFA FE8FD9767FDB2F2D487D51DEF410A94501930A33DDE87ABADD7DA900BC28BE17 02A3132AE28155A3A492837489F15F0F19A1A6FA2FCC888F677DC2000C94BD77 38D2F907093A83BC85EA022FA9ABF6CF8D43FD415D2C07C172887340B992BB8A 9295AF7576C7AABAA5DB47E1B4A0A290B044FF0638472E0361DD5880DFEE32D2 EAC4874F5FB274EA1461FAAAC67811CC5AB69704027F31A7C07C768647BCA60B 77DD5D5ED9E6BEEB314A75066B52D17FA7017754C7B19C331DC6D3C520F964A5 A062AA030B26EA56EA692093A74FBDF8316D6927181DE60D9BE8100BC13A1FBD 375F5D3D060B0155C158A6739F53E41A4C974D2DAA6397DE97019E9B75D66459 E4A93630443DBDAEE7A73270E9A563189E3ABD503919E7BCE4334C9900A6ACE7 A27F8FE87F5901A57240DD522C244155898A4123307F561FB19B5A7F38B02734 57A13E87CCBF69177F25BA91B761F6CD59AFD0A3974206F46C90207D83E18FD7 5F51BE61BA8F8AE7A83AFD69A767D1 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMSY10 %!PS-AdobeFont-1.0: CMSY10 003.002 %%Title: CMSY10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMSY10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMSY10 known{/CMSY10 findfont dup/UniqueID known{dup /UniqueID get 5096651 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMSY10 def /FontBBox {-29 -960 1116 775 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMSY10.) readonly def /FullName (CMSY10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 13 /circlecopyrt put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CD06DFE1BE899059C588357426D7A0 7B684C079A47D271426064AD18CB9750D8A986D1D67C1B2AEEF8CE785CC19C81 DE96489F740045C5E342F02DA1C9F9F3C167651E646F1A67CF379789E311EF91 511D0F605B045B279357D6FC8537C233E7AEE6A4FDBE73E75A39EB206D20A6F6 1021961B748D419EBEEB028B592124E174CA595C108E12725B9875544955CFFD 028B698EF742BC8C19F979E35B8E99CADDDDC89CC6C59733F2A24BC3AF36AD86 1319147A4A219ECB92D0D9F6228B51A97C29547000FCC8A581BE543D73F1FED4 3D08C53693138003C01E1D216B185179E1856E2A05AA6C66AABB68B7E4409021 91AA9D8E4C5FBBDA55F1BB6BC679EABA06BE9795DB920A6343CE934B04D75DF2 E0C30B8FD2E475FE0D66D4AA65821864C7DD6AC9939A04094EEA832EAD33DB7A 11EE8D595FB0E543D0E80D31D584B97879B3C7B4A85CC6358A41342D70AD0B97 C14123421FE8A7D131FB0D03900B392FDA0ABAFC25E946D2251F150EC595E857 D17AE424DB76B431366086F377B2A0EEFD3909E3FA35E51886FC318989C1EF20 B6F5990F1D39C22127F0A47BC8461F3AFDF87D9BDA4B6C1D1CFD7513F1E3C3D3 93BEF764AA832316343F9FE869A720E4AA87AE76FA87A833BBC5892DE05B867F 10FA225E233BCFA9BB51F46A6DF22ADCEACC01C3CD1F54C9AEFA25E92EFAC00D 7E2BA427C25483BA42A199F4D2E43DFCE79A7156F7417ACF78E41FCA91E6C9EF B933450D851B73A6AB6AEA7EE4C710CB5C14270D1674FA334686653793FCB31B 491E870D3C2BC654D2C1DE463EC9BA29D7371AA1078800EF93D3F66263A2EBBB F5723697BF7448BD0D2E301544BECF497FD475B85DFEF52AF4F8F8BE445CABE6 019318806D10C5952157FF8F8286C1EE701545C8F60EFA854EAE66835A2046A6 915D395F1E0366EFE0C0391583FE001FF16D82A2E2DA5F57754A2C6F69306E36 356ECF8EFC3F1188AD6FCD2427E0580C97A5B69B4E0E09B85EEDE142F5ADD2F0 5DE51D6DB72B127412A0D57106C19CA493048A4F815129ABE767D51715B1515D 9C21067CB5BC88741B7298C83EAE36A866DFA87D8981F179B1C31292F56BBB64 3C430779468AAF07C8A8B4934E1E775FE3F35186BD1FA6EE3689C1C750678AF1 FBF9B23195A124C5C991FE670AC0C86FD39D2B07B9A319E74EFD498B45820252 720ECDF7294F7B0B137CEB86D33BFCEB8606985A3260FD669E461C8BE94216C5 D434FD8854F44EE66E5A289A9F9E32BC36AF645D53F96652602BAED418C8D726 BD04A1B4617551FE4DEF54083D414F7DCE004E6BB2DC9C2EF7CE232B254BA2C5 7DCBD36C2072ED46FF711F121A701E2284BF1B718B3164382B8F453D68FA0377 DFE106503B8401D4DB87F5402A3AC9A442FA060B0610A9524D530C7157C26B56 AC970FCC1D5655FFFFA39246E6420CF97D08ADFB7B05822679BD40C638DDF0E7 A97BFE8918B611A145AC965C203F1428812F9D340AF499B3A915B22BE798594E 0F520109FC81E452180AE45B170FF999C5FC2761C6CECD8742A5A6FC97F16743 AD4EFCC6572A6D3F3E4E330C5CB2FF6FEA48A5B64DD3DBE943BD9918D4A18E18 CBCF598AEFBB6AB3CD2CBC9BFD6099272F6543F3E532E0E21E614BD2880B1023 0AC234CB705827BF016DB84E00E8C255FDEFA0101A842929540B7B4AA8A089BD 5EFF05B72356B6BC3727817823B5CDBB1B963103000D7F2A4E2A1472FC3E614B 5CBCB6D6D784023173DEFEBFA8F9ED87EC1A0A9EE98CA59CFC964CF943DC683F E9E00DA718C4425A705A69D99988EC6F152525C790912C2E46A2381A569424AB 54DF4798BC2D7E7A361E7991641D4B756CE2A7FF4A2848927092C59C2C4B8809 E13AB84FB6B111E680D7FB9F2FFC2C5C66B0B501E4447C2E46C10E2F6124476F A140C404CFE2DC9E0199BF61E035CEB481D438139A9630934E541D261FFD2906 4CAD99E20655FA746AFB81EDBB5601F5FD6B1D6832A01D585E2C55053F6A7378 4DAACCAC7608DBDADAAE732D66B3E7F87E79756337C1A961E53A4651BE7C77F4 038B89C87F650C54A2A90EB7F1D525BB353F33318551EE8D84A6A83C718EA5A4 B2AC0F7306B1E095819B87015A90CA3ED739B09061782C28CDB36BA4BD5E5308 5CBB70414E4112193DAC4A1FA30996327230D1E021F3CD8115E12D239D93FFDC B645910EB29E40D830E7BAF2DB255FD7C4E776557BB38157917D993EAC245837 A3B515147043574157B8342D829C7228CCEA843ABC89D1785A9672A5923FC4CD 2F3FF27E6FCACF84E2D3136CA2C0FD3EF1EE7354CD04C38B5FB874553646ED2D CEDF7E362EADD04B18051F20A8FB0DE18E152385B9D05F98A3A7EF177824E246 455ABE69E2F700EB78185CCFC07E3B4C6FA301112528D977367D30D0D5D59EDE FAEB706DDC970A9E296236C725B2B55B09B9C336B8E23CBA5FB8692D56F33B03 16294E5FC7FAA42E96395A57CE51CA8DDD77442F142E2E576B778373FB31C81C 16840BB422CA827E30A81829648BDF1CA36700EA32AD888D097C1FE0A05B2D9F 483AEE40269DF09AF0D1AD3DF80C45DDC59C2A03FBB661C79B87853737C6D352 67626B657321B16198DBD6DB98A092F17878AE4698121E1006E53D6F9B0A3BE2 3FB68828EF854A0CDBAA68B37ABCA6AD4A3D809AAF0BAB1697A81FE59C98C472 1E33CD70A75A22C249DD11D76C2575ED3370A25892A16D2FD569CDA70C130770 93F493C7D47D6F9A5424A7A542BAD726BFC3AB225DCEBBE6AC4BE006F8C7C0EA 051424B08305BF2D951AB2986AAFEA04E078CA79B399585BFF0F1ADCED02E15B 8765EB6BF6A8E4D0901EFF2C3AA104924EAD9637A35D877E0C51A3C37DA78CD4 8643C8CE6DCDDE3F116A6C2390F948E5371BEB5AD2E87B41C5F01FB5C196C436 6E256A88D082E3F46E4EFFBF605B2EFF1E9D9AD5EE4DDC323A137CD9451EDEE0 06F7D82898D71FAF2362C0FCF1F726F97F820305B7CE20728CA08C63575083A7 84BA28B7DE2B916432475510E274C12FFD1660A717F51DACFDF0A102D85224E0 D6DB607BB72569ABB8A7BC6A10354CBBC01732EFE35B72062DF269CB25EA3DE6 DC603B04C90C5912D2C38D7A5ACDCDD3F6F116D884F0D8C528F69D5D47BA20DB 0A9E585C7D8CC3C324FE8A1DF150279F7E8FB43BDB720E624E5E9918032C02CD 8020636AE5C38DA2484B7F4B34163E0D0A561B43B80E97746DC05C871AB620EC C5D47101ECED4A7E25F291184BEF8B80024AA7BB456C1B83A907652B331DEA34 754226C39C6889EBEEFDAD081E01EF8FE47751987667836FDE4C8BB8A3FD4406 1E643B4EA37BD370734D1A2DB17C2F4B74B4ED75098B433601F75A88C9A37A05 CCB157EF6E32023BFA33973F3E655A4D58289136996FCFA61EEABD70791B6523 1FF5DE71AB8A17038923118A5EED8D59C4C58D246FFA9BB26472346B40C8741F 153D19CAFF20DD2A86C6DB89154A630FB1761929FC3F0448EE2F089C1C953E02 905BA8DE75D101A982A611056C4B237596C10951DD98BAB838B742D3CF7DE718 617DB72E5268583223E37E029D1C8FD3F1D21690151F76B76C52C725CA135CA2 8666553E863CE188BFC9B99AF56AC2DB5BFEBEB12FB563D00244EB89E478657A 98AF2E1223C1ABC25A4500E8119B86EB3C26B8A2F3505A3E5610F89B7C34E278 53FA0A54A7F46D84A35EFEC36AE660A9E3C37EE3864106702DE5AF6C45ABF64B 888A4A51323138CE77DB935576FE6B4824B6942DF80625098CE1B5B32B234F1D 052A9D6039697118A9D793793775D8729D8574A2E74D7109C7B7E23BC5E2E87A CA8E019203952A4892544E1AD3D4EDD22971611358AB230E9A2ABDF00A288501 A01B67C42B33F6B78C39562DB50F4663B922D9BE0D8A150311AE44B83C1F129F 07337323E9A23211EE58E16043E127C6F9574019179F5635648A011266677B56 B5D0201A4E1470B952A1579B57AB2329CD4C615395023C653F784D36B5EE3672 10D191F29EA508CE84763CA4CE7C2C5229E38E241255A5CABCD6C7CBAED901A2 CA53B5E24111921CDDF83578D33D463D70EDACA0E470D8F592303FB6BFD68B4D 3F3BE2D7C5EC8BBF10C90111A33E205F2649B56E8443F6FAA6C721C66575AE12 D4C40F1F46CF9E9DA675AB5D5840D938780CD9E4AD6736ECBEB6A4397613586F 849B51048AC5F9405E03E14540A5E5582F61CDCDB57EDDF95A8C6705F433EE16 648F098C03DED8A2AD94AE3DE202D629B9422ABB031318D48F2C85F9DBFA17BE 84708AA3B6C9F81F4508F7A5CB7B6646AB8722ECF817877B77D473F577556DAA 2BA0ABACFCF5DEA7498C47328E873019A956FBB250FD9D8885D21D368FA70CBD 2709D2DA44EE7A9869963EAB48789541906DE49FAE785ECE1F18A22C7E7ED204 9768896B78E9EB7A2BD6EEC1B26083940656ECD689D92942CC8AF05CBF82AED0 B45A7DF4DD7AA6526FB597322560B9ED3087A65B5EEF1371C328A021411BFE3B D9B5088B2F1AAE381FFED52D2D1E02CD0DA78683E3B06171CBE94BE9760005D7 135893D7CC2DB097F6AC664D9594CF1C650F84DA80D2EDE04802DBA33CE3DAFE EB7A37E8AEFA4FDA6252FF21E8673DD98E67124D5DBC7BACF361E57077B71939 C1D1FB923E4E35C075CD1BCBE0E80DAEA1320D55B43EAB45D9B26C366B278782 7519FDC482D98839BF0DF2E7C3A56A1C1A3FC0E57A75CA414F6536C1FE8EB7A0 4ADFEE3BEDA0F53BE8CF5F64230784A797133E8CD46BCCB3BF38BCE38A73CCE2 9E073ADE792F7128231DDD1F63E6156ADB2609C200837C2E8A2D93D2A7BC9171 050C709A71E44E32B1B03C92EB5CF1D3BAB1C38E027DC4ED9AED633D98CD7486 3F773ACF8AE332631CF2ABE6D606607593FE862ADE31803964E3F4DC3CE3A271 C76BDD95C87CDB3B87BC26FC7A16D567EEC62E6FF0D471B4853DB8A94D4CACF8 843824F818083F10E88D52FC4253E8203292CB40F1414AE7E51DD7347007C342 CD70E8E9F2D2A13D71213B841DDEAAB208AD9EA644591C15DEB084165F9DF24B B91D3BBEEC2E34E38EF16A0C3F00700A7BDCBBFED2EC0D09601AD6538288DB50 3478B051B5E16B604A0341FE621A58718D960D699D3FAD284310DCF54EB13175 19A75A539EE98E804AEA24689D3540F0F12951A3C01FACCE9A7BAF4D0DAFA946 FF65A4D2A4C39969607272C6886F44E90ABE27CA3A1F12A29D9B32E60E8E34F0 17C5FE43D0E69A99A922D98909B2BBCD145E59A5E7F5426B3988F73B09A525F6 8BD4915663C1301323180E760BE81CB874B020FDA3AE63340E4261E4F3E4949B CC0966BDC4426190BE9F5D77F76A72AD925662E5FE1CEF9CCAB68F0BD33DA003 F11EB91AC4502FBD6AE48DA0F9D07C35B96B103E379B8A83A05FE728F1716194 1F650F75BEBADB2E3810388F3E2DC7B19F1BA9E32925F2FD9F19F4E8701F3E4E 4069125D7C401144740691E7A460021A47B1E27997FC1DDABEC5BD0EE0B20194 2D579C7D6727AA124083242BDA46D8E116E2751C5F298851A62B60AEBE82A929 9B9F2492BA35690D1EFD16215B8EF14E7A3803B93C28FA41D971B05B6AF3B593 E74AD1E68A5FCE12A86E63B78BFEA87D3949FD164F12277A4688BE96356791CB 8671C49365608F3EDECC109321AF92B4C29CAF073DA3A7D73E913D0D83FAC5EB BD884D4C686056404DAAAD6F82F94F803FA1FB0DD8908D1DF08FB87A8BB83027 04DE0CBB1C6FEB6B517FBD7CF065120079E608CE41893C2BC96A347826CCDFD5 C69E161217F2127A59F1A6F22037641613F191F22D5B4CDCBCC2EE5615623404 ABA7BE6C5FE475481615B2AC1A2412E54688DD21E44CC9AF5F16E634AFCA389C 4D740B7B51BB141BFAD1080E7C726C1606A28ED492E6BDE9F800EFACD1513909 84E98CEB6A0B7A2A6F3E1D1DCC3B2552795E0932673E59ECC56DDD37A1D52BA6 C3F0E905978AB568941A163F4CE3AAB5C5B16F86016EC47BA6F3F7AAAA77C3B6 09C8C3ABDB6D514A76ECD37C37AA88B5860630B3406B494F7725975596F84777 D9CF48686EC9C5DBCC1D78513F591C7C10AB9D153B3D41426B7BF668B0D04503 56BCB686258462C1DC61095724B9F3312316262FD7C1AEC6E54DE7E5A7BD8EFF 035299B8FD8A4A7B0F51404F4A760F4D8B4C0FB7A32FA4B2383AB6E9C78FDEDB FE6A5788D38A6701B123630C2A6D820A684166FBBC83DB17069494FBD411B333 CB37E2491C5BD035A33867A6D3A3D420CC31ACF43AA07182CAAE67E40EC63663 B678F71D4C6E0EC3A0AAF904CD3AA66E0DE5E3CDE049E94249B39A1C06E3CE9A F974B2484BB2CDA14282B9511E505B3C89F9C802218AE40D1A7541335C5736DD CD565D4B9F4CC78F3A393737EDB4FBD0DA299E21CCFEBA5478EEF013F0552A8B 0BB11FF46CCDB784E8BDCF730A16363E66572049E42C695886EAB42A9AD9094C B635DF4B5B9BD9B9AE8455DFA3EEFC77653190F9A8B1E93B7281C2A21EA7DDA9 33484745BDF7E3DD63C7AC66C286C9A5A698A5E4D7A91710B7FF943FB23609B6 4B442F83CB795788FAB5E9CF3F75D5487DA26170E4561C7941C910B088C3B86D F844B0F340CF82786A3FCF347048463EBD2006281A816627065DDA6CD4D3AC5E 2024BC96C7D896381BBB567951E7A1F29D4E95351298B000D29E5F3D0448CB5A CFDAE1BADE9403B90371C3A07D208948AFA022A69C519434B6813086ADF518D5 88E0B92072A44BA1B3EBB630A13B7AB90992E85B6D67361C8D96F3E0D826FF37 17B67E4B1EB7BADFD98D7F4FD17BECE740ADF13C141EBF0A91CB105DABB32FE0 55086D56A0D358841D15FD349E6B95512E4EDF4C430216FF85C2ABE995E4B40A A6044CC8820AD885C07E052B3F91C2E9A1D163BFFD210F7BE95B923E2500DB50 2075106DB541C267BD450B25B670CE80BCD068D4DBFF2D82634175B61FBD3BC3 406131F44C7D6F18D375D1F2270829DDF29DC14DBB58A30AC193245D18DE91F8 AB88AB548D8138605BB5A50073295534E314366E26665AE70482B890E4101D6B 60E4F3B37ABCA1346DAAE8FDB8DD9C832EFF3E73BA470E2BACE7B8515CB43388 C27AF99FF9322175CF8D4947E6B3846AFF5163E972156847F58A66660EC8A3A6 5FB47C9F637B4CBB4C73B6A080B0CF6FD1E9665E92032540570FFCC747C67C50 822811AADC404BC7ECD1673E8AA6C3A2F1D82F39430B58C29145E2F1B679C46E 94EDC711883F1E4EA84117A54757E8895A40401A26E1437B39A2F65CAADD6E02 D71FA8AF7453668DC613F326A3344F74AD7AC67569AF399385500ABDA5EDD3BA 343CC5EDD4B558467626850E752B9959FEF1454E53E7A3DCBC2255AD8F6AB4FE 894455118A61C58840CB68A925ACCAD75CEACE863D806916228F0614191A1CD5 DC9BAE256018615AA3725834519449B0A88B4F396654E74099C007930ADB1327 DD119BF799FE3B0B223E1EDA04FE2DA7A1C879143E1C33B6C6344F4BA033AD6F 8E88C33DEF1977796B454BAB2494C930F492A518E8198C708A75FFEF8C49C324 A718AB59B889DED521229E741FFE53F98EBE88B0405AD523254FD3FA4BBE96DA DA1C27C1C979A0DD4E61C3B1F4C4DE01E42F1C4435EECFC02D97994BC8AF5270 E7CB1458D76ED0229C5FFB4A23B8716018F9050970895D51722CDE8F2EA3D947 DFF374D84915D5C5D16463A6FFCD079D1ED416C4347BF831FF0C4ADFB61295DC 4D5785BB0852BF472CFC97EC174491CAF961AB90629F055E75DAA6D9898E8653 5BCF379816CAE46FEA62E7BE8E9B953466E51828172C4DBD0E1BBAD1CE28B5B1 02B3E36403BE80B49A47446A6677FCED438F01D60EB10F478C89528FA337D0D8 88D3FC123C076507ACDAF783A9A6E24ED73BF24B6E0F11C13E532DE5F70EB02A 60651FC2E263002D3986B7B20CC2AA08330B9FC2E26765CD52266969A86EE30E 71E0B41B6C1C6DA423D3A7E1553D2FAF26EF40DC183099322D362E4965695C52 9FC3E5BD7ABD743CDCB717DB10372A722A39CE53FABB454EADE2179C4CBFC016 A8E893C28EF549CA1692C8D8ADFC471DCCDE266FB4E97A1F3035801F3F034D44 AE6ADA0192657E8078A1D27420093FEBA111333314658021B90DA4E7A8D4B829 F1795501020D5FF0AD25584C1D47BE08ED6CE96278050BA67680A3B973613647 A93FAEC756FC253B3693FA2D6491B276EF45751EFB306961788E7C15297A5822 AFC5A2DABD0DBBFF0BE135267EA6B9D1B4E4760ED14895FFE1F8C3F564830001 EFA901B8442BD2D98561BAB9A0FD939E0F856E4D2EB04A9A4496704109B8A84C EA06AB0999427B3B1BE776004AE906D0F22159C051D88CF573A0255D99B56781 CF326CD11919AA40B096769CD6D0ADF3ACEC7957621084ACF21AF1F265416628 86B67FCBDE9370D4F5C6F5CC67EBB0A2727E074090DBCA459AFA1A4778AED4C9 AE5400775223E684BFCB 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI10 %!PS-AdobeFont-1.0: CMMI10 003.002 %%Title: CMMI10 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI10. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI10 known{/CMMI10 findfont dup/UniqueID known{dup /UniqueID get 5087385 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI10 def /FontBBox {-32 -250 1048 750 }readonly def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI10.) readonly def /FullName (CMMI10) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBC7878DFBD546AC2 1EF6CC527FEEA044B7C8E686367E920F575AD585387358FFF41BCB212922791C 7B0BD3BED7C6D8F3D9D52D0F181CD4D164E75851D04F64309D810A0DEA1E257B 0D7633CEFE93FEF9D2FB7901453A46F8ACA007358D904E0189AE7B7221545085 EDD3D5A3CEACD6023861F13C8A345A68115425E94B8FDCCEC1255454EC3E7A37 404F6C00A3BCCF851B929D4FE66B6D8FD1C0C80130541609759F18EF07BCD133 78CBC4A0D8A796A2574260C6A952CA73D9EB5C28356F5C90D1A59DC788762BFF A1B6F0614958D09751C0DB2309406F6B4489125B31C5DD365B2F140CB5E42CEE 88BE11C7176E6BBC90D24E40956279FBDC9D89A6C4A1F4D27EC57F496602FBC4 C854143903A53EF1188D117C49F8B6F2498B4698C25F2C5E8D8BD833206F88FC BD5B495EB993A26B6055BD0BBA2B3DDFD462C39E022D4A1760C845EA448DED88 98C44BAAB85CD0423E00154C4741240EB3A2290B67144A4C80C88BE3D59AD760 E553DAC4E8BA00B06398B1D0DFE96FB89449D4AE18CE8B27AFE75D2B84EFDB44 143FD887F8FB364D000651912E40B0BAEDDA5AD57A3BC0E411E1AD908C77DCE3 981985F98E258A9BB3A1B845FC4A21BCC54559E51BC0E6C22F0C38540F8C9490 88A0E23EA504FA79F8960CC9D58611C519D3ACDC63FB2FBCAE6674357D7F2285 4BCC9F54D3DA421D744D3A341DA3B494BB526C0734E1A8FC71501745399F7683 FD17EC3044419A88C3979FD2ABA5B0130907B145A8462AAF0A9B511D2C8A7C7F 347FF6AC057E6512902BFD2918E2CD31DE615F5D643764E900B60287670AE18F FDE15545D8BC69591A8CBBB275AFFC9B14BD68DF0AAB32268FB84844D4DBC7BB C591C1AC5102C50A9C7BAAA848DA88B0519F0F5F0813BF055CF0E3C86F633A04 B779D2E8E656DB1E09A66A85FE21CA8BA5523F472A229E83F2C4E91ABA46C733 F3C7B5775B06C97782BC225C46385BEBDC61572458EFC5CF4190AB7A9C1C92DA 29F84BAACF552089195966E3AD9E57CC914D20B6962BE80429A16D4DF1ECAA66 36C4343FADF0B2B48F12E2EB8443C4AA29D00949255F3968617F98B8ABD4CC12 048B838EE243A21AC808BD295195E4AE9027005F52258BFCA915C8D9AED9A2C0 80814F79CF943FBE3594C530A22A92E11BE80FCEC1684C4F56712D5846B0749C 9B54A979B315222F209DEE72583B03093EC38F7C5B9F9BCB21DBE8EDDAE9BE8B 75ACE6B12A31083AC8348EC84D1D29D2297A266284B7E9734E207DAF59A25F4E 4AA38509E993C5394FED76E6A2F25462685C4C86C6E8CFC9863338EC1428BDFC 74616BB1BC8948B0ED4C87C15B4405F3A7796F9DB3798FFFE8BD0A94E834817B D5E9812E308D0CC920470A6F2CD088FCB80462BF7CB3F039A7DF3DAF5B2B5355 E083A385CD2EAF0FC181E40E96DD7E9AB9EF5C7E6866A13B8A54718E950FE097 EF0951A357114F18CE9933D28B3A77AA71E3CE884661F13284BCED5D5FD1A86D 543E588FF473DC2CF9A4DC312500135F29C2D0174B32018C8DBD40EF9A232883 710A1F2AB2CD11312300ACDF789A9B7B93D2035D81D1C84984D92D78A53A00C6 EDA94B24BBAC1AD17774A4E07E6F74ABD90415965616AD540C8ECD8C3A44EE4F 7F4F6BB6238C5062D63FA59B7BF08BE93FAEA70A2AB08FBEAAF7DBF56B95FD93 03CA406543BA6C9527D0DF01F5108D31A51778A5EB1C93F27B72B46146A353A2 01CACBC829603B9989A87CF64528682CCBA0562A8165B185C58A5C6BB72F5E89 500ACCAAB8ECEFBB2640E99EAEEC4EA979AA793D013D61D8ACF8784FF8D9398F F6A252A709324FB39509F0B3A4E725E82F53543383C6765BE556CC897C758208 AA3AD37B0406E4A79F8F0A6C1983FC73E71CD858C0DB66ED66D5D992978614EE 1EA91EBE191E082EBA1FC040AF19A2202575C2EBEB8058833E3520FA03D2F915 85C1ED337E457B9FEEB0C6EF2735EFDA6E0D05FA641BCF698AC6B97751E8306C 4DF00A39B8581FF53DB8F8525FDB196D85950906CCB59B8EF171349AA3B567B1 6A00819947A995FB383C3C1709C9A2C113B2E40BB832B7D4A0FBA0B16A2C455F 55809CC425C403E9668DC66BE45B71A81C332FD4DB279D22A2959962304A8F18 085893DAC61317D24A8F198FDAB95F3B86F0AFD35047B868A9A17037A2829A02 BAB042F75F349E197A7EED41984C2859754CAFD0251439921C248B463B516951 2E1322C80D73F9CBCAA63A585450275AC2492E4D3FB78E800F788254DB5E610D CF788DF5C70FF99892BCDF16133E34B24B77C8F097F546B87C603DDB8998B66E BACB68BA27462AF54AA405682EC96D701F0D474DECD5F95CA2102DF639EB169E D518162C2BAE45FF698B6DE15FC6E7DE48C336C40A670FD26952A6BAB09115E1 991F0073419F2CC2A1C08BE91096936AA0C37E4ED3CCCEE235476074B8FF1125 6BDE3701F85532D8BB64CCC927CC335281C95EA689706F0AC717DC2CF680C754 E5EFD7FA4BB8880B2B727A964C876D4A223069D4E6001771F0E23EAD2A4BBC80 E76675297B2EF05F52BF4E71B3EE2BE3048CF088C79540113C66AE98B2FD3CB1 B0741A215FD070882C52765009D7D711DAA2508F19AE7DDA15229A856AC49BC3 4DDF40814FF96500E4B9B02D412E94623C5FDCC76C0FB8E42DF56A904FE49D65 1DA7C53901B2EA71AB658A464D3ABDE27D9DB8D9E0B48F64E61A2495AD5D8DAB B5E72424AD017DF37964AF911BD7FA21A5EB4775DC8E95EF0C0EB856B00D89D7 8172A1DE8530767D317B8256103E53CFB877E10686A04F5A08F8DC58D843DEBA FD5F40597588663D103689F6EB3EB14D06E18C8078F2538B43E712DF491FC5C6 AF639256C8C6134B64D560D8476DEA6329D995E46CC4BC78841C59E73648B47E BFA7DE0846422F738454AE77E822A083405289247BD7C478BE4974F742CD6051 E99FBB1D1B3FBABFEE855174734EE45E87D0AADF32B1283B911162A9955847FD 38944D70584FAA6B1A7191C5C134B73F98EB632B69E2F0C0F94156787C34C8A3 7622A029D58F9626B74F8A8A1F3803E0BC20E0EADEB1E99B70F1BD9F980FB751 2A842843DE42EB142A84D5D3138629AE9EAF6F3479C423E8829C8816FA6EFA27 DCE5580E65AA9854B1C64163DC318420CD993C15BFD76A8BA1182860A6B03D6D 22B8CF43CFE6C8AB27C64842E239CAE707D3086BADDE1D7C94E3BC96319470D6 8D26915C575CFDD03271D6BB9DE86A0EB6EEA6E768B224A626C62A9AB48A6EDB 44F70BB5AF991CDF9736D65933E81CC57A78F623F33EC9AF535F2F25FA4EEC90 D50DB7E87F31E971A75A33A301CA6013EEC5A4E179D695B33DADF2C98364434A 42926776000B610E17524162253F6FA638D6581C18F99EA0BD1D2E24D2424ADF C05010D08192485153DD03930C7BF45237593E484F9851E6D464FA10FECA5D9E 0C8CCC97DE029030900CDBB491C5CF226DBF903CFE7735D939C3FDF3A20B70CE 66579B28B99313FEE914E295388C7BC8E055A2E54EA3A8206D3C8F4F7C0BA5E6 E519419FD8CE215F7B8E9BEC604A9E3FE272A0328A24E31997C8A91E0946BCF1 6943A97CBED2AB9FC636B49828BBB8B89E0BBC2653796431224895ABA5DAC41E 1854BD9764E86147FD7624F736F40DE3B7582EDDFD15C2BDE3F22B5A54D7DF10 B87A1301CE85CFC061689A890A321412A13314AE96DCD3EDA75035FDD8F4AB9B 897A2C68263A68457032C469987970648BA2D88B1C5375DFEAA35A917B8A952E EE670427942AEDB3CB599C5746180E392837D371E15D860620ABDB6AA7772C40 A5E346661673ACA530BE3D8E3FFB895E5DA3DC23B1B43C080C77F7E47847F0F3 F3AA5CA9E4BF75FC5EBD18D19F21A7DAA3B11CABC6E4070A15F7DBC8B05EB6AA A02EF1B078EB66D61D6AFE41DA9B36FE7EC9EF94D1EA26282A9871E2CACB3126 2AD49C2D9B50A6E47D8F2CCAD50992D1B430979A45FD9E76182A19964BB2A1F6 51779A2B258DC1DF4C2F3074621286831F3848AC152DDD2BA561E6586ADA88D3 598A2CE2CD048F027CE0008B828BD915887D7785341E8305DF2346ADB76BE99F 87B02173BDC334E9221C8DF54114A6B24C1C5340299512FA6C8C51AB4C8778CE 178CEF531C6D1B5FF0A1BE8EFF767F959BD4C345C52699A29A17B2A230842BF6 4B011217D6D24EDAC3F6D53482786F1CA33169B90ECD499407D37CE9B70DDF78 7B7547B32952535BA9ACD1E244447AE3FCED3AF28717083CF9590A09780984D6 AF0743C82AE4FB3E2BB2856A4153A3967A023FFC35382D6C22D84A924900B6A6 3DDD400E6D2418DA6C27F2FA34C075C902B89EBAE658B3C9A18EEE449DA5A379 337DE95CB7AB3F0970CF1A5D8FAD8090E495570FDFB2FBBA79244780D8035547 C5A55BB21A2270F724BF5D442CDC5BB9F09BE0CAE59B1C2270F0BDACE698F2C5 DE8F66BFB9634904B161F5BA2B1950048300D69BABD312D58D89C4ED527AF7BA 7DA2478EDC2CDEE3473DD8A8ED9D891CD1FC21F23013228BB3281B71FCE959BD 6F8E9059D682A7FCC5265A0620992D4FA8D78377EB34CE3ECA070EE3707239BC 98907DB0120CE42ABA32CF97127E28382BDDFD685674279F588D4F951216C355 821361790F64C2CC720DE97E8ECB57326C43EE47367628E05769E106868B54F4 C33C9951908DF6FC4F5ED2C7787BD8FA591BBB3E9C6C1DA94CC5E38D9B20C886 7D237572FF46DD896A4D6163408EA6CEFAC398EE041EAE29D577E75326CA17A6 B072D47A7B13EC441CE6DAA042ECD02134CBFA6809A435050413817193DAEB16 A5882C8AEA44BCF36E74E9ECCDFE7E19FF5A5DD7A94E5AB4F8702C3DA7F42325 23C808670A0490F5B373DADE40814FF9650241D3D69C91FBC5ECE728F827D9BF C928602E05477903449E079164CA39859C4BCA60C579F490AA455F82B5050BB3 969AFB478E0D4A257B3356EA3CD62051FCE6C6B1929CFF85BFDF166BEF658E10 3A55E007F38EBBB248B3F0B8ED1925106B499B762E45113AE1AC9DE09644C84B 9C08034B297314EE69BC32DB6E7D7FB9913CE5AC17E7335979E9DCCE2BAB3725 1976155551F9706A576FE0E3ADCCF72C87683291528ECB749CB0ED291966E239 B5E3630676BD409E08F85BC1AEC9A2D4135376284A96EA24431243BD6FE8B966 95F11A4BB53F392E0AEFEA623064FF8A7002367B0A515635CB2D2DDFB9B4A8D7 FE721754E81BBA548848A235B91AD4E4F7DB19CCE2F61D277FC00AB956EB93BE 44AB4970CA56BF59506C94ED160FB1E25D3DF2988A532BDB787BFB8539D22986 FDC378AC31444E63C4727FEE121A43751043849E6DCAC5B59D0FC703AAFBBFD4 E8B7C268F21615AD02CE9DABEFA27B5FE6A6441B619539CAB1F810F1263447AA 633F5DAF483752EF1A0421740E3A811D2D2898CBF53E7F686C9223FD7235F02D 6F90D2D48CC20AB87778DE3C6FB335E0F0EC20B5DC5B65223FE117526DE2C72F FE839DF93CB2A7D66CD900CB325F891E311BEC932F703FB4FEFA29DB8B9C88DD 375EC71B3D58C7BC59ADA91971A3BDA1ADEA629CE6CC92BD542CDDFAA7706FB2 6CDDE2DF07E56D6741916AE8E8744339816F3E6C38062747AA9FDA2A2678A6B7 EFEA870AA3A4D71B25EE3013EAB1DBA34401B867C7A41AE51E0421D41D3BB83C E120C8FEABA6E5DEC53A689C21426D4BBCB68CB37568761C360E6D4E3596FB7D F4DEC7918E58C0293D12D6DDA7E9DCDAAD7C939F55CD1BC4A228B31E9A904156 DA6B40B08E6ACE674618B768DD681C772A3E55FE096CF949CF3B0460ABDCD891 D17B37B355B29AB5137899C036F31DA026244FA25FB798FBE5105BDA29F46538 D3D3AC1001A7BCECE64DE94FFE6C354166A0F97256137BDFA07F6E22A3D1D2F4 9588DBAE95E895BC5E64DDCBBAA8D0A22C229B42CB717FC711E7E9DF793DF80B 9F14754585A3C7E17F37B32924B9F9870DA8635E3E18BD1DCD81EDF01834D9C6 B33F23C956C2FCBFA47D84422F583459D827D1E120B97694D12F1F54D02379C0 D288F7104F3FFCF4F76E3494F4ACBD1BE3A15543CC680924C78A473F8E311ADF 8FE00A04C6C393DE61AD3EDA5BC031E2353076A2489391B52632387CA28A7B93 FBB065A6EF3658AE80B1ADA47E9B2539E73A71FA75645F85ED8ECC257FB4CF26 B6C912DE9D0F9899E70BECCB934AD32CF49A093371A9F73DE6255EBC39DE1E7F 00D0CBDABD4D0383977E694890E71FBE5C376BE5F3A80C28987417504F515C50 909F3D31178BB9B1D085BE514F71B910A9085BD6122DDC72A150BFE266920E49 5661BCB4BAB51D6DEFE32B616963DBD989FCDD1637B294CE4E288655FBEFA1BF 7F25BBF8CF17C2D5FD161A7C2CC9CC7490D9BF15A1D35B3BFA43ADE256E88BDA BD490D92907C57BAC408A575EC84D6AEE070148C7C9A91C03B09FDBD792E8FF0 C0B886AAD2EDD86541E5E579359D40E3AC312ACD3D8FD49F71BD533DDF8859B1 BAF17F1884E331DD07CEEF93B71D492AEBAADF7A263450A7A72210CE630A0D37 BF024BDC09ACC882816B8C22C62AE38A3A8D0F6EBC2B1B2C0B8161A8B076DD5D 4B779C0788546BB4CF57332230D237856B00D79C28A7C01D11F44B7304F69075 94B97A745DA43D1BE561372CE611C345A843834E46AD9DDB16CABCD3FA33D6F1 F6B5C0497F5EE5400B305CDC16A7EC286AA4D45D0EEBB9DA06AC9C5294D68EC9 E4DC3CA2B92CE8FC0526184A86EDC7AB34D67E60AC12D9CA8FD300235EC968BA 92C6FBDA47572BC5600F25249F60AD287CBDAE980E747FCBE7EE5CD323E733F0 63553B494D3DDEB9CC1480B5C3BB79A28E419AA65B18CB297AB383419E890E2A CE6F98C9900CCB4675280A10CF060B8D220DDA1BE55DFA65715EABCC1AFAA271 B1F8732341613E17B231231A0D24D4D7FC198AE04D89A99C4536217769C6FBD9 5EE24A6302F97438F7C0E311C878F674B4477A5ADA3952CDE4055AC408B8174E 86F8FB797646DFFFE0ECA25D1BAB9A9F71F3926D3D85AA63E7A8C931D71E79E0 AF1EAC26FADE468F4FF7F3861D14C10E3BE1F9EAFD6D3A544E8108D5DAB5B180 3950C74818BC8AF4758A108F462EF1826647A49667F5E482038C54716856D9BC 35F29922846D2148F92F943E951D7438C73D6A60459A8003174036C64E1629CD 155D47FD04B03C023AD67CD5A70C98AB556EEAB8C48169706E5B352F6505D580 AC945171BFE62E81F8F500438AC3B64D857BA5BC54C2C4BBB237F8FA51296255 E66A92A61FE13FDE781D393557EB72CEBAD86511035F775FAC39A0479CCD400F 226709118F887F47CC2ECC8F79816D4A945B2845F50AFD62D8C9A9BBF4739496 9E644BC9F7B04803B7EE75A09EAE94365F6F374B4FCEB0B506C76297564B9B6B 8B812BC3A33929AA94692572B010E6210AEAA312BDFC88BF302244AB9D587A9B 919823FD01DE12438D960944D1977800FEB49E638C32E5B188B1CA033E0C37EE A142F746367888AA119535F0CCAF7EAA461B790EB089D2D6962E28A398439BB7 9C9943654D7A2D765B46BC0DD1F915327F369162E1BA1BA83110B93F442905E0 523BFF5E279508A98568CD5CFD18FABBE9D17265A9081E7BF64155A2CE3C0DF7 88D00671AD65654709589BAD7EA65BBA811387ABA5CA0BC3F66D3D48597A0D1D 2C268375DF47CCF62166262AE4840AB03BF49BE67A05EF66328EC729F03CA5FF AD3937FC053E223303565DC771ACF32E63DFB96D5030E787961D72D02C195C66 B48E9AF0309DC169CFE8D16E2818DA94693A18F027DEA0D916672480464F7E22 CA6E431FE38D3FC019BDD229E064B72C545C61C6EA55984565CCA88ACB01F744 3B4593CC8944C70F30925FB48A16342CC26D444F54CA15E5A624C4A2DAA2AEF8 404145BBA339F2A2D6FC2F3ECE54387761CA1213C8D56FF96E37C6147CA44B84 262EA87E7CC10D931E6B5B80D7F09813498497AA84ACB4AC69BC6C8481ED2953 084F560D7B1CF90555E69BD2AF7C5D944E8E3506165014652462BE1BC81CA341 E1B0725159D36DA0FFF3577D1DEBC5D91AE683FB0384 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMMI12 %!PS-AdobeFont-1.0: CMMI12 003.002 %%Title: CMMI12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMMI12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMMI12 known{/CMMI12 findfont dup/UniqueID known{dup /UniqueID get 5087386 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMMI12 def /FontBBox {-31 -250 1026 750 }readonly def /PaintType 0 def /FontInfo 10 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMMI12.) readonly def /FullName (CMMI12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle -14.04 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def /ascent 750 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 58 /period put dup 60 /less put dup 62 /greater put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3C05EF98F858322DCEA45E0874C5 45D25FE192539D9CDA4BAA46D9C431465E6ABF4E4271F89EDED7F37BE4B31FB4 7934F62D1F46E8671F6290D6FFF601D4937BF71C22D60FB800A15796421E3AA7 72C500501D8B10C0093F6467C553250F7C27B2C3D893772614A846374A85BC4E BEC0B0A89C4C161C3956ECE25274B962C854E535F418279FE26D8F83E38C5C89 974E9A224B3CBEF90A9277AF10E0C7CAC8DC11C41DC18B814A7682E5F0248674 11453BC81C443407AF41AF8A831A85A700CFC65E2181BCBFBFE3573BF464E2BE 882A715BE109B49A15C32F62CF5C10257E5EA12C24F72137EB63297C28625AC3 2274038691582D6D75FE8F895A0813982793297E49CC9B54053BA2ABD429156A 7FFCD7B19DAA44E2107720921B74185AE507AC33141819511A6AC20BC20FB541 0B5AAEC5743673E9E39C1976D5E6EB4E4D8E2B31BEA302E5AF1B2FBCEC6D9E69 987970648B9276232093695D55A806D87648B1749CB537E78BB08AA83A5001F7 609CD1D17FFA1043EB3807AF0B596AF38C91A9675E2A53196FEF45849C95F7DC 182A5EC0EC4435A8A4B6E1CDBF9A5AF457564EA72BF85228EB6FD244F2511F5A CA9B71A65D53CC06EF5F7EC3A85106139A4D312378BC22183C09A229577B793A 1B7422611C03E84BF809F46C62CE52D3AE29CE01C32B202ACDAA5B72733EB0AE C31D7EF7BA88D2D14F85313F7A8B9B7A5B124B03AB923744D336C969E5CE304D 3AD977A46664479EDEFB69F113024E761C05FA48A54072DF9E12C2F352ACB3E6 D04F6EEFFDE209E7FA3DA22E5B1D1409461F4286B7F4F8251B44E5CB7805762E E129FF4A06A7458F3191926B1CAF70E32C6571AD2DC07C34FF62840896F4D200 761B1A7FA356526D1E3AB4C542AF13623BAEB9F61B1BEEF79A9205B1FEFDAE24 8799D516A9ACC30BC0139C63C9A0523E9D5439213B67D490C96F902958779B8F 68BD8E9FDDCE8A3A2E35877DB6C94B7612382ED8F218EB1157D2ADD090A2448D 10B99FBC9211C5629ED1C61C74FE93041E5AA03EA4AC3FFDA00C2B6E719CFAA4 262FE17F66804A6B54D3669836EE4367D2A2991580C5564463C973CA0DA38AC6 922716E13B4A807B50304B8826CEFEAA47C305FC07EB2AF25FA7945797237B16 56CDE17AB0834F5C97E0CC5741B061C6FF3A8DD1A79B9A173B66A6A750538E26 32FBC92E75BA15CFFE22A7302F47908547007402569158F62C29BA2956534FEA 7DACF1E507AC309DAE8C325F2A6023D2FBD81EF42146BFCE6A16A6310A650460 7B07BB7647C8760FADDF0DBBCD3DA6CC4645D1732DB3A22D8B76E1D2D48E4D4A 46F4BEB80CE65F3517283A1AE08391FD1C10ED452133706BC6725AABC80107FD 754A8BA47B0281D479F052CE26A723EFFACB79B213041A536542AB334769A2BF 88505D82C498ABDD5A73EB539530F47CAC52825D16A969C8BB56D4A7F2830B8F CB63B92B576E7BD922A4B25E634751F8A3B7C4EBAFCB373EDC8B8281B1D1371A 7844E9AD990CFF09F0D7ED73A5CF873D2D5C9E8A9923CFA31E1A4B4CCCC40760 8B3AC8FC3C88BC08BD7407725281BB879A1A822D94997826418F1B89D303F2C0 BE7A0102E6F529630CBF1BC5BF3E4578C164A3DDE45E62A957EF3FB7F0FBBA6B CA1E79A1ED195B6A11CFB345B663C5E72FA55D80476F604F6C4257B51686AE25 8F7D159FE605DDA0AC74BAA5034F29FFFD403070013C6E2D8EF6A0990D91173B D5A3AEB98B64E412991505C3CB7C2CDE13C091FEB3DFBCAF30C4C19511102300 135BD5D444BB55692013F52056908DFAB2ABFACE81A58423ACEC59344CEF7D4A C5A3EFFFFF70759BC3E593D878281225060B97D1BEE6B26EED90571FEAFA1812 1115C0EEC892F5DE6FDD68321A0B3F10A2D771B79BD85476AF6018472A499A86 07D64CFF4550866AFE590C471C80EB12CB3A989A60BC7BED39097C12D9286E39 14C7952C4C64820B4DE44A1827B7B0B535244E93FDB80036D6332F90F95B472D 7031E7E3819E881BD0313CFA112EB3AAE943C99C47635CCA7E34DC0306C04E5D 2E9F60FF037EB11602BE74E8E6B711392E866E3E55D988F7C856417A2B9C186D 639819B4786D039B77F8578EF63C088FF28BD08D8353031445C8498A8F445BC3 D08923D32AC04BF3CAFEFCCC1E77EA894F4E846F47EF62D6841B8D8576FEAE8F 90044626869D04D61D64D56E8C51AF8C18D6CC3FEF3B6C4F7D56FE3260354948 10104F69B117FB8269292579A7D52FED688C663B643D8D99F13956612271073E 1A337AED059B7A93819A28CDF01569CBEB51069D22ADAE25C47355560F402B2E 8C9900DA82B79C64497C8494F42FABE5AC41791C2010D98FB7E593C744F250DC D837DB0EAA4F75D0016970F3AE8359878A08CF9A697A06C5EA945819151265B9 1A12122B98F79185DF852257BB4798E7DC03712EA6ED34F6E6AE1476788DBC33 9229FADB8D581BE1A63F596698DBD6DB98A092F67197A4FD4A50B648F2691875 EE2495D6BB310078F516785A0CEC7EB6E8305FDBAEB1D15690409FE32DD9CFAE DBD3866FB63EBCAAB73E3E4BE5D7F3AA44793938AAF3F8341683F0790F1D46A3 60CE083F9BEDDA22E0639A92393960F86602216FA51E2754BC2F4CD0BDECE3D8 FFAB7E0E49613DD4956C9A10AEA798BDA1F756C755BEC12147ADECAB0FB73B7D 203A11D84DD2AB5AA98FD38C1C2573570FD49A4924A94A106D2A7D850E793608 FB135853E8C4204441CDBE697FD0CB330B1C3596F32D2BCBF263237EAB362D09 DA6F531B40384DC91F30674760CA7B64BA1968F6A7FC9EBEF431A1AFC5E76D7F 2D44DCB7F61C7F6B16196B3E8B47343F572DBA8B8B21B43E35BB6B2DD5C7982D 244FD4304D254D6CCB5E8CF70E77F50812F41A988EEB3B26BF0F6F69BBA18077 31134B5A5823D10FEF6201D045AEE7A24E0F25376E9FC66340C56C05F6CD810B 724D85CC4BB8D789834A447CBBA159565D08BA5793D8599035BB5063271518E8 F6C50E7DCE71B1D186270DDC860C6DC0CD506010EB5B1FDF6BE47A9A18CC15D7 D657E58BED9EECAD5CE5D49F63139A39BC52C6584BB2C3264D51BD584B40F8EA AFCD8B83F548594386EB2B05CE803105E84931DC6E7A1398073D48E130E0D907 CD0F1ECC3254EDF5D4DDBF44415DC9BA66C673820CDB0FDF033D59BE2B5EFCEF 01FF9D33EDC88F8D522E07F1689D024DBCD09A16A63519E1764C8630FF36058D CFC07027E0ECDA01E0E85B166C613B22F587B4D355EB018BA93E92A36007B4DA 287FF5A91F7D8A0EDF5554ACCF45AC8066E88865C5692E63EB99CAC81367B605 8E6C19EB98EBFE0D2D161B447B9A70CDD1122C7B78A413369016E6D8481E2AE9 9AA97B5DD0ACC9B0820F7742CEB2F46F89F3E2092621969A88DC0156B4F941A1 6BF1546D4B136657C47B082A8A35FE96016BAF3D9679B8C32EDDD6AE6DF3BFB5 7854074FA019707FC22BFA82299E72ADF9A980AE29A8E2434277E58B01F6B03C 192E1E25DADD49F6E3F69799AE62B56E00B60A031BF8721DB8B2CB6D4A4C15CA AB1FDE010AB7DC0DDED977389B101B8E53A949222FAA126656E02817DD32B0D4 A49516CEC2B97EA7C78FD66229B044EB92F502384BCC6CCDFFF995EABE3BB7A9 50D5D1AED861E7D3BA8D333026C673C5762712E763E59261426044583D789C67 A606B96F97663F92BF104CE02FBFDFC521EC0D6670B7D4F85A229F51426DE912 3B729C4A535FB7C88D0A5E78074751B58885DD6BDD2DD9E9C83F105E8CF63DDF CA7DB39D0319CA7CC2E73F42747F007574DE25AE1538B4D493D22D0D5F0F80C6 5F6FA3937C8391DE2F0116F81DB2DB0EF751EC838A7F85F163A6F48804E84B96 8D715EF25B7E2A5CAECC558D80F421052A1D698F3B8452AC27E30A4E6226E3CE 084C8A83ADA0818A110923CF7AC7AD4CB92AE4ABBE0A9EC1FF935FD02774C1F7 92A278E513012AD17722A23C55EF82E18F8847B5CCE47F4FE3EC508BA563F7B2 AE56C94285A18DED4D432FB0CEFC05A20BC17DDF9FF919C724810A8ED7358A27 97EC93C1A13C443A91947FE1F6F528EA7B628917FA7E554A1D7B31ED46C5ABCF 92BA57961C8876DB4041305EBB029B03D8351D5E2819FF87E97ED214D8F1CEF5 7F7668DDE223721C0B810F4A4AC81CA4EAC86EAE546E1B15D91E626FB9A31824 5BFF17C4E79FD56ADBF6DBF01BAF6453A81EBDCB38A5FC0FD0FF0646B3B0D199 13E2E59A1B5CAB6DE5329BE389BA0E2A2AB55CA40B711ED746C24F1E48892E76 6DACF7DA163CDC90CF076763008E7A899870CDED5A80758E6177BE6B93B07EB1 5800A3BF7B9AAC3FA825CE594EF5B7546B181375FA8F37608DF17856D2F8EBD5 6030A9E6F6BEAF224AD2AEF76D03B023E2FCB922CB8E3C6816AABB61FE6E4F83 F21B4935102C860ECA03DBEFCA461F0E5B93E5A8D18440BCF7D1D6252A24CB6E A64FDAC8B67C4888519AA368D9C4A8C08C7155DF5BACD75C5196C571C3C456C4 7CE8D90215FA6EE8CDD72C48740F7F5930EC3632DB63A9C8D2DA125088C0F05A 9FC83D16B7F53163F4EB6FF372C6C3115F1E68EB35967D11126EDEDF0BF80817 E68A698183B3EB0A207DB43786E1B9D289359D75AD5E465328CAA90E712C2962 AE2A466173F2FF30EB535A6054BB0B875DC8552C16B49DF17CF84D98D35497BD F55E273FCBB0C735899529A69990E09149FBD2DDE64B7FA8D50AE83925DF03C8 0B63EA158FBABB12A028803DA4B9DD6C48C0FEC469C4E730729F4BB420D5B003 1918B4AE9CF35CFD31E8E62A44C0484E3D00143BF1D330235E821E5CFEAB4D31 7CB4604DB1F310457FCF9075A3527279644D908DE847CCD00B6F50DBDEF91D3E 38238CAF550FDCABA2C3A46237218DCC5A09AFAF69997E1EBDA7EFE6FC99ECC8 5D4AFD5EE35FE2346BE79B499EC8EC436868154A947D13BC02C780EBA4B9E64F 3026F1BF5DC1F8D64FEA1281EA40B4BC355638A3A59BD9055BCBB232FA45EA0B B405131B64F105814019BC55466EE78E9E9ABB62DB30EA452F7EFD7196C76A85 15B2CFCD89922CADC0F392B0C54A231F3999AEFB53C24EB0C63B0C8A1A1ABB6B AAB2F93E5ECC7AB90EADA320E918106BAAFC1F8C425C617639984629018BA674 6FF4F338AC43E23BC3740542911C058D43A49A11CB3A0CC8E3088BB5BA6048D6 CC2AD250DE956BFBE83BB24C945C20D9C22E7105983F284EF478F9B68BFB0322 EEB7D62802CBAAEFF1C2332159DCC7243EA40CE15C734EA905E04C476B178B82 A08ABCB0B86A7330C75E62EE7844C9E22DDB013ADDF20AFE08122EE1B930A81D 806A0F8CC584CB7FF5F56F9B35E5FF78FD93E7E4A40C64537464EAA275FE88F4 461FC6A467C8A69B9A9FBC10D44AC1B753D313A8E7D97F5FAEB60F82855658D1 4DCEE043C8FCDFD8A29DD091F3BA55874A458B2B8989F35055C72FC411382361 9AADC717E602B48D7C9521D3971A6F7EB19D539445DDE9EFBC5B58FA9E5E426C 172C45CDA24985FC4632287FC3B15849DEB56F5A061993AB10A6BC59868534E6 69888175053108B77E4978D971B4EC57224C0F93EEA4C15AE92254140A94704E ED5666FC06C5341F643F779CC88A9E81891565C63B6F7F6286E664F4E0A48690 356DC96F1B98026C563700772485B83BFA06435D4E0793EF822F423C93FBACA0 E5D889D2B76771C6F0EE997A5DB43C2F6921132890406E3C33F6F159B14C5D78 7C151BDFFDD02B697315F191B5490073EB418A4FF2A398C68D44F0CD1B87CF9C B52F12728B72F94D752D23151196A256908135C87991E508B8906CE2539DCA8A 31F86809C8C6C18A09F6129BD7CDC6B37E76B648788056851F22BD3E3B5772FF EC01D822B57FFDB3BAE624F05531292641FD6A7E3666152D18F6C653048DD7D7 98A942C840C4A0FA662F260B21C64214152BB86F03662A330109C5AC0A5EBA30 C6201F558858130703DF76AF4FBBEE069BDE45C0D9467077D85FFED4F9BA9C61 AED87D67CDCA453A6528AC5BA153E1039D9CCC556CEA5CBB542265FF54A1B208 E0E13740E7E7C26AA00AEE909F8F3ADC2726081A744D8EF6BB711BF5F611A900 76F91C26A338DA13A7160A9F42410CCEB3190000D963D036FDA05A29F598EF40 8FAE6F8E7E6F50C99C3304A573501C13A00023085F057DF331E3354CBE65D573 CAE73BF15B3B96B502E0AAF2B4A86237E98A997AAEFFF4227D5A26E8972C48E7 761F430733E6EF8AB2D903C17FAFBFA21C25F8A0AC157D397BF3CC1AE7598F0A 2BE4FB46B29443CE57F41FD5F91122E9D86F903E94D5B55E2BB95949C156D138 89883BEFD634311F9280C7F028DCA6408D3A682DF5B55B9F7ABF08F019190F60 D39E4F0E80F0594235B09A5320109638B938633A2C196E4ED2B43DCD8643C3CF C6123B076B7F73352F906D96FDE0FBF50CCCA432712C574D5857838BAC30B485 D25024EB254A7EFE57D1DF0892C275CDB3DF77602F0FED0FAEBC644BCACA04B8 B424DB125E487794CAB36E01B5E1A26F5E1E97A739AA36D77A12F5B45338EB39 AF36CEBDED55DCBFCF497FD475FC6BAB5530AD6153C6BD982564EE8712185F1F D5EA7ADF4104661168A01994C1FD773A50C8AD6A3E4D332E4D59521BB8BBC6C3 866EB4AC3EA4532477E6CBF6BBF0860031C3B916AA25E3492670EA67F55CF4FD 207C684A0DDB6F4AD21B2909CBA71BCE2E762012B0927BA72367A6AE0AF87F73 756C9BC85E4EDE35317E2CCCD138C02C7A8013AFDC1A48C3A4BB8EF257BDEEA7 60E012F54D12D31D18DC59D5E526F12567B8688B4B67E16B56713870300016BD A3B9DA87FDC865246AF8E94316799110D86B1DDADB8A673402D4226C519C058A 1D1E5A5778584FC28AF12819B1924060BC4F54B1054EA6AB0149E04B8C4302D4 A56D8A347EB5D3D2A0E12CF7E35059BDB53D9FF6BD25F6D9619BC4669CFC1048 C6C9978B8751B840F27D82A69075832BE59F55C1737CBB1220FB8FF691FDBDF3 03BD7D225A9372AC221C38245E48320E1CCF898D9EEDD678E5B8C65B7F588321 1A3953EEB9B39EA9A8CB72DB08C3E9234DFFF5FDF9DF804C021D57E97DA7622B 97F4CB6E0EB640E0DC9EA15C5193F92A3A7565F4C7A4C9CC327F7CD2C44900AE D9E76FFE62FC37FA376E77131B566AE67C3E09DA80F198BBB995EE8FA47EEDB8 4B467C6C7DB8AEA745CF8C56B8BE56534E9C56FCB2B7006426DFE93D728FA4CF 94F131C549814E54ECE7C914C5FE8E4961D3437CE7475D03534B62650F551D97 201C794AA877445DBEB11C85ADF6119B05360700F8CEDE4766E3A1D7A35CDDC7 9ABF7C619E3868A39D1852DBE1EEAF5D7898C78323873AC005542B68C43C5000 CC58F675EB595F87C879694751494676465891E8A897158B481F11A171CCBBD7 29603F00210CFD7FF31FE3D273933ECC34AFBCC4108D9B76D9ECE63EA06CF939 4799092A54A749DACB82C1424E9879672C8BC084C360014C9C1B6D5D65C68AED 66CE329C3AD712C0A36BE7EF03FDF339CAA2E0336D387A693B1DFAB5D5164E31 14755A158168962C9B399F8F1DF3FF5060D7464D5071058C30C572A2BC7DEE53 84BD7614A4BEC4C84E18CF7EC81C811724463BD46CECA5FB57B0F55EAE20CC74 6AD815D1897B037C197D2456797B992C20C70B663BF99FE28C513B4E221C8E12 49779F8C0AE8517048ADDF7CDF0D698E3EFE60071C4997B7F5EF12B6CB65390C 224F13FBB99FFC034C0710F05019899689B6D3350BBA65C7CE7C2AB03D81B9A5 5F3D65E4D462DAB189006669F7390A78A1B8908A4C913B15DB8827DFF15BB9A4 A6037DDB643103B937257A7DAB025F09D53FBBC2BCB6B0BCD8D56B2B2784E498 1F6CF8470DCC892AD0CFE11578718948BABF9C1427084643B66BB9181094E29D 5FBE37708E1D8A6B7518A96876844CB66954227A7A6AF28DD075A462526DD5D6 40EECC56FA366106E55C7068997B54B7F0D03AC1AD45D28C67C7ECA99DBEDB1C E18A79C353113E2E05B837E703278B202112B1C69E42A69D64B62F0E7D8F7E5B C1F93F0F99EC20EF312046F4B0CD7DAB31E422070B629A7FAF3BC331F0A7186D 4053C7A7BB3253326E1E84A4EA2D9659CAA229C3AC407FB24F4ABE9482030869 A9668917642B1ACA4C6EC2153BA085CB745676F8783325BC6F017E28C8C2085A 26E6C61199CC03DA8E100A0E0E26CC256310A0E1BCB6B0FD1EB01BDC8E5035D2 94A4351DC0867B4BAB0208DB3C8B712354804CADB0F70BD9C8B3544733F97167 41B1B66B512C1290E6D6A79DE9ED4E8F44339CAF9B7E1F8C6839954F077F234A 65B832BBAFB59E4A8EF37ED43D387BC98A93F940531F3EBD005D9B4F745AC182 A2E12B21F30E771B9EF9ACB2D669D062302F200D8F6A269544DE0EDDA5D745BE 63445CCFFA78EE5647577A0ED19C0B629D9175E737A7598B9AFBFD3C6A3554AC FBA256AA5B50E52DE919A353184DBF6EBBF3A0AE508638342E0F2BB1F3D88BC8 848E84BB55C5C4C6D026F8E0BCC38F95145B38106811DC6EFD6528C95B38F06F 97E8F3B15D4AE350894D705ECDBED3AD63F1C20DE216BC0756BBF4B6B69E4165 DC45495346A27EDEAA502D459F517BDE4BF61EA8959607F82AD0A10CADDCC9E1 FF5B7E24572114B4346F38B9F781E8AEC4CBB2 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont %%BeginFont: CMR12 %!PS-AdobeFont-1.0: CMR12 003.002 %%Title: CMR12 %Version: 003.002 %%CreationDate: Mon Jul 13 16:17:00 2009 %%Creator: David M. Jones %Copyright: Copyright (c) 1997, 2009 American Mathematical Society %Copyright: (), with Reserved Font Name CMR12. % This Font Software is licensed under the SIL Open Font License, Version 1.1. % This license is in the accompanying file OFL.txt, and is also % available with a FAQ at: http://scripts.sil.org/OFL. %%EndComments FontDirectory/CMR12 known{/CMR12 findfont dup/UniqueID known{dup /UniqueID get 5000794 eq exch/FontType get 1 eq and}{pop false}ifelse {save true}{false}ifelse}{false}ifelse 11 dict begin /FontType 1 def /FontMatrix [0.001 0 0 0.001 0 0 ]readonly def /FontName /CMR12 def /FontBBox {-34 -251 988 750 }readonly def /PaintType 0 def /FontInfo 9 dict dup begin /version (003.002) readonly def /Notice (Copyright \050c\051 1997, 2009 American Mathematical Society \050\051, with Reserved Font Name CMR12.) readonly def /FullName (CMR12) readonly def /FamilyName (Computer Modern) readonly def /Weight (Medium) readonly def /ItalicAngle 0 def /isFixedPitch false def /UnderlinePosition -100 def /UnderlineThickness 50 def end readonly def /Encoding 256 array 0 1 255 {1 index exch /.notdef put} for dup 48 /zero put dup 49 /one put dup 50 /two put dup 51 /three put dup 52 /four put dup 53 /five put dup 54 /six put dup 55 /seven put dup 56 /eight put dup 57 /nine put dup 65 /A put dup 67 /C put dup 68 /D put dup 69 /E put dup 71 /G put dup 73 /I put dup 76 /L put dup 77 /M put dup 78 /N put dup 79 /O put dup 80 /P put dup 83 /S put dup 86 /V put dup 87 /W put dup 88 /X put dup 97 /a put dup 98 /b put dup 99 /c put dup 100 /d put dup 101 /e put dup 103 /g put dup 104 /h put dup 105 /i put dup 107 /k put dup 108 /l put dup 109 /m put dup 110 /n put dup 111 /o put dup 112 /p put dup 114 /r put dup 115 /s put dup 116 /t put dup 117 /u put dup 118 /v put dup 122 /z put readonly def currentdict end currentfile eexec D9D66F633B846AB284BCF8B0411B772DE5CE3DD325E55798292D7BD972BD75FA 0E079529AF9C82DF72F64195C9C210DCE34528F540DA1FFD7BEBB9B40787BA93 51BBFB7CFC5F9152D1E5BB0AD8D016C6CFA4EB41B3C51D091C2D5440E67CFD71 7C56816B03B901BF4A25A07175380E50A213F877C44778B3C5AADBCC86D6E551 E6AF364B0BFCAAD22D8D558C5C81A7D425A1629DD5182206742D1D082A12F078 0FD4F5F6D3129FCFFF1F4A912B0A7DEC8D33A57B5AE0328EF9D57ADDAC543273 C01924195A181D03F5054A93B71E5065F8D92FE23794D2DB9C535A5E57376651 F6823308463DC4E0339C78699AC82C769542FD3B410E236AF8AF68CF124D9224 FD6EE92A38075CAAF82447C7AF41EF96F3ADF62F76FB425BEDE4C4124E7B1E0B 8BF254D91912D3A99557F5427907A56514C5A3EB961B94112077FE9417B70DA0 B2E1C1FA3E1D6F01D11F640CF848E45BE3E205258E64FE36AFBD4DF4E93F6B1A 966C8E7FBE2CC8FF43C1F67BF6C361678B5E90F4BA524FE8A4CAD6AB28183E6E CA6C9636E884845105595A2E40CDBE8D4807A81AF4DB77B31873FEB221BCADD4 2C4669459704CB58A7BC230FC59F867EEADE660E49AEEDEEB042BA9A7DD8193E 56C3A36A1F639F7EA512EE4BC6992F52C2FC82A890EFDA730105B0AF7B819295 EE00B48F64C2B5BCB275B1DD62F289CDAD4AD9B7EF057684642FA6FA6322C277 E779CAC36D78F7779CB6DE12638B3C65B70C6B5F8A8C6421A379719B8DD44973 5F52856A4A29B2ED37F2B1FBE6EF4B79B7C0CD6395C756A00FACD763C235914F 847D1D99831023CE1FD89EFEC83AA7E313131C0C197248605EF5BA773D0A4000 72F607551A8EA6F0FF19441ACA179177D1FF7B423FEBDF58B0C19CAE3C10EEF6 3538D8FC4762B77C5AA023A8186C40D0365A4487DC3564265B3DF908572DEAA2 57E29EC669DD72974F806EFF5ECAFA9ADF1F9D2A63087FB7BBD100F0F81C6FFB B1EA1C9DD46548AEDD147EE64B1B4894972DAE1DC3E8569D6A3CEF9F9E46DEB7 547E10BB2959D374A33E47C58F1B20419920AB485F166062FCCC08EB5CC9AC88 F388F0C0155027B727729488E44CCABB7064A1432E179189C4627453C5231535 47D1F2B8BA43069696830CBB6E5F9A135CF22D3D1FE490A3A63C088EA32FF444 24A2427BBA63033DFE2E06DF8CE67949B6AB02F26335A376B57376814D2A7DE7 64A4347577EBE9A6E33DD2FC214A09C6D889C8FFBF1D567032548851B8F97204 49E215CC7D222F593E1EF1439ED60AD922D41E0E9EFB5CA48F2FEFF75AC5FEE7 FB6676D8B8D4DB6885FBE8B61B586313E4DAFB09D94CEDC0507E93000104F3DD F83865A2C6F6A7DA8562BF86F5DB233CC9B53391273A1462E40876A8AC2B098A DBADD5A160DEAC061F86A5FCCAB495EF8A9D121AF07928EAFD56F618E4EAEA97 CF89A3AFD406FC9DE1E9769C1E1EB83BB883786BC075EB5DA2692CD59C4DD7C1 7FD2FF9B18AC740A390C1DB38670DEB18C67721A1DCD502FE7368F47DB4281D5 459B3F020595FA3B10544AAE9EF786A0645FB7C9BB29D091E1432CD878A05918 1665643005BFD9A4B0FFD347ADC84CE22D6F9AD4EDC05E8C7179DCB360AB57D1 6ABCD200A4B4AD56825DC345984D9A3DE11CDA5E9EC1E5006EE4181E4EFE0846 67D8C27BEE8F84A1E01947E945BBE988702DEB2240C4BED952E433E5305484E5 71965D3DE95C4115FF78CE9EC18E323C599727C8B93CDFBCD1CCA780DB8C81ED C4B5E596E1603624308972FFAE9A57B0EDB51FDDB6E23EDE2946F61BEB241345 2A192D8CAD53E823D687F9C64A70A4B4B703291FA6317C051DC6A44BCCE0288E 3839D726A8F2E39BFF429865E95C726E808E02CD06F36C1CC9AC77999F8E28BF CE9D74B699CA982479E9D0DD98EAB24D29C981EF0349721D6819549A39413801 F80182D567EE316E2F0AB208068E15693E4C399A381BF9BBA625E597E6E109B8 16F3A84C8EC92F2ADE288821092A421A8D3B907048FE947230810F0777EE2542 29A3485223FEA079B359034F70464DAD2F0E420271A4E0CCF57A0ABBC20AB327 0CA71B292126D395E0D083B19BEC6B48A9DE2BF470C3D01A8C3F52075BD4BE02 A0C518355814478202FD4762EC542F8E7B9B1F7824F0554660CEB83E35635E1E DF0D03C94C903ECB36B4948ED98B6324E0094EB1DF70863142D4ED3A932D7346 39D69F8F044B6084482D7748C27328AFD24A3A70B99D1F7D32CB984488672254 28B6A9E9DCA2C9FF6A1B311D72413404B3CE5428BDB7FF3C36357D7975184F56 FA6B32AD54C37D0AF7576663AB1397B80D4E998F0B4C4F6D90B483029EF2EDA9 D4C4204C1546EFF3100629453EAE01918D09FE104E626ABA38646F17B6A94CE8 116BC7A8D9C319434CA5B830859B4164DFADF1D7C3ECA5C78D8DEA930EA4AC3F 59DBBF3148C91A2E807FB934E3439D4F67C6DBBA9972854E6E3688E1E0A34B74 482217CFE031CD7B5DFEF727C3EF8DAEEEDA08F4C90289E62FB2AF2357EB2E45 4BC547980FD479101FFEEE477AAC6268DD659E8DD9E244676FD3C6909713B71A 323B211E571BE711D103FA23B5B9AF077D84E2D20FEE805E81D20C03501F0F17 C3B081946CD0FD577F00E50B76CC37CFA97A61B89C25DD43911B28857284BEBB 5BEC61FFE3A14C64BC5425A7A82326617F6F1FA4FEAE56071C9F559F91568179 46369B394A5CE96FB7420FF8AB7C61CB83492FA5AE4A4B0799578594C9EA67E1 E54498AA5CD6ABA34AD3417F04F5D8D664A7EB39D41E2D17643CAEBBCCD9C38C C5C9541641A09335EFBCE0D276A54253EFD68141807A66F1DFEB4BEA5889FFA3 4D20BD52012206A9F8D3E0F6AFC03FDBBDF3E51506EC6336E249CEFB571AB84C BDF8E471E3795C04E38A5306BA6D450D72E50910D1AC385BB06CCD4B8E433A32 5A4B7FACC976BB31FCAA1E62DB2C4FE06DDDE7367930E336B49F47DAD91C8735 9A35D80CA2E117E86B52E41E9278046ED923454989E48610ACB3B1663F197117 52659A9D7BFA561C7ACE0771794FC778675F83C5EDCB132AF124C7E6540A140B E0A268836C73A3C746DC964E482E63C56C0D396515283970FBFF182F9F684FE2 655FD8F5D057D22246DDC3FD11B77552DB4D90ADBAB77BBB1FB1592129DE0AEC F822D7D36E52BCDABBD560B403A5C56C5E1BE789C3AC049318C7FAC5E5861E42 FD66C3C0F46361078D7E036281682BCE9BBF77983C93ECBBEBA9B359769CA442 87FCA1B98F4EEC4935CC93B08AAADDF355C99816453587310F08C50B9BA3D107 5388A1F3AED2AE32BEFADF0285DA90436D1D7EA85D7B9B6DF2AC4B778CFADFF6 6EEE54D1A1C5DEE3CCA7EFF57A7C2931933CEED90CA26DAAB45E4388EC4DC366 B9E88518D6CF094861D2A59282044CC06E63EFB390A6DF4BA5EAC7CE39E1EE03 3D84099F5BE96612789AF3EDED07266EF10A0FC23EA1EA97040B6BAA63138B1A A9CB8F5DED781260962D7618EDB200C3ED976033E8967A8CC676E9C11F74BE34 343A7ECE7EE97E8F76F7E95517A6D6163527406EF5A669535CB2BF4031F29046 BB2D0FFFB47A576F5EAB1D00A582965C56F28C00B3BB7BE2CC8D8391F789070D 775EB775437F0CD53DA840BB3575104B63E4B0BF14E3F14B320EDEF65FD4CAF5 8596DA491BBCF3153DED3B718F833D106432DF8DB8B8E6B34D5308C9010A5DD0 7E0E53260BB84BAB3EA748E8D72F75901604F80F4416920D69B4B983DCDB72C5 E9928F01A4A85954FD74578AE336C782CDF81D1EB7EBCEBFBAE7ED8AB4862584 397928F502D65139CCD582CF0723C5262EE54B9D2B8C39614652A8A90E1C3B65 7D26B99DA298FE4B9A7E98848F619C9BB4FF9FD215B72F99506F06355B332689 37D80AFD9F9ACD8172CDC51FCD3A759ACA0F7D4EBB07840840EE42C2D5B8B257 2C6DB3A7657B75F2F0B9730A20112745703E2D0FE709436CA6A5F36F59E64D9E 37C0A23D6D289E1AC1DA273872F5FC5C3DA2B127F078A4D7AB3FD7E124455817 DDC796D54EF26A1FBFD539D3A21B86DD4477DA49213259ABB3FF241424F2BE5F 89151E02FF87E0BEE26E85C0E518D8BE7CC9214B8E9A9EA1DBB49C6C212CCF08 90C0F23E9858947EE344062EBD9C574979087439975EAD4E85CD7BFAD3C91CF1 EFF577843AF1427D06CB2F3BB519ED1591974218C43F0D2038665F9E2E3960B7 FE68CD3CB2DB6B36C7997C6B21EC11CF1DE049541001FFF26D14C255E3AE862C 5A5701292FD2FB3D04523D6E2F3547923BB117718DFB6E6520F0D0B5450C695B 8C9242CC8671B7284CB2E1E9EB097A3DB1B4D5E8EEB93B4DC7E38C0A10474665 54DDCBAF079B92EA494F6FA75A84C5AAFE280284D0823D7C22249A21044BB0E6 4062074ECD17B62E03EDF4945A294BFEFB51F5FD870D9D7230FC91B83C1D85A8 86CDDF326FC90E04362145D6E8630C50594484FB829DA18F5C078F2EE67D2F2B 08DFF39AE2E8C9741FA989AE494C7166F122D2C5F71B97C973B7CE8500E9F87E D59C30F2E99CC4D34713DAB680598F41955FBDC26A14CF1E73D6BD6B9AAC8D3B B998F2D0D647356CD236DEAD6561389ED3A6746221B0CF15D6648412B35A6B54 6A0EF5BBB34AA376D9BAF025BFC650C1B74333CE85413D0EBB2F4D082A26A5BC 3C0A25D2B12CB159F140E00E262F1CFECCB2C802FF94CD34DA0CE9B4B3830FB1 DA85B9B670D5169928990A2E9CC869891CA2FFAD9774E6B92549644DAA5FE00C A5BE4F5FF91A0B6D2FD8F96121D766391EC4ED3E73DADD476B7DAE1A50AFCD98 DB7E27E44D30416088D9BC07D4661D9ECEC0806830ABF14CE55AA3CA2DF66E8E 748B8ED46466F1EEB072AC0674FE6FED231E0DDA59ED7C42BC05EF00E176050A C4834D893DE42474EA20DB1E25059E84BD137EF65A02CC295B0FFDE4CDE95879 0FE88BDF2519ABAE7F8CC3E6386ED35E04A14F1E3861922645E3A3F43B48A5AA 1999A5EFE192515FCC625C829FF5A7B337AA422F5E920545F9BB269C869A821D 6C4C26DD2AE746EF0F0B4C1E7E9871ADB5270E1CA9BE28225F7A0370D4C52422 E25263EE101C4EC1C7811B05AD42F364844A56BB91EE72FC8ED53CC6954D2BD6 F945D739BE4C61E36143CE890FC0CBF2F610018D678ECF7CEAB18FF5A0E48F76 FDE2463D40A99380D679B3B76D39C664F4992D23E5988B0D1AF33DFB04894016 E852EFD1EFFE586153C0F31ADBDBDE3F73FB49C5EE64D0D02E1504248FAFAC3D 903FD44679BB09C30288139B41B1E90A10139CA3172677250B16535A1F3E5E4B 6F4264DE58896E66051FC677030A121C5A285C47B6129CB5A3998830CE070D21 2F093FC1B44089F603A21F45F60960F134A47226874C737EF6C085634B0A4A66 139420501351F737A73F39D960EC38420BE46E5B09D298E7C16B8E32F01507D4 0141FC52DA1DE718D634AD9C8B00E46EEEF84356759324D2B9A3473C5DA38DE9 E30182B87F91B6A7F7BACF29A93B44C879CCDEDB063F9D2E51E0F1FC9F018FE1 2433D85AF24B55DE3A61C4D0A2DA4FDE933F5F6FDF17E9FA9932BFC46E2D71F6 585EEF5B2E4E89E797A24B799D7F064DD1A817A53677FC9EB8CC3E7F93FE50E8 D50E3191052943FD6C98B573BDD1F6D70349E1F8011599E3F8FDF1D6E80A710E 51E434E85801617C6FD8ACCF1B77B4BFCCDD35CB4C0367F4EB4D8D9DE8284D5E B4F43E2F8320C2C5A9AE90ECBA7E65D377E91DB69FEF27069235366AD3E126C3 A73CE97F4C90BA00D206FA012C327FD69EE59AF4470A315B1799CDC0539BF90E 512C8FC3BEFE4D1B01D969EA9E3FEF976CD6E0FA4C9ECEC955B265CFD58AB8E5 F7371E479279EE14B689269205C5B506940606CF3E24A1E7EFF3CA96ED30AD6D E243DE57690C3D69A401AB3315FA49E4BF4ACD4DD1CA39272533E82EFDD508E5 1C2CD286CCC5DE1202C7C7F654521750632EB637F918667E2233A43DF75239EB F28F3129EB5DEE2FC5BFC331FF709B0FE9B327CBBCE98BCA2C861C6547E50407 1218CEBE6EB5F9BABA4F2E11BCC6FB553A544A567B459E06375102C69F8018DF BA6A227CFB13E2D74E6A521E01B74F2963E9A0A1C9FD87A88EE6356E3BFABF55 BABC751D2BF85E6712E8EF57914920775906662E4BA68FFA21AD422D34E15578 43CA0568B431101A1194F8AB1EF25E886BFCDFC10F4A5EBD9530816548BC298E AE4A0B6B52B8B59C644C409B4191B6F4203F52314F2675F02AEB65A72C66E92A 2AC703E15D8D381522C0AC30C165B822A9B8D18CAECC094EDE020756018DCF51 D0701B507519C4270B70D8CE94B436F640C15872F9B5B77892AA3D110E4D6A65 8F0815C61A5127BA25815378683F46E69E54A391A8675977E7DF9C2D4E6FA991 9F029E50CC2F266B31EE9F9F24452D5838905F330CB7E416B8AF836C5AC26AB8 BE2ECC6EA4BDAA08C30995709E225C21D35DB6369167602CBFA8DB2697635925 969002CD1BEE745DA2E56C17EF3F0C05E3847147F86963C37A221C8827195A8A 3D38993E4939AC915BFD9A212F5FF3F826F742B952018986F9FBDDB69C3AC65A 845F7F33C55D4BE60A1817EBBCA7E1538E8087E1BD5C083A320D52953BE65F31 E8339C612A510B59CE48D2EF7061560C4AD258E7DC59694493E3AC878246F37D 6DE89253EBC8830C6B209E818213C4AC4CF1F391AD91D57BE76FB0E2924A1407 E4A949C905E44F54EAED6419F13D59942C8079336A172D4758BEB5D3E786FB93 3CBE4FD2EB53E4E1DAC34E821EB30FD44BC6CB4298242C38F848FC23AEDC9733 52BE6F32E31E25F18301370F8936810B0566B664B042C7AE0D78ACF0A87E5BF6 F9B66E358168B2CEA30DCD940074F3ADB793CDB136161FE2522905E87B8E463F 95D4DAB7E14A3DF7BCCE8141C5A08FCFA2BCE9F2D1B05A7642E75877EB840149 AAB007CD239AE47AD115929427717F219B0A8907F0EC79ADE1B901DAEE87A2F8 39361DAB43DFFF69650F601B24061A9353CFD619FF9626F63275FD09A5B13BB4 8B3379EC4D147C41197E8387FC04DA7BE409524CEF74EA91DC066808A7FD0EF3 957A44E2503EDA67B1C61827479486134E922E560A673BF314D601C66003CD07 55569085AFC8428389A140EB976CCFB8F29E27587E46C413ABE2EFB51AF5913F 53EEB74063162E0BA1E24CEDCA320377D3E11BD374F0B44E132A5C35835B6E2C D32948EF9DC7931D104C1385709DA882DED6458319F21C2329938396BC074106 CB9CFB9E0A915F8DBC8435F386917AC87A2BA45D857EC30ECA66FB4044F5439E CDD556B82A0E43418D179AD883C85AC276E1190CEC242E3E1D86E725ADC39E46 BB6C47FE9E17E29F8EA81E870302A00D91434F3B7A05F243176E6EF1082541A1 B9052191EE5C2B8E94A2E02DB65FC769653CA8D1C07A13CB853544AEC7FC35C5 218DE3128AA31952DCE19C55C23FD69BCEA2C661F57B11B8F9E86BFA718D1521 3346E78C701A5E51923D6D937E62FDE3669B214D240538F069A100A542720A86 31DE88116DE775F7ACC2A49EA6C02A24408271A846990669F2AF60AFAB4C16F9 7F4E88E917F0FFDCE68F22998AC0AF2A60A73258C3A4BBC42A2F918123128195 196D0E150D79AC3CF4628503D1F3FC528265ED8324E56849A47B3B07C29940B9 1BC270071E221D355EA51E9942D3BD7F99816304FFFC8F5B036C953B38759341 ED5D7B9C8E6B70C409DD8362FD291201CC385E4A98D73E8518A4C0E544152563 82032FBD2FCB6E403D34B85ED4053A8CB619BDD4DE001F4C3007B1F317579651 E6D6662189CC2D95AB85D7473F65C5D7B4AC63B0FE928F3400035D5A9D443D0D F3532B99F3AC26CB25EA3CD64C341159061E02EFBC7C033C05CD919BBD827A6A B36258037B5F0DF7D78C26C1D24931A18A2606939F9933100C723ED2FD991F4C 98CCB4F15E381B4886FE0E928D4989A0257051C547165291D35FA5BCF359E153 7EF69FEC09DBE6A9E866BAE054F56E86CA2D299F8DCB88685B932117314A73CB 5954C6D639CEB6F8A0A1F4D9414F1CA7CF3DEDEE81F75D8B5CEB205425442B32 8703A8A79A51613E3E6A46C9B7B1052C0A5491130E312ED3A0A2F32C5D52B15F 9621BA9E1688463FEA43F72D5FDB6E8D0739003C1D8A04E1589A7FD3F405364F CD0677FB7EADC0D62CB762350689F751F19E6389284C97A5163CAD892E9A7043 AFEC5A36E7D86F5EE345576F3AE6927C6F5B2A095817E7796ABF9401CA7FD97C F98B3AEFB15B9733AE8596EB63DFF44C8F1DC65F4E28E12C1F5928573B1CCE63 D64F5D1C62E7828298D090BF224D36344959BAE4CB57E640C16BC3281B96647C C420EB97A3EFA7DBB811C6C02EFD433AEEEFC0621B335198C3FB7595ED39C873 5D8F0454592A688EE22225703992E04F6EB063AE85D71DE54AA966400CA1D4B3 ECC6682C9D747AF3D27534AD8529DE4A07203E93FF91326AD3168352B243C568 C43990EB5B174AF6498D79904C591BCC41016EC5310C666BBDD17C5C22D5B349 F863143C1C29CC96FC2B3F1CEF02023520F74562B29735A0A8003D3C3D60D3BC 8E37561F9F8AF6BC77147394015EF140B4DFF81ED3C3208DC7554D1BF6F132E5 98C4776C17E4966B6852935276240BA483865F8B835D439FDDC362C4A85940BA 589995C8362BC2463D165FD5AA82392656BC5BB67F51F51C078CACBC96A50DE6 64C9B8EF9B257FDCFACB51A3530E134329D9706EDF1F52AAEE5913D53D235A93 B7BB6F14185FE354F343262864DC4EAE6A69C7271E1E9FF3F7B802FDD64A3FC6 5E41434C6271A70B233D73FE46DE7A02D1A6603E6DEE6F76D9211ED4CD9DF58F 90C5DF69F1B16E26E2FAFD2FD7545CCC6CFC6081F6FA6CC7839F0A32B046DCF9 B28CB0AF85ACBD6531D9F504930D9FB31B2AF54ADE891D283A8CAA0F8D06BFD9 5318192A46118EAD7C368E901B97B1EBFD4F38C31CF4FB6B4BA313A6710FD2C7 90E83DD3D407C29447569F028561268F34037785478C1BE1A6DB1609EACA24C3 E0D799379EF88DE2AE5C6A479CA0E233C6E5015A4D84DDD7C93D66821DE7BFDB 58C07D1CBBF698AD4C04E131FFFAC90206645D366B994BC963D06D3837CC6230 E152F258E5540A5812CBDA11F46A1FEC0447192DE7BE52E397C8AABEEEF0E637 702919F17039579C50F9036022F92259558D4423CDA6FB4C25D105329D24BD73 CD65431928231226F1CAB947EEE73AD08E20791CDD91C049E6CD752DBCF2E421 F0FF6B1DD09083878F406F24C5C141C2CF62052E44B9915C077866F0D28B2877 4C25929DF882AAE4685939B91869EE4D76112DB11E92DE54CD2B8FB5AFAC2018 701B6413769D99DB16DE57D8DA6A59E31A707952D814C4F14FC06B5628FAEF46 D8B9D4D025C574A2F8557BA31F50E313FF34A15F058DE1A3DFBD906052321772 EFCEC38F42139317F55CA58FACBA7EDBC7E72E9FA3AF091534681857BC82BE53 9099C491C1F5C6C6FCC768F85DF3ED615462CCDAFDDFBB7D183434E5FE5010A9 314801960528DAE0A2972D108B2B0F6D14F4B7ACFB2904B7A470A2D2BA963BDB 8CEAAEC2B4D7933BB6680332E00A22B69391A0A7809BAFFCE444D54E4BD2776C 1BEACE2EC557CDB2D8E86FF8866F4279E6F2F6AF916B675A70FAC873982D4CC2 120F7AB416C8A6185D9C0D8A9AA70F5D43219A2DA15835E92BE1FC8DF8BAB353 4F8CA494096BD9D56C35BB8D6B7BB1972AAE9FACEDEFF52AE171848D2E7CD6B7 666BC1C6198F8E8B1F11316F23F526B56B611356A6AC0292384E84D8A79D7DFF FFA3FD17D244F6C820D82F4BB0178AE94EE9B02BB81983B42BD76F389971C182 F0AE5DEA14A99A4E856189230FAC789905E80FF8228A6B691E4FE6C94E3C011A B235001733CE38DF7D25EFABD34331968DB1CE6E7DB744A33858FA6A204CCE4B 52CF87CD6CA0BB12883706E0DAF062DB323E09B1CACDD7ED5E126E4A47C0EF89 AC792DB62C4869197A44C95DE6366E028170489FC018F6457629EEC61532AF57 9DA218AF1C875E0619C714C42531D328A83AD86E20A7EA18AFF8C377070FBF81 E217366D3B3A13477DFE9CA9DE3F65510CB289824765001F124CB998740241C0 231CA4B10BDC75FD36F817C2CE13917E28BDD9F173974691567956ECE5EDB294 3080960EC2B89D57EEB4575B997A3CEEA933CF068FF837D0DFC18154360CE0A6 484F6E9EC7079F5A9AF42BD85BAFA9913C8ECE1FB05FAC1C6CB8C0342B659BAA 5163D25BE160773F0C1250E6FADD30C02F4FB5CA63FDEAED57AF2A2B5BCBA45C 7AC3FE181DEF569ABAF226955ED006E2FCF3D3B9090FB9416DC0F1051D621D81 B88428742B88646E05D1B9C5BDD86AF2FC02A9F5C94B787C5EFB85EA5C9C7397 63A3DC779ECC73F75B045E9238C79167D3C41AF9A49C0D365E72B1E73D7CB781 3868DBC7833BC9E06CDB517D10BC3D64D55303E26DE71D13944786A005A1A2AA 764DA981E58276E35BEAD47E07B6FDFA8F32B3E4BDFB2EAC789148593C33C448 1C5610D6FEE80CB504B28BB34555A8475CD66612224E14BE69583F5D8163AD25 F42B7904DFF55EBCF0AC70CA328E04A1D58242CD5F75981F22C84BF6CFBF9873 E68601B1423AF6C0D0B9E47AA073B723ACC6AA9F7F7C0089818E3F825B400E23 A74B9FEF6EF99A590D440CCF9CCAAA2474488E239B497704B894CECE59D473A2 ACFC457A9B8C2D9D264755ED687B7E6623E751E57EF45B440744F19261B9B3A1 0DF52A50F4A0B23C5613A6EAB6EA84E37126BE3E42330BCD02B310AA90A15678 F37AE1E996844D75C6F6DE2A1FF767C6EE5AF67319A2DD16B39CF88D4660F879 59C247545FA575411694008FDDDD8FDB2E7BB601504F1ED212048460F0C05959 99965A967CF280AD6113B235A6E873A8CBF9238B85700A15CE5168AD57AD19A9 DCEBA9E962073F1A6E1E1EC401E730B4AEB6B72F304680AFDAEFBA3A50380B83 BFDFB5BA6EFB97FAFC92119D8EF9926D56D542C8FE98AEF59C4D3A829DD76980 D82C19E8B02E470692B3A5B51CD57DE7D6CB319D95EF85D9061FFAEE9E312209 E08C74251EAE2BBB377DD30E0098EFC93B964D6CD3CB44ABBA2257E47FD5138F 13D8CC7B1410271361B205D3453BDB4C516FECB7EE0516B2AAEA38A32B5A64E6 20CD953D5133D177A90D8AF2EBD91525DC389E65215268A735652ED107B39B01 D99A275E63FE00FE09D082FF625D5505BE1B235EA0A9F62285CB9BAF7A1D7D94 EBC9108A54E12D87F7EB04DD99DD8C33E481BDD09BEFC10E2A33830E664D7CE9 7C44D619B4DCCF265ACC53B51D587A2EDBB3E30A1FBF869F619979A8E4FE7CDA 6FF08B878B5E21214B74B19B63F6F8C19A0ED18F6BB206BCDE12D38A22792029 840AFA856C4646E278063FE41675B9B3C2C7F53B2B66D406C9C80FDE9878FD2D A71A4833964186905A13ED279A123BCCAED69C68D37E50C8F325F720FD4C2177 2E52816DE404106FD60A76A0996961F9CC15852AE989AA4AE43D11766341A06E 00082400DD88F6DCD2BA48D72BFD23C938315A2230B4673692A36942921DA502 9ED0B24DB3DF8FCA1C0C276B1AF52AE913DC8BD73F0B134FD55AFD60DEB10579 E8C582CA102181B893928140B2669A2F562945E28B8A29545E66ED3855F97269 5021DEBF8B1150D5843226783B79A0589A279A63DD8DCD3076C93A899FEAA123 6FFA7DF7CB27809737567903EDAA222A74FC9ADA41A8F34E8C28DE88DF69DD1C F33E7CF4549FEAE08BB0A9EF29DCFDC334D6AF381D3573FFD0333B313C467EDA 8EA0AD9296C1533D9CFCB4F2E202BCEC79AF1EFB3C6227A366535653B189D863 788EBC0FEF5598B78545A1AA4E33EF9B0847F2589A682511669CC2785A592F10 5EAB71983B21EDB70F00098C87D28EF09F6108F7603E0BC7A7484619CCF935CF 64D1CC208AA924485BF12D256B5AD9A8C359F31BE4FCEB142C654E69ACF5B8CF 3984650D7EF65FF869F37285EF788B125A9FE4BAB26DE4C91D3275A3843EDE43 FB3B97B88D2AEDD3DFF1F33B470694945CDB280598CBBD8E941D9F8E3B283520 06B8DE093D06F90E9FEF1A559EC861F955C6F90995E189E56371C236BD2F87D8 C370634A9BEA726441E5AC711F7C3766E2C50803CAC082CE5E82885836080C43 3223107577415CD563BA9F8EDDD369D1A8AB304EC2DC2B094D5A5627326C7572 72FE25E4B3456E6651BF3B4E6F9099E2E3764769C73F97C2D9B8199721027850 AB82C89A61E46D7908389ECFF0C8F007E67898A535F8AD18159ECDB576A5BA94 F0E8A48C2E55E7DB6732E431CC66C321064043A5A1F3700DE3BAD76E1F2628A0 BF008F955647B23A1B9F8A9295399E804FA9B6DE12C96638E6D4611ED2FB3012 82649589999F36AD9977C9C989D4FCE8DCBDAEC13DB4C11EAB187D96BF7B0A62 B12966D5F3F5EA6EFEA38BD07532BE51DEA0731CAFFEE571F89407F98C1614FF B06F58F8F5C98F1715B7FCF2A0838D8973E8205A88C31406D1B9F767FF31414E EA039819C84C5E6750166B35DEFCFEAE57EA5C7F2BB9E2EDF1D2ADAB19B29834 7DAD4FA701219A6B385F64554C73BF4B40697D88E3B3B9CE8FF7E446AC291D73 0A13F22927BCB9EAC4AA206E55D11298336E57C37939404E06D10D731E89CA16 76927DA573C6572C8BED68C410BCADEA799715879E08F20F5AF6040E4B0D0ACD 14542982F86E65C83DD73DCE4FF89E542ED6E04648C5F1AB8DFA0B8F639A0D39 4B886E004ED9282C074233F2E93E9DEEC504469B8F8C85F7571498C70678C749 D22971E173FF0B56A41973B5B9A9E27B2D687C3AE28FA1AA79285B15B4F4F2A3 76C3951C290C883FAEA2AA65B126514059E2F568FFDD6779A663C29F001B91C4 EE8998F16A856A0636CE03CF9A542BDE60882F9CDC8F26F4310542DBD22DEF65 DE487D2AB02E50FEF3F5C561405CC240CBF1DD5B465C3F26424580EEF2D0672B 85BCA6CF062EBA84AD2C7C12CC0245F89915E17F0696511568B8D579934C0898 3825D947A495D836C18594EE8A32AA849060A3D3261F152EBA489E7780FEAA53 E49F9BB9CCAFA3E784CBFAFA0EC8F47AA3AF87BA6FE9243B8EC08C6CEF649CC8 0D4424E05415D6A481312C35AF3E6FB987A0F894EE43ACC5500B628D656BB513 F11222B09A711F66DCF87F52D27A848FFA9A296EC65AD219AB7FF18FA8A3EFED FF5EF0474DB0E5FF32B3119679F9C34742D9773F1E55A677D3E09C7C80E8E0BA C0264E5438700A91BBE4DCC0CC72C0B9E8AA5D77694AFCAED9B41DF32DF06C8C 3B0209EA83AE467ABFCC8901711C78DC559BA34114698B3202B2892844810337 894E809109544818EEE1C5C7B53F17E8FD4836F2852176F9C8BF60BDAEEAA33C 9FEC6B9DA6DE25F5B0B4E41701FE0BC86CFBE4425E8E9F553AE870A648BA2EC4 40D1739A041C28C524F15759A207F4FF7340192A66D3D55AD356184F31647DF9 25BB686197EA784087B23EBF5CDB3B2576D08D00750974CBA901895C17B7AF11 6068491576847CC55F23C9CD8820E302777692A76B3EE65546B203A8870AAA28 F866C2B833985FC1979A3273E387FBC522494B2E6BAC67DA45FAC0B1A572532C 6F269AEC6271EF927D5C78EA39A4E93E81C588E84DC7121366D93516D1A0F8F0 5497E60777E438C7116CB6F5595DD2EADA21E891421FD44632DFB684A6CEA486 492E2C3F2254EA53637BB7048AB415869901B971613D58B7A0A85694442FE3F9 5108A02A2B14546BA44A3155B934C79D4F830C158A8137E799119C6DA3A9FCC1 F01B3B94C466473CBB2D9E46E0B9C78825754E0688E516C940B9F88C92BBD790 7B4C1C65CBA43209F166865745E6B42F08EBA1CF87831BE9CCB7DF44629070B4 6E594BB6BD224F9E5526895EE75ED243AD5FB0BBD2A4A2A1B88B6E358BD57D4A 4111066AF593BBC9286228B47CCE98BC0C39CDFBB7709188AD64ED13986166D1 AACFADA6C218B475C5AD48B40D39854A0C9F8BE77B7B7C4FF5B56DD7E260091A 16FAF478BE03A84033700ED8973CB814D1813E34AD7EC6040A9B18934A19AF29 E72716DED618E1218B1C67266ECCF7D0C88230641612F14E4FE48D0E8F25A85F 8ADD8270A9DB078C19BEB947CE99242735C3F2A47BD358F4E86C71A7B2714E24 B02D162B4E518E9C0A34C48302A1D1C9D5EC4B57F7F1C597DD5393DB114EFE7B AA593B7EBD63760AA74D57EFA35E00D7DCDEE3F54C8A9CD7409A3B68B07A7891 3BBB60C86F4D4FEED9EE16E38EF3D5CC94BB73DECEFDD71FBBD671FB630A9B48 0342C9ACFACF9F50C41FC2D0E926DA734B2EA82AC436906A2C79CE79E7AA6D35 E67B788746EDE10FF2DC23211351E5EFFA0E6A968CD04EF104604BF4A9C5D84A 94FCE3AF78447B0E15D04DBDB66D2A7F134778DACB8486BA3B186D2B472D0B5F A047F420B96F12A548B10266BA8396EE6E6B3381AC13F2C81E08505A79B66883 F6E8C39290BE0CD053916688BA2239011246B959A4A386DEA235F8734E488179 ED4D1E247BDACF8B6E4B50D83E8F3A34BCA6BE21C0705625559F6608CBC9A99E BBCF5E91B1557FB89A7B1D29D4F5E2FAA8FE4F367BAC897F776D8F9BA5678163 5A0098630B9D807E32A0F8AB14903B5ADEB8B715019208F6D68DB1929FC59C28 708B191B8C1DDB0CAE9480B135FF4E764EBE0FDB9CF655B727F6D40760438793 06491AD2AFA36ABC345DBFD73DB6C94FEEA5628DB154931AA5BE1BC06DFABDF1 D4A3279647DC9FC67648A7B2352305B84322154693ADB0CC07AF13272208DA07 84B1EDCAA6D7B92ABE75657954776A7CF8FF138A009D05062F07DB4C25C0D1E1 E23E25A72DC3F6361A8B0F4DA8F79F72FE10B26A1C65D02EEEE26136739E4DF6 0CA9069F6778368CBE34BFF96BF44C14BA62D6AB352319B5B98C12AB011127A6 C4791F7C1E6ECF6D16219F5B68DCB93E1B81659F830F77AD75F89299FAD65AB6 EE2CD955CBE6FB762598D3D6B508E9C99DC6390888DD8FA8C59ADE0A53517685 4482C342237E8A3A5B6418FA172C27647E5E37FBB3556F93CAE4BF68D2336C4C F36A2A2CC5025EDF22C12D9BC0CE131B6C598409D163FB7E0DC86201E0E93CFD 145E9E6E169D3C576C5DCC33BB50161364DF71BD0173162D4E35A89634CEC92E A0D28D280165AD5C9E547DAB2534DF2D21DCB1C504BD44D38F756C2D70A30F13 30683764046EFD447084737E352DEFBEF546627A486A4447627BD475996CBD34 683ED5BAD0BC97E7B6DB36BB11B3811F3C26791C845DE549529F4FAD98D80EA2 FEF9AF8AA0F048A1225C8A3D6F6C929FE5FD273647D67C078AB98FAB3D7D8C66 2B022305F18C46295E7617F75959B009853A209B7DC4CDF940A82D5B2637DD08 FAD577BEC0D955D97D540B4F8B6D53B39476A5E547EBD121CF7B541C9F6BDD1D 16424E24AEB69AEFAEF35D77D403FF46E05109992F3D70A274B3658DF687C9A7 75D94F16C6D022A12CE524E8FBF47254C3F32CA2A40713E39F76D208478393DC 691957DBF18E9F4D125DF59B869F62D3785B0722A3BE7D65E4D5502830A5444F 2C89B8E1AA99BB6E4F45E3EE453B30478D8D68074C945DFA041D901A0B8F6195 5A2D0AB2314B3239DE806764902EB1914043E0B46746F60BD61768360CD9EDB2 B0FB8C700D0BF2A06DCE461AF7DB86921242E7C9DF07EBDEFBB74E98941D8A78 74EC75565431EF49B2AFC5DE196186E98468BCB89AC1F4442919113B53D66EA6 ACD4B497F76651DEA467503DACFB0D7283B00C753EDB8838FC8A01340EA78F86 27220D2CC90094CEB6ECF055B5DE1C792D18D0D653F15C9168CD32E51EEA4256 2D7F99D4A51F4A9F9A98CDF16A171689C0D74905519BB0C8190FA1579F0969A5 6EF8B0568BB47E8C862E87F9C8A76D54E9466AF96F0EC3BB262CB66E502E0F04 B4902C9326634866921CEF4B06653280965FFBB862B0A51DCCB1E036C136EEAE D0643B073C0E353FCEBEB3826742BC894B42FAF21DEB28B0255E927D4C843F03 30D4D018008CAA18EAC18916EF6AC44232987CAEA23CDD2E384F118F70BC75AD A23FBA60B9007365B3C259E9076570CF7AAFCB8C314FCC6271E2AF448B6F1999 2E3F5AABA7DBD96904904927985971B749E295D76A81C8C9F7714ED4F1476C92 41F4CF03D9955D7A0BA4184B3EF50C9BF811792D663B8E3A84595452E84F8EF2 CCC8FF69AA9B8A13ECC7D7C8088FFA525F6054BA92285FB30EBB981B2E91DDD6 23AEE84BBE57CDD3E237C57BDED2B8F8AF3E784F5D2F97186DF6DFD0D6FB00D9 C1B140937C78C8DF0250FAF2CFED444D581F1DEA9B86E44550D316E7E73FA624 3C54DDCF9F33BDF86788F1BFDE7B782D018CACFC6EC6A13868E80BC577C7F71E EBF7C4828404D1C1D7B77756F41972C7B9F91ACD2D7342B6B165C32986E23B06 CE2960E564F16B84B6F8D5DE84DFE47EE97C06FE54CDAC70BA26793431563B2D 01EB99E2CB938BD350B51E5F5A7DC210AB777573A552C4C95F75E10948FD4A72 C9D61F006B20789CFAB0F43804826942F26DFF769D3194C7D560B6BCF8911217 F850AA9B853F886202ACFBA635A73EC6D857AA2C7F443DF567C68C5260C19DB7 F6CDC799ED572221C58E80292B563400E41ADD38CB2755A3ED3EA7BF301A1090 5FF1D997BD20A5A9335C4D76F8455EA5406DE2283F529558165F7B2E19948CA7 8B27B4F8C23E7767F41736056B3856695B9436FA5A0D6E16E5FDADE37ED1A2B9 A8901DE9EB7834EE8006AB0C7B5AD5E18FFA2B73243F324E91B042E2CDC2102A 2E7721F69F2CE969C7887F2571BDB268782B8E4C036696F37C222C4836F48760 CC33998A458852C326FBEFAD2C28C225A59E2EB637F74F1B4C74DCBBBA3BC554 8CB3F012C78EB104EF25D3F462CFD386A43BA296605B3FDAC6A18A0655EC8A5B 308D62129104C6E573CF682A2C1B7F8D89649DD7A6EDCB55C0C542BD7A60146A 35E31EF8C2C6BA6D0535F8F95DEA8A862838E4BB910AD2662736192F0662D4DE B951D02B0EE2B85F55F378C35A439F34C273626D8F6A5D016DFAE266BA2A4D3D F6748814D4C019CA4B42FAA7C4D25AF397EEEFE113ADC09A6E4F98A8998D922F 1213AE3DF73494F00EEA57F3FBA59D09376CE3BF66C1F819006F66DDF2244AC0 DB165D65F5BB01892A03707848E83FD4709C7AABA44B460C90AF8E22BA6FD3CF E0B39FD8797B98C59D03D97A4B5899BB04A5C70F6306F6BE94C6BBC9AE1C183D BB86ACF47AF529AAA242EFD20194C8E66F31BE78C9768D110599EAF50D241364 BC5344EDDEE2B87BEA721354D85F715EF10E73D27205DB98DBC7FEA6FC0CEC31 61C08C0D1A06C46BD10B3817B7C3BCC3375313DAEC68A99DA065C666036051D9 C4E3CF644AB425F3376D614BA4C7757D3968E5922B068B885D884F674021EF40 8342D8768504DF160055948AE3CD2A49C53D2741AEA91523A811DFA269BFDC31 21B6D807F5EF7D6EFC57B27F439B4A7EDB6E5DC10A59CACCD4E9E4F1D8FC780D AA18013A6729C3D83B3CA193B0826BFF776A75FC54F04706D16E9FFFB3A5C768 7CC2E16072BB39C2C0D69924443F35FDDA907CE9046D43AB2A7848949423DBC4 A815AFE265E0F3CCD54A1D2D5883E9E67A389FF42AD06D790C6F41BE251E7D38 70853D89A7B8A521A42DD8E95A9FCB9D8A38B8A7EA1AD4F6CDF006C2058A8F79 B7D61530F2F5E37CB943A79E55CF3BD17F1A0D97467BE43BE1BE77490FEFA5BB 6DEB417BF65B3F3B2E655F8F25C89E6507EAECC07EBB5FA6FA68F826C4430C92 680238558F7A1B59B414D88B5A146CADB817058C257CACBA38996D913D542E5E 6C00E13A4A306CEC83C1854F5B7520F1E841A5E8F35D0483C5F7CA095EEA1A79 20FD0FDCA98B05005C22CC5CC30F182DE87A88EE77CB4A23B853495F1D624616 3BD72C9C529481408EE85DB3B158A1C8DAE426DBD82B54BFD5217B39B689D25D CBC56EE3C9D5BEA9968592F4BC1FAE5D2D9DBF9BF770C650EEC84C1A4F4E24DC A2FC06A0C9C9A44A9DDA98DBF6B86F73B00F56B293152C94F6EA196A063BA997 524DC2D5C51DCFE82839DAA63257FE32E6CDDF3807BD2E0304062D1CAEB49458 20D72888FD9FF8C09775AC7CA443995BEB9A07503365AD53D83C9961C02C79CC 956F487E63CB0F8CCE8BFD3A18530C31A56436FF9E70A76387A1310CC2A5EAB9 5C5FE121D9D5F7F0EDE1F75B2784EE423C32DE81AD6EFCFF327B47B95D1D06F4 AA0FCEA5EE9F23C9E436907D9D7E6071083FBEE1F8DB6AD960E75B165F0E7D55 9933FD85CE79CD107A1A0F3B613037CEC3275B25C89537BB8CFD130EAC45BE8F DA281F7EDEB7BB50882291D0170DC0A885818D34F7F0ED29D77A80A9741DDF4B 45B77903651F4EF3DF244679AD86388AA68B667C6CBAB3B1E20F0A2ADCA3B3AA 20850FE1BDF35BEA06BDA102DB5353F5D9A19FD956756951E917E6EC155180F5 F53F032F0D2DC6E8E2DDECD0C165476D5BE2B7577DB8E045D4D121FBB83C5A51 E3F64E57062399EC1972208835176F3154E8D92DAE08EA88F16C0891866D2093 4D020CBC36E1DAB6AF91CEFF7374EF62516AEAD29DDD03EFBD29EA2BE29F993B F31C57BEC3E51F6D68880BC61B41493DC6E211072DD3E132FBA93A698D0FB455 2476A9A0627E8E95A2A25A367A41DAC015574609F78C1CB95D20F8B46B376E33 07B9FA7802F174B846E9D747D9035327A0BACA7785099DE6DDEF22840B5403A3 FD8ECB1326065CA9B2EA7FB75259988C67DCCB845033122E51E9D3B8369813FA 6DA27A8E557129095A3FDAA86E844F626618D0C837A76CF681668564813361AB D2E2706E27E5F4DA89ABF0862649C236706C3C68D4EADB9AC2DCFBA23B13BB95 7FA1D705AE86D96D4666DFD0CF122FDA85D9D0B69BE0983F595E434E2AE6886F FD7B8B69C24D00BF0E9F2DC3147EA2FDA4ED3BFFA7CB9E3E884CEAB3E75519BA C8E37AD167733EDE9524B3E650A6A674025EEE9FB8A4BA33AE9E045004D985C3 334FE0D9C506B3F5EFAC679959DEE0ECE66B5C7656F1FCE79B4713923C07007F DCC189C885FA74152140AFAD8DB30E1833EC865226D06C44324EC611FF2C7F3D 44A86EA94FF7E5650EA0B563E83C4244BC76B5B0AA8C6E873550A970DC9B47E7 A3A3067BCBA0D08C98BE2739E99426598541A1028C24E18E7771D7B18D420830 47D36E0DA51E2157A9796A67A3177B3E7D9E2C25CE1863FEF57DA51CFB086388 162BB3AF0142510DC00FED403047BDE8A2EFBEDFCA8FF85538E104E25C4C6048 B9184451A861110140AA45DDF89ED98EC1AF204333450BF3BF0D527BE2C74284 0CE7C7A83DD51A68B09F804A777913AAA9D0196DCA5B2FD72824B83A344E84B6 03738B27E0B350ABE938B4872C267AC3F624C431227E3DD02C8BE9523DAB9381 EDE2BA731B0B7A3956A623B05781DE4F8CB815D9EEB41920EA3236742E741514 8211EBBF3DC161BE610E7AB2539B828AEDFA21909A4D5388C00ECA40954E67EC 6A50BC7EB73B29FC2A1358B6EA3161D97CACFCF33C3F378BB34E5CCB843CAF0E 7EE9D2930D002CC1167E8585477215123FBE652FDE3F54E361E4A4E7FBD0B8A1 30E6DEE453ED16C29663BBB616AB2E226E00BE0B939F568100B47A7A9EE8F246 E9D7EF0EA720D876F5D5A2FDA8A61ADE119E0707075925E445C633CB298B227F 169D71EA4B7695C40D1A4EC67E49484CF8A832D74E487596A6E1B0176A66D920 949430E3D3D51D3CBB7EAEDD4B71854D090C4528228D530DCE2265ED88D02764 0C6999E09353E184FB449C095BD9FE5212E25CA63700ABE1B8600066BB849C5C 76F5F2519DBAE362EFDB471FB36C10803FBCB1A5BE29953CBE4D856AB6298F42 7C6345EF2020AB74B2907D6A95B63E2494C702836AEDD492960C9B1B45657246 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 cleartomark {restore}if %%EndFont TeXDict begin 40258431 52099146 1000 600 600 (usermanual.dvi) @start /Fa 138[39 5[39 2[39 4[39 3[39 39 35[39 1[39 16[39 43[{}9 74.7198 /CMTT9 rf /Fb 197[21 58[{}1 74.7198 /CMMI9 rf /Fc 133[34 41 41 55 41 43 30 30 30 41 43 38 43 64 21 41 1[21 43 38 23 34 43 34 43 38 21 12[43 6[48 4[60 3[55 1[58 1[36 1[60 3[38 38 38 38 38 38 38 38 38 38 38 21 26 2[38 29[43 45 11[{}49 74.7198 /CMR9 rf /Fd 134[41 3[43 30 1[30 1[43 38 43 64 21 2[21 1[38 1[34 1[34 15[43 6[48 8[55 67[{}16 74.7198 /CMSL9 rf /Fe 206[33 49[{}1 58.1154 /CMR7 rf /Ff 168[85 2[60 12[65 3[60 1[62 65[{}5 83.022 /CMR10 rf /Fg 133[37 44 42 2[49 30 37 38 1[46 46 51 74 23 2[28 46 42 28 42 46 42 1[46 97[{}20 90.9091 /CMTI10 rf /Fh 133[55 65 65 89 65 68 48 48 50 65 68 61 68 102 34 65 1[34 68 61 37 56 68 55 68 60 34 45[61 61 61 1[34 33[68 72 11[{}32 109.091 /CMBX12 rf /Fi 135[48 48 48 48 48 48 48 1[48 48 48 48 48 2[48 48 48 48 48 48 48 48 48 55[48 48 40[{}23 90.9091 /CMSLTT10 rf /Fj 134[48 48 66 48 51 35 36 39 1[51 45 51 76 25 48 1[25 51 45 28 42 51 40 51 44 50[25 46[{}24 90.9091 /CMB10 rf /Fk 129[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 2[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 48 1[48 1[48 48 48 33[{}89 90.9091 /CMTT10 rf /Fl 133[40 48 48 66 48 51 35 36 36 48 51 45 51 76 25 48 1[25 51 45 28 40 51 40 51 45 7[68 1[93 68 68 66 51 67 1[62 71 68 83 57 2[33 68 1[59 62 69 66 64 68 6[25 6[45 45 45 2[25 30 25 31[51 53 11[{}54 90.9091 /CMSL10 rf /Fm 242[91 13[{}1 90.9091 /CMSY10 rf /Fn 197[25 58[{}1 90.9091 /CMMI10 rf /Fo 193[91 1[91 1[33 58[{}3 119.552 /CMMI12 rf /Fp 133[72 3[85 90 63 64 66 1[90 81 90 134 45 85 1[45 90 81 49 74 90 72 90 78 8[122 167 122 1[112 90 2[110 121 126 153 97 2[60 1[127 1[106 124 117 1[122 7[81 81 81 81 81 81 81 81 81 81 48[{}47 143.462 /CMBX12 rf /Fq 133[43 3[51 54 38 38 38 1[54 49 54 81 27 51 1[27 54 49 1[43 54 43 54 49 8[73 100 73 2[54 2[66 76 73 89 61 2[35 1[77 1[66 75 70 1[73 7[49 49 49 49 49 49 49 49 49 49 48[{}45 99.6264 /CMR12 rf /Fr 132[67 60 71 71 97 71 75 52 53 55 1[75 67 75 112 37 71 1[37 75 67 1[61 75 60 75 65 37 6[102 102 139 102 103 94 75 100 101 92 101 105 128 81 105 1[50 105 106 85 88 103 97 96 102 3[105 3[67 67 67 67 67 67 67 67 67 67 67 37 45 1[105 67 29[75 12[{}66 119.552 /CMBX12 rf /Fs 131[91 45 40 48 48 66 48 51 35 36 36 48 51 45 51 76 25 48 28 25 51 45 28 40 51 40 51 45 25 2[25 1[25 1[68 68 93 68 68 66 51 67 71 62 71 68 83 57 71 1[33 68 71 59 62 69 66 64 68 1[43 3[25 25 45 45 45 45 45 45 45 45 45 45 45 25 30 25 1[45 35 35 25 1[76 3[25 18[76 51 51 53 11[{}82 90.9091 /CMR10 rf /Ft 166[146 6[144 2[145 2[116 152 3[152 1[127 2[138 11[97 4[97 2[54 46[{}11 172.154 /CMBX12 rf end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%BeginPaperSize: Letter /setpagedevice where { pop << /PageSize [612 792] >> setpagedevice } { /letter where { pop letter } if } ifelse %%EndPaperSize end %%EndSetup %%Page: 1 1 TeXDict begin 1 0 bop 150 1317 a Ft(BERKELEY)65 b(LOGO)h(6.1)p 150 1383 3600 34 v 2648 1480 a Fs(Berk)m(eley)32 b(Logo)g(User)e(Man)m (ual)150 5068 y Fr(Brian)45 b(Harv)l(ey)p 150 5141 3600 17 v eop end %%Page: -1 2 TeXDict begin -1 1 bop 3723 -116 a Fq(i)150 299 y Fp(Short)53 b(Con)l(ten)l(ts)150 548 y Fq(1)146 b(In)m(tro)s(duction)13 b Fo(:)20 b(:)g(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)26 b Fq(1)150 697 y(2)146 b(Data)32 b(Structure)h(Primitiv)m(es)13 b Fo(:)22 b(:)d(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)26 b Fq(9)150 847 y(3)146 b(Comm)m(unication)23 b Fo(:)e(:)f(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)36 b Fq(19)150 996 y(4)146 b(Arithmetic)24 b Fo(:)d(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)37 b Fq(29)150 1146 y(5)146 b(Logical)32 b(Op)s(erations)37 b Fo(:)19 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) h(:)48 b Fq(35)150 1295 y(6)146 b(Graphics)13 b Fo(:)20 b(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)25 b Fq(37)150 1445 y(7)146 b(W)-8 b(orkspace)34 b(Managemen)m(t)25 b Fo(:)c(:)e(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)h(:)37 b Fq(49)150 1594 y(8)146 b(Con)m(trol)33 b(Structures)16 b Fo(:)21 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fq(67)150 1743 y(9)146 b(Macros)24 b Fo(:)c(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)36 b Fq(83)150 1893 y(10)97 b(Error)33 b(Pro)s(cessing)f Fo(:)20 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)44 b Fq(87)150 2042 y(11)97 b(Sp)s(ecial)33 b(V)-8 b(ariables)25 b Fo(:)20 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)37 b Fq(89)150 2192 y(12)97 b(In)m(ternationalization)19 b Fo(:)i(:)e(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)32 b Fq(93)150 2341 y(INDEX)j Fo(:)19 b(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 47 b Fq(97)p eop end %%Page: -2 3 TeXDict begin -2 2 bop eop end %%Page: -3 4 TeXDict begin -3 3 bop 3674 -116 a Fs(iii)150 299 y Fp(T)-13 b(able)53 b(of)h(Con)l(ten)l(ts)150 649 y Fr(1)135 b(In)l(tro)t (duction)31 b Fo(:)19 b(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)44 b Fr(1)275 786 y Fs(1.1)92 b(Ov)m(erview)16 b Fn(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)29 b Fs(1)275 896 y(1.2)92 b(Getter/Setter)32 b(V)-8 b(ariable)32 b(Syn)m(tax)23 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 36 b Fs(2)275 1005 y(1.3)92 b(En)m(tering)30 b(and)g(Lea)m(ving)i(Logo) 25 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)38 b Fs(5)275 1115 y(1.4)92 b(T)-8 b(ok)m(enization)8 b Fn(:)18 b(:)d(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)22 b Fs(6)150 1366 y Fr(2)135 b(Data)46 b(Structure)e(Primitiv)l(es) 24 b Fo(:)e(:)d(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)37 b Fr(9)275 1503 y Fs(2.1)92 b(Constructors)26 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)40 b Fs(9)399 1612 y(w)m(ord)24 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)38 b Fs(9)399 1722 y(list)20 b Fn(:)d(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)34 b Fs(9)399 1831 y(sen)m(tence)17 b Fn(:)f(:)g(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)30 b Fs(9)399 1941 y(fput)19 b Fn(:)c(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)33 b Fs(9)399 2051 y(lput)21 b Fn(:)15 b(:)g(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) 34 b Fs(9)399 2160 y(arra)m(y)18 b Fn(:)e(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 31 b Fs(9)399 2270 y(mdarra)m(y)13 b Fn(:)i(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(10)399 2379 y(listtoarra)m(y)15 b Fn(:)j(:)d(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)28 b Fs(10)399 2489 y(arra)m(ytolist)15 b Fn(:)j(:)d(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)28 b Fs(10)399 2599 y(com)m(bine)17 b Fn(:)f(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)30 b Fs(10)399 2708 y(rev)m(erse)23 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)36 b Fs(10)399 2818 y(gensym)12 b Fn(:)j(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)24 b Fs(10)275 2927 y(2.2)92 b(Data)32 b(Selectors)12 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)25 b Fs(10)399 3037 y(\014rst)20 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) 33 b Fs(10)399 3147 y(\014rsts)22 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) 35 b Fs(11)399 3256 y(last)29 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) 41 b Fs(11)399 3366 y(but\014rst)13 b Fn(:)h(:)h(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)26 b Fs(11)399 3475 y(but\014rsts)15 b Fn(:)f(:)h(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)28 b Fs(11)399 3585 y(butlast)20 b Fn(:)c(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(12)399 3694 y(item)10 b Fn(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)23 b Fs(12)399 3804 y(mditem)28 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)41 b Fs(12)399 3914 y(pic)m(k)18 b Fn(:)e(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)31 b Fs(12)399 4023 y(remo)m(v)m(e)19 b Fn(:)e(:)f(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)32 b Fs(12)399 4133 y(remdup)26 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Fs(12)399 4242 y(quoted)25 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b Fs(12)275 4352 y(2.3)92 b(Data)32 b(Mutators)24 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)37 b Fs(12)399 4462 y(setitem)15 b Fn(:)i(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(12)399 4571 y(mdsetitem)13 b Fn(:)j(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(13)399 4681 y(.set\014rst)12 b Fn(:)k(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)25 b Fs(13)399 4790 y(.setbf)12 b Fn(:)j(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)24 b Fs(13)399 4900 y(.setitem)f Fn(:)17 b(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)36 b Fs(13)399 5010 y(push)24 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(13)399 5119 y(p)s(op)23 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b Fs(13)399 5229 y(queue)24 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b Fs(14)399 5338 y(dequeue)19 b Fn(:)d(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)32 b Fs(14)p eop end %%Page: -4 5 TeXDict begin -4 4 bop 150 -116 a Fs(iv)2568 b(BERKELEY)30 b(LOGO)g(6.1)275 83 y(2.4)92 b(Predicates)14 b Fn(:)i(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)27 b Fs(14)399 193 y(w)m(ordp)17 b Fn(:)d(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)30 b Fs(14)399 302 y(listp)13 b Fn(:)i(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(14)399 412 y(arra)m(yp)10 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 b Fs(14)399 521 y(empt)m(yp)10 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)23 b Fs(14)399 631 y(equalp)9 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fs(14)399 741 y(notequalp)j Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b Fs(15)399 850 y(b)s(eforep)13 b Fn(:)i(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(15)399 960 y(.eq)c Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)35 b Fs(15)399 1069 y(mem)m(b)s(erp)15 b Fn(:)g(:)g(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)28 b Fs(15)399 1179 y(substringp)12 b Fn(:)i(:)i(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)25 b Fs(16)399 1289 y(n)m(um)m(b)s(erp)e Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)37 b Fs(16)399 1398 y(vbarredp)22 b Fn(:)14 b(:)h(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(16)275 1508 y(2.5)92 b(Queries)9 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fs(16)399 1617 y(coun)m(t)9 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fs(16)399 1727 y(ascii)13 b Fn(:)j(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(16)399 1836 y(ra)m(w)m(ascii)d Fn(:)17 b(:)f(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)36 b Fs(16)399 1946 y(c)m(har)14 b Fn(:)i(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)27 b Fs(17)399 2056 y(mem)m(b)s(er)20 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(17)399 2165 y(lo)m(w)m(ercase)15 b Fn(:)j(:)d(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(17)399 2275 y(upp)s(ercase)23 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)37 b Fs(17)399 2384 y(standout)25 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(17)399 2494 y(parse)15 b Fn(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(18)399 2604 y(runparse)e Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)41 b Fs(18)150 2854 y Fr(3)135 b(Comm)l(unication)35 b Fo(:)20 b(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)47 b Fr(19)275 2991 y Fs(3.1)92 b(T)-8 b(ransmitters)25 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Fs(19)399 3101 y(prin)m(t)22 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(19)399 3210 y(t)m(yp)s(e)12 b Fn(:)j(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)25 b Fs(19)399 3320 y(sho)m(w)d Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(20)275 3430 y(3.2)92 b(Receiv)m(ers)14 b Fn(:)i(:)g(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)27 b Fs(20)399 3539 y(readlist)13 b Fn(:)j(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)26 b Fs(20)399 3649 y(readw)m(ord)17 b Fn(:)e(:)g(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)30 b Fs(20)399 3758 y(readra)m(wline)12 b Fn(:)k(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)24 b Fs(20)399 3868 y(readc)m(har)9 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)22 b Fs(21)399 3978 y(readc)m(hars)11 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)24 b Fs(21)399 4087 y(shell)10 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 b Fs(21)275 4197 y(3.3)92 b(File)31 b(Access)19 b Fn(:)d(:)g(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)32 b Fs(22)399 4306 y(setpre\014x)11 b Fn(:)k(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)24 b Fs(22)399 4416 y(pre\014x)i Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(22)399 4526 y(op)s(enread)19 b Fn(:)c(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)32 b Fs(22)399 4635 y(op)s(en)m(write)26 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(22)399 4745 y(op)s(enapp)s(end)21 b Fn(:)13 b(:)i(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)34 b Fs(23)399 4854 y(op)s(en)m(up)s(date)9 b Fn(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fs(23)399 4964 y(close)27 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(23)399 5073 y(allop)s(en)17 b Fn(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)30 b Fs(23)399 5183 y(closeall)18 b Fn(:)g(:)d(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)31 b Fs(23)399 5293 y(erase\014le)23 b Fn(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)36 b Fs(23)p eop end %%Page: -5 6 TeXDict begin -5 5 bop 3702 -116 a Fs(v)399 83 y(dribble)20 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(24)399 193 y(no)s(dribble)12 b Fn(:)i(:)h(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)25 b Fs(24)399 302 y(setread)18 b Fn(:)e(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)31 b Fs(24)399 412 y(set)m(write)25 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)37 b Fs(24)399 521 y(reader)15 b Fn(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(25)399 631 y(writer)20 b Fn(:)c(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(25)399 741 y(setreadp)s(os)11 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)24 b Fs(25)399 850 y(set)m(writep)s(os)17 b Fn(:)g(:)e(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)30 b Fs(25)399 960 y(readp)s(os)c Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)39 b Fs(25)399 1069 y(writep)s(os)11 b Fn(:)k(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)24 b Fs(25)399 1179 y(eofp)17 b Fn(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)30 b Fs(25)399 1289 y(\014lep)16 b Fn(:)f(:)g(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(26)275 1398 y(3.4)92 b(T)-8 b(erminal)30 b(Access)17 b Fn(:)f(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)30 b Fs(26)399 1508 y(k)m(eyp)d Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(26)399 1617 y(cleartext)29 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(26)399 1727 y(setcursor)22 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)35 b Fs(26)399 1836 y(cursor)18 b Fn(:)c(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)31 b Fs(26)399 1946 y(setmargins)d Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)40 b Fs(26)399 2056 y(settextcolor)9 b Fn(:)18 b(:)e(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)22 b Fs(27)399 2165 y(increasefon)m(t)27 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Fs(27)399 2275 y(settextsize)14 b Fn(:)k(:)d(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)27 b Fs(27)399 2384 y(textsize)9 b Fn(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)22 b Fs(27)399 2494 y(setfon)m(t)27 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(28)399 2604 y(fon)m(t)21 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)34 b Fs(28)150 2854 y Fr(4)135 b(Arithmetic)19 b Fo(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)32 b Fr(29)275 2991 y Fs(4.1)92 b(Numeric)30 b(Op)s(erations)19 b Fn(:)c(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)32 b Fs(29)399 3101 y(sum)18 b Fn(:)c(:)i(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)31 b Fs(29)399 3210 y(di\013erence)12 b Fn(:)k(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)25 b Fs(29)399 3320 y(min)m(us)d Fn(:)14 b(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(29)399 3430 y(pro)s(duct)23 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)37 b Fs(29)399 3539 y(quotien)m(t)16 b Fn(:)g(:)g(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(29)399 3649 y(remainder)20 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(30)399 3758 y(mo)s(dulo)12 b Fn(:)j(:)g(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)25 b Fs(30)399 3868 y(in)m(t)g Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b Fs(30)399 3978 y(round)23 b Fn(:)14 b(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)36 b Fs(30)399 4087 y(sqrt)21 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)34 b Fs(30)399 4197 y(p)s(o)m(w)m(er)22 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(30)399 4306 y(exp)9 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fs(30)399 4416 y(log10)16 b Fn(:)h(:)e(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(30)399 4526 y(ln)21 b Fn(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)34 b Fs(30)399 4635 y(sin)23 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)36 b Fs(31)399 4745 y(radsin)18 b Fn(:)c(:)i(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)31 b Fs(31)399 4854 y(cos)18 b Fn(:)e(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)31 b Fs(31)399 4964 y(radcos)13 b Fn(:)i(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)26 b Fs(31)399 5073 y(arctan)13 b Fn(:)j(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(31)399 5183 y(radarctan)i Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fs(31)399 5293 y(iseq)25 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)37 b Fs(31)p eop end %%Page: -6 7 TeXDict begin -6 6 bop 150 -116 a Fs(vi)2568 b(BERKELEY)30 b(LOGO)g(6.1)399 83 y(rseq)19 b Fn(:)c(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)32 b Fs(31)275 193 y(4.2)92 b(Numeric)30 b(Predicates)12 b Fn(:)17 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)25 b Fs(32)399 302 y(lessp)g Fn(:)15 b(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)38 b Fs(32)399 412 y(greaterp)15 b Fn(:)i(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(32)399 521 y(lessequalp)21 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)34 b Fs(32)399 631 y(greaterequalp)12 b Fn(:)k(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)24 b Fs(32)275 741 y(4.3)92 b(Random)30 b(Num)m(b)s(ers)20 b Fn(:)14 b(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)33 b Fs(32)399 850 y(random)27 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Fs(32)399 960 y(rerandom)10 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 b Fs(33)275 1069 y(4.4)92 b(Prin)m(t)30 b(F)-8 b(ormatting)19 b Fn(:)f(:)d(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)32 b Fs(33)399 1179 y(form)26 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(33)275 1289 y(4.5)92 b(Bit)m(wise)32 b(Op)s(erations)22 b Fn(:)15 b(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)35 b Fs(33)399 1398 y(bitand)10 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)23 b Fs(33)399 1508 y(bitor)g Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)36 b Fs(33)399 1617 y(bitxor)19 b Fn(:)d(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)32 b Fs(33)399 1727 y(bitnot)18 b Fn(:)e(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)31 b Fs(34)399 1836 y(ashift)9 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)22 b Fs(34)399 1946 y(lshift)d Fn(:)d(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)32 b Fs(34)150 2197 y Fr(5)135 b(Logical)46 b(Op)t(erations)24 b Fo(:)c(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)37 b Fr(35)275 2334 y Fs(and)26 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)40 b Fs(35)399 2443 y(or)18 b Fn(:)d(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)31 b Fs(35)399 2553 y(not)13 b Fn(:)j(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)26 b Fs(35)150 2804 y Fr(6)135 b(Graphics)26 b Fo(:)19 b(:)g(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)39 b Fr(37)275 2941 y Fs(6.1)92 b(T)-8 b(urtle)30 b(Motion)20 b Fn(:)c(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)33 b Fs(37)399 3050 y(forw)m(ard)28 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)41 b Fs(37)399 3160 y(bac)m(k)29 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)41 b Fs(37)399 3269 y(left)14 b Fn(:)j(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)27 b Fs(38)399 3379 y(righ)m(t)e Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)37 b Fs(38)399 3489 y(setp)s(os)16 b Fn(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)29 b Fs(38)399 3598 y(setxy)15 b Fn(:)h(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(38)399 3708 y(setx)19 b Fn(:)d(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)32 b Fs(38)399 3817 y(set)m(y)20 b Fn(:)d(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(38)399 3927 y(setheading)10 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 b Fs(38)399 4037 y(home)13 b Fn(:)j(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Fs(38)399 4146 y(arc)18 b Fn(:)e(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)31 b Fs(39)275 4256 y(6.2)92 b(T)-8 b(urtle)30 b(Motion)i(Queries)17 b Fn(:)e(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)30 b Fs(39)399 4365 y(p)s(os)12 b Fn(:)i(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)24 b Fs(39)399 4475 y(xcor)14 b Fn(:)i(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)27 b Fs(39)399 4584 y(ycor)14 b Fn(:)i(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)27 b Fs(39)399 4694 y(heading)f Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)39 b Fs(39)399 4804 y(to)m(w)m(ards)26 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Fs(39)399 4913 y(scrunc)m(h)9 b Fn(:)15 b(:)g(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)22 b Fs(39)275 5023 y(6.3)92 b(T)-8 b(urtle)30 b(and)g(Windo)m(w)g(Con)m (trol)e Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)40 b Fs(39)399 5132 y(sho)m(wturtle)11 b Fn(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)24 b Fs(39)399 5242 y(hideturtle)i Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)38 b Fs(40)p eop end %%Page: -7 8 TeXDict begin -7 7 bop 3652 -116 a Fs(vii)399 83 y(clean)18 b Fn(:)f(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)31 b Fs(40)399 193 y(clearscreen)c Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)38 b Fs(40)399 302 y(wrap)20 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)33 b Fs(40)399 412 y(windo)m(w)9 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fs(40)399 521 y(fence)d Fn(:)d(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)32 b Fs(40)399 631 y(\014ll)c Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)41 b Fs(41)399 741 y(\014lled)23 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)36 b Fs(41)399 850 y(lab)s(el)25 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b Fs(41)399 960 y(setlab)s(elheigh)m(t)30 b Fn(:)15 b(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fs(41)399 1069 y(textscreen)19 b Fn(:)e(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)32 b Fs(41)399 1179 y(fullscreen)14 b Fn(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)27 b Fs(41)399 1289 y(splitscreen)12 b Fn(:)k(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)25 b Fs(42)399 1398 y(setscrunc)m(h)14 b Fn(:)h(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)27 b Fs(42)399 1508 y(refresh)f Fn(:)15 b(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)39 b Fs(42)399 1617 y(norefresh)19 b Fn(:)14 b(:)i(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)32 b Fs(42)275 1727 y(6.4)92 b(T)-8 b(urtle)30 b(and)g(Windo)m(w)g (Queries)e Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)41 b Fs(42)399 1836 y(sho)m(wnp)12 b Fn(:)i(:)h(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)24 b Fs(43)399 1946 y(screenmo)s(de)11 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)24 b Fs(43)399 2056 y(turtlemo)s(de)e Fn(:)15 b(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(43)399 2165 y(lab)s(elsize)14 b Fn(:)j(:)e(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)27 b Fs(43)275 2275 y(6.5)92 b(P)m(en)30 b(and)g(Bac)m(kground)h(Con)m (trol)22 b Fn(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)35 b Fs(43)399 2384 y(p)s(endo)m(wn)23 b Fn(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)36 b Fs(43)399 2494 y(p)s(en)m(up)18 b Fn(:)c(:)h(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)31 b Fs(43)399 2604 y(p)s(enpain)m(t)25 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)39 b Fs(44)399 2713 y(p)s(enerase)9 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)22 b Fs(44)399 2823 y(p)s(enrev)m(erse)11 b Fn(:)k(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)24 b Fs(44)399 2932 y(setp)s(encolor)16 b Fn(:)h(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)29 b Fs(44)399 3042 y(setpalette)h Fn(:)16 b(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fs(44)399 3152 y(setp)s(ensize)21 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)34 b Fs(44)399 3261 y(setp)s(enpattern)26 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)39 b Fs(45)399 3371 y(setp)s(en)12 b Fn(:)j(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)24 b Fs(45)399 3480 y(setbac)m(kground)15 b Fn(:)h(:)g(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(45)275 3590 y(6.6)92 b(P)m(en)30 b(Queries)20 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)33 b Fs(45)399 3699 y(p)s(endo)m(wnp)18 b Fn(:)c(:)h(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)31 b Fs(45)399 3809 y(p)s(enmo)s(de)21 b Fn(:)14 b(:)h(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)34 b Fs(45)399 3919 y(p)s(encolor)12 b Fn(:)j(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)25 b Fs(45)399 4028 y(palette)e Fn(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)36 b Fs(46)399 4138 y(p)s(ensize)17 b Fn(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)30 b Fs(46)399 4247 y(p)s(en)c Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(46)399 4357 y(bac)m(kground)10 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)23 b Fs(46)275 4467 y(6.7)92 b(Sa)m(ving)31 b(and)e(Loading)i(Pictures)11 b Fn(:)k(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)23 b Fs(46)399 4576 y(sa)m(v)m(epict)f Fn(:)17 b(:)f(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(46)399 4686 y(loadpict)21 b Fn(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)34 b Fs(46)399 4795 y(epspict)20 b Fn(:)c(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(47)275 4905 y(6.8)92 b(Mouse)30 b(Queries)e Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Fs(47)399 5015 y(mousep)s(os)9 b Fn(:)15 b(:)g(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)22 b Fs(47)399 5124 y(clic)m(kp)s(os)j Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)37 b Fs(47)399 5234 y(buttonp)21 b Fn(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)34 b Fs(47)p eop end %%Page: -8 9 TeXDict begin -8 8 bop 150 -116 a Fs(viii)2518 b(BERKELEY)30 b(LOGO)g(6.1)399 83 y(button)25 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)39 b Fs(47)150 334 y Fr(7)135 b(W)-11 b(orkspace)45 b(Managemen)l(t)15 b Fo(:)21 b(:)e(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fr(49)275 471 y Fs(7.1)92 b(Pro)s(cedure)29 b(De\014nition)8 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)21 b Fs(49)399 580 y(to)d Fn(:)e(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) 31 b Fs(49)399 690 y(de\014ne)23 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)36 b Fs(50)399 800 y(text)19 b Fn(:)e(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)32 b Fs(51)399 909 y(fulltext)16 b Fn(:)g(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(51)399 1019 y(cop)m(ydef)9 b Fn(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fs(51)275 1128 y(7.2)92 b(V)-8 b(ariable)31 b(De\014nition)26 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Fs(51)399 1238 y(mak)m(e)16 b Fn(:)g(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(51)399 1347 y(name)13 b Fn(:)j(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Fs(51)399 1457 y(lo)s(cal)i Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(52)399 1567 y(lo)s(calmak)m(e)27 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b Fs(52)399 1676 y(thing)16 b Fn(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(52)399 1786 y(global)21 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)34 b Fs(52)275 1895 y(7.3)92 b(Prop)s(ert)m(y)30 b(Lists)14 b Fn(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)27 b Fs(53)399 2005 y(pprop)c Fn(:)14 b(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)36 b Fs(53)399 2115 y(gprop)25 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(53)399 2224 y(remprop)13 b Fn(:)h(:)h(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(53)399 2334 y(plist)13 b Fn(:)i(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(53)275 2443 y(7.4)92 b(W)-8 b(orkspace)31 b(Predicates)e Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)40 b Fs(53)399 2553 y(pro)s(cedurep)19 b Fn(:)14 b(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)32 b Fs(53)399 2663 y(primitiv)m(ep)15 b Fn(:)h(:)g(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)28 b Fs(53)399 2772 y(de\014nedp)13 b Fn(:)h(:)h(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Fs(54)399 2882 y(namep)i Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)41 b Fs(54)399 2991 y(plistp)28 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fs(54)275 3101 y(7.5)92 b(W)-8 b(orkspace)31 b(Queries)23 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)36 b Fs(54)399 3210 y(con)m(ten)m(ts)15 b Fn(:)j(:)d(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(54)399 3320 y(buried)13 b Fn(:)h(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(54)399 3430 y(traced)15 b Fn(:)i(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)28 b Fs(54)399 3539 y(stepp)s(ed)e Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)40 b Fs(54)399 3649 y(pro)s(cedures)25 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)39 b Fs(55)399 3758 y(primitiv)m(es)23 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)36 b Fs(55)399 3868 y(names)15 b Fn(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(55)399 3978 y(plists)15 b Fn(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)28 b Fs(55)399 4087 y(namelist)13 b Fn(:)j(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(55)399 4197 y(pllist)20 b Fn(:)c(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(55)399 4306 y(arit)m(y)27 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(55)399 4416 y(no)s(des)26 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)40 b Fs(56)275 4526 y(7.6)92 b(W)-8 b(orkspace)31 b(Insp)s(ection)d Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)41 b Fs(56)399 4635 y(p)s(o)9 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fs(56)399 4745 y(p)s(oall)g Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)35 b Fs(56)399 4854 y(p)s(ops)26 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)40 b Fs(56)399 4964 y(p)s(ons)26 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)40 b Fs(56)399 5073 y(p)s(opls)14 b Fn(:)h(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)27 b Fs(57)399 5183 y(p)s(on)c Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b Fs(57)399 5293 y(p)s(opl)12 b Fn(:)i(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)25 b Fs(57)p eop end %%Page: -9 10 TeXDict begin -9 9 bop 3677 -116 a Fs(ix)399 83 y(p)s(ot)12 b Fn(:)j(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)25 b Fs(57)399 193 y(p)s(ots)14 b Fn(:)h(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)27 b Fs(57)275 302 y(7.7)92 b(W)-8 b(orkspace)31 b(Con)m(trol)22 b Fn(:)16 b(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)35 b Fs(57)399 412 y(erase)20 b Fn(:)c(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)33 b Fs(57)399 521 y(erall)13 b Fn(:)j(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(58)399 631 y(erps)18 b Fn(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)31 b Fs(58)399 741 y(erns)18 b Fn(:)d(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)31 b Fs(58)399 850 y(erpls)25 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)38 b Fs(58)399 960 y(ern)15 b Fn(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)28 b Fs(58)399 1069 y(erpl)23 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)36 b Fs(58)399 1179 y(bury)25 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(59)399 1289 y(bury)m(all)20 b Fn(:)c(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(59)399 1398 y(buryname)22 b Fn(:)14 b(:)h(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(59)399 1508 y(un)m(bury)18 b Fn(:)13 b(:)j(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)31 b Fs(59)399 1617 y(un)m(bury)m(all)12 b Fn(:)j(:)g(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)25 b Fs(59)399 1727 y(un)m(buryname)13 b Fn(:)h(:)h(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(59)399 1836 y(buriedp)g Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)41 b Fs(60)399 1946 y(trace)20 b Fn(:)d(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)33 b Fs(60)399 2056 y(un)m(trace)12 b Fn(:)k(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)25 b Fs(60)399 2165 y(tracedp)10 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)23 b Fs(60)399 2275 y(step)18 b Fn(:)d(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)31 b Fs(60)399 2384 y(unstep)c Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fs(60)399 2494 y(stepp)s(edp)22 b Fn(:)14 b(:)h(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(61)399 2604 y(edit)23 b Fn(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)36 b Fs(61)399 2713 y(edit\014le)26 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)39 b Fs(61)399 2823 y(edall)27 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)39 b Fs(62)399 2932 y(edps)10 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 b Fs(62)399 3042 y(edns)10 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 b Fs(62)399 3152 y(edpls)18 b Fn(:)d(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)31 b Fs(62)399 3261 y(edn)d Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)41 b Fs(62)399 3371 y(edpl)16 b Fn(:)f(:)g(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(62)399 3480 y(sa)m(v)m(e)17 b Fn(:)g(:)e(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) 30 b Fs(62)399 3590 y(sa)m(v)m(el)c Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) 37 b Fs(63)399 3699 y(load)16 b Fn(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(63)399 3809 y(cslsload)h Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)41 b Fs(63)399 3919 y(help)16 b Fn(:)f(:)g(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(63)399 4028 y(seteditor)h Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fs(64)399 4138 y(setliblo)s(c)17 b Fn(:)f(:)g(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)30 b Fs(64)399 4247 y(setcslslo)s(c)19 b Fn(:)e(:)e(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)32 b Fs(64)399 4357 y(sethelplo)s(c)25 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)37 b Fs(64)399 4467 y(settemplo)s(c)28 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)40 b Fs(64)399 4576 y(gc)16 b Fn(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(64)399 4686 y(.setsegmen)m(tsize)21 b Fn(:)e(:)c(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)34 b Fs(65)p eop end %%Page: -10 11 TeXDict begin -10 10 bop 150 -116 a Fs(x)2593 b(BERKELEY)30 b(LOGO)g(6.1)150 83 y Fr(8)135 b(Con)l(trol)46 b(Structures)25 b Fo(:)19 b(:)g(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)38 b Fr(67)275 220 y Fs(8.1)92 b(Con)m(trol)8 b Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)21 b Fs(67)399 330 y(run)10 b Fn(:)k(:)i(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)23 b Fs(67)399 439 y(runresult)d Fn(:)14 b(:)i(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)33 b Fs(67)399 549 y(rep)s(eat)14 b Fn(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)27 b Fs(67)399 658 y(forev)m(er)e Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)37 b Fs(67)399 768 y(rep)s(coun)m(t)25 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(68)399 878 y(if)12 b Fn(:)j(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)25 b Fs(68)399 987 y(ifelse)d Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)35 b Fs(68)399 1097 y(test)26 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(68)399 1206 y(iftrue)12 b Fn(:)j(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)25 b Fs(68)399 1316 y(i\013alse)j Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)40 b Fs(68)399 1425 y(stop)15 b Fn(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(69)399 1535 y(output)d Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)39 b Fs(69)399 1645 y(catc)m(h)14 b Fn(:)j(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)27 b Fs(69)399 1754 y(thro)m(w)d Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)37 b Fs(69)399 1864 y(error)23 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)36 b Fs(70)399 1973 y(pause)28 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fs(70)399 2083 y(con)m(tin)m(ue)13 b Fn(:)k(:)e(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Fs(70)399 2193 y(w)m(ait)14 b Fn(:)j(:)e(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)27 b Fs(71)399 2302 y(b)m(y)m(e)12 b Fn(:)k(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)25 b Fs(71)399 2412 y(.ma)m(yb)s(eoutput)f Fn(:)16 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)37 b Fs(71)399 2521 y(goto)13 b Fn(:)k(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Fs(71)399 2631 y(tag)16 b Fn(:)g(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(72)399 2741 y(ignore)18 b Fn(:)e(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)31 b Fs(72)399 2850 y(`)26 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)39 b Fs(72)399 2960 y(for)24 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)37 b Fs(72)399 3069 y(do.while)16 b Fn(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(73)399 3179 y(while)16 b Fn(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)28 b Fs(73)399 3289 y(do.un)m(til)g Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(73)399 3398 y(un)m(til)27 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(73)399 3508 y(case)18 b Fn(:)e(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)31 b Fs(74)399 3617 y(cond)26 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)39 b Fs(74)275 3727 y(8.2)92 b(T)-8 b(emplate-based)31 b(Iteration)22 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)35 b Fs(74)399 3836 y(apply)9 b Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)22 b Fs(76)399 3946 y(in)m(v)m(ok)m(e)14 b Fn(:)k(:)d(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)27 b Fs(76)399 4056 y(foreac)m(h)18 b Fn(:)e(:)g(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)31 b Fs(76)399 4165 y(map)13 b Fn(:)i(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Fs(77)399 4275 y(map.se)d Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)36 b Fs(77)399 4384 y(\014lter)26 b Fn(:)15 b(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)38 b Fs(78)399 4494 y(\014nd)23 b Fn(:)14 b(:)i(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)36 b Fs(78)399 4604 y(reduce)10 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)23 b Fs(78)399 4713 y(crossmap)17 b Fn(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)30 b Fs(79)399 4823 y(cascade)10 b Fn(:)17 b(:)f(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)23 b Fs(79)399 4932 y(cascade.2)15 b Fn(:)j(:)d(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(81)399 5042 y(transfer)e Fn(:)15 b(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)39 b Fs(81)p eop end %%Page: -11 12 TeXDict begin -11 11 bop 3677 -116 a Fs(xi)150 83 y Fr(9)135 b(Macros)22 b Fo(:)d(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)35 b Fr(83)275 220 y Fs(.macro)28 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)40 b Fs(83)399 330 y(.defmacro)27 b Fn(:)16 b(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)40 b Fs(85)399 439 y(macrop)13 b Fn(:)j(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(85)399 549 y(macro)s(expand)15 b Fn(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)28 b Fs(85)150 800 y Fr(10)135 b(Error)45 b(Pro)t(cessing)22 b Fo(:)e(:)g(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)35 b Fr(87)275 936 y Fs(10.1)92 b(Error)30 b(Co)s(des)15 b Fn(:)f(:)h(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)28 b Fs(87)150 1187 y Fr(11)135 b(Sp)t(ecial)45 b(V)-11 b(ariables)18 b Fo(:)i(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:) g(:)31 b Fr(89)275 1324 y Fs(allo)m(wgetset)26 b Fn(:)16 b(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)36 b Fs(89)399 1434 y(buttonact)27 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)39 b Fs(89)399 1543 y(caseignoredp)29 b Fn(:)15 b(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)41 b Fs(89)399 1653 y(commandline)18 b Fn(:)e(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)31 b Fs(89)399 1763 y(erract)23 b Fn(:)16 b(:)g(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)36 b Fs(89)399 1872 y(fullprin)m(tp)13 b Fn(:)h(:)i(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)26 b Fs(90)399 1982 y(k)m(ey)m(act)13 b Fn(:)18 b(:)d(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)26 b Fs(90)399 2091 y(loadnoisily)9 b Fn(:)17 b(:)e(:)g(:)h(:)f(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)22 b Fs(90)399 2201 y(prin)m(tdepthlimit)17 b Fn(:)e(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:) h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)30 b Fs(90)399 2311 y(prin)m(t)m (widthlimit)18 b Fn(:)e(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)31 b Fs(90)399 2420 y(redefp)17 b Fn(:)d(:)i(:)f(:)h(:)f(:)g(:)h (:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)30 b Fs(91)399 2530 y(startup)15 b Fn(:)g(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:) h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)28 b Fs(91)399 2639 y(un)m(bury)m(onedit)17 b Fn(:)d(:)i(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g (:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)30 b Fs(91)399 2749 y(usealternatenames)17 b Fn(:)g(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:) f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)30 b Fs(91)399 2858 y(logo)m(v)m(ersion)21 b Fn(:)e(:)c(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:) f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)34 b Fs(91)399 2968 y(logoplatform)9 b Fn(:)17 b(:)f(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f (:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:) g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)22 b Fs(91)150 3219 y Fr(12)135 b(In)l(ternationalization)17 b Fo(:)22 b(:)e(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f (:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)30 b Fr(93)150 3497 y(INDEX)k Fo(:)20 b(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:) f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)f(:)h (:)f(:)g(:)h(:)f(:)h(:)f(:)h(:)f(:)h(:)f(:)g(:)h(:)f(:)h(:)47 b Fr(97)p eop end %%Page: -12 13 TeXDict begin -12 12 bop eop end %%Page: 1 14 TeXDict begin 1 13 bop 3705 -116 a Fs(1)150 299 y Fp(1)80 b(In)l(tro)t(duction)150 661 y Fr(1.1)68 b(Ov)l(erview)150 820 y Fs(Cop)m(yrigh)m(t)602 817 y(c)577 820 y Fm(\015)30 b Fs(1993)i(b)m(y)f(the)f(Regen)m(ts)i(of)e(the)h(Univ)m(ersit)m(y)h (of)e(California)150 988 y(This)37 b(program)h(is)g(free)g(soft)m(w)m (are:)57 b(y)m(ou)38 b(can)g(redistribute)g(it)g(and/or)g(mo)s(dify)f (it)i(under)d(the)i(terms)150 1098 y(of)c(the)h(GNU)g(General)g(Public) f(License)g(as)h(published)d(b)m(y)i(the)h(F)-8 b(ree)35 b(Soft)m(w)m(are)g(F)-8 b(oundation,)36 b(either)150 1207 y(v)m(ersion)31 b(3)g(of)f(the)h(License,)g(or)f(\(at)i(y)m(our)e (option\))h(an)m(y)g(later)g(v)m(ersion.)150 1375 y(This)d(program)g (is)h(distributed)f(in)g(the)h(hop)s(e)f(that)h(it)g(will)g(b)s(e)f (useful,)h(but)f Fl(WITHOUT)g(ANY)h(W)-10 b(AR-)150 1484 y(RANTY)13 b Fs(;)30 b(without)h(ev)m(en)g(the)f(implied)g(w)m(arran)m (t)m(y)i(of)e Fl(MER)m(CHANT)-8 b(ABILITY)31 b(or)f(FITNESS)g(F)m(OR) 150 1594 y(A)g(P)-8 b(AR)g(TICULAR)31 b(PURPOSE)p Fs(.)39 b(See)31 b(the)g(GNU)g(General)g(Public)f(License)h(for)f(more)h (details.)150 1762 y(Y)-8 b(ou)21 b(should)e(ha)m(v)m(e)j(receiv)m(ed)g (a)f(cop)m(y)g(of)g(the)f(GNU)h(General)h(Public)e(License)h(along)g (with)g(this)f(program.)150 1871 y(If)30 b(not,)h(see)g Fk(<)p Fs(h)m(ttps://www.gn)m(u.org/licenses/)p Fk(>)p Fs(.)150 2039 y(This)g(is)g(a)h(program)f(that)h(is)g(still)g(b)s(eing) f(written.)44 b(Man)m(y)32 b(things)f(are)h(missing,)g(including)f (adequate)150 2149 y(do)s(cumen)m(tation.)41 b(This)27 b(man)m(ual)i(assumes)e(that)i(y)m(ou)f(already)h(kno)m(w)f(ho)m(w)g (to)h(program)f(in)g(Logo,)i(and)150 2258 y(merely)h(presen)m(ts)f(the) h(details)g(of)f(this)h(new)f(implemen)m(tation.)150 2426 y(Read)24 b Fl(Computer)e(Science)i(Logo)h(St)m(yle,)h(V)-8 b(olume)24 b(1:)38 b(Sym)m(b)s(olic)23 b(Computing)31 b Fs(b)m(y)23 b(Brian)g(Harv)m(ey)i(\(MIT)150 2535 y(Press,)30 b(1997\))j(for)d(a)h(tutorial)g(on)f(Logo)i(programming)e(with)g (emphasis)g(on)g(sym)m(b)s(olic)h(computation.)150 2703 y(Here)g(are)g(the)f(sp)s(ecial)h(features)g(of)f(this)h(dialect)h(of)e (Logo:)390 2980 y(Source)g(\014le)h(compatible)g(among)g(Unix,)g(DOS,)f (Windo)m(ws,)h(and)e(Mac)j(platforms.)390 3200 y(Random-access)g(arra)m (ys.)390 3419 y(V)-8 b(ariable)32 b(n)m(um)m(b)s(er)d(of)h(inputs)g(to) h(user-de\014ned)e(pro)s(cedures.)390 3638 y(Mutators)i(for)f(list)h (structure)f(\(dangerous\).)390 3857 y(P)m(ause)h(on)f(error,)g(and)g (other)h(impro)m(v)m(emen)m(ts)g(to)g(error)f(handling.)390 4076 y(Commen)m(ts)h(and)e(con)m(tin)m(uation)k(lines;)d(formatting)i (is)e(preserv)m(ed)g(when)390 4186 y(pro)s(cedure)f(de\014nitions)h (are)h(sa)m(v)m(ed)g(or)g(edited.)390 4405 y(T)-8 b(errapin-st)m(yle)31 b(tok)m(enization)i(\(e.g.,)g([2)p Fk(+)p Fs(3])e(is)g(a)f(list)h(with) f(one)h(mem)m(b)s(er\))390 4515 y(but)f(LCSI-st)m(yle)g(syn)m(tax)h (\(no)g(sp)s(ecial)g(forms)f(except)h(TO\).)61 b(The)29 b(b)s(est)h(of)390 4624 y(b)s(oth)g(w)m(orlds.)390 4844 y(First-class)i(instruction)e(and)g(expression)g(templates)i(\(see)f (APPL)-8 b(Y\).)390 5063 y(Macros.)150 5230 y(F)g(eatures)37 b Fj(not)f Fs(found)f(in)g(Berk)m(eley)j(Logo)f(include)e(rob)s(otics,) j(m)m(usic,)g(animation,)g(parallelism,)h(and)150 5340 y(m)m(ultimedia.)j(F)-8 b(or)31 b(those,)g(buy)e(a)i(commercial)h(v)m (ersion.)p eop end %%Page: 2 15 TeXDict begin 2 14 bop 150 -116 a Fs(2)2596 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fr(1.2)68 b(Getter/Setter)47 b(V)-11 b(ariable)46 b(Syn)l(tax)150 458 y Fs(Logo)32 b(distinguishes)e Fl(pro)s(cedures)j Fs(from)d Fl(v)-5 b(ariables)p Fs(.)43 b(A)31 b(pro)s(cedure)e(is)i(a)g(set)g(of)g(instructions)g(to)g(carry) 150 568 y(out)k(some)f(computation;)k(a)d(v)-5 b(ariable)35 b(is)g(a)f(named)g(con)m(tainer)i(that)f(holds)f(a)h(data)g(v)-5 b(alue)35 b(suc)m(h)f(as)h(a)150 677 y(n)m(um)m(b)s(er,)29 b(w)m(ord,)i(list,)g(or)f(arra)m(y)-8 b(.)150 845 y(In)38 b(traditional)i(Logo)g(syn)m(tax,)i(a)e(non-n)m(umeric)e(w)m(ord)h(t)m (yp)s(ed)f(without)h(punctuation)g(represen)m(ts)g(a)150 955 y(request)k(to)g(in)m(v)m(ok)m(e)i(the)e(pro)s(cedure)e(named)h(b)m (y)h(that)g(w)m(ord.)77 b(A)43 b(w)m(ord)f(t)m(yp)s(ed)h(with)f(a)h (preceding)150 1064 y(quotation)32 b(mark)e(represen)m(ts)g(the)h(w)m (ord)f(itself.)41 b(F)-8 b(or)31 b(example,)h(in)e(the)g(instruction) 390 1232 y Fk(PRINT)46 b(FIRST)h("WORD)150 1400 y Fs(the)33 b(pro)s(cedures)f(named)h Fk(FIRST)f Fs(and)g Fk(PRINT)g Fs(are)i(in)m(v)m(ok)m(ed,)h(but)e(the)g(pro)s(cedure)f(named)h Fl(W)m(ORD)39 b Fs(is)150 1509 y(not)31 b(in)m(v)m(ok)m(ed;)h(the)e(w)m (ord)g Fl(W-O-R-D)37 b Fs(is)30 b(the)h(input)e(to)i(FIRST.)150 1677 y(What)26 b(ab)s(out)e(v)-5 b(ariables?)40 b(There)24 b(are)i(t)m(w)m(o)g(things)f(one)g(can)g(do)g(with)g(a)g(v)-5 b(ariable:)39 b(giv)m(e)27 b(it)e(a)h(v)-5 b(alue,)27 b(and)150 1787 y(\014nd)j(out)i(its)g(v)-5 b(alue.)44 b(T)-8 b(o)32 b(giv)m(e)h(a)f(v)-5 b(ariable)32 b(a)g(v)-5 b(alue,)33 b(Logo)f(pro)m(vides)g(the)f(primitiv)m(e)i(pro)s(cedure)d Fk(MAKE)p Fs(,)150 1896 y(whic)m(h)e(requires)g(t)m(w)m(o)i(inputs:)39 b(the)28 b(name)h(of)f(the)h(v)-5 b(ariable)29 b(and)f(the)g(new)g(v)-5 b(alue)29 b(to)g(b)s(e)f(assigned.)40 b(The)150 2006 y(\014rst)26 b(input,)g(the)h(name)g(of)f(the)h(v)-5 b(ariable,)28 b(is)f(just)f(a)g(w)m(ord,)i(and)e(if)g(\(as)h(is)g (almost)g(alw)m(a)m(ys)h(the)f(case\))h(the)150 2115 y(programmer)f(w)m(an)m(ts)h(to)g(assign)g(a)f(v)-5 b(alue)28 b(to)g(a)g(sp)s(eci\014c)f(v)-5 b(ariable)28 b(whose)f(name)h(is)f(kno) m(wn)g(in)g(adv)-5 b(ance,)150 2225 y(that)31 b(input)e(is)i(quoted,)g (just)e(as)i(an)m(y)g(kno)m(wn)f(sp)s(eci\014c)g(w)m(ord)g(w)m(ould)g (b)s(e:)390 2393 y Fk(MAKE)47 b("MY.VAR)e(FIRST)i("WORD)150 2560 y Fs(giv)m(es)32 b(the)e(v)-5 b(ariable)31 b(named)f Fk(MY.VAR)f Fs(the)i(v)-5 b(alue)30 b Fk(W)g Fs(\(the)h(\014rst)f (letter)i(of)e Fk(WORD)p Fs(\).)150 2728 y(T)-8 b(o)28 b(\014nd)f(the)h(v)-5 b(alue)28 b(of)g(a)h(v)-5 b(ariable,)29 b(Logo)g(pro)m(vides)f(the)g(primitiv)m(e)h(pro)s(cedure)d Fk(THING)p Fs(,)i(whic)m(h)f(tak)m(es)j(a)150 2838 y(v)-5 b(ariable)28 b(name)g(as)f(its)h(input,)f(and)g(outputs)g(the)g(v)-5 b(alue)28 b(of)g(the)f(accessible)i(v)-5 b(ariable)29 b(with)e(that)h(name.)150 2947 y(Th)m(us)390 3115 y Fk(PRINT)46 b(THING)h("MY.VAR)150 3283 y Fs(will)36 b(prin)m(t)f Fk(W)h Fs(\(supp)s(osing)e(the)i Fk(MAKE)f Fs(ab)s(o)m(v)m(e)i(has)e(b) s(een)g(done\).)57 b(Since)36 b(\014nding)e(the)i(v)-5 b(alue)36 b(of)g(a)g(sp)s(e-)150 3392 y(ci\014c,)30 b(kno)m(wn)g(v)-5 b(ariable)30 b(name)f(is)h(suc)m(h)f(a)h(common)g(op)s(eration,)g(Logo) h(also)g(pro)m(vides)e(an)h(abbreviated)150 3502 y(notation)i(that)f (com)m(bines)g Fk(THING)d Fs(with)j(quote:)390 3670 y Fk(PRINT)46 b(:MY.VAR)150 3837 y Fs(The)36 b(colon)i(\(whic)m(h)e(Logo) i(old-timers)f(pronounce)f Fk(")p Fs(dots)p Fk(")p Fs(\))g(replaces)i Fk(THING)d Fs(and)h Fk(")g Fs(in)g(the)h(earlier)150 3947 y(v)m(ersion)31 b(of)f(the)h(instruction.)150 4115 y(New)m(comers)i(to)g(Logo)g(often)g(complain)f(ab)s(out)g(the)h(need)e (for)h(all)h(this)f(punctuation.)46 b(In)31 b(particular,)150 4224 y(Logo)j(programmers)e(who)g(learned)g(ab)s(out)h(dots)f(and)g (quotes)h(without)g(also)g(learning)g(ab)s(out)f Fk(THING)150 4334 y Fs(w)m(onder)e(wh)m(y)g(an)g(instruction)g(suc)m(h)g(as)390 4501 y Fk(MAKE)47 b("NEW.VAR)e(:OLD.VAR)150 4669 y Fs(uses)30 b(t)m(w)m(o)i(di\013eren)m(t)f(punctuation)f(marks)g(to)h(iden)m(tify)g (the)f(t)m(w)m(o)i(v)-5 b(ariables.)42 b(\(Ha)m(ving)32 b(read)e(the)h(para-)150 4779 y(graphs)j(ab)s(o)m(v)m(e,)j(y)m(ou)e (will)g(understand)e(that)i(actually)h(b)s(oth)e(v)-5 b(ariable)35 b(names)g(are)g(quoted,)h(but)e(the)150 4888 y(pro)s(cedure)24 b Fk(THING)f Fs(is)i(in)m(v)m(ok)m(ed)i(to)e (\014nd)f(the)h(v)-5 b(alue)25 b(of)g Fk(OLD.VAR)p Fs(,)g(since)g(it's) g(that)h(v)-5 b(alue,)27 b(not)e Fk(OLD.VAR)p Fs('s)150 4998 y(name,)k(that)g Fk(MAKE)f Fs(needs)g(to)h(kno)m(w.)40 b(It)29 b(w)m(ouldn't)f(mak)m(e)i(sense)e(to)i(ask)e(for)h Fk(THING)e Fs(of)h Fk(NEW.VAR)p Fs(,)g(since)150 5108 y(w)m(e)j(ha)m(v)m(en't)h(giv)m(en)f Fk(NEW.VAR)d Fs(a)j(v)-5 b(alue)31 b(y)m(et.\))p eop end %%Page: 3 16 TeXDict begin 3 15 bop 150 -116 a Fs(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(3)150 299 y(Although)31 b(Logo's)h (punctuation)f(rules)f(mak)m(e)i(sense)f(once)g(understo)s(o)s(d,)f (they)h(do)f(form)h(a)g(barrier)f(to)150 408 y(en)m(try)24 b(for)f(the)h(Logo)g(b)s(eginner.)38 b(Wh)m(y)-8 b(,)26 b(then,)f(couldn't)e(Logo)i(b)s(e)e(designed)g(so)h(that)g(an)f (unpunctuated)150 518 y(w)m(ord)i(w)m(ould)f(represen)m(t)h(a)h(pro)s (cedure)e(if)h(there)g(is)g(a)g(pro)s(cedure)f(b)m(y)h(that)g(name,)i (or)e(a)g(v)-5 b(ariable)26 b(if)f(there)150 628 y(is)30 b(a)h(v)-5 b(ariable)31 b(b)m(y)g(that)g(name?)40 b(Then)29 b(w)m(e)i(could)g(sa)m(y)390 795 y Fk(PRINT)46 b(MY.VAR)150 963 y Fs(and)38 b(Logo)h(w)m(ould)g(realize)h(that)f Fk(MY.VAR)d Fs(is)j(the)f(name)h(of)f(a)h(v)-5 b(ariable,)42 b(not)c(of)h(a)g(pro)s(cedure.)63 b(The)150 1073 y(traditional)33 b(reason)e(not)h(to)g(use)f(this)g(con)m(v)m(en)m(tion)i(is)e(that)h (Logo)h(allo)m(ws)f(the)g(same)f(w)m(ord)g(to)h(name)g(a)150 1182 y(pro)s(cedure)j(and)h(a)g(v)-5 b(ariable)37 b(at)g(the)f(same)h (time.)59 b(This)35 b(is)h(most)h(often)f(imp)s(ortan)m(t)h(for)f(w)m (ords)f(that)150 1292 y(name)30 b(data)h(t)m(yp)s(es,)g(as)g(in)f(the)g (follo)m(wing)i(pro)s(cedure:)390 1460 y Fk(TO)47 b(PLURAL)f(:WORD)390 1569 y(OUTPUT)g(WORD)h(:WORD)f("S)390 1679 y(END)150 1846 y Fs(Here)d(the)f(name)g Fk(WORD)f Fs(is)h(a)h(natural)f(c)m (hoice)i(for)e(the)g(input)f(to)i Fk(PLURAL)p Fs(,)g(since)g(it)f (describ)s(es)g(the)150 1956 y(kind)29 b(of)h(input)f(that)h Fk(PLURAL)e Fs(exp)s(ects.)41 b(Within)30 b(the)g(pro)s(cedure,)f(w)m (e)h(use)g Fk(WORD)e Fs(to)j(represen)m(t)f(Logo's)150 2066 y(primitiv)m(e)40 b(pro)s(cedure)e(that)h(com)m(bines)h(t)m(w)m(o) g(input)e(w)m(ords)h(to)g(form)g(a)g(new,)i(longer)f(w)m(ord;)j(w)m(e)c (use)150 2175 y Fk(:WORD)32 b Fs(to)i(represen)m(t)g(the)f(v)-5 b(ariable)35 b(con)m(taining)g(the)e(input,)h(whatev)m(er)g(actual)h(w) m(ord)e(is)g(giv)m(en)i(when)150 2285 y Fk(PLURAL)29 b Fs(is)h(in)m(v)m(ok)m(ed.)390 2452 y Fk(?)47 b(PRINT)g(PLURAL)f ("COMPUTER)390 2562 y(COMPUTERS)150 2730 y Fs(Ho)m(w)m(ev)m(er,)32 b(if)e(a)g(Logo)h(instruction)f(includes)f(an)h(unquoted)e(w)m(ord)i (that)g(is)g Fj(not)g Fs(the)g(name)g(of)g(a)g(pro)s(ce-)150 2839 y(dure,)35 b(Logo)g(could)g(lo)s(ok)g(for)f(a)h(v)-5 b(ariable)36 b(of)e(that)i(name)e(instead.)54 b(This)33 b(w)m(ould)i(allo)m(w)h(a)f Fk(")p Fs(punctua-)150 2949 y(tionless)p Fk(")e Fs(Logo,)h Fj(pro)m(vided)e(that)h(users)f(who)g(w) m(an)m(t)h(to)g(w)m(ork)g(without)g(colons)g(for)f(v)-5 b(ariables)33 b(c)m(ho)s(ose)150 3059 y(v)-5 b(ariable)31 b(names)f(that)h(are)g(not)f(also)i(pro)s(cedure)d(names.)150 3226 y Fs(What)k(ab)s(out)g(assigning)g(a)g(v)-5 b(alue)33 b(to)g(a)g(v)-5 b(ariable?)48 b(Could)32 b(w)m(e)h(do)f(without)h(the)g (quotation)h(mark)e(on)150 3336 y Fk(MAKE)p Fs('s)d(\014rst)g(input?)40 b(Alas,)31 b(no.)40 b(Although)30 b(the)h(\014rst)e(input)g(to)i Fk(MAKE)e Fs(is)h Fj(usually)f Fs(a)i(constan)m(t,)g(kno)m(wn)150 3445 y(v)-5 b(ariable)31 b(name,)g(sometimes)g(it)g(isn't,)g(as)g(in)f (this)g(example:)390 3613 y Fk(TO)47 b(INCREMENT)e(:VAR)390 3723 y(MAKE)i(:VAR)f(\(THING)g(:VAR\)+1)g(;)i(Note:)e(it's)h(not)g ("VAR)f(here!)390 3832 y(END)390 4051 y(?)h(MAKE)g("X)g(5)390 4161 y(?)g(INCREMENT)f("X)390 4271 y(?)h(PRINT)g(:X)390 4380 y(6)150 4548 y Fs(The)29 b(pro)s(cedure)f Fk(INCREMENT)f Fs(tak)m(es)j(a)g(v)-5 b(ariable)30 b(name)f(as)h(its)f(input)g(and)f (c)m(hanges)j(the)e(v)-5 b(alue)30 b(of)f(that)150 4658 y(v)-5 b(ariable.)39 b(In)23 b(this)g(example)i(there)e(are)h(t)m(w)m (o)h(v)-5 b(ariables;)27 b(the)c(v)-5 b(ariable)25 b(whose)e(name)g(is) h Fk(VAR)p Fs(,)g(and)f(whose)150 4767 y(v)-5 b(alue)28 b(is)f(the)h(w)m(ord)f Fk(X)p Fs(;)i(and)d(the)i(v)-5 b(ariable)28 b(whose)g(name)f(is)h Fk(X)f Fs(and)g(whose)g(v)-5 b(alue)28 b(c)m(hanges)g(from)f(5)h(to)g(6.)150 4877 y(Supp)s(ose)h(w)m(e)i(c)m(hanged)g(the)f(b)s(eha)m(vior)h(of)f Fk(MAKE)g Fs(so)g(that)h(it)g(to)s(ok)h(the)e(w)m(ord)g(after)h Fk(MAKE)f Fs(as)g(the)h(name)150 4986 y(of)g(the)f(v)-5 b(ariable)31 b(to)g(c)m(hange;)h(w)m(e)f(w)m(ould)f(b)s(e)g(unable)g (to)h(write)f Fk(INCREMENT)p Fs(:)390 5154 y Fk(TO)47 b(INCREMENT)e(:VAR)i(;)h(nonworking!)390 5264 y(MAKE)f(VAR)g(\(THING)f (VAR\)+1)p eop end %%Page: 4 17 TeXDict begin 4 16 bop 150 -116 a Fs(4)2596 b(BERKELEY)30 b(LOGO)g(6.1)390 299 y Fk(END)150 467 y Fs(This)g(w)m(ould)g(assign)g (a)h(new)f(v)-5 b(alue)31 b(to)g Fk(VAR)p Fs(,)f(not)g(to)h Fk(X)p Fs(.)150 634 y(What)36 b(w)m(e)g(can)g(do)g(is)g(to)g(allo)m(w)h (an)f Fj(alternativ)m(e)i Fs(to)e Fk(MAKE)p Fs(,)g(a)h Fk(")p Fs(setter)p Fk(")f Fs(pro)s(cedure)e(for)i(a)g(particular)150 744 y(v)-5 b(ariable.)42 b(The)29 b(notation)j(will)f(b)s(e)390 912 y Fk(?)47 b(SETFOO)g(7)390 1021 y(?)g(PRINT)g(FOO)390 1131 y(7)150 1298 y(SETFOO)31 b Fs(is)h(a)h Fk(")p Fs(setter)g(pro)s (cedure)p Fk(")e Fs(that)j(tak)m(es)g(one)e(input)g(\(in)g(this)h(case) g(the)g(input)f(7\))h(and)f(assigns)150 1408 y(its)f(v)-5 b(alue)31 b(to)g(the)f(v)-5 b(ariable)31 b(named)f Fk(FOO)p Fs(.)150 1576 y(Berk)m(eley)e(Logo)f(allo)m(ws)h(users)d(to)i(c)m(ho)s (ose)g(either)g(the)f(traditional)i(notation,)g(in)e(whic)m(h)g(case)h (the)g(same)150 1685 y(name)j(can)f(b)s(e)g(used)g(b)s(oth)g(for)g(a)h (pro)s(cedure)e(and)h(for)g(a)h(v)-5 b(ariable,)31 b(or)e(the)h (getter/setter)i(notation,)f(in)150 1795 y(whic)m(h)d(v)-5 b(ariable)29 b Fk(FOO)e Fs(is)h(set)h(with)f Fk(SETFOO)e Fs(and)i(examined)g(with)g Fk(FOO)p Fs(,)g(but)f(the)i(same)f(name)h (can't)g(b)s(e)150 1905 y(used)h(for)g(pro)s(cedure)f(and)h(v)-5 b(ariable.)150 2072 y(Here)27 b(is)f(ho)m(w)g(this)g(c)m(hoice)i(is)e (allo)m(w)m(ed:)40 b(Berk)m(eley)28 b(Logo)f(uses)f(traditional)h (notation,)h(with)e(pro)s(cedures)150 2182 y(distinct)32 b(from)f(v)-5 b(ariables.)44 b(Ho)m(w)m(ev)m(er,)34 b(if)e(there)f(is)h (a)f(v)-5 b(ariable)33 b(named)d Fk(AllowGetSet)f Fs(whose)i(v)-5 b(alue)32 b(is)150 2291 y(TR)m(UE)25 b(\(whic)m(h)h(there)g(is,)g(b)m (y)g(default,)h(when)d(Logo)j(starts)f(up\),)g(then)f(if)g(a)h(Logo)h (instruction)e(refers)g(to)150 2401 y(a)i Fj(nonexisten)m(t)i Fs(pro)s(cedure)d(\(so)h(that)h(the)f(error)g(message)h Fk(")p Fs(I)f(don't)g(kno)m(w)g(ho)m(w)g(to)h(...)p Fk(")g Fs(w)m(ould)e(result\),)150 2511 y(Logo)31 b(tries)g(the)g(follo)m (wing)h(t)m(w)m(o)f(steps:)390 2678 y(1.)61 b(If)30 b(the)h(name)f(is)h (at)g(least)g(four)f(c)m(haracters)i(long,)f(and)f(the)g(\014rst)g (three)390 2788 y(c)m(haracters)i(are)f(the)f(letters)i Fk(SET)d Fs(\(upp)s(er)g(or)h(lo)m(w)m(er)i(case\),)g(and)e(if)g(the)h (name)390 2897 y(is)f(follo)m(w)m(ed)i(in)e(the)h(instruction)f(b)m(y)h (another)f(v)-5 b(alue,)31 b(and)f(if)g(the)h(name)390 3007 y(without)f(the)h Fk(SET)e Fs(is)i(the)f(name)h(of)f(a)h(v)-5 b(ariable)31 b(that)g(already)g(exists,)g(then)390 3117 y(Logo)g(will)g(in)m(v)m(ok)m(e)i Fk(MAKE)c Fs(with)h(its)h(\014rst)e (input)h(b)s(eing)g(the)g(name)h(without)f(the)390 3226 y Fk(SET)p Fs(,)g(and)f(its)i(second)g(input)e(b)s(eing)h(the)h(follo)m (wing)g(v)-5 b(alue.)390 3445 y(2.)61 b(If)30 b(step)h(1's)g (conditions)f(are)h(not)g(met,)g(but)e(the)i(name)f(is)390 3555 y(the)h(name)f(of)h(an)f(accessible)i(v)-5 b(ariable,)31 b(then)f(Logo)i(will)f(in)m(v)m(ok)m(e)390 3665 y Fk(THING)e Fs(with)h(that)h(name)f(as)h(input,)f(to)h(\014nd)e(the)h(v)-5 b(ariable's)31 b(v)-5 b(alue.)150 3832 y(Step)42 b(1)g(requires)f(that) h(the)g(v)-5 b(ariable)43 b(already)f(exist)h(so)f(that)h(missp)s (ellings)e(of)h(names)g(of)g Fk(SETxxx)150 3942 y Fs(primitiv)m(es)26 b(\(e.g.,)i Fk(SETHEADING)p Fs(\))22 b(will)k(still)g(b)s(e)e(caugh)m (t,)k(instead)d(of)g(silen)m(tly)h(creating)h(a)e(new)g(v)-5 b(ariable.)150 4051 y(The)30 b(command)g Fk(GLOBAL)f Fs(can)h(b)s(e)g(used)g(to)h(create)h(a)e(v)-5 b(ariable)32 b(without)e(giving)h(it)g(a)g(v)-5 b(alue.)150 4219 y(One)33 b(\014nal)g(p)s(oin)m(t:)47 b(The)33 b Fk(TO)f Fs(command)i(in)f(Logo)h (has)f(alw)m(a)m(ys)i(b)s(een)e(a)h(sp)s(ecial)g(case;)i(the)e(rest)f (of)h(the)150 4329 y(line)g(starting)g(with)f Fk(TO)g Fs(is)g(not)h(ev)-5 b(aluated)34 b(as)g(ordinary)f(Logo)h(expressions)f (are.)50 b(In)33 b(particular,)i(the)150 4438 y(colons)26 b(used)e(to)h(mark)g(the)g(names)g(of)g(inputs)e(to)j(the)f(pro)s (cedure)f(do)h(not)g(cause)g Fk(THING)e Fs(to)j(b)s(e)e(in)m(v)m(ok)m (ed.)150 4548 y(They)35 b(are)h(merely)g(mnemonic)g(aids,)h(reminding)e (the)g(Logo)i(user)e(that)h(these)g(w)m(ords)f(are)h(names)g(of)150 4658 y(v)-5 b(ariables.)63 b(\(Arguably)-8 b(,)41 b(this)d(nonstan)m (tard)f(b)s(eha)m(vior)h(of)g Fk(TO)f Fs(adds)g(to)i(Logo)f(b)s (eginners')f(confusion)150 4767 y(ab)s(out)f(colons.\))59 b(T)-8 b(o)36 b(a)g(programmer)g(using)f(colonless)j(v)-5 b(ariable)37 b(references,)h(the)e(colons)h(in)e(the)i Fk(TO)150 4877 y Fs(line)31 b(are)f(unnecessary)g(and)g(meaningless.)41 b(Berk)m(eley)33 b(Logo)e(therefore)g(mak)m(es)g(the)g(colons)g (optional:)390 5044 y Fk(TO)47 b(FOO)g(:IN1)g(:IN2)150 5212 y Fs(and)p eop end %%Page: 5 18 TeXDict begin 5 17 bop 150 -116 a Fs(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(5)390 299 y Fk(TO)47 b(FOO)g(IN1)g(IN2)150 467 y Fs(are)31 b(b)s(oth)e(allo)m(w)m(ed.)150 702 y Fr(1.3)68 b(En)l(tering)46 b(and)f(Lea)l(ving)h(Logo)150 861 y Fs(The)30 b(pro)s(cess)g(to)h(start)g(Logo)g(dep)s(ends)e(on)h(y) m(our)g(op)s(erating)h(system:)150 1051 y(Unix:)263 b(T)m(yp)s(e)26 b(the)h(w)m(ord)g Fk(logo)e Fs(to)j(the)f(shell.)40 b(\(The)27 b(directory)g(in)f(whic)m(h)h(y)m(ou'v)m(e)h(installed)g(Logo)630 1161 y(m)m(ust)i(b)s(e)g(in)g(y)m(our)g(path.\))150 1315 y(DOS:)264 b(Change)35 b(directories)h(to)f(the)g(one)g(con)m(taining)i (Logo)f(\(probably)e Fk(C:\\UCBLOGO)p Fs(\).)52 b(Then)630 1425 y(t)m(yp)s(e)31 b Fk(UCBLOGO)d Fs(for)i(the)h(large)g(memory)f(v)m (ersion,)h(or)g Fk(BL)f Fs(for)g(the)g(640K)i(v)m(ersion.)150 1579 y(Mac:)287 b(Double-clic)m(k)33 b(on)d(the)h Fk(LOGO)e Fs(icon)i(within)f(the)g Fk(")p Fs(UCB)h(Logo)p Fk(")g Fs(folder.)150 1733 y(Windo)m(ws:)91 b(Double-clic)m(k)33 b(on)d(the)h Fk(UCBWLOGO)d Fs(icon)j(in)f(the)g Fk(UCBLOGO)f Fs(folder.)150 1923 y(T)-8 b(o)31 b(lea)m(v)m(e)i(Logo,)e(en)m(ter)g (the)g(command)f Fk(bye)p Fs(.)150 2090 y(On)39 b(startup,)j(Logo)f(lo) s(oks)f(for)g(a)g(\014le)g(named)g Fk(startup.lg)d Fs(in)i(the)i (system)f(Logo)h(library)e(and,)j(if)150 2200 y(found,)32 b(loads)h(it.)47 b(Then)31 b(it)i(lo)s(oks)g(for)f Fk(startup.lg)e Fs(in)i(the)h(user's)f(home)g(directory)-8 b(,)34 b(or)f(the)f(curren)m (t)150 2310 y(directory)-8 b(,)38 b(dep)s(ending)33 b(on)j(the)f(op)s (erating)h(system,)h(and)d(loads)i(that.)56 b(These)35 b(startup)g(\014les)g(can)h(b)s(e)150 2419 y(used)30 b(to)h(prede\014ne)e(pro)s(cedures,)g(e.g.,)j(to)f(pro)m(vide)g (non-English)e(names)i(for)f(primitiv)m(e)h(pro)s(cedures.)150 2587 y(Under)41 b(Unix,)k(DOS,)c(or)h(Windo)m(ws,)j(if)d(y)m(ou)g (include)f(one)h(or)g(more)g(\014lenames)g(on)f(the)h(command)150 2697 y(line)i(when)e(starting)i(Logo,)k(those)43 b(\014les)g(will)h(b)s (e)f(loaded)g(b)s(efore)g(the)h(in)m(terpreter)f(starts)h(reading)150 2806 y(commands)29 b(from)f(y)m(our)h(terminal.)41 b(If)28 b(y)m(ou)h(load)h(a)f(\014le)g(that)h(executes)g(some)f(program)g(that) g(includes)150 2916 y(a)i Fk(bye)f Fs(command,)g(Logo)i(will)f(run)e (that)j(program)e(and)g(exit.)42 b(Y)-8 b(ou)31 b(can)g(therefore)g (write)g(standalone)150 3025 y(programs)g(in)g(Logo)h(and)f(run)f(them) h(with)g(shell/batc)m(h)i(scripts.)44 b(T)-8 b(o)31 b(supp)s(ort)f (this)h(tec)m(hnique,)i(Logo)150 3135 y(do)s(es)h(not)g(prin)m(t)f(its) i(usual)e(w)m(elcoming)i(and)f(parting)g(messages)g(if)g(y)m(ou)h(giv)m (e)g(\014le)f(argumen)m(ts)g(to)h(the)150 3245 y(logo)d(command.)150 3412 y(If)44 b(a)h(command)g(line)g(argumen)m(t)g(is)g(just)f(a)h(h)m (yphen,)i(then)d(all)i(command)e(line)h(argumen)m(ts)g(after)150 3522 y(the)40 b(h)m(yphen)e(are)h(not)h(tak)m(en)g(as)g(\014lenames,)i (but)c(are)i(instead)g(collected)h(in)e(a)h(list,)i(one)e(w)m(ord)f(p)s (er)150 3631 y(argumen)m(t;)31 b(the)e(buried)g(v)-5 b(ariable)30 b Fk(COMMAND.LINE)d Fs(con)m(tains)j(that)h(list)f(of)g (argumen)m(ts,)g(or)g(the)g(empt)m(y)150 3741 y(list)j(if)f(there)h (are)g(none.)46 b(On)32 b(m)m(y)h(Lin)m(ux)e(system,)j(if)e(the)h (\014rst)e(line)i(of)g(an)f(executable)i(shell)f(script)f(is)150 3851 y Fk(#!/usr/local/bin/logo)42 b(-)32 b Fs(\(note)i(the)f(h)m (yphen\))e(then)i(the)f(script)h(can)g(b)s(e)f(giv)m(en)h(command)g (line)150 3960 y(argumen)m(ts)25 b(and)g(they)g(all)h(end)e(up)g(in)g Fk(:COMMAND.LINE)e Fs(along)k(with)e(the)h(script's)g(path.)39 b(Exp)s(erimen)m(t.)150 4128 y(If)c(y)m(ou)g(t)m(yp)s(e)h(y)m(our)f(in) m(terrupt)g(c)m(haracter)i(\(see)f(table)g(b)s(elo)m(w\))g(Logo)g(will) g(stop)f(what)g(it's)h(doing)g(and)150 4237 y(return)d(to)i(top-lev)m (el,)i(as)d(if)g(y)m(ou)g(did)f Fk(THROW)47 b("TOPLEVEL)m Fs(.)52 b(If)33 b(y)m(ou)h(t)m(yp)s(e)g(y)m(our)g(quit)g(c)m(haracter)i (Logo)150 4347 y(will)31 b(pause)f(as)g(if)h(y)m(ou)f(did)g Fk(PAUSE)p Fs(.)963 4515 y Fk(wxWidgets)284 b(Unix)333 b(DOS/Windows)235 b(Mac)47 b(Classic)390 4734 y(toplevel)284 b(alt-S)142 b(usually)46 b(ctrl-C)189 b(ctrl-Q)237 b(command-.)45 b(\(period\))390 4953 y(pause)428 b(alt-P)142 b(usually)46 b(ctrl-\\)189 b(ctrl-W)237 b(command-,)45 b(\(comma\))150 5121 y Fs(If)28 b(y)m(ou)g(ha)m(v)m(e)i(an)e(en)m(vironmen)m(t)h(v)-5 b(ariable)29 b(called)g Fk(LOGOLIB)e Fs(whose)h(v)-5 b(alue)29 b(is)f(the)g(name)h(of)f(a)h(directory)-8 b(,)150 5230 y(then)33 b(Logo)h(will)f(use)g(that)g(directory)g(instead)h(of)f (the)g(default)g(library)-8 b(.)48 b(If)33 b(y)m(ou)g(in)m(v)m(ok)m(e)i (a)e(pro)s(cedure)150 5340 y(that)26 b(has)g(not)g(b)s(een)f (de\014ned,)h(Logo)h(\014rst)e(lo)s(oks)h(for)g(a)g(\014le)g(in)g(the)g (curren)m(t)f(directory)i(named)e Fi(proc)p Fk(.lg)p eop end %%Page: 6 19 TeXDict begin 6 18 bop 150 -116 a Fs(6)2596 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(where)d Fl(pro)s(c)32 b Fs(is)27 b(the)g(pro)s(cedure)f(name)h(in)g(lo)m(w)m(er)h(case)g(letters.)41 b(If)27 b(suc)m(h)f(a)i(\014le)f(exists,)i(Logo)f(loads)f(that)150 408 y(\014le.)50 b(If)33 b(the)h(missing)f(pro)s(cedure)g(is)g(still)i (unde\014ned,)d(or)i(if)f(there)h(is)f(no)h(suc)m(h)f(\014le,)i(Logo)f (then)f(lo)s(oks)150 518 y(in)e(the)h(library)g(directory)g(for)f(a)i (\014le)e(named)h Fi(proc)e Fs(\(no)i Fk(.lg)p Fs(\))f(and,)h(if)g(it)g (exists,)h(loads)f(it.)46 b(If)31 b(neither)150 628 y(\014le)h(con)m (tains)h(a)f(de\014nition)g(for)g(the)g(pro)s(cedure,)f(then)h(Logo)h (signals)f(an)g(error.)45 b(Sev)m(eral)33 b(pro)s(cedures)150 737 y(that)c(are)g(primitiv)m(e)h(in)e(most)h(v)m(ersions)g(of)g(Logo)h (are)f(included)f(in)g(the)h(default)f(library)-8 b(,)30 b(so)f(if)f(y)m(ou)h(use)150 847 y(a)i(di\013eren)m(t)g(library)f(y)m (ou)g(ma)m(y)h(w)m(an)m(t)g(to)h(include)e(some)g(or)h(all)g(of)g(the)f (default)h(library)f(in)g(it.)150 1421 y Fr(1.4)68 b(T)-11 b(ok)l(enization)150 1581 y Fs(Names)35 b(of)g(pro)s(cedures,)f(v)-5 b(ariables,)36 b(and)e(prop)s(ert)m(y)g(lists)h(are)f(case-insensitiv)m (e.)56 b(So)34 b(are)h(the)f(sp)s(ecial)150 1690 y(w)m(ords)c Fk(END)p Fs(,)g Fk(TRUE)p Fs(,)f(and)h Fk(FALSE)p Fs(.)39 b(Case)31 b(of)f(letters)i(is)e(preserv)m(ed)g(in)g(ev)m(erything)i(y)m (ou)e(t)m(yp)s(e,)h(ho)m(w)m(ev)m(er.)150 1858 y(Within)h(square)f (brac)m(k)m(ets,)j(w)m(ords)d(are)h(delimited)h(only)e(b)m(y)h(spaces)g (and)f(square)h(brac)m(k)m(ets.)46 b Fk([2+3])30 b Fs(is)150 1968 y(a)k(list)h(con)m(taining)g(one)f(w)m(ord.)51 b(Note,)37 b(ho)m(w)m(ev)m(er,)f(that)f(the)f(Logo)h(primitiv)m(es)f(that)h(in)m (terpret)f(suc)m(h)g(a)150 2077 y(list)d(as)f(a)g(Logo)h(instruction)f (or)g(expression)g(\()p Fk(RUN)p Fs(,)g Fk(IF)p Fs(,)g(etc.\))42 b(reparse)29 b(the)i(list)f(as)h(if)e(it)i(had)e(not)i(b)s(een)150 2187 y(t)m(yp)s(ed)f(inside)g(brac)m(k)m(ets.)150 2355 y(After)35 b(a)g(quotation)h(mark)e(outside)h(square)f(brac)m(k)m(ets,) j(a)e(w)m(ord)g(is)f(delimited)h(b)m(y)g(a)g(space,)h(a)f(square)150 2464 y(brac)m(k)m(et,)d(or)f(a)f(paren)m(thesis.)150 2632 y(A)40 b(w)m(ord)g(not)g(after)h(a)g(quotation)g(mark)f(or)g (inside)g(square)g(brac)m(k)m(ets)i(is)e(delimited)h(b)m(y)f(a)g (space,)k(a)150 2741 y(brac)m(k)m(et,)j(a)42 b(paren)m(thesis,)j(or)d (an)f(in\014x)g(op)s(erator)i Fk(+-*/=<>)p Fs(.)73 b(Note)43 b(that)f(w)m(ords)g(follo)m(wing)h(colons)150 2851 y(are)c(in)g(this)g (category)-8 b(.)69 b(Note)40 b(that)g(quote)f(and)f(colon)i(are)g(not) f(delimiters.)67 b(Eac)m(h)40 b(in\014x)e(op)s(erator)150 2961 y(c)m(haracter)f(is)e(a)g(w)m(ord)g(in)f(itself,)k(except)e(that)f (the)g(t)m(w)m(o-c)m(haracter)k(sequences)c Fk(<=)p Fs(,)h Fk(>=)p Fs(,)g(and)e Fk(<>)g Fs(\(the)150 3070 y(latter)e(meaning)e (not-equal\))i(with)e(no)h(in)m(terv)m(ening)g(space)g(are)g (recognized)g(as)g(a)g(single)g(w)m(ord.)150 3238 y(A)38 b(w)m(ord)f(consisting)h(of)g(a)f(question)h(mark)f(follo)m(w)m(ed)i(b) m(y)f(a)f(n)m(um)m(b)s(er)g(\(e.g.,)k Fk(?37)p Fs(\),)e(when)d (runparsed)150 3347 y(\(i.e.,)c(where)e(a)h(pro)s(cedure)e(name)h(is)h (exp)s(ected\),)g(is)g(treated)g(as)g(if)f(it)h(w)m(ere)g(the)f (sequence)390 3515 y Fk(\()47 b(?)h(37)f(\))150 3683 y Fs(making)31 b(the)g(n)m(um)m(b)s(er)e(an)h(input)g(to)h(the)g(?)41 b(pro)s(cedure.)f(\(See)31 b(the)g(discussion)f(of)h(templates,)h(b)s (elo)m(w.\))150 3792 y(This)e(sp)s(ecial)h(treatmen)m(t)i(do)s(es)d (not)i(apply)e(to)i(w)m(ords)e(read)h(as)g(data,)h(to)f(w)m(ords)g (with)f(a)h(non-n)m(um)m(b)s(er)150 3902 y(follo)m(wing)h(the)e (question)h(mark,)f(or)h(if)f(the)h(question)f(mark)g(is)h(bac)m (kslashed.)150 4070 y(A)36 b(line)g(\(an)g(instruction)f(line)h(or)g (one)g(read)g(b)m(y)f Fk(READLIST)f Fs(or)h Fk(READWORD)p Fs(\))f(can)i(b)s(e)f(con)m(tin)m(ued)i(on)m(to)150 4179 y(the)e(follo)m(wing)h(line)g(if)e(its)i(last)f(c)m(haracter)i(is)e(a)g (tilde)h(\()p Fk(~)p Fs(\).)54 b Fk(READWORD)33 b Fs(preserv)m(es)i (the)g(tilde)g(and)g(the)150 4289 y(newline;)c Fk(READLIST)d Fs(do)s(es)i(not.)150 4457 y(Lines)g(read)g(with)g Fk(READRAWLINE)e Fs(are)j(nev)m(er)f(con)m(tin)m(ued.)150 4624 y(An)d(instruction)g (line)g(or)g(a)h(line)f(read)g(b)m(y)g Fk(READLIST)e Fs(\(but)i(not)g(b)m(y)g Fk(READWORD)p Fs(\))e(is)i(automatically)j (con-)150 4734 y(tin)m(ued)22 b(to)h(the)g(next)g(line,)h(as)f(if)f (ended)g(with)g(a)h(tilde,)i(if)d(there)h(are)g(unmatc)m(hed)f(brac)m (k)m(ets,)j(paren)m(theses,)150 4844 y(braces,)h(or)f(v)m(ertical)i (bars)d(p)s(ending.)37 b(Ho)m(w)m(ev)m(er,)28 b(it's)e(an)e(error)h(if) f(the)h(con)m(tin)m(uation)i(line)e(con)m(tains)h(only)150 4953 y(the)33 b(w)m(ord)f Fk(END)p Fs(;)i(this)f(is)f(to)i(prev)m(en)m (t)g(runa)m(w)m(a)m(y)f(pro)s(cedure)f(de\014nitions.)47 b(Lines)33 b(explicitly)h(con)m(tin)m(ued)150 5063 y(with)c(a)h(tilde)g (a)m(v)m(oid)h(this)e(restriction.)150 5230 y(If)43 b(a)h(line)h(b)s (eing)e(t)m(yp)s(ed)g(in)m(teractiv)m(ely)k(on)d(the)g(k)m(eyb)s(oard)g (is)f(con)m(tin)m(ued,)49 b(either)44 b(with)f(a)h(tilde)h(or)150 5340 y(automatically)-8 b(,)34 b(Logo)d(will)g(displa)m(y)g(a)f(tilde)i (as)e(a)h(prompt)e(c)m(haracter)j(for)e(the)h(con)m(tin)m(uation)h (line.)p eop end %%Page: 7 20 TeXDict begin 7 19 bop 150 -116 a Fs(Chapter)30 b(1:)41 b(In)m(tro)s(duction)2592 b(7)150 299 y(A)39 b(semicolon)i(b)s(egins)d (a)i(commen)m(t)g(in)f(an)g(instruction)h(line.)67 b(Logo)41 b(ignores)e(c)m(haracters)i(from)e(the)150 408 y(semicolon)32 b(to)g(the)f(end)f(of)h(the)g(line.)43 b(A)30 b(tilde)i(as)f(the)g (last)h(c)m(haracter)g(still)g(indicates)g(a)f(con)m(tin)m(uation)150 518 y(line,)g(but)f(not)g(a)h(con)m(tin)m(uation)h(of)f(the)f(commen)m (t.)42 b(F)-8 b(or)31 b(example,)h(t)m(yping)e(the)h(instruction)390 686 y Fk(print)46 b("abc;comment)f(~)390 795 y(def)150 963 y Fs(will)21 b(prin)m(t)f(the)h(w)m(ord)g Fk(abcdef)p Fs(.)35 b(Semicolon)22 b(has)e(no)h(sp)s(ecial)g(meaning)g(in)g(data)g (lines)g(read)g(b)m(y)f Fk(READWORD)150 1073 y Fs(or)28 b Fk(READLIST)p Fs(,)e(but)h(suc)m(h)h(a)g(line)g(can)g(later)h(b)s(e)e (reparsed)g(using)h Fk(RUNPARSE)d Fs(and)i(then)h(commen)m(ts)h(will) 150 1182 y(b)s(e)h(recognized.)150 1350 y(The)c(t)m(w)m(o-c)m(haracter) k(sequence)d Fk(#!)f Fs(at)i(the)f(b)s(eginning)f(of)h(a)g(line)g(also) g(starts)h(a)f(commen)m(t.)40 b(Unix)27 b(users)150 1460 y(can)k(therefore)f(write)h(a)g(\014le)f(con)m(taining)i(Logo)g (commands,)e(starting)h(with)f(the)h(line)390 1627 y Fk(#!)47 b(/usr/local/bin/logo)150 1795 y Fs(\(or)35 b(wherev)m(er)f(y)m(our)h(Logo)h(executable)g(liv)m(es\))g(and)e(the)h (\014le)f(will)h(b)s(e)f(executable)i(directly)g(from)e(the)150 1905 y(shell.)150 2072 y(T)-8 b(o)32 b(include)e(an)h(otherwise)h (delimiting)g(c)m(haracter)g(\(including)f(semicolon)i(or)e(tilde\))h (in)f(a)g(w)m(ord,)g(pre-)150 2182 y(cede)k(it)h(with)e(bac)m(kslash)i (\()p Fk(\\)p Fs(\).)54 b(If)34 b(the)h(last)h(c)m(haracter)g(of)f(a)g (line)g(is)g(a)g(bac)m(kslash,)i(then)d(the)h(newline)150 2291 y(c)m(haracter)41 b(follo)m(wing)h(the)e(bac)m(kslash)g(will)g(b)s (e)f(part)h(of)g(the)g(last)h(w)m(ord)e(on)h(the)g(line,)i(and)e(the)g (line)150 2401 y(con)m(tin)m(ues)29 b(on)m(to)g(the)f(follo)m(wing)h (line.)40 b(T)-8 b(o)28 b(include)g(a)g(bac)m(kslash)g(in)g(a)g(w)m (ord,)g(use)f Fk(\\\\)p Fs(.)40 b(If)27 b(the)h(com)m(bina-)150 2511 y(tion)33 b(bac)m(kslash-newline)h(is)f(en)m(tered)h(at)f(the)g (terminal,)i(Logo)f(will)f(issue)g(a)g(bac)m(kslash)g(as)h(a)f(prompt) 150 2620 y(c)m(haracter)g(for)e(the)g(con)m(tin)m(uation)i(line.)44 b(All)31 b(of)h(this)f(applies)g(to)h(data)g(lines)f(read)g(with)g Fk(READWORD)e Fs(or)150 2730 y Fk(READLIST)f Fs(as)j(w)m(ell)g(as)g(to) g(instruction)f(lines.)150 2897 y(A)h(line)h(read)e(with)h Fk(READRAWLINE)d Fs(has)j(no)g(sp)s(ecial)g(quoting)h(mec)m(hanism;)g (b)s(oth)e(bac)m(kslash)i(and)e(v)m(er-)150 3007 y(tical)i(bar)e (\(describ)s(ed)g(b)s(elo)m(w\))g(are)h(just)f(ordinary)g(c)m (haracters.)150 3175 y(An)h(alternativ)m(e)k(notation)e(to)f(include)g (otherwise)g(delimiting)g(c)m(haracters)i(in)d(w)m(ords)g(is)h(to)h (enclose)g(a)150 3284 y(group)h(of)g(c)m(haracters)h(in)f(v)m(ertical)i (bars.)51 b(All)35 b(c)m(haracters)h(b)s(et)m(w)m(een)e(v)m(ertical)j (bars)c(are)i(treated)g(as)f(if)150 3394 y(they)23 b(w)m(ere)g (letters.)39 b(In)22 b(data)h(read)g(with)f Fk(READWORD)e Fs(the)j(v)m(ertical)i(bars)d(are)h(preserv)m(ed)f(in)g(the)h (resulting)150 3504 y(w)m(ord.)45 b(In)31 b(data)i(read)e(with)h Fk(READLIST)e Fs(\(or)i(resulting)g(from)f(a)i Fk(PARSE)d Fs(or)i Fk(RUNPARSE)e Fs(of)i(a)g(w)m(ord\))g(the)150 3613 y(v)m(ertical)25 b(bars)e(do)g(not)g(app)s(ear)g(explicitly;)k (all)d(p)s(oten)m(tially)h(delimiting)f(c)m(haracters)g(\(including)f (spaces,)150 3723 y(brac)m(k)m(ets,)30 b(paren)m(theses,)e(and)f (in\014x)g(op)s(erators\))h(app)s(ear)f(unmark)m(ed,)g(but)g(tok)m (enized)i(as)f(though)f(they)150 3832 y(w)m(ere)39 b(letters.)66 b(Within)39 b(v)m(ertical)i(bars,)f(bac)m(kslash)f(ma)m(y)g(still)g(b)s (e)f(used;)k(the)d(only)f(c)m(haracters)i(that)150 3942 y(m)m(ust)30 b(b)s(e)g(bac)m(kslashed)h(in)f(this)g(con)m(text)j(are)d (bac)m(kslash)h(and)f(v)m(ertical)j(bar)c(themselv)m(es.)150 4110 y(Characters)c(en)m(tered)f(b)s(et)m(w)m(een)h(v)m(ertical)i(bars) c(are)i(forev)m(er)g(sp)s(ecial,)h(ev)m(en)f(if)g(the)f(w)m(ord)g(or)g (list)h(con)m(tain-)150 4219 y(ing)k(them)g(is)g(later)h(reparsed)e (with)g Fk(PARSE)g Fs(or)h Fk(RUNPARSE)p Fs(.)38 b(Characters)29 b(t)m(yp)s(ed)f(after)i(a)f(bac)m(kslash)h(are)150 4329 y(treated)36 b(somewhat)g(di\013eren)m(tly:)50 b(When)35 b(a)h(quoted)f(w)m(ord)g(con)m(taining)h(a)g(bac)m(kslashed)f(c)m (haracter)i(is)150 4438 y(runparsed,)26 b(the)h(bac)m(kslashed)h(c)m (haracter)g(loses)g(its)g(sp)s(ecial)f(qualit)m(y)i(and)d(acts)i (thereafter)g(as)f(if)g(t)m(yp)s(ed)150 4548 y(normally)-8 b(.)56 b(This)35 b(distinction)h(is)f(imp)s(ortan)m(t)h(only)f(if)h(y)m (ou)f(are)h(building)f(a)h(Logo)g(expression)f(out)h(of)150 4658 y(parts,)30 b(to)h(b)s(e)f Fk(RUN)g Fs(later,)h(and)f(w)m(an)m(t)h (to)g(use)f(paren)m(theses.)41 b(F)-8 b(or)32 b(example,)390 4825 y Fk(PRINT)46 b(RUN)h(\(SE)g("\\\()g(2)h("+)f(3)g("\\\)\))150 4993 y Fs(will)31 b(prin)m(t)f(5,)h(but)390 5161 y Fk(RUN)47 b(\(SE)g("MAKE)f(""|\(|)h(2\))p eop end %%Page: 8 21 TeXDict begin 8 20 bop 150 -116 a Fs(8)2596 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(will)h(create)h(a)e(v)-5 b(ariable)31 b(whose)g(name)f(is)g(op)s(en-paren)m(thesis.)41 b(\(Eac)m(h)31 b(example)g(w)m(ould)f(fail)i(if)e(v)m(ertical)150 408 y(bars)g(and)f(bac)m(kslashes)j(w)m(ere)f(in)m(terc)m(hanged.\))150 576 y(A)23 b(normally)f(delimiting)i(c)m(haracter)g(en)m(tered)f (within)f(v)m(ertical)j(bars)d(is)g Fk(EQUALP)f Fs(to)j(the)e(same)h(c) m(haracter)150 686 y(without)32 b(the)h(v)m(ertical)h(bars,)f(but)f (can)g(b)s(e)g(distinguished)g(b)m(y)g(the)h Fk(VBARREDP)d Fs(predicate.)47 b(\(Ho)m(w)m(ev)m(er,)150 795 y Fk(VBARREDP)27 b Fs(returns)h Fk(TRUE)g Fs(only)h(for)g(c)m(haracters)i(for)e(whic)m (h)g(sp)s(ecial)h(treatmen)m(t)h(is)e(necessary:)41 b(white-)150 905 y(space,)34 b(paren)m(theses,)f(brac)m(k)m(ets,)i(in\014x)c(op)s (erators,)i(bac)m(kslash,)h(v)m(ertical)h(bar,)d(tilde,)i(quote,)g (question)150 1015 y(mark,)c(colon,)i(and)e(semicolon.\))p eop end %%Page: 9 22 TeXDict begin 9 21 bop 3705 -116 a Fs(9)150 299 y Fp(2)80 b(Data)55 b(Structure)c(Primitiv)l(es)150 633 y Fr(2.1)68 b(Constructors)150 822 y Fh(w)m(ord)390 969 y Fk(WORD)47 b(word1)f(word2)390 1079 y(\(WORD)g(word1)h(word2)f(word3)g(...\))150 1246 y Fs(outputs)30 b(a)h(w)m(ord)f(formed)f(b)m(y)i(concatenating)h (its)f(inputs.)150 1444 y Fh(list)390 1591 y Fk(LIST)47 b(thing1)f(thing2)390 1700 y(\(LIST)g(thing1)g(thing2)h(thing3)f(...\)) 150 1868 y Fs(outputs)31 b(a)i(list)f(whose)g(mem)m(b)s(ers)f(are)h (its)h(inputs,)e(whic)m(h)h(can)g(b)s(e)f(an)m(y)i(Logo)g(datum)e(\(w)m (ord,)i(list,)g(or)150 1977 y(arra)m(y\).)150 2175 y Fh(sen)m(tence)390 2322 y Fk(SENTENCE)46 b(thing1)g(thing2)390 2431 y(SE)h(thing1)f(thing2)390 2541 y(\(SENTENCE)f(thing1)h(thing2)g (thing3)h(...\))390 2650 y(\(SE)g(thing1)f(thing2)g(thing3)g(...\))150 2818 y Fs(outputs)33 b(a)h(list)h(whose)e(mem)m(b)s(ers)g(are)h(its)g (inputs,)g(if)g(those)g(inputs)f(are)h(not)g(lists,)h(or)f(the)g(mem)m (b)s(ers)150 2928 y(of)d(its)f(inputs,)g(if)g(those)h(inputs)e(are)i (lists.)150 3125 y Fh(fput)390 3272 y Fk(FPUT)47 b(thing)f(list)150 3440 y Fs(outputs)c(a)g(list)h(equal)f(to)h(its)f(second)h(input)e (with)g(one)i(extra)g(mem)m(b)s(er,)h(the)e(\014rst)g(input,)i(at)f (the)150 3549 y(b)s(eginning.)56 b(If)36 b(the)g(second)g(input)f(is)g (a)i(w)m(ord,)g(then)e(the)h(\014rst)f(input)g(m)m(ust)h(b)s(e)f(a)h (one-letter)i(w)m(ord,)150 3659 y(and)30 b(FPUT)g(is)h(equiv)-5 b(alen)m(t)31 b(to)g(W)m(ORD.)150 3856 y Fh(lput)390 4003 y Fk(LPUT)47 b(thing)f(list)150 4171 y Fs(outputs)30 b(a)g(list)h(equal)f(to)h(its)g(second)f(input)f(with)h(one)g(extra)h (mem)m(b)s(er,)f(the)g(\014rst)g(input,)f(at)i(the)f(end.)150 4280 y(If)g(the)h(second)f(input)f(is)i(a)g(w)m(ord,)f(then)g(the)h (\014rst)e(input)h(m)m(ust)g(b)s(e)g(a)h(one-letter)h(w)m(ord,)e(and)g (LPUT)g(is)150 4390 y(equiv)-5 b(alen)m(t)32 b(to)f(W)m(ORD)g(with)f (its)h(inputs)e(in)h(the)h(other)g(order.)150 4587 y Fh(arra)m(y)390 4734 y Fk(ARRAY)46 b(size)390 4844 y(\(ARRAY)g(size)h (origin\))150 5011 y Fs(outputs)29 b(an)g(arra)m(y)i(of)e Fl(size)36 b Fs(mem)m(b)s(ers)29 b(\(m)m(ust)g(b)s(e)g(a)h(p)s(ositiv)m (e)h(in)m(teger\),)h(eac)m(h)e(of)g(whic)m(h)f(initially)i(is)f(an)150 5121 y(empt)m(y)d(list.)40 b(Arra)m(y)27 b(mem)m(b)s(ers)f(can)h(b)s(e) f(selected)i(with)f Fk(ITEM)e Fs(and)h(c)m(hanged)i(with)e Fk(SETITEM)p Fs(.)37 b(The)27 b(\014rst)150 5230 y(mem)m(b)s(er)36 b(of)h(the)g(arra)m(y)h(is)e(mem)m(b)s(er)h(n)m(um)m(b)s(er)e(1)i (unless)f(an)h Fl(origin)g Fs(input)f(\(m)m(ust)h(b)s(e)g(an)f(in)m (teger\))j(is)150 5340 y(giv)m(en,)30 b(in)e(whic)m(h)h(case)g(the)g (\014rst)f(mem)m(b)s(er)g(of)g(the)h(arra)m(y)g(has)g(that)g(n)m(um)m (b)s(er)e(as)i(its)g(index.)39 b(\(T)m(ypically)p eop end %%Page: 10 23 TeXDict begin 10 22 bop 150 -116 a Fs(10)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(0)k(is)h(used)e(as)h(the)h(origin)f(if)g(an)m (ything.\))53 b(Arra)m(ys)34 b(are)h(prin)m(ted)e(b)m(y)h Fk(PRINT)f Fs(and)h(friends,)g(and)f(can)i(b)s(e)150 408 y(t)m(yp)s(ed)30 b(in,)g(inside)g(curly)g(braces;)h(indicate)h(an)e (origin)h(with)f Fk({a)47 b(b)h(c}@0)n Fs(.)150 576 y(See)31 b([ITEM],)f(page)h(12,)h(,)f([SETITEM],)e(page)i(12,)h(,)e([PRINT],)h (page)g(19,)h(.)150 762 y Fh(mdarra)m(y)390 909 y Fk(MDARRAY)46 b(sizelist)f(\(library)h(procedure\))390 1018 y(\(MDARRAY)g(sizelist)f (origin\))150 1186 y Fs(outputs)26 b(a)h(m)m(ulti-dimensional)g(arra)m (y)-8 b(.)40 b(The)26 b(\014rst)g(input)f(m)m(ust)i(b)s(e)e(a)i(list)g (of)g(one)g(or)f(more)h(p)s(ositiv)m(e)g(in-)150 1295 y(tegers.)39 b(The)23 b(second)g(input,)h(if)f(presen)m(t,)i(m)m(ust)e (b)s(e)f(a)i(single)f(in)m(teger)i(that)f(applies)f(to)h(ev)m(ery)g (dimension)150 1405 y(of)31 b(the)f(arra)m(y)-8 b(.)150 1573 y(Ex:)36 b Fk(\(MDARRAY)45 b([3)i(5])h(0\))20 b Fs(outputs)g(a)h(t)m(w)m(o-dimensional)i(arra)m(y)e(whose)g(mem)m(b)s (ers)f(range)h(from)f Fk([0)48 b(0])150 1682 y Fs(to)31 b Fk([2)47 b(4])p Fs(.)150 1868 y Fh(listtoarra)m(y)390 2015 y Fk(LISTTOARRAY)e(list)390 2124 y(\(LISTTOARRAY)f(list)j (origin\))150 2292 y Fs(outputs)29 b(an)g(arra)m(y)g(of)g(the)h(same)f (size)h(as)f(the)h(input)e(list,)i(whose)f(mem)m(b)s(ers)f(are)i(the)f (mem)m(b)s(ers)f(of)i(the)150 2402 y(input)f(list.)150 2587 y Fh(arra)m(ytolist)390 2734 y Fk(ARRAYTOLIST)45 b(array)150 2902 y Fs(outputs)28 b(a)h(list)g(whose)f(mem)m(b)s(ers)g (are)h(the)g(mem)m(b)s(ers)e(of)i(the)g(input)e(arra)m(y)-8 b(.)41 b(The)28 b(\014rst)g(mem)m(b)s(er)g(of)h(the)150 3011 y(output)h(is)g(the)h(\014rst)f(mem)m(b)s(er)f(of)i(the)f(arra)m (y)-8 b(,)32 b(regardless)f(of)f(the)h(arra)m(y's)g(origin.)150 3197 y Fh(com)m(bine)390 3344 y Fk(COMBINE)46 b(thing1)g(thing2)g (\(library)g(procedure\))150 3511 y Fs(if)66 b Fl(thing2)74 b Fs(is)67 b(a)f(w)m(ord,)76 b(outputs)66 b Fk(WORD)46 b(thing1)g(thing2)o Fs(.)148 b(If)66 b Fl(thing2)74 b Fs(is)66 b(a)h(list,)76 b(outputs)150 3621 y Fk(FPUT)47 b(thing1)f(thing2)n Fs(.)150 3789 y(See)31 b([W)m(ORD],)h(page)f(9,)g (,)f([FPUT],)h(page)h(9,)150 3974 y Fh(rev)m(erse)390 4121 y Fk(REVERSE)46 b(list)g(\(library)g(procedure\))150 4289 y Fs(outputs)30 b(a)h(list)g(whose)f(mem)m(b)s(ers)f(are)i(the)g (mem)m(b)s(ers)e(of)i(the)f(input)g(list,)h(in)f(rev)m(erse)h(order.) 150 4474 y Fh(gensym)390 4621 y Fk(GENSYM)46 b(\(library)g(procedure\)) 150 4789 y Fs(outputs)30 b(a)h(unique)e(w)m(ord)h(eac)m(h)i(time)f (it's)g(in)m(v)m(ok)m(ed.)42 b(The)30 b(w)m(ords)g(are)g(of)h(the)f (form)g Fk(G1)p Fs(,)g Fk(G2)p Fs(,)g(etc.)150 5016 y Fr(2.2)68 b(Data)46 b(Selectors)150 5193 y Fh(\014rst)390 5340 y Fk(FIRST)g(thing)p eop end %%Page: 11 24 TeXDict begin 11 23 bop 150 -116 a Fs(Chapter)30 b(2:)41 b(Data)32 b(Structure)d(Primitiv)m(es)2009 b(11)150 299 y(if)28 b(the)h(input)f(is)g(a)h(w)m(ord,)g(outputs)f(the)h(\014rst)f (c)m(haracter)i(of)e(the)h(w)m(ord.)40 b(If)28 b(the)h(input)e(is)i(a)g (list,)g(outputs)150 408 y(the)k(\014rst)f(mem)m(b)s(er)g(of)h(the)g (list.)48 b(If)33 b(the)g(input)f(is)g(an)h(arra)m(y)-8 b(,)34 b(outputs)f(the)g(origin)g(of)g(the)g(arra)m(y)g(\(that)150 518 y(is,)e(the)f Fg(index)j(of)50 b Fs(the)31 b(\014rst)e(mem)m(b)s (er)h(of)h(the)f(arra)m(y\).)150 761 y Fh(\014rsts)390 908 y Fk(FIRSTS)46 b(list)150 1076 y Fs(outputs)33 b(a)h(list)g(con)m (taining)h(the)e Fk(FIRST)f Fs(of)i(eac)m(h)g(mem)m(b)s(er)f(of)h(the)f (input)g(list.)50 b(It)34 b(is)f(an)g(error)g(if)h(an)m(y)150 1185 y(mem)m(b)s(er)25 b(of)g(the)g(input)f(list)i(is)f(empt)m(y)-8 b(.)40 b(\(The)25 b(input)f(itself)i(ma)m(y)g(b)s(e)f(empt)m(y)-8 b(,)27 b(in)e(whic)m(h)g(case)h(the)f(output)150 1295 y(is)30 b(also)i(empt)m(y)-8 b(.\))42 b(This)29 b(could)i(b)s(e)e (written)i(as)390 1462 y Fk(to)47 b(firsts)f(:list)390 1572 y(output)g(map)h("first)f(:list)390 1682 y(end)150 1849 y Fs(but)37 b(is)h(pro)m(vided)f(as)h(a)g(primitiv)m(e)h(in)e (order)h(to)g(sp)s(eed)f(up)g(the)h(iteration)h(to)s(ols)f Fk(MAP)p Fs(,)h Fk(MAP.SE)p Fs(,)g(and)150 1959 y Fk(FOREACH)p Fs(.)390 2127 y Fk(to)47 b(transpose)e(:matrix)390 2236 y(if)i(emptyp)f(first)h(:matrix)e([op)i([]])390 2346 y(op)g(fput)g(firsts)f(:matrix)g(transpose)f(bfs)i(:matrix)390 2455 y(end)150 2623 y Fs(See)31 b([MAP],)g(page)g(77,)h(,)e([MAPdSE],)h (page)g(77,)g(,)g([F)m(OREA)m(CH],)h(page)f(76,)150 2866 y Fh(last)390 3013 y Fk(LAST)47 b(wordorlist)150 3181 y Fs(if)29 b(the)h(input)e(is)i(a)g(w)m(ord,)f(outputs)g(the)g(last)i (c)m(haracter)g(of)e(the)h(w)m(ord.)40 b(If)29 b(the)g(input)g(is)g(a)h (list,)g(outputs)150 3290 y(the)h(last)g(mem)m(b)s(er)f(of)g(the)h (list.)150 3533 y Fh(but\014rst)390 3680 y Fk(BUTFIRST)46 b(wordorlist)390 3790 y(BF)h(wordorlist)150 3957 y Fs(if)30 b(the)g(input)f(is)h(a)g(w)m(ord,)g(outputs)f(a)h(w)m(ord)g(con)m (taining)h(all)g(but)e(the)h(\014rst)f(c)m(haracter)j(of)e(the)g (input.)39 b(If)150 4067 y(the)31 b(input)e(is)h(a)h(list,)g(outputs)f (a)h(list)g(con)m(taining)h(all)f(but)f(the)g(\014rst)g(mem)m(b)s(er)g (of)g(the)h(input.)150 4310 y Fh(but\014rsts)390 4457 y Fk(BUTFIRSTS)45 b(list)390 4566 y(BFS)i(list)150 4734 y Fs(outputs)25 b(a)h(list)g(con)m(taining)h(the)f Fk(BUTFIRST)e Fs(of)h(eac)m(h)i(mem)m(b)s(er)e(of)h(the)g(input)e(list.)40 b(It)26 b(is)f(an)h(error)f(if)h(an)m(y)150 4844 y(mem)m(b)s(er)34 b(of)h(the)g(input)f(list)i(is)f(empt)m(y)g(or)g(an)g(arra)m(y)-8 b(.)55 b(\(The)35 b(input)f(itself)i(ma)m(y)f(b)s(e)f(empt)m(y)-8 b(,)38 b(in)c(whic)m(h)150 4953 y(case)d(the)g(output)f(is)g(also)i (empt)m(y)-8 b(.\))42 b(This)29 b(could)i(b)s(e)e(written)i(as)390 5121 y Fk(to)47 b(butfirsts)e(:list)390 5230 y(output)h(map)h ("butfirst)e(:list)390 5340 y(end)p eop end %%Page: 12 25 TeXDict begin 12 24 bop 150 -116 a Fs(12)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(but)37 b(is)h(pro)m(vided)f(as)h(a)g(primitiv)m (e)h(in)e(order)h(to)g(sp)s(eed)f(up)g(the)h(iteration)h(to)s(ols)f Fk(MAP)p Fs(,)h Fk(MAP.SE)p Fs(,)g(and)150 408 y Fk(FOREACH)p Fs(.)150 576 y(See)31 b([MAP],)g(page)g(77,)h(,)e([MAPdSE],)h(page)g (77,)g(,)g([F)m(OREA)m(CH],)h(page)f(76,)150 768 y Fh(butlast)390 915 y Fk(BUTLAST)46 b(wordorlist)390 1024 y(BL)h(wordorlist)150 1192 y Fs(if)31 b(the)g(input)e(is)i(a)g(w)m(ord,)g(outputs)f(a)h(w)m (ord)f(con)m(taining)j(all)e(but)f(the)h(last)h(c)m(haracter)g(of)f (the)g(input.)40 b(If)150 1302 y(the)31 b(input)e(is)h(a)h(list,)g (outputs)f(a)h(list)g(con)m(taining)h(all)f(but)f(the)g(last)i(mem)m(b) s(er)d(of)i(the)g(input.)150 1493 y Fh(item)390 1640 y Fk(ITEM)47 b(index)f(thing)150 1808 y Fs(if)38 b(the)f Fl(thing)46 b Fs(is)37 b(a)h(w)m(ord,)h(outputs)f(the)f Fl(index)6 b Fs(th)38 b(c)m(haracter)h(of)e(the)h(w)m(ord.)62 b(If)37 b(the)h Fl(thing)45 b Fs(is)38 b(a)g(list,)150 1917 y(outputs)k(the)h Fl(index)6 b Fs(th)43 b(mem)m(b)s(er)f(of)h(the) f(list.)79 b(If)42 b(the)h Fl(thing)51 b Fs(is)42 b(an)h(arra)m(y)-8 b(,)47 b(outputs)42 b(the)h Fl(index)6 b Fs(th)150 2027 y(mem)m(b)s(er)28 b(of)g(the)h(arra)m(y)-8 b(.)41 b Fl(Index)34 b Fs(starts)29 b(at)g(1)g(for)f(w)m(ords)g(and)f(lists;)j(the)f (starting)g(index)f(of)h(an)f(arra)m(y)h(is)150 2136 y(sp)s(eci\014ed)h(when)f(the)i(arra)m(y)f(is)h(created.)150 2328 y Fh(mditem)390 2475 y Fk(MDITEM)46 b(indexlist)f(array)i (\(library)e(procedure\))150 2643 y Fs(outputs)25 b(the)h(mem)m(b)s(er) f(of)h(the)g(m)m(ultidimensional)g Fl(arra)m(y)34 b Fs(selected)27 b(b)m(y)f(the)g(list)g(of)g(n)m(um)m(b)s(ers)e Fl(indexlist)p Fs(.)150 2834 y Fh(pic)m(k)390 2981 y Fk(PICK)47 b(list)f(\(library)g (procedure\))150 3149 y Fs(outputs)30 b(a)h(randomly)e(c)m(hosen)i(mem) m(b)s(er)f(of)h(the)f(input)g(list.)150 3340 y Fh(remo)m(v)m(e)390 3487 y Fk(REMOVE)46 b(thing)g(list)h(\(library)f(procedure\))150 3655 y Fs(outputs)30 b(a)h(cop)m(y)g(of)f Fl(list)j Fs(with)d(ev)m(ery) h(mem)m(b)s(er)f(equal)h(to)g Fl(thing)38 b Fs(remo)m(v)m(ed.)150 3846 y Fh(remdup)390 3993 y Fk(REMDUP)46 b(list)h(\(library)e (procedure\))150 4161 y Fs(outputs)37 b(a)h(cop)m(y)g(of)g Fl(list)i Fs(with)e(duplicate)g(mem)m(b)s(ers)f(remo)m(v)m(ed.)63 b(If)37 b(t)m(w)m(o)i(or)e(more)h(mem)m(b)s(ers)f(of)h(the)150 4271 y(input)29 b(are)i(equal,)g(the)g(righ)m(tmost)g(of)g(those)g(mem) m(b)s(ers)e(is)i(the)f(one)h(that)g(remains)f(in)g(the)h(output.)150 4462 y Fh(quoted)390 4609 y Fk(QUOTED)46 b(thing)g(\(library)g (procedure\))150 4777 y Fs(outputs)30 b(its)h(input,)e(if)i(a)f(list;)i (outputs)d(its)i(input)f(with)g(a)h(quotation)g(mark)f(prep)s(ended,)f (if)h(a)h(w)m(ord.)150 5010 y Fr(2.3)68 b(Data)46 b(Mutators)150 5193 y Fh(setitem)390 5340 y Fk(SETITEM)g(index)g(array)h(value)p eop end %%Page: 13 26 TeXDict begin 13 25 bop 150 -116 a Fs(Chapter)30 b(2:)41 b(Data)32 b(Structure)d(Primitiv)m(es)2009 b(13)150 299 y(command.)58 b(Replaces)37 b(the)g Fl(index)6 b Fs(th)35 b(mem)m(b)s(er)h(of)g Fl(arra)m(y)45 b Fs(with)36 b(the)g(new)g Fl(v)-5 b(alue)p Fs(.)58 b(Ensures)35 b(that)i(the)150 408 y(resulting)30 b(arra)m(y)h(is)g(not)f(circular,)h(i.e.,)h Fl(v)-5 b(alue)36 b Fs(ma)m(y)31 b(not)g(b)s(e)e(a)i(list)g(or)g(arra)m (y)f(that)h(con)m(tains)h Fl(arra)m(y)p Fs(.)150 613 y Fh(mdsetitem)390 760 y Fk(MDSETITEM)45 b(indexlist)h(array)g(value)g (\(library)g(procedure\))150 927 y Fs(command.)40 b(Replaces)32 b(the)f(mem)m(b)s(er)e(of)i Fl(arra)m(y)39 b Fs(c)m(hosen)30 b(b)m(y)h Fl(indexlist)h Fs(with)e(the)h(new)f Fl(v)-5 b(alue)p Fs(.)150 1132 y Fh(.set\014rst)390 1279 y Fk(.SETFIRST)45 b(list)i(value)150 1446 y Fs(command.)40 b(Changes)31 b(the)f(\014rst)g(mem)m(b)s(er)g(of)g Fl(list)j Fs(to)e(b)s(e)f Fl(v)-5 b(alue)p Fs(.)150 1614 y(W)-10 b(ARNING:)31 b(Primitiv)m(es)f (whose)g(names)f(start)h(with)f(a)h(p)s(erio)s(d)f(are)g Fj(dangerous)p Fs(.)41 b(Their)29 b(use)g(b)m(y)g(non-)150 1724 y(exp)s(erts)39 b(is)h(not)g(recommended.)68 b(The)39 b(use)g(of)h Fk(.SETFIRST)d Fs(can)j(lead)g(to)g(circular)g(list)g (structures,)150 1833 y(whic)m(h)28 b(will)g(get)h(some)f(Logo)h (primitiv)m(es)f(in)m(to)h(in\014nite)f(lo)s(ops,)g(and)f(to)i(unexp)s (ected)e(c)m(hanges)i(to)g(other)150 1943 y(data)i(structures)f(that)h (share)f(storage)i(with)e(the)g(list)h(b)s(eing)f(mo)s(di\014ed.)150 2147 y Fh(.setbf)390 2294 y Fk(.SETBF)46 b(list)h(value)150 2462 y Fs(command.)40 b(Changes)31 b(the)f(but\014rst)f(of)i Fl(list)i Fs(to)e(b)s(e)f Fl(v)-5 b(alue)p Fs(.)150 2629 y(W)-10 b(ARNING:)46 b(Primitiv)m(es)f(whose)f(names)h(start)g(with)f (a)h(p)s(erio)s(d)e(are)h Fj(dangerous)p Fs(.)83 b(Their)44 b(use)g(b)m(y)150 2739 y(non-exp)s(erts)37 b(is)g(not)h(recommended.)61 b(The)37 b(use)g(of)g Fk(.SETBF)f Fs(can)i(lead)f(to)i(circular)e(list) h(structures,)150 2848 y(whic)m(h)33 b(will)i(get)f(some)h(Logo)g (primitiv)m(es)f(in)m(to)h(in\014nite)e(lo)s(ops;)j(unexp)s(ected)d(c)m (hanges)i(to)f(other)g(data)150 2958 y(structures)23 b(that)h(share)f(storage)i(with)e(the)h(list)g(b)s(eing)f(mo)s (di\014ed;)i(or)f(to)g(Logo)h(crashes)e(and)g(coredumps)150 3068 y(if)30 b(the)h(but\014rst)e(of)h(a)h(list)g(is)g(not)f(itself)h (a)g(list.)150 3272 y Fh(.setitem)390 3419 y Fk(.SETITEM)46 b(index)g(array)g(value)150 3587 y Fs(command.)54 b(Changes)34 b(the)h Fl(index)6 b Fs(th)35 b(mem)m(b)s(er)f(of)h Fl(arra)m(y)43 b Fs(to)36 b(b)s(e)e Fl(v)-5 b(alue)p Fs(,)37 b(lik)m(e)f Fk(SETITEM)p Fs(,)e(but)g(without)150 3696 y(c)m(hec)m(king)e(for)e (circularit)m(y)-8 b(.)150 3864 y(W)e(ARNING:)31 b(Primitiv)m(es)f (whose)g(names)f(start)h(with)f(a)h(p)s(erio)s(d)f(are)g Fj(dangerous)p Fs(.)41 b(Their)29 b(use)g(b)m(y)g(non-)150 3973 y(exp)s(erts)34 b(is)g(not)g(recommended.)51 b(The)33 b(use)h(of)g Fk(.SETITEM)e Fs(can)i(lead)g(to)h(circular)f(arra)m(ys,)i (whic)m(h)e(will)150 4083 y(get)e(some)e(Logo)i(primitiv)m(es)f(in)m (to)g(in\014nite)f(lo)s(ops.)150 4251 y(See)h([SETITEM],)e(page)j(12.) 150 4455 y Fh(push)390 4602 y Fk(PUSH)47 b(stackname)e(thing)h (\(library)g(procedure\))150 4770 y Fs(command.)67 b(Adds)38 b(the)i Fl(thing)47 b Fs(to)40 b(the)f(stac)m(k)i(that)f(is)f(the)h(v) -5 b(alue)40 b(of)f(the)g(v)-5 b(ariable)40 b(whose)g(name)f(is)150 4879 y Fl(stac)m(kname)p Fs(.)i(This)26 b(v)-5 b(ariable)27 b(m)m(ust)f(ha)m(v)m(e)h(a)g(list)g(as)g(its)g(v)-5 b(alue;)28 b(the)e(initial)i(v)-5 b(alue)27 b(should)e(b)s(e)h(the)h(empt)m(y)150 4989 y(list.)41 b(New)31 b(mem)m(b)s(ers)f(are)g(added)g(at)h(the)g (fron)m(t)f(of)h(the)f(list.)150 5193 y Fh(p)s(op)390 5340 y Fk(POP)47 b(stackname)e(\(library)h(procedure\))p eop end %%Page: 14 27 TeXDict begin 14 26 bop 150 -116 a Fs(14)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(outputs)39 b(the)h(most)g(recen)m(tly)h Fk(PUSH)p Fs(ed)d(mem)m(b)s(er)h(of)h(the)g(stac)m(k)h(that)f(is)g(the) f(v)-5 b(alue)41 b(of)e(the)h(v)-5 b(ariable)150 408 y(whose)30 b(name)h(is)f Fl(stac)m(kname)37 b Fs(and)30 b(remo)m(v)m(es)i(that)f(mem)m(b)s(er)e(from)h(the)h(stac)m(k.)150 608 y Fh(queue)390 755 y Fk(QUEUE)46 b(queuename)g(thing)g(\(library)g (procedure\))150 923 y Fs(command.)63 b(Adds)36 b(the)i Fl(thing)46 b Fs(to)38 b(the)g(queue)g(that)g(is)g(the)g(v)-5 b(alue)38 b(of)g(the)g(v)-5 b(ariable)39 b(whose)e(name)h(is)150 1033 y Fl(queuename)p Fs(.)h(This)23 b(v)-5 b(ariable)26 b(m)m(ust)e(ha)m(v)m(e)i(a)f(list)g(as)g(its)g(v)-5 b(alue;)27 b(the)e(initial)g(v)-5 b(alue)25 b(should)f(b)s(e)g(the)h(empt)m(y)150 1142 y(list.)41 b(New)31 b(mem)m(b)s(ers)f(are)g(added)g(at)h(the)g (bac)m(k)g(of)f(the)h(list.)150 1342 y Fh(dequeue)390 1489 y Fk(DEQUEUE)46 b(queuename)f(\(library)h(procedure\))150 1657 y Fs(outputs)37 b(the)i(least)g(recen)m(tly)g Fk(QUEUE)p Fs(d)d(mem)m(b)s(er)i(of)g(the)g(queue)g(that)g(is)g(the)g(v)-5 b(alue)39 b(of)f(the)g(v)-5 b(ariable)150 1766 y(whose)30 b(name)h(is)f Fl(queuename)35 b Fs(and)30 b(remo)m(v)m(es)i(that)f(mem) m(b)s(er)f(from)f(the)i(queue.)150 2008 y Fr(2.4)68 b(Predicates)150 2200 y Fh(w)m(ordp)390 2347 y Fk(WORDP)46 b(thing)390 2456 y(WORD?)g(thing)150 2624 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(the)h(input)e(is)i(a)g(w)m(ord,)f Fk(FALSE)f Fs(otherwise.)150 2824 y Fh(listp)390 2971 y Fk(LISTP)46 b(thing)390 3081 y(LIST?)g(thing)150 3248 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(the)h(input)e(is)i(a)g(list,)g Fk(FALSE)e Fs(otherwise.)150 3448 y Fh(arra)m(yp)390 3595 y Fk(ARRAYP)46 b(thing)390 3705 y(ARRAY?)g(thing)150 3872 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(the)h(input)e(is)i(an)f(arra)m(y)-8 b(,)32 b Fk(FALSE)d Fs(otherwise.)150 4072 y Fh(empt)m(yp)390 4219 y Fk(EMPTYP)46 b(thing)390 4329 y(EMPTY?)g(thing)150 4497 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(the)h(input)e(is)i(the)f(empt) m(y)h(w)m(ord)f(or)g(the)h(empt)m(y)g(list,)g Fk(FALSE)e Fs(otherwise.)150 4697 y Fh(equalp)390 4844 y Fk(EQUALP)46 b(thing1)g(thing2)390 4953 y(EQUAL?)g(thing1)g(thing2)390 5063 y(thing1)g(=)i(thing2)150 5230 y Fs(outputs)41 b Fk(TRUE)f Fs(if)i(the)f(inputs)g(are)g(equal,)k Fk(FALSE)40 b Fs(otherwise.)75 b(Tw)m(o)42 b(n)m(um)m(b)s(ers)e(are)h(equal)h(if)g (they)150 5340 y(ha)m(v)m(e)35 b(the)e(same)h(n)m(umeric)f(v)-5 b(alue.)50 b(Tw)m(o)33 b(non-n)m(umeric)g(w)m(ords)g(are)h(equal)g(if)f (they)g(con)m(tain)i(the)f(same)p eop end %%Page: 15 28 TeXDict begin 15 27 bop 150 -116 a Fs(Chapter)30 b(2:)41 b(Data)32 b(Structure)d(Primitiv)m(es)2009 b(15)150 299 y(c)m(haracters)39 b(in)e(the)g(same)h(order.)61 b(If)37 b(there)h(is)f(a)h(v)-5 b(ariable)38 b(named)f Fk(CASEIGNOREDP)d Fs(whose)j(v)-5 b(alue)38 b(is)150 408 y Fk(TRUE)p Fs(,)23 b(then)f(an)h(upp)s(er)d(case)k(letter)g(is)e(considered)h(the)f(same)h (as)g(the)g(corresp)s(onding)e(lo)m(w)m(er)j(case)f(letter.)150 518 y(\(This)33 b(is)h(the)g(case)h(b)m(y)e(default.\))51 b(Tw)m(o)34 b(lists)g(are)h(equal)f(if)f(their)h(mem)m(b)s(ers)f(are)h (equal.)51 b(An)34 b(arra)m(y)g(is)150 628 y(only)k(equal)h(to)f (itself;)43 b(t)m(w)m(o)d(separately)f(created)g(arra)m(ys)g(are)f(nev) m(er)g(equal)h(ev)m(en)g(if)f(their)g(mem)m(b)s(ers)150 737 y(are)e(equal.)57 b(\(It)36 b(is)g(imp)s(ortan)m(t)g(to)g(b)s(e)f (able)i(to)f(kno)m(w)g(if)f(t)m(w)m(o)i(expressions)f(ha)m(v)m(e)h(the) e(same)i(arra)m(y)f(as)150 847 y(their)c(v)-5 b(alue)33 b(b)s(ecause)g(arra)m(ys)f(are)h(m)m(utable;)i(if,)e(for)f(example,)i (t)m(w)m(o)f(v)-5 b(ariables)33 b(ha)m(v)m(e)h(the)f(same)f(arra)m(y) 150 956 y(as)f(their)f(v)-5 b(alues)31 b(then)f(p)s(erforming)f Fk(SETITEM)f Fs(on)j(one)f(of)h(them)f(will)h(also)g(c)m(hange)h(the)e (other.\))150 1124 y(See)h([CASEIGNOREDP],)f(page)h(89,)h(,)e ([SETITEM],)g(page)h(12,)150 1381 y Fh(notequalp)390 1528 y Fk(NOTEQUALP)45 b(thing1)h(thing2)390 1638 y(NOTEQUAL?)f(thing1) h(thing2)390 1748 y(thing1)g(<>)h(thing2)150 1915 y Fs(outputs)42 b Fk(FALSE)e Fs(if)i(the)g(inputs)f(are)i(equal,)j Fk(TRUE)41 b Fs(otherwise.)76 b(See)42 b Fk(EQUALP)e Fs(for)i(the)g(meaning)h(of) 150 2025 y(equalit)m(y)32 b(for)e(di\013eren)m(t)h(data)g(t)m(yp)s(es.) 150 2282 y Fh(b)s(eforep)390 2429 y Fk(BEFOREP)46 b(word1)g(word2)390 2539 y(BEFORE?)g(word1)g(word2)150 2707 y Fs(outputs)24 b Fk(TRUE)f Fs(if)i Fl(w)m(ord1)32 b Fs(comes)25 b(b)s(efore)f Fl(w)m(ord2)32 b Fs(in)24 b(ASCI)s(I)f(collating)k(sequence)e(\(for)g (w)m(ords)f(of)h(letters,)150 2816 y(in)31 b(alphab)s(etical)h (order\).)42 b(Case-sensitivit)m(y)33 b(is)d(determined)h(b)m(y)g(the)g (v)-5 b(alue)31 b(of)g Fk(CASEIGNOREDP)p Fs(.)39 b(Note)150 2926 y(that)29 b(if)f(the)g(inputs)f(are)h(n)m(um)m(b)s(ers,)f(the)i (result)f(ma)m(y)g(not)h(b)s(e)e(the)h(same)h(as)f(with)g Fk(LESSP)p Fs(;)f(for)h(example,)150 3035 y Fk(BEFOREP)46 b(3)h(12)30 b Fs(is)g(false)h(b)s(ecause)g(3)g(collates)h(after)f(1.) 150 3203 y(See)g([CASEIGNOREDP],)f(page)h(89,)h(,)e([LESSP],)g(page)h (32,)150 3460 y Fh(.eq)390 3607 y Fk(.EQ)47 b(thing1)f(thing2)150 3775 y Fs(outputs)30 b Fk(TRUE)g Fs(if)h(its)g(t)m(w)m(o)i(inputs)c (are)j(the)f(same)g(datum,)g(so)g(that)h(applying)f(a)g(m)m(utator)h (to)f(one)h(will)150 3885 y(c)m(hange)g(the)e(other)h(as)f(w)m(ell.)42 b(Outputs)29 b Fk(FALSE)g Fs(otherwise,)i(ev)m(en)g(if)f(the)h(inputs)e (are)i(equal)g(in)f(v)-5 b(alue.)150 4052 y(W)-10 b(ARNING:)31 b(Primitiv)m(es)f(whose)g(names)f(start)h(with)f(a)h(p)s(erio)s(d)f (are)g Fj(dangerous)p Fs(.)41 b(Their)29 b(use)g(b)m(y)g(non-)150 4162 y(exp)s(erts)40 b(is)h(not)g(recommended.)72 b(The)40 b(use)g(of)h(m)m(utators)h(can)f(lead)g(to)h(circular)f(data)g (structures,)150 4271 y(in\014nite)30 b(lo)s(ops,)h(or)f(Logo)i (crashes.)150 4529 y Fh(mem)m(b)s(erp)390 4676 y Fk(MEMBERP)46 b(thing1)g(thing2)390 4785 y(MEMBER?)g(thing1)g(thing2)150 4953 y Fs(if)25 b Fl(thing2)32 b Fs(is)24 b(a)h(list)h(or)e(an)h(arra)m (y)-8 b(,)26 b(outputs)e Fk(TRUE)g Fs(if)g Fl(thing1)33 b Fs(is)24 b Fk(EQUALP)f Fs(to)i(a)g(mem)m(b)s(er)f(of)h Fl(thing2)p Fs(,)h Fk(FALSE)150 5063 y Fs(otherwise.)42 b(If)30 b Fl(thing2)38 b Fs(is)31 b(a)g(w)m(ord,)f(outputs)g Fk(TRUE)g Fs(if)g Fl(thing1)39 b Fs(is)30 b(a)h(one-c)m(haracter)i(w)m (ord)d Fk(EQUALP)f Fs(to)j(a)150 5172 y(c)m(haracter)g(of)f Fl(thing2)p Fs(,)g Fk(FALSE)e Fs(otherwise.)150 5340 y(See)i([EQUALP],)f(page)h(14,)h(.)p eop end %%Page: 16 29 TeXDict begin 16 28 bop 150 -116 a Fs(16)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fh(substringp)390 446 y Fk(SUBSTRINGP)45 b(thing1)h(thing2)390 555 y(SUBSTRING?)f(thing1)h(thing2)150 723 y Fs(if)33 b Fl(thing1)40 b Fs(or)33 b Fl(thing2)41 b Fs(is)33 b(a)g(list)h(or)e(an)h(arra)m(y)-8 b(,)35 b(outputs)d Fk(FALSE)p Fs(.)47 b(If)33 b Fl(thing2)40 b Fs(is)33 b(a)g(w)m(ord,)h(outputs)e Fk(TRUE)150 833 y Fs(if)e Fl(thing1)38 b Fs(is)31 b Fk(EQUALP)d Fs(to)k(a)e(substring)g (of)g Fl(thing2)p Fs(,)h Fk(FALSE)e Fs(otherwise.)150 1000 y(See)i([EQUALP],)f(page)h(14,)h(.)150 1217 y Fh(n)m(um)m(b)s(erp) 390 1364 y Fk(NUMBERP)46 b(thing)390 1474 y(NUMBER?)g(thing)150 1641 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(the)h(input)e(is)i(a)g(n)m(um) m(b)s(er,)e Fk(FALSE)g Fs(otherwise.)150 1858 y Fh(vbarredp)390 2005 y Fk(VBARREDP)46 b(char)390 2114 y(VBARRED?)g(char)390 2224 y(BACKSLASHEDP)e(char)1479 b(\(library)45 b(procedure\))390 2334 y(BACKSLASHED?)f(char)1479 b(\(library)45 b(procedure\))150 2501 y Fs(outputs)25 b Fk(TRUE)g Fs(if)h(the)g(input)f(c)m(haracter)j (w)m(as)e(originally)h(en)m(tered)g(in)m(to)g(Logo)g(within)e(v)m (ertical)j(bars)e(\()p Fk(|)p Fs(\))150 2611 y(to)31 b(prev)m(en)m(t)f(its)h(usual)e(sp)s(ecial)i(syn)m(tactic)h(meaning,)e Fk(FALSE)f Fs(otherwise.)41 b(\(Outputs)29 b Fk(TRUE)g Fs(only)h(if)g(the)150 2721 y(c)m(haracter)i(is)e(a)h(bac)m(kslashed)g (space,)g(tab,)g(newline,)g(or)f(one)h(of)f Fk(\(\)[]+-*/=<>":;\\~?|)c Fs(\))150 2888 y(The)f(names)g Fk(BACKSLASHEDP)d Fs(and)j Fk(BACKSLASHED?)d Fs(are)j(included)g(in)g(the)g(Logo)i(library)d(for)h (bac)m(kw)m(ard)150 2998 y(compatibilit)m(y)k(with)d(the)h(former)f (names)g(of)h(this)f(primitiv)m(e,)j(although)e(it)g(do)s(es)f Fg(not)36 b Fs(output)26 b Fk(TRUE)f Fs(for)150 3107 y(c)m(haracters)32 b(originally)g(en)m(tered)f(with)f(bac)m(kslashes.) 150 3374 y Fr(2.5)68 b(Queries)150 3583 y Fh(coun)m(t)390 3729 y Fk(COUNT)46 b(thing)150 3897 y Fs(outputs)31 b(the)h(n)m(um)m(b) s(er)e(of)i(c)m(haracters)h(in)e(the)h(input,)f(if)h(the)g(input)f(is)g (a)h(w)m(ord;)g(outputs)f(the)h(n)m(um)m(b)s(er)150 4007 y(of)h(mem)m(b)s(ers)g(in)g(the)g(input,)g(if)h(it)f(is)h(a)f(list)h (or)f(an)g(arra)m(y)-8 b(.)51 b(\(F)-8 b(or)34 b(an)f(arra)m(y)-8 b(,)35 b(this)e(ma)m(y)h(or)f(ma)m(y)h(not)g(b)s(e)150 4116 y(the)d(index)f(of)g(the)h(last)g(mem)m(b)s(er,)f(dep)s(ending)f (on)h(the)h(arra)m(y's)g(origin.\))150 4333 y Fh(ascii)390 4480 y Fk(ASCII)46 b(char)150 4648 y Fs(outputs)32 b(the)h(in)m(teger)h (\(b)s(et)m(w)m(een)g(0)f(and)f(255\))i(that)f(represen)m(ts)g(the)f (input)g(c)m(haracter)i(in)f(the)f(ASCI)s(I)150 4757 y(co)s(de.)61 b(In)m(terprets)37 b(con)m(trol)h(c)m(haracters)h(as)e (represen)m(ting)h(vbarred)e(punctuation,)i(and)f(returns)f(the)150 4867 y(c)m(haracter)23 b(co)s(de)f(for)f(the)h(corresp)s(onding)e (punctuation)h(c)m(haracter)j(without)d(v)m(ertical)j(bars.)37 b(\(Compare)150 4976 y Fk(RAWASCII)p Fs(.\))150 5193 y Fh(ra)m(w)m(ascii)390 5340 y Fk(RAWASCII)46 b(char)p eop end %%Page: 17 30 TeXDict begin 17 29 bop 150 -116 a Fs(Chapter)30 b(2:)41 b(Data)32 b(Structure)d(Primitiv)m(es)2009 b(17)150 299 y(outputs)32 b(the)h(in)m(teger)h(\(b)s(et)m(w)m(een)g(0)f(and)f(255\)) i(that)f(represen)m(ts)g(the)f(input)g(c)m(haracter)i(in)f(the)f(ASCI)s (I)150 408 y(co)s(de.)40 b(In)m(terprets)29 b(con)m(trol)h(c)m (haracters)h(as)e(represen)m(ting)g(themselv)m(es.)41 b(T)-8 b(o)30 b(\014nd)d(out)i(the)g(ASCI)s(I)f(co)s(de)150 518 y(of)j(an)f(arbitrary)g(k)m(eystrok)m(e,)i(use)f Fk(RAWASCII)45 b(RC)p Fs(.)150 727 y Fh(c)m(har)390 874 y Fk(CHAR)i(int)150 1041 y Fs(outputs)24 b(the)h(c)m(haracter)i (represen)m(ted)e(in)f(the)h(ASCI)s(I)e(co)s(de)i(b)m(y)g(the)g(input,) g(whic)m(h)g(m)m(ust)g(b)s(e)f(an)h(in)m(teger)150 1151 y(b)s(et)m(w)m(een)31 b(0)g(and)f(255.)150 1319 y(See)h([ASCI)s(I],)e (page)i(16,)h(.)150 1527 y Fh(mem)m(b)s(er)390 1674 y Fk(MEMBER)46 b(thing1)g(thing2)150 1842 y Fs(if)28 b Fl(thing2)35 b Fs(is)28 b(a)h(w)m(ord)e(or)h(list)h(and)e(if)h Fk(MEMBERP)e Fs(with)h(these)i(inputs)e(w)m(ould)g(output)h Fk(TRUE)p Fs(,)f(outputs)h(the)150 1952 y(p)s(ortion)37 b(of)g Fl(thing2)45 b Fs(from)37 b(the)g(\014rst)g(instance)g(of)h Fl(thing1)45 b Fs(to)38 b(the)f(end.)60 b(If)37 b Fk(MEMBERP)e Fs(w)m(ould)i(output)150 2061 y Fk(FALSE)p Fs(,)f(outputs)e(the)i(empt) m(y)g(w)m(ord)f(or)h(list)g(according)g(to)g(the)g(t)m(yp)s(e)g(of)f Fl(thing2)p Fs(.)57 b(It)35 b(is)h(an)f(error)g(for)150 2171 y Fl(thing2)j Fs(to)31 b(b)s(e)f(an)g(arra)m(y)-8 b(.)150 2339 y(See)31 b([MEMBERP],)g(page)g(15,)h(.)150 2547 y Fh(lo)m(w)m(ercase)390 2694 y Fk(LOWERCASE)45 b(word)150 2862 y Fs(outputs)20 b(a)h(cop)m(y)g(of)f(the)h(input)e(w)m (ord,)j(but)e(with)g(all)h(upp)s(ercase)f(letters)h(c)m(hanged)g(to)g (the)g(corresp)s(onding)150 2972 y(lo)m(w)m(ercase)33 b(letter.)150 3180 y Fh(upp)s(ercase)390 3327 y Fk(UPPERCASE)45 b(word)150 3495 y Fs(outputs)21 b(a)i(cop)m(y)f(of)g(the)g(input)f(w)m (ord,)j(but)d(with)h(all)g(lo)m(w)m(ercase)j(letters)e(c)m(hanged)f(to) h(the)f(corresp)s(onding)150 3604 y(upp)s(ercase)29 b(letter.)150 3813 y Fh(standout)390 3960 y Fk(STANDOUT)46 b(thing)150 4128 y Fs(outputs)37 b(a)h(w)m(ord)g(that,)i(when)d(prin)m(ted,)j(will) e(app)s(ear)f(lik)m(e)i(the)f(input)f(but)g(displa)m(y)m(ed)i(in)e (standout)150 4237 y(mo)s(de)42 b(\(b)s(oldface,)k(rev)m(erse)d(video,) j(or)d(whatev)m(er)g(y)m(our)f(v)m(ersion)h(do)s(es)f(for)g (standout\).)77 b(The)42 b(w)m(ord)150 4347 y(con)m(tains)h(mac)m (hine-sp)s(eci\014c)g(magic)g(c)m(haracters)g(at)g(the)f(b)s(eginning)f (and)g(end;)47 b(in)41 b(b)s(et)m(w)m(een)i(is)f(the)150 4457 y(prin)m(ted)27 b(form)g(\(as)i(if)e(displa)m(y)m(ed)i(using)e Fk(TYPE)p Fs(\))g(of)g(the)h(input.)39 b(The)27 b(output)h(is)f(alw)m (a)m(ys)i(a)g(w)m(ord,)f(ev)m(en)g(if)150 4566 y(the)h(input)e(is)h(of) h(some)g(other)f(t)m(yp)s(e,)h(but)f(it)h(ma)m(y)g(include)f(spaces)h (and)e(other)i(formatting)g(c)m(haracters.)150 4676 y(Note:)41 b(a)30 b(w)m(ord)f(output)g(b)m(y)g Fk(STANDOUT)e Fs(while)i(Logo)h(is) g(running)d(on)i(one)h(mac)m(hine)g(will)f(probably)g(not)150 4785 y(ha)m(v)m(e)j(the)e(desired)g(e\013ect)i(if)e(prin)m(ted)g(on)g (another)h(t)m(yp)s(e)g(of)f(mac)m(hine.)150 4953 y(In)e(the)h(Macin)m (tosh)i(classic)f(v)m(ersion,)g(the)f(w)m(a)m(y)h(that)f(standout)g(w)m (orks)g(is)g(incompatible)h(with)e(the)h(use)150 5063 y(of)g(c)m(haracters)i(whose)d(ASCI)s(I)g(co)s(de)h(is)g(greater)h (than)f(127.)42 b(Therefore,)29 b(y)m(ou)g(ha)m(v)m(e)i(a)e(c)m(hoice)i (to)f(mak)m(e:)150 5172 y(The)g(instruction)390 5340 y Fk(CANINVERSE)45 b(0)p eop end %%Page: 18 31 TeXDict begin 18 30 bop 150 -116 a Fs(18)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(disables)g(standout,)h(but)f(enables)g(the)h (displa)m(y)f(of)h(ASCI)s(I)e(co)s(des)h(ab)s(o)m(v)m(e)i(127,)g(and)e (the)g(instruction)390 467 y Fk(CANINVERSE)45 b(1)150 634 y Fs(restores)28 b(the)f(default)h(situation)g(in)f(whic)m(h)g (standout)g(is)g(enabled)g(and)g(the)g(extra)h(graphic)f(c)m(haracters) 150 744 y(cannot)k(b)s(e)f(prin)m(ted.)150 943 y Fh(parse)390 1090 y Fk(PARSE)46 b(word)150 1258 y Fs(outputs)27 b(the)i(list)f(that) h(w)m(ould)f(result)g(if)f(the)i(input)e(w)m(ord)g(w)m(ere)i(en)m (tered)f(in)g(resp)s(onse)f(to)i(a)f Fk(READLIST)150 1367 y Fs(op)s(eration.)38 b(That)21 b(is,)i Fk(PARSE)46 b(READWORD)19 b Fs(has)h(the)h(same)h(v)-5 b(alue)21 b(as)g Fk(READLIST)e Fs(for)h(the)h(same)g(c)m(haracters)150 1477 y(read.)150 1645 y(See)31 b([READLIST],)f(page)h(20,)g(,)g([READ)m (W)m(ORD],)i(page)e(20,)150 1844 y Fh(runparse)390 1991 y Fk(RUNPARSE)46 b(wordorlist)150 2159 y Fs(outputs)34 b(the)h(list)h(that)g(w)m(ould)e(result)h(if)g(the)g(input)f(w)m(ord)h (or)g(list)g(w)m(ere)g(en)m(tered)h(as)f(an)g(instruction)150 2268 y(line;)27 b(c)m(haracters)g(suc)m(h)e(as)g(in\014x)f(op)s (erators)h(and)g(paren)m(theses)g(are)g(separate)h(mem)m(b)s(ers)f(of)g (the)g(output.)150 2378 y(Note)32 b(that)f(sublists)e(of)i(a)g (runparsed)d(list)j(are)g(not)f(themselv)m(es)i(runparsed.)p eop end %%Page: 19 32 TeXDict begin 19 31 bop 3659 -116 a Fs(19)150 299 y Fp(3)80 b(Comm)l(unication)150 635 y Fr(3.1)68 b(T)-11 b(ransmitters)150 795 y Fs(Note:)66 b(If)42 b(there)g(is)h(a)g(v)-5 b(ariable)43 b(named)f Fk(PRINTDEPTHLIMIT)c Fs(with)k(a)g(nonnegativ)m(e)i(in)m (teger)g(v)-5 b(alue,)150 904 y(then)32 b(complex)h(list)h(and)d(arra)m (y)i(structures)f(will)h(b)s(e)f(prin)m(ted)g(only)h(to)g(the)g(allo)m (w)m(ed)h(depth.)46 b(That)33 b(is,)150 1014 y(mem)m(b)s(ers)g(of)h (mem)m(b)s(ers)g(of...)52 b(of)34 b(mem)m(b)s(ers)g(will)g(b)s(e)f (allo)m(w)m(ed)j(only)e(so)h(far.)51 b(The)34 b(mem)m(b)s(ers)f (omitted)150 1123 y(b)s(ecause)k(they)g(are)g(just)g(past)g(the)g (depth)f(limit)i(are)f(indicated)h(b)m(y)f(an)g(ellipsis)g(for)g(eac)m (h)h(one,)h(so)f(a)150 1233 y(to)s(o-deep)31 b(list)g(of)g(t)m(w)m(o)g (mem)m(b)s(ers)f(will)h(prin)m(t)f(as)g Fk([...)47 b(...])o Fs(.)150 1401 y(If)30 b(there)h(is)g(a)g(v)-5 b(ariable)31 b(named)g Fk(PRINTWIDTHLIMIT)26 b Fs(with)k(a)i(nonnegativ)m(e)g(in)m (teger)g(v)-5 b(alue,)31 b(then)g(only)150 1510 y(the)g(\014rst)f(so)g (man)m(y)h(mem)m(b)s(ers)f(of)g(an)m(y)h(arra)m(y)g(or)g(list)g(will)g (b)s(e)f(prin)m(ted.)41 b(A)30 b(single)i(ellipsis)f(replaces)g(all)150 1620 y(missing)c(data)g(within)f(the)h(structure.)39 b(The)27 b(width)e(limit)j(also)g(applies)f(to)g(the)g(n)m(um)m(b)s(er) f(of)g(c)m(haracters)150 1730 y(prin)m(ted)k(in)g(a)h(w)m(ord,)g (except)h(that)f(a)g Fk(PRINTWIDTHLIMIT)26 b Fs(b)s(et)m(w)m(een)31 b(0)g(and)f(9)h(will)g(b)s(e)f(treated)i(as)f(if)f(it)150 1839 y(w)m(ere)h(10)h(when)e(applied)g(to)i(w)m(ords.)41 b(This)30 b(limit)i(applies)f(not)g(only)g(to)g(the)g(top-lev)m(el)i (prin)m(ted)d(datum)150 1949 y(but)g(to)h(an)m(y)f(substructures)f (within)h(it.)150 2116 y(See)h([PRINTDEPTHLIMIT],)f(page)h(90,)g(,)g ([PRINTWIDTHLIMIT],)f(page)h(90,)150 2284 y(If)c(there)i(is)f(a)g(v)-5 b(ariable)29 b(named)e Fk(FULLPRINTP)e Fs(whose)j(v)-5 b(alue)28 b(is)g Fk(TRUE)p Fs(,)g(then)g(w)m(ords)f(that)h(w)m(ere)h (created)150 2394 y(using)24 b(bac)m(kslash)i(or)e(v)m(ertical)j(bar)d (\(to)i(include)f(c)m(haracters)h(that)f(w)m(ould)g(otherwise)g(not)g (b)s(e)f(treated)i(as)150 2503 y(part)i(of)g(a)h(w)m(ord\))f(are)h (prin)m(ted)f(with)g(the)g(bac)m(kslashes)h(or)f(v)m(ertical)j(bars)c (sho)m(wn,)i(so)f(that)h(the)f(prin)m(ted)150 2613 y(result)g(could)g (b)s(e)g(re-read)g(b)m(y)g(Logo)h(to)g(pro)s(duce)e(the)i(same)f(v)-5 b(alue.)41 b(If)27 b Fk(FULLPRINTP)f Fs(is)i Fk(TRUE)f Fs(then)h(the)150 2722 y(empt)m(y)j(w)m(ord)f(\(ho)m(w)m(ev)m(er)i(it)f (w)m(as)g(created\))g(prin)m(ts)f(as)h Fk(||)p Fs(.)40 b(\(Otherwise)30 b(it)h(prin)m(ts)f(as)h(nothing)f(at)h(all.\))150 2890 y(See)g([FULLPRINTP],)f(page)h(90,)h(.)150 3088 y Fh(prin)m(t)390 3235 y Fk(PRINT)46 b(thing)390 3345 y(PR)h(thing)390 3454 y(\(PRINT)f(thing1)g(thing2)g(...\))390 3564 y(\(PR)h(thing1)f(thing2)g(...\))150 3732 y Fs(command.)40 b(Prin)m(ts)29 b(the)g(input)f(or)i(inputs)e(to)h(the)h(curren)m(t)f (write)g(stream)g(\(initially)i(the)f(screen\).)40 b(All)150 3841 y(the)35 b(inputs)e(are)i(prin)m(ted)g(on)f(a)h(single)g(line,)i (separated)e(b)m(y)f(spaces,)j(ending)d(with)g(a)h(newline.)54 b(If)34 b(an)150 3951 y(input)e(is)i(a)g(list,)h(square)e(brac)m(k)m (ets)i(are)f(not)f(prin)m(ted)g(around)g(it,)i(but)d(brac)m(k)m(ets)j (are)f(prin)m(ted)f(around)150 4060 y(sublists.)40 b(Braces)32 b(are)e(alw)m(a)m(ys)i(prin)m(ted)e(around)f(arra)m(ys.)150 4258 y Fh(t)m(yp)s(e)390 4405 y Fk(TYPE)47 b(thing)390 4515 y(\(TYPE)f(thing1)g(thing2)h(...\))150 4682 y Fs(command.)38 b(Prin)m(ts)24 b(the)h(input)e(or)h(inputs)f(lik)m(e)i Fk(PRINT)p Fs(,)g(except)g(that)f(no)g(newline)h(c)m(haracter)g(is)f (prin)m(ted)150 4792 y(at)30 b(the)f(end)g(and)f(m)m(ultiple)i(inputs)e (are)i(not)f(separated)h(b)m(y)f(spaces.)41 b(Note:)g(prin)m(ting)29 b(to)h(the)g(screen)f(is)150 4902 y(ordinarily)24 b Fl(line)h (bu\013ered)t Fs(;)h(that)f(is,)h(the)f(c)m(haracters)h(y)m(ou)f(prin)m (t)f(using)g Fk(TYPE)g Fs(will)g(not)h(actually)i(app)s(ear)150 5011 y(on)35 b(the)h(screen)f(un)m(til)g(either)h(a)g(newline)f(c)m (haracter)i(is)e(prin)m(ted)g(\(for)g(example,)j(b)m(y)d Fk(PRINT)f Fs(or)h Fk(SHOW)p Fs(\))150 5121 y(or)c(Logo)h(tries)f(to)h (read)f(from)f(the)h(k)m(eyb)s(oard)g(\(either)h(at)f(the)g(request)g (of)g(y)m(our)g(program)g(or)g(after)g(an)150 5230 y(instruction)39 b(prompt\).)65 b(This)38 b(bu\013ering)f(mak)m(es)j(the)f(program)f(m)m (uc)m(h)h(faster)g(than)f(it)i(w)m(ould)e(b)s(e)g(if)150 5340 y(eac)m(h)31 b(c)m(haracter)h(app)s(eared)e(immediately)-8 b(,)32 b(and)e(in)f(most)i(cases)g(the)f(e\013ect)i(is)e(not)h (disconcerting.)41 b(T)-8 b(o)p eop end %%Page: 20 33 TeXDict begin 20 32 bop 150 -116 a Fs(20)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(accommo)s(date)h(programs)e(that)h(do)f(a)g(lot) h(of)g(p)s(ositioned)f(text)h(displa)m(y)f(using)g Fk(TYPE)p Fs(,)g(Logo)h(will)f(force)150 408 y(prin)m(ting)39 b(whenev)m(er)f Fk(SETCURSOR)f Fs(is)h(in)m(v)m(ok)m(ed.)68 b(This)38 b(solv)m(es)i(most)f(bu\013ering)f(problems.)65 b(Still,)42 b(on)150 518 y(o)s(ccasion)30 b(y)m(ou)g(ma)m(y)g(\014nd)d(it)j (necessary)f(to)h(force)g(the)f(bu\013ered)f(c)m(haracters)j(to)f(b)s (e)e(prin)m(ted)h(explicitly;)150 628 y(this)40 b(can)g(b)s(e)f(done)h (using)f(the)h Fk(WAIT)e Fs(command.)69 b Fk(WAIT)47 b(0)39 b Fs(will)i(force)f(prin)m(ting)g(without)f(actually)150 737 y(w)m(aiting.)150 905 y(See)31 b([SETCURSOR],)e(page)i(26,)g(,)g ([W)-10 b(AIT],)31 b(page)g(71,)150 1105 y Fh(sho)m(w)390 1252 y Fk(SHOW)47 b(thing)390 1362 y(\(SHOW)f(thing1)g(thing2)h(...\)) 150 1530 y Fs(command.)39 b(Prin)m(ts)25 b(the)g(input)f(or)h(inputs)f (lik)m(e)i Fk(PRINT)p Fs(,)f(except)h(that)f(if)g(an)g(input)f(is)h(a)g (list)h(it)f(is)g(prin)m(ted)150 1639 y(inside)30 b(square)g(brac)m(k)m (ets.)150 1807 y(See)h([PRINT],)f(page)h(19,)h(.)150 2050 y Fr(3.2)68 b(Receiv)l(ers)150 2242 y Fh(readlist)390 2389 y Fk(READLIST)390 2498 y(RL)150 2666 y Fs(reads)22 b(a)h(line)g(from)g(the)f(read)h(stream)g(\(initially)i(the)d(k)m(eyb)s (oard\))h(and)f(outputs)g(that)i(line)f(as)g(a)g(list.)38 b(The)150 2776 y(line)27 b(is)g(separated)g(in)m(to)h(mem)m(b)s(ers)e (as)h(though)f(it)i(w)m(ere)f(t)m(yp)s(ed)f(in)h(square)f(brac)m(k)m (ets)j(in)d(an)h(instruction.)150 2885 y(If)f(the)h(read)g(stream)g(is) f(a)h(\014le,)h(and)e(the)h(end)f(of)h(\014le)g(is)f(reac)m(hed,)j Fk(READLIST)24 b Fs(outputs)i(the)h(empt)m(y)g(w)m(ord)150 2995 y(\(not)g(the)f(empt)m(y)h(list\).)40 b Fk(READLIST)24 b Fs(pro)s(cesses)i(bac)m(kslash,)i(v)m(ertical)h(bar,)e(and)e(tilde)i (c)m(haracters)h(in)e(the)150 3104 y(read)32 b(stream;)i(the)f(output)f (list)h(will)g(not)f(con)m(tain)i(these)f(c)m(haracters)h(but)d(they)i (will)g(ha)m(v)m(e)g(had)f(their)150 3214 y(usual)e(e\013ect.)42 b Fk(READLIST)28 b Fs(do)s(es)i(not,)h(ho)m(w)m(ev)m(er,)h(treat)g (semicolon)f(as)g(a)g(commen)m(t)g(c)m(haracter.)150 3414 y Fh(readw)m(ord)390 3561 y Fk(READWORD)390 3671 y(RW)150 3839 y Fs(reads)h(a)h(line)g(from)f(the)g(read)g(stream)h(and) f(outputs)g(that)h(line)f(as)h(a)g(w)m(ord.)46 b(The)32 b(output)g(is)h(a)f(single)150 3948 y(w)m(ord)37 b(ev)m(en)h(if)g(the)g (line)f(con)m(tains)i(spaces,)h(brac)m(k)m(ets,)h(etc.)64 b(If)37 b(the)g(read)h(stream)g(is)f(a)h(\014le,)i(and)d(the)150 4058 y(end)e(of)h(\014le)g(is)g(reac)m(hed,)i Fk(READWORD)c Fs(outputs)h(the)h(empt)m(y)h(list)f(\(not)h(the)f(empt)m(y)g(w)m (ord\).)57 b Fk(READWORD)150 4167 y Fs(pro)s(cesses)37 b(bac)m(kslash,)j(v)m(ertical)g(bar,)e(and)f(tilde)h(c)m(haracters)h (in)e(the)g(read)g(stream.)62 b(In)37 b(the)g(case)i(of)150 4277 y(a)34 b(tilde)h(used)e(for)h(line)g(con)m(tin)m(uation,)k(the)c (output)f(w)m(ord)h Fg(do)-5 b(es)43 b Fs(include)33 b(the)i(tilde)f(and)g(the)g(newline)150 4387 y(c)m(haracters,)i(so)d (that)h(the)f(user)f(program)h(can)h(tell)g(exactly)h(what)e(the)g (user)g(en)m(tered.)49 b(V)-8 b(ertical)36 b(bars)150 4496 y(in)c(the)g(line)g(are)h(also)g(preserv)m(ed)e(in)h(the)g (output.)46 b(Bac)m(kslash)33 b(c)m(haracters)h(are)e(not)g(preserv)m (ed)g(in)g(the)150 4606 y(output.)150 4806 y Fh(readra)m(wline)390 4953 y Fk(READRAWLINE)150 5121 y Fs(reads)g(a)h(line)g(from)f(the)g (read)g(stream)h(and)f(outputs)g(that)h(line)f(as)h(a)g(w)m(ord.)46 b(The)32 b(output)g(is)h(a)f(single)150 5230 y(w)m(ord)c(ev)m(en)h(if)g (the)g(line)g(con)m(tains)g(spaces,)h(brac)m(k)m(ets,)h(etc.)41 b(If)28 b(the)h(read)f(stream)h(is)g(a)g(\014le,)g(and)f(the)h(end)150 5340 y(of)f(\014le)h(is)f(reac)m(hed,)i Fk(READRAWLINE)25 b Fs(outputs)j(the)g(empt)m(y)h(list)g(\(not)g(the)f(empt)m(y)h(w)m (ord\).)40 b Fk(READRAWLINE)p eop end %%Page: 21 34 TeXDict begin 21 33 bop 150 -116 a Fs(Chapter)30 b(3:)41 b(Comm)m(unication)2416 b(21)150 299 y(outputs)32 b(the)h(exact)h (string)f(of)g(c)m(haracters)h(as)f(they)g(app)s(ear)f(in)g(the)h (line,)h(with)f(no)f(sp)s(ecial)i(meaning)150 408 y(for)c(bac)m (kslash,)h(v)m(ertical)i(bar,)d(tilde,)h(or)g(an)m(y)f(other)h (formatting)g(c)m(haracters.)150 576 y(See)g([READ)m(W)m(ORD],)i(page)e (20,)g(.)150 803 y Fh(readc)m(har)390 950 y Fk(READCHAR)390 1059 y(RC)150 1227 y Fs(reads)f(a)g(single)h(c)m(haracter)g(from)f(the) g(read)g(stream)g(and)g(outputs)f(that)i(c)m(haracter)g(as)g(a)f(w)m (ord.)40 b(If)30 b(the)150 1337 y(read)25 b(stream)g(is)g(a)g(\014le,)h (and)e(the)h(end)f(of)h(\014le)g(is)g(reac)m(hed,)i Fk(READCHAR)22 b Fs(outputs)j(the)g(empt)m(y)g(list)g(\(not)h(the)150 1446 y(empt)m(y)34 b(w)m(ord\).)52 b(If)33 b(the)h(read)g(stream)g(is)g (the)g(k)m(eyb)s(oard,)h(ec)m(hoing)g(is)f(turned)f(o\013)h(when)f Fk(READCHAR)f Fs(is)150 1556 y(in)m(v)m(ok)m(ed,)26 b(and)d(remains)f (o\013)i(un)m(til)f Fk(READLIST)e Fs(or)i Fk(READWORD)d Fs(is)j(in)m(v)m(ok)m(ed)i(or)e(a)g(Logo)h(prompt)e(is)h(prin)m(ted.) 150 1665 y(Bac)m(kslash,)32 b(v)m(ertical)h(bar,)d(and)g(tilde)h(c)m (haracters)g(ha)m(v)m(e)h(no)e(sp)s(ecial)h(meaning)g(in)f(this)g(con)m (text.)150 1833 y(See)h([READLIST],)f(page)h(20,)g(.)150 2060 y Fh(readc)m(hars)390 2207 y Fk(READCHARS)45 b(num)390 2316 y(RCS)i(num)150 2484 y Fs(reads)40 b Fl(n)m(um)g Fs(c)m(haracters)i(from)e(the)h(read)f(stream)h(and)f(outputs)g(those)h (c)m(haracters)h(as)f(a)g(w)m(ord.)70 b(If)150 2594 y(the)33 b(read)h(stream)f(is)h(a)f(\014le,)i(and)d(the)i(end)e(of)i(\014le)f (is)h(reac)m(hed,)h Fk(READCHARS)30 b Fs(outputs)j(the)h(empt)m(y)f (list)150 2703 y(\(not)43 b(the)g(empt)m(y)g(w)m(ord\).)77 b(If)42 b(the)h(read)g(stream)g(is)f(the)h(k)m(eyb)s(oard,)j(ec)m (hoing)e(is)f(turned)e(o\013)i(when)150 2813 y Fk(READCHARS)35 b Fs(is)i(in)m(v)m(ok)m(ed,)j(and)c(remains)h(o\013)h(un)m(til)f Fk(READLIST)e Fs(or)i Fk(READWORD)e Fs(is)i(in)m(v)m(ok)m(ed)h(or)f(a)h (Logo)150 2922 y(prompt)29 b(is)g(prin)m(ted.)40 b(Bac)m(kslash,)32 b(v)m(ertical)g(bar,)d(and)g(tilde)i(c)m(haracters)g(ha)m(v)m(e)g(no)e (sp)s(ecial)h(meaning)g(in)150 3032 y(this)g(con)m(text.)150 3200 y(See)h([READLIST],)f(page)h(20,)g(,)g([READ)m(W)m(ORD],)i(page)e (20,)150 3426 y Fh(shell)390 3573 y Fk(SHELL)46 b(command)390 3683 y(\(SHELL)g(command)g(wordflag\))150 3851 y Fs(Under)31 b(Unix,)h(outputs)g(the)g(result)g(of)g(running)e Fl(command)35 b Fs(as)d(a)g(shell)g(command.)45 b(\(The)32 b(command)150 3960 y(is)e(sen)m(t)h(to)g(`)p Fk(/bin/sh)p Fs(',)e(not)h(`)p Fk(csh)p Fs(')g(or)g(other)g(alternativ)m(es.\))43 b(If)30 b(the)g(command)g(is)g(a)h(literal)g(list)g(in)f(the)150 4070 y(instruction)e(line,)h(and)e(if)h(y)m(ou)h(w)m(an)m(t)f(a)h(bac)m (kslash)f(c)m(haracter)i(sen)m(t)e(to)h(the)f(shell,)h(y)m(ou)f(m)m (ust)g(use)g Fk(\\\\)f Fs(to)150 4179 y(get)h(the)f(bac)m(kslash)h (through)e(Logo's)i(reader)f(in)m(tact.)41 b(The)27 b(output)f(is)h(a)g (list)h(con)m(taining)g(one)g(mem)m(b)s(er)150 4289 y(for)f(eac)m(h)i (line)f(generated)h(b)m(y)e(the)h(shell)g(command.)39 b(Ordinarily)27 b(eac)m(h)i(suc)m(h)e(line)h(is)g(represen)m(ted)f(b)m (y)h(a)150 4399 y(list)i(in)g(the)g(output,)g(as)g(though)f(the)h(line) g(w)m(ere)g(read)g(using)f Fk(READLIST)p Fs(.)39 b(If)29 b(a)h(second)g(input)f(is)h(giv)m(en,)150 4508 y(regardless)39 b(of)f(the)h(v)-5 b(alue)38 b(of)h(the)f(input,)i(eac)m(h)f(line)g(is)f (represen)m(ted)h(b)m(y)f(a)g(w)m(ord)g(in)g(the)h(output)f(as)150 4618 y(though)30 b(it)h(w)m(ere)g(read)f(with)g Fk(READWORD)p Fs(.)39 b(Example:)390 4785 y Fk(to)47 b(dayofweek)390 4895 y(output)f(first)g(first)h(shell)f([date])390 5005 y(end)150 5172 y Fs(This)26 b(is)i Fk(first)g(first)e Fs(to)i(extract)h(the)e(\014rst)f(w)m(ord)h(of)g(the)h(\014rst)e(\(and) h(only\))h(line)f(of)g(the)h(shell)f(output.)150 5340 y(Under)j(MacOS)g(X,)h Fk(SHELL)e Fs(w)m(orks)h(as)h(under)e(Unix.)40 b Fk(SHELL)29 b Fs(is)i(not)f(a)m(v)-5 b(ailable)33 b(under)c(Mac)i (Classic.)p eop end %%Page: 22 35 TeXDict begin 22 34 bop 150 -116 a Fs(22)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(Under)f(DOS,)g Fk(SHELL)f Fs(is)i(a)g(command,)g (not)f(an)h(op)s(eration;)g(it)h(sends)d(its)i(input)f(to)h(a)g(DOS)f (command)150 408 y(pro)s(cessor)h(but)g(do)s(es)g(not)g(collect)j(the)e (result)f(of)h(the)f(command.)150 576 y(Under)d(Windo)m(ws,)i(the)g (wxWidgets)g(v)m(ersion)g(of)f(Logo)h(b)s(eha)m(v)m(es)g(as)g(under)d (Unix)j(\(except)g(that)g(DOS-)150 686 y(st)m(yle)43 b(commands)f(are)h(understo)s(o)s(d;)k(use)41 b Fk(dir)h Fs(rather)g(than)g Fk(ls)p Fs(\).)76 b(The)42 b(non-wxWidgets)g(v)m (ersion)150 795 y(b)s(eha)m(v)m(es)31 b(lik)m(e)h(the)e(DOS)g(v)m (ersion.)150 1050 y Fr(3.3)68 b(File)46 b(Access)150 1250 y Fh(setpre\014x)390 1397 y Fk(SETPREFIX)f(string)150 1565 y Fs(command.)38 b(Sets)23 b(a)h(pre\014x)e(that)i(will)g(b)s(e)e (used)h(as)g(the)h(implicit)g(b)s(eginning)e(of)i(\014lenames)f(in)g Fk(OPENREAD)p Fs(,)150 1675 y Fk(OPENWRITE)p Fs(,)g Fk(OPENAPPEND)p Fs(,)g Fk(OPENUPDATE)p Fs(,)g Fk(LOAD)p Fs(,)i(and)f Fk(SAVE)f Fs(commands.)39 b(Logo)25 b(will)g(put)f(the)g(appro-)150 1784 y(priate)33 b(separator)h(c)m(haracter)g(\(slash)f(for)g(Unix,)g (bac)m(kslash)h(for)e(DOS/Windo)m(ws,)i(colon)g(for)f(MacOS)150 1894 y(Classic\))f(b)s(et)m(w)m(een)f(the)g(pre\014x)e(and)h(the)h (\014lename)g(en)m(tered)g(b)m(y)g(the)g(user.)40 b(The)30 b(input)g(to)h Fk(SETPREFIX)150 2003 y Fs(m)m(ust)f(b)s(e)g(a)h(w)m (ord,)f(unless)g(it)h(is)f(the)h(empt)m(y)f(list,)i(to)f(indicate)g (that)g(there)g(should)e(b)s(e)h(no)g(pre\014x.)150 2171 y(See)50 b([OPENREAD],)g(page)h(22,)56 b(,)e(See)c([OPENWRITE],)g(page) h(22,)k(,)g(See)50 b([OPENAPPEND],)150 2281 y(page)31 b(23,)h(,)e(See)h([OPENUPD)m(A)-8 b(TE],)32 b(page)f(23,)g(,)g(See)f ([LO)m(AD],)i(page)f(63,)h(,)e(See)h([SA)-10 b(VE],)30 b(page)i(62,)f(.)150 2489 y Fh(pre\014x)390 2636 y Fk(PREFIX)150 2804 y Fs(outputs)f(the)g(curren)m(t)h(\014le)f(pre\014x,)g(or)g([])h (if)f(there)h(is)f(no)g(pre\014x.)150 2972 y(See)h([SETPREFIX],)f(page) h(22,)g(.)150 3180 y Fh(op)s(enread)390 3327 y Fk(OPENREAD)46 b(filename)150 3495 y Fs(command.)39 b(Op)s(ens)26 b(the)h(named)g (\014le)g(for)g(reading.)40 b(The)26 b(read)h(p)s(osition)h(is)f (initially)h(at)g(the)g(b)s(eginning)150 3605 y(of)j(the)f(\014le.)150 3813 y Fh(op)s(en)m(write)390 3960 y Fk(OPENWRITE)45 b(filename)150 4128 y Fs(command.)50 b(Op)s(ens)32 b(the)i(named)f (\014le)h(for)f(writing.)50 b(If)33 b(the)h(\014le)g(already)g (existed,)h(the)f(old)g(v)m(ersion)g(is)150 4237 y(deleted)d(and)f(a)h (new,)f(empt)m(y)h(\014le)f(created.)150 4405 y Fk(OPENWRITE)p Fs(,)41 b(but)g(not)g(the)g(other)g Fk(OPEN)f Fs(v)-5 b(arian)m(ts,)45 b(will)c(accept)i(as)e(input)f(a)h(t)m(w)m(o-elemen)m (t)k(list,)f(in)150 4515 y(whic)m(h)26 b(the)h(\014rst)f(elemen)m(t)j (m)m(ust)d(b)s(e)g(a)i(v)-5 b(ariable)27 b(name,)h(and)e(the)h(second)g (m)m(ust)f(b)s(e)g(a)i(p)s(ositiv)m(e)f(in)m(teger.)150 4624 y(A)i(c)m(haracter)i(bu\013er)d(of)h(the)g(sp)s(eci\014ed)g(size)h (will)f(b)s(e)g(created.)41 b(When)29 b(a)g Fk(SETWRITE)e Fs(is)i(done)g(with)g(this)150 4734 y(same)i(list)g(\(in)f(the)h(sense) f(of)h(.EQ,)f(not)h(a)f(cop)m(y)-8 b(,)32 b(so)f(y)m(ou)g(m)m(ust)f(do) g(something)h(lik)m(e)390 4902 y Fk(?)47 b(make)g("buf)g([foo)f(100]) 390 5011 y(?)h(openwrite)f(:buf)390 5121 y(?)h(setwrite)f(:buf)581 5230 y([...])390 5340 y(?)h(close)g(:buf)p eop end %%Page: 23 36 TeXDict begin 23 35 bop 150 -116 a Fs(Chapter)30 b(3:)41 b(Comm)m(unication)2416 b(23)150 299 y(and)30 b(not)g(just)390 467 y Fk(?)47 b(openwrite)f([foo)g(100])390 576 y(?)h(setwrite)f([foo)h (100])150 744 y Fs(and)31 b(so)h(on\),)g(the)g(prin)m(ted)f(c)m (haracters)i(are)f(stored)g(in)f(the)h(bu\013er;)g(when)e(a)i Fk(CLOSE)e Fs(is)i(done)f(with)h(the)150 853 y(same)f(list)h(as)f (input,)f(the)h(c)m(haracters)h(from)e(the)h(bu\013er)f(\(treated)i(as) f(one)g(long)h(w)m(ord,)e(ev)m(en)i(if)f(spaces)150 963 y(and)f(newlines)g(are)h(included\))f(b)s(ecome)g(the)h(v)-5 b(alue)31 b(of)f(the)h(sp)s(eci\014ed)f(v)-5 b(ariable.)150 1167 y Fh(op)s(enapp)s(end)390 1314 y Fk(OPENAPPEND)45 b(filename)150 1482 y Fs(command.)40 b(Op)s(ens)29 b(the)i(named)e (\014le)i(for)f(writing.)40 b(If)30 b(the)g(\014le)h(already)g(exists,) g(the)f(write)h(p)s(osition)f(is)150 1592 y(initially)i(set)f(to)g(the) f(end)g(of)h(the)f(old)h(\014le,)g(so)f(that)h(newly)f(written)h(data)g (will)f(b)s(e)g(app)s(ended)f(to)i(it.)150 1796 y Fh(op)s(en)m(up)s (date)390 1943 y Fk(OPENUPDATE)45 b(filename)150 2110 y Fs(command.)54 b(Op)s(ens)33 b(the)i(named)f(\014le)h(for)g(reading)g (and)f(writing.)54 b(The)34 b(read)h(and)f(write)h(p)s(osition)g(is)150 2220 y(initially)j(set)e(to)h(the)f(end)g(of)g(the)g(old)g(\014le,)i (if)e(an)m(y)-8 b(.)59 b(Note:)53 b(eac)m(h)38 b(op)s(en)d(\014le)h (has)g(only)g(one)h(p)s(osition,)150 2330 y(for)29 b(b)s(oth)f(reading) h(and)f(writing.)40 b(If)29 b(a)g(\014le)g(op)s(ened)f(for)h(up)s(date) f(is)g(b)s(oth)h Fk(READER)e Fs(and)h Fk(WRITER)f Fs(at)j(the)150 2439 y(same)d(time,)h(then)d Fk(SETREADPOS)f Fs(will)i(also)h(a\013ect) h Fk(WRITEPOS)c Fs(and)i(vice)h(v)m(ersa.)40 b(Also,)28 b(if)e(y)m(ou)g(alternate)150 2549 y(reading)33 b(and)f(writing)h(the)h (same)f(\014le,)h(y)m(ou)f(m)m(ust)g Fk(SETREADPOS)d Fs(b)s(et)m(w)m(een)k(a)f(write)g(and)f(a)i(read,)g(and)150 2658 y Fk(SETWRITEPOS)27 b Fs(b)s(et)m(w)m(een)k(a)g(read)f(and)g(a)h (write.)150 2826 y(See)23 b([READER],)h(page)g(25,)h(,)g([WRITER],)e (page)h(25,)i(,)e([SETREADPOS],)f(page)g(25,)j(,)f([SETWRITE-)150 2936 y(POS],)30 b(page)h(25,)150 3140 y Fh(close)390 3287 y Fk(CLOSE)46 b(filename)150 3455 y Fs(command.)58 b(Closes)36 b(the)g(named)g(\014le.)58 b(If)35 b(the)i(\014le)f(w)m(as) g(curren)m(tly)g(the)g(reader)g(or)g(writer,)i(then)e(the)150 3564 y(reader)h(or)f(writer)h(is)f(c)m(hanged)h(to)h(the)f(k)m(eyb)s (oard)f(or)h(screen,)h(as)f(if)g Fk(SETREAD)45 b([])36 b Fs(or)h Fk(SETWRITE)46 b([])150 3674 y Fs(had)30 b(b)s(een)f(done.) 150 3878 y Fh(allop)s(en)390 4025 y Fk(ALLOPEN)150 4193 y Fs(outputs)j(a)i(list)f(whose)g(mem)m(b)s(ers)f(are)i(the)f(names)g (of)g(all)h(\014les)f(curren)m(tly)g(op)s(en.)47 b(This)32 b(list)i(do)s(es)f(not)150 4302 y(include)d(the)h(dribble)e(\014le,)i (if)f(an)m(y)-8 b(.)150 4506 y Fh(closeall)390 4653 y Fk(CLOSEALL)46 b(\(library)f(procedure\))150 4821 y Fs(command.)40 b(Closes)31 b(all)h(op)s(en)d(\014les.)41 b(Abbreviates)31 b Fk(FOREACH)46 b(ALLOPEN)f([CLOSE)h(?])150 4989 y Fs(See)31 b([F)m(OREA)m(CH],)g(page)h(76,)f(,)g([CLOSE],)e(page)i(23,)150 5193 y Fh(erase\014le)390 5340 y Fk(ERASEFILE)45 b(filename)p eop end %%Page: 24 37 TeXDict begin 24 36 bop 150 -116 a Fs(24)2551 b(BERKELEY)30 b(LOGO)g(6.1)390 299 y Fk(ERF)47 b(filename)150 467 y Fs(command.)40 b(Erases)31 b(\(deletes,)h(remo)m(v)m(es\))g(the)f (named)f(\014le,)g(whic)m(h)g(should)g(not)g(curren)m(tly)h(b)s(e)e(op) s(en.)150 655 y Fh(dribble)390 802 y Fk(DRIBBLE)46 b(filename)150 969 y Fs(command.)38 b(Creates)24 b(a)g(new)e(\014le)i(whose)f(name)g (is)g(the)h(input,)g(lik)m(e)g Fk(OPENWRITE)p Fs(,)f(and)f(b)s(egins)h (recording)150 1079 y(in)32 b(that)h(\014le)g(ev)m(erything)g(that)g (is)f(read)h(from)f(the)g(k)m(eyb)s(oard)g(or)h(written)f(to)h(the)g (terminal.)47 b(That)33 b(is,)150 1188 y(this)e(writing)h(is)f(in)g (addition)h(to)g(the)g(writing)f(to)h Fk(WRITER)p Fs(.)43 b(The)30 b(in)m(ten)m(t)j(is)f(to)g(create)h(a)f(transcript)f(of)150 1298 y(a)g(Logo)g(session,)g(including)f(things)g(lik)m(e)i(prompt)d(c) m(haracters)j(and)e(in)m(teractions.)150 1466 y(See)h([OPENWRITE],)f (page)h(22,)h(,)e([WRITER],)h(page)g(25,)150 1654 y Fh(no)s(dribble)390 1801 y Fk(NODRIBBLE)150 1968 y Fs(command.)40 b(Stops)30 b(cop)m(ying)i(information)e(in)m(to)i(the)e(dribble)g(\014le,)g(and)g (closes)i(the)e(\014le.)150 2156 y Fh(setread)390 2303 y Fk(SETREAD)46 b(filename)150 2471 y Fs(command.)56 b(Mak)m(es)37 b(the)f(named)f(\014le)h(the)g(read)f(stream,)j(used)c (for)i Fk(READLIST)p Fs(,)f(etc.)57 b(The)35 b(\014le)h(m)m(ust)150 2581 y(already)27 b(b)s(e)e(op)s(en)g(with)h Fk(OPENREAD)e Fs(or)i Fk(OPENUPDATE)p Fs(.)36 b(If)26 b(the)g(input)f(is)h(the)g (empt)m(y)g(list,)i(then)e(the)g(read)150 2690 y(stream)34 b(b)s(ecomes)g(the)g(k)m(eyb)s(oard,)h(as)f(usual.)50 b(Changing)34 b(the)g(read)f(stream)h(do)s(es)g(not)g(close)h(the)f (\014le)150 2800 y(that)d(w)m(as)g(previously)f(the)g(read)h(stream,)g (so)f(it)h(is)g(p)s(ossible)f(to)h(alternate)h(b)s(et)m(w)m(een)f (\014les.)150 2968 y(See)g([READLIST],)f(page)h(20,)g(,)g([OPENREAD],)g (page)g(22,)h(,)e([OPENUPD)m(A)-8 b(TE],)32 b(page)f(23,)150 3156 y Fh(set)m(write)390 3303 y Fk(SETWRITE)46 b(filename)150 3470 y Fs(command.)74 b(Mak)m(es)44 b(the)e(named)f(\014le)h(the)f (write)h(stream,)k(used)40 b(for)i Fk(PRINT)p Fs(,)h(etc.)76 b(The)41 b(\014le)h(m)m(ust)150 3580 y(already)36 b(b)s(e)e(op)s(en)g (with)h Fk(OPENWRITE)p Fs(,)f Fk(OPENAPPEND)p Fs(,)f(or)i Fk(OPENUPDATE)p Fs(.)52 b(If)34 b(the)h(input)f(is)h(the)h(empt)m(y)150 3689 y(list,)f(then)f(the)g(write)f(stream)h(b)s(ecomes)g(the)g (screen,)h(as)f(usual.)50 b(Changing)34 b(the)f(write)h(stream)g(do)s (es)150 3799 y(not)27 b(close)h(the)g(\014le)f(that)g(w)m(as)h (previously)e(the)h(write)h(stream,)g(so)f(it)g(is)g(p)s(ossible)g(to)h (alternate)g(b)s(et)m(w)m(een)150 3909 y(\014les.)150 4076 y(If)g(the)g(input)f(is)i(a)f(list,)i(then)d(its)i(\014rst)e (elemen)m(t)j(m)m(ust)e(b)s(e)g(a)g(v)-5 b(ariable)29 b(name,)g(and)f(its)g(second)h(and)e(last)150 4186 y(elemen)m(t)32 b(m)m(ust)f(b)s(e)f(a)h(p)s(ositiv)m(e)h(in)m(teger;)h(a)e(bu\013er)f (of)h(that)g(man)m(y)g(c)m(haracters)h(will)f(b)s(e)f(allo)s(cated,)k (and)150 4296 y(will)c(b)s(ecome)h(the)f(writestream.)41 b(If)29 b(the)i(same)f(list)h(\(same)f(in)g(the)g Fk(.EQ)f Fs(sense,)h(not)h(a)f(cop)m(y\))h(has)f(b)s(een)150 4405 y(used)g(as)i(input)e(to)i Fk(OPENWRITE)p Fs(,)d(then)i(the)g (already-allo)s(cated)j(bu\013er)c(will)i(b)s(e)e(used,)h(and)g(the)g (writer)150 4515 y(can)37 b(b)s(e)g(c)m(hanged)g(to)h(and)e(from)h (this)g(bu\013er,)h(with)e(all)i(the)f(c)m(haracters)i(accum)m(ulated)f (as)g(in)e(a)i(\014le.)150 4624 y(When)c(the)h(same)g(list)g(is)g(used) e(as)i(input)f(to)h Fk(CLOSE)p Fs(,)f(the)h(con)m(ten)m(ts)h(of)f(the)g (bu\013er)e(\(as)i(an)g(unparsed)150 4734 y(w)m(ord,)30 b(whic)m(h)g(ma)m(y)h(con)m(tain)g(newline)f(c)m(haracters\))i(will)f (b)s(ecome)f(the)h(v)-5 b(alue)30 b(of)h(the)f(named)g(v)-5 b(ariable.)150 4844 y(F)d(or)32 b(compatibilit)m(y)h(with)e(earlier)h (v)m(ersions,)f(if)g(the)h(list)f(has)g(not)g(b)s(een)g(op)s(ened)f (when)g(the)h Fk(SETWRITE)150 4953 y Fs(is)38 b(done,)i(it)e(will)g(b)s (e)f(op)s(ened)g(implicitly)-8 b(,)42 b(but)37 b(the)h(\014rst)f Fk(SETWRITE)e Fs(after)k(this)e(one)i(will)f(implicitly)150 5063 y(close)32 b(it,)f(setting)g(the)g(v)-5 b(ariable)31 b(and)f(freeing)h(the)f(allo)s(cated)i(bu\013er.)150 5230 y(See)22 b([PRINT],)f(page)h(19,)j(,)e([OPENWRITE],)f(page)g(22,)i (;)h([OPENAPPEND],)d(page)g(23,)i(;)h([OPENUP-)150 5340 y(D)m(A)-8 b(TE],)32 b(page)f(23,)p eop end %%Page: 25 38 TeXDict begin 25 37 bop 150 -116 a Fs(Chapter)30 b(3:)41 b(Comm)m(unication)2416 b(25)150 299 y Fh(reader)390 446 y Fk(READER)150 614 y Fs(outputs)28 b(the)g(name)g(of)h(the)f (curren)m(t)g(read)g(stream)h(\014le,)g(or)f(the)h(empt)m(y)f(list)h (if)f(the)h(read)f(stream)g(is)h(the)150 723 y(terminal.)150 958 y Fh(writer)390 1105 y Fk(WRITER)150 1272 y Fs(outputs)k(the)h (name)g(of)g(the)g(curren)m(t)f(write)h(stream)g(\014le,)h(or)f(the)g (empt)m(y)g(list)g(if)g(the)g(write)g(stream)g(is)150 1382 y(the)d(screen.)150 1616 y Fh(setreadp)s(os)390 1763 y Fk(SETREADPOS)45 b(charpos)150 1931 y Fs(command.)68 b(Sets)40 b(the)g(\014le)g(p)s(oin)m(ter)f(of)h(the)g(read)g(stream)g (\014le)f(so)h(that)h(the)f(next)f Fk(READLIST)p Fs(,)h(etc.,)150 2041 y(will)49 b(b)s(egin)e(reading)i(at)g(the)f Fl(c)m(harp)s(os)t Fs(th)g(c)m(haracter)i(in)e(the)g(\014le,)53 b(coun)m(ting)c(from)f(0.) 95 b(\(That)49 b(is,)150 2150 y Fk(SETREADPOS)c(0)37 b Fs(will)g(start)g(reading)g(from)g(the)g(b)s(eginning)f(of)h(the)g (\014le.\))61 b(Meaningless)38 b(if)f(the)g(read)150 2260 y(stream)31 b(is)f(the)h(k)m(eyb)s(oard.)150 2428 y(See)g([READLIST],)f(page)h(20,)g(.)150 2662 y Fh(set)m(writep)s(os) 390 2809 y Fk(SETWRITEPOS)45 b(charpos)150 2977 y Fs(command.)37 b(Sets)22 b(the)f(\014le)h(p)s(oin)m(ter)f(of)h(the)f(write)h(stream)g (\014le)f(so)h(that)g(the)f(next)h Fk(PRINT)p Fs(,)g(etc.,)j(will)c(b)s (egin)150 3086 y(writing)35 b(at)g(the)g Fl(c)m(harp)s(os)t Fs(th)f(c)m(haracter)i(in)f(the)g(\014le,)h(coun)m(ting)f(from)f(0.)55 b(\(That)34 b(is,)j Fk(SETWRITEPOS)44 b(0)150 3196 y Fs(will)39 b(start)f(writing)h(from)e(the)i(b)s(eginning)e(of)i(the)f (\014le.\))65 b(Meaningless)40 b(if)e(the)g(write)h(stream)f(is)h(the) 150 3306 y(screen.)150 3473 y(See)31 b([PRINT],)f(page)h(19,)h(.)150 3708 y Fh(readp)s(os)390 3855 y Fk(READPOS)150 4022 y Fs(outputs)e(the)g(\014le)h(p)s(osition)f(of)h(the)f(curren)m(t)h(read) f(stream)h(\014le.)150 4257 y Fh(writep)s(os)390 4404 y Fk(WRITEPOS)150 4572 y Fs(outputs)f(the)g(\014le)h(p)s(osition)f(of)h (the)f(curren)m(t)h(write)f(stream)h(\014le.)150 4806 y Fh(eofp)390 4953 y Fk(EOFP)390 5063 y(EOF?)150 5230 y Fs(predicate,)j(outputs)d Fk(TRUE)g Fs(if)h(there)h(are)f(no)g(more)h (c)m(haracters)g(to)g(b)s(e)f(read)g(in)g(the)g(read)g(stream)h (\014le,)150 5340 y Fk(FALSE)c Fs(otherwise.)p eop end %%Page: 26 39 TeXDict begin 26 38 bop 150 -116 a Fs(26)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fh(\014lep)390 446 y Fk(FILEP)46 b(filename)390 555 y(FILE?)g(filename)g(\(library)f(procedure\))150 723 y Fs(predicate,)31 b(outputs)f Fk(TRUE)f Fs(if)h(a)h(\014le)f(of)h (the)f(sp)s(eci\014ed)g(name)g(exists)h(and)f(can)g(b)s(e)g(read,)h Fk(FALSE)d Fs(other-)150 833 y(wise.)150 1074 y Fr(3.4)68 b(T)-11 b(erminal)45 b(Access)150 1266 y Fh(k)m(eyp)390 1413 y Fk(KEYP)390 1522 y(KEY?)150 1690 y Fs(predicate,)31 b(outputs)f Fk(TRUE)f Fs(if)h(there)h(are)g(c)m(haracters)g(w)m(aiting) h(to)f(b)s(e)f(read)g(from)g(the)g(read)g(stream.)41 b(If)150 1800 y(the)30 b(read)f(stream)i(is)e(a)h(\014le,)h(this)e(is)h (equiv)-5 b(alen)m(t)31 b(to)f Fk(NOT)47 b(EOFP)o Fs(.)41 b(If)29 b(the)h(read)f(stream)i(is)e(the)h(terminal,)150 1909 y(then)35 b(ec)m(hoing)j(is)d(turned)g(o\013)h(and)f(the)h (terminal)g(is)g(set)g(to)h Fk(cbreak)d Fs(\(c)m(haracter)k(at)e(a)g (time)h(instead)150 2019 y(of)30 b(line)h(at)g(a)g(time\))g(mo)s(de.)40 b(It)31 b(remains)f(in)g(this)g(mo)s(de)g(un)m(til)g(some)h(line-mo)s (de)f(reading)h(is)f(requested)150 2128 y(\(e.g.,)g Fk(READLIST)p Fs(\).)38 b(The)27 b(Unix)g(op)s(erating)h(system)g(forgets)g(ab)s(out) f(an)m(y)h(p)s(ending)e(c)m(haracters)j(when)d(it)150 2238 y(switc)m(hes)31 b(mo)s(des,)f(so)h(the)f(\014rst)g Fk(KEYP)f Fs(in)m(v)m(o)s(cation)k(will)d(alw)m(a)m(ys)i(output)e Fk(FALSE)p Fs(.)150 2406 y(See)h([EOFP],)f(page)i(25,)f(,)g ([READLIST],)f(page)h(20,)150 2605 y Fh(cleartext)390 2752 y Fk(CLEARTEXT)390 2862 y(CT)150 3030 y Fs(command.)40 b(Clears)31 b(the)g(text)g(windo)m(w.)150 3229 y Fh(setcursor)390 3376 y Fk(SETCURSOR)45 b(vector)150 3544 y Fs(command.)55 b(The)35 b(input)f(is)h(a)h(list)f(of)h(t)m(w)m(o)g(n)m(um)m(b)s(ers,)f (the)h(x)f(and)f(y)i(co)s(ordinates)f(of)h(a)f(text)h(windo)m(w)150 3654 y(p)s(osition)29 b(\(origin)h(in)e(the)i(upp)s(er)c(left)k (corner,)f(p)s(ositiv)m(e)h(direction)g(is)f(southeast\).)41 b(The)29 b(text)h(cursor)e(is)150 3763 y(mo)m(v)m(ed)k(to)f(the)g (requested)g(p)s(osition.)42 b(This)30 b(command)g(also)i(forces)f(the) g(immediate)h(prin)m(ting)f(of)g(an)m(y)150 3873 y(bu\013ered)e(c)m (haracters.)150 4073 y Fh(cursor)390 4219 y Fk(CURSOR)150 4387 y Fs(outputs)h(a)h(list)h(con)m(taining)g(the)f(curren)m(t)g(x)f (and)g(y)h(co)s(ordinates)h(of)f(the)f(text)i(cursor.)42 b(Logo)31 b(ma)m(y)h(get)150 4497 y(confused)24 b(ab)s(out)g(the)h (curren)m(t)f(cursor)g(p)s(osition)h(if,)h(e.g.,)h(y)m(ou)e(t)m(yp)s(e) g(in)f(a)h(long)g(line)g(that)g(wraps)f(around)150 4606 y(or)30 b(y)m(our)h(program)f(prin)m(ts)g(escap)s(e)h(co)s(des)f(that)h (a\013ect)h(the)e(screen)h(strangely)-8 b(.)150 4806 y Fh(setmargins)390 4953 y Fk(SETMARGINS)45 b(vector)150 5121 y Fs(command.)60 b(The)36 b(input)g(m)m(ust)h(b)s(e)f(a)i(list)f (of)g(t)m(w)m(o)i(n)m(um)m(b)s(ers,)e(as)g(for)g Fk(SETCURSOR)p Fs(.)57 b(The)37 b(e\013ect)h(is)f(to)150 5230 y(clear)j(the)f(screen)g (and)g(then)f(arrange)i(for)e(all)i(further)e(prin)m(ting)h(to)g(b)s(e) g(shifted)f(do)m(wn)h(and)f(to)i(the)150 5340 y(righ)m(t)g(according)g (to)g(the)g(indicated)g(margins.)67 b(Sp)s(eci\014cally)-8 b(,)43 b(ev)m(ery)d(time)g(a)g(newline)f(c)m(haracter)i(is)p eop end %%Page: 27 40 TeXDict begin 27 39 bop 150 -116 a Fs(Chapter)30 b(3:)41 b(Comm)m(unication)2416 b(27)150 299 y(prin)m(ted)34 b(\(explicitly)i(or)f(implicitly\))h(Logo)f(will)g(t)m(yp)s(e)f Fl(x)p 2130 299 28 4 v 40 w(margin)h Fs(spaces,)h(and)d(on)i(ev)m(ery)g (in)m(v)m(o)s(cation)150 408 y(of)i Fk(SETCURSOR)e Fs(the)j(margins)f (will)g(b)s(e)g(added)g(to)h(the)f(input)f(x)i(and)e(y)i(co)s (ordinates.)62 b(\()p Fk(CURSOR)36 b Fs(will)150 518 y(rep)s(ort)26 b(the)h(cursor)f(p)s(osition)h(relativ)m(e)i(to)e(the)g (margins,)h(so)f(that)g(this)f(shift)h(will)g(b)s(e)f(in)m(visible)h (to)h(Logo)150 628 y(programs.\))39 b(The)23 b(purp)s(ose)f(of)i(this)f (command)h(is)g(to)g(accommo)s(date)i(the)e(displa)m(y)g(of)g(terminal) g(screens)150 737 y(in)j(lecture)g(halls)h(with)e(inadequate)i(TV)f (monitors)g(that)g(miss)g(the)g(top)g(and)f(left)i(edges)f(of)g(the)h (screen.)150 905 y(See)j([SETCURSOR],)e(page)i(26,)g(.)150 1164 y Fh(settextcolor)390 1311 y Fk(SETTEXTCOLOR)44 b(foreground)h(background)390 1421 y(SETTC)h(foreground)f(background) 150 1588 y Fs(command)25 b(\(wxWidgets)h(only\).)39 b(The)24 b(inputs)g(are)h(color)h(n)m(um)m(b)s(ers,)f(or)f(R)m(GB)i(color)g (lists,)h(as)e(for)g(turtle)150 1698 y(graphics.)39 b(The)25 b(foreground)g(and)g(bac)m(kground)h(colors)h(for)e(the)h (textscreen/splitscreen)i(text)e(windo)m(w)150 1807 y(are)33 b(c)m(hanged)h(to)g(the)f(giv)m(en)h(v)-5 b(alues.)49 b(The)32 b(c)m(hange)i(a\013ects)h(text)e(already)h(prin)m(ted)f(as)g (w)m(ell)h(as)f(future)150 1917 y(text)e(prin)m(ting;)g(there)f(is)h (only)f(one)h(text)g(color)h(for)e(the)h(en)m(tire)g(windo)m(w.)150 2085 y(Command)d(\(non-wxWidgets)i(Windo)m(ws)f(and)f(DOS)h(extended)g (only\).)41 b(The)28 b(inputs)g(are)h(color)h(n)m(um-)150 2194 y(b)s(ers,)e(as)h(for)f(turtle)h(graphics.)40 b(F)-8 b(uture)28 b(prin)m(ting)h(to)g(the)f(text)i(windo)m(w)e(will)g(use)h (the)f(sp)s(eci\014ed)g(colors)150 2304 y(for)43 b(foreground)g(\(the)h (c)m(haracters)h(prin)m(ted\))e(and)g(bac)m(kground)g(\(the)h(space)g (under)e(those)i(c)m(harac-)150 2413 y(ters\).)g(Using)31 b Fk(STANDOUT)e Fs(will)j(rev)m(ert)g(to)f(the)h(default)f(text)h (windo)m(w)f(colors.)44 b(In)31 b(the)g(DOS)g(extended)150 2523 y(\()p Fk(ucblogo.exe)p Fs(\))e(v)m(ersion,)j(colors)f(in)g (textscreen)h(mo)s(de)f(are)g(limited)h(to)g(n)m(um)m(b)s(ers)d(0-7,)k (and)d(the)i(col-)150 2633 y(oring)g(applies)f(only)h(to)g(text)h(prin) m(ted)e(b)m(y)g(the)h(program,)g(not)g(to)g(the)g(ec)m(hoing)h(of)f (text)g(t)m(yp)s(ed)f(b)m(y)h(the)150 2742 y(user.)52 b(Neither)34 b(limitation)i(applies)f(to)g(the)f(text)h(p)s(ortion)f (of)h(splitscreen)f(mo)s(de,)h(whic)m(h)f(is)g(actually)150 2852 y(dra)m(wn)c(as)g(graphics)g(in)m(ternally)-8 b(.)150 3020 y(See)31 b([ST)-8 b(ANDOUT],)31 b(page)g(17,)g(.)150 3279 y Fh(increasefon)m(t)390 3425 y Fk(INCREASEFONT)390 3535 y(DECREASEFONT)150 3703 y Fs(command)f(\(wxWidgets)i(only\).)43 b(Increase)31 b(or)f(decrease)i(the)f(size)h(of)e(the)h(fon)m(t)h(used) d(in)i(the)g(text)h(and)150 3812 y(edit)f(windo)m(ws)e(to)j(the)e(next) h(larger)g(or)f(smaller)h(a)m(v)-5 b(ailable)33 b(size.)150 4071 y Fh(settextsize)390 4218 y Fk(SETTEXTSIZE)45 b(height)150 4386 y Fs(command)39 b(\(wxWidgets)i(only\).)69 b(Set)40 b(the)g Fk(")p Fs(p)s(oin)m(t)f(size)p Fk(")h Fs(of)g(the)g(fon)m(t)g (used)f(in)g(the)h(text)g(and)f(edit)150 4496 y(windo)m(ws)34 b(to)h(the)g(giv)m(en)g(in)m(teger)h(input.)53 b(The)34 b(desired)g(size)h(ma)m(y)g(not)g(b)s(e)f(a)m(v)-5 b(ailable,)38 b(in)d(whic)m(h)f(case)150 4605 y(the)39 b(nearest)g(a)m(v)-5 b(ailable)41 b(size)e(will)g(b)s(e)f(used.)65 b(Note:)58 b(There)38 b(is)h(only)f(a)h(sligh)m(t)h(correlation)g(b)s(et)m(w)m (een)150 4715 y(these)31 b(in)m(tegers)h(and)e(pixel)h(sizes.)43 b(Our)29 b(rough)i(estimate)h(is)f(that)g(the)g(n)m(um)m(b)s(er)f(of)g (pixels)h(of)g(heigh)m(t)h(is)150 4824 y(ab)s(out)h(1.5)h(times)f(the)g (p)s(oin)m(t)g(size,)i(but)d(it)i(v)-5 b(aries)33 b(for)g(di\013eren)m (t)h(fon)m(ts.)48 b(See)34 b Fk(SETLABELHEIGHT)29 b Fs(for)k(a)150 4934 y(di\013eren)m(t)e(approac)m(h)g(used)e(for)h(the)h(graphics)f (windo)m(w.)150 5193 y Fh(textsize)390 5340 y Fk(TEXTSIZE)p eop end %%Page: 28 41 TeXDict begin 28 40 bop 150 -116 a Fs(28)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(\(wxWidgets)k(only\))f(outputs)g(the)g Fk(")p Fs(p)s(oin)m(t)f(size)p Fk(")i Fs(of)f(the)g(fon)m(t)g(used)f (in)h(the)g(text)h(and)e(edit)h(windo)m(ws.)150 408 y(See)38 b Fk(SETTEXTSIZE)c Fs(for)j(a)h(discussion)f(of)h(fon)m(t)g(sizing.)63 b(See)37 b Fk(LABELSIZE)e Fs(for)j(a)g(di\013eren)m(t)g(approac)m(h)150 518 y(used)30 b(for)g(the)g(graphics)h(windo)m(w.)150 717 y Fh(setfon)m(t)390 864 y Fk(SETFONT)46 b(fontname)150 1032 y Fs(command)38 b(\(wxWidgets)i(only\).)65 b(Set)39 b(the)f(fon)m(t)h(family)g(used)f(in)g(all)h(windo)m(ws)f(to)h(the)g (one)f(named)150 1142 y(b)m(y)g(the)g(input.)63 b(T)-8 b(ry)38 b Fk(Courier)e Fs(or)i Fk(Monospace)e Fs(as)i(lik)m(ely)h(p)s (ossibilities.)65 b(Not)39 b(all)g(computers)f(ha)m(v)m(e)150 1251 y(the)32 b(same)h(fon)m(ts)f(installed.)47 b(It's)32 b(a)g(go)s(o)s(d)g(idea)h(to)g(stic)m(k)g(with)f(monospace)h(fon)m(ts)f (\(ones)h(in)e(whic)m(h)h(all)150 1361 y(c)m(haracters)g(ha)m(v)m(e)f (the)g(same)g(width\).)150 1560 y Fh(fon)m(t)390 1707 y Fk(FONT)150 1875 y Fs(\(wxWidgets)h(only\))e(outputs)g(the)h(name)f (of)h(the)f(fon)m(t)h(family)g(used)f(in)g(all)h(windo)m(ws.)p eop end %%Page: 29 42 TeXDict begin 29 41 bop 3659 -116 a Fs(29)150 299 y Fp(4)80 b(Arithmetic)150 729 y Fr(4.1)68 b(Numeric)45 b(Op)t(erations)150 946 y Fh(sum)390 1093 y Fk(SUM)i(num1)g(num2)390 1202 y(\(SUM)g(num1)f(num2)h(num3)g(...\))390 1312 y(num1)g(+)g(num2)150 1480 y Fs(outputs)30 b(the)g(sum)g(of)g(its)h(inputs.)150 1705 y Fh(di\013erence)390 1852 y Fk(DIFFERENCE)45 b(num1)i(num2)390 1961 y(num1)g(-)g(num2)150 2129 y Fs(outputs)23 b(the)i(di\013erence)f (of)g(its)h(inputs.)37 b(Min)m(us)24 b(sign)g(means)g(in\014x)f (di\013erence)h(in)g(am)m(biguous)g(con)m(texts)150 2238 y(\(when)j(preceded)h(b)m(y)g(a)g(complete)i(expression\),)f(unless)e (it)h(is)h(preceded)e(b)m(y)h(a)g(space)h(and)e(follo)m(w)m(ed)j(b)m(y) 150 2348 y(a)h(nonspace.)41 b(\(See)30 b(also)i Fk(MINUS)p Fs(.\))150 2573 y Fh(min)m(us)390 2720 y Fk(MINUS)46 b(num)390 2829 y(-)h(num)150 2997 y Fs(outputs)26 b(the)h(negativ)m(e)i (of)d(its)h(input.)39 b(Min)m(us)26 b(sign)h(means)f(unary)g(min)m(us)f (if)i(the)g(previous)f(tok)m(en)h(is)g(an)150 3107 y(in\014x)g(op)s (erator)i(or)f(op)s(en)g(paren)m(thesis,)h(or)f(it)h(is)f(preceded)g(b) m(y)h(a)f(space)h(and)f(follo)m(w)m(ed)i(b)m(y)e(a)h(nonspace.)150 3216 y(There)h(is)g(a)h(di\013erence)g(in)f(binding)f(strength)i(b)s (et)m(w)m(een)g(the)f(t)m(w)m(o)i(forms:)390 3384 y Fk(MINUS)46 b(3)i(+)f(4)239 b(means)141 b(-\(3+4\))390 3494 y(-)47 b(3)h(+)f(4)430 b(means)141 b(\(-3\)+4)150 3719 y Fh(pro)s(duct)390 3866 y Fk(PRODUCT)46 b(num1)g(num2)390 3975 y(\(PRODUCT)g(num1)g(num2)h (num3)f(...\))390 4085 y(num1)h(*)g(num2)150 4252 y Fs(outputs)30 b(the)g(pro)s(duct)g(of)g(its)h(inputs.)150 4477 y Fh(quotien)m(t)390 4624 y Fk(QUOTIENT)46 b(num1)g(num2)390 4734 y(\(QUOTIENT)f(num\))390 4844 y(num1)i(/)g(num2)150 5011 y Fs(outputs)36 b(the)g(quotien)m(t)h (of)f(its)h(inputs.)56 b(The)36 b(quotien)m(t)h(of)f(t)m(w)m(o)i(in)m (tegers)f(is)f(an)g(in)m(teger)h(if)f(and)g(only)150 5121 y(if)g(the)g(dividend)f(is)h(a)g(m)m(ultiple)h(of)f(the)g (divisor.)57 b(\(In)36 b(other)g(w)m(ords,)h Fk(QUOTIENT)45 b(5)j(2)35 b Fs(is)h(2.5,)j(not)d(2,)150 5230 y(but)30 b Fk(QUOTIENT)46 b(4)h(2)31 b Fs(is)h(2,)g(not)f(2.0)h(|)f(it)h(do)s (es)f(the)g(righ)m(t)h(thing.\))43 b(With)32 b(a)g(single)g(input,)e Fk(QUOTIENT)150 5340 y Fs(outputs)g(the)g(recipro)s(cal)i(of)e(the)h (input.)p eop end %%Page: 30 43 TeXDict begin 30 42 bop 150 -116 a Fs(30)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fh(remainder)390 446 y Fk(REMAINDER)45 b(num1)i(num2)150 614 y Fs(outputs)29 b(the)h(remainder)f(on)g (dividing)h Fl(n)m(um1)36 b Fs(b)m(y)30 b Fl(n)m(um2)7 b Fs(;)29 b(b)s(oth)g(m)m(ust)h(b)s(e)f(in)m(tegers)i(and)e(the)g (result)h(is)150 723 y(an)g(in)m(teger)i(with)e(the)h(same)f(sign)h(as) f Fl(n)m(um1)p Fs(.)150 944 y Fh(mo)s(dulo)390 1091 y Fk(MODULO)46 b(num1)h(num2)150 1259 y Fs(outputs)29 b(the)h(remainder)f (on)g(dividing)h Fl(n)m(um1)36 b Fs(b)m(y)30 b Fl(n)m(um2)7 b Fs(;)29 b(b)s(oth)g(m)m(ust)h(b)s(e)f(in)m(tegers)i(and)e(the)g (result)h(is)150 1369 y(an)g(in)m(teger)i(with)e(the)h(same)f(sign)h (as)f Fl(n)m(um2)p Fs(.)150 1590 y Fh(in)m(t)390 1737 y Fk(INT)47 b(num)150 1905 y Fs(outputs)35 b(its)h(input)f(with)h (fractional)h(part)f(remo)m(v)m(ed,)i(i.e.,)g(an)e(in)m(teger)h(with)f (the)g(same)g(sign)g(as)g(the)150 2014 y(input,)28 b(whose)g(absolute)g (v)-5 b(alue)29 b(is)f(the)g(largest)h(in)m(teger)g(less)g(than)e(or)h (equal)h(to)g(the)f(absolute)g(v)-5 b(alue)29 b(of)150 2124 y(the)i(input.)150 2345 y Fh(round)390 2492 y Fk(ROUND)46 b(num)150 2660 y Fs(outputs)30 b(the)g(nearest)h(in)m(teger)h(to)f(the) g(input.)150 2881 y Fh(sqrt)390 3028 y Fk(SQRT)47 b(num)150 3196 y Fs(outputs)30 b(the)g(square)h(ro)s(ot)f(of)h(the)f(input,)g (whic)m(h)g(m)m(ust)g(b)s(e)g(nonnegativ)m(e.)150 3417 y Fh(p)s(o)m(w)m(er)390 3564 y Fk(POWER)46 b(num1)h(num2)150 3732 y Fs(outputs)30 b Fl(n)m(um1)37 b Fs(to)31 b(the)g Fl(n)m(um2)37 b Fs(p)s(o)m(w)m(er.)k(If)30 b Fl(n)m(um1)37 b Fs(is)30 b(negativ)m(e,)j(then)d Fl(n)m(um2)37 b Fs(m)m(ust)31 b(b)s(e)e(an)i(in)m(teger.)150 3953 y Fh(exp)390 4100 y Fk(EXP)47 b(num)150 4268 y Fs(outputs)30 b Fg(e)37 b Fs(\(2.718281828)p Fk(+)p Fs(\))e(to)c(the)g(input)e(p)s(o)m(w)m(er.) 150 4489 y Fh(log10)390 4636 y Fk(LOG10)46 b(num)150 4804 y Fs(outputs)30 b(the)g(common)h(logarithm)g(of)g(the)g(input.)150 5025 y Fh(ln)390 5172 y Fk(LN)47 b(num)150 5340 y Fs(outputs)30 b(the)g(natural)h(logarithm)g(of)g(the)f(input.)p eop end %%Page: 31 44 TeXDict begin 31 43 bop 150 -116 a Fs(Chapter)30 b(4:)41 b(Arithmetic)2613 b(31)150 299 y Fh(sin)390 446 y Fk(SIN)47 b(degrees)150 614 y Fs(outputs)30 b(the)g(sine)h(of)f(its)h(input,)f (whic)m(h)g(is)g(tak)m(en)i(in)e(degrees.)150 817 y Fh(radsin)390 964 y Fk(RADSIN)46 b(radians)150 1131 y Fs(outputs)30 b(the)g(sine)h(of)f(its)h(input,)f(whic)m(h)g(is)g(tak)m(en)i(in)e (radians.)150 1334 y Fh(cos)390 1481 y Fk(COS)47 b(degrees)150 1649 y Fs(outputs)30 b(the)g(cosine)i(of)e(its)h(input,)f(whic)m(h)g (is)g(tak)m(en)i(in)e(degrees.)150 1852 y Fh(radcos)390 1999 y Fk(RADCOS)46 b(radians)150 2167 y Fs(outputs)30 b(the)g(cosine)i(of)e(its)h(input,)f(whic)m(h)g(is)g(tak)m(en)i(in)e (radians.)150 2370 y Fh(arctan)390 2517 y Fk(ARCTAN)46 b(num)390 2626 y(\(ARCTAN)g(x)h(y\))150 2794 y Fs(outputs)33 b(the)h(arctangen)m(t,)j(in)c(degrees,)i(of)f(its)g(input.)49 b(With)35 b(t)m(w)m(o)g(inputs,)e(outputs)g(the)h(arctangen)m(t)150 2904 y(of)d(y/x,)g(if)f(x)g(is)h(nonzero,)f(or)h(90)g(or)f({90)i(dep)s (ending)d(on)h(the)h(sign)f(of)h(y)-8 b(,)31 b(if)f(x)g(is)h(zero.)150 3107 y Fh(radarctan)390 3254 y Fk(RADARCTAN)45 b(num)390 3363 y(\(RADARCTAN)g(x)i(y\))150 3531 y Fs(outputs)33 b(the)h(arctangen)m(t,)j(in)c(radians,)h(of)g(its)g(input.)49 b(With)35 b(t)m(w)m(o)g(inputs,)e(outputs)g(the)h(arctangen)m(t)150 3640 y(of)d(y/x,)g(if)f(x)g(is)h(nonzero,)f(or)h(pi/2)g(or)f({pi/2)i (dep)s(ending)c(on)j(the)f(sign)h(of)f(y)-8 b(,)31 b(if)f(x)h(is)f (zero.)150 3808 y(The)g(expression)g Fk(2*\(RADARCTAN)44 b(0)k(1\))30 b Fs(can)g(b)s(e)g(used)g(to)h(get)g(the)g(v)-5 b(alue)31 b(of)f(pi.)150 4011 y Fh(iseq)390 4158 y Fk(ISEQ)47 b(from)f(to)h(\(library)f(procedure\))150 4326 y Fs(outputs)30 b(a)h(list)g(of)f(the)h(in)m(tegers)g(from)f Fl(from)g Fs(to)h Fl(to)p Fs(,)h(inclusiv)m(e.)390 4494 y Fk(?)47 b(show)g(iseq)g(3)g(7)390 4603 y([3)g(4)h(5)f(6)h(7])390 4713 y(?)f(show)g(iseq)g(7)g(3)390 4822 y([7)g(6)h(5)f(4)h(3])150 5025 y Fh(rseq)390 5172 y Fk(RSEQ)f(from)f(to)h(count)g(\(library)e (procedure\))150 5340 y Fs(outputs)30 b(a)h(list)g(of)f Fl(coun)m(t)j Fs(equally)e(spaced)g(rational)g(n)m(um)m(b)s(ers)e(b)s (et)m(w)m(een)i Fl(from)f Fs(and)g Fl(to)p Fs(,)h(inclusiv)m(e.)p eop end %%Page: 32 45 TeXDict begin 32 44 bop 150 -116 a Fs(32)2551 b(BERKELEY)30 b(LOGO)g(6.1)390 299 y Fk(?)47 b(show)g(rseq)g(3)g(5)h(9)390 408 y([3)f(3.25)g(3.5)g(3.75)f(4)i(4.25)e(4.5)h(4.75)g(5])390 518 y(?)g(show)g(rseq)g(3)g(5)h(5)390 628 y([3)f(3.5)g(4)h(4.5)e(5])150 884 y Fr(4.2)68 b(Numeric)45 b(Predicates)150 1086 y Fh(lessp)390 1233 y Fk(LESSP)h(num1)h(num2)390 1343 y(LESS?)f(num1)h (num2)390 1452 y(num1)g(<)g(num2)150 1620 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(its)h(\014rst)f(input)f(is)i(strictly)g(less)g (than)f(its)h(second.)150 1830 y Fh(greaterp)390 1977 y Fk(GREATERP)46 b(num1)g(num2)390 2086 y(GREATER?)g(num1)g(num2)390 2196 y(num1)h(>)g(num2)150 2364 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(its)h(\014rst)f(input)f(is)i(strictly)g(greater)h(than)e(its)g (second.)150 2574 y Fh(lessequalp)390 2721 y Fk(LESSEQUALP)45 b(num1)i(num2)390 2830 y(LESSEQUAL?)e(num1)i(num2)390 2940 y(num1)g(<=)g(num2)150 3107 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(its)h(\014rst)f(input)f(is)i(less)f(than)g(or)h(equal)g(to)g (its)g(second.)150 3317 y Fh(greaterequalp)390 3464 y Fk(GREATEREQUALP)44 b(num1)j(num2)390 3574 y(GREATEREQUAL?)d(num1)j (num2)390 3684 y(num1)g(>=)g(num2)150 3851 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(its)h(\014rst)f(input)f(is)i(greater)g(than)f(or)h (equal)g(to)g(its)f(second.)150 4108 y Fr(4.3)68 b(Random)45 b(Num)l(b)t(ers)150 4310 y Fh(random)390 4457 y Fk(RANDOM)h(num)390 4566 y(\(RANDOM)g(start)g(end\))150 4734 y Fs(with)29 b(one)g(input,)g(outputs)f(a)i(random)e(nonnegativ)m(e)j(in)m(teger)f (less)g(than)e(its)i(input,)e(whic)m(h)h(m)m(ust)g(b)s(e)g(a)150 4844 y(p)s(ositiv)m(e)i(in)m(teger.)150 5011 y(With)d(t)m(w)m(o)i (inputs,)d Fk(RANDOM)g Fs(outputs)g(a)i(random)e(in)m(teger)i(greater)g (than)f(or)g(equal)g(to)h(the)f(\014rst)g(input,)150 5121 y(and)38 b(less)h(than)f(or)g(equal)h(to)g(the)g(second)g(input.) 64 b(Both)39 b(inputs)e(m)m(ust)h(b)s(e)g(in)m(tegers,)k(and)c(the)h (\014rst)150 5230 y(m)m(ust)30 b(b)s(e)g(less)g(than)h(the)f(second.)41 b Fk(\(RANDOM)46 b(0)h(9\))30 b Fs(is)g(equiv)-5 b(alen)m(t)32 b(to)f Fk(RANDOM)46 b(10)o Fs(;)31 b Fk(\(RANDOM)46 b(3)h(8\))30 b Fs(is)150 5340 y(equiv)-5 b(alen)m(t)32 b(to)f Fk(\(RANDOM)46 b(6\)+3)o Fs(.)p eop end %%Page: 33 46 TeXDict begin 33 45 bop 150 -116 a Fs(Chapter)30 b(4:)41 b(Arithmetic)2613 b(33)150 299 y Fh(rerandom)390 446 y Fk(RERANDOM)390 555 y(\(RERANDOM)45 b(seed\))150 723 y Fs(command.)53 b(Mak)m(es)36 b(the)f(results)f(of)h Fk(RANDOM)e Fs(repro)s(ducible.)52 b(Ordinarily)33 b(the)i(sequence)g (of)g(random)150 833 y(n)m(um)m(b)s(ers)20 b(is)h(di\013eren)m(t)g(eac) m(h)i(time)e(Logo)i(is)e(used.)37 b(If)20 b(y)m(ou)i(need)f(the)g(same) g(sequence)h(of)f(pseudo-random)150 942 y(n)m(um)m(b)s(ers)32 b(rep)s(eatedly)-8 b(,)36 b(e.g.)51 b(to)35 b(debug)e(a)h(program,)g (sa)m(y)h Fk(RERANDOM)c Fs(b)s(efore)i(the)h(\014rst)f(in)m(v)m(o)s (cation)j(of)150 1052 y Fk(RANDOM)p Fs(.)j(If)29 b(y)m(ou)h(need)f (more)h(than)f(one)h(rep)s(eatable)g(sequence,)g(y)m(ou)g(can)g(giv)m (e)h Fk(RERANDOM)c Fs(an)j(in)m(teger)150 1161 y(input;)g(eac)m(h)h(p)s (ossible)f(input)g(selects)h(a)g(unique)f(sequence)g(of)h(n)m(um)m(b)s (ers.)150 1402 y Fr(4.4)68 b(Prin)l(t)45 b(F)-11 b(ormatting)150 1593 y Fh(form)390 1740 y Fk(FORM)47 b(num)g(width)f(precision)150 1908 y Fs(outputs)32 b(a)i(w)m(ord)e(con)m(taining)i(a)g(prin)m(table)f (represen)m(tation)h(of)e Fl(n)m(um)p Fs(,)h(p)s(ossibly)f(preceded)h (b)m(y)g(spaces)150 2018 y(\(and)23 b(therefore)h(not)f(a)h(n)m(um)m(b) s(er)e(for)h(purp)s(oses)e(of)j(p)s(erforming)e(arithmetic)i(op)s (erations\),)i(with)d(at)h(least)150 2127 y Fl(width)30 b Fs(c)m(haracters,)i(including)f(exactly)h Fl(precision)f Fs(digits)h(after)f(the)g(decimal)g(p)s(oin)m(t.)42 b(\(If)31 b Fl(precision)g Fs(is)150 2237 y(0)g(then)f(there)g(will)h(b)s(e)f(no) g(decimal)h(p)s(oin)m(t)g(in)f(the)g(output.\))150 2405 y(As)d(a)g(debugging)g(feature,)h(\()p Fk(FORM)47 b(num)g(-1)g(format)o Fs(\))27 b(will)g(prin)m(t)f(the)h(\015oating)h(p)s(oin)m(t)f Fl(n)m(um)f Fs(according)150 2514 y(to)31 b(the)g(C)f(prin)m(tf)f Fl(format)p Fs(,)i(to)g(allo)m(w)390 2682 y Fk(to)47 b(hex)g(:num)390 2791 y(op)g(form)g(:num)f(-1)i("|\04508X)e(\04508X|) 390 2901 y(end)150 3069 y Fs(to)26 b(allo)m(w)i(\014nding)c(out)i(the)g (exact)h(result)f(of)g(\015oating)h(p)s(oin)m(t)e(op)s(erations.)40 b(The)25 b(precise)h(format)g(needed)150 3178 y(ma)m(y)31 b(b)s(e)f(mac)m(hine-dep)s(enden)m(t.)150 3419 y Fr(4.5)68 b(Bit)l(wise)46 b(Op)t(erations)150 3610 y Fh(bitand)390 3757 y Fk(BITAND)g(num1)h(num2)390 3867 y(\(BITAND)f(num1)g(num2)h (num3)g(...\))150 4035 y Fs(outputs)30 b(the)g(bit)m(wise)h Fl(and)j Fs(of)c(its)h(inputs,)f(whic)m(h)g(m)m(ust)g(b)s(e)g(in)m (tegers.)150 4202 y(See)h([AND],)g(page)h(35,)f(.)150 4402 y Fh(bitor)390 4549 y Fk(BITOR)46 b(num1)h(num2)390 4658 y(\(BITOR)f(num1)h(num2)f(num3)h(...\))150 4826 y Fs(outputs)30 b(the)g(bit)m(wise)h Fl(or)37 b Fs(of)31 b(its)g(inputs,)e(whic)m(h)h(m)m(ust)h(b)s(e)e(in)m(tegers.)150 4994 y(See)i([OR],)f(page)h(35,)h(.)150 5193 y Fh(bitxor)390 5340 y Fk(BITXOR)46 b(num1)h(num2)p eop end %%Page: 34 47 TeXDict begin 34 46 bop 150 -116 a Fs(34)2551 b(BERKELEY)30 b(LOGO)g(6.1)390 299 y Fk(\(BITXOR)46 b(num1)g(num2)h(num3)g(...\))150 467 y Fs(outputs)30 b(the)g(bit)m(wise)h Fl(exclusiv)m(e)h(or)37 b Fs(of)31 b(its)f(inputs,)g(whic)m(h)g(m)m(ust)g(b)s(e)g(in)m(tegers.) 150 634 y(See)h([OR],)f(page)h(35,)h(.)150 834 y Fh(bitnot)390 980 y Fk(BITNOT)46 b(num)150 1148 y Fs(outputs)30 b(the)g(bit)m(wise)h Fl(not)i Fs(of)e(its)f(input,)g(whic)m(h)g(m)m(ust)g(b)s(e)g(an)g(in)m (teger.)150 1316 y(See)h([NOT],)f(page)h(35,)h(.)150 1515 y Fh(ashift)390 1662 y Fk(ASHIFT)46 b(num1)h(num2)150 1830 y Fs(outputs)30 b Fl(n)m(um1)38 b Fs(arithmetic-shifted)31 b(to)h(the)f(left)g(b)m(y)f Fl(n)m(um2)38 b Fs(bits.)j(If)30 b Fl(n)m(um2)38 b Fs(is)31 b(negativ)m(e,)i(the)e(shift)f(is)150 1939 y(to)h(the)g(righ)m(t)g(with)f(sign)g(extension.)41 b(The)30 b(inputs)g(m)m(ust)g(b)s(e)g(in)m(tegers.)150 2139 y Fh(lshift)390 2286 y Fk(LSHIFT)46 b(num1)h(num2)150 2453 y Fs(outputs)33 b Fl(n)m(um1)40 b Fs(logical-shifted)35 b(to)f(the)f(left)h(b)m(y)f Fl(n)m(um2)40 b Fs(bits.)49 b(If)33 b Fl(n)m(um2)40 b Fs(is)33 b(negativ)m(e,)j(the)d(shift)g(is)g (to)150 2563 y(the)e(righ)m(t)g(with)f(zero)h(\014ll.)40 b(The)30 b(inputs)g(m)m(ust)g(b)s(e)g(in)m(tegers.)p eop end %%Page: 35 48 TeXDict begin 35 47 bop 3659 -116 a Fs(35)150 299 y Fp(5)80 b(Logical)53 b(Op)t(erations)150 639 y Fr(and)390 799 y Fk(AND)47 b(tf1)g(tf2)390 908 y(\(AND)g(tf1)g(tf2)f(tf3)h(...\))150 1076 y Fs(outputs)34 b Fk(TRUE)g Fs(if)h(all)h(inputs)d(are)i Fk(TRUE)p Fs(,)h(otherwise)f Fk(FALSE)p Fs(.)52 b(All)36 b(inputs)e(m)m(ust)g(b)s(e)h Fk(TRUE)e Fs(or)i Fk(FALSE)p Fs(.)150 1186 y(\(Comparison)d(is)h(case-insensitiv)m(e)i(regardless)e (of)f(the)h(v)-5 b(alue)33 b(of)g Fk(CASEIGNOREDP)p Fs(.)44 b(That)32 b(is,)i Fk(true)d Fs(or)150 1295 y Fk(True)37 b Fs(or)i Fk(TRUE)e Fs(are)i(all)h(the)f(same.\))66 b(An)38 b(input)f(can)i(b)s(e)f(a)h(list,)j(in)c(whic)m(h)g(case)i(it)f(is)g (tak)m(en)g(as)g(an)150 1405 y(expression)c(to)h(run;)h(that)f (expression)f(m)m(ust)g(pro)s(duce)f(a)i Fk(TRUE)e Fs(or)i Fk(FALSE)e Fs(v)-5 b(alue.)56 b(List)35 b(expressions)150 1514 y(are)27 b(ev)-5 b(aluated)29 b(from)d(left)i(to)g(righ)m(t;)h(as) e(so)s(on)g(as)h(a)f Fk(FALSE)f Fs(v)-5 b(alue)27 b(is)g(found,)g(the)g (remaining)h(inputs)e(are)150 1624 y(not)31 b(examined.)41 b(Example:)390 1792 y Fk(MAKE)47 b("RESULT)e(AND)i([NOT)g(\(:X)g(=)g (0\)])g([\(1)g(/)h(:X\))f(>)g(.5])150 1959 y Fs(to)31 b(a)m(v)m(oid)h(the)f(division)f(b)m(y)g(zero)h(if)g(the)f(\014rst)g (part)g(is)h(false.)150 2127 y(See)g([CASEIGNOREDP],)f(page)h(89,)h(.) 150 2326 y Fh(or)390 2473 y Fk(OR)47 b(tf1)g(tf2)390 2583 y(\(OR)g(tf1)g(tf2)g(tf3)g(...\))150 2751 y Fs(outputs)37 b Fk(TRUE)g Fs(if)h(an)m(y)g(input)f(is)g Fk(TRUE)p Fs(,)i(otherwise)f Fk(FALSE)p Fs(.)62 b(All)38 b(inputs)f(m)m(ust)h(b)s(e)f Fk(TRUE)f Fs(or)i Fk(FALSE)p Fs(.)150 2860 y(\(Comparison)32 b(is)h(case-insensitiv)m(e)i(regardless)e(of)f(the)h(v)-5 b(alue)33 b(of)g Fk(CASEIGNOREDP)p Fs(.)44 b(That)32 b(is,)i Fk(true)d Fs(or)150 2970 y Fk(True)37 b Fs(or)i Fk(TRUE)e Fs(are)i(all)h(the)f(same.\))66 b(An)38 b(input)f(can)i(b)s (e)f(a)h(list,)j(in)c(whic)m(h)g(case)i(it)f(is)g(tak)m(en)g(as)g(an) 150 3079 y(expression)c(to)h(run;)h(that)f(expression)f(m)m(ust)g(pro)s (duce)f(a)i Fk(TRUE)e Fs(or)i Fk(FALSE)e Fs(v)-5 b(alue.)56 b(List)35 b(expressions)150 3189 y(are)30 b(ev)-5 b(aluated)32 b(from)d(left)i(to)g(righ)m(t;)f(as)h(so)s(on)e(as)i(a)f Fk(TRUE)f Fs(v)-5 b(alue)30 b(is)g(found,)f(the)i(remaining)f(inputs)f (are)150 3298 y(not)i(examined.)41 b(Example:)390 3466 y Fk(IF)47 b(OR)g(:X=0)g([some.long.computation])41 b([...])150 3634 y Fs(to)31 b(a)m(v)m(oid)h(the)f(long)g(computation)g(if)f(the)h (\014rst)e(condition)i(is)g(met.)150 3802 y(See)g([CASEIGNOREDP],)f (page)h(89,)h(.)150 4001 y Fh(not)390 4148 y Fk(NOT)47 b(tf)150 4315 y Fs(outputs)32 b Fk(TRUE)g Fs(if)g(the)h(input)f(is)g Fk(FALSE)p Fs(,)g(and)g(vice)i(v)m(ersa.)48 b(The)32 b(input)g(can)h(b)s(e)f(a)h(list,)h(in)f(whic)m(h)f(case)150 4425 y(it)f(is)f(tak)m(en)i(as)e(an)h(expression)f(to)h(run;)e(that)i (expression)f(m)m(ust)g(pro)s(duce)g(a)g Fk(TRUE)g Fs(or)g Fk(FALSE)f Fs(v)-5 b(alue.)p eop end %%Page: 36 49 TeXDict begin 36 48 bop eop end %%Page: 37 50 TeXDict begin 37 49 bop 3659 -116 a Fs(37)150 299 y Fp(6)80 b(Graphics)150 601 y Fs(Berk)m(eley)36 b(Logo)f(pro)m(vides)g (traditional)g(Logo)g(turtle)g(graphics)f(with)g(one)h(turtle.)52 b(Multiple)35 b(turtles,)150 711 y(dynamic)41 b(turtles,)j(and)c (collision)i(detection)h(are)e(not)g(supp)s(orted.)70 b(This)40 b(is)h(the)g(most)g(hardw)m(are-)150 820 y(dep)s(enden)m(t)33 b(part)h(of)g(Logo;)j(some)e(features)f(ma)m(y)g(exist)h(on)f(some)g (mac)m(hines)h(but)e(not)h(others.)52 b(Nev-)150 930 y(ertheless,)40 b(the)d(goal)i(has)e(b)s(een)g(to)h(mak)m(e)g(Logo)h (programs)e(as)g(p)s(ortable)h(as)f(p)s(ossible,)i(rather)e(than)150 1040 y(to)32 b(tak)m(e)i(fullest)e(adv)-5 b(an)m(tage)34 b(of)d(the)h(capabilities)i(of)e(eac)m(h)h(mac)m(hine.)45 b(In)31 b(particular,)i(Logo)g(attempts)150 1149 y(to)g(scale)h(the)f (screen)f(so)h(that)g(turtle)g(co)s(ordinates)g([{100)h({100])h(and)d ([100)i(100])g(\014t)e(on)g(the)h(graphics)150 1259 y(windo)m(w,)d(and) g(so)g(that)h(the)g(asp)s(ect)g(ratio)g(is)g(1:1.)150 1426 y(The)e(cen)m(ter)i(of)f(the)f(graphics)h(windo)m(w)f(\(whic)m(h)h (ma)m(y)g(or)g(ma)m(y)g(not)g(b)s(e)f(the)h(en)m(tire)g(screen,)g(dep)s (ending)150 1536 y(on)35 b(the)g(mac)m(hine)g(used\))g(is)g(turtle)g (lo)s(cation)i([0)e(0].)55 b(P)m(ositiv)m(e)37 b(X)e(is)g(to)h(the)f (righ)m(t;)j(p)s(ositiv)m(e)e(Y)f(is)g(up.)150 1646 y(Headings)29 b(\(angles\))h(are)f(measured)e(in)i(degrees)g(clo)s(c)m(kwise)g(from)f (the)h(p)s(ositiv)m(e)g(Y)g(axis.)40 b(\(This)28 b(di\013ers)150 1755 y(from)h(the)h(common)g(mathematical)i(con)m(v)m(en)m(tion)g(of)e (measuring)g(angles)g(coun)m(terclo)s(c)m(kwise)i(from)e(the)150 1865 y(p)s(ositiv)m(e)g(X)f(axis.\))41 b(The)28 b(turtle)h(is)g (represen)m(ted)f(as)h(an)g(iso)s(celes)h(triangle;)h(the)e(actual)h (turtle)f(p)s(osition)150 1974 y(is)c(at)h(the)f(midp)s(oin)m(t)g(of)g (the)g(base)g(\(the)h(short)f(side\).)39 b(Ho)m(w)m(ev)m(er,)28 b(the)e(turtle)f(is)g(dra)m(wn)f(one)i(step)f(b)s(ehind)150 2084 y(its)32 b(actual)h(p)s(osition,)f(so)g(that)g(the)g(displa)m(y)g (of)f(the)h(base)g(of)g(the)f(turtle's)h(triangle)h(do)s(es)e(not)h (obscure)150 2194 y(a)f(line)f(dra)m(wn)g(p)s(erp)s(endicular)e(to)j (it)g(\(as)g(w)m(ould)f(happ)s(en)f(after)i(dra)m(wing)f(a)h(square\).) 150 2361 y(Colors)f(are,)h(of)g(course,)f(hardw)m(are-dep)s(enden)m(t.) 40 b(Ho)m(w)m(ev)m(er,)33 b(Logo)e(pro)m(vides)f(partial)h(hardw)m(are) f(inde-)150 2471 y(p)s(endence)f(b)m(y)i(in)m(terpreting)g(color)g(n)m (um)m(b)s(ers)e(0)i(through)f(7)g(uniformly)g(on)g(all)h(computers:)390 2639 y Fk(0)95 b(black)381 b(1)95 b(blue)428 b(2)95 b(green)381 b(3)95 b(cyan)390 2748 y(4)g(red)477 b(5)95 b(magenta)284 b(6)95 b(yellow)333 b(7)47 b(white)150 2916 y Fs(Where)33 b(p)s(ossible,)h(Logo)g(pro)m(vides)f(additional)h(user-settable)g (colors;)i(ho)m(w)d(man)m(y)g(are)g(a)m(v)-5 b(ailable)36 b(de-)150 3025 y(p)s(ends)21 b(on)i(the)g(hardw)m(are)g(and)f(op)s (erating)i(system)f(en)m(vironmen)m(t.)39 b(If)22 b(at)i(least)g(16)g (colors)g(are)f(a)m(v)-5 b(ailable,)150 3135 y(Logo)31 b(tries)g(to)g(pro)m(vide)g(uniform)e(initial)j(settings)f(for)f(the)h (colors)g(8-15:)438 3303 y Fk(8)95 b(brown)380 b(9)96 b(tan)428 b(10)95 b(forest)285 b(11)95 b(aqua)390 3412 y(12)g(salmon)285 b(13)95 b(purple)284 b(14)95 b(orange)285 b(15)95 b(grey)150 3580 y Fs(Logo)31 b(b)s(egins)f(with)g(a)h(blac)m(k) g(bac)m(kground)g(and)e(white)i(p)s(en.)150 3847 y Fr(6.1)68 b(T)-11 b(urtle)45 b(Motion)150 4056 y Fh(forw)m(ard)390 4202 y Fk(FORWARD)h(dist)390 4312 y(FD)h(dist)150 4480 y Fs(mo)m(v)m(es)22 b(the)f(turtle)g(forw)m(ard,)h(in)e(the)h (direction)g(that)g(it's)g(facing,)j(b)m(y)c(the)h(sp)s(eci\014ed)f (distance)h(\(measured)150 4589 y(in)30 b(turtle)h(steps\).)150 4806 y Fh(bac)m(k)390 4953 y Fk(BACK)47 b(dist)390 5063 y(BK)g(dist)150 5230 y Fs(mo)m(v)m(es)39 b(the)e(turtle)h(bac)m(kw)m (ard,)i(i.e.,)g(exactly)f(opp)s(osite)f(to)g(the)f(direction)h(that)g (it's)g(facing,)j(b)m(y)c(the)150 5340 y(sp)s(eci\014ed)30 b(distance.)41 b(\(The)30 b(heading)h(of)f(the)h(turtle)g(do)s(es)f (not)g(c)m(hange.\))p eop end %%Page: 38 51 TeXDict begin 38 50 bop 150 -116 a Fs(38)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fh(left)390 446 y Fk(LEFT)47 b(degrees)390 555 y(LT)g(degrees)150 723 y Fs(turns)35 b(the)h(turtle)h(coun)m (terclo)s(c)m(kwise)h(b)m(y)e(the)g(sp)s(eci\014ed)g(angle,)j(measured) c(in)h(degrees)h(\(1/360)h(of)f(a)150 833 y(circle\).)150 1028 y Fh(righ)m(t)390 1175 y Fk(RIGHT)46 b(degrees)390 1285 y(RT)h(degrees)150 1453 y Fs(turns)29 b(the)i(turtle)f(clo)s(c)m (kwise)i(b)m(y)f(the)f(sp)s(eci\014ed)g(angle,)i(measured)d(in)h (degrees)h(\(1/360)i(of)e(a)g(circle\).)150 1648 y Fh(setp)s(os)390 1795 y Fk(SETPOS)46 b(pos)150 1963 y Fs(mo)m(v)m(es)31 b(the)g(turtle)f(to)h(an)f(absolute)h(p)s(osition)f(in)g(the)g (graphics)g(windo)m(w.)40 b(The)30 b(input)f(is)h(a)h(list)f(of)h(t)m (w)m(o)150 2073 y(n)m(um)m(b)s(ers,)e(the)i(X)f(and)g(Y)g(co)s (ordinates.)150 2268 y Fh(setxy)390 2415 y Fk(SETXY)46 b(xcor)h(ycor)150 2583 y Fs(mo)m(v)m(es)f(the)f(turtle)g(to)h(an)e (absolute)i(p)s(osition)f(in)f(the)h(graphics)g(windo)m(w.)83 b(The)45 b(t)m(w)m(o)h(inputs)e(are)150 2693 y(n)m(um)m(b)s(ers,)29 b(the)i(X)f(and)g(Y)g(co)s(ordinates.)150 2888 y Fh(setx)390 3035 y Fk(SETX)47 b(xcor)150 3203 y Fs(mo)m(v)m(es)30 b(the)f(turtle)g(horizon)m(tally)i(from)d(its)h(old)g(p)s(osition)f(to) i(a)f(new)f(absolute)h(horizon)m(tal)i(co)s(ordinate.)150 3312 y(The)f(input)f(is)i(the)f(new)g(X)h(co)s(ordinate.)150 3508 y Fh(set)m(y)390 3655 y Fk(SETY)47 b(ycor)150 3823 y Fs(mo)m(v)m(es)31 b(the)e(turtle)h(v)m(ertically)i(from)d(its)h(old)g (p)s(osition)f(to)i(a)e(new)g(absolute)i(v)m(ertical)g(co)s(ordinate.) 41 b(The)150 3932 y(input)29 b(is)i(the)f(new)g(Y)h(co)s(ordinate.)150 4128 y Fh(setheading)390 4275 y Fk(SETHEADING)45 b(degrees)390 4385 y(SETH)i(degrees)150 4552 y Fs(turns)29 b(the)i(turtle)g(to)g(a)g (new)f(absolute)i(heading.)41 b(The)30 b(input)g(is)g(a)h(n)m(um)m(b)s (er,)f(the)h(heading)f(in)g(degrees)150 4662 y(clo)s(c)m(kwise)i(from)e (the)g(p)s(ositiv)m(e)i(Y)e(axis.)150 4858 y Fh(home)390 5005 y Fk(HOME)150 5172 y Fs(mo)m(v)m(es)i(the)e(turtle)h(to)g(the)g (cen)m(ter)g(of)g(the)f(screen.)41 b(Equiv)-5 b(alen)m(t)31 b(to)h Fk(SETPOS)46 b([0)h(0])g(SETHEADING)e(0.)150 5340 y Fs(See)31 b([SETPOS],)e(page)i(38,)g(,)g(See)g([SETHEADING],)g(page)g (38,)g(.)p eop end %%Page: 39 52 TeXDict begin 39 51 bop 150 -116 a Fs(Chapter)30 b(6:)41 b(Graphics)2689 b(39)150 299 y Fh(arc)390 446 y Fk(ARC)47 b(angle)f(radius)150 614 y Fs(dra)m(ws)29 b(an)h(arc)g(of)g(a)g (circle,)i(with)d(the)h(turtle)g(at)h(the)f(cen)m(ter,)h(with)e(the)h (sp)s(eci\014ed)f(radius,)h(starting)g(at)150 723 y(the)k(turtle's)g (heading)g(and)f(extending)h(clo)s(c)m(kwise)h(through)e(the)h(sp)s (eci\014ed)f(angle.)52 b(The)33 b(turtle)h(do)s(es)150 833 y(not)d(mo)m(v)m(e.)150 1068 y Fr(6.2)68 b(T)-11 b(urtle)45 b(Motion)g(Queries)150 1253 y Fh(p)s(os)390 1400 y Fk(POS)150 1568 y Fs(outputs)30 b(the)g(turtle's)h(curren)m(t)f (p)s(osition,)h(as)g(a)g(list)g(of)f(t)m(w)m(o)i(n)m(um)m(b)s(ers,)d (the)i(X)f(and)g(Y)g(co)s(ordinates.)150 1761 y Fh(xcor)390 1908 y Fk(XCOR)47 b(\(library)e(procedure\))150 2076 y Fs(outputs)30 b(a)h(n)m(um)m(b)s(er,)e(the)h(turtle's)h(X)g(co)s (ordinate.)150 2269 y Fh(ycor)390 2416 y Fk(YCOR)47 b(\(library)e (procedure\))150 2584 y Fs(outputs)30 b(a)h(n)m(um)m(b)s(er,)e(the)h (turtle's)h(Y)g(co)s(ordinate.)150 2778 y Fh(heading)390 2924 y Fk(HEADING)150 3092 y Fs(outputs)f(a)h(n)m(um)m(b)s(er,)e(the)h (turtle's)h(heading)g(in)f(degrees.)150 3286 y Fh(to)m(w)m(ards)390 3433 y Fk(TOWARDS)46 b(pos)150 3600 y Fs(outputs)30 b(a)i(n)m(um)m(b)s (er,)e(the)h(heading)g(at)h(whic)m(h)e(the)i(turtle)f(should)f(b)s(e)g (facing)i(so)f(that)h(it)f(w)m(ould)g(p)s(oin)m(t)150 3710 y(from)f(its)h(curren)m(t)f(p)s(osition)g(to)h(the)g(p)s(osition)f (giv)m(en)i(as)e(the)h(input.)150 3904 y Fh(scrunc)m(h)390 4050 y Fk(SCRUNCH)150 4218 y Fs(outputs)23 b(a)h(list)g(con)m(taining)h (t)m(w)m(o)g(n)m(um)m(b)s(ers,)f(the)g(X)g(and)f(Y)g(scrunc)m(h)g (factors,)j(as)e(used)f(b)m(y)g Fk(SETSCRUNCH)p Fs(.)150 4328 y(\(But)31 b(note)g(that)g Fk(SETSCRUNCH)c Fs(tak)m(es)32 b(t)m(w)m(o)g(n)m(um)m(b)s(ers)d(as)i(inputs,)e(not)i(one)f(list)h(of)g (n)m(um)m(b)s(ers.\))150 4495 y(See)g([SETSCR)m(UNCH],)e(page)j(42,)f (.)150 4731 y Fr(6.3)68 b(T)-11 b(urtle)45 b(and)g(Windo)l(w)g(Con)l (trol)150 4916 y Fh(sho)m(wturtle)390 5063 y Fk(SHOWTURTLE)390 5172 y(ST)150 5340 y Fs(mak)m(es)31 b(the)g(turtle)g(visible.)p eop end %%Page: 40 53 TeXDict begin 40 52 bop 150 -116 a Fs(40)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fh(hideturtle)390 446 y Fk(HIDETURTLE)390 555 y(HT)150 723 y Fs(mak)m(es)44 b(the)f(turtle)h(in)m(visible.)80 b(It's)43 b(a)h(go)s(o)s(d)f(idea)h(to)g(do)f(this)g(while)g(y)m(ou're) h(in)f(the)g(middle)g(of)h(a)150 833 y(complicated)32 b(dra)m(wing,)f(b)s(ecause)f(hiding)g(the)g(turtle)h(sp)s(eeds)e(up)h (the)g(dra)m(wing)g(substan)m(tially)-8 b(.)150 1034 y Fh(clean)390 1181 y Fk(CLEAN)150 1349 y Fs(erases)31 b(all)g(lines)g(that)g(the)g(turtle)f(has)h(dra)m(wn)e(on)i(the)f (graphics)h(windo)m(w.)40 b(The)30 b(turtle's)h(state)h(\(p)s(osi-)150 1458 y(tion,)f(heading,)g(p)s(en)e(mo)s(de,)h(etc.\))42 b(is)31 b(not)f(c)m(hanged.)150 1659 y Fh(clearscreen)390 1806 y Fk(CLEARSCREEN)390 1916 y(CS)150 2084 y Fs(erases)37 b(the)f(graphics)h(windo)m(w)e(and)h(sends)f(the)i(turtle)f(to)h(its)g (initial)h(p)s(osition)e(and)g(heading.)58 b(Lik)m(e)150 2193 y Fk(HOME)29 b Fs(and)h Fk(CLEAN)f Fs(together.)150 2361 y(See)i([HOME],)g(page)g(38,)g(.)150 2562 y Fh(wrap)390 2709 y Fk(WRAP)150 2877 y Fs(tells)k(the)f(turtle)g(to)h(en)m(ter)g (wrap)e(mo)s(de:)47 b(F)-8 b(rom)34 b(no)m(w)g(on,)h(if)f(the)g(turtle) g(is)g(ask)m(ed)h(to)f(mo)m(v)m(e)i(past)e(the)150 2986 y(b)s(oundary)26 b(of)h(the)h(graphics)g(windo)m(w,)f(it)i(will)f Fk(")p Fs(wrap)e(around)p Fk(")g Fs(and)h(reapp)s(ear)g(at)i(the)e(opp) s(osite)h(edge)150 3096 y(of)34 b(the)h(windo)m(w.)51 b(The)34 b(top)g(edge)h(wraps)e(to)i(the)g(b)s(ottom)f(edge,)i(while)e (the)h(left)g(edge)g(wraps)e(to)i(the)150 3206 y(righ)m(t)26 b(edge.)40 b(\(So)26 b(the)g(windo)m(w)g(is)f(top)s(ologically)k(equiv) -5 b(alen)m(t)27 b(to)g(a)f(torus.\))39 b(This)25 b(is)h(the)g (turtle's)h(initial)150 3315 y(mo)s(de.)40 b(Compare)30 b Fk(WINDOW)f Fs(and)h Fk(FENCE)p Fs(.)150 3483 y(See)h([FENCE],)g (page)g(40,)g(.)150 3684 y Fh(windo)m(w)390 3831 y Fk(WINDOW)150 3999 y Fs(tells)38 b(the)f(turtle)h(to)f(en)m(ter)h(windo)m(w)f(mo)s (de:)53 b(F)-8 b(rom)38 b(no)m(w)f(on,)h(if)f(the)h(turtle)f(is)g(ask)m (ed)h(to)f(mo)m(v)m(e)i(past)150 4108 y(the)32 b(b)s(oundary)e(of)j (the)f(graphics)g(windo)m(w,)g(it)h(will)f(mo)m(v)m(e)i(o\013screen.)46 b(The)32 b(visible)g(graphics)g(windo)m(w)150 4218 y(is)i(considered)f (as)h(just)f(part)g(of)h(an)g(in\014nite)f(graphics)h(plane;)h(the)f (turtle)g(can)g(b)s(e)f(an)m(ywhere)g(on)h(the)150 4328 y(plane.)39 b(\(If)25 b(y)m(ou)h(lose)g(the)f(turtle,)i Fk(HOME)d Fs(will)i(bring)e(it)i(bac)m(k)g(to)g(the)f(cen)m(ter)i(of)e (the)g(windo)m(w.\))39 b(Compare)150 4437 y Fk(WRAP)29 b Fs(and)h Fk(FENCE)p Fs(.)150 4605 y(See)h([HOME],)g(page)g(38,)g(.) 150 4806 y Fh(fence)390 4953 y Fk(FENCE)150 5121 y Fs(tells)k(the)f (turtle)g(to)g(en)m(ter)h(fence)f(mo)s(de:)47 b(F)-8 b(rom)34 b(no)m(w)g(on,)h(if)f(the)g(turtle)g(is)g(ask)m(ed)g(to)h(mo)m (v)m(e)g(past)f(the)150 5230 y(b)s(oundary)e(of)j(the)f(graphics)h (windo)m(w,)g(it)f(will)h(mo)m(v)m(e)h(as)e(far)h(as)f(it)h(can)g(and)e (then)h(stop)h(at)g(the)f(edge)150 5340 y(with)c(an)g Fk(")p Fs(out)h(of)f(b)s(ounds)p Fk(")e Fs(error)i(message.)42 b(Compare)30 b Fk(WRAP)f Fs(and)h Fk(WINDOW)p Fs(.)p eop end %%Page: 41 54 TeXDict begin 41 53 bop 150 -116 a Fs(Chapter)30 b(6:)41 b(Graphics)2689 b(41)150 299 y(See)31 b([WRAP],)g(page)g(40,)h(.)150 486 y Fh(\014ll)390 633 y Fk(FILL)150 801 y Fs(\014lls)39 b(in)f(a)i(region)f(of)g(the)g(graphics)g(windo)m(w)g(con)m(taining)h (the)f(turtle)g(and)g(b)s(ounded)d(b)m(y)j(lines)g(that)150 910 y(ha)m(v)m(e)d(b)s(een)f(dra)m(wn)f(earlier.)56 b(This)34 b(is)h(not)g(p)s(ortable;)j(it)e(do)s(esn't)f(w)m(ork)g(for)g(all)h (mac)m(hines,)h(and)d(ma)m(y)150 1020 y(not)d(w)m(ork)f(exactly)i(the)f (same)g(w)m(a)m(y)g(on)f(di\013eren)m(t)h(mac)m(hines.)150 1207 y Fh(\014lled)390 1354 y Fk(FILLED)46 b(color)g(instructions)150 1522 y Fs(runs)30 b(the)h(instructions,)h(remem)m(b)s(ering)f(all)h(p)s (oin)m(ts)g(visited)f(b)m(y)h(turtle)g(motion)g(commands,)f(starting) 150 1631 y Fg(and)39 b(ending)44 b Fs(with)36 b(the)h(turtle's)f (initial)i(p)s(osition.)58 b(Then)36 b(dra)m(ws)f(\(ignoring)i(p)s (enmo)s(de\))e(the)i(result-)150 1741 y(ing)f(p)s(olygon,)h(in)e(the)h (curren)m(t)f(p)s(en)f(color,)39 b(\014lling)c(the)h(p)s(olygon)g(with) f(the)h(giv)m(en)g(color,)i(whic)m(h)e(can)150 1850 y(b)s(e)h(a)g (color)i(n)m(um)m(b)s(er)d(or)h(an)g(R)m(GB)h(list.)63 b(The)36 b(instruction)i(list)f(cannot)h(include)f(another)h(FILLED)150 1960 y(in)m(v)m(o)s(cation.)43 b(\(wxWidgets)31 b(only\))150 2147 y Fh(lab)s(el)390 2294 y Fk(LABEL)46 b(text)150 2462 y Fs(tak)m(es)33 b(a)e(w)m(ord)g(or)g(list)h(as)f(input,)f(and)h (prin)m(ts)f(the)i(input)e(on)h(the)g(graphics)g(windo)m(w,)g(starting) h(at)g(the)150 2571 y(turtle's)f(p)s(osition.)150 2758 y Fh(setlab)s(elheigh)m(t)390 2905 y Fk(SETLABELHEIGHT)44 b(height)150 3073 y Fs(command)36 b(\(wxWidgets)i(only\).)59 b(T)-8 b(ak)m(es)37 b(a)g(p)s(ositiv)m(e)g(in)m(teger)h(argumen)m(t)f (and)e(tries)i(to)g(set)g(the)f(fon)m(t)150 3183 y(size)41 b(so)f(that)h(the)f(c)m(haracter)i(heigh)m(t)f(\(including)f (descenders\))g(is)g(that)g(man)m(y)h(turtle)f(steps.)70 b(This)150 3292 y(will)31 b(b)s(e)e(di\013eren)m(t)i(from)f(the)g(n)m (um)m(b)s(er)f(of)h(screen)h(pixels)f(if)g Fk(SETSCRUNCH)e Fs(has)i(b)s(een)f(used.)40 b(Also,)31 b(note)150 3402 y(that)j Fk(SETSCRUNCH)d Fs(c)m(hanges)j(the)g(fon)m(t)g(size)g(to)h (try)e(to)h(preserv)m(e)g(this)f(heigh)m(t)i(in)e(turtle)h(steps.)50 b(Note)150 3511 y(that)32 b(the)g(query)e(op)s(eration)i(corresp)s (onding)f(to)h(this)f(command)g(is)h Fk(LABELSIZE)p Fs(,)d(not)j Fk(LABELHEIGHT)p Fs(,)150 3621 y(b)s(ecause)e(it)h(tells)h(y)m(ou)e (the)h(width)f(as)g(w)m(ell)i(as)e(the)h(heigh)m(t)g(of)f(c)m (haracters)i(in)e(the)h(curren)m(t)f(fon)m(t.)150 3808 y Fh(textscreen)390 3955 y Fk(TEXTSCREEN)390 4064 y(TS)150 4232 y Fs(rearranges)40 b(the)f(size)h(and)f(p)s(osition)g(of)h(windo)m (ws)e(to)i(maximize)h(the)e(space)h(a)m(v)-5 b(ailable)41 b(in)e(the)h(text)150 4342 y(windo)m(w)33 b(\(the)i(windo)m(w)e(used)h (for)f(in)m(teraction)j(with)e(Logo\).)53 b(The)34 b(details)h (di\013er)f(among)g(mac)m(hines.)150 4451 y(Compare)c Fk(SPLITSCREEN)d Fs(and)j Fk(FULLSCREEN)p Fs(.)150 4619 y(See)h([SPLITSCREEN],)d(page)j(42,)h(.)150 4806 y Fh(fullscreen)390 4953 y Fk(FULLSCREEN)390 5063 y(FS)150 5230 y Fs(rearranges)27 b(the)h(size)g(and)e(p)s(osition)h(of)h(windo)m(ws)e(to)i(maximize)g (the)g(space)f(a)m(v)-5 b(ailable)30 b(in)d(the)g(graphics)150 5340 y(windo)m(w.)40 b(The)30 b(details)h(di\013er)g(among)f(mac)m (hines.)42 b(Compare)30 b Fk(SPLITSCREEN)d Fs(and)j Fk(TEXTSCREEN)p Fs(.)p eop end %%Page: 42 55 TeXDict begin 42 54 bop 150 -116 a Fs(42)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(Since)38 b(there)f(m)m(ust)h(b)s(e)f(a)h(text)g (windo)m(w)f(to)h(allo)m(w)h(prin)m(ting)f(\(including)f(the)h(prin)m (ting)f(of)h(the)g(Logo)150 408 y(prompt\),)e(Logo)g(automatically)i (switc)m(hes)e(from)f(fullscreen)g(to)h(splitscreen)f(whenev)m(er)g(an) m(ything)h(is)150 518 y(prin)m(ted.)150 686 y(In)g(the)h(DOS)g(v)m (ersion,)i(switc)m(hing)f(from)e(fullscreen)h(to)h(splitscreen)f(loses) h(the)f(part)g(of)g(the)g(picture)150 795 y(that's)24 b(hidden)e(b)m(y)h(the)g(text)h(windo)m(w.)38 b([This)23 b(design)g(decision)h(follo)m(ws)g(from)f(the)g(scarcit)m(y)i(of)e (memory)-8 b(,)150 905 y(so)28 b(that)h(the)f(extra)g(memory)g(to)g (remem)m(b)s(er)g(an)f(in)m(visible)i(part)f(of)g(a)g(dra)m(wing)g (seems)g(to)s(o)g(exp)s(ensiv)m(e.])150 1089 y Fh(splitscreen)390 1236 y Fk(SPLITSCREEN)390 1346 y(SS)150 1513 y Fs(rearranges)21 b(the)g(size)g(and)f(p)s(osition)h(of)f(windo)m(ws)g(to)i(allo)m(w)g (some)f(ro)s(om)f(for)g(text)i(in)m(teraction)g(while)f(also)150 1623 y(k)m(eeping)31 b(most)f(of)g(the)g(graphics)f(windo)m(w)g (visible.)41 b(The)30 b(details)g(di\013er)g(among)g(mac)m(hines.)41 b(Compare)150 1733 y Fk(TEXTSCREEN)28 b Fs(and)h Fk(FULLSCREEN)p Fs(.)150 1900 y(See)i([TEXTSCREEN],)e(page)i(41,)h(.)150 2085 y Fh(setscrunc)m(h)390 2232 y Fk(SETSCRUNCH)45 b(xscale)h(yscale) 150 2399 y Fs(adjusts)35 b(the)g(asp)s(ect)h(ratio)g(and)f(scaling)h (of)g(the)g(graphics)f(displa)m(y)-8 b(.)56 b(After)36 b(this)f(command)g(is)g(used,)150 2509 y(all)c(further)f(turtle)h (motion)g(will)g(b)s(e)f(adjusted)g(b)m(y)g(m)m(ultiplying)h(the)g (horizon)m(tal)h(and)e(v)m(ertical)j(exten)m(t)150 2619 y(of)43 b(the)g(motion)g(b)m(y)g(the)g(t)m(w)m(o)h(n)m(um)m(b)s(ers)e (giv)m(en)h(as)g(inputs.)77 b(F)-8 b(or)44 b(example,)j(after)c(the)g (instruction)150 2728 y Fk(SETSCRUNCH)i(2)i(1)c Fs(motion)h(at)f(a)g (heading)g(of)g(45)h(degrees)f(will)h(mo)m(v)m(e)g(t)m(wice)g(as)f(far) g(horizon)m(tally)150 2838 y(as)h(v)m(ertically)-8 b(.)82 b(If)43 b(y)m(our)g(squares)g(don't)h(come)g(out)f(square,)k(try)c (this.)80 b(\(Alternativ)m(ely)-8 b(,)50 b(y)m(ou)44 b(can)150 2947 y(delib)s(erately)31 b(misadjust)f(the)g(asp)s(ect)h (ratio)h(to)f(dra)m(w)f(an)g(ellipse.\))150 3115 y(F)-8 b(or)34 b(all)f(mo)s(dern)f(computers,)i(b)s(oth)e(scale)i(factors)g (are)f(initially)h(1.)49 b(F)-8 b(or)34 b(DOS)e(mac)m(hines,)j(the)e (scale)150 3225 y(factors)g(are)g(initially)h(set)f(according)g(to)g (what)f(the)h(hardw)m(are)f(claims)h(the)g(asp)s(ect)g(ratio)g(is,)g (but)f(the)150 3334 y(hardw)m(are)d(sometimes)i(lies.)41 b(F)-8 b(or)31 b(DOS,)f(the)g(v)-5 b(alues)30 b(set)g(b)m(y)g Fk(SETSCRUNCH)d Fs(are)j(remem)m(b)s(ered)f(in)h(a)g(\014le)150 3444 y(\(called)i Fk(scrunch.dat)p Fs(\))c(and)h(are)i(automatically)i (put)d(in)m(to)h(e\013ect)h(when)e(a)g(Logo)i(session)e(b)s(egins.)150 3628 y Fh(refresh)390 3775 y Fk(REFRESH)150 3943 y Fs(\(command\))h (tells)g(Logo)g(to)g(remem)m(b)s(er)f(the)g(turtle's)h(motions)f(so)h (that)f(they)h(can)f(b)s(e)g(used)f(for)h(high-)150 4052 y(resolution)35 b(prin)m(ting)g(\(wxWidgets\))h(or)f(to)g(refresh)f (the)h(graphics)g(windo)m(w)f(if)g(it)i(is)e(mo)m(v)m(ed,)j(resized,) 150 4162 y(or)30 b(o)m(v)m(erla)m(y)m(ed)k(\(non-wxWidgets\).)42 b(This)29 b(is)i(the)f(default.)150 4346 y Fh(norefresh)390 4493 y Fk(NOREFRESH)150 4661 y Fs(\(command\))k(tells)h(Logo)f(not)g (to)g(remem)m(b)s(er)f(the)h(turtle's)g(motions,)h(whic)m(h)e(ma)m(y)h (b)s(e)f(useful)g(to)h(sa)m(v)m(e)150 4770 y(time)e(and)e(memory)h(if)g (y)m(our)h(program)e(is)i(in)m(teractiv)m(e)i(or)d(animated,)h(rather)f (than)g(dra)m(wing)g(a)g(static)150 4880 y(picture)i(y)m(ou'll)g(w)m (an)m(t)h(to)f(prin)m(t)g(later)g(\(wxWidgets\).)50 b(In)32 b(non-wxWidgets)h(v)m(ersions,)h(using)e(NORE-)150 4990 y(FRESH)j(ma)m(y)i(prev)m(en)m(t)f(Logo)h(from)e(restoring)h(the)g (graphics)g(image)h(after)f(the)g(windo)m(w)f(is)h(mo)m(v)m(ed,)150 5099 y(resized,)31 b(or)f(o)m(v)m(erla)m(y)m(ed.)150 5325 y Fr(6.4)68 b(T)-11 b(urtle)45 b(and)g(Windo)l(w)g(Queries)p eop end %%Page: 43 56 TeXDict begin 43 55 bop 150 -116 a Fs(Chapter)30 b(6:)41 b(Graphics)2689 b(43)150 299 y Fh(sho)m(wnp)390 446 y Fk(SHOWNP)390 555 y(SHOWN?)150 723 y Fs(outputs)29 b Fk(TRUE)f Fs(if)h(the)g(turtle)h(is)f(sho)m(wn)g(\(visible\),)h Fk(FALSE)e Fs(if)h(the)h(turtle)f(is)g(hidden.)39 b(See)30 b Fk(SHOWTURTLE)150 833 y Fs(and)g Fk(HIDETURTLE)p Fs(.)150 1000 y(See)h([SHO)m(WTUR)-8 b(TLE],)31 b(page)g(39,)g(,)g([HIDETUR)-8 b(TLE],)31 b(page)g(40,)g(.)150 1208 y Fh(screenmo)s(de)390 1355 y Fk(SCREENMODE)150 1523 y Fs(outputs)44 b(the)g(w)m(ord)g Fk(TEXTSCREEN)p Fs(,)i Fk(SPLITSCREEN)p Fs(,)f(or)f Fk(FULLSCREEN)e Fs(dep)s(ending)g(on)j(the)f(curren)m(t)150 1632 y(screen)30 b(mo)s(de.)150 1840 y Fh(turtlemo)s(de)390 1987 y Fk(TURTLEMODE)150 2155 y Fs(outputs)g(the)g(w)m(ord)g Fk(WRAP)p Fs(,)g Fk(FENCE)p Fs(,)f(or)h Fk(WINDOW)f Fs(dep)s(ending)g(on)h(the)h(curren) m(t)f(turtle)h(mo)s(de.)150 2362 y Fh(lab)s(elsize)390 2509 y Fk(LABELSIZE)150 2677 y Fs(\(wxWidgets)d(only\))f(outputs)g(a)g (list)h(of)f(t)m(w)m(o)h(p)s(ositiv)m(e)g(in)m(tegers,)h(the)e(width)f (and)h(heigh)m(t)g(of)g(c)m(haracters)150 2787 y(displa)m(y)m(ed)36 b(b)m(y)f Fk(LABEL)f Fs(measured)h(in)g(turtle)g(steps)h(\(whic)m(h)f (will)h(b)s(e)e(di\013eren)m(t)i(from)f(screen)g(pixels)h(if)150 2896 y Fk(SETSCRUNCH)d Fs(has)i(b)s(een)g(used\).)56 b(There)35 b(is)h(no)f Fk(SETLABELSIZE)d Fs(b)s(ecause)k(the)g(width)e (and)h(heigh)m(t)i(of)150 3006 y(a)c(fon)m(t)g(are)h(not)f(separately)h (con)m(trollable,)h(so)e(the)g(in)m(v)m(erse)h(of)f(this)g(op)s (eration)g(is)g Fk(SETLABELHEIGHT)p Fs(,)150 3115 y(whic)m(h)d(tak)m (es)i(just)e(one)g(n)m(um)m(b)s(er)f(for)i(the)f(desired)g(heigh)m(t.) 150 3369 y Fr(6.5)68 b(P)l(en)45 b(and)g(Bac)l(kground)f(Con)l(trol)150 3528 y Fs(The)29 b(turtle)i(carries)f(a)g(p)s(en)f(that)h(can)g(dra)m (w)g(pictures.)40 b(A)m(t)31 b(an)m(y)f(time)h(the)f(p)s(en)e(can)i(b)s (e)g(UP)f(\(in)h(whic)m(h)150 3638 y(case)f(mo)m(ving)f(the)g(turtle)h (do)s(es)e(not)h(c)m(hange)h(what's)f(on)g(the)g(graphics)f(screen\))i (or)e(DO)m(WN)i(\(in)f(whic)m(h)150 3747 y(case)37 b(the)g(turtle)f (lea)m(v)m(es)j(a)d(trace\).)60 b(If)35 b(the)i(p)s(en)e(is)h(do)m(wn,) h(it)g(can)f(op)s(erate)h(in)f(one)h(of)f(three)g(mo)s(des:)150 3857 y(P)-8 b(AINT)31 b(\(so)h(that)g(it)f(dra)m(ws)g(lines)g(when)f (the)i(turtle)f(mo)m(v)m(es\),)i(ERASE)e(\(so)g(that)h(it)g(erases)f (an)m(y)h(lines)150 3967 y(that)39 b(migh)m(t)h(ha)m(v)m(e)g(b)s(een)e (dra)m(wn)g(on)h(or)g(through)f(that)i(path)e(earlier\),)43 b(or)c(REVERSE)e(\(so)j(that)f(it)150 4076 y(in)m(v)m(erts)31 b(the)g(status)f(of)h(eac)m(h)h(p)s(oin)m(t)e(along)h(the)g(turtle's)g (path\).)150 4284 y Fh(p)s(endo)m(wn)390 4431 y Fk(PENDOWN)390 4540 y(PD)150 4708 y Fs(sets)g(the)f(p)s(en's)g(p)s(osition)g(to)h Fk(DOWN)p Fs(,)f(without)g(c)m(hanging)h(its)g(mo)s(de.)150 4916 y Fh(p)s(en)m(up)390 5063 y Fk(PENUP)390 5172 y(PU)150 5340 y Fs(sets)g(the)f(p)s(en's)g(p)s(osition)g(to)h Fk(UP)p Fs(,)f(without)h(c)m(hanging)g(its)g(mo)s(de.)p eop end %%Page: 44 57 TeXDict begin 44 56 bop 150 -116 a Fs(44)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fh(p)s(enpain)m(t)390 446 y Fk(PENPAINT)390 555 y(PPT)150 723 y Fs(sets)h(the)f(p)s(en's)g(p)s(osition)g(to)h Fk(DOWN)e Fs(and)h(mo)s(de)g(to)h Fk(PAINT)p Fs(.)150 946 y Fh(p)s(enerase)390 1093 y Fk(PENERASE)390 1203 y(PE)150 1371 y Fs(sets)g(the)f(p)s(en's)g(p)s(osition)g(to)h Fk(DOWN)e Fs(and)h(mo)s(de)g(to)h Fk(ERASE)p Fs(.)150 1538 y(See)g([ERASE],)f(page)h(57,)h(.)150 1761 y Fh(p)s(enrev)m(erse) 390 1908 y Fk(PENREVERSE)390 2018 y(PX)150 2186 y Fs(sets)45 b(the)h(p)s(en's)e(p)s(osition)h(to)h Fk(DOWN)e Fs(and)g(mo)s(de)h(to)h Fk(REVERSE)p Fs(.)83 b(\(This)44 b(ma)m(y)i(in)m(teract)h(in)d(system-) 150 2295 y(dep)s(enden)m(t)29 b(w)m(a)m(ys)j(with)e(use)g(of)g (color.\))150 2463 y(See)h([REVERSE],)f(page)h(10,)g(.)150 2686 y Fh(setp)s(encolor)390 2833 y Fk(SETPENCOLOR)45 b(colornumber.or.rgblist)390 2943 y(SETPC)h(colornumber.or.rgblist)150 3110 y Fs(sets)36 b(the)h(p)s(en)d(color)k(to)e(the)h(giv)m(en)g(n)m (um)m(b)s(er,)f(whic)m(h)g(m)m(ust)g(b)s(e)f(a)h(nonnegativ)m(e)i(in)m (teger.)59 b(There)36 b(are)150 3220 y(initial)c(assignmen)m(ts)f(for)f (the)g(\014rst)g(16)h(colors:)438 3388 y Fk(0)95 b(black)f(1)h(blue)g (2)g(green)f(3)h(cyan)438 3497 y(4)g(red)g(5)g(magenta)e(6)i(yellow)f (7)48 b(white)438 3607 y(8)95 b(brown)f(9)h(tan)47 b(10)95 b(forest)46 b(11)95 b(aqua)390 3716 y(12)g(salmon)46 b(13)95 b(purple)46 b(14)95 b(orange)46 b(15)95 b(grey)150 3884 y Fs(but)29 b(other)i(colors)g(can)f(b)s(e)g(assigned)g(to)h(n)m (um)m(b)s(ers)d(b)m(y)i(the)h Fk(PALETTE)d Fs(command.)40 b(Alternativ)m(ely)-8 b(,)34 b(sets)150 3994 y(the)g(p)s(en)e(color)j (to)g(the)f(giv)m(en)g(R)m(GB)h(v)-5 b(alues)34 b(\(a)g(list)h(of)f (three)g(nonnegativ)m(e)h(n)m(um)m(b)s(ers)d(less)i(than)g(100)150 4103 y(sp)s(ecifying)c(the)h(p)s(ercen)m(t)f(saturation)h(of)g(red,)f (green,)h(and)f(blue)g(in)g(the)g(desired)g(color\).)150 4326 y Fh(setpalette)390 4473 y Fk(SETPALETTE)45 b(colornumber)g (rgblist)150 4641 y Fs(sets)e(the)g(actual)g(color)h(corresp)s(onding)d (to)j(a)f(giv)m(en)g(n)m(um)m(b)s(er,)i(if)d(allo)m(w)m(ed)i(b)m(y)f (the)f(hardw)m(are)h(and)150 4751 y(op)s(erating)31 b(system.)42 b(Colorn)m(um)m(b)s(er)30 b(m)m(ust)h(b)s(e)f(an)g(in)m(teger)i (greater)g(than)f(or)f(equal)i(to)f(8.)42 b(\(Logo)33 b(tries)150 4860 y(to)28 b(k)m(eep)f(the)g(\014rst)f(8)i(colors)g (constan)m(t.\))41 b(The)26 b(second)h(input)f(is)h(a)g(list)h(of)f (three)g(nonnegativ)m(e)h(n)m(um)m(b)s(ers)150 4970 y(less)j(than)f (100)h(sp)s(ecifying)g(the)f(p)s(ercen)m(t)h(saturation)g(of)f(red,)g (green,)h(and)f(blue)g(in)g(the)h(desired)f(color.)150 5193 y Fh(setp)s(ensize)390 5340 y Fk(SETPENSIZE)45 b(size)p eop end %%Page: 45 58 TeXDict begin 45 57 bop 150 -116 a Fs(Chapter)30 b(6:)41 b(Graphics)2689 b(45)150 299 y(sets)35 b(the)f(thic)m(kness)h(of)f(the) h(p)s(en.)51 b(The)34 b(input)f(is)h(either)h(a)g(single)g(p)s(ositiv)m (e)g(in)m(teger)g(or)g(a)f(list)h(of)g(t)m(w)m(o)150 408 y(p)s(ositiv)m(e)d(in)m(tegers)g(\(for)f(horizon)m(tal)i(and)d(v)m (ertical)j(thic)m(kness\).)43 b(Some)31 b(v)m(ersions)g(pa)m(y)g(no)g (atten)m(tion)i(to)150 518 y(the)e(second)f(n)m(um)m(b)s(er,)f(but)h (alw)m(a)m(ys)i(ha)m(v)m(e)f(a)g(square)f(p)s(en.)150 711 y Fh(setp)s(enpattern)390 858 y Fk(SETPENPATTERN)44 b(pattern)150 1026 y Fs(sets)31 b(hardw)m(are-dep)s(enden)m(t)f(p)s(en) g(c)m(haracteristics.)44 b(This)30 b(command)h(is)g(not)g(guaran)m (teed)h(compatible)150 1136 y(b)s(et)m(w)m(een)f(implemen)m(tations)h (on)e(di\013eren)m(t)h(mac)m(hines.)150 1329 y Fh(setp)s(en)390 1476 y Fk(SETPEN)46 b(list)h(\(library)e(procedure\))150 1644 y Fs(sets)29 b(the)g(p)s(en's)f(p)s(osition,)h(mo)s(de,)g(thic)m (kness,)h(and)e(hardw)m(are-dep)s(enden)m(t)g(c)m(haracteristics)j (according)150 1753 y(to)38 b(the)g(information)f(in)g(the)h(input)e (list,)k(whic)m(h)d(should)f(b)s(e)h(tak)m(en)h(from)f(an)g(earlier)h (in)m(v)m(o)s(cation)i(of)150 1863 y Fk(PEN)p Fs(.)150 2030 y(See)31 b([PEN],)g(page)g(46,)g(.)150 2224 y Fh(setbac)m(kground) 390 2371 y Fk(SETBACKGROUND)44 b(colornumber.or.rgblist)390 2480 y(SETBG)i(colornumber.or.rgblist)150 2648 y Fs(set)23 b(the)g(screen)g(bac)m(kground)g(color)h(b)m(y)e(slot)i(n)m(um)m(b)s (er)d(or)i(R)m(GB)h(v)-5 b(alues.)38 b(See)23 b Fk(SETPENCOLOR)d Fs(for)j(details.)150 2816 y(See)31 b([SETPENCOLOR],)d(page)k(44,)f(.) 150 3051 y Fr(6.6)68 b(P)l(en)45 b(Queries)150 3236 y Fh(p)s(endo)m(wnp)390 3383 y Fk(PENDOWNP)390 3492 y(PENDOWN?)150 3660 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(the)h(p)s(en)e(is)i(do)m(wn,)f Fk(FALSE)f Fs(if)h(it's)h(up.)150 3853 y Fh(p)s(enmo)s(de)390 4000 y Fk(PENMODE)150 4168 y Fs(outputs)f(one)h(of)f(the)h(w)m(ords)e Fk(PAINT)p Fs(,)h Fk(ERASE)p Fs(,)f(or)h Fk(REVERSE)f Fs(according)i(to)g(the)g(curren)m(t)f(p)s(en)f(mo)s(de.)150 4336 y(See)i([ERASE],)f(page)h(57,)h(,)e([REVERSE],)g(page)h(10,)h(.) 150 4529 y Fh(p)s(encolor)390 4676 y Fk(PENCOLOR)390 4785 y(PC)150 4953 y Fs(outputs)c(a)h(color)h(n)m(um)m(b)s(er,)e(a)h (nonnegativ)m(e)i(in)m(teger)f(that)f(is)g(asso)s(ciated)h(with)e(a)h (particular)h(color,)g(or)150 5063 y(a)d(list)g(of)f(R)m(GB)i(v)-5 b(alues)27 b(if)f(suc)m(h)g(a)h(list)g(w)m(as)g(used)e(as)i(the)f(most) h(recen)m(t)h(input)d(to)i Fk(SETPENCOLOR)p Fs(.)36 b(There)150 5172 y(are)31 b(initial)g(assignmen)m(ts)g(for)g(the)f(\014rst)g(16)h (colors:)438 5340 y Fk(0)95 b(black)380 b(1)96 b(blue)428 b(2)95 b(green)381 b(3)95 b(cyan)p eop end %%Page: 46 59 TeXDict begin 46 58 bop 150 -116 a Fs(46)2551 b(BERKELEY)30 b(LOGO)g(6.1)438 299 y Fk(4)95 b(red)476 b(5)96 b(magenta)284 b(6)95 b(yellow)333 b(7)47 b(white)438 408 y(8)95 b(brown)380 b(9)96 b(tan)428 b(10)95 b(forest)285 b(11)95 b(aqua)390 518 y(12)g(salmon)285 b(13)95 b(purple)284 b(14)95 b(orange)285 b(15)95 b(grey)150 686 y Fs(but)30 b(other)g(colors)i(can)e(b)s(e)g (assigned)h(to)g(n)m(um)m(b)s(ers)e(b)m(y)h(the)g Fk(PALETTE)f Fs(command.)150 872 y Fh(palette)390 1019 y Fk(PALETTE)46 b(colornumber)150 1186 y Fs(outputs)28 b(a)h(list)g(of)g(three)g (nonnegativ)m(e)h(n)m(um)m(b)s(ers)d(less)i(than)f(100)i(sp)s(ecifying) f(the)g(p)s(ercen)m(t)f(saturation)150 1296 y(of)j(red,)f(green,)h(and) e(blue)h(in)g(the)h(color)g(asso)s(ciated)h(with)e(the)h(giv)m(en)g(n)m (um)m(b)s(er.)150 1482 y Fh(p)s(ensize)390 1629 y Fk(PENSIZE)150 1797 y Fs(outputs)25 b(a)i(list)f(of)h(t)m(w)m(o)g(p)s(ositiv)m(e)g(in) m(tegers,)h(sp)s(ecifying)e(the)g(horizon)m(tal)i(and)d(v)m(ertical)j (thic)m(kness)f(of)f(the)150 1906 y(turtle)35 b(p)s(en.)51 b(\(In)34 b(some)h(implemen)m(tations,)i(including)d(wxWidgets,)i(the)f (t)m(w)m(o)h(n)m(um)m(b)s(ers)d(are)h(alw)m(a)m(ys)150 2016 y(equal.\))390 2183 y Fk(PENPATTERN)150 2351 y Fs(outputs)c (system-sp)s(eci\014c)h(p)s(en)e(information.)150 2537 y Fh(p)s(en)390 2684 y Fk(PEN)47 b(\(library)e(procedure\))150 2852 y Fs(outputs)27 b(a)h(list)h(con)m(taining)g(the)f(p)s(en's)e(p)s (osition,)j(mo)s(de,)f(thic)m(kness,)h(and)e(hardw)m(are-sp)s(eci\014c) g(c)m(harac-)150 2961 y(teristics,)32 b(for)e(use)g(b)m(y)g Fk(SETPEN)p Fs(.)150 3129 y(See)h([SETPEN],)f(page)h(45,)g(.)150 3315 y Fh(bac)m(kground)390 3462 y Fk(BACKGROUND)390 3572 y(BG)150 3739 y Fs(outputs)24 b(the)h(graphics)f(bac)m(kground)h (color,)i(either)e(as)g(a)g(slot)g(n)m(um)m(b)s(er)e(or)i(as)g(an)f(R)m (GB)i(list,)g(whic)m(hev)m(er)150 3849 y(w)m(a)m(y)31 b(it)g(w)m(as)g(set.)41 b(\(See)31 b Fk(PENCOLOR)p Fs(.\))150 4076 y Fr(6.7)68 b(Sa)l(ving)46 b(and)e(Loading)i(Pictures)150 4254 y Fh(sa)m(v)m(epict)390 4401 y Fk(SAVEPICT)g(filename)150 4569 y Fs(command.)38 b(W)-8 b(rites)24 b(a)f(\014le)g(with)g(the)g(sp) s(eci\014ed)f(name)h(con)m(taining)i(the)e(state)h(of)f(the)g(graphics) g(windo)m(w,)150 4678 y(including)f(an)m(y)h(nonstandard)e(color)j (palette)g(settings,)i(in)c(Logo's)i(in)m(ternal)f(format.)38 b(This)22 b(picture)h(can)150 4788 y(b)s(e)33 b(restored)h(to)g(the)g (screen)g(using)f Fk(LOADPICT)p Fs(.)49 b(The)33 b(format)h(is)g(not)g (p)s(ortable)f(b)s(et)m(w)m(een)i(platforms,)150 4897 y(nor)j(is)h(it)g(readable)h(b)m(y)e(other)i(programs.)65 b([EPSPICT],)38 b(page)h(47,)j(to)e(exp)s(ort)e(Logo)i(graphics)f(for) 150 5007 y(other)31 b(programs.)150 5193 y Fh(loadpict)390 5340 y Fk(LOADPICT)46 b(filename)p eop end %%Page: 47 60 TeXDict begin 47 59 bop 150 -116 a Fs(Chapter)30 b(6:)41 b(Graphics)2689 b(47)150 299 y(command.)39 b(Reads)25 b(the)g(sp)s(eci\014ed)f(\014le,)j(whic)m(h)d(m)m(ust)h(ha)m(v)m(e)i(b) s(een)d(written)h(b)m(y)g(a)g Fk(SAVEPICT)e Fs(command,)150 408 y(and)29 b(restores)h(the)g(graphics)g(windo)m(w)f(and)g(color)i (palette)g(settings)f(to)h(the)f(v)-5 b(alues)30 b(stored)f(in)h(the)g (\014le.)150 518 y(An)m(y)g(dra)m(wing)h(previously)f(on)g(the)h (screen)f(is)g(cleared.)150 686 y(See)h([SA)-10 b(VEPICT],)29 b(page)i(46,)h(.)150 871 y Fh(epspict)390 1018 y Fk(EPSPICT)46 b(filename)150 1185 y Fs(command.)66 b(W)-8 b(rites)40 b(a)f(\014le)g(with)g(the)g(sp)s(eci\014ed)f(name,)j(con)m(taining)f (an)f(Encapsulated)g(P)m(ostscript)150 1295 y(\(EPS\))c(represen)m (tation)h(of)f(the)g(state)h(of)f(the)g(graphics)g(windo)m(w.)53 b(This)34 b(\014le)h(can)h(b)s(e)e(imp)s(orted)g(in)m(to)150 1404 y(other)g(programs)f(that)h(understand)d(EPS)i(format.)50 b(Restrictions:)e(the)33 b(dra)m(wing)h(cannot)g(use)f Fk(FILL)p Fs(,)150 1514 y Fk(PENERASE)p Fs(,)27 b(or)j Fk(PENREVERSE)p Fs(;)d(an)m(y)i(suc)m(h)g(instructions)g(will)h(b)s(e)f (ignored)g(in)g(the)g(translation)i(to)f(P)m(ost-)150 1624 y(script)g(form.)150 1791 y(See)h([FILL],)f(page)i(41,)f(,)g(See)f ([PENERASE],)h(page)g(44,)g(,)g(See)f([PENREVERSE],)g(page)i(44,)f(.) 150 2018 y Fr(6.8)68 b(Mouse)45 b(Queries)150 2194 y Fh(mousep)s(os)390 2341 y Fk(MOUSEPOS)150 2509 y Fs(outputs)38 b(the)h(co)s(ordinates)g(of)f(the)h(mouse,)i(pro)m(vided)d(that)h(it's) g(within)f(the)h(graphics)f(windo)m(w,)i(in)150 2618 y(turtle)i(co)s(ordinates.)76 b(If)41 b(the)h(mouse)g(is)g(outside)g (the)g(graphics)f(windo)m(w,)k(then)c(the)h(last)h(p)s(osition)150 2728 y(within)26 b(the)g(windo)m(w)g(is)g(returned.)39 b(Exception:)g(If)26 b(a)h(mouse)f(button)g(is)g(pressed)g(within)f (the)i(graphics)150 2838 y(windo)m(w)34 b(and)g(held)g(while)g(the)h (mouse)f(is)h(dragged)g(outside)f(the)h(windo)m(w,)g(the)g(mouse's)f(p) s(osition)h(is)150 2947 y(returned)29 b(as)i(if)f(the)h(windo)m(w)f(w)m (ere)g(big)h(enough)f(to)h(include)f(it.)150 3132 y Fh(clic)m(kp)s(os) 390 3279 y Fk(CLICKPOS)150 3447 y Fs(outputs)38 b(the)g(co)s(ordinates) h(that)f(the)h(mouse)f(w)m(as)g(at)h(when)e(a)i(mouse)f(button)g(w)m (as)g(most)h(recen)m(tly)150 3556 y(pushed,)28 b(pro)m(vided)h(that)g (that)h(p)s(osition)f(w)m(as)h(within)e(the)i(graphics)f(windo)m(w,)g (in)f(turtle)i(co)s(ordinates.)150 3666 y(\(wxWidgets)i(only\))150 3851 y Fh(buttonp)390 3998 y Fk(BUTTONP)390 4107 y(BUTTON?)150 4275 y Fs(outputs)e Fk(TRUE)f Fs(if)h(a)g(mouse)g(button)g(is)g(do)m (wn)g(and)f(the)i(mouse)f(is)g(o)m(v)m(er)h(the)g(graphics)f(windo)m (w.)40 b(Once)150 4384 y(the)29 b(button)g(is)f(do)m(wn,)h Fk(BUTTONP)e Fs(remains)i(true)g(un)m(til)g(the)g(button)f(is)h (released,)i(ev)m(en)e(if)g(the)g(mouse)g(is)150 4494 y(dragged)i(out)f(of)h(the)f(graphics)h(windo)m(w.)150 4679 y Fh(button)390 4826 y Fk(BUTTON)150 4994 y Fs(outputs)j(0)g(if)h (no)f(mouse)g(button)g(has)g(b)s(een)f(pushed)g(inside)h(the)g(Logo)i (windo)m(w)d(since)i(the)g(last)g(call)150 5103 y(to)e Fk(BUTTON)p Fs(.)43 b(Otherwise,)32 b(it)g(outputs)g(an)f(in)m(teger)j (b)s(et)m(w)m(een)e(1)g(and)g(3)g(indicating)h(whic)m(h)e(button)h(w)m (as)150 5213 y(most)39 b(recen)m(tly)h(pressed.)64 b(Ordinarily)37 b(1)i(means)g(left,)i(2)e(means)f(righ)m(t,)k(and)c(3)g(means)h(cen)m (ter,)j(but)150 5322 y(op)s(erating)31 b(systems)f(ma)m(y)h (recon\014gure)f(these.)p eop end %%Page: 48 61 TeXDict begin 48 60 bop eop end %%Page: 49 62 TeXDict begin 49 61 bop 3659 -116 a Fs(49)150 299 y Fp(7)80 b(W)-13 b(orkspace)52 b(Managemen)l(t)150 712 y Fr(7.1)68 b(Pro)t(cedure)45 b(De\014nition)150 924 y Fh(to)390 1071 y Fk(TO)i(procname)f(:input1)g(:input2)f(...)95 b(\(special)46 b(form\))150 1239 y Fs(command.)k(Prepares)34 b(Logo)g(to)h(accept)g(a)f(pro)s(cedure)e(de\014nition.)51 b(The)33 b(pro)s(cedure)f(will)i(b)s(e)f(named)150 1348 y Fl(pro)s(cname)41 b Fs(and)36 b(there)h(m)m(ust)g(not)g(already)g(b)s (e)f(a)h(pro)s(cedure)f(b)m(y)h(that)g(name.)60 b(The)36 b(inputs)g(will)h(b)s(e)150 1458 y(called)30 b Fl(input1)36 b Fs(etc.)41 b(An)m(y)29 b(n)m(um)m(b)s(er)f(of)h(inputs)f(are)h(allo)m (w)m(ed,)j(including)c(none.)40 b(Names)30 b(of)f(pro)s(cedures)150 1567 y(and)h(inputs)f(are)i(case-insensitiv)m(e.)150 1735 y(Unlik)m(e)36 b(ev)m(ery)g(other)f(Logo)i(pro)s(cedure,)e(TO)f (tak)m(es)j(as)e(its)h(inputs)e(the)h(actual)i(w)m(ords)d(t)m(yp)s(ed)h (in)g(the)150 1845 y(instruction)28 b(line,)h(as)f(if)g(they)g(w)m(ere) g(all)h(quoted,)g(rather)f(than)f(the)h(results)g(of)g(ev)-5 b(aluating)29 b(expressions)150 1954 y(to)i(pro)m(vide)g(the)f(inputs.) 40 b(\(That's)31 b(what)f Fl(sp)s(ecial)h(form)f Fs(means.\))150 2122 y(This)d(v)m(ersion)h(of)g(Logo)h(allo)m(ws)g(v)-5 b(ariable)29 b(n)m(um)m(b)s(ers)d(of)i(inputs)f(to)h(a)g(pro)s(cedure.) 39 b(After)28 b(the)g(pro)s(cedure)150 2232 y(name)i(come)i(four)d (kinds)h(of)g(things,)h Fg(in)h(this)i(or)-5 b(der)10 b Fs(:)581 2399 y Fk(1.)143 b(0)47 b(or)g(more)g(REQUIRED)e(inputs)190 b(:FOO)46 b(:FROBOZZ)581 2509 y(2.)143 b(0)47 b(or)g(more)g(OPTIONAL)e (inputs)190 b([:BAZ)46 b(87])h([:THINGO)e(5+9])581 2619 y(3.)143 b(0)47 b(or)g(1)h(REST)e(input)572 b([:GARPLY])581 2728 y(4.)143 b(0)47 b(or)g(1)h(DEFAULT)d(number)381 b(5)150 2896 y Fs(Ev)m(ery)27 b(pro)s(cedure)f(has)h(a)g Fl(minim)m(um)p Fs(,)g Fl(default)p Fs(,)i(and)d Fl(maxim)m(um)h Fs(n)m(um)m(b)s(er)f(of)h(inputs.)38 b(\(The)27 b(latter)i(can)150 3005 y(b)s(e)h(in\014nite.\))150 3173 y(The)j Fl(minim)m(um)h Fs(n)m(um)m(b)s(er)e(of)i(inputs)f(is)h(the)g(n)m(um)m(b)s(er)f(of)h (required)f(inputs,)h(whic)m(h)g(m)m(ust)g(come)g(\014rst.)150 3283 y(A)c(required)g(input)f(is)i(indicated)g(b)m(y)f(the)390 3450 y Fk(:inputname)150 3618 y Fs(notation.)150 3786 y(After)21 b(all)h(the)g(required)e(inputs)g(can)h(b)s(e)g(zero)h(or)f (more)g(optional)h(inputs,)g(eac)m(h)h(of)e(whic)m(h)g(is)g(represen)m (ted)150 3895 y(b)m(y)30 b(the)h(follo)m(wing)h(notation:)390 4063 y Fk([:inputname)45 b(default.value.expressio)o(n])150 4231 y Fs(When)30 b(the)h(pro)s(cedure)f(is)g(in)m(v)m(ok)m(ed,)j(if)d (actual)i(inputs)e(are)g(not)h(supplied)f(for)g(these)h(optional)h (inputs,)150 4340 y(the)27 b Fl(default)g(v)-5 b(alue)27 b(expression)p Fs(s)f(are)h(ev)-5 b(aluated)28 b(to)f(set)g(v)-5 b(alues)27 b(for)g(the)f(corresp)s(onding)g(input)g(names.)150 4450 y(The)32 b(inputs)g(are)h(pro)s(cessed)g(from)f(left)h(to)h(righ)m (t,)g(so)f(a)g(default)g(v)-5 b(alue)34 b(expression)e(can)h(b)s(e)g (based)f(on)150 4560 y(earlier)f(inputs.)40 b(Example:)390 4727 y Fk(to)47 b(proc)g(:inlist)f([:startvalue)e(first)i(:inlist])150 4895 y Fs(If)30 b(the)g(pro)s(cedure)g(is)g(in)m(v)m(ok)m(ed)i(b)m(y)e (sa)m(ying)390 5063 y Fk(proc)47 b([a)g(b)g(c])150 5230 y Fs(then)39 b(the)h(v)-5 b(ariable)40 b Fk(inlist)e Fs(will)i(ha)m(v)m(e)g(the)g(v)-5 b(alue)40 b Fk([A)47 b(B)g(C])39 b Fs(and)g(the)h(v)-5 b(ariable)40 b Fk(startvalue)d Fs(will)150 5340 y(ha)m(v)m(e)32 b(the)e(v)-5 b(alue)31 b Fk(A)p Fs(.)40 b(If)30 b(the)h(pro)s(cedure)e(is)i(in)m(v)m(ok)m(ed)g (b)m(y)g(sa)m(ying)p eop end %%Page: 50 63 TeXDict begin 50 62 bop 150 -116 a Fs(50)2551 b(BERKELEY)30 b(LOGO)g(6.1)390 299 y Fk(\(proc)46 b([a)i(b)f(c])g("x\))150 467 y Fs(then)30 b Fk(inlist)f Fs(will)h(ha)m(v)m(e)i(the)f(v)-5 b(alue)30 b Fk([A)48 b(B)f(C])30 b Fs(and)g Fk(startvalue)d Fs(will)k(ha)m(v)m(e)h(the)e(v)-5 b(alue)31 b Fk(X)p Fs(.)150 634 y(After)i(all)h(the)f(required)f(and)h(optional)h(input)e (can)h(come)h(a)f(single)h Fl(rest)h Fs(input,)e(represen)m(ted)g(b)m (y)g(the)150 744 y(follo)m(wing)f(notation:)390 912 y Fk([:inputname])150 1079 y Fs(This)d(is)h(a)g(rest)g(input)e(rather)i (than)g(an)f(optional)i(input)e(b)s(ecause)h(there)f(is)h(no)g(default) g(v)-5 b(alue)30 b(expres-)150 1189 y(sion.)39 b(There)26 b(can)g(b)s(e)g(at)h(most)f(one)h(rest)f(input.)39 b(When)25 b(the)i(pro)s(cedure)e(is)h(in)m(v)m(ok)m(ed,)j(the)d(v)-5 b(alue)27 b(of)f(this)150 1298 y Fl(inputname)33 b Fs(will)d(b)s(e)e(a) i(list)f(con)m(taining)i(all)f(of)f(the)g(actual)i(inputs)d(pro)m (vided)g(that)i(w)m(ere)g(not)f(used)f(for)150 1408 y(required)i(or)g (optional)h(inputs.)40 b(Example:)390 1576 y Fk(to)47 b(proc)g(:in1)f([:in2)h("foo])f([:in3)h("baz])f([:in4])150 1743 y Fs(If)30 b(this)g(pro)s(cedure)f(is)i(in)m(v)m(ok)m(ed)h(b)m(y)e (sa)m(ying)390 1911 y Fk(proc)47 b("x)150 2079 y Fs(then)34 b Fk(in1)f Fs(has)h(the)g(v)-5 b(alue)34 b Fk(X)p Fs(,)h Fk(in2)e Fs(has)h(the)g(v)-5 b(alue)35 b Fk(FOO)p Fs(,)f Fk(in3)f Fs(has)h(the)h(v)-5 b(alue)34 b Fk(BAZ)p Fs(,)g(and)g Fk(in4)f Fs(has)h(the)150 2188 y(v)-5 b(alue)31 b Fk([])f Fs(\(the)h(empt)m(y)f(list\).)42 b(If)30 b(it's)h(in)m(v)m(ok)m(ed)h(b) m(y)e(sa)m(ying)390 2356 y Fk(\(proc)46 b("a)i("b)f("c)g("d)g("e\))150 2524 y Fs(then)31 b Fk(in1)g Fs(has)h(the)g(v)-5 b(alue)32 b Fk(A)p Fs(,)g Fk(in2)f Fs(has)g(the)h(v)-5 b(alue)32 b Fk(B)p Fs(,)g Fk(in3)f Fs(has)h(the)g(v)-5 b(alue)32 b Fk(C)p Fs(,)g(and)f Fk(in4)g Fs(has)h(the)f(v)-5 b(alue)150 2633 y Fk([D)47 b(E])p Fs(.)150 2801 y(The)24 b Fg(maximum)32 b Fs(n)m(um)m(b)s(er)23 b(of)i(inputs)e(for)h(a)h(pro)s(cedure)e(is)h (in\014nite)g(if)h(a)f(rest)h(input)e(is)i(giv)m(en;)i(otherwise,)150 2911 y(it)k(is)f(the)h(n)m(um)m(b)s(er)e(of)h(required)g(inputs)f(plus) h(the)g(n)m(um)m(b)s(er)f(of)i(optional)g(inputs.)150 3078 y(The)k Fg(default)45 b Fs(n)m(um)m(b)s(er)34 b(of)i(inputs)e(for) i(a)g(pro)s(cedure,)f(whic)m(h)h(is)f(the)h(n)m(um)m(b)s(er)e(of)i (inputs)e(that)j(it)f(will)150 3188 y(accept)f(if)e(its)h(in)m(v)m(o)s (cation)h(is)f(not)g(enclosed)g(in)f(paren)m(theses,)h(is)g(ordinarily) f(equal)h(to)g(the)g(minim)m(um)150 3298 y(n)m(um)m(b)s(er.)j(If)24 b(y)m(ou)h(w)m(an)m(t)g(a)g(di\013eren)m(t)g(default)f(n)m(um)m(b)s(er) g(y)m(ou)g(can)h(indicate)g(that)g(b)m(y)g(putting)f(the)g(desired)150 3407 y(default)31 b(n)m(um)m(b)s(er)e(as)h(the)h(last)g(thing)f(on)h (the)f Fk(TO)g Fs(line.)41 b(example:)390 3575 y Fk(to)47 b(proc)g(:in1)f([:in2)h("foo])f([:in3])g(3)150 3743 y Fs(This)c(pro)s(cedure)f(has)h(a)h(minim)m(um)e(of)i(one)f(input,)j(a)e (default)g(of)f(three)h(inputs,)h(and)e(an)g(in\014nite)150 3852 y(maxim)m(um.)150 4020 y(Logo)f(resp)s(onds)c(to)j(the)g Fk(TO)f Fs(command)g(b)m(y)g(en)m(tering)i(pro)s(cedure)d(de\014nition) h(mo)s(de.)68 b(The)39 b(prompt)150 4130 y(c)m(haracter)46 b(c)m(hanges)f(from)f Fk(?)g Fs(to)g Fk(>)g Fs(and)g(whatev)m(er)h (instructions)f(y)m(ou)g(t)m(yp)s(e)h(b)s(ecome)f(part)g(of)h(the)150 4239 y(de\014nition)30 b(un)m(til)h(y)m(ou)f(t)m(yp)s(e)h(a)g(line)f (con)m(taining)i(only)f(the)f(w)m(ord)g Fk(END)p Fs(.)150 4477 y Fh(de\014ne)390 4624 y Fk(DEFINE)46 b(procname)g(text)150 4792 y Fs(command.)56 b(De\014nes)35 b(a)h(pro)s(cedure)e(with)i(name)f Fl(pro)s(cname)40 b Fs(and)35 b(text)h Fl(text)p Fs(.)57 b(If)35 b(there)h(is)g(already)g(a)150 4902 y(pro)s(cedure)22 b(with)h(the)h(same)g(name,)h(the)e(new)g(de\014nition)g(replaces)i (the)e(old)h(one.)38 b(The)23 b Fl(text)k Fs(input)22 b(m)m(ust)150 5011 y(b)s(e)35 b(a)h(list)g(whose)f(mem)m(b)s(ers)g(are) h(lists.)56 b(The)35 b(\014rst)g(mem)m(b)s(er)g(is)g(a)h(list)g(of)g (inputs;)h(it)f(lo)s(oks)g(lik)m(e)h(a)f Fk(TO)150 5121 y Fs(line)c(but)f(without)h(the)f(w)m(ord)h Fk(TO)p Fs(,)f(without)h (the)g(pro)s(cedure)e(name,)i(and)f(without)h(the)g(colons)g(b)s(efore) 150 5230 y(input)g(names.)49 b(In)32 b(other)h(w)m(ords,)h(the)f(mem)m (b)s(ers)f(of)h(this)g(\014rst)f(sublist)h(are)g(w)m(ords)g(for)g(the)g (names)g(of)150 5340 y(required)27 b(inputs)f(and)h(lists)h(for)f(the)g (names)h(of)f(optional)i(or)e(rest)h(inputs.)39 b(The)26 b(remaining)i(sublists)f(of)p eop end %%Page: 51 64 TeXDict begin 51 63 bop 150 -116 a Fs(Chapter)30 b(7:)41 b(W)-8 b(orkspace)32 b(Managemen)m(t)2078 b(51)150 299 y(the)27 b Fl(text)i Fs(input)d(mak)m(e)h(up)f(the)g(b)s(o)s(dy)f(of)i (the)g(pro)s(cedure,)f(with)g(one)h(sublist)f(for)g(eac)m(h)i (instruction)f(line)150 408 y(of)32 b(the)g(b)s(o)s(dy)-8 b(.)44 b(\(There)31 b(is)h(no)g Fk(END)f Fs(line)h(in)f(the)h(text)h (input.\))45 b(It)32 b(is)f(an)h(error)f(to)i(rede\014ne)e(a)h (primitiv)m(e)150 518 y(pro)s(cedure)d(unless)h(the)g(v)-5 b(ariable)32 b Fk(REDEFP)c Fs(has)i(the)h(v)-5 b(alue)31 b Fk(TRUE)p Fs(.)150 686 y(See)g([REDEFP],)g(page)g(91,)h(.)150 882 y Fh(text)390 1029 y Fk(TEXT)47 b(procname)150 1197 y Fs(outputs)29 b(the)h(text)h(of)f(the)g(pro)s(cedure)e(named)i Fl(pro)s(cname)k Fs(in)29 b(the)h(form)g(exp)s(ected)g(b)m(y)f Fk(DEFINE)p Fs(:)39 b(a)30 b(list)150 1306 y(of)c(lists,)h(the)e (\014rst)g(of)g(whic)m(h)g(describ)s(es)g(the)h(inputs)e(to)i(the)f (pro)s(cedure)g(and)f(the)i(rest)f(of)h(whic)m(h)f(are)h(the)150 1416 y(lines)h(of)g(its)g(b)s(o)s(dy)-8 b(.)38 b(The)26 b(text)i(do)s(es)e(not)h(re\015ect)g(formatting)h(information)f(used)f (when)f(the)i(pro)s(cedure)150 1526 y(w)m(as)k(de\014ned,)e(suc)m(h)h (as)h(con)m(tin)m(uation)h(lines)f(and)e(extra)i(spaces.)150 1722 y Fh(fulltext)390 1869 y Fk(FULLTEXT)46 b(procname)150 2037 y Fs(outputs)41 b(a)g(represen)m(tation)i(of)e(the)g(pro)s(cedure) f Fl(pro)s(cname)46 b Fs(in)41 b(whic)m(h)g(formatting)h(information)g (is)150 2146 y(preserv)m(ed.)55 b(If)34 b(the)i(pro)s(cedure)e(w)m(as)h (de\014ned)f(with)h Fk(TO)p Fs(,)h Fk(EDIT)p Fs(,)f(or)g Fk(LOAD)p Fs(,)h(then)f(the)g(output)g(is)g(a)g(list)150 2256 y(of)42 b(w)m(ords.)74 b(Eac)m(h)42 b(w)m(ord)f(represen)m(ts)h (one)g(en)m(tire)g(line)g(of)g(the)g(de\014nition)f(in)h(the)g(form)f (output)g(b)m(y)150 2365 y Fk(READWORD)p Fs(,)35 b(including)g(extra)h (spaces)g(and)f(con)m(tin)m(uation)j(lines.)56 b(The)35 b(last)i(mem)m(b)s(er)e(of)h(the)f(output)150 2475 y(represen)m(ts)29 b(the)g Fk(END)f Fs(line.)40 b(If)29 b(the)g(pro)s(cedure)f(w)m(as)h (de\014ned)f(with)g Fk(DEFINE)p Fs(,)g(then)h(the)g(output)f(is)h(a)g (list)150 2584 y(of)f(lists.)41 b(If)27 b(these)i(lists)g(are)f(prin)m (ted,)h(one)f(p)s(er)f(line,)i(the)g(result)f(will)g(lo)s(ok)h(lik)m(e) g(a)g(de\014nition)f(using)f Fk(TO)p Fs(.)150 2694 y(Note:)42 b(the)31 b(output)f(from)f Fk(FULLTEXT)g Fs(is)h(not)h(suitable)g(for)f (use)g(as)g(input)g(to)h Fk(DEFINE)p Fs(!)150 2862 y(See)g([TO],)f (page)h(49,)h(,)e([EDIT],)h(page)g(61,)h(,)e([LO)m(AD],)i(page)f(63,)g (,)g([DEFINE],)h(page)f(50,)g(.)150 3058 y Fh(cop)m(ydef)390 3205 y Fk(COPYDEF)46 b(newname)g(oldname)150 3373 y Fs(command.)e(Mak)m (es)32 b Fl(newname)37 b Fs(a)31 b(pro)s(cedure)g(iden)m(tical)i(to)f Fl(oldname)p Fs(.)44 b(The)31 b(latter)i(ma)m(y)f(b)s(e)f(a)g(primi-) 150 3482 y(tiv)m(e.)40 b(If)22 b Fl(newname)28 b Fs(w)m(as)23 b(already)g(de\014ned,)h(its)f(previous)f(de\014nition)h(is)g(lost.)39 b(If)22 b Fl(newname)28 b Fs(w)m(as)23 b(already)150 3592 y(a)k(primitiv)m(e,)h(the)f(rede\014nition)f(is)g(not)h(p)s (ermitted)f(unless)g(the)g(v)-5 b(ariable)27 b Fk(REDEFP)e Fs(has)h(the)h(v)-5 b(alue)27 b Fk(TRUE)p Fs(.)150 3760 y(Note:)43 b(dialects)33 b(of)e(Logo)h(di\013er)f(as)g(to)h(the)f (order)g(of)g(inputs)f(to)h Fk(COPYDEF)p Fs(.)41 b(This)30 b(dialect)j(uses)d Fk("MAKE)150 3869 y Fs(order,)p Fk(")g Fs(not)g Fk("NAME)f Fs(order.)p Fk(")150 4037 y Fs(See)i([REDEFP],)g (page)g(91,)h(,)e([SA)-10 b(VE],)31 b(page)g(62,)g(,)g([PO],)g(page)g (56,)g(,)g([POT],)f(page)h(57,)h(.)150 4275 y Fr(7.2)68 b(V)-11 b(ariable)46 b(De\014nition)150 4463 y Fh(mak)m(e)390 4610 y Fk(MAKE)h(varname)e(value)150 4778 y Fs(command.)40 b(Assigns)30 b(the)g(v)-5 b(alue)31 b Fl(v)-5 b(alue)35 b Fs(to)c(the)f(v)-5 b(ariable)30 b(named)g Fl(v)-5 b(arname)p Fs(,)30 b(whic)m(h)g(m)m(ust)g(b)s(e)f(a)h(w)m(ord.)150 4887 y(V)-8 b(ariable)37 b(names)e(are)h(case-insensitiv)m(e.)59 b(If)35 b(a)h(v)-5 b(ariable)36 b(with)f(the)h(same)g(name)f(already)h (exists,)i(the)150 4997 y(v)-5 b(alue)31 b(of)f(that)h(v)-5 b(ariable)32 b(is)e(c)m(hanged.)41 b(If)30 b(not,)h(a)g(new)f(global)h (v)-5 b(ariable)32 b(is)e(created.)150 5193 y Fh(name)390 5340 y Fk(NAME)47 b(value)f(varname)g(\(library)f(procedure\))p eop end %%Page: 52 65 TeXDict begin 52 64 bop 150 -116 a Fs(52)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(command.)40 b(Same)31 b(as)g Fk(MAKE)e Fs(but)g(with)h(the)h(inputs)e(in)h(rev)m(erse)h(order.)150 584 y Fh(lo)s(cal)390 731 y Fk(LOCAL)46 b(varname)390 840 y(LOCAL)g(varnamelist)390 950 y(\(LOCAL)g(varname1)g(varname2)f (...\))150 1117 y Fs(command.)51 b(Accepts)35 b(as)f(inputs)e(one)i(or) g(more)g(w)m(ords,)h(or)e(a)i(list)f(of)g(w)m(ords.)51 b(A)33 b(v)-5 b(ariable)35 b(is)f(created)150 1227 y(for)26 b(eac)m(h)h(of)f(these)h(w)m(ords,)g(with)f(that)g(w)m(ord)g(as)g(its)h (name.)39 b(The)26 b(v)-5 b(ariables)27 b(are)f(lo)s(cal)i(to)f(the)f (curren)m(tly)150 1337 y(running)34 b(pro)s(cedure.)56 b(Logo)37 b(v)-5 b(ariables)37 b(follo)m(w)g(dynamic)e(scop)s(e)h (rules;)j(a)d(v)-5 b(ariable)37 b(that)f(is)g(lo)s(cal)h(to)150 1446 y(a)k(pro)s(cedure)f(is)h(a)m(v)-5 b(ailable)44 b(to)e(an)m(y)f(subpro)s(cedure)e(in)m(v)m(ok)m(ed)j(b)m(y)f(that)h (pro)s(cedure.)72 b(The)40 b(v)-5 b(ariables)150 1556 y(created)41 b(b)m(y)e Fk(LOCAL)f Fs(ha)m(v)m(e)j(no)e(initial)i(v)-5 b(alue;)45 b(they)39 b(m)m(ust)h(b)s(e)e(assigned)i(a)g(v)-5 b(alue)40 b(\(e.g.,)k(with)39 b Fk(MAKE)p Fs(\))150 1665 y(b)s(efore)30 b(the)h(pro)s(cedure)e(attempts)i(to)g(read)f(their)h(v) -5 b(alue.)150 1833 y(See)31 b([MAKE],)g(page)g(51,)g(.)150 2118 y Fh(lo)s(calmak)m(e)390 2265 y Fk(LOCALMAKE)45 b(varname)h(value)g(\(library)g(procedure\))150 2433 y Fs(command.)d(Mak)m(es)33 b(the)f(named)e(v)-5 b(ariable)33 b(lo)s(cal,)g(lik)m(e)f Fk(LOCAL)p Fs(,)f(and)f(assigns)i(it)g(the)f (giv)m(en)h(v)-5 b(alue,)33 b(lik)m(e)150 2542 y Fk(MAKE)p Fs(.)150 2710 y(See)e([LOCAL],)f(page)h(52,)g(,)g(See)g([MAKE],)g(page) g(51,)g(.)150 2995 y Fh(thing)390 3142 y Fk(THING)46 b(varname)390 3251 y(:quoted.varname)150 3419 y Fs(outputs)32 b(the)h(v)-5 b(alue)33 b(of)f(the)h(v)-5 b(ariable)34 b(whose)e(name)g(is)h(the)g(input.)46 b(If)32 b(there)h(is)f(more)h (than)f(one)h(suc)m(h)150 3528 y(v)-5 b(ariable,)44 b(the)c(innermost)g (lo)s(cal)i(v)-5 b(ariable)41 b(of)f(that)h(name)f(is)g(c)m(hosen.)71 b(The)40 b(colon)h(notation)h(is)e(an)150 3638 y(abbreviation)31 b(not)g(for)f Fk(THING)f Fs(but)g(for)i(the)f(com)m(bination)390 3806 y Fk(thing)46 b(")150 3973 y Fs(so)31 b(that)g Fk(:FOO)e Fs(means)h Fk(THING)46 b("FOO)o Fs(.)150 4258 y Fh(global)390 4405 y Fk(GLOBAL)g(varname)390 4515 y(GLOBAL)g(varnamelist)390 4624 y(\(GLOBAL)g(varname1)f(varname2)h(...\))150 4792 y Fs(command.)58 b(Accepts)38 b(as)e(inputs)f(one)i(or)f(more)h(w)m (ords,)g(or)g(a)f(list)h(of)g(w)m(ords.)58 b(A)36 b(global)i(v)-5 b(ariable)37 b(is)150 4902 y(created)23 b(for)e(eac)m(h)i(of)f(these)g (w)m(ords,)h(with)e(that)i(w)m(ord)e(as)h(its)g(name.)38 b(The)21 b(only)g(reason)h(this)g(is)g(necessary)150 5011 y(is)37 b(that)g(y)m(ou)g(migh)m(t)h(w)m(an)m(t)f(to)h(use)e(the)h Fk(")p Fs(setter)p Fk(")h Fs(notation)g Fk(SETXYZ)d Fs(for)h(a)h(v)-5 b(ariable)38 b Fk(XYZ)e Fs(that)h(do)s(es)150 5121 y(not)29 b(already)h(ha)m(v)m(e)g(a)f(v)-5 b(alue;)30 b Fk(GLOBAL)46 b("XYZ)28 b Fs(mak)m(es)h(that)h(legal.)42 b(Note:)f(If)29 b(there)g(is)g(curren)m(tly)f(a)i(lo)s(cal)150 5230 y(v)-5 b(ariable)24 b(of)f(the)h(same)f(name,)i(this)e(command)g(do)s(es)g (*not*)i(mak)m(e)f(Logo)g(use)f(the)g(global)i(v)-5 b(alue)24 b(instead)150 5340 y(of)31 b(the)f(lo)s(cal)i(one.)p eop end %%Page: 53 66 TeXDict begin 53 65 bop 150 -116 a Fs(Chapter)30 b(7:)41 b(W)-8 b(orkspace)32 b(Managemen)m(t)2078 b(53)150 299 y Fr(7.3)68 b(Prop)t(ert)l(y)45 b(Lists)150 458 y Fs(Note:)k(Names)35 b(of)f(prop)s(ert)m(y)g(lists)g(are)h(alw)m(a)m(ys)g(case-insensitiv)m (e.)54 b(Names)35 b(of)f(individual)g(prop)s(erties)150 568 y(are)24 b(case-sensitiv)m(e)i(or)d(case-insensitiv)m(e)j(dep)s (ending)c(on)i(the)f(v)-5 b(alue)24 b(of)g Fk(CASEIGNOREDP)p Fs(,)d(whic)m(h)j(is)f Fk(TRUE)150 677 y Fs(b)m(y)30 b(default.)150 845 y(See)h([CASEIGNOREDP],)f(page)h(89,)h(.)150 1013 y(In)k(principle,)h(ev)m(ery)g(p)s(ossible)f(name)g(is)h(the)f (name)g(of)h(a)g(prop)s(ert)m(y)e(list,)k(whic)m(h)d(is)g(initially)i (empt)m(y)-8 b(.)150 1122 y(So)29 b(Logo)i(nev)m(er)f(giv)m(es)h(a)f Fk(")p Fs(no)f(suc)m(h)g(prop)s(ert)m(y)g(list)p Fk(")h Fs(error,)f(as)h(it)g(w)m(ould)f(for)g(unde\014ned)f(pro)s(cedure)g(or) 150 1232 y(v)-5 b(ariable)26 b(names.)39 b(But)25 b(the)h(primitiv)m(e) g(pro)s(cedures)d(that)j(deal)g(with)f Fk(")p Fs(all)p Fk(")g Fs(prop)s(ert)m(y)g(lists)h(\()p Fk(CONTENTS)p Fs(,)150 1342 y Fk(PLISTS)p Fs(,)g(etc.\))40 b(list)27 b(only)f(nonempt)m(y)g(ones.)40 b(T)-8 b(o)27 b Fk(")p Fs(erase)p Fk(")f Fs(a)g(prop)s(ert)m(y)g(list)h([ERASE],)f(page)h(57,) h(means)150 1451 y(to)j(mak)m(e)g(it)g(empt)m(y)-8 b(,)32 b(remo)m(ving)f(all)g(prop)s(erties)f(from)g(it.)150 1647 y Fh(pprop)390 1794 y Fk(PPROP)46 b(plistname)g(propname)f(value) 150 1961 y Fs(command.)40 b(Adds)29 b(a)i(prop)s(ert)m(y)e(to)i(the)f Fl(plistname)36 b Fs(prop)s(ert)m(y)29 b(list)i(with)f(name)g Fl(propname)k Fs(and)29 b(v)-5 b(alue)150 2071 y Fl(v)g(alue)p Fs(.)150 2266 y Fh(gprop)390 2413 y Fk(GPROP)46 b(plistname)g(propname) 150 2581 y Fs(outputs)35 b(the)g(v)-5 b(alue)35 b(of)g(the)h Fl(propname)j Fs(prop)s(ert)m(y)34 b(in)h(the)g Fl(plistname)41 b Fs(prop)s(ert)m(y)34 b(list,)j(or)e(the)h(empt)m(y)150 2691 y(list)31 b(if)f(there)h(is)f(no)h(suc)m(h)f(prop)s(ert)m(y)-8 b(.)150 2886 y Fh(remprop)390 3033 y Fk(REMPROP)46 b(plistname)f (propname)150 3201 y Fs(command.)38 b(Remo)m(v)m(es)25 b(the)e(prop)s(ert)m(y)f(named)h Fl(propname)k Fs(from)c(the)g(prop)s (ert)m(y)f(list)i(named)e Fl(plistname)p Fs(.)150 3396 y Fh(plist)390 3543 y Fk(PLIST)46 b(plistname)150 3711 y Fs(outputs)41 b(a)h(list)h(whose)f(o)s(dd-n)m(um)m(b)s(ered)d(mem)m (b)s(ers)i(are)i(the)f(names,)i(and)e(whose)f(ev)m(en-n)m(um)m(b)s (ered)150 3820 y(mem)m(b)s(ers)25 b(are)h(the)g(v)-5 b(alues,)27 b(of)f(the)g(prop)s(erties)f(in)h(the)g(prop)s(ert)m(y)f (list)h(named)g Fl(plistname)p Fs(.)39 b(The)25 b(output)150 3930 y(is)32 b(a)h(cop)m(y)g(of)g(the)g(actual)g(prop)s(ert)m(y)f (list;)i(c)m(hanging)g(prop)s(erties)e(later)h(will)g(not)f(magically)j (c)m(hange)f(a)150 4040 y(list)d(output)f(earlier)h(b)m(y)g Fk(PLIST)p Fs(.)150 4277 y Fr(7.4)68 b(W)-11 b(orkspace)45 b(Predicates)150 4464 y Fh(pro)s(cedurep)390 4611 y Fk(PROCEDUREP)g (name)390 4720 y(PROCEDURE?)g(name)150 4888 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(the)h(input)e(is)i(the)f(name)h(of)f(a)h(pro)s (cedure.)150 5083 y Fh(primitiv)m(ep)390 5230 y Fk(PRIMITIVEP)45 b(name)390 5340 y(PRIMITIVE?)g(name)p eop end %%Page: 54 67 TeXDict begin 54 66 bop 150 -116 a Fs(54)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(outputs)45 b Fk(TRUE)f Fs(if)h(the)h(input)e(is) h(the)h(name)f(of)h(a)g(primitiv)m(e)g(pro)s(cedure)e(\(one)i(built)f (in)m(to)h(Logo\).)150 408 y(Note)37 b(that)f(some)g(of)g(the)g(pro)s (cedures)e(describ)s(ed)h(in)g(this)h(do)s(cumen)m(t)f(are)h(library)g (pro)s(cedures,)g(not)150 518 y(primitiv)m(es.)150 704 y Fh(de\014nedp)390 851 y Fk(DEFINEDP)46 b(name)390 961 y(DEFINED?)g(name)150 1129 y Fs(outputs)e Fk(TRUE)g Fs(if)g(the)h (input)f(is)h(the)g(name)f(of)h(a)g(user-de\014ned)f(pro)s(cedure,)j (including)d(a)h(library)150 1238 y(pro)s(cedure.)150 1424 y Fh(namep)390 1571 y Fk(NAMEP)h(name)390 1681 y(NAME?)g(name)150 1849 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(the)h(input)e(is)i(the)f(name) h(of)f(a)h(v)-5 b(ariable.)150 2035 y Fh(plistp)390 2182 y Fk(PLISTP)46 b(name)390 2292 y(PLIST?)g(name)150 2459 y Fs(outputs)27 b Fk(TRUE)f Fs(if)h(the)g(input)g(is)g(the)g(name)h(of) f(a)h Fg(nonempty)37 b Fs(prop)s(ert)m(y)26 b(list.)41 b(\(In)26 b(principle)h(ev)m(ery)h(w)m(ord)150 2569 y(is)k(the)h(name)f (of)h(a)f(prop)s(ert)m(y)g(list;)i(if)e(y)m(ou)h(ha)m(v)m(en't)g(put)f (an)m(y)h(prop)s(erties)e(in)h(it,)i Fk(PLIST)d Fs(of)h(that)h(name)150 2678 y(outputs)d(an)g(empt)m(y)h(list,)g(rather)f(than)h(giving)g(an)f (error)g(message.\))150 2906 y Fr(7.5)68 b(W)-11 b(orkspace)45 b(Queries)150 3066 y Fs(Note:)66 b(All)43 b(pro)s(cedures)f(whose)g (input)f(is)i(indicated)g(as)g Fl(con)m(ten)m(tslist)k Fs(will)42 b(accept)i(a)f(single)g(w)m(ord)150 3175 y(\(tak)m(en)38 b(as)e(a)h(pro)s(cedure)e(name\),)k(a)e(list)g(of)f(w)m(ords)g(\(tak)m (en)i(as)f(names)f(of)g(pro)s(cedures\),)i(or)e(a)h(list)g(of)150 3285 y(three)31 b(lists)f(as)h(describ)s(ed)e(under)g(the)i Fk(CONTENTS)d Fs(command)i(ab)s(o)m(v)m(e.)150 3471 y Fh(con)m(ten)m(ts)390 3618 y Fk(CONTENTS)150 3786 y Fs(outputs)j(a)h Fk(")p Fs(con)m(ten)m(ts)h(list,)p Fk(")f Fs(i.e.,)i(a)e(list)g(of)g (three)f(lists)h(con)m(taining)i(names)d(of)h(de\014ned)e(pro)s (cedures,)150 3895 y(v)-5 b(ariables,)28 b(and)e(prop)s(ert)m(y)g (lists)h(resp)s(ectiv)m(ely)-8 b(.)41 b(This)26 b(list)h(includes)f (all)i(un)m(buried)c(named)i(items)i(in)e(the)150 4005 y(w)m(orkspace.)150 4191 y Fh(buried)390 4338 y Fk(BURIED)150 4506 y Fs(outputs)k(a)h(con)m(ten)m(ts)h(list)f(including)f(all)h (buried)e(named)h(items)h(in)f(the)g(w)m(orkspace.)150 4692 y Fh(traced)390 4839 y Fk(TRACED)150 5007 y Fs(outputs)g(a)h(con)m (ten)m(ts)h(list)f(including)f(all)h(traced)g(named)f(items)h(in)f(the) g(w)m(orkspace.)150 5193 y Fh(stepp)s(ed)390 5340 y Fk(STEPPED)p eop end %%Page: 55 68 TeXDict begin 55 67 bop 150 -116 a Fs(Chapter)30 b(7:)41 b(W)-8 b(orkspace)32 b(Managemen)m(t)2078 b(55)150 299 y(outputs)30 b(a)h(con)m(ten)m(ts)h(list)f(including)f(all)h(stepp)s (ed)e(named)h(items)h(in)f(the)h(w)m(orkspace.)150 517 y Fh(pro)s(cedures)390 663 y Fk(PROCEDURES)150 831 y Fs(outputs)f(a)h(list)g(of)g(the)f(names)h(of)g(all)g(un)m(buried)e (user-de\014ned)g(pro)s(cedures)g(in)h(the)h(w)m(orkspace.)42 b(Note)150 941 y(that)26 b(this)f(is)g(a)h(list)g(of)f(names,)h(not)g (a)f(con)m(ten)m(ts)i(list.)40 b(\(Ho)m(w)m(ev)m(er,)29 b(pro)s(cedures)24 b(that)i(require)f(a)g(con)m(ten)m(ts)150 1050 y(list)31 b(as)g(input)e(will)i(accept)h(this)e(list.\))150 1268 y Fh(primitiv)m(es)390 1415 y Fk(PRIMITIVES)150 1583 y Fs(outputs)d(a)i(list)f(of)g(the)g(names)g(of)g(all)h(primitiv)m (e)f(pro)s(cedures)f(in)h(the)g(w)m(orkspace.)40 b(Note)29 b(that)g(this)f(is)g(a)150 1692 y(list)g(of)g(names,)g(not)f(a)h(con)m (ten)m(ts)h(list.)41 b(\(Ho)m(w)m(ev)m(er,)30 b(pro)s(cedures)c(that)i (require)f(a)h(con)m(ten)m(ts)h(list)f(as)g(input)150 1802 y(will)j(accept)h(this)e(list.\))150 2019 y Fh(names)390 2166 y Fk(NAMES)150 2334 y Fs(outputs)d(a)g(con)m(ten)m(ts)i(list)e (consisting)h(of)g(an)f(empt)m(y)g(list)h(\(indicating)g(no)f(pro)s (cedure)f(names\))h(follo)m(w)m(ed)150 2444 y(b)m(y)j(a)h(list)g(of)g (all)g(un)m(buried)d(v)-5 b(ariable)32 b(names)e(in)g(the)g(w)m (orkspace.)150 2661 y Fh(plists)390 2808 y Fk(PLISTS)150 2976 y Fs(outputs)e(a)i(con)m(ten)m(ts)g(list)g(consisting)g(of)f(t)m (w)m(o)h(empt)m(y)f(lists)h(\(indicating)g(no)e(pro)s(cedures)g(or)h(v) -5 b(ariables\))150 3086 y(follo)m(w)m(ed)32 b(b)m(y)e(a)h(list)g(of)g (all)g(un)m(buried)d(nonempt)m(y)j(prop)s(ert)m(y)e(lists)i(in)f(the)h (w)m(orkspace.)150 3303 y Fh(namelist)390 3450 y Fk(NAMELIST)46 b(varname)f(\(library)h(procedure\))390 3560 y(NAMELIST)g(varnamelist) 150 3727 y Fs(outputs)32 b(a)g(con)m(ten)m(ts)i(list)f(consisting)g(of) g(an)f(empt)m(y)h(list)g(follo)m(w)m(ed)h(b)m(y)e(a)h(list)f(of)h(the)f (name)h(or)f(names)150 3837 y(giv)m(en)26 b(as)g(input.)38 b(This)24 b(is)h(useful)g(in)g(conjunction)g(with)g(w)m(orkspace)h(con) m(trol)h(pro)s(cedures)c(that)j(require)150 3947 y(a)31 b(con)m(ten)m(ts)h(list)f(as)f(input.)150 4164 y Fh(pllist)390 4311 y Fk(PLLIST)46 b(plname)g(\(library)g(procedure\))390 4421 y(PLLIST)g(plnamelist)150 4589 y Fs(outputs)27 b(a)h(con)m(ten)m (ts)h(list)f(consisting)h(of)e(t)m(w)m(o)i(empt)m(y)f(lists)g(follo)m (w)m(ed)h(b)m(y)f(a)f(list)i(of)e(the)h(name)g(or)f(names)150 4698 y(giv)m(en)f(as)g(input.)38 b(This)24 b(is)h(useful)g(in)g (conjunction)g(with)g(w)m(orkspace)h(con)m(trol)h(pro)s(cedures)c(that) j(require)150 4808 y(a)31 b(con)m(ten)m(ts)h(list)f(as)f(input.)150 4975 y(See)h([CONTENTS],)e(page)i(54,)h(.)150 5193 y Fh(arit)m(y)390 5340 y Fk(ARITY)46 b(procedurename)p eop end %%Page: 56 69 TeXDict begin 56 68 bop 150 -116 a Fs(56)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(outputs)37 b(a)g(list)h(of)f(three)g(n)m(um)m(b) s(ers:)53 b(the)37 b(minim)m(um,)h(default,)i(and)c(maxim)m(um)h(n)m (um)m(b)s(er)f(of)h(inputs)150 408 y(for)32 b(the)h(pro)s(cedure)e (whose)h(name)g(is)g(the)h(input.)45 b(It)33 b(is)f(an)g(error)g(if)h (there)f(is)g(no)h(suc)m(h)e(pro)s(cedure.)46 b(A)150 518 y(maxim)m(um)30 b(of)h(-1)g(means)f(that)h(the)g(n)m(um)m(b)s(er)e (of)h(inputs)g(is)g(unlimited.)150 748 y Fh(no)s(des)390 895 y Fk(NODES)150 1063 y Fs(outputs)23 b(a)g(list)h(of)g(t)m(w)m(o)g (n)m(um)m(b)s(ers.)37 b(The)23 b(\014rst)f(represen)m(ts)h(the)h(n)m (um)m(b)s(er)e(of)h(no)s(des)f(of)i(memory)f(curren)m(tly)150 1173 y(in)k(use.)39 b(The)27 b(second)g(sho)m(ws)f(the)i(maxim)m(um)e (n)m(um)m(b)s(er)g(of)h(no)s(des)g(that)g(ha)m(v)m(e)h(b)s(een)f(in)f (use)h(at)h(an)m(y)f(time)150 1282 y(since)34 b(the)f(last)i(in)m(v)m (o)s(cation)g(of)f Fk(NODES)p Fs(.)48 b(\(A)34 b(no)s(de)f(is)g(a)h (small)g(blo)s(c)m(k)g(of)f(computer)h(memory)f(as)h(used)150 1392 y(b)m(y)g(Logo.)54 b(Eac)m(h)36 b(n)m(um)m(b)s(er)d(uses)h(one)h (no)s(de.)52 b(Eac)m(h)35 b(non-n)m(umeric)f(w)m(ord)g(uses)g(one)h(no) s(de,)g(plus)f(some)150 1501 y(non-no)s(de)i(memory)g(for)h(the)g(c)m (haracters)h(in)e(the)h(w)m(ord.)59 b(Eac)m(h)38 b(arra)m(y)f(tak)m(es) h(one)f(no)s(de,)h(plus)e(some)150 1611 y(non-no)s(de)c(memory)-8 b(,)35 b(as)e(w)m(ell)h(as)g(the)f(memory)g(required)g(b)m(y)g(its)h (elemen)m(ts.)50 b(Eac)m(h)34 b(list)g(requires)f(one)150 1721 y(no)s(de)j(p)s(er)f(elemen)m(t,)k(as)e(w)m(ell)g(as)g(the)f (memory)g(within)g(the)h(elemen)m(ts.\))60 b(If)35 b(y)m(ou)i(w)m(an)m (t)g(to)g(trac)m(k)h(the)150 1830 y(memory)32 b(use)g(of)g(an)g (algorithm,)h(it)g(is)f(b)s(est)f(if)h(y)m(ou)g(in)m(v)m(ok)m(e)i Fk(GC)e Fs(at)g(the)h(b)s(eginning)e(of)h(eac)m(h)h(iteration,)150 1940 y(since)e(otherwise)g(the)f(maxim)m(um)g(will)h(include)f(storage) i(that)f(is)f(un)m(used)g(but)f(not)i(y)m(et)g(collected.)150 2227 y Fr(7.6)68 b(W)-11 b(orkspace)45 b(Insp)t(ection)150 2449 y Fh(p)s(o)390 2596 y Fk(PRINTOUT)h(contentslist)390 2706 y(PO)h(contentslist)150 2873 y Fs(command.)40 b(Prin)m(ts)28 b(to)i(the)e(write)h(stream)g(the)g(de\014nitions)f(of)h(all)g(pro)s (cedures,)f(v)-5 b(ariables,)30 b(and)e(prop-)150 2983 y(ert)m(y)j(lists)g(named)f(in)g(the)h(input)e(con)m(ten)m(ts)j(list.) 150 3213 y Fh(p)s(oall)390 3360 y Fk(POALL)46 b(\(library)g (procedure\))150 3528 y Fs(command.)40 b(Prin)m(ts)31 b(all)g(un)m(buried)e(de\014nitions)g(in)i(the)f(w)m(orkspace.)42 b(Abbreviates)30 b Fk(PO)48 b(CONTENTS)m Fs(.)150 3696 y(See)31 b([CONTENTS],)e(page)i(54,)h(.)150 3926 y Fh(p)s(ops)390 4073 y Fk(POPS)47 b(\(library)e(procedure\))150 4240 y Fs(command.)c(Prin)m(ts)31 b(the)g(de\014nitions)f(of)g(all)i(un)m (buried)d(pro)s(cedures)g(in)h(the)h(w)m(orkspace.)42 b(Abbreviates)150 4350 y Fk(PO)47 b(PROCEDURES)m Fs(.)150 4518 y(See)31 b([PO],)f(page)h(56,)h(,)e([PR)m(OCEDURES],)h(page)g(55,) g(.)150 4748 y Fh(p)s(ons)390 4895 y Fk(PONS)47 b(\(library)e (procedure\))150 5063 y Fs(command.)57 b(Prin)m(ts)36 b(the)h(de\014nitions)e(of)h(all)h(un)m(buried)d(v)-5 b(ariables)37 b(in)f(the)g(w)m(orkspace.)58 b(Abbreviates)150 5172 y Fk(PO)47 b(NAMES)o Fs(.)150 5340 y(See)31 b([PO],)f(page)h(56,)h (,)e([NAMES],)i(page)f(55,)g(.)p eop end %%Page: 57 70 TeXDict begin 57 69 bop 150 -116 a Fs(Chapter)30 b(7:)41 b(W)-8 b(orkspace)32 b(Managemen)m(t)2078 b(57)150 299 y Fh(p)s(opls)390 446 y Fk(POPLS)46 b(\(library)g(procedure\))150 614 y Fs(command.)57 b(Prin)m(ts)35 b(the)h(con)m(ten)m(ts)h(of)f(all)h (un)m(buried)d(nonempt)m(y)h(prop)s(ert)m(y)g(lists)i(in)e(the)h(w)m (orkspace.)150 723 y(Abbreviates)31 b Fk(PO)47 b(PLISTS)n Fs(.)150 891 y(See)31 b([PO],)f(page)h(56,)h(,)e([PLISTS],)g(page)h (55,)g(.)150 1131 y Fh(p)s(on)390 1278 y Fk(PON)47 b(varname)f (\(library)f(procedure\))390 1388 y(PON)i(varnamelist)150 1555 y Fs(command.)40 b(Prin)m(ts)31 b(the)f(de\014nitions)g(of)h(the)f (named)g(v)-5 b(ariable\(s\).)150 1665 y(Abbreviates)31 b Fk(PO)47 b(NAMELIST)f(varname\(list\))l Fs(.)150 1833 y(See)31 b([PO],)f(page)h(56,)h(,)e([NAMELIST],)h(page)g(55,)g(.)150 2073 y Fh(p)s(opl)390 2220 y Fk(POPL)47 b(plname)f(\(library)f (procedure\))390 2330 y(POPL)i(plnamelist)150 2497 y Fs(command.)40 b(Prin)m(ts)31 b(the)f(de\014nitions)g(of)h(the)f(named) g(prop)s(ert)m(y)g(list\(s\).)150 2607 y(Abbreviates)h Fk(PO)47 b(PLLIST)f(plname\(list\))m Fs(.)150 2775 y(See)31 b([PO],)f(page)h(56,)h(,)e([PLLIST],)g(page)h(55,)h(.)150 3015 y Fh(p)s(ot)390 3162 y Fk(POT)47 b(contentslist)150 3330 y Fs(command.)c(Prin)m(ts)32 b(the)f(title)i(lines)e(of)h(the)f (named)g(pro)s(cedures)f(and)h(the)h(de\014nitions)e(of)i(the)f(named) 150 3439 y(v)-5 b(ariables)32 b(and)g(prop)s(ert)m(y)f(lists.)45 b(F)-8 b(or)33 b(prop)s(ert)m(y)e(lists,)i(the)f(en)m(tire)g(list)h(is) f(sho)m(wn)f(on)g(one)i(line)f(instead)150 3549 y(of)f(as)f(a)h(series) g(of)f Fk(PPROP)f Fs(instructions)h(as)h(in)f Fk(PO)p Fs(.)150 3717 y(See)h([PPR)m(OP],)f(page)i(53,)f(,)g([PO],)f(page)h (56,)h(.)150 3957 y Fh(p)s(ots)390 4104 y Fk(POTS)47 b(\(library)e(procedure\))150 4272 y Fs(command.)k(Prin)m(ts)33 b(the)g(title)i(lines)e(of)g(all)h(un)m(buried)e(pro)s(cedures)g(in)g (the)i(w)m(orkspace.)49 b(Abbreviates)150 4381 y Fk(POT)e(PROCEDURES)m Fs(.)150 4549 y(See)31 b([PR)m(OCEDURES],)f(page)h(55,)h(.)150 4851 y Fr(7.7)68 b(W)-11 b(orkspace)45 b(Con)l(trol)150 5083 y Fh(erase)390 5230 y Fk(ERASE)h(contentslist)390 5340 y(ER)h(contentslist)p eop end %%Page: 58 71 TeXDict begin 58 70 bop 150 -116 a Fs(58)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(command.)44 b(Erases)32 b(from)f(the)h(w)m (orkspace)g(the)g(pro)s(cedures,)f(v)-5 b(ariables,)33 b(and)e(prop)s(ert)m(y)g(lists)h(named)150 408 y(in)i(the)h(input.)53 b(Primitiv)m(e)36 b(pro)s(cedures)d(ma)m(y)i(not)g(b)s(e)f(erased)h (unless)f(the)h(v)-5 b(ariable)35 b Fk(REDEFP)e Fs(has)i(the)150 518 y(v)-5 b(alue)31 b Fk(TRUE)p Fs(.)150 686 y(See)g([REDEFP],)g(page) g(91,)h(.)150 879 y Fh(erall)390 1026 y Fk(ERALL)150 1194 y Fs(command.)38 b(Erases)24 b(all)h(un)m(buried)c(pro)s(cedures,) j(v)-5 b(ariables,)26 b(and)e(prop)s(ert)m(y)f(lists)h(from)f(the)h(w)m (orkspace.)150 1303 y(Abbreviates)31 b Fk(ERASE)46 b(CONTENTS)n Fs(.)150 1471 y(See)31 b([CONTENTS],)e(page)i(54,)h(.)150 1665 y Fh(erps)390 1812 y Fk(ERPS)150 1979 y Fs(command.)40 b(Erases)31 b(all)g(un)m(buried)e(pro)s(cedures)g(from)h(the)g(w)m (orkspace.)150 2089 y(Abbreviates)h Fk(ERASE)46 b(PROCEDURES)m Fs(.)150 2257 y(See)31 b([ERASE],)f(page)h(57,)h(,)e([PR)m(OCEDURES],)h (page)g(55,)g(.)150 2450 y Fh(erns)390 2597 y Fk(ERNS)150 2765 y Fs(command.)40 b(Erases)31 b(all)g(un)m(buried)e(v)-5 b(ariables)31 b(from)f(the)g(w)m(orkspace.)42 b(Abbreviates)30 b Fk(ERASE)47 b(NAMES)n Fs(.)150 2932 y(See)31 b([ERASE],)f(page)h(57,) h(,)e([NAMES],)h(page)g(55,)h(.)150 3126 y Fh(erpls)390 3273 y Fk(ERPLS)150 3440 y Fs(command.)40 b(Erases)31 b(all)g(un)m(buried)e(prop)s(ert)m(y)g(lists)i(from)f(the)h(w)m (orkspace.)150 3550 y(Abbreviates)g Fk(ERASE)46 b(PLISTS)o Fs(.)150 3718 y(See)31 b([ERASE],)f(page)h(57,)h(,)e([PLISTS],)f(page)j (55,)f(.)150 3911 y Fh(ern)390 4058 y Fk(ERN)47 b(varname)f(\(library)f (procedure\))390 4168 y(ERN)i(varnamelist)150 4335 y Fs(command.)70 b(Erases)40 b(from)f(the)h(w)m(orkspace)h(the)g(v)-5 b(ariable\(s\))41 b(named)f(in)f(the)i(input.)68 b(Abbreviates)150 4445 y Fk(ERASE)46 b(NAMELIST)g Fi(varname\(list\))l Fs(.)150 4613 y(See)31 b([ERASE],)f(page)h(57,)h(,)e([NAMELIST],)h (page)g(55,)g(.)150 4806 y Fh(erpl)390 4953 y Fk(ERPL)47 b(plname)f(\(library)f(procedure\))390 5063 y(ERPL)i(plnamelist)150 5230 y Fs(command.)39 b(Erases)27 b(from)g(the)g(w)m(orkspace)g(the)g (prop)s(ert)m(y)g(list\(s\))h(named)e(in)h(the)g(input.)38 b(Abbreviates)150 5340 y Fk(ERASE)46 b(PLLIST)g Fi(plname\(list\))m Fs(.)p eop end %%Page: 59 72 TeXDict begin 59 71 bop 150 -116 a Fs(Chapter)30 b(7:)41 b(W)-8 b(orkspace)32 b(Managemen)m(t)2078 b(59)150 299 y(See)31 b([ERASE],)f(page)h(57,)h(,)e([PLLIST],)g(page)h(55,)g(.)150 529 y Fh(bury)390 676 y Fk(BURY)47 b(contentslist)150 844 y Fs(command.)75 b(Buries)41 b(the)h(pro)s(cedures,)i(v)-5 b(ariables,)46 b(and)41 b(prop)s(ert)m(y)g(lists)h(named)f(in)h(the)g (input.)74 b(A)150 953 y(buried)30 b(item)j(is)e(not)h(included)f(in)g (the)h(lists)g(output)f(b)m(y)h Fk(CONTENTS)p Fs(,)e Fk(PROCEDURES)p Fs(,)f Fk(VARIABLES)p Fs(,)h(and)150 1063 y Fk(PLISTS)p Fs(,)d(but)g(is)h(included)f(in)g(the)h(list)g (output)g(b)m(y)f Fk(BURIED)p Fs(.)39 b(By)28 b(implication,)h(buried)e (things)h(are)g(not)150 1172 y(prin)m(ted)i(b)m(y)g Fk(POALL)f Fs(or)h(sa)m(v)m(ed)i(b)m(y)e Fk(SAVE)p Fs(.)150 1340 y(See)36 b([CONTENTS],)e(page)j(54,)h(,)f([PR)m(OCEDURES],)e(page)h (55,)i(,)f([PONS],)f(page)g(56,)i(,)f([PLISTS],)150 1450 y(page)31 b(55,)h(,)e([PO)m(ALL],)h(page)g(56,)h(,)e([SA)-10 b(VE],)31 b(page)g(62,)g(.)150 1680 y Fh(bury)m(all)390 1826 y Fk(BURYALL)1955 b(\(library)45 b(procedure\))150 1994 y Fs(command.)40 b(Abbreviates)31 b Fk(BURY)47 b(CONTENTS)p Fs(.)150 2162 y(See)31 b([CONTENTS],)e(page)i(54,)h(.)150 2392 y Fh(buryname)390 2539 y Fk(BURYNAME)46 b(varname)f(\(library)h (procedure\))390 2648 y(BURYNAME)g(varnamelist)150 2816 y Fs(command.)40 b(Abbreviates)31 b Fk(BURY)47 b(NAMELIST)e (varname\(list\))p Fs(.)150 2984 y(See)31 b([BUR)-8 b(Y],)32 b(page)f(59,)g(,)g([NAMELIST],)f(page)h(55,)h(.)150 3214 y Fh(un)m(bury)390 3361 y Fk(UNBURY)46 b(contentslist)150 3528 y Fs(command.)39 b(Un)m(buries)26 b(the)g(pro)s(cedures,)g(v)-5 b(ariables,)28 b(and)d(prop)s(ert)m(y)h(lists)h(named)e(in)h(the)h (input.)38 b(That)150 3638 y(is,)31 b(the)f(named)g(items)h(will)g(b)s (e)f(returned)f(to)i(view)f(in)h Fk(CONTENTS)p Fs(,)d(etc.)150 3806 y(See)j([CONTENTS],)e(page)i(54,)h(.)150 4036 y Fh(un)m(bury)m(all)390 4183 y Fk(UNBURYALL)45 b(\(library)h (procedure\))150 4350 y Fs(command.)40 b(Abbreviates)31 b Fk(UNBURY)46 b(BURIED)p Fs(.)150 4518 y(See)31 b([BURIED],)g(page)g (54,)h(.)150 4748 y Fh(un)m(buryname)390 4895 y Fk(UNBURYNAME)45 b(varname)h(\(library)f(procedure\))390 5005 y(UNBURYNAME)g (varnamelist)150 5172 y Fs(command.)40 b(Abbreviates)31 b Fk(UNBURY)46 b(NAMELIST)g Fi(varname\(list\))p Fs(.)150 5340 y(See)31 b([UNBUR)-8 b(Y],)32 b(page)f(59,)h(,)e([NAMELIST],)h (page)g(55,)g(.)p eop end %%Page: 60 73 TeXDict begin 60 72 bop 150 -116 a Fs(60)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fh(buriedp)390 446 y Fk(BURIEDP)46 b(contentslist)390 555 y(BURIED?)g(contentslist)150 723 y Fs(outputs)32 b Fk(TRUE)g Fs(if)h(the)g(\014rst)g(pro)s(cedure,)f(v) -5 b(ariable,)35 b(or)e(prop)s(ert)m(y)f(list)i(named)f(in)f(the)i(con) m(ten)m(ts)g(list)g(is)150 833 y(buried,)28 b Fk(FALSE)f Fs(if)i(not.)40 b(Only)28 b(the)h(\014rst)f(thing)h(in)f(the)h(list)g (is)g(tested;)h(the)f(most)g(common)g(use)g(will)g(b)s(e)150 942 y(with)35 b(a)g(w)m(ord)g(as)g(input,)h(naming)e(a)i(pro)s(cedure,) f(but)g(a)g(con)m(ten)m(ts)i(list)e(is)g(allo)m(w)m(ed)i(so)f(that)f(y) m(ou)h(can)150 1052 y Fk(BURIEDP)28 b([[])i([)p Fi(variable)p Fk(]])d Fs(or)k Fk(BURIEDP)d([[])h([])h([)p Fi(proplist)p Fk(]])p Fs(.)150 1265 y Fh(trace)390 1412 y Fk(TRACE)46 b(contentslist)150 1579 y Fs(command.)61 b(Marks)38 b(the)g(named)e (items)i(for)f(tracing.)63 b(A)38 b(message)g(is)f(prin)m(ted)g(whenev) m(er)h(a)f(traced)150 1689 y(pro)s(cedure)22 b(is)i(in)m(v)m(ok)m(ed,)j (giving)d(the)g(actual)g(input)f(v)-5 b(alues,)25 b(and)e(whenev)m(er)h (a)g(traced)g(pro)s(cedure)e Fk(STOP)p Fs(s)150 1799 y(or)38 b Fk(OUTPUT)p Fs(s.)60 b(A)38 b(message)g(is)g(prin)m(ted)f (whenev)m(er)g(a)h(new)f(v)-5 b(alue)38 b(is)g(assigned)g(to)g(a)g (traced)g(v)-5 b(ariable)150 1908 y(using)35 b Fk(MAKE)p Fs(.)54 b(A)35 b(message)h(is)f(prin)m(ted)g(whenev)m(er)g(a)h(new)e (prop)s(ert)m(y)h(is)g(giv)m(en)h(to)g(a)g(traced)g(prop)s(ert)m(y)150 2018 y(list)31 b(using)f Fk(PPROP)p Fs(.)150 2185 y(See)h([STOP],)e (page)j(69,)f(,)g([OUTPUT],)f(page)h(69,)g(,)g([MAKE],)g(page)g(51,)h (,)e([PPR)m(OP],)h(page)g(53,)h(.)150 2398 y Fh(un)m(trace)390 2545 y Fk(UNTRACE)46 b(contentslist)150 2713 y Fs(command.)40 b(T)-8 b(urns)29 b(o\013)i(tracing)g(for)g(the)f(named)g(items.)150 2926 y Fh(tracedp)390 3073 y Fk(TRACEDP)46 b(contentslist)390 3182 y(TRACED?)g(contentslist)150 3350 y Fs(outputs)32 b Fk(TRUE)g Fs(if)h(the)g(\014rst)g(pro)s(cedure,)f(v)-5 b(ariable,)35 b(or)e(prop)s(ert)m(y)f(list)i(named)f(in)f(the)i(con)m (ten)m(ts)g(list)g(is)150 3460 y(traced,)c Fk(FALSE)e Fs(if)h(not.)40 b(Only)28 b(the)i(\014rst)e(thing)h(in)g(the)g(list)g (is)g(tested;)i(the)e(most)g(common)h(use)e(will)i(b)s(e)150 3569 y(with)35 b(a)g(w)m(ord)g(as)g(input,)h(naming)e(a)i(pro)s (cedure,)f(but)g(a)g(con)m(ten)m(ts)i(list)e(is)g(allo)m(w)m(ed)i(so)f (that)f(y)m(ou)h(can)150 3679 y Fk(TRACEDP)28 b([[])i([)p Fi(variable)p Fk(]])d Fs(or)k Fk(TRACEDP)d([[])h([])h([)p Fi(proplist)p Fk(]])p Fs(.)150 3892 y Fh(step)390 4039 y Fk(STEP)47 b(contentslist)150 4206 y Fs(command.)39 b(Marks)27 b(the)g(named)g(items)g(for)g(stepping.)39 b(Whenev)m(er)28 b(a)f(stepp)s(ed)f(pro)s(cedure)f(is)i(in)m(v)m(ok)m (ed,)150 4316 y(eac)m(h)f(instruction)e(line)h(in)f(the)g(pro)s(cedure) f(b)s(o)s(dy)g(is)h(prin)m(ted)g(b)s(efore)g(b)s(eing)g(executed,)j (and)d(Logo)h(w)m(aits)150 4426 y(for)35 b(the)h(user)e(to)i(t)m(yp)s (e)g(a)f(newline)h(at)g(the)f(terminal.)56 b(A)35 b(message)i(is)e (prin)m(ted)g(whenev)m(er)g(a)h(stepp)s(ed)150 4535 y(v)-5 b(ariable)30 b(name)g(is)g Fl(shado)m(w)m(ed)j Fs(b)s(ecause)d(a)g(lo)s (cal)h(v)-5 b(ariable)31 b(of)e(the)h(same)g(name)g(is)g(created)g (either)h(as)f(a)150 4645 y(pro)s(cedure)f(input)h(or)g(b)m(y)g(the)h Fk(LOCAL)e Fs(command.)150 4812 y(See)i([LOCAL],)f(page)h(52,)g(.)150 5025 y Fh(unstep)390 5172 y Fk(UNSTEP)46 b(contentslist)150 5340 y Fs(command.)40 b(T)-8 b(urns)29 b(o\013)i(stepping)f(for)g(the)h (named)f(items.)p eop end %%Page: 61 74 TeXDict begin 61 73 bop 150 -116 a Fs(Chapter)30 b(7:)41 b(W)-8 b(orkspace)32 b(Managemen)m(t)2078 b(61)150 299 y Fh(stepp)s(edp)390 446 y Fk(STEPPEDP)46 b(contentslist)390 555 y(STEPPED?)g(contentslist)150 723 y Fs(outputs)32 b Fk(TRUE)g Fs(if)h(the)g(\014rst)g(pro)s(cedure,)f(v)-5 b(ariable,)35 b(or)e(prop)s(ert)m(y)f(list)i(named)f(in)f(the)i(con)m (ten)m(ts)g(list)g(is)150 833 y(stepp)s(ed,)e Fk(FALSE)f Fs(if)i(not.)47 b(Only)32 b(the)h(\014rst)e(thing)i(in)f(the)h(list)g (is)f(tested;)j(the)e(most)g(common)f(use)h(will)150 942 y(b)s(e)27 b(with)h(a)g(w)m(ord)g(as)g(input,)g(naming)g(a)g(pro)s (cedure,)g(but)f(a)h(con)m(ten)m(ts)i(list)f(is)f(allo)m(w)m(ed)i(so)e (that)g(y)m(ou)h(can)150 1052 y Fk(STEPPEDP)f([[])i([)p Fi(variable)p Fk(]])d Fs(or)j Fk(STEPPEDP)e([[])i([])g([)p Fi(proplist)p Fk(]])p Fs(.)150 1311 y Fh(edit)390 1458 y Fk(EDIT)47 b(contentslist)390 1568 y(ED)g(contentslist)390 1677 y(\(EDIT\))390 1787 y(\(ED\))150 1955 y Fs(command.)57 b(If)36 b(in)m(v)m(ok)m(ed)h(with)f(an)g(input,)h Fk(EDIT)e Fs(writes)h(the)g(de\014nitions)f(of)i(the)f(named)f(items)i(in)m(to) 150 2064 y(a)g(temp)s(orary)f(\014le)h(and)f(edits)h(that)h(\014le,)h (using)d(an)g(editor)i(that)f(dep)s(ends)e(on)i(the)f(platform)h(y)m (ou're)150 2174 y(using.)j(In)29 b(wxWidgets,)h(and)f(in)g(the)h(MacOS) f(Classic)h(v)m(ersion,)h(there)e(is)h(an)f(editor)h(built)f(in)m(to)i (Logo.)150 2284 y(In)k(the)h(non-wxWidgets)g(v)m(ersions)g(for)f(Unix,) i(MacOS)f(X,)g(Windo)m(ws,)i(and)d(DOS,)g(Logo)i(uses)e(y)m(our)150 2393 y(fa)m(v)m(orite)40 b(editor)f(as)g(determined)e(b)m(y)h(the)h Fk(EDITOR)d Fs(en)m(vironmen)m(t)j(v)-5 b(ariable.)65 b(If)38 b(y)m(ou)g(don't)h(ha)m(v)m(e)g(an)150 2503 y Fk(EDITOR)32 b Fs(v)-5 b(ariable,)35 b(edits)e(the)h(de\014nitions)f (using)g Fk(jove)p Fs(.)48 b(If)33 b(in)m(v)m(ok)m(ed)i(without)e(an)g (input,)g Fk(EDIT)g Fs(edits)150 2612 y(the)g(same)f(\014le)h(left)g(o) m(v)m(er)h(from)e(a)h(previous)e Fk(EDIT)h Fs(or)g Fk(EDITFILE)e Fs(instruction.)47 b(When)32 b(y)m(ou)h(lea)m(v)m(e)i(the)150 2722 y(editor,)c(Logo)f(reads)g(the)f(revised)h(de\014nitions)f(and)g (mo)s(di\014es)g(the)h(w)m(orkspace)g(accordingly)-8 b(.)42 b(It)30 b(is)g(not)150 2831 y(an)g(error)g(if)h(the)f(input)g (includes)g(names)g(for)g(whic)m(h)g(there)h(is)f(no)g(previous)g (de\014nition.)150 2999 y(If)35 b(there)g(is)g(a)h(v)-5 b(ariable)36 b Fk(LOADNOISILY)c Fs(whose)j(v)-5 b(alue)36 b(is)f Fk(TRUE)p Fs(,)h(then,)g(after)g(lea)m(ving)h(the)e(editor,)j Fk(TO)150 3109 y Fs(commands)27 b(in)f(the)i(temp)s(orary)e(\014le)h (prin)m(t)g(`)p Fi(procname)h Fk(defined)p Fs(')e(\(where)h Fl(pro)s(cname)k Fs(is)c(the)h(name)f(of)150 3218 y(the)34 b(pro)s(cedure)e(b)s(eing)h(de\014ned\);)i(if)f Fk(LOADNOISILY)c Fs(is)k Fk(FALSE)e Fs(or)i(unde\014ned,)e Fk(TO)h Fs(commands)g(in)h (the)150 3328 y(\014le)c(are)h(carried)g(out)f(silen)m(tly)-8 b(.)150 3496 y(If)28 b(there)h(is)g(an)g(en)m(vironmen)m(t)g(v)-5 b(ariable)30 b(called)g Fk(TEMP)p Fs(,)e(then)g(Logo)i(uses)f(its)g(v) -5 b(alue)29 b(as)g(the)g(directory)g(in)150 3605 y(whic)m(h)h(to)h (write)g(the)f(temp)s(orary)g(\014le)h(used)e(for)h(editing.)150 3773 y(Exceptionally)-8 b(,)29 b(the)d Fk(EDIT)e Fs(command)i(can)g(b)s (e)f(used)f(without)i(its)g(default)g(input)f(and)g(without)g(paren-) 150 3883 y(theses)31 b(pro)m(vided)f(that)h(nothing)f(follo)m(ws)h(it)g (on)g(the)f(instruction)h(line.)150 4050 y(See)g([LO)m(ADNOISIL)-8 b(Y],)31 b(page)g(90,)g(,)g(See)g([EDITFILE],)f(page)h(61,)h(.)150 4310 y Fh(edit\014le)390 4457 y Fk(EDITFILE)46 b(filename)150 4624 y Fs(command.)40 b(Starts)28 b(the)g(Logo)h(editor,)h(lik)m(e)f Fk(EDIT)p Fs(,)f(but)f(instead)i(of)f(editing)h(a)f(temp)s(orary)g (\014le)g(it)h(edits)150 4734 y(the)e(\014le)g(sp)s(eci\014ed)g(b)m(y)g (the)g(input.)38 b(When)27 b(y)m(ou)h(lea)m(v)m(e)h(the)e(editor,)i (Logo)f(reads)f(the)g(revised)g(\014le,)h(as)f(for)150 4844 y Fk(EDIT)p Fs(.)38 b Fk(EDITFILE)25 b Fs(also)j(remem)m(b)s(ers)f (the)g(\014lename,)h(so)f(that)h(a)f(subsequen)m(t)g Fk(EDIT)e Fs(command)i(with)g(no)150 4953 y(input)i(will)i(re-edit)g (the)g(same)g(\014le.)150 5121 y Fk(EDITFILE)g Fs(is)j(in)m(tended)f (as)h(an)g(alternativ)m(e)i(to)e Fk(LOAD)f Fs(and)f Fk(SAVE)p Fs(.)50 b(Y)-8 b(ou)34 b(can)g(main)m(tain)g(a)g(w)m(orkspace)150 5230 y(\014le)26 b(y)m(ourself,)i(con)m(trolling)g(the)e(order)g(in)f (whic)m(h)h(de\014nitions)g(app)s(ear,)h(main)m(taining)g(commen)m(ts)g (in)f(the)150 5340 y(\014le,)31 b(and)e(so)i(on.)p eop end %%Page: 62 75 TeXDict begin 62 74 bop 150 -116 a Fs(62)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(In)24 b(the)h(wxWidgets)h(v)m(ersion,)h Fk(EDITFILE)22 b Fs(asks)j(whether)g(or)g(not)g(y)m(ou)g(w)m(an)m(t)h (to)f(load)h(the)f(\014le)g(in)m(to)h(Logo)150 408 y(when)i(y)m(ou)h (\014nish)f(editing.)41 b(This)28 b(allo)m(ws)j(y)m(ou)e(to)h(use)e Fk(EDITFILE)f Fs(to)j(edit)f(data)h(\014les)f(without)g(lea)m(ving)150 518 y(Logo.)150 702 y Fh(edall)390 848 y Fk(EDALL)46 b(\(library)g(procedure\))150 1016 y Fs(command.)40 b(Abbreviates)31 b Fk(EDIT)47 b(CONTENTS)p Fs(.)150 1184 y(See)31 b([CONTENTS],)e(page)i (54,)h(.)150 1367 y Fh(edps)390 1514 y Fk(EDPS)47 b(\(library)e (procedure\))150 1682 y Fs(command.)40 b(Abbreviates)31 b Fk(EDIT)47 b(PROCEDURES)p Fs(.)150 1850 y(See)31 b([EDIT],)f(page)i (61,)f(,)g([PR)m(OCEDURES],)f(page)h(55,)h(.)150 2033 y Fh(edns)390 2180 y Fk(EDNS)47 b(\(library)e(procedure\))150 2348 y Fs(command.)40 b(Abbreviates)31 b Fk(EDIT)47 b(NAMES)p Fs(.)150 2516 y(See)31 b([EDIT],)f(page)i(61,)f(,)g([NAMES],)g(page)g (55,)g(.)150 2699 y Fh(edpls)390 2846 y Fk(EDPLS)46 b(\(library)g (procedure\))150 3014 y Fs(command.)40 b(Abbreviates)31 b Fk(EDIT)47 b(PLISTS)p Fs(.)150 3181 y(See)31 b([EDIT],)f(page)i(61,)f (,)g([PLISTS],)e(page)i(55,)g(.)150 3365 y Fh(edn)390 3512 y Fk(EDN)47 b(varname)f(\(library)f(procedure\))390 3621 y(EDN)i(varnamelist)150 3789 y Fs(command.)40 b(Abbreviates)31 b Fk(EDIT)47 b(NAMELIST)e Fi(varname\(list\))p Fs(.)150 3957 y(See)31 b([EDIT],)f(page)i(61,)f(,)g([NAMELIST],)f(page)h(55,)h (.)150 4140 y Fh(edpl)390 4287 y Fk(EDPL)47 b(plname)f(\(library)f (procedure\))390 4397 y(EDPL)i(plnamelist)150 4565 y Fs(command.)40 b(Abbreviates)31 b Fk(EDIT)47 b(PLLIST)f Fi(plname\(list\))p Fs(.)150 4732 y(See)31 b([EDIT],)f(page)i(61,)f(,)g ([PLLIST],)e(page)i(55,)h(.)150 4916 y Fh(sa)m(v)m(e)390 5063 y Fk(SAVE)47 b(filename)150 5230 y Fs(command.)40 b(Sa)m(v)m(es)32 b(the)e(de\014nitions)g(of)g(all)h(un)m(buried)e(pro)s (cedures,)g(v)-5 b(ariables,)31 b(and)f(nonempt)m(y)g(prop-)150 5340 y(ert)m(y)h(lists)g(in)f(the)h(named)f(\014le.)40 b(Equiv)-5 b(alen)m(t)32 b(to)p eop end %%Page: 63 76 TeXDict begin 63 75 bop 150 -116 a Fs(Chapter)30 b(7:)41 b(W)-8 b(orkspace)32 b(Managemen)m(t)2078 b(63)390 299 y Fk(to)47 b(save)g(:filename)390 408 y(local)f("oldwriter)390 518 y(make)h("oldwriter)e(writer)390 628 y(openwrite)g(:filename)390 737 y(setwrite)h(:filename)390 847 y(poall)390 956 y(setwrite)g (:oldwriter)390 1066 y(close)g(:filename)390 1176 y(end)150 1343 y Fs(Exceptionally)-8 b(,)45 b Fk(SAVE)39 b Fs(can)h(b)s(e)f(used) h(with)f(no)h(input)f(and)h(without)g(paren)m(theses)g(if)g(it)h(is)f (the)g(last)150 1453 y(thing)33 b(on)g(the)g(command)g(line.)48 b(In)33 b(this)f(case,)j(the)e(\014lename)h(from)e(the)h(most)g(recen)m (t)h Fk(LOAD)e Fs(or)h Fk(SAVE)150 1562 y Fs(command)d(will)h(b)s(e)f (used.)40 b(\(It)30 b(is)h(an)f(error)g(if)g(there)h(has)f(b)s(een)g (no)g(previous)g Fk(LOAD)f Fs(or)h Fk(SAVE)p Fs(.\))150 1780 y Fh(sa)m(v)m(el)390 1927 y Fk(SAVEL)46 b(contentslist)f(filename) g(\(library)h(procedure\))150 2094 y Fs(command.)39 b(Sa)m(v)m(es)29 b(the)e(de\014nitions)f(of)i(the)f(pro)s(cedures,)g(v)-5 b(ariables,)28 b(and)f(prop)s(ert)m(y)f(lists)i(sp)s(eci\014ed)e(b)m(y) 150 2204 y Fl(con)m(ten)m(tslist)35 b Fs(to)c(the)f(\014le)h(named)f Fl(\014lename)p Fs(.)150 2421 y Fh(load)390 2568 y Fk(LOAD)47 b(filename)150 2736 y Fs(command.)40 b(Reads)29 b(instructions)g(from)g (the)g(named)g(\014le)g(and)f(executes)j(them.)40 b(The)29 b(\014le)g(can)g(include)150 2845 y(pro)s(cedure)c(de\014nitions)g (with)h Fk(TO)p Fs(,)g(and)f(these)i(are)f(accepted)h(ev)m(en)g(if)f(a) g(pro)s(cedure)f(b)m(y)h(the)g(same)g(name)150 2955 y(already)31 b(exists.)42 b(If)30 b(the)h(\014le)g(assigns)f(a)h(list)h(v)-5 b(alue)31 b(to)g(a)g(v)-5 b(ariable)31 b(named)f Fk(STARTUP)p Fs(,)f(then)i(that)g(list)g(is)150 3064 y(run)h(as)i(an)g (instructionlist)g(after)g(the)g(\014le)g(is)f(loaded.)51 b(If)34 b(there)f(is)h(a)g(v)-5 b(ariable)35 b Fk(LOADNOISILY)30 b Fs(whose)150 3174 y(v)-5 b(alue)38 b(is)h Fk(TRUE)p Fs(,)g(then)e Fk(TO)h Fs(commands)f(in)h(the)g(\014le)g(prin)m(t)g(`)p Fi(procname)28 b Fk(defined)p Fs(')36 b(\(where)i Fl(pro)s(cname)150 3284 y Fs(is)j(the)h(name)g(of)f(the)h(pro)s(cedure)e(b)s(eing)h (de\014ned\);)47 b(if)41 b Fk(LOADNOISILY)d Fs(is)k Fk(FALSE)e Fs(or)h(unde\014ned,)i Fk(TO)150 3393 y Fs(commands)30 b(in)g(the)h(\014le)f(are)h(carried)f(out)h(silen)m(tly)-8 b(.)150 3561 y(See)31 b([ST)-8 b(AR)g(TUP],)30 b(page)i(91,)f(,)g(See)f ([LO)m(ADNOISIL)-8 b(Y],)31 b(page)h(90,)f(.)150 3778 y Fh(cslsload)390 3925 y Fk(CSLSLOAD)46 b(name)150 4093 y Fs(command.)39 b(Loads)24 b(the)h(named)f(\014le,)i(lik)m(e)f Fk(LOAD)p Fs(,)g(but)f(from)g(the)g(directory)h(con)m(taining)h(the)f (Computer)150 4202 y(Science)31 b(Logo)h(St)m(yle)f(programs)f(instead) h(of)f(the)h(curren)m(t)f(user's)g(directory)-8 b(.)150 4370 y(See)31 b([LO)m(AD],)g(page)g(63,)h(.)150 4587 y Fh(help)390 4734 y Fk(HELP)47 b(name)390 4844 y(\(HELP\))150 5011 y Fs(command.)69 b(Prin)m(ts)40 b(information)g(from)f(the)h (reference)h(man)m(ual)f(ab)s(out)f(the)h(primitiv)m(e)h(pro)s(cedure) 150 5121 y(named)26 b(b)m(y)g(the)h(input.)39 b(With)27 b(no)f(input,)g(lists)h(all)h(the)e(primitiv)m(es)i(ab)s(out)e(whic)m (h)g(help)g(is)h(a)m(v)-5 b(ailable.)41 b(If)150 5230 y(there)27 b(is)g(an)g(en)m(vironmen)m(t)h(v)-5 b(ariable)27 b Fk(LOGOHELP)p Fs(,)f(then)h(its)g(v)-5 b(alue)28 b(is)f(tak)m(en)h (as)f(the)g(directory)h(in)e(whic)m(h)150 5340 y(to)31 b(lo)s(ok)g(for)f(help)g(\014les,)h(instead)f(of)h(the)g(default)f (help)g(directory)-8 b(.)p eop end %%Page: 64 77 TeXDict begin 64 76 bop 150 -116 a Fs(64)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(If)e Fk(HELP)g Fs(is)g(called)i(with)f(the)f (name)h(of)g(a)g(de\014ned)e(pro)s(cedure)h(for)g(whic)m(h)h(there)g (is)f(no)h(help)f(\014le,)h(it)h(will)150 408 y(prin)m(t)35 b(the)h(title)h(line)f(of)g(the)g(pro)s(cedure)f(follo)m(w)m(ed)i(b)m (y)f(lines)f(from)h(the)f(pro)s(cedure)g(b)s(o)s(dy)f(that)i(start)150 518 y(with)30 b(semicolon,)i(stopping)e(when)g(a)g(non-semicolon)i (line)e(is)h(seen.)150 686 y(Exceptionally)-8 b(,)29 b(the)d Fk(HELP)e Fs(command)i(can)g(b)s(e)f(used)f(without)i(its)g (default)g(input)f(and)g(without)g(paren-)150 795 y(theses)31 b(pro)m(vided)f(that)h(nothing)f(follo)m(ws)h(it)g(on)g(the)f (instruction)h(line.)150 991 y Fh(seteditor)390 1138 y Fk(SETEDITOR)45 b(path)150 1306 y Fs(command.)39 b(T)-8 b(ells)25 b(Logo)h(to)f(use)g(the)f(sp)s(eci\014ed)g(program)h(as)g (its)g(editor)g(instead)g(of)g(the)f(default)h(editor.)150 1415 y(The)30 b(format)h(of)f(a)h(path)f(dep)s(ends)f(on)h(y)m(our)g (op)s(erating)h(system.)150 1611 y Fh(setliblo)s(c)390 1758 y Fk(SETLIBLOC)45 b(path)150 1926 y Fs(command.)64 b(T)-8 b(ells)39 b(Logo)g(to)g(use)f(the)g(sp)s(eci\014ed)g(directory)h (as)f(its)h(library)e(instead)i(of)f(the)g(default.)150 2035 y(\(Note)j(that)f(man)m(y)g(Logo)g Fk(")p Fs(primitiv)m(e)p Fk(")g Fs(pro)s(cedures)e(are)i(actually)h(found)d(in)h(the)g(library) -8 b(,)42 b(so)e(they)150 2145 y(ma)m(y)31 b(b)s(ecome)g(una)m(v)-5 b(ailable)32 b(if)e(y)m(our)h(new)f(library)g(do)s(es)g(not)h(include)f (them!\))42 b(The)30 b(format)h(of)f(a)h(path)150 2254 y(dep)s(ends)e(on)h(y)m(our)g(op)s(erating)h(system.)150 2450 y Fh(setcslslo)s(c)390 2597 y Fk(SETCSLSLOC)45 b(path)150 2765 y Fs(command.)40 b(T)-8 b(ells)32 b(Logo)f(to)g(use)f(the)h(sp)s (eci\014ed)e(directory)i(for)f(the)h Fk(CSLSLOAD)d Fs(command,)i (instead)h(of)150 2874 y(the)g(default)f(directory)-8 b(.)42 b(The)30 b(format)g(of)h(a)g(path)f(dep)s(ends)e(on)j(y)m(our)f (op)s(erating)h(system.)150 3042 y(See)g([CSLSLO)m(AD],)f(page)h(63,)g (.)150 3238 y Fh(sethelplo)s(c)390 3385 y Fk(SETHELPLOC)45 b(path)150 3552 y Fs(command.)40 b(T)-8 b(ells)29 b(Logo)g(to)g(lo)s (ok)g(in)f(the)h(sp)s(eci\014ed)f(directory)g(for)g(the)h(information)g (pro)m(vided)f(b)m(y)g(the)150 3662 y(HELP)34 b(command,)h(instead)f (of)g(the)g(default)g(directory)-8 b(.)53 b(The)33 b(format)i(of)f(a)g (path)g(dep)s(ends)e(on)i(y)m(our)150 3771 y(op)s(erating)d(system.)150 3967 y Fh(settemplo)s(c)390 4114 y Fk(SETTEMPLOC)45 b(path)150 4282 y Fs(command.)d(T)-8 b(ells)31 b(Logo)h(to)g(write)f(editor)g (temp)s(orary)g(\014les)g(in)f(the)h(sp)s(eci\014ed)f(directory)h (rather)g(than)150 4391 y(in)g(the)h(default)g(directory)-8 b(.)45 b(Y)-8 b(ou)33 b(m)m(ust)e(ha)m(v)m(e)i(write)f(p)s(ermission)e (for)i(this)f(directory)-8 b(.)46 b(The)31 b(format)h(of)150 4501 y(a)f(path)f(dep)s(ends)e(on)j(y)m(our)f(op)s(erating)h(system.) 150 4697 y Fh(gc)390 4844 y Fk(GC)390 4953 y(\(GC)47 b(anything\))150 5121 y Fs(command.)76 b(Runs)41 b(the)i(garbage)h (collector,)k(reclaiming)43 b(un)m(used)e(no)s(des.)76 b(Logo)44 b(do)s(es)e(this)g(when)150 5230 y(necessary)22 b(an)m(yw)m(a)m(y)-8 b(,)26 b(but)20 b(y)m(ou)i(ma)m(y)h(w)m(an)m(t)f (to)h(use)e(this)h(command)f(to)h(con)m(trol)h(exactly)h(when)c(Logo)j (do)s(es)150 5340 y(it.)49 b(In)32 b(particular,)i(the)f(n)m(um)m(b)s (ers)f(output)g(b)m(y)h(the)g Fk(NODES)f Fs(op)s(eration)h(will)g(not)h (b)s(e)e(v)m(ery)h(meaningful)p eop end %%Page: 65 78 TeXDict begin 65 77 bop 150 -116 a Fs(Chapter)30 b(7:)41 b(W)-8 b(orkspace)32 b(Managemen)m(t)2078 b(65)150 299 y(unless)36 b(garbage)h(has)g(b)s(een)e(collected.)61 b(Another)37 b(reason)f(to)h(use)g Fk(GC)e Fs(is)i(that)g(a)g(garbage)g (collection)150 408 y(tak)m(es)32 b(a)e(noticeable)i(fraction)f(of)f(a) h(second,)f(and)g(y)m(ou)g(ma)m(y)h(w)m(an)m(t)g(to)g(sc)m(hedule)f (collections)j(for)c(times)150 518 y(b)s(efore)c(or)g(after)h(some)g (time-critical)i(animation.)40 b(If)25 b(in)m(v)m(ok)m(ed)i(with)e(an)h (argumen)m(t)f(\(of)h(an)m(y)g(v)-5 b(alue\),)28 b Fk(GC)150 628 y Fs(runs)g(a)h(full)g(garbage)i(collection,)h(including)d Ff(GCTW)-9 b(A)29 b Fs(\(Garbage)i(Collect)g(T)-8 b(ruly)28 b(W)-8 b(orthless)31 b(A)m(toms,)150 737 y(whic)m(h)42 b(means)h(that)g(it)h(remo)m(v)m(es)g(from)e(Logo's)i(memory)e(w)m (ords)h(that)g(used)f(to)h(b)s(e)f(pro)s(cedure)g(or)150 847 y(v)-5 b(ariable)28 b(names)g(but)e(aren't)i(an)m(y)g(more\);)i (without)d(an)g(argumen)m(t,)i Fk(GC)e Fs(do)s(es)g(a)h(generational)i (garbage)150 956 y(collection,)50 b(whic)m(h)44 b(means)g(that)g(only)g (recen)m(tly)i(created)f(no)s(des)e(are)h(examined.)82 b(\(The)44 b(latter)h(is)150 1066 y(usually)30 b(go)s(o)s(d)g (enough.\))150 1265 y Fh(.setsegmen)m(tsize)390 1412 y Fk(.SETSEGMENTSIZE)44 b(num)150 1580 y Fs(command.)39 b(Sets)27 b(the)g(n)m(um)m(b)s(er)e(of)i(no)s(des)f(that)i(Logo)f(allo) s(cates)j(from)c(the)h(op)s(erating)g(system)g(at)g(once)150 1689 y(to)41 b Fl(n)m(um)p Fs(,)g(whic)m(h)f(m)m(ust)g(b)s(e)f(a)i(p)s (ositiv)m(e)g(in)m(teger.)71 b(The)39 b(name)h(is)g(dotted)g(b)s (ecause)g(bad)g(things)g(will)150 1799 y(happ)s(en)35 b(if)h(y)m(ou)h(use)f(a)g(n)m(um)m(b)s(er)f(that's)i(to)s(o)g(small)g (or)g(to)s(o)g(large)g(for)f(y)m(our)g(computer.)59 b(The)36 b(initial)150 1909 y(v)-5 b(alue)39 b(is)f(16,000)j(for)c(most)i (systems,)h(but)e(is)g(smaller)h(for)f(68000-based)i(Macs.)65 b(Making)39 b(it)g(larger)150 2018 y(will)32 b(sp)s(eed)f(up)f (computations)i(\(b)m(y)g(reducing)f(the)h(n)m(um)m(b)s(er)e(of)i (garbage)h(collections\))h(at)e(the)g(cost)h(of)150 2128 y(allo)s(cating)g(more)d(memory)g(than)h(necessary)-8 b(.)p eop end %%Page: 66 79 TeXDict begin 66 78 bop eop end %%Page: 67 80 TeXDict begin 67 79 bop 3659 -116 a Fs(67)150 299 y Fp(8)80 b(Con)l(trol)52 b(Structures)150 616 y Fr(8.1)68 b(Con)l(trol)150 775 y Fs(Note:)43 b(in)30 b(the)h(follo)m(wing)i(descriptions,)e(an)f Fl(instructionlist)k Fs(can)d(b)s(e)f(a)h(list)h(or)f(a)g(w)m(ord.)42 b(In)30 b(the)h(latter)150 885 y(case,)24 b(the)d(w)m(ord)g(is)g (parsed)f(in)m(to)i(list)g(form)e(b)s(efore)h(it)g(is)g(run.)37 b(Th)m(us,)22 b Fk(RUN)47 b(READWORD)18 b Fs(or)j Fk(RUN)47 b(READLIST)150 994 y Fs(will)33 b(w)m(ork.)47 b(The)32 b(former)g(is)h(sligh)m(tly)g(preferable)g(b)s(ecause)f(it)h(allo)m(ws) h(for)e(a)h(con)m(tin)m(ued)h(line)e(\(with)h Fk(~)p Fs(\))150 1104 y(that)e(includes)f(a)h(commen)m(t)g(\(with)g Fk(;)p Fs(\))f(on)g(the)h(\014rst)e(line.)150 1272 y(A)i Fl(tf)48 b Fs(input)30 b(m)m(ust)h(b)s(e)f(the)h(w)m(ord)f Fk(TRUE)p Fs(,)g(the)h(w)m(ord)f Fk(FALSE)p Fs(,)g(or)g(a)h(list.)43 b(If)30 b(it's)h(a)h(list,)f(then)g(it)g(m)m(ust)g(b)s(e)150 1381 y(a)e(Logo)g(expression,)f(whic)m(h)g(will)h(b)s(e)e(ev)-5 b(aluated)30 b(to)f(pro)s(duce)e(a)h(v)-5 b(alue)29 b(that)f(m)m(ust)g (b)s(e)g Fk(TRUE)f Fs(or)h Fk(FALSE)p Fs(.)150 1491 y(The)i (comparisons)g(with)g Fk(TRUE)g Fs(and)f Fk(FALSE)g Fs(are)i(alw)m(a)m (ys)h(case-insensitiv)m(e.)150 1659 y(A)h(runlist)g(can)g(consist)h(of) g(either)g(a)f(single)h(expression)f(\(that)h(pro)s(duces)e(a)i(v)-5 b(alue\))34 b(or)f(zero)i(or)e(more)150 1768 y(instructions)d(\(that)i (do)e(something,)h(rather)f(than)g(output)g(a)h(v)-5 b(alue\),)31 b(dep)s(ending)e(on)i(the)f(con)m(text:)390 1936 y Fk(PRINT)46 b(IFELSE)g(:X<0)h(["NEGATIVE])e(["POSITIVE])92 b(;)48 b(one)f(value)f(in)h(each)g(case)390 2045 y(REPEAT)f(4)i([PRINT) e("A)h(PRINT)f("B])95 b(;)47 b(two)g(instructions)150 2237 y Fh(run)390 2384 y Fk(RUN)g(instructionlist)150 2552 y Fs(command)39 b(or)g(op)s(eration.)67 b(Runs)38 b(the)i(Logo)g(instructions)f(in)f(the)i(input)e(list;)44 b(outputs)39 b(if)g(the)g(list)150 2661 y(con)m(tains)32 b(an)e(expression)g(that)h(outputs.)150 2829 y(See)g([READ)m(W)m(ORD],) i(page)e(20,)g(,)g([READLIST],)f(page)h(20,)h(.)150 3020 y Fh(runresult)390 3167 y Fk(RUNRESULT)45 b(instructionlist)150 3335 y Fs(runs)33 b(the)i(instructions)g(in)f(the)h(input;)i(outputs)d (an)h(empt)m(y)g(list)h(if)e(those)i(instructions)e(pro)s(duce)g(no)150 3444 y(output,)g(or)g(a)g(list)g(whose)f(only)h(mem)m(b)s(er)f(is)h (the)f(output)h(from)f(running)f(the)h(input)g(instructionlist.)150 3554 y(Useful)d(for)g(in)m(v)m(en)m(ting)i(command-or-op)s(eration)g (con)m(trol)f(structures:)390 3722 y Fk(local)46 b("result)390 3831 y(make)h("result)e(runresult)h([something])390 3941 y(if)h(emptyp)f(:result)g([stop])390 4051 y(output)g(first)g(:result) 150 4242 y Fh(rep)s(eat)390 4389 y Fk(REPEAT)g(num)h(instructionlist) 150 4557 y Fs(command.)40 b(Runs)30 b(the)g Fl(instructionlist)j Fs(rep)s(eatedly)-8 b(,)32 b Fl(n)m(um)d Fs(times.)150 4748 y Fh(forev)m(er)390 4895 y Fk(FOREVER)46 b(instructionlist)150 5063 y Fs(command.)c(Runs)29 b(the)i Fk(")p Fs(instructionlist)p Fk(")g Fs(rep)s(eatedly)-8 b(,)32 b(un)m(til)f(something)g(inside)f (the)h(instructionlist)150 5172 y(\(suc)m(h)f(as)h Fk(STOP)e Fs(or)i Fk(THROW)p Fs(\))e(mak)m(es)i(it)g(stop.)150 5340 y(See)g([STOP],)e(page)j(69,)f(,)g(See)f([THR)m(O)m(W],)i(page)f (69,)h(.)p eop end %%Page: 68 81 TeXDict begin 68 80 bop 150 -116 a Fs(68)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fh(rep)s(coun)m(t)390 446 y Fk(REPCOUNT)150 614 y Fs(outputs)g(the)g(rep)s(etition)h(coun)m(t)g(of)f(the)h (innermost)f(curren)m(t)g Fk(REPEAT)f Fs(or)h Fk(FOREVER)p Fs(,)e(starting)j(from)f(1.)150 723 y(If)g(no)g Fk(REPEAT)f Fs(or)h Fk(FOREVER)f Fs(is)h(activ)m(e,)j(outputs)d({1.)150 891 y(The)24 b(abbreviation)i Fk(#)f Fs(can)g(b)s(e)f(used)g(for)h Fk(REPCOUNT)e Fs(unless)h(the)h Fk(REPEAT)f Fs(is)h(inside)f(the)h (template)i(input)150 1000 y(to)k(a)g(higher)f(order)g(pro)s(cedure)f (suc)m(h)h(as)h Fk(FOREACH)p Fs(,)d(in)i(whic)m(h)g(case)i Fk(#)e Fs(has)g(a)h(di\013eren)m(t)g(meaning.)150 1213 y Fh(if)390 1360 y Fk(IF)47 b(tf)g(instructionlist)390 1470 y(\(IF)g(tf)g(instructionlist1)c(instructionlist2\))150 1638 y Fs(command.)69 b(If)39 b(the)h(\014rst)g(input)f(has)g(the)h(v) -5 b(alue)41 b Fk(TRUE)p Fs(,)g(then)e Fk(IF)h Fs(runs)e(the)i(second)g (input.)68 b(If)40 b(the)150 1747 y(\014rst)31 b(input)h(has)g(the)g(v) -5 b(alue)33 b Fk(FALSE)p Fs(,)e(then)h Fk(IF)f Fs(do)s(es)h(nothing.) 46 b(\(If)32 b(giv)m(en)h(a)g(third)e(input,)h(IF)g(acts)i(lik)m(e)150 1857 y Fk(IFELSE)p Fs(,)29 b(as)i(describ)s(ed)e(b)s(elo)m(w.\))41 b(It)31 b(is)f(an)g(error)g(if)h(the)f(\014rst)g(input)f(is)i(not)f (either)h Fk(TRUE)e Fs(or)i Fk(FALSE)p Fs(.)150 2024 y(F)-8 b(or)46 b(compatibilit)m(y)i(with)d(earlier)i(v)m(ersions)e(of)h (Logo,)51 b(if)45 b(an)g Fk(IF)g Fs(instruction)h(is)f(not)h(enclosed)g (in)150 2134 y(paren)m(theses,)32 b(but)f(the)h(\014rst)f(thing)g(on)h (the)f(instruction)h(line)g(after)g(the)f(second)h(input)f(expression)g (is)150 2244 y(a)37 b(literal)i(list)e(\(i.e.,)j(a)e(list)f(in)g (square)f(brac)m(k)m(ets\),)41 b(the)c Fk(IF)f Fs(is)h(treated)h(as)f (if)g(it)g(w)m(ere)g Fk(IFELSE)p Fs(,)g(but)g(a)150 2353 y(w)m(arning)32 b(message)h(is)e(giv)m(en.)47 b(If)31 b(this)h(ab)s(erran)m(t)f Fk(IF)g Fs(app)s(ears)h(in)f(a)h(pro)s (cedure)f(b)s(o)s(dy)-8 b(,)31 b(the)h(w)m(arning)g(is)150 2463 y(giv)m(en)f(only)g(the)f(\014rst)g(time)h(the)g(pro)s(cedure)e (is)h(in)m(v)m(ok)m(ed)i(in)e(eac)m(h)i(Logo)f(session.)150 2676 y Fh(ifelse)390 2823 y Fk(IFELSE)46 b(tf)h(instructionlist1)d (instructionlist2)150 2990 y Fs(command)31 b(or)g(op)s(eration.)42 b(If)31 b(the)g(\014rst)f(input)g(has)g(the)h(v)-5 b(alue)32 b Fk(TRUE)p Fs(,)e(then)g Fk(IFELSE)g Fs(runs)f(the)i(second)150 3100 y(input.)59 b(If)36 b(the)h(\014rst)f(input)g(has)g(the)h(v)-5 b(alue)37 b Fk(FALSE)p Fs(,)g(then)g Fk(IFELSE)e Fs(runs)g(the)i(third) f(input.)59 b Fk(IFELSE)150 3209 y Fs(outputs)30 b(a)h(v)-5 b(alue)30 b(if)h(the)f Fl(instructionlist)j Fs(con)m(tains)f(an)e (expression)g(that)h(outputs)f(a)h(v)-5 b(alue.)150 3422 y Fh(test)390 3569 y Fk(TEST)47 b(tf)150 3737 y Fs(command.)40 b(Remem)m(b)s(ers)30 b(its)g(input,)g(whic)m(h)g(m)m(ust)g(b)s(e)f Fk(TRUE)g Fs(or)h Fk(FALSE)p Fs(,)f(for)h(use)g(b)m(y)g(later)h Fk(IFTRUE)d Fs(or)150 3847 y Fk(IFFALSE)i Fs(instructions.)46 b(The)32 b(e\013ect)i(of)e Fk(TEST)f Fs(is)h(lo)s(cal)i(to)f(the)f(pro) s(cedure)f(in)h(whic)m(h)g(it)h(is)f(used;)h(an)m(y)150 3956 y(corresp)s(onding)c Fk(IFTRUE)g Fs(or)h Fk(IFFALSE)f Fs(m)m(ust)h(b)s(e)g(in)g(the)g(same)h(pro)s(cedure)e(or)i(a)f(subpro)s (cedure.)150 4124 y(See)h([IFF)-10 b(ALSE],)30 b(page)i(68,)f(.)150 4337 y Fh(iftrue)390 4484 y Fk(IFTRUE)46 b(instructionlist)390 4593 y(IFT)h(instructionlist)150 4761 y Fs(command.)41 b(Runs)29 b(its)i(input)f(if)g(the)h(most)g(recen)m(t)h Fk(TEST)d Fs(instruction)h(had)g(a)h Fk(TRUE)f Fs(input.)40 b(The)30 b Fk(TEST)150 4871 y Fs(m)m(ust)g(ha)m(v)m(e)i(b)s(een)d(in)i (the)f(same)h(pro)s(cedure)e(or)h(a)h(sup)s(erpro)s(cedure.)150 5083 y Fh(i\013alse)390 5230 y Fk(IFFALSE)46 b(instructionlist)390 5340 y(IFF)h(instructionlist)p eop end %%Page: 69 82 TeXDict begin 69 81 bop 150 -116 a Fs(Chapter)30 b(8:)41 b(Con)m(trol)31 b(Structures)2302 b(69)150 299 y(command.)39 b(Runs)26 b(its)i(input)e(if)h(the)g(most)h(recen)m(t)g Fk(TEST)e Fs(instruction)h(had)g(a)g Fk(FALSE)f Fs(input.)38 b(The)27 b Fk(TEST)150 408 y Fs(m)m(ust)j(ha)m(v)m(e)i(b)s(een)d(in)i (the)f(same)h(pro)s(cedure)e(or)h(a)h(sup)s(erpro)s(cedure.)150 576 y(See)g([TEST],)e(page)i(68,)h(.)150 806 y Fh(stop)390 953 y Fk(STOP)150 1121 y Fs(command.)48 b(Ends)31 b(the)i(running)e(of) i(the)g(pro)s(cedure)e(in)i(whic)m(h)f(it)h(app)s(ears.)47 b(Con)m(trol)34 b(is)f(returned)e(to)150 1230 y(the)g(con)m(text)i(in)e (whic)m(h)f(that)i(pro)s(cedure)e(w)m(as)h(in)m(v)m(ok)m(ed.)44 b(The)31 b(stopp)s(ed)f(pro)s(cedure)f(do)s(es)i(not)g(output)150 1340 y(a)g(v)-5 b(alue.)150 1570 y Fh(output)390 1717 y Fk(OUTPUT)46 b(value)390 1826 y(OP)h(value)150 1994 y Fs(command.)39 b(Ends)26 b(the)h(running)f(of)h(the)g(pro)s(cedure)f (in)h(whic)m(h)g(it)h(app)s(ears.)39 b(That)27 b(pro)s(cedure)e (outputs)150 2104 y(the)30 b(v)-5 b(alue)31 b Fl(v)-5 b(alue)35 b Fs(to)c(the)f(con)m(text)i(in)e(whic)m(h)g(it)g(w)m(as)g (in)m(v)m(ok)m(ed.)43 b(Don't)30 b(b)s(e)g(confused:)40 b Fk(OUTPUT)28 b Fs(itself)j(is)150 2213 y(a)g(command,)f(but)g(the)g (pro)s(cedure)g(that)h(in)m(v)m(ok)m(es)h Fk(OUTPUT)c Fs(is)j(an)f(op)s(eration.)150 2443 y Fh(catc)m(h)390 2590 y Fk(CATCH)46 b(tag)h(instructionlist)150 2758 y Fs(command)31 b(or)h(op)s(eration.)45 b(Runs)30 b(its)i(second)g (input.)43 b(Outputs)30 b(if)i(that)g Fl(instructionlist)i Fs(outputs.)44 b(If,)150 2868 y(while)22 b(running)f(the)i (instructionlist,)i(a)e Fk(THROW)e Fs(instruction)h(is)h(executed)g (with)f(a)h(tag)h(equal)f(to)g(the)g(\014rst)150 2977 y(input)37 b(\(case-insensitiv)m(e)j(comparison\),)h(then)c(the)h (running)e(of)i(the)g Fl(instructionlist)j Fs(is)c(terminated)150 3087 y(immediately)-8 b(.)59 b(In)35 b(this)h(case)h(the)f Fk(CATCH)e Fs(outputs)i(if)g(a)g(v)-5 b(alue)36 b(input)f(is)h(giv)m (en)h(to)g Fk(THROW)p Fs(.)56 b(The)35 b Fl(tag)150 3196 y Fs(m)m(ust)30 b(b)s(e)g(a)h(w)m(ord.)150 3364 y(If)38 b(the)g(tag)h(is)f(the)h(w)m(ord)e Fk(ERROR)p Fs(,)i(then)f(an)m(y)h (error)e(condition)i(that)g(arises)f(during)f(the)h(running)f(of)150 3474 y(the)30 b(instructionlist)g(has)f(the)h(e\013ect)g(of)g Fk(THROW)46 b("ERROR)28 b Fs(instead)i(of)f(prin)m(ting)h(an)f(error)g (message)i(and)150 3583 y(returning)j(to)j(toplev)m(el.)57 b(The)35 b Fk(CATCH)f Fs(do)s(es)h(not)h(output)f(if)g(an)g(error)g(is) g(caugh)m(t.)57 b(Also,)38 b(during)c(the)150 3693 y(running)d(of)h (the)h(instructionlist,)h(the)f(v)-5 b(ariable)33 b Fk(ERRACT)e Fs(is)h(temp)s(orarily)h(un)m(b)s(ound.)44 b(\(If)33 b(there)g(is)f(an)150 3802 y(error)39 b(while)h Fk(ERRACT)d Fs(has)j(a)f(v)-5 b(alue,)43 b(that)d(v)-5 b(alue)40 b(is)f(tak)m(en)i(as)f(an)f(instructionlist)h(to)h(b)s(e)d(run)g(after) 150 3912 y(prin)m(ting)30 b(the)h(error)f(message.)42 b(T)m(ypically)31 b(the)g(v)-5 b(alue)31 b(of)f Fk(ERRACT)p Fs(,)f(if)h(an)m(y)-8 b(,)32 b(is)e(the)h(list)g Fk([PAUSE])p Fs(.\))150 4080 y(See)g([ERR)m(OR],)f(page)i(70,)f(,)g([ERRA)m(CT],)f (page)h(89,)h(,)f([P)-8 b(A)m(USE],)31 b(page)g(70,)h(.)150 4310 y Fh(thro)m(w)390 4457 y Fk(THROW)46 b(tag)390 4566 y(\(THROW)g(tag)h(value\))150 4734 y Fs(command.)40 b(Must)30 b(b)s(e)f(used)g(within)h(the)g(scop)s(e)f(of)h(a)h Fk(CATCH)d Fs(with)h(an)h(equal)g(tag.)42 b(Ends)29 b(the)h(running)150 4844 y(of)f(the)h(instructionlist)g(of)f(the)g Fk(CATCH)p Fs(.)39 b(If)29 b Fk(THROW)f Fs(is)h(used)f(with)h(only)g(one)h(input,) f(the)g(corresp)s(onding)150 4953 y Fk(CATCH)k Fs(do)s(es)h(not)h (output)f(a)h(v)-5 b(alue.)53 b(If)34 b Fk(THROW)f Fs(is)h(used)g(with) g(t)m(w)m(o)i(inputs,)f(the)f(second)h(pro)m(vides)f(an)150 5063 y(output)c(for)g(the)h Fk(CATCH)p Fs(.)150 5230 y Fk(THROW)46 b("TOPLEVEL)28 b Fs(can)j(b)s(e)e(used)h(to)h(terminate)g (all)h(running)c(pro)s(cedures)h(and)h(in)m(teractiv)m(e)j(pauses,)150 5340 y(and)45 b(return)f(to)i(the)g(toplev)m(el)h(instruction)e (prompt.)85 b(T)m(yping)45 b(the)h(system)f(in)m(terrupt)g(c)m (haracter)p eop end %%Page: 70 83 TeXDict begin 70 82 bop 150 -116 a Fs(70)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(\()p Fk(alt-S)38 b Fs(for)h(wxWidgets;)44 b(otherwise)c(normally)f Fk(control-C)e Fs(for)h(Unix,)k Fk(control-Q)36 b Fs(for)j(DOS,)g(or)150 408 y Fk(command-period)26 b Fs(for)31 b(Mac\))g(has)g(the)f(same)h(e\013ect.)150 576 y Fk(THROW)46 b("ERROR)37 b Fs(can)h(b)s(e)g(used)f(to)i(generate)h (an)e(error)g(condition.)65 b(If)38 b(the)g(error)g(is)g(not)h(caugh)m (t,)i(it)150 686 y(prin)m(ts)30 b(a)h(message)h(\()p Fk(THROW)d("ERROR)o Fs(\))i(with)f(the)h(usual)f(indication)i(of)f (where)f(the)h(error)f(\(in)h(this)g(case)150 795 y(the)c Fk(THROW)p Fs(\))f(o)s(ccurred.)39 b(If)27 b(a)h(second)f(input)f(is)h (used)g(along)h(with)f(a)h(tag)g(of)f Fk(ERROR)p Fs(,)g(that)h(second)f (input)150 905 y(is)i(used)e(as)i(the)g(text)h(of)f(the)f(error)h (message)g(instead)g(of)g(the)g(standard)f(message.)41 b(Also,)30 b(in)e(this)h(case,)150 1015 y(the)i(lo)s(cation)h (indicated)g(for)e(the)h(error)g(will)g(b)s(e,)f(not)h(the)g(lo)s (cation)i(of)e(the)g Fk(THROW)p Fs(,)e(but)h(the)h(lo)s(cation)150 1124 y(where)24 b(the)g(pro)s(cedure)g(con)m(taining)i(the)e Fk(THROW)f Fs(w)m(as)i(in)m(v)m(ok)m(ed.)40 b(This)24 b(allo)m(ws)h(user-de\014ned)e(pro)s(cedures)150 1234 y(to)31 b(generate)i(error)d(messages)i(as)f(if)f(they)h(w)m(ere)g (primitiv)m(es.)43 b(Note:)f(in)31 b(this)f(case)i(the)f(corresp)s (onding)150 1343 y Fk(CATCH)46 b("ERROR)o Fs(,)29 b(if)f(an)m(y)-8 b(,)30 b(do)s(es)e(not)g(output,)h(since)f(the)h(second)f(input)g(to)h Fk(THROW)e Fs(is)h(not)g(considered)h(a)150 1453 y(return)g(v)-5 b(alue.)150 1621 y Fk(THROW)46 b("SYSTEM)24 b Fs(immediately)k(lea)m(v) m(es)g(Logo,)g(returning)d(to)i(the)f(op)s(erating)h(system,)g(without) f(prin)m(t-)150 1730 y(ing)37 b(the)g(usual)g(parting)g(message)h(and)f (without)g(deleting)h(an)m(y)g(editor)f(temp)s(orary)g(\014le)g (written)g(b)m(y)150 1840 y(EDIT.)150 2007 y(See)31 b([EDIT],)f(page)i (61,)f(.)150 2217 y Fh(error)390 2364 y Fk(ERROR)150 2532 y Fs(outputs)c(a)g(list)h(describing)f(the)g(error)g(just)g(caugh) m(t,)i(if)e(an)m(y)-8 b(.)40 b(If)27 b(there)g(w)m(as)h(not)f(an)h (error)e(caugh)m(t)j(since)150 2641 y(the)i(last)h(use)f(of)g Fk(ERROR)p Fs(,)g(the)g(empt)m(y)g(list)h(will)g(b)s(e)e(output.)43 b(The)30 b(error)h(list)h(con)m(tains)g(four)e(mem)m(b)s(ers:)150 2751 y(an)c(in)m(teger)i(co)s(de)e(corresp)s(onding)g(to)h(the)f(t)m (yp)s(e)g(of)h(error,)g(the)f(text)i(of)e(the)g(error)g(message)i(\(as) f(a)f(single)150 2860 y(w)m(ord)38 b(including)g(spaces\),)j(the)e (name)f(of)g(the)h(pro)s(cedure)e(in)h(whic)m(h)g(the)g(error)g(o)s (ccurred,)i(and)e(the)150 2970 y(instruction)30 b(line)h(on)f(whic)m(h) g(the)h(error)f(o)s(ccurred.)150 3179 y Fh(pause)390 3326 y Fk(PAUSE)150 3494 y Fs(command)d(or)g(op)s(eration.)41 b(En)m(ters)27 b(an)g(in)m(teractiv)m(e)j(pause.)40 b(The)26 b(user)h(is)g(prompted)g(for)g(instructions,)150 3604 y(as)k(at)h(toplev)m(el,)h(but)d(with)h(a)g(prompt)f(that)i(includes)e (the)h(name)g(of)g(the)g(pro)s(cedure)f(in)h(whic)m(h)f Fk(PAUSE)150 3713 y Fs(w)m(as)44 b(in)m(v)m(ok)m(ed.)83 b(Lo)s(cal)45 b(v)-5 b(ariables)44 b(of)g(that)h(pro)s(cedure)d(are)j (a)m(v)-5 b(ailable)46 b(during)c(the)i(pause.)81 b Fk(PAUSE)150 3823 y Fs(outputs)30 b(if)g(the)h(pause)f(is)g(ended)g(b)m(y)g(a)h Fk(CONTINUE)d Fs(with)i(an)g(input.)150 3991 y(If)24 b(the)g(v)-5 b(ariable)25 b Fk(ERRACT)d Fs(exists,)k(and)e(an)g(error)g (condition)g(o)s(ccurs,)i(the)e(con)m(ten)m(ts)i(of)e(that)h(v)-5 b(ariable)25 b(are)150 4100 y(run)e(as)i(an)g(instructionlist.)39 b(T)m(ypically)26 b Fk(ERRACT)d Fs(is)h(giv)m(en)i(the)f(v)-5 b(alue)25 b Fk([PAUSE])e Fs(so)h(that)i(an)e(in)m(teractiv)m(e)150 4210 y(pause)30 b(will)g(b)s(e)g(en)m(tered)h(in)f(the)g(ev)m(en)m(t)i (of)e(an)h(error.)40 b(This)29 b(allo)m(ws)j(the)e(user)g(to)h(c)m(hec) m(k)h(v)-5 b(alues)30 b(of)h(lo)s(cal)150 4319 y(v)-5 b(ariables)31 b(at)g(the)g(time)g(of)f(the)h(error.)150 4487 y(T)m(yping)25 b(the)h(system)g(quit)f(c)m(haracter)i(\()p Fk(alt-S)e Fs(for)g(wxWidgets;)j(otherwise)e(normally)g Fk(control-\\)d Fs(for)150 4597 y(Unix,)30 b Fk(control-W)e Fs(for)i(DOS,)h(or)f Fk(command-comma)d Fs(for)j(Mac\))i(will)e(also)i (en)m(ter)f(a)g(pause.)150 4764 y(See)g([ERRA)m(CT],)f(page)h(89,)h(.) 150 4974 y Fh(con)m(tin)m(ue)390 5121 y Fk(CONTINUE)46 b(value)390 5230 y(CO)h(value)390 5340 y(\(CONTINUE\))p eop end %%Page: 71 84 TeXDict begin 71 83 bop 150 -116 a Fs(Chapter)30 b(8:)41 b(Con)m(trol)31 b(Structures)2302 b(71)390 299 y Fk(\(CO\))150 467 y Fs(command.)42 b(Ends)30 b(the)h(curren)m(t)g(in)m(teractiv)m(e)j (pause,)d(returning)f(to)i(the)f(con)m(text)i(of)e(the)g Fk(PAUSE)f Fs(in)m(v)m(o-)150 576 y(cation)j(that)g(b)s(egan)f(it.)46 b(If)31 b Fk(CONTINUE)f Fs(is)i(giv)m(en)h(an)f(input,)g(that)h(v)-5 b(alue)32 b(is)g(used)f(as)i(the)f(output)f(from)150 686 y(the)g Fk(PAUSE)p Fs(.)39 b(If)30 b(not,)h(the)f Fk(PAUSE)f Fs(do)s(es)h(not)h(output.)150 853 y(Exceptionally)-8 b(,)36 b(the)d Fk(CONTINUE)e Fs(command)h(can)i(b)s(e)e(used)g(without) h(its)g(default)h(input)e(and)g(without)150 963 y(paren)m(theses)f(pro) m(vided)f(that)h(nothing)f(follo)m(ws)h(it)g(on)g(the)f(instruction)h (line.)150 1178 y Fh(w)m(ait)390 1325 y Fk(WAIT)47 b(time)150 1493 y Fs(command.)52 b(Dela)m(ys)36 b(further)d(execution)j(for)e Fl(time)40 b Fs(60ths)35 b(of)f(a)h(second.)53 b(Also)35 b(causes)f(an)m(y)h(bu\013ered)150 1603 y(c)m(haracters)42 b(destined)f(for)f(the)h(terminal)h(to)f(b)s(e)g(prin)m(ted)f (immediately)-8 b(.)74 b Fk(WAIT)46 b(0)41 b Fs(can)g(b)s(e)f(used)g (to)150 1712 y(ac)m(hiev)m(e)33 b(this)d(bu\013er)f(\015ushing)g (without)i(actually)h(w)m(aiting.)150 1928 y Fh(b)m(y)m(e)390 2075 y Fk(BYE)150 2242 y Fs(command.)40 b(Exits)31 b(from)f(Logo;)i (returns)d(to)i(the)g(op)s(erating)f(system.)150 2458 y Fh(.ma)m(yb)s(eoutput)390 2605 y Fk(.MAYBEOUTPUT)44 b(value)j(\(special)e(form\))150 2773 y Fs(w)m(orks)35 b(lik)m(e)i Fk(OUTPUT)c Fs(except)j(that)g(the)f(expression)g(that)h (pro)m(vides)f(the)h(input)e(v)-5 b(alue)35 b(migh)m(t)h(not,)h(in)150 2882 y(fact,)29 b(output)e(a)g(v)-5 b(alue,)28 b(in)f(whic)m(h)g(case)h (the)f(e\013ect)i(is)e(lik)m(e)h Fk(STOP)p Fs(.)39 b(This)26 b(is)h(in)m(tended)g(for)g(use)g(in)f(con)m(trol)150 2992 y(structure)38 b(de\014nitions,)i(for)f(cases)g(in)f(whic)m(h)g(y) m(ou)h(don't)g(kno)m(w)f(whether)g(or)h(not)f(some)h(expression)150 3101 y(pro)s(duces)29 b(a)i(v)-5 b(alue.)41 b(Example:)390 3269 y Fk(to)47 b(invoke)f(:function)g([:inputs])f(2)390 3379 y(.maybeoutput)f(apply)j(:function)e(:inputs)390 3488 y(end)390 3707 y(?)i(\(invoke)f("print)g("a)i("b)f("c\))390 3817 y(a)g(b)h(c)390 3927 y(?)f(print)g(\(invoke)f("word)g("a)h("b)g ("c\))390 4036 y(abc)150 4204 y Fs(This)40 b(is)i(an)f(alternativ)m(e)j (to)e Fk(RUNRESULT)p Fs(.)70 b(It's)42 b(fast)g(and)e(easy)i(to)g(use,) i(at)e(the)g(cost)g(of)f(b)s(eing)g(an)150 4313 y(exception)e(to)f (Logo's)h(ev)-5 b(aluation)40 b(rules.)62 b(\(Ordinarily)-8 b(,)40 b(it)e(should)f(b)s(e)g(an)g(error)h(if)f(the)h(expression)150 4423 y(that's)31 b(supp)s(osed)e(to)i(pro)m(vide)f(an)g(input)g(to)h (something)g(do)s(esn't)f(ha)m(v)m(e)i(a)e(v)-5 b(alue.\))150 4591 y(See)31 b([OUTPUT],)f(page)h(69,)h(,)e([STOP],)g(page)h(69,)g(,)g ([R)m(UNRESUL)-8 b(T],)31 b(page)g(67,)h(.)150 4806 y Fh(goto)390 4953 y Fk(GOTO)47 b(word)150 5121 y Fs(command.)71 b(Lo)s(oks)41 b(for)f(a)h Fk(TAG)f Fs(command)g(with)g(the)h(same)g (input)e(in)i(the)f(same)h(pro)s(cedure,)i(and)150 5230 y(con)m(tin)m(ues)c(running)e(the)i(pro)s(cedure)e(from)h(the)g(lo)s (cation)i(of)f(that)g Fk(TAG)p Fs(.)63 b(It)39 b(is)f(meaningless)h(to) g(use)150 5340 y Fk(GOTO)29 b Fs(outside)i(of)f(a)h(pro)s(cedure.)p eop end %%Page: 72 85 TeXDict begin 72 84 bop 150 -116 a Fs(72)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y Fh(tag)390 446 y Fk(TAG)47 b(quoted.word)150 614 y Fs(command.)40 b(Do)s(es)28 b(nothing.)40 b(The)27 b(input)g(m)m(ust)g(b)s(e)g(a)h(literal)h(w)m(ord)f(follo)m(wing)h(a)f (quotation)h(mark)e(\()p Fk(")p Fs(\),)150 723 y(not)k(the)f(result)g (of)h(a)g(computation.)41 b(T)-8 b(ags)32 b(are)e(used)g(b)m(y)g(the)h Fk(GOTO)e Fs(command.)150 935 y Fh(ignore)390 1082 y Fk(IGNORE)46 b(value)g(\(library)g(procedure\))150 1250 y Fs(command.)61 b(Do)s(es)38 b(nothing.)61 b(Used)37 b(when)f(an)h(expression)g(is)g(ev)-5 b(aluated)39 b(for)e(a)g(side)g (e\013ect)i(and)e(its)150 1359 y(actual)32 b(v)-5 b(alue)31 b(is)f(unimp)s(ortan)m(t.)150 1571 y Fh(`)390 1718 y Fk(`)47 b(list)g(\(library)f(procedure\))150 1886 y Fs(outputs)20 b(a)h(list)h(equal)f(to)g(its)h(input)d(but)h(with)h(certain)g (substitutions.)37 b(If)21 b(a)g(mem)m(b)s(er)f(of)h(the)g(input)f (list)h(is)150 1996 y(the)26 b(w)m(ord)f(`)p Fk(,)p Fs(')h(\(comma\))i (then)d(the)h(follo)m(wing)h(mem)m(b)s(er)f(should)e(b)s(e)i(an)f (instructionlist)i(that)f(pro)s(duces)150 2105 y(an)34 b(output)h(when)e(run.)52 b(That)34 b(output)g(v)-5 b(alue)35 b(replaces)h(the)f(comma)g(and)f(the)h(instructionlist.)53 b(If)35 b(a)150 2215 y(mem)m(b)s(er)26 b(of)g(the)h(input)f(list)h(is)f (the)h(w)m(ord)f(`)p Fk(,@)p Fs(')g(\(comma)i(atsign\))f(then)g(the)f (follo)m(wing)i(mem)m(b)s(er)e(should)150 2324 y(b)s(e)f(an)i (instructionlist)f(that)h(outputs)f(a)g(list)h(when)e(run.)38 b(The)26 b(mem)m(b)s(ers)f(of)h(that)h(list)g(replace)g(the)f(`)p Fk(,@)p Fs(')150 2434 y(and)k(the)g(instructionlist.)42 b(Example:)390 2602 y Fk(show)47 b(`[foo)f(baz)h(,[bf)g([a)g(b)g(c]])g (garply)f(,@[bf)h([a)g(b)g(c]]])150 2769 y Fs(will)31 b(prin)m(t)390 2937 y Fk([foo)47 b(baz)g([b)g(c])g(garply)f(b)h(c])150 3105 y Fs(A)34 b(w)m(ord)g(starting)h(with)f(`)p Fk(,)p Fs(')g(or)g(`)p Fk(,@)p Fs(')g(is)g(treated)h(as)g(if)f(the)g(rest)g (of)h(the)f(w)m(ord)g(w)m(ere)g(a)h(one-w)m(ord)f(list,)150 3214 y(e.g.,)e(`)p Fk(,:foo)p Fs(')d(is)i(equiv)-5 b(alen)m(t)32 b(to)f(`)p Fk(,[:Foo])p Fs('.)150 3382 y(A)i(w)m(ord)g(starting)h(with) f(`)p Fk(",)p Fs(')g(\(quote)i(comma\))f(or)f(`)p Fk(:,)p Fs(')g(\(colon)i(comma\))f(b)s(ecomes)g(a)f(w)m(ord)g(starting)150 3492 y(with)28 b(`)p Fk(")p Fs(')g(or)h(`)p Fk(:)p Fs(')f(but)f(with)h (the)h(result)f(of)g(running)f(the)h(substitution)g(\(or)h(its)f (\014rst)g(w)m(ord,)g(if)h(the)f(result)150 3601 y(is)i(a)h(list\))h (replacing)f(what)f(comes)h(after)g(the)g(comma.)150 3769 y(Bac)m(kquotes)i(can)d(b)s(e)g(nested.)41 b(Substitution)30 b(is)g(done)h(only)f(for)h(commas)g(at)g(the)g(same)f(depth)g(as)h(the) 150 3879 y(bac)m(kquote)h(in)e(whic)m(h)g(they)h(are)f(found:)390 4046 y Fk(?)47 b(show)g(`[a)g(`[b)g(,[1+2])f(,[foo)g(,[1+3])g(d])i(e])f (f])390 4156 y([a)g(`)h([b)f(,)g([1+2])g(,)g([foo)g(4)g(d])g(e])h(f]) 390 4375 y(?make)e("name1)g("x)390 4485 y(?make)g("name2)g("y)390 4594 y(?)h(show)g(`[a)g(`[b)g(,:,:name1)e(,",:name2)g(d])j(e])390 4704 y([a)f(`)h([b)f(,)g([:x])g(,)g(["y])g(d])g(e])150 4916 y Fh(for)390 5063 y Fk(FOR)g(forcontrol)e(instructionlist)f (\(library)h(procedure\))150 5230 y Fs(command.)60 b(The)37 b(\014rst)f(input)g(m)m(ust)h(b)s(e)f(a)i(list)f(con)m(taining)i(three) e(or)g(four)f(mem)m(b)s(ers:)54 b(\(1\))38 b(a)f(w)m(ord,)150 5340 y(whic)m(h)24 b(will)g(b)s(e)f(used)h(as)g(the)g(name)g(of)g(a)h (lo)s(cal)g(v)-5 b(ariable;)27 b(\(2\))e(a)g(w)m(ord)e(or)h(list)h (that)g(will)f(b)s(e)f(ev)-5 b(aluated)26 b(as)p eop end %%Page: 73 86 TeXDict begin 73 85 bop 150 -116 a Fs(Chapter)30 b(8:)41 b(Con)m(trol)31 b(Structures)2302 b(73)150 299 y(b)m(y)26 b Fk(RUN)f Fs(to)i(determine)g(a)f(n)m(um)m(b)s(er,)g(the)g(starting)h (v)-5 b(alue)27 b(of)f(the)h(v)-5 b(ariable;)28 b(\(3\))g(a)e(w)m(ord)g (or)g(list)h(that)g(will)150 408 y(b)s(e)33 b(ev)-5 b(aluated)34 b(to)g(determine)g(a)f(n)m(um)m(b)s(er,)g(the)h(limit)g(v)-5 b(alue)34 b(of)f(the)g(v)-5 b(ariable;)36 b(\(4\))f(an)e(optional)h(w)m (ord)150 518 y(or)g(list)g(that)h(will)f(b)s(e)f(ev)-5 b(aluated)35 b(to)g(determine)f(the)g(step)g(size.)52 b(If)34 b(the)g(fourth)f(mem)m(b)s(er)g(is)h(missing,)150 628 y(the)i(step)f(size)i(will)f(b)s(e)f(1)h(or)f({1)i(dep)s(ending)d (on)h(whether)g(the)h(limit)g(v)-5 b(alue)36 b(is)g(greater)h(than)e (or)h(less)150 737 y(than)30 b(the)h(starting)g(v)-5 b(alue,)31 b(resp)s(ectiv)m(ely)-8 b(.)150 905 y(The)44 b(second)g(input)f(is)h(an)g(instructionlist.)83 b(The)44 b(e\013ect)h(of)g Fk(FOR)e Fs(is)h(to)h(run)d(that)j(instructionlist) 150 1015 y(rep)s(eatedly)-8 b(,)26 b(assigning)e(a)f(new)g(v)-5 b(alue)24 b(to)g(the)f(con)m(trol)i(v)-5 b(ariable)24 b(\(the)g(one)g(named)e(b)m(y)i(the)f(\014rst)g(mem)m(b)s(er)150 1124 y(of)29 b(the)g Fl(forcon)m(trol)k Fs(list\))d(eac)m(h)f(time.)41 b(First)29 b(the)g(starting)g(v)-5 b(alue)29 b(is)g(assigned)g(to)g (the)g(con)m(trol)h(v)-5 b(ariable.)150 1234 y(Then)29 b(the)h(v)-5 b(alue)31 b(is)f(compared)g(to)h(the)f(limit)h(v)-5 b(alue.)41 b Fk(FOR)29 b Fs(is)h(complete)i(when)d(the)h(sign)g(of)g Fk(\(current)150 1343 y(-)g(limit\))i Fs(is)h(the)g(same)h(as)g(the)f (sign)g(of)h(the)f(step)h(size.)50 b(\(If)33 b(no)g(explicit)i(step)e (size)i(is)e(pro)m(vided,)h(the)150 1453 y(instructionlist)c(is)g(alw)m (a)m(ys)g(run)e(at)j(least)f(once.)41 b(An)29 b(explicit)i(step)f(size) g(can)f(lead)h(to)h(a)e(zero-trip)i Fk(FOR)p Fs(,)150 1562 y(e.g.,)j Fk(FOR)47 b([I)g(1)g(0)h(1])f(...)p Fs(\).)e(Otherwise,) 32 b(the)g(instructionlist)h(is)e(run,)h(then)f(the)h(step)g(is)g (added)f(to)150 1672 y(the)g(curren)m(t)f(v)-5 b(alue)31 b(of)f(the)h(con)m(trol)g(v)-5 b(ariable)32 b(and)d(F)m(OR)i(returns)e (to)i(the)g(comparison)g(step.)390 1840 y Fk(?)47 b(for)g([i)h(2)f(7)g (1.5])g([print)f(:i])390 1949 y(2)390 2059 y(3.5)390 2169 y(5)390 2278 y(6.5)390 2388 y(?)150 2555 y Fs(See)31 b([R)m(UN],)g(page)h(67,)f(.)150 2760 y Fh(do.while)390 2907 y Fk(DO.WHILE)46 b(instructionlist)d(tfexpression)i(\(library)g (procedure\))150 3074 y Fs(command.)55 b(Rep)s(eatedly)36 b(ev)-5 b(aluates)36 b(the)g Fl(instructionlist)i Fs(as)d(long)h(as)f (the)g(ev)-5 b(aluated)37 b Fl(tfexpres-sion)150 3184 y Fs(remains)f Fk(TRUE)p Fs(.)57 b(Ev)-5 b(aluates)38 b(the)e(\014rst)g(input)f(\014rst,)j(so)e(the)h Fl(instructionlist)i Fs(is)d(alw)m(a)m(ys)i(run)d(at)i(least)150 3293 y(once.)60 b(The)36 b Fl(tfexpression)h Fs(m)m(ust)f(b)s(e)g(an)h(expressionlist)g (whose)f(v)-5 b(alue)37 b(when)f(ev)-5 b(aluated)38 b(is)e Fk(TRUE)g Fs(or)150 3403 y Fk(FALSE)p Fs(.)150 3607 y Fh(while)390 3754 y Fk(WHILE)46 b(tfexpression)f(instructionlist)e (\(library)j(procedure\))150 3922 y Fs(command.)55 b(Rep)s(eatedly)36 b(ev)-5 b(aluates)36 b(the)g Fl(instructionlist)i Fs(as)d(long)h(as)f (the)g(ev)-5 b(aluated)37 b Fl(tfexpres-sion)150 4032 y Fs(remains)28 b Fk(TRUE)p Fs(.)39 b(Ev)-5 b(aluates)30 b(the)f(\014rst)f(input)g(\014rst,)g(so)h(the)g Fl(instructionlist)j Fs(ma)m(y)d(nev)m(er)g(b)s(e)f(run)f(at)j(all.)150 4141 y(The)g Fl(tfexpression)g Fs(m)m(ust)g(b)s(e)g(an)g(expressionlist)h (whose)f(v)-5 b(alue)31 b(when)f(ev)-5 b(aluated)31 b(is)g Fk(TRUE)e Fs(or)h Fk(FALSE)p Fs(.)150 4345 y Fh(do.un)m(til)390 4492 y Fk(DO.UNTIL)46 b(instructionlist)d(tfexpression)i(\(library)g (procedure\))150 4660 y Fs(command.)55 b(Rep)s(eatedly)36 b(ev)-5 b(aluates)36 b(the)g Fl(instructionlist)i Fs(as)d(long)h(as)f (the)g(ev)-5 b(aluated)37 b Fl(tfexpres-sion)150 4770 y Fs(remains)c Fk(FALSE)p Fs(.)48 b(Ev)-5 b(aluates)35 b(the)e(\014rst)g(input)f(\014rst,)i(so)g(the)f Fl(instructionlist)j Fs(is)e(alw)m(a)m(ys)h(run)d(at)i(least)150 4879 y(once.)60 b(The)36 b Fl(tfexpression)h Fs(m)m(ust)f(b)s(e)g(an)h(expressionlist)g (whose)f(v)-5 b(alue)37 b(when)f(ev)-5 b(aluated)38 b(is)e Fk(TRUE)g Fs(or)150 4989 y Fk(FALSE)p Fs(.)150 5193 y Fh(un)m(til)390 5340 y Fk(UNTIL)46 b(tfexpression)f(instructionlist)e (\(library)j(procedure\))p eop end %%Page: 74 87 TeXDict begin 74 86 bop 150 -116 a Fs(74)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(command.)55 b(Rep)s(eatedly)36 b(ev)-5 b(aluates)36 b(the)g Fl(instructionlist)i Fs(as)d(long)h(as)f (the)g(ev)-5 b(aluated)37 b Fl(tfexpres-sion)150 408 y Fs(remains)25 b Fk(FALSE)p Fs(.)38 b(Ev)-5 b(aluates)26 b(the)g(\014rst)e(input)h(\014rst,)g(so)h(the)g Fl(instructionlist)i Fs(ma)m(y)d(nev)m(er)h(b)s(e)f(run)f(at)i(all.)150 518 y(The)k Fl(tfexpression)g Fs(m)m(ust)g(b)s(e)g(an)g(expressionlist)h (whose)f(v)-5 b(alue)31 b(when)f(ev)-5 b(aluated)31 b(is)g Fk(TRUE)e Fs(or)h Fk(FALSE)p Fs(.)150 712 y Fh(case)390 859 y Fk(CASE)47 b(value)f(clauses)g(\(library)f(procedure\))150 1026 y Fs(command)38 b(or)f(op)s(eration.)64 b(The)37 b(second)h(input)f(is)h(a)g(list)g(of)g(lists)h(\(clauses\);)k(eac)m(h) c(clause)f(is)g(a)g(list)150 1136 y(whose)31 b(\014rst)f(elemen)m(t)j (is)e(either)h(a)f(list)h(of)f(v)-5 b(alues)32 b(or)f(the)g(w)m(ord)g Fk(ELSE)f Fs(and)g(whose)h(but\014rst)f(is)h(a)h(Logo)150 1246 y(expression)h(or)g(instruction.)50 b Fk(CASE)32 b Fs(examines)i(the)f(clauses)h(in)f(order.)49 b(If)33 b(a)h(clause)g(b)s(egins)f(with)g(the)150 1355 y(w)m(ord)39 b Fk(ELSE)f Fs(\(upp)s(er)f(or)i(lo)m(w)m(er)i(case\),)i(then)c(the)g (but\014rst)f(of)h(that)h(clause)g(is)f(ev)-5 b(aluated)41 b(and)d Fk(CASE)150 1465 y Fs(outputs)c(its)g(v)-5 b(alue,)36 b(if)f(an)m(y)-8 b(.)53 b(If)34 b(the)g(\014rst)g(input)f(to)i(CASE)e (is)i(a)f(mem)m(b)s(er)g(of)g(the)h(\014rst)e(elemen)m(t)j(of)f(a)150 1574 y(clause,)j(then)c(the)i(but\014rst)e(of)h(that)h(clause)g(is)f (ev)-5 b(aluated)37 b(and)d Fk(CASE)h Fs(outputs)f(its)i(v)-5 b(alue,)37 b(if)e(an)m(y)-8 b(.)56 b(If)150 1684 y(neither)38 b(of)g(these)g(conditions)h(is)f(met,)i(then)e Fk(CASE)f Fs(go)s(es)h(on)g(to)h(the)f(next)g(clause.)64 b(If)37 b(no)h(clause)h(is)150 1794 y(satis\014ed,)31 b Fk(CASE)e Fs(do)s(es)h(nothing.)41 b(Example:)390 1961 y Fk(to)47 b(vowelp)f(:letter)390 2071 y(output)g(case)h(:letter)f([)h([[a)g(e)g (i)h(o)f(u])g("true])g([else)f("false])g(])390 2180 y(end)150 2374 y Fh(cond)390 2521 y Fk(COND)h(clauses)e(\(library)h(procedure\)) 150 2689 y Fs(command)39 b(or)g(op)s(eration.)68 b(The)38 b(input)h(is)g(a)g(list)h(of)f(lists)h(\(clauses\);)45 b(eac)m(h)c(clause)f(is)f(a)g(list)h(whose)150 2798 y(\014rst)33 b(elemen)m(t)i(is)f(either)g(an)g(expression)f(whose)h(v)-5 b(alue)34 b(is)g Fk(TRUE)f Fs(or)g Fk(FALSE)p Fs(,)h(or)g(the)f(w)m (ord)h Fk(ELSE)p Fs(,)g(and)150 2908 y(whose)f(but\014rst)g(is)g(a)h (Logo)h(expression)e(or)h(instruction.)50 b Fk(COND)33 b Fs(examines)h(the)g(clauses)g(in)f(order.)50 b(If)150 3018 y(a)33 b(clause)h(b)s(egins)e(with)h(the)g(w)m(ord)g Fk(ELSE)f Fs(\(upp)s(er)f(or)i(lo)m(w)m(er)h(case\),)h(then)e(the)g (but\014rst)e(of)j(that)f(clause)150 3127 y(is)c(ev)-5 b(aluated)30 b(and)e Fk(CASE)f Fs(outputs)i(its)g(v)-5 b(alue,)30 b(if)e(an)m(y)-8 b(.)41 b(Otherwise,)29 b(the)g(\014rst)f (elemen)m(t)i(of)f(the)g(clause)h(is)150 3237 y(ev)-5 b(aluated;)30 b(the)f(resulting)f(v)-5 b(alue)29 b(m)m(ust)f(b)s(e)g Fk(TRUE)f Fs(or)h Fk(FALSE)p Fs(.)39 b(If)28 b(it's)h Fk(TRUE)p Fs(,)e(then)h(the)h(but\014rst)e(of)h(that)150 3346 y(clause)h(is)f(ev)-5 b(aluated)30 b(and)d Fk(COND)h Fs(outputs)f(its)i(v)-5 b(alue,)29 b(if)g(an)m(y)-8 b(.)40 b(If)28 b(the)h(v)-5 b(alue)28 b(is)h Fk(FALSE)p Fs(,)e(then)h Fk(COND)f Fs(go)s(es)150 3456 y(on)j(to)h(the)g(next)f(clause.)42 b(If)30 b(no)g(clause)h(is)g(satis\014ed,)g Fk(COND)e Fs(do)s(es)h(nothing.)40 b(Example:)390 3624 y Fk(to)47 b(evens)g(:numbers)e(;)j(select)e(even)g(numbers)g(from)h(a)g(list)390 3733 y(op)g(cond)g([)g([[emptyp)f(:numbers])f([]])867 3843 y([[evenp)h(first)g(:numbers])g(;)h(assuming)f(EVENP)g(is)h (defined)915 3952 y(fput)g(first)f(:numbers)g(evens)g(butfirst)f (:numbers])867 4062 y([else)i(evens)f(butfirst)g(:numbers])f(])390 4172 y(end)150 4407 y Fr(8.2)68 b(T)-11 b(emplate-based)46 b(Iteration)150 4566 y Fs(The)28 b(pro)s(cedures)e(in)i(this)g(section) h(are)f(iteration)i(to)s(ols)f(based)f(on)g(the)g(idea)g(of)g(a)h Fl(template.)41 b Fs(This)27 b(is)i(a)150 4676 y(generalization)j(of)d (an)g(instruction)g(list)h(or)f(an)f(expression)h(list)h(in)f(whic)m(h) f Fl(slots)34 b Fs(are)29 b(pro)m(vided)g(for)g(the)150 4785 y(to)s(ol)i(to)g(insert)g(v)-5 b(arying)30 b(data.)42 b(F)-8 b(our)30 b(di\013eren)m(t)h(forms)f(of)g(template)i(can)f(b)s(e) f(used.)150 4953 y(The)25 b(most)g(commonly)h(used)f(form)f(for)h(a)h (template)h(is)e(`)p Fk(explicit-slot)p Fs(')d(form,)k(or)f(`)p Fk(question)k(mark)p Fs(')150 5063 y(form.)40 b(Example:)390 5230 y Fk(?)47 b(show)g(map)g([?)g(*)h(?])f([2)g(3)g(4)h(5])390 5340 y([4)f(9)h(16)f(25])p eop end %%Page: 75 88 TeXDict begin 75 87 bop 150 -116 a Fs(Chapter)30 b(8:)41 b(Con)m(trol)31 b(Structures)2302 b(75)390 299 y Fk(?)150 467 y Fs(In)32 b(this)h(example,)i(the)e Fk(MAP)f Fs(to)s(ol)i(ev)-5 b(aluated)34 b(the)f(template)i Fk([?)30 b(*)g(?])i Fs(rep)s(eatedly)-8 b(,)35 b(with)d(eac)m(h)j(of)e(the)150 576 y(mem)m(b)s(ers)g(of)h(the)g (data)h(list)f Fk([2)c(3)g(4)g(5])k Fs(substituted)f(in)g(turn)g(for)h (the)g(question)g(marks.)51 b(The)34 b(same)150 686 y(v)-5 b(alue)36 b(w)m(as)f(used)g(for)g(ev)m(ery)g(question)h(mark)f(in)g(a)g (giv)m(en)h(ev)-5 b(aluation.)57 b(Some)35 b(to)s(ols)h(allo)m(w)h(for) e(more)150 795 y(than)f(one)h(datum)f(to)h(b)s(e)f(substituted)g(in)g (parallel;)k(in)d(these)g(cases)g(the)g(slots)g(are)g(indicated)g(b)m (y)g Fk(?1)150 905 y Fs(for)30 b(the)h(\014rst)e(datum,)h Fk(?2)g Fs(for)g(the)h(second,)g(and)e(so)i(on:)390 1073 y Fk(?)47 b(show)g(\(map)g([\(word)f(?1)h(?2)g(?1\)])g([a)g(b)g(c])h ([d)f(e)g(f]\))390 1182 y([ada)g(beb)g(cfc])390 1292 y(?)150 1460 y Fs(If)32 b(the)h(template)g(wishes)f(to)h(compute)g(the) g(datum)f(n)m(um)m(b)s(er,)g(the)g(form)g Fk(\(?)e(1\))i Fs(is)g(equiv)-5 b(alen)m(t)34 b(to)f Fk(?1)p Fs(,)150 1569 y(so)g Fk(\(?)c(?1\))j Fs(means)g(the)h(datum)f(whose)g(n)m(um)m (b)s(er)f(is)i(giv)m(en)g(in)f(datum)g(n)m(um)m(b)s(er)f(1.)48 b(Some)32 b(to)s(ols)h(allo)m(w)150 1679 y(additional)e(slot)h (designations,)f(as)g(sho)m(wn)e(in)h(the)h(individual)f(descriptions.) 150 1846 y(The)39 b(second)g(form)f(of)i(template)g(is)f(the)g(`)p Fk(named-procedure)p Fs(')d(form.)66 b(If)39 b(the)g(template)i(is)e(a) g(w)m(ord)150 1956 y(rather)g(than)g(a)g(list,)j(it)d(is)g(tak)m(en)i (as)e(the)g(name)g(of)g(a)h(pro)s(cedure.)65 b(That)39 b(pro)s(cedure)f(m)m(ust)g(accept)150 2066 y(a)h(n)m(um)m(b)s(er)f(of)g (inputs)g(equal)h(to)h(the)f(n)m(um)m(b)s(er)e(of)i(parallel)h(data)f (slots)h(pro)m(vided)e(b)m(y)h(the)g(to)s(ol;)44 b(the)150 2175 y(pro)s(cedure)27 b(is)h(applied)g(to)g(all)h(of)g(the)f(a)m(v)-5 b(ailable)30 b(data)f(in)f(order.)39 b(That)28 b(is,)h(if)f(data)g Fk(?1)g Fs(through)f Fk(?3)h Fs(are)150 2285 y(a)m(v)-5 b(ailable,)33 b(the)e(template)g Fk("PROC)e Fs(is)i(equiv)-5 b(alen)m(t)32 b(to)f Fk([PROC)46 b(?1)h(?2)g(?3])p Fs(.)390 2452 y Fk(?)g(show)g(\(map)g("word)f([a)h(b)h(c])f([d)g(e)h(f]\))390 2562 y([ad)f(be)g(cf])390 2672 y(?)390 2891 y(to)g(dotprod)f(:a)h(:b)g (;)h(vector)e(dot)h(product)390 3000 y(op)g(apply)g("sum)f(\(map)h ("product)e(:a)j(:b\))390 3110 y(end)150 3278 y Fs(The)32 b(third)f(form)h(of)g(template)i(is)e(`)p Fk(named-slot)p Fs(')e(or)i(`)p Fk(lambda)p Fs(')f(form.)45 b(This)32 b(form)g(is)g(indicated)g(b)m(y)h(a)150 3387 y(template)26 b(list)g(con)m(taining)g(more)g(than)e(one)i(mem)m(b)s(er,)f(whose)g (\014rst)f(mem)m(b)s(er)h(is)g(itself)g(a)h(list.)39 b(The)25 b(\014rst)150 3497 y(mem)m(b)s(er)30 b(is)g(tak)m(en)h(as)f(a) h(list)g(of)f(names;)h(lo)s(cal)g(v)-5 b(ariables)31 b(are)f(created)i(with)e(those)g(names)g(and)g(giv)m(en)150 3606 y(the)e(a)m(v)-5 b(ailable)30 b(data)e(in)f(order)h(as)f(their)h (v)-5 b(alues.)40 b(The)27 b(n)m(um)m(b)s(er)g(of)g(names)h(m)m(ust)f (equal)i(the)e(n)m(um)m(b)s(er)g(of)150 3716 y(a)m(v)-5 b(ailable)33 b(data.)42 b(This)30 b(form)g(is)h(needed)f(primarily)g (when)g(one)h(iteration)h(to)s(ol)f(m)m(ust)g(b)s(e)f(used)f(within)150 3826 y(the)f(template)i(list)e(of)g(another,)h(and)f(the)g Fk(?)g Fs(notation)h(w)m(ould)f(b)s(e)f(am)m(biguous)h(in)g(the)g (inner)f(template.)150 3935 y(Example:)390 4103 y Fk(to)47 b(matmul)f(:m1)h(:m2)g([:tm2)f(transpose)g(:m2])g(;)i(multiply)d(two)i (matrices)390 4213 y(output)f(map)h([[row])f(map)h([[col])f(dotprod)g (:row)h(:col])f(:tm2])g(:m1)390 4322 y(end)150 4490 y Fs(The)38 b(fourth)g(form)h(is)g(`)p Fk(procedure)28 b(text)p Fs(')38 b(form,)j(a)e(v)-5 b(arian)m(t)40 b(of)f(lam)m(b)s(da) g(form.)66 b(In)38 b(this)h(form,)i(the)150 4599 y(template)30 b(list)f(con)m(tains)h(at)f(least)g(t)m(w)m(o)h(mem)m(b)s(ers,)e(all)i (of)e(whic)m(h)g(are)h(lists.)41 b(This)27 b(is)i(the)f(form)g(used)g (b)m(y)150 4709 y(the)23 b Fk(DEFINE)f Fs(and)g Fk(TEXT)g Fs(primitiv)m(es,)j(and)e Fk(APPLY)e Fs(accepts)k(it)e(so)h(that)f(the) h(text)g(of)f(a)g(de\014ned)f(pro)s(cedure)150 4819 y(can)31 b(b)s(e)e(used)h(as)h(a)f(template.)150 4986 y(Note:)46 b(The)31 b(fourth)h(form)f(of)i(template)g(is)g(in)m(terpreted)f (di\013eren)m(tly)h(from)f(the)g(others,)h(in)f(that)h(Logo)150 5096 y(considers)f(it)g(to)h(b)s(e)e(an)h(indep)s(enden)m(t)e (de\014ned)h(pro)s(cedure)g(for)g(the)h(purp)s(oses)e(of)i Fk(OUTPUT)f Fs(and)g Fk(STOP)p Fs(.)150 5205 y(F)-8 b(or)31 b(example,)g(the)g(follo)m(wing)h(t)m(w)m(o)g(instructions)e(are)h (iden)m(tical:)p eop end %%Page: 76 89 TeXDict begin 76 88 bop 150 -116 a Fs(76)2551 b(BERKELEY)30 b(LOGO)g(6.1)390 299 y Fk(?)47 b(print)g(apply)f([[x])h(:x+3])f([5])390 408 y(8)390 518 y(?)h(print)g(apply)f([[x])h([output)f(:x+3]])g([5])390 628 y(8)150 795 y Fs(although)41 b(the)g(\014rst)f(instruction)g(is)h (in)f(named-slot)i(form)e(and)g(the)h(second)g(is)f(in)h(pro)s (cedure-text)150 905 y(form.)55 b(The)34 b(named-slot)i(form)f(can)h(b) s(e)e(understo)s(o)s(d)g(as)h(telling)i(Logo)f(to)g(ev)-5 b(aluate)37 b(the)e(expression)150 1015 y Fk(:x+3)f Fs(in)h(place)h(of) f(the)g(en)m(tire)i(in)m(v)m(o)s(cation)g(of)e(apply)-8 b(,)37 b(with)d(the)i(v)-5 b(ariable)36 b Fk(x)e Fs(temp)s(orarily)i (giv)m(en)g(the)150 1124 y(v)-5 b(alue)31 b Fk(5)p Fs(.)40 b(The)30 b(pro)s(cedure-text)h(form)f(can)g(b)s(e)g(understo)s(o)s(d)f (as)h(in)m(v)m(oking)i(the)e(pro)s(cedure)390 1292 y Fk(to)47 b(foo)g(:x)390 1401 y(output)f(:x+3)390 1511 y(end)150 1679 y Fs(with)29 b(input)g Fk(5)p Fs(,)h(but)f(without)g (actually)j(giving)e(the)g(pro)s(cedure)f(a)h(name.)40 b(If)29 b(the)h(use)g(of)f Fk(OUTPUT)f Fs(w)m(ere)150 1788 y(in)m(terc)m(hanged)k(in)e(these)g(t)m(w)m(o)i(examples,)f(w)m (e'd)g(get)g(errors:)390 1956 y Fk(?)47 b(print)g(apply)f([[x])h (output)f(:x+3])g([5])390 2066 y(Can)h(only)g(use)f(output)h(inside)f (a)h(procedure)390 2175 y(?)g(print)g(apply)f([[x])h([:x+3]])f([5])390 2285 y(You)h(don't)f(say)h(what)g(to)g(do)g(with)g(8)150 2452 y Fs(The)41 b(named-slot)g(form)g(can)g(b)s(e)g(used)f(with)h Fk(STOP)e Fs(or)j Fk(OUTPUT)d Fs(inside)i(a)g(pro)s(cedure,)i(to)f (stop)f(the)150 2562 y(enclosing)31 b(pro)s(cedure.)150 2730 y(The)g(follo)m(wing)j(iteration)f(to)s(ols)g(are)f(extended)g(v)m (ersions)g(of)g(the)g(ones)g(in)g(App)s(endix)e(B)i(of)g(the)h(b)s(o)s (ok)150 2839 y Fl(Computer)h(Science)i(Logo)h(St)m(yle,)g(V)-8 b(olume)37 b(3:)51 b(Adv)-5 b(anced)35 b(T)-8 b(opics)39 b Fs(b)m(y)c(Brian)h(Harv)m(ey)g([MIT)f(Press,)150 2949 y(1987].)43 b(The)30 b(extensions)g(are)h(primarily)f(to)h(allo)m(w)h (for)e(v)-5 b(ariable)31 b(n)m(um)m(b)s(ers)e(of)i(inputs.)150 3212 y Fh(apply)390 3359 y Fk(APPLY)46 b(template)g(inputlist)150 3527 y Fs(command)33 b(or)g(op)s(eration.)49 b(Runs)31 b(the)i Fl(template)p Fs(,)j(\014lling)d(its)g(slots)h(with)e(the)i (mem)m(b)s(ers)e(of)h Fl(inputlist.)150 3636 y Fs(The)26 b(n)m(um)m(b)s(er)e(of)i(mem)m(b)s(ers)g(in)f Fl(inputlist)j Fs(m)m(ust)e(b)s(e)g(an)g(acceptable)i(n)m(um)m(b)s(er)c(of)j(slots)f (for)g Fl(template)p Fs(.)41 b(It)150 3746 y(is)31 b(illegal)h(to)g (apply)e(the)h(primitiv)m(e)g Fk(TO)f Fs(as)h(a)f(template,)j(but)d(an) m(ything)h(else)g(is)f(ok)-5 b(a)m(y)d(.)43 b Fk(APPLY)29 b Fs(outputs)150 3856 y(what)h Fl(template)37 b Fs(outputs,)30 b(if)h(an)m(ything.)150 4023 y(See)g([TO],)f(page)h(49,)h(.)150 4286 y Fh(in)m(v)m(ok)m(e)390 4433 y Fk(INVOKE)46 b(template)g(input)g (\(library)g(procedure\))390 4543 y(\(INVOKE)g(template)f(input1)h (input2)h(...\))150 4711 y Fs(command)28 b(or)h(op)s(eration.)41 b(Exactly)29 b(lik)m(e)h Fk(APPLY)e Fs(except)h(that)g(the)g(inputs)f (are)h(pro)m(vided)f(as)h(separate)150 4820 y(expressions)h(rather)g (than)g(in)g(a)h(list.)150 5083 y Fh(foreac)m(h)390 5230 y Fk(FOREACH)46 b(data)g(template)g(\(library)g(procedure\))390 5340 y(\(FOREACH)g(data1)g(data2)g(...)h(template\))p eop end %%Page: 77 90 TeXDict begin 77 89 bop 150 -116 a Fs(Chapter)30 b(8:)41 b(Con)m(trol)31 b(Structures)2302 b(77)150 299 y(command.)40 b(Ev)-5 b(aluates)28 b(the)g Fl(template)35 b Fs(list)28 b(rep)s(eatedly)-8 b(,)29 b(once)g(for)e(eac)m(h)i(mem)m(b)s(er)f(of)f (the)h Fl(data)h Fs(list.)40 b(If)150 408 y(more)28 b(than)f(one)h Fl(data)g Fs(list)h(are)f(giv)m(en,)h(eac)m(h)g(of)f(them)g(m)m(ust)f (b)s(e)g(the)h(same)g(length.)40 b(\(The)28 b Fl(data)g Fs(inputs)150 518 y(can)j(b)s(e)e(w)m(ords,)i(in)f(whic)m(h)g(case)h (the)g(template)g(is)g(ev)-5 b(aluated)31 b(once)h(for)e(eac)m(h)h(c)m (haracter.\))150 686 y(In)26 b(a)h(template,)i(the)e(sym)m(b)s(ol)f Fk(?REST)f Fs(represen)m(ts)i(the)g(p)s(ortion)f(of)h(the)g Fl(data)g Fs(input)f(to)h(the)g(righ)m(t)g(of)g(the)150 795 y(mem)m(b)s(er)34 b(curren)m(tly)g(b)s(eing)g(used)f(as)i(the)g Fk(?)f Fs(slot-\014ller.)53 b(That)35 b(is,)g(if)f(the)h Fl(data)g Fs(input)e(is)i Fk([A)29 b(B)h(C)h(D)f(E])150 905 y Fs(and)d(the)g(template)i(is)e(b)s(eing)g(ev)-5 b(aluated)29 b(with)e Fk(?)g Fs(replaced)h(b)m(y)f Fk(B)p Fs(,)h(then)f Fk(?REST)e Fs(w)m(ould)j(b)s(e)e(replaced)i(b)m(y)150 1015 y Fk([C)i(D)g(E])o Fs(.)41 b(If)30 b(m)m(ultiple)h(parallel)g (slots)g(are)g(used,)f(then)g Fk(\(?REST)46 b(1\))30 b Fs(go)s(es)h(with)f(?1,)h(etc.)150 1182 y(In)20 b(a)h(template,)k (the)c(sym)m(b)s(ol)f Fk(#)h Fs(represen)m(ts)g(the)g(p)s(osition)g(in) f(the)h Fl(data)h Fs(input)e(of)h(the)g(mem)m(b)s(er)f(curren)m(tly)150 1292 y(b)s(eing)30 b(used)g(as)h(the)f Fk(?)g Fs(slot-\014ller.)43 b(That)30 b(is,)h(if)g(the)f(data)h(input)f(is)h Fk([A)e(B)h(C)g(D)g (E])g Fs(and)g(the)h(template)h(is)150 1401 y(b)s(eing)e(ev)-5 b(aluated)32 b(with)e Fk(?)g Fs(replaced)g(b)m(y)h Fk(B)p Fs(,)f(then)g Fk(#)g Fs(w)m(ould)g(b)s(e)g(replaced)h(b)m(y)f Fk(2)p Fs(.)150 1680 y Fh(map)390 1826 y Fk(MAP)47 b(template)e(data)i (\(library)f(procedure\))390 1936 y(\(MAP)h(template)e(data1)i(data2)f (...\))150 2104 y Fs(outputs)40 b(a)g(w)m(ord)g(or)g(list,)j(dep)s (ending)c(on)h(the)g(t)m(yp)s(e)h(of)f(the)g Fl(data)h Fs(input,)h(of)e(the)h(same)f(length)h(as)150 2213 y(that)31 b Fl(data)g Fs(input.)40 b(\(If)31 b(more)f(than)h(one)f Fl(data)h Fs(input)f(are)h(giv)m(en,)h(the)e(output)g(is)h(of)f(the)h (same)g(t)m(yp)s(e)g(as)150 2323 y Fl(data1)p Fs(.\))43 b(Eac)m(h)32 b(mem)m(b)s(er)e(of)h(the)f(output)h(is)f(the)h(result)g (of)g(ev)-5 b(aluating)32 b(the)f Fl(template)37 b Fs(list,)32 b(\014lling)f(the)150 2433 y(slots)f(with)g(the)g(corresp)s(onding)f (mem)m(b)s(er\(s\))g(of)h(the)g Fl(data)h Fs(input\(s\).)40 b(\(All)31 b Fl(data)f Fs(inputs)f(m)m(ust)h(b)s(e)f(the)150 2542 y(same)h(length.\))42 b(In)29 b(the)h(case)h(of)f(a)g(w)m(ord)g (output,)g(the)g(results)g(of)g(the)g(template)h(ev)-5 b(aluation)32 b(m)m(ust)e(b)s(e)150 2652 y(w)m(ords,)g(and)g(they)g (are)h(concatenated)i(with)d Fk(WORD)p Fs(.)150 2819 y(In)c(a)h(template,)i(the)e(sym)m(b)s(ol)f Fk(?REST)f Fs(represen)m(ts)i(the)g(p)s(ortion)f(of)h(the)g(data)g(input)f(to)h (the)g(righ)m(t)g(of)g(the)150 2929 y(mem)m(b)s(er)34 b(curren)m(tly)g(b)s(eing)g(used)f(as)i(the)g Fk(?)f Fs(slot-\014ller.)53 b(That)35 b(is,)g(if)f(the)h Fl(data)g Fs(input)e(is)i Fk([A)29 b(B)h(C)h(D)f(E])150 3039 y Fs(and)35 b(the)g Fl(template)42 b Fs(is)35 b(b)s(eing)f(ev)-5 b(aluated)37 b(with)e Fk(?)g Fs(replaced)g(b)m(y)g Fk(B)p Fs(,)h(then)f Fk(?REST)f Fs(w)m(ould)h(b)s(e)f(replaced)150 3148 y(b)m(y)c Fk([C)g(D)g(E])p Fs(.)40 b(If)30 b(m)m(ultiple)h (parallel)h(slots)f(are)f(used,)g(then)g Fk(\(?REST)46 b(1\))30 b Fs(go)s(es)h(with)f Fk(?1)p Fs(,)g(etc.)150 3316 y(In)20 b(a)h(template,)k(the)c(sym)m(b)s(ol)f Fk(#)h Fs(represen)m(ts)g(the)g(p)s(osition)g(in)f(the)h Fl(data)h Fs(input)e(of)h(the)g(mem)m(b)s(er)f(curren)m(tly)150 3425 y(b)s(eing)30 b(used)g(as)h(the)f Fk(?)g Fs(slot-\014ller.)43 b(That)30 b(is,)h(if)g(the)f(data)h(input)f(is)h Fk([A)e(B)h(C)g(D)g (E])g Fs(and)g(the)h(template)h(is)150 3535 y(b)s(eing)e(ev)-5 b(aluated)32 b(with)e Fk(?)g Fs(replaced)g(b)m(y)h Fk(B)p Fs(,)f(then)g Fk(#)g Fs(w)m(ould)g(b)s(e)g(replaced)h(b)m(y)f Fk(2)p Fs(.)150 3703 y(See)h([W)m(ORD],)h(page)f(9,)g(.)150 3981 y Fh(map.se)390 4128 y Fk(MAP.SE)46 b(template)g(data)g(\(library) g(procedure\))390 4237 y(\(MAP.SE)g(template)f(data1)i(data2)f(...\)) 150 4405 y Fs(outputs)c(a)h(list)h(formed)e(b)m(y)h(ev)-5 b(aluating)44 b(the)f Fl(template)49 b Fs(list)43 b(rep)s(eatedly)g (and)g(concatenating)i(the)150 4515 y(results)28 b(using)g Fk(SENTENCE)p Fs(.)38 b(That)28 b(is,)h(the)f(mem)m(b)s(ers)g(of)g(the) h(output)f(are)g(the)h(mem)m(b)s(ers)e(of)i(the)f(results)150 4624 y(of)35 b(the)g(ev)-5 b(aluations.)55 b(The)35 b(output)f(list)i (migh)m(t,)h(therefore,)f(b)s(e)e(of)h(a)h(di\013eren)m(t)f(length)g (from)f(that)i(of)150 4734 y(the)28 b Fl(data)h Fs(input\(s\).)40 b(\(If)28 b(the)h(result)f(of)g(an)g(ev)-5 b(aluation)30 b(is)f(the)f(empt)m(y)h(list,)g(it)g(con)m(tributes)g(nothing)f(to)150 4844 y(the)j(\014nal)f(output.\))40 b(The)30 b Fl(data)h Fs(inputs)e(ma)m(y)i(b)s(e)f(w)m(ords)g(or)g(lists.)150 5011 y(In)c(a)h(template,)i(the)e(sym)m(b)s(ol)f Fk(?REST)f Fs(represen)m(ts)i(the)g(p)s(ortion)f(of)h(the)g(data)g(input)f(to)h (the)g(righ)m(t)g(of)g(the)150 5121 y(mem)m(b)s(er)34 b(curren)m(tly)g(b)s(eing)g(used)f(as)i(the)g Fk(?)f Fs(slot-\014ller.)53 b(That)35 b(is,)g(if)f(the)h(data)g(input)e(is)i Fk([A)29 b(B)h(C)h(D)f(E])150 5230 y Fs(and)d(the)g(template)i(is)e(b)s (eing)g(ev)-5 b(aluated)29 b(with)e Fk(?)g Fs(replaced)h(b)m(y)f Fk(B)p Fs(,)h(then)f Fk(?REST)e Fs(w)m(ould)j(b)s(e)e(replaced)i(b)m(y) 150 5340 y Fk([C)i(D)g(E])o Fs(.)41 b(If)30 b(m)m(ultiple)h(parallel)g (slots)g(are)g(used,)f(then)g Fk(\(?REST)46 b(1\))30 b Fs(go)s(es)h(with)f Fk(?1)p Fs(,)g(etc.)p eop end %%Page: 78 91 TeXDict begin 78 90 bop 150 -116 a Fs(78)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(In)20 b(a)h(template,)k(the)c(sym)m(b)s(ol)f Fk(#)h Fs(represen)m(ts)g(the)g(p)s(osition)g(in)f(the)h Fl(data)h Fs(input)e(of)h(the)g(mem)m(b)s(er)f(curren)m(tly)150 408 y(b)s(eing)30 b(used)g(as)h(the)f Fk(?)g Fs(slot-\014ller.)43 b(That)30 b(is,)h(if)g(the)f(data)h(input)f(is)h Fk([A)e(B)h(C)g(D)g (E])g Fs(and)g(the)h(template)h(is)150 518 y(b)s(eing)e(ev)-5 b(aluated)32 b(with)e Fk(?)g Fs(replaced)g(b)m(y)h Fk(B)p Fs(,)f(then)g Fk(#)g Fs(w)m(ould)g(b)s(e)g(replaced)h(b)m(y)f Fk(2)p Fs(.)150 686 y(See)h([SENTENCE],)e(page)j(9,)f(.)150 876 y Fh(\014lter)390 1023 y Fk(FILTER)46 b(tftemplate)f(data)i (\(library)e(procedure\))150 1191 y Fs(outputs)29 b(a)i(w)m(ord)e(or)h (list,)h(dep)s(ending)d(on)i(the)g(t)m(yp)s(e)g(of)g(the)g Fl(data)h Fs(input,)e(con)m(taining)i(a)f(subset)g(of)g(the)150 1300 y(mem)m(b)s(ers)c(\(for)h(a)g(list\))h(or)f(c)m(haracters)h(\(for) f(a)g(w)m(ord\))g(of)f(the)h(input.)39 b(The)26 b(template)i(is)f(ev)-5 b(aluated)28 b(once)150 1410 y(for)33 b(eac)m(h)i(mem)m(b)s(er)e(or)g (c)m(haracter)i(of)f(the)g(data,)h(and)e(it)h(m)m(ust)f(pro)s(duce)f(a) i Fk(TRUE)e Fs(or)i Fk(FALSE)e Fs(v)-5 b(alue.)50 b(If)150 1519 y(the)31 b(v)-5 b(alue)30 b(is)h Fk(TRUE)p Fs(,)e(then)h(the)h (corresp)s(onding)e(input)h(constituen)m(t)h(is)g(included)e(in)i(the)f (output.)390 1687 y Fk(?)47 b(print)g(filter)f("vowelp)g("elephant)390 1797 y(eea)390 1906 y(?)150 2074 y Fs(In)26 b(a)h(template,)i(the)e (sym)m(b)s(ol)f Fk(?REST)f Fs(represen)m(ts)i(the)g(p)s(ortion)f(of)h (the)g Fl(data)g Fs(input)f(to)h(the)g(righ)m(t)g(of)g(the)150 2183 y(mem)m(b)s(er)34 b(curren)m(tly)g(b)s(eing)g(used)f(as)i(the)g Fk(?)f Fs(slot-\014ller.)53 b(That)35 b(is,)g(if)f(the)h(data)g(input)e (is)i Fk([A)29 b(B)h(C)h(D)f(E])150 2293 y Fs(and)d(the)g(template)i (is)e(b)s(eing)g(ev)-5 b(aluated)29 b(with)e Fk(?)g Fs(replaced)h(b)m (y)f Fk(B)p Fs(,)h(then)f Fk(?REST)e Fs(w)m(ould)j(b)s(e)e(replaced)i (b)m(y)150 2403 y Fk([C)i(D)g(E])o Fs(.)150 2570 y(In)20 b(a)h(template,)k(the)c(sym)m(b)s(ol)f Fk(#)h Fs(represen)m(ts)g(the)g (p)s(osition)g(in)f(the)h Fl(data)h Fs(input)e(of)h(the)g(mem)m(b)s(er) f(curren)m(tly)150 2680 y(b)s(eing)30 b(used)g(as)h(the)f Fk(?)g Fs(slot-\014ller.)43 b(That)30 b(is,)h(if)g(the)f(data)h(input)f (is)h Fk([A)e(B)h(C)g(D)g(E])g Fs(and)g(the)h(template)h(is)150 2790 y(b)s(eing)e(ev)-5 b(aluated)32 b(with)e Fk(?)g Fs(replaced)g(b)m(y)h Fk(B)p Fs(,)f(then)g Fk(#)g Fs(w)m(ould)g(b)s(e)g (replaced)h(b)m(y)f Fk(2)p Fs(.)150 2980 y Fh(\014nd)390 3127 y Fk(FIND)47 b(tftemplate)e(data)h(\(library)g(procedure\))150 3294 y Fs(outputs)e(the)h(\014rst)e(constituen)m(t)j(of)f(the)g Fl(data)g Fs(input)e(\(the)i(\014rst)f(mem)m(b)s(er)g(of)h(a)g(list,)j (or)d(the)g(\014rst)150 3404 y(c)m(haracter)39 b(of)f(a)f(w)m(ord\))h (for)f(whic)m(h)g(the)h(v)-5 b(alue)38 b(pro)s(duced)d(b)m(y)j(ev)-5 b(aluating)39 b(the)e Fl(template)44 b Fs(with)37 b(that)150 3513 y(consituen)m(t)31 b(in)f(its)h(slot)g(is)g Fk(TRUE)p Fs(.)39 b(If)30 b(there)h(is)f(no)h(suc)m(h)f(constituen)m(t,)i(the)e (empt)m(y)h(list)g(is)f(output.)150 3681 y(In)c(a)h(template,)i(the)e (sym)m(b)s(ol)f Fk(?REST)f Fs(represen)m(ts)i(the)g(p)s(ortion)f(of)h (the)g Fl(data)g Fs(input)f(to)h(the)g(righ)m(t)g(of)g(the)150 3791 y(mem)m(b)s(er)34 b(curren)m(tly)g(b)s(eing)g(used)f(as)i(the)g Fk(?)f Fs(slot-\014ller.)53 b(That)35 b(is,)g(if)f(the)h(data)g(input)e (is)i Fk([A)29 b(B)h(C)h(D)f(E])150 3900 y Fs(and)d(the)g(template)i (is)e(b)s(eing)g(ev)-5 b(aluated)29 b(with)e Fk(?)g Fs(replaced)h(b)m (y)f Fk(B)p Fs(,)h(then)f Fk(?REST)e Fs(w)m(ould)j(b)s(e)e(replaced)i (b)m(y)150 4010 y Fk([C)i(D)g(E])o Fs(.)150 4178 y(In)20 b(a)h(template,)k(the)c(sym)m(b)s(ol)f Fk(#)h Fs(represen)m(ts)g(the)g (p)s(osition)g(in)f(the)h Fl(data)h Fs(input)e(of)h(the)g(mem)m(b)s(er) f(curren)m(tly)150 4287 y(b)s(eing)30 b(used)g(as)h(the)f Fk(?)g Fs(slot-\014ller.)43 b(That)30 b(is,)h(if)g(the)f(data)h(input)f (is)h Fk([A)e(B)h(C)g(D)g(E])g Fs(and)g(the)h(template)h(is)150 4397 y(b)s(eing)e(ev)-5 b(aluated)32 b(with)e Fk(?)g Fs(replaced)g(b)m(y)h Fk(B)p Fs(,)f(then)g Fk(#)g Fs(w)m(ould)g(b)s(e)g (replaced)h(b)m(y)f Fk(2)p Fs(.)150 4587 y Fh(reduce)390 4734 y Fk(REDUCE)46 b(template)g(data)g(\(library)g(procedure\))150 4902 y Fs(outputs)30 b(the)h(result)g(of)g(applying)g(the)g Fl(template)37 b Fs(to)32 b(accum)m(ulate)h(the)e(mem)m(b)s(ers)f(of)h (the)g Fl(data)h Fs(input.)150 5011 y(The)39 b(template)j(m)m(ust)d(b)s (e)h(a)g(t)m(w)m(o-slot)j(function.)69 b(T)m(ypically)41 b(it)f(is)g(an)g(asso)s(ciativ)m(e)i(function)e(name)150 5121 y(lik)m(e)f Fk(SUM)p Fs(.)64 b(If)38 b(the)g Fl(data)h Fs(input)e(has)h(only)g(one)h(constituen)m(t)g(\(mem)m(b)s(er)f(in)g(a) h(list)g(or)f(c)m(haracter)i(in)e(a)150 5230 y(w)m(ord\),)30 b(the)f(output)g(is)g(that)h(consituen)m(t.)42 b(Otherwise,)29 b(the)h(template)g(is)g(\014rst)e(applied)h(with)g Fk(?1)g Fs(\014lled)150 5340 y(with)34 b(the)g(next-to-last)j(consitien)m(t)f (and)e Fk(?2)f Fs(with)h(the)h(last)g(constituen)m(t.)53 b(Then,)35 b(if)f(there)g(are)h(more)p eop end %%Page: 79 92 TeXDict begin 79 91 bop 150 -116 a Fs(Chapter)30 b(8:)41 b(Con)m(trol)31 b(Structures)2302 b(79)150 299 y(constituen)m(ts,)29 b(the)f(template)g(is)f(applied)g(with)g Fk(?1)g Fs(\014lled)g(with)f (the)i(next)f(constituen)m(t)h(to)g(the)g(left)g(and)150 408 y Fk(?2)22 b Fs(with)h(the)g(result)g(from)g(the)g(previous)f(ev)-5 b(aluation.)40 b(This)22 b(pro)s(cess)h(con)m(tin)m(ues)h(un)m(til)f (all)h(constituen)m(ts)150 518 y(ha)m(v)m(e)32 b(b)s(een)d(used.)40 b(The)30 b(data)h(input)f(ma)m(y)h(not)f(b)s(e)g(empt)m(y)-8 b(.)150 686 y(Note:)58 b(If)38 b(the)h(template)h(is,)h(lik)m(e)f Fk(SUM)p Fs(,)f(the)g(name)g(of)f(a)h(pro)s(cedure)f(that)h(is)f (capable)i(of)e(accepting)150 795 y(arbitrarily)c(man)m(y)g(inputs,)h (it)f(is)g(more)h(e\016cien)m(t)g(to)g(use)f Fk(APPLY)e Fs(instead)j(of)f Fk(REDUCE)p Fs(.)50 b(The)33 b(latter)j(is)150 905 y(go)s(o)s(d)30 b(for)g(asso)s(ciativ)m(e)j(pro)s(cedures)c(that)i (ha)m(v)m(e)h(b)s(een)e(written)g(to)h(accept)h(exactly)g(t)m(w)m(o)g (inputs:)390 1073 y Fk(to)47 b(max)g(:a)g(:b)390 1182 y(output)f(ifelse)g(:a)h(>)h(:b)f([:a])g([:b])390 1292 y(end)390 1511 y(print)f(reduce)g("max)h([...])150 1679 y Fs(Alternativ)m(ely)-8 b(,)33 b Fk(REDUCE)c Fs(can)h(b)s(e)g(used)g (to)h(write)f Fk(MAX)f Fs(as)i(a)g(pro)s(cedure)e(that)i(accepts)g(an)m (y)g(n)m(um)m(b)s(er)e(of)150 1788 y(inputs,)h(as)g Fk(SUM)g Fs(do)s(es:)390 1956 y Fk(to)47 b(max)g([:inputs])e(2)390 2066 y(if)i(emptyp)f(:inputs)g(~)533 2175 y([\(throw)g("error)g([not)h (enough)f(inputs)g(to)h(max]\)])390 2285 y(output)f(reduce)g([ifelse)g (?1)h(>)h(?2)f([?1])f([?2]])h(:inputs)390 2394 y(end)150 2562 y Fs(See)31 b([SUM],)g(page)g(29,)g(,)g([APPL)-8 b(Y],)31 b(page)g(76,)h(.)150 2764 y Fh(crossmap)390 2911 y Fk(CROSSMAP)46 b(template)f(listlist)h(\(library)f(procedure\)) 390 3021 y(\(CROSSMAP)g(template)h(data1)g(data2)h(...\))150 3188 y Fs(outputs)31 b(a)h(list)h(con)m(taining)g(the)f(results)g(of)g (template)h(ev)-5 b(aluations.)46 b(Eac)m(h)33 b Fl(data)f Fs(list)h(con)m(tributes)f(to)150 3298 y(a)f(slot)g(in)f(the)h (template;)h(the)e(n)m(um)m(b)s(er)f(of)i(slots)g(is)f(equal)h(to)g (the)g(n)m(um)m(b)s(er)e(of)h Fl(data)i Fs(list)f(inputs.)39 b(As)31 b(a)150 3408 y(sp)s(ecial)f(case,)h(if)f(only)f(one)h Fl(data)g Fs(list)h(input)d(is)i(giv)m(en,)h(that)f(list)g(is)g(tak)m (en)g(as)g(a)g(list)g(of)g(data)g(lists,)h(and)150 3517 y(eac)m(h)f(of)g(its)g(mem)m(b)s(ers)e(con)m(tributes)i(v)-5 b(alues)30 b(to)g(a)f(slot.)42 b Fk(CROSSMAP)27 b Fs(di\013ers)i(from)f Fk(MAP)h Fs(in)g(that)h(instead)150 3627 y(of)38 b(taking)g(mem)m(b)s (ers)f(from)g(the)g(data)i(inputs)d(in)h(parallel,)k(it)d(tak)m(es)h (all)f(p)s(ossible)f(com)m(binations)i(of)150 3736 y(mem)m(b)s(ers)30 b(of)g(data)h(inputs,)f(whic)m(h)g(need)g(not)h(b)s(e)e(the)i(same)g (length.)390 3904 y Fk(?)47 b(show)g(\(crossmap)e([word)i(?1)g(?2])g ([a)g(b)g(c])h([1)f(2)g(3)h(4]\))390 4014 y([a1)f(a2)g(a3)g(a4)g(b1)h (b2)f(b3)g(b4)g(c1)g(c2)h(c3)f(c4])390 4123 y(?)150 4291 y Fs(F)-8 b(or)34 b(compatibilit)m(y)i(with)e(the)f(v)m(ersion)h(in)g (the)g(\014rst)e(edition)j(of)f(CSLS)2656 4258 y Fe(1)2691 4291 y Fs(,)g Fk(CROSSMAP)d Fs(templates)k(ma)m(y)150 4401 y(use)30 b(the)h(notation)g Fk(:1)f Fs(instead)h(of)f Fk(?1)g Fs(to)h(indicate)h(slots.)150 4568 y(See)f([MAP],)g(page)g(77,) h(.)150 4771 y Fh(cascade)390 4917 y Fk(CASCADE)46 b(endtest)g (template)f(startvalue)g(\(library)h(procedure\))390 5027 y(\(CASCADE)g(endtest)f(tmp1)i(sv1)g(tmp2)g(sv2)f(...\))390 5137 y(\(CASCADE)g(endtest)f(tmp1)i(sv1)g(tmp2)g(sv2)f(...)h (finaltemplate\))p 150 5241 1200 4 v 199 5308 a Fe(1)275 5340 y Fd(Computer)25 b(Science)h(Logo)h(St)n(yle)p eop end %%Page: 80 93 TeXDict begin 80 92 bop 150 -116 a Fs(80)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(outputs)c(the)h(result)f(of)h(applying)f(a)h (template)h(\(or)e(sev)m(eral)i(templates,)h(as)e(explained)f(b)s(elo)m (w\))h(rep)s(eat-)150 408 y(edly)-8 b(,)42 b(with)c(a)i(giv)m(en)g(v)-5 b(alue)39 b(\014lling)g(the)g(slot)h(the)f(\014rst)f(time,)k(and)d(the) g(result)f(of)i(eac)m(h)g(application)150 518 y(\014lling)31 b(the)f(slot)h(for)f(the)h(follo)m(wing)h(application.)150 686 y(In)h(the)g(simplest)h(case,)h Fk(CASCADE)c Fs(has)i(three)h (inputs.)49 b(The)32 b(second)i(input)e(is)i(a)f(one-slot)i(expression) 150 795 y(template.)55 b(That)34 b(template)i(is)f(ev)-5 b(aluated)36 b(some)e(n)m(um)m(b)s(er)g(of)g(times)i(\(p)s(erhaps)d (zero\).)54 b(On)34 b(the)h(\014rst)150 905 y(ev)-5 b(aluation,)28 b(the)e(slot)h(is)f(\014lled)g(with)f(the)h(third)f(input;)i(on)e (subsequen)m(t)g(ev)-5 b(aluations,)29 b(the)d(slot)g(is)g(\014lled)150 1015 y(with)i(the)h(result)f(of)h(the)g(previous)f(ev)-5 b(aluation.)42 b(The)28 b(n)m(um)m(b)s(er)f(of)i(ev)-5 b(aluations)30 b(is)e(determined)g(b)m(y)h(the)150 1124 y(\014rst)23 b(input.)38 b(This)23 b(can)i(b)s(e)e(either)h(a)h (nonnegativ)m(e)h(in)m(teger,)g(in)e(whic)m(h)g(case)h(the)f(template)i (is)e(ev)-5 b(aluated)150 1234 y(that)27 b(man)m(y)g(times,)i(or)d(a)i (predicate)f(expression)g(template,)i(in)d(whic)m(h)h(case)h(it)f(is)g (ev)-5 b(aluated)28 b(\(with)f(the)150 1343 y(same)h(slot)h(\014ller)f (that)h(will)f(b)s(e)g(used)f(for)h(the)g(ev)-5 b(aluation)30 b(of)e(the)g(second)g(input\))g(rep)s(eatedly)-8 b(,)29 b(and)f(the)150 1453 y Fk(CASCADE)g Fs(ev)-5 b(aluation)32 b(con)m(tin)m(ues)f(as)g(long)g(as)f(the)h(predicate)g(v)-5 b(alue)31 b(is)f Fk(FALSE)p Fs(.)39 b(\(In)30 b(other)h(w)m(ords,)f (the)150 1562 y(predicate)h(template)h(indicates)f(the)g(condition)g (for)f(stopping.\))150 1730 y(If)j(the)g(template)h(is)f(ev)-5 b(aluated)35 b(zero)e(times,)i(the)e(output)g(from)f Fk(CASCADE)g Fs(is)h(the)g(third)f(\()p Fl(startv)-5 b(alue)5 b Fs(\))150 1840 y(input.)40 b(Otherwise,)30 b(the)h(output)f(is)g(the)h(v)-5 b(alue)30 b(pro)s(duced)f(b)m(y)h(the) h(last)g(template)h(ev)-5 b(aluation.)150 2007 y Fk(CASCADE)23 b Fs(templates)j(ma)m(y)f(include)g(the)g(sym)m(b)s(ol)g Fk(#)f Fs(to)i(represen)m(t)f(the)g(n)m(um)m(b)s(er)e(of)i(times)g(the) h(template)150 2117 y(has)31 b(b)s(een)g(ev)-5 b(aluated.)46 b(This)30 b(slot)j(is)e(\014lled)h(with)f(1)h(for)f(the)h(\014rst)f(ev) -5 b(aluation,)33 b(2)f(for)g(the)f(second,)i(and)150 2227 y(so)e(on.)390 2394 y Fk(?)47 b(show)g(cascade)f(5)h([lput)g(#)g (?])g([])390 2504 y([1)g(2)h(3)f(4)h(5])390 2614 y(?)f(show)g(cascade)f ([vowelp)g(first)g(?])h([bf)g(?])g("spring)390 2723 y(ing)390 2833 y(?)g(show)g(cascade)f(5)h([#)h(*)f(?])g(1)390 2942 y(120)390 3052 y(?)150 3220 y Fs(Sev)m(eral)d(cascaded)g(results)f(can) h(b)s(e)e(computed)h(in)g(parallel)h(b)m(y)f(pro)m(viding)g(additional) h(template-)150 3329 y(startv)-5 b(alue)40 b(pairs)f(as)g(inputs)e(to)j Fk(CASCADE)p Fs(.)64 b(In)39 b(this)f(case,)43 b(all)d(templates)g (\(including)f(the)g(endtest)150 3439 y(template,)c(if)d(used\))g(are)h (m)m(ulti-slot,)i(with)e(the)f(n)m(um)m(b)s(er)g(of)g(slots)i(equal)f (to)g(the)g(n)m(um)m(b)s(er)e(of)i(pairs)f(of)150 3548 y(inputs.)56 b(In)35 b(eac)m(h)i(round)d(of)i(ev)-5 b(aluations,)38 b Fk(?2)p Fs(,)f(for)e(example,)j(represen)m(ts)e(the)g(result)g(of)f (ev)-5 b(aluating)150 3658 y(the)38 b(second)f(template)i(in)f(the)f (previous)h(round.)60 b(If)38 b(the)f(total)j(n)m(um)m(b)s(er)c(of)i (inputs)e(\(including)i(the)150 3768 y(\014rst)33 b(endtest)i(input\))e (is)i(o)s(dd,)f(then)g(the)g(output)g(from)f(CASCADE)h(is)g(the)h (\014nal)e(v)-5 b(alue)35 b(of)f(the)h(\014rst)150 3877 y(template.)58 b(If)35 b(the)h(total)i(n)m(um)m(b)s(er)c(of)i(inputs)e (is)i(ev)m(en,)i(then)e(the)f(last)i(input)e(is)g(a)i(template)g(that)f (is)150 3987 y(ev)-5 b(aluated)32 b(once,)f(after)g(the)f(end)g(test)h (is)g(satis\014ed,)g(to)g(determine)f(the)h(output)f(from)g Fk(CASCADE)p Fs(.)390 4154 y Fk(to)47 b(fibonacci)e(:n)390 4264 y(output)h(\(cascade)g(:n)h([?1)g(+)g(?2])g(1)h([?1])e(0\))390 4374 y(end)390 4593 y(to)h(piglatin)f(:word)390 4702 y(output)g(\(cascade)g([vowelp)f(first)i(?])g(~)1154 4812 y([word)f(bf)h(?)h(first)e(?])h(~)1154 4922 y(:word)f(~)1154 5031 y([word)g(?)h("ay]\))390 5141 y(end)p eop end %%Page: 81 94 TeXDict begin 81 93 bop 150 -116 a Fs(Chapter)30 b(8:)41 b(Con)m(trol)31 b(Structures)2302 b(81)150 299 y Fh(cascade.2)390 446 y Fk(CASCADE.2)45 b(endtest)h(temp1)g(startval1)g(temp2)g (startval2)93 b(\(library)46 b(procedure\))150 614 y Fs(outputs)34 b(the)h(result)g(of)f(in)m(v)m(oking)i Fk(CASCADE)d Fs(with)h(the)h(same)g(inputs.)53 b(The)34 b(only)h(di\013erence)g(is)f(that)150 723 y(the)d(default)f(n)m(um)m(b) s(er)f(of)i(inputs)e(is)h(\014v)m(e)h(instead)g(of)f(three.)150 922 y Fh(transfer)390 1069 y Fk(TRANSFER)46 b(endtest)f(template)h (inbasket)f(\(library)h(procedure\))150 1237 y Fs(outputs)32 b(the)g(result)h(of)f(rep)s(eated)h(ev)-5 b(aluation)33 b(of)g(the)g Fl(template)p Fs(.)48 b(The)32 b(template)h(is)g(ev)-5 b(aluated)33 b(once)150 1347 y(for)39 b(eac)m(h)i(mem)m(b)s(er)e(of)h (the)f(list)i Fl(in)m(bask)m(et)p Fs(.)69 b Fk(TRANSFER)37 b Fs(main)m(tains)k(an)e Fl(outbask)m(et)k Fs(that)d(is)f(initially)150 1456 y(the)30 b(empt)m(y)g(list.)42 b(After)30 b(eac)m(h)h(ev)-5 b(aluation)32 b(of)e(the)g(template,)h(the)g(resulting)f(v)-5 b(alue)30 b(b)s(ecomes)g(the)g(new)150 1566 y(outbask)m(et.)150 1733 y(In)41 b(the)h(template,)k(the)c(sym)m(b)s(ol)f Fk(?IN)g Fs(represen)m(ts)h(the)f(curren)m(t)h(mem)m(b)s(er)f(from)g (the)h(in)m(bask)m(et;)49 b(the)150 1843 y(sym)m(b)s(ol)40 b Fk(?OUT)f Fs(represen)m(ts)h(the)g(en)m(tire)h(curren)m(t)f(outbask)m (et.)71 b(Other)40 b(slot)g(sym)m(b)s(ols)g(should)f(not)i(b)s(e)150 1953 y(used.)150 2120 y(If)c(the)h(\014rst)f(\()p Fl(endtest)r Fs(\))h(input)f(is)g(an)h(empt)m(y)g(list,)i(ev)-5 b(aluation)39 b(con)m(tin)m(ues)g(un)m(til)f(all)g(in)m(bask)m(et)h(mem-)150 2230 y(b)s(ers)33 b(ha)m(v)m(e)i(b)s(een)f(used.)51 b(If)34 b(not,)h(the)f(\014rst)g(input)f(m)m(ust)h(b)s(e)f(a)i(predicate)g (expression)f(template,)j(and)150 2340 y(ev)-5 b(aluation)32 b(con)m(tin)m(ues)f(un)m(til)g(either)g(that)g(template's)h(v)-5 b(alue)31 b(is)f Fk(TRUE)f Fs(or)i(the)f(in)m(bask)m(et)i(is)e(used)g (up.)p eop end %%Page: 82 95 TeXDict begin 82 94 bop eop end %%Page: 83 96 TeXDict begin 83 95 bop 3659 -116 a Fs(83)150 299 y Fp(9)80 b(Macros)150 596 y Fr(.macro)390 756 y Fk(.MACRO)46 b(procname)g (:input1)f(:input2)h(...)95 b(\(special)45 b(form\))390 865 y(.DEFMACRO)g(procname)h(text)150 1033 y Fs(A)35 b(macro)g(is)g(a)g(sp)s(ecial)g(kind)f(of)g(pro)s(cedure)g(whose)g (output)h(is)f(ev)-5 b(aluated)36 b(as)f(Logo)h(instructions)e(in)150 1142 y(the)e(con)m(text)h(of)e(the)h(macro's)g(caller.)45 b Fk(.MACRO)30 b Fs(is)h(exactly)i(lik)m(e)g Fk(TO)d Fs(except)j(that)f(the)f(new)g(pro)s(cedure)150 1252 y(b)s(ecomes)g(a)f(macro;)i Fk(.DEFMACRO)27 b Fs(is)k(exactly)h(lik)m (e)g Fk(DEFINE)c Fs(with)i(the)h(same)g(exception.)150 1420 y(Macros)37 b(are)f(useful)f(for)g(in)m(v)m(en)m(ting)j(new)d(con) m(trol)i(structures)e(comparable)i(to)f Fk(REPEAT)p Fs(,)g Fk(IF)p Fs(,)h(and)e(so)150 1529 y(on.)72 b(Suc)m(h)41 b(con)m(trol)h(structures)e(can)i(almost,)j(but)40 b(not)h(quite,)j(b)s (e)d(duplicated)g(b)m(y)g(ordinary)f(Logo)150 1639 y(pro)s(cedures.)f (F)-8 b(or)32 b(example,)f(here)f(is)h(an)f(ordinary)f(pro)s(cedure)h (v)m(ersion)h(of)f Fk(REPEAT)p Fs(:)390 1807 y Fk(to)47 b(my.repeat)e(:num)i(:instructions)390 1916 y(if)g(:num=0)f([stop])390 2026 y(run)h(:instructions)390 2135 y(my.repeat)e(:num-1)h (:instructions)390 2245 y(end)150 2413 y Fs(This)30 b(v)m(ersion)g(w)m (orks)h(\014ne)e(for)i(most)f(purp)s(oses,)f(e.g.,)390 2580 y Fk(my.repeat)45 b(5)j([print)e("hello])150 2748 y Fs(But)36 b(it)f(do)s(esn't)h(w)m(ork)f(if)g(the)h(instructions)f(to) h(b)s(e)f(carried)g(out)h(include)f Fk(OUTPUT)p Fs(,)g Fk(STOP)p Fs(,)h(or)f Fk(LOCAL)p Fs(.)150 2858 y(F)-8 b(or)31 b(example,)g(consider)g(this)f(pro)s(cedure:)390 3025 y Fk(to)47 b(example)390 3135 y(print)f([Guess)g(my)i(secret)e (word.)94 b(You)47 b(get)g(three)f(guesses.])390 3245 y(repeat)g(3)i([type)e("|??)h(|)g(~)867 3354 y(if)g(readword)f(=)h ("secret)f([pr)h("Right!)f(stop]])390 3464 y(print)g([Sorry,)g(the)h (word)g(was)g("secret"!])390 3573 y(end)150 3741 y Fs(This)27 b(pro)s(cedure)f(w)m(orks)h(as)h(written,)g(but)e(if)i Fk(MY.REPEAT)d Fs(is)i(used)f(instead)i(of)g Fk(REPEAT)p Fs(,)e(it)i(w)m(on't)g(w)m(ork)150 3851 y(b)s(ecause)i(the)h Fk(STOP)e Fs(will)i(stop)f Fk(MY.REPEAT)e Fs(instead)j(of)f(stopping)h Fk(EXAMPLE)d Fs(as)j(desired.)150 4018 y(The)c(solution)i(is)f(to)g (mak)m(e)h Fk(MY.REPEAT)c Fs(a)k(macro.)40 b(Instead)28 b(of)g(actually)h(carrying)f(out)g(the)g(computa-)150 4128 y(tion,)j(a)f(macro)g(m)m(ust)g(return)e(a)i(list)h(con)m(taining) g(Logo)g(instructions.)40 b(The)29 b(con)m(ten)m(ts)j(of)e(that)g(list) h(are)150 4237 y(ev)-5 b(aluated)34 b(as)g(if)f(they)g(app)s(eared)g (in)g(place)h(of)g(the)f(call)h(to)g(the)g(macro.)50 b(Here's)34 b(a)f(macro)h(v)m(ersion)g(of)150 4347 y Fk(REPEAT)p Fs(:)390 4515 y Fk(.macro)46 b(my.repeat)f(:num)i (:instructions)390 4624 y(if)g(:num=0)f([output)g([]])390 4734 y(output)g(sentence)g(:instructions)e(~)1154 4844 y(\(list)i("my.repeat)f(:num-1)h(:instructions\))390 4953 y(end)150 5121 y Fs(Ev)m(ery)34 b(macro)h(is)f(an)g(op)s(eration)h (|)f(it)g(m)m(ust)g(alw)m(a)m(ys)i(output)e(something.)52 b(Ev)m(en)34 b(in)g(the)g(base)h(case,)150 5230 y Fk(MY.REPEAT)23 b Fs(outputs)j(an)g(empt)m(y)g(instruction)g(list.)40 b(T)-8 b(o)27 b(sho)m(w)e(ho)m(w)i Fk(MY.REPEAT)c Fs(w)m(orks,)k(let's) g(tak)m(e)h(the)150 5340 y(example)p eop end %%Page: 84 97 TeXDict begin 84 96 bop 150 -116 a Fs(84)2551 b(BERKELEY)30 b(LOGO)g(6.1)390 299 y Fk(my.repeat)45 b(5)j([print)e("hello])150 467 y Fs(F)-8 b(or)31 b(this)f(example,)i Fk(MY.REPEAT)c Fs(will)i(output)g(the)h(instruction)f(list)390 634 y Fk([print)46 b("hello)g(my.repeat)f(4)j([print)e("hello]])150 802 y Fs(Logo)30 b(then)e(executes)i(these)f(instructions)f(in)g(place) i(of)e(the)h(original)h(in)m(v)m(o)s(cation)g(of)f Fk(MY.REPEAT)p Fs(;)e(this)150 912 y(prin)m(ts)j Fk(hello)f Fs(once)i(and)f(in)m(v)m (ok)m(es)i(another)e(rep)s(etition.)150 1079 y(The)35 b(tec)m(hnique)i(just)e(sho)m(wn,)i(although)g(fairly)f(easy)h(to)f (understand,)g(has)g(the)g(defect)h(of)f(slo)m(wness)150 1189 y(b)s(ecause)k(eac)m(h)h(rep)s(etition)g(has)f(to)h(construct)f (an)g(instruction)g(list)h(for)f(ev)-5 b(aluation.)72 b(Another)40 b(ap-)150 1298 y(proac)m(h)27 b(is)g(to)g(mak)m(e)h Fk(MY.REPEAT)c Fs(a)j(macro)g(that)g(w)m(orks)g(just)f(lik)m(e)i(the)f (non-macro)g(v)m(ersion)g(unless)f(the)150 1408 y(instructions)k(to)h (b)s(e)f(rep)s(eated)h(include)f Fk(OUTPUT)e Fs(or)j Fk(STOP)p Fs(:)390 1576 y Fk(.macro)46 b(my.repeat)f(:num)i (:instructions)390 1685 y(catch)f("repeat.catchtag)e(~)676 1795 y([op)j(repeat.done)e(runresult)g([repeat1)h(:num)g (:instructions]])390 1905 y(op)h([])390 2014 y(end)390 2233 y(to)g(repeat1)f(:num)h(:instructions)390 2343 y(if)g(:num=0)f ([throw)g("repeat.catchtag])390 2452 y(run)h(:instructions)390 2562 y(.maybeoutput)d(repeat1)i(:num-1)g(:instructions)390 2672 y(end)390 2891 y(to)h(repeat.done)e(:repeat.result)390 3000 y(if)i(emptyp)f(:repeat.result)e([op)j([stop]])390 3110 y(op)g(list)g("output)f(quoted)g(first)g(:repeat.result)390 3220 y(end)150 3387 y Fs(If)37 b(the)g(instructions)h(do)f(not)g (include)g Fk(STOP)g Fs(or)g Fk(OUTPUT)p Fs(,)h(then)f Fk(REPEAT1)e Fs(will)j(reac)m(h)g(its)f(base)h(case)150 3497 y(and)30 b(in)m(v)m(ok)m(e)j Fk(THROW)p Fs(.)40 b(As)30 b(a)h(result,)g Fk(MY.REPEAT)p Fs('s)d(last)k(instruction)e (line)h(will)g(output)f(an)h(empt)m(y)g(list,)150 3606 y(so)d(the)g(ev)-5 b(aluation)30 b(of)e(the)g(macro)h(result)e(b)m(y)h (the)g(caller)i(will)e(do)g(nothing.)40 b(But)28 b(if)g(a)g Fk(STOP)f Fs(or)h Fk(OUTPUT)150 3716 y Fs(happ)s(ens,)e(then)i Fk(REPEAT.DONE)c Fs(will)k(output)f(a)h Fk(STOP)e Fs(or)h Fk(OUTPUT)f Fs(instruction)h(that)h(will)g(b)s(e)f(executed)150 3826 y(in)j(the)h(caller's)g(con)m(text.)150 3993 y(The)45 b(macro-de\014ning)h(commands)f(ha)m(v)m(e)i(names)e(starting)h(with)g (a)g(dot)f(b)s(ecause)h(macros)g(are)g(an)150 4103 y(adv)-5 b(anced)44 b(feature)g(of)g(Logo;)53 b(it's)44 b(easy)h(to)f(get)h(in)f (trouble)g(b)m(y)g(de\014ning)f(a)h(macro)h(that)f(do)s(esn't)150 4213 y(terminate,)32 b(or)e(b)m(y)g(failing)i(to)f(construct)f(the)h (instruction)f(list)h(prop)s(erly)-8 b(.)150 4380 y(Lisp)32 b(users)f(should)h(note)h(that)g(Logo)g(macros)g(are)g Fg(not)41 b Fs(sp)s(ecial)33 b(forms.)46 b(That)33 b(is,)g(the)f (inputs)g(to)h(the)150 4490 y(macro)27 b(are)h(ev)-5 b(aluated)28 b(normally)-8 b(,)28 b(as)f(they)g(w)m(ould)g(b)s(e)f(for) g(an)m(y)h(other)g(Logo)h(pro)s(cedure.)39 b(It's)27 b(only)g(the)150 4599 y(output)j(from)g(the)g(macro)h(that's)h(handled) d(un)m(usually)-8 b(.)150 4767 y(Here's)31 b(another)g(example:)390 4935 y Fk(.macro)46 b(localmake)f(:name)i(:value)390 5044 y(output)f(\(list)g("local)476 b(~)1010 5154 y(word)47 b("")g(:name)142 b(~)1010 5264 y("apply)476 b(~)p eop end %%Page: 85 98 TeXDict begin 85 97 bop 150 -116 a Fs(Chapter)30 b(9:)41 b(Macros)2759 b(85)1010 299 y Fk(""make)476 b(~)1010 408 y(\(list)47 b(:name)f(:value\)\))390 518 y(end)150 686 y Fs(It's)31 b(used)e(this)h(w)m(a)m(y:)390 853 y Fk(to)47 b(try)390 963 y(localmake)e("garply)h("hello)390 1073 y(print)g(:garply)390 1182 y(end)150 1350 y(LOCALMAKE)28 b Fs(outputs)i(the)g(list)390 1518 y([lo)s(cal)i Fk(")p Fs(garply)e(apply)g Fk(")p Fs(mak)m(e)h([garply)g(hello]])150 1685 y(The)38 b(reason)h(for)f(the)h(use)f(of)h Fk(APPLY)e Fs(is)h(to)i(a)m(v)m(oid)g(ha)m(ving)f(to)g(decide)g(whether)f(or)g (not)h(the)g(second)150 1795 y(input)30 b(to)i Fk(MAKE)e Fs(requires)g(a)h(quotation)i(mark)d(b)s(efore)h(it.)43 b(\(In)31 b(this)g(case)h(it)f(w)m(ould)g(|)g Fk(MAKE)e("GARPLY)150 1905 y("HELLO)g Fs(|)h(but)g(the)g(quotation)i(mark)e(w)m(ould)g(b)s(e) g(wrong)g(if)g(the)h(v)-5 b(alue)30 b(w)m(ere)h(a)g(list.\))150 2072 y(It's)g(often)f(con)m(v)m(enien)m(t)j(to)e(use)f(the)h Fk(`)f Fs(function)g(to)h(construct)g(the)f(instruction)h(list:)390 2240 y Fk(.macro)46 b(localmake)f(:name)i(:value)390 2350 y(op)g(`[local)f(,[word)g("")h(:name])f(apply)h("make)f([,[:name]) f(,[:value]]])390 2459 y(end)150 2627 y Fs(On)30 b(the)g(other)h(hand,) e Fk(`)h Fs(is)h(prett)m(y)g(slo)m(w,)g(since)g(it's)g(tree)g(recursiv) m(e)g(and)e(written)i(in)f(Logo.)150 2795 y(See)j([TO],)g(page)h(49,)h (,)f([DEFINE],)g(page)f(50,)i(,)f([APPL)-8 b(Y],)34 b(page)g(76,)g(,)g ([STOP],)f(page)g(69,)i(,)f([OUT-)150 2904 y(PUT],)d(page)g(69,)g(.)150 3102 y Fh(.defmacro)150 3249 y Fs(See)g([dMA)m(CR)m(O],)g(page)g(83,)h (.)150 3448 y Fh(macrop)390 3595 y Fk(MACROP)46 b(name)390 3704 y(MACRO?)g(name)150 3872 y Fs(outputs)30 b Fk(TRUE)f Fs(if)h(its)h(input)f(is)g(the)h(name)f(of)h(a)f(macro.)150 4070 y Fh(macro)s(expand)390 4217 y Fk(MACROEXPAND)45 b(expr)h(\(library)g(procedure\))150 4385 y Fs(tak)m(es)39 b(as)f(its)g(input)e(a)i(Logo)h(expression)e(that)i(in)m(v)m(ok)m(es)g (a)f(macro)g(\(that)h(is,)g(one)f(that)g(b)s(egins)f(with)150 4495 y(the)i(name)f(of)g(a)h(macro\))g(and)f(outputs)g(the)g(the)h (Logo)g(expression)f(in)m(to)i(whic)m(h)e(the)g(macro)h(w)m(ould)150 4604 y(translate)32 b(the)e(input)g(expression.)390 4772 y Fk(.macro)46 b(localmake)f(:name)i(:value)390 4881 y(op)g(`[local)f(,[word)g("")h(:name])f(apply)h("make)f([,[:name])f (,[:value]]])390 4991 y(end)390 5210 y(?)i(show)g(macroexpand)e ([localmake)g("pi)i(3.14159])390 5320 y([local)f("pi)h(apply)f("make)h ([pi)g(3.14159]])p eop end %%Page: 86 99 TeXDict begin 86 98 bop eop end %%Page: 87 100 TeXDict begin 87 99 bop 3659 -116 a Fs(87)150 299 y Fp(10)80 b(Error)53 b(Pro)t(cessing)150 546 y Fs(If)37 b(an)h(error)f(o)s (ccurs,)j(Logo)e(tak)m(es)i(the)d(follo)m(wing)j(steps.)62 b(First,)40 b(if)e(there)g(is)g(an)f(a)m(v)-5 b(ailable)40 b(v)-5 b(ariable)150 656 y(named)37 b Fk(ERRACT)p Fs(,)g(Logo)h(tak)m (es)h(its)e(v)-5 b(alue)38 b(as)f(an)g(instructionlist)h(and)f(runs)e (the)j(instructions.)60 b(The)150 765 y(op)s(eration)26 b Fk(ERROR)f Fs(ma)m(y)h(b)s(e)g(used)f(within)g(the)h(instructions)g (\(once\))h(to)g(examine)f(the)h(error)e(condition.)150 875 y(If)k(the)h(instructionlist)g(in)m(v)m(ok)m(es)h Fk(PAUSE)p Fs(,)e(the)h(error)f(message)i(is)e(prin)m(ted)g(b)s(efore)h (the)f(pause)g(happ)s(ens.)150 985 y(Certain)f(errors)f(are)h Fl(reco)m(v)m(erable)5 b Fs(;)32 b(for)27 b(one)h(of)g(those)h(errors,) f(if)f(the)h(instructionlist)h(outputs)e(a)h(v)-5 b(alue,)150 1094 y(that)26 b(v)-5 b(alue)27 b(is)e(used)g(in)h(place)h(of)f(the)g (expression)f(that)h(caused)g(the)g(error.)39 b(\(If)26 b Fk(ERRACT)e Fs(in)m(v)m(ok)m(es)j Fk(PAUSE)150 1204 y Fs(and)37 b(the)g(user)g(then)f(in)m(v)m(ok)m(es)j Fk(CONTINUE)c Fs(with)i(an)g(input,)i(that)e(input)g(b)s(ecomes)g(the)h (output)e(from)150 1313 y Fk(PAUSE)29 b Fs(and)h(therefore)h(the)f (output)g(from)g(the)h Fk(ERRACT)d Fs(instructionlist.\))150 1481 y(It)36 b(is)g(p)s(ossible)f(for)h(an)g Fk(ERRACT)e Fs(instructionlist)j(to)f(pro)s(duce)f(an)h(inappropriate)f(v)-5 b(alue)37 b(or)f(no)f(v)-5 b(alue)150 1591 y(where)40 b(one)h(is)f(needed.)71 b(As)40 b(a)h(result,)i(the)e(same)f(error)g (condition)i(could)e(recur)g(forev)m(er)h(b)s(ecause)150 1700 y(of)f(this)g(mec)m(hanism.)70 b(T)-8 b(o)40 b(a)m(v)m(oid)h(that) g(danger,)h(if)e(the)g(same)h(error)e(condition)i(o)s(ccurs)f(t)m(wice) h(in)f(a)150 1810 y(ro)m(w)32 b(from)f(an)h Fk(ERRACT)e Fs(instructionlist)j(without)f(user)f(in)m(teraction,)j(the)e(message)h (`)p Fk(Erract)c(loop)p Fs(')i(is)150 1919 y(prin)m(ted)i(and)g(con)m (trol)i(returns)e(to)h(toplev)m(el.)53 b Fk(")p Fs(Without)34 b(user)f(in)m(teraction)p Fk(")i Fs(means)f(that)g(if)g Fk(ERRACT)150 2029 y Fs(in)m(v)m(ok)m(es)41 b Fk(PAUSE)c Fs(and)h(the)h(user)f(pro)m(vides)h(an)f(incorrect)i(v)-5 b(alue,)42 b(this)c(lo)s(op)h(prev)m(en)m(tion)h(mec)m(hanism)150 2139 y(do)s(es)30 b(not)h(tak)m(e)h(e\013ect)g(and)d(the)i(user)f(gets) h(to)g(try)f(again.)150 2306 y(During)36 b(the)h(running)e(of)h(the)h Fk(ERRACT)e Fs(instructionlist,)k Fk(ERRACT)c Fs(is)h(lo)s(cally)i(un)m (b)s(ound,)e(so)h(an)f(error)150 2416 y(in)31 b(the)h Fk(ERRACT)d Fs(instructions)j(themselv)m(es)g(will)g(not)f(cause)h(a)g (lo)s(op.)44 b(In)31 b(particular,)h(an)f(error)g(during)150 2526 y(a)i(pause)f(will)i(not)f(cause)g(a)g(pause-within-a-pause)g (unless)f(the)h(user)f(reassigns)h(the)g(v)-5 b(alue)33 b Fk([PAUSE])150 2635 y Fs(to)j Fk(ERRACT)d Fs(during)g(the)i(pause.)54 b(But)35 b(suc)m(h)g(an)f(error)h(will)g(not)g(return)f(to)h(toplev)m (el;)k(it)d(will)f(remain)150 2745 y(within)30 b(the)g(original)i (pause)e(lo)s(op.)150 2912 y(If)42 b(there)h(is)f(no)h(a)m(v)-5 b(ailable)45 b Fk(ERRACT)c Fs(v)-5 b(alue,)46 b(Logo)e(handles)e(the)g (error)g(b)m(y)h(generating)h(an)e(in)m(ternal)150 3022 y Fk(THROW)k("ERROR)o Fs(.)58 b(\(A)37 b(user)e(program)h(can)h(also)g (generate)h(an)e(error)g(condition)h(delib)s(erately)g(b)m(y)f(in-)150 3132 y(v)m(oking)g Fk(THROW)p Fs(.\))55 b(If)35 b(this)g(thro)m(w)h(is) f(not)h(caugh)m(t)g(b)m(y)f(a)h Fk(CATCH)46 b("ERROR)34 b Fs(in)h(the)h(user)e(program,)j(it)f(is)150 3241 y(ev)m(en)m(tually) 25 b(caugh)m(t)f(either)g(b)m(y)f(the)g(toplev)m(el)i(instruction)f(lo) s(op)f(or)g(b)m(y)g(a)g(pause)g(lo)s(op,)i(whic)m(h)e(prin)m(ts)g(the) 150 3351 y(error)f(message.)40 b(An)22 b(in)m(v)m(o)s(cation)i(of)f Fk(CATCH)47 b("ERROR)20 b Fs(in)j(a)g(user)f(program)g(lo)s(cally)i(un) m(binds)d Fk(ERRACT)p Fs(,)i(so)150 3460 y(the)j(e\013ect)h(is)f(that)h (whic)m(hev)m(er)f(of)g Fk(ERRACT)e Fs(and)h Fk(CATCH)47 b("ERROR)24 b Fs(is)i(more)g(lo)s(cal)h(will)f(tak)m(e)h(precedence.) 150 3628 y(If)35 b(a)h(\015oating)g(p)s(oin)m(t)g(o)m(v)m(er\015o)m(w)h (o)s(ccurs)e(during)f(an)h(arithmetic)i(op)s(eration,)h(or)d(a)h(t)m(w) m(o-input)g(mathe-)150 3738 y(matical)29 b(function)d(\(lik)m(e)j Fk(POWER)p Fs(\))d(is)h(in)m(v)m(ok)m(ed)h(with)f(an)f(illegal)k(com)m (bination)e(of)f(inputs,)g(the)g(`)p Fk(doesn't)150 3847 y(like)p Fs(')j(message)h(refers)f(to)h(the)g(second)g(op)s(erand,)e (but)h(should)f(b)s(e)h(tak)m(en)i(as)f(meaning)f(the)h(com)m(bina-)150 3957 y(tion.)150 4125 y(See)e([ERRA)m(CT],)g(page)h(89,)g(,)g([THR)m(O) m(W],)g(page)g(69,)g(,)g([ERR)m(OR],)f(page)h(70,)g(,)f([CA)-8 b(TCH],)30 b(page)f(69,)i(,)150 4234 y([P)-8 b(A)m(USE],)32 b(page)f(70,)g(,)g([CONTINUE],)f(page)h(70,)h(.)150 4465 y Fr(10.1)68 b(Error)46 b(Co)t(des)150 4624 y Fs(Here)23 b(are)g(the)g(n)m(umeric)g(co)s(des)g(that)g(app)s(ear)f(as)h(the)g (\014rst)f(mem)m(b)s(er)g(of)h(the)g(list)h(output)e(b)m(y)h Fk(ERROR)e Fs(when)150 4734 y(an)k(error)g(is)g(caugh)m(t,)i(with)e (the)g(corresp)s(onding)f(messages.)40 b(Some)25 b(messages)h(ma)m(y)g (ha)m(v)m(e)g(t)m(w)m(o)g(di\013eren)m(t)150 4844 y(co)s(des)31 b(dep)s(ending)e(on)i(whether)f(or)g(not)h(the)g(error)f(is)h(reco)m(v) m(erable)i(\(that)f(is,)f(a)g(substitute)f(v)-5 b(alue)32 b(can)150 4953 y(b)s(e)37 b(pro)m(vided)f(through)h(the)g Fk(ERRACT)f Fs(mec)m(hanism\))i(in)f(the)g(sp)s(eci\014c)g(con)m(text.) 63 b(Some)37 b(messages)i(are)150 5063 y(w)m(arnings)27 b(rather)f(than)h(errors;)h(these)f(will)g(not)g(b)s(e)f(caugh)m(t.)41 b(Errors)26 b(0)h(and)f(32)i(are)f(so)g(bad)f(that)i(Logo)150 5172 y(exits)j(immediately)-8 b(.)485 5340 y Fk(0)48 b(Fatal)e(internal)g(error)94 b Fs(\(can't)32 b(b)s(e)d(caugh)m(t\))p eop end %%Page: 88 101 TeXDict begin 88 100 bop 150 -116 a Fs(88)2551 b(BERKELEY)30 b(LOGO)g(6.1)485 299 y Fk(1)48 b(Out)f(of)g(memory)485 408 y(2)h(Stack)e(overflow)485 518 y(3)i(Turtle)e(out)h(of)g(bounds)485 628 y(4)h Fi(proc)f Fk(doesn't)e(like)i Fi(datum)f Fk(as)i(input)94 b Fs(\(not)31 b(reco)m(v)m(erable\))485 737 y Fk(5)48 b Fi(proc)f Fk(didn't)f(output)g(to)h Fi(proc)485 847 y Fk(6)h(Not)f(enough)f(inputs)g(to)h Fi(proc)485 956 y Fk(7)h(proc)f(doesn't)e(like)i(datum)f(as)i(input)94 b Fs(\(reco)m(v)m(erable\))485 1066 y Fk(8)48 b(Too)f(much)f(inside)h (\(\)'s)485 1176 y(9)96 b(You)47 b(don't)f(say)h(what)f(to)i(do)f(with) f Fi(datum)438 1285 y Fk(10)h('\)')g(not)g(found)438 1395 y(11)g Fi(var)g Fk(has)g(no)g(value)438 1504 y(12)g(Unexpected)e ('\)')438 1614 y(13)i(I)g(don't)g(know)f(how)h(to)g Fi(proc)95 b Fs(\(reco)m(v)m(erable\))438 1724 y Fk(14)47 b(Can't)f(find)h(catch)f (tag)h(for)g Fi(throwtag)438 1833 y Fk(15)g Fi(proc)g Fk(is)g(already)f(defined)438 1943 y(16)h(Stopped)438 2052 y(17)g(Already)f(dribbling)438 2162 y(18)h(File)g(system)f(error) 438 2271 y(19)h(Assuming)e(you)i(mean)g(IFELSE,)f(not)h(IF)95 b Fs(\(w)m(arning)30 b(only\))438 2381 y Fk(20)47 b Fi(var)g Fk(shadowed)e(by)j(local)e(in)h(procedure)e(call)95 b Fs(\(w)m(arning)30 b(only\))438 2491 y Fk(21)47 b(Throw)f("Error)438 2600 y(22)h Fi(proc)g Fk(is)g(a)g(primitive)438 2710 y(23)g(Can't)f(use)h(TO)g(inside)f(a)i(procedure)438 2819 y(24)f(I)g(don't)g(know)f(how)h(to)g Fi(proc)95 b Fs(\(not)31 b(reco)m(v)m(erable\))438 2929 y Fk(25)47 b(IFTRUE/IFFALSE)d(without)i(TEST)438 3039 y(26)h(Unexpected)e(']')438 3148 y(27)i(Unexpected)e('}')438 3258 y(28)i(Couldn't)e(initialize)g (graphics)438 3367 y(29)i(Macro)f(returned)g Fi(value)g Fk(instead)g(of)h(a)h(list)438 3477 y(30)f(You)g(don't)f(say)h(what)g (to)g(do)g(with)g Fi(value)438 3587 y Fk(31)g(Can)g(only)f(use)h(STOP)g (or)g(OUTPUT)f(inside)g(a)i(procedure)438 3696 y(32)f(APPLY)f(doesn't)g (like)h Fi(badthing)e Fk(as)i(input)438 3806 y(33)g(END)g(inside)f (multi-line)f(instruction)438 3915 y(34)i(Really)f(out)h(of)g(memory)94 b Fs(\(can't)32 b(b)s(e)d(caugh)m(t\))438 4025 y Fk(35)47 b(user-generated)d(error)i(message)g(\(THROW)g("ERROR)g Fi(message)p Fk(\))438 4134 y(36)h(END)g(inside)f(multi-line)f (instruction)438 4244 y(37)i(Bad)g(default)f(expression)f(for)i (optional)e(input:)h Fi(expr)438 4354 y Fk(38)h(Can't)f(use)h(OUTPUT)f (or)h(STOP)g(inside)f(RUNRESULT)438 4463 y(39)95 b(Assuming)45 b(you)i(meant)f('FD)h(100',)g(not)g(FD100)94 b Fs(\(or)30 b(similar\))438 4573 y Fk(40)47 b(I)g(can't)g(open)f(file)h Fi(filename)438 4682 y Fk(41)g(File)g Fi(filename)e Fk(already)h(open) 438 4792 y(42)h(File)g Fi(filename)e Fk(not)i(open)438 4902 y(43)g(Runlist)f([)p Fi(expr)g(expr)p Fk(])g(has)h(more)g(than)g (one)g(expression.)p eop end %%Page: 89 102 TeXDict begin 89 101 bop 3659 -116 a Fs(89)150 299 y Fp(11)80 b(Sp)t(ecial)53 b(V)-13 b(ariables)150 583 y Fs(Logo)41 b(tak)m(es)g(sp)s(ecial)f(action)h(if)e(an)m(y)h(of)g(the)f (follo)m(wing)i(v)-5 b(ariable)41 b(names)e(exists.)69 b(They)39 b(follo)m(w)i(the)150 692 y(normal)20 b(scoping)h(rules,)h (so)f(a)f(pro)s(cedure)f(can)i(lo)s(cally)h(set)f(one)f(of)h(them)f(to) h(limit)g(the)g(scop)s(e)f(of)g(its)h(e\013ect.)150 802 y(Initially)-8 b(,)47 b(no)41 b(v)-5 b(ariables)43 b(exist)g(except)f (for)g Fk(ALLOWGETSET)p Fs(,)g Fk(CASEIGNOREDP)p Fs(,)g(and)f Fk(UNBURYONEDIT)p Fs(,)150 911 y(whic)m(h)30 b(are)h Fk(TRUE)e Fs(and)h(buried.)150 1164 y Fr(allo)l(wgetset)390 1324 y Fk(ALLOWGETSET)1286 b(\(variable\))150 1492 y Fs(if)29 b Fk(TRUE)p Fs(,)g(indicates)h(that)g(an)f(attempt)i(to)f(use) f(a)h(pro)s(cedure)e(that)i(do)s(esn't)f(exist)h(should)f(b)s(e)f(tak)m (en)j(as)150 1601 y(an)h(implicit)h(getter)h(or)e(setter)i(pro)s (cedure)d(\(setter)i(if)g(the)f(\014rst)g(three)g(letters)i(of)e(the)g (name)h(are)f Fk(SET)p Fs(\))150 1711 y(for)e(a)h(v)-5 b(ariable)31 b(of)g(the)f(same)h(name)f(\(without)h(the)g Fk(SET)e Fs(if)h(appropriate\).)150 1918 y Fh(buttonact)390 2065 y Fk(BUTTONACT)1286 b(\(variable\))150 2233 y Fs(if)31 b(nonempt)m(y)-8 b(,)31 b(should)f(b)s(e)g(an)g(instruction)h(list)g (that)g(will)g(b)s(e)f(ev)-5 b(aluated)32 b(whenev)m(er)f(a)g(mouse)f (button)150 2342 y(is)39 b(pressed.)65 b(Note)40 b(that)g(the)f(user)f (ma)m(y)h(ha)m(v)m(e)h(released)g(the)f(button)f(b)s(efore)h(the)g (instructions)g(are)150 2452 y(ev)-5 b(aluated.)42 b Fk(BUTTON)27 b Fs(will)i(still)h(output)f(whic)m(h)g(button)g(w)m(as)g (most)h(recen)m(tly)g(pressed.)40 b Fk(CLICKPOS)27 b Fs(will)150 2562 y(output)33 b(the)h(p)s(osition)g(of)g(the)f(mouse)h (cursor)f(at)h(the)g(momen)m(t)g(the)g(button)f(w)m(as)h(pressed;)h (this)e(ma)m(y)150 2671 y(b)s(e)d(di\013eren)m(t)h(from)e Fk(MOUSEPOS)g Fs(if)h(the)g(user)g(mo)m(v)m(es)i(the)e(mouse)h(after)g (clic)m(king.)150 2839 y(Note)26 b(that)g(it's)g(p)s(ossible)f(for)f (the)i(user)e(to)i(press)e(a)i(button)f(during)e(the)j(ev)-5 b(aluation)26 b(of)g(the)f(instruction)150 2948 y(list.)58 b(If)35 b(this)h(w)m(ould)g(confuse)f(y)m(our)h(program,)h(prev)m(en)m (t)g(it)f(b)m(y)g(temp)s(orarily)g(setting)h Fk(BUTTONACT)c Fs(to)150 3058 y(the)e(empt)m(y)f(list.)42 b(One)30 b(easy)h(w)m(a)m(y) g(to)g(do)f(that)h(is)g(the)f(follo)m(wing:)390 3226 y Fk(make)47 b("buttonact)e([button.action])390 3445 y(to)i(button.action)d([:buttonact)h([]])390 3555 y(...)i(;)g(whatever) f(you)h(want)f(the)h(button)f(to)i(do)390 3664 y(end)150 3872 y Fh(caseignoredp)390 4018 y Fk(CASEIGNOREDP)1524 b(\(variable\))150 4186 y Fs(if)42 b Fk(TRUE)p Fs(,)h(indicates)g(that) g(lo)m(w)m(er)g(case)f(and)g(upp)s(er)d(case)k(letters)g(should)e(b)s (e)g(considered)h(equal)g(b)m(y)150 4296 y Fk(EQUALP)p Fs(,)29 b Fk(BEFOREP)p Fs(,)g Fk(MEMBERP)p Fs(,)f(etc.)42 b(Logo)32 b(initially)f(mak)m(es)h(this)e(v)-5 b(ariable)31 b Fk(TRUE)p Fs(,)e(and)h(buries)g(it.)150 4463 y(See)h([EQUALP],)f (page)h(14,)h(,)e([BEF)m(OREP],)i(page)f(15,)h(,)e([MEMBERP],)i(page)f (15,)g(.)150 4671 y Fh(commandline)390 4818 y Fk(COMMANDLINE)1524 b(\(variable\))150 4986 y Fs(con)m(tains)32 b(an)m(y)e(text)i(app)s (earing)e(after)h(a)f(h)m(yphen)f(on)i(the)f(command)g(line)h(used)f (to)h(start)g(Logo.)150 5193 y Fh(erract)390 5340 y Fk(ERRACT)1812 b(\(variable\))p eop end %%Page: 90 103 TeXDict begin 90 102 bop 150 -116 a Fs(90)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(an)d(instructionlist)h(that)g(will)g(b)s(e)e (run)g(in)h(the)h(ev)m(en)m(t)g(of)g(an)f(error.)39 b(T)m(ypically)29 b(has)e(the)g(v)-5 b(alue)28 b Fk([PAUSE])150 408 y Fs(to)j(allo)m(w)h (in)m(teractiv)m(e)h(debugging.)150 576 y(See)e([P)-8 b(A)m(USE],)31 b(page)g(70,)h(.)150 785 y Fh(fullprin)m(tp)390 932 y Fk(FULLPRINTP)1477 b(\(variable\))150 1100 y Fs(if)29 b Fk(TRUE)p Fs(,)f(then)g(w)m(ords)g(that)h(w)m(ere)g(created)h(using)e (bac)m(kslash)h(or)g(v)m(ertical)h(bar)e(\(to)i(include)e(c)m (haracters)150 1209 y(that)38 b(w)m(ould)f(otherwise)h(not)f(b)s(e)g (treated)h(as)g(part)f(of)g(a)h(w)m(ord\))f(are)h(prin)m(ted)f(with)g (the)g(bac)m(kslashes)150 1319 y(or)32 b(v)m(ertical)i(bars)d(sho)m (wn,)h(so)g(that)g(the)g(prin)m(ted)g(result)g(could)f(b)s(e)h(re-read) g(b)m(y)f(Logo)i(to)g(pro)s(duce)e(the)150 1428 y(same)d(v)-5 b(alue.)41 b(If)27 b(FULLPRINTP)h(is)g Fk(TRUE)f Fs(then)h(the)g(empt)m (y)g(w)m(ord)g(\(ho)m(w)m(ev)m(er)i(it)f(w)m(as)f(created\))h(prin)m (ts)150 1538 y(as)i Fk(||)p Fs(.)40 b(\(Otherwise)30 b(it)h(prin)m(ts)f(as)h(nothing)f(at)h(all.\))150 1747 y Fh(k)m(ey)m(act)390 1894 y Fk(KEYACT)1478 b(\(variable\))150 2061 y Fs(if)31 b(nonempt)m(y)-8 b(,)31 b(should)f(b)s(e)g(an)g (instruction)h(list)h(that)f(will)g(b)s(e)f(ev)-5 b(aluated)32 b(whenev)m(er)f(a)g(k)m(ey)g(is)g(pressed)150 2171 y(on)g(the)h(k)m (eyb)s(oard.)43 b(The)31 b(instruction)h(list)g(can)g(use)f Fk(READCHAR)e Fs(to)j(\014nd)e(out)h(what)h(k)m(ey)g(w)m(as)g(pressed.) 150 2280 y(Note)g(that)g(only)f(k)m(eys)h(that)f(pro)s(duce)f(c)m (haracters)j(qualify;)e(pressing)g Fk(SHIFT)e Fs(or)j Fk(CONTROL)d Fs(alone)j(will)150 2390 y(not)f(cause)g Fk(KEYACT)d Fs(to)j(b)s(e)f(ev)-5 b(aluated.)150 2558 y(Note)35 b(that)f(it's)g(p)s(ossible)f(for)g(the)h(user)f(to)h(press)f (a)g(k)m(ey)i(during)d(the)i(ev)-5 b(aluation)35 b(of)e(the)h (instruction)150 2667 y(list.)54 b(If)35 b(this)f(w)m(ould)h(confuse)f (y)m(our)h(program,)h(prev)m(en)m(t)f(it)g(b)m(y)g(temp)s(orarily)g (setting)g Fk(KEYACT)e Fs(to)j(the)150 2777 y(empt)m(y)31 b(list.)41 b(One)30 b(easy)h(w)m(a)m(y)g(to)h(do)e(that)h(is)f(the)h (follo)m(wing:)390 2945 y Fk(make)47 b("keyact)e([key.action])390 3164 y(to)i(key.action)e([:keyact)h([]])390 3273 y(...)h(;)g(whatever)f (you)h(want)f(the)h(key)g(to)g(do)390 3383 y(end)150 3592 y Fh(loadnoisily)390 3739 y Fk(LOADNOISILY)1572 b(\(variable\))150 3906 y Fs(if)41 b Fk(TRUE)p Fs(,)i(prin)m(ts)d(the)h (names)g(of)g(pro)s(cedures)f(de\014ned)g(when)g(loading)i(from)e(a)i (\014le)f(\(including)g(the)150 4016 y(temp)s(orary)30 b(\014le)g(made)h(b)m(y)f Fk(EDIT)p Fs(\).)150 4184 y(See)h([EDIT],)f (page)i(61,)f(.)150 4392 y Fh(prin)m(tdepthlimit)390 4539 y Fk(PRINTDEPTHLIMIT)1380 b(\(variable\))150 4707 y Fs(if)41 b(a)h(nonnegativ)m(e)i(in)m(teger,)i(indicates)c(the)g (maxim)m(um)f(depth)g(of)g(sublist)h(structure)f(that)h(will)g(b)s(e) 150 4817 y(prin)m(ted)30 b(b)m(y)g Fk(PRINT)p Fs(,)f(etc.)150 4984 y(See)i([PRINT],)f(page)h(19,)h(.)150 5193 y Fh(prin)m(t)m (widthlimit)390 5340 y Fk(PRINTWIDTHLIMIT)1380 b(\(variable\))p eop end %%Page: 91 104 TeXDict begin 91 103 bop 150 -116 a Fs(Chapter)30 b(11:)41 b(Sp)s(ecial)31 b(V)-8 b(ariables)2325 b(91)150 299 y(if)35 b(a)h(nonnegativ)m(e)g(in)m(teger,)i(indicates)e(the)g(maxim)m(um)f(n)m (um)m(b)s(er)e(of)j(mem)m(b)s(ers)e(in)h(an)m(y)g(one)h(list)f(that)150 408 y(will)c(b)s(e)e(prin)m(ted)h(b)m(y)h Fk(PRINT)p Fs(,)e(etc.)150 576 y(See)i([PRINT],)f(page)h(19,)h(.)150 775 y Fh(redefp)390 922 y Fk(REDEFP)1812 b(\(variable\))150 1090 y Fs(if)30 b Fk(TRUE)p Fs(,)g(allo)m(ws)i(primitiv)m(es)f(to)g(b)s (e)e(erased)i(\()p Fk(ERASE)p Fs(\))f(or)g(rede\014ned)f(\()p Fk(COPYDEF)p Fs(\).)150 1258 y(See)i([ERASE],)f(page)h(57,)h(,)e ([COPYDEF],)h(page)g(51,)h(.)150 1457 y Fh(startup)390 1604 y Fk(STARTUP)1764 b(\(variable\))150 1772 y Fs(if)31 b(assigned)g(a)g(list)h(v)-5 b(alue)32 b(in)e(a)i(\014le)f(loaded)g(b)m (y)g Fk(LOAD)p Fs(,)f(that)i(v)-5 b(alue)31 b(is)g(run)f(as)h(an)g (instructionlist)g(after)150 1881 y(the)g(loading.)150 2049 y(See)g([LO)m(AD],)g(page)g(63,)h(.)150 2248 y Fh(un)m(bury)m (onedit)390 2395 y Fk(UNBURYONEDIT)1333 b(\(variable\))150 2563 y Fs(if)34 b Fk(TRUE)p Fs(,)g(causes)g(an)m(y)h(pro)s(cedure)e (de\014ned)f(during)h Fk(EDIT)g Fs(or)h Fk(LOAD)f Fs(to)h(b)s(e)g(un)m (buried,)f(so)h(that)h(it)g(will)150 2672 y(b)s(e)29 b(sa)m(v)m(ed)i(b)m(y)e(a)h(later)g Fk(SAVE)p Fs(.)40 b(Files)30 b(that)g(w)m(an)m(t)h(to)f(de\014ne)f(and)g(bury)f(pro)s (cedures)g(m)m(ust)i(do)f(it)h(in)f(that)150 2782 y(order.)150 2950 y(See)i([EDIT],)f(page)i(61,)f(,)g(See)f([LO)m(AD],)i(page)f(63,)h (,)e(See)h([SA)-10 b(VE],)30 b(page)h(62,)h(.)150 3149 y Fh(usealternatenames)390 3296 y Fk(USEALTERNATENAMES)43 b(\(variable\))150 3464 y Fs(if)e Fk(TRUE)p Fs(,)i(causes)f(Logo)g(to)g (generate)g(non-English)f(w)m(ords)g(\(from)g(the)g Fk(Messages)e Fs(\014le\))i(instead)h(of)150 3573 y Fk(TRUE)p Fs(,)29 b Fk(FALSE)p Fs(,)h Fk(END)p Fs(,)f(etc.)150 3741 y(Logo)i(pro)m(vides) g(the)f(follo)m(wing)i(buried)d(v)-5 b(ariables)31 b(that)g(can)g(b)s (e)f(used)f(b)m(y)i(programs:)150 3940 y Fh(logo)m(v)m(ersion)390 4087 y Fk(LOGOVERSION)1667 b(\(variable\))150 4255 y Fs(a)31 b(real)g(n)m(um)m(b)s(er)e(indicating)i(the)g(Logo)g(v)m (ersion)g(n)m(um)m(b)s(er,)e(e.g.,)j(5.5)150 4454 y Fh(logoplatform)390 4601 y Fk(LOGOPLATFORM)1667 b(\(variable\))150 4769 y Fs(one)31 b(of)f(the)h(follo)m(wing)h(w)m(ords:)40 b Fk(wxWidgets)p Fs(,)28 b Fk(X11)p Fs(,)i Fk(Windows)p Fs(,)e(or)j Fk(Unix-nographics)p Fs(.)p eop end %%Page: 92 105 TeXDict begin 92 104 bop eop end %%Page: 93 106 TeXDict begin 93 105 bop 3659 -116 a Fs(93)150 299 y Fp(12)80 b(In)l(ternationalization)150 639 y Fs(Berk)m(eley)25 b(Logo)f(has)e(limited)i(supp)s(ort)d(for)i(non-English-sp)s(eaking)f (users.)38 b(Alas,)25 b(there)e(is)g(no)g(Unico)s(de)150 749 y(supp)s(ort,)29 b(and)h(high-bit-on)g(ASCI)s(I)f(co)s(des)i(w)m (ork)f(in)g(some)h(con)m(texts)h(but)e(not)g(others.)150 917 y(If)e(y)m(ou)h(w)m(an)m(t)h(to)f(translate)h(Berk)m(eley)h(Logo)f (for)e(use)h(with)f(another)h(language,)i(there)e(are)g(three)g(main) 150 1026 y(things)h(y)m(ou)h(ha)m(v)m(e)h(to)f(do:)390 1194 y Fk(1.)47 b(Primitive)e(names)390 1303 y(2.)i(Error)g(\(and)f (other\))g(messages)390 1413 y(3.)h(Documentation)150 1581 y Fs(F)-8 b(or)28 b(primitiv)m(e)g(names,)g(the)f(easiest)i(thing) e(is)g(to)h(pro)m(vide)g(a)f(startup)g(\014le)g(that)h(de\014nes)e (aliases)j(for)e(the)150 1690 y(English)j(primitiv)m(e)h(names,)g (using)f Fk(COPYDEF)p Fs(:)390 1858 y Fk(COPYDEF)46 b("AVANT)g ("FORWARD)150 2026 y Fs(This)27 b(should)f(tak)m(e)k(care)e(of)g(it,)h (unless)e(y)m(our)g(language's)j(name)d(for)h(one)g(primitiv)m(e)g(is)g (sp)s(elled)f(lik)m(e)i(the)150 2135 y(English)f(name)g(of)h(a)f (di\013eren)m(t)h(primitiv)m(e.)41 b(In)28 b(that)h(case)g(y)m(ou)g(ha) m(v)m(e)g(to)g(turn)e Fk(REDEFP)g Fs(on)h(and)g(b)s(e)g(sure)150 2245 y(to)j(cop)m(y)g(the)g(non-con\015icting)g(name)f(b)s(efore)g(o)m (v)m(erwriting)i(the)f(con\015icting)g(one!)150 2413 y Fk(")p Fs(Primitiv)m(es)p Fk(")j Fs(that)h(are)f(actually)i(in)d(the) h(Logo)h(library)-8 b(,)35 b(of)f(course,)h(can)g(just)e(b)s(e)g (replaced)h(or)g(aug-)150 2522 y(men)m(ted)d(with)f(nativ)m (e-language-named)j(Logo)f(pro)s(cedures)d(and)h(\014lenames.)150 2690 y(Of)k(course)h(Logo)h(programs)f(will)g(still)h(not)f(lo)s(ok)g (lik)m(e)i(y)m(our)e(nativ)m(e)h(language)g(if)f(the)g(w)m(ord)f(order) h(is)150 2800 y(dramatically)d(di\013eren)m(t,)f(esp)s(ecially)h(if)e (y)m(ou)h(don't)f(put)g(v)m(erbs)g(b)s(efore)g(their)g(ob)5 b(jects.)150 2967 y(F)-8 b(or)33 b(error)f(messages,)j(there)d(is)h(a)g (\014le)f(named)g Fk(Messages)f Fs(in)h(the)h Fk(logolib)d Fs(directory)j(with)f(texts)i(of)150 3077 y(messages,)c(one)e(p)s(er)e (line.)40 b(Y)-8 b(ou)29 b(can)f(replace)g(this)g(with)g(a)g(\014le)f (for)h(y)m(our)g(o)m(wn)f(language.)42 b(Do)28 b(not)g(add,)150 3186 y(delete,)40 b(or)d(reorder)g(lines;)k(Logo)d(\014nds)d(messages)j (b)m(y)f(line)h(n)m(um)m(b)s(er.)59 b(The)37 b(sequences)g Fk(\045p)p Fs(,)h Fk(\045s)p Fs(,)h(and)150 3296 y Fk(\045t)30 b Fs(in)g(these)g(messages)h(represen)m(t)g(v)-5 b(ariable)31 b(parts)f(of)g(the)h(message)g(and)f(should)f(not)h(b)s(e)g (translated.)150 3406 y(\(\045p)i Fk(PRINT)p Fs(s)f(the)h(v)-5 b(ariable)33 b(part,)g(while)g(\045s)f Fk(SHOW)p Fs(s)f(it)i({)f(that)h (is,)h(the)e(di\013erence)h(is)f(ab)s(out)h(whether)150 3515 y(or)f(not)h(brac)m(k)m(ets)h(are)f(sho)m(wn)f(surrounding)e(a)j (list.)47 b(\045t)33 b(means)f(that)h(the)g(v)-5 b(ariable)33 b(part)g(is)f(a)h(C)f(text)150 3625 y(string)27 b(rather)f(than)h(a)g (Logo)g(ob)5 b(ject.\))41 b(If)26 b(y)m(ou)h(w)m(an)m(t)h(to)f(c)m (hange)h(the)f(order)f(of)h(t)m(w)m(o)h(v)-5 b(ariable)27 b(parts)g(\(no)150 3734 y(reorderable)k(message)g(has)f(more)h(than)f (t)m(w)m(o\),)i(y)m(ou)f(w)m(ould)f(for)g(example)h(replace)g(the)g (line)390 3902 y Fk(\045p)47 b(doesn't)f(like)h(\045s)g(as)g(input)150 4070 y Fs(with)390 4237 y Fk(\045+s)g(is)g(a)h(lousy)e(input)g(to)h (\045p)150 4405 y Fs(The)32 b(plus)f(sign)h(tells)h(the)g(message)g (prin)m(ter)f(to)h(rev)m(erse)g(the)f(order;)h(y)m(ou)g(m)m(ust)f(rev)m (erse)h(the)f(order)g(of)150 4515 y(\045p)24 b(and)h(\045s,)g(if)g(b)s (oth)g(are)g(used,)g(to)h(matc)m(h.)40 b(The)24 b(plus)g(sign)h(go)s (es)h(just)e(after)i(the)f(\014rst)f(p)s(ercen)m(t)h(sign)g(in)150 4624 y(the)h(message,)i(whic)m(h)d(migh)m(t)h(not)g(b)s(e)f(at)h(the)f (b)s(eginning)g(of)h(the)g(line.)39 b(The)25 b(sequence)h Fk(\\n)f Fs(in)g(a)h(message)150 4734 y(represen)m(ts)j(a)h(newline;)g (don't)f(b)s(e)g(fo)s(oled)h(in)m(to)g(thinking)f(that)h(the)g Fk(n)f Fs(is)g(part)g(of)h(the)f(follo)m(wing)i(w)m(ord.)150 4902 y(Some)40 b(messages)h(app)s(ear)f(t)m(wice)i(in)e(the)g(\014le;) 45 b(this)40 b(isn't)h(a)f(mistak)m(e.)72 b(The)40 b(t)m(w)m(o)h (spaces)g(b)s(efore)f Fk(to)150 5011 y Fs(in)34 b Fk(I)c(don't)f(know)g (how\\)g(\\)h(to)k Fs(aren't)g(a)g(mistak)m(e)i(either.)52 b(The)34 b(message)h(con)m(taining)g(just)f Fk(\045p)f Fs(is)h(for)150 5121 y(user-pro)m(vided)g(error)g(messages)i(in)f Fk(THROW)29 b("ERROR)n Fs(.)54 b(The)34 b(message)i Fk("\\)30 b(\\)g(in)g(\045s\\n\045s")i Fs(is)j(the)g(part)150 5230 y(of)g(all)h(error)f(messages)h(that)g(indicates)g(where)f(the)g(error) g(o)s(ccurred)f(if)h(it)h(w)m(as)f(inside)g(a)h(pro)s(cedure;)150 5340 y(y)m(ou)26 b(migh)m(t)h(w)m(an)m(t)g(to)g(c)m(hange)g(the)f(w)m (ord)g Fk(in)g Fs(to)g(y)m(our)g(language.)41 b Fk(\045s)30 b(defined\\n)23 b Fs(is)k(what)f Fk(LOAD)e Fs(prin)m(ts)p eop end %%Page: 94 107 TeXDict begin 94 106 bop 150 -116 a Fs(94)2551 b(BERKELEY)30 b(LOGO)g(6.1)150 299 y(for)e(eac)m(h)h(pro)s(cedure)d(de\014ned)h(if)h (the)g(v)-5 b(ariable)29 b Fk(LOADNOISILY)24 b Fs(is)k Fk(TRUE)p Fs(.)39 b Fk("to)30 b(\045p\\nend\\n\\n")24 b Fs(is)k(what)150 408 y Fk(EDIT)h Fs(puts)h(in)g(the)g(temp)s(orary)g (\014le)h(if)f(y)m(ou)h(ask)f(to)i(edit)e(a)h(pro)s(cedure)e(that)i (isn't)g(already)g(de\014ned.)150 576 y(Also)j(in)f(the)h Fk(Messages)d Fs(\014le)i(are)h(lines)g(con)m(taining)h(only)e(one)h(w) m(ord)f(eac)m(h;)k(the)c(\014rst)g(of)g(these)h(is)g(the)150 686 y(w)m(ord)c Fk(true)p Fs(.)40 b(Some)31 b(of)f(these)h(w)m(ords)f (are)h(recognized)h(b)m(y)f(Logo)g(in)f(user)g(input;)g(some)h(are)g (generated)150 795 y(b)m(y)26 b(Logo;)j(some)d(are)g(b)s(oth.)39 b(F)-8 b(or)27 b(example,)g(the)g(w)m(ords)e Fk(TRUE)g Fs(and)g Fk(FALSE)g Fs(are)h(recognized)h(as)g(Bo)s(olean)150 905 y(v)-5 b(alues)38 b(b)m(y)f Fk(IF)g Fs(and)g Fk(IFELSE)p Fs(,)h(and)e(are)i(also)h(generated)f(b)m(y)f(Logo)i(as)f(outputs)f (from)g(the)g(primitiv)m(e)150 1015 y(predicates)27 b(suc)m(h)f(as)g Fk(EQUALP)p Fs(.)38 b(The)25 b(w)m(ord)h Fk(END)f Fs(is)h(recognized)i (as)e(the)h(end)e(of)h(a)h(pro)s(cedure)e(de\014nition,)150 1124 y(and)30 b(ma)m(y)h(b)s(e)f(generated)i(when)d(Logo)j (reconstructs)f(a)g(pro)s(cedure)e(b)s(o)s(dy)g(for)i Fk(PO)f Fs(or)g Fk(EDIT)p Fs(.)40 b(I'v)m(e)32 b(used)150 1234 y(capital)25 b(letters)g(in)e(this)h(paragraph)f(for)h(easier)g (reading,)i(but)d(the)g(w)m(ords)h(in)f(the)h Fk(Messages)d Fs(\014le)j(should)150 1343 y(b)s(e)30 b(in)g(lo)m(w)m(er)h(case.)150 1511 y(If)36 b(y)m(ou)g(replace)h(these)f(with)g(non-English)g(w)m (ords,)h(Logo)g(will)f Fg(r)-5 b(e)g(c)g(o)g(gnize)45 b Fs(b)s(oth)35 b(the)h(English)g(names)150 1621 y(and)28 b(y)m(our)h(alternate)i(names.)40 b(F)-8 b(or)30 b(example,)g(if)f(y)m (ou)g(replace)h(the)f(w)m(ord)f Fk(true)g Fs(with)h Fk(vrai)e Fs(then)i(Logo)150 1730 y(will)i(understand)d(b)s(oth)i(of)g(these:)390 1898 y Fk(IF)47 b("TRUE)g([PRINT)f("YES])390 2007 y(IF)h("VRAI)g ([PRINT)f("YES])150 2175 y Fs(The)39 b(v)-5 b(ariable)41 b Fk(UseAlternateNames)34 b Fs(determines)40 b(whether)f(Logo)i(will)f Fg(gener)-5 b(ate)47 b Fs(other-language)150 2285 y(names)31 b({)h(for)f(example,)i(whether)d(predicate)i(functions)f(return)f(the)i (other-language)h(alternates)g(for)150 2394 y Fk(TRUE)27 b Fs(and)g Fk(FALSE)p Fs(.)38 b(This)27 b(v)-5 b(ariable)29 b(is)f Fk(FALSE)e Fs(b)m(y)i(default,)g(meaning)g(that)h(the)f(English) f(w)m(ords)g(will)i(b)s(e)150 2504 y(generated.)150 2672 y(Y)-8 b(ou)46 b(migh)m(t)g(wish)e(to)i(ha)m(v)m(e)h(English-named)e (predicate)h(functions)f(generate)h(English)f Fk(TRUE)g Fs(and)150 2781 y Fk(FALSE)p Fs(,)35 b(while)h(other-language-named)h (predicates)f(generate)h(the)e(alternate)i(w)m(ords.)55 b(This)35 b(can)h(b)s(e)150 2891 y(done)26 b(b)m(y)h(lea)m(ving)h Fk(UseAlternateNames)22 b Fs(false,)28 b(and)e(instead)h(of)g (de\014ning)e(the)i(other-language)i(pred-)150 3000 y(icates)j(with)e Fk(COPYDEF)p Fs(,)f(do)h(it)h(this)f(w)m(a)m(y:)390 3168 y Fk(to)47 b(french.boolean)d(:bool)390 3278 y(if)j(equalp)f(:bool)h ("true)f([output)g("vrai])390 3387 y(if)h(equalp)f(:bool)h("false)f ([output)g("faux])390 3497 y(output)g(:bool)g(;)i(shouldn't)d(happen) 390 3606 y(end)390 3826 y(to)i(make.french.predicate)42 b(:french)k(:english)g(:arity)390 3935 y(define)g(:french)g (`[[[inputs])f(,[:arity]])1201 4045 y([output)h(french.boolean)581 4154 y(apply)g(,[word)g("")i(:english])d(:inputs]])390 4264 y(end)390 4483 y(?)i(make.french.predicate)42 b("egal?)47 b("equal?)e(2)390 4593 y(?)i(pr)h(egal?)e(3)h(4)390 4702 y(faux)390 4812 y(?)g(pr)h(egal?)e(4)h(4)390 4922 y(vrai)390 5031 y(?)g(pr)h(equal?)e(3)h(4)390 5141 y(false)390 5250 y(?)g(pr)h(equal?)e(4)h(4)p eop end %%Page: 95 108 TeXDict begin 95 107 bop 3659 -116 a Fs(95)390 299 y Fk(true)150 467 y Fs(The)28 b(third)f(input)g(to)i Fk (make.french.predicate)23 b Fs(is)28 b(the)h(n)m(um)m(b)s(er)d(of)j (inputs)e(that)i(the)f(predicate)h(ex-)150 576 y(p)s(ects.)39 b(This)26 b(solution)h(isn't)f(quite)h(p)s(erfect)f(b)s(ecause)g(the)h (in\014x)e(predicates)i(\()p Fk(=)p Fs(,)g Fk(<)p Fs(,)g Fk(>)p Fs(\))g(will)f(still)h(output)150 686 y(in)d(English.)38 b(If)24 b(y)m(ou)h(w)m(an)m(t)g(them)g(to)g(generate)h (alternate-language)h(w)m(ords,)f(set)f Fk(UseAlternateNames)150 795 y Fs(to)31 b Fk(TRUE)e Fs(instead.)150 963 y(Some)24 b(of)h(the)f(w)m(ords)g(in)g(this)g(section)h(of)g(the)f Fk(Messages)e Fs(\014le)j(are)f(names)g(of)h(Logo)g(primitiv)m(es)g(\() p Fk(OUTPUT)p Fs(,)150 1073 y Fk(STOP)p Fs(,)g Fk(GOTO)p Fs(,)h Fk(TAG)p Fs(,)f Fk(IF)p Fs(,)h Fk(IFELSE)p Fs(,)f Fk(TO)p Fs(,)h Fk(.MACRO)p Fs(\).)38 b(T)-8 b(o)26 b(translate)g(these) g(names,)g(y)m(ou)g(m)m(ust)f(use)g Fk(COPYDEF)150 1182 y Fs(as)k(describ)s(ed)e(earlier,)j(in)e(addition)h(to)g(c)m(hanging)g (the)g(names)f(in)g Fk(Messages)p Fs(.)38 b(Y)-8 b(ou)29 b(should)f(b)s(e)f(consis-)150 1292 y(ten)m(t)k(in)f(these)h(t)m(w)m(o) h(steps.)41 b(Don't)31 b(forget)g(the)g(p)s(erio)s(d)e(in)h Fk(.macro)p Fs(!)150 1460 y(F)-8 b(or)40 b(do)s(cumen)m(tation,)j (there)d(are)g(t)m(w)m(o)g(kinds:)58 b(this)40 b(man)m(ual)f(and)g(the) h(help)f(\014les.)68 b(The)39 b(latter)i(are)150 1569 y(generated)35 b(automatically)j(from)c(this)g(man)m(ual)h(if)f(y)m(ou) h(ha)m(v)m(e)g(a)g(Unix)g(system,)g(so)g(in)f(that)h(case)h(y)m(ou)150 1679 y(need)26 b(only)g(translate)h(this)f(man)m(ual,)i(main)m(taining) f(the)f(format.)40 b(\(The)26 b(automatic)i(help\014le)e(generator)150 1788 y(notices)i(things)e(lik)m(e)j(capital)f(letters,)h(tabs,)f(h)m (yphens,)e(and)g(equal)h(signs)g(at)g(the)g(b)s(eginnings)f(of)h (lines.\))150 1898 y(The)33 b(program)h Fk(makefile.c)d Fs(ma)m(y)k(require)e(mo)s(di\014cation)h(b)s(ecause)g(a)h(few)e(of)h (the)g(primitiv)m(e)h(names)150 2007 y(are)c(sp)s(ecial)g(cases)g (\(e.g.,)h Fk(LOG10)d Fs(is)i(the)f(only)h(name)f(with)g(digits)h (included\).)150 2175 y(If)g(y)m(ou)h(don't)g(ha)m(v)m(e)h(Unix)e(to)s (ols,)i(y)m(ou)f(can)g(just)f(translate)i(eac)m(h)g(help\014le)e (individually)-8 b(.)45 b(A)32 b(p)s(erio)s(d)e(in)150 2285 y(a)f(primitiv)m(e)h(name)e(is)h(represen)m(ted)g(as)g(a)g Fk(D)f Fs(in)g(the)h(\014lename;)h(there)f(are)g(no)f(\014les)h(for)f (question)h(marks)150 2394 y(b)s(ecause)h(the)g Fk(HELP)e Fs(command)i(lo)s(oks)g(for)g(the)g(\014le)f(named)h(after)g(the)g (corresp)s(onding)f(primitiv)m(e)h(that)150 2504 y(ends)g(in)g Fk(P)p Fs(.)p eop end %%Page: 96 109 TeXDict begin 96 108 bop eop end %%Page: 97 110 TeXDict begin 97 109 bop 3659 -116 a Fs(97)150 299 y Fp(INDEX)146 610 y Fr(*)150 735 y Fc(*)20 b Fb(:)13 b(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)34 b Fc(29)146 1032 y Fr(+)150 1157 y Fa(+)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)33 b Fc(29)146 1454 y Fr({)150 1579 y Fc(-)9 b Fb(:)j(:)h(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)23 b Fc(29)146 1876 y Fr(.)150 2001 y Fc(.defmacro)12 b Fb(:)i(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fc(83)150 2091 y(.eq)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fc(15)150 2181 y(.macro)11 b Fb(:)j(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)25 b Fc(83)150 2271 y(.ma)n(yb)r(eoutput)10 b Fb(:)i(:)h(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fc(71)150 2362 y(.setbf)16 b Fb(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)30 b Fc(13)150 2452 y(.set\014rst)17 b Fb(:)c(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)31 b Fc(13)150 2542 y(.setitem)8 b Fb(:)14 b(:)g(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)23 b Fc(13)150 2632 y(.setsegmen)n(tsize)7 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)21 b Fc(65)146 2950 y Fr(/)150 3075 y Fc(/)f Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)34 b Fc(29)146 3372 y Fo(<)150 3497 y Fa(<)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)33 b Fc(32)150 3587 y Fa(<)p Fc(=)23 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)37 b Fc(32)150 3677 y Fa(<>)16 b Fb(:)e(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) 31 b Fc(15)146 3974 y Fr(=)150 4099 y Fc(=)9 b Fb(:)j(:)i(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)23 b Fc(14)146 4396 y Fo(>)150 4521 y Fa(>)c Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)33 b Fc(32)150 4611 y Fa(>)p Fc(=)23 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)37 b Fc(32)146 4908 y Fr(`)150 5033 y Fc(`)11 b Fb(:)i(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)25 b Fc(72)2021 610 y Fr(A)2025 741 y Fc(allop)r(en)c Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)35 b Fc(23)2025 834 y(Allo)n(wGetSet)17 b Fb(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)32 b Fc(4)2025 926 y(allo)n(wgetset)7 b Fb(:)16 b(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)22 b Fc(89)2025 1018 y(and)11 b Fb(:)h(:)h(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)25 b Fc(35)2025 1110 y(apply)14 b Fb(:)e(:)h(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28 b Fc(76)2025 1202 y(arc)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fc(39)2025 1294 y(arctan)17 b Fb(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 b Fc(31)2025 1386 y(arit)n(y)11 b Fb(:)h(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fc(55)2025 1478 y(arra)n(y)c Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)36 b Fc(9)2025 1570 y(arra)n(y?)18 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)33 b Fc(14)2025 1663 y(arra)n(yp)15 b Fb(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b Fc(14)2025 1755 y(arra)n(ytolist)20 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fc(10)2025 1847 y(ascii)17 b Fb(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)31 b Fc(16)2025 1939 y(ashift)14 b Fb(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fc(34)2021 2280 y Fr(B)2025 2412 y Fc(bac)n(k)13 b Fb(:)f(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fc(37)2025 2504 y(bac)n(kground)15 b Fb(:)d(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)29 b Fc(46)2025 2596 y(b)r(efore?)21 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)35 b Fc(15)2025 2688 y(b)r(eforep)17 b Fb(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)32 b Fc(15)2025 2780 y(bf)22 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37 b Fc(11)2025 2872 y(bfs)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fc(11)2025 2964 y(bg)15 b Fb(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)29 b Fc(46)2025 3056 y(bitand)15 b Fb(:)d(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)29 b Fc(33)2025 3149 y(bitnot)21 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 b Fc(34)2025 3241 y(bitor)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)23 b Fc(33)2025 3333 y(bitxor)f Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37 b Fc(33)2025 3425 y(bk)14 b Fb(:)e(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28 b Fc(37)2025 3517 y(bl)6 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)21 b Fc(12)2025 3609 y(buried)c Fb(:)12 b(:)i(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 b Fc(54)2025 3701 y(buried?)16 b Fb(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)30 b Fc(60)2025 3793 y(buriedp)13 b Fb(:)f(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fc(60)2025 3885 y(bury)12 b Fb(:)f(:)j(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)26 b Fc(59)2025 3978 y(bury)n(all)6 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)21 b Fc(59)2025 4070 y(buryname)7 b Fb(:)12 b(:)h(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)22 b Fc(59)2025 4162 y(but\014rst)17 b Fb(:)12 b(:)h(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)31 b Fc(11)2025 4254 y(but\014rsts)18 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fc(11)2025 4346 y(butlast)6 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fc(12)2025 4438 y(button)11 b Fb(:)h(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fc(47)2025 4530 y(button?)10 b Fb(:)i(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fc(47)2025 4622 y(buttonact)11 b Fb(:)h(:)h(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fc(89)2025 4715 y(buttonp)6 b Fb(:)12 b(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)21 b Fc(47)2025 4807 y(b)n(y)n(e)16 b Fb(:)c(:)h(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)31 b Fc(71)p eop end %%Page: 98 111 TeXDict begin 98 110 bop 150 -116 a Fs(98)2551 b(BERKELEY)30 b(LOGO)g(6.1)146 299 y Fr(C)150 416 y Fc(cascade)15 b Fb(:)f(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)29 b Fc(79)150 504 y(cascade.2)21 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)33 b Fc(81)150 591 y(case)22 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fc(74)150 679 y(case-insensitiv)n(e)8 b Fb(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) 23 b Fc(6)150 767 y(caseignoredp)12 b Fb(:)j(:)e(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)27 b Fc(89)150 854 y(catc)n(h)18 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fc(69)150 942 y(c)n(har)18 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)32 b Fc(17)150 1029 y(clean)22 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(40)150 1117 y(clearscreen)10 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)25 b Fc(40)150 1205 y(cleartext)12 b Fb(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fc(26)150 1292 y(clic)n(kp)r(os)9 b Fb(:)14 b(:)f(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)24 b Fc(47)150 1380 y(close)10 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fc(23)150 1467 y(closeall)e Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fc(23)150 1555 y(co)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) 34 b Fc(70)150 1643 y(com)n(bine)20 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)35 b Fc(10)150 1730 y(commandline)22 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(89)150 1818 y(commen)n(ts)9 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)24 b Fc(6)150 1905 y(Computer)p 492 1905 24 4 v 34 w(Science)p 769 1905 V 34 w(Logo)p 965 1905 V 35 w(St)n(yle)13 b Fb(:)f(:)h(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)28 b Fc(1)150 1993 y(cond)11 b Fb(:)i(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)25 b Fc(74)150 2081 y(con)n(ten)n(ts)19 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fc(54)150 2168 y(con)n(tin)n(ue)17 b Fb(:)c(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)31 b Fc(70)150 2256 y(cop)n(ydef)14 b Fb(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fc(51)150 2343 y(Cop)n(yrigh)n(t)10 b Fb(:)j(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)24 b Fc(1)150 2431 y(cos)e Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fc(31)150 2519 y(coun)n(t)14 b Fb(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fc(16)150 2606 y(crossmap)22 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fc(79)150 2694 y(cs)6 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)21 b Fc(40)150 2781 y(cslsload)12 b Fb(:)j(:)e(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)27 b Fc(63)150 2869 y(ct)6 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)21 b Fc(26)150 2957 y(cursor)g Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)35 b Fc(26)146 3199 y Fr(D)150 3316 y Fc(decreasefon)n(t)22 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)35 b Fc(27)150 3404 y(de\014ne)8 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) 23 b Fc(50)150 3491 y(de\014ned?)c Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)35 b Fc(54)150 3579 y(de\014nedp)17 b Fb(:)12 b(:)h(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)31 b Fc(54)150 3666 y(delimiters)12 b Fb(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)27 b Fc(6)150 3754 y(dequeue)21 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fc(14)150 3842 y(di\013erence)16 b Fb(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30 b Fc(29)150 3929 y(do.un)n(til)12 b Fb(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)26 b Fc(73)150 4017 y(do.while)21 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fc(73)150 4105 y(dribble)6 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fc(24)146 4347 y Fr(E)150 4464 y Fc(ed)c Fb(:)c(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)31 b Fc(61)150 4552 y(edall)11 b Fb(:)j(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)25 b Fc(62)150 4639 y(edit)9 b Fb(:)k(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)23 b Fc(61)150 4727 y(edit\014le)11 b Fb(:)i(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 25 b Fc(61)150 4814 y(editor)8 b Fb(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)23 b Fc(61)150 4902 y(edn)13 b Fb(:)f(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)27 b Fc(62)150 4990 y(edns)15 b Fb(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)29 b Fc(62)150 5077 y(edpl)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fc(62)150 5165 y(edpls)21 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fc(62)150 5252 y(edps)15 b Fb(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)29 b Fc(62)150 5340 y(empt)n(y?)18 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fc(14)2025 299 y(empt)n(yp)15 b Fb(:)d(:)h(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)29 b Fc(14)2025 387 y(eof)6 b(?)21 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fc(25)2025 474 y(eofp)21 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)35 b Fc(25)2025 562 y(epspict)6 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fc(47)2025 650 y(equal?)c Fb(:)c(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)32 b Fc(14)2025 738 y(equalp)14 b Fb(:)e(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28 b Fc(14)2025 826 y(er)6 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)21 b Fc(57)2025 914 y(erall)c Fb(:)d(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 b Fc(58)2025 1001 y(erase)6 b Fb(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fc(57)2025 1089 y(erase\014le)8 b Fb(:)14 b(:)f(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)23 b Fc(23)2025 1177 y(erf)12 b Fb(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)26 b Fc(23)2025 1265 y(ern)19 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fc(58)2025 1353 y(erns)21 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(58)2025 1440 y(erpl)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)23 b Fc(58)2025 1528 y(erpls)10 b Fb(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)25 b Fc(58)2025 1616 y(erps)c Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(58)2025 1704 y(erract)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)23 b Fc(89)2025 1792 y(error)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)23 b Fc(70)2025 1879 y(errors)10 b Fb(:)k(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fc(87)2025 1967 y(exp)14 b Fb(:)e(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28 b Fc(30)2021 2230 y Fr(F)2025 2348 y Fc(fd)22 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37 b Fc(37)2025 2436 y(fence)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37 b Fc(40)2025 2523 y(\014le?)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37 b Fc(26)2025 2611 y(\014lep)19 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)34 b Fc(26)2025 2699 y(\014ll)13 b Fb(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)27 b Fc(41)2025 2787 y(\014lled)9 b Fb(:)k(:)g(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)23 b Fc(41)2025 2875 y(\014lter)11 b Fb(:)i(:)g(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)25 b Fc(78)2025 2962 y(\014nd)9 b Fb(:)i(:)j(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)23 b Fc(78)2025 3050 y(\014rst)6 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)21 b Fc(10)2025 3138 y(\014rsts)8 b Fb(:)13 b(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)23 b Fc(11)2025 3226 y(fon)n(t)6 b Fb(:)14 b(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)21 b Fc(28)2025 3314 y(for)10 b Fb(:)j(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)24 b Fc(72)2025 3402 y(foreac)n(h)e Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)36 b Fc(76)2025 3489 y(forev)n(er)9 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fc(67)2025 3577 y(form)12 b Fb(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)26 b Fc(33)2025 3665 y(forw)n(ard)13 b Fb(:)h(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)27 b Fc(37)2025 3753 y(fput)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)38 b Fc(9)2025 3841 y(fs)12 b Fb(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)26 b Fc(41)2025 3928 y(fullprin)n(tp)17 b Fb(:)c(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 b Fc(90)2025 4016 y(fullscreen)18 b Fb(:)c(:)f(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)32 b Fc(41)2025 4104 y(fulltext)19 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)34 b Fc(51)2021 4351 y Fr(G)2025 4469 y Fc(gc)19 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)34 b Fc(64)2025 4556 y(gensym)16 b Fb(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fc(10)2025 4644 y(getter)11 b Fb(:)i(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)26 b Fc(2)2025 4732 y(global)6 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)21 b Fc(52)2025 4820 y(goto)c Fb(:)d(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)32 b Fc(71)2025 4908 y(gprop)11 b Fb(:)i(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fc(53)2025 4995 y(greater?)e Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fc(32)2025 5083 y(greaterequal?)20 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fc(32)2025 5171 y(greaterequalp)16 b Fb(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)30 b Fc(32)2025 5259 y(greaterp)19 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)34 b Fc(32)p eop end %%Page: 99 112 TeXDict begin 99 111 bop 150 -116 a Fs(INDEX)3209 b(99)146 299 y Fr(H)150 415 y Fc(heading)11 b Fb(:)i(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)25 b Fc(39)150 502 y(help)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fc(63)150 590 y(hideturtle)11 b Fb(:)h(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)25 b Fc(40)150 677 y(home)17 b Fb(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)31 b Fc(38)150 764 y(h)n(t)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)35 b Fc(40)146 1000 y Fr(I)150 1116 y Fc(if)16 b Fb(:)e(:)f(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)30 b Fc(68)150 1203 y(ifelse)7 b Fb(:)15 b(:)e(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fc(68)150 1291 y(i\013)h Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fc(68)150 1378 y(i\013alse)11 b Fb(:)k(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)26 b Fc(68)150 1465 y(ift)18 b Fb(:)c(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fc(68)150 1552 y(iftrue)16 b Fb(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30 b Fc(68)150 1640 y(ignore)22 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(72)150 1727 y(increasefon)n(t)10 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)25 b Fc(27)150 1814 y(in)n(t)10 b Fb(:)i(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fc(30)150 1902 y(in)n(v)n(ok)n(e)18 b Fb(:)12 b(:)i(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fc(76)150 1989 y(iseq)9 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)24 b Fc(31)150 2076 y(item)15 b Fb(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)29 b Fc(12)146 2312 y Fr(K)150 2428 y Fc(k)n(ey?)15 b Fb(:)d(:)i(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)29 b Fc(26)150 2515 y(k)n(ey)n(act)17 b Fb(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)31 b Fc(90)150 2602 y(k)n(eyp)12 b Fb(:)g(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)26 b Fc(26)146 2854 y Fr(L)150 2971 y Fc(lab)r(el)10 b Fb(:)k(:)f(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fc(41)150 3058 y(lab)r(elsize)18 b Fb(:)d(:)e(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)32 b Fc(43)150 3145 y(last)13 b Fb(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)27 b Fc(11)150 3233 y(lea)n(ving)f Fa(ucblogo)12 b Fb(:)j(:)e(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)27 b Fc(5)150 3320 y(left)18 b Fb(:)c(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)32 b Fc(38)150 3407 y(less?)13 b Fb(:)i(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)28 b Fc(32)150 3494 y(lessequal?)10 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)25 b Fc(32)150 3582 y(lessequalp)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fc(32)150 3669 y(lessp)10 b Fb(:)k(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)25 b Fc(32)150 3756 y(line-con)n(tin)n(uation)15 b Fb(:)e(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)30 b Fc(6)150 3844 y(list)6 b Fb(:)14 b(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)21 b Fc(9)150 3931 y(list?)g Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fc(14)150 4018 y(listp)17 b Fb(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)31 b Fc(14)150 4105 y(listtoarra)n(y)20 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)33 b Fc(10)150 4193 y(ln)6 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)21 b Fc(30)150 4280 y(load)f Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fc(63)150 4367 y(loadnoisily)14 b Fb(:)g(:)g(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)28 b Fc(90)150 4455 y(loadpict)6 b Fb(:)14 b(:)f(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fc(46)150 4542 y(lo)r(cal)12 b Fb(:)j(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)26 b Fc(52)150 4629 y(lo)r(calmak)n(e)10 b Fb(:)k(:)g(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fc(52)150 4717 y(log10)d Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fc(30)150 4804 y(logohelp)21 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fc(63)150 4891 y(logoplatform)14 b Fb(:)i(:)d(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)28 b Fc(91)150 4978 y(logo)n(v)n(ersion)7 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)21 b Fc(91)150 5066 y(lo)n(w)n(ercase)g Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)33 b Fc(17)150 5153 y(lput)6 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)21 b Fc(9)150 5240 y(lshift)i Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 b Fc(34)150 5328 y(lt)13 b Fb(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)27 b Fc(38)2021 299 y Fr(M)2025 438 y Fc(macro?)21 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)35 b Fc(85)2025 532 y(macro)r(expand)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) 34 b Fc(85)2025 627 y(macrop)17 b Fb(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)32 b Fc(85)2025 721 y(mak)n(e)19 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)34 b Fc(51)2025 816 y(map)17 b Fb(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)32 b Fc(77)2025 910 y(map.se)8 b Fb(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)23 b Fc(77)2025 1005 y(mdarra)n(y)17 b Fb(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)31 b Fc(10)2025 1100 y(mditem)13 b Fb(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fc(12)2025 1194 y(mdsetitem)17 b Fb(:)c(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)31 b Fc(13)2025 1289 y(mem)n(b)r(er)6 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fc(17)2025 1383 y(mem)n(b)r(er?)h Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fc(15)2025 1478 y(mem)n(b)r(erp)19 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fc(15)2025 1572 y(min)n(us)7 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fc(29)2025 1667 y(mo)r(dulo)16 b Fb(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)31 b Fc(30)2025 1762 y(mousep)r(os)13 b Fb(:)h(:)f(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)28 b Fc(47)2021 2166 y Fr(N)2025 2305 y Fc(name)17 b Fb(:)c(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)32 b Fc(51)2025 2399 y(name?)16 b Fb(:)d(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)31 b Fc(54)2025 2494 y(namelist)17 b Fb(:)d(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)31 b Fc(55)2025 2588 y(namep)13 b Fb(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fc(54)2025 2683 y(names)19 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fc(55)2025 2778 y(no)r(des)11 b Fb(:)j(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)26 b Fc(56)2025 2872 y(no)r(dribble)16 b Fb(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)30 b Fc(24)2025 2967 y(norefresh)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 b Fc(42)2025 3061 y(not)17 b Fb(:)c(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)32 b Fc(35)2025 3156 y(notequal?)13 b Fb(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fc(15)2025 3250 y(notequalp)10 b Fb(:)i(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fc(15)2025 3345 y(n)n(um)n(b)r(er?)13 b Fb(:)f(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fc(16)2025 3439 y(n)n(um)n(b)r(erp)9 b Fb(:)j(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)24 b Fc(16)2021 3844 y Fr(O)2025 3983 y Fc(op)15 b Fb(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)29 b Fc(69)2025 4077 y(op)r(enapp)r(end)6 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 21 b Fc(23)2025 4172 y(op)r(enread)h Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fc(22)2025 4266 y(op)r(en)n(up)r(date)14 b Fb(:)e(:)h(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28 b Fc(23)2025 4361 y(op)r(en)n(write)11 b Fb(:)i(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)25 b Fc(22)2025 4456 y(or)c Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)36 b Fc(35)2025 4550 y(output)11 b Fb(:)h(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fc(69)p eop end %%Page: 100 113 TeXDict begin 100 112 bop 150 -116 a Fs(100)2506 b(BERKELEY)30 b(LOGO)g(6.1)146 299 y Fr(P)150 420 y Fc(palette)8 b Fb(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)23 b Fc(46)150 509 y(parse)c Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)33 b Fc(18)150 598 y(pause)13 b Fb(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)27 b Fc(70)150 687 y(p)r(c)16 b Fb(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fc(45)150 776 y(p)r(d)12 b Fb(:)g(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)26 b Fc(43)150 865 y(p)r(e)16 b Fb(:)d(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fc(44)150 954 y(p)r(en)12 b Fb(:)g(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)26 b Fc(46)150 1043 y(p)r(encolor)16 b Fb(:)e(:)f(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30 b Fc(45)150 1132 y(p)r(endo)n(wn)9 b Fb(:)j(:)h(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)23 b Fc(43)150 1221 y(p)r(endo)n(wn?)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fc(45)150 1310 y(p)r(endo)n(wnp)f Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(45)150 1399 y(p)r(enerase)14 b Fb(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)28 b Fc(44)150 1488 y(p)r(enmo)r(de)6 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)21 b Fc(45)150 1577 y(p)r(enpain)n(t)11 b Fb(:)h(:)h(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)25 b Fc(44)150 1666 y(p)r(enpattern)7 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)22 b Fc(46)150 1755 y(p)r(enrev)n(erse)16 b Fb(:)d(:)g(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)30 b Fc(44)150 1844 y(p)r(ensize)21 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fc(46)150 1933 y(p)r(en)n(up)20 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(43)150 2022 y(pic)n(k)21 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(12)150 2111 y(plist)17 b Fb(:)c(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)31 b Fc(53)150 2200 y(plist?)16 b Fb(:)e(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)30 b Fc(54)150 2289 y(plistp)13 b Fb(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)27 b Fc(54)150 2378 y(plists)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)33 b Fc(55)150 2467 y(pllist)6 b Fb(:)14 b(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)21 b Fc(55)150 2556 y(p)r(o)14 b Fb(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) 28 b Fc(56)150 2645 y(p)r(oall)7 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) 22 b Fc(56)150 2734 y(p)r(on)10 b Fb(:)j(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) 24 b Fc(57)150 2823 y(p)r(ons)12 b Fb(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)26 b Fc(56)150 2912 y(p)r(op)10 b Fb(:)j(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fc(13)150 3001 y(p)r(opl)16 b Fb(:)d(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fc(57)150 3090 y(p)r(opls)18 b Fb(:)c(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)32 b Fc(57)150 3179 y(p)r(ops)12 b Fb(:)h(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)26 b Fc(56)150 3268 y(p)r(os)16 b Fb(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)30 b Fc(39)150 3357 y(p)r(ot)16 b Fb(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fc(57)150 3446 y(p)r(ots)18 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)32 b Fc(57)150 3535 y(p)r(o)n(w)n(er)7 b Fb(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)22 b Fc(30)150 3624 y(pprop)8 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)23 b Fc(53)150 3713 y(ppt)15 b Fb(:)d(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b Fc(44)150 3802 y(pr)19 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) 33 b Fc(19)150 3890 y(pre\014x)12 b Fb(:)g(:)h(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fc(22)150 3979 y(primitiv)n(e?)d Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fc(53)150 4068 y(primitiv)n(ep)19 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fc(53)150 4157 y(primitiv)n(es)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)23 b Fc(55)150 4246 y(prin)n(t)7 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)22 b Fc(19)150 4335 y(prin)n(tdepthlimit)d Fb(:)14 b(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)34 b Fc(90)150 4424 y(prin)n(tout)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)34 b Fc(56)150 4513 y(prin)n(t)n(widthlimit)21 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(90)150 4602 y(pro)r(cedure?)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)23 b Fc(53)150 4691 y(pro)r(cedurep)f Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)37 b Fc(53)150 4780 y(pro)r(cedures)11 b Fb(:)j(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)26 b Fc(55)150 4869 y(pro)r(duct)10 b Fb(:)i(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)24 b Fc(29)150 4958 y(pu)13 b Fb(:)f(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)27 b Fc(43)150 5047 y(push)10 b Fb(:)j(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fc(13)150 5136 y(p)n(x)15 b Fb(:)d(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) 29 b Fc(44)2021 299 y Fr(Q)2025 416 y Fc(queue)10 b Fb(:)i(:)h(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)24 b Fc(14)2025 503 y(quoted)10 b Fb(:)i(:)h(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)24 b Fc(12)2025 591 y(quotien)n(t)18 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)34 b Fc(29)2021 846 y Fr(R)2025 962 y Fc(radarctan)13 b Fb(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)27 b Fc(31)2025 1050 y(radcos)17 b Fb(:)d(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)31 b Fc(31)2025 1137 y(radsin)21 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)36 b Fc(31)2025 1225 y(random)13 b Fb(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fc(32)2025 1312 y(ra)n(w)n(ascii)8 b Fb(:)15 b(:)e(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)23 b Fc(16)2025 1400 y(rc)6 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)21 b Fc(21)2025 1487 y(rcs)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)23 b Fc(21)2025 1574 y(readc)n(har)14 b Fb(:)f(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fc(21)2025 1662 y(readc)n(hars)16 b Fb(:)d(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30 b Fc(21)2025 1749 y(reader)19 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fc(25)2025 1837 y(readlist)17 b Fb(:)d(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)31 b Fc(20)2025 1924 y(readp)r(os)11 b Fb(:)j(:)f(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fc(25)2025 2012 y(readra)n(wline)16 b Fb(:)e(:)f(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fc(20)2025 2099 y(readw)n(ord)21 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)35 b Fc(20)2025 2186 y(redefp)20 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)35 b Fc(91)2025 2274 y(reduce)15 b Fb(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)29 b Fc(78)2025 2361 y(refresh)11 b Fb(:)j(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fc(42)2025 2449 y(remainder)6 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fc(30)2025 2536 y(remdup)13 b Fb(:)f(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fc(12)2025 2624 y(remo)n(v)n(e)22 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)37 b Fc(12)2025 2711 y(remprop)17 b Fb(:)c(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)31 b Fc(53)2025 2799 y(rep)r(coun)n(t)11 b Fb(:)h(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fc(68)2025 2886 y(rep)r(eat)18 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)33 b Fc(67)2025 2973 y(rerandom)15 b Fb(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)29 b Fc(33)2025 3061 y(rev)n(erse)8 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)23 b Fc(10)2025 3148 y(righ)n(t)10 b Fb(:)j(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)24 b Fc(38)2025 3236 y(rl)13 b Fb(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)27 b Fc(20)2025 3323 y(round)8 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)23 b Fc(30)2025 3411 y(rseq)f Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fc(31)2025 3498 y(rt)8 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)23 b Fc(38)2025 3586 y(run)15 b Fb(:)d(:)h(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)29 b Fc(67)2025 3673 y(runparse)12 b Fb(:)h(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)27 b Fc(18)2025 3760 y(runparsing)15 b Fb(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)30 b Fc(6)2025 3848 y(runresult)23 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)38 b Fc(67)2025 3935 y(rw)13 b Fb(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)27 b Fc(20)2021 4174 y Fr(S)2025 4291 y Fc(sa)n(v)n(e)20 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)35 b Fc(62)2025 4378 y(sa)n(v)n(el)9 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)24 b Fc(63)2025 4466 y(sa)n(v)n(epict)7 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fc(46)2025 4553 y(screenmo)r(de)16 b Fb(:)d(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)30 b Fc(43)2025 4640 y(scrunc)n(h)14 b Fb(:)e(:)h(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fc(39)2025 4728 y(scrunc)n(h.dat)16 b Fb(:)c(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fc(42)2025 4815 y(se)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)23 b Fc(9)2025 4903 y(sen)n(tence)d Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)35 b Fc(9)2025 4990 y(setbac)n(kground)18 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)33 b Fc(45)2025 5078 y(setbg)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)34 b Fc(45)2025 5165 y(setcslslo)r(c)24 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)36 b Fc(64)2025 5253 y(setcursor)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)22 b Fc(26)2025 5340 y(seteditor)12 b Fb(:)i(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)27 b Fc(64)p eop end %%Page: 101 114 TeXDict begin 101 113 bop 150 -116 a Fs(INDEX)3164 b(101)150 299 y Fc(setfon)n(t)10 b Fb(:)k(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fc(28)150 396 y(seth)c Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fc(38)150 494 y(setheading)15 b Fb(:)e(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)29 b Fc(38)150 591 y(sethelplo)r(c)9 b Fb(:)15 b(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)24 b Fc(64)150 689 y(setitem)c Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fc(12)150 786 y(setlab)r(elheigh)n(t)13 b Fb(:)h(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)27 b Fc(41)150 884 y(setliblo)r(c)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)34 b Fc(64)150 981 y(setmargins)12 b Fb(:)j(:)e(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)27 b Fc(26)150 1079 y(setpalette)13 b Fb(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)27 b Fc(44)150 1176 y(setp)r(c)20 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fc(44)150 1274 y(setp)r(en)16 b Fb(:)d(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)30 b Fc(45)150 1371 y(setp)r(encolor)21 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)34 b Fc(44)150 1468 y(setp)r(enpattern)11 b Fb(:)i(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)26 b Fc(45)150 1566 y(setp)r(ensize)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)21 b Fc(44)150 1663 y(setp)r(os)g Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)34 b Fc(38)150 1761 y(setpre\014x)16 b Fb(:)c(:)h(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)30 b Fc(22)150 1858 y(setread)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)35 b Fc(24)150 1956 y(setreadp)r(os)15 b Fb(:)g(:)e(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)30 b Fc(25)150 2053 y(setscrunc)n(h)18 b Fb(:)12 b(:)i(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)32 b Fc(42)150 2151 y(settc)10 b Fb(:)k(:)f(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fc(27)150 2248 y(settemplo)r(c)11 b Fb(:)k(:)e(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)26 b Fc(64)150 2346 y(setter)15 b Fb(:)e(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)30 b Fc(2)150 2443 y(settextcolor)14 b Fb(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)28 b Fc(27)150 2541 y(settextsize)18 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)32 b Fc(27)150 2638 y(set)n(write)9 b Fb(:)14 b(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)24 b Fc(24)150 2736 y(set)n(writep)r(os)e Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)35 b Fc(25)150 2833 y(setx)22 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)36 b Fc(38)150 2930 y(setxy)18 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fc(38)150 3028 y(set)n(y)6 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) 20 b Fc(38)150 3125 y(shell)15 b Fb(:)f(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)29 b Fc(21)150 3223 y(sho)n(w)7 b Fb(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fc(20)150 3320 y(sho)n(wn?)e Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fc(43)150 3418 y(sho)n(wnp)16 b Fb(:)d(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)30 b Fc(43)150 3515 y(sho)n(wturtle)16 b Fb(:)d(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)30 b Fc(39)150 3613 y(sin)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)23 b Fc(31)150 3710 y(splitscreen)17 b Fb(:)d(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)31 b Fc(42)150 3808 y(sqrt)7 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)21 b Fc(30)150 3905 y(ss)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)22 b Fc(42)150 4003 y(st)8 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)23 b Fc(39)150 4100 y(standout)10 b Fb(:)j(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fc(17)150 4198 y(starting)h Fa(ucblogo)16 b Fb(:)f(:)e(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)31 b Fc(5)150 4295 y(startup)19 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)33 b Fc(91)150 4392 y(step)21 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fc(60)150 4490 y(stepp)r(ed)11 b Fb(:)i(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)26 b Fc(54)150 4587 y(stepp)r(ed?)10 b Fb(:)j(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)25 b Fc(61)150 4685 y(stepp)r(edp)7 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)22 b Fc(61)150 4782 y(stop)d Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)33 b Fc(69)150 4880 y(substring?)20 b Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)34 b Fc(16)150 4977 y(substringp)17 b Fb(:)c(:)g(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)31 b Fc(16)150 5075 y(sum)21 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)35 b Fc(29)2021 299 y Fr(T)2025 415 y Fc(tag)20 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)34 b Fc(72)2025 502 y(temp)21 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 b Fc(61)2025 589 y(template)11 b Fb(:)i(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)25 b Fc(74)2025 677 y(test)10 b Fb(:)k(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)25 b Fc(68)2025 764 y(text)d Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)37 b Fc(51)2025 851 y(textscreen)22 b Fb(:)13 b(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)37 b Fc(41)2025 938 y(textsize)14 b Fb(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)28 b Fc(27)2025 1025 y(thing)19 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)34 b Fc(52)2025 1113 y(thro)n(w)10 b Fb(:)j(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)24 b Fc(69)2025 1200 y(to)d Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)36 b Fc(49)2025 1287 y(to)n(w)n(ards)10 b Fb(:)k(:)f(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)25 b Fc(39)2025 1374 y(trace)6 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)21 b Fc(60)2025 1462 y(traced)e Fb(:)13 b(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)34 b Fc(54)2025 1549 y(traced?)18 b Fb(:)13 b(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fc(60)2025 1636 y(tracedp)15 b Fb(:)e(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f (:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)29 b Fc(60)2025 1723 y(transfer)11 b Fb(:)j(:)f(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)26 b Fc(81)2025 1810 y(turtlemo)r(de)7 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)22 b Fc(43)2025 1898 y(t)n(yp)r(e)16 b Fb(:)c(:)h(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)31 b Fc(19)2021 2148 y Fr(U)2025 2264 y Fc(un)n(bury)19 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)36 b Fc(59)2025 2351 y(un)n(bury)n(all)16 b Fb(:)c(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)30 b Fc(59)2025 2438 y(un)n(buryname)17 b Fb(:)11 b(:)i(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)32 b Fc(59)2025 2526 y(un)n(bury)n(onedit)18 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)35 b Fc(91)2025 2613 y(unstep)13 b Fb(:)f(:)h(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)27 b Fc(60)2025 2700 y(un)n(til)12 b Fb(:)g(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)26 b Fc(73)2025 2787 y(un)n(trace)16 b Fb(:)d(:)g(:)g(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)30 b Fc(60)2025 2874 y(upp)r(ercase)9 b Fb(:)k(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)24 b Fc(17)2025 2962 y(usealternatenames)e Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)35 b Fc(91)2021 3195 y Fr(V)2025 3311 y Fc(vbarred?)10 b Fb(:)j(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)25 b Fc(16)2025 3399 y(vbarredp)7 b Fb(:)12 b(:)h(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)22 b Fc(16)2021 3649 y Fr(W)2025 3765 y Fc(w)n(ait)c Fb(:)c(:)f(:)g(:)g(:)g(:)h(:)f(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:) g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fc(71)2025 3852 y(while)20 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)34 b Fc(73)2025 3939 y(windo)n(w)14 b Fb(:)g(:)f(:)g(:)g(:)g(:)g(:)g(:)h (:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:) g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)28 b Fc(40)2025 4026 y(w)n(ord)10 b Fb(:)j(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)25 b Fc(9)2025 4114 y(w)n(ordp)20 b Fb(:)13 b(:)g(:)g(:)h(:)f(:)g(:)g(:)g (:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:) g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)35 b Fc(14)2025 4201 y(wrap)6 b Fb(:)14 b(:)f(:)g(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)21 b Fc(40)2025 4288 y(writep)r(os)16 b Fb(:)e(:)f(:)g(:)g(:)g(:)h(:)f(:)g (:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:) g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)30 b Fc(25)2025 4375 y(writer)6 b Fb(:)14 b(:)f(:)g(:)g(:)h(:)f(:)g(:)g(:) g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)21 b Fc(25)2021 4609 y Fr(X)2025 4725 y Fc(xcor)d Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:) h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fc(39)2021 4959 y Fr(Y)2025 5075 y Fc(ycor)18 b Fb(:)13 b(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g (:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:) f(:)g(:)g(:)g(:)g(:)g(:)g(:)h(:)f(:)g(:)g(:)g(:)g(:)g(:)33 b Fc(39)p eop end %%Page: 102 115 TeXDict begin 102 114 bop eop end %%Trailer userdict /end-hook known{end-hook}if %%EOF ucblogo-6.1/docs/usermanual.pdf0000664000175000017500000171640313601426467014736 0ustar jjcjjc%PDF-1.5 % 1 0 obj << /Length 587 /Filter /FlateDecode >> stream xmTM@+z&?tBL$d4*.<_fW_wիrc;`GUOV&ʮ[v6W7TvbuYt/N.5=S> stream xmTM@+z&?tBL0d4*.<̿~UfW_uvc;Z̫MfG} I]/ޭmޯo⣩0^'^x]fkn{EK{*ʇupg6;ލ$4;gZ8, M[TPRJGeWxmE7 "/7j;{Yʋ"1tm|oirI ɑc׺>[TқEnn#bBSEV嶭mzsg)gR133w xAb;aGL6K&0+}&"?(Ҧa/ c,!-f3*Ix {asIC%hS7}H=ŤIY(jŧ Z4{SO5Z ekxvKǬ@2a> stream xmSn0+$z"aKU^CvF^p=!94gB˥0pދ s#P~k@hZ+vQڦ(A,Rf5Ħq8>K_X NH3$Ǟ{<0*5c~Pʯ5W42^!0^#rqxƘE3x z)cgl1BҰ?Xq!NAWA*d1)iȧΰО 9璆NVfkVaUJ?%͚5ػbTW=ј52f&p2pjV^cHMcVYxLS7E=1j g endstream endobj 6 0 obj << /Length 257 /Filter /FlateDecode >> stream xڍPMK1W19$f2fs-]) amňɦ"C^›1BL-? ;-T^ <<91ͮ:Yo1ց maS2Mj`x[](M1~\UTwù-]fGH%Y9OW0@kMX M&;:'Z9O#/v_)Wt9(B9J zCqEZTy;ְmϏ<88"[dgLc/8*bS endstream endobj 26 0 obj << /Length 943 /Filter /FlateDecode >> stream xIo09&1n,*63<)~=Ҥc,VюzH3}ǯѷBBE>S}V_^[b|<!SuP-?ʶz|zp^ahYJ\ 0bZMqI"ԻwDQ*y}KX)6rUo*,^Wǫozn e( 5=%%~? @g`L1yECpw̵5XZ q@q׆G^ʿ/6Jbn3Zs4̥ahGEiȳu4$-- & 4<䓫MԳA6O) קb"OqR|)IOK R?_R_p=p8=yI ގzug&\J0hqfJ ArWS f1'0b|dZ>Ҟn"+く#]_MGj_}~{s$(4S$MCKD<_GRӒD9̻қJӟuۓzS+?C4()Rc;̟a.h3u -L( T؞ם+8btjI03H8\BFy ix> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 93 0 obj << /Length 2130 /Filter /FlateDecode >> stream x[s5~ ?:Qu.\fxd[<4q|zZJ'goadWV֚--z0B^v'=}~']ˬӫ'OTj(iW/xz}7OR#3wB;`pj_$aBNyW\..Q͋݅`0=4J!5e%'TH1_O#zsh1M}N@A׿|?=z'MF/Ƈˬ<6?};V(ѾcJR.4WD+ t -fEn?a8sw CNǒ XNZuDFvPVTjglB,r]>ݨxDN?a0ƂI{{"TK`( IfA.V㟽(FT_;U(+T!cGFpddiid$=qNwVi.uLa?hBo%d*H>t$.֑<<%K4aLqtگgv_î8猑g=կ{g k3pdtFWFm_8W|;vWa(fn?%Ԇ;Вʡ%\ZHzuBqMSޔ:e;oNͮ9n*vq.2aGB?tZũ&}o7*NTY1.)#bJ"wZJ%# 5X)S:`d*;C/ v?Yڎ䛕|,"cGpdkk|;{ f};7C|sKeX|5%v֮Vڜwf/77CxsIeXx!)k'Ja˹%:=;Z_}trQ03Hz~:UtdberHf"dQ3~S[j0OX ̈TTBJ(0a7ڲUrFLKE(.3Q+B~khT(X8U*tI5+)SETHc~nTN6y\ |sJS94SQuJ̰eEf–)oHwA.j|ӰR9/Pчu8F*{>vW[JX;:`f;7dnqtHƢM+ރuḧjUm) 7bXr:`ft˲M{` ;_wfڏ2h?A! yCQ*Tꮲ;6e[5!Q\3 fLDP4sJCwLrV;23#S>sN{y=1VCpS97GTupW ѓU;!9 O\ fF^k~}=~{eٵ}:m9o**xq/Xpq_T}n 뛌՚!V\ fF\#֛}e"Жf4! MT FsS~ 퓀 X{:`f؛zCޔUukJG:<$4 .+ (C02NMpzYze!9 S\c fFLXc*Fhy$k2C&sLMrI03TaK,> 8g9tK5CTs6\ǦT"LeT(dהy>k6Cfs?\ǧf'dvƗmߌn mLJ'.3OfwvUvCˎ˦9!X\ fFTC؋R+[MqcrooωR"^6= UaT @0Yr A _3T`ۜX*RfdP2пFX endstream endobj 153 0 obj << /Length 2259 /Filter /FlateDecode >> stream x]o7 ]fMmI@w{V,#)yr6[Ě( ;^5 gL؊UGWFI>ϫ߼bv,*{VvluSVwwonR~߿Vo~ӄWbʏ|"F_ʌ?ys(n9S|FFc^5__(?xo$0BmV^M] [Qld#ڕgv8? FMu'T6#f'v^W83zt.Z地q,4׋$crHn"䂙QDY5gna3 )j`}`S96Su`V"XM:DMo0Vj*j*RqN*JI^ꯗ;6r5V}XS95SuẌubB̙U/|Bͤo%d*L>*:`f4 |7MC_;kӵ]Gcrjb묂* >gQ __u,T)Ur_03U#ڲ9.;4<}%XЬDKY(2w gF%|tv6OxU;KK,T́0]Du(̈R+"ra3/Sx; K{[X ͸TBP(0Tp͉m/ǚk?~bQrHe\alj ;NqK?M4#FvPawK4CDs.\Ǧc'W>s{o䬍HƲMۜP-.ױ3#[Ɖ1~V/z 54+7CrsE\' rey#7" ֻҹ+%-H]_Bkh3kVx}b;y3W4>s;Ie3[F:vJ/*7CxsHr^035AV3qr:ڋu!S\s fFf^1vsN >Ye!9 S\c fF}яѾcծP~barf`t$cj ׾!L\ fF6P)&ZǭƒMٜE\Ǧd!rSMzberHf"d>˴|$RsLa &,13;><wìQPG_I$coB/fB3BJu+pz؝P\`t\iX CDY90=P͝F"83#xYb;qrf[6_y6m**lq-َ>3S&q*E"]w,T1Ur`03挨O.~3aWv_뛍U! NjqN-W%Rp~<减v 5X3:`fPy|o:UbArd"H\ fF"Gd̿ߜkkH=aZ)=){?mrI{c55U{Ǣo^ ƒMٜO,.ב3#Y OiD-ij_T}h1j*n*Vq*v𗍸uS^fRk,H@)ŅND Jt>,RgtX:a endstream endobj 9 0 obj << /Type /ObjStm /N 100 /First 830 /Length 2147 /Filter /FlateDecode >> stream xڵZˎ\Wpo,փE@0`g o=–c&sR_;\n^WSIzIU$$VqF$WZDjrLRiʩ??/~:= i˛-,!"⸪8hVJǘ/|_ݿOǛ,,|:qtt<3NZV^tds+uz g:%;U>֝?~]?n;a03izOgŒ8 -~l/S?TWSBuŷZn4W~^䞋NAwIu\ǿ9_|"j˻EP|@#%NA@3ElsqXJWznfQmv\%<+^Nws˵E04NgϥEqIG>s.jV,/➶~%3ҖthILj{Z:mF؝]!ƭUfqwCq]m'{5>8ekqьXZPID FUOظft#d1u"yﶖ #Mt)wdg_fe=k|R|8jDH][` >ډ\m?f.;9[_K#m!%Uىtzu'>ɇܹ P _'ȡUms[KLjTh8*Q|Ӹgc[FJe#EًCn:+ Z>V~uYˇ# :ЏwC e82u-"Aɇb>Ă @vZgx\|L/_铎œh4.ރ:pw&[߳ݤ^*YU<+'GEO-[Ssvl+W49/Ks/Kpvi^:ov NYv:ěfƎxN<.'OluяﺘOKZf?pѵ|hc*u+ߋGש=}-_D=UOpҘҖw؋g@f%je j;5~z_DxٍprRÜ*k[( uH';>oD^5uEfnDq͢l|1nieDmMUzz)t}^-Zxָu_mX7jy,rwĆ(l endstream endobj 213 0 obj << /Length 2167 /Filter /FlateDecode >> stream xKo}>,ߏZ-E \xvʓT%%#P|!OָDvc9VtVIP{BTxWT~}oZ1Juluv&\zn7ܧR#OD2戵veQaΑ_9o("F}ᗷwL}7?^(3*R827.v /%pQ\E?j!s*5Q|օ\DBgl+gQR̝}™ɧ}<qX?TQM敾],\1-4r=S0315(isܞ(%%[,\!-4r=R03!UH2tC)#j:g3>Xc,\a-pUŊX̄UJ­aZʄ)4CHK0 \̌HcD[VBJ%#>j.Dil.RiQ(SW̝™ID9޾+io3_4Q..3\7eL>->.;!"nQ-ȦS'49swNDNdJ7ø׏wB6X=S_J1IcehV\.ȕp9ϳr"a-̆Vcrla͂dyiT:>uZQ,\,4hr=M03dcex*M2} &<6b=rciG\f&fR~3yr}]K%0b1rc 1 4ry18>U!J\W f&Bk0IzN.4CNK3 \LN9%4zBGqJ˺U;!%nTq*RC SW_ōs,\-!5r=g$Bj>g:: :q{m7`Fmm b;O ^>"":~ȹ( fꏲ 1fpIbƉ_y0OC$エ~{.%ƞ ǡ.]E͝!83D4{.^J|5Aqۍu![\w f&ld|Lay,vl*Vg.tR:q^'tC Wv[?5y:65Vu'6crki뽂+DpGzڜZzG,bri 둂)wp2?<Nۡ}Gk>KO" 0u)ZNL}cE+دwkI,\,yZ%$DR[\xm폇rcTs9DdӠTDU)b% GwO%y,\.95r=a03xx?4f;Z?t+5UCP 4 P LJ#Jㇱu߼5:~crHm݂ .Dؐv{}G[['Q7n.pq.RAxaL;3]Z|Cױ|s9ķ|ȗ9Jh/-}Wi$٢ {N;3Yfq_pQw?^-ġXĹB\j z`fB16>x+Ok^հu,\-) V|WQӯbX?4ϛ<(W.r{Ś!%V\ f&X佩o~;)kkyW@k(W Tf%B!xkSeXZiXz`f:ͼX܊=nNy7 j5k5CVK7 \ǒV%46iXmkH:׫}J?t)2W KuЙ#5Z9} ȶC2lܸ FRP,0j endstream endobj 270 0 obj << /Length 2223 /Filter /FlateDecode >> stream xo7{ oN)t EV:3C9|/IjƃcO8$Q㋶YX)Yb}_ٹrՋWW/EB/hq2k/oRxnd^,8S_Wxv΍0GW& 9os(ٲ8X}=|QC~W醚OeF´24nm.a/ h_r_-D_Y9R|s_xfJ3flwőQ3Egqi*٩#r=Y43 NWݦZřg},7LRN 끢 LI=?W7Eai2r*P@\L(U?{thԄ]ZYB6":G%8csAZ'fK22e^.wR_ל |3,75u6E/Y -Z1kyk\o Lu!,Wh^ J9c1~3 j]BfuՌcҺz6=TfSu@F ư4(jh7C?E,` a/rzL:cRs8UZf&Cu n֜2uCNSNٜ@ɢle%yk1TaXi+r `o'k1TaHUJẌU-3" YoXeJzh(dڄC%&L_twuy6L=moz3SάrOZhI̎S·)4qN o{_ f<nXrĶo}coa++G# Ea3MWjZ+A?:+<[K5:cFs/QZ7f&_u0@Y Օ͜cjrLm.PKj̤VXf,,3T6L ɰ|5|rx`W* w*\LpM i>Tn7Tpi.j,'jၕ؟R?s*|V\L>Uv"'aM6^SSE|Sɩl~űSzT/:L:cTs6UZf'><|gvm.ø?qʙ)B;IR!FaS~'=LL@IbdK' Q9V9N\jJtd endstream endobj 160 0 obj << /Type /ObjStm /N 100 /First 904 /Length 2034 /Filter /FlateDecode >> stream xZ W1"YvCAYF`ϫizc+j,~$ZZ!B0 QD VT#su)#0B:> |D˥5[bڼ1y a#[/,!'2- f0ٰY1\1Qi bBUEx`S.0 佈R;͟[p+ݹBd8F+&cs18ljv1 h(J>T؃i ~VԕOo(h!lE#[+a 7@n\` 7@nډ1'[fn^|~ml~oy:{{宼it!\Xϴ1<{VίOoyWO;:WN[e[LQUO³kȪca||_#:h-Bɮ|oT3Y67zU|F)j|}騸-~Obuq"iP5)W:5ŨMҙM+R:uS؞7Rw׿qVr2@5H=/Q(]?`W챜_>Qί/?ߗ5\N?rs)˧qn?޽|6ׯrwyP=f|wp6 ]l#m-Gq<99J7o$Hx#F7o$^$^$^$^$^$^1"bÛ6Rs-Gq{Ql v*I?&y, ٓ|WkTRZPZ*ᴖOvI>C%١ӃzBn[nZ)ŤӁ>|K<\{|6Ě|5tSʧQGӵ|biyjj!W>m1R=O_#qC\̇QtY@a2ZRo{Vgv3G㿖{ҕNڽpR`;u1Ux*0k|}6Z.[Tk{qȔS^JŇ1lk[>F[ bttKK9|4eJ5:\D4kNvR "ugtkM;ptw0sat1da|{GG=U>)|I>" $s'~a?u-t0A('Gѡyj!dOa{^̿ҹνϏܼпK)r -p)r -GGRēēēēēēē'^Ox=z뉗>?_xociiiiiiiYYYY勃#m<كlmJئjJKa|avB0>tB}]8ybP(_CD)l[CQa[dpQUQa0O!}-Qa0' ۇZVEw:žBʍ![ ۽6]ŷ)]qfa7Ow*FM!o Ϻ\E'6);Z2j=RiC"T~GC>yNy%Jx1@`X[H}T|&з(w{9\43|{(gNHC wk|a c:3Hpj{pl"؈ endstream endobj 328 0 obj << /Length 2232 /Filter /FlateDecode >> stream xIoG?Aڗ9f 9LrM& .N0~Qz~{\2¿Su6[?pta NWԿzx|wX ʯ^}R F-,5<߿!9U~"1G 3F>nv[-j{3m._ %LL]z~(6WOeFBx[%oF HE9F#2wg&V3>j?!X\ f&eU>]Ys+ a~ngђ!T\ f&)Ba84WN]G:5tK6CdK> \OLd$Koͦf)"3ܵcrHpI`\ f&&D)xx%op1nh6Vm.Ԗjq^-2C v4~1 Xr[jz`frK%_2)}7߾ffbme#Nw&)U{|O,\,4XrK03MQ8 oñ*R(BW XbZi0z`fbqƱX"Yhz`f")aF>>S)Ǜ;LbbriI뙂q"!8aQat9lf+rʯR;?w[}f}y[n·&Cn6r03 oBkepSmc)Io})&6+4CBK- \/LB9%ks}Rٞ獽ƢP-.ף3Zj2Wml}1hj,h.\z`f$*$kaukxih^TZJԕ"s'pfRj빹Fz>i͡NU1꭮bmjf!aBɥn;4V*u6y$Vc48Q^#4*I'p:/䮏=:^bArHd AM d2Z:Wo[fh(Vf.dJ2q^&drKX~5m_ώ?n ``.z`fQ|,4cbs9$b$r"Nb__o!VJ}3 /CJ \̌:™ۺ g=/1(0^cDN8r ժiom31oyn[!M\ f&x-ơ[~2V|BsJs9PJ̤T:bcGqRL6csJs9PJ̤Tw,*m>|e!%Lq)rA~vب>#[b\Y-4rU03Y_٩iSzś!%^\ fFt DnGl$RdQQ̝D™qYYI(&d~Xo>Sz|h=`̹)fsncդjMT'1PbU<*tǿxAfQEu>^-scVs9Њ\Ubh܌׾ ?azF@C_@s9@TJT8?2-BI9K.i.d2z`fSHheí⏻qD϶SU!u:\WfYU|?Y쎍'J>amU,\,4xr=O030?kDqecrHj!륂QcĩptIЬx"ujg n /? endstream endobj 387 0 obj << /Length 2209 /Filter /FlateDecode >> stream x]oG _:{g{ -EEU q,A|9Nl"&:rfgvg7lFlY'饙]\Pl| ug,||~R3FIO{6;juz;'~zogB^ \v'Ocʏ|&zbu{Tt{s{8lGO˅"̾;=c??l wHѓqP}}S'Avd+ULgL!5rtד^ie\_r~{..K?/6rs*0fozChK5vJ"X| wre_%QR!};vT3QQJ/w7vd4n9/LnVUylbܾ%ov訌11#+ƌnas1 G6m= MQ#g* _=q**q1py9Mx?nMd,X Y(Z uR|blJH9R:v+6VCb3@ŢBX(07&]klnl' MќL).)3SwSԮ\-J )f,`Zi0jVP=bS™aMPܯ=5bحo=34ȟY*-0:f`f;F' (h-ڑ{76CjsA\̌j!"Lp7^FcŦrHl"ĂQT)[Eɧi|ܚZlT)^Tuj̨VpB'HR_?3C8s(\̌8(O\yNcɦrlΧBȂ,U>j}<KzŚ!9 V\ f3PD)@d&?Vþ &4t0+P;03Ø)H귻l5v~Cfh1j*n*Vq*jMWUvJMժo1j*n*Vq**AZvVɈ'43C>s+\̌>EM]equۭd7֭yKHmH`\2qM%{LK vr\],⊉ Nm\B1(iqch7Fm(ZPs!F\fFٛ ru:޻+@e%gMݽ!9 L\ ftD;-e kԩ\ EG\,EDH]ڪT>%$U "ML).!3#R:[lN\R޵1~'԰crk밂a-dGL|Qe/ݪf,wK,CvWr103xI kr.蛦$BMM*.A3#Tn5 Oe͈i&z-ZMM*.Y3Uj~ag5M25CXs8\ Xy}=oeg:OzDH"spfDj߼t8KUHYw(tK2C$sJIrI03Ԇ=+\*W.Ѷ_KLI&.3#L,&D'XX:`f*9}v6~_w+6VC`3<P ZyOZ۬vOkř!9 O\ fFLaxZK 5-DjTTrY03pᷪ,v+eq!=fm,T Ur[03e]Лi> stream xڽZ]}B]Շ$0 1Kf$,Yfx S5! Ӱحs$uhKi"F "bht~}Q 6.l xD q*$xpR~hg49~xiPamz#|po{i1ʋ4Q <[%tT3_FLyJ"G^dzt-0#<' FEMEuLL4-:1&&J'a EglrtwL,vS̅t~|>,'O얐kqQV,~L;(%F;ZL>hLpmX 9&y`+ 3Hh3 2X #((>(=`5:20 lygbtd*R:ae>=XL|N[`Uf̅iIW&#'E`z읚0M0yl X`_kTG[W籟kh7>ӊcy-|[S%Y'*~Zu?iuDZoLA7G~x_n?_0sN0Y Hb.)>ȓl%[6Ǐ?ƏlFv7o&Lܳȋ6f/rl9[VZ6((((((((((8888x{Vs]_#v|~V|'= .fk>G%|ݫJYG^K&nItQrxLFE濖"J&X׸z0R>d;;3pZ>H|*M*g||_Jc볎EcSu-|`r ׶BvnuR>5gG5$>>j/s!l| Qx8Z%ÃF5!Ͷ׺ss-‘SFʱi-?_/C'k~촖g +d*m19SW;PkNC,|Ƶb>6L^{{cÚSBYR?pvO_Z>u*/C6KTevyP45TSZˇP3ReGGYt9KFMX'g! 8ೳuqC VZyC'#uQl8vɇ8C)jTBY7'!ZH:P;CkjTXYv3;ֿTCeh軒zg+KjZkjZ-kii'^Ox=zgggggwwwq牗wwwOY1Г/bpyyҭNz6vpGz&hQwWN:Q~Y9kmz6v&g3S^UHi2ʲtkIZ<9Ib>S^;|=dC-i$vFlI~Ż>!NlH5c?;;IeKt̕kMI4ugg&m;.MбIitEm3&.{y.)2 9O#ԹyLy-L/;Bϟdj| 8<. -}-̻$$՘!y%괖>OZ>@OUxVZQAl4,S:l1@LQ9ewLkI5l7?)x endstream endobj 447 0 obj << /Length 1858 /Filter /FlateDecode >> stream xMo7A ES@mFeK./94=TG`q\"|%_8ؠW/~FĺX*y֘lXܽ_2q_.HI*?) 7ƕ;enW/)[ξ1-PJXwÞ"_rR*oxz}РĸO dvC l\G<ЛN[#z$s'xzzŜL/jv?oWJ7ۗq4GhV u_ /=,vʬchIǙ改2U gBdcdK9Fhf&k9*d7aOJ&ޜpRɭߔK r,Wk&Nrwdwp[bpK9FhfDM#ܗ~Sr nK p W86 wi5LOocdK9Fhf&5J汶yMo+{A|cש|K9ƷhfkemU\~V3Dm .:ό>f Jw3hR)ĢY5 K`5LЯu!6 5WcN+3SRhPfF2)yp&l_Hc$c)<< $lS|X)9q36*cRk5TZnff|sJO2#R$@DcgDK9Fhf&*$sν& m8TX(rE43Qy~5Os|/`VϪyfOb>e~kŝks^bJ-ٚ@ȢSLISA㵒{gvLZ1@*-7HE3qf)WopCJ.i)ǘdLc\qvRiٗBn7n)ֈpbީ4*=V>Lil.Ui)ǔbܠJ%gN20gVJY1+:iA'urnjK[(n+x5 cpkD\Znf&j1 g.f 4?m:e`Ԫz-;I3T/t *laڈn@l4lƼVvlr%X`j=y:<(+ʊJ@blC2^o*Rli-jyL /_k4l)|@dgf/jA_lRjiA- Ìpepu-࢙.Lٸp?u}m kN\15&0-7F3`&E J,0{!,uȷ*GQŗ;33_gqf{'W=qH-࢙lq;asN.-JZ15(-7E33P=³q'ίͮ=~Sr nK p WYfE<փK3}f(f)hLnҤhf)Vfwml)>sQKeZ15)-70E335%Dfz"NM_ך8JZ15(-7E3P18&l:MOQ9?b?&(5(*Gd)i$N2,k it.:>6 2Wc+GRhЈf3o▙MB2!|8_{*R Ai0>y%dqL=?> stream x]o{\]e 'h @)е^a4[73\~M Q _Xyp9#?lㆍw/O߿`n7o_|R6\.u}W;no_?b۟vB?~j`W닗)IqNm>V(١Kl3 Nr.0 gZ[3Ǝ}\YҪq=W J͝+?ɘkFd<Jf@g7t7c|KJ \L|2t?K>>5tJ3c4K& \OL4&c<<,a_)hZbCbs9&Kb$Vs8LUcU!hDZRCRs9&TӐJR$R_7ڪ/J{X\ -h[JB$IN3^H0\!t J9cKV ʴ\OLJHpxq C:ZfCfs9f0KfhVY …Xov_i&-p \<35 qS}5:uT3[izhf2̓_&9us6Srkiᕖ뽢ɫd|WykJh vU\Lp|ks*\-!VKx̄W 0"ly5l~ 9 ZCs9Ƹ$`Lx*ӻ>p:z Ll`. i .oӱ:X_x[]bps9DԀKpwmܣS}}vĮSroI*_ZfF1xh6j 8u+ΆU'0( $Tɹ\jHzhf%XMYW ӊA:o.|i/*چ 9G"Z>V}U\L@%BfS'נӅ5;M%1%YZ'f&\iH wU5fZFϭM՘BK()OƁŹyV5l.Ėdi,r7gwq7n^n}0}; bpr"#kp \<3ſMnT]56*6cbK= \/͌O冃1YÓb=<ߞ^0cQҀbʈ^v\){C~4)']TkBds9Fct,-דE3YAW뼹?k+nQZ?GQ.-E3\!`Ϗܷooz.v]aSrjɦA멢*_ļ?mz[`l7m.ܖLٮ\Lnnq| oyʖBsJs9PJJ̨9ք/ LOm+&-LWE- YmcytRi3;N1%]Zf&ڀ2<>tS/x0fu bXs9JX̄UIzj<>>6.۵>_KI1%S}t1D3e[Io+LZUh.iƌ^DI^(r _^95 =P*T,꽪P L(׍ߊӚC_8s9sT endstream endobj 395 0 obj << /Type /ObjStm /N 100 /First 903 /Length 2080 /Filter /FlateDecode >> stream xڵM]WhltR LIxx.amuNy } ݺ}-TG:!£ -"A˅JqZԢoϋ7Ko/-ӡHN@ϽtVB 5 11]C N1E# բa$QTft0tEp+ΘN@[놹#<a-dXĴŨQb)@m{tv ;ذM$Xk#@CŤ*LFXla^eb<2l<5&<-&:GL .Ϝ11ljl԰zxJxOVlV m+{<`Ƨ9l14Cl{g`đfˋV?^o>q/?rCy\}|,dj8Ҫ\`V-E)?߿/ח,|sѬQ.Xyu嵎5%ögw^<;7zTgkJh`Z8$;ORkyxԵ<")y6ޡ^y:7\Sy)Ωq*A{Y1|_Le}_{d^!^+lgBl`77̱\_|Uoo<y\<t-~w07cƑcEo'P#"D@ӳl)[Vl-ۑgz=zS^Oz=zQQQQQQQQQ3xkoSSSSSSSw_[tض]G8t=okyg&^nG,zs:6xہopBo2 sZQ䱃׵z,^CĻ/Xseg{E~g5yaε+gO19M!4q; O˒[N'Y,I$ }=Bx-[oY(,ZYY7RoHz#F穗_ɂo\\myyyԛ7SoL|2 AM-)B(ҿ9k?ʕN+~й2!TYBÞc-/ -nAа灻8*d%7<\߃:VWHCe- g%ط=XS7UO<<: B>|šp,7 H%CC.t)n4,"78 !\>kyWLE2JAqVN.9E/9OW ۭ\_5exS-8h 8x89 Ƿ間!^0+ל*"5i<Ăz|y#+[γx4ю0q8Є#0ɳz|yo> stream x]o6+ti_%ܖa؂a V2al׏(IHj; qGyRI(d"d\ahtu ]p*~{`"c E)I{X%>?)V1e(il/__YS!)/ͮEyKt$*5E%<ٯy2İ^xSi铚Hzqơl[}>`bPq:6ZtS~1^SX}?pWp=>iXa(WW~IBRDHXhU<e q=gM=SZ}l+N1']?$: 'ITYqSD8RBR\cyRט04, 9y*8bBLE ! m1 ]#¸"R􍯡lg4HJfb+'\bN Lecudp;! 80x =Zѿ;x7],/%k#4B}c):5)t'W.G 5yG)R #$.Цa^U"smշYNy$ 嶙geW1M/4h^rҶXs#$k2'u~g2(MS"%mu5p,05F)A;fUUE`C09W!T<&+C@@ebhL1NuBCecdqQf/+S\^xmSL zk6gVNy#W ~ƙ2EDVc5I§P Ik{ v,I 5FB6ޔ<"h~գyLcyJא02I{6gXWvgUKofaNr^0xCu;ǁv .c)؉tf?\cHN;:h{nyh5ŀwB7)V6pH31m/CEc(U5FD F>oyi}w1M]e¸F(sSJ<1.V\)ȯ|u@cyD׊011M2]W}Qk11_$s#:ge))M's oM8 Y: !-m7Z1-]EZ¸F(sRP$f]|v͕m8DtOg'f)z3IwY|̫_lyu#Gb^u|0fcCݼ߼ Y ˿ao;i,U?eI endstream endobj 549 0 obj << /Length 49 /Filter /FlateDecode >> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 513 0 obj << /Type /ObjStm /N 100 /First 888 /Length 1724 /Filter /FlateDecode >> stream xWn8}WqB~NF;}p0X_g(6IkeQ@SΙ2!2LLJV2 ZŴvh53&5Zj-s.u, k$Bzx&&1462iDS>ht0m`JH*C*O) dҖ Sєez,W)CؚU(:iTRZ䢵5yeE2vLAƞ(C "c F_:* , i [Zn-֢ᅅ6Ila# d`O^`{ف" `:` ,zKa)6EBI I#!_ځr`C# FD,I,N+GbI`8a(OQ43L.6咲׊R`Ca^ZSP|n`H0PDXPZ&79RR;"I e932B0`9P< $XR^ 0 \gȨӧasɆj&mã*kVtw᲼l[#tFRd k`3bO Ob1'ٳnp W*!_>y:A-goՔjZf$W3SˬEI$S[;|cK6| é ~6 g='>wk&QG}>VrUblx>>aâְw?;{X )͎J-'vm}Yҕʫj@uG/5K~;K{m}۶!y\ܪܚܺf<t߶mOg!c 'Ns_>y4Z"/VQչYNd)=]\<}$5M|K Dq >Q[>"g>xlK;js8A/'3=)0ށF{.]s0iԲ}]Ez~%]Ó&8+ل^~p!k NG<>Ƥ쉯p3s"ocudgIq3gɓ| /?+6q1]̓vMM]]^6jd~q1Y^L'/[ŗ)۝NbR0b&]W-i4e=\&٭u o})ٌcjfE-N-כG]odGfjX<̧oFէrg-xT^%T|L/gbz1YuNFM aoy4/nx1o ڥUarv_qgU_ov$OZ]IzY۝8>v;Guk}GȟbjG]!5UNj'6ube6ˉuыv wئ)o2|zd/Ro endstream endobj 669 0 obj << /Type /ObjStm /N 100 /First 840 /Length 1106 /Filter /FlateDecode >> stream xuKo:\F#"iؖG ܍b3rHXn\^cQf猨0Tc/a=T"b)D(#P)FOB18 #m oE!C%J(&=@$G,`׊2H/b $qD{2}Dɸ1nĸ3A`"+&H?b}H (H#._rȁKNHn|\&9~q/MzB":SFΔBPև|aĢ3weZّyl>34ˏԬ=-꛶H 8YgpEr&H~T]&o>'7QŪ2=2{vOGiSW]ꓬfp3g\V%ӸУlui6{zkڍy#AY7"UV^cvܕļ ,1zgw7iG<5qP}7j^:sѴyyY9m<˸.dd#T5diZ.` {;$ u83.p8K=W%EuL\ismL:Ǥ99ȼeji8;e;T+SV.Ϡv_bQ.{#¹TMFE7`dfmWg/g8}9=,ܜ=s>8{9> stream xuU]8}W}_ŖJ)F PgWBL7Z=7q$us?΍]RD `ix$H&Jd:A|hJJ[X#B"T^(pIBUB+Vh`Ў߃A0@Z0 [/ )T'Z 4NcF߽p DzX%pcEbcH܉9/n,rd>ZY;9r Nu1XP( 'L1HrƨI IAhM, Iɪp, Yp.baԣeH\Ґ\ )g0t:%;>FxhӍ@GHw;iG$Q}2ġA+2ZA/[fdQX@o-d~9%G]=CB?r6`ו "nx/tDs )1]&Ix⥁T|gR U q m#ţn>07q7e#nnŻE]~^|8zwz߿A^Æ0Vqd:scu5MiOuw<)=lmD:0nm+*`2]~gծ(6?}۷jVA$~J`> stream xڅTMoJW̲YbF6&J* uhcRLӴn2ܯs.(&ޚIm6xG, mpn%7=A()Ȁ[G#28 %/!5Q!&! ä( I) C3݉eJiSr!Pԁ; V, ӘӨ:YrKB Cu(- 3"fԢc#"<PYG bkάK+fCkͬql<:"r eCYLmFIDRliX.yt4Ž3I7`[eb$UfN(9d;Pu,{2 _,,`d2~cT[jj[gE٬}y<>G̲f=))Q_ߌoҕߟo}sx5Mf~ʬ8׏kE܃Cp,Y9͖A6i5u'骟j_hEkpf9ܽfn73UCz 'j26χء ۄ.[XtgOsmS/F?ap endstream endobj 1272 0 obj << /Type /ObjStm /N 100 /First 948 /Length 1147 /Filter /FlateDecode >> stream x}]o8+|9*#FFC ]&n !=Єl܄|DŽPH)>}">CK)(ON( ? PiW`G&!P4|¸FH9C{v+ h(9x+02T0hDH<"08!}I"<(Zzc{H\.8X`ڭ_;o2=݀1a}M=lT'%n֎BKffAz9*6}ϒU6KE szTm6m]TNa v{V;Uzd;'Feqv΢\9Ӗ{wՙ~وl͇i],'$NnuQB2]7$SحSϦ8Ζc|Wﶞ:1FI#rwr^n07al *{7uŘVLI ._=-+'|XI3]ˏm6sqSntDO bf aO\ݜNfv{7r}1ao~;\ Ow}?rjnWE|ˡ  endstream endobj 1473 0 obj << /Type /ObjStm /N 100 /First 948 /Length 1074 /Filter /FlateDecode >> stream xڅT]oJ}ϯ)]D͵jkBElsu;`M3gf.CL пF`2`??Q?#-.$CZ0ω"12O$HPް  a@)0 (2 HK<<Dѐ7(];P2 ךm/U20K 3KF`|ҁ̊e 4XCʀut#p AKpAٜ/UcQ#94q:#)#!dQ4p,r2Ag4HqD,%%0s 88R\8͂©h#pL'ʄpdam TP&K[#0LR+,IvMNEEi/ >NHb8n<T>3>qhQoscf9h"k5>j 9pi3)5ΛY9_)A퇦|Ԗ0M3wgΣH]}%\6Uxw3l>~zukV|.8h:niO+S]O40?60n[63&Dݍdt[[׋͛OGO=m?Fӓi6GY.6 4UnO=^"nOiBp4)mzD-cQaTN2m7nE^ēd<2p+}Z/]}˭/B" x&۰jۓ )72$(ėz0f(ev>!'k\X 1sSVqCWmuMlMlaA+/4eXR" i\0W{d&皛Uv y< z~6!(M{bzYWiCf@ 3 Cxs-Ywg`_y|~ endstream endobj 1674 0 obj << /Type /ObjStm /N 100 /First 936 /Length 983 /Filter /FlateDecode >> stream xuUMHϯcrɸ(,g@D^xH@"؉9z^U2k 6 R8%\ӊ$PQHe)K+,z!v("L $EA@` 2Q̄)B+GZ/^OzXM%UgGI* u&LbZXek/l6 "KNf3 sвpF^@xS§¨ /( %Xȱ#1S~#JɽP _ ݈`8eGYɈ&fJy)d|Jg.i4QQ*DP d TzTi3P` CJ-%"]ljf Wi",i` &Yi"j YxŠ+M[f6:CT[& qFQt'FS44Na(gCG݇i(Dpe8\y a o_׫?_>?%Pϓ|6̼ϣ+vAr2!l9w[TL{ye;s=J7*!>qZ#z1@,)`NV>W>0/o7~6lٰ;vg=:3ɷv`dfwE9bm?ퟺ+زXrLS\z>[[xvtAeZO*whzؤ|^};պ߼fIv]T e>yէz`[{rttU^%C endstream endobj 1875 0 obj << /Type /ObjStm /N 100 /First 938 /Length 1156 /Filter /FlateDecode >> stream x}Ur8)t9$A*bĵظO6U{XlpB 1^'qkyO%{,=c¥ϤL_| YD%%θ-+qWs[>>~ [ &PXo?8\L a!2%sъ撀d(ي8bGQ3+6saƤK9 9^QL ]$)Δ"c38̵ܞ@L_ ʾ.m)\P.,jxma4BfaǨK dZZ m!5e9\x55NH7Ggq?DqKN4/ |+ S FzTM@tct>ED]}w"> v)շo6eMְ12d2ʾRmP~5p&AHXi/zʾkv2[,ݡ;猂lSy~9gdI3y;gI'=lۦ=g,0.?fl:tY7ۮښy lj01]̂.7}=6Q.0F:`dta5- he[,Ll|yW^Єljق"zݮ~756,.pUD.,8|g-e@1i3FX13跩L%x9:i6yizjw6gx9 v*Ŀx7m0a4,{,Eϴ\`j>Pv8`0@˿w0\$(L\LꍶY}}Q<4(.4#H]4Dr]*_զ 0Ku\v.,#wuf;??ų4?+4miTLQHXs][m;Tm endstream endobj 2126 0 obj << /Length 2008 /Filter /FlateDecode >> stream xڍXo8޿e\z{8 5I$~P$&V4 eW=E,(8_T݂1KՄu,XA"aoS/~Ϳ}ڌ0?oDʟ%1^ By(v42b^rzz!;~!ȏ-yߗQq]W:{.eB<,{SbAgIY(,"^i<嵊 't,On'"%{YF~iw3h\==xw<ɕQUوT(>4<_TOH^Aɝ*[ŭFZn{/*\,+a*ʎBJ =oRѸZlN(k\΋|f0fJz>gqU6z?4QN[R ״9e}cXg"h  J{XS Ng$w</G>B#%4{K[eOLW<(h^v#Xb){n&NVxHasbOtaxADȬW42%4 * aX+~mr!~_׷%c̻|XQ3'zyEB&|Gˡ 'v' =ap<|ҏ D̨ݥqGz5=aN${oWO70OɍAne!l{4G S|1>O uO"[,h4t>A3 ) cOW@B,MI- 1_ >#Q3qĩQøݎ#VC $ϥM ߓ=4<`̿ A8RP뫿3P|v ɮ/aqY/o hEM&-3%,1=TC};DbVxb]`u;w ZMv]sC5s9Sj*imJN Z pV ?XC(^o4T~l/:qIߣ킜0|oN􉕠CZol3qP\sc9C&%yw",]_i ?3LyyR^`CW= d J cdF1Ljü ۤƘ41qo-~$.3~}T!K(-,ҷ-7a' mi1se2K&P?s-'"a_j(i+ H\3b wYh쵭(疗:/@ɫ~RaC 0?BSqGA JghX&o)1:ප8@nh)2)ٮʪWbJƳC!2,Zouj Le譿1R :^MHFϊ}ΕDtöaF.WrY\wJIun_ic+< T5\h. @|ָg;+If^8׿1ז}?CɊ^_n"z%N$wѓvry=i*At+MA^A}Ϩelo}k8[OGOT4A&Q[Ԝ/z\j {5{\&"Z?X,w_UfP{!]dP~^>HŗZ(ݯVQ1 8ѥ[I/o?G d5%] MyuZ l&g'ϟO݇tJ~{bG Ȩ DIgVQa2Eee'Zှvo! }=]Ӌ"4ľ畫k9y~ o'UnC uykMvv! endstream endobj 2133 0 obj << /Length 2584 /Filter /FlateDecode >> stream xڝYYo7~@!ٷpƱY$@4!Y~b֑HIN 0=Q\e'+|(:TO..7'zf6iidz_>ZA}/?~uv9BypRsC?c#i d"E]W4%WY٦W)U`~C!/ 3_K%ަlv[3=iߡ񕼼Ͱ~vRa M_j"?5[ubwEcjFo0iJ{--EǃZTmyW֕Ir4(ڀz^)I<,dSNMX4U?ǤZ5:[Veom۶n3߹v9a^HM4_aќ߭ qx 鷋󏗀&ޝ_|w_>] AS>;`#Qӂ(Ze~fN kj~ `wzW#%3#LwE^,לN?@yP[W a{r.u- ]-ɦ?/֋ET!^DbX ]ke<3/&c$p)B, KtLqaV[Ֆu%s[1e#ۉp2:n[A%\W:B8[B/ ;$Ѕ19H.j.<27 (aXfRn 9gnC qusMO}}~_ΖȘ:OȾiQ2sJ2U$(5[!=P,)L8weZYbph*0ބ\nf`3 =%ڸqen2Ų#a*;\C{&0~b|5"e[^ݾ8`0+KDCSi~O RDL0?+yo[zƓu+C߯ȝ[7|tKlyBɐ2¥{ YGg|k%1!k<71#;|L Npr!"H V%CPM#Yf 3?810<E߹륣 ȝ!HBfu\dsE QAc<1˨Y{+5bD :L@  ̐]| ~cP %_Rvaҗ]˭x9G]EA7t ̲N^BWqy1  Q ;%xR־̛' =?̳_w 3{FEwyҟ`:Tk):E1$U>V$N pPQ|Ė XTL@j~>U.;f2d[`ψ?]ZK FyC"Zgoc[13`sNzRQ$~O(jTwVFGo0ɚ-mW,fլc E{eU, E35p:$~}2OpK-ӼQC Bt]vuWBbx^LjɁ!ep/? M-# Enˊz |, Z Ǖ 9%PG] W@0:dg(Fɼ&XP.E ")m!hF; brgKŽ$$KXK(gѤ m2wYDh$n/R]lSJzÓ$oMUSRαs@h#bΘ3,d[Ƶv E"%զvHa;S79 dz/cӇAX!+@`LV ˊ8Fm,^8dj.&f쟩|˚39Be vآpihQ =)\\{Tc۱1'.m,@nBqu#"0:v -uyvKF%v2isСfOX&,as^yPv['M1䊨XAKe'S hI'?<1!q$8w1=jP")EE '~ KG]G/>&R^u|O:?2~cvL%(Ze0$/.&{:)s7 endstream endobj 2136 0 obj << /Length 2321 /Filter /FlateDecode >> stream xڕYKs8Wxr ]ka |9'd7qR`XH Iœۍn!Ct@hI?y'i\g'6'D\L2 g#ΟkPa.ORktEQ OgZTeAԧ3hEWұAt.RO9,_i!#M]lu]Y𮾭_Hn_-!po ۚ;tFA Spm mєA*"/Қ ]ǜ_ -LU#Xe]Q\K rD0y+(j82$$"Y*\So5vqJEip8]Sn~x9tAG.EEޛcwR) ᔇNl p!e{TXŴk<%|qϏ)h_2/%N%p&)+rM4 @nhllCCeq˷R1&#,?Cuz)BM]+C"3v_x.'ا'&=o(ʀ<#-/W-8P]K[]N]f%L1܋՟d1`T@[" X91Oo.#ȓ?1C!(ٹ\:ҼOOp9tGSzcHswlX,$v6 c(f8QawqQEY$2;hЋERez&SUÄJֻ_ 9pvb y/tup(BѦʥU# yŚ_"PM >_y S0M8[2yb4)rR"S jVuN6CU%eWH!k).3u,cOƏ(4ULB}CP!Tg9܊'Q%b ϚSXY P7(yq25b[n2/&d( ҡ.|ua$!=~l"~Mh nK + tA1c%#;= l2Pc[b`'|&U`)v}"a%uk%G۷5>".0 :}iHD6tGt8ϯnEY&WS-~>MaCj>XG𭺫{3֗_ }ߞ(WC8{oFU$OG%P؉Bk5-W=dĐ E!?]k endstream endobj 2140 0 obj << /Length 2630 /Filter /FlateDecode >> stream xڕYYs~P`81\u-yCe`В}{p0G__CyO^eU"ҫoG5|x#n ՛~+j3j_ۋ c齿-ay?c+v+R IJaDw3yzu(P._Ȁ)Wk>.īeN]ݶŶ6}*H}_PT,C~e:22퉮{n0a56I8 rxV 漢d[/uq_ek[E q$gPi*鴹"[pA9z;S`s$ZӋmM|(,ouhjomc >,@XtJnKdM B?FQ 6=@5C(Kj22 Xb}]rOƟ܃~ryEM$I"Lg 3 S2NU InxݓD<~GF;w>߼ 5 Ppu82~96׺ ܲaM$ˣʉWKr4&*:v|f!8~wf\ )7-9W =PR"IO4$@$ާz[S\P=?f$k\#}(@4p0FZ.iY x SjwmhkS C<  h;pݎBSki}x; 0[z##C0⢚(B?djk 488l 7#nn8~Իg\H" lkL!Y4>9hqH#ߟD^kc WQ ]eZA:Ń<0FI`ӡ8VVסQNi %x@ٱ8Fx*!gCljE qS| ѭI#A=Fq7J60;l[2=$Rq*KDFq{`l)L/z>Gcft;Pb!#de`3viI٢R0sDzǝ mKܽ"*&~j渦asJxh=}Be} >t`eVq*@br3PV[S:4iqloVo|_''we^[o˽_!~2zt^[3Cݓ>c RxH6h `5M|Aq2V1=X)lA}e>nw4tb!JW%'w^bOǾbYD :˜C>|i Ѭu5@q\?X\w^ N#ʶ޻ H#&}{ ˔JȜ4ϣܢ&ҙ3#D}c}u۬A*Gv>DF۬z敚fZΈօc3?C3u9)YzWą'Rfk .>y5(pW`g3}Q G88%2X^$|ɋJ7?hI<u;q  쀷SxľfSui7 [n*?`dާ[%s^8F&dɼ9+ .sɕ{ȏIAڽ.yp_}]A =E?X !*Ϝ_ }c jvrďc;NcحSJSowOCOJSȌd5t`k\AP/WDdbm- Bֵ9 {h-HOZ۫Y(T{+AM>m{Rx9(=43Sa*HPR:ǽa:,2GptTc^ 5ɏ 40LӇ=qbD/IeM,uJ?lgٷWA5 endstream endobj 2144 0 obj << /Length 2756 /Filter /FlateDecode >> stream xڝYYs~P6fp;Ok[DW*D I aI>} RJ9#}?}gI,LV>Ͷ3&~}Kظ|}(:ӾLݮnyob_-ayW¤^6%ê/Hk/Z/.oS#c~Po{&)-vօlGG\3=qm޳h %+d.^Wn٣3kKDZlBnylW&5QA mmU)R?oBQv7#P{-Wh-E/-luV-xxN8ґfv;V8Ym~@R\5yYuG` .0r D7o~\$mkm̠| ?rALptH*1۸nDJ62nq>=!Q=Õ4uJGϞ)Meh;HeP]' tpWBNǑG  F;=K˕z_'$H=Y_ ,:_3 #_f*¶h4>uѠ;e% DYTE:?UUdYv@*H bAK° te68U(ݣDtL"NcJ Gr WKnKc19|uXY|gge6Q:T=6c)fHN)HO, IVrr-ʘԸnnS-b1*SKHX8^?@:j(^9#DT@۾2uiGOco5hrc-LX*}8))m G+J!Lcg0K_؏Q Jr:6`&_4TH|omaMCk;{jO,˺*;ro]ٗrFވ 0J 2a9ORE4k^ _Pt\!2YfXr e@LϨnq$)@$d1|`tvO˪bjDv8@OAkN,u"D&R(pomNY^hAx!N$]Y 3jӏoQ8@Q%BdMʙ1̃l;8;vs2N6ϔp4(?{X T;L\@$. 82x7<.1ؑh^H0Z]`2&(9 ]BB<3wyOM"]wx$9o095R$-?z CKsu'r@R陀!e/n+&]\.pwD߃`sHQ9+l7Njp[;cF20r[V IUj6By >ph] 3JE ܁сGץ5fa&GrOL@DϿz݆'ɖ{ ;c?\5#zʃ&yJQ/|8@#Wg;%R\y[B:qܼ{\I t!se`7d5RCjN(ٕT8iQ0Zj/厀o1g9hq$;t֝NT#r R8Ō[:QNnN?] ]{Q5r^Y_pCr["|&9UIC3Lv:hyRQ/ĀIEܰ\ϺpAJIg~)֭ {(n3UQ~%<*9nlYv W| @*Ơbt @ h $xFH)K!๡~YY\9Mʜh&ro2o3O7/q9”FH:iz;菡J}:ȭI{e?C' @pxWg\hā~qM >zA8e C'bc Fȧs#rhm.PAMw]bĩJ@=8k^ˏPޣ$bT=2UV7^CJYc7-^Soƾ'+:Ly=nG~>9p$MiC#u0- 9E~9|+ۦv :ͬ)~&T_Ů^?0x͞JdHA@8AO_6$ R}j.w/*1h+5kevg]C%_'&ȅR @6qB17\>~h,c@g$ۚ۸/*2bL[~t *;/K<$3ѹ?/6Gȴƾu7䘐 _#m. endstream endobj 2148 0 obj << /Length 2957 /Filter /FlateDecode >> stream xڕZ[o6~ϯUz ҭfHEh@ɶDeH],oR8!9f:OYaaIDW8<%GIpunV[PZrK#n4lnP%/&&y4MbPCzHCs-+ںmRpYt &ZKj;oLFe|˭ֽhlR!q3E7?3j?vV ˼NH.ZR=UġemUf?$2_&InKB0%nKTYϰz^dphyyj<6cTJ=n>zv[urxP*w'C}M%zFoܼlüK^ oe+XLP6nb.,xadvrS6<"S &5FPVȂ1dLN,4T[`$c2 (?X|3;8v*M' K tFq9~eNM|,^064Ƞyw*4e y dw>)B%Sr^czrpI Xۛ# $6|4;pj,h $04i`pX 8s]u(M<˖H4"PE#ZV`~U7s>gZ0D?xoP3U=؊f h@Ah >j|O{@ Xg r`: `;)aգ丱xbS )PnCN3:ڞ Hm($dֶ TJ8PhyRM9C{ν=9=툙xsS7Z9l;(:PNXlo<0~(9W2d&7[n* Y]N4ԏhu~3†eQ3+ [SW IQ;S1f`&7}bLipR8P-NYr$>k^0i>[6C߿SAvE$LM6/J9+9Q<ƎCe%h @EZkHxA+Z^:snx9T`mf66x`dgwLH4~5)oJeH8jD0s:D;PUxnSXjD2v>z'2 X&"`U'QVvf+ ƻ,e PJ;Z\7$.4x|j#lB̯̄ >9u2G F򍡱}U>]A)16#&K)Ԫ4XѢ WACYd9[^?_|se &#>xK~u7$]1eNѺo=3/dzc;lIްeYFJGx'n] ,"1nuESn,PbKrď &L3piķo2Sx3[۱G3Rbq#h*R# ,Kᕇ'e )&K,.?M4hW)V=`Hdz_{ȲӘ 局1Q`4mK!hRlV2\%x__!D>Ľa9X 6?sމ*,#!DjE 4f޶DZ[T*(#c8B /Χ2c*dG4W q,&IjvJ B Z- endstream endobj 2152 0 obj << /Length 2707 /Filter /FlateDecode >> stream xڍrܸP6 |Oʮ7l!3hc>VRj+ߞ~CRFn{E?ui.vWAۻ  n&}8PO-.p0޶(Л-IPwvpbV9K9HYma"%x;yG0d r`Ƽ`WUiaNZ1āܗ [RO?1@bĚfx&aELS?.T"ݬDreS(l [iUul3~f#gn7 +K"d/fr; 'iҜ޾\=@, RZtZ='>m,NqfǹBIt01'$g~IF9ֹ\O7: pi_M sХ~"6J%R4BVJm$9pNt0xd&S\zj$~F6(ǣ 8Gȗ9Ǫ5aZYC:]l\1 z1E[Ӳ1۵+2CQ >C+YNK*%}lkVk{t+@~uӏ!RyqQmw Ё;5 Bq5kkYΩ~҃RӨg U/!(J| 9u r¨u~W]2Ε;rq klqDFvX` TJ(Eޠ ='G3rNx/Y(W jJ>CTarA`S7 |+Y/v8hIEҮ1Pۥ܀ԕz N7YڑpF)q#̼sI, '\$-9SWيe׭~`30IQ0Õ%˄5v Z~L3+6AyGgDɤqJehUBbKY0j#JF-l?%/ȣo??lf(=qH:/.f#!LOsqWQcbk@ůId˩')չ LGٓySAeS!\v_{5)<}z,> stream xڍTMo0 W(g+n-u t úb+P[Jei(QN! E#E$< fY*hI1@aq3/z9(dN4Բ ~*Ҫ((WeYNnn2I<)xU,G@{uќ2%, ´`5xQKbSmmuh4!f1ayHfo 15]ǘG&#=(F4Vd hZ111"+L4tlP')"2G$Oq3"Y"-D/h4k *1 og/2;#V5Pb%, gyttUwnz̳7̶r =V;0OVc XR&,s;iG;o9.PqMZ,O)q9/G-t`YP K^J 0 3Bߕ;1fņB#⾾-- L>›*DŽI~DZHJ3nF _j̨y:}׻"z#{ÿyaOz~MN). \22^8q]O"~ endstream endobj 2160 0 obj << /Length 1370 /Filter /FlateDecode >> stream xڵXKoFWH֖&NM[EP4=0Z" .Iq}gvfIEwgU"rDkt9^NZB W߽ Efr_D2: [z95LB&B`HH*NP4\E m\$ iOǺ8mR6y4BXG҄Bʘ I.Te|UNg;D#-iF&t"boB`#B{t d$IsXtKMK!XHa+JEASNém-P(F'J'Zorܑۢp"5U!_U~B\$'xW%/Kp[|\x%nb) ⽧M^:J!x}"jWx# Qvi򲪧:w~9mll_acÛY-& tJNJ`4$`V bVÎ\)ܓB$M> stream xڵX[sF~bMICEM烻aSh0BonnI1aOiOyOy^8 i5D"1 ۙԏNXk;Y<8z~, 5 8 ^hNF.̊ -E㶢<.۩#8I8|ЅZϫKxK,_}!BP) "+6m,lncS/m! U1Wug 󙪾y1k2[lGx~*N#A"Xw~Fkf@|1XEG#CN κRYhFD&qDIeg2ͣ#ﮧKMpaH$JtNG[sYϭ=ևB;&iGDG$IzģϨ%hB$?I[;ZjȐH) 㤧R}F) %W؊KX`9N]s$@N1Ğo^_|]eQ H. l'6V+CXtpgYk-nm(f[9a˺J|R`-FԨ "5ȵV(͎0Xk`gʵC)Uj7cY4܉eA2^-P[:m#TjVbg,$$3pnU%Ҳ쀗ɄF4S2-7e*7]Q}½&6Ht֎m|va383Y)i{Qr ;Fv2+ˠ]NJL}B ˃BLy}z,+eW8Z;:_/A*2ewpYTrPvx˭X)-^>bHg`X uٗd]z2޶bgj0d2{ D4IXmCS_nMBpÆ5ّHlv2{m֍k+u\c~s(3ܼ3zt14Kaz@)_{A8P 80d C9Y o04GkCh~"Lw,ɚvE|@0od("󥪪sS,}rc4X~y#ZϼGAóltv2#0: 0qxBozNɥkҔ,rߎ_4C F; Y,xpi ⯴B!)3wL8ss6콏p=}-g}e{{ 6du\IYW->V S{ju\8xڣl}(z< yJue&0yO~'9%lƅ%DW6]u@ͧ\7]6' 3Wn:s0ζϫ~ɇٯ[l]yNoA{=cGߍ_e;ˉjul841SݴUׇrbsRI)r'zB OwH%Xt d6ʃWy?'jfuS AR^Ez> stream xXMs6 WxzgbUH-In:t'vOi$%lv}(E[ <`6fi4SBԳ,2yF/w1Ņy:&g, (eՓojW/پB/q[f$Y}s~]\y3_pi06XqvĜ5CN x0LKN/EmkCόo78TAڂf3ZodXk\ٚjOvVCPxEӎ@  &BN`s6z~CktqگB,悐s 2e%ϹbL/^. xM-Qm2Xa *ai4(qHr"WV@B G }-T&-x2ic=5\:԰{&7wMmiAx2n) Eˍ`=_*|eQ>@#.\ ) m(*3:,„V*KNeUdRu*jiVOO&]J | b+z}۝<#djbu6Z9x3 {{)\ qΚ|>qUumSwБx`tvC6Y4xKk ]U |y|6./fG+ia^n%Ѹ[`_W&Lfg2OY[x*>Q)d,^$7BAv1-k-gc;Y!UqwG쯋oSEdΧ P)L<2- "҅y`r!# d}w}qu&tI<lJm;C`8ں1y"ϽGJ3SG}K#|OQwZEi([#8p9DE52i<Yy=KAwx4X#x(TPS`Y^C!BS e: S> \C!4x؟g%m|^}8H?;<f4LNykXaA/f]tjs Sjk,8 y'B~c_n@.^W"SqWuz&ސjQW!:T'WTMѰOOJ?+*8'5@/o>RWj (*4SIEu*$\ mTnIy׈b հtrarv%lljMͶfpڕ%v˳3G#YC\##S96:!D:.ȵ eu[" ]a .s@HGT6\|ےZUZpҰped6e^ *<{,? kt4m9NaSwe }4.3tjy4{Q3i:38IC[|-(- endstream endobj 2181 0 obj << /Length 1637 /Filter /FlateDecode >> stream xڽXnF}W-%$V76J"-R6JTHʮ3M-i j5=s,ą?> ܉ʟ,'n5Mhp[:o'z],V]Whb:f~q~1c:R9Wp$ů'EG 12!<+ƥnwtr?ͳ$#%u'L8}vCY9M[\34_4LS˜;926x2K u!aZO֪ZnEmt:0cn|ȓTLz4SDC.g \2wWo? V.s5C ts32.8ާw&5|Gm=Pdi @8 b1)cSR \fO0t`ѰGC6hD7}@ "P Ȭj#Y2 #â呐]g; 5~@h.AJssdZAjao[-j0aQM3p b ꩝G,Oz-̭Ő>P3Qm]#Y! Tf+W /N񈺚F|[̈́el͝5LSRN@ɵ),1}mϘi휯б]St2g:LjEƮҽv(Y/JASZkD܆[Y?IF % 쑝nKG?iXcED,Q\T9A2ͽx1 _ftK:EÛ"UQ M-<ȰM|.1dK."[괐% Ǚ5)$Y+}67T^\"?\V,5KMRe\ƫ%kI< װ!z =Pi<^OS_a]5 .!Bm(μNt-o MPl01]_4eW’>9\e6z+fX:QA% +Ua &-; 鳴nW8"m{7{<8h^i! ;~}EmԾ.β6w]X)u;OzIfss{yrw_]YQxAeaRICkMKIQK^tbO OQb~v?=5I}!ī{E7Yui,8«l\5훾aݾHcIٛb=\]05Ȇ'd> stream xXnI}+1yV}H8@6&bO(,~ja와W/Ps.GKOB -}?Ha[4{TB%DTBy~PuDZ d1*%= VYd!YPJXɯ* kc 6QQd{Z ҁ#($iap!8D7[=!^FCɤʰX!MX "` "5!\#A#y&eڈi4@k̠aB(cFk^0e+pBp+ s (QU'C3h`FYN#1]% m9^gq2Z谖 9p "a&¾Ӝa-g pXXdJ%@`61d{esjZVpXLC 6_g Zmc GIrfZy0mE(%s:IrWyj^@Ά3Qoo/׵hv; 8b}El: _gx6-Fv~=-w`19$u+`f4և$QosQM w_f~/V=0쇸p>O5(c62W% HC@{f2t096~m.mH~-@o)wBS2=Ay7]eͶKqg.gv4jo.T*qR )ehյ X òBn߯t\TJTwUxiD\{Gyڛһ̐ܟUGRМ W~DHblvJv(Ōb֫L  㴗pga{WgIAOstm;pklV5ZRRn>/xV?ͯDJl<=)f*b;l{[0NY5d>Q-;ՠu`{tgӪUxfo5޼)X_n₍2MPAc^Ğ.\Z9==]ACXAԃw2!> stream xXQs6 ~ϯ|sHԮAXW[Ir)K2xeC  qYgZJd^pmgD\z!WˋDLpT̖wCU|1e/A|Tκ87]_uM-a&Aa9j&ljbB*2yUoY"qp]6 utB-ʋVnUH8nM:w놘oYNA4ͷL؉>n7U"NPQd}FHENj8pe(pTZDD~ӕ=e/xTA;"VeoҮ]zO%a\IN";#k&m֮֍~B~U58È>y| 7"I8r\։-𤸭m]AґxFUû7W˷˫wsR\G4&#)ok^97 8 i* ,n]tq24yqN١V(ۢr0xmEay6P21uPit$f r* 2-&Yʛ7K:CfϿȉ[ȿ(M“|2}Pz|%>?L&AS`PRqHqp27C4Kw^>,S1ьihǂEPip0IaK ;*; s0̂x-|!Uvĸ?EqH LBߟD ;Ft2S9P:E- ftb3bZ ې6D= 6Q5I r˶&&CkBT}_fMQL?r 2 ,Nz1|*5|is D8 _D]Y够jAy=_7Qz]}nm:|ess9'; 䇙XG{!;@ $:~UIp> stream xXo6~_G 8H Ppq0V& #ɕgwÊ> stream xڥYKsFWV^Ij]Ceˎ P  Fֿ3rO"wh-"ֻ7-gԸF2w7y3ȍln~s?:) ~/:RqZ: \̛nyLVo{*'k vu(ؒܲvGNY롞;3F~D{†tnO[g=}ma[os}Y߮xczm }S94a q҃&l/W7f91+xۖZi\Uq.yUDV;`Pa|} Rq2Oan$tdf^ `C萏$ᦖo|9[P6Ia$S'Kvؗ"0z*gz)}R}#L0Q*&>*T3.(+`cɋF8~!@>ueO_!c(.-l;T?{H=D~qz*|9?\(klN9b#Ж|NWCF LY`Xi@6 \A Bb7>1-=vI[Q6hX+BxM&]ʠ(i#on]lQdAMẖ}-<3rh2c9P]dY\nz( 3$~ nWW]S"?fX)ftmd)з]=E@bǍCx8:4C-V\3 .ro!LƕBnben@XmQ8H s+LI'#fׂJAlSgȲgdx3jPc5 7_A)};,83:S"^( Ggp FEc,+.N3'm!d.QNkOFNpW \C}nh {]$; &rn փM(?OG䩉B5'B@8xiQ,y }'Bbz/URaLm2*41~¸ˁ^vx"n^Aq~1 6kmnH[ً #Ѓ'b6j|)7c%RG ǦJ@DvJ| Xl8[6,.$\eє0wΥ`2'o8fEa_/fRmq6yZ؜=7pyqTjRTZY\(o7sSGx7yZKddb_k5(SؼRqTSP<>g0_ND򟗟-VIK~g; 5p+lL@r<=+]> stream xڥXYoF~R57܋Gְ];uƉ-(}g,$@&!-fRJ3nb$f݁Tap#~n4''<$.YBW* /dࡽ4bnt NWhe͆;Iꨭon.f:`ڣLHG1ϥVM<4 l 5kUٷbҋeסy+Lt7LPw-_ll&q,n77vv>xڛ".isYd*;y"-=qƎaG "'URВ+qIy,i3pxAwbN\JJ1chJ'vtZg*l }jU"`3CD!i1J"V UD\RLf呾ZZ$qu7A/{%= *%BE WaHwDxS:8A89]"0PbCUce F `Cݪ>2)N/`htԈg45ΦBxȣ=DV4W36Zؤ^w1:Tcxwl/qyZѠ튈b@ H_49Ԑ]͗ڕe.*Etxϫ|52ӊSc&dy7.˫^D@Ufg: Sæэx.9V9ɔ`\Z`RYjrpIϊI TTGt`/wHkuۺS+L^~їQTH m pijkD|Gi%Q ڴeí%~HC<pC:梧Hg_[>5n< $˕/=X;w\Ted9d'SjӅaL3kX &e +w7e4: wAFI6[l\Nt?ߜ^\t`5tXY̠0`d&IF=BhmB㊨"aL̅ϘS@nSWI4بt剙 !N9qA bʃr2lF\sm|aŽA/U6VВ &ժȬzԺk|նK:u61G83jicycE͈.&gGC. NI$OBdf!o's|t{6u endstream endobj 2207 0 obj << /Length 2058 /Filter /FlateDecode >> stream xڥnF_ jOi)vAmQ=Ȓb %C7ߗY*83|BO./;Af`wҭp5~`!D.OCV|wK],WZkO}\x?]ʘǮ9eݩ))eW~^+J)OF˿׿]J]1Rr_j*קx@b *[: ؀iKKyEQ࿴PAcv 5ű)ڂyd(`0C]ڤYDǛ; ڗ*i)/|0N;{` #zoC(#jXPt^k&KHCwpM] !(T'KMpya?K/-+ƟE|"4q$wT T=-#7 $3 u J؂[&Yj<NΛXX%|"ŗ"=)\șmQ߽o1wL/_!]=JKOmvSHRZI6 ¹Gn3Pݐ Ǣ)_'fҏFqԫL2%/+nmJ%ҏe|f-͒7i6R0ȋx:ZwvEVzwd QV#h|6~ +1$"Y7/W {I=}iaotO\v;VDuuWwQ*(_3J! bNPf H.\7] udeDy2P]bUOJ9ňj hPx.k H"GW5{z"rpat8?iW:|exq1]8z$rHpq8v68#(F@)U )2y;H 7D&I>WU~{1o gԮiHuXz9+mȳ>b=sv_ƭIƚ+J헖"h|KKр+Qq)^:S/ꐒ mxZ yzi&ա}eyIU(K+.+Fj3:ځY}t}2ԧ"!]o2h ӑ,E9ʱ=] \]3bK,nXެEåFt`F0` `F@d^ZmG0G/Xz|y?i=h޺`rFxw _Xvt/lyl\o/J!!}2r_35%e{ۜ[H3X9#n$dSn9G+Lchs#$94QV˶ 7 $mܧzS>}ۚU9Y'E*^+KOcYg;96&__՝5eBt]օʐmvQ@0k cLif*612=xf'OTl%&ifEibA鷒u*@}y}gigvf8{ߩ}}(igv5dO& hjIݱm'& -UfpJ[+ .uY4=D$&z.Νl\8 j0ǻ>.M endstream endobj 2212 0 obj << /Length 971 /Filter /FlateDecode >> stream xڕVo6~_G8- {J[$<6 %Ȟx0`OdOFEZ"3rwH}la2|7xTi!zjҌeұMgNoJ:9zq1+ufAhvE 3hU6vu eoZ[ꮽH-ɮصGv)5=_c5uX(B 9T%IP $+ݲ- 1&֔&JT*_^=OG8vH2wM[{,UGah(5۶nʶ,ϛrmhCFP]I zK/cĠ_"lu``[ý`نF#A (MII7ט\L&W/p?~u&̾kq6Ҝ7mٴʲ8[n(DYWOcI+,x} újؾiO b3fӫ7Py wMc%FI<@婴}>`_fN`Yﴱ8B@KO$ΑmN S)2i=3Bp]_&>1VzG;Qֽsǔ*B"Cj V퍓Wz2dHME)i(UToE)3!AQ 133[yB[`Aѧ@0&>6=. #r+U0jHP,T%.PP 7/ `5`90c>G6=л p#-[* TZ:azϥn\8.B{h[^?L- *fo:n 69^AaGϱB4mNp~ݗ. endstream endobj 2219 0 obj << /Length 2643 /Filter /FlateDecode >> stream xڭYY6~_GkIvdӋIҘ8yP6HO[uz~0"Y*Jo&U8&aÍzn 76 7ZJf ͯN~n?#ٙ7:x&p%ׁ.i W!늺BFx\"65oߦdU{..oZ^;/թowJFם&fl˚"+Q8Uqt퇛߼c)4<ivvUWU"ckWafVV#I_Y WY{V]ޡ>_3v",ڎ('][McQܺM8Feú*ef`F*i&>;dzSh^ [gx:? %wKx'8 E>kIVկɐ[%-ڂ" >q+kd=[̵H8:@M.EuD_+aN,h*˲-лH,{UZeAԇ1/ p& -RN`NLx`E[@.gC]Ӣxd@6N1 iq'n vm#|z(EEY#A_K}|-8112l$s8$F=t}##f@*BbqHJfKY #8ՋmzLLrDvʬ.H.o1l4JTy EمjQH?30@E;* υKEOkȡ?w&φf\Xlϖm#?Tvf|(si D:B!kл6/ce\ |'] 9+45FC}Pp2}P]sFNE"õ8~e}mD>rw!R(K~tC0ҡu1s@a`HƜICV N?.5رYkGH4u"N&Đ5FqWC5TᕡzBP8 ( DQ_( w%ldznB=yed} +hˍmuPnxW^Jlf| %VVyS#Q.n%*Cѡo|(a):٫qf:PQ]8+pz 5rR6=*@XWB] Q904="7`a)tyudNx5]司%>L$!K8Y(8*?"#h w skx:"$Z>IW.xP m}i@_CFR P=< ̏ZFt ëwO6&*wKss*ഖ&;wfy'sV> stream xXs ߿̚I}=k6sswĚ-W/ʒM׎LA @rO.pj-([ Z o͇-2yi(j]pRY7w7,WZGݗJ7pωR!|_$idT+ؚ-T5{KOt6on<>'UW5ro~{eY+N:<}AdJ$pFQ # ]jTuM-JX8q.VR c[PYE* ^vie;`.El14WtNhX4(bJ 6;cTXd}c;Z=~ .^gc]-˹`(ʃ@Q*wIXpթucpdt@<ح(5-tA:(PδGW!v:2NhÇ-'(՜ԉС|t F4m0|:#0NHnsbu*=34*$|RudB@%h/T_xkPHrJ2̅ΣE"!dܫ :MG\pT1rGɕywS2Sc._eQ~cd2șDPL+)JB->LK$ cE]"i&U&2_vbJ4 p&kEk!0ʹYѱ.IR^W6*T;HkZw$櫫?"O!]{y,20F2\*KӊyeL<qWXW#h*iM^l(9wӵ;;ƈ]C8$ɮň(/A JT$L*1cDBGr1)%w$fjќ`iR+b/yhwxys[sUf.wWe.򠿨+,Hxj=(DDPs\iKX{ݘvҜ<8p@儁W&TKar5!#'pdJh-Q 4oJ>s5t9iБL|*s}">Mo7@7M_]br![,C%QcQ rq6TLiӈr 9P%0xq㊏M!'l<`@pQYƗPLH$@v2;5GNzd< x ԞwTF !Hs= 8.~$FdvZSq.9C⢀HfKשԝ釦^s!'4օ E7D8M(%ס 8W!hz8~@r_M/xc, =bR}P1WH Ԉl8_?։N{  T'4赋sY RtS_zIC@CAs=[zWan?iﮃ W.2(h q8:?v&]z't=MrRNnQ LIf.+5K4P.C<o#-S,9w 0>2ڸ2ÀwwA[ABFە7;vGZ0gTnc7ʘb7Cێ8BZa@;+8v0GD'/ 45D'-[];4K욍\" Qc:77"E}i|ltf cG6A VU-Lc ո=eB<>Û @SX-PsD9^LDj5»pw{-ne[oHzY l.n鰸![3WFP<늅z<$[_|2"WbȝVL|2*joKuMopP8׵7_P7aI0~/} endstream endobj 2232 0 obj << /Length 2329 /Filter /FlateDecode >> stream xڥYmo6VbHz6^zv2l %CͿP/-YRp83E"Rag]dG:z'n O>BDabq_/7;sj W8M_,8eS_-e<}R^(R.Pkw ΃~WPnV=t(DfC+~gZ+Z^n:w@D/ poXuqsITz;X7v: Ui*.-j N*γiXƊءdlEÍTEۃ*幾4=]'qyoŲs NVBwEqjlE0;cSve r7>l :O2 s_(>#T2i2j/\y# Eʥ)9߰0ՕnZ,`i&7xf1qI<]%885MG~k{iyn'8bG4ao&R4:ĀOqxreGHS$$`p#$FzfE.`WRi_,qY(`6kgUvOGuӏ8[1Ą'T WCDuT9NX2< `#\c5^ &7N+m]0h]Qt4_do2S=DW㄰Ͷ.՝#>}gݟtU۝+QM#Ydaā% m+۪|7EaaBpnj7to#jDV%3z j_C;IRq 7.B30͇kT0M|Ꝙ:bGP Şط!Ӣe>ƵL1lQPXG:q`:Dt }A.&L< єGÌ)+u|L2 |O Xdn0nҪCA`>Ԍ!ܓ3ၟNY 68, }TČ(D0K%1X^˓D^~Qz b,vN&辍 2h0D&\pJ>NKƂ!9$ 9T=@E/p AiΞ@azgc0BqXx#ĵ/:tTBG0/Ǒ ld 5 B9` }gƙp_&>?x+H#ulL{*<ȣucIbu._?~Lxj{t~cbPڏ'ӛl1V_^W[~Gx.Pډ uǪ>U`X͋"JB ə-9s↝\>fZxv3j/XqQ6OzxA.c1. VK/ Q6Ru = z[ꀉFI '\ 6mY=鎾]v%-$`|b)9?R8I6IɸXd.sHvr##W4D'lYDa.ҕxYkwdqsl9לE.b ){UtFJX a+ X2;PќHB 4Ȁ8|ƕb vEO؀X$驵L6Oꔴy%)msw?T>6y"<7xɑnS.>~]MSOnONq`qP!?خg9!#o[2O](;6^V_|@3(NWzYU4s>%[p՗;JP- din 2t}ž'q빐X #8)+P{$pUQԹURW endstream endobj 2242 0 obj << /Length 2231 /Filter /FlateDecode >> stream xڥYs _5cj:FuV.@S EjH*?`Hd-wo@ęY읅J;֏g4`%.{?τ^,}V٭#b)#ϫ.W[,/W8RNVN/L@HyQiW(M>R;nQ6l [jAp% 8+0dyL}'!i%Z^-iڣ^Nڼ*3Q/q? R-ܖv}@>וfMSt) 65tEӪ(?mFu F5@h /@xΗ AE 9|󘙳緅Vʢ #RzhЇNMC9Q2oeio&<.z:lZRPtGm+yj )v94ٔ Rwf)ҕZX"0- %rҚEQ4S\p߉wTଷ|*N aF|orcz2]F7AlɼW9"ft]3]႔a@@Ӂt>xK*MWJz*} |/^.n[㔎 ,c7n?E(pJijݾP`c^[/-2e wOO_.Oi@n$"K9zCA_?WSLT}i^|&!!حSt-̤ǁ0Q)fK4> ,0I1|`=MvO$lgMbøX1 JZ8^GgD^plc^Fk_:kd<2~ALB%c(MK1WH(@Tr`1Ysvw۝@;nO(y2rdAMHZ%yVbYQVDI0WaFbCxSP/" OdLQO$#F wpz_)%:| J*1R%UR q#Oa1=ƄYQ1hr, `Pprr,) #G3vwNAXifaRTT&d*x}\坪,G>ePyi5 gB`SFL"Rd \1 |2&Y#%"H7, c+w>r^+G{d8Yдtgzss!)Cp ^#_HLX._jܩ9" QٜG* KB،{)!ʈX Mζ%n88j7gaQ$ST+:LOS6vMĚ9R$%yд1 +[T dsbԨ3CIà=%֟;AVc:r٬9Ds3"US9VyR/4cnjT:OZb}N lO#Re b~ ^R?@˼}')F^h!{ 3D+ {ݛdEf\p!U+eNHGh~4JppT>jdP[bØZ[վGAeySmAs`_,C7]_‡B*6,yD0-9/eF[fwḭ@GiL'!d26H[w&MK(vrpXc /]{:Mf`z me?mah<)V񫎇1aLsԐ1i'Ƀ~]}C/۬dSEN^M lb-iSaKHG=!T{y9j78ژsn3v)NUI3>䰵,. %`ܕ~3R%_3@ۇ8ݔj矑MNfn]׽V]u/-f ? endstream endobj 2183 0 obj << /Type /ObjStm /N 100 /First 921 /Length 1766 /Filter /FlateDecode >> stream xYoG~_1  pb`' y%!ha&n$]"j|kb\`Y\C2RsAg )Rjj ʌO ebK2~cr)!BġB\+`@2QHXd?I.dH[ `cmp.Kej8@W@jSa )pBk '`UubF6I,/א @ b/6.=G!YRNHEx4Vv kFl?B~V5eno2%k-bXA?lZgQpB0}}8 mɟj.i$ RX'$RA,|*8rQBkJ!y0 P__p@0b:'!;9C9+ՊV]Z=8`@c7)c.> ' XkNpIJ} ɥdakmu ɓ0]u5z2};୶tx㦬kW>3v-t70v mg77zSܟ-`2]~}ۻ뻍}xS #(榭Qs Yet j]t תb ED %k%z\h80hFolڦ1HWcʷnku1oRSY)<R4cSmFF: $&q&CNOj']=U ӂMSLqTJo {vzb1;{vfgtq\\著oVa,H 8 *W_Ζ9Bw(t\JM5EU R\0WOS Q,y9ͭBJz2[z>7GA~B`^J9vi0@: x~7ۼ7둼=<1|J=AF3PS3Gsг4UncҾ+hӣhJ٫٢'3l wZ|0Nd(dY 3vt>}E%}#kqr\lPiSrgC_X7); ]CK7ԄICpΛÛ|8oCso;Đdr|& b|u>^|9ˣy9nn'qsˎT)pA3e~-Ne _ѕ"3l TyB'ć Ň t6P>{XX SjgqhEf٩rBc5UyROɽd V0PJiPFMq0uԚXm5t&|DgB%LW*&\ۗQKgZtIH)&. yg,ݾKY~φ g> stream xڥXo6_G5Pdu"6Elɐdw;ʒT1E>R<ěEJwg4`.:1fs/զj;:WjPJ92vEN, aH5_nj ) XQ689 awx+$o?C<M_7eI#y -rE zj|w9k$9uIe |l5@}7Mt i.n>۲z8~/xPlp뉱A].߹aa 1arhb4oʊ&1$|ڜm?푠Kp(q8D@ G89{>/H۽u4Uhgܱ -99 -"S9Yڤ4zwH*>_2GStˇ=&HֆcaLt{,8`!Z} Vק=4mUBR9HjE .QIPMDeGPI%Jd}J0h;))$@aMDeGP)GI(DEʕA2h;))Ǔx ,@@FtfFnwJ›XDH(nwe=u!Wxd}َ֓3 n0`j4mś-n=M`rL(h4f^ p_@cl/# آ_L x*>z]A0#V6=_mrF t‘\C05=X@]}mmU^revtk䫗xS9k v [ j\i]X&OhnHdn@D̫Nlw(hVۜOoyW%Rr&UÎ;e3 7"(D"G§]P Mrc ψa0k仗vO9pc l# DٺEF'QYypP$u7"c-S/:C-SM(^~/'ȉ,<)7 @@i nuf걣Ϙf9H*Ne_zUЍUDpt֚h[^-?~(݈? endstream endobj 2265 0 obj << /Length 2642 /Filter /FlateDecode >> stream xڥZYH~ϯ ĵK)3nox1X΃Vw +K$dVRU<ǢZ.B'iI6 J2 W#ʷW`B" S܏,W* ޮoYg7#DB.zJ])RK%2"JڐPKxEW>GN5ὕ T޶j'+cLn6oI6ekRRJI cNdKScŗi}_;lMWHՕ߉ 9=z"P58E,kaby<ɶx<)뜔'M l5Os ,,$/aOgdK>bXקR)  vTepXj"9_#E"+2-ȧ0g"i c4'>i Vaccç!~Sv!u }Ɖ];8= A-k=/fD2yUܮ߼ł#qό: Ja$zZ{0 ;"꓆B18&7n7$,Ƌ;q ێRG+0.=*z|*ff4ODzysH%=_޿yxz@܏$.-ɚ;L4U+rRd!{9& MNBF!yT89|VE` %P1=f%P{̪ ;_;_,'|w51nZ<e\mH_nd O #e-Uƣ @閁XJWoE`cP4iMwVOl;`N^_^DkxD{*3#!\$$B715$HWfꋬU 媢JZ]' 6!lmxd$е,VlLBoez3  V=/N{C~5(ӥP|Geݐm_pL7V=Hp7:IG>.Mzr,< Qf,yu2A$f <@G"Ogzٛ/ΜF>',[q_'q$fX{'Rڝ  Yn0cqO"n 1ڟ2in\{_ &TpGO CB|,:W{Mމ¤#Y)QHyw>z[ (\Z1-jZ /׀ .[fh]2R.kxJYv2Vˌ3d(S_CF?<V}O!o~L`7Tӯ/cVq-Oe mKsOEYSTn\S̑7t>:$t_MqG4nOȍf/рbYtEDm^ti6Wt&˹ 3.A r$P޲:i&FQZ_0o%Rµ9Tpj)Z+>ׄΕKwC)z׀TQ3nR+t[pH'GÖY=H8IȄ11 j%ru[#+[?mNzn%M^*VFݒ{q{q).NG&=w1̿u}U̓^(H]}7:e8FI%˘4c5!kP sIzSMhxi I7LVSYT$%;AɉaR`L9 K $%S@P|i endstream endobj 2271 0 obj << /Length 1317 /Filter /FlateDecode >> stream xWMoF W(:bun`a՞$BmɐeKgdQNR`jᐏO$g#el0c{9' ˣYZ@XVIK : hOAGuC ۷h =n˃7V>yRzsXckNAAweUla-s0p}n"^2Y#k8!5Dk$͔G%lrBdP6ƣ?u ?mc +ucmU},Z1yQ}|}q9hKYXC&Fhi1!J佒CHUD&U@ WO`[6H;+O;Ԁ@r5IƳ R0߮KU̇{.[P/}H3FTV.kHo.8:%ORH?{XaJѼDvi"hukݛCu#%w$1H4g.(1ODgiXD aAMKb)> dLqifJ;X(8MY-P}k(ϷuuAлH:5߈BR& ߟKkgy"s5QЃi..GfQwgx`srί}/!뿁_ c`N f:T<Сt X t(<P2(1")(SFi;6WyQfioɐiVHmG1gt qwq";ZB2 ';bl\q"j㠄3ӣDgv+6ʆIJƍcENgEd:5G}% !% "%ot z#wզ@u% _S -@//PhZHK$~ qRa ͓^y"CI_un-:t.]aݷx]O &[? }~9a+޾wJ:9?gIfj|tԤ95|(Ajaeky_f CZ:Aѫo}X'E"Lwǯ1@EvWJJ endstream endobj 2276 0 obj << /Length 1922 /Filter /FlateDecode >> stream xڝXYo~ϯ#X,TJ[lEۇ15:"lCmL^0g93gIL8 O]@v=ẁpvDd~d:jEtAz?~Xywq{N\|1IJB<H"Q+?KG"O>=>|2 3?c&ny loUmLk XIx fImi;k`'N 8c!oZJݛX䵻~1 ģ/1Q'`V|ۇ}Vlxmѝ)+$3K^e}y:kd 0O˛Q/$ʏ̉qT84td-hg䜙 b_Ug|X4k2yKxITyiغj$,M8E&ơg^ߊ1cA?!j,Boi}?H/Hkmœ.{c;㚮Y"b^^ٶ>ͮqOgJ)ӊ)zj3>00?h(n}߻4rH)z9 g1ÁP9b}Y/zö" aA6-;>;PRø8% Xa~dnL/FJ i]>N&wj>ѓ(zfEpl"#c4p b뀂xA4ꖢvi\ j xR5.Ow W6)fg!y܅BҀj1@#폃*$K1a~OmJC^T/altQO^qFSGI7tCeIbp\@0trZ%J?_nk+i&Eȥɇz Î%'7+.A ]:&o$iKeEXSɅUkz?d ΋3x]r7K&ʒ s]\k׼58cv;n2npND,PT"QcRAf1B'xݺixKtӢq`G =ŶmkFNʞȸ] [ۮ-Wp!xY;)n%qHX'oٟH;$ݬu Fn,C]cm_M!H. A0, q5z'ᭌaՆ k. !w7pmT 7kr@u2HCaˏBhCTx4ās(eᑶmJL5,\SD:pup|VH!uB HJ@{ R,KB5OCѳYT왩{< `KۢW#?s~_iu@=> endstream endobj 2281 0 obj << /Length 2382 /Filter /FlateDecode >> stream xڕY[s6~ϯ5k)q4=+N<",aJ*IE=7Ф$dZ"ϣlٿh. %r+\$__6* Wxu]CoJk韗(f_wmS/Wa'/__\-0|&61$|#whm8zS4 ʫfRf_=ljg0>4ۆgOxǵ\T cdԯlɰl*O+Aw^vn.>\'~d3fA.uQo ef߰dnpy^>@qViK[*IC9to3? 3'G~@϶ kk666ǶðŶtV2ZSkSa](a+q;dcck06v$0lgo(P`ڡmm|N( 5AKw8\M'#H w6Pmk!IB4ɬۢݡ*(;iGMk DXoұWMlIUBQ V+GYxԶoZw:_dsK۲Kϔ[#ka 1%Yh(GAW#|(myH//9[ 0(y&0'`!(  DQr"]A 2-7My8SBsʼɠ p]Ӛmѫؿ-6I&e|xꊱcHM;f!AS3Ԅq"S26&#-0<'ϔw|Zٮwlq&!Yag7!MiNL5V$ѻϜJ?Aհ~e+`t[mvE%nX46J᮹uCWG:0gKq3PQ' 4ZSTJ?ѮDr;R}{ZeyL^Gl7g1(C ,VfŐɦ%$pV[)b;͖ Z1z5omXB\pH `%ʠgV \IbC8יv i®F~`m uh;3*(7+bs 4*{dqPpfp0Ith pv<5B RRfde"<F;8*I8?Cԡ=g{Y<7ןs78H4ۥ+`EzyC E|'pDD8`xmѠqs[ͽS8kTx*퐥*%slͿ#1ir[bQ S'K%=r5|Ruri9"HT4h B6IM &XW7xmHHbذ`rҒ?;s&![^|{}9R\NGo3zuzNoqh| L--f<*lN?je)TC{Z XJSMi&DUsƎjY+*һ'9G=jU h\ت:FNޕ+xnq]O(ϝC#'P=oLR<;eM}opxw|kK(M3cǁc`c[;Al ơpW8wIP&ge#+t]h.PtKH<0̧Z:zNCk^8U`~|"9FVjͤ فkuhPQ?F=3\Vѫ0T]5yJ*Ky xc*z)OsxB$#fV L=wW-nGj 5T\PNQ*M=Mњ+TECɚU*H*csXn 6G*?wu^!=? [bn!\At]nPi{t׆LH0ް?z}~=mމ yF< Hc!(*=S&tvqV׏ O?zѭ endstream endobj 2284 0 obj << /Length 849 /Filter /FlateDecode >> stream xڕUn0+^*Ē~l %H6@"[zP,"b$I3$e˅ܴ0`qμyds2$A@0uի1۫v>#ˋb2FIF3˱r<|҈|  7&Q!N?B˗iHXD4ϲZ1sU~e3] [}-8NY4 ڜH“bepl/U!ni>̙u8zfEO0#ީ]+E;U0$qtjlm˅8DFq`^GLE貱L1@'r-{):'՛0A^b3~jV4%MNkhؐ)z43St=(uvsW܅*Q Xj)=k9k XpcOҀRa3&e[.LuPu4ZVP-Ԫ _T+MymA6uC"5o/Y\t;kL`h6)߷ endstream endobj 2287 0 obj << /Length 1195 /Filter /FlateDecode >> stream xڥWKs6W%BM;cu!! STp. %J\B,Y$BL|s9j ps|!0{])fQƂ"PQfEogADfPΔ68 ybN~>M̭((1b4QVBHr]筩fK@QuqE,A]MA.劉4 B=pF"eaÎ[a,0ŐKH *]d2evm+m7҅(W,+A_X 0_"&t˹>-u./o_;}v3rQljz^SbBt1w\RIͲzuiosLouA^D z ]9O7̫v[_Vܫ׏pʵ;|Nͤ#3)iK϶ʲ~P8'*#GPVMTX/ZYn)XHQĠi}8 @D,A nIhL| \`O6:#t*pt|!|3 R/=ٻ_XZS10y_` ve^f-t*sC-*Y4B>z:Nr$赔ҳy&{Xg+(zO};(P"ã) S.شlWIhwEYB*$,z2ddhHۚ``*k+S\ȣ5F"(zBa\jⶶ1Rtj}xx?) NWQ+#z{fUѮ?fחߕ#76&}25gda@ &(]V^K]{Ưyٛ8<âg(r=9Q*̓)4IoHAѭ[cA^:mk/ē xj&Y?IǗp`(z1t]Np隩4wfxGT$"4N#@x2|%NF>InUy,Fre)R\qGױQ@dqNr\8w&9B (ЩiLTPmq}q[ss endstream endobj 2290 0 obj << /Length 960 /Filter /FlateDecode >> stream xWKo8WHa#Q--Ҧqu.=DaEJV r,Cq8h g bmՋ"P'"g$zhj CDP|zXFbbi$LO'uG06|HrLGS;Dx>XMq¹S_-^u~yXLh/1ob`S& յm ^8F@sUMy[nzmgC4I1cn! NSql4Myd` |svӠ`8b)R_MVfS-Jk-됢(+t;l eL0b( TP E=<H0M^y38#,<ة9Q`` "PVd۩y\|<{wMDdOJD@V)[QlN(&VL]9a9}-Qre'ysdN]{j..C՘F֯nC|eٸo.(ݢ؀@Rv/AŗΦlz l4dzYZ<{<[nM"._~mrZME$V막 jT+ۛ j4=ޒS<ܔW&vTm6lժmޖ#e|ɗޏq&4\ЙsF&po}w6]Uc:@דYZzKQqSO4M=){8@,x2&Ru?9o{>Y)~D~$0Rɤ@ji_?L t`%9qFrE-svjKɼ,P}uJyN\0߲]=3A?!yA3v|zF F endstream endobj 2244 0 obj << /Type /ObjStm /N 100 /First 941 /Length 1769 /Filter /FlateDecode >> stream xY]o[7 }"H@1 k@q]g ÆdHS`;M߻\oHqH9r.(27j`OZ(`A 8͡RM5bU KhLV7F쓧`@I 2qI1u*ܥH\2諾IٌK0jx(5`  cm j `K)'ߙ|'Tf0Xg6vlYR`2E)0w+D\މՙM0V9p]sI}}6*`W8"5<#  `iɍfO 3 [ n0@)7IỢRKM}iؒ2a B1 %ھB!(5D cR`hJNnR%fgTĊ!bWKji0F0T5u[P*XPیAs`ːzdp؄Q`ߔ0 %懄<6(e.a2qrÈڣku䤠=`xHjJk?jj>j=y2_*̏./nfn^6yu:Jz6?_ 5V>kB'O|_]]\qlqh_8`d@el,SHnU旋㣋iZTVsI9zX󳣉-LNknt.QJko:DUw0Z(xr8?9}j+;a0A9￿RJ(F 3E@M0 N.oiNbo E /.W0w/ObMxo~YO1;};뷫wrן}7_^vUp5FH=AqҾ^7B m+Fԅ"88kX&6$쎮izY(*J>ߝ?+HlFEڧ[^-'3kfnfv*>?ox-y%LD Nd3}5 ɭbUk1f; t p$P0E"چAz<M00rޔGқ=z&6Ե9lyN<'[Ӵh+̷I )ʨ"h"F'TؼިbA~UHLrqAly1 Z,Mn5?}خ}"/p=4?hI93O^LthuZ^\`Y&ǁH>UcN[#Anɿo'^-#* +ac"=v;@j C_t`~Z\an =dh|62ớkiN1e j_, 1##fqy$јژSmM&υZ 5orr=xKEh.&5FQ+11Dh@i 2 Rs\.8NNG~Q"PE)wblЉ١l4^~g :c4&yqoc8ORq-'@ зn>&˖]X~KㄏAER$ 333=ŢJ9 &a4y$߇iiČd}mƸ '鲳SC<0w4 d1f7 yz endstream endobj 2295 0 obj << /Length 931 /Filter /FlateDecode >> stream xWKs@WpK& ËeUbRn0YBb_wݰGسBIGVzu൧je5r.g×BX#Skq94XZg:)ksnO}z}%,u\ͩsxsb%E9AD>GTUk>g,$O_ur(d՘G(V4uF]ګģ e|PTR"{mČT|ҧ27f5Gc>AT?v}%"|mNiQ͋^u8xz ?K՟~Q?=꟨Nfxqd7WZITP o(v b, D Y #bu+'<:CϦ&F0dƭZ֗b ۙf*]=79WPym+7yAĞ!oRU_fw*lD~l0 !JU}@?sKp _i!}T+H"dv?fP[q4En郘Rgδ)$Q(@U`&B >;ib" OVF_ɦ1]lM;ꖬ51KU\Ncӫ&PAT.%iB ƴɪz\>zx-WRG9|FQC)n'q؉tdMSe_,r!0λK7xY5ڲ;K813K`Χ{7vl_~>IGCœ\L&&-'8$=4~=x/*?7f5Ln ӈBw, fpt=`n/Ж2$rz's/l1J}hSw h endstream endobj 2298 0 obj << /Length 991 /Filter /FlateDecode >> stream xW[o6~ϯ#U,nA,\A@,`~<$;d{Xa<>wIG R҅ʢsM{\d<]|u]VǪV="ND4'M~'R*r~yvi%I GE>Ȍ=W-%1#>}R\uTQfl]:j.) J3TjV`ˋ-m,tw"fۢ:PՖuS$P 4eѕLvΖ*_^̹s@sd9/슻'Q뻓T A֫泥lR#rjO˳YmPf&{۷51DDgҞ|ث֞\춱<9 -U ˓.əhL1튦C@6ݭbADȂ|>'WuU7E#؇qD;> stream xڽXnF}W P@^xK4)R4u!@\IJKm,)R-(r8;;3gE,b)YE ,hqwz>(#׫ޅ, RXǦVfZ]/})^.}BUm^&_"}O/WoWY:JĂK[Ϋ(QKE^պʢA4@$,YuB&,j}+,Wtiu]2i_.s=xbk[SnƎdKEJxڱ%8mwh<:7!fgZH,r]Ƚ; a^Q2Sb(cCY6wbTfI'ŀxhξ3 QЫ@c[ij{n=r%Kl!BX˪Ec^ZǬÆĖp5qfui*Nm"o_*{c;y8tAe`MYcMHzq {P=e#=KwPl pek7U%AV}#K10Zd0|?7 qQB( Fbwf4Gͦ Pf#-ۯ,W`*a7/x\ÝMSCfwmn.{<@MXo_ az\ZR5\a'yoI`BY)p_J W-cǕq ޸zB-I}@Ӊdk Hxvp7;h0 9wbe/nvCjK8ҜGZ@}v.8v+Eⲍ1$&) ?"ԩz%EMTN\z&S[~ŇZL]!MκC5ASŭi@gW0 ·Ir3c#ɸnqn-p0!3_dqt;g)WM#F;L6 8JowM;FGHVx:m/I᪾7g'~bÿC/`z1"x {-eK"s$~0iՀoǧQq:  endstream endobj 2308 0 obj << /Length 806 /Filter /FlateDecode >> stream xڽMo@ m)z?}l$D|hĀ%0^5B9z=]X@Âs L=ZgqKy>]I0JR SeO}E'J^Q̹oP=f_{lL#vĘ!&PFz^d?2Ȱ,6JLj& wP{mvc"bUS{DjUYbSĄ>j}́LIdjh@E  2/&.uKhSY5v Et6늸I(Wwy~8>FSS(1uܒ0i`x~G3(./8҆P1(I i I8L Dž-WtW$iZlKpgrSm,laF!|Qu$3R%0+- Q*ՒWd` ޷l#8Ŵ#\eG34}'(qQH^NIM ;_涘u% #*\S%}h\$] c,$o2sg8mE|6"IӻpuXT9`|0|HXy 4(_m^VŪt f+½!i\tMډFF؎jVLFc",@k"T҉gA(|EMxޚD0_և1'R#k&pm#R=ŢQcfy endstream endobj 2313 0 obj << /Length 1554 /Filter /FlateDecode >> stream xXo6_aIbV i.k yl!fK$XvXY0 DR~?bG*3bZ-G4|}ă'ɟG^i=1b9g8lH^b(řFx NDt>\YOd[x(ƕE6*ŤJNф[ƅ%w/PfہK5}u/1OtAkin7Mg*Fg}:Eb[)?e+t+zZsRC~V4ZM^}vu^0;^_+6,I+VDd/XhS713=NJ?ueի W(XЋr}U. N#Wsu^Ԯqwc*_f|A\|O16~ŠH_ >"/N޼~wqy[%b'0<7Y~uZ]M{=0]L2`>1eZn1KX4`RBq96*%?IN K,a$+W7PNJ%|q3v{ƛryؗԂR0LjgLԔ6ŏBPam_[6kWfH֛x*eVJG*R f҆I ~8mt; >5yN @ӎ|& ɚ|NK\h/gY sp:F k:r{f9v8$2_gp2j8 إ$KikEޔ]`zO.z!gWϧ4܏.ѓ4~N:q?ׇ :p_!p x%P9-Q ݹP'7UYO1WU|{VuZ&uU2[&OY+=0}]ܸ>n_K{o@ӂ˄,N]ؖJ`V0A%"8"#YxA4D%AAiAL= ɭRƑ44 %}dƞ/[_).v1W-|xX뜭bfL7רB"nO2>/#h:ovI:HD"|(?BZ#}LkI㖵oDz!v>I_.P;J7-THm ja $"SBI#}Uy\њdpВ.? rA^ɣTu t d|mh{JJzC}eME/ z/b>_2QCKBT endstream endobj 2316 0 obj << /Length 49 /Filter /FlateDecode >> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 2321 0 obj << /Length 2196 /Filter /FlateDecode >> stream xڭێ}o*bS6&iX }%&F]J(؇b1yxx7JS]*,ժ$/>|F 73wOo(V*wNBY}ro{(i,O7`GӀ|eNv`;~9i\ў@  S7}czDQ,:k/+w_We:Ѡ.":n1؁H*N׈z}?21ˢX̝*"Ov`A{v#w>xDM'z񁈯‘5j! '/QE҂fh4pe]Q'}4|B !Z޶dAщw3'] z֗V{P#+ҐT(8<K 5m4Ԛr(E(y<op;*jơqh,FYβ@d#=`TT)+*|$V'Qv=y~ǀ0+h"K dI=)+`9ZR"Ur[I@6K^رoy3+'?.Y+x![=}%Pf,DKS距mD]z:gxz <+ Zh&8AN3hk0Dw H%,B{B,d.p2Y 3:BУFey^jpnj'C0 >]fݾ,^ )ubtj-n{uV>#]ʌr 9Pv.\Q@jWE<_S %ƵCgoyE̠ԧ4x +r ۇXo()f01u VHMXF%G b&e!^Aqm?`2q2Z%_:% Ջc0?xw9xSѥBv?zZعശ _j;]U\=: *h:I"5.8Җ驀<Z&Q.ԽV@:VQSKUHЛi[+L+Yz'nfȰ+Lm60zge1٣^0s`F\8`WIN:oB*ȠTj;f5Hѱ˅Hn pC9qnPI;^soz'Bj,ՖkdBXӫ{+8_ ipw!lHO(5`w4Tkڨb1<.1]CP6bW!E3?0hUH q^U!oHDwC/,@C8}d̻}f" /=h{|׉`ڳi #~qaa YVB!-d13lojCr iBʽu}tΞW-´kfgb_Fb 59TԡRyLmQ4o&ajKڂ 8o~߾y7x?IJ4lݝy`4}cN"DNdw `?;K#P!5'~_Y;8hKiG&5@?+ endstream endobj 2326 0 obj << /Length 1110 /Filter /FlateDecode >> stream xڽWn6}WQb.o.MM"Clʢ+MүPCZ;-p8s E3b̈́ tsFraYӗ %1xZ,_D)hWT_]_\C&9#2"1A(d= #IQks xv=)PD^Ϳ,&pD/ժT2)XgCȐ)0zW~V33sup2ջb#VekC/YeOf6QmJoIX|2TWf~V yL~eDHqM?t H3OF0>R_fD0~,C %anvxwy7[v0x7m;@ZûbGJpqd]"[=Ǎ6lio"k2`S]mW@]eu- +Ve]giv^bB ]z`gU=d䢱`#nc?eu>ț;'p).UYԪS# ۸ $G^S]bx2f^55^> stream xڽWo6~_@~-udl$hȌE Jj~GXҨE1x:>Q's/ ؞ݪ^;(,.NsA=|G:R?Nvh*[9ȼw3sNW37Br])z4LSy֟26%O s(|p%Gy>0ѡ,ǥqg I^7Ed[]4| t>c yH9"F lM0R"fch̅>ubRB~i V QSY lpiH1Fֵjv$V(֋) Jd7UjծĮنx0 Wxޣj4 ƺ" <Dd7F##FYIZHުF [=դ1YPZIV4Znsndm*6fZ7~誱ݚ;́Oprcv[ LP,y#j99haZ(= G?7NvZbj_K(#(P0. l |J܏Eq0۟{O1BcEi! wclۥq@'b(uk+cYbsC̽8Bd^?ϰ!lV-(|J /AР*> stream xڭXoF _a2kwԦn-KC1t}P쳭UF$t|b\%_Ndj8Bߪ Ŧhb#˷J3eGQY$zԢgD+%, ʬ0zҊ(HZˡR7N=d*2+^M:KIfY ڂDi-)b5M6"6E/h;?UtYwហQƢsU'ڗud0r- )tRp܍ޟ<2TE5Ҝh"CR _eŸkF6mo-J^S NLO gUI[ч,!5syL&8=v]J=A}q=5s:. n_`FmOJ#s;8{b}ZgɂÍl};619vvD"-2N.e-Tz;54TR]`l:LReuspA"?DaZIp{8@uMiC\ 25):+p)R2*K#a օv=)ˊI87鷡SU5Ypb2 \% 6 Z`]3nyS6 pI Q'>޿ߣWćM?DН Ȗ!2mᅗ"DB.B}CDDF1,u"$v!B'+!Y/y0Tx"!e^;-輅ݵSw0#-@!)7d՘9ƌ`ʂuvi5fhч0}D:@ϐ2Qo L ?$B C/. E|&~5ҦPJ=@Ch#.Yj }61) &`8;,ؤC  SI\d^ؼlaTdJZ eS"`c s6YP'As݋.Կ aٷci\HSa5}4eK 6dɦMДҊӮ^Ous褾n' 14~'/['ιB&;6b|.Gu4hᒧ(ٝ%[;m\]3] GaTʎJEk^i> stream xYn7 }߯co_m.C,p ėMg^^sG"ER,$*UR81B%a9IjsZI&m2Вq`:'BMDTJ걦 O%%5oBh[L"N  z"R<k00@D}Z% `+T: 0X]=LRh~MP[)BS<<+da:#`fR1=> 9ЀicQH2,5_:4,)y8xp!^cӌ-.=`A!P3.e]Ac*p$ S5 3<a1dPoc VDj1uI=!V":(|XX &ˆbgo 4A-d6JfXRdaydb=A/*&5C&q x53HKZˊMٳKV8{vpy~|oW}1M Għ0."Z  Q 8eɽ8P@R +hUC&nԿaݐK!3B>>?_b":?/_>=?_^_\\)o˜wZ,\#;9N<8n{pIX.P$܂TǁX-8}4"M#7fZvd׃ڧpp Q8eSoWxqlrBrEΕ ROTb_|B6vPH[TTqb76‚?;hK;ِVjWr֧u` ɼ(2޵ *MƁʚVt] endstream endobj 2342 0 obj << /Length 1953 /Filter /FlateDecode >> stream xڵXߏ۸~_ᷓX'%OIMR,Cև+zw:k%Wϻ;(˶(Xp8~Pj$:M6YD4l&o~Kl}gLk2buv:$/fwJFPu 6lӃ(unzҳȾJi_߲Cb&z{eS>fD!n]O#CRpqo2eɲLcf ^{<{Ƣq L& q Տv[˝M!utպš#/]:hU\,MWJZ~Y_*z5Ec*Q|m?lN*6SACInH(?mє6t6`u-6 Ξk Q*p2IV?t8%oO6<~9ZVy ɀaphu[>C{+J`8`+^gx[B %TxJ]MzDfݙ:(M]LdzpJE /"GF7P~Yi3^r cG : \ pIN ۨ(p2Eł_Q{,]m1 ~hZ)`XPp(깔mUlz@t~`Yo, IL>[\V ܘ߽_3It1u7P e75C$1wQk!g7NuDZTVsL`„=z`+91N>_kllxX,>>->[!ݍ-X@@B؃ nt9׉}sog7Tx9\˅"w5+jn92ГC9\_cDA[sKdh OSmĹ\1ڶ+imq KM$t~*Р!}yr}?F8xlȈY '`ԀvXTۻ'[wp3YPcן|4yfyE{:5 ޕmV;G1EIym_)uy*3eՆ6i:S" :p DL-mS~`6=I #QjE _dYaU udՒbXAn%6P v~0z<<|b:RaJpL/t~Vl"I) ^$afUxcZvRKw>R"rdBí4c4گNpB8Uk,4wKL,}SX.ѲX|ÍY7[#adYClBe) SfEvW<(/V~yP_,᪳%q_\ŬSCpf~SOvx.LכZriBI@6X[xz*v5,tpݾhU 4^m\J·(5Ov[@oQ^E rIJ&$> stream xڥr}o V0 <DHtٮ>`!9 apX>} HVĞjZdbE~~=,xF|s$ Yn?f+8\4HoۇU?"yk_-?fܓ+BʯKNc_E1KdB/W [eړ\>K xuVSk\90oANyrjl0B/2`FXW vjm}u2[Eˇyo ̨^tcp^պu/lSeШNߑn^RIĘn"rҺ~*`-&/#u6u#؂@H9Z#Y^c}Y3{ %; fyI •%J& ć 8ܾOO6Aؔ0h[o{'wtAIokܳHu^w7[!Bv{QH3x,q 06:mc`lA/f8g"19/K5hCj,e\_NMg8Ϩ7i!XB0C_h:JN~ Kva&kˤl :oۼ9`]U0&N_sEQؖdCy@J"o`n~R ɨ}W8|ytpZţcЩDwg6-%C[9;˰A˜oib5- =5f/_-)i*P9'1ͨDn xFxFA#-8C3k7ҋYB >L|Q&z:ĥɼ?T $c7aqrN] Dc9؏u2z1Kh`ovKCͷq/~&iݹ/ d endstream endobj 2352 0 obj << /Length 1838 /Filter /FlateDecode >> stream xXo6_*@͉"՗!M&C kX͑ IQ(;a(А>w4b bfOg-θc~rӵb7ɼ-j>9YTqB8󾔾H֙}/#ϑ䗳UBg:E^ RV I:\pgZ h[E,y!ppesN~R'1˸jS7UuYCn'K0z5S=ש2eZڵ./7zJϮ~ե~\*X]p2?5wLH;:MU0\^N w!oD'S% >I3yqe~ȼe&0b2aF11?5sQW"͟3]y$[uPC<2 ORf~]=OJ˶z]щZ#$>SMs~j5몉0fA( 8,8#JO+P;:T/ǃ׏Wc$1/j[̪UYCˢ ]z:*=Mn_c*vEmXww5oВ"GU~٦(T0(|oD`OUgn` MQ?l!_{H6q_:[Ո,Vw=^v ZFE_v~^}|WKa6_L'uC;Q.GR,'S}A Upv-c:^8 іV^D wJ]HVD92Vj#ZVUFKlf)ȬGQҲHf0)]sV2A~(y$JW<:Ə/0QdٓJMQ טXu܁VVj]X;zo).M@'mk ?2 ')t9^tBgh#KP|̍C7vS&$} oif]=*&m5MnKV?H3v~5'B u)"p9+S RJܫ;Vb]*L p6luApJ\sLo)w6mt?$4(>tͤ˱@חq7SPJ2N禬j<8h<6\17_RSuFJ&dٮ'`DDCK> stream xWKs6WVjd |j&Ț 8HQ}MYL$ϴxpBlpFQl\v)F8b$烠ߓ|380Üf}U'Y3dv؏"޿7K64j29 #ybQG, B0,J2HE[yʲì5I giD0pnfnn`1of(>jaxZnW #5{3Oj]e]x=d&QnsS{[W$&h2T9΃"9igC5R3]&&ӛ`&&!pA"AAcan(g@Ex^:ʂ\rtBHQ<6_GF Ö1mL Q+;:~ "fWv0v#g;QكoHG{Cu( p*ɭ}\@E 3ʅG;n'*-)rr[*Ԉhܛ9ܗz*]llԏueB .qulmN F!? OƙI,'},HyzlWQowG90OT1Gn3WMjѷ]gQ<鈊J/$im # yU0Wxncux.$JTuUBt~sl*ѱ@g+ոSYA}kDԺ, qzuF@h&k|fI>F"- z| PZ.>Ӝu{;ESNc(E;h\duXs4imV*zO!hÕ9zil{9 tn:䗝Z#OsXv]]+t~֍ ?p!;IP fL^ '8ԦR@ٶ{, `FsjVz5wEv2 w(Hf /Dݬ[TH}g»F#,<`YvzɞmODxXZ_YOxXN\> stream xڕXs6 _w*W_viuICYfl]lɣ溿~:.(|$FQ)Lb{]bv{%n#ʷh$? 21?/GukO^fNӻ|:{BaLLfi,CRwS6HQfK]Qo UVஜ8 F 5Yr->#\HoY~ FXis[8K#EBq(6ڔ 6Sz7sOD nX?ۜ+ȼmm7>^jE0: :I=rh$$/,'XDuj67eE/nJK,ج{ &f]͒?+3ݣ"MScD)3([`=\@DBىGO/>dH%/Uxsԓ# TUqȩՙIpwF*jS_2)M?:&$Ksݬ]@C>LTݷ7?ݽ<-Mmv_߬6{̷e9-b܇*lV>|^P sGV%-|{`E՗؜4fr6C۷mA_k[ExC_e0Sp?;mI(Ӽm^n~)DNQS /?H&<8:i>HO|UA<.Gc ~~dǮdP"qh$"D\ N؏s=0CW >-kvzpڻr<0%} ӫ?|i'3D|qҺqc}U,Uz^נk/j"e@.CHaU 5R졺2SYE|$v~n<'b:w 2s(AYH%V42䆚rpG7sY`\Y\ q08L#T9GEeE 5꼶ljG}QuW(q%!ucf`>HC"̘ZPg0R}s#pwK;a~܊`O,UUW qByK)mn˼<<Ȧ"jt܎ 剈\w?MJ۝afL f{?pDRr7{7iGFܠy  uaֵh^uo&/[g2Q2\FsA_Gʫ`$B T*7]_eߕi+-y{-dw`Sɋ'= t!o˶dy2_&h endstream endobj 2369 0 obj << /Length 1676 /Filter /FlateDecode >> stream xڕW_o8 9@dc݂hs7m{P%1X9Y}#EMR (ȟHJQ03EjD |`p^/~#F" P|1x: 1>qr> ΛI?R vluivqjyO^k zeAP]ҷ]ЬUeV-H-i:1.XB-1VpXƉgjP< Sg3.%fKF`;JQ1JLp^qd yNC V 5!MO?XJ8EEaDlz~7a xSX#6!2XzÀ$\6Omj0NhKEqטZ6L*0*?Îϧ@kՉs9mDa@t@kT=9`hN:_[b*D(L:W`Uc zt-u>{uUq}__285'ؗ-h L@Y:|]0@:u5P)D >9ֺw'܃k^nrikP㤯 ۫'RzFeٺՏ%Im[\r+2q dtoKiY1?6q=f/JJY!굒ܓr" =Ι*T҅_1+L?8J%#>fD@P蹠 {&[}JoYBn> stream xڝXK6Wj%|e[KIy׉gg@K Ê} yk-C'"?ȣETl=h_+W#W1" (Әf=xs(Ni+T|\i?5`r%8NnjvQ$D,SP(M2m㱨v!#;$Aw0D'f?"͎F.N%ip}ѯCSp9~$v.Ppd|t97NΪ0Cb2JPĄYBcڮ+!E~)uծFa{X˺4p4o՞wORD8' s): lm׸;4pj'[mɀ/qVpږƶ)@a;B=sm"CE0Ut=z5Ϙ5SB,;>c7DZ8)PF<tT,3  WEЕHjNn9`ʰ* GgqdKSG3+Z;ӧR-3k0?  mwQg!H< D!0尉3;Ǻj[ھ,:ZhuہS7gDqXYx:C ޠaE Ƚpd0gPS`2+mslQ{$%Ս;'[;a `HRp9N *w}3MQPM<ͱPT!]h!tJXX zUwĮo͜( d?}n$TFq)!>/[B{R(mY7p ,B6//m jKo8P'XQ,kxh(#o#WGQ4F:YYJ!o/ɔaL,͌^&G 5SҋFVx r)%;ݨnƣ_vכ8LF<4Xj*(}PD(r"!dfj4ۛBzs; $  x\߿1}w;搿jNT;LpUe IR,j{4.9S!e'[d{G]gd7+I|$Ybd}"HM ` eR[B*d;"qك~|m 2ԛ9!IgxDeX!Ǿj K5on1}Q9JJo@L @WepM0~oxp UQ׵`@,kiT~^R niӤQӃֆg?= ^[sTm~Hۅ_Q-oW߷ywoxZȅ;sa-\\H%a&F 1^-F-Ә-S*,s2s:WǃH]mŋz@zz|2/޺pA_tϮtay4o٦ PCo>V2 KO&L#eʥШrJGEofFKLid@nYi W[Cx* 9." ^'O$^;zV0փs76禎%O|MƔhهZ<銃W&1Vn[FrK GS;uLk[|*_2*(4 "8Eˆ^CR>l?)L1g5+w&4&AkhwmF:a0Ke(hs0~|8[W3|u>RXw w. w0:h¯o95)9sd7.9@m%s՛TPWTY,c d7p Dצy*& ew<(/P/i g}⇵kvE˱=I _R[zƖoI*8 endstream endobj 2379 0 obj << /Length 49 /Filter /FlateDecode >> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 2384 0 obj << /Length 2009 /Filter /FlateDecode >> stream xڍXYs8~ϯP5~s&NS8Ujj,A6+!!qU&"?ȣETb9jsϭjtoo^(̣\,ֻ"ĥ?.n8_ޮ|q9i)R$|$3 ReVIB$.]t" s{0\T2{[- :Txš8H2P˕؈`cdž9G" I"!~]Mt2MfaXE7a}bMN76a_{”jW7{ <֊$(RMߛj VLc[06Ƀw="Fh:"% (m;B9eIL;&#[#(M9:f"k8RA`Q\hWռ0ec;mzzC݋0'P$:&(<Қ C Hu2WLY㢢07gC6YZuW" *CUjEWƹeY#ݾptSEuϬʲK;#$eP["a<$IL]Uk't"NNUY|^reI`l8d:1N 'DOVb<bYЫg 6ig"uO:Tֳ,7k5ǍT+%AYTNS!H% ;z"9 ag\^cݑ7 㵆5zճXv,fADʣ@}3A;gBRl$ 8vq KKb2dH0S-L%bIKD*moMՆBdg뇢%8Zvfx(<+D0w%iYϱ5tRMOCG1Q>&gg!VO)sQm9;Zc~ n6NLdC1ujYDL{uᕀt$UC wxM;QF~էOs`gE\}X_^?7#'g--n\ˢXXz$Zrޞ_x)G~śgua\Z]L'C)yz f6<"hQ{k3:s ?;5nLmNM#uO&h`<UD"2p::@h"F0˳j]tZ쬙2tsET)דTehŒ*f (VƵ֞z-7 ~@'Yw\RWMшJe%sBp$ *.ܮ(o,8w~.SʷKESGНᩱx53f_Ccc9H@Pp-@a7}0e4Qta1?ow~Bh5\i`.:OK=ܿ| Ughތ< W @68> _[ҏT :֟\FSM Hu߶á,(& z|tKFn&J!PB8Xzu37 wkY|P}gKR@i =>pa~n@TuE*.1 ZBPd _#&bpx:wm{\htmpᏮOҠeG0n<,jQo /F7uؘ^dTi :fҞ=;8 ;IHY`1AL}!ݯ!E_~<ܝԃcZ݅gY w_YZ8O;ycyGйZ{+p1C$K,q`2 '9{g)ޜq wdΜ`4Y2Q_,v) 4(Lnb<0;ώS`^^N< j'}:|B8v endstream endobj 2387 0 obj << /Length 2422 /Filter /FlateDecode >> stream xڵkoF{~/]-pq( F,"Tl߯vI*4fwg3KuȂ4 ,2݋Bɺ%,\V~wq|? 2uq^_xqXj{s?/_g {Bjq{ˋkwN3•s9R"1ˆ=}۬?nr?,#֎eRB,#g*9[s_V+f/>-tSc/ܙSZz7Y7SAUdCT']Q4K\BIQK.tR2.c *_hO2FN(P8c-p@pH7!b`(?]S= udS;H:7h4\4®T4"ܦ-~-cT%\h©"#eO(*PZ&]Z.#0~cUxK3X?:>_. >'}r6Z$LZ AULsc)`?nVQFΞհKNTKDңX0\XQHH~Hrb)H5*G㽉wWrVAWT=ʱB|R%IoZ~}u&ctɲMqT?i0 5hUy`) (2be }R(WbO/OQ$\M652jUp%{izw[p;L i67҈f.wnFKԀt? a0|b= soL["*%dm z"Jv;ݔiԘilm+z+LbQ] 0"+}'?fW~*#dXw=䉂0eea \zCzJ){~FIwMgwm)ϰ&cdbS`81K>ƾ #Q=J?t pYVM_ߞo=}^ I!󃐒CO5i)Ԓ^!]ꋇH"bw=G$>dBz>x#dg0GDŔ'<@~4Wɇ1yjhF@3j `{$g+d7/wV[ܝ?I~w:K endstream endobj 2399 0 obj << /Length 2664 /Filter /FlateDecode >> stream xڭZs6_5/7_.3MZmN%RCRqw Ktn2 XoUb)Yjw|aE/; nzܾ[WEb-LЬ7BͶA PV62qH1C~@ɸaR(X?G5XLCtm$<82:Z^v&(o4VޏN`<ͣ/]};uC/+Z# ET]M{Q!3B6\2i#(T /1kdTa_Cn5=i+Th&ד*Wc<.F23Ss@r2@uVU U~ Rz7W:F)"&cTI)͟CVN](H<;dQE2;|s}Ӕd̒Uc:pELuv3v E$J%d\81Y`3,U^vYOOxQRooH'&7cD3˅RybQ#V`'!N "t$.ahf157+c6unas6""g#y`z a'dbXF9u9 HC'Rkxmu@SZqlIɨ~uxXPAJ9sccj "Q 1oC0|zWw6f5>z PXKnIq[o @ZeDqMb(iu?-ýbEI RVA޸T y%m۞U -Vap46M^C18h3%g^]/^6 N?)=*ĊeU:F axܤ?ٟt NYſ8* Œ89:c6 s8 l|-݈] 0t Jv"-9;ұU"L,-z/aSJ. 0LX(pkd.Y8,ᢤ ח&{gduuxYSx1zB%B.qng䒑!e!$_Qϱ-J*!T/RQĢ(^(J!d"9jg!  ]yZCm/]~?4.EdQؕ# ̓P~pz$Aהm#hng_\ʺyQdr,P%CH]Op&VuV^?BZW?=K/pdqȽKp tg/vumys]dP.w}+<=dw0\}PzrhB0x6]XGzZ#LCni4-l҉Yn XOK {& E}a1|3 t.L}Q)qWaچ='zQ /—_/8,qxY*05f8ZQϲ.J j9\$%R`2R^V ԪISr.J*4Qhs^[(AeD<88D1 +lyL O=#a,". AC@S+IS#|Y'͹@~/M] @ [mطkZu`k/TV2Wߵ?2_ÏihlM|ZylcC=oghnhΣ/HI3߰(G /x@JWSzs0KluVyuG\+jќrjkustEֱpq7>JH] tO&)^fCFh;%snҲPJifeiG 2BYƌKYK?d9wUZ}lQW; endstream endobj 2338 0 obj << /Type /ObjStm /N 100 /First 971 /Length 1681 /Filter /FlateDecode >> stream xYMo7W^(r83$#cˍ1$5I&B4 7ʻbVo9̛/*RM.H5;RW!j.$-&PMN%bi5L.'@k*ބ\ XoDI 1 )i)..W[!X=DjSUrPShc)a~|Q@cv&UBjV Hfh$Rۀm@`;.f3<`&q dG)+Rma91WxV)ť?i716X0TSG'%ῤ@R62la(e{aT7=Ҽݩd*ZhPuL.IUM\Ȱ sn'Ѷ7 61 RƷYLYD dW l{ @AvGY^0HN!MŜLOMI8Jas"|{9TFix RF|i(.`,632j8S*U,CGGG{Mvna J1ѓ'[QswgWȍğay%='2~7[ܺn|yzŗ[u?/? V^\~${4.>]yϋ>^Jo 0%^,OY&lox_6LjTفueIOQ;n晹Okrz|YcoKByI,RS|>;N&|y3r}:lj~-WG^e^ e%6>!#~D@sGtN7ZEFʝLO^m% !]r?~ j/\c{<Q:R=SVfP剃GPwzb_$ >#$׺SVPtr_w ɏ,7`dVnȣЧ{QRɴ$#d@"6eN^x69L@`O@ʶԩu:y1:CXH#*~Pؒ7N׽@[ 4;>SZiJӺԕa-ă5܌> &`wBSȢFhp2C(/UXS@քUa6NJ!ZӀ)goCq/P@qInX-/r)X ZǨkZ;@= C^| g L} {ŐzvDZkYd~?ʐ R*:J6";G cAKs(@˃ݵm@uhؙc{Ly]r\ 6(+U-"":{,G/&ܣ v㔑 ΄ѧ;&/.ĸ "V R3eѼ!7 3~ WBoEc>m';[ZJ I^h 2У8HuKV9gދa!(Vwvs">jG|o_Yπe=uAX@VZ9Nξj/ endstream endobj 2406 0 obj << /Length 1853 /Filter /FlateDecode >> stream xڥr6De,x񑞒qDiDKPKRﳋ(R,r/S|$*,6 m>]_p7◷ZOx0ݐ|5h1$-DY7S~dMV{ 8q͏aE0uNN1>;HP2.wM$qgK$I"nu81 ߋn@hNRc=ҡ-*|X 쥉VSx%66煜$7F [ȿ2&5ɉAv0 5Ir%@#m9J\-֕<# =6P#%"&f<nK\p:zG9gAXu#\2>CE![4>6cQsVR }ÐB{6@TCW4KmN'2EatLLiʄcϐP~;O%Q-㓸E,E5 WOP:r}G9oeX dTRi,L m$` $K.(YTCtg7x2d$?Kxzn$ П$Ed % E )>!!K9J10 gS vLO$9卑LSn=YYe'Wj(l\]:.kfPChZæMڏpW59< 6#ucVY* jwe~ڛ zZ)֦X#Ҹ. v!65YKP ۮ8m~˺7p> stream xڭXo6_aIjNaWdhqׇ$lɐwǣdflD2y~#(?>2(؍֏#z^nկj=13pr5zoZ['R(meqnq}xUѴ I䵥|%r'Y䍝ec˦hgh5 JPEE,6_PX!ɸ 8NIف*3`YZ4VlX'ɭ ss,S Hz}7~i6}wETү`TD?X)*"0M|yZbI$}iecE 𞽳֓F1}ܝd'Hƃ%C}En -3 3u]^YBkɞY Oh"M-EYYZqgiiފsҘ,ט1^¥,ʎ1=z!R _vg2b{I1sWPчѽɨ|igUCy߅*2H7x:c&ݫ3 J(։I".1jp t_v;7f1K%呱5Խ`Pd}uP`K!'8fiGZCV'/.Jb:™ P 3eJyI 򼭨|/2ܣd_kPu)8iGOruε OD @i[%H,x]z{;tKmcOE5v]jMha ]Tu^.1^/n+vQ> cLJKjNigl(ob&).B=D\W|Q72eO"ұ:Od0 ^iq/ˑ<2.Cm7[wȴoDӾ ǟ!]?~2q~2(I ҔekF8iRwA19>:< u3#\{%+j E]w42Thѝ ] ed֟$A<5N)fIҷD/PuV2(_ipPB٫/ҁZaτMy>UкAgˉ{ٮG(({ݪx\9G\;#Éhqpt_A+Yq驹qM"zD 넎*9.6L} q#/߁͟<(~\s5>4rq0\㌓\tڧFM'5V^>RW@3V9]i> stream xXo6~_ae2s(R0$[˒,q1 [Mڒ! w%OM`S#w?R9 e(QJdq:B'Gp$YoZd(0ٗU@IZӛ_?T`5x4m(:jȤ*&Dզ]omRp8$ͧ)k.RT$Ҡ}(pIf^*>Ϻ+qU`^,65*YncPۊ. 4@P,MR˪KTŕ j2Ć}( .p!ym`3 )>m,fUNuAK{WsVmÓ$(=&gHzGmhtBF NDP(>2.z,$(Egӳ1PMSp}}LCȘ2F(=䎌dLFId)Q$SUϗ-{}8=8鑯!ACŋU/O~,TyC(FzбF D\WV,ܪdN?c!l~aBzi@^_ξӎʿ~ |*K,#q%?qU ]Riԛ( ^Hv,/3A Hz:%*AM ~U*ڮOkG3e`z8ʀ$l(Fl?hb'qC ֖߷|׆yٹk 5@cDhW"w1h$ˆz F7Ӳ5iѕ YW*&/v]>B&- !!oL>kDm7̿ 2)5ǓDdϮ$xzUs[.Yɖ ;[WA{Y/LĻԘW۹74ɄJ9d=|bXrҀɱ' @%%&U%"z,2G~jJq1p!4t/p4e,it9;6(ڛm:&<,haC];6ļ Oe)Me ۔ b2x.gP 1:E~K =Y 7HJBL#%9lL{ ]-fT 2Y$Q-ג2L_>I$")+N xY^嶤e-C 3D?J1egQ0?ԮȊ5'n(=>\1w<,4\6C߻Ak .6%^tPG -V.ɱ7p|zGN?ݜO8Fx{\hIc:+zv\ r Jm7m bvsO}Ѵx>#5oy endstream endobj 2419 0 obj << /Length 1248 /Filter /FlateDecode >> stream xWs6~_#}K]u'v26m䁻6-W]$SVշV{Ǭij"w 63OJ>n>cJo+C;!,湉0+7M[}qV*vMK}UC+v8zv `8p]K`3 Bˢh6a[TH%)]߃+oIRe;}]S`GghMAI7mcAe-Hfo!;FAqrtc'c"EK=f87 ~K=ǴFvUwƎh,(E; '_j\?gHs74.: 7?I|uڭ.DυfmN0zŮ'WW@FOFz2@ ;'c/BL荒rQrJ-4BN)P.f6S@);54-x tS7p ̃#ugϔb׌%((vuv xB;I0)ˢ+ {yc;-6`iSR2Rrz_(_F/PLLGeڷml]Ǫ/Et 髒.L& )>uD88bLQH`$9EYv*F3⭾+ef^| ܗ9 X m+UoӘb|]Fl_ d.o^kݲX7YB@OT@gX?O"bbl0 , 8730xttmf$h۔Ex"J46ꩬT:Yec Pj;kPmhṀ~L.*Ǹije葦f<ȈbtIr9]?/ -Q]xY`y.x1Wau,/,`F՟(c3MOOẏI-54Y,5r~ӿK\? ,ƹZ{ep^ޤw_C Χ8  qiWpqA0ceU*K*_Ն endstream endobj 2427 0 obj << /Length 1881 /Filter /FlateDecode >> stream xڵXo~߿2։DI}ۦq( L,Ė\J4}g8C[uZX`E7Q,bGT0)ryFǯ\?>sDQ.fvkBfQ"or{wB8[~]J:Vt:Ih"?Hgq(TL]{f4(/V=۝5\fAw4X3i`l"%s(!gؑI5OEo/\[fb̡)@ИrCPHȗ*$ F",*Y6!pOc-)BdUӳ6"30p o 9@,=:jwEK,F6Q50OPfQ?XM`LC8Gi>df|˟n3tae yIT A-3Qq|E_k:aSaE06G$bK5qyuGrtbsm:kYm,%K:dD !Sa1zW;oIF)x2{D:зډB bW໿,%~l z8Fm 6iSVXJTX LꤜhNk}cР}~:bAݐƖMr]Gs({Z`0/* ,`3 prXm²ZilTi5 b;:eJ3 mܗDȝV flWv{-:aX*˃cTSݩoaSlHG9.^Q9^bamh N ~ k V'xqfY.R(R,#v !]RT 00'd! %].ǔ?Қ-1o.[~+LվK5^_}',8Ig}]L ~])>!lw`T"\jZ':~sIN2/-5ލd a ts\pQ]/oa/.FWcwj|Cei$p2`<ߘK,Ϫs@Ӡ\CL=H $.Lj2y-Pw[5mmgs9ǵ8qMOQ(|Qݬ;[Rl]#s2+Jݬ^$ܷ!/jt> stream xŘMoF:@\W)Z8 !́(E $ >CDJI 9^g<%aGfcp=pZ}ًW%`,[]V`Cf}WctX~E!V! SG1"TXn['hQ6524j2{lp{x*Z?$lk}M{]o;E^{ c(k׿?nR@b v'u=iRb$\mޯr%\x{1!"ʩK{Yv^2 V &e㭓H;\}zcKl+[7B+rS4AXZ!EUhhg=z%{# @QxBtHy R !ƚv /ҪLwY(}3mfܱCY8@mB^M/ݽ^6m䭽|*OE׭m 6mV7ρp`@1CZ`V0虿oS0Ta0`Y0 =tjtFp+P0AL8(,pp(Byu-_' nѨXtF1SVu$||8rܮMw@# endstream endobj 2454 0 obj << /Length 1350 /Filter /FlateDecode >> stream xڵXMs6WH͘(I$Ljk$Isl:T5}\@"Hv|0q(8|_쁉Hi[qp^`׏1K./cI-/e^XX /Wr}pGvLa ^pj0x*j Id':v,B&*zd0-9?OrYyu.5ٔds-K!RHe #KBYV jY4I|I);:*|BRzL ƾ;y=7.@>*vu[I6*~jȴ.sԄqhH%ך\_ݶTaIAW}SFqFҀG?F֎.+ɋq)1;3`0/FψGHFG*{u9%xO x~wy;M'ϻrD-}wLP/?kZ[IZCIB\:ڝ2*Ka;ܗA찺U6J_ޢR_U"W2/_R]<ډ>-\cUyX7~3V+Wd!y^hgs֚C5'"`)lBR4+ N""VIV~Rr8.VЧ1ڝk!mpP/š;3ׅySֿV> stream xڽY]o[}ׯcB؆myHB.C&ޕA0W>|pfH&c_h NRPk+( 8nR]T@Z3 \!Aʅ>#٤QRH i.JL""d+E6J1R9 權όZM kf¡Rjo3NAD5Oe4Mv)'jk6j0j1e2FX1eQJI8k7? Rݧ~{ $oZ#~eSr[@D*2c2~aܘ> t̯?,"7:=sSO_r6 Ghx:ˏv˯}( _hĽzz ڰNYQV=6֘{{#qPYk73IzJ+q.Meol*Gw&UtU@EMA#9c۶&0%mv8qhl2}=VB;J9zJޞf//n7s]mm 9\k ]mPQ8Mq24{Ⱥ";Sy))+~z4IAj^4@0=`#/JT]<(/rʌ@S;ח^I_Vku"dv͘ꤱyI6!l \Dzj(80~F4zGIE59l] 2Ҍ iF4#:yx|+fݔonx _e~™n\G@E[iHh_i,ƍ+W endstream endobj 2471 0 obj << /Length 1678 /Filter /FlateDecode >> stream xڭYKo8W(79"EAvmr#ٴ4Hg> a! c(z|>~ 0m!o 1"e8#?mQї|[8e%qʹHklw|YO<3_ߊb=:)e_\L H9LVj]Q#8C,\NN[c/nҚj ְOB]4LƒrRSD:QMF"U{Pk'Ƒ r 쥺lQ潦#AXhJžiBvvP }dYźޭ]v8v1ňPxy|hjJ}U;/0Y6I:Y؁%yI^bޑٵd۬)ڄO+uX8p v_7p21`#"6Y͸Jʺx4O2)wzSOj0& %ɃCFyHw} Ht{3Bi<2$M"38};}w? E}>L#Hp,,e7r d> f1ڲ C3žxsl_ƉW=;!"0}7L\3\tLrf}Wj\iJB:#PV*m=jD@ dIp;ҧmGظˍ'錩cM>MCz(5fjHDPF0a#! \0*/࡚w$xM<< ~Z{@H^= )ѥu)DX<+ҕ9vIF > Nt$7 AVaLFvA]07!sN\RU,'jTspő*VC>[#^ڸfډjVy4TpCi p赁DK_zPsWL- $Hb=@2_ـML[X=+n2&$ IO ñ6b+Yיk jcb iE׶ 'Ţ*ʼ;q~Bs8[@ϕK =WV n7C\H^=sJDZRdn4t3sj)icB=b SL:,^v HGI%DEIh2x=Q?ac͒ρJЦFr!^vW`Ҕ8 ^ ^ʝ;u{QCw;3%āWk7SY߁SDEg >(RJ)cK ޓ^</סN/ilT5m*z֎󳣦}M*,ګZCт 4G2xu"iџ}*֊퍇Y&iOEE^A'C3"XE ޹^Wu&I-EmTX<7`] 2~262P´ endstream endobj 2480 0 obj << /Length 1825 /Filter /FlateDecode >> stream xXMo6W(1+~IzXdEl$"ADXG2$9pH[XYE D q(%(%ʌGV#\|:No%aGbtDx"Ly~ztx" N>H/Gf-@Ps##F\\rEF1.ytl50̌&f  8v$㾘Hحv?^E FI'*\Eٌy%X~r.m4/InO.U^eu-~?"|,޼||,u<%n)."usnRk]Liut13'0L+Mγ<|lX@E>8(jCM^!Y=N3pBǬ{kcU=?dEd3 0't{[.0.cvkB$bOPnYK?u%C:dzmM83`5Xl6rvv{z-J@ B1!6j ͪ}kLN\ RR e\A+,"{&MvSZ//0\`eǀ[ >ic:׺TŰA'NJ4<^!#7}k 8v6^`&USQjيiYoφKõ,]*/NE{~~6UQMLuZ,m>y0(ژJh@_cӖWM*xϧC i)]!gQ\kXv(@bP0$KpW^W2ӡDra wN;F)  |ߧ0x5'}'QKP!5JрJG+-K&`@ǜt(XwUtWb,[z߾W fcZ5ů#)"mp@^{b2ۊn9$rv/9coͱy;]/l |%Y9Dth>놾Бx%l9C+8ǥE%I~pm/q* a~[M?o)rI endstream endobj 2486 0 obj << /Length 2677 /Filter /FlateDecode >> stream xڕYs8~_3V~>MoKn)V4HI{'HAX,S6 h&Y0"eAvTÝtt2J~4_fPU?|dX̤>劶/dL aznQi ;j/֔%Fa "@Z[rߩ3La'^Um. xOԭOk*jv[GH=8l.Lg^ԗaVn\9-]\9MJ?6q5uȻl'#toQZ ɦ,0yHdE5 e=?.WB_d4s?%s ZwۮΞW x^xStqy(P`wf2k܊{nQB+X}OZ=]4;vgoeDN繹vn#~&2#ys"b :)ăyIp ,7822>̑r%L7%*L2x}D?"GbqZkbM c) 2i/*hyA18!Hdҗu m:IT]A<6Bijk72hFA- r?Jù ~ bt]=a"CˀN8,v$C$&@cInxVgcoʞ(Űi-u32>RP%)_N =B8_$;aS_5kgP]5`Jx ΜnU=*E{:+<)mZkSb{*K`4e{#k˫3jr4c3z ;;78 x" !<7hv4 /=$FU6#]%Geӣ5mߛ8!ƽq8B!J#maCeT%9k$6aG01!LLGL@Ll5H *Q?Xί,E<7Q=`Hj]ՆyXk]T'(г- ީnGLh4+GH('Hl҇N fKr+Y5x jH8s!ɦ/ }(V5ĥ:U=P Gj|/+Q0/i!\/BO9x@݅AAӘJР<4{ޗZ+7BTh<#ָtf3 ZbRh49#_0b0HA!5qq/?^}r$̥uWv'صޏz8JbHbU?3n6A)Lꔥ]'#QK'(3>0S˜Q;a}஫l bJWNOIx6Et0M0Q{g3D J'6_FVl Kީޏ v^F>OᛣCHf۸/xx Q\+ HN)$@{X͝ޙ$~;'$QfstJ\$!ITa踞.Ґ <"Q" ª}XMH7A&|=5ʪSk's(!MGDM v;{T]#'3e"WPX>#`X}g%e~, 1H.@Ct?d,}+饷i@;fE D?wyXV1#qںįtRm3hJhv•Ri|4Db2Fz5w՛C'vsV) PE~*U4GT"聊L@9H`Q2aчDFB87ŰXE`0a?{.R))"=pHB<?Pff(uh b8gal pw9:v;3%(>1 b+YԽ=Vm LCIB棙*H=`YTӘ_V4)n ?T?41VV|ViNa/ eP 6mG=%HCgB%0ɸv5$gM1Th\})cy CKvѐ~kauA}\j.`29Q]]]6KpsLPI>`W'ƙ}}Gw.&ixˈAg}k(o j endstream endobj 2500 0 obj << /Length 1300 /Filter /FlateDecode >> stream xX[s6~ϯfb]@1awҺI&vlڄ)8ֽ!XtΧ]?""oZG>>7SYnyÇ p/5\9ܐx3vw?woF)s7ouCO@%!fF aʀUqO>^e]z$reYE~){a&!b+jjОk!."L?TKQ7/jhxM ?#mgEL4# x^<3<@"3Gb1tUZ#f wVОdYGT#&ݸX, (*A դ*h(TOŦL&VMAxDd qT8h * A>怓+5YE(ҁFɹb>T]g}а.ڔRౙ&=Ik{q_mjc bKXz_/cN9C,؅ J;Cb_ *p6Y>"'3PLɣ!/B(bjx/˜>QIPȢdѺMſC s}|]__<.#ɰ8s܈ZV8R"{YɪE*+;N;YddtXVv]8X8ƃhhKʠ'H P U취sbp8olq(Q~DDu,9MpjEtPD]8X8`1$ nʠ'XKR) ^n%An2O5sҪ_է^3Py2)V:\MP!UWƵp;#5kwS+µt-!a8}KN9*9Vh2Go5vC #U;)6cP) }D-D2Z=NjAV#_*q`GɀS"u{tsem(J<ݭG+5f)W<,6OQh^eZE^AS0i42+hQ5BP(sM4vm ɋ\>kmW`'7sîݺuOsNB4M&U5# $ߪ@ endstream endobj 2506 0 obj << /Length 2078 /Filter /FlateDecode >> stream xڝXQo6 ~_ex,n[l=4نa;`4F;ߏ%N}KpC$)'RlT4K8T"763j9(.߯|3*RlZofowЙf8H/LutnpHJ?< ,VA?ynݛ 9V|ml24,fI&B 0S~2v[{ LvY$rס#Ž~4lsꃩy;Zӝtj]S'kLoTn/6(>Ȃ< w+CWi8:<+vwS4LkBE=* uPvԪǎDڐ j/=tgZӒغέCRuBP11h+u& {kJˢ2!^7ܖsݚ+lf~6p'dM?ˬ1 úLz/of{Z I.DBlPl?_wMGb΂ \4M 1!Nճ7 <t=xK y[q"C?H-Bz֩q"S$(> stream xڥXs6 _I5Q"^-[v_vu%$7?|QIAAYj$Lb* n1+%r \$_^13Yj3VZ>z/40{v|Eڻ{wTžr5|DŽ 7(N";zρT<2 "PJ2.o ]aGQ,P+kX;;ˬ:[f5ybm?J׼T{A_y][YiZѻ+9Lnx+Wx?R^3*p?Eʰac(bI+˼"pr''v䦩U>#Өc?3 Xm5yimObb!ˢcá<5S9Oئ^t[@w__} {˦9ȃobDXoY8z~Q5[G01tJsyPkɏ' CYz +o.]Fv2x  }. 쀪~7pm)R$8Qw}{,лg\|vX`'x DN2Wg{.{ȵ Oď]_o߯>̡0j/#o۪Bo'ʻmI{,O(1 =/mA.E`iDlf \~;Q̟J:l=&eK^!jmeZt "~wa:`XAx1_޽y9$@j :d C@"AF)]-'^B iKE_|@S`?%) EUʉGdiUf$j(/?BX}U!ZB/oŦTaiXMp.RMu rRhϋ3rPqE0:qi//r)p'oh38^\; GVq-aZיKR3JR#Ij8I )S6Bžr=[tU´}s{}ym䢝1DR;答IAB :Ϯi6\ (6EjTxiQBy3U"R_1Outo@ezgqI/Fk &oqVڍ8[2?^7'BL({L.Eslg7m~S=mr"ǔkr"g#r*mͿ<M|}RSq)Ieeq 0LS+BH7\qK$)W$YDa2JF5h b2PEzqRdY2j& $=tV?l 9 7-tzRAB+;Ђ:26.e}O=p&ܿJƎTQ Ĺ\oiL!=v"q@:eqOWR> B&!LAK$ ^KH&#d/i/ ޽RNB1Ot.[C2ՁӺn3qLo譌 d\WT9,$iD|&56btYQ ^iֶ]Gd*#V L=>J8HѥWB8J. U)!pK:?D䊆WM?h+]0&`eߣs1c}Y.ch.ێgcOHC~K5f޽]OEtc&:q.4YzQ[jpiOd6!7 endstream endobj 2455 0 obj << /Type /ObjStm /N 100 /First 977 /Length 1965 /Filter /FlateDecode >> stream xZn#}W1yXU,^_#[ |/޻8_< vDB3<z მO[7?v8_|:Y KɓeZe.Nؓ0fmZ=#``W˳f"s)H\ĨOZ+TaX\11 < o![*<xF*fOQEN "zKOOoo5<OQ2eDU'-|uwu}rown?g#\dNw__|ϕϫ/wx }pWm>]- u+ Bjzzx$MM&4 R(K|D"mQ*{T:Z>7JT60#}li^Dvtq99?4 P ./N.-^& ;v;}q~ *7Pyqza1OZ5z~%JO5?Ewqb\N}Ijð_NHp`=5.>{OCF0GڍCSxkehnAwx^ k m dwXh- kMIȜ.4yq#LOPE/=83̸J)"WW=q%zEBI17toWK˞ ˍrcb9OE"Ƭ#l\buhr#@#*V_@IP/6s{;4xJjܶC+0D:g`{@.y'h|c>9 JZQQEϴLjWqEcs(Ygl^fߞmJkLRXnGWnq|~q>[ZUA#\2'gӳ /KEIq=0?4PJ;O(Ȣ#N*j;QkcmNVmGذmB{TCBG'Z ԩ ,GGN^-*74:qPA$llCs!)O- Yoֲ چ*m)V8?Jhmm\TC/5"TarϔR4[' +xK1q.Ȉ}l!}^ [ }G}F ӱBDCE'˄8Do_/Kyp\k Jdl!TX~.A|UiG#"2qŮu\s%qE&!qN%vDI9 J&#fl~r!IЬGz}|YFjgcoaWBgT5yUȨ"Y?p endstream endobj 2514 0 obj << /Length 1366 /Filter /FlateDecode >> stream xڍWKo6W4$ER{J4آ1@Fma%M_yP~zE Ԣu&)Uw#:FE08|S-LJYf{.jS/{{ݰ\i*/Wdò0VxݹK]qҺHKg˿6?tG1]J7뾩 bRtbp&~y觹 |ǫ_ο o~%trHxaC>pXRvT|0fmpGXL%D[ ~:1k1^oLY657jYn"Ã~TĔ_@2g2gP}#zp5*L)ɖ.J8pۮ] _)vgY&~aXET4iO07B/྄pb4%B:)UB=/4|e$X$gZy~x|zu a&;:4V>CƾYAq?|`jrȀ^9A)^Ab9@Z=CDFgܵRJdpk#gGrfŢ./ FޝJ> 44B蔇 ۹Υ` w^ѸoGoR* x4!Lk ,K2+2kV/ME:qG%c3Oo;`8=HF}}+ !/yM;z Z V_Q endstream endobj 2517 0 obj << /Length 49 /Filter /FlateDecode >> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 2526 0 obj << /Length 2044 /Filter /FlateDecode >> stream xڭXo6߿ؗ'>^v˃jˉP[2tпf8CYؽ+98$'" jƷÄHG3HDNRQ-ד^M?/;NF E"XMd$48R$.LTKt#5Uj*Q t,|:Bۆm2R%cd靈^^X{cFMݖS{y@S^Uˢ҂$}12E ΊɋmS,mX/hcYQY *DM&PdL$| %I382(#O}Zՙ+)鋔SpNz;sD^s7oW@\x0&>R*JDGwe/FBm)1RM4rLZH3>[4`9~C2vYEc<6? ٛ7ZW&_ buF$\N / <9}x}8 fy8O18Tw/K* 55a ֳڶW!kPuȬh5դEvWtY9eAC4,ɠY5DF! )pSŁzaE51m CpطVb΂7SW#b9(2I؅|L>%  JD`0qqwVdлT>9W8, n\RCC~}(Jes5eΞ #^ij x[6և| ~Jƺ]11 -!nY6n!!M|jCHəP!GXK=ඐ#Ջ.'BØ5I]ߣ,Xtk)kV1 egE7wq N,8@+83%Fݺ-7.6AJS56rgяM&ČY`gMgh`,uZ5xf/W..vI.kA+"R>aײmߛAw~ ?T٬=BtIsgqӲߚwC0OK7h,v4{7'$).8qDC"7KW4Bky14fMS5?Ry.ޅu29yTk}0CWwEoL9kx}%.X p,i-Z6\׋[dMi%bKb(Ρ~Qdz۳9r|9֮ e)7ȹ\`I(pe}e=@,)tC Uz#玙Z_|P#_љSur~~ °¡~5 E3YCh AEej1xh%}8$c7slμ}\cq8l;=$~Gĵݾ@ΨaǴpe/l[hQ9=E# &Y6 ol5u"o]HMnrGgA/ }Z -:۴[2atQ!,#Eֳ C2S! GBzɺ{9qYmJz .5ُ}Sޔ6m/̩XhRwE ,vTAԵcmXʏvr6Aq]1FqWn u|/Ahmeeȿ]/' Ps;ıSh#!%t۳/ xae^}l9Fl> stream xڝYKϯ0 >@N fAf] ݃ڦBlɑ SŢ^n`*Uůb?"Qe:]lO︛4xr+\$ؼ1 Y3Kmvߢ8]dʍ~X?}iJ)}g(fbo֛~#LPF\85S̈́ҤQmϰե\o t ?lK΄4$^]mDKeٶhNlIO>QQ>UԵ47)@=ޫTZ%,:^TFw2׿CkipߓMmQ>:H0\bR3FЧmYmLfϲMD&`ѐ-.eYoUF!3~-r[=O!RyI ?T"Q,&5ǝ<ڦMu :g2bd\(bg h`OcN|Y Hq Oj+dy]7<וs.8;ЇyQ _gHQE4|獽qRq `ktțw.{wy ahi\,6hb'gzK&j ֗-X4tf|zXs|&k[NycUbRsJ a8->!"C'_&%x^]ٟuHC)q8ރ9AiN<XOL*ԗZnr ڀ3\HVuN{HB o0W#Dç/ax=&  SO;|u/ae"@3|,1l-^?Dڶ~c/yH Z^Ç Fq E;muE " eXߘ:҇}u+uUW= {:3@ 0--i5nĐ}̛*<0:!m'Yabe3X}H9Kk % fܡ깂C3Zb2uSy2a݀xo(1Ҧxt~w"8X9b{(096A,zrc hp`xXp Nҿ+c.[ѧn_s _h&tl~1 f\)=h%GNsOuHr`-$a"8 ܬ-0iImiF^G{'wƸUUBxSxh0҄KۧOSDa%r:f\nS}Ͼk^#`p7C ޏH0cp%!슇$ k)-N}vl6)ѴgA4P ~!p84"P^*Z,|_u~~Nҕuy$:53qf4:)z1by#E!No'Lz sh~[; ĂI}Prӷ<-m')| c=y dAxԌ A"~r3_#fEf "P6Zd iK˦yQzqŌsp(hݙ$6tY⭍*z'{虯 O :z6C2 J? Vs5֡OMX7t?ޥ;N3x?2,NĀ[ @#E`2Q-MC4^72t1ֺk*5/:DO ]+(rB }: MnصR],c\yl[DP Y#]q xҷtIV"LJu{}[I+E;%DE ?MNwW_ρS tҫx׋-߀5׺I h&a hv#9Kbsٜ܋<);'nxٍry<\Ӟ^{ m#2$ 1#h޴=y01ނxZ ZF}Oq`6zw`>HȖEڑ}W{ց e})?H4 endstream endobj 2537 0 obj << /Length 2453 /Filter /FlateDecode >> stream xڕY[s~_KpE 07qjOy&}`%dQ@  [r LwO_nU]ƄuW퇈V+<ۯq|02u5_ /w|_g]]]ktM]_thg:ƕ$:ׇyx\"y6gCe,ۼZVAd.(;?vln ku+obQ( OJj?υlĤNB+BUV-iiΗ|X>uHg_o?>OaT>wԾqjc}f,L= ;+ 80Ѵ[6hD(`4LVBv͘8DvB867^%q8;crz6 0M/į7"Y"$愧, ]ʓP)<|`pҥIg: ,aҶwFB8[ayiXtx!g%3$ }U Ր'&kdQ.8oY?g}(x! ^ S*gM1̕ -Az>pjcm 0'^Bk@V@0BΧ+ m _^URC}HL5B]Y@K~Dk-ږ,z/A$>q>o"z6G qV/+bxxKzٖ+qq ɑctl\5tѸ"ݛü艅eGѺ7Y$(/c2>PqifRKpdnr{7vb˰΁8K/d +=0<$0EX[>!Χ$`H4$/HCŠC3նÒ| 3+٦׹˪TЏ{p x+fiz 8+kt:h jI R{i%@B+7Y ǖR;D)Ѩ3D,Ú?2f|hFiąͨ(OBQO4:HHP\Ș>Ø,눱ӣ_zP;h^';i`ae'Ž˘g3ʞ^ZQ.=Z}G`' Bi}F7nƢ^s BE)P+quc*nF:  4TBzbbLQMI z _pc 0E{^j/Q߀RXHԗlIE U|V[/JۊݹreQd8;8=xKEe>JO}qjշȫѯl8^(K-OϐF~=Tٸ7"w'nšékA&ۮO.|ݚ/^uvQo?0Uc7{IEoɸw~_:^Nw1ܺ endstream endobj 2542 0 obj << /Length 2513 /Filter /FlateDecode >> stream xڭYs6_'j{J]_4nme:$˼RJRq.vA4771!`]„,bf͏$ӭp5~L \GA.WJ ۫ߗ(?^( R!zu$JP |^TBF1I1LBdt.*Vp#nuTӀU$Ov_7ULb]A=h--Wu_%B?rSW]S9I*p__.fEѿpXE*?]d$@1hϫ`qӑ2qC,o< 4 A-ُ2+ XO7׿-0I𷫛9.Q+z!4[jzleoM[@ۢ+J,WYohi;la ;4DCNءMQ9R,񡃽m|giu*Y]JSF3xec=g6]Z;% P&GuheƊr?nr1>b$4sZa2)a96݂McrzN:; re]hHj;"BcwLk0TTD]ʀJ0i^|+eH+@;eBᜳj4?S֙i)pr,ڎ8kvw=ao[.uF4.9>E+)T_u S&yMx똡 DRQD(_1[|͗I})<:v5Ǽ̹i2*&5hY@@K3vk|t~GA@S}gw5rnk'Hр) .fzW_vփ `rY;( 7H @}7v;O\himF ÇvyÖR>uX7Ǎ/f#Aŝ:C΃N 鸙 <8ck_q~y_Z`\ wl=-AӃ7£'8A^X>>, i#k3՞]}(>@w^f̛]{.">]qވш#biiF 01*.>kO k524[߇D ]Mߕ7;Ҋac0'%D@Ik$i_Q 29Zk >niM\"L/wgEm-"?.P%).P NZ(ח!*H`-&LSC^. IaG?OoRdRzAqo_"&"Uӆ䈼 >ӱo)L$yƢ *BaJ#qjz>8ES֞O#.tz{_(~Ÿ?|3V8EՊ<((\ Zs#F'w*gIaҺ4,O!m&5Lze/_ds"4hDNTхg_G4>"5x{e{ 1W2g?" PXjadbweٔ컍*!-|94zX_6{ξg@@/ۚBsJ>I *^چȿц{*n!!pO_^[o(L_ endstream endobj 2548 0 obj << /Length 2044 /Filter /FlateDecode >> stream xڕX[o:~0ˑZ+R.݇E=8AOؒK eVj"}JL"+)9;1wđ3]>SO T4S}ĔS x>DAo<U?o74, vᜣ:U ^<$~.Ax"qЭ==zv cvJMNAǎ8w%} !{:[ن|g#$u /?=0;Q m8 vJ0`87;x" 7Oa?r4d84πD=j?3 endstream endobj 2551 0 obj << /Length 1900 /Filter /FlateDecode >> stream xڭXYoF~ϯ X.o9PHԀ>PJ&B*\]+h|;Ȇ(t]+jʦr;b0 W?~؎h1ZGЙ̜ͯ.\F-~yusByQ䌔k٠hD\5-Sq'LV̸xw5:Zv<㭎m)筫bK5y?c]mo}oeqqqc7qqSh WsYZ2xp@vTF" 9&GRE.R+}{&tV-5yG+3põ50PdK`@(;Q"GSy`I J8KDS5Z 9uuX\;/Mhoy>Eǫ߮o.jߒLStY&#ObM ѳ#:g*gUώ薊ImcP;Rk-|Wu{lH늀c0)T@nO*tϗ\ld,ŷߝ"M 8cz/4N-$VlZ7 V·E!w-lA303/ (G$>4z%+(0 YIz\nd"覙>IT \M|zjfĶ$}χi3ˁwne7冩Douw6)a;3L־L9+pI vO}Z:Ow` `QU'e͵"Q:qCiǖvd=|"tUdN +aq I9HoĎX*Q1TݱŅA%&Y2ڜU+V_8 H' yYH#[ @YQT~U75V tGذ|4^:Dkv0u_!0?q%5(5dt2!aU]dZkSXv1=Ţ>O׺o&_p3s}6ӫR)N2-;24L'{I D|1ovW/raHcfGctnȜ^938бRF=Sp}#.Uexۊ˥gO<#Iv.tCNH (C7OR&ͤ'RpjtȽƻu0YQ1fݐcpGDN (0/+c.[4Yf'FP_GzFx:;kP&2zJ붏sɃ endstream endobj 2556 0 obj << /Length 2065 /Filter /FlateDecode >> stream xXKo6WQ X>E]6n?)ir7F{hI<._%W6YR2f"q~E^pc 滒YtU:jR p5MXd6*n91dd8uzlQM?J([At f['nhfCmP-0L {.A4z#{0@-Ms16-j23gL1!yy)Rw]& wDʚw9UBm&^"@uXn+2$*jLa!`p9Lh}P7Z6眨 r t6-\5Ꮲm-KWCgg⎧[E`Eb|K4VӐ{cKؔI#'jVE>q:@NĎFp_v*aۭKyRYCnnJ'GrLKc3jV!% 9ѢHm xQԝ?!ɱWe~#j2?%a/\W(hH{oK7|T}B/#^b]$eo&>MQ̟[UfM3i{,H![&L{ATA7׳^*{ixγMUR}GHb 2mPHCشKGA H {f ÌѵIH4:E|ghp0eg)xOȸx4ұ$sKx-:@AKlcY ?r|;~ii9 B'8t *!g$$B=-(,OsHBvW7*|A~| hP$lzFpGP]cXd&PVg I=W/HT,鳣'JEk͐i# P23EwJo-,'(e1*V hF'Z%zK>|2[_A endstream endobj 2559 0 obj << /Length 2486 /Filter /FlateDecode >> stream xڭYmܶ_qȗh *HAҞF@u;Z"i}pz;ދb?F\qOəQ*.t~vu|:|%Xn ۙW|g"g\nv+1i 1y^ "S[RCvˠ-BmytC2~;uoMErJhAԃQW0KvUHPs1]1˭l[.6N_.Ol]r\n dʼnZ:g*h Y:G83E>Z3l}^/eǪq|fiUC5Ah$ 8x+cXo$x*4y鳑홌ustw $JhA[8f w>kurѽZa?&b%_KNv8XJUU\`:)b+t{`c w`LThl Kqj̀Δר **c(鍃lU18.՛z#T@r`\1%2M N(yd✭v]`0a+zv.3[ё#)Dt+[I0V xcDŽ7X+*DpȨ22c,~*-χx-f l엁Muµڥ{_ҷDC_L[c& sO茪징 jjjMh. èⳁG+;[RMmv$/ ypEINo%yShY-V4)͜cOtMfu2sX!v3xj8L#, S)>>{MaPSQ3a 2 Q xmzx@I_+6<"/E*|%wVsAO&Vϒ <\x͊eсg hKjt%+ϲ>tL+b}g}Ŝb,7hfj$9bMH< 95e 5IțrMSYe O5ߨdYr\EJsE(@C%T"5P#CuP B!f| B]{Ir;z51cvR,>;ِ<GPz^`Gr\b"K !ƛPM^h] = MBqqi "@$yG[dH8D e-@8-TE=;ާG!d< 0 lS6YQMVxV^4 +XwTP[D@LiΝJh:fkGo+ϱ`s|b1w,D~ 37xi;~zKMxt5L[HH=wb[&t`x;.DQʨw`v~ h॔}::ç3u^rHc#WE0S=&`D" ̎ ۀc:ptATݦP(^BF<2SPb H|dSW::`&9/.;r$NںgoH"7ӽ-iȁ2[  /;-QqhǶ5 T{kR~9PZtN zEn)H8.8BVKrTA( <"s`xAgpf;x[NjH c9]>0O'n/P2Ԟ:Wv_i0 5G=fcKwmN.S=gh;lP銩᥮a! ǏУldoli9Xej+@JL02qiw,/IFSR.mAȨ$zJnz endstream endobj 2562 0 obj << /Length 2598 /Filter /FlateDecode >> stream xڭkEX"އEz)!qʵk!q%%@p8o~ꪈ2c"ί6WvW WJVZ`m%ɕ"*iIj]^o0T׫8Nms`/_q >V|-3>9K "u_ UG&ޡ3{3\b][j&${ͷ4|˘e"4ad!Éu#h@Om',[a}m[^TkFAo")<^ #"YpDXIcOgAR̟ g2XkLDP{4l/OJ(lݮ3^ $"hxq B!P 8HOӠhl 3iEHAlW9e!x>)$^w?YJY+h㯑;Pc%I,Fiߑ* ^:6mSmJWA]Tp;{+٩3ϑ$푡_$ױJ7<>qӲ4ޖBh8g];>o L|$U!,1͙gb4xԿ^CX%V%@ዱjq=>םL̈́t6&fNKt\rC< M"f"n[a ̀3V]%!_ǘy) G+3)%pe G+ȶs aQ"$[k9ym¸?kqEe }Iý-ۺeEγ"l]3aΊYH:&h#s&طqD ;j,RgRNS1lIC_y 9R#xTԍQs4oJQ  H`s; ciCa LJ^&}b0qN."K?xM͓H2dO#ejjDDO#5D*+9ujkng8@>¤.`4UUSj~'`J;Ť'8@/*48bSShiFJS3iʐh(+L$rwVhr.Ϛ^+Ed0Sd7֙ ~9c;TZ̉3k_{3_jWݡ<ʦOoBΝJt=$`~h[^PYū&$_TI^/e-zTs3\ysj?5qIXB:^;QC)u endstream endobj 2567 0 obj << /Length 1893 /Filter /FlateDecode >> stream xڝXYo8~ϯ[elE}Y$Ef][Hȴ-T w3-GiE"s~sHr$TJ^4I7g٭VZܽ;Lg}@y9?O#b'|1`jK՗gp@ﳫy/wBIhD#EVY2n={TB'lmHzA˺F(c['e 73C84J 6i6'UW"P/noop)7'DgusrcN&[.ɌB=Wu'cpo2#<n#xRD2:lAl6E> stream xZK8W؋hsŇDq/A];H !blː*VQ/Kw6l"YW\'.^X3b}xqAx#n ՛=I2.vrZmO):v4&>;EMUŧz^7UQ-U3}Yê=TRq mp"&iaa)Qqdr@RmˊDOO_a,*^d\؀xMSL+#mL~"bib%IKLPVa GbBB*ATO+Lw8_l}.ҶçՔҁ ਖ਼ :UGeJfm&L"M 6E|U'3:|0DabS{ax]r(hkaz۩:VlE$Z= `;>vZ:($Bwe9S1Rı ߑ '@O?×poJ]/+ m_mALmXal+SBRxv:Y.7|o"9=PZ (\>}ݚDzc0%,g<<恉sV_)$Co8R.P+$/_H=_cIb9y+Y )fXNzeUoei /&څ3@.NtPcDw#8Ir5LƳ#<zrrVы!ĒhZa80î $f)\^ݙxqx^l 'T/N'&7rCv ^S jTvfDy]Liܘ318it8z2,4;2l41:/MXcƗd(]2iŦiފ񡫈(evm`I5V–C̨>ӳ>7uPR!A垸7>(dI G@-peK58?ZaMŷj`VqvKh;מ_yOfBX3X)Q69;5dO*a1!w$8Ҕz#w4|d~dqpm/@O#qOs"j 0ȬGP4m3uy\A3_~ä԰4!ȕ tX< xU[%*8?h$K.J tmaׁuW`je IzE{NOuWɳ@gc^ dfIk0CpH֚-"nd˂Ȋ5ޅfissQz.S^Bgo'7R]vֱѩ{vl^;6׎wZ4}`TXvfluezz#xS_pgl"7r[.B=%&\6ׅw+wR8-,p\r@ rMVƚY؅rv DlU2x& av-O?~0H&m?6ྌeXƴOB%k[57 :*@0B%Wc8V52NFe 绾 {9#fAS!ܕ*I/?}KKNaf mU˘/}~\au3}Dzy HCcܵ}݄X]I`Sw'=qg(8SOBGORP56A/9Y6Fc90[*ck? sք5afZi endstream endobj 2575 0 obj << /Length 2196 /Filter /FlateDecode >> stream xZߏ۸~_a/Z`͊(OKҦ <<( INnpH=ܵ>p8|E |a⅖$[l_vO/̗yԂĆ/ֻv)RdVVZJD>[2JzXG Lpy,a\&4&E}q򾸆 _PPEN%sYh 3[=ci1/aY;a6fJ o>i $qgГfw}[v:1bsh[vk,p&b%DCWlwxTL+ChɌ]˟cTUѲeh}N]/\P^!hztiT~O?$}EX}i>Gxϛ*aL民͡6"Sl4E:'106,( n %ScXUط š- ks*= - 6-=믩-ЋzKaj:~\x,OcP ib~t6|6 x^N/M{wSu7Jx5M>G-4X$Hea -cMn{sB7x:1,h{/OR& ɠQ4f) 34q;)p:,x<߱Esij̢;b?+ҩK0V4Ɋ>t=U6) r}qtt`6(J &C&-T;P7,.#ȥҐٍ lRMÒJ_>Vqm_* Pv~ަ:l})a!FBZ[98<^uDY>M79qRMA48+.wB/?"#G$/UG4\'YfUm,'!,Pr yE(Q3jc4vWV>' \#JpNt"8b}uWԥUXH b-;ELx˶}TCHHFm% N;"Btwl,'yi*8̪xƭD7\8xVoB~O/wn?=d8p[ б#'$LU3DZs]z#q<05,7Mwe59Db 9=صZ4-^5iތ;`ϭP T][f 2ȜPǣ.LegIjAdl?`'Ǫ{_(*qfq2 H ^<'H_Ͳʭ0Bf(G^ "Lĵ 9WPi9?bz?;9AmYMX(7^"}/J@Ԛ endstream endobj 2511 0 obj << /Type /ObjStm /N 100 /First 972 /Length 1635 /Filter /FlateDecode >> stream xY]o[7 }"K$EI@P m@n еP4C9&ևu$RB).'I]+7,>u,jp~IN pK!8]ζȕj`bC HT.R(2 *ZbcXblv(L &G,j`*ߟY}TcfWlH͍EqDQ]ݴ4m$E~&p\ HEt gbCTc8P;8bA?Lj7 IrAم<j[@dj9 ]Tr\kIb%b`8B(ڊU&uªW̕$E;;z$E(H'ONr04TjloM&1YLB S8` _arFm%(D%U;JM+ܜ̬PtlT8XW2er*Jy,Xn=Ga);8E!6{1  47X͵5fӂˁh4>]ܹ#7>B-F"NV /F]ɩ_KvXxb4~7w-ϫ4~e㻗˯*Ϲ5n؀NU=M_2˧OOR >>XPEE.i]l'x$o||siWoOКXhCw4}}?xhryaqbMR 3 KT|WϤ7|頱㓷ӓ̈́;sFr3K{crV/EJsNŞ=OsLRT4@G/\qDe3tHyvN?:PA:%X*'X:l`uBD(1,ȸmDN,PK/0D9؃Rw&PH%sP9(S'x}'t4OVc͖=l_y]/kV)Ǘ: t7@Qj?G_Ql8#RYWh+[LN^($8 a MY\aq3Qw9q+M_;)SȚH= iSN?b|Y${u+]枫p?dvyy?%$x ڏƌcH!u`T$S`]@JpBH{;-ߤcZմ{ЃWՏЬrN󭬡CF cJ@_7$\; =\fLqMlwj PBOH mOw79m/@eݲ_=!J+1j{[QDi!g7ɛWۯY7m_ endstream endobj 2583 0 obj << /Length 2234 /Filter /FlateDecode >> stream xڵYo_a֬HQ_) v{u!Zfbdpd+kE$p8a$9ɂI"$\n~߯$̀p֣՟ DdrgWMӰ ~}b<}7t(l.@F!l[_M:"{>U/Q"+ n ?>](m 0tc~\1h]H" xzW[ަe͟:11' o;s.|OBSxZ"8~R.[;qeaݿ6#A!>p֧߂(huhU/x[_#==aH.8l?c R?ͭ1wߏ犹hS|=R( NO=둏c{μpUهH$QzHL}NtDӭXtk>SVWLczD0 B<TcrTMt$3G9S'ci6f~}qg[Y4-hY,} Ȍ100^:ИuR6¦MY1)kK@cM"5wzFo UHBge y.jg}^( Kvm32qlM\a m2pH,[!Ϯ،6CttVqZ,JuM7A2}@ RdU"]:u0EV)pMY{Pwry(o+HbKeѥǴos*+q4ǩn_ڵ Ҭ=ĒHroU>@w7]GHx>*KOf%/y=s^hw{aqc,9}YE5-`@^݀Є $ w1^!. ]mG<sTO%Цa-MjE։9 q!v ;DɅY#=D/ /Qf.ƤJPI7"O/sU2^5VENXǗ{\ڬTmJ;͊P6+I2Ҭ@BHYzH H [~fe sw|olPtӚ}pj'nUvSO{̯E',iLRT$: d"HAi9.C7wF8XZva~쥃 endstream endobj 2588 0 obj << /Length 2160 /Filter /FlateDecode >> stream xڕYKoFWɅj#gz0 R8>"@*IqR$M;|>fgggy$?u'1~'݋V|~B ʷ/~3NTgAN.6CVK/ Kޞ?1O82^_//{")RX8 }eB>tCׂXYu[5=/ndƄ˼5.t&/qyy˄,FL}lY#;`x{ɻ%* TW?ǮEj<#0`*.˃@eIo)mYw̦_BҦ터YQyyvK\ 5[򮨫ѓi "#hX*\ڠ{RЀ;7wWZtbXx-`߈U *"Jڏwg_ޝq.#셡n|acʢB0ejĮjTkO!C9O]٥f*P|TTai:֬$^x:6i͖(F暗zgT6=P_0s$hvb 8F*{!{Y65b]WVx3@&7Hh`ƺ*X?mf.P{ta? 93 e {ERpsu[ԇ€^C ܼc%!rֹ^,r<7MwH3SzI_$2lm7s&~hGkk)?&+\(|B--+ňjubjraEZ79PT=pA0Vǂl_ s5{6 E<-udX]z1"5$zK!dA`!!pZ< v %L,If*#3\[>NGY AAU_!s+ gRH1Gr;̴݆&3aǎsG*h^0$ڶΣW:%PLk erN",pNdjNKŻ sr\wdSGb\o /}Mуejw8] ;0 lmUKj?I|Z20&(ZOX^+'3@"W??o-4G|G:(HwwF.|YS8BߛvQΊzJaԗhI[#h9v9Je*V G$TY463 ]!a;m}w2 j0;7Jk3)h5MɰHei(xC=D2 T;wh/ %y0_N4dp2fxY+rq8\@$iqB  %]bp\lT7W7m&u%Gnծ^[Ԣ] Ncm0?lu3:~Mr"5ժNf@s8 T*_%>}Y4BLǾ X}qSb@{iiT|'6bt،]͑J/_WǮkN(N4 endstream endobj 2592 0 obj << /Length 1200 /Filter /FlateDecode >> stream xڥWMo6WZˊ_u KܬdHSpHYU9r̼|&lU Ao_j)+҂oQzwrs,;)eb~MmIзpr`NhʷƵ%j^4b%KgŸT*Ǫ-h|ʖ> fsINlW;;:8{z4]9/+|ЅJs5A)p3VqbhЫQ B^Q_?ipd%X,*,;@4:BaN`C< Ks]ubzZ|&1m clVH ׅ#y5 0'ZƔ^2&yq~h 0Ṷ͇UGsBqk0&rxA*<>A`h(> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 2599 0 obj << /Length 1877 /Filter /FlateDecode >> stream xڵXo6޿@̉"Gaȶ됬A|Pd*KMwǣd)e[w`|y ~|Hxf.st+ \M(\?R Ob}P3TGg$GDʏxG,J"O*%BdRa],WKj;mL0MP, CHI*j,^xx`a?]&ti4/A@+ZgyZma#s ~>{In~Yg>Xȁ"[.W"=Rt[0 z <+μ [jk D􍦹]nwtJyiѧvmYWe;̸퐓^VKo&,[rOS;Ң s"l\YE8ܞߧYWӠߢ`'$ɰ}d x3][ ]:J}G~AP1sXW{ a/$;q̂H^)#8#h%a;0zۙ Kvo4 Y] +^j`om_$O*{g4 喖qfSmK;Io M30AyuvyvvZ"Z8ҝΊ3'8jrJ*Td>賄9и(ޫ>C81!HKþj;% \.+;=~#߸"(Sj6y6vd"#MP=[3.'hݨJG@ s4-NXb>ud| p&{Ykadߏykvo[E%B@+~Hz\&\߽<j?}.KU}C9`kٖ|0rU֌uvNEu}^?Rꍽܶn'vfRKq'@ 3eU)ǘ3h7%1||BCګK9AYP bÙ8?;OY(e$31cotCF4΃@4eq&xzm;\~j[5ڮA?&jk;xKuZX}m>@ <enP4}oϙ ^]U a^UMs2氽q}AjK IFC^6MuDAr6sgPE?ا3,nsX4pg-x}(ڤeUuDlL̅C9>Ԁ<ԗE:EA"\JPǙx^2VRCɽY2 g^\;c)cMmt6oƆ,sP}8UwAQ.>t !'ap4 %&ɥrLދ ZxR'/HC7d%wߥ+R Ei "A3%ǧ2vQ}$)i9-TF^ yI2ؾu`dMXYKg4kt־'"JîpAZCc_(xX⼤.LUuG|S۩H%c쎋icyw}!i8qM0.kSDtpp弫F,⎯̿ X;`F;I) NJQ`Q endstream endobj 2602 0 obj << /Length 1892 /Filter /FlateDecode >> stream xڝXK6WDbLCnJA69hmzF=񥿽3VrYÙ7yH-$ST.bE$͂7?=R̷Մw/pHeTz`*ś.^][W?]"H.֣49(ZT"EB逌Ec& Bsuh,h : oK|rhn>]^D/P,efUHFp +wk0*QmQ$CRy!ڮ7]QWXma/$˄k>-sQ{U߀h2SeMPژ\V6TFy7E ?>/ī1*M YD:I0A/)y d, ԵP".DZv%ԃDC[]Y8Y"u?`ȪZTLW ,̎p7 lP\^zxmGm^mt &]V4Θ=`@ Z$r#1[3$H@J9nz ] SLŪFEMIYE˳!Zjye4}F(n+処-Säڄygu  {Ӱ.DŽomx5[ڠ8@,/7\j"FiZ 24PP@ _v!4AQN=ΎQu6[T:RQ*;.߮_ub 6NAZhkGrzLܾ H%nh:35W79s!R?]Ƕuex%[sE ꛶QYfA ^#HSA]Էn涑 LmJ:SYLWg֤7Nd"xi|0*F3Q VRg-]> stream xXo6~_ae2sHG_,MnI."3PզcJry"rסhLQǻ>wb# (shx:fx3f& 8iH:;#FILc6fуwN*ιOm((|#} -y(h"b1' qϟ/j %A߄q$ M%ݤeeDWY9fY9 `3T~gG$0by[T"?R-Hx:syUrBrDZZY`|ljǤnهl:E9.疓V>R$,{jD]Uj< [>jkGH 8@B?r ZoJN 8hy6C33"> iܦp> yU^ro!pP3?&4>\zOt4+9|g׉yNǶR-ҥE_+jA;Y^u("wp.[f#J'2<;TP%M.*Մǧ&‰">&y$h nʖ#&.{7@q\cAyHrғxOUl:6yT8"X|("+} Q̈W} сiR 0QL~!Bc1Y8 OY@(T,;S;J]:#})Y l$:}6'}li$Q,ҧLw"-gӻ d>I$YDSAM45$='O?>6s":bj0,N ;MG" xRXRj:UBi 1c3% !QG)򼼽Wս;EE7"ޓ(c"E0>׷ΕMtGQTƱ늀ζ ST6F时̀&5}8ԝñNBLwo}uvtUvZvALjú6E~Vhah b[r(&u5.߽F`q#H [m|B|Õmu'?#Czvtz.]ᄆR-KʖKюTĚIK85B7{e:NS0ocev HoM}Cy4Š~]г;{gtotםO:n~k/^?$+7I:eޖ1s= rc6*oY?8Q;m3K82sfض)@`2^pč]2 endstream endobj 2616 0 obj << /Length 49 /Filter /FlateDecode >> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 2626 0 obj << /Length 3488 /Filter /FlateDecode >> stream xڕZKo6ϯ0r Hrx',L8C6-V-5$u&^ԣ[N+0"Y,*RDnif&ET۽p_p7?FEae*bS=7><#88%R^̙7ʅԄJNE;۝ nwڙ箅B˾d{X^I*||3yÿ%f`8 SA6KdC[h,{|-u-qz؇$MV=2=И:!:<86 Οj!㚮X).MPYKkCY $r"qMTڄ:1/(]> A^J̥VtM?tPM]5vFa.;wa՝RޔDдlkoseSJ-I-nl C#$41q*Y/|0VWa/X#_=11.)Nrlv!Fj< 75Cq& P)ˢ,;20tѡ9sЀї@pʸ\<ՅQ{脗R Be4Xb^g8kTאDmJ)VLG :q޼.0 ?M@ ,CJ/ >gSz3tKϪ,c h#ZL"&qh"Id_.&@)yO6`]NХYH?yMBGÑ-@*_ #=k("=W%p MR="@S [BkQ:\5O S3rժ5]<({LS*  ѡi=hh'# ,BGzb0\!.Yx!&₡ȇ㏪ /m c،:-AK & oa@kfH$./eQiGPV( @kx̙ŀKIOk/n4y80w cf%;)XEܛnmh4=[1 לh/-VU$ hF)J\1P0Pdּ|?~Ij0GyUXP#"h ~hwC?9:+m#3ƕHSb,L)l6F_6,DI\Ay?̻82w<@Eӛz!̻lbXۍL5o,8KZ۴VLd\,%s- DP%$ ̼7F0mE\[{i;<_c\w+&2l\P3B'$HV&#} dpxgK ]ԥ00q#^ⓤ|R6R"CH> 4f5dDcYNp!_;0{?(P!Ə=Gbݷ\)+ţ+c0EYWOcBD^2Xs-],T=OEwmTuci:Vf `^^iߘf\N1ھP=ckDr4;|K]T˙MG ,͙`xn/f4.+<\7rE^dL nT'ra |ۃ+xSӸGLU Gɰ<8I웯LjY섞߂h y.1i$ l٢h8_j8A/2*(o&{Tk4aq(\\b[h7,/zdaBQ\C `mr~;ݦ8pH$fivwVADF<bD-YXmYμe E}bX\\E.GW,ҿATuj6٠\.UE.W3aQ_M`wB}mAY&1.\&zbwx+Y&WDEt̲nx2\o6$ PdE0qp1J+;M,y+|QMdr4 嶩AE7^\$fM$:('/O}/ (Cgfɗd$;VL 0LĿ 껡{~6T'C*&O\^H\k"t9H4W; @>ݚm@↍O֠?8Hgӣ+RYA1{nWt&\$Yy3N۟w%rId 7\9Y G؏va< <>ȇ3٨d@b;2y,z:ʢ+J={q]>`heLr5ޔ\ ,@羖Q,!bc`?q endstream endobj 2629 0 obj << /Length 1391 /Filter /FlateDecode >> stream xXKo6WjE޽n7GA[,l hSy,9Fo>lF= NJplO[ )$'gs!ۊ⛾8}dCCd8|i!Nط{,x?!!y9=w䇮W&Uohjy(o-ݖAOc!O$e7yy #)HauNAԪl2/>@ˣȎ҃š;JKZ`7nIqn&͎k9H%fŎ%ŵ> ߶ge- hRNp0pLY?G&SlJx,ëSK(?d;pOT|QZz`e +3LK9t 5/㞐_uoOҫ,i% a\ITY . CBqhqײQvaVA7d_d'Y1&? ( )\}Ow Ri< n!#R~flp,Jh*Y@w$oZ M]₺qIMSyC磌F^0/MCoa'ە} 7Y'VX3C<7z.<\ˠ$g)aY! jÕ5%`;M/V<+gj VUMg(c2GE`P~zPίfBu+Zb3E0[@sۯ4Նd7/+$#9MFUۄqQ Mnye6TE_UmVgwts4Mǫ@~:h׳;>Aرxv,罹 P6e6ɳXkFv,1 'I,=FUv vqyUU˶ԉ \ -G c fBp03W29]Ǘ 'IY+5ʼn~+Cm2G}ypWkŗwN؋xkk7gQU$1a[8+vAV5H@?oABmm뷿3ƅ:)~fmnF@Zslf7DgRo&v endstream endobj 2636 0 obj << /Length 2160 /Filter /FlateDecode >> stream xڭXKs6ϯPj%d{)gnmM|)bDjIjۍnPsFJ%FQ?9Qt:*VBGm^F4N2';wŘ Efr4{)=l>q鬗d#͙i4x&hZH8)Gz> % EmN[b3OolL2g6WK ~֓!.S2{==ax(0ΈR?* SlNSAt"tz{Lt}}6b}HF5xÃ<=Q5}D5Z}( N<} A:,"}ey#ji /$Wk =z\=|q{}}vfovq[M d&G S{h'UP(pz> WꠣfS}Tmq!L hӻ;ڐefy{A endstream endobj 2642 0 obj << /Length 1971 /Filter /FlateDecode >> stream xڭXYoH~ϯe(`&y1 3I_HMMI˩:4HJ8l޷lKg'wBzSRc5 +"NK=둏)+?| E#H]JP0T8~E8ϕ“P8A> R)ti᪀Hm*/0t/E`c#aSRe}X12dFvXA<y8Th~bcK)MMSq#T4[WiҤ"j.Y#c'QRV "铊H&a1+y7!L0qv,[^N c4x\M*t^&jbP0]eB(⠀ӬI{]:\@5mRSLg$eNU' -j9mlb_%@[zr|% ,+A;_ ,}%@?('~b._)DC^8[݇Mzhl]r/pOF?.9}-E$ܥ)x͆pX,Hi(GÒo{2ĴmZF o^Ll0̆VfG!%Ad3B [XR] > stream xڥX]o:2H'|쎭t hwm)14$Uߟ~m@ڤ*5mӁ tsy`ph5G5?WB K"7զ.j ;JܡpyY> G,p:wjsnEd B̉ߋ@0֓BvsCP!t\B;YerW㐅Ĺ4SD$:k%|J |Lf>`wYw/5^MzEy\Qb8gf]ZVvR('TঞoCaw2Q'UuU! E׋ϳ54BsޡTY&64^` VnDx |PDQ bSzz+? Ӈx+iT( *6d P!t)" C!&k^L.'W`(6xmmiYͤ-z=qx˕=r}jDL㜉E\Jj# 'rZ Zf^:J?\e]P0q~ tݶg5M\pBq}o\ąEa\hwDǞ sao:[!xsi\)az)=ũޏEw4"sc犲3Y,WFg 7g Q+en1>L8Prw̪ܙ]'V˥Jyq:_zN!u 8%V8ƒ4cqfɗUqXWi ɍjt3F p)4[{/z%Xt=Ρf}c]Nn!Թmio}v2QObÃSBS)r2&x5LÑ %,boh^H̙* ~B}ey6d[hU3PY )s/[@czE%8CW;.JdGު J(jZVHj<}4juu|= ѷʀ6&}LiǮwkՑa_5ت'~fP_ `لɵO/#mmq6lCɢ~_M淓|%;W ioHׇ71F֫܇T4Y-1TUIWt/T]ls~R7=OVV[t1Ř|SOWK$<s &K2Ut('eb U8 endstream endobj 2656 0 obj << /Length 49 /Filter /FlateDecode >> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 2577 0 obj << /Type /ObjStm /N 100 /First 972 /Length 1827 /Filter /FlateDecode >> stream xY]o[7 }""Y$8ۺ]k ŊdHS;}־u|])CR!%S)8CD#dsdo|Hl3~ɆC*Fb!gB&`8$٤\g)RCNB Q(X C*1C9an Q*8dC3&^yL!?%D%H`Hv:iզ0M:|R G *a M0-h` Ab)@)"*{f8\*nKP7I]NEBFkdÀ9qF R3" o 9@4:(٫u"80[$ $SJ;DKRMJHP9sŇ^} 9ӂ] ¬f!УmRga2T0 7 qۺrɘb9o4HDLKLM5ݑ89!S=^ IA3P)vPX钀18: O ΏHRĺU,,V9:23g8o,X`8{wx07f8==3˃y\{߿ {1gqIu`8[||ni8w_̍=ũ7z{Jcq8j7KS{*-쪰fH2^}~ިU62R ta3rJEE@oTve AK.#(Xg+h:xv+b(#@A`\[2^_ttK͜\S,[E麞ǵșRGܒiyMx>W5*n '(ZZB=YZ=&cfdyżüVcF[d=Dګ>f~ij$*[׊JHaU[lq&,6;DKm3B5+7 ؂;6q?T&t 6NlyPyVԫdT;ؘ-8*v\lxz~~a5Xmz9:M[=$d)[\D:k?:i! ]-yٟ4j(ͻFF`9^³7`f9x6<iG7Ll^^_&

Ֆɬ/牭O?+@9('/{)%[ps9"NGW=K es(lqm x|؁Q+[K u >Ml%r{^m>)9t{hCBv"zt1{rފ{<>=Kze×l Fu>J!Z['z>9V[ٴ~ lUD Ei-ʮECܡi8PE\e>uB?`=ʪ>S.5׽;@>jXV#F tvjqdWu%U^@ǡ]b";E  pa-?)""C4"i4]{p?M55ĈJUj=$p|E=Z8e傖ydt|v ȣ,߱\;w\LFzl8&J[m5 kV~2+SۜV̫o7 ȚʙCHV!݊9,݊^_i6!dL[z O#S _y endstream endobj 2661 0 obj << /Length 2832 /Filter /FlateDecode >> stream xڍYYsܸ~P\ZN?imyש%+ڊ 8䄇ee|ڸ0&hRg"8ˢ/lw|۟1q %0q͋K3EPD)I;=@L+<$Z+%VHӼt7'} T\+K 1"퀓8?E$ONEoOwX%&o>ˮPsV/lm|+?ěZ> XLF;Δ ;TTl}'_nLq6yjfiJ l]x #?*e7W8 b%Ŏ+uG6Zav+ZTVp_]q~8%xˁQgIdQdzP3n˶ر]QAkiEu|)uj7P ݀=K^'v>~UR{ rvA/]6I,2uKdwJ,,,BHQ#0&@Hn;=bĔG |AF;-"~{nv& :sRF@8~o)O=|UA6MY=,*n!L؃/D'“摜icҷN{=TuT?L$ jVa5;l2WȣJTbO JaDNj%( w}MdzlfWSilJF!${nUM)W$-bc7jf튩WG00llwMP_?" P;v1W~~| ה3 Rѿ~0n  ׋9˪3Yn#LIɥ l# ܵO\ٶpH_7yY0AR!npSVdi`ILVUjCßl1 9fsز| e@# t  tlʞ-tJK11a%;P5M27Ms(K}M8\ScȜW.9 )xgij ;,SB3Nױr>8&~([PUr# RΐX7 hU%'Ln%T"ہf<h- VrيSecna6KFA(厀MI吪kCe?;CFʏǫ_ZH>ѢXV)j'=OiMsHoGp0t#% (VhK3;@ ;LLi[S >`N@TI3iϖN˦0#m28/NyښoaK#r53MAG@q@BrEP-h1JI+\CΉsWa4RFmFlNo=KZR,PE-F>sYo**Onekz)8%zj|ۭ޷)g+n'zcܘHt=v/8 zOw<}ObZ ovfBWWAٝhI!h7OPf5?#5L[3XMb _΂ב8v#;!9X(:Mjg!rgO^]du ^'XgXLJmsC$R*^=C1?P,qb$xjT;_T'A#o`㐁kP,֡0F!\*G)ηp`p-?Ce!~1vE3BD@Ԗ - aN;1aQGzc5B-oFw\d:#E d0nG\X|OvH^q,k3Y e%I^z؀-bjh%ZI| }5A >`˫P3*(U|;!16b>Y< =l8[#[~\@\,?7\ +I͉.q! 9'G<P,YյK4]jATQd.oT{Ykk6SAJb.W{k Lo3.' 6W*;`;`^!B> stream xڝko8{2PsEQ":^dcӶfsoCInԼ '?I`YN7ޭ7Z{38xEM2?zjyY8qv:"ƕbƧ_(^|8 !qj Ǟiz[uzK:ԊV7Z!yۭ96"O{P(Py0V>խ=57N>n,n]s!JXt7ڊoR+?g. YҔx*yEl&@q&&3.˅EadQmC%96ZkUhMVsm1x ]hS6+:U5G2 M_J ['3#,EDd'Wwոf, Nx,k(R[NgܫJTG+2/7_]J֣Y"{SkG5[l݉֘k=zi "CGѡhz0T;mÈe fC ZV2}ME+r;4;it;UZjEZeAlkK)H"A.k(hyS f7Ԅ*x4y6D1.>:}gUb*=AiN0UPʫ &Fe4I> A.yЅF:7mUI6ZlmʢkEN+CRYtD >݈@d9UK!^m+rɒ"Ŵ4RV Z{j[U-LdlZnjҁnq_&ǼXǡbLBr 8 5sfbꝲ8̎7hա42 7 ΁HxE!$@S"X xex\*:uyU frSv轢0rza惟%Tթ3l3)DNocF<: W I`)wA ]s񠯹"q뗛 SIgƃzX%Ov?0=]-T!/}e~UDjv.a5phltrٚ'FFZw|9 zS"L%zylο[7ڴ{_7ϼwـ3:B|8bQ0_un3}V\)xaG{HU`*?n00ˢΆ`X*BJBd.c:(bt,1/>DCQX>K, aU{K:Gb!ikf~b[ <#K-4%G?E~[p7S4_DgnT+EpAL#فַ)}ǓîV34е1βs3&0K]a u<wY} u8XXѫBp\eĮ˜/C B{5V+K*\JE'Æ^Xa\3;K~jNWG67jO=f|t/P1 2E,'5LI:fB9,t~ܧ& :zt&\jai ^BΌ' Q09ԶSu7X;~9n>Uo~q|_PR+YIgq"_+Vu=T4Qw*)64xAq~x*Kjɸ+y]!9h{zPG?!*]|)bXi;bFsdҶͧ|>AKJ=m#,$|HQG@&ƙ£|60ΰtorӋ;SYd\3gڸQGz 藐 Dy7> stream xڭXYo6~>E dYQ^n k$뇠#qwY=")\f|e, CtWgm73"\qo;_xE3lE3$ݮU1ˢ??.V#(Q$Rf|(󔥳8$Pz.n]m|r뷺-{ eu$5#% J)nUoٮUe?BG;;'jQσ*azf _?@O@-d.Xï:D߄4v6.'p&"$tţY{}i} j .Hoeݕ'Β&\ zd  ]O 8L> x;/7^^\N T_ DxVJTМmUG8+BSb9dƮPq \:" !dzK3$.chhtgy/(=nڍGD.@7(h,Օi0IDoe-/ !*kkiEWqtđ8qig+I},緖V;rt`TۦE Cp[GfRs?Ӡ{0Q ƲPo"4h`8LT+4'HhR6MLA"жum27h"dp֮$9xEcu7ΡV%`C wփ˝8(0_hDrp>xmU% 8tzS[h\.&,*Nk8tN=q:fj@,>gֺT,J`&o5֑ѭVY@\ZMWH=汓85:4Uf:&E E!z "b6Y50azyI _;BHa#Pg5İY-FCͼ UP%ۄ8>=| bxfPXS뷵IrXfcB`n״_Sq cqAI*{a },O AI yyN;iÜ a }\8"#Bx^vP@{Nc1~9uALmc0Uye#u64a  MKչfs '/ #?qq}kJ$cJMU |Ky]GcR 4b{VM;nR0Ml8ZXqjFl <9;y~Ѓ_ endstream endobj 2672 0 obj << /Length 49 /Filter /FlateDecode >> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 2757 0 obj << /Length 2756 /Filter /FlateDecode >> stream xMosl2صl!]$v$a7>l6fS3+9>X=P,|1?|(%s..^ b^;JWo /_-4l1X̍ϯI A{V,jqf?urIe$<2;ȤgfXX UBܖV*Üvw |_b_}!, #9C|$y%ʐ3Q uLKxB#N_8Iަ}`;u/GqEQr4D܎- L϶%qAUN]A'Nqw4 ގ3HrɚcVWwC"5:wI%MEDDQs86_LpR( Q!j8Oi˄Carc*+ER1М3+ 52%\fpg.^V77h4C#!FJB$I9J9pHiF Fb21TdGsFi;i']RBdlmegucklq-CLux^BOeql-dsfhÄlH7: ,a/8) a}ȓb%ǡ:BGs8uw4!ykώG'򚳒%́蜰uޝ/1mz-RJl9V[4֎38rן.b3ih2kǎً84S+9^z8{4ގ6{9_e8~0|SS:=/oo-{p+G C2V 6ZNPrasLB'͉I=LOvc\|9Zai~Ȥ9pa+CHT04 3ʨhmfB9FĀRLj"Lj:GցT\ D5YOa|VtRԉTrDJ Cti9ft3F*Co?GIGrnc9Kр\. nj8Ur} 4^8˳41TtGN')k@1SWGet6K`#Ơw26g5Ƙ Ji@i8fPdYlik9TnǦJ e(tj,%&޷ƞgAN\PWrtAGxVəVrs~|9uv2E3u8؁!`?(`A`\oܞK 5"yBs 43/cJjk~p{ݼ_wppĸR(r:U|ᠹ8 ,XP;Eo>ONl吃MDM1Sc}$R7W"T?ۛv)T^Ξ keޑV0ceGby9MT3Gr`fGE53_Јc)*=~-s~D)gEwAb 49NCN4@C10 05zX[z77IY`Î8i8&NΈ=N{ه 9I!&rRQNsBt8i9fN]loV<ީV1"AӦz@i8fPF3gN&'F1T@ʖOX,]c 'x+y^:]*EQ' i8fDdNLo*4ECSPw ]4 ̤c~8'(1TZB 5p̴R|_VkʈPNRQ8u*hcbi~\_S))r:g35Pp̔ JC R31#*Z*EQg h8&>*$%4LUSd")%e+opG:r̤eT=:7Od1)r=20eDFä15#v9IѥQ8u@hcF,Y^n鎪8L("DZ?h8f,bB *`:Ǐ1TDGN2r\" njL 2/iٷv}*BE#T't;M endstream endobj 2848 0 obj << /Length 4497 /Filter /FlateDecode >> stream xKo[7Z |_h'-)PL͠Ӆb];Ȗ*9}|!)d0G50]qNw7#] BQ꿻]7,]"oVd#[)?jh.]|ݿ.?ݏ+q o޽O:s"D/$Bj~"3%ƅ60!?7NoQk(~tǨzc.'b?OnbXj]i{pkiN q XTkeR'^d$ꘔ߄8&E(2 %er$T J`6 L7CSZ8Hr¦(t?LK>^T8Ү8zb'q*Ÿ#}~5R8rvpcoi{K#P=փ׃-pʉ DQ9xvES %/&$ M)048MCAC5MrYadfH9SrblQDv6Zl&fILsb1HHLKcip#%14HL&CQӀh(;(EbӟIM0 t;$À^qpTN4 ZQgwi?b{Nsrv= ia\J$-A*'\%X<Χm 5N,٘p,89 rL,7JyaD>:b10&c Lp D"i\VˌPy垘{,C9fs8PC1ĹD\`}%Y, )棰xdq"[ޯ6U:"F/~=':>VHdCO1Ze{W *CɈd}Q]-rͯN삇HHC""G UaôҿclOƅ+~.V7_P"^Cvlb?j2!Tt=UtM(3l9a{8_~_#kSMZA?ȏ$E8HI~2X@~Kؑo(12nW}3FE8ئ8oA*'lVzյڮnV]=_,'9椴L' elj>d9T99_,'9椴 #' elj,`d馺9w0fKJI)MSpHi(;R!cWH~}ѷ=! zHpc[zs4'nkT:%LOκ"&[dr8\dJ N9Pv07LkO~Ku;h clc05 EB*'jʎ:#rW=N2?cu*E(-O! e˅5d N9H:FCDl޵_ØkZU _Ì5 XŘ Tmqb,2T=όQ ǂapJ5)'p-κ4Y7eƴc0>SN4>茏ER~sE1X^r8Ki]r⥡x6B2R Ҽp1L)k SN42!>b0*)2 >c0< N9PvpF]喝CߡӍ&E5A&d`YG dLݦ }z&dBp58MCqC:P=X;~i&dKL)kSN4-1ƶ<,Mz&IM)Fd8^vǻzV/}>. ‘A`#pGv_cW?dpLg\ WE${^zl)&JA6Lۛ˫\ߴxa˓lIǒarJS49ZY"gW/SLH73S:0S43u#us!XRr8LJ7 <)8UOJC1"MurzQ% JA)m:08UJC1bG7dW]kClN)baJ HPX.!)ʾz}W `0C$T=E ńD}uK*Wgc05Tzj5,5L<Ą#)AjN<1~MQPw1XLr8Iiӗ<&8UIC1a22$T}֭|,A9&  j(&!橾uM|YǢatJ#=GQn'tմ=5W& M)-zh 9TH μ'N)zvw9vաTqB±pCP5zehBpB^%B~SJCݽ a^J`yz^3Z^(QBTeB±pço*yjpbFȁUF+^Zeb /'0RRLAƴ]ufG;Ŭc0:ZjGW8x(Nd#&,MJt3U[Y\'ps^pb*Q| 3J7K8_v^ڢLcq0.y^pb… 0t\m>7S&ܔ.>}sS47T۱)sMH9sSpS4#7&Tlk#!*AN,RARLETQ>7gg>1Xpr8 Ni#NՃPL PQZS}> s,89q.G U=8 cxZ4[+ZN͜S?1Xxr8 Oi%NPL(aW4WCRǡAy,>9Ƨ4UHUOC1#C|/TgF+ N)mdNՃPLอq*=h.uGݹ3'EVzr^GJ\#{2Dғa|J?^j(&ӉiyX$Ô @(a̔u>yL4RzKHUOKC1-ɖj'>󍄦9PTW!U4-o ,/~U=)(&KJI)}@zR=ccP]Cof+ DF&tH-Serf 7xIt[r8\JSSHUQC1a$ Qcqi1kd;SuL+Q:5VgbbCBlt_(.BJ\p%fT= ;.?,Jنb0#cN3Hwͽ,:DQdZTŘM?㬥k{ِ@tZF!:b 0!_l'ќQFBۯd0w nj#E88>1L(N K緛N?PKL5pʔ:/8UKC1"nkBi/1tcI01Cr %&]F;0/.!XTr8Ji(!U=- ńi'Xv?-m'"\ gW,9Jԛ`P:K#?dk/ǩzq$rOUWtV!Ѡuq\4o6aWmtߞrFҊ"GX>ձhII|q endstream endobj 2658 0 obj << /Type /ObjStm /N 100 /First 992 /Length 2423 /Filter /FlateDecode >> stream xڵZM ϯ1ER)X`7 I  Xd12*kwUBlkQ$Oز> [XwshD`X]94Q+ C{+z ?=Ku^|2wo_~H/[}xM޾__oW%iï@nzA1Y:=^>y`e+|zy-_Zvv'͖(iD( ]5:~z՚6}zK B`% CjBf GhyGhyGhfώ@!pB C,LB3f )4ShLB3f94sh̡C3f%4Kh,vgnN/>/_n߭m[M@zu14uCnE0%x_ӟ_'Dxуɘ({J QAv,EgL陏:yAVYUHI]bv}-Ml[{ͅ6$֯b*MĆtjYvr]C` "XLy r,ɮ'[Sf$CO)%K=|Rz&s0F^z hc1,0v)lٳ,T`*vm{Dϟ롞SHv"r^Mt ;c1qVT3Ҷ\v*y*&N# #* V'W4{?HlkX:^A;[M³ MkC'i6<7˟(r#Yj;IxFlmN8Z59˝vE7!ڵCN> stream xnc\J ~f v\ E Di"MRqfHu$j5'Cua3:fΌI;^}ۻuWRӇoWj(qԱ٧>yÏ?}LrF9}߮8G^|$Rs{XGp3m%aB,,qZK/D UJT_VZR.^^1Gc_[C,3m(ak9MJZ+C&3ruĵV*%SD#|Br @xc)r:Z37gύ/7v\")ڡ)8{$ZyIµ(NRS05u;35gOnF7)=1Xg"s!췏cu'L st=2<gfX5[q"L}O7"SV霹9qnnmIɉ`ga8m99˂,j5<3gg_-H͖ͯH(Ls`+tt=3Ԕu̦ƎM9"٩ة78Ήss\iQ忠ƵUe61 6Qaa lIs86H[y*TB Bloc/1v,#=`,(ERLe곕v ]kQ7}`㌓v,>ESgu8{|'ԥ:`ua=^^֍J${I8~-KU%W*q£c4-ǖyK:9\\D‡ΙǟMbk/813u1XpΡRsS3q|b1QGlb(r:K4pw0'OhH&pl"H!EQA4tNh=ê^| 7)XpasTSW?ma/O`>&éc`†Trps p]k1Wl7WPac,$`Y*r:XRس$-;XjxنpTTIs޼*BMǂS08u;38gOWgoaƤH6QP,EQ爁G)ש4WK8[)X&N*|I8{&"75 p֨+gb9MB-s 2 5ac}!'#/rszc9LL?Ś\1L4$bctn;9'8L4 50q0JL.2|e$8勻Cd5LI3e`K(petl>?"٨ Gzz '9f>%Ta}Dٟʦb )r:_OoN \!L$[ۈѧ!B$0(2Z^i? !mX 1XDNkHJ1)QDcs Yў"f)X:k ]L};ӱi00舁Q0u:pcC0"X>wuxFcFxY6"]k@㘑:<.xNa,&EcR'M8׀I1cBmfp~-6*bk>m!ظTU,EQ'JVk@ı}.@j&,޹*=W͜1~$ @$*i:[9HWOT15+㾷/˧c9)r:kJ69N:NpҾ/̳_OqQ0uTs.t pt3ayct/."1XNPDpcD8K]sz̗_I 1Jrrv=AzNz;6 6qh/kn,3E3SgP&38L13cTxKS8 Q0uxsA<:-s*]n/=7`#Ţa,$k㘱KhE=]EatDvs t3:AYFzqG$Ĉb(r:I}Ak㘱8%،{^E("`s Xt3Mf_W9li ki)XPNkcpciN@P6MP% Jài@PN{= <Cc(=eb?PA̒pW csL J pad/#RYE("ě'cƂ9" ;b߮ݺ|EX,EQ7UcZB<#43L7}kM֒Q4,bDX9E$h\DŽsS/bl_"WbF -Jqv@z>ziPi> stream xڵZMe ׯ2YeI ̤lhgЋNO U?`s K E+[d6kTkDC+RmjIC]BdD!xrZbYZ@hK$%0Tu1hOu|LX-F08 M*h"ibGbWPHy4RFKxxb,^R"pzsNU^P7 8d%:v=RF-V{ ԚbV(5%$NM RMbnVZjCIւI8fiŒT}=I$X'Q4I,FjTx Ր$u Ρ{#,xRo>zxD,^W)u#e`㚴BJ=fɒHX)k棯%cXPQ: Z^)4#v8FZ[!iɤ Iu}aʣ'&lXx(y#9ima64H1 *KZJx`T6n?eDh1XH̉btOkp+]nn֢  gËt|ӿ.=C J?i;}vҺg6x.o?<-L|󀟯l%429ETJN`ٍI.dhly줬-٧8Is/\夾`n9R =kDY8 P[dze ݥuJVY-OF0EY"BՒڹ̹ܬMSQe;ՆLSVYP!!qE}ζr$@s9XDT8SͲGܻiqǽU7Gpޏ{(q<2) b?.A#er"mA@Xd-׻N^ vn(I8u_qzS-uy<(&'B\ƈ7O!xs9+(p똟Los2NԳv*Gܻl|*%x9KzZjD[dTOÄ#%մDao+!Ƨ(= E|22>O ntH hdVuCcj.{rU'[ד͓K=w?HWJ7>D^Ol 8\Ƈ2Hk)h">E7} +?Xe|>>E[.E]?ѰɍU;aG+\-Ƈ|ʚH>AƿmtHA6_/)9笓yEn)E$h ]CQڷκjz.W>@uZ+oP:۪fkrwS h38oE|ȧ) >e|*Qo|*DEƧ/2>@(6^"wF95]rUW[ta*m2<@,ο.{AGK;Ye+ C=8Xm qJ~sXyƙwܚ >U>i3R<`zQ}6S ,Xͭ[|,鋂 #(8fs\)Ƈ\Br=Y-Vr;ᾨp'%c[&ugm;߼PKE jS u*>?WmZsNA(vJU,(qv͵Q7l[!tz&q;qxߧ~{KzogWO+qv{5v/7e~*]~xSzɾ~LJ˟c`1ϟ?>˻۴ K}@p#kxu*M0l,_)l ~zDO>DO>D։Y'Nd:u"D։&Md6m"Dl&Md>}"D'Od~ER@S)))t 6L&2Md4i"DL&2Od @J72wn]{8|/\.| endstream endobj 3049 0 obj << /Length 4449 /Filter /FlateDecode >> stream xKo$+,DU006pHP3 k$[%[}/"C}{>],y1,ȋiZɌOo~LExU)yoI^\ax{w?~z{~?K'w*WՅ4B¯4NFHm_WߪQLΙ q.ޫo懇y+Ww?^K~_Ijb¹%+?mV_U:H+c 9O^ j:'uy!QdX; -:*PĤJs)r:<9𜁘s ƌBN>)߉y!1\b&$1@!JEi4/3 p^Yn{^PRsC$חI%'9903'-ISq{oQTs)\R&0s ka'I#vV>;rBR4$u^ 4$N '{-sVʥi:t𜁎s*!uDǼVF愞&IӘԉ3`p,QOw ̧TVR9J[I9+ 7+כ<͊}Tr+\VfѮ𜁕s`E baa"Sc2b#ՔFl1%Lg`&yv-4#3mPoG6HuQ4uT |4>4 /gHs]ɴ*3i$-ѭ 9r6&˟W-CQwVy`*K i`5-BZifHY~짥NEM*9"S 4:ňy|!9 (Lंs)r:CK8KI"S42uz\e:2 ̂DҨACҜiH*%ir𜁜s G. I=C^/̼}e1PIҫ6O J8u5}w}V^ޠO@:[ it,~fW}K{ L*9AS13B-(rm4A\~槎nO9aOTz.BEN#T)eA3 pILk?S ŧi|$=i8|$>?Oe\q.9ENS 49zӇ>Υ4q9X'WKOAҏB0si->{\@MTe)m=V wmvX>W\^Oܙ΀L90c0pvi-F0VvOi.3pp\h)<ܓVs32!pTO.ENsQG \4J \K7;IeQ4uRAQ3px!>f⧌Os,s)r: 4x4 נexǛc/|3JN&D1s-8a|#vÌVN@d_Z.!ym0pt*ֻͺ6 KnRո9}Dm9C 琾ÕeEe9|EgVHM6RMl9F=a: n lϪPPbr(r:W_o Zckxq105-kg'Ԕq{mɷoB\P 5pP̴4>-0` u T[. ENRu<ˊ\# OI#^kZaξ釆'CENӓ4#i8%m ڂ {^/*WS֜Ĥr)r:.kA"KXmG*"Ѩ"F40za?Ys1"AcSAi8fP4 ; jNP./JN2r0F#02NBBtx.Sr:%\F&䅷!,HlQ:{5( UA M5p(x[9c'd__cHsQd9MFA5p2/g}x4ט JӠԱMԅAi8( q5L烒jiPs4턃^E'%KJӤԹtIi8) [- bPc IREX9EƇ$<׈E9X{}<0Лӧr5G~g퀍 Gzp\`FWd<Td.%ENcRFps43)z2BL ~հb 5rH.+JNq#!qk`lxN~#cȫ>I9߾\jf$a /Bz-jaE{;9M p)r:T|!j8FJ _]AR׹ WKӸ L׈Kp*Ow!yTm.2EN#S?t4aWmwTU;"1C%:<׈Q1ciI-.ly93ѩ$:A3L׀Nh@k'Kv%ו GpQI]aF8lln?ڎ@ =\Q_5  jv>v=vvDx#`a;~}ÏW(՞ Pq+-LGr.%'!U˹v׭C.L0^s!.s\f.+ENR'g125pV¹<߭|)b\Oٟ2DqHP4u8o:x#D8> stream xڵZϋ_crS,L. I,3a<*Wz59X i}JU*U Rir aZ{VB/ˣ舗A/hLw.#ʈg&!If!YE 0(@x|04Pk=P3b At >E9_=1 5>5B  ňd~H!k=RqA󯽰 QFKP\A0Ŭs)iAŊ4(iF I@qh3pPv?!EZ͙9L9So[Qi1B@,j>]#}!ŚZ lbNEc4QL FP+6Wp7cIUKXre/[nkB2Ya>ܝ_}wS>ޝ~|R~rWmTHV9{ߗ7o}9S9- c;v+i L.sMNEic[Y&h8!=zRrj79y"j[SmNZXE7zr6n ߪʞZ\8{|SPuN;֝ihǝ(%56Wihǝ8{,Wwz7iV])lSnb"JhD'*ױαȲFR W&"NڶdDrT$!$O;ބEٷDO{ѹ3m XuǟhSʮ֟ =Et' {"qOw)2x ?yBOu o^ /.*k2NTVi/ښl:l>w.<&8?˵ުnBlS܃֥k)23번ϫS$|,IvVEƱ|^vydVXO|3M>E|bOF{(x(ey)^O"w :i [8wfEl*ot3ju_<[3_cE'j4x'Bzcbs|4o`T /AE=W3'{Ʉ8nOE|8EUv*E듽D=  Ϟtg#hP#gȫ>E|N~R}=|=) v݈|=wUHVdGcTrt;`IKʇ9.7.Qtߎw\T/!xnx_i~^- _t65;T??_tנC V<6~'|x|a-|fg}O?> stream xMs:a߃\*Tr!d7@K\UPTͯ`&n5-FW|YO L#闼 ÕZ3^ܿ~|#z^߿Gk _G??|eNR'_D]"8gpRr owG V0c_wﮥtыQh:eY} 'i;9!j`a\ #j:yj~x3il +mDe (.5H/`;+g)\<fKLBa]s.;UӨsap()<|>i;=N)\Phsp AN%^J 0*A9#@9P F!=eݭ6O&@rq"0.Ι 9r1:a\.oWny-l_:ǞP tje:Ȑ7\>Wi:5 ,L.UCw21 si1\gknП ]v.>U3ӹC8G|z̅mA(T_|F.HUsJC<AA1&HB_.IUJR\|T9LD[b΅913*vWkbey|482"|"͔9fJ G)26;p3qb0SϏȝ|9MU0a_B %D C.wcT$k>(fr(7)t2霹#7jtm^=sQr5b2 *sDapvORpT9 ̗C!spؽ $eHן I .*!" 9HqBRnŊ}BJ7*ǹ)t ӹpC8Gn%m\yN+/z}Od"ŒDLH.YsapL(58dPd"ŒDLL sdBYG½BK 7*DZTs.9O+i6븅f%O8$JnxN< dKDV_ h9gɫ֫ߘoc+L%AxfxF 0 Ԧ@sir;|Q up,yF gR9d2ŕ GpTyӄ:A88(2<;.; %qp@e9cjTf4uFp,H+ixDetL.TxsrBdv ]džqvwl27I/*!)S up̐0nd<7d^,ʁf(-kt;wisS194o6M+i}q8zt:rD؊L~[v:[G+[ĥIE:j endstream endobj 3051 0 obj << /Type /ObjStm /N 100 /First 1006 /Length 2280 /Filter /FlateDecode >> stream xڵZAϯ1R$0 1%C’e&cMV0SHIU'%FM,IKR̍1%޸rj䍫FI =R jgfUInDGAZNTş5JԔDcL @M聑=XjcNY;{$9y.IGDJGWA[ѣ&^mX=ajAs*9w(Aĩ[ 䥨=3X5C˹XT3F*^WbAو:I T*8&PGߚQK٨'#q6=0hbe%rIfG_Cϒk VKHc*cxyT!6U#ŀ*B eԼ18,+-5V3Zn),>(a`XRDŽQ8!}n<,D6^ʀFhO!BĠOC|Pu(nfޭ6w2rsDRʐ#` i`mD f3O6rKx.?==<\}/<?KBpKzϭ.mϋ@1[իty.~9]^?hc|#cKQ.s96Ri8q,f)}'/yd^\br/S9 qfZo$&K–{^4eeg W,e*l}Ѿ*4)lQ5[Elu2O,y ޝ>%/^hnR:\Nr_n\_T'QfwHđS#z[2eJV,|}҂@r㤮Ȝ~jQj[jp6Os_n9GL!Õogq_nBʇ+߬T!q_noVrK¢TAQZrWޥ Em_#,NhNwR R.P ])zヲtGrhBUz ui|P*/`4 }_X&BIb{<ؐĐMbjAqZm'Fs.ɠЍ|P.el' LsJ}͚ Pm_pDbQ+r|ӦWؤ;?d85J-H:kVӡO ς6嬶I|ֆRxiLZVCŜrr#O&zt)pJ\$]_ %AuֽˍR)qmRtJkC.E_I|pZhY8 yMJ)}x+;fD]O &A_>l"-}1jB$_%s^a -_lfeWbs}{l{^-qs`$8VNv'Dk20s4cԾkM}SaF;z}kB퓵8P.Ҥxϐfw(fϋ_ II.~iz.8f߮\ǧ/~f <q<볿>&fgb\ x\;5!a04 [ 5k4[F 0b5k @\r 5k @nr -[ @nr={ @H0( C(ahF rE_A!nsY ̍ ]0C:1ӏԿeq=n87GAYNQBv&qE:s= wy ]ڠy ԃmլYZz~{ACGt%B%wgU^z|ww5EiJo%IX]S[ŦR92i+F̲0ﻖ'tZ 'P񃈼ݪ)~!|'qߪ(.vp']-~ mQ2))d3P endstream endobj 3142 0 obj << /Length 49 /Filter /FlateDecode >> stream x3T0BCKscc=K \.hQeUgbl*OS endstream endobj 3161 0 obj << /Length1 1708 /Length2 10196 /Length3 0 /Length 11278 /Filter /FlateDecode >> stream xڍP[-w'݃Kpwkhhq'Hp@N  Nx;3}ڧfYaP7vn.a47^cFaP?d\@nO6YK8Up<\\B d-=U2 rE9ymܞ# `+ r-UK7;ӊ@K@ܼ0''+V vh\A. kj;@؁]kl<-]@' A]2ܡ m%wlrd.l ,`- U8ܼP߁WS%bisK&s\9\-r.rPk#,|voοO lPkMX;qB %BLق|\\\3]^ /SN0'S  psqo V [0?՟ Ề\OpI^0(?/:'- y\O <=w K?4UB}ڦ1GL 3kT 0G&\|\/gUo"_B_n#Ohݞ@4 =0,@ j &]^ k om=c0sT\\{,$ȿ\%@XXz?r?M5/ 890Ss pZ6VABNov@n'8m/v@>'D|lND%zOT\OT\On'f'f'fldM5 -Zɱ]!|XgEr%PoA^Vb!U<{8Z{&Kp/, ~ j-HjAseʼnk)hX3͊Y^[n~X"GOo-D^Zh2q]_baŨ/O]wׇyn 9f:ꔚ͟eE0P-\{&$Wfr])!-r7g|Уa?5Zj34(L!ݻTGkǯ;N~r7,WfÈ탁\]"^Wq6.dibs%V,kvI;ŽKA1IL~xD/aCi@i!5>T2-ꋥܽgIy{-MhiGz*׺~mvDqa?Ssz|bXafn )Eקv55J!R<#w4g6-\hxpk_hg ECVPz}A#مn/$=OS6bəj@K‰ 2E%{GmsIaxFwʏ r眅si3wg&QrzYwP6u;GL+}>HsQݣW﻾,wA\״Ͳ<.,M;ȽVC jST {_ĉcәcfl6NدRt[w&d*0۹iZD'TIŻ_J0Z'ICV3.Ϩȣ%m#4b+&79Kl vwZ5~"{ luw($܃ېL+h#2F7(w C_ܖo'Av$}(T^2=7c BHMIId+=~Qɺ"5eq`5+†-vI>60a=Vo 9Xe)B#YT_MZT>TH9-A_߮Zq^؂ʍ%ȣ?2?;/%E6 w5~:O68>HGL?4[9R 64neblV7Ws&q @R# ZWeʈiS(BKMWo*9y1.$h]bs|mvzi y#dfD?ۥ[􌶾(P$ZŗܟO< Cնq;ލෟ_-7B9Oc_1J+j+i/d3}xYj2 lk,.~|;%+TiRET+G|^<[V=a} :cJ˩E>*x8heaT\b( P* ]9+7(a}s]IG0+5bW^&zaѻ7w c /'^{u)Q`\Bi{5Z<{ "SQ14njV=~RR,1cin%G Il1$t|[e ݋>ьZB&cQ7]H6AN+z{$0^X+S>@nj#=VPd!w^IՆEvځO4maVyGpz;T}4-ae3ᴾ(vNbmۥ8#bw!\_}ƺ檊Jؓ d cQBӅaOWZV<^v_tpS We3~9_ 6%_7{4ibjfq H2T8yUm&OE9KB ͨ ⺶ը8UYHo(u&*,Ԑ3j^ x]qA9hu=v,䞛{24EK0s^%[\Nl {Xrp;cF D߷ڄwLPA|d*I5]XTEl?& 8j]m/@hD7ӣpB!۞.21G6;p=SAmIH,Xh%Byؠ`*j5_2@+(r!:uŷ=h49b8ԅ BxYO=7J+CSa$9BxrkʏKhSFidH|Oͣ5UIY%pNAzP{ۮZHɺyV 쥦8q| hQ(qb,D.S3 q2tDKJ34pl"<^Y~N>_/FIdF=8I/yNb-نаP=";.47[L|~q )W:N8kFg]nxaßGR(.g\BD \u`#jr.Tsrh#,D{oבKAJRGh sMGb),IeoC 64}Z/߮5m*|i&fҬuvͣo  Ɖ(p4\o$Xtngd)xPfm2377wc[(3Kpqr q\t6҈<7S.d׮kHS &a?xiB3\[ HӇER= Ji*ё?l f/0GoǧP /FԾg% j6v%JXK<5#lk 94v]2N}1sڕ6&貢-rG*l7YԷ}7²p{X[%;*#045 wqxӖg羐 Zt3CNGFxޕr K7!u",-L ظra`x6qQwuW`V'7>-7 +$:XRr 3Q6E!CR,^+Q=Us.l{xmhdKk][Dv>7;?/ x9w&ѓ(-ԥvy}+\DZ0M/,YyAGX˖1_[.~4AO;Bś q&l.Ye_6rzSƱyӣ_:JH[R*nO_.%hDTݓGO7.{Pdhȭ6~r -ŌFz8E(EfUo^DZRsU\b͡(_\F ÆQ[ d_ň̆G[l^F=#B](ϟPh* Kud4R}׊u'^1)IffwvlAÚpœg,}unHŘx5;Qѩ7]~TWMhcW $yڇ})j$,[*DIV3I`WÅD s}2D{qk; ֞ݟxU3Iq-Ldx]"_]Ve`JN<)C6񬄻'n=#Q:cqdI#6jdA[ya=Q _u1&XN1 3sGBX%x@?)g|)rcP|{'KlJ\{nm_;GE9l:;NS)FA?V+*̖NgT4΢x'Ҧy m{9|Dġz(8? VeDDjNh6Al7{OF]z9|Kt'qo۰H9 y3B{cBM`@r! +A9m*~|4fܔg4iLDʼEfDu#,Sr+bl楪w"ƝɯD$Ǫ?Tbr| 4ڢ/XU-&ej!@ ?ilѩ!-pAorzZ_pKzvIk֮Yq|;MT%߯~|Άo-u'{!NVkiY c&B(Fs8k a7kҢzүOT.d¨ݵ`^UP0NTVqYbhݏ<~8%A!Dau.ϝ q/4M*s6ibVZ"4BwLRhHt`E)9ܜ }.ѕq%LoFj^-6Wzon_ī޺CD6WjQG_%(j=%؉TOz[  G.3{F0+q$i? 8?7^QN>i'r$E`R1r4F-,MyhE+.Ż"M3}D+Ch}˅ݣj ߙ>Kc jFGuńio l1Ow_I1o&΋V,Fq%m^xGhwҫWwEMl~ẅApp3+o*n,-㝃M>=]I0|!> fK9z-*uAj6_7yun›VBBV)ZJ`j,y@p16ԮʲP-`j\ʹuwtIC({o = T4*~%SMZU:4&3eI7SRgYy/jZLP1'Du8$ZF,-TrW$)7ET_%^SGjG]t6]=:N Id 9hy~&F<Ԫ_w AdI-p\^K2A~[bB1R Xgiq7|]@_dꀶ@鸵$uo&͂!|bǬ;Z (`e0b|mFJ_)slwmnj h"ǔ2>5jJ8`AK9G!Î(x}(܈jٖl]uC[$%ש7&Aץ{f=vف?}</:U]u黑L Y\!n붆R[>_iMbղu|uTûbū3@6.ݤ|dңhC؇$\qm3:o &M|.rJGECQ'&[zcKx36‘5&*u-gZj)5kDv ZGw ; /picbNh9Ȋs>|w*PL81&!Q+5[+I?:ZQdUF2STX&3Ri/ aTM[ IJDe"ǙkHBK8E^NWdoHSDӥ`j7j@#٦~:紾bEj͸>s uXZo#:FqHqXޯ̴S{#>=䔽XnzԂs&T5K!ı!i7G?ǁXdsO%$-ʩ{KfR3X_&*M:5"H;V!- .{(%kIU@<1A<>i2]צ=9f9F:%܍ewb|Ʃ޲c):nW'Gvy^qDy2.Qb?,?{>s캘Gd~- :l[sޛliMrAD}b;w=)/2\/c:K_J dVfj {%#(ⲤV`S?O{Ωؖx"of͸5- tB+sT㽐'^X*i GcJ\쿵ip Z2 W `\z9R -M!p7|@[yxFO|:}=SE >kX^eH*[4mbYJPju nLLu"CfL6'Nx]iGLJ{-Ki$E}rwM%dk5zہu> h ]1~5׻s"i JqH^7$@?ь.JAc' 0`)kH Z *CJЉ, q2R,63YW:}.U3\s|7_/Iu4;|\h > MG7Xeq^;>= A/BnY84,D*U<'E4 X$y]G6|TM. gޭͨr@V;;S2$uJl,'F nڶL,Yү*լHEG!f{ uY T{ܝW>ްӏƛH3}7#9ڇDʹ& &\`k _zEVBUO)YgC>΍Q D.1?a0ϐHmBK6Siw6!jɴA}Hz0 @,9. {p&?s&=DԚt߾(s<1[z1d!=a>`ÐՑTdBt6r{E˟Q(]!=Z>e|MTv >3} MVpiJ(sw/^8YW:BhI*94h)b"~D2b8(=FPhFcK Rb谽aϷ 'g:~|SGVg+o,)$v͇WUiM`ZR oTZN_x9~g ݰ6_0o›ҏkNʻ"O}>k'0c 0gs{{.D噡/.R6HNOaRNҪW8DXb1 0F :#ܚ\$4ޙ\;2 ,^* BƜfp1_PY#sDžB\GBDc  gh%!(X`Wq0Mw T,2yL{સ\ˍ/mm#=϶4ԇWĵ EWK8%Wv>ȶ{t&,Gڠ` 2\j`\2ꉪM9$M${T-N8ߠ! eu+~rP3?OsŨG$QT u -fV oG]=[Rv2K Iz/EX|KE (a4]סW &JD6j2;AVy5]@ '{yFA9<7RJ~ͤ(hJUF8^3zٜW3/.4WThmvZ,DeM˽@05r`>Щ%9E endstream endobj 3163 0 obj << /Length1 2417 /Length2 18321 /Length3 0 /Length 19723 /Filter /FlateDecode >> stream xڌP\Bp'и\Ƶqw<www$Hpw̜3߫jz}>ݻ)HUM쌀vN ,̼Q9MV33#33+"5rD u Ζ Q ,3t,lN^.^ff+33 @1C #@H!jg03w+ژE;@06:mƆ;c 3wrebruue4qd \-@G hd ?1"RT-Qؙ:hvq5`v,@h?4oxogCcc;{C[w [35 !D05obhamh6;uC\s4Y;92:ZXU#_am5:9"h ;kekj_djakbW&Lj@)؀Eef@'333'3En[\=\h8ޞ*!L,F@3 [b?<@~, 0;[kISCI^S?%sx2pX9X,,l<.fQ4O̿}lM< SvP@hK@Ea`6^]m_Q_f$lm,9;-_S ?+bgmuRN[5n@E 'c_fma Ts``af?:u[[RۙueCJO9b.`jBk&D No`LbI_ `XL+o`2]7F`v̮/+F`v̮U~#voE7shF\>x"v0#x,~ݍ~#`2 fg5`W^ CGߣ|JÀ0 I.slb7=;7o nܐ?wdj ?j~G A{8~\.`]휀@?.+/t`sG#_VpLdr2Nv8c8mt;ǐn@px? KGǍ3~Box h4og!Ȳ&J8 /%P*\"M׀uЍppʖ82as\hKRד~ԯVI쁉C~"BUg/u+fNi,gnTŜww}n%?FC)Tr =L3D}/6ʘ%ub 8sCȜx%C>b}?Z؅GKu1:E)$YT#Y`J7(Ўf^MҹW221/Z5cI!2oفUU8̢ԱY>(8`to>Zc/t/is/gg.W(n(I ݹĄ-7+OdYI2?x$(z#c9Z.+8PpYo^_A&%4K^n[2V*/"FervA5\EyI9TMfWDuSaH&"&^SR%'\*J'dbb,l ]ጣҌ؜ D|)xrGA \j2AoIțdZ79t)j/[Ou۽::;;Y=MloQaf/BoK:MU܋6;~5q&Qw;GL/et+Fz66tu"n3{юxVs1'aVb1/SXn-%ع.%i|Z|i2?fj!g%D.Tb@bgsI?xmNWENdecZ? c"c1M޳,r:zq:_~yu8: dwbn@'|c@g"n:hEA-r;Ӟ%L\~Vsi]x]ե;i~Gg]^IE]L2"uVcY&ɾ$!G6l^ᰖ+ޟ0=/ptg?= H[?[ U?>1u+֮-|aگAN޳BTLI cTgG9mQPl%o.vm1/Y rE?ߑ (TzKߔ ,KlHϞF|O'{ sgOO^@[5h$LL PdֻX4 PubUVD^,, PLj*( =O x&{l] 5~. <_Κ&{ L+;3dMt*7ѥ:٘-I*ҟifG x?3s$6ɶ< .j}.h5Ieec"xGe*ӝ{:%+6Q H>tw)=GK>EqdM- "RDa2Ssp$i(kg?+ jnB;(^-6Q뎜h J[<]p2>*BN}yB 􂪭oW!1c^ٙP-訝z)WR:Z|~ ƛ6J'ha/HFD㹡Z&1gI51}n9k[1P͒~K 3vQW3YE]Τtllj 9qXὋ!GMwk9]=ь*\G!Di#LeYHˣ Tl|Ȣ|҆}ױ8#a$F S 0m sUD Tt5l qCR"Гe?PvH!A5,6o;s*, %qXXw,k$WAMc vb;d]yqb@Q,-{i'Q<3w! @[4؛!sF5B2&%O%1` 6V;|VR"EMH1^(ƫS& UXQsd S+xGvQTm'Z~N-|ጬ\Y[g5/4Ո]tu&MƲ wҰڼ0e.O;5"h[Pa,NOdM/M%f r!Fءdl8^{Ô}QfJb=%aA/H9u/|봺AF/,4*c e'ޖDܲIzBR-gv ΚbHo[[pSPsNQ"h{CxoW]hbPNjw\~@ \6|p~R s'n_&ycD%,Zu\HmJᴕh0}ܘEQj5v:KirX2HÈuZoMF1y`Дt'MWWw9î2_O$BiB!WNa.Le LydXʔ3X_ޑ+NWˮ]LE#X78AaC.*?y hw<FV>j%7_ >ǜٱ1}@IF ǘ"B":7]3 N9TQPJ ^Sx=A.̗\Fj Ӫ,_<;ʘ}"#95ťK'T^ kˍ+霓Ր2?ll3ps>NQNSºdg N fL0'/WcGHÖ 6ǐW%[2D -ʶՏڧiP-*.Bӹ d&iozFNC)@ftOy] N[Y %9 ^w ۺp{oCeZ=´Jm[Ja$AI4ɵClXIo^ȷv VTϕ)Aku1hpDD'!aؓ1x7wuXICe$Mb [^G3L%Fˬ=w{xWS_tҍF#sXՙO÷t9Tjp2 - ϧFA/ulxOfk9rދ?2Ŭ t2A&n- ;N±$Rg#m r\hXopOy?nV4H\i!uY Rh͢[rc"bYY֜PLR6hI|U`COu/Ɯrh?.^& '/QMu ,},M"ȄtbJORյ>WqFcaҌxAFZm K۴JUk?8;^ :֜[.}cwkvrxM"ovѺZ0"ԗ^RXu56,iz$z]j ~hgq TOR 9{T1׮دSnN>S釆0STn˱tҔcH\vƼ%BZG99M$;޷/DiU'}&eab`}|x6){\7^Ia:hC59v ͡ k)X`6]`YV\w9k?a\_=w[l*c.uktʖpةu}Nyy骤M!ЄH׼!tecKn)g+n*lT,IT]^ 'N>(5C=@/OG^O+tjAƪ˓Oq'Y9QrȆm 4mEZ6&&wu 2GBZT|їh_"o8 mJ4؍3R굖g@T1c.1 UB]! Oo֞lZGMNwz)$a@nVnH H֔&G-NR}ѷ8,&Oߟ QWI; ˼a([RwX© ]FE1n?|ڌC\,Ǻσ^ 0WA;S4oB oFui׎~-ax3ڴSV˶cRɐ02;ӔǢ]^r%F[O٦ɹ5ytJkds-{}UG*B<:j<ͥ<҈G;ͭ$cSPcO,Nc1A0h&NJ2䶰znؚ JG <&:+m*RЧ)<3x!|5MJ0Eˇz˸wO gwv}W%GF3|N]COC&'͚_w{J8a-슂%jcfS^V7)ה`\qW#{=)?X E3}+Me-1'6MZc+D\|-PCǤ'_e%к/ݺ89|$ X4^tSX%+!l?kz 3` O?=&L\vrEW.v5pCHiOC5+tBF7Рl.zf:E"%&B򃖓EnFP^TШh=kQ ]|ZǩwLj,!-6M{bg<1d^ ,e~?N3ҍ:.Z?wyD~>KEdH0pT8nd Ͳ@r#11:( ch]Pţ<JgQGgcWbiա|mQ6C~>ŷTmGlojΑ_ =tXi pFC?)ᘑC* /ֻ/azZ1hGV-pĉ 5).jlVgttY7u3_ə_0D45eHXvi72F8ZD{i5&+j|ȵ B# a/k('>E@©]bր(WMN&,"2QAa8 Ɣu%L>W) Tb_a~ұEGs^0*uD)N}Xo^DĄR=Y<ŬR~4iH]Vͽ_|מKB7^ #+$wtlqXq5jÎې[4]s>l/5{ޅqdm5'TyැShQW, >r+E%!OiX*A _qC%\½=Wq*)FGC1Rlhvo4z ?QĂ ٗu(9CEcٜkrW&7T h)EIʩkdE؝BQ葸rHQ t "J7T/Fm)Jx7. c`Gü4%mnl~}Py1BGWfZs5':͜deV9 #D~I%zT~`/7B勊j^]SjA3%6rw[2o~AU,(dV^ONΗi q?G$ĤLר7f$]V-rBxdH:a51!4H mm4IqC0D3B2GWTcw Ge<2Ic6QRK)$ïRVsr{̢pyrJ+^>0dW4k*|(E Iڻ; y]NqA\)ĦFm-8IkzzR/#+a:{ɊO 3Dª].xo΄昬TMN!.[T0mY0(W'@-&1&w/[#Ӽe/nCdXC 1!(y}'=)|JA} o3xhxڋﬖNC%ؘeɉӞkΡ _MO«5Bt-m>{S'|k߾IM &e} rf:8::NݼR ,8qa; [ YPIn ?ܹdy 1ƞ;dUx7oqVp;?[ _䘗Q5ϱH Q@o(HDTox2R^ :I4,WJ)3.-cgN{XuEkg7;a$OH0L%-5} lzĝ\y!#ygg! ׬)$CS!$}BZ3arfMf\=luͳa)4DASGǔmĠ}gj߮XL3؏O 7箦:}w%/뼾 !JSVmCO-t{F#كaL KG@ILC"(fLP\|iR.]e#TWXquf˹BTzQ ^,rbC-Œڞ wʡSy%")NK&AW"gIB3V*2CR"pNtc&[.xS\W!/Ns(= j$('[M nJUi.[L f_;@-dy DP9xWK#H#*?I!|'^FWOqQ[AQ 0KH{L\`L55#N\(r¶7QH D }햊1~E Jsj&{<}ڪYQL&x޵6yfJtr'%J1Ta ڪ,XƎH4 E1uF+x{{fE#iYߌk%XD;xx /{BYs(r d84`,za?IXRqbdteU21l~P=.}PB_luG4rhr`O+h}sFKd>ĻQi{iB}Kኍk:PX(J4a+dʯ: 1hp3j79X򕷍;,^!_vߐۓ,S"a:{yKwhɋ vg|<lj>|`xT.U;q_2h[^D6Ht[]cNebxoDuҿLII|i3@-/y}r : gd _128H[)R+5FZ*e+@"?ΨtE͈1Վ$m\ iؠE5l(s)(JuE'I׉cc/٩@iKŢv[8VsƖ{^l:uAr!{M\?U}T}/bSrЊr5eh"}3eiM]#dñGpH0ebj}ԽhUSnYupyHJQi qtip1zҷ":X$k|1k: yC]Cg֑ܹ1,4]9zy2^0wwj/! :J=pg=fDwB¡a#c7m^CJ4*Ќ)٬ԽJ4ve#fu(-/scq"0wV!̡^H#Q}> 'o7_.ªun " g*)8WQqq!3y}?XPdq|n c"NB{_Chj#ŧaNܠ{6!xI32c.k.(qQzP>[ϤL""UEXM?nj[eQgm'+ܴ; ̄5?u)<"rs @Pd$}>nh}Xa%TGFrLC!JR;+gG΄a^Z G8L~-[#6H@iD<۰ [*8CwV,o܍|M(G$$)꡾wBUZ/N\6oyqڛvkT35o KOy3ȠR !)Y"a{zOړew!fۯA UGudp2 7.K<^*a_%Fi#ޙUR1? zTa}l, 3$0Iy-)G`LK j!Igq~X%W,T?qCCynTT/bX(s'絙{tUƗrGo{Eql1( юS\+u%LٸY,Om@|t|KF2[@T?뽌#>PCↇth\I\׌$} g՜ ]t1'khC͈Yq3eNmvJ/ۖ 'mX +ETD>ސՖ'jdCZ{g4q`X`~p$c "jM6u8!>g 8dٞ, 1aȢ:* q˼sd%@iSiBUso*NETT3qtjDnЩ8a_Mdz>Ka3-6+!}-7fVɀ#|Hz(3-C'e]>q /La[B߻̌' RoR 7?\֭:kH>*%= h^da݉{Ss72·bNWְJ+hRmr5:h}~?8æG">{/8d>X^cbf[ּH*֦.I jFq;:H_YP[nzlz=VsbzN*rgj:e:fp3$#p^7xco|FUQer'p&)rp:?da~nj|d$aeѩ Lh /70d+ JJ3AԣM.}Έœ׏z+Cq|OZa>#[N!CVYs7*j$B5b~|W=,Lj^_z['`-GCe'fٰp>nJ.?#odž,,:`4hy0cmH4;kKv8S$~|(c`vK}'= b}c*xu=wvYi|iګ5ƹ?ʽ/'p>}mF*&ĀSF@z~AA[jtdS2B6|9; ?d~HO=vk_v#AK>}ѼO@{]sJOT}Z.&ma9p4::``jyf\Jr-ݎ}םIr56֬(Z] D=F+ (np'LSrҴ$PI"JWD.E]~޷ ?)uW:y|Vj(6 m驌ŨTU {6ձI+x~eʩcі=WvbSG6`=q> aۛ`hw1ÄՔf#io"dY&N}Yu2י Cw!Ǖ!==HO[n?ɘ3]̛71\X O#eOe;t(HD>_| Oov hNF c>O',q4# L3uĹ'%$=N+,%BHY2F=:p0/EH]avc58;ۀ^: ܇7ǡ(Vo )|RQl]~5:DCI%iFʫ[ye!Sq5蔷BaF˒Ő7@!HywM`Q|5d#d*"H(o3@pd7׮h#)Ly5?U+#tʅAA1 gj{?<Ԡ&d en&-tog!wBۆ>svh_>=Z-4}SPٔ~*ٻ2$# ,+;WkASԿ32vXӍt\"#2n}f3\gd&F oƱ6WJ#sr*(b90}PywIHfcM).OT7]%bԵ;;g!䍌 Kw H co7V(o .;RϬ^t!D}pH\A^ ~|5S_=c\rѦf?<v S ^S\ΈA{qvU9 XgDa*M^7Ê҈t$3ŖLgkutnj7!uU("G#fk ! Nk [ټuBr_)h]MU "$ȏf8i=YNA0cl'MZDsX\ $Ef*{اEa[uM Ÿׂ |"yZXf5dl~L'ܟw Jv6O.UG3"-jb3KZ. {nо3[G$S.YVq=Cb t]Fq@ؐd6xW \AZRol&鞖'G{X<%: ?-Tw$ö/ !Zi9o,ѷEItS/hQC GSߢLЏ%?dˡ ,J}s4 LR/%f.YW܄b'nI{O'* Fvغƈ\x-K`/39 %QW(eb6p?TU2}p'ѷP8 TE\qs Z 9Cn0nox Dvf EHhԒ~'Cw~f^B$S[|mV閠M${ȵV]&'ejG=74לlO܆mhsm`r*sǺpiwp T4e =bE[Ճj͈((?ymنa d7c85U̲PkrYˋն<ץc)cfV#o2Kѩ5 Y:xhc㘚)je 6u,d֜Uc D9{+iT̡q+}=^P妳z 'v}W3IxCA9ǻ(;?D?[_S0QS*鄚I4֠$qup-dQshC>.YV@1^@RV5֋(dq6RߑyzvRa6~Z G'b!%<v7\J|/ cڃl>]dE;k:[W ]|4-4Ozt_9_]=a?Ǩ=Hk?(g v'_ 0azqTk]6 a%%7Vlᩅ ՇVjd55R9497ύ;ktskg]wX19uσ&=cWt Pb&v H\=lhKez܅Tqooh6h  6adbW8$=*r,=Ǧ߳^FfЇAB;G\kBJ#{RS'{?Z |o]_P>@Y5mJ3se4ZN˚7JWrʥ!_'֊00̯+mop+ Iݍ8á趥!҅\V iQs/mAd pYTŲes\;KxoA58'ЋP5<wǝ"& zrtit5wg^4+jۈ[1Gc?{ԳEL'}H`+'/ٕ׉+at_iE;U׺\,Te{C˧^}g>]wWn~0K.,^#/ 6 ܙ/_=<11`f9¡ہZp E;ԞH"0aVڈA5)Cl\sHV$Ș ړ}ݖ:\@a!W_ SݢIvx\F~W 5 -m&ORoN 6sݼG8h yqm 2lF!aJCZ_ 9F RxW}x%-m쯞"0(LC=kZzJu*E^Kj|1Ə[6c_hDY9HYzzr]MϘ!!  o!]1ۃ]_pٌdos{[%aU(y)u9vʸ(i:CfbNgM<07/" tGH ׂ0NJi!xw$aF`$=Nา^k]dҩo[nyfi/ภ]^uP'fg*cn_,!;*o=3gVj c$boB>*zo}ΔI.N"jIEN},^4L}m rz7`DI$:Fi~ʍKPFm/vq}B.l-IlQQsix33!_ûa\%0s:ޛZϯͶꉥ80!K~ihq9߷WwQeiG{VĢ,gnɘJ[NʳO e 4jz~,-KزyjZ"Ic,Ev, i7¡=VϚTe.i  _| kuCq'H̔0%aNÆ| $Q;]2U]gR{…|*;s sP82 q snssMMg_A! ˁcO5BIyHDߍ]KOݐ2p&:x );y.QU jP#Vc$p{ ^҆Ke`f3h=]gfwm;7xJ.Vq5s@c4QE*z-6|ڴ@Ts5Q|vQ4I V LNXPʴZm(r~郄>廏CG[cʄnX1],x0L˅$?Yn=?fhC>7cU.Lg{ X )ܷS'!shMNY eMo*8asm y)!? !Em1FKvLYApssaq-:&Pm=p1jn 1m ‚Qל}֯/LOyh(Y7g,7Xv:.Y@M{\m},#ۃLGԖa%Z]|5{ň['q}*ysPthW+yfO&RW,'؉Y+=@?/gF1}8/C\Th{:ۘL|," |WITN5ΙSte*u$[ )h4omZ3k>չUښTmɜTܔ: /1nt5N{W.}'lh!B\pMJ<4^oao;:۟v$s3Ӏ@EZPۼVf.rK^2vGZ; E3 kNUEĀ d_y $|po0ams;ByarbEt`PYF]sj"*/3ny&bZJֲE, V$eǹȖ6 3eDpWwt9PBswsmg_!I0w Ҵ0V@8X2 J' e7~-3rz endstream endobj 3165 0 obj << /Length1 1398 /Length2 5888 /Length3 0 /Length 6843 /Filter /FlateDecode >> stream xڍwT6 RDJD`Ih"^U@IP )7*(U@t"EEEus]Y+yg3}DH 8!0HA 1aHm, tB]`1 XR|K@0@Ujp,[ q<P> [܁Jp  A 8G+!#4AAp?B:phiOOOa+Vqz"p@c8À-!? o    Gb .H$dh poo } BQht#\@u]aNA΁, \ v!@u%# P  c.=!\ru#qXy} Jwo?uF<>K$ ;Z pskT8Hꖘ{AEzῌs5?4 'C ?,a~>i0; G'e1/%@?0tɚ0 oik i_FeeGHL($*AR[?B_-= x^E]>?ԅyt+JG(+"uw_v߀qExA# ZpwoBX%B`qao= 8o֛/  7Da_6–A ,M,apy. K:ԐP|D%$  I}5~("D.@B~@{p>h )0\Gl;CH˿C(LSupA,fQ.axIg`Nmnٳ}j8j8W8b.&q4=HV.]"2dmT9tpU1DvH~k{eI.#m/qMv;L|r}mΩ#z띦dp;W(NMMU|:Ϝbtz;+s|[K[7xo9&G ʩHTvIC|>ּ# zvXhOw-wzrK__x؇7UL&ɷg52j!j)b*_4};9"H»{>xӼVeI(d }4~f7&XM-4*Z麰[`*+÷J|@(% ~$Y6{8FTh'm7H Q}? NеxgWė${򺨈'~7h*NǛz}Zo- ܗ%.(8 ]}D7h-qtNSNHK-%r·~s`eΔajqfw]ͼ`a?y'Wf5=uA_pb&Lt3ZEوwI[V9\&k۵6ej?ڶ:={y7hjrJ^}J#ICH?z} x"7_^EoϷ+jqI|z2CMa=~+x?.>;B"nL~~{)04I7rE]hzcgrŞ,2 v@ߝۋ}EGL.՚~E}3LY]π7mD(#W^11zm[y+` 8k1WH`8"p!gPdaO|Ln-&텇T}W:UV;Fx^c~VxZe$2Z_,SQ? 7JS"Œ-gSowe?iލA_Wg :NSAcg3Ւ>xa\pѳjJޢ2Ff*hշ2*Dk<ꖼQ!E L1ȯ-6;!tKrJA3q1"< ֍} ӽk~;ٖ 'FyQwuc[ęTe,\L5zçpә1A_k`u +)pF'%Qc X*,rXgH;u|"WQkGb^nހjO"5GSvI ?Vy;Kʯ6yJb]LJМmP!G/3$$ג?=`Z@^ҞYXQlrgmVBnD3_hab؍$2J8aڗ338(3&t<3F]Ck*+&z{c1It×/-tӢ#Ku]j5kkw+Fz\@d)ڤn(Y[9n/G&FWc+ږL$K|f>Rxf"H~DA=45pQB;܋\MXo_V)ۙ*3ǚ2܎Rk".0pLMS^a $Ia/8yM+2Z@*a+s^mF mwܹ=zj7g([f Z˻L1dUOǛ,HСdyAJzKh(ic $U̼{-ǶSr/Ȍ:}: w6D?~ر ynK69i@CqgUjP0|9mR֢(+Ei1 /Wf2BjC,! vf$*~MlEMp ,c-pP܊ZbEsyLMt/|)|up`fTbcχ'~kB?X[_lvIQ&"BLcy˷YG+ [ {R \[ĮT׎n.nr>?hju:#QH9WbiX.JZhVpi2/܀SO >Ɇ&%L8,̑ %2s?~MPJ.=fAH5$`UƳfPRIŐK#7d.=xU{ȞsRA{^\m5Kg5TEx NAu?&u2U:[C393֌ |(%hqX+ƧfOJ݂Hms1JTe fR=]X~4!Zឋs"H`{@8.!.1xU:A7K,Dg'դ[=ՠT 9rZk=$3ڜ_%t,IѬɼ3%jb.ڸX(v[gT]FY[(G옊`N8*6:[zk\J];t?sU֊$39;>|g;VY=Te7 2N %_ivM}ݫRtSU-(t)Fq=vʆ9r,ݤĤq8+R}ydvI9M9Le3.jL=xeAVsE8.U\+JNp{cWz%nP(/zu9˴I8d|9.ҨIE6+]rg ')CXQ-xߧ~܌'aNʓR ! UI_űY>VMh#w(o9KӲ)@@ nK!a,S4X"ϊ˯F'DXwooj90a{` L/L9I`5U-зݼe{/xQez_n7<4mtonzC A9*6's&lxE+T եSkz.޿8U%ha誹ȶuF ~@[ϥLnsIz-qeqCѫ\<^3e~F9_\4 t8Driج}5o$*'?x"T1UsH-~^+%U{p#Ywq&aP⤉%ŲvTh4avgja`6]\+3ݏGwsKt4ljnvEA=d-[StjZ~^fZP3#mq7%-N&FCAx,6fD_ZI>_׊(fF'Q ԋ=|O{xJ_uN+3s0j?oՠjO޳* 2]Z d+_?xD9\WT"ܱeuWKXaC>OSzx'H0%/ ~Ƞ7W gUxkWB=p:6hn?9G$9%jJ tn[(k:b\a1=RZ߭մ)y xe+,t;c"[d4im35DcF5AH%DQtD!|  =Nݔ#0z#qЦ-//hrC~6~;G5ֺFMzIBg#WOU˙i.&?pg6сJV-Lt8<\]p_Ĭos&,yxVF Gͼ/ 9Xh%k?R+3y5;)y0\A=)d-*D/RdL}T16SI"wV$Av3/QQ | 嚟\8ҊA+}hPnչ[|2}u^c(h>H\I-uff[`9£xUCαw6z5tz0#Kiֲx̯0H38MxmL}Gv endstream endobj 3167 0 obj << /Length1 1435 /Length2 6109 /Length3 0 /Length 7085 /Filter /FlateDecode >> stream xڍUTZQtMz^Dz$$AH M@z #E M(]z#Ro=go;s]>BbR%--u@PP_PPp<1R1P)8 xl bR@q)AA_DZ rA@Z($C¡rtG#`p,N0())E# $@ Cp'Aź# upuu9`Qh,/( , r)`G`~ PXW 08#!P4w:@]E&k&\O??!A`0tG a[=ɏu@HO"\@{ +u@UAU> pb15 f$D Eb1$?SF`ܽ ic$,(`D89CՕpp  J KN.CwG/#'ŕBBq?$ E;C<; A( $;:Fq~) BڻMb%u-SM?%Ǩrx |B@g]O#mQ8.ꯜ]τpL.E/[\7*:s&;a37Z(0 M5]-(o:$ 'i>oQEA!,[6qg@BuQ'%(/nq&7r_y (h; (S헺HEI~6ZL g & *pĵ#3rp@nP0 ,`WPLޕoWvw!K"lʠhԔ B6]}J7"UW`6/F.8b`Qi$ne #o& 8nxޭhqs@UA`vcsYAmɇsZ.EsC_j4DvvwMQ1}ⷸPbPZp*,=e%mL}.m3&v)u Y/s(caϬgiU}A+ ךqy‹ ~T0K| 67΀PeQrժds1oZWH*@[O>WV^(w&坞IH^ۊ\#І|_Zwr_Wt_l\0Oj;pZ`œ~l֞Iu !"KTi9=4{af؃ET5Òݺ#w^u+Zd7,Nu~@9.YK@-~j%Kg ïM8-JّTF""$`kZ8+Jprhh;RFB@󗛫۔ -ÙxlCO׋*luy z^dSEoI$M*EP46}Dl=؈GS8{9t0c}:ۘ[Nưɭ(Oω*ћU(<<2z2֢؈u ~ްɥ SL#E"ɻ:xIk.+;qꔌ ;F߮Q2T6? w/2NFVq>:8vPho-[b.+Ӯvyti -lNy D@~PJ^/>MeH/ Ft}K$: % 0~kK Qtgf@0|;ERڔA/>mܨ#]R_!d kdM ,(:;/I*3\x~<}iY\ ZeH혶T&ێ!WǦ IZ$ 5|{]i7 ?dQR#+RK#'v3z*On1蠼"Ra p;BU"&)&߉ǻPVʢ1mSSr8CLa*Ub6Hﻹy Q5B$5"}V7`2U?eCL^*ShY{S|% iE;|-BSVCTY :eUx.w!B'nlx**-U*]1WHIg[T3"yS Y+:; c"kE{y߿\׎+:2.0hw6Aϋ~vXm,UP/TaȌ:F@*x+)d n߸enN9Q~P`,7Um6sQ\_t #K1;'7mhMk2Vӥ@:Bh3S\yMڒԚya9oE%;.gl8 wjЗ'-~ywF~K픨lGfUP7m`ɶz-8n?j$qmM|ƟP>}=,p҈`b2;gȽ\ˢ_[,1T#9Q;7: \?y3 ]}:XnY`CZGCͭ񳥖m!a5{'5A 0/@j@Y.YКV*%j٪h3f!Nk1ld9G*Hޕ %- T6g93색iZCxƥ )km&yy8# V['J5aܷK&W;k\/N~UKηH'{-(#B{HXGJ5^8̆gt0v;op.=@od>ReԹSMVHNDGup_ψy@/FZjdyuv"BW5m,dTtO(]HʦZICvGup6h  6VY;ZWl{Myw.随ԙZ|ern'$Wz~|*'LһKg{ n7Aɀ*S{{\P^E,!x)eҿRjcPqpv"t{@d|-7h^ c[@hU܋1ٻ杛W܆)S-dOsUIz lov}eo7 Ҽ6(F l=0[yB+uw09dΑޓ{x<Wr;^O7{|J@lwiT%2f?@|!q,b*ﮀl(hyH;9Ttjv>^hvIܧ©mSNtGVYRNM>s%/? 1D ;Ix6.,|tl흴_oQ y=A5L>z-%GRⱰ:6Chi&t@9aքL^dY q~a-su!(I S!f>or|"mZjWM̟IgܵyXh=JG28e +ّvU6%'}еK9:45+$䤏Zi˞ҿ|{<|"`vNJy'|+PDS |Սv܍|Sj7uRT<ݟWL;ɞa06둷.tp64_VL&bUd2m}P?TOma=j$/ <%br[dP !D2kWn ;Xobҡ B3{8 /?ߦ J L{U#{3$`C^ZA)z7;uʼG_3B::*<<<&w&Xm\V0/3'Vx ʨ:= K k- [쬪/l|*ItL,0R"ɈiifӨޞk($m$ɮ|%"s%m}ܘo4xXc58*˶~{|]ǯDZ[IOwev\mlaGm<yuO$ǍjbI,ݯbۓLOktM_z;uH.9~Bq9(^Y(VG&{U snq#.lX^U=ꇞ/*(wꄖ.4=7螡`؟Cr7f-wx6OYGiQDűջ~j:G8Xŀ?"IGpGt;71'kګfdXST>_荡T&dV5ΛŁ q+%#=mQ.SL+ %^B^WDi.> stream xڍtT. C "0twH0  13C HKJ*tt#t ){׺wZ|{gww?+g (a(^>@AKKM $P#䯛@B0P@@@(O0#@@ PB@TEP H'jkW ..w:@ A0eqœ9`(\v(?; GJs?CQv$ r``EmP q8B jgX]oBPd wr<0[ QCy@0_@# + w xH0B!FUsJ0kBO1g0;aYՙuq)`\$BP0x7t rc&r;l0C@|6E" Q+-F7揍Y>0b'C/k8?S4P3cp8WPD1/>, m\5 ]=e n?i1r3ysw⿪X )::sa/ZWFZp` }Z-5鿣j(F r0[ yP2b Ep0. qd 1!1jC^/?Pֿ'(B @$c,F(L 3 f13f7p_~"Ss @< ` 8Q}EPI;ڐ$^҉ P3"T҈r~zڌFt3my^J*O#^f [f#xcF :' L]Xw#nXvsPx߫蘊wSUnnn-KӤe7Yy5XAw/s):p5,,Q;UC$νRO_eݶu}(JG„Fs/2?mPyYܒݶ*\N8>Cnw̨$T{';[=l(@!0"QJ?`u2/X^HC բ#f".o ywU\ @4eڟvASe|[)\'F3wbqdNF}֠5,(#NUl`vk,mьH0Zݻ_0+>ʬN@Pف'ooRWHͲhE'B yߘk붲jrճ8Lo6e7:=)hrhԧ'0, 7͔aqݶQ.:2*H%A yoEVd+xEG Ive lyEis蒥ƍ8D'nLv>9QPFF}BI =`b[U|(?LJP=TtM )0y y7{KjnyzCPfEg NC )vFϕQ;݅[ =M ԛN9vy"V`̖#,Z&8E}冷QO -VE\ȮX{8ͪ7MSgtǡd (5&twmx X'+JɣC dY;ƹm@F!7 wy)Fy~ d!$gdNZXPW܏؞BLƷSy:Dvjqc/I/}D`wֱc$;=X7\]8%At| >;5m Q??-z+}R*^pzmx̳!xEVm2ӊR5hZ`]0C8BXKwSP=ͣ6BROLVYEnkD z>rLIsTKX i|OXIz&lCڷgXOʂg'[CCs& w?aIܧ  WEM:&49R#;~WI8aF J*סsncij?UKCJn;.ѭ wga˕Yw.${enj+ɣgnMȖ 76\*=*Aky_cKӟG|#p*GpiK/pIB6˾&g7q1 ̗~z\| ;$.ĵ2TXl+Tk6K ʉظI#P7m\~ycOLmAߢ=>*˝'![0@OS@yLgJ^uBt|P_=BM6ơ:FO{%sQ1݋1U3׃C]%yTR~S˩|بjEwߜxA"FNXJU,)1s9 K( cdBMo[U &6,?PqkhpnuWo62m0z0Et(8MfK75sY |{P+ڴƂNu &՗v Ui27qd{s/^W 侲O,jgaLX~)2e$`yL;oX/*ŦnZT,_"F[|8W&4DIa3Sz.4nr2cx'oٝ¿r<:q+.h$8*T7؜|+R<_ 00oĮ?*-zvSmȃ1^tStw"V?H_ϔs_ &?YSL 9ڇ;RP)39 JH&l7_y_=tK -Ȓ,u~kpShRWk5!)Fm_pʩmTHX]oQ(`ŝl?I~ H/LY 0͓OC}d D4M/jֲv씮bblsy`/hWT~W_~0o"K㳮qx3Ch5_k_+sjWЂ|~^FkdnB˝x\|m goWLHf(Q!X2rqjZAߧrM~91"XZ)"'즶(Ir.P9 .6M?%G"[!VɕҒHNow oR_@7|xj(AٔyZbE ._:tϯc/r+/m6ﬕ)[rShwXWKr*wraƛ(USYʟRg0Pe~꿀JGtb7 ˞X1y&pMO6txɄtͶ\ȥ$i48Nja7gURՇލ7qO<ˎ,f(rc`\6|i86`>r%XU0$r| ]Jeq;M6%ړe$ 5'R~%gxiT4b޴?aG\DGpVȉ@ݧxͥ^O"H$g@K3aO}DL=|OA/5*wv?JToD~2Y" N{Ps7>̹JPַ7Ӊt-B`3/NAv⁧9=?{KPe|sL3rwz(\ >'˖O+JÜ 6 .'v䰐*Ԫ͓Koݸ=revy>.$|N2r!"b~JGJtcD]0@z <7+SOX-۴өbuz[M]I&$O.NGQem㸻b>L7JV%kqT.p|׹J4tfI-i|Л J?'`U+5ܥ2(#Oqeͥ9i7ȑ&CN}Q;cj.g"Vj-eUNok@] o<țY㼏-xɾzBh0[XA7ND_Bv5> |{1H$)QKkZ2u60ҽ#?Sh-`KYTQ@݃z>/Te J6JuUR_])Үb;ùC׻[Gb܊3]nGo9 Tw4hUAF깞;džKYjYf5o"AVΟ%/FU%W$\7Fs/W{sܨ/i$p˖&N~ee/և5_(6t%Ӝ WUzMq:w4qFf_p"9ұRVh5/霃I9UMu1}JOT^#LOi KiPex Ċ'3:Ӟfj˭^L!ŏ'kwؽ6d-e&߭DjiUR$R}.C*V&#»'ϻj?NbZ2&(3炟z+G)QDf󺈓PM?=pYvGW~Dbloe(Qg"CVVɖK0]k+M|*_i)f4ljPF6Z Od9bB]b[fx23JtI3&ckIq.=ot3z\7~0-sޘiBfp.LMa+i}4> stream xڌT .Lw( tHww7C!! ݥtsǽٺub-ȔTMv.L,|QyV ;  Jleo,3vd\AVv++7  bnVfy&JL?o mNVvycK-P7x'[K>ffwww&c[g&{'woV.3 hU0@weLHT5K+.N@X29=\̀N09@UZXo?2_r665u0󴲳[E 9&/Cc= dl6+sc2\?9:Y9839[~+ vf@;g_Y9Mmd{6vvs+;3_E:0Y91~,.Nn^v0d^\\l8}T!̬L]&@ +;b<|'+. xX,~^/3{;o,*HwDD=ތ,F6N%o%cWw6On,?X h/ ')ῢߖ'$ KQZ<1/ g`M5<k] lgVV@3%+S˿o+Y읭~=V/LmgJ/翔vfN `d2qYhkLv.`<_үrqo`̢Y70Y+Y7b0KFf.~#0ofW"0ofW*]70F\#p.8oE_ 4qٍdln5q26_?.>`>'8=>rr^153vC} zL\.#//}Vp3w 6r1Npg8k~ӂ_.N?V-w?1\t`o? 8<Ɂ#yσ <^ h8gob]vEНqw\`jW3 S=7UANŸ{^l^ ->yhoIPn}y4SmEZ!\OHĨ&h )Cʃy'Q_<6W%X1F=Z/h*$c΅}z#kT&([gݬjs>%1A wqG,TWLliUV*Qvn;ٟ!4; %XNUQ.6@sնknsd%o/TmMu_o’[nnwj Y҉[F,'ÖAui^1,}y5}S䞀u+Er3ߊ3 w `.䳳||Kvq0ڜ49k45R泍 &OR-΅ҒÑzAwyL'9vDCxD 5*#D?lqP rVL*ٞE48Vq#mET*|tg()X=| VЋ%@Uc[M--JT{Í? DUns)6 z翍mLmSz*8ѩР8jёMkuKDi3Q vvwGR5zL- {&Jg5ez]ڐb'>e}Q,#cUE5I6?$[vhP ӃQogijb~`*琅0Uy<)&^W#*3!R A "Pcw,aEsW4y wr X>U/oǓf m==k[H_<[Y8 @%MpH;h6 .RK\MNE!`>ITLM^{=P;赴q(rH~9z3"`Y'.;f)uZKӻ@9e9&gNP-˴"}M7WYoQv$beZHY^6EiJ.i%JJ}ycnޏp <5EIW(~*|9[ךk|jv VBԲuȆsɚןQ=w^ʲ o]2IY0g@H$Ml`$H6EyZՅ-i񚈖Cޕȼ,hjk:lϐsVtӄS*3]ڮt.3q Sg;wR9 UM-8 !y 2)ǐh#z7 Pf9.;Ժ۔ᗬ12VҝXyA0~Q ev i4TJE& +69ްP,= !r{Y[ ZEewƒɷU٤ͧ;ceV/~2-G@qه4;4n|9"L/|J# rK:%y)嬞,7@\2oew(+~ K_;_G84Lݕ( xlh$GgKX`6ɓ\7ۣykՅUص4AxI#Ou=R$$YE'O%#)vwޒD2X[9H 2\iN<; %F5bN2]ҟl/_?cBoZbIqz=7*1q2sx_z=AO凗\vލAz_$ۮI[BϥL⦘bF!|&J d4^P=-BEd!$fsy1d|ūuȷ91C0K yKƢjZnQa+'K+mM,N>v;{Ic]Az䴤yǧXp4<}5H*gn@JQBޣa<Ŭq_ 8R5y%W,:K'\hY\1PtJ ǵ0O(8?LJVE; ^%uHש qHXV@Rut4..{t}6-5.MSSRGYh]zqÅ*o%)K wuc]J56̲qOZO-'Tf;CO2r98IBH5#*e%ח lLzU#,@6{?F`mʭr$\Pc: 88YKm(|ufe"9@&*JkptJǂkajᬔbF8w]5>F-֡ Vsp4ܗ@o>>YLiX#U5<+Mm E|xql-Rr8"<-,Ԋ;ay"iRAcDbInDGTh6wx:eI9Wژ"{RzepIǦ ظeZE.ꝙO",h/K<\Vn%H:7PsaQGzVǏt>,S1 V1u5̞/Y;Y:Z^O_lѿCfxCZ(`tgNYNjh}E: hiQЂvS+#maXF9TdAX5e zLX#/Ų"kg\Ҫ&wNe0\7]a w14(W|;.02B߱|ş#Žk HN5A9F7 Pp'jҋUT(O׏8 6^&$5t=%I pXyASR wya8R*bCy5FݷoK0E6; 4Œnt,ՁixUC⨴>a* b%ڨre6nӳ1'@^I[dv&Hd W'*T3 ~u}6=rFop㰘uxmgl' $=wKsUU96ɕK>~*K?1ڑJ3jlݖ6RNzt ̐"֨.e0&l9MiJqd2!<~ܗ}=)H6dI}sy)R-M'&䀙y*A2(Ew Q5q[2Mn9h5+H4oCT[GtJ@l\^*ovׄ=sh,X6^6bAWH7vszy'‰W ; .XP6hѽU;\oto"?"4r")?"Ş[8<`Exœ9`d|Q8[5[Ǩxf^;A71 !Jמչq./By{ vRXмѪ@:%^QbDk9&u`{>5z0+1J=Yv.lqi0{|O=uX<~c-$Ӟ1fHkŘ·uSo{1=WJ'ڠ,_8{>rK}M?l=(IOQ?C)~wf "Uc&TKq07X[f6';€^ix)譗zB-񣢤WCL7ɺ&{dUѺI`OQ- ȠЗEt6"`,a\%)Rrըi~OW)1^t/1As}t{/k!)7@].aTX 3| iݏ^~wCR"V"~u [MKw//~c 1Y-tߩ"Q!!ds'D%_~H6i8F4{}hbhdT.*1 T) e!~|&\d}Q|9I'vX iVw~(Ӿ~Τ+bLHjnsI.A5cS}dxUUoZ-749̛%-cjՠN1ڹ>1 G(4cOB^V k#Ǩzf۾!5,??korJytCgDhH ϽF#M _~7a5nNg^{]}kD9b~z7#xЃ TY`F`;mYS4W`GX;"9ۣ26 #BKrnW(OCtν}B|fT1# KgmۊzOcTtkeVjqH*qL}F\:Y҄#+*GezdI} B'>i}RV[&hiYДjXuED7624w/@muDnW~{;2:a;K̩W۫mA5S2(sD/5Kot>.A@7(ˈ?Y5V)\*I܇ӷr[;mTmaRJX{GsFbC\>n^,J lTo- 6IG R, z:OCX[}'GuJSRտP2> |_hSVsP.PP-QT*e2ج "۟O>6 ݗE\mrY meSoFm@0fA"CPJ2 M rβ_lRQ]nki4`aRG? *xX12b*btN$$]5!P8)H4~vt}z.0Jm[Ⱥ)ģI '<ݘSK7^_Ȗr`_T 30CrQ5mPcPt\2Lgl'CgF6 @v% .dlgUD9ݏf^ &2:G\S_cMoC5B$MBO݋zP'۲D5\ F[o {QX'/Nt[A)Uz.'~_ۨWc󞱶j5^紡xM=lO=_ԽkGUSϭ؝;\P f)ڟ8F{ C/FFҚ% o.< Ǻ<)7Z hnmxYR=Hd(֖JdceCc.tlKa&q7@귄D>H6 CDZqbqK/V}o_' 8V\<ָ{_} }O|6*&䵕D/WZ C`m'mH@t8g8|0\++̓&+r0zP&!)٢s*,(+,,U<6V&m ŭ}{nexg9Q[4קǢ` gn0Fh-Ў,DHv V\B'1"x[@!э |;KcJ8>{& )olM6 3`KV QLwrW(YfkxC.h,UVY"+%S97W2X/𚛛͋-2"sjmu߬ 9m=R*!4NG zӹSyOb 3Q{3+պ~^؟'@b K@@j&*S( e0XhP5O[kQqY3*np r 9;; vM{&Lb_M"MƢl=汧hT|qoS6A2LgV % \MtXL}l$a|| i"VB|3xKn+&˦kG+'i<'xQO?fӟͽ8ӖP ڐ(> /ƿ_\ :lHiť?;D;KTsHXQ" Lpi>L/F|7# (gId~k 87oyԬ 1 J?a ejuv|4&o<+gC(2*$LHlIr.sRqH`۪/:]D4- =MIhOq*kIr ቀ{hJQ) kyU t&M)"ꘄ}[< pڋ%8˳TQ"RE5w_:wɽK c''pwyE ˉ0h|o,j~n6"[ юg1^fKFD}[@@``bQNl%M.t#эeXX0,w_Qb `%D"ޥ#sS(VqRu4` Ǻc~;;>҇A'sRPDƨYr[5槒8nKf?a^໡ȞG&{T諾S=4)WܡőI\'hVBsh4#4z#$1NqglB6ے,:IEO FSEw@f#&ynT"०C-[ǣ%r=njCgcV(%:ƠHa3|5xӭ QCά$9_,-ZAB?k魣 К8Ξ =[N@ 9534^_!tGPczәb|P㈨Ah]N 1AB;J.ӝyE\h5^ԋʓrœ+_yS ]24!mw gEfDFB$v?<2 $V0Iu.Sy } eOIaMѕ1iWc֙ؤ,66p Pاe^a g Y;&6`i3yAhm6MvZl:w Eo\[Nԟ'AZx:1iF~?ha}utVOL-: VkYlOF+FW"(K0Rwi$46T)Tudai?aYk^mP^ބ2\w^E`0L;GnޥKt+EȎ8SF/k6BRٙ0;mH@uI,sryq' Zޔ-99,S!Z< JOs3BnO<Ӱݠ~h"6#H3h{u/?(`ڋ6Ȓҳ? cǬޓGp7mӾdgr iΩKT$nE'ڳT@?_ުĵ_Z{_DO>ɻ&cjhDZ lRs3 I(vµ.MЍuǰr $P}0'z,>ܪS<1*싇WrMRoB낵mmtՓt+{@.Y4"5S%lmQ2s4ɲ5CU GMŹCLBfO-]C~u2xy!q!b5n@Ҙ֤AR|2ü\*ݨQs \FxW%OCbU 5Ą-6^J/͂.鈇>pjg-:Vx;"I,mc]Evxq&xj$s]1jqiM1,w]ƥ鴙sMq!zymad14"+ " àx#ǼKKvhr'sX{BnH4α:>qec` B6:$pM6o\ T f#?u9qIRMe5jw&6 I Xn788ߏcUܛ(}*@MiD^\VCN2q/w&t8b%574R00$R}u̺ipEz釞op %9{ c/xփ4i#>KK r{N~BXQC=_{x/=/:hp:\+?$#U\9X! -x}jS*Κ;^q22X-m:{2 ݪkװ9%@:&qr>sv_3yū=uB*|LR@u]9Irm܇lX`֔[@y5@K3-l}>6X:њ˒.s vP:ěN++$ODdm܊/ABjTLQ+id_{ qu$ш&5UG/!ޯɍ2!{5j.f<PGZ c#Kx75ԴlEH˴DQ-I/Ҩݹsw LbB]p{ yIC'sd kZCIA-.IZؙw;=Z`VGzO3 m{ yWH^4bl/ 6L$ tTc E蛰D%낀ԓF򹁵 |= FŇCMҞ`A]l)D_.'约cQe5xeLRCxi/mT4:7z*d[0K?d}#赵{ȃ鹚xw/;Etl*غ恜[$'ָG:ɫocHs&$"!cT'G~3bd6C+'P[wl&~g2lCGӈצψ% \p/pv3,n˗9~O|agf@TVƢ2z>l˼R]8m.:lnw9^L G2 !ӟ;r`&0K`=1mt^K.R.l.El[Ba]} uw(fn$nS?eTY]tٖ3h\#;:֬0*8Cabľ?xG~ȑ~u3[]&&D,I ؇#EB,_o>#P2iX_iI[*"hLWAr=@=?"z̚Ð^h)( S%"23?d[]I&BVnNE79|)yҏĺ@wӥğYiMaUpGL.WBԺ l<u 4fYGemxt?/uaf8[l`Q:M4Ć;bah+6KcwE1Dzםo@ψ4=,aYET'^N7246WS;xguqgӧSz9H(*L˲{+pNvSE<a9hطXE '[Om" 4)٠nض 8Vuʄ\iXP[8B 1PX. 5&gkB{E^n+֮31 [3nc R>K:%t)i6o$Ud=XNv7iMIn':Y&:#|jkbSzvLnCú)wvJvꦢ<$ͭof;OƧu+p =X:msIVf߮2&|B29dT>?s8xex;!YhyE'*Mc̄2b(q-KL 8 dG ! @ zN>4~UˠDJ!odsPVI j/wJ2c;ܵ }"b{0mmڒ/@a`A{V6LpiiR=ǢmD ? S}{&K&&9D5$z {U-K'oqce O^ "ɿ6 YɢEo?_)!~omb'pMO-A9yl?K.!r۪B~h.4ԡ)3W W@}LJL{XhՄшD=7W$tOp&}6g 뢳f-1lf3}'H~ZpJ9|,t}v$? KU|rܷN Zt"".j!b&r>e#4MжaT>&]/)~uXmlZV1 H)zGwBIRSKO0uGuejҬm b'7D8BwE_H˽ J t57 ֝a8?&:i^/Q4hds+.蛉IJпe.4skeKbQ ݰ Kb<Ȏ{McOʱoy165qRw(~{ظex "/eiDj$e5 76sl?Ϝxs\h*ҭxlFU5TW. )ԓEKrH)<.I'FB\(_cq;+Th= #Sp?#~*\Z*z/`esuEW%4b@h"+mzl.-/Bm ՃFDtc<ǙQ8jUkp3BF[s4 BRH6j 7WOa_}bP PwDYqdkWsIe ajF*O )b ~}LA2H0(u %wR1܌HLqċwWa=B^?MQض"`睊XHMT.5km\x4%$&Y% x?`bivye=RB8bQxpO=OyKDd͗, m"Mдf.$2i\uGуZk+CyN̬"\k]Q/$Fea>pAk>WGbSo8Lf0^j*AoEAYyj@OuTef%^rL Jkuk\Jnj,ώ ;| ǦO3O؋i=F#>=t4CSZ+~Pl{>3 :j1Qb f 7f);^؛rB6hG)3yH4PDmA@&Xp=/p7'ʔ?<*Z |9EߧQI ~dOzD3~ۘsC4,PߗCWln.f w>S8=c,h~rǙ7P:c2Y;lLO%% tjk@K& XTI%QE>*6qn#7s<Uv8G(#[UvF%ӂ^)R)9"l9k!&$)דs_ dZrUw}Ef^V'hWџ95{Zp3]J♚wlx0zd,m3|6Xo bG/` oa,SF*&ޟIVPiTf?jcc0L5ӚUGF,QV1iuuBqo3.zU<Xյ屢@C9 j@%Ypw&QTZ\ ֗dSnJJo:|Jny|ۮ""D`Wvo P9p ދ#Vbա8c-A՗QrPv6TxnA E+%ҁBn 7FDClC ^M֬ڈU~zL%b޵綛=5JYsI";%k馮\["PRnj!]·=%# %F=0.2E':(sgY1fcu֜MU9.p1k e gLt^\˚DJPP&{tSN? <5~P#^D('h^K$EH(;]"Udw䌜$vq; iJmAIBfP`Tf^Pe A!S6I2 cʣ>:Ǔ+~RG l6i6"}qSe@|.Ep= sԻZP;gY=׈ӳ1們b$7![ůEh-bZO{/zJ`?w-M]aQc ͣ0gbbsb{t#eWh{6Fn~XOI:Uq1:p/ ߺyFoL-/ʭDk(H׵@YEOz6-5B=+0I&1d{9&N'>[@Z&ɆpA'I,/kx<8_qC8iNGph;-_F6}?HBN'Q2݅\/bW(Erd%#)t'VEov{ľd4`&ɍg)L(INP9dvBbaxcRNBT#'U)Qg8h~20%(IV2%3!v+SRW\3AN\ljx0=+#$}m$9_((  Ll =P`5} ^MctWZrF ˣ2\!&/CȩYtDP[UƏbS Y=D79RgYxrJTY5 Cg:ǔ5^( ]Rh|!YL~sV^atUyfJ$9 N0OmnC#;X&2 PkΊ~]^Oi(vLiS[kkFײQuOFPng6?`dȎdCٷkGz7>%Ol >n˳6i)4qI4;24LXd'JurPZMNrMVGH4AŅ-"I-pW&i`h;EWpJSX1Qi$}B !n:1o$S#3Cj5"&/a?N@)4.Y{$?.M$J"<$'P'\tֹ2p(ֆPцy_sw-bFY:^G ^\%r+: {&}s*g%=S G϶"zfXrQuPtg=RؚVyڬ(Ƒ&ޠ>>iK)yaTH4TYDXS@bdĺxtJ5q ԆٕFdY&̽3>>]$o1'Z܅w{ qUvی  _UYLq>}yΜNᣂc7ҭ`c$u..Uu;bFb5Jn7٩JolL0"dKn>:|:Z,k5S0rE0hd_zRq^G4 7OEtR͕yov/Bs_mIP2YЯf8uyMM󳡄"^ʐa -{FI~+%ubvnFWO:أ8=x癬CQb=CW{1(GE8 r{>2g8+ }#Cyz;}jC!ϙNyVطS\@#0u'AJ~>ntvvw^Oޙ ^^@6Xh_c3n։Yz%Iy H>G~֨ٿ<=8q=sG L%wR?V,s!v0 %ʰ/ Hv,X{0d!WAP.`9BByz4e'XS᣽9줘j')x%С.Z\^m4AR<{ֆu )A "nǹ ;gFnSVR97d㫬MUx8Zh-'b 0aIa|%P"+uRY/C2 6u?e|Ax1b~+!c '"ѷ%Y™vǒ*Kz9<$mT]pFfi+ƵϧʈGZ'UT9ձ[@J?GҤ5zcET[̶kf)':8VӤCQ 4<(-`;hw`@=oV]D}icOaxÓf ?21' UYt}J)㏲< ;.gCк.RU;\Ҙ)eKdR < 20κM 3'2 TˑAC|H28*Lwq]wܧDdm;0)ȩ:/?4.z,>‚FOO|'_pt^Qo6N݆r" ?vT6&2re7]`E .C+\7%Ǥ3FjuTY7du>=Egђ^SJX''d,nc3%c>Υl}r oǰ6D:9]6fU{>,Kr R Z<@ yǀ%!s0Qfr֩n?t Fr*Q },>OhpLf0 |흜`//"/a #n&L:xUer2:D8ѫ^(t>} Q PڧX=Ҏ bF婒Kd(J2yxJWH g=6k9ݝDB <;]^9B]sD,[wEޅi:rӪN̆Z0ܔoxU*>K7٥!$)^%Ρ>nV+@CuZf7MvV BEi_9%M&$AC4_ƃ KU|OܤבlmOHcQH~ BhlJQ}Cm=EP9.)r%%r0FIYNa-ʿ írdg0GkcSQz<ɡl&'ڢ!"IEW1@Nה9SVvu̡ցh6Mv3ɗp) |q"XVN ۢޟ,DǥH_vv^`q5wSFh ռGXdI Oς6 lB\e%v*q?gi<84O K y4hMj|t 1N Fb`fJ`|;pmb A<0ݱsu8]\2'3I0<%yY{tYaጢ+PإD@EC ?/ )^x$fW %lm 7=1AZqwľ nA!C?U%UӑE0@9o0SjMZ2Dy|t?<~jęaz(Ve# ҔZ~JIYΒ@#4|9_Uϻc O3a519brY=r;bDΟx)|4 ΉYY<*cL8m)tm끠fCM""|d}ҽ/rP!l*tIH=J4އWvH9{XǏp .Fs{.LfC#v5Th%BeXekBPfg#%(Y'`LjKK+@Xw sw@hh﫺|d5Ü@ҐK,g"\i.# ͎nIbQsoaaaǍmnSpԮ'ޏFA&VW*JW޹?õ΋qC{XY*^r}o>} }=%lاkSoסtbPfr=Ə8$^pL_xd4 <܀}n<3t?&1lm* , _@uL2Mhcoh:mcV'4#ϯS+kʧ IVЁ5d7; DT˾T /eHjDt*@vT )yR2Ϡca_ &7 #sc39{-4*WubN<;b7j&M6ų x;4: LK28D1Huwl#q8fԓ E _PR$:ҠHUa~]b(ngB#4׬K\mFrV-$s@r@SDk ˖DbΉK3d]hXTQIϬgS=hAI) F)r'I*.^53|L}vi7E$P0!`Ky"ӗ&kcRTP'%ެm9 OϏBhze #@o$#N8hrknk4dNMN`xMmLń k/V ? (|Sb*mɜ4ez_@٥O`5<8YLNnP}!8.a[q3$FXݖ3{nj;{TiJ(og {~z=HmkF\ (mAm5an폔ԄA[i5"?-{xT&n>z4>F<G{ջ }i ¡mob3Rcf9Ok[}CM9ɼ)8YM3턣V,#bL:~ Y{gᚫe_ߒ[$wSճhorx2;/gHFSC U2"tl]rNtw\"`װʿ=3-U:/MGmDK]E=L4I9PBy;I']#r9'zAh{gR+yW<9Ȓe].SYd3]gABI v1L-fjJ{_nWD;ׅ ~tX,Ll:ꙛ3=/G[asBxdvLד5e<z$ v:ہ ٯӽ]s.H0lT>7m:F0/Mӥf_o47鐃O)/Ǖ{F24+ecG X ;?ąln pgT*,z0?糈h 04|H 2|>L}9^i2UM?7 p~5@ʏ׏%2U5 `@O-@~(6aڏd) D5#ֽ.=jn#BϿxFP=!t{ew$$4.pKƕ'w h&6Ϩ(J|E&2jNlp \aF^yݙy҆P)Tua$xjO;u 7#R=>7|t.y/ˇ8w wtMZIUyiC"Pͅ&{}<-.,ShP6IExɨ"]\w9BL%BsG2SpB(ڝջ.t~G=¶+ˉs5(k\1oak'bWMTDL[cylLCtw%[^(TuI-㔶'vnMGǭ-+Gz-ǺPX endstream endobj 3173 0 obj << /Length1 2025 /Length2 14026 /Length3 0 /Length 15261 /Filter /FlateDecode >> stream xڍP-;A` N.!8$Hpww'8sn꽢 fwTԙDMmAR6G&6fV~;JhJ d#@t|I_m 9'+?6 3 mlG _Qk=(-@֯'6&`Q X8:򳰸0mͅ.`G d 2U0@ h 2fd*o x5XM@ ')z8@]Vl w#߽1!JX!n`9 l(K)0;:2ӿV6@g h/@*Zs0::0;*/.KBLmAGIA&mwcf-!6.30"LlY4!`;'ĿC^Ml G+++'dXEf /k^6"@^`3d3h2l0!_ ۃ]z`?_b'_"Qqx0qpع|.VV'Ubf[kG߻Ao.%סh'V.Volϓ6[տܴ@kۿ^gum^CA"d=[`)+ThbmkɬW|ebr8N\#%!&6m;7hotCf}$v..*\5fk y#&=x>Ʃo!z?Vx(ZGD̤!dg )Gkċ}+ZW89#gS7os^H8i H):q| r8! k*WG/1m>_Vde4!f7W]"mX o=Bx_Pʦ\vdh]hjy^/B[N:fXi>5mYZ lXdZ^qGQWu%sR5X|_u(j]ZPǚkGdVQ{8A< .c >t-EoVsqx 6,3K>T!+}OD&^\6?>Tdr5}jg={"^}~WN{R5gͫ vO*:ft,oہȻ{R I kݢ} =={|M;ʞBT {B*É"{IO,}!5ʞdpMr ƒ O7hiț̉nn\ʣXǪa!W5PC˱BxrkmBO}U,v %3" 58j[dFqrW*/vslw`_+[ɉ׵ |y3FOH#k_pB!P~FD&ФMgL}vIdѷ8 j)&AB~^f{*_1GT"\]sDLR?~4] Ͼ25 UW1 fƅW9S4[SMJRb%sb+K"qŢhjX,[9wAM Sڊg`2 6+F#M/ [RUw׿$<;6d#YNfh5(z4EdLgk_po`yiVvʟG3RO-V"+MA|-V-tf[<-b@O-<%\WEUwuA:dӱ@?m|t͔ /AG6meH05h]0C\ce; ;QJh`ޡN|mZO{*3Jô:!ǮϤ֓5h@*c8#{o?IE4UhV%%Mm-a+-uAu ?,Lz)/BR aTf_&SdBgoags̘h>G_`GxFC_1XoUm41Tnt%*9= mKCW}VYY{/BOQgk+t3>C(0>S//Y-%a \ɝfڣ^%XBჄo~'ߡ~C|q.z a#Wr,фvh•VNQ4lUGu}ӖS7_!"dȾ40etM}T#3_$|jw@Jz "SdN!j&-967eR"hėE5!qUE{`S1fZ>j=7(VO=q~"RHj!Noޭn}8|0q>kgO1Ϧ@ߚ|.Ki, [ϫE"}j^<ᢴ$^g]$COˋ>SpXe{ba/Uьc.A)!*@Eb%Qzxxv4+ -fVC^K7T(ah$ $>r '0L&1w!4+ F Xgl+U+YeSF0ލO!hY)}lug^ZSoȜs8`44> []~/`ۦr$U:BhMLEv^,l)\ RX\vm.2n8)`AםEiiFpOu.Y|nFҏiŽ;Xo9̧"v۹ۭv(Fs T'~!KGZ1n3w1hgׯ [/oZXo3Լ _?DErV٠ÖzV¨5ӧQviķ2kD{+44@(j8T_zC[BOq7:[9G9˾6L+rw;5"7al qPH;o3M?eur)c^%B 0>z|Ө C.a#oq /XA(Ě$L%baD`Bܴ|dfi*|(>!dO+˥焢}Q$Zj{Ͼs Nez5V6/S~iVG. M]3 >W u:V81:N8(-a@_ѶA`EWѽIۤOjyn)~ݰiD5OUW5_kx;i+ V&^B &,32{ހzoIE f,Y?]o:.iBS}2 Zf!9B1((.URMJ2ypHAZ*Io\&-+dn9+(t0%f}4'TriZԾ#]8IPApđ9) [D8 eZ2i  Ql 9e\7>bkԎLA;2تG"w#L&=k`CZݔ[gw4(~HqB{jfXatEh\CTL6 &'0z򜧷Pj*kXkaatH8EL7$N1F'u%H6wI-q# HܞxTAdw>GVɳZMKўɔsrJaNרcZ*f# 4 F>{71m }|KYQywvQvWEr5 J{*⫐f*8θ`SOG`;=X{5,_ivson iDBE?$ڞ:Rń,؂n }>Z\sC3f^ej[aU9IwpuAcs'x6[?M||jt}ਟ_1z;Km*g~]9YPj܋*#f+tELn䰉;/ o⾡DH*$C+I%>se w 1~3'& kB4ֲjG;#6S=!' oN. .%dzy Ih#P̬'fCG=n0bq]cɀ^Zxty*xk+.q Jxx~7.+rK|záOtqW,NmNWxyL`KA[rvT4JT ܄<JI$d)j^bAG:#2{͜ŷ˜uj (Re-&瘘n2%b闐&F M.`z7ܬvnG@ίu i& ]QYP# bEo.ɡK7qNoج[9v<>R^KݮH+{ c}|"yɔ CDhѰzێOc'9 A\ YIAQjnEM/~?1\YѾ%Fo c>85]%爍K/ɓ^oƚ? 4*bq߻9,{~.ۜyٚ 0N4HIS0R M &kAGǹ(tI| Vk"PDyCaKs-zu'l'CHruM1RloMQ"wȥYa߹ٴe%9fL:r\5=b]?> ?[ "aٜIk󷡓ڸv@ws5>UiɺMQT+)ƽԺZmHN*JvOͧ>U/9:b+J~B jlqSmpdhR,vJi?uGI_8J@=l)p;wJDhm[8Mǩ C`av hX۾ :NTi|l$M&!'^5#DŽ3lkwBf;Ȝȳӿ+q0 t%B}/M{=\QDPzUUϪUxcA[g))I 6v5ԕdO \8,I BNt~c}EZb~<]@2{ρK{eO%ֻ\lY =!9(%qLlqk{.ɣڴUT'AN[OQ=mX,@6'C !Ꞽ1`ӶŞ8*]Mt8'zT*mE*9LjܞРmtt<8"UʶtJX޸46Hb~/C/+`J)+(Fjrva3WtD^~B-KtDsU/r{)0@ /WSsOi <8QC2Kw9AF=ؽ54C(rzJI)U7΁+fInF?Pa&Z~RO)3ʨ5zhZ)sriq| .\Ԏ.󨳔CibVqeUÆ1Y/Iς \IJQ8\I`'2j5+jm!t 5&ӦV#Y$Wl[~ }JIc&\ GP{|wJH@>}غk\{OV=r'sR@DKiwyvPth]{ Sϯl_yG@ 2KrG6 Ck =a)S|DŽz,p;Vr+Xrt?fU}fQՀ-VA*D=Pf@=wUc(ةZk-$^C.&s1?^CL)E]1TW yl"Ŕ`;~jG} VΑ`vZZaN^w>Id_!4иʘ<6zLjxq\FY,m987k+˯o!6/]OT_#8q1_<˨lqBsR82 $9- 4~[ٷ=1m0IUPyB ڨ> *qq#_ua!O()Qf7_7 1j*?,!*:I_W!P_nHKC0ŶKcV(v1.mDj:  WNePK-͈ĉ UsNj䮟"| ;2p8[4 룯p]Gvjl,jUA{Ke?r.=aA=&$3~i;1]˄&#+xHܾLmm?!9afD|GcWoc*)YMeqZHb5U|3f~2Xxc9CkH32e6vp'Vikҡkz{0Zzmޅ2^˰#%|# k1192#NTvĘ3j gd>b]p$O:~ %*w 2 :˄ˣM܇*r:%FK]u"Fz.4F3#݆D+#M7-[PӋXKLXC;GɆ4tgq@ޓm2+Oy_*{C1QIgD**bV7xsv/$J,u[7ix%WJ7J{E)#و@Ci[W߇6 pw#f*c{Pw"i] bWIo-<2Sc,OD3td#F'}).=T#5cmJ#9 HXO5.!8/6eyRE;Ҁ19o"^AfQ\j(Kly^~7v687#bWɾݨ]`K$I+.Nfn#5:L_aGI'~G3t+„RBt#45/zEYZӆ  ta@z^mnsf34d]a.5  ܢ _wd8oy$X_2= `n禼|NLFxlsP4WO*mVy&뒴I.Ǒ7;slR*jk;4iA}0Zl{ڰŖ|(sl= ԿHDS Q̡ a,VYv~DgWH\4#Őq A>R>W}gث"QyY:jn~w} mNliƛUD+BM}LuCLCBRe1*y<|yIA־%D)[UqT]-32rH\Dc&R_9Ke%U#T|oQ;M(2"UwCXрɓ ׆6UݏY 1Mh&xk]ic&Lִ!)@s Fdy4ٗ.ѱ[0d=8.ǀ Z",}(q=*.e [Vs/H~9cCFngS추"&$vHorE7 AMMXi9/慅AK7j 'aRV8>hPhNB㓦+rgLL*,"~* MGe,}2 /kZd2C vw>vS4t!i[V}\D&y!]a%I"b?+Чc/12f(cyިW8nӪ]%=\.ɮj>QxIbuBH?>ljWDJ6rb&ȮTaAIq[,%]%Kk.ha{ӯ,mY矾(GɁl4+xɡpgr"gDA]'%9fߐ52T*30/G5axc sSSB A|? :dQv@ ɓgfDr':c,a )K\T/~W%D&0=y[!Xn+A'-c -CB&L6XQI7ޗ,ÌFr1Hr _).UOF4iG֫Z~i"#J@BFog,lh~{{5dDdhFgD!oak籔z `>tmf5G>̋Ǐ81757kZd[8?;G(e>dS5Mq\֡D]%c11~Wt( ͔wLA{E}a3ƞfO6?/tiRN r3]6/_ HՈN_ %ӥjyialSf6E}x2]A|+j [(vY'En Ge SMm{H•ڭcU*=YKdm_6~BGkSMߔGX秎DXUWr)$D4Uc%!-;. 気 |"!쒯FB rt\ OhX!$X4o˪$N&'b~!> K*< :L<B/V\?~*H ̺,m}okk4$8 AE](dq4TM?(|FãYo,"?]#!xJd (3u``x(읤ssNXx> 3Gxc f+{tESTk;8/4ɮg9ceHη;d[fk U u]_/=|=P,fMm.,Chۖ):Yi˱4ĩ|BV@w\L۟<հhdZܝPB?5rM׹{gm8~dI`EuM<|_`xeSpz`^H5Rv:($g+!)YpDxK%8: |wX_wT%x^Vg nA[! M'*1 .K/2lv#4D=i6O*{<̏;]9PQM-\u=b|F)ޠҬ@;B)?>>GFta MΣtҀlJJo|MAGu0oBzvw*tXZ:O%KyoEm ߊho7hB1Tt2;L@e'6*&k׉z7D|5 4)ZT]M-ryU-ƪ%m#qsj'87C1t.~7)!ORJPeUD6.B^j~ B]<~cArzβZiGŽ cpMG]#ŁDt^~qXҴhAc@.y!O4,ojisGiZDFG;R'|F}捻]mP >ЛPP&jy=vS-69Y@eXS]ʽۅOo%+;J'!UE#r>#|V&C訟o"Miѹ<ϭ4\̊>D/lS܇(q]*9O,iN 2W^TLY+ݻ4G [5 arY'~ZoҖ[f٥YW2/k:6Gt %MG>[HshQ0K?)3z4 b-=Y ,HpL\ Y-KUzql@ 0AR^ABxnĴ4 @pה!L`QvD4;L_6Ť;5zMuKYy&4={~8&fIoYzCa%Kv~N$@c9A'bb"~۫ot(\nYg GBPT@̖hbt˼_yCvՙ\0)e¦S~b>(2t,kQ.^J6! UMf(*7M] $ZPr2cj .nz] PD8XP,wkٔIcMˋ$Y ZNw[8q.BFDk͉qEo?6ͳf5\y3뗲{A!rd6renA w!f',(@b~!&liM. /!f <*=)DΠxs6K{pn Dg@P1+j,k/-AYi7)3.sM(x܃ZNPz? Ady/=y?^Z\#\KS7z7P~漁؍1}Vv?xbɯMgh?4*iEB7e֜vٸOp?P&M /5wh-$3I4F 0sӚ]l砬ֈ+J*V endstream endobj 3175 0 obj << /Length1 1357 /Length2 5946 /Length3 0 /Length 6879 /Filter /FlateDecode >> stream xڍVT۲I HG~)JOBޫT)B PHQ MQK'"MJQ HE=w{kV|3g|^>oj!qA`8ID 46W )D$,ly#XAX?$pM,#ڴ`81 {P*UP@iD_ @R kb|Hw-(UTTX$a8x" X`H.)Dxp>J`p`` 'JH`C`v 1)0`caX@4x#1ij }#菃P)+;cP>0t0!U#)\N]9¼0xX s!:.訛0bu"}p~R~H_!^6UB!8?ЯXxcBc?k7$W >`+4rDA |D+e7e&naH7 ?w (pEq hF'E!DAȯϿWDnb.X@Hw440A^RZP4@\3) Wcn@O[WM_/ae!2Mp{Ni;c,oߨ/0;/Wj#Wc+>FԀ:ߗA!\M8[70!=($*#7 Gj_꒖`X,,D1q'D"~3K18b@l/ p`A)/#X,QVO<_F p~˛*y%J'M Tiϳfi=LEv&bRC͇AoWhx%-ՖB}CEzד_b0g "M[4[z.oH{T^U}dpQNJ$V0K)A8(lL!nVhȧ~\B\v|;,.5V 8>K Fe>8膏(\ F&_zM~~}Z m]/ZB7b2ұD 2#NN _KK' {0<ϭs1 {{2_e_w+| ߌ^U8 :#--pYږ2cU#ѸH8Wᢐpr,spp^-Q:Ly5p͖%'ՈNzRЪEq))飷Y[ȋhxu/%9߱{V޾gBO.֧VMyJ9uњiNH>~[ҥ y\iƈ< +PvQ)ݵVWrg6r+Q j-ZO mSuѦ= EaNB_kŌ5ಳp [. j-j2ٿry?g3畦1Y"s6|4~qjhiY!}SU,)+ׂڃkjӯGXf ="6O*{OVTbjL¸4LAیyy>HJʙs<;ߍDyfV5~`lsVUʫ)"Ž%M`kuu܏'t}ZGm6p5pQa5+ t4BmIw?57>pܘEa8㗺 vnYںM~:YW9OFU&5ZV(S7 ;~Ig,H!,B{=X@ 6_XPUmKog~|J2/:H{}{R \Ń(q^D:2wQ97K.VSU+(kMzVؙ<1  lP=!f!*7B6G qaQ<:Y] yO+QW9z\≀v%F]%f8& O:d 6M5=S'u E[!.òi6s>-p;bW.c<-rHrB*lsH:'n9ŗj>Űmܽp-$+!{ϷLsrvJ.j#ɽ]џ򹜑_.A[h*YH^ęう8vD# <+s-1{S%ޟt#PՔgWQO"Ǭ$hȘu=9U}Nc ;eMZ=d2[剦ܮ)j+(ȨfoG]nqJYތ$? )/(\c#/}H^VD_TnQϭgeW>h|gjƭILdfDHY3e Le-9SKs$ \UX ٫;>}O43uF})b t]aTnHpi/mC7)Ӟ `N;xubȃ]e^S׿2o={M5nC6ژyZ=Wo1WGF[1ϧ  c4M*be>ހFˢ\Fa#;A(T9e1^zmKeKrוu5#_ 0o=@qe,BvrPSʕe:Y(sMgeB \k>4su_f&Ukz9 ;Z\oipTlw^-]Y廦Z$-}l,q9+m̐x|Y(Q=˳sVzm2wAM2kMƈGm\M+ԫ/=Ż滺SRo-9 61^+ Fv0xz`t9 R]i^rf Vy\S G"-c&f:ƁG +2{R:N|6y:a5ɘUFC.Q.Hn`{{> -QMPTڪ7t0 >3Z4rƾF68JPSDxO_)Py7a)jN6v'"ldhz!ծ/l[:G&ԪlhFG>A*^M;ժ 7ZCHщk]1]z:҆4~z_w&n0!-(",adg#Llm' [qto_7/NNsUaj{[F>ʰ~,jn(WWX"&^ॠNadΓb\d\.4Itzy4p'-̉pus&k@) ^$}kK"/ NEBc}~ӗ^ӈ/|OOC>PîuԸ_CpT+F2 )Em9Qq(>Χ։'uHyg<'R q?K947-D.rZGf5f5#ǵzW ҂1Zbk-* ҮfnZURCyz.,vj Oj2+ӖZwWQ`g?Lf12Χ}Q5Ѵc%\&~tU-7cKKUA:_wզjuuxK 1V[/1"kMSɁO]1{CwJwa'%oM-kٜq+DQ}*EF_O{ǎ.F0 ^|R-hxv#Ua عyFbgCRn!!%VXpK}>n)-)``uGܟ{vaIc̐Kȑ.!cuQ%[2HytI) M *kO?mfRtV &:wFR2VGL6za˴48S]e'''MJnfzBesc.7)$]c@q+)/sBcE&B.>}jX@{KtV.v}${P7mTeK=>iOb0Ib21"1M;0bI<:7tg9%f.Ht[ lz+G3iv_Y = ݔq3EKe f]Z4}F6+5Gh7L VNr+*PZŸ4ҦC8u}}y4+3кx9.p9s>ǩ>۔2wN'(tw |cꂝI$eW5.0)<ۅ"mxҵ &6 N*Q i>+ù;8 X)|8j~I9)É>%w|TwﲿU ǖ! &jHЅ/`^wعbԇHxpWu@gw7U5շ\\"F +-8ku >;o3{|2~)h~?_G1dMj}gVVeiv0!<,/qNCLudSV6bb^d;fTrÐƌ䔀S=rS)A]Jat'@jY5v?YaY+S%cNҽ՞eW;Z?$,ZL<M3(2Ŕ[3ti5 [>3Jh2̝W\֫Q6ZRlA=G'[S. f"X+ʝ$@"_}$ gswVh7oUݶT`rZLBIi5b<1 BƳMCݴ%DT٬،4C|ޖsKuntd“مW#5,ݧ+o1D4pĔ:}i05j0ugMi8o50]n,gS z2޵?٬P?p XXϳ[&F\857Yw<)>gWBu4 gS,"8AV+BÊ);AŖ$|?ɽ+V%V~bCSE"^Ε/jQJ{ Թ>yXVUȭh;dtW?.$AKY?xɁŤVq^_~<7AV/=U"Jc3rB{7`B{p?CkGW7IsO gŋ {sM> `Sqf]sUE'ZxS o<`9jޏ1fޡPvySO\X4d{!"D]#MR6grh0A ɢvl( 8`Oe V}oJM}oDksKOQ2N1Wx]Rdg`\30@B@QMl/:oW1 endstream endobj 3177 0 obj << /Length1 2121 /Length2 15920 /Length3 0 /Length 17218 /Filter /FlateDecode >> stream xڌPٶ-qww.wwn []kpGι_^QYckQ(29%]Xyb*<ff6FffV8 5+W[R8 =z1gLL f `app23Xy nneg8](,,]߳@mJ` bt25Z3TL^ՑÃ΅Baj P݁ft v1Q,\:z;[+S˻*-Ptm,=?0?޿Yllj`hleeo0%]=]f m]ݍlM * ) 0~v.V..V2d {31;; ĭ]bZm<}>[ٛ`ȤnoŻ_ :Ly9R02q1v\݀~>*̬L]&@ +{w2 ?'2seRՑTWԢ?*QQO z?w%cTb߻?4>@l<M(HhlW7ٗwxm {]fVnv[+j"4Ehdjj-W`V@% ޷pyǿTf`l~f@Ͽ&hx0wp}&ߢI`qAly3#Zk `2LA38?e;ʿ.9Jdwps#ܻd/Yz9ZZˬ wvPwÿߝK^n9~otkBW-w坥˿F@?nhS;[c?B'7sj .ޛ{ ?{+߽=H@SR9;Rz7_/ h 4`j]~_#;.0CAJS|+:܃SFx縵:[rۓan$ėc~BX5='_ V2NnHJ}Re+a{՜e 1zA%&pH\ah~y"ΠM$IJl=yUtߠNQ`/|-ZXl/"CO_e@a<`ͮRou]dOR$ז6c:*bVFֲ :Eo5ͭ ys\$ɵckZ]ly_d<Ǿ&fHbYo=j>cH0ڸjqƖXhܤk*>Ȓz.FN9I-s?|vr!jy3$q'@ SƞqpR%EOP*릟.2f^!!M|bzoaĕN/rVgÏ8e:D^ KJE :$mؽP*,=E/ ]M1' lWeo^/G&V S0&4˨}5mNꙖ%LJ"iZ|3+ mb? `ɑ@oa9jXE kFi18\SN-RkWihFвEQ)iJhԼc;~ [>^" -vT?gJЭ ty YoyCЯ61j&`irK*&6J{AN84ƙ-((3MT!Mw#f-%@x:W|_EjOp#E Gő?SBqHj7}Q+O򴖹"ܺu(v)"4GkAڀi;G'TLU PfbAKm g@~{$2/s kDĜȉp ,V(H6k 5:ۑ( \"lu/c֎~ bT8pi,|z*5>zq#nG6:2%>e{7 ͯk\hpT@]?mdw obyȸN8\Rlx "bՑL5uۼc[I&Kt̨"fZʳ eeN_dAmcczHH ɖKl tR/"`(FvpJN4ш FvYL~>y (7H.8[|kj7L;="4-t}yaϲG nG0֐^ sIcEj{@b:e_, j4gWzV5K@[ ] ;?V0 Z*y{שcٶw۰RꫵZEgMvwO~)%%߆]!ya,,B,y 0Y=Tހ_OSOYLE;NO }`cIw F4AY)ʽ}&z> K}*OBOEqU4E6[(xc^GnFw,-W=nrduyȚA9/33>/4#jɶ|be。$t:ԧZV=!)%ڃW ^lFrnPQlx #m7Qզj3JQjmF&t\"S~eMpO5^+l4?9I| d?6UN[11o|YM^^>;z(M9*o:fəZn=AfRH8t=af~^]P|{='yQUy?9bQ㊎md+e-74w%fAXg7yuT{k]R-]p E8/V<ZYxJ3u޳:,KZg?>2 { * 1̚tW3D:ѥ6xQmx}p S2>"fs^L+xژՐٍM"W[nBDs7S2' [p>kd{6/ɏ/NU|K/a5"£v_n!b&sXb@k,nI-\TыBdWc=s) -? |CXkˇOCtl VPm(}{o%=a,ZHuTўpҤV\e1]"Œ͉p"2PaeԊhX:WZh =~?'6LRɷڧ60H J'/,˜|q:7ثX`Ay-aqDGtmaNqGՅL-8Ѧp4zm;c+yWy yjDʵm\F#5VU+gXn4!m ~QCW-M 6tQk &?mW=8u |)%B'D14⁝1F z#<'}tjR@3x4Jm LZOHztV"LZu0Tj蠥 1G*D~Ys1Xů{0t9Kzz<д-K⪏BN;$'\Tb*uaDzWR?-BJYR Cp τ^)GGL z 3lGU'^ Zmyggm7bnBH[AE۞kD}#.J=|ip] yҮ3ly03 D1=n8=vFKM>z/}C7:(1A쓜~$APLɸ"c:do.Pݳ7WV[r$:z C1m~g} 9;.M/w5 o -C UuckD XgF<9(_\M|] ֯~څ&:(%UM@uG^fm_tǓxLu8e!>+5"[B7Cj[U<^Q-}(6<h5 SnωHj #gpEz<^nHْC 茵ϥIIau#K;=إzӨǷrqn5;  8NOH ի׿˖g_F a`Йt{nk7_LҜJx4g c&Pf1[a›ːe͖шZyݙBPlZ,jBIb{|~TfvǖVK_;#%tOPd.j$J(ҠN[M>(}Aeu%rߨGk[9f4PY8ZP%8vg*E(1TEC,Hl ʼnsQV+Hټ(=0x.2в ~WxTޔyrׄ!;e8o"%h$2cMhrk9Cnu<}]#ꫮz(eC?;K6CoVM,ΛkI`49ʹ ߻;=R|ڮ$>obFHMYl]NF|^95SvAk q:]cT5.WEDF_.99 V>:O`_DKY#)WfnN3i\:Jؗ9qјH&sթZy҄I"rDڞP4Gճ[%xmi/-J!txQ\®W_ ̪@^+XA>˹:iзMm4]v>: sT*w BxՂR:ϸGFf,CLJyl]TRˤ5_QP)cPF8XMM'i`4I8"bSSݎsA|1KǼ)'PZG C~iA Y\d>E0aP >,W4٣ǃ!Vl]J\)s4{ kd*pQ%3Eq3$Ƚsv2$ULu`C=`<~Z+*l["t !fǤ 7I3: ?{-q0c>䘎f䠖zĜ co)nRtLW=5&52%b,FECޙ֌:ܣ 2шѵ+b( "!ޞel=THf`XF0xdi)Ml7OŇ'/l㗗 sׅ!AYPtC”Qz}S]L47 H ֋0{Ϙmf$cĜy/jQwgOQ >$`l~l!JS_lkVv}I*Jg z W\xhOS8x(}KJug*ݠ6oyڙ,V ey?B22,jQ]jɅ _Uo;ܿXtOB׻Cc*Auq;jŮz4C*}Bɹi4 ,&zP Vʙ ?sJyZEDm(-uaSJ$Yi }Teio}}˪^m-i4IU) a:WnU O>WىF}vKիjB䜉lO^BeVo[8'FN <1Xd0)yn-|&,;r2lzŜ-9BrPdRjsfRL8cH!ةY3z|HL'ЀTcsYtA@gV~Arp a GW^IF3/>suNSH]9KvT=~38!;'er5~-T~8IEL19p.&+/%b` Aߦ T1s}fm+ c*# ׊-__{pvO򚌞Y,KsA-]uhL[C~mҰhjI@t̪Xԃ+sW}%9ͣR\2cˮ,0~+z&G'">ruh<+wMۭ/,P Zr ?{gJ/ڳS~Vm `>B* a跸_x`=\(سv+͸Ķslͤ5`݄ azG$wtZww^`Os<} 6 Op.ʽE6Dj#q^bq ۼgȑ&Z^X|&?r[ACbf)E Il|&1-".0š!\Kɣ=S7PjS /ce5/bpm$pnd[yV. qs(i:ymbDc ]ǝ$ z4󩤬V4l;OhINqR?!aF;/{!ېy( =]be7uDRL ;>XjG 7> p?>7ٖ^W(]%_K+ DAgf[D(+Qfpo4h?☩NJ 3~:d@eqH{uc^<ݼDͪN{'uZү:xjYefb$52"Hwnii&E};Ro!#B+8{ v|֌ҕ_  Z&A1.'97V's4_o >76dkTQfC[Ț42߼(Huڝ-4ƝLmwSP2.uMk5,%їAS܇AlEl-ULPhVI\Ʌm5oT*fgū^QhDZ\?|9Tc-P ^ ]2wwK]Eͤ ܃\k&>gE'{/tYJ6=RjYIhhrFg҅+F" 1)1>_Ʈ'>rѵ]r # 綉4@Ma c5*Y}gY+bӓBx>Wuoĩgm)͵YjBnwTm̳gz=No7:l\a@:HyM5\d@6 |& CMC2} c!1#әNn%MoCyMӀ DRo&Y$9FAրE`oVzo͟+GC|9nfKQPKLr'xW rP03B7!$DuNrێFȍp{pjFN\=8<ɉ1JqdL7)Ar{Pا1#%JU۫w-E2f `D!hUgЙx~kjeA~a7Op6|\AwEw(oZ!#[S[Q,ÈWN`kc/4+ID@xX KPs(!418<D.tk"Qg3<:loiR-2 fB6q8 .A5|u~x2H'GQ#zlC_!]8UQW%բOXv# 3b%ƢT fzE>Mh+n9*} q²TVhsE&K8^9YQDbCz){٤{ú?}M0=ȩJ%S]0\Y̼ԇ\K7 ?]}6LP >C>'ݺLՐ}Oޠ-̣b4@C@Q(&ƑIW喟LҴYYCH {=3د&ރO*<hA'5$1TssN˚G<aI"szRM^';OXjuKJr)+)cnnN(L .~ًh5nF(quЎz4" v,/؆^vb#n,Zm&Y6E{r,#!MvS_h5]#xl -R{Z;n/0s>UȢenZ5WACҵA!* Tf藗EkF]_ˇ^xRKUDC= zUA 朩tb]@ML#"6媛Jwx ^dXPi#!aeITRIi0$ghO([7wH2l)]xCa/1OqdV>"PYҁ#ً 6K(OKK~?%>_E;G blaјx5ʨAV$CQt=Lo~0NPzEc$s$ݥXS/j'BҍFGz"K/lbV°2#P!"f7.l!jn(M&Z:j70_Ѷ(S4 .b!^ыN/2<.uuGF^03mR;qG狩`1o& @VB(eybSDb*p{I9mR{N}*fwT+kmς, + )5.٭qq͗[f"ůksj 1`7-On/#$&Z'kSh? ?1>A#kiHի7 YLwdUhYQQ*׵:'7 Y+/TU)BX`ۈ!PAOGPr/ׄ׶89;8УEʤ-CgLK Ojh/ |}#~Z+M=+q \'$/m1Aq#- !ϳ8s ?gGL~&mR1mzNL7$зEX֌k]o{Ѓk{18zCɺC& ֔n'jioO:K/P9;ŌĩENo<]uEjm7S+i22uYlPcx5CB!1>X?nE?<ѵ7/CG$ ։lH4}< X3I'ߡw۲x QDH+baOH4Iȩ{X;S=EoJUV4 J#b]ZmSD\k6Ԧ::[=/axjb\A4ΌoŻTVW/<'7}/)}@*H}x2U d0f i #25Au7/fhkeJWtbJy9kSsƯle50\rtA)G/u?mAm:%?;GJ,~ԍE&Ú\iy{; m+fC0?ӌv#շ-@3qϓC3ĤTQ"jѬ8q{w=X?]~S`\PwbiL)EyaS\9I9ΉLvP:> ;A,oqH ߪX [Ti92)*yյGQpd.E]f|iȲ#l `[h]aLQr<\qAg/Jsf\WwR۫ZgWXp&44eIMOn'&b:uŊ`qT/[)+ sFu/ {9K\, =DS7$o2L6sH~8Cx]We` ?|rx*榩vm3K5q#ș+뵊dFjѓsvHVheKv }(ö"yX/IMQTSltq.Mn1a:b,gBѼ/\\uԅZZq`C#Cgd{ P,_ L4O-("~B+#%_G5VXʲ8πE4D}-7"h탰>Tvr)ey@D-־d]5a[ eQu 0*lX2djd6^Z%̎}?]~7c3p.T ߍۏsԒC4(*G'pshwj3w.(3 % P'[)]i[ZraKS#6wϷBbabS8>?>(*RN=R~B$qwDJf#Z HǗ0#UWx<9ܡ#}~ExДcp$2b[~V+NO 7v.a?ߗoR/dɝƋT"!q~=xe1qpB?I>l2>44#^-v퉜%P`p/ b,&aV}Ik٫Ћ$r4L˫6r3~s"Ã'5. 宋soá ǏZi캉IgaO,V$3Nl)'ߑSؽCBH>ԋD0B6pP>F߇f=3AIRj4zUXG FwYhLeݾ+@t =@.;.y0-VvNO$!͋!U9 ,(ִ4K;[rYt6m\飯"Bf gW6RHJr޺ OGpz:-:wL "ӷܽm,uOAX$G'%܎X98H`~`ٜ>ikį]3ؠ|qŏ^-x9'RsxoE5@T*9w@(ϙJ1-IYI33<'ŵIRNssDoߪ2,=]-UzĠnsy[t6|e/ߚ8RAI`%1+=5ʥ0!rpaGDAЙF(WG~y!`(vԵF)k<>rww.l:&5H FO7Hu+`~ֲ[bfu3NEKҴGC6x5LQ1,ٶp`f Gib㙌q0='m> m[ Nz9J!F~FJ \4>>zM/ S=P)߾9")W^309.R=y47l^^CVK!xQl⥮-([ n`ߝ &?[dԝ"~d+9΁qMqL@T5U> stream xڌP\ր".=Cݝ]e#ޢosɈ鄌m 6NtLYe&F## =##3,?rX2U ?,DN2QCY[`fd7@ K:’ڹ;9}Wow5 kdhd`P52:OJ^3'';nWWWzkGz[S~*Z@ tpj g` wkd3s)mM\ Pme,/ZDp+FFv66s+ @^\͉``c퇿ߥą?G#s;'GzGszd+1Z[maOhq \K_m;1|1wJCGf t122rpq_ T+igk0hmnh898=_eb9 6&w0wh1~~0c[+?_199U_@`bbfp||8 6&qN)3@o,9ۏ( 6#qߔuoEVV)e76r:;}l._S5VWhllN dc1t\;̝54kݬm =`tLGcFǏ[XM+fcdk׮1  a?LKi t{ 6N.&+;A/ѿ 8 " b%Fb0H! >2 r##Ƞ>2(!VȮ>|%}X>tFV +_k?,? ~c?&0Ov̀63GVެQGWi}~(>7;?*u~ps}?>Zs~(hou3rvpxX9 h4okhQX#J7̊0p~ +r/tR(=z\dhpkQƙy_KSYiVp jo. /ysCE)=iwt~$!xi&`ވ[HV"ט(R|քJ"稃pnaн^ n#8]$ o[^Ӕ|ÀPyaM+h抅{qPF{&ShUђY3P^pOfCy' Gx_IwCVV;6?"c?nVeKlon7 \*IǘrpJ˺tOM`w_# LxC΍H]39dxVSCDqxU{VcΈGj;ddn␶x51֨zh2b2fRߔ̎:aAnѮ!5"eC10[?!.W[^bJ]))#baEQ!:qwޭagy 6 .%-﷗IFa m1bwhfI ª겿)rEaƨD| wQ+K8@p _ĊӉq{plbi4[dS .bfR_5D8 rƖlb$3, A`hM3m֜&aN%kx.i0M<\$T|ܦ14~6꧁Q4:oJ14Ȁc"r`qOɐ8܂r0.y_D&neMaf!DsgI9\ijղ$1^0 )ELC7xM"ߌ!xM.rHR+!" h.sv.3Tp0O`KodYj_TNI'P?AxP˙^dջЖQU$hSVH_J7jjQlD7Nf#/f=R zq%Lm:t#;eqFEmѫpZa4Ou5|~䂯^2k!k'u<;>dh[$^-yKV'41+&"moϾV-^Igks3LZ g;ab|2FBnkԃi)NtkduBפd!z:(~p5d5˽\/8H^agp;Ng'zS([bASH ns|u) k^}AI4^]7eYDR34:;vĮgԩM\f6 pIJt@6:wp-D+D`B'Qg*rk o%X@ )4Wq43/byl8EtD*i uU0#Vb/B~%1 p"r$2y]iga!f<__egFxO4tNf&h748 0eyf.o^%%1 u}GqV@:.?[ f[L5ih1ʯƵěd XvAR'[$? VyXمSAfϯ |ԗ i}^v1IOef _]-]UEgБ|X@iE!maZRnt2$},9=879ЛC%2f 1ͧK2Ш5I=l{BT }S4̕V2;3O-IΣHɄ lL]t\8_v1rs £;r`~Ilԯӯ 'E _NOMw5PD M A1fb|;51v;[At́~0}[L/ l6y/`b Q+ST^W,Qy8b_)quiﮘ`4(]n8 6he`Hp'2#u4?݊ -0o||ۥh"(^蝹x&Rl@,7gO2?bw$I o#WmGBP"6u\s0' L#%^Wq P[R!|F h4x!ʭlSnYmk |Rc[Wtl{^.cͼaC̒ }CTM)tCNZ676]C'֡q3i}L$ه,j!nb΃&I\D3@:Q;3~0'U$Iu!͌7ze{ A駓a/[,ssJ0K8U DHg5A0^VWjz) c Zm*F^e4^{a f}LDNv\/<Y#aeܾPD\l^ p3 9K]t}Ba.0_i<ς9 YzN m %g 3*OjQVHG?Ĝ򌓟ȠUQM忩{ލOL?>M-7m4.ƤKjH6)eY`ɁldS-R)+Eк|27RB]~WͦQ8Pm tiwviDK m>1[=*cʚVdOw%SJ vd@;CZ+S^xS|DI_({UD|Mc\̓"?TпF>V8e7!MXtcC*Wƴ-)hAG)1a-Vs#f/~^_N\f0nF SΝuѭYF~@K>jƿNsN6A8cK_ؖ06=wZV-)9= gEx0ΎeX)@{#|+i*WRYaDQ\jIkZg>uH>&$u|G(~A<|L>a68̱\}(l]LVD:)RVtͶ$7x%<;6Dba% Bb@0Oiԕ.ɪFX/o`H~8 :tߟ\,3z~t&\#= ]wR,s@AYfxzHͶ6E 9/ bSttҪ)a5. *h]tA/%)}. Zk= LY6x!%;n d^'b{l5A&%^Ůo3<)Xk '%/gY i$lEc#j#BhS9 J=nD'y_h7\gF6r)Y'-SXuI|6UM;h܇ Vߕ4, 5Y5NJ{CxphR#_?A:$YzHaM3uO7JTRe۰{ 7)(}-f|(01 (k\ a!6< /O[Ǔ3-Ii/o52m+uc.n}cP2iŸ9 BAFVH r@[68 0 6êכ3NpdU_+: (XvaMdIBqXf'P c zUߕ҆{A/pJpDwaǴGkW@M(ֱ! qa 1Zj4]稣5EyU5͞d.'FmUr]VJ߫[gXkPbO݁穛l_@L-q\Տ3;. X8{d9&)Ζnt=kf%;nį֧ of矨q+Q$m=j<D-"bVFC(Y~˷qmO(OG!jPܤՌs?A2-3:gSj*|{0Oi?[?fH81j<ەүn8T@[}~ &s2D"T#iygsMC2ax ʯ; C3!2]H &w2N@:taD#$L7_Z{4K9y[h*qIKըbҟ4^4gyih}$AKq{aAi{LeNZ/(p[li9[',s2,3װZBirRGEwtJCUzp(%2sה.GI'C|"X7qAl/a.R:`g6~U7YkDpŸV" }ju,#Gа<- KQ/'GsP,ssTH2q*戔0>w`30ԄƧZݸoF67Ϋ!P)@:KW>,#80DDLv|ןNrYKW+a g=fJ/}|m!N9A $# %:'JPӿ[5Α0^Ī*up!FiKKvEKᰧ]4+6›b[dZkP;ŊkL"Qp#Z ԝweGR(+ i~NsJIZPל#YCL/J*r/}UDž/2YzK9e͗~QKY⹷'ly5 Dg{=kf<%%s޴84$mzPg%ussBH/Y 6ͬTǜ3+B0HMotnŅƦTc22[P?35媤}!@eIDz|evKl2bN$r32bcǠ #'qX|чd1U5}WxT@e.iָʊf!=  W ||HyxR|Yvgz3 -K,9]pSaTiwl*MWOixXem hܩ#Խ kɐ y7wɥauT2$f^/sB]hwYU /\P +Iuo#.y/FhZcvMw9Hf XIK3ȭ:5M4]'_Kt?f+$& j-_ag!kRn?ƸPҌM\u1Nu0sXEϏXaj|^Tk 0As`' R̈́;O<>X㑡`!Y^/T9mԽV \hw09npƣ DCjWSE[xSDO WHXś^a=KO9NY؂;[B3mc嬅^#46Dy pM[^M|Z Latv\=.5ͽNo$b H;]lO%8Zq?2CrH`kVWI(w4eg] :jKI$ݶχqLwCZo9nJзDc((P*! %P@$b+7^2HB͂Oa:wbVr)w]S{۾w}r¹(E,*U/B4~40ƞJPUc$jumm e|!ktYpt !i4qCԿPW3A0m8 }CQblBr=7,=Ίp^k#%GXaAJ0HX+-%*_3s߷X)tmlžn-:`cCS'צ e9@f*o2n+vyh PN#zܲV;Ն 7ʀ݄I t{q!hLd^2\5,nmlhe>U𬮬I BۙK!"Ou^&zcĈAD\OW_ hX|\>Gb?E23RHAx,fpJJS^H_7_'u^{.U3L%34\XQfb82݁#O!8$.IuqŠx#ݎ|%1@\Vg:VI௶*UP1فYDRGb+I|;-NBbJU\S%K rJd˦SH& ^vW_}n\~=v&1 :- B muuYIA@TfKCxKV!ùr!PY▆Ko0;8/ Ϛtq|guGēflFaA6ߜ<,8(H#`);~:Vxb\:5=?Ɗ;rF*)= wf\]8LƷsmt,֓2y;dDgQ.[9cȪ:DAZ8Eau?Q$^S ~>]أVegOPNC,_/?-q9{MaAsw>"Yi i`6 Gp!ΜiB y T>( r$| /3PVu21XBԬۚE Ȓ-%,jzۥ=T(M2KR~4+# &l W(`NVWϝC+\1 ;e U8/ ճi.#NsW8k@ؕ^^'Š7DcJ^>'IEyBK<}},6 {sei $E=@=k+9p1HӦk Q}lR>5̔R,L< F1f~ɩp<8{C8b4#HVm1xi m>P"^, OΖ#hBvpi\(SaR W/afKO_(XCKvE0{e [ j 0zXkF=l!,v '8ϷZ>D]<A\ *|*Z+.pFN' Խ Efĭ`~[l8ȑr4*!ӡ %M8<kP;C6_Q߯t eSԅEx,^a ࠬ%&OeSFOA+iZ|<##Nw*LeQ4opI"%e;~JUƴڲQ Q1s}=j2JgrSfɷP'`T"|FmEڮ[;#i6-o[0 >$0ޓ߲kI*g]I乨e" >yց'κ] HOv0WpFv8#1?ˡcΩF{7f@?;Xsf~~מ;<( [vJK`HO˚Əp^ R\ZeōT|~pG+ "%+w)TQ Č1=w޾XVDLܘ3#`4>ITW.:Ư k @ЪÈЎ*lÖ=Fֺ*$ ݚRGzoR(4׆O5AYj`J߭~^DMxqШ\R}YiKbҎm`=U"ٮs_'yt~UH:5#" ^VI`;iʢQũA;lƞc| 푬uϩĨ̙_1 aN27bWp 0|5O~S+f 9`I4KS&jx4Jج~Ii#ӯ}lH-,ԅcز=EYm7hcH%~,!8Lt* nu|D4Gj3*8a;OdgbBFRDuϪ?УG-VhYhDS;[:笈?A zp/<e_e%x6f=sx~~j6PH^f~ ۻ)HNB^x/ZoqR'2uj1Wbou Wdew 36P[Iik~ℚ*Ne 6%ݵFĝjo_7GV^{?7ر^ƬxPƆ -uG<^e38 |f6*p:z*[߷r`N 4TGUzpP^p{'@ӻ {w›G^ Rj_ GRRE}4[C Fǧc7(hn01:5)o֯K^@LZ4N C#<{Ӣ$ǯG,Ca;bzkOBs`2eKҪDCNBf:ס.}p/X:ݫ6Xw QV@PՖtt1ِ9봕#d]}OS}Fo&wr!ɐDjO[^pqxq䷥;+<'ak8.ϮAb>Xi*`]0E }ܠN1`]z! lϡ 'M &yy?$xZS_5`h H"Ϛxܠ" Nrs_hŽ ȒH{ U%Qt7ܧ6pm5[HC9wo)9 hBat>Y&~wX3Rv7ˢla *a*Ezy5.e/v .7]XK,F*YN׎Ӌ cBbZUŠV^Y⿶jl(KbUf?\fyJx%ύgvtlF{6at{Lfͫ#yESRƅC仌"{tCW#?;Qs'z &{Kve, DajSפ$o|S*F2r`5^cy`:6kus`7hbUIJ ؀8=ǡG\nH{Z3CMh< } ^efʩ:\r8XZכSfo5dĒstϹ%y(Y;i/ wU!A$-,=ԃxi^_/J] Xh4jռ xyl+ G\6$v4`Z13ЭH"33"N{rBR\e7/(qÐg<m[fͥ683$Q*SYKvAzKeo/#1V c o[u^7Υ:09;VuU^qX8e%%3B*1]]Cu?+@/E. iW ^*/ YV<2êG/'e<"`mឯFʅ*;_LZdu]@ೄȞ'mknfEg>蒱НN4 8dFċD6| EASP8<  X愢P=p̓ tM(90;\\r"Zݗ}Yi&k'݊%/#, $ؚFz4s҅xϕ-,S^fVۂ{M (DI8?J& a~fyҚ>RA{u?3hѯq p|Y&wbgKE/`WTnٯm^zWf]_9gpAxO-㩘e lR>hdc@*EvF|KD=%v=P/S #nᔑHƹ^|ְ|w@t*t-g冾1f(#(C3%kwEk0wRy+јo9}pk"SYюR;($a.ųHg=fOH(b`]2 sS\# rӅ _UG1i|Pg)~šBh4a0ybF 9Hwd~"뛯0L%Q~]&c_!j# yK(AH'ZRSW؃DO)c{6Kď %@j 5ķjU Z$T-\]y0ΒUBF݈Y(Vag\KܕV站V{PgW|n+5#%ƿd6lM+r3FKZ2{G&H <ӞB?>" Y,}-HS̾h/N}5l)/6E7tHA ) I|Dwڇa 70Sq eP SL U4-b\p0 H a“d~)D8A;ſ&HIU9؉Q\!{uG^NGdBet']fbIdv6#>(JsyOfNhk"P}іQ 42|!t-v@1XF%]b;Yύ%Sr*E;XhQ eTobI7-Z܏O!2ۇ|QU nWZ2S]Y86 rU M.;>8oDhY䃫2pQSK`kܼ=;+Z'ִ]QYngc"WYc I>=O`xﵰjر04l/Ӗ3<VemvMu+(2]I &}hXh&S~{!J~q=H]auEl[l~Z] j`-a@-l]ڟ*$Jh #^9:`C(riaY)j:]."9UĊ}vrM =}ŚQmWNߛ3<Tu?u#/a*+(b =~ ،×Sui6]q;#G=~I~P9F|mc(= t`ɚ1yrl2R)Ɇ$/u%)>y2O4VϘpCOؚbux 2E>%\!wG;Gr:/Xt-Sד2,hMVyi}L$#`~ǀm%^P!6jO_wnir@Ý:=k1ܓabn[TEf\9n {x\'66݅6ƨٲ(d 4fWCN(mz 6Չ-`=ęj@3,׹BKy.8y7IWf_9UUJ?wc;کԐa˟;gtL]WĞԳ'!ϕ$wvPZ_l֎RTb%,5[ ԡklk4,puR*Wc6,ϫRlzwxdˀWj".Bv.G/+1bƗyi/H2܎|= Pf=iKPǞg[cBbO R̍s':ŏD)fݾz61O~J3ϯ{wi7J 3~!\仓(1uFhv,f:W]\ j*kQ-|m^vѠ*A.k_bJlkf/R>8ـ c6 +9(.?w&lYT}1K Z)^Cp1j:%?izP?V!sUVR@\= W-'?>+V"W R}fzkY.ǦE}9Sq<) 3Ϻ1)E-]4t[u{ldp0;de@ql!;¶vw¶֢w&b߹*>ĭ*_uYv t*ׂ~yܡ<7"?چ p:VTX+pD* 8.Op9ELC2sd`[ba~`ׇb%'ˣ뵭R}鯶 w8,2=p(ҡfX:' RƇ=_sMS  GϨw٬#QmʉlC,f!`4€4} KA5 P*Ub?o, 4!8׍|_ w~ fNrwscC}lB9NaIћS'TVmXB#Z;ٛweQyog٧5H cH]uo@18{# !5{^-ЎƖݞe(`%k%jRm+9ǎ""n!t&J"˧~bܴ͔s}^93nԶ%' <23ƽx'.\ۘRNl=ڤt,Їy} YD>9̛OCF%Pd>/VX-dQB!Z߇I)G.ޜ+P$x~њM%}}Ԥ`](X[ki̿(\L7GLuuj,:X HԦ Xү4 Vt^_c-y uW@ĸGũ~t ٴ~R7ZHYzJ!_, bAi)3_#ePq([d2s/F`aRj"on2mDg+cF6 endstream endobj 3181 0 obj << /Length1 1589 /Length2 8861 /Length3 0 /Length 9900 /Filter /FlateDecode >> stream xڍT6L7RCt5CCt4HHtw#Htww{s9Y{qSkIXA-@PS ,aƠ@1uA.`(DR. I& =٩@!E7_K@)/C0@+lc {:_&Kfw#l T0[Ӊ@ yWW00;ѕb# l W; `*Wem[_r-5<  듇 x: PsA2Vˀwo\\@`g% Cl`@MV c!V ';x29 +>wy.`'++wvcN|An' fҀg "CN(z&>0Ct!C6|o<KQlE$5TJ1EXM)sr+U g̪x}:d5n{=<{fd'ouj9 5%#(Wh?!J?Bp2TlG+VOFd+F" f[4i!hw[@ y %^cTt9c+/ZyRϰL%bMUx%0e>[,8cW="wGp<`mQ"hΓ駌OA0֧ f$D 6xt}Q$}^eFm&ْW CxF1# %nyOdݤl(!=3A5Rf1L`b ( NN>Ya_ai,"Q%&GP{~B9X'^$Q}€Y&dW_cH`E2$W _ڮ+2[rH!cߍ RC"D nj}ZtU7wGSba>+8јF 'kȅ\&O23$[ΰ5wec57Ssȼ{;S_@3:)N#g4*fʧaI GMmZZ*hb?O0BÃdp#\kD7^Hy,$bw4tySj~-R{_'g/|0=mYGS8h$?_+xf2!ZW9ULv'E'1bRP3u {\%8rW4'a"8ZVPZn^NYӰix8)%}w?>%iFRc*X3ˇQTW/}\YmܫyZK#}EK2ٮ>E/WƁgAiyz\>9\D*{a2GGZLȶ&?OREULg} C;[:s.q>L;._{ e߁zUqH(Sܞ'*t`{U'#(njӋ/x݊eC:[הVsHEB=w"L]~Zo䆜\ GSc&1=Ӛcqlz롁J ݱnQlC`_e^..G]? 8­q _!V(dV͸;CtD/wTr'exWܟ1[1Uxa^o'V8D = ſŧ7=$V{ ΡL$[\3-0Rig9㉝9J4zrsm.1&ƕ']7Qv?.Q߁P|VM|WⳀk{^oe}A$i.;D9q<.?.iE^d˂v+ Kz36PO%Lۅ u;"os_{b 왾- Ю+ ;t3<3qX,2EJۢo/'_)\٨)<)G#0\3ǿk0^+&/K|UU]v,LqB҉f4.V Or 7^~ LF4 ~ZE 犢ۖ z-\rň'?ƒPh2]DzԀKaH:ep'hZzWı[H]Cǯ>aop=˅>PJzZK}k!>_@I;cP,^똑Q-݉F=] p-'y5uv*OYEVFc&-7Wv.S?3"Aҽw?kP֡zf8G8!"96!?T!n^>zcS|g"_#TIyvDs M{_@]th|SK!LpQXe&6Ϊh/O*}h<چl!Ȫ - k4R!ha1vc= <e_v.?~qjl#kŭKv o^#Xs# wQQ #=LL33p)'+Ggזohf }5/{/q* Nm:5cahwգ d_#Uʔg՝)>)OiJ4XLȔMBc.m֟xՄ:)ޭUl\ͬO=z!'_'goi(!Po$\lXArr<,Awa*.i2dc >2<ŭ۬9/ke3WeT>gKDŽ8UGS1IQ8=8r ҼƒDafY\?>l6nHMHrgҘRErwI:]/# 2WQ,RO'uѥôo$n!L>; '^F q]U*璉^a«_&Z&69Lnnc e]k3yKUY놖"Vݒ% d} c[j)$Tʧ/ҳ+}9fF4ql$ bBsK E1T^'ev=eS"KH1J9Ҟ垽gc4I h"OSerܥ=FF{2R^4.4)*d@^eū;xR:9 pvd G?y0QzU_IPNd~9wa*Ų9#-`I}45Lf} 7JVW'C!C>vY5spA7<"]ι%5f]~M6RGvs _IV=< ( "?:%0xOSpB>)RR˃c zj?ŗ#Xq!'|QrHCY^KdW(ȼ@,v,$D~`{q !{g}\!QNuoVKPuY7;Yrě2=5'Q%[9v>eQs &G[J#pWӯ/' Y3ioNC[BKCKEv5_╉[-"p (yO݃7Q7ge|,Sjy IWzǼ UCJ[#e$/xTCݪ6Q%y+.ခ,__w{b ޮ+"xϑ>Pi7uC%/[̞8_$Ef6?">:|IK6%PbEpTF^碻.|g8c QnuA9u<6ds1>?oc5n;mAo?S)iЬnvb,nsn:R6|v^ʛq Z fdm%݉;Yh✃W+{|0.B o\:vp0GBBB2w$4M(=(‚CX<5YhPAs^5l !8Ņ={~JR$zMwD#f%HYywo4 ?<2*Uަ_y(UZ8Lt˜ZIJ2J|{zrG͗Oq&@x ݯKn&}@X[_rEm'H'0꧰O2oUW|@vI ^)!6GiT%6@)ҳeMSy,m=ZQn*u?F3 La:d?#03{.레aݰñ%F (ÎIN0͗vZȩ]sSrfAdm1&gXYe2HwF*gz^A #}Ǎ?0rksc*yUF⊇q?KF.5<.mnS#+%,7Rcxk]UD~:Hef#3n䌂>.c^J`BCNnivgnCs?H5 W |> g7iGu{plNĵl̫pFǼ4 ]}Mm%nv2_[v1<=`gpױVn*Nֱ>{xxG<o6B}NmΓR y"5;CBil[~_g~;^8&+-ZNᠨO<)O1h퍐%8ݰWnaP{S Eg;i4nw>{ՋZ9zU P<5񛥖H[_gަoV>ùkKF93G(IRj\紿1'Ę`R}WskHbuGu!Y)'@AghXu`@2wgrU lŞ-mkqzYڞra$8l\Kp8pЎҳRh3gn)xݹ?t+F\H?y0cӨl;)} V'dP3$()!mn%J^;7Tg6;2ZZ"?21^z`AlH&eQpaռu5>1WXn!d[qYH_1UQ6Q_T?ܣhׄcjr葙EeݧS-(n&|dЦ̷d-«drWT[/ogy6PEb[{;+'F*;NZ+pb9ɸ LLiR(d!<ɞF(u?gebO,wٷuCjnc:CS]ԙG.?d#?b|e%2+lM|ߦ.MXSwW c&ђ tՈRoefݡ3&Q 'P(^8Cg4[EPoçFز~<"uaٜU#RMF(HrT9.KZɎ2Ȧ r3Ou?~.(dҍSǦ1DOԉHˬ Ņ|ê{cQKT_g:*g%S#gޫi%yVD- cD0@}1LhLZW_vv9b6gm{YQ cni`C .cFgqӜ\q?kji<2+)Zx culwqA}hKfgvsP(/5 7})㤧͋+\+j* e5HSYq_KbRXБO~ޙ0/u[ Sc 05N!8>e>:d *%OҎi(g*Pm U6*6GE`Q~DD [53á{wiJmp"QTYyKr:cʁÚ k*;:ZRÁ(S Y3Aؤ`XEwWo8#$W¤r3FnabZfقc_ L^OAܽ {,| ,_)Jwlh AMj}IQl6T\>A;@dي E-Fnrؤ\K{Q{MFSq Jo?&Ĕ܏ -\?ì}޼Oj4^(`!wGm|2V+?)kp,ND5SpLiyox@Ntf VSe? W q5o"[Z?`^C66VqE uyy^m5D- 8X uıE'P/h[3f |@+l&&lj딚i@Ұ~W Eģ&@D#H6" 0#1jn*c(,VLOȋPl0vM1 V F&C0)DFmmY<=V>h$F1̫iT4h!6k7nR.i>[Bli_)D3jU[Yj([rrӨes5lZcQmдer--g!8o!l\7/<%?W;tte/q;0j罵{Ao hh^$4UCVt]QH6,FZMخl"rQoҮ ~K}+vm'~o0YJZqw-W*EL?+:ZHFy_#;3 endstream endobj 3139 0 obj << /Type /ObjStm /N 100 /First 1008 /Length 3499 /Filter /FlateDecode >> stream x[n}W1D^R9&rֵqfFϩboR}1 Q5lkeӲ*DU! =YADtH."{DR/qDS;"q$MdYhERB{E<:L:ZZMB'rB@sF1| lVR d%L%kab$& X^A4+Xik`d vG~hH"VD1DY% ,/关g\y(TiiZeciJi+Cs5lIJvx]Ax0tH`n(Fa@`|& dA%Z"xR6A"0L!iEdpeDdUm.IĨyIW`5;,9#\<N\ZËJT)3pXx!D+Zd `F}D&G!AnskuiN P"ư1:rdXL3xm+ I1i(2$g/Y۷wk!-7;r ~r|aG]+Z!)7;E}M6_8*+:*o /R|!dU U#vVʥq89ui4>b*[;H<恴)WHd-h8 RUdG4f`BzWe; ?np8z&LZ M5$bI44ZggT҃\*Na*W=$=֙teQ_tx!UO$\ -j"&&1{ݮ 0- 9Mwͦ 1Q5x̴e**?;H*NjNњG}ݴ<ç85P_`,]!kymgb9Bk )5GR[f*HdE\iKOdGs4Ȯ=M8Z{H4eO^^(T仅W&/#he@^B @S:С85Ѭ*Kb2]F8n-/fՏ+`5ۯ v,i-[  DyRmt}zǴ618RG G[f?|6XvicvMR(мv.m(3@ŹĹoW^6m xuAN@ii}mL\Rmt"]jZ^$=xV>}Y\p[zgEY8:I%X-voIeya<˶̆!"鶼iwU>('c/.|"6zZBGnO)0r}Dwq(wLJŽ$zvKGѝw'M}Ҏ~>єw;]ثsK> czpU:šDt9\i.|2ŵ*?uoߢ endstream endobj 3183 0 obj << /Length1 1732 /Length2 9588 /Length3 0 /Length 10681 /Filter /FlateDecode >> stream xڍvuTk.% CIwtw7HC 1ttw#Hw() !"=;fy~vGG*d PVN6!' N A9!Bp$Af' q(8|BB.!B)370P8\P$!`+kS0X08Y~A` 3dT 5(ffqad bfg86T:5/&n <  W T)Pu9EVxl;W"`3 ' ` TeؠPof33"n #0{ ],P6ݯ)y:hi$uA՟dt\_l vZȮvrKz2kAO r<,tvr2?qX>[~P]@+O#TNNlf2,O*p{ 9D ΀;/]ISJ@qKH@<ެ\V.nn'?O߉7G% WO{\*' ݈[C_bCۓo(l7I®ЧuP<-RuAm2v_䧓r>|_uݖSߋt unbMۖ*qRw֭.>GWJh; 6/*DIy.ԆE* aCHm%ZِppqIj_@f;""J}'+wLUzO'"9'6uRE$(-(GQݝa$}]UO]qjMMh*B{ Zny+LT,*9G~v[VE6\39%?Zag~u/Idf>]G;N1AOAt<(` oRD;x);W!y򴡒V{r͍ėv[2|MQ煉Z :;G gRfdG>c Ck3x~2Z-fIsBn?:˶+ @=P$wGН(w!6U% ]њ9ؖϫp4D]Skl[{syS!oNƲо`7g##dNٹ)Ѧe`r<SQ1]aZu=n!q|@`qYs濕Z]'Y^VXR 31+A53W2 ѶIQ VC  +㔟S*Wn-].|j`ovE_zdFi$uܒwă劁հDn5! IC UNe^AQf:dWE ;¥@q.&)6l"V- -]3x3,цN^aQ.4iyF_#1 'K =~+tLIfx :LBǂhppt= M;ɎIWl'W>ߑİfMD$v*첻]<(+wx95qfc4tnֽDk+fڒ¡;N 0-d8uϩ_ FD7z.E`hs\n;ǶP-S>4?dMZه#pIɛ00_29N S"; %wZl5MMDw3o(rꎧ{%R;y_xlu1 l|NnjjX^#Ҁ tO~W f-\3Lc&ۓX-tU慣fDn7,xL7Ī9æ\ѩBNk<W=:yYߛ{v 1:/*c{)`U-*s@$5Yh'*3C3*X;Zهpxg?ޮ/ӑ+LjkO;-ErR?BUOs#[R4`a >,@U!XQ8=_|nW5;:FFÔ3ܖs&B"'%\վk.2+H֡ZqLpq7e)'\C;}鵆yXzCKpY{49Q|ܓ󎔻A,AF0Y4wJGEظHמ4c l0%iLkG7=o{zvfOXছ9ۻ_6l";jڷKi e-mHeR)XY Xn(j0b@j &NIl⿝e 9J8 a=d\D 7/qGǀ,xO)jdžl›7[n=Yx1o5>>&s pi+|_ ,鐇ck#'zf%Ҹ́Q8l$Y*y珛j5.޼<.lfF̙ˋ^2 a'*Usx\~;1g EKͅ"G厇Kpq}6)M O 48[$1)m}Ej ֽv1ƻ,K6 X{JA; Sꡂ0lh5AfqB%2d 6bjQ"3Wއ'e%tx:S(r'`}]<ʋ 6DQ7IC`옐-L'cU S-VNI}.M< K`yǾ=E΍E 1Qߝ7bli]ˌ@}|kS*c`-b%+':Z'Qt41?}qЍnLsͲ3uV3Ѭ{ޫHӐ&p ͥYB}Xx6DnCjxIfὗ/*<E 1x*>KH$z=^-94XD 4~zg*$> M,=uz_t080J!$Խlx(otx \$+xӛAfs-_.7?0Mc $g6^]  g:_&*Y_5> yP\!QʧJ #a4W, PCZ49*~LؾɚNǺŭ AA٢J;k6հ"MGOЅa>ڒ<竝Mֽ9@;LMMvTF6|op 4+U` lkO=կӺ]s6ZSyQ3PV)ҰX8B6f6G[ S\@Y˙p,`eUd wdOG Q/΂tUU& $gx鬱 E#ӵ+x~t;st/B{V77YwkEi٪a0>JRr҈ My)pdr{*#*k|C?LY͎9 D"y +*1l&-?@a"Tnr F$?Jwp0hʇ:E³ K[%#\/`6(P_1H[[yYi+p]ӈIimV?<9?kYq2$.*F mĤw"t܃O$(ks߾i8S]3)T21?LcmmӴt3O>U<չAo#S# Βn9'̤ʗpngv%+ N m0{M!u7P&VbԄt[S-%ӾJ&"oAiR+_ӵifGŽpMLŠk9Q{5)70ܭGY8jЗoǺ]xsƨȻt7o{5>TGZTz|pXZcD ]x\j"S "?C,qo#>xVk4 t KLǫ giq$ZEWPNNɲ]#F鄜+zC TyGnk?TD92ĻhUT>ܓh,:~C4+ Q!CD]/j1Vϐo6 {$|;&p+;z/azkK9b;|Y#hl<~iӓ_!Bٶs@w#•C/~ ؝(Mտ*_a'FPӝ6@1ùor8i,̎ Wvrf, > Aȃ9g#߹~@}RpҜ01KTrOP5>CzkFTH*)%qy%yRάTE=f_;O&85챚tue#OjŀR8Ʋ/{^a ['jXJbEXxa;T4jVDf *Kޒb{#:5+BB 6bvMg-ic\5cl#+wnQY|Lk649ԙ~vZɒTS"NΔTP.#X~gWbSKh̸Dh=:p*cx'eǶgR Bʈ{|7щY?{9,g;wajF<+Fz.= #nZU:DB'Z6:\ M'sGsM۔3)p~p5P}(N=f@qV(xxwҘJD*n.=PAo\۞%~:t7zוL<]o gP X`i% Gjy0޿8 %P6SS㯊VWlqP؎Ó#X^+KA-D_Oyd,_ΩfLy{:ƞ @?4S"ë&SN4W^-ucC6v}^/.E07o BLxZygtW ;ewWvmg1L6banZ̙Ђ裃lѴ0:C5=z`"?8l.@_gzHB96_e'V#H$(se\ᮊ_:q/'(1/Xc6BDRb%v[[Z A"ٺ 6C^^w41.(58C NѨ &᭖ICwJ %92HΪ *'Y7oLNcքKQN- xyQPĽ:PL/ain $3sת' [W{ŖjΜꠠ(yU6:r -ow%H2_qoW9}{l=%*33i^~%m+lfz!df䠍eE]۵1]y9i /WFA=&,7CeK(`= ~LSw?@bs嬙#n;͈hn==Qd̘lܰbayqtkr?uhځ[c=8,D^sw6g^O(όPڱ2lbG%'D`XG^ۭ y> DHn~0w_aezԘ=ƨUXh?iJi?l>zq`g ` "@hwDl!toQd7y͚^g?5TmsI&x|!(67aNp}F]1K"Q@h[mVJ oH_em,yI ^Iiȉ9au,4kh wy0?Ȝ,QF^s5 & N`\) yM]^IAqaظ=aUe_1:&("Bե`̺XauB;|[Nkբ/|~KUUeM9CFv|Ϙ6.^,h[>NU•2)PԵ:CbKf)7)mΑ%qG͞Lv,Kmdnims[a&_ߨa{Œ8GNBg*YH~H!6GYW蒴!0'>Tޝa) .}qQѤʹ-Mj Ni[DhF8Vkx Ҷ&煈?88:EmP;}D˺~rlA*qJ؟/-#IԾ%Q䷬ iv$S6nݺBޖM {ܡ~Y^(gtrHw9EB@F)r_&sjV K8O~r,|4;w.Wh E\ⶺfv~,5~U?5c$ 70JN5e ĻY,OUڰ㌔8E7pOR,JqQ~SiͮNIkәv=Lw{?Əqe;SU3X G(gY6ԃL|x(s.9UaM/m<ȇVQĭRÒ _epK~9oI9|H?' ~hm&1CH)1ܤbxz2 -NǓm i ѽ_![EoᢸW J6'˝!t^=EZw# ;$KR~6]&2/qe$6‚jdfGlzMYgsƗvo'C*+(4PŨa ' V/y?d@=ET"$$HP aQ{ ^mjSWbvut)o.qEGe,y][l}01mo*9ӓN]V}F#v="Nɭlly?N^?f(S$3RhjEGG:g}Qo?!kZ5 ?gX>{M=^ZAnՃy= 8}d7Tz~-x_ѽh^~y k2zn-e7;S;>»5꾏zkBQg;3(x1Ls_?0du ]cJꖈFZ-M#p"w o[ kb|[xvsyDrXq~l>#XJ Ck|A#}DnEH C ;!wQVZg8La@ FRP52Z.DX'oVELȄH)Їx 'R9j'-6$8K c~}`+%JVaI̒+[Uߎ`|\j6&XՏ|xm2vJ@a]>a}?.9zFq_zy˿0ɂ>Xj9enBJio `X*9RծQ1.⪽<\ ,?4A:!OKwo $D9Y1GֱȿRop ȠPtA~0Hk}B$q:-(Gb\0|6L~qg2)fk_Z="sh%&uܹgU$|hF]7^';3٦߱G(Éfjr,Ў8/ʢ&_y]'tLkCHYց~?7!4׸D[ccLM iv$G2)AgLdҍ(uohO9D"8ԯ:IVULr**3\E~T}>tdn?+t}kӶԓijm C_%H!i2yQQCyyAQ*kz' w;:M2d9š=ZtUL(0?Eavb!rE'ub@Y=шTVcVd(ּ+w*KY߫( Ԕ̝K3(++.Iw6C`- ڜX o -bA-c7- _z옥F-1uٰHL&bkre˰ӝ/$ Bm hW wΪv^er2lx bߣtyH5P&GF֚Z0GfF[@ܩ(g`o<*"{9+Ԣg-qKJxGb@Sb>2t'DQKpF]'(?*}[z o7'!D[Ypfh+LRH^DGz#>~N~A:rE SLcYk=6x;. &谘fx2g H qzY "I*yUn2YDyIȿa}[|Q{%E;+> stream xڍxT6"H-  3 ) 4ҭtIH{y}k֚y}_w}]{f 2@!1B@Y( b$\\p ꎆPu0Xꡐ{8@TRVTJ2Q5'C!h.U; #Pv $@qb+A b|&+"% rE ^p{B!_#A? pL&( ` 8DcC<;[` 0p" Qn P0#!! yu@CNg>4A _3Jfu$D Eb$SC}s.H ~p1Cz@`&PFRRB}zD~0qv6cgsC`1pAyBwh:"@` G;; ƞ;` Oד ao#Pgj-g9UTP?!1$ *** 3!FP-{Ke.o?J73X+JH Ap PX- jKzPV HG,De5P!v5~ GB Qh+2 AcjuՑ`$$ ww + (Vo2D( 61C:XM&P3+T{[P7L27˅9 kVfZ&\ZNꍒpq?}*~T]%2{PR?#]bF4ęjijck"ɂ~qzG}5xԢ$sXֲLlJv~ʩU9L?Guӳk;~MKέtqbnݼ(*f*\E6 a1gw^-(|^ny+ym+ŹJ7`ٞ۳ب-qʜ_]S3ύ 47lД$3;o.NoJ5cJ6\9herB3&T ࣅkjF)kVou}%Mpp?#d_ss'ްpb5|(5,Ўу<ؓq'yʵQ)v߱cI='u[!àl?GX!!^Ec]uHؽ+ܝ`7ۭzeU<2/eIN@c!bHa'XBQg`ךqS U7Món4-5,"}x!= ?|4|료icY-D0RqDUUԻKCC+U;/KQZ~$ ;8%YdVxR?&I> `(XդHVz$a{(m^+ k0E6ՑU&7&ïid9fKZ_FƊJt}sh1J]d M:$'qNyJf(Nj .3ɥYϳ~>825b;~|dC%H_kD7sIXYd7] .Wύ.po^zD(KeHS-x"2LW_f׌q؈ E (M 94󞷨%cIQǽ5׷;#~3w͌3TД -LOkS/̐:6Ew|RfIB*DlAg']ÏPfwjMȇچ9 ajQ|]507tܿYAUvqIy-M;Q3uoc+` 7{:p\#o]hI9upYgוw+;}7z;  ?}L3wכo<]f|XQu18`uK5_u(@̣b+S>)(*=3o낄ӯvkg!t7 !Q'mGc$"B'J[L W}`)0):qX^@̌2iV.z *0 yU .q0^/XCnIrs//9YL Visz'S%q<`%܍wFz_<=`gګ3W&&p7g `7vb5",ͺetrޒ6ucqK{sj{AdO28X*pIo=v)@\|Gkvūy4_ؼ"mgNۅutqᴹ[E5lUŷHS::.s¨YFF4r g,;4ƥ~L)S%u"wi,pՉ;ՙKzj z7J_ ?C k#]X#bR1WFܡQIs^Jm*{y2fb6#l 7zɻR.P1@}3>h97WLBfw J`>J24)).~-n\9UtwvjQZ< *&(p8s ō%l[T|5S߲ o鵐׆=nyYoiƩم!GHD@yۄUTFXΛzF 03g9ɼJEWOmn(kU>[buM_ik 7d$$yƩQ>MKmȜIgi3"|kHWJ$YάS#:&|A UCSz w'Rb/~+NiZi`|"h>AIՊ t'%HSw乼y`ᗭ7(8T櫬-筄pt90[Iף-i M_Do4?㝙٬U&ɏ[q$Q:&=H#_젊Ȗˬ^i-J<|6oE7w740[ =q3 < JP TP6V|}*Skɬ.\I&2͋Utw\1#졔x4ۿ:3QGͲYܧ;dUzK %ٗ䗽,^#w7 f\Ʌcǽ]=PN&8ꑖ.nt`T w (HEq#dN, Ɛ'׵56e0) &f#>rg1UWOR .\ Jq,xB_gSu5+~5 8/g)#H3n33}IXBdԥj3 ~6G9"7PB<[FZr9`P1̑PDq6Y9zɑ1Y%&'vwp?DN(ޠ4Yk' Pd+gv<;B$9_/هBrgLT_c촆gSpyjunGpZ>g KWYhvMJ/C0ESEVǻ5?G\,d`iʱqLdCϖ|粈n⺍ikI<8+jZY ҏ\DZIp+GOUhBܻ:Tk{N7K q\w2OO7r&Oc|/ZL6@bp-̫n,Zî(=6a>` LW΍C <#墉ޛR ^nˮ= q[R_R$jΕ*Wu+-QAFUuO ӽ(b hZ"&{0 gOK|x áԌR9aO!{JbHqǎ)#칃YD'IUIWj:lDo"aYJ^6".G_l)=+dyNT4]$%nڴm8Y5,_Ѥ)N|hł˔Sg{p%y è5oU>J?͖K[KvxGArHT Xkw#=cП]aA; Cws۩ʔ|SB~(K(nߊ2%>RqK\i2j)Cd95פkL=P!x3^GڨD~L<5=19b q3X{]qSރ$]$q!3W.DL[\|i!a :Ϲ KɈCKF>m~L9*\lJ^EG+|oٜx€hdN#gWw |)VܗKfgGi?JQX̨;x{#,^҈IV|LfB o2m$nP7e`ı`p̽Qӳ$EeWҵI2f9^`{B *diy[mBUsqbmyR4)~AW# 5IDcMF5Q٤|ٺdܢH%>iT`&;S-V8"AM;URJqb𸄒`~a[($t_Y\x> stream xڍP.[CHp-.+Z\ Bqw[Ѣۣ{o&3'LtZ6+#USsa01aN1 @P0E Yw$ž !.'/?  !"9'PLWw=)ϿVk6  w5ك2Zk0_!Xa0Wnn///.3 n': (d2@ 5. &=Bb O'5br9;} _bc Wn}HY'dv @GOr'q-~! }j=`A //l X.$<яl .N>1k2jo / ^<;O*BtO* lyb.X?}?/?%Vo v≹-P<^]u 06H=1WGo9hao}s PɋtOKf@ CWb{@Y?!AVڀ"3{r<c 7o$ 7] mn?(NO,v>Aܰ?S|OO|O|uO_4;d1? sk,McO$ pSs[;DV?/vN}j+z`ш|?-Vdj@fflbcGrبu&5Fvc:sWQ'h\,*?BW̯2UғSʌу$j봞!>ޅRxZYINy۷!g-aXú Yʛ'J'q:vJ}=oVѥ?z[>k+3W/RYVH(=03#ZD4%k2c(^Kow}(6=!z#H'CìrJ? W 7f! دaEapq-w wS?A">\/.l ioPbT Fg* +QgqYv}dyMʏ9dye2Fb.l;yߴA5iV#E{W)01Zj6!,`,-ܚ#\S_Tݶs3p =qktڏ p;h|p'ezZT{UӔo>oU0.^jeEp2_AԌH3հ_sU*m%4P9TYΑv3D"nE <"rcVi#OgqZH.F\=@F}Q|z1pS S$IoQ1+ oa$xԠ "mi+\>b`aY[mozkI +1L< r?V#~/`&p_eg}2 ?4MۢggdJֹo9hRF=6G. e{AƄL|)#.ob 4Ӿ[ol>؝v +3fZIr3d %P&Ya&O=s , udB݄n`yIEsTQfi7w$~Wc] ) izcc190,$5Yx/::'_)TrOx3gI{?nvcb]ؔUԗ,8zV:Q`4aRĎR.= X}/LP/옱%`4P, /C6K[xM1%=sAxI`Q*L3Gz3cCnf xs9m5;[jd2{VT3z hxz";v1} Ip`К$U Qq46VIHj3NڒZ(2("z).; ?!xN@c6Z&6Aey稉·unhCڜ#w SrOL?Hн\nVҮFM6YG[d^B 6$gU>> YR>w͒>/"T0DܵOyra_߱ؐoFG̱@BϮHmWXмv箊US_0Ur3W#{E)<&fl$hbMWi[G.7rY'$CFjH\^``DwK8NK;q R e6 jyňHRP3!dZ|H5B*NAa.UU7O` 헒`r7l(w|Ácml*MQ*|u{|̸x6X@YxLԿD޼k_Q`wsO!.yFRz f# L @r궏9m>[ 6~)qkFcQX=hi%ԭ&áEq DڛK0=qrC{nPkk i =FfEx)pQ2̇˒)>L/}΁JӖ.op1bW 3Y`hwۣTϬzQɄ4j*-a̼ߎ-0 2$iNI?.&;WQKȖIBl<|C/XnmM[b:1uj~ fvJMW[SA;[t/ì<`n$iʮ*BbF|I"893iT_-FLʂtvc LT=/A]J\پعcKm(bͺPa"Q"QIX{yǝOtĤ4fddAE?#]X~^7pclQfID4a78kH#>5^6"8U"b> 6?"sX ]+ekYi\-i#{ ِ͎w ts/0t WoP܂^7\r pgZ~I3l4Y l2{7n_M#tWy\8^~LۦEpS@\po9 /]'>7R&1›|1ܢY琥aIRoҡZ#@k"4%.I5[.w],|_eĒ;*^LnAT3$#"Ao,PU#  Z<̋n"vc`gvGw!C˩Ž~"22=#含d(n,!/hGlK?v9Mj#cGRrf֣.*@:evhPgd4#LSŬD 6~%&{'\+qfM鲲+X3PPbNf ;DzlC@m ]tVgwIKrM2h'>0q_3OME$;'*L3(uz%^޺ + z4S$\*O,t9Y2AӑIFesq?㬟@՘F?_>07x{A?shViUtf"]-W)~|۷ 'U{_2_ 7Byhqw 2IMo ЖܫWpKF EKOIlTZ|pbF}-,4q2>֐HLD'y8wL#trqOE*ðy~Xcд@zRJ2ZSfٺJeEv{ԤbHDcd$^/—Ma52*-V$5u{E ˬSɿ̤ڨ[jÏMnc<{TJRx6Xf|OTlm Ȝ|;Ƽ+zBǥ8". K3PMB-T`K z&΍T>O zn[|ec3',^B_K3w`#y[G&qNvZH}_*/~K>'*L0ą#_ȌR6Ef`FHTC@]rgwoQ "bd1eÚ?M-u.};P4KMQĹon==2I-[Ң!%.;VYx9s4 oyƉ='qmptIfs  \{ui09uB*=- [ww30*u~;uVJ#kK3z<%׽PE|nCBu0.4ih#>: aҘ@Hyr=;gKEWSԤ0 6̖ Ӎ,VR/J+3 ;eTߦx6IiJ A 9믴KuXVԏH1[:Hg8V8l~uz=AX>i&Sz|sH=fQ ^5(MXs"VHe#s`Àr*\h1HCAJ͟%mDbgm1PjDaݮDl{Mqw⣇͟ 1Γ ~sV([D8<|FyHd˳R!֦O] }/J hpcM0ݭT >uޚ YB(¢eVCX<^/J7F\ع~̎v0Pl8B%=ƲF^JB>$Nc=yuu;SIDO7bh 0rc+6z;kYpZ;%dZ*շT}fKU uƾ#]7Jmj[j%i8"ڙ"5.C2%@I ,8ͼ%3& FfX{N6 ZMIe ⥕rܾb͊$ %0c*ݵ5E5Pã+Z?\Rի]<ԝaL=*x̾'_4~bD`Y2?G j}MiZ<W9+\ݜdjL[}ɶݖ#(RI6G/҅ {eLBRR[U~ԑ9i^ƸG 89h]vȎA1jY#[i&)W8Z;~-ӔnjQY{a-M;P _'g{[6er[ܠi ggp.m#6(m:fw U*քvZ)P'UPP )%R`KC^ ߈Cex]be~-츐9w R ZEێGDN7t'9SvIREܧ4pbWȩ=4ksV.Z}>ؾ"UDAZdaDa(9E]^LMQ( %a\ͭLOCͯԋK9nCT7? ,s;Tb6a?zf#)ՠ|5 @3 $bkK:c2^즿RZGR62SᣴAm܉4a.u#"QMIN1{Kڹ'$tL9(X#M3 efmGb 88K*ͤTFN U8&]~ %k n|bXPfu?dN&þڋL#+Y-[gI"7pVyl3REÚ\rI6灇61$Nw"x8^iaIFx59+E|.nw~`m:-7ŎO8c{uKpq ?`dy-^n-~gi}h;RyqNT #;ӓi-xoƚk&V !i1;9چrHuGXĐy$!`1uAШ혅̎mJke"Lj=5C%!5W |Mr"\=>^|?6 > k^\_J9i"~ݔgnnB&: {Z^0iJ&2ڪxjig0NIT[Qf&4)8[BZkn(d"u9AڀE轏}T]18P2[xgeŒ[S2Mj4R"W^e b *V6e7I #EMK땈5Q:}, `QD k_8"^@W"MΘнXP捉U]pv6:-'-Mҝl&Ұ̺cx[~ș% wFV/j!uY/6|r@wUJX6e_mc_l:9ٺUc 1^GcB ) ]av_šo#-ߏ];6n 6<*͑Xwa)\ιsoLu@Zk5N!""V~iAYͼT+׺Lˀg(27>d~j Ize7+U U;yKXF|<"!$LyrN/nnjeP` ^` =X݂|g|_O}׷{0{ Sھ\Y&@Zn H^Hg~aq'%*gfnߠVE ӡskN><-ݳsX2%ez*s rJС2i))LMUce1=i?O+% JhGE/2g+o]VrhɊ!U8; ՞]dm]C^8?VMWk7om",SwP߮C=f4m&lR?A._mFq]ITmC֪.j3`G=װ/)>о8NurMD&([xȋu_%6~1OM~|H:l.=P6WRؚ=|+bO= dD5d]n!.0\voӃM?"q[s [X"Kƽ6ZiOv:ZvHBtjlqq$>냎my^){}6OQl֩r~n,BzL8SGGHޠ;[9yhi;7|LgN ^i֪= ҶJKSVn!^7x-T)=4`Aw^&/JmCafio.y%D#냆k D8GQ] yxJ98U6 K|wv:49e{aAV#(h۔O{ m-^薀On> stream xڌPXN и[pkNp݂33$WuoQ}> QRa67J۹002DUUYl̬.6@'gK{;?4DF. N(ooqX8yYx^m{?ח0 hholUqW#Lΰ?%0GJ:3pFh8*iklh[G'xvS B>ώ>֐2(JwekTs">}aV 96[kYJod%-lfFAbno:r6N+<LH*u(Kxtf-#aNtn ;+PZײutvvכE6ĞC}a{| 2Jk<)zxkPhNfNWp*|4j^;+ȯ9E0B+BCiu_n0/t0@|Hg|27Zh9+L2*YsNe&eDrli^dʜR`K+jlEuٮa^ ه ^e1꨺ J1c J>R%{߮YE+Fq) h!99ZۖwgȌNqfb=>B9Y|z'L]>3w6Gkd!m3mn)5q#7oH@r 6-,2ջLm%z^#6IVe!NݜmA 8TkG~8зZ96Fe%+ Uj ++vyja`ɘ1v'MApSV)i8ʫHg9ޞhzTX EgmӇ+]n'ڔ9ps۟kq*!rB*bi=)U랭(a:S|VE0<#Ɠe=dtg0 ۏ]i{HlkAee&Fԏ,n9OVq$P?9N(3,V~-&Zړ݌>6ڕU$)/g.t1K?Y9ID2< y44=TCat&p_z #euKȒ2^L͙GRT]+`iSх1Cha1p\[r4;GclAgiOv_Fj۝p{մ_yr%v\yVm;vM2|8FMU 4!^Ѽ`t04bt{ I-m1379) "?bD[0O~ۍlڙɱdl9U3V]LKTaP lʫ:Ri+ **;z$*lrIr_Oi.bAO HAP0FQ#yX0'QX癋Ǫ" 6P+ ?@$>FU]?iRLh&_C/85H蛦L-(Ss0~c'Ɍ3o|D6&Y$L6dJjFE %MyL5 >|W*q BЂrI,&99 Z<`$&3W'9'9vcվ.3y{-pX*O6ȾwRmxx $3cbwu & #Nd1iIv%=\ƋVeOOGڤ!HG3nErF}$77I!! mU{kN`岐nc&ḐoR~2Px'B|c[4)bgHV !pgn^qBA &CNkN=(g'0YTNTLC i *gx#pλ?!)cHHWZ{Ȱ27ΖJ4cE^I5BQ]vǯ~¤S.}U뼑 Du%'E={r,ϖf0{9'do r*ݠ/u=m$ Cكs>N(IS{@~}-@ kyrB ==cg/i# ᆲwxt[2DRa%Z;8v-3O wp._|Β\?x^S&\a3tx# n|EqէdQA%r29WҺKѪ;M]ŒszJ$M]jm2 - gS29ALAL {Qw485tV#|ϡU-;-wj Vo˱ x=tt9aNz`/9/r͗LҾ}uV+~4w>'$A^]\mJVU/oSƢ9k%cC`y}wœ^{s$ȪA-esED%gLG"`g0ܽiOjg)˫ۖšZ[e=-h+Bm=^mj3BS >鵍oٺf}|U<gT5nF_hnp @|Ln rG^nV m)9Q).S`GȏF땸ټθnD0DKV< ҺЩC  _刌{GF*Hp߈{‚9GH{`sHX2WquO7eE(=AÔUv₅&m=u t~#*4~=@n48)}Dbx:rURo"K7'u5pqf0ɇ9eA[Liy5 ߆X/Eϱc9 jIw ~WV UPO,C>5 sR KPJQeVE$YUEfNJq"!Iyu^,HfQSRiWYJoҡ[5V=I[&{@LD@չ|M3Kmxeɀ^OJb_Mmh3z kzڇPlQ#%*(8?$lp"ZhP008yFSaa9f9/?4 \XXiQJ-Ɨx)Ѿ/MQYR7%>Qki5Zj0y Ƞ۶_hUn>4T~(UE Xi\]vS0RNJ$QE['h~.:2N/M} =aew7q{BIZȱ͚RVӷ|[4ǿ=eRҩ}?xHt%,Œ%>a"L|OM܃CQpAjir*"0vlX ?So~i|YxΡܕ5*c+4cEPHheSDs#5Jzxoh;s*+b_Qיئc71>)!w)c9al]5}Zϟvv޲3x8 v<2S3@iҔ6Jy.o"e x5g<"ʏrV_[HD*#i*bk q-:?OsnOOlƚ%s_ ;p^gKC 87 QQn_֜ Tk މ5k].EqT ]\؟Qշ4Y08EC{2h-n|sx7ii}8Sf;!9: 5"5.[l/{<o(!gqoꨆsܶ'F;B.$̡4Ft +j0W\-u^aeRF]aFY]]Ũ7lF깲gIkxG>9#K,;2\-)XTTd YǥgBTcU"Ft/@ĵIy{V[薮ZKŧ?Q8#+?F8PF\['fv =tx|K+ONRz6ʗ+ǽt[2Жž@,Ą~-%(;Lh<֧Ji-t [P`@zfhNuiq@Hޙzd`4ʛ)وxxlݍ=+ پJMoM}T S7-ZN׾gK/S-opLʆv*<3"WX=۪ Խٷ AȽO! VçaH%꘶ܤ`bOqnͯØo뼂ΰbf,q=xT?;8HDhD|sLQ53ĵ\89}s1*nA(_@τN;Տ r)9e5 )OZ@>ik EXڤg8>O̷8x {{ |Q^BudM7aӪb\%YHnCWٱ'u'9{+ŰTQ6&D7ޒ8* ۢp#jWsW lv"Ur%>s\wfu4Sp{P_ RE"~. P.ŏN =q@C1qӅW0)lLFjlNت/=t WZH@J ٟd/B2/KLe}d٧qHx 7t.C.6)00ӥԂuBsHXc*qb Xnu;FdyP бSOE|%4Ҡo36mکNix?Jewf.C$Q LM7Nѻ X>Iإou2Q?jhȌg>pjjբ(vk|pǴ/(o].%kAoB hv"P&//xriD K=|9v7(R| Wei/%gx(Ae7"{Dqv'Emf6o CA ̉]I;q"rmwO5Kh3gKٷNe!̪s^T\uk2pXh+k7f5]W0\ 'WuZ7N=r'TXBE gFjg"4?"4]zxä˛/RndzuP:Ňhq-w|`\^lyӡbEÞShƵGRWkJPjՙ< EbV߯[N#/{Hkjm5G}o j7m!.yg]COvAu /ژgO)cwNG"xQWNc' 4kB߶Chz] >}W&uP8ս|cYvN5U{O7nG88]'V?9qJeC`O|Ks?]MR?Z0BAsirY[D(//UEO)>[B=n!bcdɆ WN 66퐙!J(.yBX>Z8H~Q$4SvTUy j'C͌C1|cwLv=% s|Ú4_ġm]WI`\ D%9j>i<2Ӫa _oAs;f|c'4p]OS SWۇԥ kC7\Srx)a02n\` o)y3?#nd؆x 帊{QzIC O(+LbĐ˺G5Ʋ p2Q_>;s" ܁ݾPU.g!"|F_(gՒRțfmEq¤ѹ1ӃCoG'1?d"U~hC2RxSu,ڙ7Mg.i,ץOT:4k&.4 W; ) v pf rHTRP]hljfjd!lj]B[#Xܾ4mRrWnn.{9<.a`?r7k|d̻" o.ClYTzCoFC+=K`cSy$_-.z,Ƞ+ %9xe{eE]gUci ]%ͣ)dP^0ceܺՉj$ ڱL:xl)@%վiMp2{-R2:u\Nי1}[ˈ6 s_JZ Ku#M$*yC}u(v5p,}@҂Ikg,K_nǢooUyڎN׍4[qfy.Nǜv =0À0Dw$ATrqB$}?D>Em} j17 cJ(smUPyZi4F#a²Yq?2ƫ̏?k?W6; =l;K.E#<+=|q34.s%+Q#~-&y\0 XdY/{ 9U)m>vB tC#'4˩f}C{IahөߪsuNEc72簉C`㽀gԥM V1$K* yQ㙎f9|75SzT|E! O%?sջSUfFGهׁRˢNAm1RTun4Pȶ~+Ќ >WA Zr-E^o{#i:wHNvHQo`G04j|xp$o&0z;{ة.t'ͨ,9NN3uQ B _Pɍx)$Nf Vz=YW[Y(4 BO\ {s8/G.$7㴱KF[ {B"0Qi_(–Ô0{~yQ[*A e=`` wYh$FO  fԙ KoCC퟼NoY}oH/{"&J' }W\#Aɂ B[υs1riszr3Q65~8RGfyY'ܭb ۶*JQbe_q54m'nżWBQEfkmn=6K&#jPH 3sy6RsõPA"W1PaQ3`r*Cx8 e'υN!B'$!S>'Z*$k&`<=a O*ӵ Ml@W,*6 f=trFG#"dk/q= V tfUoC5 nWd0=r/D*N"gii,d~Gxw<̶c(7B^e2v*&̫5b>e\a-r1D! sHpJ+UG)LeŇgƻC:^~aTyfsmhrوg"&Ke#ppۈEU9+ߋaug,"7(!OR9GM|}7\N&'ib&?lD%y-ѝ 0>a{U$W,7N&*}&G"ɜp SBH"ǎ_i2oU RI:Oj%簈.g^=4:h}T[/Z{(yOTC|svV:C'Sf \_GiC>dƥӒp;~e ƅuZGXf:3JA7榿 ۂ 3֠3ܞ#ӭpV32Z)I9΅[>1.: R_ڰek4m=u7ԛ&hJ$#Ss֒A,Qkdʤ8O|:tRr*\n>}VDzSq< ȝɣCdg@V`b ~Ur*XXrn=E"m 0r=u?m1=wA? T%͈ÊG-$nSh %H5迓2LuGb \jyxl}!Siږ%A^;i56W0߄VY)JjV홍gj8)q_?f 'H=:/.ZڎJغX[l,omXCϷLXFE?YYU9wd_^MFC;"IO 07k,P%z+jE4Bfl1&G` 7vԴ@5FZ %<Rz?- f^bJo˾$ 踤o  EȆηV(/Vڗ7C/qܑ̡Rȯ<'%<:7v*tWK>dPdw1?UY\UL]-CܰOMD)%g>ޗz19+ƳyX|1 V=nO%P>bI];ؼ]29`-ԃl#{aÅ~g c|kmE@q6Ts+}z[A{{wj1OBՒEj[-6AիNsA vNLZӘW=K۳sߏX,iEwa5Ȳ"Ġ#֟z@J"XcU1eJ uw*?)4 P^9_L̲+֭rI=V5BV`#78] I8Xy$zul}Vi1LA-#8') $B@<tlk,fBKk uߍAW> 1FX; Q}gWv]N<ȾN[)b ubAErk FThF#zp \%4$ )mRt% ŸՌ{4[ڜik.}Oa c2%#[;ZD5mW h''EZPĂљgޣZWE$TV/cEcHZV"ƌu9+Jdp׶tٿhq܁Wl׉sk A1-̆#m휒&\bL;vl=57{WCle~Bh}=\eY]:/& Jtxm-UKldA#t;FuY꧑LC2kȣzNo*;0֯2&bFEWnm\Rc.v]ThǜzPeVK"zYl7&pR6SRgmj/tiɓ_x oG?P(zGb@>w-M~m8C/ )q_uz:lRG ToPւ5V$K ȁ!y`cʆVJӥ)但.{ydXPD dbAuFTE bcIyׇ.i؅X*_`^>P/a #40? gnxVm6i < &!MduZ\{ 4){`,SHВ rEH.*H1N<>Cʂw3H-[.:ɧ0MbHKj$lq b+ XbF._ϝ`eep~+Ѹ9xr7v?I5N|~J3ʂ lkN*YaI+*QIQ&dql鉔9a F[f^O%?(rn(Na=0KrZ)#9Z]Kr5NӸx;^#coX?a VmuwkaOw֩TD׻sϱX{Ovo(9VcwN:pOK\8XuUD8uM]2 QSYM=\ z \{:l.r6.$i3-}'@ew-=1vuW(0'tr{HX0Gq86́ƀ ZH?LLN:|BZ"kܩ(r'ٴT?szz:ˢYpֶmdU}!s r[" v׈f/A yE+ [E]^Y3+Ui?g. =ϥx9f9np+9IiOpCY,uj%J0WcUuԅg_.2'8Z|<4fo)EϹ̈́3'1]/yLCB1M}YFa_ 5Gі;C ]`mx&$IUEb9؜̫*oDh=з:Q5kPU@f YQ Z0rvLdEfz֔zYI:"UUylb~j sf9U!ҁyxo @kw|`"IG7=4`{뼷UE7 N7qMO+ﺢJk~%} o4&YƷ]=&ĥ#(Ui_-AQ]`ff5i]7ʔ~wY+S=!<$=fiWaB!.lC]E \AC1 G96vU؇H3Wx SW܌lQupm\xd–Nԡrb[Qszm5_?ö{5J>$B& l%3P <ʚŗv+NFQFN؊w9ll*A|'FNgqoW\}YUqmI M'}/Yo52]RT}^hƣer'k?puwV4)`gB1I\( =3;n=T!87v;I~ڝ/kf‖R-( ⸩bmV0]ѡ&0 ڈPhDZx-ǘ>m,Z[S7IPs :%YܹrXܣ\b G9 <^'<yL7Z˵kA KA݂o$peWX$dbXܿW8(<`j"e{Eh06c.30u /?3:㇌XB@@rp:*μRۢ"c6ˇt2724'-Z`5 dD*&A[T]0>+B; endstream endobj 3192 0 obj << /Length1 1488 /Length2 7173 /Length3 0 /Length 8174 /Filter /FlateDecode >> stream xڍtTj.)0tH#ЍH70 1twHtI7ҍ"%?wZYkf~엝E[G Byy$OyOh/7G!%@ F& TsF"||@>>Q@ TC!Nvy#f9?!@~qqQ@Y;#F5h͉0h/eFK@`;'^#!'7B.P+/@-3^; _ev;B7E:d8#ÁzP7y.WBpd0#H+i@0pB]p w`|C/zNG=ډ E͔V(;;(՟ ;>G\p/V }$|||b@*;}e![Co~N`( ߁[~~>H?oP?;݀|7F^V($ɫrawLN "b@jLU5 (כ!__ w--ԍfH)0[SoU%nH;vp_:o䯉YC VVjw*|H1nP+m8b[V GBQN_o b7{y~n8wz6>Q AY/a ໑0Гfn "Q ;o5Botz [|@oSDM>ߍݿ7B6n #w\rmfo> AUAg <#ғIX,y"NFgB˄}B14)ZfƳ ?rYz&cّ} ge~ cQ96!Z :@p:IZeG j_hWB_Tըj;ݬz,a%ՠsn+)uUk鋪J\UYb~FY'Ғv 9%b۳t$Jq]!o|9;&bPlX5WJ,'xKs&GN?M2c!N6Ro2O)H?L֒L7~b*>ϒǚd3qX>Qs[6VĜ{pj wuL^f[{AR8&?'B ?rdTj__z Lp<=k^<4󋗐;9^W}(=]o4,.;:zn/e몎J8#kF-,w$/ĉ]x:9 hF7' ۭǥoUORyll듦p%>T}zvc8yNbcl#RPMp㋫wh{T!?\p %pgEsZUEjc&!}Ab ƕxle$[O37E/{IsS VduWKn#yĭ6ruGN}MgҸ;Δ#v}< 9 " M;kx1i֟7ayBSAv#OcsJ'K'z$~ar:?eĹydՠK_?µQm,wsp%X+P P[F@hӛv}p̀im7Ss8O_>a/Kf{i ; Dj҅_^ѐO.ɯ l%,8H6Ӂ eexT3hRS'8n@Q{1Fw1'^(g'-鉃Ihڲ_[`ջcBkItdZ_CP~@`׻Tt\`.1pW3q-M#TgrϖԂ*^3ٟfW(;o1Z2;="Q$`΢r%ok4#Bw֗tzkt~E>U!IFc B90qS,qun;Nr"v V c̈$aO͓>I}5bkRYze8r=K.NO7g4PdΏۤܙ3lُ8|.R؏T- XI~3YL%_ٯ1ECB.A弆yEwbڥT(et`J?s'_lB3K`~UZ9&@=oDie5 ;(o6٤շx;10ž3 U" qƽWQk:{xF}?)gs@v=%Tx 6+OhKu/pL:C9D ^hLM亜Be}[m~uT+ _S,0\Š {X1ʨ*-,">㟞,**'^?F{aTzpoƦY&~/ѲzAdSnF;O+iv,4[Rxsw>=%"OrIB|?b1{\\sVl.2kT"tCfzH~q{8x_+% {h NT8c=%%lvq"0" Jq)aAٔCPIAyuI]iOnQlЫ_/س>6)DX#^2^dh5EyS>~my<4<LIXITl&Ŗ{P.\ u"u8M-wLgɤϖe֌ǽ\[~.QsfQEsG&Lp\P />1SƸgҊ\+J0U۸KƺbIYeuFtGUfpR譇P.O(>VN /] dĉao?MN}Ő<{0z4uoMFgm NA {uS/Ք>uo5 #~"56G8[SݚWV}:̓ߠ7B9]N$xO,vX υMT$<$ xw k\ԑ{UbdzwI[U6(. 凝ѨoDΕC2t+5L F`㚬Q#  y7} aZ9y'.dۋ!i!$(kɓ\qo(*+%C`Y;%i 7? #]S}s$̩WFn4Q L#(ks } '@PhEPfqƢP3gy8װfQe| q>&mFN3aXF_XڑzŒ2m :RWICwW gDCT'l̝O4o D?^2ȂfH']uO "tK%Nȶ+q?ZH%t'zgsU1iSAq. y@ih۽Q=k=~`8}Ǥdgj:e$GrT,٫CcEo{Zzrli_&5N֎/\I ɦ ^# Þ,ƃf؊ܷF'Gvɧi@ -. 3ٴ-η\*O߲>7h*h!w8Ncn:9ư4ժ}U_O}"-GwUU/ zޑH9I9UN8>փcl)IQ&kJԚwjmpnl2-OkPYƋ&\=KDQj bQ-*Sfe?x#Ssh:+FmCvcDx5&aI$tJSnĞ @dCWMb6g%z@G#ϡt10VE&2_bs Sd.s XsV_Х]}]P 7*pN1c-bxYRc$(Ue!sů .`}zhrљFD8rc,?ދ\p3};5Lq vGa_j)}w0A/<ݸ6ْTcX7$W먤!kt9~g>6r*k9(p|;(S͊OeL[s~" !$nXF03!R|Mk_yf0l.?]tN zU6ߵz޷N߶ YhRz0vϵDn?]/7xqef2d!i#P0e YY=~r3eɩ˚\lCuD5X38hO&ג_CN;k 2k; s\Gs;$:nBQdQpب35KQ[ 8smǖ1)Ӳ % kHK- Pg?@HuPU&!:[i.aѢ1{"8x '>+ 34m9Ii)$$ʵ cb[skF;,Ym[Yabrkj'v)HimnѬkF6'`~x{tYhycZmv~ Hg&faYciMo &d^/ya˧&0WQNR̥ױ%uNFv|nc, CoDk~?2>ޞN:6aхr43,8d;5tL~HysS&XUgTIN+Cl5%@5Feҕ㪑tM<;"len=&RƕٛOzupo۪dUx2?UYN:}Smp1ϘEeu :/he^2DV;^`iey55 z:ifŰL\6QzmS[ϕh GwXw[wB,ݍSa2WO*p: htL!l: d)L<'U> stream xڭZ]O}{uKZd d !$$}0f|c0Mߪn{Ā욞STg)ˆa,(sbCC.&KFVX \5N O7=#Bp?'4 ^Fs@ó0,b(SH 2B4naLcH@ kъpZA0 {DP g8 DIg1D)4& x=k: #}cd=| X-1 'D00fI:h4 P0W`9b d# AF"c06r*3h PT&X@C0(,IO USbhAdŴˡ 3 o8q 3Ĥ%Kw M:pTaQ@_gV c0Zd`!}0K[3z\h `/A2` Pg@^`1x"V`|I2=X1 !t`b$b# tˤG)8N]U k_z"`r7U͆|2'[8s|ߞzFTs#ƀH=;Vws=??F7!Dpz\ߣ#E7y5'zIV/zMo舎-zOn\5o)ΧS:s@ӿ#p,aa;O#L絉,<Z̄,˄I&@V&Plm*p\ '?V`f?:~ ݾ3&ƒHܟq4^pbv|c^[ժ)j-U'jz}FkzH'==}~L@h4*0t4Jshl<݀5[@k5_ ݜdU:" WG2) T4vsW&[@ 4s\t }ƼI&Gs `XR喵r"p@#2&Oue#L$>R,Q=Õ2D`\)GtnlDH݇,p WtAjбt<Օzuț6у>@mC;i'H*n 剮L\ 0BF縊:x31ưhhl]u!YI.;@l:1utn~:o=4ވb>~V踨u@໦DR_ONul |7ݻޕ Rj>kE.n!{GwV Ap-d>l\|\E;lCLf`Z}oޣ̀zLu(:Y!_2PMUY0QmVB _¼Ea@ 0YLX9@"L;D(E(Vw(J|V̀g(J|NvPsPv 0n%`|R0<]`|X%""Bn' ?"Y|0jRV*5NjmpY&u\r(2QQ̀"%irbr<"D-#?O`'\9έMN\*!OTDD7#\^Ԇ'0KUf9V\BXNXX"a/ot( m@tP瀲L(;y|0vbmX&Qp0Ů% آ 6QXaaP[bXB-eZ%x5" 1EEtHk; +RfEZ@ D e;66Q C*JD\UE&Qd.*"Qd("EE(C"D!EEQD" 碈(<wsQDQ;Da(˻]` endstream endobj 3200 0 obj << /Type /ObjStm /N 100 /First 984 /Length 1780 /Filter /FlateDecode >> stream xڅ\7 ) ؖ߆(J)/EBr[ΙlXO/Ua?֯ TͤQe ;*a ivbǑ T,CYXTnq!m Bs\Hv+C#]bvb{(uXT5Ǘ|}~R_>hWoo}풽÷/=.߫-Oޒ mkGW@uE-yO5.1 CfGf~[O͡kQ(E6;:u<>>U`O-OQ %ާާ⠔ JqPJPJ ܡ`>bX̠` `RJ*HN9ςq![*NmUA $ P`%g 8/nlq87@6P8t(q@: 8 JpJpJNph% g@(svl-B3zl=ccFG4zFg=#5z8=6FhH1zDGjpF/hH^%=Rg1zF/ы3zDl^Kj^6F/%5zqF/wO"DW=ג(蹕]qe%Z^į${#ҝB}]D(Vi#L> vD]tGo(t5tP E(=@PA\(@B{~MG,֜5s傶\[ʧ9>':>6WMqU%^^( /MM/MqPs(<#B)w(<PJ8A(g Px fPx 'A5N=(WTQ?'?YV9s: r}7 : ! W `N N j+hVu?+~#~I2;\dpKu͜-QQA!IGv*G*t|Q`y?ӆOE>vλuffN |("G*t|FU0JGv?`tt`7 py©p{r g endstream endobj 3201 0 obj << /Type /ObjStm /N 100 /First 986 /Length 1889 /Filter /FlateDecode >> stream xڅϪ6 )d[6 U)Bi}J8#9J983'?;NJ-mPmA}tP6]Q{r-耶YܷXu6֭[/zOՄ**,,iPH($_%ƫ]ę53[Z 3:2-]ʩn%ۆX򆔻҆Ɍ2(]ScQ4tQԍdFo:C*'HLY)ʉ4Sʉ4Sʩh$|T*uT*zTNMr{Rh\<'&!g33je3)Ps\Jב̨̚M@Hn}ȨȮmzbBzxzȨ,3$Hfw(KR) *1Pf𞩤!ˢ 3)nGUN1w(^q4dʆRͯW-MfH22 @vVɌdmdae$?161rFݶzR%uC6Ζ^lA11 t$3GfqvِT7||oYw3긼?/}ɷۿ_z-;lGľ>D)uDDft*3YYV-H AqY)`c/X"֌` *d7*#|x>q.PO|`ܨNFϑـd,ͭ;hFUYVlB`a%#n#IB~Fd2j@%T1f CUr۳B@JPSʆ@N 6#c9r 9ȝVOBN-4|= g慠E!.40= ??0`AP@;(PHqKOؒGn2҄ u,F OOJ jm)C͇z]z>aԋą5߸gV`th A)$#HxdP8{ ( PL맺[Hx4R0suqόc}q$l] -Os(x@%dV`V&CchzRhXZX V%o9+2Vf+p:#ldVV ̂ dhV"qV ̂ PhXo(dw:2΀JP b>@JP ?.=q!`lP ?-/ P4y ? 7B);>43=f]3jBOoXoDs_1a Žbҷ`iF, lY0{^G³y!X`( -}ZרHMPbPX=> Pȇ 䅠gB\П   ? X@I P@I (CJ2PJPR%@CIA *d7z<3G-o@VoˋAܧ&.ȭȴH5 I7C!D|$'`u2 x{)g=/K(,ƃXٰ10gSC6/fAn24~fp$/:` 0~= ¹Ghvxlvqpqac`svߞ՟ɺp˻m\zTa'dCs.ؤIpB7٠20+0.a.Cb|$E endstream endobj 3202 0 obj << /Type /ObjStm /N 100 /First 912 /Length 1795 /Filter /FlateDecode >> stream xڅ$7 ~%[){BH` y]]%˫q]fRNJdTE/X<.ZB(㢤Vbt^@z9Qk'9IQzuHޖ>Q7W⨷lelMzQ!SɃV uT18;Jޑ;>ࢿ;3quE!r4T(SQP?t66Q£賧Qt E#døO_z<_=/ooKmO=?zj{GžǏr*gYUY'^! O F\﹄8 ,^nH$7 ^&"/"ABP` MP vv{D/$Xo|5 ll b$hs(M(Cy5 ބ>Wë ބ> C) |(S(p P0 P&C0:RoB>CS(&Ca(u ܄R|(5 LB9ʔBĐG #ֵV> (T{Uyz^7 Rί9t)_fy<V&&wbuOf>mͧ"ɼg^0/}cew?vG<ù,4NqF;͇j8R2yY G#,@_v;KDs1UYe㫖 "be!--uۡ["r[`뽣DcԭZ R;VKj1RKz0- -eDõg^p,y}vޗ{#y# ,;V"ֲZley }NFZʹVk#ԲiC-GeC-{ZPˆZk#rgvHqx36;Q_j3WfU 7ÌWjnZ՚_} Х҂/ 8inh {>t|>(/%B%둌nwu1@Cj^N_Klk8k˧Fg9xǯ|XB'Dכȗb e.%-ܶZ.ly"q+j/|Itӂ%uvh]'&xO̦նZJf.-;rmn_'褺/Wcǩ-ԖVhMhЦn> stream xڍYK6ϯ1}FpW*W\0@0fHfD.y t[E~$ERyѸmU_6Jhany$5÷ssH D|V4T8)`3T Xi0N ps If': ̤Q3:mfTji*Q4 <٠JJf<|-ئ)0Ny:#y*hNRI2okDFkMe(@+|XGyR5:D\!uc >)6×kD1g NyU1&"H@cCwI4Vy(t@d_ N8 s(:|v1"Yx4Ю|M -װ;F偨 4Z {)H T2MlG;`@Oֆ&J:LJ4ܬ셽{հ5"I! tJ"jS Ogi=lFG/mRJR{h/9 #PDQJ'p8Bʐ>Aֿw?L_3@~hS?>+%o4:}W4駕,\weٕ,]rY,(odYVde7demYyZm굷,hʒ F^fv>ު,A7Aa%I2ח0x}w* ~+ {[|eR+Y[AqdٰQe8˲,d"Kݕ,Fe7+gkYY>U|o^|o|]͖ujm]4a!+ӜaRsJqKuS(s3,W[%+j+AVq%K+kY"=Ybr+Dm^=v Yb6ξݕP[lZQȚ}o=c{|eR+YbK.:lyo{JefRf$Vf[_qВ ^*0+e{RBR{欞$[-9oW""TNg{s:Z۸loNylyl 1+ۥJa-Owˇ&\4`ʚy`NU 9/rqJy{r^kAC(2!bLAݩX)44W)ۥ.;MF-BcovB>c*EZAJƁBZtw\# 8`S":9}#dg(d \MEE. ;(#/3BqP\0 ?E>tjIu^ekۮ&ŹJF>Y6l4OImҸ *|(j}sȅhϖܤ nQF@U A.U AD6Q a&#h(X=FTT(IMYEb6ɢI1o2xc@S6(f,ZޢE3e`zKb=Qw̰AfqA9fgqP9\7y84)[VwquP1O@\1!ʽAv. w8UsFٍ#ģU\b.p +wV@̲\1`Olct\#3  % Ոqֈs1~*͍t\gdJVQ"n@K69ki=(`Ɂ8DJ,lS=swz7By}3uFyӞpH-mqCUG N [n2ڱ^F۬kl\10 68Y)ּb]v}ROze==Z}J2\aײ~;y*T@? E6HXᵿtF@pvӅc^xnOMʊWՆf3W :b<(akҩ=bodԏ60&]gڡ%.[7iY6MӀp;(.mx$ Fvv"!U -^U`ptq?`a0(im5ȻB:J.d!ulo%+NN Vςp!WY (,yGc0AL9ž?,7 +&L^O>y7PEN`_@N'(T+Fq8rSU 3XtM`cw!\prS<7q\-m=v0hh7AU5x"߷SZБs4[M#k}ԍi6"CZ2Vob?PpHIS[nc%5)BW ]|!gBt'™Ɯ<:iH3@ A<}20<PNnx;|9XNjC,%rMS?,y}mSP"<݈Nv\`>˿ᘜb,cb҂YhK\x|ҸF:#D@vF ޓyvi^H#S}3<J4C5PA9)qBm1Js/cj$(=O*Hu±jo& tEp4`9O؏tzư } 雙j@xH{mGtpxFsVtA8.Lg?7>w,p2app?8\NS=Cy> -%yt[&qS?$ M3D 0q鐒_Fҵ{J{hY];8&*WIQ0,Y+/z< Sw:Yf6GJPY%ROcЦ\ sxmԧꉺ%=Dv^axO@״5f_ F?u!}+/9Cإ̬wҷ_N(FerT"p;62WJ2C 0_rF)9[Ƨx+W{~$IwðK\4g-Wr8-b8)/ve5wlڍଡN,c 3t;WYLs(t4sMb:ڤ51TIcȰoEweJN.=L;V(R 5 k#k6TaJ"S:ۋt92Ԧ; U e~7 qO%N"/ 6zJ?tU.jXPℭf$?paXa{eBO|Y0GO=l 7U`{?O$B}G7HG}YcO4&>DI!Cryk|P">+Lݹ=` ی[s;+?kJ..) 0\\1k^ $2'/Zd= }3RL*Y;h$Y(f-6u'`QŤ3g9}0\5|J˯{D,a.ĝŔW ji/*XqXR:3!~F1[ eL08TFAzh~fnJ3S뀭PtC K,<I' #87( 4n_;O/Fm]LT> endobj 3267 0 obj << /Type /ObjStm /N 44 /First 431 /Length 2014 /Filter /FlateDecode >> stream xڝXKoHWU`=Iv`g6H0~RQ]r3f(HJkfL3$\&?ܰL3lDBBf)ʘ茩]e@6VS<@<̡:2.W,P"hʌ;eR Z0)8@P[$:\gNd`HІS33)dRRڢ 2i9ɂ@ Ag* )C9R2SJp3%dJq< ˔ZX5W?pu<5ud`F] ̂ kbťr*_?⣚X}[aM߶7b?] G۽|q*=rm,E\TMrq]*GFbs׷ mWScV狙Èͱ=%="$Uݝ1-ZB)4qD%%uADK:+y‚Nu@NjŌ5 ,An:*K^39D8FN'ȓ9G$[SSb)p]|˱ܽDmR}%7E"-sC=mc-^4?V#¼mK.0ɇa]|ՇjPS_|,>zRH[bڏc&ĝoBlٖSuj xGy`>nu%43߁ !]qp]6fqDwb(ņa:+Fυ V̗BWf`E+n.w0g&@c/NDž\6]j@;k+3熴t}WšshmWW{B /LNM~O8FsqGU("5byl(ʥZ^DSAл Ztn&p GRN=k,8!Bѿ=/ƪ88ugpr9EYK0aqapr& 7?yw{%=Q>{Xu1cpoO1JJ菡xƾ(llØ+!MUIQ~j[\xN6MxjmT Co_0 UҁK#| 熹̷i[P;\zDc'3t fNQZlsHOw!mN75K0+^K x}Y.ɝ_8(:"!Q/]xd:Lt6窩b~C!Ā_ T.*4u'cuń=`(^B~ DEﻡ>s@ݞ":Şȹh;m^vD`zBY+YFH NfSQ.Ԅ>a┎_=aDJg[#\}#zr> ] /Length 7785 /Filter /FlateDecode >> stream x%w+}~qvn;2ދ@,XlH! DZHiFDbEJ$E@A1%ZE(#L?oϜͯT*K*e21K5kʒ^֒4 AsN=ZOu7܆;pax1< x 55ub4YLW^AzW^AzW^ApJ]M*kK6L9~VjXka 6l-vvn{apa8Q8SpY8\*\IhKzﹰ6n8}K\pnmwğ=x 9 ^x =|V >A)wE9!儔RNH9!儔RNH9!儔R)'|^I*woAh]Pa3I/߮+ʩ)rjʩ)rjʩ)rjʩ)rjʩ)rjʩ)rjʩ)rjʩ)rjʩ)rjʩ)rjʩ)'O~)'eIݗVc-́-pN-x F$TNR9I$TNR9I$TNR9I$TNR9I$GH*'rI*'rI*'rI*Kj<& 0-~\]n)?v帱;ah3~]N%r|Ю!b{B.L*]Pn\ʙv-t\[͔]])g1ס2rKBUWi.Et˭ QnRbpZ&5rھI{':9ur^wz7BY˩ywĠ|ZPe9z2{;^mƞ.w_ٻ> G]f<!wcFS.w}Xٻ>"]f2{!wcqJeNf析ٻeٻ2{ۗx]foQOQ 1{[G1ab0ۏԢD0 rqYQPn 0{\'fI CI73k3!}wәSr!7r+aS`~n90{ߝx&NtY(>t 2ydl\3p3`a U`at ssه)D?fat Pهqw.f9NcĪAܝ+CwV\*`s.\$\>j CQpBΨA}Yp+0p;v`tp0p.`;{pڈ;{p0НRx}jfZυG [τGه:Sq`NDx}j=fZgه쭇CT"0Pպ/>A rwׁه7n o[uPIه: auP8|\ uPkhfZqjш>to]F}nߊˊ1ݾuYgMa0fב9CavY0fבL2fכq(̮GjCGav=R댐Gav=RF> Z>ZhFԢZ'>Z*i߈Gi2hNE#fYɴ>2hNE#fɴ }k:ό}4%A!LGo#fmeGrѡGͱ[{>%)9>,]MG[/JYs 8ѡƉ%e\grѡL tO PCCK"e0MѡD3Q肜iAkJH墣&e9F!Wݴ<5&gZ/ 9VG [k>#gM`ij!ݴBR>z$gtZ)dT.grA-2ttP!efjGo>z'gZ,ddB>E'P죺\t2a|wloi%0!gҚ'¤[9"[AbRC-f9'Kka8e0gEfЌXһT.\^c':`x&^so~nfR4?7ט^tw5kf1]p0{]Zb]Jf~|)<^%BxƜ#5l>f1g80{9O'k5s#Y`9{<0{4@xK5n^f1v0f1v:0{7kݼ%/fьAƜ8!f1g35l^FC0{5UakF͸(ܝQxf;7IB4^swn~. 1{͍be6/C^fblkl_[ <'w gU`np0{]yZ8Sn.f0vp 0{'s\ 9&\ fq>fqw8;!CMAf=V`Nzp;0{0Oc+ -0{'2bl_KFͰ[`Al _5B֯ FͰ*=JLJ6%C0DlơL%0S2`A"\>7:VQf0Np0q5`ycp0Vp30 y/ >0knf4 w@4w {Lx%>`K`#6^\x}tg£k<f0]$Ğ&5 OHx=G 9ӴE\QxlC \sshpMqw4n o-9hw?Ǝ'6nŎg>.摜R0≜H#N-\h0 B.{%gZи,¿3-hDhy4>>y49C5a.zR|aí$ ~M&0!9+¤B#vZ\9ia<F إ] l#4N bR.r!e\N݈RN8*\=8);k`\\'ցIn3nYqYܦ6'b_rlO*9շ)KkS;oLvAI*{(leq*v$陋:8|$tmnE..L*_nb:xirR{  Ω(fͩk[z$2~!Ij_#xsdynSeI~n )7ClNnMޘ$@lN,rR۱ww4I".nOSbc'$9W]ڱu/IGöcKcKCceխ6c*v8QҏmOIM$In/>vcXuD}m_$?c ֏  ֏m9T׏--?SIh8!L#sm?HULn|ג݈/?I"B$?뱤.I~ǧXQL_a,~Uƺ3XWv-i2$?;^0PG1<$E, Jato$ó/~1a$"^c!t|fb 4ŐXʷIoS%8:79<4χU~)r &u]bI/7@ܭK?wh <4#IǓQ5OXMN[xh:Vn…dbKRw!bV2E%6/ Db:."E6'[,$́0X`1, X X `=l `3l 4쀝 v `?p 18'$p98"|2\57&܂p=!<^Km;x#aEd~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~rgʝ)wܙrgʝ)wܙrgʝ)w3P,4,QkI||",2T?SL3T?SL3T?SLK*UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/UTRK/խJb($J/UTRK/U HFj7>Eꗪ_~ꗪ_~ꗪ_~-XIw8S[t֦R{cFj3ݕ$ũ6Bj `ZL-XITS{ѩzgj3ğZO RЩ~Yj,#KySgj3Mm6R Ԓ|jC+z+Fj68SkEjQԳ[E*{jY=VZMQIu3ZZ2V,Q'n<ݕJmhSUԲfj3CꡆRR3ry*\#qj|zL&7ӻd0>O&!>}H\f|_OdOωO9d8^̻mqI2i"?ɼ_ƧXijVC8̻;,{Vgl0fr*r*r*r*r{;NĻ7M](r*r*Y۳ֳg=x&ޤWg]x9&ކ_TuVUgUuVUgUuVUgmx%w\ls =k{֊%x%^p7Z\ =>y{|=>y{|=>y{|=>y{|=>)|O{ S$T? endstream endobj startxref 490901 %%EOF ucblogo-6.1/docs/usermanual.cps0000664000175000017500000002224413601426466014741 0ustar jjcjjc\initial {*} \entry {*}{29} \initial {+} \entry {+}{29} \initial {-} \entry {-}{29} \initial {.} \entry {.defmacro}{83} \entry {.eq}{15} \entry {.macro}{83} \entry {.maybeoutput}{71} \entry {.setbf}{13} \entry {.setfirst}{13} \entry {.setitem}{13} \entry {.setsegmentsize}{65} \initial {/} \entry {/}{29} \initial {<} \entry {<}{32} \entry {<=}{32} \entry {<>}{15} \initial {=} \entry {=}{14} \initial {>} \entry {>}{32} \entry {>=}{32} \initial {`} \entry {`}{72} \initial {A} \entry {allopen}{23} \entry {AllowGetSet}{4} \entry {allowgetset}{89} \entry {and}{35} \entry {apply}{76} \entry {arc}{39} \entry {arctan}{31} \entry {arity}{55} \entry {array}{9} \entry {array?}{14} \entry {arrayp}{14} \entry {arraytolist}{10} \entry {ascii}{16} \entry {ashift}{34} \initial {B} \entry {back}{37} \entry {background}{46} \entry {before?}{15} \entry {beforep}{15} \entry {bf}{11} \entry {bfs}{11} \entry {bg}{46} \entry {bitand}{33} \entry {bitnot}{34} \entry {bitor}{33} \entry {bitxor}{33} \entry {bk}{37} \entry {bl}{12} \entry {buried}{54} \entry {buried?}{60} \entry {buriedp}{60} \entry {bury}{59} \entry {buryall}{59} \entry {buryname}{59} \entry {butfirst}{11} \entry {butfirsts}{11} \entry {butlast}{12} \entry {button}{47} \entry {button?}{47} \entry {buttonact}{89} \entry {buttonp}{47} \entry {bye}{71} \initial {C} \entry {cascade}{79} \entry {cascade.2}{81} \entry {case}{74} \entry {case-insensitive}{6} \entry {caseignoredp}{89} \entry {catch}{69} \entry {char}{17} \entry {clean}{40} \entry {clearscreen}{40} \entry {cleartext}{26} \entry {clickpos}{47} \entry {close}{23} \entry {closeall}{23} \entry {co}{70} \entry {combine}{10} \entry {commandline}{89} \entry {comments}{6} \entry {Computer_Science_Logo_Style}{1} \entry {cond}{74} \entry {contents}{54} \entry {continue}{70} \entry {copydef}{51} \entry {Copyright}{1} \entry {cos}{31} \entry {count}{16} \entry {crossmap}{79} \entry {cs}{40} \entry {cslsload}{63} \entry {ct}{26} \entry {cursor}{26} \initial {D} \entry {decreasefont}{27} \entry {define}{50} \entry {defined?}{54} \entry {definedp}{54} \entry {delimiters}{6} \entry {dequeue}{14} \entry {difference}{29} \entry {do.until}{73} \entry {do.while}{73} \entry {dribble}{24} \initial {E} \entry {ed}{61} \entry {edall}{62} \entry {edit}{61} \entry {editfile}{61} \entry {editor}{61} \entry {edn}{62} \entry {edns}{62} \entry {edpl}{62} \entry {edpls}{62} \entry {edps}{62} \entry {empty?}{14} \entry {emptyp}{14} \entry {eof?}{25} \entry {eofp}{25} \entry {epspict}{47} \entry {equal?}{14} \entry {equalp}{14} \entry {er}{57} \entry {erall}{58} \entry {erase}{57} \entry {erasefile}{23} \entry {erf}{23} \entry {ern}{58} \entry {erns}{58} \entry {erpl}{58} \entry {erpls}{58} \entry {erps}{58} \entry {erract}{89} \entry {error}{70} \entry {errors}{87} \entry {exp}{30} \initial {F} \entry {fd}{37} \entry {fence}{40} \entry {file?}{26} \entry {filep}{26} \entry {fill}{41} \entry {filled}{41} \entry {filter}{78} \entry {find}{78} \entry {first}{10} \entry {firsts}{11} \entry {font}{28} \entry {for}{72} \entry {foreach}{76} \entry {forever}{67} \entry {form}{33} \entry {forward}{37} \entry {fput}{9} \entry {fs}{41} \entry {fullprintp}{90} \entry {fullscreen}{41} \entry {fulltext}{51} \initial {G} \entry {gc}{64} \entry {gensym}{10} \entry {getter}{2} \entry {global}{52} \entry {goto}{71} \entry {gprop}{53} \entry {greater?}{32} \entry {greaterequal?}{32} \entry {greaterequalp}{32} \entry {greaterp}{32} \initial {H} \entry {heading}{39} \entry {help}{63} \entry {hideturtle}{40} \entry {home}{38} \entry {ht}{40} \initial {I} \entry {if}{68} \entry {ifelse}{68} \entry {iff}{68} \entry {iffalse}{68} \entry {ift}{68} \entry {iftrue}{68} \entry {ignore}{72} \entry {increasefont}{27} \entry {int}{30} \entry {invoke}{76} \entry {iseq}{31} \entry {item}{12} \initial {K} \entry {key?}{26} \entry {keyact}{90} \entry {keyp}{26} \initial {L} \entry {label}{41} \entry {labelsize}{43} \entry {last}{11} \entry {leaving \t {ucblogo}}{5} \entry {left}{38} \entry {less?}{32} \entry {lessequal?}{32} \entry {lessequalp}{32} \entry {lessp}{32} \entry {line-continuation}{6} \entry {list}{9} \entry {list?}{14} \entry {listp}{14} \entry {listtoarray}{10} \entry {ln}{30} \entry {load}{63} \entry {loadnoisily}{90} \entry {loadpict}{46} \entry {local}{52} \entry {localmake}{52} \entry {log10}{30} \entry {logohelp}{63} \entry {logoplatform}{91} \entry {logoversion}{91} \entry {lowercase}{17} \entry {lput}{9} \entry {lshift}{34} \entry {lt}{38} \initial {M} \entry {macro?}{85} \entry {macroexpand}{85} \entry {macrop}{85} \entry {make}{51} \entry {map}{77} \entry {map.se}{77} \entry {mdarray}{10} \entry {mditem}{12} \entry {mdsetitem}{13} \entry {member}{17} \entry {member?}{15} \entry {memberp}{15} \entry {minus}{29} \entry {modulo}{30} \entry {mousepos}{47} \initial {N} \entry {name}{51} \entry {name?}{54} \entry {namelist}{55} \entry {namep}{54} \entry {names}{55} \entry {nodes}{56} \entry {nodribble}{24} \entry {norefresh}{42} \entry {not}{35} \entry {notequal?}{15} \entry {notequalp}{15} \entry {number?}{16} \entry {numberp}{16} \initial {O} \entry {op}{69} \entry {openappend}{23} \entry {openread}{22} \entry {openupdate}{23} \entry {openwrite}{22} \entry {or}{35} \entry {output}{69} \initial {P} \entry {palette}{46} \entry {parse}{18} \entry {pause}{70} \entry {pc}{45} \entry {pd}{43} \entry {pe}{44} \entry {pen}{46} \entry {pencolor}{45} \entry {pendown}{43} \entry {pendown?}{45} \entry {pendownp}{45} \entry {penerase}{44} \entry {penmode}{45} \entry {penpaint}{44} \entry {penpattern}{46} \entry {penreverse}{44} \entry {pensize}{46} \entry {penup}{43} \entry {pick}{12} \entry {plist}{53} \entry {plist?}{54} \entry {plistp}{54} \entry {plists}{55} \entry {pllist}{55} \entry {po}{56} \entry {poall}{56} \entry {pon}{57} \entry {pons}{56} \entry {pop}{13} \entry {popl}{57} \entry {popls}{57} \entry {pops}{56} \entry {pos}{39} \entry {pot}{57} \entry {pots}{57} \entry {power}{30} \entry {pprop}{53} \entry {ppt}{44} \entry {pr}{19} \entry {prefix}{22} \entry {primitive?}{53} \entry {primitivep}{53} \entry {primitives}{55} \entry {print}{19} \entry {printdepthlimit}{90} \entry {printout}{56} \entry {printwidthlimit}{90} \entry {procedure?}{53} \entry {procedurep}{53} \entry {procedures}{55} \entry {product}{29} \entry {pu}{43} \entry {push}{13} \entry {px}{44} \initial {Q} \entry {queue}{14} \entry {quoted}{12} \entry {quotient}{29} \initial {R} \entry {radarctan}{31} \entry {radcos}{31} \entry {radsin}{31} \entry {random}{32} \entry {rawascii}{16} \entry {rc}{21} \entry {rcs}{21} \entry {readchar}{21} \entry {readchars}{21} \entry {reader}{25} \entry {readlist}{20} \entry {readpos}{25} \entry {readrawline}{20} \entry {readword}{20} \entry {redefp}{91} \entry {reduce}{78} \entry {refresh}{42} \entry {remainder}{30} \entry {remdup}{12} \entry {remove}{12} \entry {remprop}{53} \entry {repcount}{68} \entry {repeat}{67} \entry {rerandom}{33} \entry {reverse}{10} \entry {right}{38} \entry {rl}{20} \entry {round}{30} \entry {rseq}{31} \entry {rt}{38} \entry {run}{67} \entry {runparse}{18} \entry {runparsing}{6} \entry {runresult}{67} \entry {rw}{20} \initial {S} \entry {save}{62} \entry {savel}{63} \entry {savepict}{46} \entry {screenmode}{43} \entry {scrunch}{39} \entry {scrunch.dat}{42} \entry {se}{9} \entry {sentence}{9} \entry {setbackground}{45} \entry {setbg}{45} \entry {setcslsloc}{64} \entry {setcursor}{26} \entry {seteditor}{64} \entry {setfont}{28} \entry {seth}{38} \entry {setheading}{38} \entry {sethelploc}{64} \entry {setitem}{12} \entry {setlabelheight}{41} \entry {setlibloc}{64} \entry {setmargins}{26} \entry {setpalette}{44} \entry {setpc}{44} \entry {setpen}{45} \entry {setpencolor}{44} \entry {setpenpattern}{45} \entry {setpensize}{44} \entry {setpos}{38} \entry {setprefix}{22} \entry {setread}{24} \entry {setreadpos}{25} \entry {setscrunch}{42} \entry {settc}{27} \entry {settemploc}{64} \entry {setter}{2} \entry {settextcolor}{27} \entry {settextsize}{27} \entry {setwrite}{24} \entry {setwritepos}{25} \entry {setx}{38} \entry {setxy}{38} \entry {sety}{38} \entry {shell}{21} \entry {show}{20} \entry {shown?}{43} \entry {shownp}{43} \entry {showturtle}{39} \entry {sin}{31} \entry {splitscreen}{42} \entry {sqrt}{30} \entry {ss}{42} \entry {st}{39} \entry {standout}{17} \entry {starting \t {ucblogo}}{5} \entry {startup}{91} \entry {step}{60} \entry {stepped}{54} \entry {stepped?}{61} \entry {steppedp}{61} \entry {stop}{69} \entry {substring?}{16} \entry {substringp}{16} \entry {sum}{29} \initial {T} \entry {tag}{72} \entry {temp}{61} \entry {template}{74} \entry {test}{68} \entry {text}{51} \entry {textscreen}{41} \entry {textsize}{27} \entry {thing}{52} \entry {throw}{69} \entry {to}{49} \entry {towards}{39} \entry {trace}{60} \entry {traced}{54} \entry {traced?}{60} \entry {tracedp}{60} \entry {transfer}{81} \entry {turtlemode}{43} \entry {type}{19} \initial {U} \entry {unbury}{59} \entry {unburyall}{59} \entry {unburyname}{59} \entry {unburyonedit}{91} \entry {unstep}{60} \entry {until}{73} \entry {untrace}{60} \entry {uppercase}{17} \entry {usealternatenames}{91} \initial {V} \entry {vbarred?}{16} \entry {vbarredp}{16} \initial {W} \entry {wait}{71} \entry {while}{73} \entry {window}{40} \entry {word}{9} \entry {wordp}{14} \entry {wrap}{40} \entry {writepos}{25} \entry {writer}{25} \initial {X} \entry {xcor}{39} \initial {Y} \entry {ycor}{39} ucblogo-6.1/docs/usermanual.cp0000664000175000017500000002765413601426467014571 0ustar jjcjjc\entry{Copyright}{1}{Copyright} \entry{Computer_Science_Logo_Style}{1}{Computer_Science_Logo_Style} \entry{getter}{2}{getter} \entry{setter}{2}{setter} \entry{AllowGetSet}{4}{AllowGetSet} \entry{starting ucblogo}{5}{starting \t {ucblogo}} \entry{leaving ucblogo}{5}{leaving \t {ucblogo}} \entry{case-insensitive}{6}{case-insensitive} \entry{delimiters}{6}{delimiters} \entry{runparsing}{6}{runparsing} \entry{line-continuation}{6}{line-continuation} \entry{comments}{6}{comments} \entry{word}{9}{word} \entry{list}{9}{list} \entry{sentence}{9}{sentence} \entry{se}{9}{se} \entry{fput}{9}{fput} \entry{lput}{9}{lput} \entry{array}{9}{array} \entry{mdarray}{10}{mdarray} \entry{listtoarray}{10}{listtoarray} \entry{arraytolist}{10}{arraytolist} \entry{combine}{10}{combine} \entry{reverse}{10}{reverse} \entry{gensym}{10}{gensym} \entry{first}{10}{first} \entry{firsts}{11}{firsts} \entry{last}{11}{last} \entry{butfirst}{11}{butfirst} \entry{bf}{11}{bf} \entry{butfirsts}{11}{butfirsts} \entry{bfs}{11}{bfs} \entry{butlast}{12}{butlast} \entry{bl}{12}{bl} \entry{item}{12}{item} \entry{mditem}{12}{mditem} \entry{pick}{12}{pick} \entry{remove}{12}{remove} \entry{remdup}{12}{remdup} \entry{quoted}{12}{quoted} \entry{setitem}{12}{setitem} \entry{mdsetitem}{13}{mdsetitem} \entry{.setfirst}{13}{.setfirst} \entry{.setbf}{13}{.setbf} \entry{.setitem}{13}{.setitem} \entry{push}{13}{push} \entry{pop}{13}{pop} \entry{queue}{14}{queue} \entry{dequeue}{14}{dequeue} \entry{wordp}{14}{wordp} \entry{listp}{14}{listp} \entry{list?}{14}{list?} \entry{arrayp}{14}{arrayp} \entry{array?}{14}{array?} \entry{emptyp}{14}{emptyp} \entry{empty?}{14}{empty?} \entry{equalp}{14}{equalp} \entry{equal?}{14}{equal?} \entry{=}{14}{=} \entry{notequalp}{15}{notequalp} \entry{notequal?}{15}{notequal?} \entry{<>}{15}{<>} \entry{beforep}{15}{beforep} \entry{before?}{15}{before?} \entry{.eq}{15}{.eq} \entry{memberp}{15}{memberp} \entry{member?}{15}{member?} \entry{substringp}{16}{substringp} \entry{substring?}{16}{substring?} \entry{numberp}{16}{numberp} \entry{number?}{16}{number?} \entry{vbarredp}{16}{vbarredp} \entry{vbarred?}{16}{vbarred?} \entry{count}{16}{count} \entry{ascii}{16}{ascii} \entry{rawascii}{16}{rawascii} \entry{char}{17}{char} \entry{member}{17}{member} \entry{lowercase}{17}{lowercase} \entry{uppercase}{17}{uppercase} \entry{standout}{17}{standout} \entry{parse}{18}{parse} \entry{runparse}{18}{runparse} \entry{print}{19}{print} \entry{pr}{19}{pr} \entry{type}{19}{type} \entry{show}{20}{show} \entry{readlist}{20}{readlist} \entry{rl}{20}{rl} \entry{readword}{20}{readword} \entry{rw}{20}{rw} \entry{readrawline}{20}{readrawline} \entry{readchar}{21}{readchar} \entry{rc}{21}{rc} \entry{readchars}{21}{readchars} \entry{rcs}{21}{rcs} \entry{shell}{21}{shell} \entry{setprefix}{22}{setprefix} \entry{prefix}{22}{prefix} \entry{openread}{22}{openread} \entry{openwrite}{22}{openwrite} \entry{openappend}{23}{openappend} \entry{openupdate}{23}{openupdate} \entry{close}{23}{close} \entry{allopen}{23}{allopen} \entry{closeall}{23}{closeall} \entry{erasefile}{23}{erasefile} \entry{erf}{23}{erf} \entry{dribble}{24}{dribble} \entry{nodribble}{24}{nodribble} \entry{setread}{24}{setread} \entry{setwrite}{24}{setwrite} \entry{reader}{25}{reader} \entry{writer}{25}{writer} \entry{setreadpos}{25}{setreadpos} \entry{setwritepos}{25}{setwritepos} \entry{readpos}{25}{readpos} \entry{writepos}{25}{writepos} \entry{eofp}{25}{eofp} \entry{eof?}{25}{eof?} \entry{filep}{26}{filep} \entry{file?}{26}{file?} \entry{keyp}{26}{keyp} \entry{key?}{26}{key?} \entry{cleartext}{26}{cleartext} \entry{ct}{26}{ct} \entry{setcursor}{26}{setcursor} \entry{cursor}{26}{cursor} \entry{setmargins}{26}{setmargins} \entry{settextcolor}{27}{settextcolor} \entry{settc}{27}{settc} \entry{increasefont}{27}{increasefont} \entry{decreasefont}{27}{decreasefont} \entry{settextsize}{27}{settextsize} \entry{textsize}{27}{textsize} \entry{setfont}{28}{setfont} \entry{font}{28}{font} \entry{sum}{29}{sum} \entry{+}{29}{+} \entry{difference}{29}{difference} \entry{-}{29}{-} \entry{minus}{29}{minus} \entry{product}{29}{product} \entry{*}{29}{*} \entry{quotient}{29}{quotient} \entry{/}{29}{/} \entry{remainder}{30}{remainder} \entry{modulo}{30}{modulo} \entry{int}{30}{int} \entry{round}{30}{round} \entry{sqrt}{30}{sqrt} \entry{power}{30}{power} \entry{exp}{30}{exp} \entry{log10}{30}{log10} \entry{ln}{30}{ln} \entry{sin}{31}{sin} \entry{radsin}{31}{radsin} \entry{cos}{31}{cos} \entry{radcos}{31}{radcos} \entry{arctan}{31}{arctan} \entry{radarctan}{31}{radarctan} \entry{iseq}{31}{iseq} \entry{rseq}{31}{rseq} \entry{lessp}{32}{lessp} \entry{less?}{32}{less?} \entry{<}{32}{<} \entry{greaterp}{32}{greaterp} \entry{greater?}{32}{greater?} \entry{>}{32}{>} \entry{lessequalp}{32}{lessequalp} \entry{lessequal?}{32}{lessequal?} \entry{<=}{32}{<=} \entry{greaterequalp}{32}{greaterequalp} \entry{greaterequal?}{32}{greaterequal?} \entry{>=}{32}{>=} \entry{random}{32}{random} \entry{rerandom}{33}{rerandom} \entry{form}{33}{form} \entry{bitand}{33}{bitand} \entry{bitor}{33}{bitor} \entry{bitxor}{33}{bitxor} \entry{bitnot}{34}{bitnot} \entry{ashift}{34}{ashift} \entry{lshift}{34}{lshift} \entry{and}{35}{and} \entry{or}{35}{or} \entry{not}{35}{not} \entry{forward}{37}{forward} \entry{fd}{37}{fd} \entry{back}{37}{back} \entry{bk}{37}{bk} \entry{left}{38}{left} \entry{lt}{38}{lt} \entry{right}{38}{right} \entry{rt}{38}{rt} \entry{setpos}{38}{setpos} \entry{setxy}{38}{setxy} \entry{setx}{38}{setx} \entry{sety}{38}{sety} \entry{setheading}{38}{setheading} \entry{seth}{38}{seth} \entry{home}{38}{home} \entry{arc}{39}{arc} \entry{pos}{39}{pos} \entry{xcor}{39}{xcor} \entry{ycor}{39}{ycor} \entry{heading}{39}{heading} \entry{towards}{39}{towards} \entry{scrunch}{39}{scrunch} \entry{showturtle}{39}{showturtle} \entry{st}{39}{st} \entry{hideturtle}{40}{hideturtle} \entry{ht}{40}{ht} \entry{clean}{40}{clean} \entry{clearscreen}{40}{clearscreen} \entry{cs}{40}{cs} \entry{wrap}{40}{wrap} \entry{window}{40}{window} \entry{fence}{40}{fence} \entry{fill}{41}{fill} \entry{filled}{41}{filled} \entry{label}{41}{label} \entry{setlabelheight}{41}{setlabelheight} \entry{textscreen}{41}{textscreen} \entry{fullscreen}{41}{fullscreen} \entry{fs}{41}{fs} \entry{splitscreen}{42}{splitscreen} \entry{ss}{42}{ss} \entry{setscrunch}{42}{setscrunch} \entry{scrunch.dat}{42}{scrunch.dat} \entry{refresh}{42}{refresh} \entry{norefresh}{42}{norefresh} \entry{shownp}{43}{shownp} \entry{shown?}{43}{shown?} \entry{screenmode}{43}{screenmode} \entry{turtlemode}{43}{turtlemode} \entry{labelsize}{43}{labelsize} \entry{pendown}{43}{pendown} \entry{pd}{43}{pd} \entry{penup}{43}{penup} \entry{pu}{43}{pu} \entry{penpaint}{44}{penpaint} \entry{ppt}{44}{ppt} \entry{penerase}{44}{penerase} \entry{pe}{44}{pe} \entry{penreverse}{44}{penreverse} \entry{px}{44}{px} \entry{setpencolor}{44}{setpencolor} \entry{setpc}{44}{setpc} \entry{setpalette}{44}{setpalette} \entry{setpensize}{44}{setpensize} \entry{setpenpattern}{45}{setpenpattern} \entry{setpen}{45}{setpen} \entry{setbackground}{45}{setbackground} \entry{setbg}{45}{setbg} \entry{pendownp}{45}{pendownp} \entry{pendown?}{45}{pendown?} \entry{penmode}{45}{penmode} \entry{pencolor}{45}{pencolor} \entry{pc}{45}{pc} \entry{palette}{46}{palette} \entry{pensize}{46}{pensize} \entry{penpattern}{46}{penpattern} \entry{pen}{46}{pen} \entry{background}{46}{background} \entry{bg}{46}{bg} \entry{savepict}{46}{savepict} \entry{loadpict}{46}{loadpict} \entry{epspict}{47}{epspict} \entry{mousepos}{47}{mousepos} \entry{clickpos}{47}{clickpos} \entry{buttonp}{47}{buttonp} \entry{button?}{47}{button?} \entry{button}{47}{button} \entry{to}{49}{to} \entry{define}{50}{define} \entry{text}{51}{text} \entry{fulltext}{51}{fulltext} \entry{copydef}{51}{copydef} \entry{make}{51}{make} \entry{name}{51}{name} \entry{local}{52}{local} \entry{localmake}{52}{localmake} \entry{thing}{52}{thing} \entry{global}{52}{global} \entry{pprop}{53}{pprop} \entry{gprop}{53}{gprop} \entry{remprop}{53}{remprop} \entry{plist}{53}{plist} \entry{procedurep}{53}{procedurep} \entry{procedure?}{53}{procedure?} \entry{primitivep}{53}{primitivep} \entry{primitive?}{53}{primitive?} \entry{definedp}{54}{definedp} \entry{defined?}{54}{defined?} \entry{namep}{54}{namep} \entry{name?}{54}{name?} \entry{plistp}{54}{plistp} \entry{plist?}{54}{plist?} \entry{contents}{54}{contents} \entry{buried}{54}{buried} \entry{traced}{54}{traced} \entry{stepped}{54}{stepped} \entry{procedures}{55}{procedures} \entry{primitives}{55}{primitives} \entry{names}{55}{names} \entry{plists}{55}{plists} \entry{namelist}{55}{namelist} \entry{pllist}{55}{pllist} \entry{arity}{55}{arity} \entry{nodes}{56}{nodes} \entry{printout}{56}{printout} \entry{po}{56}{po} \entry{poall}{56}{poall} \entry{pops}{56}{pops} \entry{pons}{56}{pons} \entry{popls}{57}{popls} \entry{pon}{57}{pon} \entry{popl}{57}{popl} \entry{pot}{57}{pot} \entry{pots}{57}{pots} \entry{erase}{57}{erase} \entry{er}{57}{er} \entry{erall}{58}{erall} \entry{erps}{58}{erps} \entry{erns}{58}{erns} \entry{erpls}{58}{erpls} \entry{ern}{58}{ern} \entry{erpl}{58}{erpl} \entry{bury}{59}{bury} \entry{buryall}{59}{buryall} \entry{buryname}{59}{buryname} \entry{unbury}{59}{unbury} \entry{unburyall}{59}{unburyall} \entry{unburyname}{59}{unburyname} \entry{buriedp}{60}{buriedp} \entry{buried?}{60}{buried?} \entry{trace}{60}{trace} \entry{untrace}{60}{untrace} \entry{tracedp}{60}{tracedp} \entry{traced?}{60}{traced?} \entry{step}{60}{step} \entry{unstep}{60}{unstep} \entry{steppedp}{61}{steppedp} \entry{stepped?}{61}{stepped?} \entry{editor}{61}{editor} \entry{temp}{61}{temp} \entry{edit}{61}{edit} \entry{ed}{61}{ed} \entry{editfile}{61}{editfile} \entry{edall}{62}{edall} \entry{edps}{62}{edps} \entry{edns}{62}{edns} \entry{edpls}{62}{edpls} \entry{edn}{62}{edn} \entry{edpl}{62}{edpl} \entry{save}{62}{save} \entry{savel}{63}{savel} \entry{load}{63}{load} \entry{cslsload}{63}{cslsload} \entry{logohelp}{63}{logohelp} \entry{help}{63}{help} \entry{seteditor}{64}{seteditor} \entry{setlibloc}{64}{setlibloc} \entry{setcslsloc}{64}{setcslsloc} \entry{sethelploc}{64}{sethelploc} \entry{settemploc}{64}{settemploc} \entry{gc}{64}{gc} \entry{.setsegmentsize}{65}{.setsegmentsize} \entry{run}{67}{run} \entry{runresult}{67}{runresult} \entry{repeat}{67}{repeat} \entry{forever}{67}{forever} \entry{repcount}{68}{repcount} \entry{if}{68}{if} \entry{ifelse}{68}{ifelse} \entry{test}{68}{test} \entry{iftrue}{68}{iftrue} \entry{ift}{68}{ift} \entry{iffalse}{68}{iffalse} \entry{iff}{68}{iff} \entry{stop}{69}{stop} \entry{output}{69}{output} \entry{op}{69}{op} \entry{catch}{69}{catch} \entry{throw}{69}{throw} \entry{error}{70}{error} \entry{pause}{70}{pause} \entry{continue}{70}{continue} \entry{co}{70}{co} \entry{wait}{71}{wait} \entry{bye}{71}{bye} \entry{.maybeoutput}{71}{.maybeoutput} \entry{goto}{71}{goto} \entry{tag}{72}{tag} \entry{ignore}{72}{ignore} \entry{`}{72}{`} \entry{for}{72}{for} \entry{do.while}{73}{do.while} \entry{while}{73}{while} \entry{do.until}{73}{do.until} \entry{until}{73}{until} \entry{case}{74}{case} \entry{cond}{74}{cond} \entry{template}{74}{template} \entry{apply}{76}{apply} \entry{invoke}{76}{invoke} \entry{foreach}{76}{foreach} \entry{map}{77}{map} \entry{map.se}{77}{map.se} \entry{filter}{78}{filter} \entry{find}{78}{find} \entry{reduce}{78}{reduce} \entry{crossmap}{79}{crossmap} \entry{cascade}{79}{cascade} \entry{cascade.2}{81}{cascade.2} \entry{transfer}{81}{transfer} \entry{.macro}{83}{.macro} \entry{.defmacro}{83}{.defmacro} \entry{macrop}{85}{macrop} \entry{macro?}{85}{macro?} \entry{macroexpand}{85}{macroexpand} \entry{errors}{87}{errors} \entry{allowgetset}{89}{allowgetset} \entry{buttonact}{89}{buttonact} \entry{caseignoredp}{89}{caseignoredp} \entry{commandline}{89}{commandline} \entry{erract}{89}{erract} \entry{fullprintp}{90}{fullprintp} \entry{keyact}{90}{keyact} \entry{loadnoisily}{90}{loadnoisily} \entry{printdepthlimit}{90}{printdepthlimit} \entry{printwidthlimit}{90}{printwidthlimit} \entry{redefp}{91}{redefp} \entry{startup}{91}{startup} \entry{unburyonedit}{91}{unburyonedit} \entry{usealternatenames}{91}{usealternatenames} \entry{logoversion}{91}{logoversion} \entry{logoplatform}{91}{logoplatform} ucblogo-6.1/docs/usermanual.aux0000664000175000017500000007567513601426467014772 0ustar jjcjjc@xrdef{INTRODUCTION-title}{Introduction} @xrdef{INTRODUCTION-snt}{Chapter@tie 1} @xrdef{OVERVIEW-title}{Overview} @xrdef{OVERVIEW-snt}{Section@tie 1.1} @xrdef{GETTER/SETTER VARIBLE SYNTAX-title}{Getter/Setter Variable Syntax} @xrdef{GETTER/SETTER VARIBLE SYNTAX-snt}{Section@tie 1.2} @xrdef{INTRODUCTION-pg}{1} @xrdef{OVERVIEW-pg}{1} @xrdef{GETTER/SETTER VARIBLE SYNTAX-pg}{2} @xrdef{ENTERING AND LEAVING LOGO-title}{Entering and Leaving Logo} @xrdef{ENTERING AND LEAVING LOGO-snt}{Section@tie 1.3} @xrdef{ENTERING AND LEAVING LOGO-pg}{5} @xrdef{TOKENIZATION-title}{Tokenization} @xrdef{TOKENIZATION-snt}{Section@tie 1.4} @xrdef{TOKENIZATION-pg}{6} @xrdef{DATA STRUCTURE PRIMITIVES-title}{Data Structure Primitives} @xrdef{DATA STRUCTURE PRIMITIVES-snt}{Chapter@tie 2} @xrdef{CONSTRUCTORS-title}{Constructors} @xrdef{CONSTRUCTORS-snt}{Section@tie 2.1} @xrdef{WORD-title}{word} @xrdef{WORD-snt}{} @xrdef{LIST-title}{list} @xrdef{LIST-snt}{} @xrdef{SENTENCE-title}{sentence} @xrdef{SENTENCE-snt}{} @xrdef{FPUT-title}{fput} @xrdef{FPUT-snt}{} @xrdef{LPUT-title}{lput} @xrdef{LPUT-snt}{} @xrdef{ARRAY-title}{array} @xrdef{ARRAY-snt}{} @xrdef{DATA STRUCTURE PRIMITIVES-pg}{9} @xrdef{CONSTRUCTORS-pg}{9} @xrdef{WORD-pg}{9} @xrdef{LIST-pg}{9} @xrdef{SENTENCE-pg}{9} @xrdef{FPUT-pg}{9} @xrdef{LPUT-pg}{9} @xrdef{ARRAY-pg}{9} @xrdef{MDARRAY-title}{mdarray} @xrdef{MDARRAY-snt}{} @xrdef{LISTTOARRAY-title}{listtoarray} @xrdef{LISTTOARRAY-snt}{} @xrdef{ARRAYTOLIST-title}{arraytolist} @xrdef{ARRAYTOLIST-snt}{} @xrdef{COMBINE-title}{combine} @xrdef{COMBINE-snt}{} @xrdef{REVERSE-title}{reverse} @xrdef{REVERSE-snt}{} @xrdef{GENSYM-title}{gensym} @xrdef{GENSYM-snt}{} @xrdef{SELECTORS-title}{Data Selectors} @xrdef{SELECTORS-snt}{Section@tie 2.2} @xrdef{FIRST-title}{first} @xrdef{FIRST-snt}{} @xrdef{MDARRAY-pg}{10} @xrdef{LISTTOARRAY-pg}{10} @xrdef{ARRAYTOLIST-pg}{10} @xrdef{COMBINE-pg}{10} @xrdef{REVERSE-pg}{10} @xrdef{GENSYM-pg}{10} @xrdef{SELECTORS-pg}{10} @xrdef{FIRST-pg}{10} @xrdef{FIRSTS-title}{firsts} @xrdef{FIRSTS-snt}{} @xrdef{LAST-title}{last} @xrdef{LAST-snt}{} @xrdef{BUTFIRST-title}{butfirst} @xrdef{BUTFIRST-snt}{} @xrdef{BUTFIRSTS-title}{butfirsts} @xrdef{BUTFIRSTS-snt}{} @xrdef{FIRSTS-pg}{11} @xrdef{LAST-pg}{11} @xrdef{BUTFIRST-pg}{11} @xrdef{BUTFIRSTS-pg}{11} @xrdef{BUTLAST-title}{butlast} @xrdef{BUTLAST-snt}{} @xrdef{ITEM-title}{item} @xrdef{ITEM-snt}{} @xrdef{MDITEM-title}{mditem} @xrdef{MDITEM-snt}{} @xrdef{PICK-title}{pick} @xrdef{PICK-snt}{} @xrdef{REMOVE-title}{remove} @xrdef{REMOVE-snt}{} @xrdef{REMDUP-title}{remdup} @xrdef{REMDUP-snt}{} @xrdef{QUOTED-title}{quoted} @xrdef{QUOTED-snt}{} @xrdef{MUTATORS-title}{Data Mutators} @xrdef{MUTATORS-snt}{Section@tie 2.3} @xrdef{SETITEM-title}{setitem} @xrdef{SETITEM-snt}{} @xrdef{BUTLAST-pg}{12} @xrdef{ITEM-pg}{12} @xrdef{MDITEM-pg}{12} @xrdef{PICK-pg}{12} @xrdef{REMOVE-pg}{12} @xrdef{REMDUP-pg}{12} @xrdef{QUOTED-pg}{12} @xrdef{MUTATORS-pg}{12} @xrdef{SETITEM-pg}{12} @xrdef{MDSETITEM-title}{mdsetitem} @xrdef{MDSETITEM-snt}{} @xrdef{dSETFIRST-title}{.setfirst} @xrdef{dSETFIRST-snt}{} @xrdef{dSETBF-title}{.setbf} @xrdef{dSETBF-snt}{} @xrdef{dSETITEM-title}{.setitem} @xrdef{dSETITEM-snt}{} @xrdef{PUSH-title}{push} @xrdef{PUSH-snt}{} @xrdef{POP-title}{pop} @xrdef{POP-snt}{} @xrdef{MDSETITEM-pg}{13} @xrdef{dSETFIRST-pg}{13} @xrdef{dSETBF-pg}{13} @xrdef{dSETITEM-pg}{13} @xrdef{PUSH-pg}{13} @xrdef{POP-pg}{13} @xrdef{QUEUE-title}{queue} @xrdef{QUEUE-snt}{} @xrdef{DEQUEUE-title}{dequeue} @xrdef{DEQUEUE-snt}{} @xrdef{PREDICATES-title}{Predicates} @xrdef{PREDICATES-snt}{Section@tie 2.4} @xrdef{WORDP-title}{wordp} @xrdef{WORDP-snt}{} @xrdef{LISTP-title}{listp} @xrdef{LISTP-snt}{} @xrdef{ARRAYP-title}{arrayp} @xrdef{ARRAYP-snt}{} @xrdef{EMPTYP-title}{emptyp} @xrdef{EMPTYP-snt}{} @xrdef{EQUALP-title}{equalp} @xrdef{EQUALP-snt}{} @xrdef{QUEUE-pg}{14} @xrdef{DEQUEUE-pg}{14} @xrdef{PREDICATES-pg}{14} @xrdef{WORDP-pg}{14} @xrdef{LISTP-pg}{14} @xrdef{ARRAYP-pg}{14} @xrdef{EMPTYP-pg}{14} @xrdef{EQUALP-pg}{14} @xrdef{NOTEQUALP-title}{notequalp} @xrdef{NOTEQUALP-snt}{} @xrdef{BEFOREP-title}{beforep} @xrdef{BEFOREP-snt}{} @xrdef{dEQ-title}{.eq} @xrdef{dEQ-snt}{} @xrdef{MEMBERP-title}{memberp} @xrdef{MEMBERP-snt}{} @xrdef{SUBSTRINGP-title}{substringp} @xrdef{SUBSTRINGP-snt}{} @xrdef{NOTEQUALP-pg}{15} @xrdef{BEFOREP-pg}{15} @xrdef{dEQ-pg}{15} @xrdef{MEMBERP-pg}{15} @xrdef{NUMBERP-title}{numberp} @xrdef{NUMBERP-snt}{} @xrdef{VBARREDP-title}{vbarredp} @xrdef{VBARREDP-snt}{} @xrdef{QUERIES-title}{Queries} @xrdef{QUERIES-snt}{Section@tie 2.5} @xrdef{COUNT-title}{count} @xrdef{COUNT-snt}{} @xrdef{ASCII-title}{ascii} @xrdef{ASCII-snt}{} @xrdef{RAWASCII-title}{rawascii} @xrdef{RAWASCII-snt}{} @xrdef{SUBSTRINGP-pg}{16} @xrdef{NUMBERP-pg}{16} @xrdef{VBARREDP-pg}{16} @xrdef{QUERIES-pg}{16} @xrdef{COUNT-pg}{16} @xrdef{ASCII-pg}{16} @xrdef{RAWASCII-pg}{16} @xrdef{CHAR-title}{char} @xrdef{CHAR-snt}{} @xrdef{MEMBER-title}{member} @xrdef{MEMBER-snt}{} @xrdef{LOWERCASE-title}{lowercase} @xrdef{LOWERCASE-snt}{} @xrdef{UPPERCASE-title}{uppercase} @xrdef{UPPERCASE-snt}{} @xrdef{STANDOUT-title}{standout} @xrdef{STANDOUT-snt}{} @xrdef{CHAR-pg}{17} @xrdef{MEMBER-pg}{17} @xrdef{LOWERCASE-pg}{17} @xrdef{UPPERCASE-pg}{17} @xrdef{STANDOUT-pg}{17} @xrdef{PARSE-title}{parse} @xrdef{PARSE-snt}{} @xrdef{RUNPARSE-title}{runparse} @xrdef{RUNPARSE-snt}{} @xrdef{PARSE-pg}{18} @xrdef{RUNPARSE-pg}{18} @xrdef{COMMUNICATION-title}{Communication} @xrdef{COMMUNICATION-snt}{Chapter@tie 3} @xrdef{TRANSMITTERS-title}{Transmitters} @xrdef{TRANSMITTERS-snt}{Section@tie 3.1} @xrdef{PRINT-title}{print} @xrdef{PRINT-snt}{} @xrdef{TYPE-title}{type} @xrdef{TYPE-snt}{} @xrdef{COMMUNICATION-pg}{19} @xrdef{TRANSMITTERS-pg}{19} @xrdef{PRINT-pg}{19} @xrdef{TYPE-pg}{19} @xrdef{SHOW-title}{show} @xrdef{SHOW-snt}{} @xrdef{RECEIVERS-title}{Receivers} @xrdef{RECEIVERS-snt}{Section@tie 3.2} @xrdef{READLIST-title}{readlist} @xrdef{READLIST-snt}{} @xrdef{READWORD-title}{readword} @xrdef{READWORD-snt}{} @xrdef{READRAWLINE-title}{readrawline} @xrdef{READRAWLINE-snt}{} @xrdef{SHOW-pg}{20} @xrdef{RECEIVERS-pg}{20} @xrdef{READLIST-pg}{20} @xrdef{READWORD-pg}{20} @xrdef{READRAWLINE-pg}{20} @xrdef{READCHAR-title}{readchar} @xrdef{READCHAR-snt}{} @xrdef{READCHARS-title}{readchars} @xrdef{READCHARS-snt}{} @xrdef{SHELL-title}{shell} @xrdef{SHELL-snt}{} @xrdef{READCHAR-pg}{21} @xrdef{READCHARS-pg}{21} @xrdef{SHELL-pg}{21} @xrdef{FILE ACCESS-title}{File Access} @xrdef{FILE ACCESS-snt}{Section@tie 3.3} @xrdef{SETPREFIX-title}{setprefix} @xrdef{SETPREFIX-snt}{} @xrdef{PREFIX-title}{prefix} @xrdef{PREFIX-snt}{} @xrdef{OPENREAD-title}{openread} @xrdef{OPENREAD-snt}{} @xrdef{OPENWRITE-title}{openwrite} @xrdef{OPENWRITE-snt}{} @xrdef{FILE ACCESS-pg}{22} @xrdef{SETPREFIX-pg}{22} @xrdef{PREFIX-pg}{22} @xrdef{OPENREAD-pg}{22} @xrdef{OPENWRITE-pg}{22} @xrdef{OPENAPPEND-title}{openappend} @xrdef{OPENAPPEND-snt}{} @xrdef{OPENUPDATE-title}{openupdate} @xrdef{OPENUPDATE-snt}{} @xrdef{CLOSE-title}{close} @xrdef{CLOSE-snt}{} @xrdef{ALLOPEN-title}{allopen} @xrdef{ALLOPEN-snt}{} @xrdef{CLOSEALL-title}{closeall} @xrdef{CLOSEALL-snt}{} @xrdef{ERASEFILE-title}{erasefile} @xrdef{ERASEFILE-snt}{} @xrdef{OPENAPPEND-pg}{23} @xrdef{OPENUPDATE-pg}{23} @xrdef{CLOSE-pg}{23} @xrdef{ALLOPEN-pg}{23} @xrdef{CLOSEALL-pg}{23} @xrdef{ERASEFILE-pg}{23} @xrdef{DRIBBLE-title}{dribble} @xrdef{DRIBBLE-snt}{} @xrdef{NODRIBBLE-title}{nodribble} @xrdef{NODRIBBLE-snt}{} @xrdef{SETREAD-title}{setread} @xrdef{SETREAD-snt}{} @xrdef{SETWRITE-title}{setwrite} @xrdef{SETWRITE-snt}{} @xrdef{READER-title}{reader} @xrdef{READER-snt}{} @xrdef{DRIBBLE-pg}{24} @xrdef{NODRIBBLE-pg}{24} @xrdef{SETREAD-pg}{24} @xrdef{SETWRITE-pg}{24} @xrdef{WRITER-title}{writer} @xrdef{WRITER-snt}{} @xrdef{SETREADPOS-title}{setreadpos} @xrdef{SETREADPOS-snt}{} @xrdef{SETWRITEPOS-title}{setwritepos} @xrdef{SETWRITEPOS-snt}{} @xrdef{READPOS-title}{readpos} @xrdef{READPOS-snt}{} @xrdef{WRITEPOS-title}{writepos} @xrdef{WRITEPOS-snt}{} @xrdef{EOFP-title}{eofp} @xrdef{EOFP-snt}{} @xrdef{FILEP-title}{filep} @xrdef{FILEP-snt}{} @xrdef{READER-pg}{25} @xrdef{WRITER-pg}{25} @xrdef{SETREADPOS-pg}{25} @xrdef{SETWRITEPOS-pg}{25} @xrdef{READPOS-pg}{25} @xrdef{WRITEPOS-pg}{25} @xrdef{EOFP-pg}{25} @xrdef{TERMINAL ACCESS-title}{Terminal Access} @xrdef{TERMINAL ACCESS-snt}{Section@tie 3.4} @xrdef{KEYP-title}{keyp} @xrdef{KEYP-snt}{} @xrdef{CLEARTEXT-title}{cleartext} @xrdef{CLEARTEXT-snt}{} @xrdef{SETCURSOR-title}{setcursor} @xrdef{SETCURSOR-snt}{} @xrdef{CURSOR-title}{cursor} @xrdef{CURSOR-snt}{} @xrdef{SETMARGINS-title}{setmargins} @xrdef{SETMARGINS-snt}{} @xrdef{FILEP-pg}{26} @xrdef{TERMINAL ACCESS-pg}{26} @xrdef{KEYP-pg}{26} @xrdef{CLEARTEXT-pg}{26} @xrdef{SETCURSOR-pg}{26} @xrdef{CURSOR-pg}{26} @xrdef{SETMARGINS-pg}{26} @xrdef{SETTEXTCOLOR-title}{settextcolor} @xrdef{SETTEXTCOLOR-snt}{} @xrdef{INCREASEFONT-title}{increasefont} @xrdef{INCREASEFONT-snt}{} @xrdef{SETTEXTSIZE-title}{settextsize} @xrdef{SETTEXTSIZE-snt}{} @xrdef{TEXTSIZE-title}{textsize} @xrdef{TEXTSIZE-snt}{} @xrdef{SETTEXTCOLOR-pg}{27} @xrdef{INCREASEFONT-pg}{27} @xrdef{SETTEXTSIZE-pg}{27} @xrdef{TEXTSIZE-pg}{27} @xrdef{SETFONT-title}{setfont} @xrdef{SETFONT-snt}{} @xrdef{FONT-title}{font} @xrdef{FONT-snt}{} @xrdef{SETFONT-pg}{28} @xrdef{FONT-pg}{28} @xrdef{ARITHMETIC-title}{Arithmetic} @xrdef{ARITHMETIC-snt}{Chapter@tie 4} @xrdef{NUMERIC OPERATIONS-title}{Numeric Operations} @xrdef{NUMERIC OPERATIONS-snt}{Section@tie 4.1} @xrdef{SUM-title}{sum} @xrdef{SUM-snt}{} @xrdef{DIFFERENCE-title}{difference} @xrdef{DIFFERENCE-snt}{} @xrdef{MINUS-title}{minus} @xrdef{MINUS-snt}{} @xrdef{PRODUCT-title}{product} @xrdef{PRODUCT-snt}{} @xrdef{QUOTIENT-title}{quotient} @xrdef{QUOTIENT-snt}{} @xrdef{REMAINDER-title}{remainder} @xrdef{REMAINDER-snt}{} @xrdef{ARITHMETIC-pg}{29} @xrdef{NUMERIC OPERATIONS-pg}{29} @xrdef{SUM-pg}{29} @xrdef{DIFFERENCE-pg}{29} @xrdef{MINUS-pg}{29} @xrdef{PRODUCT-pg}{29} @xrdef{QUOTIENT-pg}{29} @xrdef{MODULO-title}{modulo} @xrdef{MODULO-snt}{} @xrdef{INT-title}{int} @xrdef{INT-snt}{} @xrdef{ROUND-title}{round} @xrdef{ROUND-snt}{} @xrdef{SQRT-title}{sqrt} @xrdef{SQRT-snt}{} @xrdef{POWER-title}{power} @xrdef{POWER-snt}{} @xrdef{EXP-title}{exp} @xrdef{EXP-snt}{} @xrdef{LOG10-title}{log10} @xrdef{LOG10-snt}{} @xrdef{LN-title}{ln} @xrdef{LN-snt}{} @xrdef{SIN-title}{sin} @xrdef{SIN-snt}{} @xrdef{REMAINDER-pg}{30} @xrdef{MODULO-pg}{30} @xrdef{INT-pg}{30} @xrdef{ROUND-pg}{30} @xrdef{SQRT-pg}{30} @xrdef{POWER-pg}{30} @xrdef{EXP-pg}{30} @xrdef{LOG10-pg}{30} @xrdef{LN-pg}{30} @xrdef{RADSIN-title}{radsin} @xrdef{RADSIN-snt}{} @xrdef{COS-title}{cos} @xrdef{COS-snt}{} @xrdef{RADCOS-title}{radcos} @xrdef{RADCOS-snt}{} @xrdef{ARCTAN-title}{arctan} @xrdef{ARCTAN-snt}{} @xrdef{RADARCTAN-title}{radarctan} @xrdef{RADARCTAN-snt}{} @xrdef{ISEQ-title}{iseq} @xrdef{ISEQ-snt}{} @xrdef{RSEQ-title}{rseq} @xrdef{RSEQ-snt}{} @xrdef{SIN-pg}{31} @xrdef{RADSIN-pg}{31} @xrdef{COS-pg}{31} @xrdef{RADCOS-pg}{31} @xrdef{ARCTAN-pg}{31} @xrdef{RADARCTAN-pg}{31} @xrdef{ISEQ-pg}{31} @xrdef{RSEQ-pg}{31} @xrdef{NUMERIC PREDICATES-title}{Numeric Predicates} @xrdef{NUMERIC PREDICATES-snt}{Section@tie 4.2} @xrdef{LESSP-title}{lessp} @xrdef{LESSP-snt}{} @xrdef{GREATERP-title}{greaterp} @xrdef{GREATERP-snt}{} @xrdef{LESSEQUALP-title}{lessequalp} @xrdef{LESSEQUALP-snt}{} @xrdef{GREATEREQUALP-title}{greaterequalp} @xrdef{GREATEREQUALP-snt}{} @xrdef{RANDOM NUMBERS-title}{Random Numbers} @xrdef{RANDOM NUMBERS-snt}{Section@tie 4.3} @xrdef{RANDOM-title}{random} @xrdef{RANDOM-snt}{} @xrdef{RERANDOM-title}{rerandom} @xrdef{RERANDOM-snt}{} @xrdef{NUMERIC PREDICATES-pg}{32} @xrdef{LESSP-pg}{32} @xrdef{GREATERP-pg}{32} @xrdef{LESSEQUALP-pg}{32} @xrdef{GREATEREQUALP-pg}{32} @xrdef{RANDOM NUMBERS-pg}{32} @xrdef{RANDOM-pg}{32} @xrdef{PRINT FORMATTING-title}{Print Formatting} @xrdef{PRINT FORMATTING-snt}{Section@tie 4.4} @xrdef{FORM-title}{form} @xrdef{FORM-snt}{} @xrdef{BITWISE OPERATIONS-title}{Bitwise Operations} @xrdef{BITWISE OPERATIONS-snt}{Section@tie 4.5} @xrdef{BITAND-title}{bitand} @xrdef{BITAND-snt}{} @xrdef{BITOR-title}{bitor} @xrdef{BITOR-snt}{} @xrdef{BITXOR-title}{bitxor} @xrdef{BITXOR-snt}{} @xrdef{RERANDOM-pg}{33} @xrdef{PRINT FORMATTING-pg}{33} @xrdef{FORM-pg}{33} @xrdef{BITWISE OPERATIONS-pg}{33} @xrdef{BITAND-pg}{33} @xrdef{BITOR-pg}{33} @xrdef{BITXOR-pg}{33} @xrdef{BITNOT-title}{bitnot} @xrdef{BITNOT-snt}{} @xrdef{ASHIFT-title}{ashift} @xrdef{ASHIFT-snt}{} @xrdef{LSHIFT-title}{lshift} @xrdef{LSHIFT-snt}{} @xrdef{BITNOT-pg}{34} @xrdef{ASHIFT-pg}{34} @xrdef{LSHIFT-pg}{34} @xrdef{LOGICAL OPERATIONS-title}{Logical Operations} @xrdef{LOGICAL OPERATIONS-snt}{Chapter@tie 5} @xrdef{AND-title}{and} @xrdef{AND-snt}{} @xrdef{OR-title}{or} @xrdef{OR-snt}{} @xrdef{NOT-title}{not} @xrdef{NOT-snt}{} @xrdef{LOGICAL OPERATIONS-pg}{35} @xrdef{AND-pg}{35} @xrdef{OR-pg}{35} @xrdef{NOT-pg}{35} @xrdef{GRAPHICS-title}{Graphics} @xrdef{GRAPHICS-snt}{Chapter@tie 6} @xrdef{TURTLE MOTION-title}{Turtle Motion} @xrdef{TURTLE MOTION-snt}{Section@tie 6.1} @xrdef{FORWARD-title}{forward} @xrdef{FORWARD-snt}{} @xrdef{BACK-title}{back} @xrdef{BACK-snt}{} @xrdef{LEFT-title}{left} @xrdef{LEFT-snt}{} @xrdef{GRAPHICS-pg}{37} @xrdef{TURTLE MOTION-pg}{37} @xrdef{FORWARD-pg}{37} @xrdef{BACK-pg}{37} @xrdef{RIGHT-title}{right} @xrdef{RIGHT-snt}{} @xrdef{SETPOS-title}{setpos} @xrdef{SETPOS-snt}{} @xrdef{SETXY-title}{setxy} @xrdef{SETXY-snt}{} @xrdef{SETX-title}{setx} @xrdef{SETX-snt}{} @xrdef{SETY-title}{sety} @xrdef{SETY-snt}{} @xrdef{SETHEADING-title}{setheading} @xrdef{SETHEADING-snt}{} @xrdef{HOME-title}{home} @xrdef{HOME-snt}{} @xrdef{ARC-title}{arc} @xrdef{ARC-snt}{} @xrdef{LEFT-pg}{38} @xrdef{RIGHT-pg}{38} @xrdef{SETPOS-pg}{38} @xrdef{SETXY-pg}{38} @xrdef{SETX-pg}{38} @xrdef{SETY-pg}{38} @xrdef{SETHEADING-pg}{38} @xrdef{HOME-pg}{38} @xrdef{TURTLE MOTION QUERIES-title}{Turtle Motion Queries} @xrdef{TURTLE MOTION QUERIES-snt}{Section@tie 6.2} @xrdef{POS-title}{pos} @xrdef{POS-snt}{} @xrdef{XCOR-title}{xcor} @xrdef{XCOR-snt}{} @xrdef{YCOR-title}{ycor} @xrdef{YCOR-snt}{} @xrdef{HEADING-title}{heading} @xrdef{HEADING-snt}{} @xrdef{TOWARDS-title}{towards} @xrdef{TOWARDS-snt}{} @xrdef{SCRUNCH-title}{scrunch} @xrdef{SCRUNCH-snt}{} @xrdef{TURTLE AND WINDOW CONTROL-title}{Turtle and Window Control} @xrdef{TURTLE AND WINDOW CONTROL-snt}{Section@tie 6.3} @xrdef{SHOWTURTLE-title}{showturtle} @xrdef{SHOWTURTLE-snt}{} @xrdef{HIDETURTLE-title}{hideturtle} @xrdef{HIDETURTLE-snt}{} @xrdef{ARC-pg}{39} @xrdef{TURTLE MOTION QUERIES-pg}{39} @xrdef{POS-pg}{39} @xrdef{XCOR-pg}{39} @xrdef{YCOR-pg}{39} @xrdef{HEADING-pg}{39} @xrdef{TOWARDS-pg}{39} @xrdef{SCRUNCH-pg}{39} @xrdef{TURTLE AND WINDOW CONTROL-pg}{39} @xrdef{SHOWTURTLE-pg}{39} @xrdef{CLEAN-title}{clean} @xrdef{CLEAN-snt}{} @xrdef{CLEARSCREEN-title}{clearscreen} @xrdef{CLEARSCREEN-snt}{} @xrdef{WRAP-title}{wrap} @xrdef{WRAP-snt}{} @xrdef{WINDOW-title}{window} @xrdef{WINDOW-snt}{} @xrdef{FENCE-title}{fence} @xrdef{FENCE-snt}{} @xrdef{HIDETURTLE-pg}{40} @xrdef{CLEAN-pg}{40} @xrdef{CLEARSCREEN-pg}{40} @xrdef{WRAP-pg}{40} @xrdef{WINDOW-pg}{40} @xrdef{FENCE-pg}{40} @xrdef{FILL-title}{fill} @xrdef{FILL-snt}{} @xrdef{FILLED-title}{filled} @xrdef{FILLED-snt}{} @xrdef{LABEL-title}{label} @xrdef{LABEL-snt}{} @xrdef{SETLABELHEIGHT-title}{setlabelheight} @xrdef{SETLABELHEIGHT-snt}{} @xrdef{TEXTSCREEN-title}{textscreen} @xrdef{TEXTSCREEN-snt}{} @xrdef{FULLSCREEN-title}{fullscreen} @xrdef{FULLSCREEN-snt}{} @xrdef{FILL-pg}{41} @xrdef{FILLED-pg}{41} @xrdef{LABEL-pg}{41} @xrdef{SETLABELHEIGHT-pg}{41} @xrdef{TEXTSCREEN-pg}{41} @xrdef{FULLSCREEN-pg}{41} @xrdef{SPLITSCREEN-title}{splitscreen} @xrdef{SPLITSCREEN-snt}{} @xrdef{SETSCRUNCH-title}{setscrunch} @xrdef{SETSCRUNCH-snt}{} @xrdef{REFRESH-title}{refresh} @xrdef{REFRESH-snt}{} @xrdef{NOREFRESH-title}{norefresh} @xrdef{NOREFRESH-snt}{} @xrdef{TURTLE AND WINDOW QUERIES-title}{Turtle and Window Queries} @xrdef{TURTLE AND WINDOW QUERIES-snt}{Section@tie 6.4} @xrdef{SHOWNP-title}{shownp} @xrdef{SHOWNP-snt}{} @xrdef{SPLITSCREEN-pg}{42} @xrdef{SETSCRUNCH-pg}{42} @xrdef{REFRESH-pg}{42} @xrdef{NOREFRESH-pg}{42} @xrdef{TURTLE AND WINDOW QUERIES-pg}{42} @xrdef{SCREENMODE-title}{screenmode} @xrdef{SCREENMODE-snt}{} @xrdef{TURTLEMODE-title}{turtlemode} @xrdef{TURTLEMODE-snt}{} @xrdef{LABELSIZE-title}{labelsize} @xrdef{LABELSIZE-snt}{} @xrdef{PEN AND BACKGROUND CONTROL-title}{Pen and Background Control} @xrdef{PEN AND BACKGROUND CONTROL-snt}{Section@tie 6.5} @xrdef{PENDOWN-title}{pendown} @xrdef{PENDOWN-snt}{} @xrdef{PENUP-title}{penup} @xrdef{PENUP-snt}{} @xrdef{PENPAINT-title}{penpaint} @xrdef{PENPAINT-snt}{} @xrdef{SHOWNP-pg}{43} @xrdef{SCREENMODE-pg}{43} @xrdef{TURTLEMODE-pg}{43} @xrdef{LABELSIZE-pg}{43} @xrdef{PEN AND BACKGROUND CONTROL-pg}{43} @xrdef{PENDOWN-pg}{43} @xrdef{PENUP-pg}{43} @xrdef{PENERASE-title}{penerase} @xrdef{PENERASE-snt}{} @xrdef{PENREVERSE-title}{penreverse} @xrdef{PENREVERSE-snt}{} @xrdef{SETPENCOLOR-title}{setpencolor} @xrdef{SETPENCOLOR-snt}{} @xrdef{SETPALETTE-title}{setpalette} @xrdef{SETPALETTE-snt}{} @xrdef{SETPENSIZE-title}{setpensize} @xrdef{SETPENSIZE-snt}{} @xrdef{PENPAINT-pg}{44} @xrdef{PENERASE-pg}{44} @xrdef{PENREVERSE-pg}{44} @xrdef{SETPENCOLOR-pg}{44} @xrdef{SETPALETTE-pg}{44} @xrdef{SETPENSIZE-pg}{44} @xrdef{SETPENPATTERN-title}{setpenpattern} @xrdef{SETPENPATTERN-snt}{} @xrdef{SETPEN-title}{setpen} @xrdef{SETPEN-snt}{} @xrdef{SETBACKGROUND-title}{setbackground} @xrdef{SETBACKGROUND-snt}{} @xrdef{PEN QUERIES-title}{Pen Queries} @xrdef{PEN QUERIES-snt}{Section@tie 6.6} @xrdef{PENDOWNP-title}{pendownp} @xrdef{PENDOWNP-snt}{} @xrdef{PENMODE-title}{penmode} @xrdef{PENMODE-snt}{} @xrdef{PENCOLOR-title}{pencolor} @xrdef{PENCOLOR-snt}{} @xrdef{SETPENPATTERN-pg}{45} @xrdef{SETPEN-pg}{45} @xrdef{SETBACKGROUND-pg}{45} @xrdef{PEN QUERIES-pg}{45} @xrdef{PENDOWNP-pg}{45} @xrdef{PENMODE-pg}{45} @xrdef{PENCOLOR-pg}{45} @xrdef{PALETTE-title}{palette} @xrdef{PALETTE-snt}{} @xrdef{PENSIZE-title}{pensize} @xrdef{PENSIZE-snt}{} @xrdef{PEN-title}{pen} @xrdef{PEN-snt}{} @xrdef{BACKGROUND-title}{background} @xrdef{BACKGROUND-snt}{} @xrdef{SAVING AND LOADING PICTURES-title}{Saving and Loading Pictures} @xrdef{SAVING AND LOADING PICTURES-snt}{Section@tie 6.7} @xrdef{SAVEPICT-title}{savepict} @xrdef{SAVEPICT-snt}{} @xrdef{LOADPICT-title}{loadpict} @xrdef{LOADPICT-snt}{} @xrdef{PALETTE-pg}{46} @xrdef{PENSIZE-pg}{46} @xrdef{PEN-pg}{46} @xrdef{BACKGROUND-pg}{46} @xrdef{SAVING AND LOADING PICTURES-pg}{46} @xrdef{SAVEPICT-pg}{46} @xrdef{LOADPICT-pg}{46} @xrdef{EPSPICT-title}{epspict} @xrdef{EPSPICT-snt}{} @xrdef{MOUSE QUERIES-title}{Mouse Queries} @xrdef{MOUSE QUERIES-snt}{Section@tie 6.8} @xrdef{MOUSEPOS-title}{mousepos} @xrdef{MOUSEPOS-snt}{} @xrdef{CLICKPOS-title}{clickpos} @xrdef{CLICKPOS-snt}{} @xrdef{BUTTONP-title}{buttonp} @xrdef{BUTTONP-snt}{} @xrdef{BUTTON-title}{button} @xrdef{BUTTON-snt}{} @xrdef{EPSPICT-pg}{47} @xrdef{MOUSE QUERIES-pg}{47} @xrdef{MOUSEPOS-pg}{47} @xrdef{CLICKPOS-pg}{47} @xrdef{BUTTONP-pg}{47} @xrdef{BUTTON-pg}{47} @xrdef{WORKSPACE MANAGEMENT-title}{Workspace Management} @xrdef{WORKSPACE MANAGEMENT-snt}{Chapter@tie 7} @xrdef{PROCEDURE DEFINITION-title}{Procedure Definition} @xrdef{PROCEDURE DEFINITION-snt}{Section@tie 7.1} @xrdef{TO-title}{to} @xrdef{TO-snt}{} @xrdef{WORKSPACE MANAGEMENT-pg}{49} @xrdef{PROCEDURE DEFINITION-pg}{49} @xrdef{TO-pg}{49} @xrdef{DEFINE-title}{define} @xrdef{DEFINE-snt}{} @xrdef{DEFINE-pg}{50} @xrdef{TEXT-title}{text} @xrdef{TEXT-snt}{} @xrdef{FULLTEXT-title}{fulltext} @xrdef{FULLTEXT-snt}{} @xrdef{COPYDEF-title}{copydef} @xrdef{COPYDEF-snt}{} @xrdef{VARIABLE DEFINITION-title}{Variable Definition} @xrdef{VARIABLE DEFINITION-snt}{Section@tie 7.2} @xrdef{MAKE-title}{make} @xrdef{MAKE-snt}{} @xrdef{NAME-title}{name} @xrdef{NAME-snt}{} @xrdef{TEXT-pg}{51} @xrdef{FULLTEXT-pg}{51} @xrdef{COPYDEF-pg}{51} @xrdef{VARIABLE DEFINITION-pg}{51} @xrdef{MAKE-pg}{51} @xrdef{NAME-pg}{51} @xrdef{LOCAL-title}{local} @xrdef{LOCAL-snt}{} @xrdef{LOCALMAKE-title}{localmake} @xrdef{LOCALMAKE-snt}{} @xrdef{THING-title}{thing} @xrdef{THING-snt}{} @xrdef{GLOBAL-title}{global} @xrdef{GLOBAL-snt}{} @xrdef{PROPERTY LISTS-title}{Property Lists} @xrdef{PROPERTY LISTS-snt}{Section@tie 7.3} @xrdef{LOCAL-pg}{52} @xrdef{LOCALMAKE-pg}{52} @xrdef{THING-pg}{52} @xrdef{GLOBAL-pg}{52} @xrdef{PPROP-title}{pprop} @xrdef{PPROP-snt}{} @xrdef{GPROP-title}{gprop} @xrdef{GPROP-snt}{} @xrdef{REMPROP-title}{remprop} @xrdef{REMPROP-snt}{} @xrdef{PLIST-title}{plist} @xrdef{PLIST-snt}{} @xrdef{WORKSPACE PREDICATES-title}{Workspace Predicates} @xrdef{WORKSPACE PREDICATES-snt}{Section@tie 7.4} @xrdef{PROCEDUREP-title}{procedurep} @xrdef{PROCEDUREP-snt}{} @xrdef{PRIMITIVEP-title}{primitivep} @xrdef{PRIMITIVEP-snt}{} @xrdef{PROPERTY LISTS-pg}{53} @xrdef{PPROP-pg}{53} @xrdef{GPROP-pg}{53} @xrdef{REMPROP-pg}{53} @xrdef{PLIST-pg}{53} @xrdef{WORKSPACE PREDICATES-pg}{53} @xrdef{PROCEDUREP-pg}{53} @xrdef{PRIMITIVEP-pg}{53} @xrdef{DEFINEDP-title}{definedp} @xrdef{DEFINEDP-snt}{} @xrdef{NAMEP-title}{namep} @xrdef{NAMEP-snt}{} @xrdef{PLISTP-title}{plistp} @xrdef{PLISTP-snt}{} @xrdef{WORKSPACE QUERIES-title}{Workspace Queries} @xrdef{WORKSPACE QUERIES-snt}{Section@tie 7.5} @xrdef{CONTENTS-title}{contents} @xrdef{CONTENTS-snt}{} @xrdef{BURIED-title}{buried} @xrdef{BURIED-snt}{} @xrdef{TRACED-title}{traced} @xrdef{TRACED-snt}{} @xrdef{STEPPED-title}{stepped} @xrdef{STEPPED-snt}{} @xrdef{DEFINEDP-pg}{54} @xrdef{NAMEP-pg}{54} @xrdef{PLISTP-pg}{54} @xrdef{WORKSPACE QUERIES-pg}{54} @xrdef{CONTENTS-pg}{54} @xrdef{BURIED-pg}{54} @xrdef{TRACED-pg}{54} @xrdef{STEPPED-pg}{54} @xrdef{PROCEDURES-title}{procedures} @xrdef{PROCEDURES-snt}{} @xrdef{PRIMITIVES-title}{primitives} @xrdef{PRIMITIVES-snt}{} @xrdef{NAMES-title}{names} @xrdef{NAMES-snt}{} @xrdef{PLISTS-title}{plists} @xrdef{PLISTS-snt}{} @xrdef{NAMELIST-title}{namelist} @xrdef{NAMELIST-snt}{} @xrdef{PLLIST-title}{pllist} @xrdef{PLLIST-snt}{} @xrdef{ARITY-title}{arity} @xrdef{ARITY-snt}{} @xrdef{PROCEDURES-pg}{55} @xrdef{PRIMITIVES-pg}{55} @xrdef{NAMES-pg}{55} @xrdef{PLISTS-pg}{55} @xrdef{NAMELIST-pg}{55} @xrdef{PLLIST-pg}{55} @xrdef{ARITY-pg}{55} @xrdef{NODES-title}{nodes} @xrdef{NODES-snt}{} @xrdef{WORKSPACE INSPECTION-title}{Workspace Inspection} @xrdef{WORKSPACE INSPECTION-snt}{Section@tie 7.6} @xrdef{PO-title}{po} @xrdef{PO-snt}{} @xrdef{POALL-title}{poall} @xrdef{POALL-snt}{} @xrdef{POPS-title}{pops} @xrdef{POPS-snt}{} @xrdef{PONS-title}{pons} @xrdef{PONS-snt}{} @xrdef{POPLS-title}{popls} @xrdef{POPLS-snt}{} @xrdef{NODES-pg}{56} @xrdef{WORKSPACE INSPECTION-pg}{56} @xrdef{PO-pg}{56} @xrdef{POALL-pg}{56} @xrdef{POPS-pg}{56} @xrdef{PONS-pg}{56} @xrdef{PON-title}{pon} @xrdef{PON-snt}{} @xrdef{POPL-title}{popl} @xrdef{POPL-snt}{} @xrdef{POT-title}{pot} @xrdef{POT-snt}{} @xrdef{POTS-title}{pots} @xrdef{POTS-snt}{} @xrdef{WORKSPACE CONTROL-title}{Workspace Control} @xrdef{WORKSPACE CONTROL-snt}{Section@tie 7.7} @xrdef{ERASE-title}{erase} @xrdef{ERASE-snt}{} @xrdef{POPLS-pg}{57} @xrdef{PON-pg}{57} @xrdef{POPL-pg}{57} @xrdef{POT-pg}{57} @xrdef{POTS-pg}{57} @xrdef{WORKSPACE CONTROL-pg}{57} @xrdef{ERASE-pg}{57} @xrdef{ERALL-title}{erall} @xrdef{ERALL-snt}{} @xrdef{ERPS-title}{erps} @xrdef{ERPS-snt}{} @xrdef{ERNS-title}{erns} @xrdef{ERNS-snt}{} @xrdef{ERPLS-title}{erpls} @xrdef{ERPLS-snt}{} @xrdef{ERN-title}{ern} @xrdef{ERN-snt}{} @xrdef{ERPL-title}{erpl} @xrdef{ERPL-snt}{} @xrdef{ERALL-pg}{58} @xrdef{ERPS-pg}{58} @xrdef{ERNS-pg}{58} @xrdef{ERPLS-pg}{58} @xrdef{ERN-pg}{58} @xrdef{ERPL-pg}{58} @xrdef{BURY-title}{bury} @xrdef{BURY-snt}{} @xrdef{BURYALL-title}{buryall} @xrdef{BURYALL-snt}{} @xrdef{BURYNAME-title}{buryname} @xrdef{BURYNAME-snt}{} @xrdef{UNBURY-title}{unbury} @xrdef{UNBURY-snt}{} @xrdef{UNBURYALL-title}{unburyall} @xrdef{UNBURYALL-snt}{} @xrdef{UNBURYNAME-title}{unburyname} @xrdef{UNBURYNAME-snt}{} @xrdef{BURIEDP-title}{buriedp} @xrdef{BURIEDP-snt}{} @xrdef{BURY-pg}{59} @xrdef{BURYALL-pg}{59} @xrdef{BURYNAME-pg}{59} @xrdef{UNBURY-pg}{59} @xrdef{UNBURYALL-pg}{59} @xrdef{UNBURYNAME-pg}{59} @xrdef{TRACE-title}{trace} @xrdef{TRACE-snt}{} @xrdef{UNTRACE-title}{untrace} @xrdef{UNTRACE-snt}{} @xrdef{TRACEDP-title}{tracedp} @xrdef{TRACEDP-snt}{} @xrdef{STEP-title}{step} @xrdef{STEP-snt}{} @xrdef{UNSTEP-title}{unstep} @xrdef{UNSTEP-snt}{} @xrdef{STEPPEDP-title}{steppedp} @xrdef{STEPPEDP-snt}{} @xrdef{BURIEDP-pg}{60} @xrdef{TRACE-pg}{60} @xrdef{UNTRACE-pg}{60} @xrdef{TRACEDP-pg}{60} @xrdef{STEP-pg}{60} @xrdef{UNSTEP-pg}{60} @xrdef{EDIT-title}{edit} @xrdef{EDIT-snt}{} @xrdef{EDITFILE-title}{editfile} @xrdef{EDITFILE-snt}{} @xrdef{STEPPEDP-pg}{61} @xrdef{EDIT-pg}{61} @xrdef{EDITFILE-pg}{61} @xrdef{EDALL-title}{edall} @xrdef{EDALL-snt}{} @xrdef{EDPS-title}{edps} @xrdef{EDPS-snt}{} @xrdef{EDNS-title}{edns} @xrdef{EDNS-snt}{} @xrdef{EDPLS-title}{edpls} @xrdef{EDPLS-snt}{} @xrdef{EDN-title}{edn} @xrdef{EDN-snt}{} @xrdef{EDPL-title}{edpl} @xrdef{EDPL-snt}{} @xrdef{SAVE-title}{save} @xrdef{SAVE-snt}{} @xrdef{EDALL-pg}{62} @xrdef{EDPS-pg}{62} @xrdef{EDNS-pg}{62} @xrdef{EDPLS-pg}{62} @xrdef{EDN-pg}{62} @xrdef{EDPL-pg}{62} @xrdef{SAVE-pg}{62} @xrdef{SAVEL-title}{savel} @xrdef{SAVEL-snt}{} @xrdef{LOAD-title}{load} @xrdef{LOAD-snt}{} @xrdef{CSLSLOAD-title}{cslsload} @xrdef{CSLSLOAD-snt}{} @xrdef{HELP-title}{help} @xrdef{HELP-snt}{} @xrdef{SAVEL-pg}{63} @xrdef{LOAD-pg}{63} @xrdef{CSLSLOAD-pg}{63} @xrdef{HELP-pg}{63} @xrdef{SETEDITOR-title}{seteditor} @xrdef{SETEDITOR-snt}{} @xrdef{SETLIBLOC-title}{setlibloc} @xrdef{SETLIBLOC-snt}{} @xrdef{SETCSLSLOC-title}{setcslsloc} @xrdef{SETCSLSLOC-snt}{} @xrdef{SETHELPLOC-title}{sethelploc} @xrdef{SETHELPLOC-snt}{} @xrdef{SETTEMPLOC-title}{settemploc} @xrdef{SETTEMPLOC-snt}{} @xrdef{GC-title}{gc} @xrdef{GC-snt}{} @xrdef{SETEDITOR-pg}{64} @xrdef{SETLIBLOC-pg}{64} @xrdef{SETCSLSLOC-pg}{64} @xrdef{SETHELPLOC-pg}{64} @xrdef{SETTEMPLOC-pg}{64} @xrdef{GC-pg}{64} @xrdef{.SETSEGMENTSIZE-title}{.setsegmentsize} @xrdef{.SETSEGMENTSIZE-snt}{} @xrdef{.SETSEGMENTSIZE-pg}{65} @xrdef{CONTROL STRUCTURES-title}{Control Structures} @xrdef{CONTROL STRUCTURES-snt}{Chapter@tie 8} @xrdef{CONTROL-title}{Control} @xrdef{CONTROL-snt}{Section@tie 8.1} @xrdef{RUN-title}{run} @xrdef{RUN-snt}{} @xrdef{RUNRESULT-title}{runresult} @xrdef{RUNRESULT-snt}{} @xrdef{REPEAT-title}{repeat} @xrdef{REPEAT-snt}{} @xrdef{FOREVER-title}{forever} @xrdef{FOREVER-snt}{} @xrdef{REPCOUNT-title}{repcount} @xrdef{REPCOUNT-snt}{} @xrdef{CONTROL STRUCTURES-pg}{67} @xrdef{CONTROL-pg}{67} @xrdef{RUN-pg}{67} @xrdef{RUNRESULT-pg}{67} @xrdef{REPEAT-pg}{67} @xrdef{FOREVER-pg}{67} @xrdef{IF-title}{if} @xrdef{IF-snt}{} @xrdef{IFELSE-title}{ifelse} @xrdef{IFELSE-snt}{} @xrdef{TEST-title}{test} @xrdef{TEST-snt}{} @xrdef{IFTRUE-title}{iftrue} @xrdef{IFTRUE-snt}{} @xrdef{IFFALSE-title}{iffalse} @xrdef{IFFALSE-snt}{} @xrdef{REPCOUNT-pg}{68} @xrdef{IF-pg}{68} @xrdef{IFELSE-pg}{68} @xrdef{TEST-pg}{68} @xrdef{IFTRUE-pg}{68} @xrdef{IFFALSE-pg}{68} @xrdef{STOP-title}{stop} @xrdef{STOP-snt}{} @xrdef{OUTPUT-title}{output} @xrdef{OUTPUT-snt}{} @xrdef{CATCH-title}{catch} @xrdef{CATCH-snt}{} @xrdef{THROW-title}{throw} @xrdef{THROW-snt}{} @xrdef{STOP-pg}{69} @xrdef{OUTPUT-pg}{69} @xrdef{CATCH-pg}{69} @xrdef{THROW-pg}{69} @xrdef{ERROR-title}{error} @xrdef{ERROR-snt}{} @xrdef{PAUSE-title}{pause} @xrdef{PAUSE-snt}{} @xrdef{CONTINUE-title}{continue} @xrdef{CONTINUE-snt}{} @xrdef{ERROR-pg}{70} @xrdef{PAUSE-pg}{70} @xrdef{CONTINUE-pg}{70} @xrdef{WAIT-title}{wait} @xrdef{WAIT-snt}{} @xrdef{BYE-title}{bye} @xrdef{BYE-snt}{} @xrdef{dMAYBEOUTPUT-title}{.maybeoutput} @xrdef{dMAYBEOUTPUT-snt}{} @xrdef{GOTO-title}{goto} @xrdef{GOTO-snt}{} @xrdef{TAG-title}{tag} @xrdef{TAG-snt}{} @xrdef{WAIT-pg}{71} @xrdef{BYE-pg}{71} @xrdef{dMAYBEOUTPUT-pg}{71} @xrdef{GOTO-pg}{71} @xrdef{IGNORE-title}{ignore} @xrdef{IGNORE-snt}{} @xrdef{back-quote-title}{`} @xrdef{back-quote-snt}{} @xrdef{FOR-title}{for} @xrdef{FOR-snt}{} @xrdef{TAG-pg}{72} @xrdef{IGNORE-pg}{72} @xrdef{back-quote-pg}{72} @xrdef{FOR-pg}{72} @xrdef{DOdWHILE-title}{do.while} @xrdef{DOdWHILE-snt}{} @xrdef{WHILE-title}{while} @xrdef{WHILE-snt}{} @xrdef{DOdUNTIL-title}{do.until} @xrdef{DOdUNTIL-snt}{} @xrdef{UNTIL-title}{until} @xrdef{UNTIL-snt}{} @xrdef{DOdWHILE-pg}{73} @xrdef{WHILE-pg}{73} @xrdef{DOdUNTIL-pg}{73} @xrdef{UNTIL-pg}{73} @xrdef{CASE-title}{case} @xrdef{CASE-snt}{} @xrdef{COND-title}{cond} @xrdef{COND-snt}{} @xrdef{TEMPLATE-BASED ITERATION-title}{Template-based Iteration} @xrdef{TEMPLATE-BASED ITERATION-snt}{Section@tie 8.2} @xrdef{CASE-pg}{74} @xrdef{COND-pg}{74} @xrdef{TEMPLATE-BASED ITERATION-pg}{74} @xrdef{APPLY-title}{apply} @xrdef{APPLY-snt}{} @xrdef{INVOKE-title}{invoke} @xrdef{INVOKE-snt}{} @xrdef{FOREACH-title}{foreach} @xrdef{FOREACH-snt}{} @xrdef{APPLY-pg}{76} @xrdef{INVOKE-pg}{76} @xrdef{FOREACH-pg}{76} @xrdef{MAP-title}{map} @xrdef{MAP-snt}{} @xrdef{MAPdSE-title}{map.se} @xrdef{MAPdSE-snt}{} @xrdef{MAP-pg}{77} @xrdef{MAPdSE-pg}{77} @xrdef{FILTER-title}{filter} @xrdef{FILTER-snt}{} @xrdef{FIND-title}{find} @xrdef{FIND-snt}{} @xrdef{REDUCE-title}{reduce} @xrdef{REDUCE-snt}{} @xrdef{FILTER-pg}{78} @xrdef{FIND-pg}{78} @xrdef{REDUCE-pg}{78} @xrdef{CROSSMAP-title}{crossmap} @xrdef{CROSSMAP-snt}{} @xrdef{CASCADE-title}{cascade} @xrdef{CASCADE-snt}{} @xrdef{CROSSMAP-pg}{79} @xrdef{CASCADE-pg}{79} @xrdef{CASCADEd2-title}{cascade.2} @xrdef{CASCADEd2-snt}{} @xrdef{TRANSFER-title}{transfer} @xrdef{TRANSFER-snt}{} @xrdef{CASCADEd2-pg}{81} @xrdef{TRANSFER-pg}{81} @xrdef{MACROS-title}{Macros} @xrdef{MACROS-snt}{Chapter@tie 9} @xrdef{dMACRO-title}{.macro} @xrdef{dMACRO-snt}{} @xrdef{MACROS-pg}{83} @xrdef{dMACRO-pg}{83} @xrdef{dDEFMACRO-title}{.defmacro} @xrdef{dDEFMACRO-snt}{} @xrdef{MACROP-title}{macrop} @xrdef{MACROP-snt}{} @xrdef{MACROEXPAND-title}{macroexpand} @xrdef{MACROEXPAND-snt}{} @xrdef{dDEFMACRO-pg}{85} @xrdef{MACROP-pg}{85} @xrdef{MACROEXPAND-pg}{85} @xrdef{ERROR PROCESSING-title}{Error Processing} @xrdef{ERROR PROCESSING-snt}{Chapter@tie 10} @xrdef{ERROR CODES-title}{Error Codes} @xrdef{ERROR CODES-snt}{Section@tie 10.1} @xrdef{ERROR PROCESSING-pg}{87} @xrdef{ERROR CODES-pg}{87} @xrdef{SPECIAL VARIABLES-title}{Special Variables} @xrdef{SPECIAL VARIABLES-snt}{Chapter@tie 11} @xrdef{ALLOWGETSET-title}{allowgetset} @xrdef{ALLOWGETSET-snt}{} @xrdef{BUTTONACT-title}{buttonact} @xrdef{BUTTONACT-snt}{} @xrdef{CASEIGNOREDP-title}{caseignoredp} @xrdef{CASEIGNOREDP-snt}{} @xrdef{COMMANDLINE-title}{commandline} @xrdef{COMMANDLINE-snt}{} @xrdef{ERRACT-title}{erract} @xrdef{ERRACT-snt}{} @xrdef{SPECIAL VARIABLES-pg}{89} @xrdef{ALLOWGETSET-pg}{89} @xrdef{BUTTONACT-pg}{89} @xrdef{CASEIGNOREDP-pg}{89} @xrdef{COMMANDLINE-pg}{89} @xrdef{ERRACT-pg}{89} @xrdef{FULLPRINTP-title}{fullprintp} @xrdef{FULLPRINTP-snt}{} @xrdef{KEYACT-title}{keyact} @xrdef{KEYACT-snt}{} @xrdef{LOADNOISILY-title}{loadnoisily} @xrdef{LOADNOISILY-snt}{} @xrdef{PRINTDEPTHLIMIT-title}{printdepthlimit} @xrdef{PRINTDEPTHLIMIT-snt}{} @xrdef{PRINTWIDTHLIMIT-title}{printwidthlimit} @xrdef{PRINTWIDTHLIMIT-snt}{} @xrdef{FULLPRINTP-pg}{90} @xrdef{KEYACT-pg}{90} @xrdef{LOADNOISILY-pg}{90} @xrdef{PRINTDEPTHLIMIT-pg}{90} @xrdef{PRINTWIDTHLIMIT-pg}{90} @xrdef{REDEFP-title}{redefp} @xrdef{REDEFP-snt}{} @xrdef{STARTUP-title}{startup} @xrdef{STARTUP-snt}{} @xrdef{UNBURYONEDIT-title}{unburyonedit} @xrdef{UNBURYONEDIT-snt}{} @xrdef{USEALTERNATENAMES-title}{usealternatenames} @xrdef{USEALTERNATENAMES-snt}{} @xrdef{LOGOVERSION-title}{logoversion} @xrdef{LOGOVERSION-snt}{} @xrdef{LOGOPLATFORM-title}{logoplatform} @xrdef{LOGOPLATFORM-snt}{} @xrdef{REDEFP-pg}{91} @xrdef{STARTUP-pg}{91} @xrdef{UNBURYONEDIT-pg}{91} @xrdef{USEALTERNATENAMES-pg}{91} @xrdef{LOGOVERSION-pg}{91} @xrdef{LOGOPLATFORM-pg}{91} @xrdef{INTERNATIONALIZATION-title}{Internationalization} @xrdef{INTERNATIONALIZATION-snt}{Chapter@tie 12} @xrdef{INTERNATIONALIZATION-pg}{93} @xrdef{INDEX-title}{INDEX} @xrdef{INDEX-snt}{} @xrdef{INDEX-pg}{97} ucblogo-6.1/docs/logo.10000664000175000017500000000046713575571772013116 0ustar jjcjjc.TH LOGO 1 .SH NAME logo, logo-wx \- start the Logo Programming Language interpreter .SH SYNOPSIS .B logo [\fIfile\fR] .SH DESCRIPTION .B logo begins running the logo programming language interperter. If a file is provided, it will run those commands first. The full manual is available as .PP .B info ucblogo ucblogo-6.1/docs/usermanual.texi0000664000175000017500000067420013601420003015107 0ustar jjcjjc\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename ucblogo.info @settitle BERKELEY LOGO 6.1 @setchapternewpage odd @c %**end of header @iftex @vsize = 8.9 in @parskip = 7 pt @parindent = 0 pt @hyphenation{set-scrunch set-write-pos} @end iftex @ifinfo @paragraphindent 0 @end ifinfo @finalout @titlepage @title BERKELEY LOGO 6.1 @subtitle Berkeley Logo User Manual @author Brian Harvey @end titlepage @shortcontents @contents @c Node, Next, Previous, Up @node Top, INTRODUCTION, (dir), (dir) @ifinfo This is a TeXinfo version of Berkeley Logo User Manual Original written by: Brian Harvey @end ifinfo @menu * INTRODUCTION:: * DATA STRUCTURE PRIMITIVES:: * COMMUNICATION:: * ARITHMETIC:: * LOGICAL OPERATIONS:: * GRAPHICS:: * WORKSPACE MANAGEMENT:: * CONTROL STRUCTURES:: * MACROS:: * ERROR PROCESSING:: * SPECIAL VARIABLES:: * INTERNATIONALIZATION:: * INDEX:: @end menu @c Node, Next, Previous, Up @node INTRODUCTION, DATA STRUCTURE PRIMITIVES, Top, Top @chapter Introduction @menu * OVERVIEW:: * GETTER/SETTER VARIBLE SYNTAX:: * ENTERING AND LEAVING LOGO:: * TOKENIZATION:: @end menu @c Node, Next, Previous, Up @node OVERVIEW, GETTER/SETTER VARIBLE SYNTAX, INTRODUCTION, INTRODUCTION @section Overview @cindex Copyright @cindex Computer_Science_Logo_Style Copyright @copyright{} 1993 by the Regents of the University of California This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but @var{WITHOUT ANY WARRANTY}; without even the implied warranty of @var{MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE}. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . This is a program that is still being written. Many things are missing, including adequate documentation. This manual assumes that you already know how to program in Logo, and merely presents the details of this new implementation. Read @cite{Computer Science Logo Style, Volume 1: Symbolic Computing} by Brian Harvey (MIT Press, 1997) for a tutorial on Logo programming with emphasis on symbolic computation. Here are the special features of this dialect of Logo: @display Source file compatible among Unix, DOS, Windows, and Mac platforms. Random-access arrays. Variable number of inputs to user-defined procedures. Mutators for list structure (dangerous). Pause on error, and other improvements to error handling. Comments and continuation lines; formatting is preserved when procedure definitions are saved or edited. Terrapin-style tokenization (e.g., [2+3] is a list with one member) but LCSI-style syntax (no special forms except TO). The best of both worlds. First-class instruction and expression templates (see APPLY). Macros. @end display Features @strong{not} found in Berkeley Logo include robotics, music, animation, parallelism, and multimedia. For those, buy a commercial version. @node GETTER/SETTER VARIBLE SYNTAX, ENTERING AND LEAVING LOGO, OVERVIEW, INTRODUCTION @comment node-name, next, previous, up @section Getter/Setter Variable Syntax @cindex getter @cindex setter Logo distinguishes @var{procedures} from @var{variables}. A procedure is a set of instructions to carry out some computation; a variable is a named container that holds a data value such as a number, word, list, or array. In traditional Logo syntax, a non-numeric word typed without punctuation represents a request to invoke the procedure named by that word. A word typed with a preceding quotation mark represents the word itself. For example, in the instruction @example PRINT FIRST "WORD @end example the procedures named @code{FIRST} and @code{PRINT} are invoked, but the procedure named @var{WORD} is not invoked; the word @var{W-O-R-D} is the input to FIRST. What about variables? There are two things one can do with a variable: give it a value, and find out its value. To give a variable a value, Logo provides the primitive procedure @code{MAKE}, which requires two inputs: the name of the variable and the new value to be assigned. The first input, the name of the variable, is just a word, and if (as is almost always the case) the programmer wants to assign a value to a specific variable whose name is known in advance, that input is quoted, just as any known specific word would be: @example MAKE "MY.VAR FIRST "WORD @end example gives the variable named @code{MY.VAR} the value @code{W} (the first letter of @code{WORD}). To find the value of a variable, Logo provides the primitive procedure @code{THING}, which takes a variable name as its input, and outputs the value of the accessible variable with that name. Thus @example PRINT THING "MY.VAR @end example will print @code{W} (supposing the @code{MAKE} above has been done). Since finding the value of a specific, known variable name is such a common operation, Logo also provides an abbreviated notation that combines @code{THING} with quote: @example PRINT :MY.VAR @end example The colon (which Logo old-timers pronounce "dots") replaces @code{THING} and @code{"} in the earlier version of the instruction. Newcomers to Logo often complain about the need for all this punctuation. In particular, Logo programmers who learned about dots and quotes without also learning about @code{THING} wonder why an instruction such as @example MAKE "NEW.VAR :OLD.VAR @end example uses two different punctuation marks to identify the two variables. (Having read the paragraphs above, you will understand that actually both variable names are quoted, but the procedure @code{THING} is invoked to find the value of @code{OLD.VAR}, since it's that value, not @code{OLD.VAR}'s name, that @code{MAKE} needs to know. It wouldn't make sense to ask for @code{THING} of @code{NEW.VAR}, since we haven't given @code{NEW.VAR} a value yet.) Although Logo's punctuation rules make sense once understood, they do form a barrier to entry for the Logo beginner. Why, then, couldn't Logo be designed so that an unpunctuated word would represent a procedure if there is a procedure by that name, or a variable if there is a variable by that name? Then we could say @example PRINT MY.VAR @end example and Logo would realize that @code{MY.VAR} is the name of a variable, not of a procedure. The traditional reason not to use this convention is that Logo allows the same word to name a procedure and a variable at the same time. This is most often important for words that name data types, as in the following procedure: @example TO PLURAL :WORD OUTPUT WORD :WORD "S END @end example Here the name @code{WORD} is a natural choice for the input to @code{PLURAL}, since it describes the kind of input that @code{PLURAL} expects. Within the procedure, we use @code{WORD} to represent Logo's primitive procedure that combines two input words to form a new, longer word; we use @code{:WORD} to represent the variable containing the input, whatever actual word is given when @code{PLURAL} is invoked. @example ? PRINT PLURAL "COMPUTER COMPUTERS @end example However, if a Logo instruction includes an unquoted word that is @strong{not} the name of a procedure, Logo could look for a variable of that name instead. This would allow a "punctuationless" Logo, @strong{provided that users who want to work without colons for variables choose variable names that are not also procedure names.} What about assigning a value to a variable? Could we do without the quotation mark on @code{MAKE}'s first input? Alas, no. Although the first input to @code{MAKE} is @strong{usually} a constant, known variable name, sometimes it isn't, as in this example: @example TO INCREMENT :VAR MAKE :VAR (THING :VAR)+1 ; Note: it's not "VAR here! END ? MAKE "X 5 ? INCREMENT "X ? PRINT :X 6 @end example The procedure @code{INCREMENT} takes a variable name as its input and changes the value of that variable. In this example there are two variables; the variable whose name is @code{VAR}, and whose value is the word @code{X}; and the variable whose name is @code{X} and whose value changes from 5 to 6. Suppose we changed the behavior of @code{MAKE} so that it took the word after @code{MAKE} as the name of the variable to change; we would be unable to write @code{INCREMENT}: @example TO INCREMENT :VAR ; nonworking! MAKE VAR (THING VAR)+1 END @end example This would assign a new value to @code{VAR}, not to @code{X}. What we can do is to allow an @strong{alternative} to @code{MAKE}, a "setter" procedure for a particular variable. The notation will be @example ? SETFOO 7 ? PRINT FOO 7 @end example @code{SETFOO} is a "setter procedure" that takes one input (in this case the input 7) and assigns its value to the variable named @code{FOO}. Berkeley Logo allows users to choose either the traditional notation, in which case the same name can be used both for a procedure and for a variable, or the getter/setter notation, in which variable @code{FOO} is set with @code{SETFOO} and examined with @code{FOO}, but the same name can't be used for procedure and variable. Here is how this choice is allowed: Berkeley Logo uses traditional notation, with procedures distinct from variables. However, if there is a variable named @code{AllowGetSet} whose value is TRUE (which there is, by default, when Logo starts up), then if a Logo instruction refers to a @strong{nonexistent} procedure (so that the error message "I don't know how to ..." would result), Logo tries the following two steps: @cindex AllowGetSet @display 1. If the name is at least four characters long, and the first three characters are the letters @code{SET} (upper or lower case), and if the name is followed in the instruction by another value, and if the name without the @code{SET} is the name of a variable that already exists, then Logo will invoke @code{MAKE} with its first input being the name without the @code{SET}, and its second input being the following value. 2. If step 1's conditions are not met, but the name is the name of an accessible variable, then Logo will invoke @code{THING} with that name as input, to find the variable's value. @end display Step 1 requires that the variable already exist so that misspellings of names of @code{SETxxx} primitives (e.g., @code{SETHEADING}) will still be caught, instead of silently creating a new variable. The command @code{GLOBAL} can be used to create a variable without giving it a value. One final point: The @code{TO} command in Logo has always been a special case; the rest of the line starting with @code{TO} is not evaluated as ordinary Logo expressions are. In particular, the colons used to mark the names of inputs to the procedure do not cause @code{THING} to be invoked. They are merely mnemonic aids, reminding the Logo user that these words are names of variables. (Arguably, this nonstantard behavior of @code{TO} adds to Logo beginners' confusion about colons.) To a programmer using colonless variable references, the colons in the @code{TO} line are unnecessary and meaningless. Berkeley Logo therefore makes the colons optional: @example TO FOO :IN1 :IN2 @end example and @example TO FOO IN1 IN2 @end example are both allowed. @node ENTERING AND LEAVING LOGO, TOKENIZATION, GETTER/SETTER VARIBLE SYNTAX, INTRODUCTION @section Entering and Leaving Logo @cindex starting @t{ucblogo} @cindex leaving @t{ucblogo} The process to start Logo depends on your operating system: @table @asis @item Unix: Type the word @t{logo} to the shell. (The directory in which you've installed Logo must be in your path.) @item DOS: Change directories to the one containing Logo (probably @code{C:\UCBLOGO}). Then type @t{UCBLOGO} for the large memory version, or @t{BL} for the 640K version. @item Mac: Double-click on the @code{LOGO} icon within the "UCB Logo" folder. @item Windows: Double-click on the @code{UCBWLOGO} icon in the @code{UCBLOGO} folder. @end table To leave Logo, enter the command @code{bye}. On startup, Logo looks for a file named @file{startup.lg} in the system Logo library and, if found, loads it. Then it looks for @file{startup.lg} in the user's home directory, or the current directory, depending on the operating system, and loads that. These startup files can be used to predefine procedures, e.g., to provide non-English names for primitive procedures. Under Unix, DOS, or Windows, if you include one or more filenames on the command line when starting Logo, those files will be loaded before the interpreter starts reading commands from your terminal. If you load a file that executes some program that includes a @code{bye} command, Logo will run that program and exit. You can therefore write standalone programs in Logo and run them with shell/batch scripts. To support this technique, Logo does not print its usual welcoming and parting messages if you give file arguments to the logo command. If a command line argument is just a hyphen, then all command line arguments after the hyphen are not taken as filenames, but are instead collected in a list, one word per argument; the buried variable @code{COMMAND.LINE} contains that list of arguments, or the empty list if there are none. On my Linux system, if the first line of an executable shell script is @w{@t{#!/usr/local/bin/logo -}} (note the hyphen) then the script can be given command line arguments and they all end up in @code{:COMMAND.LINE} along with the script's path. Experiment. If you type your interrupt character (see table below) Logo will stop what it's doing and return to top-level, as if you did @w{@t{THROW "TOPLEVEL}}. If you type your quit character Logo will pause as if you did @code{PAUSE}. @example wxWidgets Unix DOS/Windows Mac Classic toplevel alt-S usually ctrl-C ctrl-Q command-. (period) pause alt-P usually ctrl-\ ctrl-W command-, (comma) @end example If you have an environment variable called @code{LOGOLIB} whose value is the name of a directory, then Logo will use that directory instead of the default library. If you invoke a procedure that has not been defined, Logo first looks for a file in the current directory named @file{@var{proc}.lg} where @var{proc} is the procedure name in lower case letters. If such a file exists, Logo loads that file. If the missing procedure is still undefined, or if there is no such file, Logo then looks in the library directory for a file named @file{@var{proc}} (no @file{.lg}) and, if it exists, loads it. If neither file contains a definition for the procedure, then Logo signals an error. Several procedures that are primitive in most versions of Logo are included in the default library, so if you use a different library you may want to include some or all of the default library in it. @node TOKENIZATION, , ENTERING AND LEAVING LOGO, INTRODUCTION @section Tokenization Names of procedures, variables, and property lists are case-insensitive. So are the special words @code{END}, @code{TRUE}, and @code{FALSE}. Case of letters is preserved in everything you type, however. @cindex case-insensitive @cindex delimiters @cindex runparsing @cindex line-continuation @cindex comments Within square brackets, words are delimited only by spaces and square brackets. @code{[2+3]} is a list containing one word. Note, however, that the Logo primitives that interpret such a list as a Logo instruction or expression (@code{RUN}, @code{IF}, etc.) reparse the list as if it had not been typed inside brackets. After a quotation mark outside square brackets, a word is delimited by a space, a square bracket, or a parenthesis. A word not after a quotation mark or inside square brackets is delimited by a space, a bracket, a parenthesis, or an infix operator @code{+-*/=<>}. Note that words following colons are in this category. Note that quote and colon are not delimiters. Each infix operator character is a word in itself, except that the two-character sequences @code{<=}, @code{>=}, and @code{<>} (the latter meaning not-equal) with no intervening space are recognized as a single word. A word consisting of a question mark followed by a number (e.g., @code{?37}), when runparsed (i.e., where a procedure name is expected), is treated as if it were the sequence @example ( ? 37 ) @end example making the number an input to the ? procedure. (See the discussion of templates, below.) This special treatment does not apply to words read as data, to words with a non-number following the question mark, or if the question mark is backslashed. A line (an instruction line or one read by @code{READLIST} or @code{READWORD}) can be continued onto the following line if its last character is a tilde (@code{~}). @code{READWORD} preserves the tilde and the newline; @code{READLIST} does not. Lines read with @code{READRAWLINE} are never continued. An instruction line or a line read by @code{READLIST} (but not by @code{READWORD}) is automatically continued to the next line, as if ended with a tilde, if there are unmatched brackets, parentheses, braces, or vertical bars pending. However, it's an error if the continuation line contains only the word @code{END}; this is to prevent runaway procedure definitions. Lines explicitly continued with a tilde avoid this restriction. If a line being typed interactively on the keyboard is continued, either with a tilde or automatically, Logo will display a tilde as a prompt character for the continuation line. A semicolon begins a comment in an instruction line. Logo ignores characters from the semicolon to the end of the line. A tilde as the last character still indicates a continuation line, but not a continuation of the comment. For example, typing the instruction @example print "abc;comment ~ def @end example will print the word @code{abcdef}. Semicolon has no special meaning in data lines read by @code{READWORD} or @code{READLIST}, but such a line can later be reparsed using @code{RUNPARSE} and then comments will be recognized. The two-character sequence @code{#!}@: at the beginning of a line also starts a comment. Unix users can therefore write a file containing Logo commands, starting with the line @example #! /usr/local/bin/logo @end example (or wherever your Logo executable lives) and the file will be executable directly from the shell. To include an otherwise delimiting character (including semicolon or tilde) in a word, precede it with backslash (@code{\}). If the last character of a line is a backslash, then the newline character following the backslash will be part of the last word on the line, and the line continues onto the following line. To include a backslash in a word, use @code{\\}. If the combination backslash-newline is entered at the terminal, Logo will issue a backslash as a prompt character for the continuation line. All of this applies to data lines read with @code{READWORD} or @code{READLIST} as well as to instruction lines. A line read with @code{READRAWLINE} has no special quoting mechanism; both backslash and vertical bar (described below) are just ordinary characters. An alternative notation to include otherwise delimiting characters in words is to enclose a group of characters in vertical bars. All characters between vertical bars are treated as if they were letters. In data read with @code{READWORD} the vertical bars are preserved in the resulting word. In data read with @code{READLIST} (or resulting from a @code{PARSE} or @code{RUNPARSE} of a word) the vertical bars do not appear explicitly; all potentially delimiting characters (including spaces, brackets, parentheses, and infix operators) appear unmarked, but tokenized as though they were letters. Within vertical bars, backslash may still be used; the only characters that must be backslashed in this context are backslash and vertical bar themselves. Characters entered between vertical bars are forever special, even if the word or list containing them is later reparsed with @code{PARSE} or @code{RUNPARSE}. Characters typed after a backslash are treated somewhat differently: When a quoted word containing a backslashed character is runparsed, the backslashed character loses its special quality and acts thereafter as if typed normally. This distinction is important only if you are building a Logo expression out of parts, to be @code{RUN} later, and want to use parentheses. For example, @example PRINT RUN (SE "\( 2 "+ 3 "\)) @end example will print 5, but @example RUN (SE "MAKE ""|(| 2) @end example will create a variable whose name is open-parenthesis. (Each example would fail if vertical bars and backslashes were interchanged.) A normally delimiting character entered within vertical bars is @code{EQUALP} to the same character without the vertical bars, but can be distinguished by the @code{VBARREDP} predicate. (However, @code{VBARREDP} returns @code{TRUE} only for characters for which special treatment is necessary: whitespace, parentheses, brackets, infix operators, backslash, vertical bar, tilde, quote, question mark, colon, and semicolon.) @node DATA STRUCTURE PRIMITIVES, COMMUNICATION, INTRODUCTION, Top @chapter Data Structure Primitives @menu * CONSTRUCTORS:: * SELECTORS:: * MUTATORS:: * PREDICATES:: * QUERIES:: @end menu @node CONSTRUCTORS, SELECTORS, DATA STRUCTURE PRIMITIVES, DATA STRUCTURE PRIMITIVES @section Constructors @menu * WORD:: * LIST:: * SENTENCE:: * FPUT:: * LPUT:: * ARRAY:: * MDARRAY:: * LISTTOARRAY:: * ARRAYTOLIST:: * COMBINE:: * REVERSE:: * GENSYM:: @end menu @node WORD, LIST, CONSTRUCTORS, CONSTRUCTORS @unnumberedsubsec word @cindex word @example WORD word1 word2 (WORD word1 word2 word3 ...) @end example outputs a word formed by concatenating its inputs. @node LIST, SENTENCE, WORD, CONSTRUCTORS @unnumberedsubsec list @cindex list @example LIST thing1 thing2 (LIST thing1 thing2 thing3 ...) @end example outputs a list whose members are its inputs, which can be any Logo datum (word, list, or array). @node SENTENCE, FPUT, LIST, CONSTRUCTORS @unnumberedsubsec sentence @cindex sentence @cindex se @example SENTENCE thing1 thing2 SE thing1 thing2 (SENTENCE thing1 thing2 thing3 ...) (SE thing1 thing2 thing3 ...) @end example outputs a list whose members are its inputs, if those inputs are not lists, or the members of its inputs, if those inputs are lists. @node FPUT, LPUT, SENTENCE, CONSTRUCTORS @unnumberedsubsec fput @cindex fput @example FPUT thing list @end example outputs a list equal to its second input with one extra member, the first input, at the beginning. If the second input is a word, then the first input must be a one-letter word, and FPUT is equivalent to WORD. @node LPUT, ARRAY, FPUT, CONSTRUCTORS @unnumberedsubsec lput @cindex lput @example LPUT thing list @end example outputs a list equal to its second input with one extra member, the first input, at the end. If the second input is a word, then the first input must be a one-letter word, and LPUT is equivalent to WORD with its inputs in the other order. @node ARRAY, MDARRAY, LPUT, CONSTRUCTORS @unnumberedsubsec array @cindex array @example ARRAY size (ARRAY size origin) @end example outputs an array of @var{size} members (must be a positive integer), each of which initially is an empty list. Array members can be selected with @code{ITEM} and changed with @code{SETITEM}. The first member of the array is member number 1 unless an @var{origin} input (must be an integer) is given, in which case the first member of the array has that number as its index. (Typically 0 is used as the origin if anything.) Arrays are printed by @code{PRINT} and friends, and can be typed in, inside curly braces; indicate an origin with @w{@t{@{a b c@}@@0}}. @xref{ITEM} , @ref{SETITEM} , @ref{PRINT} . @node MDARRAY, LISTTOARRAY, ARRAY, CONSTRUCTORS @unnumberedsubsec mdarray @cindex mdarray @example MDARRAY sizelist (library procedure) (MDARRAY sizelist origin) @end example outputs a multi-dimensional array. The first input must be a list of one or more positive integers. The second input, if present, must be a single integer that applies to every dimension of the array. Ex: @w{@t{(MDARRAY [3 5] 0)}} outputs a two-dimensional array whose members range from @w{@t{[0 0]}} to @w{@t{[2 4]}}. @node LISTTOARRAY, ARRAYTOLIST, MDARRAY, CONSTRUCTORS @unnumberedsubsec listtoarray @cindex listtoarray @example LISTTOARRAY list (LISTTOARRAY list origin) @end example outputs an array of the same size as the input list, whose members are the members of the input list. @node ARRAYTOLIST, COMBINE, LISTTOARRAY, CONSTRUCTORS @unnumberedsubsec arraytolist @cindex arraytolist @example ARRAYTOLIST array @end example outputs a list whose members are the members of the input array. The first member of the output is the first member of the array, regardless of the array's origin. @node COMBINE, REVERSE, ARRAYTOLIST, CONSTRUCTORS @unnumberedsubsec combine @cindex combine @example COMBINE thing1 thing2 (library procedure) @end example if @var{thing2} is a word, outputs @w{@t{WORD thing1 thing2}}. If @var{thing2} is a list, outputs @w{@t{FPUT thing1 thing2}}. @xref{WORD} , @ref{FPUT} @node REVERSE, GENSYM, COMBINE, CONSTRUCTORS @unnumberedsubsec reverse @cindex reverse @example REVERSE list (library procedure) @end example outputs a list whose members are the members of the input list, in reverse order. @node GENSYM, , REVERSE, CONSTRUCTORS @unnumberedsubsec gensym @cindex gensym @example GENSYM (library procedure) @end example outputs a unique word each time it's invoked. The words are of the form @code{G1}, @code{G2}, etc. @node SELECTORS, MUTATORS, CONSTRUCTORS, DATA STRUCTURE PRIMITIVES @section Data Selectors @menu * FIRST:: * FIRSTS:: * LAST:: * BUTFIRST:: * BUTFIRSTS:: * BUTLAST:: * ITEM:: * MDITEM:: * PICK:: * REMOVE:: * REMDUP:: * QUOTED:: @end menu @node FIRST, FIRSTS, SELECTORS, SELECTORS @unnumberedsubsec first @cindex first @example FIRST thing @end example if the input is a word, outputs the first character of the word. If the input is a list, outputs the first member of the list. If the input is an array, outputs the origin of the array (that is, the @emph{index of} the first member of the array). @node FIRSTS, LAST, FIRST, SELECTORS @unnumberedsubsec firsts @cindex firsts @example FIRSTS list @end example outputs a list containing the @code{FIRST} of each member of the input list. It is an error if any member of the input list is empty. (The input itself may be empty, in which case the output is also empty.) This could be written as @example to firsts :list output map "first :list end @end example but is provided as a primitive in order to speed up the iteration tools @code{MAP}, @code{MAP.SE}, and @code{FOREACH}. @example to transpose :matrix if emptyp first :matrix [op []] op fput firsts :matrix transpose bfs :matrix end @end example @xref{MAP} , @ref{MAPdSE} , @ref{FOREACH} @node LAST, BUTFIRST, FIRSTS, SELECTORS @unnumberedsubsec last @cindex last @example LAST wordorlist @end example if the input is a word, outputs the last character of the word. If the input is a list, outputs the last member of the list. @node BUTFIRST, BUTFIRSTS, LAST, SELECTORS @unnumberedsubsec butfirst @cindex butfirst @cindex bf @example BUTFIRST wordorlist BF wordorlist @end example if the input is a word, outputs a word containing all but the first character of the input. If the input is a list, outputs a list containing all but the first member of the input. @node BUTFIRSTS, BUTLAST, BUTFIRST, SELECTORS @unnumberedsubsec butfirsts @cindex butfirsts @cindex bfs @example BUTFIRSTS list BFS list @end example outputs a list containing the @code{BUTFIRST} of each member of the input list. It is an error if any member of the input list is empty or an array. (The input itself may be empty, in which case the output is also empty.) This could be written as @example to butfirsts :list output map "butfirst :list end @end example but is provided as a primitive in order to speed up the iteration tools @code{MAP}, @code{MAP.SE}, and @code{FOREACH}. @xref{MAP} , @ref{MAPdSE} , @ref{FOREACH} @node BUTLAST, ITEM, BUTFIRSTS, SELECTORS @unnumberedsubsec butlast @cindex butlast @cindex bl @example BUTLAST wordorlist BL wordorlist @end example if the input is a word, outputs a word containing all but the last character of the input. If the input is a list, outputs a list containing all but the last member of the input. @node ITEM, MDITEM, BUTLAST, SELECTORS @unnumberedsubsec item @cindex item @example ITEM index thing @end example if the @var{thing} is a word, outputs the @var{index}th character of the word. If the @var{thing} is a list, outputs the @var{index}th member of the list. If the @var{thing} is an array, outputs the @var{index}th member of the array. @var{Index} starts at 1 for words and lists; the starting index of an array is specified when the array is created. @node MDITEM, PICK, ITEM, SELECTORS @unnumberedsubsec mditem @cindex mditem @example MDITEM indexlist array (library procedure) @end example outputs the member of the multidimensional @var{array} selected by the list of numbers @var{indexlist}. @node PICK, REMOVE, MDITEM, SELECTORS @unnumberedsubsec pick @cindex pick @example PICK list (library procedure) @end example outputs a randomly chosen member of the input list. @node REMOVE, REMDUP, PICK, SELECTORS @unnumberedsubsec remove @cindex remove @example REMOVE thing list (library procedure) @end example outputs a copy of @var{list} with every member equal to @var{thing} removed. @node REMDUP, QUOTED, REMOVE, SELECTORS @unnumberedsubsec remdup @cindex remdup @example REMDUP list (library procedure) @end example outputs a copy of @var{list} with duplicate members removed. If two or more members of the input are equal, the rightmost of those members is the one that remains in the output. @node QUOTED, , REMDUP, SELECTORS @unnumberedsubsec quoted @cindex quoted @example QUOTED thing (library procedure) @end example outputs its input, if a list; outputs its input with a quotation mark prepended, if a word. @node MUTATORS, PREDICATES, SELECTORS, DATA STRUCTURE PRIMITIVES @section Data Mutators @menu * SETITEM:: * MDSETITEM:: * dSETFIRST:: SETFIRST * dSETBF:: SETBF * dSETITEM:: SETITEM * PUSH:: * POP:: * QUEUE:: * DEQUEUE:: @end menu @node SETITEM, MDSETITEM, MUTATORS, MUTATORS @unnumberedsubsec setitem @cindex setitem @example SETITEM index array value @end example command. Replaces the @var{index}th member of @var{array} with the new @var{value}. Ensures that the resulting array is not circular, i.e., @var{value} may not be a list or array that contains @var{array}. @node MDSETITEM, dSETFIRST, SETITEM, MUTATORS @unnumberedsubsec mdsetitem @cindex mdsetitem @example MDSETITEM indexlist array value (library procedure) @end example command. Replaces the member of @var{array} chosen by @var{indexlist} with the new @var{value}. @node dSETFIRST, dSETBF, MDSETITEM, MUTATORS @unnumberedsubsec .setfirst @cindex .setfirst @example .SETFIRST list value @end example command. Changes the first member of @var{list} to be @var{value}. WARNING: Primitives whose names start with a period are @strong{dangerous}. Their use by non-experts is not recommended. The use of @code{.SETFIRST} can lead to circular list structures, which will get some Logo primitives into infinite loops, and to unexpected changes to other data structures that share storage with the list being modified. @node dSETBF, dSETITEM, dSETFIRST, MUTATORS @unnumberedsubsec .setbf @cindex .setbf @example .SETBF list value @end example command. Changes the butfirst of @var{list} to be @var{value}. WARNING: Primitives whose names start with a period are @strong{dangerous}. Their use by non-experts is not recommended. The use of @code{.SETBF} can lead to circular list structures, which will get some Logo primitives into infinite loops; unexpected changes to other data structures that share storage with the list being modified; or to Logo crashes and coredumps if the butfirst of a list is not itself a list. @node dSETITEM, PUSH, dSETBF, MUTATORS @unnumberedsubsec .setitem @cindex .setitem @example .SETITEM index array value @end example command. Changes the @var{index}th member of @var{array} to be @var{value}, like @code{SETITEM}, but without checking for circularity. WARNING: Primitives whose names start with a period are @b{dangerous}. Their use by non-experts is not recommended. The use of @code{.SETITEM} can lead to circular arrays, which will get some Logo primitives into infinite loops. @xref{SETITEM}. @node PUSH, POP, dSETITEM, MUTATORS @unnumberedsubsec push @cindex push @example PUSH stackname thing (library procedure) @end example command. Adds the @var{thing} to the stack that is the value of the variable whose name is @var{stackname}. This variable must have a list as its value; the initial value should be the empty list. New members are added at the front of the list. @node POP, QUEUE, PUSH, MUTATORS @unnumberedsubsec pop @cindex pop @example POP stackname (library procedure) @end example outputs the most recently @code{PUSH}ed member of the stack that is the value of the variable whose name is @var{stackname} and removes that member from the stack. @node QUEUE, DEQUEUE, POP, MUTATORS @unnumberedsubsec queue @cindex queue @example QUEUE queuename thing (library procedure) @end example command. Adds the @var{thing} to the queue that is the value of the variable whose name is @var{queuename}. This variable must have a list as its value; the initial value should be the empty list. New members are added at the back of the list. @node DEQUEUE, , QUEUE, MUTATORS @unnumberedsubsec dequeue @cindex dequeue @example DEQUEUE queuename (library procedure) @end example outputs the least recently @code{QUEUE}d member of the queue that is the value of the variable whose name is @var{queuename} and removes that member from the queue. @node PREDICATES, QUERIES, MUTATORS, DATA STRUCTURE PRIMITIVES @section Predicates @menu * WORDP:: * LISTP:: * ARRAYP:: * EMPTYP:: * EQUALP:: * NOTEQUALP:: * BEFOREP:: * dEQ:: EQ * MEMBERP:: * SUBSTRINGP:: * NUMBERP:: * VBARREDP:: @end menu @node WORDP, LISTP, PREDICATES, PREDICATES @unnumberedsubsec wordp @cindex wordp @example WORDP thing WORD? thing @end example outputs @code{TRUE} if the input is a word, @code{FALSE} otherwise. @node LISTP, ARRAYP, WORDP, PREDICATES @unnumberedsubsec listp @cindex listp @cindex list? @example LISTP thing LIST? thing @end example outputs @code{TRUE} if the input is a list, @code{FALSE} otherwise. @node ARRAYP, EMPTYP, LISTP, PREDICATES @unnumberedsubsec arrayp @cindex arrayp @cindex array? @example ARRAYP thing ARRAY? thing @end example outputs @code{TRUE} if the input is an array, @code{FALSE} otherwise. @node EMPTYP, EQUALP, ARRAYP, PREDICATES @unnumberedsubsec emptyp @cindex emptyp @cindex empty? @example EMPTYP thing EMPTY? thing @end example outputs @code{TRUE} if the input is the empty word or the empty list, @code{FALSE} otherwise. @node EQUALP, NOTEQUALP, EMPTYP, PREDICATES @unnumberedsubsec equalp @cindex equalp @cindex equal? @cindex = @example EQUALP thing1 thing2 EQUAL? thing1 thing2 thing1 = thing2 @end example outputs @code{TRUE} if the inputs are equal, @code{FALSE} otherwise. Two numbers are equal if they have the same numeric value. Two non-numeric words are equal if they contain the same characters in the same order. If there is a variable named @code{CASEIGNOREDP} whose value is @code{TRUE}, then an upper case letter is considered the same as the corresponding lower case letter. (This is the case by default.) Two lists are equal if their members are equal. An array is only equal to itself; two separately created arrays are never equal even if their members are equal. (It is important to be able to know if two expressions have the same array as their value because arrays are mutable; if, for example, two variables have the same array as their values then performing @code{SETITEM} on one of them will also change the other.) @xref{CASEIGNOREDP} , @ref{SETITEM} @node NOTEQUALP, BEFOREP, EQUALP, PREDICATES @unnumberedsubsec notequalp @cindex notequalp @cindex notequal? @cindex <> @example NOTEQUALP thing1 thing2 NOTEQUAL? thing1 thing2 thing1 <> thing2 @end example outputs @code{FALSE} if the inputs are equal, @code{TRUE} otherwise. See @code{EQUALP} for the meaning of equality for different data types. @node BEFOREP, dEQ, NOTEQUALP, PREDICATES @unnumberedsubsec beforep @cindex beforep @cindex before? @example BEFOREP word1 word2 BEFORE? word1 word2 @end example outputs @code{TRUE} if @var{word1} comes before @var{word2} in ASCII collating sequence (for words of letters, in alphabetical order). Case-sensitivity is determined by the value of @code{CASEIGNOREDP}. Note that if the inputs are numbers, the result may not be the same as with @code{LESSP}; for example, @w{@t{BEFOREP 3 12}} is false because 3 collates after 1. @xref{CASEIGNOREDP} , @ref{LESSP} @node dEQ, MEMBERP, BEFOREP, PREDICATES @unnumberedsubsec .eq @cindex .eq @example .EQ thing1 thing2 @end example outputs @code{TRUE} if its two inputs are the same datum, so that applying a mutator to one will change the other as well. Outputs @code{FALSE} otherwise, even if the inputs are equal in value. WARNING: Primitives whose names start with a period are @strong{dangerous}. Their use by non-experts is not recommended. The use of mutators can lead to circular data structures, infinite loops, or Logo crashes. @node MEMBERP, SUBSTRINGP, dEQ, PREDICATES @unnumberedsubsec memberp @cindex memberp @cindex member? @example MEMBERP thing1 thing2 MEMBER? thing1 thing2 @end example if @var{thing2} is a list or an array, outputs @code{TRUE} if @var{thing1} is @code{EQUALP} to a member of @var{thing2}, @code{FALSE} otherwise. If @var{thing2} is a word, outputs @code{TRUE} if @var{thing1} is a one-character word @code{EQUALP} to a character of @var{thing2}, @code{FALSE} otherwise. @xref{EQUALP} . @node SUBSTRINGP, NUMBERP, MEMBERP, PREDICATES @unnumberedsubsec substringp @cindex substringp @cindex substring? @example SUBSTRINGP thing1 thing2 SUBSTRING? thing1 thing2 @end example if @var{thing1} or @var{thing2} is a list or an array, outputs @code{FALSE}. If @var{thing2} is a word, outputs @code{TRUE} if @var{thing1} is @code{EQUALP} to a substring of @var{thing2}, @code{FALSE} otherwise. @xref{EQUALP} . @node NUMBERP, VBARREDP, SUBSTRINGP, PREDICATES @unnumberedsubsec numberp @cindex numberp @cindex number? @example NUMBERP thing NUMBER? thing @end example outputs @code{TRUE} if the input is a number, @code{FALSE} otherwise. @node VBARREDP, , NUMBERP, PREDICATES @unnumberedsubsec vbarredp @cindex vbarredp @cindex vbarred? @example VBARREDP char VBARRED? char BACKSLASHEDP char (library procedure) BACKSLASHED? char (library procedure) @end example outputs @code{TRUE} if the input character was originally entered into Logo within vertical bars (|) to prevent its usual special syntactic meaning, @code{FALSE} otherwise. (Outputs @code{TRUE} only if the character is a backslashed space, tab, newline, or one of @code{()[]+-*/=<>":;\~?|} ) The names @code{BACKSLASHEDP} and @code{BACKSLASHED?}@: are included in the Logo library for backward compatibility with the former names of this primitive, although it does @emph{not} output @code{TRUE} for characters originally entered with backslashes. @node QUERIES, , PREDICATES, DATA STRUCTURE PRIMITIVES @section Queries @menu * COUNT:: * ASCII:: * RAWASCII:: * CHAR:: * MEMBER:: * LOWERCASE:: * UPPERCASE:: * STANDOUT:: * PARSE:: * RUNPARSE:: @end menu @node COUNT, ASCII, QUERIES, QUERIES @unnumberedsubsec count @cindex count @example COUNT thing @end example outputs the number of characters in the input, if the input is a word; outputs the number of members in the input, if it is a list or an array. (For an array, this may or may not be the index of the last member, depending on the array's origin.) @node ASCII, RAWASCII, COUNT, QUERIES @unnumberedsubsec ascii @cindex ascii @example ASCII char @end example outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing vbarred punctuation, and returns the character code for the corresponding punctuation character without vertical bars. (Compare @code{RAWASCII}.) @node RAWASCII, CHAR, ASCII, QUERIES @unnumberedsubsec rawascii @cindex rawascii @example RAWASCII char @end example outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing themselves. To find out the ASCII code of an arbitrary keystroke, use @w{@t{RAWASCII RC}}. @node CHAR, MEMBER, RAWASCII, QUERIES @unnumberedsubsec char @cindex char @example CHAR int @end example outputs the character represented in the ASCII code by the input, which must be an integer between 0 and 255. @xref{ASCII} . @node MEMBER, LOWERCASE, CHAR, QUERIES @unnumberedsubsec member @cindex member @example MEMBER thing1 thing2 @end example if @var{thing2} is a word or list and if @code{MEMBERP} with these inputs would output @code{TRUE}, outputs the portion of @var{thing2} from the first instance of @var{thing1} to the end. If @code{MEMBERP} would output @code{FALSE}, outputs the empty word or list according to the type of @var{thing2}. It is an error for @var{thing2} to be an array. @xref{MEMBERP} . @node LOWERCASE, UPPERCASE, MEMBER, QUERIES @unnumberedsubsec lowercase @cindex lowercase @example LOWERCASE word @end example outputs a copy of the input word, but with all uppercase letters changed to the corresponding lowercase letter. @node UPPERCASE, STANDOUT, LOWERCASE, QUERIES @unnumberedsubsec uppercase @cindex uppercase @example UPPERCASE word @end example outputs a copy of the input word, but with all lowercase letters changed to the corresponding uppercase letter. @node STANDOUT, PARSE, UPPERCASE, QUERIES @unnumberedsubsec standout @cindex standout @example STANDOUT thing @end example outputs a word that, when printed, will appear like the input but displayed in standout mode (boldface, reverse video, or whatever your version does for standout). The word contains machine-specific magic characters at the beginning and end; in between is the printed form (as if displayed using @code{TYPE}) of the input. The output is always a word, even if the input is of some other type, but it may include spaces and other formatting characters. Note: a word output by @code{STANDOUT} while Logo is running on one machine will probably not have the desired effect if printed on another type of machine. In the Macintosh classic version, the way that standout works is incompatible with the use of characters whose ASCII code is greater than 127. Therefore, you have a choice to make: The instruction @example CANINVERSE 0 @end example disables standout, but enables the display of ASCII codes above 127, and the instruction @example CANINVERSE 1 @end example restores the default situation in which standout is enabled and the extra graphic characters cannot be printed. @node PARSE, RUNPARSE, STANDOUT, QUERIES @unnumberedsubsec parse @cindex parse @example PARSE word @end example outputs the list that would result if the input word were entered in response to a @code{READLIST} operation. That is, @w{@t{PARSE READWORD}} has the same value as @code{READLIST} for the same characters read. @xref{READLIST} , @ref{READWORD} @node RUNPARSE, , PARSE, QUERIES @unnumberedsubsec runparse @cindex runparse @example RUNPARSE wordorlist @end example outputs the list that would result if the input word or list were entered as an instruction line; characters such as infix operators and parentheses are separate members of the output. Note that sublists of a runparsed list are not themselves runparsed. @node COMMUNICATION, ARITHMETIC, DATA STRUCTURE PRIMITIVES, Top @chapter Communication @menu * TRANSMITTERS:: * RECEIVERS:: * FILE ACCESS:: * TERMINAL ACCESS:: @end menu @node TRANSMITTERS, RECEIVERS, COMMUNICATION, COMMUNICATION @section Transmitters @menu * PRINT:: * TYPE:: * SHOW:: @end menu Note: If there is a variable named @code{PRINTDEPTHLIMIT} with a nonnegative integer value, then complex list and array structures will be printed only to the allowed depth. That is, members of members of... of members will be allowed only so far. The members omitted because they are just past the depth limit are indicated by an ellipsis for each one, so a too-deep list of two members will print as @w{@t{[... ...]}}. If there is a variable named @code{PRINTWIDTHLIMIT} with a nonnegative integer value, then only the first so many members of any array or list will be printed. A single ellipsis replaces all missing data within the structure. The width limit also applies to the number of characters printed in a word, except that a @code{PRINTWIDTHLIMIT} between 0 and 9 will be treated as if it were 10 when applied to words. This limit applies not only to the top-level printed datum but to any substructures within it. @xref{PRINTDEPTHLIMIT} , @ref{PRINTWIDTHLIMIT} If there is a variable named @code{FULLPRINTP} whose value is @code{TRUE}, then words that were created using backslash or vertical bar (to include characters that would otherwise not be treated as part of a word) are printed with the backslashes or vertical bars shown, so that the printed result could be re-read by Logo to produce the same value. If @code{FULLPRINTP} is @code{TRUE} then the empty word (however it was created) prints as @code{||}. (Otherwise it prints as nothing at all.) @xref{FULLPRINTP} . @node PRINT, TYPE, TRANSMITTERS, TRANSMITTERS @unnumberedsubsec print @cindex print @cindex pr @example PRINT thing PR thing (PRINT thing1 thing2 ...) (PR thing1 thing2 ...) @end example command. Prints the input or inputs to the current write stream (initially the screen). All the inputs are printed on a single line, separated by spaces, ending with a newline. If an input is a list, square brackets are not printed around it, but brackets are printed around sublists. Braces are always printed around arrays. @node TYPE, SHOW, PRINT, TRANSMITTERS @unnumberedsubsec type @cindex type @example TYPE thing (TYPE thing1 thing2 ...) @end example command. Prints the input or inputs like @code{PRINT}, except that no newline character is printed at the end and multiple inputs are not separated by spaces. Note: printing to the screen is ordinarily @dfn{line buffered}; that is, the characters you print using @code{TYPE} will not actually appear on the screen until either a newline character is printed (for example, by @code{PRINT} or @code{SHOW}) or Logo tries to read from the keyboard (either at the request of your program or after an instruction prompt). This buffering makes the program much faster than it would be if each character appeared immediately, and in most cases the effect is not disconcerting. To accommodate programs that do a lot of positioned text display using @code{TYPE}, Logo will force printing whenever @code{SETCURSOR} is invoked. This solves most buffering problems. Still, on occasion you may find it necessary to force the buffered characters to be printed explicitly; this can be done using the @code{WAIT} command. @w{@t{WAIT 0}} will force printing without actually waiting. @xref{SETCURSOR} , @ref{WAIT} @node SHOW, , TYPE, TRANSMITTERS @unnumberedsubsec show @cindex show @example SHOW thing (SHOW thing1 thing2 ...) @end example command. Prints the input or inputs like @code{PRINT}, except that if an input is a list it is printed inside square brackets. @xref{PRINT} . @node RECEIVERS, FILE ACCESS, TRANSMITTERS, COMMUNICATION @section Receivers @menu * READLIST:: * READWORD:: * READRAWLINE:: * READCHAR:: * READCHARS:: * SHELL:: @end menu @node READLIST, READWORD, RECEIVERS, RECEIVERS @unnumberedsubsec readlist @cindex readlist @cindex rl @example READLIST RL @end example reads a line from the read stream (initially the keyboard) and outputs that line as a list. The line is separated into members as though it were typed in square brackets in an instruction. If the read stream is a file, and the end of file is reached, @code{READLIST} outputs the empty word (not the empty list). @code{READLIST} processes backslash, vertical bar, and tilde characters in the read stream; the output list will not contain these characters but they will have had their usual effect. @code{READLIST} does not, however, treat semicolon as a comment character. @node READWORD, READRAWLINE, READLIST, RECEIVERS @unnumberedsubsec readword @cindex readword @cindex rw @example READWORD RW @end example reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, @code{READWORD} outputs the empty list (not the empty word). @code{READWORD} processes backslash, vertical bar, and tilde characters in the read stream. In the case of a tilde used for line continuation, the output word @emph{does} include the tilde and the newline characters, so that the user program can tell exactly what the user entered. Vertical bars in the line are also preserved in the output. Backslash characters are not preserved in the output. @node READRAWLINE, READCHAR, READWORD, RECEIVERS @comment node-name, next, previous, up @unnumberedsubsec readrawline @cindex readrawline @example READRAWLINE @end example reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, @code{READRAWLINE} outputs the empty list (not the empty word). @code{READRAWLINE} outputs the exact string of characters as they appear in the line, with no special meaning for backslash, vertical bar, tilde, or any other formatting characters. @xref{READWORD} . @node READCHAR, READCHARS, READRAWLINE, RECEIVERS @unnumberedsubsec readchar @cindex readchar @cindex rc @example READCHAR RC @end example reads a single character from the read stream and outputs that character as a word. If the read stream is a file, and the end of file is reached, @code{READCHAR} outputs the empty list (not the empty word). If the read stream is the keyboard, echoing is turned off when @code{READCHAR} is invoked, and remains off until @code{READLIST} or @code{READWORD} is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. @xref{READLIST} . @node READCHARS, SHELL, READCHAR, RECEIVERS @unnumberedsubsec readchars @cindex readchars @cindex rcs @example READCHARS num RCS num @end example reads @var{num} characters from the read stream and outputs those characters as a word. If the read stream is a file, and the end of file is reached, @code{READCHARS} outputs the empty list (not the empty word). If the read stream is the keyboard, echoing is turned off when @code{READCHARS} is invoked, and remains off until @code{READLIST} or @code{READWORD} is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. @xref{READLIST} , @ref{READWORD} @node SHELL, , READCHARS, RECEIVERS @unnumberedsubsec shell @cindex shell @example SHELL command (SHELL command wordflag) @end example Under Unix, outputs the result of running @var{command} as a shell command. (The command is sent to @samp{/bin/sh}, not @samp{csh} or other alternatives.) If the command is a literal list in the instruction line, and if you want a backslash character sent to the shell, you must use @code{\\} to get the backslash through Logo's reader intact. The output is a list containing one member for each line generated by the shell command. Ordinarily each such line is represented by a list in the output, as though the line were read using @code{READLIST}. If a second input is given, regardless of the value of the input, each line is represented by a word in the output as though it were read with @code{READWORD}. Example: @example to dayofweek output first first shell [date] end @end example This is @code{first first} to extract the first word of the first (and only) line of the shell output. Under MacOS X, @code{SHELL} works as under Unix. @code{SHELL} is not available under Mac Classic. Under DOS, @code{SHELL} is a command, not an operation; it sends its input to a DOS command processor but does not collect the result of the command. Under Windows, the wxWidgets version of Logo behaves as under Unix (except that DOS-style commands are understood; use @code{dir} rather than @code{ls}). The non-wxWidgets version behaves like the DOS version. @node FILE ACCESS, TERMINAL ACCESS, RECEIVERS, COMMUNICATION @section File Access @menu * SETPREFIX:: * PREFIX:: * OPENREAD:: * OPENWRITE:: * OPENAPPEND:: * OPENUPDATE:: * CLOSE:: * ALLOPEN:: * CLOSEALL:: * ERASEFILE:: * DRIBBLE:: * NODRIBBLE:: * SETREAD:: * SETWRITE:: * READER:: * WRITER:: * SETREADPOS:: * SETWRITEPOS:: * READPOS:: * WRITEPOS:: * EOFP:: * FILEP:: @end menu @node SETPREFIX, PREFIX, FILE ACCESS, FILE ACCESS @comment node-name, next, previous, up @unnumberedsubsec setprefix @cindex setprefix @example SETPREFIX string @end example command. Sets a prefix that will be used as the implicit beginning of filenames in @code{OPENREAD}, @code{OPENWRITE}, @code{OPENAPPEND}, @code{OPENUPDATE}, @code{LOAD}, and @code{SAVE} commands. Logo will put the appropriate separator character (slash for Unix, backslash for DOS/Windows, colon for MacOS Classic) between the prefix and the filename entered by the user. The input to @code{SETPREFIX} must be a word, unless it is the empty list, to indicate that there should be no prefix. @xref{OPENREAD} , @xref{OPENWRITE} , @xref{OPENAPPEND} , @xref{OPENUPDATE} , @xref{LOAD} , @xref{SAVE} . @node PREFIX, OPENREAD, SETPREFIX, FILE ACCESS @comment node-name, next, previous, up @unnumberedsubsec prefix @cindex prefix @example PREFIX @end example outputs the current file prefix, or [] if there is no prefix. @xref{SETPREFIX} . @node OPENREAD, OPENWRITE, PREFIX, FILE ACCESS @unnumberedsubsec openread @cindex openread @example OPENREAD filename @end example command. Opens the named file for reading. The read position is initially at the beginning of the file. @node OPENWRITE, OPENAPPEND, OPENREAD, FILE ACCESS @unnumberedsubsec openwrite @cindex openwrite @example OPENWRITE filename @end example command. Opens the named file for writing. If the file already existed, the old version is deleted and a new, empty file created. @code{OPENWRITE}, but not the other @code{OPEN} variants, will accept as input a two-element list, in which the first element must be a variable name, and the second must be a positive integer. A character buffer of the specified size will be created. When a @code{SETWRITE} is done with this same list (in the sense of .EQ, not a copy, so you must do something like @example ? make "buf [foo 100] ? openwrite :buf ? setwrite :buf [...] ? close :buf @end example and not just @example ? openwrite [foo 100] ? setwrite [foo 100] @end example and so on), the printed characters are stored in the buffer; when a @code{CLOSE} is done with the same list as input, the characters from the buffer (treated as one long word, even if spaces and newlines are included) become the value of the specified variable. @node OPENAPPEND, OPENUPDATE, OPENWRITE, FILE ACCESS @unnumberedsubsec openappend @cindex openappend @example OPENAPPEND filename @end example command. Opens the named file for writing. If the file already exists, the write position is initially set to the end of the old file, so that newly written data will be appended to it. @node OPENUPDATE, CLOSE, OPENAPPEND, FILE ACCESS @unnumberedsubsec openupdate @cindex openupdate @example OPENUPDATE filename @end example command. Opens the named file for reading and writing. The read and write position is initially set to the end of the old file, if any. Note: each open file has only one position, for both reading and writing. If a file opened for update is both @code{READER} and @code{WRITER} at the same time, then @code{SETREADPOS} will also affect @code{WRITEPOS} and vice versa. Also, if you alternate reading and writing the same file, you must @code{SETREADPOS} between a write and a read, and @code{SETWRITEPOS} between a read and a write. @xref{READER} , @ref{WRITER} , @ref{SETREADPOS} , @ref{SETWRITEPOS} @node CLOSE, ALLOPEN, OPENUPDATE, FILE ACCESS @unnumberedsubsec close @cindex close @example CLOSE filename @end example command. Closes the named file. If the file was currently the reader or writer, then the reader or writer is changed to the keyboard or screen, as if @w{@t{SETREAD []}} or @w{@t{SETWRITE []}} had been done. @node ALLOPEN, CLOSEALL, CLOSE, FILE ACCESS @unnumberedsubsec allopen @cindex allopen @example ALLOPEN @end example outputs a list whose members are the names of all files currently open. This list does not include the dribble file, if any. @node CLOSEALL, ERASEFILE, ALLOPEN, FILE ACCESS @unnumberedsubsec closeall @cindex closeall @example CLOSEALL (library procedure) @end example command. Closes all open files. Abbreviates @w{@t{FOREACH ALLOPEN [CLOSE ?]}} @xref{FOREACH} , @ref{CLOSE} @node ERASEFILE, DRIBBLE, CLOSEALL, FILE ACCESS @unnumberedsubsec erasefile @cindex erasefile @cindex erf @example ERASEFILE filename ERF filename @end example command. Erases (deletes, removes) the named file, which should not currently be open. @node DRIBBLE, NODRIBBLE, ERASEFILE, FILE ACCESS @unnumberedsubsec dribble @cindex dribble @example DRIBBLE filename @end example command. Creates a new file whose name is the input, like @code{OPENWRITE}, and begins recording in that file everything that is read from the keyboard or written to the terminal. That is, this writing is in addition to the writing to @code{WRITER}. The intent is to create a transcript of a Logo session, including things like prompt characters and interactions. @xref{OPENWRITE} , @ref{WRITER} @node NODRIBBLE, SETREAD, DRIBBLE, FILE ACCESS @unnumberedsubsec nodribble @cindex nodribble @example NODRIBBLE @end example command. Stops copying information into the dribble file, and closes the file. @node SETREAD, SETWRITE, NODRIBBLE, FILE ACCESS @unnumberedsubsec setread @cindex setread @example SETREAD filename @end example command. Makes the named file the read stream, used for @code{READLIST}, etc. The file must already be open with @code{OPENREAD} or @code{OPENUPDATE}. If the input is the empty list, then the read stream becomes the keyboard, as usual. Changing the read stream does not close the file that was previously the read stream, so it is possible to alternate between files. @xref{READLIST} , @ref{OPENREAD} , @ref{OPENUPDATE} @node SETWRITE, READER, SETREAD, FILE ACCESS @unnumberedsubsec setwrite @cindex setwrite @example SETWRITE filename @end example command. Makes the named file the write stream, used for @code{PRINT}, etc. The file must already be open with @code{OPENWRITE}, @code{OPENAPPEND}, or @code{OPENUPDATE}. If the input is the empty list, then the write stream becomes the screen, as usual. Changing the write stream does not close the file that was previously the write stream, so it is possible to alternate between files. If the input is a list, then its first element must be a variable name, and its second and last element must be a positive integer; a buffer of that many characters will be allocated, and will become the writestream. If the same list (same in the @code{.EQ} sense, not a copy) has been used as input to @code{OPENWRITE}, then the already-allocated buffer will be used, and the writer can be changed to and from this buffer, with all the characters accumulated as in a file. When the same list is used as input to @code{CLOSE}, the contents of the buffer (as an unparsed word, which may contain newline characters) will become the value of the named variable. For compatibility with earlier versions, if the list has not been opened when the @code{SETWRITE} is done, it will be opened implicitly, but the first @code{SETWRITE} after this one will implicitly close it, setting the variable and freeing the allocated buffer. @xref{PRINT} , @ref{OPENWRITE} ; @ref{OPENAPPEND} ; @ref{OPENUPDATE} @node READER, WRITER, SETWRITE, FILE ACCESS @unnumberedsubsec reader @cindex reader @example READER @end example outputs the name of the current read stream file, or the empty list if the read stream is the terminal. @node WRITER, SETREADPOS, READER, FILE ACCESS @unnumberedsubsec writer @cindex writer @example WRITER @end example outputs the name of the current write stream file, or the empty list if the write stream is the screen. @node SETREADPOS, SETWRITEPOS, WRITER, FILE ACCESS @unnumberedsubsec setreadpos @cindex setreadpos @example SETREADPOS charpos @end example command. Sets the file pointer of the read stream file so that the next @code{READLIST}, etc., will begin reading at the @var{charpos}th character in the file, counting from 0. (That is, @w{@t{SETREADPOS 0}} will start reading from the beginning of the file.) Meaningless if the read stream is the keyboard. @xref{READLIST} . @node SETWRITEPOS, READPOS, SETREADPOS, FILE ACCESS @unnumberedsubsec setwritepos @cindex setwritepos @example SETWRITEPOS charpos @end example command. Sets the file pointer of the write stream file so that the next @code{PRINT}, etc., will begin writing at the @var{charpos}th character in the file, counting from 0. (That is, @w{@t{SETWRITEPOS 0}} will start writing from the beginning of the file.) Meaningless if the write stream is the screen. @xref{PRINT} . @node READPOS, WRITEPOS, SETWRITEPOS, FILE ACCESS @unnumberedsubsec readpos @cindex readpos @example READPOS @end example outputs the file position of the current read stream file. @node WRITEPOS, EOFP, READPOS, FILE ACCESS @unnumberedsubsec writepos @cindex writepos @example WRITEPOS @end example outputs the file position of the current write stream file. @node EOFP, FILEP, WRITEPOS, FILE ACCESS @unnumberedsubsec eofp @cindex eofp @cindex eof? @example EOFP EOF? @end example predicate, outputs @code{TRUE} if there are no more characters to be read in the read stream file, @code{FALSE} otherwise. @node FILEP, , EOFP, FILE ACCESS @unnumberedsubsec filep @cindex filep @cindex file? @example FILEP filename FILE? filename (library procedure) @end example predicate, outputs @code{TRUE} if a file of the specified name exists and can be read, @code{FALSE} otherwise. @node TERMINAL ACCESS, , FILE ACCESS, COMMUNICATION @section Terminal Access @menu * KEYP:: * CLEARTEXT:: * SETCURSOR:: * CURSOR:: * SETMARGINS:: * SETTEXTCOLOR:: * INCREASEFONT:: * SETTEXTSIZE:: * TEXTSIZE:: * SETFONT:: * FONT:: @end menu @node KEYP, CLEARTEXT, TERMINAL ACCESS, TERMINAL ACCESS @unnumberedsubsec keyp @cindex keyp @cindex key? @example KEYP KEY? @end example predicate, outputs @code{TRUE} if there are characters waiting to be read from the read stream. If the read stream is a file, this is equivalent to @w{@t{NOT EOFP}}. If the read stream is the terminal, then echoing is turned off and the terminal is set to @code{cbreak} (character at a time instead of line at a time) mode. It remains in this mode until some line-mode reading is requested (e.g., @code{READLIST}). The Unix operating system forgets about any pending characters when it switches modes, so the first @code{KEYP} invocation will always output @code{FALSE}. @xref{EOFP} , @ref{READLIST} @node CLEARTEXT, SETCURSOR, KEYP, TERMINAL ACCESS @unnumberedsubsec cleartext @cindex cleartext @cindex ct @example CLEARTEXT CT @end example command. Clears the text window. @node SETCURSOR, CURSOR, CLEARTEXT, TERMINAL ACCESS @unnumberedsubsec setcursor @cindex setcursor @example SETCURSOR vector @end example command. The input is a list of two numbers, the x and y coordinates of a text window position (origin in the upper left corner, positive direction is southeast). The text cursor is moved to the requested position. This command also forces the immediate printing of any buffered characters. @node CURSOR, SETMARGINS, SETCURSOR, TERMINAL ACCESS @unnumberedsubsec cursor @cindex cursor @example CURSOR @end example outputs a list containing the current x and y coordinates of the text cursor. Logo may get confused about the current cursor position if, e.g., you type in a long line that wraps around or your program prints escape codes that affect the screen strangely. @node SETMARGINS, SETTEXTCOLOR, CURSOR, TERMINAL ACCESS @unnumberedsubsec setmargins @cindex setmargins @example SETMARGINS vector @end example command. The input must be a list of two numbers, as for @code{SETCURSOR}. The effect is to clear the screen and then arrange for all further printing to be shifted down and to the right according to the indicated margins. Specifically, every time a newline character is printed (explicitly or implicitly) Logo will type @var{x_margin} spaces, and on every invocation of @code{SETCURSOR} the margins will be added to the input x and y coordinates. (@code{CURSOR} will report the cursor position relative to the margins, so that this shift will be invisible to Logo programs.) The purpose of this command is to accommodate the display of terminal screens in lecture halls with inadequate TV monitors that miss the top and left edges of the screen. @xref{SETCURSOR} . @node SETTEXTCOLOR, INCREASEFONT, SETMARGINS, TERMINAL ACCESS @unnumberedsubsec settextcolor @cindex settextcolor @cindex settc @example SETTEXTCOLOR foreground background SETTC foreground background @end example command (wxWidgets only). The inputs are color numbers, or RGB color lists, as for turtle graphics. The foreground and background colors for the textscreen/splitscreen text window are changed to the given values. The change affects text already printed as well as future text printing; there is only one text color for the entire window. Command (non-wxWidgets Windows and DOS extended only). The inputs are color numbers, as for turtle graphics. Future printing to the text window will use the specified colors for foreground (the characters printed) and background (the space under those characters). Using @code{STANDOUT} will revert to the default text window colors. In the DOS extended (@file{ucblogo.exe}) version, colors in textscreen mode are limited to numbers 0-7, and the coloring applies only to text printed by the program, not to the echoing of text typed by the user. Neither limitation applies to the text portion of splitscreen mode, which is actually drawn as graphics internally. @xref{STANDOUT} . @node INCREASEFONT, SETTEXTSIZE, SETTEXTCOLOR, TERMINAL ACCESS @unnumberedsubsec increasefont @cindex increasefont @cindex decreasefont @example INCREASEFONT DECREASEFONT @end example command (wxWidgets only). Increase or decrease the size of the font used in the text and edit windows to the next larger or smaller available size. @node SETTEXTSIZE, TEXTSIZE, INCREASEFONT, TERMINAL ACCESS @unnumberedsubsec settextsize @cindex settextsize @example SETTEXTSIZE height @end example command (wxWidgets only). Set the "point size" of the font used in the text and edit windows to the given integer input. The desired size may not be available, in which case the nearest available size will be used. Note: There is only a slight correlation between these integers and pixel sizes. Our rough estimate is that the number of pixels of height is about 1.5 times the point size, but it varies for different fonts. See @code{SETLABELHEIGHT} for a different approach used for the graphics window. @node TEXTSIZE, SETFONT, SETTEXTSIZE, TERMINAL ACCESS @unnumberedsubsec textsize @cindex textsize @example TEXTSIZE @end example (wxWidgets only) outputs the "point size" of the font used in the text and edit windows. See @code{SETTEXTSIZE} for a discussion of font sizing. See @code{LABELSIZE} for a different approach used for the graphics window. @node SETFONT, FONT, TEXTSIZE, TERMINAL ACCESS @unnumberedsubsec setfont @cindex setfont @example SETFONT fontname @end example command (wxWidgets only). Set the font family used in all windows to the one named by the input. Try @file{Courier} or @file{Monospace} as likely possibilities. Not all computers have the same fonts installed. It's a good idea to stick with monospace fonts (ones in which all characters have the same width). @node FONT, , SETFONT, TERMINAL ACCESS @unnumberedsubsec font @cindex font @example FONT @end example (wxWidgets only) outputs the name of the font family used in all windows. @node ARITHMETIC, LOGICAL OPERATIONS, COMMUNICATION, Top @chapter Arithmetic @menu * NUMERIC OPERATIONS:: * NUMERIC PREDICATES:: * RANDOM NUMBERS:: * PRINT FORMATTING:: * BITWISE OPERATIONS:: @end menu @node NUMERIC OPERATIONS, NUMERIC PREDICATES, ARITHMETIC, ARITHMETIC @section Numeric Operations @menu * SUM:: * DIFFERENCE:: * MINUS:: * PRODUCT:: * QUOTIENT:: * REMAINDER:: * MODULO:: * INT:: * ROUND:: * SQRT:: * POWER:: * EXP:: * LOG10:: * LN:: * SIN:: * RADSIN:: * COS:: * RADCOS:: * ARCTAN:: * RADARCTAN:: * ISEQ:: * RSEQ:: @end menu @node SUM, DIFFERENCE, NUMERIC OPERATIONS, NUMERIC OPERATIONS @unnumberedsubsec sum @cindex sum @cindex + @example SUM num1 num2 (SUM num1 num2 num3 ...) num1 + num2 @end example outputs the sum of its inputs. @node DIFFERENCE, MINUS, SUM, NUMERIC OPERATIONS @unnumberedsubsec difference @cindex difference @cindex - @example DIFFERENCE num1 num2 num1 - num2 @end example outputs the difference of its inputs. Minus sign means infix difference in ambiguous contexts (when preceded by a complete expression), unless it is preceded by a space and followed by a nonspace. (See also @code{MINUS}.) @node MINUS, PRODUCT, DIFFERENCE, NUMERIC OPERATIONS @unnumberedsubsec minus @cindex minus @example MINUS num - num @end example outputs the negative of its input. Minus sign means unary minus if the previous token is an infix operator or open parenthesis, or it is preceded by a space and followed by a nonspace. There is a difference in binding strength between the two forms: @example MINUS 3 + 4 means -(3+4) - 3 + 4 means (-3)+4 @end example @node PRODUCT, QUOTIENT, MINUS, NUMERIC OPERATIONS @unnumberedsubsec product @cindex product @cindex * @example PRODUCT num1 num2 (PRODUCT num1 num2 num3 ...) num1 * num2 @end example outputs the product of its inputs. @node QUOTIENT, REMAINDER, PRODUCT, NUMERIC OPERATIONS @unnumberedsubsec quotient @cindex quotient @cindex / @example QUOTIENT num1 num2 (QUOTIENT num) num1 / num2 @end example outputs the quotient of its inputs. The quotient of two integers is an integer if and only if the dividend is a multiple of the divisor. (In other words, @w{@t{QUOTIENT 5 2}} is 2.5, not 2, but @w{@t{QUOTIENT 4 2}} is 2, not 2.0 --- it does the right thing.) With a single input, @code{QUOTIENT} outputs the reciprocal of the input. @node REMAINDER, MODULO, QUOTIENT, NUMERIC OPERATIONS @unnumberedsubsec remainder @cindex remainder @example REMAINDER num1 num2 @end example outputs the remainder on dividing @var{num1} by @var{num2}; both must be integers and the result is an integer with the same sign as @var{num1}. @node MODULO, INT, REMAINDER, NUMERIC OPERATIONS @unnumberedsubsec modulo @cindex modulo @example MODULO num1 num2 @end example outputs the remainder on dividing @var{num1} by @var{num2}; both must be integers and the result is an integer with the same sign as @var{num2}. @node INT, ROUND, MODULO, NUMERIC OPERATIONS @unnumberedsubsec int @cindex int @example INT num @end example outputs its input with fractional part removed, i.e., an integer with the same sign as the input, whose absolute value is the largest integer less than or equal to the absolute value of the input. @node ROUND, SQRT, INT, NUMERIC OPERATIONS @unnumberedsubsec round @cindex round @example ROUND num @end example outputs the nearest integer to the input. @node SQRT, POWER, ROUND, NUMERIC OPERATIONS @unnumberedsubsec sqrt @cindex sqrt @example SQRT num @end example outputs the square root of the input, which must be nonnegative. @node POWER, EXP, SQRT, NUMERIC OPERATIONS @unnumberedsubsec power @cindex power @example POWER num1 num2 @end example outputs @var{num1} to the @var{num2} power. If @var{num1} is negative, then @var{num2} must be an integer. @node EXP, LOG10, POWER, NUMERIC OPERATIONS @unnumberedsubsec exp @cindex exp @example EXP num @end example outputs @i{e} (2.718281828+) to the input power. @node LOG10, LN, EXP, NUMERIC OPERATIONS @unnumberedsubsec log10 @cindex log10 @example LOG10 num @end example outputs the common logarithm of the input. @node LN, SIN, LOG10, NUMERIC OPERATIONS @unnumberedsubsec ln @cindex ln @example LN num @end example outputs the natural logarithm of the input. @node SIN, RADSIN, LN, NUMERIC OPERATIONS @unnumberedsubsec sin @cindex sin @example SIN degrees @end example outputs the sine of its input, which is taken in degrees. @node RADSIN, COS, SIN, NUMERIC OPERATIONS @unnumberedsubsec radsin @cindex radsin @example RADSIN radians @end example outputs the sine of its input, which is taken in radians. @node COS, RADCOS, RADSIN, NUMERIC OPERATIONS @unnumberedsubsec cos @cindex cos @example COS degrees @end example outputs the cosine of its input, which is taken in degrees. @node RADCOS, ARCTAN, COS, NUMERIC OPERATIONS @unnumberedsubsec radcos @cindex radcos @example RADCOS radians @end example outputs the cosine of its input, which is taken in radians. @node ARCTAN, RADARCTAN, RADCOS, NUMERIC OPERATIONS @unnumberedsubsec arctan @cindex arctan @example ARCTAN num (ARCTAN x y) @end example outputs the arctangent, in degrees, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or 90 or --90 depending on the sign of y, if x is zero. @node RADARCTAN, ISEQ, ARCTAN, NUMERIC OPERATIONS @unnumberedsubsec radarctan @cindex radarctan @example RADARCTAN num (RADARCTAN x y) @end example outputs the arctangent, in radians, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or pi/2 or --pi/2 depending on the sign of y, if x is zero. The expression @w{@t{2*(RADARCTAN 0 1)}} can be used to get the value of pi. @node ISEQ, RSEQ, RADARCTAN, NUMERIC OPERATIONS @unnumberedsubsec iseq @cindex iseq @example ISEQ from to (library procedure) @end example outputs a list of the integers from @var{from} to @var{to}, inclusive. @example ? show iseq 3 7 [3 4 5 6 7] ? show iseq 7 3 [7 6 5 4 3] @end example @node RSEQ, , ISEQ, NUMERIC OPERATIONS @unnumberedsubsec rseq @cindex rseq @example RSEQ from to count (library procedure) @end example outputs a list of @var{count} equally spaced rational numbers between @var{from} and @var{to}, inclusive. @example ? show rseq 3 5 9 [3 3.25 3.5 3.75 4 4.25 4.5 4.75 5] ? show rseq 3 5 5 [3 3.5 4 4.5 5] @end example @node NUMERIC PREDICATES, RANDOM NUMBERS, NUMERIC OPERATIONS, ARITHMETIC @section Numeric Predicates @menu * LESSP:: * GREATERP:: * LESSEQUALP:: * GREATEREQUALP:: @end menu @node LESSP, GREATERP, NUMERIC PREDICATES, NUMERIC PREDICATES @unnumberedsubsec lessp @cindex lessp @cindex less? @cindex < @example LESSP num1 num2 LESS? num1 num2 num1 < num2 @end example outputs @code{TRUE} if its first input is strictly less than its second. @node GREATERP, LESSEQUALP, LESSP, NUMERIC PREDICATES @unnumberedsubsec greaterp @cindex greaterp @cindex greater? @cindex > @example GREATERP num1 num2 GREATER? num1 num2 num1 > num2 @end example outputs @code{TRUE} if its first input is strictly greater than its second. @node LESSEQUALP, GREATEREQUALP, GREATERP, NUMERIC PREDICATES @unnumberedsubsec lessequalp @cindex lessequalp @cindex lessequal? @cindex <= @example LESSEQUALP num1 num2 LESSEQUAL? num1 num2 num1 <= num2 @end example outputs @code{TRUE} if its first input is less than or equal to its second. @node GREATEREQUALP, , LESSEQUALP, NUMERIC PREDICATES @unnumberedsubsec greaterequalp @cindex greaterequalp @cindex greaterequal? @cindex >= @example GREATEREQUALP num1 num2 GREATEREQUAL? num1 num2 num1 >= num2 @end example outputs @code{TRUE} if its first input is greater than or equal to its second. @node RANDOM NUMBERS, PRINT FORMATTING, NUMERIC PREDICATES, ARITHMETIC @section Random Numbers @menu * RANDOM:: * RERANDOM:: @end menu @node RANDOM, RERANDOM, RANDOM NUMBERS, RANDOM NUMBERS @unnumberedsubsec random @cindex random @example RANDOM num (RANDOM start end) @end example with one input, outputs a random nonnegative integer less than its input, which must be a positive integer. With two inputs, @code{RANDOM} outputs a random integer greater than or equal to the first input, and less than or equal to the second input. Both inputs must be integers, and the first must be less than the second. @w{@t{(RANDOM 0 9)}} is equivalent to @w{@t{RANDOM 10}}; @w{@t{(RANDOM 3 8)}} is equivalent to @w{@t{(RANDOM 6)+3}}. @node RERANDOM, , RANDOM, RANDOM NUMBERS @unnumberedsubsec rerandom @cindex rerandom @example RERANDOM (RERANDOM seed) @end example command. Makes the results of @code{RANDOM} reproducible. Ordinarily the sequence of random numbers is different each time Logo is used. If you need the same sequence of pseudo-random numbers repeatedly, e.g. to debug a program, say @code{RERANDOM} before the first invocation of @code{RANDOM}. If you need more than one repeatable sequence, you can give @code{RERANDOM} an integer input; each possible input selects a unique sequence of numbers. @node PRINT FORMATTING, BITWISE OPERATIONS, RANDOM NUMBERS, ARITHMETIC @section Print Formatting @menu * FORM:: @end menu @node FORM, , PRINT FORMATTING, PRINT FORMATTING @unnumberedsubsec form @cindex form @example FORM num width precision @end example outputs a word containing a printable representation of @var{num}, possibly preceded by spaces (and therefore not a number for purposes of performing arithmetic operations), with at least @var{width} characters, including exactly @var{precision} digits after the decimal point. (If @var{precision} is 0 then there will be no decimal point in the output.) As a debugging feature, (@w{@t{FORM num -1 format}}) will print the floating point @var{num} according to the C printf @var{format}, to allow @example to hex :num op form :num -1 "|%08X %08X| end @end example to allow finding out the exact result of floating point operations. The precise format needed may be machine-dependent. @node BITWISE OPERATIONS, , PRINT FORMATTING, ARITHMETIC @section Bitwise Operations @menu * BITAND:: * BITOR:: * BITXOR:: * BITNOT:: * ASHIFT:: * LSHIFT:: @end menu @node BITAND, BITOR, BITWISE OPERATIONS, BITWISE OPERATIONS @unnumberedsubsec bitand @cindex bitand @example BITAND num1 num2 (BITAND num1 num2 num3 ...) @end example outputs the bitwise @var{and} of its inputs, which must be integers. @xref{AND} . @node BITOR, BITXOR, BITAND, BITWISE OPERATIONS @unnumberedsubsec bitor @cindex bitor @example BITOR num1 num2 (BITOR num1 num2 num3 ...) @end example outputs the bitwise @var{or} of its inputs, which must be integers. @xref{OR} . @node BITXOR, BITNOT, BITOR, BITWISE OPERATIONS @unnumberedsubsec bitxor @cindex bitxor @example BITXOR num1 num2 (BITXOR num1 num2 num3 ...) @end example outputs the bitwise @var{exclusive or} of its inputs, which must be integers. @xref{OR} . @node BITNOT, ASHIFT, BITXOR, BITWISE OPERATIONS @unnumberedsubsec bitnot @cindex bitnot @example BITNOT num @end example outputs the bitwise @var{not} of its input, which must be an integer. @xref{NOT} . @node ASHIFT, LSHIFT, BITNOT, BITWISE OPERATIONS @unnumberedsubsec ashift @cindex ashift @example ASHIFT num1 num2 @end example outputs @var{num1} arithmetic-shifted to the left by @var{num2} bits. If @var{num2} is negative, the shift is to the right with sign extension. The inputs must be integers. @node LSHIFT, , ASHIFT, BITWISE OPERATIONS @unnumberedsubsec lshift @cindex lshift @example LSHIFT num1 num2 @end example outputs @var{num1} logical-shifted to the left by @var{num2} bits. If @var{num2} is negative, the shift is to the right with zero fill. The inputs must be integers. @node LOGICAL OPERATIONS, GRAPHICS, ARITHMETIC, Top @chapter Logical Operations @menu * AND:: * OR:: * NOT:: @end menu @node AND, OR, LOGICAL OPERATIONS, LOGICAL OPERATIONS @unnumberedsec and @cindex and @example AND tf1 tf2 (AND tf1 tf2 tf3 ...) @end example outputs @code{TRUE} if all inputs are @code{TRUE}, otherwise @code{FALSE}. All inputs must be @code{TRUE} or @code{FALSE}. (Comparison is case-insensitive regardless of the value of @code{CASEIGNOREDP}. That is, @code{true} or @code{True} or @code{TRUE} are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a @code{TRUE} or @code{FALSE} value. List expressions are evaluated from left to right; as soon as a @code{FALSE} value is found, the remaining inputs are not examined. Example: @example MAKE "RESULT AND [NOT (:X = 0)] [(1 / :X) > .5] @end example to avoid the division by zero if the first part is false. @xref{CASEIGNOREDP} . @node OR, NOT, AND, LOGICAL OPERATIONS @unnumberedsubsec or @cindex or @example OR tf1 tf2 (OR tf1 tf2 tf3 ...) @end example outputs @code{TRUE} if any input is @code{TRUE}, otherwise @code{FALSE}. All inputs must be @code{TRUE} or @code{FALSE}. (Comparison is case-insensitive regardless of the value of @code{CASEIGNOREDP}. That is, @code{true} or @code{True} or @code{TRUE} are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a @code{TRUE} or @code{FALSE} value. List expressions are evaluated from left to right; as soon as a @code{TRUE} value is found, the remaining inputs are not examined. Example: @example IF OR :X=0 [some.long.computation] [...] @end example to avoid the long computation if the first condition is met. @xref{CASEIGNOREDP} . @node NOT, , OR, LOGICAL OPERATIONS @unnumberedsubsec not @cindex not @example NOT tf @end example outputs @code{TRUE} if the input is @code{FALSE}, and vice versa. The input can be a list, in which case it is taken as an expression to run; that expression must produce a @code{TRUE} or @code{FALSE} value. @node GRAPHICS, WORKSPACE MANAGEMENT, LOGICAL OPERATIONS, Top @chapter Graphics Berkeley Logo provides traditional Logo turtle graphics with one turtle. Multiple turtles, dynamic turtles, and collision detection are not supported. This is the most hardware-dependent part of Logo; some features may exist on some machines but not others. Nevertheless, the goal has been to make Logo programs as portable as possible, rather than to take fullest advantage of the capabilities of each machine. In particular, Logo attempts to scale the screen so that turtle coordinates [--100 --100] and [100 100] fit on the graphics window, and so that the aspect ratio is 1:1. The center of the graphics window (which may or may not be the entire screen, depending on the machine used) is turtle location [0 0]. Positive X is to the right; positive Y is up. Headings (angles) are measured in degrees clockwise from the positive Y axis. (This differs from the common mathematical convention of measuring angles counterclockwise from the positive X axis.) The turtle is represented as an isoceles triangle; the actual turtle position is at the midpoint of the base (the short side). However, the turtle is drawn one step behind its actual position, so that the display of the base of the turtle's triangle does not obscure a line drawn perpendicular to it (as would happen after drawing a square). Colors are, of course, hardware-dependent. However, Logo provides partial hardware independence by interpreting color numbers 0 through 7 uniformly on all computers: @example 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white @end example Where possible, Logo provides additional user-settable colors; how many are available depends on the hardware and operating system environment. If at least 16 colors are available, Logo tries to provide uniform initial settings for the colors 8-15: @example 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey @end example Logo begins with a black background and white pen. @menu * TURTLE MOTION:: * TURTLE MOTION QUERIES:: * TURTLE AND WINDOW CONTROL:: * TURTLE AND WINDOW QUERIES:: * PEN AND BACKGROUND CONTROL:: * PEN QUERIES:: * SAVING AND LOADING PICTURES:: * MOUSE QUERIES:: @end menu @node TURTLE MOTION, TURTLE MOTION QUERIES, GRAPHICS, GRAPHICS @section Turtle Motion @menu * FORWARD:: * BACK:: * LEFT:: * RIGHT:: * SETPOS:: * SETXY:: * SETX:: * SETY:: * SETHEADING:: * HOME:: * ARC:: @end menu @node FORWARD, BACK, TURTLE MOTION, TURTLE MOTION @unnumberedsubsec forward @cindex forward @cindex fd @example FORWARD dist FD dist @end example moves the turtle forward, in the direction that it's facing, by the specified distance (measured in turtle steps). @node BACK, LEFT, FORWARD, TURTLE MOTION @unnumberedsubsec back @cindex back @cindex bk @example BACK dist BK dist @end example moves the turtle backward, i.e., exactly opposite to the direction that it's facing, by the specified distance. (The heading of the turtle does not change.) @node LEFT, RIGHT, BACK, TURTLE MOTION @unnumberedsubsec left @cindex left @cindex lt @example LEFT degrees LT degrees @end example turns the turtle counterclockwise by the specified angle, measured in degrees (1/360 of a circle). @node RIGHT, SETPOS, LEFT, TURTLE MOTION @unnumberedsubsec right @cindex right @cindex rt @example RIGHT degrees RT degrees @end example turns the turtle clockwise by the specified angle, measured in degrees (1/360 of a circle). @node SETPOS, SETXY, RIGHT, TURTLE MOTION @unnumberedsubsec setpos @cindex setpos @example SETPOS pos @end example moves the turtle to an absolute position in the graphics window. The input is a list of two numbers, the X and Y coordinates. @node SETXY, SETX, SETPOS, TURTLE MOTION @unnumberedsubsec setxy @cindex setxy @example SETXY xcor ycor @end example moves the turtle to an absolute position in the graphics window. The two inputs are numbers, the X and Y coordinates. @node SETX, SETY, SETXY, TURTLE MOTION @unnumberedsubsec setx @cindex setx @example SETX xcor @end example moves the turtle horizontally from its old position to a new absolute horizontal coordinate. The input is the new X coordinate. @node SETY, SETHEADING, SETX, TURTLE MOTION @unnumberedsubsec sety @cindex sety @example SETY ycor @end example moves the turtle vertically from its old position to a new absolute vertical coordinate. The input is the new Y coordinate. @node SETHEADING, HOME, SETY, TURTLE MOTION @unnumberedsubsec setheading @cindex setheading @cindex seth @example SETHEADING degrees SETH degrees @end example turns the turtle to a new absolute heading. The input is a number, the heading in degrees clockwise from the positive Y axis. @node HOME, ARC, SETHEADING, TURTLE MOTION @unnumberedsubsec home @cindex home @example HOME @end example moves the turtle to the center of the screen. Equivalent to @w{@t{SETPOS [0 0] SETHEADING 0.}} @xref{SETPOS} , @xref{SETHEADING} . @node ARC, , HOME, TURTLE MOTION @unnumberedsubsec arc @cindex arc @example ARC angle radius @end example draws an arc of a circle, with the turtle at the center, with the specified radius, starting at the turtle's heading and extending clockwise through the specified angle. The turtle does not move. @node TURTLE MOTION QUERIES, TURTLE AND WINDOW CONTROL, TURTLE MOTION, GRAPHICS @section Turtle Motion Queries @menu * POS:: * XCOR:: * YCOR:: * HEADING:: * TOWARDS:: * SCRUNCH:: @end menu @node POS, XCOR, TURTLE MOTION QUERIES, TURTLE MOTION QUERIES @unnumberedsubsec pos @cindex pos @example POS @end example outputs the turtle's current position, as a list of two numbers, the X and Y coordinates. @node XCOR, YCOR, POS, TURTLE MOTION QUERIES @unnumberedsubsec xcor @cindex xcor @example XCOR (library procedure) @end example outputs a number, the turtle's X coordinate. @node YCOR, HEADING, XCOR, TURTLE MOTION QUERIES @unnumberedsubsec ycor @cindex ycor @example YCOR (library procedure) @end example outputs a number, the turtle's Y coordinate. @node HEADING, TOWARDS, YCOR, TURTLE MOTION QUERIES @unnumberedsubsec heading @cindex heading @example HEADING @end example outputs a number, the turtle's heading in degrees. @node TOWARDS, SCRUNCH, HEADING, TURTLE MOTION QUERIES @unnumberedsubsec towards @cindex towards @example TOWARDS pos @end example outputs a number, the heading at which the turtle should be facing so that it would point from its current position to the position given as the input. @node SCRUNCH, , TOWARDS, TURTLE MOTION QUERIES @unnumberedsubsec scrunch @cindex scrunch @example SCRUNCH @end example outputs a list containing two numbers, the X and Y scrunch factors, as used by @code{SETSCRUNCH}. (But note that @code{SETSCRUNCH} takes two numbers as inputs, not one list of numbers.) @xref{SETSCRUNCH} . @node TURTLE AND WINDOW CONTROL, TURTLE AND WINDOW QUERIES, TURTLE MOTION QUERIES, GRAPHICS @section Turtle and Window Control @menu * SHOWTURTLE:: * HIDETURTLE:: * CLEAN:: * CLEARSCREEN:: * WRAP:: * WINDOW:: * FENCE:: * FILL:: * FILLED:: * LABEL:: * SETLABELHEIGHT:: * TEXTSCREEN:: * FULLSCREEN:: * SPLITSCREEN:: * SETSCRUNCH:: * REFRESH:: * NOREFRESH:: @end menu @node SHOWTURTLE, HIDETURTLE, TURTLE AND WINDOW CONTROL, TURTLE AND WINDOW CONTROL @unnumberedsubsec showturtle @cindex showturtle @cindex st @example SHOWTURTLE ST @end example makes the turtle visible. @node HIDETURTLE, CLEAN, SHOWTURTLE, TURTLE AND WINDOW CONTROL @unnumberedsubsec hideturtle @cindex hideturtle @cindex ht @example HIDETURTLE HT @end example makes the turtle invisible. It's a good idea to do this while you're in the middle of a complicated drawing, because hiding the turtle speeds up the drawing substantially. @node CLEAN, CLEARSCREEN, HIDETURTLE, TURTLE AND WINDOW CONTROL @unnumberedsubsec clean @cindex clean @example CLEAN @end example erases all lines that the turtle has drawn on the graphics window. The turtle's state (position, heading, pen mode, etc.) is not changed. @node CLEARSCREEN, WRAP, CLEAN, TURTLE AND WINDOW CONTROL @unnumberedsubsec clearscreen @cindex clearscreen @cindex cs @example CLEARSCREEN CS @end example erases the graphics window and sends the turtle to its initial position and heading. Like @code{HOME} and @code{CLEAN} together. @xref{HOME} . @node WRAP, WINDOW, CLEARSCREEN, TURTLE AND WINDOW CONTROL @unnumberedsubsec wrap @cindex wrap @example WRAP @end example tells the turtle to enter wrap mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will "wrap around" and reappear at the opposite edge of the window. The top edge wraps to the bottom edge, while the left edge wraps to the right edge. (So the window is topologically equivalent to a torus.) This is the turtle's initial mode. Compare @code{WINDOW} and @code{FENCE}. @xref{FENCE} . @node WINDOW, FENCE, WRAP, TURTLE AND WINDOW CONTROL @unnumberedsubsec window @cindex window @example WINDOW @end example tells the turtle to enter window mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move offscreen. The visible graphics window is considered as just part of an infinite graphics plane; the turtle can be anywhere on the plane. (If you lose the turtle, @code{HOME} will bring it back to the center of the window.) Compare @code{WRAP} and @code{FENCE}. @xref{HOME} . @node FENCE, FILL, WINDOW, TURTLE AND WINDOW CONTROL @unnumberedsubsec fence @cindex fence @example FENCE @end example tells the turtle to enter fence mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move as far as it can and then stop at the edge with an "out of bounds" error message. Compare @code{WRAP} and @code{WINDOW}. @xref{WRAP} . @node FILL, FILLED, FENCE, TURTLE AND WINDOW CONTROL @unnumberedsubsec fill @cindex fill @example FILL @end example fills in a region of the graphics window containing the turtle and bounded by lines that have been drawn earlier. This is not portable; it doesn't work for all machines, and may not work exactly the same way on different machines. @node FILLED, LABEL, FILL, TURTLE AND WINDOW CONTROL @unnumberedsubsec filled @cindex filled @example FILLED color instructions @end example runs the instructions, remembering all points visited by turtle motion commands, starting @emph{and ending} with the turtle's initial position. Then draws (ignoring penmode) the resulting polygon, in the current pen color, filling the polygon with the given color, which can be a color number or an RGB list. The instruction list cannot include another FILLED invocation. (wxWidgets only) @node LABEL, SETLABELHEIGHT, FILLED, TURTLE AND WINDOW CONTROL @unnumberedsubsec label @cindex label @example LABEL text @end example takes a word or list as input, and prints the input on the graphics window, starting at the turtle's position. @node SETLABELHEIGHT, TEXTSCREEN, LABEL, TURTLE AND WINDOW CONTROL @unnumberedsubsec setlabelheight @cindex setlabelheight @example SETLABELHEIGHT height @end example command (wxWidgets only). Takes a positive integer argument and tries to set the font size so that the character height (including descenders) is that many turtle steps. This will be different from the number of screen pixels if @code{SETSCRUNCH} has been used. Also, note that @code{SETSCRUNCH} changes the font size to try to preserve this height in turtle steps. Note that the query operation corresponding to this command is @code{LABELSIZE}, not @code{LABELHEIGHT}, because it tells you the width as well as the height of characters in the current font. @node TEXTSCREEN, FULLSCREEN, SETLABELHEIGHT, TURTLE AND WINDOW CONTROL @unnumberedsubsec textscreen @cindex textscreen @example TEXTSCREEN TS @end example rearranges the size and position of windows to maximize the space available in the text window (the window used for interaction with Logo). The details differ among machines. Compare @code{SPLITSCREEN} and @code{FULLSCREEN}. @xref{SPLITSCREEN} . @node FULLSCREEN, SPLITSCREEN, TEXTSCREEN, TURTLE AND WINDOW CONTROL @unnumberedsubsec fullscreen @cindex fullscreen @cindex fs @example FULLSCREEN FS @end example rearranges the size and position of windows to maximize the space available in the graphics window. The details differ among machines. Compare @code{SPLITSCREEN} and @code{TEXTSCREEN}. Since there must be a text window to allow printing (including the printing of the Logo prompt), Logo automatically switches from fullscreen to splitscreen whenever anything is printed. In the DOS version, switching from fullscreen to splitscreen loses the part of the picture that's hidden by the text window. [This design decision follows from the scarcity of memory, so that the extra memory to remember an invisible part of a drawing seems too expensive.] @node SPLITSCREEN, SETSCRUNCH, FULLSCREEN, TURTLE AND WINDOW CONTROL @unnumberedsubsec splitscreen @cindex splitscreen @cindex ss @example SPLITSCREEN SS @end example rearranges the size and position of windows to allow some room for text interaction while also keeping most of the graphics window visible. The details differ among machines. Compare @code{TEXTSCREEN} and @code{FULLSCREEN}. @xref{TEXTSCREEN} . @node SETSCRUNCH, REFRESH, SPLITSCREEN, TURTLE AND WINDOW CONTROL @unnumberedsubsec setscrunch @cindex setscrunch @cindex scrunch.dat @example SETSCRUNCH xscale yscale @end example adjusts the aspect ratio and scaling of the graphics display. After this command is used, all further turtle motion will be adjusted by multiplying the horizontal and vertical extent of the motion by the two numbers given as inputs. For example, after the instruction @w{@t{SETSCRUNCH 2 1}} motion at a heading of 45 degrees will move twice as far horizontally as vertically. If your squares don't come out square, try this. (Alternatively, you can deliberately misadjust the aspect ratio to draw an ellipse.) For all modern computers, both scale factors are initially 1. For DOS machines, the scale factors are initially set according to what the hardware claims the aspect ratio is, but the hardware sometimes lies. For DOS, the values set by @code{SETSCRUNCH} are remembered in a file (called @file{scrunch.dat}) and are automatically put into effect when a Logo session begins. @node REFRESH, NOREFRESH, SETSCRUNCH, TURTLE AND WINDOW CONTROL @unnumberedsubsec refresh @cindex refresh @example REFRESH @end example (command) tells Logo to remember the turtle's motions so that they can be used for high-resolution printing (wxWidgets) or to refresh the graphics window if it is moved, resized, or overlayed (non-wxWidgets). This is the default. @node NOREFRESH, , REFRESH, TURTLE AND WINDOW CONTROL @unnumberedsubsec norefresh @cindex norefresh @example NOREFRESH @end example (command) tells Logo not to remember the turtle's motions, which may be useful to save time and memory if your program is interactive or animated, rather than drawing a static picture you'll want to print later (wxWidgets). In non-wxWidgets versions, using NOREFRESH may prevent Logo from restoring the graphics image after the window is moved, resized, or overlayed. @node TURTLE AND WINDOW QUERIES, PEN AND BACKGROUND CONTROL, TURTLE AND WINDOW CONTROL, GRAPHICS @section Turtle and Window Queries @menu * SHOWNP:: * SCREENMODE:: * TURTLEMODE:: * LABELSIZE:: @end menu @node SHOWNP, SCREENMODE, TURTLE AND WINDOW QUERIES, TURTLE AND WINDOW QUERIES @unnumberedsubsec shownp @cindex shownp @cindex shown? @example SHOWNP SHOWN? @end example outputs @code{TRUE} if the turtle is shown (visible), @code{FALSE} if the turtle is hidden. See @code{SHOWTURTLE} and @code{HIDETURTLE}. @xref{SHOWTURTLE} , @ref{HIDETURTLE} . @node SCREENMODE, TURTLEMODE, SHOWNP, TURTLE AND WINDOW QUERIES @unnumberedsubsec screenmode @cindex screenmode @example SCREENMODE @end example outputs the word @code{TEXTSCREEN}, @code{SPLITSCREEN}, or @code{FULLSCREEN} depending on the current screen mode. @node TURTLEMODE, LABELSIZE, SCREENMODE, TURTLE AND WINDOW QUERIES @unnumberedsubsec turtlemode @cindex turtlemode @example TURTLEMODE @end example outputs the word @code{WRAP}, @code{FENCE}, or @code{WINDOW} depending on the current turtle mode. @node LABELSIZE, , TURTLEMODE, TURTLE AND WINDOW QUERIES @unnumberedsubsec labelsize @cindex labelsize @example LABELSIZE @end example (wxWidgets only) outputs a list of two positive integers, the width and height of characters displayed by @code{LABEL} measured in turtle steps (which will be different from screen pixels if @code{SETSCRUNCH} has been used). There is no @code{SETLABELSIZE} because the width and height of a font are not separately controllable, so the inverse of this operation is @code{SETLABELHEIGHT}, which takes just one number for the desired height. @node PEN AND BACKGROUND CONTROL, PEN QUERIES, TURTLE AND WINDOW QUERIES, GRAPHICS @section Pen and Background Control The turtle carries a pen that can draw pictures. At any time the pen can be UP (in which case moving the turtle does not change what's on the graphics screen) or DOWN (in which case the turtle leaves a trace). If the pen is down, it can operate in one of three modes: PAINT (so that it draws lines when the turtle moves), ERASE (so that it erases any lines that might have been drawn on or through that path earlier), or REVERSE (so that it inverts the status of each point along the turtle's path). @menu * PENDOWN:: * PENUP:: * PENPAINT:: * PENERASE:: * PENREVERSE:: * SETPENCOLOR:: * SETPALETTE:: * SETPENSIZE:: * SETPENPATTERN:: * SETPEN:: * SETBACKGROUND:: @end menu @node PENDOWN, PENUP, PEN AND BACKGROUND CONTROL, PEN AND BACKGROUND CONTROL @unnumberedsubsec pendown @cindex pendown @cindex pd @example PENDOWN PD @end example sets the pen's position to @code{DOWN}, without changing its mode. @node PENUP, PENPAINT, PENDOWN, PEN AND BACKGROUND CONTROL @unnumberedsubsec penup @cindex penup @cindex pu @example PENUP PU @end example sets the pen's position to @code{UP}, without changing its mode. @node PENPAINT, PENERASE, PENUP, PEN AND BACKGROUND CONTROL @unnumberedsubsec penpaint @cindex penpaint @cindex ppt @example PENPAINT PPT @end example sets the pen's position to @code{DOWN} and mode to @code{PAINT}. @node PENERASE, PENREVERSE, PENPAINT, PEN AND BACKGROUND CONTROL @unnumberedsubsec penerase @cindex penerase @cindex pe @example PENERASE PE @end example sets the pen's position to @code{DOWN} and mode to @code{ERASE}. @xref{ERASE} . @node PENREVERSE, SETPENCOLOR, PENERASE, PEN AND BACKGROUND CONTROL @unnumberedsubsec penreverse @cindex penreverse @cindex px @example PENREVERSE PX @end example sets the pen's position to @code{DOWN} and mode to @code{REVERSE}. (This may interact in system-dependent ways with use of color.) @xref{REVERSE} . @node SETPENCOLOR, SETPALETTE, PENREVERSE, PEN AND BACKGROUND CONTROL @unnumberedsubsec setpencolor @cindex setpencolor @cindex setpc @example SETPENCOLOR colornumber.or.rgblist SETPC colornumber.or.rgblist @end example sets the pen color to the given number, which must be a nonnegative integer. There are initial assignments for the first 16 colors: @example 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey @end example but other colors can be assigned to numbers by the @code{PALETTE} command. Alternatively, sets the pen color to the given RGB values (a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color). @node SETPALETTE, SETPENSIZE, SETPENCOLOR, PEN AND BACKGROUND CONTROL @unnumberedsubsec setpalette @cindex setpalette @example SETPALETTE colornumber rgblist @end example sets the actual color corresponding to a given number, if allowed by the hardware and operating system. Colornumber must be an integer greater than or equal to 8. (Logo tries to keep the first 8 colors constant.) The second input is a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color. @node SETPENSIZE, SETPENPATTERN, SETPALETTE, PEN AND BACKGROUND CONTROL @unnumberedsubsec setpensize @cindex setpensize @example SETPENSIZE size @end example sets the thickness of the pen. The input is either a single positive integer or a list of two positive integers (for horizontal and vertical thickness). Some versions pay no attention to the second number, but always have a square pen. @node SETPENPATTERN, SETPEN, SETPENSIZE, PEN AND BACKGROUND CONTROL @unnumberedsubsec setpenpattern @cindex setpenpattern @example SETPENPATTERN pattern @end example sets hardware-dependent pen characteristics. This command is not guaranteed compatible between implementations on different machines. @node SETPEN, SETBACKGROUND, SETPENPATTERN, PEN AND BACKGROUND CONTROL @unnumberedsubsec setpen @cindex setpen @example SETPEN list (library procedure) @end example sets the pen's position, mode, thickness, and hardware-dependent characteristics according to the information in the input list, which should be taken from an earlier invocation of @code{PEN}. @xref{PEN} . @node SETBACKGROUND, , SETPEN, PEN AND BACKGROUND CONTROL @unnumberedsubsec setbackground @cindex setbackground @cindex setbg @example SETBACKGROUND colornumber.or.rgblist SETBG colornumber.or.rgblist @end example set the screen background color by slot number or RGB values. See @code{SETPENCOLOR} for details. @xref{SETPENCOLOR} . @node PEN QUERIES, SAVING AND LOADING PICTURES, PEN AND BACKGROUND CONTROL, GRAPHICS @section Pen Queries @menu * PENDOWNP:: * PENMODE:: * PENCOLOR:: * PALETTE:: * PENSIZE:: * PEN:: * BACKGROUND:: @end menu @node PENDOWNP, PENMODE, PEN QUERIES, PEN QUERIES @unnumberedsubsec pendownp @cindex pendownp @cindex pendown? @example PENDOWNP PENDOWN? @end example outputs @code{TRUE} if the pen is down, @code{FALSE} if it's up. @node PENMODE, PENCOLOR, PENDOWNP, PEN QUERIES @unnumberedsubsec penmode @cindex penmode @example PENMODE @end example outputs one of the words @code{PAINT}, @code{ERASE}, or @code{REVERSE} according to the current pen mode. @xref{ERASE} , @ref{REVERSE} . @node PENCOLOR, PALETTE, PENMODE, PEN QUERIES @unnumberedsubsec pencolor @cindex pencolor @cindex pc @example PENCOLOR PC @end example outputs a color number, a nonnegative integer that is associated with a particular color, or a list of RGB values if such a list was used as the most recent input to @code{SETPENCOLOR}. There are initial assignments for the first 16 colors: @example 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey @end example but other colors can be assigned to numbers by the @code{PALETTE} command. @node PALETTE, PENSIZE, PENCOLOR, PEN QUERIES @unnumberedsubsec palette @cindex palette @example PALETTE colornumber @end example outputs a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the color associated with the given number. @node PENSIZE, PEN, PALETTE, PEN QUERIES @unnumberedsubsec pensize @cindex pensize @cindex penpattern @example PENSIZE @end example outputs a list of two positive integers, specifying the horizontal and vertical thickness of the turtle pen. (In some implementations, including wxWidgets, the two numbers are always equal.) @example PENPATTERN @end example outputs system-specific pen information. @node PEN, BACKGROUND, PENSIZE, PEN QUERIES @unnumberedsubsec pen @cindex pen @example PEN (library procedure) @end example outputs a list containing the pen's position, mode, thickness, and hardware-specific characteristics, for use by @code{SETPEN}. @xref{SETPEN} . @node BACKGROUND, , PEN, PEN QUERIES @unnumberedsubsec background @cindex background @cindex bg @example BACKGROUND BG @end example outputs the graphics background color, either as a slot number or as an RGB list, whichever way it was set. (See @code{PENCOLOR}.) @node SAVING AND LOADING PICTURES, MOUSE QUERIES, PEN QUERIES, GRAPHICS @comment node-name, next, previous, up @section Saving and Loading Pictures @menu * SAVEPICT:: * LOADPICT:: * EPSPICT:: @end menu @node SAVEPICT, LOADPICT, SAVING AND LOADING PICTURES, SAVING AND LOADING PICTURES @comment node-name, next, previous, up @unnumberedsubsec savepict @cindex savepict @example SAVEPICT filename @end example command. Writes a file with the specified name containing the state of the graphics window, including any nonstandard color palette settings, in Logo's internal format. This picture can be restored to the screen using @code{LOADPICT}. The format is not portable between platforms, nor is it readable by other programs. @ref{EPSPICT} to export Logo graphics for other programs. @node LOADPICT, EPSPICT, SAVEPICT, SAVING AND LOADING PICTURES @comment node-name, next, previous, up @unnumberedsubsec loadpict @cindex loadpict @example LOADPICT filename @end example command. Reads the specified file, which must have been written by a @code{SAVEPICT} command, and restores the graphics window and color palette settings to the values stored in the file. Any drawing previously on the screen is cleared. @xref{SAVEPICT} . @node EPSPICT, , LOADPICT, SAVING AND LOADING PICTURES @comment node-name, next, previous, up @unnumberedsubsec epspict @cindex epspict @example EPSPICT filename @end example command. Writes a file with the specified name, containing an Encapsulated Postscript (EPS) representation of the state of the graphics window. This file can be imported into other programs that understand EPS format. Restrictions: the drawing cannot use @code{FILL}, @code{PENERASE}, or @code{PENREVERSE}; any such instructions will be ignored in the translation to Postscript form. @xref{FILL} , @xref{PENERASE} , @xref{PENREVERSE} . @node MOUSE QUERIES, , SAVING AND LOADING PICTURES, GRAPHICS @comment node-name, next, previous, up @section Mouse Queries @menu * MOUSEPOS:: * CLICKPOS:: * BUTTONP:: * BUTTON:: @end menu @node MOUSEPOS, CLICKPOS, MOUSE QUERIES, MOUSE QUERIES @comment node-name, next, previous, up @unnumberedsubsec mousepos @cindex mousepos @example MOUSEPOS @end example outputs the coordinates of the mouse, provided that it's within the graphics window, in turtle coordinates. If the mouse is outside the graphics window, then the last position within the window is returned. Exception: If a mouse button is pressed within the graphics window and held while the mouse is dragged outside the window, the mouse's position is returned as if the window were big enough to include it. @node CLICKPOS, BUTTONP, MOUSEPOS, MOUSE QUERIES @comment node-name, next, previous, up @unnumberedsubsec clickpos @cindex clickpos @example CLICKPOS @end example outputs the coordinates that the mouse was at when a mouse button was most recently pushed, provided that that position was within the graphics window, in turtle coordinates. (wxWidgets only) @node BUTTONP, BUTTON, CLICKPOS, MOUSE QUERIES @comment node-name, next, previous, up @unnumberedsubsec buttonp @cindex buttonp @cindex button? @example BUTTONP BUTTON? @end example outputs @code{TRUE} if a mouse button is down and the mouse is over the graphics window. Once the button is down, @code{BUTTONP} remains true until the button is released, even if the mouse is dragged out of the graphics window. @node BUTTON, , BUTTONP, MOUSE QUERIES @comment node-name, next, previous, up @unnumberedsubsec button @cindex button @example BUTTON @end example outputs 0 if no mouse button has been pushed inside the Logo window since the last call to @code{BUTTON}. Otherwise, it outputs an integer between 1 and 3 indicating which button was most recently pressed. Ordinarily 1 means left, 2 means right, and 3 means center, but operating systems may reconfigure these. @node WORKSPACE MANAGEMENT, CONTROL STRUCTURES, GRAPHICS, Top @chapter Workspace Management @menu * PROCEDURE DEFINITION:: * VARIABLE DEFINITION:: * PROPERTY LISTS:: * WORKSPACE PREDICATES:: * WORKSPACE QUERIES:: * WORKSPACE INSPECTION:: * WORKSPACE CONTROL:: @end menu @node PROCEDURE DEFINITION, VARIABLE DEFINITION, WORKSPACE MANAGEMENT, WORKSPACE MANAGEMENT @section Procedure Definition @menu * TO:: * DEFINE:: * TEXT:: * FULLTEXT:: * COPYDEF:: @end menu @node TO, DEFINE, PROCEDURE DEFINITION, PROCEDURE DEFINITION @unnumberedsubsec to @cindex to @example TO procname :input1 :input2 ... (special form) @end example command. Prepares Logo to accept a procedure definition. The procedure will be named @var{procname} and there must not already be a procedure by that name. The inputs will be called @var{input1} etc. Any number of inputs are allowed, including none. Names of procedures and inputs are case-insensitive. Unlike every other Logo procedure, TO takes as its inputs the actual words typed in the instruction line, as if they were all quoted, rather than the results of evaluating expressions to provide the inputs. (That's what @dfn{special form} means.) This version of Logo allows variable numbers of inputs to a procedure. After the procedure name come four kinds of things, @emph{in this order}: @example 1. 0 or more REQUIRED inputs :FOO :FROBOZZ 2. 0 or more OPTIONAL inputs [:BAZ 87] [:THINGO 5+9] 3. 0 or 1 REST input [:GARPLY] 4. 0 or 1 DEFAULT number 5 @end example Every procedure has a @var{minimum}, @var{default}, and @var{maximum} number of inputs. (The latter can be infinite.) The @var{minimum} number of inputs is the number of required inputs, which must come first. A required input is indicated by the @example :inputname @end example notation. After all the required inputs can be zero or more optional inputs, each of which is represented by the following notation: @example [:inputname default.value.expression] @end example When the procedure is invoked, if actual inputs are not supplied for these optional inputs, the @var{default value expression}s are evaluated to set values for the corresponding input names. The inputs are processed from left to right, so a default value expression can be based on earlier inputs. Example: @example to proc :inlist [:startvalue first :inlist] @end example If the procedure is invoked by saying @example proc [a b c] @end example then the variable @code{inlist} will have the value @w{@t{[A B C]}} and the variable @code{startvalue} will have the value @t{A}. If the procedure is invoked by saying @example (proc [a b c] "x) @end example then @code{inlist} will have the value @w{@t{[A B C]}} and @code{startvalue} will have the value @t{X}. After all the required and optional input can come a single @dfn{rest} input, represented by the following notation: @example [:inputname] @end example This is a rest input rather than an optional input because there is no default value expression. There can be at most one rest input. When the procedure is invoked, the value of this @var{inputname} will be a list containing all of the actual inputs provided that were not used for required or optional inputs. Example: @example to proc :in1 [:in2 "foo] [:in3 "baz] [:in4] @end example If this procedure is invoked by saying @example proc "x @end example then @code{in1} has the value @t{X}, @code{in2} has the value @t{FOO}, @code{in3} has the value @t{BAZ}, and @code{in4} has the value @t{[]} (the empty list). If it's invoked by saying @example (proc "a "b "c "d "e) @end example then @code{in1} has the value @t{A}, @code{in2} has the value @t{B}, @code{in3} has the value @t{C}, and @code{in4} has the value @w{@t{[D E]}}. The @emph{maximum} number of inputs for a procedure is infinite if a rest input is given; otherwise, it is the number of required inputs plus the number of optional inputs. The @emph{default} number of inputs for a procedure, which is the number of inputs that it will accept if its invocation is not enclosed in parentheses, is ordinarily equal to the minimum number. If you want a different default number you can indicate that by putting the desired default number as the last thing on the @code{TO} line. example: @example to proc :in1 [:in2 "foo] [:in3] 3 @end example This procedure has a minimum of one input, a default of three inputs, and an infinite maximum. Logo responds to the @code{TO} command by entering procedure definition mode. The prompt character changes from @code{?} to @code{>} and whatever instructions you type become part of the definition until you type a line containing only the word @code{END}. @node DEFINE, TEXT, TO, PROCEDURE DEFINITION @unnumberedsubsec define @cindex define @example DEFINE procname text @end example command. Defines a procedure with name @var{procname} and text @var{text}. If there is already a procedure with the same name, the new definition replaces the old one. The @var{text} input must be a list whose members are lists. The first member is a list of inputs; it looks like a @code{TO} line but without the word @code{TO}, without the procedure name, and without the colons before input names. In other words, the members of this first sublist are words for the names of required inputs and lists for the names of optional or rest inputs. The remaining sublists of the @var{text} input make up the body of the procedure, with one sublist for each instruction line of the body. (There is no @code{END} line in the text input.) It is an error to redefine a primitive procedure unless the variable @code{REDEFP} has the value @code{TRUE}. @xref{REDEFP} . @node TEXT, FULLTEXT, DEFINE, PROCEDURE DEFINITION @unnumberedsubsec text @cindex text @example TEXT procname @end example outputs the text of the procedure named @var{procname} in the form expected by @code{DEFINE}: a list of lists, the first of which describes the inputs to the procedure and the rest of which are the lines of its body. The text does not reflect formatting information used when the procedure was defined, such as continuation lines and extra spaces. @node FULLTEXT, COPYDEF, TEXT, PROCEDURE DEFINITION @unnumberedsubsec fulltext @cindex fulltext @example FULLTEXT procname @end example outputs a representation of the procedure @var{procname} in which formatting information is preserved. If the procedure was defined with @code{TO}, @code{EDIT}, or @code{LOAD}, then the output is a list of words. Each word represents one entire line of the definition in the form output by @code{READWORD}, including extra spaces and continuation lines. The last member of the output represents the @code{END} line. If the procedure was defined with @code{DEFINE}, then the output is a list of lists. If these lists are printed, one per line, the result will look like a definition using @code{TO}. Note: the output from @code{FULLTEXT} is not suitable for use as input to @code{DEFINE}! @xref{TO} , @ref{EDIT} , @ref{LOAD} , @ref{DEFINE} . @node COPYDEF, , FULLTEXT, PROCEDURE DEFINITION @unnumberedsubsec copydef @cindex copydef @example COPYDEF newname oldname @end example command. Makes @var{newname} a procedure identical to @var{oldname}. The latter may be a primitive. If @var{newname} was already defined, its previous definition is lost. If @var{newname} was already a primitive, the redefinition is not permitted unless the variable @code{REDEFP} has the value @code{TRUE}. Note: dialects of Logo differ as to the order of inputs to @code{COPYDEF}. This dialect uses "@code{MAKE} order," not "@code{NAME} order." @xref{REDEFP} , @ref{SAVE} , @ref{PO} , @ref{POT} . @node VARIABLE DEFINITION, PROPERTY LISTS, PROCEDURE DEFINITION, WORKSPACE MANAGEMENT @section Variable Definition @menu * MAKE:: * NAME:: * LOCAL:: * LOCALMAKE:: * THING:: * GLOBAL:: @end menu @node MAKE, NAME, VARIABLE DEFINITION, VARIABLE DEFINITION @unnumberedsubsec make @cindex make @example MAKE varname value @end example command. Assigns the value @var{value} to the variable named @var{varname}, which must be a word. Variable names are case-insensitive. If a variable with the same name already exists, the value of that variable is changed. If not, a new global variable is created. @node NAME, LOCAL, MAKE, VARIABLE DEFINITION @unnumberedsubsec name @cindex name @example NAME value varname (library procedure) @end example command. Same as @code{MAKE} but with the inputs in reverse order. @node LOCAL, LOCALMAKE, NAME, VARIABLE DEFINITION @unnumberedsubsec local @cindex local @example LOCAL varname LOCAL varnamelist (LOCAL varname1 varname2 ...) @end example command. Accepts as inputs one or more words, or a list of words. A variable is created for each of these words, with that word as its name. The variables are local to the currently running procedure. Logo variables follow dynamic scope rules; a variable that is local to a procedure is available to any subprocedure invoked by that procedure. The variables created by @code{LOCAL} have no initial value; they must be assigned a value (e.g., with @code{MAKE}) before the procedure attempts to read their value. @xref{MAKE} . @node LOCALMAKE, THING, LOCAL, VARIABLE DEFINITION @comment node-name, next, previous, up @unnumberedsubsec localmake @cindex localmake @example LOCALMAKE varname value (library procedure) @end example command. Makes the named variable local, like @code{LOCAL}, and assigns it the given value, like @code{MAKE}. @xref{LOCAL} , @xref{MAKE} . @node THING, GLOBAL, LOCALMAKE, VARIABLE DEFINITION @unnumberedsubsec thing @cindex thing @example THING varname :quoted.varname @end example outputs the value of the variable whose name is the input. If there is more than one such variable, the innermost local variable of that name is chosen. The colon notation is an abbreviation not for @code{THING} but for the combination @example thing " @end example so that @w{@t{:FOO}} means @w{@t{THING "FOO}}. @node GLOBAL, , THING, VARIABLE DEFINITION @unnumberedsubsec global @cindex global @example GLOBAL varname GLOBAL varnamelist (GLOBAL varname1 varname2 ...) @end example command. Accepts as inputs one or more words, or a list of words. A global variable is created for each of these words, with that word as its name. The only reason this is necessary is that you might want to use the "setter" notation @code{SETXYZ} for a variable @code{XYZ} that does not already have a value; @w{@t{GLOBAL "XYZ}} makes that legal. Note: If there is currently a local variable of the same name, this command does *not* make Logo use the global value instead of the local one. @node PROPERTY LISTS, WORKSPACE PREDICATES, VARIABLE DEFINITION, WORKSPACE MANAGEMENT @section Property Lists Note: Names of property lists are always case-insensitive. Names of individual properties are case-sensitive or case-insensitive depending on the value of @code{CASEIGNOREDP}, which is @code{TRUE} by default. @xref{CASEIGNOREDP} . In principle, every possible name is the name of a property list, which is initially empty. So Logo never gives a "no such property list" error, as it would for undefined procedure or variable names. But the primitive procedures that deal with "all" property lists (@code{CONTENTS}, @code{PLISTS}, etc.) list only nonempty ones. To "erase" a property list @ref{ERASE} means to make it empty, removing all properties from it. @menu * PPROP:: * GPROP:: * REMPROP:: * PLIST:: @end menu @node PPROP, GPROP, PROPERTY LISTS, PROPERTY LISTS @unnumberedsubsec pprop @cindex pprop @example PPROP plistname propname value @end example command. Adds a property to the @var{plistname} property list with name @var{propname} and value @var{value}. @node GPROP, REMPROP, PPROP, PROPERTY LISTS @unnumberedsubsec gprop @cindex gprop @example GPROP plistname propname @end example outputs the value of the @var{propname} property in the @var{plistname} property list, or the empty list if there is no such property. @node REMPROP, PLIST, GPROP, PROPERTY LISTS @unnumberedsubsec remprop @cindex remprop @example REMPROP plistname propname @end example command. Removes the property named @var{propname} from the property list named @var{plistname}. @node PLIST, , REMPROP, PROPERTY LISTS @unnumberedsubsec plist @cindex plist @example PLIST plistname @end example outputs a list whose odd-numbered members are the names, and whose even-numbered members are the values, of the properties in the property list named @var{plistname}. The output is a copy of the actual property list; changing properties later will not magically change a list output earlier by @code{PLIST}. @node WORKSPACE PREDICATES, WORKSPACE QUERIES, PROPERTY LISTS, WORKSPACE MANAGEMENT @section Workspace Predicates @menu * PROCEDUREP:: * PRIMITIVEP:: * DEFINEDP:: * NAMEP:: * PLISTP:: @end menu @node PROCEDUREP, PRIMITIVEP, WORKSPACE PREDICATES, WORKSPACE PREDICATES @unnumberedsubsec procedurep @cindex procedurep @cindex procedure? @example PROCEDUREP name PROCEDURE? name @end example outputs @code{TRUE} if the input is the name of a procedure. @node PRIMITIVEP, DEFINEDP, PROCEDUREP, WORKSPACE PREDICATES @unnumberedsubsec primitivep @cindex primitivep @cindex primitive? @example PRIMITIVEP name PRIMITIVE? name @end example outputs @code{TRUE} if the input is the name of a primitive procedure (one built into Logo). Note that some of the procedures described in this document are library procedures, not primitives. @node DEFINEDP, NAMEP, PRIMITIVEP, WORKSPACE PREDICATES @unnumberedsubsec definedp @cindex definedp @cindex defined? @example DEFINEDP name DEFINED? name @end example outputs @code{TRUE} if the input is the name of a user-defined procedure, including a library procedure. @node NAMEP, PLISTP, DEFINEDP, WORKSPACE PREDICATES @unnumberedsubsec namep @cindex namep @cindex name? @example NAMEP name NAME? name @end example outputs @code{TRUE} if the input is the name of a variable. @node PLISTP, , NAMEP, WORKSPACE PREDICATES @comment node-name, next, previous, up @unnumberedsubsec plistp @cindex plistp @cindex plist? @example PLISTP name PLIST? name @end example outputs @code{TRUE} if the input is the name of a @emph{nonempty} property list. (In principle every word is the name of a property list; if you haven't put any properties in it, @code{PLIST} of that name outputs an empty list, rather than giving an error message.) @node WORKSPACE QUERIES, WORKSPACE INSPECTION, WORKSPACE PREDICATES, WORKSPACE MANAGEMENT @section Workspace Queries @menu * CONTENTS:: * BURIED:: * TRACED:: * STEPPED:: * PROCEDURES:: * PRIMITIVES:: * NAMES:: * PLISTS:: * NAMELIST:: * PLLIST:: * ARITY:: * NODES:: @end menu Note: All procedures whose input is indicated as @var{contentslist} will accept a single word (taken as a procedure name), a list of words (taken as names of procedures), or a list of three lists as described under the @code{CONTENTS} command above. @node CONTENTS, BURIED, WORKSPACE QUERIES, WORKSPACE QUERIES @unnumberedsubsec contents @cindex contents @example CONTENTS @end example outputs a "contents list," i.e., a list of three lists containing names of defined procedures, variables, and property lists respectively. This list includes all unburied named items in the workspace. @node BURIED, TRACED, CONTENTS, WORKSPACE QUERIES @unnumberedsubsec buried @cindex buried @example BURIED @end example outputs a contents list including all buried named items in the workspace. @node TRACED, STEPPED, BURIED, WORKSPACE QUERIES @comment node-name, next, previous, up @unnumberedsubsec traced @cindex traced @example TRACED @end example outputs a contents list including all traced named items in the workspace. @node STEPPED, PROCEDURES, TRACED, WORKSPACE QUERIES @comment node-name, next, previous, up @unnumberedsubsec stepped @cindex stepped @example STEPPED @end example outputs a contents list including all stepped named items in the workspace. @node PROCEDURES, PRIMITIVES, STEPPED, WORKSPACE QUERIES @unnumberedsubsec procedures @cindex procedures @example PROCEDURES @end example outputs a list of the names of all unburied user-defined procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.) @node PRIMITIVES, NAMES, PROCEDURES, WORKSPACE QUERIES @unnumberedsubsec primitives @cindex primitives @example PRIMITIVES @end example outputs a list of the names of all primitive procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.) @node NAMES, PLISTS, PRIMITIVES, WORKSPACE QUERIES @unnumberedsubsec names @cindex names @example NAMES @end example outputs a contents list consisting of an empty list (indicating no procedure names) followed by a list of all unburied variable names in the workspace. @node PLISTS, NAMELIST, NAMES, WORKSPACE QUERIES @unnumberedsubsec plists @cindex plists @example PLISTS @end example outputs a contents list consisting of two empty lists (indicating no procedures or variables) followed by a list of all unburied nonempty property lists in the workspace. @node NAMELIST, PLLIST, PLISTS, WORKSPACE QUERIES @unnumberedsubsec namelist @cindex namelist @example NAMELIST varname (library procedure) NAMELIST varnamelist @end example outputs a contents list consisting of an empty list followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input. @node PLLIST, ARITY, NAMELIST, WORKSPACE QUERIES @unnumberedsubsec pllist @cindex pllist @example PLLIST plname (library procedure) PLLIST plnamelist @end example outputs a contents list consisting of two empty lists followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input. @xref{CONTENTS} . @node ARITY, NODES, PLLIST, WORKSPACE QUERIES @unnumberedsubsec arity @cindex arity @example ARITY procedurename @end example outputs a list of three numbers: the minimum, default, and maximum number of inputs for the procedure whose name is the input. It is an error if there is no such procedure. A maximum of -1 means that the number of inputs is unlimited. @node NODES, , ARITY, WORKSPACE QUERIES @unnumberedsubsec nodes @cindex nodes @example NODES @end example outputs a list of two numbers. The first represents the number of nodes of memory currently in use. The second shows the maximum number of nodes that have been in use at any time since the last invocation of @code{NODES}. (A node is a small block of computer memory as used by Logo. Each number uses one node. Each non-numeric word uses one node, plus some non-node memory for the characters in the word. Each array takes one node, plus some non-node memory, as well as the memory required by its elements. Each list requires one node per element, as well as the memory within the elements.) If you want to track the memory use of an algorithm, it is best if you invoke @code{GC} at the beginning of each iteration, since otherwise the maximum will include storage that is unused but not yet collected. @node WORKSPACE INSPECTION, WORKSPACE CONTROL, WORKSPACE QUERIES, WORKSPACE MANAGEMENT @section Workspace Inspection @menu * PO:: * POALL:: * POPS:: * PONS:: * POPLS:: * PON:: * POPL:: * POT:: * POTS:: @end menu @node PO, POALL, WORKSPACE INSPECTION, WORKSPACE INSPECTION @unnumberedsubsec po @cindex printout @cindex po @example PRINTOUT contentslist PO contentslist @end example command. Prints to the write stream the definitions of all procedures, variables, and property lists named in the input contents list. @node POALL, POPS, PO, WORKSPACE INSPECTION @unnumberedsubsec poall @cindex poall @example POALL (library procedure) @end example command. Prints all unburied definitions in the workspace. Abbreviates @w{@t{PO CONTENTS}}. @xref{CONTENTS} . @node POPS, PONS, POALL, WORKSPACE INSPECTION @unnumberedsubsec pops @cindex pops @example POPS (library procedure) @end example command. Prints the definitions of all unburied procedures in the workspace. Abbreviates @w{@t{PO PROCEDURES}}. @xref{PO} , @ref{PROCEDURES} . @node PONS, POPLS, POPS, WORKSPACE INSPECTION @unnumberedsubsec pons @cindex pons @example PONS (library procedure) @end example command. Prints the definitions of all unburied variables in the workspace. Abbreviates @w{@t{PO NAMES}}. @xref{PO} , @ref{NAMES} . @node POPLS, PON, PONS, WORKSPACE INSPECTION @unnumberedsubsec popls @cindex popls @example POPLS (library procedure) @end example command. Prints the contents of all unburied nonempty property lists in the workspace. Abbreviates @w{@t{PO PLISTS}}. @xref{PO} , @ref{PLISTS} . @node PON, POPL, POPLS, WORKSPACE INSPECTION @unnumberedsubsec pon @cindex pon @example PON varname (library procedure) PON varnamelist @end example command. Prints the definitions of the named variable(s). @* Abbreviates @w{@t{PO NAMELIST varname(list)}}. @xref{PO} , @ref{NAMELIST} . @node POPL, POT, PON, WORKSPACE INSPECTION @unnumberedsubsec popl @cindex popl @example POPL plname (library procedure) POPL plnamelist @end example command. Prints the definitions of the named property list(s). @* Abbreviates @w{@t{PO PLLIST plname(list)}}. @xref{PO} , @ref{PLLIST} . @node POT, POTS, POPL, WORKSPACE INSPECTION @unnumberedsubsec pot @cindex pot @example POT contentslist @end example command. Prints the title lines of the named procedures and the definitions of the named variables and property lists. For property lists, the entire list is shown on one line instead of as a series of @code{PPROP} instructions as in @code{PO}. @xref{PPROP} , @ref{PO} . @node POTS, , POT, WORKSPACE INSPECTION @unnumberedsubsec pots @cindex pots @example POTS (library procedure) @end example command. Prints the title lines of all unburied procedures in the workspace. Abbreviates @w{@t{POT PROCEDURES}}. @xref{PROCEDURES} . @node WORKSPACE CONTROL, , WORKSPACE INSPECTION, WORKSPACE MANAGEMENT @section Workspace Control @menu * ERASE:: * ERALL:: * ERPS:: * ERNS:: * ERPLS:: * ERN:: * ERPL:: * BURY:: * BURYALL:: * BURYNAME:: * UNBURY:: * UNBURYALL:: * UNBURYNAME:: * BURIEDP:: * TRACE:: * UNTRACE:: * TRACEDP:: * STEP:: * UNSTEP:: * STEPPEDP:: * EDIT:: * EDITFILE:: * EDALL:: * EDPS:: * EDNS:: * EDPLS:: * EDN:: * EDPL:: * SAVE:: * SAVEL:: * LOAD:: * CSLSLOAD:: * HELP:: * SETEDITOR:: * SETLIBLOC:: * SETHELPLOC:: * SETCSLSLOC:: * SETTEMPLOC:: * GC:: * .SETSEGMENTSIZE:: @end menu @node ERASE, ERALL, WORKSPACE CONTROL, WORKSPACE CONTROL @unnumberedsubsec erase @cindex erase @cindex er @example ERASE contentslist ER contentslist @end example command. Erases from the workspace the procedures, variables, and property lists named in the input. Primitive procedures may not be erased unless the variable @code{REDEFP} has the value @code{TRUE}. @xref{REDEFP} . @node ERALL, ERPS, ERASE, WORKSPACE CONTROL @unnumberedsubsec erall @cindex erall @example ERALL @end example command. Erases all unburied procedures, variables, and property lists from the workspace. Abbreviates @w{@t{ERASE CONTENTS}}. @xref{CONTENTS} . @node ERPS, ERNS, ERALL, WORKSPACE CONTROL @unnumberedsubsec erps @cindex erps @example ERPS @end example command. Erases all unburied procedures from the workspace. @* Abbreviates @w{@t{ERASE PROCEDURES}}. @xref{ERASE} , @ref{PROCEDURES} . @node ERNS, ERPLS, ERPS, WORKSPACE CONTROL @unnumberedsubsec erns @cindex erns @example ERNS @end example command. Erases all unburied variables from the workspace. Abbreviates @w{@t{ERASE NAMES}}. @xref{ERASE} , @ref{NAMES} . @node ERPLS, ERN, ERNS, WORKSPACE CONTROL @unnumberedsubsec erpls @cindex erpls @example ERPLS @end example command. Erases all unburied property lists from the workspace. @* Abbreviates @w{@t{ERASE PLISTS}}. @xref{ERASE} , @ref{PLISTS} . @node ERN, ERPL, ERPLS, WORKSPACE CONTROL @unnumberedsubsec ern @cindex ern @example ERN varname (library procedure) ERN varnamelist @end example command. Erases from the workspace the variable(s) named in the input. Abbreviates @w{@t{ERASE NAMELIST @var{varname(list)}}}. @xref{ERASE} , @ref{NAMELIST} . @node ERPL, BURY, ERN, WORKSPACE CONTROL @unnumberedsubsec erpl @cindex erpl @example ERPL plname (library procedure) ERPL plnamelist @end example command. Erases from the workspace the property list(s) named in the input. Abbreviates @w{@t{ERASE PLLIST @var{plname(list)}}}. @xref{ERASE} , @ref{PLLIST} . @node BURY, BURYALL, ERPL, WORKSPACE CONTROL @unnumberedsubsec bury @cindex bury @example BURY contentslist @end example command. Buries the procedures, variables, and property lists named in the input. A buried item is not included in the lists output by @code{CONTENTS}, @code{PROCEDURES}, @code{VARIABLES}, and @code{PLISTS}, but is included in the list output by @code{BURIED}. By implication, buried things are not printed by @code{POALL} or saved by @code{SAVE}. @xref{CONTENTS} , @ref{PROCEDURES} , @ref{PONS} , @ref{PLISTS} , @ref{POALL} , @ref{SAVE} . @node BURYALL, BURYNAME, BURY, WORKSPACE CONTROL @unnumberedsubsec buryall @cindex buryall @example BURYALL (library procedure) @end example command. Abbreviates @t{BURY CONTENTS}. @xref{CONTENTS} . @node BURYNAME, UNBURY, BURYALL, WORKSPACE CONTROL @unnumberedsubsec buryname @cindex buryname @example BURYNAME varname (library procedure) BURYNAME varnamelist @end example command. Abbreviates @t{BURY NAMELIST @code{varname(list)}}. @xref{BURY} , @ref{NAMELIST} . @node UNBURY, UNBURYALL, BURYNAME, WORKSPACE CONTROL @unnumberedsubsec unbury @cindex unbury @example UNBURY contentslist @end example command. Unburies the procedures, variables, and property lists named in the input. That is, the named items will be returned to view in @code{CONTENTS}, etc. @xref{CONTENTS} . @node UNBURYALL, UNBURYNAME, UNBURY, WORKSPACE CONTROL @unnumberedsubsec unburyall @cindex unburyall @example UNBURYALL (library procedure) @end example command. Abbreviates @t{UNBURY BURIED}. @xref{BURIED} . @node UNBURYNAME, BURIEDP, UNBURYALL, WORKSPACE CONTROL @unnumberedsubsec unburyname @cindex unburyname @example UNBURYNAME varname (library procedure) UNBURYNAME varnamelist @end example command. Abbreviates @t{UNBURY NAMELIST @var{varname(list)}}. @xref{UNBURY} , @ref{NAMELIST} . @node BURIEDP, TRACE, UNBURYNAME, WORKSPACE CONTROL @comment node-name, next, previous, up @unnumberedsubsec buriedp @cindex buriedp @cindex buried? @example BURIEDP contentslist BURIED? contentslist @end example outputs @code{TRUE} if the first procedure, variable, or property list named in the contents list is buried, @code{FALSE} if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can @code{BURIEDP [[] [@var{variable}]]} or @code{BURIEDP [[] [] [@var{proplist}]]}. @node TRACE, UNTRACE, BURIEDP, WORKSPACE CONTROL @unnumberedsubsec trace @cindex trace @example TRACE contentslist @end example command. Marks the named items for tracing. A message is printed whenever a traced procedure is invoked, giving the actual input values, and whenever a traced procedure @code{STOP}s or @code{OUTPUT}s. A message is printed whenever a new value is assigned to a traced variable using @code{MAKE}. A message is printed whenever a new property is given to a traced property list using @code{PPROP}. @xref{STOP} , @ref{OUTPUT} , @ref{MAKE} , @ref{PPROP} . @node UNTRACE, TRACEDP, TRACE, WORKSPACE CONTROL @unnumberedsubsec untrace @cindex untrace @example UNTRACE contentslist @end example command. Turns off tracing for the named items. @node TRACEDP, STEP, UNTRACE, WORKSPACE CONTROL @comment node-name, next, previous, up @unnumberedsubsec tracedp @cindex tracedp @cindex traced? @example TRACEDP contentslist TRACED? contentslist @end example outputs @code{TRUE} if the first procedure, variable, or property list named in the contents list is traced, @code{FALSE} if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can @code{TRACEDP [[] [@var{variable}]]} or @code{TRACEDP [[] [] [@var{proplist}]]}. @node STEP, UNSTEP, TRACEDP, WORKSPACE CONTROL @unnumberedsubsec step @cindex step @example STEP contentslist @end example command. Marks the named items for stepping. Whenever a stepped procedure is invoked, each instruction line in the procedure body is printed before being executed, and Logo waits for the user to type a newline at the terminal. A message is printed whenever a stepped variable name is @dfn{shadowed} because a local variable of the same name is created either as a procedure input or by the @code{LOCAL} command. @xref{LOCAL} . @node UNSTEP, STEPPEDP, STEP, WORKSPACE CONTROL @unnumberedsubsec unstep @cindex unstep @example UNSTEP contentslist @end example command. Turns off stepping for the named items. @node STEPPEDP, EDIT, UNSTEP, WORKSPACE CONTROL @comment node-name, next, previous, up @unnumberedsubsec steppedp @cindex steppedp @cindex stepped? @example STEPPEDP contentslist STEPPED? contentslist @end example outputs @code{TRUE} if the first procedure, variable, or property list named in the contents list is stepped, @code{FALSE} if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can @code{STEPPEDP [[] [@var{variable}]]} or @code{STEPPEDP [[] [] [@var{proplist}]]}. @node EDIT, EDITFILE, STEPPEDP, WORKSPACE CONTROL @unnumberedsubsec edit @cindex editor @cindex temp @cindex edit @cindex ed @example EDIT contentslist ED contentslist (EDIT) (ED) @end example command. If invoked with an input, @code{EDIT} writes the definitions of the named items into a temporary file and edits that file, using an editor that depends on the platform you're using. In wxWidgets, and in the MacOS Classic version, there is an editor built into Logo. In the non-wxWidgets versions for Unix, MacOS X, Windows, and DOS, Logo uses your favorite editor as determined by the @env{EDITOR} environment variable. If you don't have an @env{EDITOR} variable, edits the definitions using @command{jove}. If invoked without an input, @code{EDIT} edits the same file left over from a previous @code{EDIT} or @code{EDITFILE} instruction. When you leave the editor, Logo reads the revised definitions and modifies the workspace accordingly. It is not an error if the input includes names for which there is no previous definition. If there is a variable @code{LOADNOISILY} whose value is @code{TRUE}, then, after leaving the editor, @code{TO} commands in the temporary file print @samp{@var{procname} defined} (where @var{procname} is the name of the procedure being defined); if @code{LOADNOISILY} is @code{FALSE} or undefined, @code{TO} commands in the file are carried out silently. If there is an environment variable called @env{TEMP}, then Logo uses its value as the directory in which to write the temporary file used for editing. Exceptionally, the @code{EDIT} command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. @xref{LOADNOISILY} , @xref{EDITFILE} . @node EDITFILE, EDALL, EDIT, WORKSPACE CONTROL @comment node-name, next, previous, up @unnumberedsubsec editfile @cindex editfile @example EDITFILE filename @end example command. Starts the Logo editor, like @code{EDIT}, but instead of editing a temporary file it edits the file specified by the input. When you leave the editor, Logo reads the revised file, as for @code{EDIT}. @code{EDITFILE} also remembers the filename, so that a subsequent @code{EDIT} command with no input will re-edit the same file. @code{EDITFILE} is intended as an alternative to @code{LOAD} and @code{SAVE}. You can maintain a workspace file yourself, controlling the order in which definitions appear, maintaining comments in the file, and so on. In the wxWidgets version, @code{EDITFILE} asks whether or not you want to load the file into Logo when you finish editing. This allows you to use @code{EDITFILE} to edit data files without leaving Logo. @node EDALL, EDPS, EDITFILE, WORKSPACE CONTROL @unnumberedsubsec edall @cindex edall @example EDALL (library procedure) @end example command. Abbreviates @t{EDIT CONTENTS}. @xref{CONTENTS} . @node EDPS, EDNS, EDALL, WORKSPACE CONTROL @unnumberedsubsec edps @cindex edps @example EDPS (library procedure) @end example command. Abbreviates @t{EDIT PROCEDURES}. @xref{EDIT} , @ref{PROCEDURES} . @node EDNS, EDPLS, EDPS, WORKSPACE CONTROL @unnumberedsubsec edns @cindex edns @example EDNS (library procedure) @end example command. Abbreviates @t{EDIT NAMES}. @xref{EDIT} , @ref{NAMES} . @node EDPLS, EDN, EDNS, WORKSPACE CONTROL @unnumberedsubsec edpls @cindex edpls @example EDPLS (library procedure) @end example command. Abbreviates @t{EDIT PLISTS}. @xref{EDIT} , @ref{PLISTS} . @node EDN, EDPL, EDPLS, WORKSPACE CONTROL @unnumberedsubsec edn @cindex edn @example EDN varname (library procedure) EDN varnamelist @end example command. Abbreviates @t{EDIT NAMELIST @var{varname(list)}}. @xref{EDIT} , @ref{NAMELIST} . @node EDPL, SAVE, EDN, WORKSPACE CONTROL @unnumberedsubsec edpl @cindex edpl @example EDPL plname (library procedure) EDPL plnamelist @end example command. Abbreviates @t{EDIT PLLIST @var{plname(list)}}. @xref{EDIT} , @ref{PLLIST} . @node SAVE, SAVEL, EDPL, WORKSPACE CONTROL @unnumberedsubsec save @cindex save @example SAVE filename @end example command. Saves the definitions of all unburied procedures, variables, and nonempty property lists in the named file. Equivalent to @example to save :filename local "oldwriter make "oldwriter writer openwrite :filename setwrite :filename poall setwrite :oldwriter close :filename end @end example Exceptionally, @code{SAVE} can be used with no input and without parentheses if it is the last thing on the command line. In this case, the filename from the most recent @code{LOAD} or @code{SAVE} command will be used. (It is an error if there has been no previous @code{LOAD} or @code{SAVE}.) @node SAVEL, LOAD, SAVE, WORKSPACE CONTROL @unnumberedsubsec savel @cindex savel @example SAVEL contentslist filename (library procedure) @end example command. Saves the definitions of the procedures, variables, and property lists specified by @var{contentslist} to the file named @var{filename}. @node LOAD, CSLSLOAD, SAVEL, WORKSPACE CONTROL @unnumberedsubsec load @cindex load @example LOAD filename @end example command. Reads instructions from the named file and executes them. The file can include procedure definitions with @code{TO}, and these are accepted even if a procedure by the same name already exists. If the file assigns a list value to a variable named @code{STARTUP}, then that list is run as an instructionlist after the file is loaded. If there is a variable @code{LOADNOISILY} whose value is @code{TRUE}, then @code{TO} commands in the file print @samp{@var{procname} defined} (where @var{procname} is the name of the procedure being defined); if @code{LOADNOISILY} is @code{FALSE} or undefined, @code{TO} commands in the file are carried out silently. @xref{STARTUP} , @xref{LOADNOISILY} . @node CSLSLOAD, HELP, LOAD, WORKSPACE CONTROL @unnumberedsubsec cslsload @cindex cslsload @example CSLSLOAD name @end example command. Loads the named file, like @code{LOAD}, but from the directory containing the Computer Science Logo Style programs instead of the current user's directory. @xref{LOAD} . @node HELP, SETEDITOR, CSLSLOAD, WORKSPACE CONTROL @unnumberedsubsec help @cindex logohelp @cindex help @example HELP name (HELP) @end example command. Prints information from the reference manual about the primitive procedure named by the input. With no input, lists all the primitives about which help is available. If there is an environment variable @env{LOGOHELP}, then its value is taken as the directory in which to look for help files, instead of the default help directory. If @code{HELP} is called with the name of a defined procedure for which there is no help file, it will print the title line of the procedure followed by lines from the procedure body that start with semicolon, stopping when a non-semicolon line is seen. Exceptionally, the @code{HELP} command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. @node SETEDITOR, SETLIBLOC, HELP, WORKSPACE CONTROL @unnumberedsubsec seteditor @cindex seteditor @example SETEDITOR path @end example command. Tells Logo to use the specified program as its editor instead of the default editor. The format of a path depends on your operating system. @node SETLIBLOC, SETCSLSLOC, SETEDITOR, WORKSPACE CONTROL @unnumberedsubsec setlibloc @cindex setlibloc @example SETLIBLOC path @end example command. Tells Logo to use the specified directory as its library instead of the default. (Note that many Logo "primitive" procedures are actually found in the library, so they may become unavailable if your new library does not include them!) The format of a path depends on your operating system. @node SETCSLSLOC, SETHELPLOC, SETLIBLOC, WORKSPACE CONTROL @unnumberedsubsec setcslsloc @cindex setcslsloc @example SETCSLSLOC path @end example command. Tells Logo to use the specified directory for the @code{CSLSLOAD} command, instead of the default directory. The format of a path depends on your operating system. @xref{CSLSLOAD} . @node SETHELPLOC, SETTEMPLOC, SETCSLSLOC, WORKSPACE CONTROL @unnumberedsubsec sethelploc @cindex sethelploc @example SETHELPLOC path @end example command. Tells Logo to look in the specified directory for the information provided by the HELP command, instead of the default directory. The format of a path depends on your operating system. @node SETTEMPLOC, GC, SETHELPLOC, WORKSPACE CONTROL @unnumberedsubsec settemploc @cindex settemploc @example SETTEMPLOC path @end example command. Tells Logo to write editor temporary files in the specified directory rather than in the default directory. You must have write permission for this directory. The format of a path depends on your operating system. @node GC, .SETSEGMENTSIZE, SETTEMPLOC, WORKSPACE CONTROL @unnumberedsubsec gc @cindex gc @example GC (GC anything) @end example command. Runs the garbage collector, reclaiming unused nodes. Logo does this when necessary anyway, but you may want to use this command to control exactly when Logo does it. In particular, the numbers output by the @code{NODES} operation will not be very meaningful unless garbage has been collected. Another reason to use @code{GC} is that a garbage collection takes a noticeable fraction of a second, and you may want to schedule collections for times before or after some time-critical animation. If invoked with an argument (of any value), @code{GC} runs a full garbage collection, including @acronym{GCTWA} (Garbage Collect Truly Worthless Atoms, which means that it removes from Logo's memory words that used to be procedure or variable names but aren't any more); without an argument, @code{GC} does a generational garbage collection, which means that only recently created nodes are examined. (The latter is usually good enough.) @node .SETSEGMENTSIZE, , GC, WORKSPACE CONTROL @unnumberedsubsec .setsegmentsize @cindex .setsegmentsize @example .SETSEGMENTSIZE num @end example command. Sets the number of nodes that Logo allocates from the operating system at once to @var{num}, which must be a positive integer. The name is dotted because bad things will happen if you use a number that's too small or too large for your computer. The initial value is 16,000 for most systems, but is smaller for 68000-based Macs. Making it larger will speed up computations (by reducing the number of garbage collections) at the cost of allocating more memory than necessary. @node CONTROL STRUCTURES, MACROS, WORKSPACE MANAGEMENT, Top @chapter Control Structures @menu * CONTROL:: * TEMPLATE-BASED ITERATION:: @end menu @node CONTROL, TEMPLATE-BASED ITERATION, CONTROL STRUCTURES, CONTROL STRUCTURES @section Control Note: in the following descriptions, an @dfn{instructionlist} can be a list or a word. In the latter case, the word is parsed into list form before it is run. Thus, @w{@t{RUN READWORD}} or @w{@t{RUN READLIST}} will work. The former is slightly preferable because it allows for a continued line (with @code{~}) that includes a comment (with @code{;}) on the first line. A @var{tf} input must be the word @code{TRUE}, the word @code{FALSE}, or a list. If it's a list, then it must be a Logo expression, which will be evaluated to produce a value that must be @code{TRUE} or @code{FALSE}. The comparisons with @code{TRUE} and @code{FALSE} are always case-insensitive. A runlist can consist of either a single expression (that produces a value) or zero or more instructions (that do something, rather than output a value), depending on the context: @example PRINT IFELSE :X<0 ["NEGATIVE] ["POSITIVE] ; one value in each case REPEAT 4 [PRINT "A PRINT "B] ; two instructions @end example @menu * RUN:: * RUNRESULT:: * REPEAT:: * FOREVER:: * REPCOUNT:: * IF:: * IFELSE:: * TEST:: * IFTRUE:: * IFFALSE:: * STOP:: * OUTPUT:: * CATCH:: * THROW:: * ERROR:: * PAUSE:: * CONTINUE:: * WAIT:: * BYE:: * dMAYBEOUTPUT:: MAYBEOUTPUT * GOTO:: * TAG:: * IGNORE:: * back-quote:: * FOR:: * DOdWHILE:: DO.WHILE * WHILE:: * DOdUNTIL:: DO.UNTIL * UNTIL:: * CASE:: * COND:: @end menu @node RUN, RUNRESULT, CONTROL, CONTROL @unnumberedsubsec run @cindex run @example RUN instructionlist @end example command or operation. Runs the Logo instructions in the input list; outputs if the list contains an expression that outputs. @xref{READWORD} , @ref{READLIST} . @node RUNRESULT, REPEAT, RUN, CONTROL @unnumberedsubsec runresult @cindex runresult @example RUNRESULT instructionlist @end example runs the instructions in the input; outputs an empty list if those instructions produce no output, or a list whose only member is the output from running the input instructionlist. Useful for inventing command-or-operation control structures: @example local "result make "result runresult [something] if emptyp :result [stop] output first :result @end example @node REPEAT, FOREVER, RUNRESULT, CONTROL @unnumberedsubsec repeat @cindex repeat @example REPEAT num instructionlist @end example command. Runs the @var{instructionlist} repeatedly, @var{num} times. @node FOREVER, REPCOUNT, REPEAT, CONTROL @comment node-name, next, previous, up @unnumberedsubsec forever @cindex forever @example FOREVER instructionlist @end example command. Runs the "instructionlist" repeatedly, until something inside the instructionlist (such as @code{STOP} or @code{THROW}) makes it stop. @xref{STOP} , @xref{THROW} . @node REPCOUNT, IF, FOREVER, CONTROL @unnumberedsubsec repcount @cindex repcount @example REPCOUNT @end example outputs the repetition count of the innermost current @code{REPEAT} or @code{FOREVER}, starting from 1. If no @code{REPEAT} or @code{FOREVER} is active, outputs --1. The abbreviation @code{#} can be used for @code{REPCOUNT} unless the @code{REPEAT} is inside the template input to a higher order procedure such as @code{FOREACH}, in which case @code{#} has a different meaning. @node IF, IFELSE, REPCOUNT, CONTROL @unnumberedsubsec if @cindex if @example IF tf instructionlist (IF tf instructionlist1 instructionlist2) @end example command. If the first input has the value @code{TRUE}, then @code{IF} runs the second input. If the first input has the value @code{FALSE}, then @code{IF} does nothing. (If given a third input, IF acts like @code{IFELSE}, as described below.) It is an error if the first input is not either @code{TRUE} or @code{FALSE}. For compatibility with earlier versions of Logo, if an @code{IF} instruction is not enclosed in parentheses, but the first thing on the instruction line after the second input expression is a literal list (i.e., a list in square brackets), the @code{IF} is treated as if it were @code{IFELSE}, but a warning message is given. If this aberrant @code{IF} appears in a procedure body, the warning is given only the first time the procedure is invoked in each Logo session. @node IFELSE, TEST, IF, CONTROL @unnumberedsubsec ifelse @cindex ifelse @example IFELSE tf instructionlist1 instructionlist2 @end example command or operation. If the first input has the value @code{TRUE}, then @code{IFELSE} runs the second input. If the first input has the value @code{FALSE}, then @code{IFELSE} runs the third input. @code{IFELSE} outputs a value if the @var{instructionlist} contains an expression that outputs a value. @node TEST, IFTRUE, IFELSE, CONTROL @unnumberedsubsec test @cindex test @example TEST tf @end example command. Remembers its input, which must be @code{TRUE} or @code{FALSE}, for use by later @code{IFTRUE} or @code{IFFALSE} instructions. The effect of @code{TEST} is local to the procedure in which it is used; any corresponding @code{IFTRUE} or @code{IFFALSE} must be in the same procedure or a subprocedure. @xref{IFFALSE} . @node IFTRUE, IFFALSE, TEST, CONTROL @unnumberedsubsec iftrue @cindex iftrue @cindex ift @example IFTRUE instructionlist IFT instructionlist @end example command. Runs its input if the most recent @code{TEST} instruction had a @code{TRUE} input. The @code{TEST} must have been in the same procedure or a superprocedure. @node IFFALSE, STOP, IFTRUE, CONTROL @unnumberedsubsec iffalse @cindex iffalse @cindex iff @example IFFALSE instructionlist IFF instructionlist @end example command. Runs its input if the most recent @code{TEST} instruction had a @code{FALSE} input. The @code{TEST} must have been in the same procedure or a superprocedure. @xref{TEST} . @node STOP, OUTPUT, IFFALSE, CONTROL @unnumberedsubsec stop @cindex stop @example STOP @end example command. Ends the running of the procedure in which it appears. Control is returned to the context in which that procedure was invoked. The stopped procedure does not output a value. @node OUTPUT, CATCH, STOP, CONTROL @unnumberedsubsec output @cindex output @cindex op @example OUTPUT value OP value @end example command. Ends the running of the procedure in which it appears. That procedure outputs the value @var{value} to the context in which it was invoked. Don't be confused: @code{OUTPUT} itself is a command, but the procedure that invokes @code{OUTPUT} is an operation. @node CATCH, THROW, OUTPUT, CONTROL @unnumberedsubsec catch @cindex catch @example CATCH tag instructionlist @end example command or operation. Runs its second input. Outputs if that @var{instructionlist} outputs. If, while running the instructionlist, a @code{THROW} instruction is executed with a tag equal to the first input (case-insensitive comparison), then the running of the @var{instructionlist} is terminated immediately. In this case the @code{CATCH} outputs if a value input is given to @code{THROW}. The @var{tag} must be a word. If the tag is the word @code{ERROR}, then any error condition that arises during the running of the instructionlist has the effect of @w{@t{THROW "ERROR}} instead of printing an error message and returning to toplevel. The @code{CATCH} does not output if an error is caught. Also, during the running of the instructionlist, the variable @code{ERRACT} is temporarily unbound. (If there is an error while @code{ERRACT} has a value, that value is taken as an instructionlist to be run after printing the error message. Typically the value of @code{ERRACT}, if any, is the list @code{[PAUSE]}.) @xref{ERROR} , @ref{ERRACT} , @ref{PAUSE} . @node THROW, ERROR, CATCH, CONTROL @unnumberedsubsec throw @cindex throw @example THROW tag (THROW tag value) @end example command. Must be used within the scope of a @code{CATCH} with an equal tag. Ends the running of the instructionlist of the @code{CATCH}. If @code{THROW} is used with only one input, the corresponding @code{CATCH} does not output a value. If @code{THROW} is used with two inputs, the second provides an output for the @code{CATCH}. @w{@t{THROW "TOPLEVEL}} can be used to terminate all running procedures and interactive pauses, and return to the toplevel instruction prompt. Typing the system interrupt character (@key{alt-S} for wxWidgets; otherwise normally @key{control-C} for Unix, @key{control-Q} for DOS, or @key{command-period} for Mac) has the same effect. @w{@t{THROW "ERROR}} can be used to generate an error condition. If the error is not caught, it prints a message (@w{@code{THROW "ERROR}}) with the usual indication of where the error (in this case the @code{THROW}) occurred. If a second input is used along with a tag of @code{ERROR}, that second input is used as the text of the error message instead of the standard message. Also, in this case, the location indicated for the error will be, not the location of the @code{THROW}, but the location where the procedure containing the @code{THROW} was invoked. This allows user-defined procedures to generate error messages as if they were primitives. Note: in this case the corresponding @w{@t{CATCH "ERROR}}, if any, does not output, since the second input to @code{THROW} is not considered a return value. @w{@t{THROW "SYSTEM}} immediately leaves Logo, returning to the operating system, without printing the usual parting message and without deleting any editor temporary file written by EDIT. @xref{EDIT} . @node ERROR, PAUSE, THROW, CONTROL @unnumberedsubsec error @cindex error @example ERROR @end example outputs a list describing the error just caught, if any. If there was not an error caught since the last use of @code{ERROR}, the empty list will be output. The error list contains four members: an integer code corresponding to the type of error, the text of the error message (as a single word including spaces), the name of the procedure in which the error occurred, and the instruction line on which the error occurred. @node PAUSE, CONTINUE, ERROR, CONTROL @unnumberedsubsec pause @cindex pause @example PAUSE @end example command or operation. Enters an interactive pause. The user is prompted for instructions, as at toplevel, but with a prompt that includes the name of the procedure in which @code{PAUSE} was invoked. Local variables of that procedure are available during the pause. @code{PAUSE} outputs if the pause is ended by a @code{CONTINUE} with an input. If the variable @code{ERRACT} exists, and an error condition occurs, the contents of that variable are run as an instructionlist. Typically @code{ERRACT} is given the value @code{[PAUSE]} so that an interactive pause will be entered in the event of an error. This allows the user to check values of local variables at the time of the error. Typing the system quit character (@key{alt-S} for wxWidgets; otherwise normally @key{control-\} for Unix, @key{control-W} for DOS, or @key{command-comma} for Mac) will also enter a pause. @xref{ERRACT} . @node CONTINUE, WAIT, PAUSE, CONTROL @unnumberedsubsec continue @cindex continue @cindex co @example CONTINUE value CO value (CONTINUE) (CO) @end example command. Ends the current interactive pause, returning to the context of the @code{PAUSE} invocation that began it. If @code{CONTINUE} is given an input, that value is used as the output from the @code{PAUSE}. If not, the @code{PAUSE} does not output. Exceptionally, the @code{CONTINUE} command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. @node WAIT, BYE, CONTINUE, CONTROL @unnumberedsubsec wait @cindex wait @example WAIT time @end example command. Delays further execution for @var{time} 60ths of a second. Also causes any buffered characters destined for the terminal to be printed immediately. @w{@t{WAIT 0}} can be used to achieve this buffer flushing without actually waiting. @node BYE, dMAYBEOUTPUT, WAIT, CONTROL @unnumberedsubsec bye @cindex bye @example BYE @end example command. Exits from Logo; returns to the operating system. @node dMAYBEOUTPUT, GOTO, BYE, CONTROL @unnumberedsubsec .maybeoutput @cindex .maybeoutput @example .MAYBEOUTPUT value (special form) @end example works like @code{OUTPUT} except that the expression that provides the input value might not, in fact, output a value, in which case the effect is like @code{STOP}. This is intended for use in control structure definitions, for cases in which you don't know whether or not some expression produces a value. Example: @example to invoke :function [:inputs] 2 .maybeoutput apply :function :inputs end ? (invoke "print "a "b "c) a b c ? print (invoke "word "a "b "c) abc @end example This is an alternative to @code{RUNRESULT}. It's fast and easy to use, at the cost of being an exception to Logo's evaluation rules. (Ordinarily, it should be an error if the expression that's supposed to provide an input to something doesn't have a value.) @xref{OUTPUT} , @ref{STOP} , @ref{RUNRESULT} . @node GOTO, TAG, dMAYBEOUTPUT, CONTROL @unnumberedsubsec goto @cindex goto @example GOTO word @end example command. Looks for a @code{TAG} command with the same input in the same procedure, and continues running the procedure from the location of that @code{TAG}. It is meaningless to use @code{GOTO} outside of a procedure. @node TAG, IGNORE, GOTO, CONTROL @unnumberedsubsec tag @cindex tag @example TAG quoted.word @end example command. Does nothing. The input must be a literal word following a quotation mark (@code{"}), not the result of a computation. Tags are used by the @code{GOTO} command. @node IGNORE, back-quote, TAG, CONTROL @unnumberedsubsec ignore @cindex ignore @example IGNORE value (library procedure) @end example command. Does nothing. Used when an expression is evaluated for a side effect and its actual value is unimportant. @node back-quote, FOR, IGNORE, CONTROL @unnumberedsubsec ` @cindex ` @example ` list (library procedure) @end example outputs a list equal to its input but with certain substitutions. If a member of the input list is the word @samp{,} (comma) then the following member should be an instructionlist that produces an output when run. That output value replaces the comma and the instructionlist. If a member of the input list is the word @samp{,@@} (comma atsign) then the following member should be an instructionlist that outputs a list when run. The members of that list replace the @samp{,@@} and the instructionlist. Example: @example show `[foo baz ,[bf [a b c]] garply ,@@[bf [a b c]]] @end example will print @example [foo baz [b c] garply b c] @end example A word starting with @samp{,} or @samp{,@@} is treated as if the rest of the word were a one-word list, e.g., @samp{,:foo} is equivalent to @samp{,[:Foo]}. A word starting with @samp{",} (quote comma) or @samp{:,} (colon comma) becomes a word starting with @samp{"} or @samp{:} but with the result of running the substitution (or its first word, if the result is a list) replacing what comes after the comma. Backquotes can be nested. Substitution is done only for commas at the same depth as the backquote in which they are found: @example ? show `[a `[b ,[1+2] ,[foo ,[1+3] d] e] f] [a ` [b , [1+2] , [foo 4 d] e] f] ?make "name1 "x ?make "name2 "y ? show `[a `[b ,:,:name1 ,",:name2 d] e] [a ` [b , [:x] , ["y] d] e] @end example @node FOR, DOdWHILE, back-quote, CONTROL @unnumberedsubsec for @cindex for @example FOR forcontrol instructionlist (library procedure) @end example command. The first input must be a list containing three or four members: (1) a word, which will be used as the name of a local variable; (2) a word or list that will be evaluated as by @code{RUN} to determine a number, the starting value of the variable; (3) a word or list that will be evaluated to determine a number, the limit value of the variable; (4) an optional word or list that will be evaluated to determine the step size. If the fourth member is missing, the step size will be 1 or --1 depending on whether the limit value is greater than or less than the starting value, respectively. The second input is an instructionlist. The effect of @code{FOR} is to run that instructionlist repeatedly, assigning a new value to the control variable (the one named by the first member of the @var{forcontrol} list) each time. First the starting value is assigned to the control variable. Then the value is compared to the limit value. @code{FOR} is complete when the sign of @code{(current - limit)} is the same as the sign of the step size. (If no explicit step size is provided, the instructionlist is always run at least once. An explicit step size can lead to a zero-trip @code{FOR}, e.g., @w{@t{FOR [I 1 0 1] ...})}. Otherwise, the instructionlist is run, then the step is added to the current value of the control variable and FOR returns to the comparison step. @example ? for [i 2 7 1.5] [print :i] 2 3.5 5 6.5 ? @end example @xref{RUN} . @node DOdWHILE, WHILE, FOR, CONTROL @unnumberedsubsec do.while @cindex do.while @example DO.WHILE instructionlist tfexpression (library procedure) @end example command. Repeatedly evaluates the @var{instructionlist} as long as the evaluated @ifinfo @var{tfexpression} @end ifinfo @tex @var{tfexpres-sion} @end tex remains @code{TRUE}. Evaluates the first input first, so the @var{instructionlist} is always run at least once. The @var{tfexpression} must be an expressionlist whose value when evaluated is @code{TRUE} or @code{FALSE}. @node WHILE, DOdUNTIL, DOdWHILE, CONTROL @unnumberedsubsec while @cindex while @example WHILE tfexpression instructionlist (library procedure) @end example command. Repeatedly evaluates the @var{instructionlist} as long as the evaluated @ifinfo @var{tfexpression} @end ifinfo @tex @var{tfexpres-sion} @end tex remains @code{TRUE}. Evaluates the first input first, so the @var{instructionlist} may never be run at all. The @var{tfexpression} must be an expressionlist whose value when evaluated is @code{TRUE} or @code{FALSE}. @node DOdUNTIL, UNTIL, WHILE, CONTROL @unnumberedsubsec do.until @cindex do.until @example DO.UNTIL instructionlist tfexpression (library procedure) @end example command. Repeatedly evaluates the @var{instructionlist} as long as the evaluated @ifinfo @var{tfexpression} @end ifinfo @tex @var{tfexpres-sion} @end tex remains @code{FALSE}. Evaluates the first input first, so the @var{instructionlist} is always run at least once. The @var{tfexpression} must be an expressionlist whose value when evaluated is @code{TRUE} or @code{FALSE}. @node UNTIL, CASE, DOdUNTIL, CONTROL @unnumberedsubsec until @cindex until @example UNTIL tfexpression instructionlist (library procedure) @end example command. Repeatedly evaluates the @var{instructionlist} as long as the evaluated @ifinfo @var{tfexpression} @end ifinfo @tex @var{tfexpres-sion} @end tex remains @code{FALSE}. Evaluates the first input first, so the @var{instructionlist} may never be run at all. The @var{tfexpression} must be an expressionlist whose value when evaluated is @code{TRUE} or @code{FALSE}. @node CASE, COND, UNTIL, CONTROL @unnumberedsubsec case @cindex case @example CASE value clauses (library procedure) @end example command or operation. The second input is a list of lists (clauses); each clause is a list whose first element is either a list of values or the word @code{ELSE} and whose butfirst is a Logo expression or instruction. @code{CASE} examines the clauses in order. If a clause begins with the word @code{ELSE} (upper or lower case), then the butfirst of that clause is evaluated and @code{CASE} outputs its value, if any. If the first input to CASE is a member of the first element of a clause, then the butfirst of that clause is evaluated and @code{CASE} outputs its value, if any. If neither of these conditions is met, then @code{CASE} goes on to the next clause. If no clause is satisfied, @code{CASE} does nothing. Example: @example to vowelp :letter output case :letter [ [[a e i o u] "true] [else "false] ] end @end example @node COND, , CASE, CONTROL @unnumberedsubsec cond @cindex cond @example COND clauses (library procedure) @end example command or operation. The input is a list of lists (clauses); each clause is a list whose first element is either an expression whose value is @code{TRUE} or @code{FALSE}, or the word @code{ELSE}, and whose butfirst is a Logo expression or instruction. @code{COND} examines the clauses in order. If a clause begins with the word @code{ELSE} (upper or lower case), then the butfirst of that clause is evaluated and @code{CASE} outputs its value, if any. Otherwise, the first element of the clause is evaluated; the resulting value must be @code{TRUE} or @code{FALSE}. If it's @code{TRUE}, then the butfirst of that clause is evaluated and @code{COND} outputs its value, if any. If the value is @code{FALSE}, then @code{COND} goes on to the next clause. If no clause is satisfied, @code{COND} does nothing. Example: @example to evens :numbers ; select even numbers from a list op cond [ [[emptyp :numbers] []] [[evenp first :numbers] ; assuming EVENP is defined fput first :numbers evens butfirst :numbers] [else evens butfirst :numbers] ] end @end example @node TEMPLATE-BASED ITERATION, , CONTROL, CONTROL STRUCTURES @section Template-based Iteration @cindex template The procedures in this section are iteration tools based on the idea of a @dfn{template.} This is a generalization of an instruction list or an expression list in which @dfn{slots} are provided for the tool to insert varying data. Four different forms of template can be used. The most commonly used form for a template is @samp{explicit-slot} form, or @samp{question mark} form. Example: @example ? show map [? * ?] [2 3 4 5] [4 9 16 25] ? @end example In this example, the @code{MAP} tool evaluated the template @w{@code{[? * ?]}} repeatedly, with each of the members of the data list @w{@code{[2 3 4 5]}} substituted in turn for the question marks. The same value was used for every question mark in a given evaluation. Some tools allow for more than one datum to be substituted in parallel; in these cases the slots are indicated by @code{?1} for the first datum, @code{?2} for the second, and so on: @example ? show (map [(word ?1 ?2 ?1)] [a b c] [d e f]) [ada beb cfc] ? @end example If the template wishes to compute the datum number, the form @w{@code{(? 1)}} is equivalent to @code{?1}, so @w{@code{(? ?1)}} means the datum whose number is given in datum number 1. Some tools allow additional slot designations, as shown in the individual descriptions. The second form of template is the @samp{named-procedure} form. If the template is a word rather than a list, it is taken as the name of a procedure. That procedure must accept a number of inputs equal to the number of parallel data slots provided by the tool; the procedure is applied to all of the available data in order. That is, if data @code{?1} through @code{?3} are available, the template @code{"PROC} is equivalent to @w{@t{[PROC ?1 ?2 ?3]}}. @example ? show (map "word [a b c] [d e f]) [ad be cf] ? to dotprod :a :b ; vector dot product op apply "sum (map "product :a :b) end @end example The third form of template is @samp{named-slot} or @samp{lambda} form. This form is indicated by a template list containing more than one member, whose first member is itself a list. The first member is taken as a list of names; local variables are created with those names and given the available data in order as their values. The number of names must equal the number of available data. This form is needed primarily when one iteration tool must be used within the template list of another, and the @code{?} notation would be ambiguous in the inner template. Example: @example to matmul :m1 :m2 [:tm2 transpose :m2] ; multiply two matrices output map [[row] map [[col] dotprod :row :col] :tm2] :m1 end @end example The fourth form is @samp{procedure text} form, a variant of lambda form. In this form, the template list contains at least two members, all of which are lists. This is the form used by the @code{DEFINE} and @code{TEXT} primitives, and @code{APPLY} accepts it so that the text of a defined procedure can be used as a template. Note: The fourth form of template is interpreted differently from the others, in that Logo considers it to be an independent defined procedure for the purposes of @code{OUTPUT} and @code{STOP}. For example, the following two instructions are identical: @example ? print apply [[x] :x+3] [5] 8 ? print apply [[x] [output :x+3]] [5] 8 @end example although the first instruction is in named-slot form and the second is in procedure-text form. The named-slot form can be understood as telling Logo to evaluate the expression @w{@t{:x+3}} in place of the entire invocation of apply, with the variable @code{x} temporarily given the value @code{5}. The procedure-text form can be understood as invoking the procedure @example to foo :x output :x+3 end @end example with input @code{5}, but without actually giving the procedure a name. If the use of @code{OUTPUT} were interchanged in these two examples, we'd get errors: @example ? print apply [[x] output :x+3] [5] Can only use output inside a procedure ? print apply [[x] [:x+3]] [5] You don't say what to do with 8 @end example The named-slot form can be used with @code{STOP} or @code{OUTPUT} inside a procedure, to stop the enclosing procedure. The following iteration tools are extended versions of the ones in Appendix B of the book @cite{Computer Science Logo Style, Volume 3: Advanced Topics} by Brian Harvey [MIT Press, 1987]. The extensions are primarily to allow for variable numbers of inputs. @menu * APPLY:: * INVOKE:: * FOREACH:: * MAP:: * MAPdSE:: MAP.SE * FILTER:: * FIND:: * REDUCE:: * CROSSMAP:: * CASCADE:: * CASCADEd2:: CASCADE.2 * TRANSFER:: @end menu @node APPLY, INVOKE, TEMPLATE-BASED ITERATION, TEMPLATE-BASED ITERATION @unnumberedsubsec apply @cindex apply @example APPLY template inputlist @end example command or operation. Runs the @var{template}, filling its slots with the members of @var{inputlist.} The number of members in @var{inputlist} must be an acceptable number of slots for @var{template}. It is illegal to apply the primitive @code{TO} as a template, but anything else is okay. @code{APPLY} outputs what @var{template} outputs, if anything. @xref{TO} . @node INVOKE, FOREACH, APPLY, TEMPLATE-BASED ITERATION @unnumberedsubsec invoke @cindex invoke @example INVOKE template input (library procedure) (INVOKE template input1 input2 ...) @end example command or operation. Exactly like @code{APPLY} except that the inputs are provided as separate expressions rather than in a list. @node FOREACH, MAP, INVOKE, TEMPLATE-BASED ITERATION @unnumberedsubsec foreach @cindex foreach @example FOREACH data template (library procedure) (FOREACH data1 data2 ... template) @end example command. Evaluates the @var{template} list repeatedly, once for each member of the @var{data} list. If more than one @var{data} list are given, each of them must be the same length. (The @var{data} inputs can be words, in which case the template is evaluated once for each character.) In a template, the symbol @code{?REST} represents the portion of the @var{data} input to the right of the member currently being used as the @code{?} slot-filler. That is, if the @var{data} input is @w{@code{[A B C D E]}} and the template is being evaluated with @code{?} replaced by @code{B}, then @code{?REST} would be replaced by @w{@code{[C D E]}}. If multiple parallel slots are used, then @w{@t{(?REST 1)}} goes with ?1, etc. In a template, the symbol @code{#} represents the position in the @var{data} input of the member currently being used as the @code{?} slot-filler. That is, if the data input is @w{@code{[A B C D E]}} and the template is being evaluated with @code{?} replaced by @code{B}, then @code{#} would be replaced by @code{2}. @node MAP, MAPdSE, FOREACH, TEMPLATE-BASED ITERATION @unnumberedsubsec map @cindex map @example MAP template data (library procedure) (MAP template data1 data2 ...) @end example outputs a word or list, depending on the type of the @var{data} input, of the same length as that @var{data} input. (If more than one @var{data} input are given, the output is of the same type as @var{data1}.) Each member of the output is the result of evaluating the @var{template} list, filling the slots with the corresponding member(s) of the @var{data} input(s). (All @var{data} inputs must be the same length.) In the case of a word output, the results of the template evaluation must be words, and they are concatenated with @code{WORD}. In a template, the symbol @code{?REST} represents the portion of the data input to the right of the member currently being used as the @code{?} slot-filler. That is, if the @var{data} input is @w{@code{[A B C D E]}} and the @var{template} is being evaluated with @code{?} replaced by @code{B}, then @code{?REST} would be replaced by @w{@code{[C D E]}}. If multiple parallel slots are used, then @w{@t{(?REST 1)}} goes with @code{?1}, etc. In a template, the symbol @code{#} represents the position in the @var{data} input of the member currently being used as the @code{?} slot-filler. That is, if the data input is @w{@code{[A B C D E]}} and the template is being evaluated with @code{?} replaced by @code{B}, then @code{#} would be replaced by @code{2}. @xref{WORD} . @node MAPdSE, FILTER, MAP, TEMPLATE-BASED ITERATION @unnumberedsubsec map.se @cindex map.se @example MAP.SE template data (library procedure) (MAP.SE template data1 data2 ...) @end example outputs a list formed by evaluating the @var{template} list repeatedly and concatenating the results using @code{SENTENCE}. That is, the members of the output are the members of the results of the evaluations. The output list might, therefore, be of a different length from that of the @var{data} input(s). (If the result of an evaluation is the empty list, it contributes nothing to the final output.) The @var{data} inputs may be words or lists. In a template, the symbol @code{?REST} represents the portion of the data input to the right of the member currently being used as the @code{?} slot-filler. That is, if the data input is @w{@code{[A B C D E]}} and the template is being evaluated with @code{?} replaced by @code{B}, then @code{?REST} would be replaced by @w{@code{[C D E]}}. If multiple parallel slots are used, then @w{@t{(?REST 1)}} goes with @code{?1}, etc. In a template, the symbol @code{#} represents the position in the @var{data} input of the member currently being used as the @code{?} slot-filler. That is, if the data input is @w{@code{[A B C D E]}} and the template is being evaluated with @code{?} replaced by @code{B}, then @code{#} would be replaced by @code{2}. @xref{SENTENCE} . @node FILTER, FIND, MAPdSE, TEMPLATE-BASED ITERATION @unnumberedsubsec filter @cindex filter @example FILTER tftemplate data (library procedure) @end example outputs a word or list, depending on the type of the @var{data} input, containing a subset of the members (for a list) or characters (for a word) of the input. The template is evaluated once for each member or character of the data, and it must produce a @code{TRUE} or @code{FALSE} value. If the value is @code{TRUE}, then the corresponding input constituent is included in the output. @example ? print filter "vowelp "elephant eea ? @end example In a template, the symbol @code{?REST} represents the portion of the @var{data} input to the right of the member currently being used as the @code{?} slot-filler. That is, if the data input is @w{@code{[A B C D E]}} and the template is being evaluated with @code{?} replaced by @code{B}, then @code{?REST} would be replaced by @w{@code{[C D E]}}. In a template, the symbol @code{#} represents the position in the @var{data} input of the member currently being used as the @code{?} slot-filler. That is, if the data input is @w{@code{[A B C D E]}} and the template is being evaluated with @code{?} replaced by @code{B}, then @code{#} would be replaced by @code{2}. @node FIND, REDUCE, FILTER, TEMPLATE-BASED ITERATION @unnumberedsubsec find @cindex find @example FIND tftemplate data (library procedure) @end example outputs the first constituent of the @var{data} input (the first member of a list, or the first character of a word) for which the value produced by evaluating the @var{template} with that consituent in its slot is @code{TRUE}. If there is no such constituent, the empty list is output. In a template, the symbol @code{?REST} represents the portion of the @var{data} input to the right of the member currently being used as the @code{?} slot-filler. That is, if the data input is @w{@code{[A B C D E]}} and the template is being evaluated with @code{?} replaced by @code{B}, then @code{?REST} would be replaced by @w{@code{[C D E]}}. In a template, the symbol @code{#} represents the position in the @var{data} input of the member currently being used as the @code{?} slot-filler. That is, if the data input is @w{@code{[A B C D E]}} and the template is being evaluated with @code{?} replaced by @code{B}, then @code{#} would be replaced by @code{2}. @node REDUCE, CROSSMAP, FIND, TEMPLATE-BASED ITERATION @unnumberedsubsec reduce @cindex reduce @example REDUCE template data (library procedure) @end example outputs the result of applying the @var{template} to accumulate the members of the @var{data} input. The template must be a two-slot function. Typically it is an associative function name like @code{SUM}. If the @var{data} input has only one constituent (member in a list or character in a word), the output is that consituent. Otherwise, the template is first applied with @code{?1} filled with the next-to-last consitient and @code{?2} with the last constituent. Then, if there are more constituents, the template is applied with @code{?1} filled with the next constituent to the left and @code{?2} with the result from the previous evaluation. This process continues until all constituents have been used. The data input may not be empty. Note: If the template is, like @code{SUM}, the name of a procedure that is capable of accepting arbitrarily many inputs, it is more efficient to use @code{APPLY} instead of @code{REDUCE}. The latter is good for associative procedures that have been written to accept exactly two inputs: @example to max :a :b output ifelse :a > :b [:a] [:b] end print reduce "max [...] @end example Alternatively, @code{REDUCE} can be used to write @code{MAX} as a procedure that accepts any number of inputs, as @code{SUM} does: @example to max [:inputs] 2 if emptyp :inputs ~ [(throw "error [not enough inputs to max])] output reduce [ifelse ?1 > ?2 [?1] [?2]] :inputs end @end example @xref{SUM} , @ref{APPLY} . @node CROSSMAP, CASCADE, REDUCE, TEMPLATE-BASED ITERATION @unnumberedsubsec crossmap @cindex crossmap @example CROSSMAP template listlist (library procedure) (CROSSMAP template data1 data2 ...) @end example outputs a list containing the results of template evaluations. Each @var{data} list contributes to a slot in the template; the number of slots is equal to the number of @var{data} list inputs. As a special case, if only one @var{data} list input is given, that list is taken as a list of data lists, and each of its members contributes values to a slot. @code{CROSSMAP} differs from @code{MAP} in that instead of taking members from the data inputs in parallel, it takes all possible combinations of members of data inputs, which need not be the same length. @example ? show (crossmap [word ?1 ?2] [a b c] [1 2 3 4]) [a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4] ? @end example For compatibility with the version in the first edition of CSLS @footnote{@cite{Computer Science Logo Style}}, @code{CROSSMAP} templates may use the notation @code{:1} instead of @code{?1} to indicate slots. @xref{MAP} . @node CASCADE, CASCADEd2, CROSSMAP, TEMPLATE-BASED ITERATION @unnumberedsubsec cascade @cindex cascade @example CASCADE endtest template startvalue (library procedure) (CASCADE endtest tmp1 sv1 tmp2 sv2 ...) (CASCADE endtest tmp1 sv1 tmp2 sv2 ... finaltemplate) @end example outputs the result of applying a template (or several templates, as explained below) repeatedly, with a given value filling the slot the first time, and the result of each application filling the slot for the following application. In the simplest case, @code{CASCADE} has three inputs. The second input is a one-slot expression template. That template is evaluated some number of times (perhaps zero). On the first evaluation, the slot is filled with the third input; on subsequent evaluations, the slot is filled with the result of the previous evaluation. The number of evaluations is determined by the first input. This can be either a nonnegative integer, in which case the template is evaluated that many times, or a predicate expression template, in which case it is evaluated (with the same slot filler that will be used for the evaluation of the second input) repeatedly, and the @code{CASCADE} evaluation continues as long as the predicate value is @code{FALSE}. (In other words, the predicate template indicates the condition for stopping.) If the template is evaluated zero times, the output from @code{CASCADE} is the third (@var{startvalue}) input. Otherwise, the output is the value produced by the last template evaluation. @code{CASCADE} templates may include the symbol @code{#} to represent the number of times the template has been evaluated. This slot is filled with 1 for the first evaluation, 2 for the second, and so on. @example ? show cascade 5 [lput # ?] [] [1 2 3 4 5] ? show cascade [vowelp first ?] [bf ?] "spring ing ? show cascade 5 [# * ?] 1 120 ? @end example Several cascaded results can be computed in parallel by providing additional template-startvalue pairs as inputs to @code{CASCADE}. In this case, all templates (including the endtest template, if used) are multi-slot, with the number of slots equal to the number of pairs of inputs. In each round of evaluations, @code{?2}, for example, represents the result of evaluating the second template in the previous round. If the total number of inputs (including the first endtest input) is odd, then the output from CASCADE is the final value of the first template. If the total number of inputs is even, then the last input is a template that is evaluated once, after the end test is satisfied, to determine the output from @code{CASCADE}. @example to fibonacci :n output (cascade :n [?1 + ?2] 1 [?1] 0) end to piglatin :word output (cascade [vowelp first ?] ~ [word bf ? first ?] ~ :word ~ [word ? "ay]) end @end example @node CASCADEd2, TRANSFER, CASCADE, TEMPLATE-BASED ITERATION @unnumberedsubsec cascade.2 @cindex cascade.2 @example CASCADE.2 endtest temp1 startval1 temp2 startval2 (library procedure) @end example outputs the result of invoking @code{CASCADE} with the same inputs. The only difference is that the default number of inputs is five instead of three. @node TRANSFER, , CASCADEd2, TEMPLATE-BASED ITERATION @unnumberedsubsec transfer @cindex transfer @example TRANSFER endtest template inbasket (library procedure) @end example outputs the result of repeated evaluation of the @var{template}. The template is evaluated once for each member of the list @var{inbasket}. @code{TRANSFER} maintains an @dfn{outbasket} that is initially the empty list. After each evaluation of the template, the resulting value becomes the new outbasket. In the template, the symbol @code{?IN} represents the current member from the inbasket; the symbol @code{?OUT} represents the entire current outbasket. Other slot symbols should not be used. If the first (@var{endtest}) input is an empty list, evaluation continues until all inbasket members have been used. If not, the first input must be a predicate expression template, and evaluation continues until either that template's value is @code{TRUE} or the inbasket is used up. @node MACROS, ERROR PROCESSING, CONTROL STRUCTURES, Top @chapter Macros @menu * dMACRO:: * dDEFMACRO:: * MACROP:: * MACROEXPAND:: @end menu @node dMACRO, dDEFMACRO, MACROS, MACROS @unnumberedsec .macro @cindex .macro @cindex .defmacro @example .MACRO procname :input1 :input2 ... (special form) .DEFMACRO procname text @end example A macro is a special kind of procedure whose output is evaluated as Logo instructions in the context of the macro's caller. @code{.MACRO} is exactly like @code{TO} except that the new procedure becomes a macro; @code{.DEFMACRO} is exactly like @code{DEFINE} with the same exception. Macros are useful for inventing new control structures comparable to @code{REPEAT}, @code{IF}, and so on. Such control structures can almost, but not quite, be duplicated by ordinary Logo procedures. For example, here is an ordinary procedure version of @code{REPEAT}: @example to my.repeat :num :instructions if :num=0 [stop] run :instructions my.repeat :num-1 :instructions end @end example This version works fine for most purposes, e.g., @example my.repeat 5 [print "hello] @end example But it doesn't work if the instructions to be carried out include @code{OUTPUT}, @code{STOP}, or @code{LOCAL}. For example, consider this procedure: @example to example print [Guess my secret word. You get three guesses.] repeat 3 [type "|?? | ~ if readword = "secret [pr "Right! stop]] print [Sorry, the word was "secret"!] end @end example This procedure works as written, but if @code{MY.REPEAT} is used instead of @code{REPEAT}, it won't work because the @code{STOP} will stop @code{MY.REPEAT} instead of stopping @code{EXAMPLE} as desired. The solution is to make @code{MY.REPEAT} a macro. Instead of actually carrying out the computation, a macro must return a list containing Logo instructions. The contents of that list are evaluated as if they appeared in place of the call to the macro. Here's a macro version of @code{REPEAT}: @example .macro my.repeat :num :instructions if :num=0 [output []] output sentence :instructions ~ (list "my.repeat :num-1 :instructions) end @end example Every macro is an operation --- it must always output something. Even in the base case, @code{MY.REPEAT} outputs an empty instruction list. To show how @code{MY.REPEAT} works, let's take the example @example my.repeat 5 [print "hello] @end example For this example, @code{MY.REPEAT} will output the instruction list @example [print "hello my.repeat 4 [print "hello]] @end example Logo then executes these instructions in place of the original invocation of @code{MY.REPEAT}; this prints @code{hello} once and invokes another repetition. The technique just shown, although fairly easy to understand, has the defect of slowness because each repetition has to construct an instruction list for evaluation. Another approach is to make @code{MY.REPEAT} a macro that works just like the non-macro version unless the instructions to be repeated include @code{OUTPUT} or @code{STOP}: @example .macro my.repeat :num :instructions catch "repeat.catchtag ~ [op repeat.done runresult [repeat1 :num :instructions]] op [] end to repeat1 :num :instructions if :num=0 [throw "repeat.catchtag] run :instructions .maybeoutput repeat1 :num-1 :instructions end to repeat.done :repeat.result if emptyp :repeat.result [op [stop]] op list "output quoted first :repeat.result end @end example If the instructions do not include @code{STOP} or @code{OUTPUT}, then @code{REPEAT1} will reach its base case and invoke @code{THROW}. As a result, @code{MY.REPEAT}'s last instruction line will output an empty list, so the evaluation of the macro result by the caller will do nothing. But if a @code{STOP} or @code{OUTPUT} happens, then @code{REPEAT.DONE} will output a @code{STOP} or @code{OUTPUT} instruction that will be executed in the caller's context. The macro-defining commands have names starting with a dot because macros are an advanced feature of Logo; it's easy to get in trouble by defining a macro that doesn't terminate, or by failing to construct the instruction list properly. Lisp users should note that Logo macros are @emph{not} special forms. That is, the inputs to the macro are evaluated normally, as they would be for any other Logo procedure. It's only the output from the macro that's handled unusually. Here's another example: @example .macro localmake :name :value output (list "local ~ word "" :name ~ "apply ~ ""make ~ (list :name :value)) end @end example It's used this way: @example to try localmake "garply "hello print :garply end @end example @code{LOCALMAKE} outputs the list @display [local "garply apply "make [garply hello]] @end display The reason for the use of @code{APPLY} is to avoid having to decide whether or not the second input to @code{MAKE} requires a quotation mark before it. (In this case it would --- @code{MAKE "GARPLY "HELLO} --- but the quotation mark would be wrong if the value were a list.) It's often convenient to use the @t{`} function to construct the instruction list: @example .macro localmake :name :value op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]] end @end example On the other hand, @t{`} is pretty slow, since it's tree recursive and written in Logo. @xref{TO} , @ref{DEFINE} , @ref{APPLY} , @ref{STOP} , @ref{OUTPUT} . @node dDEFMACRO, MACROP, dMACRO, MACROS @unnumberedsubsec .defmacro @xref{dMACRO} . @node MACROP, MACROEXPAND, dDEFMACRO, MACROS @unnumberedsubsec macrop @cindex macrop @cindex macro? @example MACROP name MACRO? name @end example outputs @code{TRUE} if its input is the name of a macro. @node MACROEXPAND, , MACROP, MACROS @unnumberedsubsec macroexpand @cindex macroexpand @example MACROEXPAND expr (library procedure) @end example takes as its input a Logo expression that invokes a macro (that is, one that begins with the name of a macro) and outputs the the Logo expression into which the macro would translate the input expression. @example .macro localmake :name :value op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]] end ? show macroexpand [localmake "pi 3.14159] [local "pi apply "make [pi 3.14159]] @end example @node ERROR PROCESSING, SPECIAL VARIABLES, MACROS, Top @chapter Error Processing @menu * ERROR CODES:: @end menu If an error occurs, Logo takes the following steps. First, if there is an available variable named @code{ERRACT}, Logo takes its value as an instructionlist and runs the instructions. The operation @code{ERROR} may be used within the instructions (once) to examine the error condition. If the instructionlist invokes @code{PAUSE}, the error message is printed before the pause happens. Certain errors are @dfn{recoverable}; for one of those errors, if the instructionlist outputs a value, that value is used in place of the expression that caused the error. (If @code{ERRACT} invokes @code{PAUSE} and the user then invokes @code{CONTINUE} with an input, that input becomes the output from @code{PAUSE} and therefore the output from the @code{ERRACT} instructionlist.) It is possible for an @code{ERRACT} instructionlist to produce an inappropriate value or no value where one is needed. As a result, the same error condition could recur forever because of this mechanism. To avoid that danger, if the same error condition occurs twice in a row from an @code{ERRACT} instructionlist without user interaction, the message @samp{Erract loop} is printed and control returns to toplevel. "Without user interaction" means that if @code{ERRACT} invokes @code{PAUSE} and the user provides an incorrect value, this loop prevention mechanism does not take effect and the user gets to try again. During the running of the @code{ERRACT} instructionlist, @code{ERRACT} is locally unbound, so an error in the @code{ERRACT} instructions themselves will not cause a loop. In particular, an error during a pause will not cause a pause-within-a-pause unless the user reassigns the value @code{[PAUSE]} to @code{ERRACT} during the pause. But such an error will not return to toplevel; it will remain within the original pause loop. If there is no available @code{ERRACT} value, Logo handles the error by generating an internal @w{@t{THROW "ERROR}}. (A user program can also generate an error condition deliberately by invoking @code{THROW}.) If this throw is not caught by a @w{@t{CATCH "ERROR}} in the user program, it is eventually caught either by the toplevel instruction loop or by a pause loop, which prints the error message. An invocation of @w{@t{CATCH "ERROR}} in a user program locally unbinds @code{ERRACT}, so the effect is that whichever of @code{ERRACT} and @w{@t{CATCH "ERROR}} is more local will take precedence. If a floating point overflow occurs during an arithmetic operation, or a two-input mathematical function (like @code{POWER}) is invoked with an illegal combination of inputs, the @samp{doesn't like} message refers to the second operand, but should be taken as meaning the combination. @xref{ERRACT} , @ref{THROW} , @ref{ERROR} , @ref{CATCH} , @ref{PAUSE} , @ref{CONTINUE} . @node ERROR CODES, , ERROR PROCESSING, ERROR PROCESSING @section Error Codes @cindex errors Here are the numeric codes that appear as the first member of the list output by @code{ERROR} when an error is caught, with the corresponding messages. Some messages may have two different codes depending on whether or not the error is recoverable (that is, a substitute value can be provided through the @code{ERRACT} mechanism) in the specific context. Some messages are warnings rather than errors; these will not be caught. Errors 0 and 32 are so bad that Logo exits immediately. @example 0 Fatal internal error@ @ @r{(can't be caught)} 1 Out of memory 2 Stack overflow 3 Turtle out of bounds 4 @var{proc} doesn't like @var{datum} as input@ @ @r{(not recoverable)} 5 @var{proc} didn't output to @var{proc} 6 Not enough inputs to @var{proc} 7 @code{proc} doesn't like @code{datum} as input@ @ @r{(recoverable)} 8 Too much inside ()'s 9 You don't say what to do with @var{datum} 10 ')' not found 11 @var{var} has no value 12 Unexpected ')' 13 I don't know how to @var{proc}@ @ @r{(recoverable)} 14 Can't find catch tag for @var{throwtag} 15 @var{proc} is already defined 16 Stopped 17 Already dribbling 18 File system error 19 Assuming you mean IFELSE, not IF@ @ @r{(warning only)} 20 @var{var} shadowed by local in procedure call@ @ @r{(warning only)} 21 Throw "Error 22 @var{proc} is a primitive 23 Can't use TO inside a procedure 24 I don't know how to @var{proc}@ @ @r{(not recoverable)} 25 IFTRUE/IFFALSE without TEST 26 Unexpected ']' 27 Unexpected '@}' 28 Couldn't initialize graphics 29 Macro returned @var{value} instead of a list 30 You don't say what to do with @var{value} 31 Can only use STOP or OUTPUT inside a procedure 32 APPLY doesn't like @var{badthing} as input 33 END inside multi-line instruction 34 Really out of memory@ @ @r{(can't be caught)} 35 user-generated error message (THROW "ERROR @var{message}) 36 END inside multi-line instruction 37 Bad default expression for optional input: @var{expr} 38 Can't use OUTPUT or STOP inside RUNRESULT 39 Assuming you meant 'FD 100', not FD100@ @ @r{(or similar)} 40 I can't open file @var{filename} 41 File @var{filename} already open 42 File @var{filename} not open 43 Runlist [@var{expr} @var{expr}] has more than one expression. @end example @node SPECIAL VARIABLES, INTERNATIONALIZATION, ERROR PROCESSING, Top @chapter Special Variables Logo takes special action if any of the following variable names exists. They follow the normal scoping rules, so a procedure can locally set one of them to limit the scope of its effect. Initially, no variables exist except for @code{ALLOWGETSET}, @code{CASEIGNOREDP}, and @code{UNBURYONEDIT}, which are @code{TRUE} and buried. @menu * ALLOWGETSET:: * BUTTONACT:: * CASEIGNOREDP:: * COMMANDLINE:: * ERRACT:: * FULLPRINTP:: * KEYACT:: * LOADNOISILY:: * PRINTDEPTHLIMIT:: * PRINTWIDTHLIMIT:: * REDEFP:: * STARTUP:: * UNBURYONEDIT:: * USEALTERNATENAMES:: * LOGOVERSION:: * LOGOPLATFORM:: @end menu @node ALLOWGETSET, BUTTONACT, SPECIAL VARIABLES, SPECIAL VARIABLES @comment node-name, next, previous, up @unnumberedsec allowgetset @cindex allowgetset @example ALLOWGETSET (variable) @end example if @code{TRUE}, indicates that an attempt to use a procedure that doesn't exist should be taken as an implicit getter or setter procedure (setter if the first three letters of the name are @code{SET}) for a variable of the same name (without the @code{SET} if appropriate). @node BUTTONACT, CASEIGNOREDP, ALLOWGETSET, SPECIAL VARIABLES @comment node-name, next, previous, up @unnumberedsubsec buttonact @cindex buttonact @example BUTTONACT (variable) @end example if nonempty, should be an instruction list that will be evaluated whenever a mouse button is pressed. Note that the user may have released the button before the instructions are evaluated. @code{BUTTON} will still output which button was most recently pressed. @code{CLICKPOS} will output the position of the mouse cursor at the moment the button was pressed; this may be different from @code{MOUSEPOS} if the user moves the mouse after clicking. Note that it's possible for the user to press a button during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting @code{BUTTONACT} to the empty list. One easy way to do that is the following: @example make "buttonact [button.action] to button.action [:buttonact []] ... ; whatever you want the button to do end @end example @node CASEIGNOREDP, COMMANDLINE, BUTTONACT, SPECIAL VARIABLES @unnumberedsubsec caseignoredp @cindex caseignoredp @example CASEIGNOREDP (variable) @end example if @code{TRUE}, indicates that lower case and upper case letters should be considered equal by @code{EQUALP}, @code{BEFOREP}, @code{MEMBERP}, etc. Logo initially makes this variable @code{TRUE}, and buries it. @xref{EQUALP} , @ref{BEFOREP} , @ref{MEMBERP} . @node COMMANDLINE, ERRACT, CASEIGNOREDP, SPECIAL VARIABLES @unnumberedsubsec commandline @cindex commandline @example COMMANDLINE (variable) @end example contains any text appearing after a hyphen on the command line used to start Logo. @node ERRACT, FULLPRINTP, COMMANDLINE, SPECIAL VARIABLES @unnumberedsubsec erract @cindex erract @example ERRACT (variable) @end example an instructionlist that will be run in the event of an error. Typically has the value @code{[PAUSE]} to allow interactive debugging. @xref{PAUSE} . @node FULLPRINTP, KEYACT, ERRACT, SPECIAL VARIABLES @comment node-name, next, previous, up @unnumberedsubsec fullprintp @cindex fullprintp @example FULLPRINTP (variable) @end example if @code{TRUE}, then words that were created using backslash or vertical bar (to include characters that would otherwise not be treated as part of a word) are printed with the backslashes or vertical bars shown, so that the printed result could be re-read by Logo to produce the same value. If FULLPRINTP is @code{TRUE} then the empty word (however it was created) prints as @code{||}. (Otherwise it prints as nothing at all.) @node KEYACT, LOADNOISILY, FULLPRINTP, SPECIAL VARIABLES @comment node-name, next, previous, up @unnumberedsubsec keyact @cindex keyact @example KEYACT (variable) @end example if nonempty, should be an instruction list that will be evaluated whenever a key is pressed on the keyboard. The instruction list can use @code{READCHAR} to find out what key was pressed. Note that only keys that produce characters qualify; pressing @code{SHIFT} or @code{CONTROL} alone will not cause @code{KEYACT} to be evaluated. Note that it's possible for the user to press a key during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting @code{KEYACT} to the empty list. One easy way to do that is the following: @example make "keyact [key.action] to key.action [:keyact []] ... ; whatever you want the key to do end @end example @node LOADNOISILY, PRINTDEPTHLIMIT, KEYACT, SPECIAL VARIABLES @unnumberedsubsec loadnoisily @cindex loadnoisily @example LOADNOISILY (variable) @end example if @code{TRUE}, prints the names of procedures defined when loading from a file (including the temporary file made by @code{EDIT}). @xref{EDIT} . @node PRINTDEPTHLIMIT, PRINTWIDTHLIMIT, LOADNOISILY, SPECIAL VARIABLES @unnumberedsubsec printdepthlimit @cindex printdepthlimit @example PRINTDEPTHLIMIT (variable) @end example if a nonnegative integer, indicates the maximum depth of sublist structure that will be printed by @code{PRINT}, etc. @xref{PRINT} . @node PRINTWIDTHLIMIT, REDEFP, PRINTDEPTHLIMIT, SPECIAL VARIABLES @unnumberedsubsec printwidthlimit @cindex printwidthlimit @example PRINTWIDTHLIMIT (variable) @end example if a nonnegative integer, indicates the maximum number of members in any one list that will be printed by @code{PRINT}, etc. @xref{PRINT} . @node REDEFP, STARTUP, PRINTWIDTHLIMIT, SPECIAL VARIABLES @unnumberedsubsec redefp @cindex redefp @example REDEFP (variable) @end example if @code{TRUE}, allows primitives to be erased (@code{ERASE}) or redefined (@code{COPYDEF}). @xref{ERASE} , @ref{COPYDEF} . @node STARTUP, UNBURYONEDIT, REDEFP, SPECIAL VARIABLES @unnumberedsubsec startup @cindex startup @example STARTUP (variable) @end example if assigned a list value in a file loaded by @code{LOAD}, that value is run as an instructionlist after the loading. @xref{LOAD} . @node UNBURYONEDIT, USEALTERNATENAMES, STARTUP, SPECIAL VARIABLES @comment node-name, next, previous, up @unnumberedsubsec unburyonedit @cindex unburyonedit @example UNBURYONEDIT (variable) @end example if @code{TRUE}, causes any procedure defined during @code{EDIT} or @code{LOAD} to be unburied, so that it will be saved by a later @code{SAVE}. Files that want to define and bury procedures must do it in that order. @xref{EDIT} , @xref{LOAD} , @xref{SAVE} . @node USEALTERNATENAMES, LOGOVERSION, UNBURYONEDIT, SPECIAL VARIABLES @unnumberedsubsec usealternatenames @cindex usealternatenames @example USEALTERNATENAMES (variable) @end example if @code{TRUE}, causes Logo to generate non-English words (from the @file{Messages} file) instead of @code{TRUE}, @code{FALSE}, @code{END}, etc. Logo provides the following buried variables that can be used by programs: @node LOGOVERSION, LOGOPLATFORM, USEALTERNATENAMES, SPECIAL VARIABLES @unnumberedsubsec logoversion @cindex logoversion @example LOGOVERSION (variable) @end example a real number indicating the Logo version number, e.g., 5.5 @node LOGOPLATFORM, , LOGOVERSION, SPECIAL VARIABLES @unnumberedsubsec logoplatform @cindex logoplatform @example LOGOPLATFORM (variable) @end example one of the following words: @code{wxWidgets}, @code{X11}, @code{Windows}, or @code{Unix-nographics}. @node INTERNATIONALIZATION, INDEX, SPECIAL VARIABLES, Top @chapter Internationalization Berkeley Logo has limited support for non-English-speaking users. Alas, there is no Unicode support, and high-bit-on ASCII codes work in some contexts but not others. If you want to translate Berkeley Logo for use with another language, there are three main things you have to do: @example 1. Primitive names 2. Error (and other) messages 3. Documentation @end example For primitive names, the easiest thing is to provide a startup file that defines aliases for the English primitive names, using @code{COPYDEF}: @example COPYDEF "AVANT "FORWARD @end example This should take care of it, unless your language's name for one primitive is spelled like the English name of a different primitive. In that case you have to turn @code{REDEFP} on and be sure to copy the non-conflicting name before overwriting the conflicting one! "Primitives" that are actually in the Logo library, of course, can just be replaced or augmented with native-language-named Logo procedures and filenames. Of course Logo programs will still not look like your native language if the word order is dramatically different, especially if you don't put verbs before their objects. For error messages, there is a file named @file{Messages} in the @file{logolib} directory with texts of messages, one per line. You can replace this with a file for your own language. Do not add, delete, or reorder lines; Logo finds messages by line number. The sequences @code{%p}, @code{%s}, and @code{%t} in these messages represent variable parts of the message and should not be translated. (%p @code{PRINT}s the variable part, while %s @code{SHOW}s it -- that is, the difference is about whether or not brackets are shown surrounding a list. %t means that the variable part is a C text string rather than a Logo object.) If you want to change the order of two variable parts (no reorderable message has more than two), you would for example replace the line @example %p doesn't like %s as input @end example with @example %+s is a lousy input to %p @end example The plus sign tells the message printer to reverse the order; you must reverse the order of %p and %s, if both are used, to match. The plus sign goes just after the first percent sign in the message, which might not be at the beginning of the line. The sequence @code{\n} in a message represents a newline; don't be fooled into thinking that the @code{n} is part of the following word. Some messages appear twice in the file; this isn't a mistake. The two spaces before @code{to} in @code{I don't know how\ \ to} aren't a mistake either. The message containing just @code{%p} is for user-provided error messages in @w{@code{THROW "ERROR}}. The message "@code{\ \ in %s\n%s}" is the part of all error messages that indicates where the error occurred if it was inside a procedure; you might want to change the word @code{in} to your language. @w{@code{%s defined\n}} is what @code{LOAD} prints for each procedure defined if the variable @code{LOADNOISILY} is @code{TRUE}. @w{"@code{to %p\nend\n\n}"} is what @code{EDIT} puts in the temporary file if you ask to edit a procedure that isn't already defined. Also in the @file{Messages} file are lines containing only one word each; the first of these is the word @code{true}. Some of these words are recognized by Logo in user input; some are generated by Logo; some are both. For example, the words @code{TRUE} and @code{FALSE} are recognized as Boolean values by @code{IF} and @code{IFELSE}, and are also generated by Logo as outputs from the primitive predicates such as @code{EQUALP}. The word @code{END} is recognized as the end of a procedure definition, and may be generated when Logo reconstructs a procedure body for @code{PO} or @code{EDIT}. I've used capital letters in this paragraph for easier reading, but the words in the @file{Messages} file should be in lower case. If you replace these with non-English words, Logo will @emph{recognize} both the English names and your alternate names. For example, if you replace the word @code{true} with @code{vrai} then Logo will understand both of these: @example IF "TRUE [PRINT "YES] IF "VRAI [PRINT "YES] @end example The variable @code{UseAlternateNames} determines whether Logo will @emph{generate} other-language names -- for example, whether predicate functions return the other-language alternates for @code{TRUE} and @code{FALSE}. This variable is @code{FALSE} by default, meaning that the English words will be generated. You might wish to have English-named predicate functions generate English @code{TRUE} and @code{FALSE}, while other-language-named predicates generate the alternate words. This can be done by leaving @code{UseAlternateNames} false, and instead of defining the other-language predicates with @code{COPYDEF}, do it this way: @example to french.boolean :bool if equalp :bool "true [output "vrai] if equalp :bool "false [output "faux] output :bool ; shouldn't happen end to make.french.predicate :french :english :arity define :french `[[[inputs] ,[:arity]] [output french.boolean apply ,[word "" :english] :inputs]] end ? make.french.predicate "egal? "equal? 2 ? pr egal? 3 4 faux ? pr egal? 4 4 vrai ? pr equal? 3 4 false ? pr equal? 4 4 true @end example The third input to @code{make.french.predicate} is the number of inputs that the predicate expects. This solution isn't quite perfect because the infix predicates (@code{=}, @code{<}, @code{>}) will still output in English. If you want them to generate alternate-language words, set @code{UseAlternateNames} to @code{TRUE} instead. Some of the words in this section of the @file{Messages} file are names of Logo primitives (@code{OUTPUT}, @code{STOP}, @code{GOTO}, @code{TAG}, @code{IF}, @code{IFELSE}, @code{TO}, @code{.MACRO}). To translate these names, you must use @code{COPYDEF} as described earlier, in addition to changing the names in @file{Messages}. You should be consistent in these two steps. Don't forget the period in @code{.macro}! For documentation, there are two kinds: this manual and the help files. The latter are generated automatically from this manual if you have a Unix system, so in that case you need only translate this manual, maintaining the format. (The automatic helpfile generator notices things like capital letters, tabs, hyphens, and equal signs at the beginnings of lines.) The program @code{makefile.c} may require modification because a few of the primitive names are special cases (e.g., @code{LOG10} is the only name with digits included). If you don't have Unix tools, you can just translate each helpfile individually. A period in a primitive name is represented as a @code{D} in the filename; there are no files for question marks because the @code{HELP} command looks for the file named after the corresponding primitive that ends in @code{P}. @node INDEX, , INTERNATIONALIZATION, Top @unnumbered INDEX @printindex cp @bye ucblogo-6.1/docs/usermanual.toc0000664000175000017500000004575613601426467014757 0ustar jjcjjc@numchapentry{Introduction}{1}{INTRODUCTION}{1} @numsecentry{Overview}{1.1}{OVERVIEW}{1} @numsecentry{Getter/Setter Variable Syntax}{1.2}{GETTER/SETTER VARIBLE SYNTAX}{2} @numsecentry{Entering and Leaving Logo}{1.3}{ENTERING AND LEAVING LOGO}{5} @numsecentry{Tokenization}{1.4}{TOKENIZATION}{6} @numchapentry{Data Structure Primitives}{2}{DATA STRUCTURE PRIMITIVES}{9} @numsecentry{Constructors}{2.1}{CONSTRUCTORS}{9} @unnsubsecentry{word}{10000.1.1}{WORD}{9} @unnsubsecentry{list}{10000.1.2}{LIST}{9} @unnsubsecentry{sentence}{10000.1.3}{SENTENCE}{9} @unnsubsecentry{fput}{10000.1.4}{FPUT}{9} @unnsubsecentry{lput}{10000.1.5}{LPUT}{9} @unnsubsecentry{array}{10000.1.6}{ARRAY}{9} @unnsubsecentry{mdarray}{10000.1.7}{MDARRAY}{10} @unnsubsecentry{listtoarray}{10000.1.8}{LISTTOARRAY}{10} @unnsubsecentry{arraytolist}{10000.1.9}{ARRAYTOLIST}{10} @unnsubsecentry{combine}{10000.1.10}{COMBINE}{10} @unnsubsecentry{reverse}{10000.1.11}{REVERSE}{10} @unnsubsecentry{gensym}{10000.1.12}{GENSYM}{10} @numsecentry{Data Selectors}{2.2}{SELECTORS}{10} @unnsubsecentry{first}{10000.2.1}{FIRST}{10} @unnsubsecentry{firsts}{10000.2.2}{FIRSTS}{11} @unnsubsecentry{last}{10000.2.3}{LAST}{11} @unnsubsecentry{butfirst}{10000.2.4}{BUTFIRST}{11} @unnsubsecentry{butfirsts}{10000.2.5}{BUTFIRSTS}{11} @unnsubsecentry{butlast}{10000.2.6}{BUTLAST}{12} @unnsubsecentry{item}{10000.2.7}{ITEM}{12} @unnsubsecentry{mditem}{10000.2.8}{MDITEM}{12} @unnsubsecentry{pick}{10000.2.9}{PICK}{12} @unnsubsecentry{remove}{10000.2.10}{REMOVE}{12} @unnsubsecentry{remdup}{10000.2.11}{REMDUP}{12} @unnsubsecentry{quoted}{10000.2.12}{QUOTED}{12} @numsecentry{Data Mutators}{2.3}{MUTATORS}{12} @unnsubsecentry{setitem}{10000.3.1}{SETITEM}{12} @unnsubsecentry{mdsetitem}{10000.3.2}{MDSETITEM}{13} @unnsubsecentry{.setfirst}{10000.3.3}{dSETFIRST}{13} @unnsubsecentry{.setbf}{10000.3.4}{dSETBF}{13} @unnsubsecentry{.setitem}{10000.3.5}{dSETITEM}{13} @unnsubsecentry{push}{10000.3.6}{PUSH}{13} @unnsubsecentry{pop}{10000.3.7}{POP}{13} @unnsubsecentry{queue}{10000.3.8}{QUEUE}{14} @unnsubsecentry{dequeue}{10000.3.9}{DEQUEUE}{14} @numsecentry{Predicates}{2.4}{PREDICATES}{14} @unnsubsecentry{wordp}{10000.4.1}{WORDP}{14} @unnsubsecentry{listp}{10000.4.2}{LISTP}{14} @unnsubsecentry{arrayp}{10000.4.3}{ARRAYP}{14} @unnsubsecentry{emptyp}{10000.4.4}{EMPTYP}{14} @unnsubsecentry{equalp}{10000.4.5}{EQUALP}{14} @unnsubsecentry{notequalp}{10000.4.6}{NOTEQUALP}{15} @unnsubsecentry{beforep}{10000.4.7}{BEFOREP}{15} @unnsubsecentry{.eq}{10000.4.8}{dEQ}{15} @unnsubsecentry{memberp}{10000.4.9}{MEMBERP}{15} @unnsubsecentry{substringp}{10000.4.10}{SUBSTRINGP}{16} @unnsubsecentry{numberp}{10000.4.11}{NUMBERP}{16} @unnsubsecentry{vbarredp}{10000.4.12}{VBARREDP}{16} @numsecentry{Queries}{2.5}{QUERIES}{16} @unnsubsecentry{count}{10000.5.1}{COUNT}{16} @unnsubsecentry{ascii}{10000.5.2}{ASCII}{16} @unnsubsecentry{rawascii}{10000.5.3}{RAWASCII}{16} @unnsubsecentry{char}{10000.5.4}{CHAR}{17} @unnsubsecentry{member}{10000.5.5}{MEMBER}{17} @unnsubsecentry{lowercase}{10000.5.6}{LOWERCASE}{17} @unnsubsecentry{uppercase}{10000.5.7}{UPPERCASE}{17} @unnsubsecentry{standout}{10000.5.8}{STANDOUT}{17} @unnsubsecentry{parse}{10000.5.9}{PARSE}{18} @unnsubsecentry{runparse}{10000.5.10}{RUNPARSE}{18} @numchapentry{Communication}{3}{COMMUNICATION}{19} @numsecentry{Transmitters}{3.1}{TRANSMITTERS}{19} @unnsubsecentry{print}{10000.1.1}{PRINT}{19} @unnsubsecentry{type}{10000.1.2}{TYPE}{19} @unnsubsecentry{show}{10000.1.3}{SHOW}{20} @numsecentry{Receivers}{3.2}{RECEIVERS}{20} @unnsubsecentry{readlist}{10000.2.1}{READLIST}{20} @unnsubsecentry{readword}{10000.2.2}{READWORD}{20} @unnsubsecentry{readrawline}{10000.2.3}{READRAWLINE}{20} @unnsubsecentry{readchar}{10000.2.4}{READCHAR}{21} @unnsubsecentry{readchars}{10000.2.5}{READCHARS}{21} @unnsubsecentry{shell}{10000.2.6}{SHELL}{21} @numsecentry{File Access}{3.3}{FILE ACCESS}{22} @unnsubsecentry{setprefix}{10000.3.1}{SETPREFIX}{22} @unnsubsecentry{prefix}{10000.3.2}{PREFIX}{22} @unnsubsecentry{openread}{10000.3.3}{OPENREAD}{22} @unnsubsecentry{openwrite}{10000.3.4}{OPENWRITE}{22} @unnsubsecentry{openappend}{10000.3.5}{OPENAPPEND}{23} @unnsubsecentry{openupdate}{10000.3.6}{OPENUPDATE}{23} @unnsubsecentry{close}{10000.3.7}{CLOSE}{23} @unnsubsecentry{allopen}{10000.3.8}{ALLOPEN}{23} @unnsubsecentry{closeall}{10000.3.9}{CLOSEALL}{23} @unnsubsecentry{erasefile}{10000.3.10}{ERASEFILE}{23} @unnsubsecentry{dribble}{10000.3.11}{DRIBBLE}{24} @unnsubsecentry{nodribble}{10000.3.12}{NODRIBBLE}{24} @unnsubsecentry{setread}{10000.3.13}{SETREAD}{24} @unnsubsecentry{setwrite}{10000.3.14}{SETWRITE}{24} @unnsubsecentry{reader}{10000.3.15}{READER}{25} @unnsubsecentry{writer}{10000.3.16}{WRITER}{25} @unnsubsecentry{setreadpos}{10000.3.17}{SETREADPOS}{25} @unnsubsecentry{setwritepos}{10000.3.18}{SETWRITEPOS}{25} @unnsubsecentry{readpos}{10000.3.19}{READPOS}{25} @unnsubsecentry{writepos}{10000.3.20}{WRITEPOS}{25} @unnsubsecentry{eofp}{10000.3.21}{EOFP}{25} @unnsubsecentry{filep}{10000.3.22}{FILEP}{26} @numsecentry{Terminal Access}{3.4}{TERMINAL ACCESS}{26} @unnsubsecentry{keyp}{10000.4.1}{KEYP}{26} @unnsubsecentry{cleartext}{10000.4.2}{CLEARTEXT}{26} @unnsubsecentry{setcursor}{10000.4.3}{SETCURSOR}{26} @unnsubsecentry{cursor}{10000.4.4}{CURSOR}{26} @unnsubsecentry{setmargins}{10000.4.5}{SETMARGINS}{26} @unnsubsecentry{settextcolor}{10000.4.6}{SETTEXTCOLOR}{27} @unnsubsecentry{increasefont}{10000.4.7}{INCREASEFONT}{27} @unnsubsecentry{settextsize}{10000.4.8}{SETTEXTSIZE}{27} @unnsubsecentry{textsize}{10000.4.9}{TEXTSIZE}{27} @unnsubsecentry{setfont}{10000.4.10}{SETFONT}{28} @unnsubsecentry{font}{10000.4.11}{FONT}{28} @numchapentry{Arithmetic}{4}{ARITHMETIC}{29} @numsecentry{Numeric Operations}{4.1}{NUMERIC OPERATIONS}{29} @unnsubsecentry{sum}{10000.1.1}{SUM}{29} @unnsubsecentry{difference}{10000.1.2}{DIFFERENCE}{29} @unnsubsecentry{minus}{10000.1.3}{MINUS}{29} @unnsubsecentry{product}{10000.1.4}{PRODUCT}{29} @unnsubsecentry{quotient}{10000.1.5}{QUOTIENT}{29} @unnsubsecentry{remainder}{10000.1.6}{REMAINDER}{30} @unnsubsecentry{modulo}{10000.1.7}{MODULO}{30} @unnsubsecentry{int}{10000.1.8}{INT}{30} @unnsubsecentry{round}{10000.1.9}{ROUND}{30} @unnsubsecentry{sqrt}{10000.1.10}{SQRT}{30} @unnsubsecentry{power}{10000.1.11}{POWER}{30} @unnsubsecentry{exp}{10000.1.12}{EXP}{30} @unnsubsecentry{log10}{10000.1.13}{LOG10}{30} @unnsubsecentry{ln}{10000.1.14}{LN}{30} @unnsubsecentry{sin}{10000.1.15}{SIN}{31} @unnsubsecentry{radsin}{10000.1.16}{RADSIN}{31} @unnsubsecentry{cos}{10000.1.17}{COS}{31} @unnsubsecentry{radcos}{10000.1.18}{RADCOS}{31} @unnsubsecentry{arctan}{10000.1.19}{ARCTAN}{31} @unnsubsecentry{radarctan}{10000.1.20}{RADARCTAN}{31} @unnsubsecentry{iseq}{10000.1.21}{ISEQ}{31} @unnsubsecentry{rseq}{10000.1.22}{RSEQ}{31} @numsecentry{Numeric Predicates}{4.2}{NUMERIC PREDICATES}{32} @unnsubsecentry{lessp}{10000.2.1}{LESSP}{32} @unnsubsecentry{greaterp}{10000.2.2}{GREATERP}{32} @unnsubsecentry{lessequalp}{10000.2.3}{LESSEQUALP}{32} @unnsubsecentry{greaterequalp}{10000.2.4}{GREATEREQUALP}{32} @numsecentry{Random Numbers}{4.3}{RANDOM NUMBERS}{32} @unnsubsecentry{random}{10000.3.1}{RANDOM}{32} @unnsubsecentry{rerandom}{10000.3.2}{RERANDOM}{33} @numsecentry{Print Formatting}{4.4}{PRINT FORMATTING}{33} @unnsubsecentry{form}{10000.4.1}{FORM}{33} @numsecentry{Bitwise Operations}{4.5}{BITWISE OPERATIONS}{33} @unnsubsecentry{bitand}{10000.5.1}{BITAND}{33} @unnsubsecentry{bitor}{10000.5.2}{BITOR}{33} @unnsubsecentry{bitxor}{10000.5.3}{BITXOR}{33} @unnsubsecentry{bitnot}{10000.5.4}{BITNOT}{34} @unnsubsecentry{ashift}{10000.5.5}{ASHIFT}{34} @unnsubsecentry{lshift}{10000.5.6}{LSHIFT}{34} @numchapentry{Logical Operations}{5}{LOGICAL OPERATIONS}{35} @unnsecentry{and}{10000.1}{AND}{35} @unnsubsecentry{or}{10000.1.1}{OR}{35} @unnsubsecentry{not}{10000.1.2}{NOT}{35} @numchapentry{Graphics}{6}{GRAPHICS}{37} @numsecentry{Turtle Motion}{6.1}{TURTLE MOTION}{37} @unnsubsecentry{forward}{10000.1.1}{FORWARD}{37} @unnsubsecentry{back}{10000.1.2}{BACK}{37} @unnsubsecentry{left}{10000.1.3}{LEFT}{38} @unnsubsecentry{right}{10000.1.4}{RIGHT}{38} @unnsubsecentry{setpos}{10000.1.5}{SETPOS}{38} @unnsubsecentry{setxy}{10000.1.6}{SETXY}{38} @unnsubsecentry{setx}{10000.1.7}{SETX}{38} @unnsubsecentry{sety}{10000.1.8}{SETY}{38} @unnsubsecentry{setheading}{10000.1.9}{SETHEADING}{38} @unnsubsecentry{home}{10000.1.10}{HOME}{38} @unnsubsecentry{arc}{10000.1.11}{ARC}{39} @numsecentry{Turtle Motion Queries}{6.2}{TURTLE MOTION QUERIES}{39} @unnsubsecentry{pos}{10000.2.1}{POS}{39} @unnsubsecentry{xcor}{10000.2.2}{XCOR}{39} @unnsubsecentry{ycor}{10000.2.3}{YCOR}{39} @unnsubsecentry{heading}{10000.2.4}{HEADING}{39} @unnsubsecentry{towards}{10000.2.5}{TOWARDS}{39} @unnsubsecentry{scrunch}{10000.2.6}{SCRUNCH}{39} @numsecentry{Turtle and Window Control}{6.3}{TURTLE AND WINDOW CONTROL}{39} @unnsubsecentry{showturtle}{10000.3.1}{SHOWTURTLE}{39} @unnsubsecentry{hideturtle}{10000.3.2}{HIDETURTLE}{40} @unnsubsecentry{clean}{10000.3.3}{CLEAN}{40} @unnsubsecentry{clearscreen}{10000.3.4}{CLEARSCREEN}{40} @unnsubsecentry{wrap}{10000.3.5}{WRAP}{40} @unnsubsecentry{window}{10000.3.6}{WINDOW}{40} @unnsubsecentry{fence}{10000.3.7}{FENCE}{40} @unnsubsecentry{fill}{10000.3.8}{FILL}{41} @unnsubsecentry{filled}{10000.3.9}{FILLED}{41} @unnsubsecentry{label}{10000.3.10}{LABEL}{41} @unnsubsecentry{setlabelheight}{10000.3.11}{SETLABELHEIGHT}{41} @unnsubsecentry{textscreen}{10000.3.12}{TEXTSCREEN}{41} @unnsubsecentry{fullscreen}{10000.3.13}{FULLSCREEN}{41} @unnsubsecentry{splitscreen}{10000.3.14}{SPLITSCREEN}{42} @unnsubsecentry{setscrunch}{10000.3.15}{SETSCRUNCH}{42} @unnsubsecentry{refresh}{10000.3.16}{REFRESH}{42} @unnsubsecentry{norefresh}{10000.3.17}{NOREFRESH}{42} @numsecentry{Turtle and Window Queries}{6.4}{TURTLE AND WINDOW QUERIES}{42} @unnsubsecentry{shownp}{10000.4.1}{SHOWNP}{43} @unnsubsecentry{screenmode}{10000.4.2}{SCREENMODE}{43} @unnsubsecentry{turtlemode}{10000.4.3}{TURTLEMODE}{43} @unnsubsecentry{labelsize}{10000.4.4}{LABELSIZE}{43} @numsecentry{Pen and Background Control}{6.5}{PEN AND BACKGROUND CONTROL}{43} @unnsubsecentry{pendown}{10000.5.1}{PENDOWN}{43} @unnsubsecentry{penup}{10000.5.2}{PENUP}{43} @unnsubsecentry{penpaint}{10000.5.3}{PENPAINT}{44} @unnsubsecentry{penerase}{10000.5.4}{PENERASE}{44} @unnsubsecentry{penreverse}{10000.5.5}{PENREVERSE}{44} @unnsubsecentry{setpencolor}{10000.5.6}{SETPENCOLOR}{44} @unnsubsecentry{setpalette}{10000.5.7}{SETPALETTE}{44} @unnsubsecentry{setpensize}{10000.5.8}{SETPENSIZE}{44} @unnsubsecentry{setpenpattern}{10000.5.9}{SETPENPATTERN}{45} @unnsubsecentry{setpen}{10000.5.10}{SETPEN}{45} @unnsubsecentry{setbackground}{10000.5.11}{SETBACKGROUND}{45} @numsecentry{Pen Queries}{6.6}{PEN QUERIES}{45} @unnsubsecentry{pendownp}{10000.6.1}{PENDOWNP}{45} @unnsubsecentry{penmode}{10000.6.2}{PENMODE}{45} @unnsubsecentry{pencolor}{10000.6.3}{PENCOLOR}{45} @unnsubsecentry{palette}{10000.6.4}{PALETTE}{46} @unnsubsecentry{pensize}{10000.6.5}{PENSIZE}{46} @unnsubsecentry{pen}{10000.6.6}{PEN}{46} @unnsubsecentry{background}{10000.6.7}{BACKGROUND}{46} @numsecentry{Saving and Loading Pictures}{6.7}{SAVING AND LOADING PICTURES}{46} @unnsubsecentry{savepict}{10000.7.1}{SAVEPICT}{46} @unnsubsecentry{loadpict}{10000.7.2}{LOADPICT}{46} @unnsubsecentry{epspict}{10000.7.3}{EPSPICT}{47} @numsecentry{Mouse Queries}{6.8}{MOUSE QUERIES}{47} @unnsubsecentry{mousepos}{10000.8.1}{MOUSEPOS}{47} @unnsubsecentry{clickpos}{10000.8.2}{CLICKPOS}{47} @unnsubsecentry{buttonp}{10000.8.3}{BUTTONP}{47} @unnsubsecentry{button}{10000.8.4}{BUTTON}{47} @numchapentry{Workspace Management}{7}{WORKSPACE MANAGEMENT}{49} @numsecentry{Procedure Definition}{7.1}{PROCEDURE DEFINITION}{49} @unnsubsecentry{to}{10000.1.1}{TO}{49} @unnsubsecentry{define}{10000.1.2}{DEFINE}{50} @unnsubsecentry{text}{10000.1.3}{TEXT}{51} @unnsubsecentry{fulltext}{10000.1.4}{FULLTEXT}{51} @unnsubsecentry{copydef}{10000.1.5}{COPYDEF}{51} @numsecentry{Variable Definition}{7.2}{VARIABLE DEFINITION}{51} @unnsubsecentry{make}{10000.2.1}{MAKE}{51} @unnsubsecentry{name}{10000.2.2}{NAME}{51} @unnsubsecentry{local}{10000.2.3}{LOCAL}{52} @unnsubsecentry{localmake}{10000.2.4}{LOCALMAKE}{52} @unnsubsecentry{thing}{10000.2.5}{THING}{52} @unnsubsecentry{global}{10000.2.6}{GLOBAL}{52} @numsecentry{Property Lists}{7.3}{PROPERTY LISTS}{53} @unnsubsecentry{pprop}{10000.3.1}{PPROP}{53} @unnsubsecentry{gprop}{10000.3.2}{GPROP}{53} @unnsubsecentry{remprop}{10000.3.3}{REMPROP}{53} @unnsubsecentry{plist}{10000.3.4}{PLIST}{53} @numsecentry{Workspace Predicates}{7.4}{WORKSPACE PREDICATES}{53} @unnsubsecentry{procedurep}{10000.4.1}{PROCEDUREP}{53} @unnsubsecentry{primitivep}{10000.4.2}{PRIMITIVEP}{53} @unnsubsecentry{definedp}{10000.4.3}{DEFINEDP}{54} @unnsubsecentry{namep}{10000.4.4}{NAMEP}{54} @unnsubsecentry{plistp}{10000.4.5}{PLISTP}{54} @numsecentry{Workspace Queries}{7.5}{WORKSPACE QUERIES}{54} @unnsubsecentry{contents}{10000.5.1}{CONTENTS}{54} @unnsubsecentry{buried}{10000.5.2}{BURIED}{54} @unnsubsecentry{traced}{10000.5.3}{TRACED}{54} @unnsubsecentry{stepped}{10000.5.4}{STEPPED}{54} @unnsubsecentry{procedures}{10000.5.5}{PROCEDURES}{55} @unnsubsecentry{primitives}{10000.5.6}{PRIMITIVES}{55} @unnsubsecentry{names}{10000.5.7}{NAMES}{55} @unnsubsecentry{plists}{10000.5.8}{PLISTS}{55} @unnsubsecentry{namelist}{10000.5.9}{NAMELIST}{55} @unnsubsecentry{pllist}{10000.5.10}{PLLIST}{55} @unnsubsecentry{arity}{10000.5.11}{ARITY}{55} @unnsubsecentry{nodes}{10000.5.12}{NODES}{56} @numsecentry{Workspace Inspection}{7.6}{WORKSPACE INSPECTION}{56} @unnsubsecentry{po}{10000.6.1}{PO}{56} @unnsubsecentry{poall}{10000.6.2}{POALL}{56} @unnsubsecentry{pops}{10000.6.3}{POPS}{56} @unnsubsecentry{pons}{10000.6.4}{PONS}{56} @unnsubsecentry{popls}{10000.6.5}{POPLS}{57} @unnsubsecentry{pon}{10000.6.6}{PON}{57} @unnsubsecentry{popl}{10000.6.7}{POPL}{57} @unnsubsecentry{pot}{10000.6.8}{POT}{57} @unnsubsecentry{pots}{10000.6.9}{POTS}{57} @numsecentry{Workspace Control}{7.7}{WORKSPACE CONTROL}{57} @unnsubsecentry{erase}{10000.7.1}{ERASE}{57} @unnsubsecentry{erall}{10000.7.2}{ERALL}{58} @unnsubsecentry{erps}{10000.7.3}{ERPS}{58} @unnsubsecentry{erns}{10000.7.4}{ERNS}{58} @unnsubsecentry{erpls}{10000.7.5}{ERPLS}{58} @unnsubsecentry{ern}{10000.7.6}{ERN}{58} @unnsubsecentry{erpl}{10000.7.7}{ERPL}{58} @unnsubsecentry{bury}{10000.7.8}{BURY}{59} @unnsubsecentry{buryall}{10000.7.9}{BURYALL}{59} @unnsubsecentry{buryname}{10000.7.10}{BURYNAME}{59} @unnsubsecentry{unbury}{10000.7.11}{UNBURY}{59} @unnsubsecentry{unburyall}{10000.7.12}{UNBURYALL}{59} @unnsubsecentry{unburyname}{10000.7.13}{UNBURYNAME}{59} @unnsubsecentry{buriedp}{10000.7.14}{BURIEDP}{60} @unnsubsecentry{trace}{10000.7.15}{TRACE}{60} @unnsubsecentry{untrace}{10000.7.16}{UNTRACE}{60} @unnsubsecentry{tracedp}{10000.7.17}{TRACEDP}{60} @unnsubsecentry{step}{10000.7.18}{STEP}{60} @unnsubsecentry{unstep}{10000.7.19}{UNSTEP}{60} @unnsubsecentry{steppedp}{10000.7.20}{STEPPEDP}{61} @unnsubsecentry{edit}{10000.7.21}{EDIT}{61} @unnsubsecentry{editfile}{10000.7.22}{EDITFILE}{61} @unnsubsecentry{edall}{10000.7.23}{EDALL}{62} @unnsubsecentry{edps}{10000.7.24}{EDPS}{62} @unnsubsecentry{edns}{10000.7.25}{EDNS}{62} @unnsubsecentry{edpls}{10000.7.26}{EDPLS}{62} @unnsubsecentry{edn}{10000.7.27}{EDN}{62} @unnsubsecentry{edpl}{10000.7.28}{EDPL}{62} @unnsubsecentry{save}{10000.7.29}{SAVE}{62} @unnsubsecentry{savel}{10000.7.30}{SAVEL}{63} @unnsubsecentry{load}{10000.7.31}{LOAD}{63} @unnsubsecentry{cslsload}{10000.7.32}{CSLSLOAD}{63} @unnsubsecentry{help}{10000.7.33}{HELP}{63} @unnsubsecentry{seteditor}{10000.7.34}{SETEDITOR}{64} @unnsubsecentry{setlibloc}{10000.7.35}{SETLIBLOC}{64} @unnsubsecentry{setcslsloc}{10000.7.36}{SETCSLSLOC}{64} @unnsubsecentry{sethelploc}{10000.7.37}{SETHELPLOC}{64} @unnsubsecentry{settemploc}{10000.7.38}{SETTEMPLOC}{64} @unnsubsecentry{gc}{10000.7.39}{GC}{64} @unnsubsecentry{.setsegmentsize}{10000.7.40}{.SETSEGMENTSIZE}{65} @numchapentry{Control Structures}{8}{CONTROL STRUCTURES}{67} @numsecentry{Control}{8.1}{CONTROL}{67} @unnsubsecentry{run}{10000.1.1}{RUN}{67} @unnsubsecentry{runresult}{10000.1.2}{RUNRESULT}{67} @unnsubsecentry{repeat}{10000.1.3}{REPEAT}{67} @unnsubsecentry{forever}{10000.1.4}{FOREVER}{67} @unnsubsecentry{repcount}{10000.1.5}{REPCOUNT}{68} @unnsubsecentry{if}{10000.1.6}{IF}{68} @unnsubsecentry{ifelse}{10000.1.7}{IFELSE}{68} @unnsubsecentry{test}{10000.1.8}{TEST}{68} @unnsubsecentry{iftrue}{10000.1.9}{IFTRUE}{68} @unnsubsecentry{iffalse}{10000.1.10}{IFFALSE}{68} @unnsubsecentry{stop}{10000.1.11}{STOP}{69} @unnsubsecentry{output}{10000.1.12}{OUTPUT}{69} @unnsubsecentry{catch}{10000.1.13}{CATCH}{69} @unnsubsecentry{throw}{10000.1.14}{THROW}{69} @unnsubsecentry{error}{10000.1.15}{ERROR}{70} @unnsubsecentry{pause}{10000.1.16}{PAUSE}{70} @unnsubsecentry{continue}{10000.1.17}{CONTINUE}{70} @unnsubsecentry{wait}{10000.1.18}{WAIT}{71} @unnsubsecentry{bye}{10000.1.19}{BYE}{71} @unnsubsecentry{.maybeoutput}{10000.1.20}{dMAYBEOUTPUT}{71} @unnsubsecentry{goto}{10000.1.21}{GOTO}{71} @unnsubsecentry{tag}{10000.1.22}{TAG}{72} @unnsubsecentry{ignore}{10000.1.23}{IGNORE}{72} @unnsubsecentry{`}{10000.1.24}{back-quote}{72} @unnsubsecentry{for}{10000.1.25}{FOR}{72} @unnsubsecentry{do.while}{10000.1.26}{DOdWHILE}{73} @unnsubsecentry{while}{10000.1.27}{WHILE}{73} @unnsubsecentry{do.until}{10000.1.28}{DOdUNTIL}{73} @unnsubsecentry{until}{10000.1.29}{UNTIL}{73} @unnsubsecentry{case}{10000.1.30}{CASE}{74} @unnsubsecentry{cond}{10000.1.31}{COND}{74} @numsecentry{Template-based Iteration}{8.2}{TEMPLATE-BASED ITERATION}{74} @unnsubsecentry{apply}{10000.2.1}{APPLY}{76} @unnsubsecentry{invoke}{10000.2.2}{INVOKE}{76} @unnsubsecentry{foreach}{10000.2.3}{FOREACH}{76} @unnsubsecentry{map}{10000.2.4}{MAP}{77} @unnsubsecentry{map.se}{10000.2.5}{MAPdSE}{77} @unnsubsecentry{filter}{10000.2.6}{FILTER}{78} @unnsubsecentry{find}{10000.2.7}{FIND}{78} @unnsubsecentry{reduce}{10000.2.8}{REDUCE}{78} @unnsubsecentry{crossmap}{10000.2.9}{CROSSMAP}{79} @unnsubsecentry{cascade}{10000.2.10}{CASCADE}{79} @unnsubsecentry{cascade.2}{10000.2.11}{CASCADEd2}{81} @unnsubsecentry{transfer}{10000.2.12}{TRANSFER}{81} @numchapentry{Macros}{9}{MACROS}{83} @unnsecentry{.macro}{10000.1}{dMACRO}{83} @unnsubsecentry{.defmacro}{10000.1.1}{dDEFMACRO}{85} @unnsubsecentry{macrop}{10000.1.2}{MACROP}{85} @unnsubsecentry{macroexpand}{10000.1.3}{MACROEXPAND}{85} @numchapentry{Error Processing}{10}{ERROR PROCESSING}{87} @numsecentry{Error Codes}{10.1}{ERROR CODES}{87} @numchapentry{Special Variables}{11}{SPECIAL VARIABLES}{89} @unnsecentry{allowgetset}{10000.1}{ALLOWGETSET}{89} @unnsubsecentry{buttonact}{10000.1.1}{BUTTONACT}{89} @unnsubsecentry{caseignoredp}{10000.1.2}{CASEIGNOREDP}{89} @unnsubsecentry{commandline}{10000.1.3}{COMMANDLINE}{89} @unnsubsecentry{erract}{10000.1.4}{ERRACT}{89} @unnsubsecentry{fullprintp}{10000.1.5}{FULLPRINTP}{90} @unnsubsecentry{keyact}{10000.1.6}{KEYACT}{90} @unnsubsecentry{loadnoisily}{10000.1.7}{LOADNOISILY}{90} @unnsubsecentry{printdepthlimit}{10000.1.8}{PRINTDEPTHLIMIT}{90} @unnsubsecentry{printwidthlimit}{10000.1.9}{PRINTWIDTHLIMIT}{90} @unnsubsecentry{redefp}{10000.1.10}{REDEFP}{91} @unnsubsecentry{startup}{10000.1.11}{STARTUP}{91} @unnsubsecentry{unburyonedit}{10000.1.12}{UNBURYONEDIT}{91} @unnsubsecentry{usealternatenames}{10000.1.13}{USEALTERNATENAMES}{91} @unnsubsecentry{logoversion}{10000.1.14}{LOGOVERSION}{91} @unnsubsecentry{logoplatform}{10000.1.15}{LOGOPLATFORM}{91} @numchapentry{Internationalization}{12}{INTERNATIONALIZATION}{93} @unnchapentry{INDEX}{10001}{INDEX}{97} ucblogo-6.1/docs/usermanual.dvi0000664000175000017500000215671013601426467014747 0ustar jjcjjc; TeX output 2019.12.27:091133G|papersize=8.5in,11in׍QNj cmbx12QBERKELEYqLOGO6.1 ,6K`y 3 cmr10Berk!eleyfLogoUserManual)cNff cmbx12cBrianffHarveỷ*ls2XQ cmr12i33͍GZNG cmbx12ZShortzConutentsG1)7InrtroSduction_32kgff cmmi12k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:T1G2)7DataStructurePrimitivresQ퍑32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:Ge9G3)7CommrunicationC32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: 19G4)7ArithmeticW32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: 29G5)7LogicalOpSerations32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: 35G6)7GraphicsX232k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:M37G7)7WVorkspaceManagemenrtu32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: 49G8)7ConrtrolStructures32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:667G9)7Macros32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: 83G10)7ErrorProScessing32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: 87G11)7SpSecialVVariables32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: o89G12)7Inrternationalization32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: h93GINDEX332k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: 97E33iii33͍GZTaGablezofConutents*33Gc132Intros3duction32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: twc1!G1.1 5Ov!erview> b> 3 cmmi10:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::sf1 33!G1.2 5Getter/SetterfVeariableSyn!tax:ۍ:::::::::::::::::::::::::::::::::KY2!G1.3 5En!teringfandLeavingLogo:ۍ::::::::::::::::::::::::::::::::::::p\5!G1.4 5Teok!enization f:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::633Gc232DataffStructurePrimitivesǍ32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: ?c9!G2.1 5Constructors<:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::O90Gw!ordo:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::w90Glist|:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::90Gsen!tence썑:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::490Gfput]:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::90Glput:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::90Garra!y.ߍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'90Gmdarra!y:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::d100Glisttoarra!y.:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::[u100Garra!ytolist.:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::[u100Gcom!bine:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::100Grev!erse͍:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::E100Ggensyml/:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::w10!G2.2 5DatafSelectors:ۍ:::::::::::::::::::::::::::::::::::::::::::::::: ?100G rstx؍:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 100G rsts덑:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::A3110GlastfW:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::110Gbut rst9:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::110Gbut rstsL:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::W110Gbutlast|:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::120GitemM:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::V120Gmditemn:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::a120Gpic!k6:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::120Gremo!veY:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::120Gremdupj5:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::|120GquotedO:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::{12!G2.3 5DatafMutators[:ۍ:::::::::::::::::::::::::::::::::::::::::::::::h120Gsetitem:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::cD120Gmdsetitem:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::a130G.set rstp:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 130G.setbfl3:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::z130G.setitemʔ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::L130Gpushw:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::130GpMopS:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::{130GqueueQ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::{140Gdequeue]:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::14=Giv5JBERKELEYfLOGO6.133͍!G2.4 5Predicates퍑:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::1414 330Gw!ordp ҍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::140Glistp#:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::k140Garra!ypEB:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::NJ140Gempt!ypM :ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::Q140Gequalp&:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::e140GnotequalpJ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::{150GbMeforep:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::K150G.eqx:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::-150Gmem!bMerpލ:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::g&150Gsubstringpk:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::: 160Gn!umbMerpg:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::w160Gvbarredp:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::%16!G2.5 5Queries&:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::160Gcoun!t&:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::f160Gascii$:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::k160Gra!wasciiƱ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::H160Gc!har:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::@?170Gmem!bMer:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::170Glo!wercase:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::_^170GuppMercase휍:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::o170Gstandoutp:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::170Gparse:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::_c180Grunparse^:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::1833Gc332Communicationj32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: c19!G3.1 5Teransmitters:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::_190Gprin!t:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)190Gt!ypMes:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::E190Gsho!w:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::%20!G3.2 5Receiv!ers:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::16200Greadlist::ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::200Greadw!ord鍑:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::0200Greadra!wlinel*:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::q200Greadc!harQ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::210Greadc!harsdd:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::210GshellEF:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::Ǎ21!G3.3 5FilefAccessFÍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::: 220Gsetpre xhI:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::220Gpre xCI:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::Ő220GopMenreadY:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::220GopMen!writeT:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::220GopMenappendy:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::230GopMen!update&:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::\230Gclosex:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::230GallopMen:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::230Gcloseall.ۍ:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::"230Gerase leư:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::H23bȍv33͍0Gdribble:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::24 330GnoMdribblep:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::X240Gsetread*:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::=240Gset!writeퟍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::o240Greader:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::cF250Gwriter|:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::250GsetreadpMos`}:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::250Gset!writepMos#&:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::n250GreadpMos;}:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::250GwritepMoshI:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::250Geofp:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::250G lepˍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::k26!G3.4 5TeerminalfAccessp:ۍ::::::::::::::::::::::::::::::::::::::::::::::260Gk!eypG/:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::w260GcleartextCD:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::ŋ260Gsetcursor:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::=H260Gcursor':ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::Z260GsetmarginsZ:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::260Gsettextcolorf:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::270Gincreasefon!t:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::270Gsettextsize?:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::4270GtextsizeQ:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::270Gsetfon!tt:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::280Gfon!t:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::2833Gc432Arithmetic32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: c29!G4.1 5NumericfOpMerationsZ*:ۍ::::::::::::::::::::::::::::::::::::::::::r290Gsum.ߍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::'290Gdi erencep:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::Y290Gmin!us:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::%290GproMducth:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::w290Gquotien!tō:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::k 290Gremainder|:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::300GmoMdulos:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::@300Gin!tU:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::{300Ground|:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::P300Gsqrtȍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"300GpMo!wer:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)300Gexp&!:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::i300Glog10ɍ:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::k300Gln:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::300Gsinʝ:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::L310Gradsin*:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::?310Gcos.ፑ:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::)310Gradcos<:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::310Garctan:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::L310GradarctanfM:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::310Giseq񋍑:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::s31Gvi5JBERKELEYfLOGO6.133͍0GrseqQꍑ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::231 33!G4.2 5NumericfPredicates :ۍ:::::::::::::::::::::::::::::::::::::::::::R320Glessp:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::320Ggreaterp:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::cB320Glessequalpڍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::!320Ggreaterequalpl&:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::n32!G4.3 5RandomfNum!bMersq:ۍ::::::::::::::::::::::::::::::::::::::::::::320Grandomj5:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::|320GrerandomE=:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::Dž33!G4.4 5Prin!tfFeormattinga:ۍ:::::::::::::::::::::::::::::::::::::::::::::A330GformCK:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::Œ33!G4.5 5Bit!wisefOpMerations:ۍ:::::::::::::::::::::::::::::::::::::::::::9330GbitandM :ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::S330Gbitor~:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::P330GbitxorY:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::330Gbitnot6:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::340GashiftU:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::340GlshiftU̍:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3433Gc532LogicalffOps3erations132k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: c35!GandSz:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::350Gor2Ǎ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::350Gnot:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::635Gc632Graphicsろ32k:Q 32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32:32: c37!G6.1 5TeurtlefMotione㍑:ۍ::::::::::::::::::::::::::::::::::::::::::::::::*370Gforw!ardfQ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::370Gbac!kn:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::f370Gleftݍ:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::D%380Grigh!tm:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::w380GsetpMos$:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::k380Gsetxy:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::cF380GsetxU΍:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::380Gset!y|:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::380GsetheadingE<:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::ǃ380Ghome덑:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::3380Garc2ƍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: 39!G6.2 5TeurtlefMotionQueries J:ۍ::::::::::::::::::::::::::::::::::::::::390GpMosl6:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::~390Gxcor:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::@>390Gycor:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::@>390Gheading <:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::390Gto!wards:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::390Gscrunc!hn:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::39!G6.3 5TeurtlefandWindo!wControlK:ۍ::::::::::::::::::::::::::::::::::390Gsho!wturtlehF:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::390GhideturtleS:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::400vii33͍0Gclean6:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::40 330Gclearscreen:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::400Gwrap:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::400Gwindo!w&:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::c400Gfence]:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::400G lln":ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::i410G lledc:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::T410GlabMelR:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::{410GsetlabMelheigh!tfG:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::410GtextscreenQߍ:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::'410Gfullscreen&:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::8m410Gsplitscreenl:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::: 420Gsetscrunc!h[:ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::0420Grefresh7:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::420GnorefreshM:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::D42!G6.4 5TeurtlefandWindo!wQueriesj:ۍ::::::::::::::::::::::::::::::::::420Gsho!wnpl0:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::::::x430GscreenmoMdehE:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::430GturtlemoMde:ۍ:::::::::::::::::::::::::::::::::::::::::::::::::::::)430GlabMelsize :ۍ::::::::::::::::::::::::::::::::::::::::::::::::::::::::.GThisisaprogramthatisstillbMeingwritten.?Man!ythingsaremissing,includingadequateGdoMcumen!tation.TThis_manualassumesthat_youalreadyknow_howtoprogramin_Logo,mandGmerelyfpresen!tsthedetailsofthisnewimplementation.GReadComputerScienceLogoSt!yle,Veolume1:rSymbMolicComputingbyBrianHarvey(MITGPress,f1997)foratutorialonLogoprogrammingwithemphasisonsym!bMoliccomputation.GHerefarethespMecialfeaturesofthisdialectofLogo:!ff.Sourcef lecompatibleamongUnix,DOS,Windo!ws,andMacplatforms.ff.Random-accessfarra!ys..Veariablefn!umbMerofinputstouser-de nedprocedures..Mutatorsfforliststructure(dangerous)..P!ausefonerror,andotherimprovementstoerrorhandling..Commen!tsfandcontinuationlines;formattingispreservedwhen 33.proMcedurefde nitionsaresa!vedforedited..Teerrapin-st!yleftokenization(e.g.,[2+3]isalistwithonemembMer).butfLCSI-st!ylesyntax(nospMecialformsexceptTO).LThebestof.bMothfw!orlds..First-classfinstructionandexpressiontemplates(seeAPPLeY)..Macros.33GFeeaturesN 8 & 3 cmb10notN!foundinBerk!eleyLogoincluderobMotics,xm!usic,xanimation,parallelism,andGm!ultimedia.Feorfthose,buyacommercialversion.G284BERKELEYfLOGO6.133͍Gc1.2Getter/Setterf@VfariableSyntax33GLogoWdistinguishesproMcedures#fromvdDariables.AUprocedureisasetofXinstructionstocarry 33Gout"some"computation;aEavdDariableisanamedcon!tainerthatholdsadatavdDaluesuc!hasaGn!umbMer,fword,list,orarraye.33GInhtraditionalgLogosyn!tax,'anon-numericgwordtypMedgwithoutpunctuationrepresen!tsaGrequest! toin!voke! theproMcedurenamedb!y! thatword. MA wordtypMedwithaprecedingGquotationfmarkrepresen!tstheworditself.Feorexample,intheinstruction.PRINTFIRST"WORDGtheproMceduresnamedFIRSTandPRINTarein!voked,XbuttheproMcedurenamedW!ORD+isGnotfin!voked;thewordW-O-R-D8istheinputtoFIRST.GWhatabMoutvdDariables?Therearet!wothingsonecandowithavdDariable:.giv!eitavdDalue,"andG ndȴoutitsvdDalue.DTeogiv!eavariableaȳvalue,HLogopro!videsȳtheprimitiveproMcedureMAKE,Gwhic!hjrequirestwoinputs:thenameofthejvdDariableandthenewvaluetobMeassigned.ɽTheG rst.input,Fthename.ofthevdDariable,Fisjustaw!ord,Fandif(asisalmostalw!ays.thecase)theGprogrammerHw!antsHtoassignavdDaluetoaspMeci cvdDariablewhosenameiskno!wninadvdDance,Gthatfinputisquoted,justasan!yknownspMeci cwordwouldbMe:.MAKE"MY.VARFIRST"WORDGgiv!esfthevdDariablenamedMY.VARthevalueW(the rstletterofWORD).GTeoZ! ndZ"thevdDalueofavdDariable,icLogopro!videstheprimitiv!eproMcedureTHING,ibwhic!htakesZ!aGvdDariableInameIasitsinput,\PandoutputsthevdDalueoftheaccessiblevdDariablewiththatname.GTh!us.PRINTTHING"MY.VARGwillKprin!tW(suppMosingtheMAKEabo!veKhasbeendone).͝Since ndingthevdDalueofaspe-Gci c,kno!wn vdDariablenameissuchacommonopMeration,LogoalsoprovidesanabbreviatedGnotationfthatcom!binesTHINGwithquote:.PRINT:MY.VARGThedcolon(whic!hLogoold-timerspronounce"dots")dreplacesTHINGand"intheearlierGv!ersionfoftheinstruction.GNew!comerstoLogooftencomplainabMouttheneedforallthispunctuation.~?Inparticular,GLogo;programmersinwhichcasethesameGnamepcanqbMeusedbothqforaprocedureandqforavdDariable,orthegetter/setternotation,inGwhic!havdDariableFOOisasetwithSETFOOandexaminedwithFOO,obutthesamenamecan'tbMeGusedfforproMcedureandvdDariable.GHere is ho!wthisc!hoiceisallo!wed:Berkeley Logousestraditionalnotation,;withproMceduresGdistinctfromvdDariables.usuallyctrl-Cctrl-QRcommand-.(period).pause3alt-P>usuallyctrl-\ctrl-WRcommand-,(comma)GIfey!ouhaveaneenvironmentvdDariablecalledLOGOLIBwhosevalueistheenameofadirectorye, 33GthenLogowillusethatdirectoryinsteadofthedefaultlibrarye.Ify!ouinvokeaproMcedureGthatphasonotbMeende ned,6nLogo rstloMoksfora leinthecurren!tdirectorynamed=. Notethatw!ordsfollowingKcolonsGareinthiscategorye.Notethatquoteandcolonarenotdelimiters.Eac!hin xopMeratorGc!haracter5His5Gaword5Ginitself,Xexceptthatthet!wo-charactersequences5H<=,X>=,Yand<>(theGlatterfmeaningnot-equal)withnoin!terveningfspacearerecognizedasasinglew!ord.GA8w!ordpconsistingofaqquestionmarkfollowedbyanumbMer(e.g.,?37),whenrunparsedG(i.e.,fwhereaproMcedurenameisexpected),istreatedasifitw!erethesequence.(?37)Gmakingthen!umbMeraninputtothe? procedure. (Seethediscussionoftemplates,dbelo!w.)GThis3spMecialtreatmen!tdoesnot4applytow!ordsreadasdata,towordswithanon-numbMerGfollo!wingfthequestionmark,orifthequestionmarkisbackslashed.GAJLlineJv(aninstructionlineoronereadb!yREADLISTorREADWORD)canbMecontinuedontoGthe1Dfollo!wing1Clineifitslastc!haracterisatilde(~).~vREADWORDpreserv!esthetildeandtheGnewline;fREADLISTdoMesnot.GLinesfreadwithREADRAWLINEarenev!ercontinued.GAnA/instructionA.lineoralinereadb!yREADLIST(butnotb!yREADWORD)isautomaticallycon-Gtin!uedtothenextline,asifendedwithatilde,ifthereareunmatc!hedbrackets,parentheses,Gbraces,orv!erticalbarspMending.However,it'sanerrorifthecontinuationlinecontainsonlyGthew!ordEND;thisistopreventrunawayproMcedurede nitions.LinesexplicitlycontinuedGwithfatildea!voidfthisrestriction.GIfCaClinebMeingt!ypedCinteractivelyConthekeybMoardCiscontinued,_eitherCwithatildeorGautomaticallye,fLogowilldispla!yatildeasapromptcharacterforthecontinuationline.6GChapterf1:In!troMduction82P733͍GA0semicolonwbMeginsvacommen!tinaninstructionline.Logoignoresc!haractersfromthe 33Gsemicolontotheendoftheline. Atildeasthelastc!haracterstillindicatesacontinuationGline,fbutnotacon!tinuationfofthecommen!t.Feorexample,typingtheinstruction33.print"abc;comment~.defGwill|)prin!tthe|*wordabcdef.ztSemicolonhasnospMecial|*meaningindatalinesreadb!yREADWORDGorW~READLIST,gFbutsuc!halinecanlaterW}bMereparsedusingRUNPARSEandthencommentswillGbMefrecognized.GThe5ft!wo-charactersequence5e#!atthebMeginningofalinealsostartsacommen!t.2UnixusersGcanfthereforewritea lecon!tainingLogocommands,startingwiththeline.#!/usr/local/bin/logoG(or'wherev!er'yourLogo'executablelives)'andthe lewillbMeexecutabledirectlyfromtheGshell.GTeoincludeanotherwisedelimitingc!haracter(includingsemicolonortilde)inaword,pre-Gcede-itwithbac!kslash(\).qIfthelastcharacterofaline-isabackslash,NthenthenewlineGc!haracterfollowingthebackslashwillbMepartofthelastw!ordontheline,^andthelineGcon!tinuesUontothefollowingline.Teoincludeabackslashinaword,e`use\\.Ifthecombina-Gtionbac!kslash-newlineisenteredattheterminal,aLogowillissueabac!kslashasapromptGc!haracterforthecontinuationline.&AllofthisappliestodatalinesreadwithREADWORDorGREADLISTfasw!ellastoinstructionlines.GAlinereadwithREADRAWLINEhasnospMecialquotingmec!hanism;ıbMothbackslashandv!er-Gticalfbar(describMedbelo!w)arejustordinarycharacters.GAnalternativ!enotationtoincludeotherwisedelimitingcharactersinwordsistoencloseaGgroupofc!haractersinv!erticalbars.4AllcharactersbMetweenverticalbarsaretreatedasifGtheyw!ereletters.IndatareadwithREADWORDtheverticalbarsarepreservedintheresultingGw!ord.jIn"datareadwith#READLIST(orresultingfromaPARSEorRUNPARSEofaw!ord)theGv!erticalGbarsFdonotappMearexplicitly;allpoten!tiallyFdelimitingcharactersF(includingspaces,Gbrac!kets,^parentheses,andLin xopMerators)LappearLunmark!ed,buttok!enizedasLthoughtheyGw!ereletters.TWithinverticalbars,backslashmaystillbMeused;theonlycharactersthatGm!ustfbMebackslashedinthiscontextarebackslashandverticalbarthemselves.GCharactersen!teredbMetweenverticalbarsareforeverspMecial,evenifthewordorlistcontain-GingxFthemxEislaterreparsedwithPARSEorRUNPARSE.}Characterst!ypMedafterabac!kslashareGtreated7somewhat7di eren!tly:AWhenaquotedw!ordcontaining7abackslashed7characterisGrunparsed,Tthe@0bac!kslashed@1characterloses@0itsspMecialqualityand@0actsthereafterasift!ypMedGnormallye.This@distinctionisimpMortan!tonly@ifyouarebuildingaLogoexpressionoutofGparts,ftobMeRUNlater,andw!antftouseparen!theses.Feorexample,.PRINTRUN(SE"\(2"+3"\))Gwillfprin!t5,but.RUN(SE"MAKE""|(|2)F(G884BERKELEYfLOGO6.133͍GwillcreateavdDariablewhosenameisopMen-paren!thesis.ݦ(Eachexamplewouldfailifv!ertical 33Gbarsfandbac!kslasheswereinterchanged.)33GAdnormallydelimitingc!haracterenteredwithinverticalbarsisEQUALPtothesamecharacterGwithoutthev!erticalbars,DbutcanbMedistinguishedb!ytheVBARREDPpredicate.(Ho!wever,GVBARREDP3returnsTRUEonly2forc!haractersforwhichspMecialtreatmentisnecessary:Cwhite-Gspace,paren!theses,brackets,in xcopMerators,backslash,verticalcbar,tilde,quote,questionGmark,fcolon,andsemicolon.) U86e933͍GZ2 QDatazStructurePrimitivues(DFGc2.1ConstructorsmGmN # cmbx12mword3.WORDword1word2 33.(WORDword1word2word3...)33Goutputsfaw!ordformedbyconcatenatingitsinputs.lGmlist.LISTthing1thing2.(LISTthing1thing2thing3...)33GoutputsFaGlistwhosemem!bMersareitsinputs,>whic!hcanbMean!yLogodatum(w!ord,?list,>orGarra!y).mGmsentence.SENTENCEthing1thing2.SEthing1thing2.(SENTENCEthing1thing2thing3...).(SEthing1thing2thing3...)33Goutputs alistwhosemem!bMersareits inputs,'ifthoseinputsarenotlists,orthemem!bMersGoffitsinputs,ifthoseinputsarelists.mGmfput.FPUTthinglist33Goutputswaxlistequaltoitssecondinputwithoneextramem!bMer,h{the rstinput,h{attheGbMeginning.+IfNthesecondinputisaw!ord,xthenthe rstinputmustbMeaone-letterword,GandfFPUTisequivdDalen!ttoWORD.lGmlput.LPUTthinglist33Goutputskajlistequaltoitssecondinputwithoneextramem!bMer,the rstinput,attheend.GIfthing2GoutputsFALSEiftheinputsareequal,hTRUEotherwise. SeeEQUALPforthemeaningofGequalit!yffordi erentdatatypMes.Gmbieforep3.BEFOREPword1word2.BEFORE?word1word2GoutputsTRUEifw!ord1comesbMeforeword2inASCIMIecollatingsequence(forwordsofletters,GinlalphabMeticalkorder).Case-sensitivit!yisdeterminedb!ythevdDalueofCASEIGNOREDP.NoteGthat^ iftheinputsaren!umbMers,lthe^ resultma!ynotbethesame^ aswithLESSP;v*forexample,GBEFOREP312ZisffalsebMecause3collatesafter1.GSeef[CASEIGNOREDP],page89,,[LESSP],page32,Gm.eq3..EQthing1thing2GoutputsTRUEifitst!woinputsarethesamedatum,sothatapplyingam!utatortoonewillGc!hangeftheotheraswell.OutputsFALSEotherwise,eveniftheinputsareequalinvdDalue.GWȈARNING:Primitiv!eswhosenamesstartwithapMeriodaredangerous.VTheirusebynon-GexpMertsisnotrecommended.Theuseofm!utatorscanleadtocirculardatastructures,Gin nitefloMops,orLogocrashes.Gmmembierp3.MEMBERPthing1thing2.MEMBER?thing1thing2Gifthing2Pisalistoranarra!ye,outputsTRUEifthing1isEQUALPtoamem!bMerofthing2,FALSEGotherwise.Ifthing2Pisaw!ord,outputsTRUEifthing1Oisaone-c!haracterwordEQUALPtoaGc!haracterfofthing2,FALSEotherwise.GSeef[EQUALP],page14,.G163)BERKELEYfLOGO6.133͍Gmsubstringp3.SUBSTRINGPthing1thing2 33.SUBSTRING?thing1thing233Gifthing1orthing2isalistoranarra!ye,CoutputsFALSE.TIfthing2isaw!ord,CoutputsTRUEGiffthing1isEQUALPtoasubstringofthing2,FALSEotherwise.GSeef[EQUALP],page14,.Gmnumbierp3.NUMBERPthing.NUMBER?thingGoutputsfTRUEiftheinputisan!umbMer,fFALSEotherwise.Gmvbarredp3.VBARREDPchar.VBARRED?char.BACKSLASHEDPchar5(libraryprocedure).BACKSLASHED?char5(libraryprocedure)GoutputsTRUEiftheinputc!haracterwasoriginallyenteredintoLogowithinverticalbars(|)Gto5prev!ent6itsusualspMecialsyntactic6meaning,FALSEotherwise.(OutputsTRUEonlyiftheGc!haracterfisabackslashedspace,tab,newline,oroneof()[]+-*/=<>":;\~?|)GThe enames dBACKSLASHEDPandBACKSLASHED?areincludedintheLogolibraryforbac!kwardGcompatibilit!y/with/theformernamesofthisprimitiv!e,GalthoughitdoMesnot9outputTRUEforGc!haractersforiginallyenteredwithbackslashes. #sGc2.5QueriesGmcount3.COUNTthingGoutputsthen!umbMerofcharactersintheinput,֟iftheinputisaword;DoutputsthenumbMerGof4mem!bMers3intheinput,'ifitisalistoranarra!ye.F(For4anarra!y,'this4mayormay3notbMeGthefindexofthelastmem!bMer,dependingonthearra!y'sorigin.)Gmascii3.ASCIIcharGoutputsthein!teger(bMetween0and255)thatrepresentstheinputcharacterintheASCIMIGcoMde.IIn!terpretstcontroltcharactersastrepresentingvbarredtpunctuation,andreturnstheGc!haractercoMdeforthecorrespondingpunctuationc!haracterwithoutv!erticalbars.(CompareGRAWASCII.)Gmrawascii3.RAWASCIIchar䍟GChapterf2:DataStructurePrimitiv!es1733͍Goutputsthein!teger(bMetween0and255)thatrepresentstheinputcharacterintheASCIMI 33GcoMde.ΈIn!terpretsxhcontrolcharactersxgasrepresentingthemselves.ΈTeo ndoutxgtheASCIMIx\codeGoffanarbitraryk!eystroke,fuseRAWASCIIRCB.#؍Gmchar3.CHARint33Goutputsjtheic!haracterrepresentediintheASCIMI>codeb!yjtheinput,whichimustbMeianintegerGbMet!weenf0and255.GSeef[ASCIMI],page16,.#؍Gmmembier3.MEMBERthing1thing2GifZthing29isaZw!ordorlistandifMEMBERPwiththeseinputsw!ouldoutputTRUE,ioutputstheGpMortionx|ofx}thing2Wfromthe rstinstanceofthing1Wtotheend.T IfMEMBERPw!ouldoutputGFALSE,joutputsCYtheCXempt!ywordorlistCYaccordingtothetypMeofCYthing2.ItisanerrorforGthing2tofbMeanarra!ye.GSeef[MEMBERP],page15,.#ٍGmlowercase3.LOWERCASEwordGoutputsqacop!yoftheinputword,RbutwithalluppMercaseletterschangedtothecorrespMondingGlo!wercasefletter.#؍Gmuppiercase3.UPPERCASEwordGoutputsacop!yoftheinputword,4butwithalllowercaseletterschangedtothecorrespMondingGuppMercasefletter.#؍Gmstandout3.STANDOUTthingGoutputsaw!ordthat,whenprinted,willappMearliketheinputbutdisplayedinstandoutGmoMde(boldface,urev!ersevideo,uorwhateveryourversiondoMesforstandout). 5uThewordGcon!tainsmachine-spMeci cmagiccharactersatthebMeginningandend;Binbet!weenistheGprin!tedRformR(asifdisplayedusingRTYPE)oftheinput.Theoutputisalw!aysRaw!ord,cevenRifGtheginputisofsomeothert!ypMe,tNbutgitmayincludespacesandotherformattingcharacters.GNote:%aw!ordoutputbySTANDOUTwhileLogoisrunningononemac!hinewillprobablynotGha!vefthedesirede ectifprin!tedonanothertypMeofmachine.GInxthex Macin!toshclassicversion,athewaythatstandoutx worksisincompatiblewithx theuseGof|c!haracterswhose|ASCIMI|{code|isgreaterthan127.Therefore,y!ouhavea|choicetomake:GThefinstruction.CANINVERSE0G183)BERKELEYfLOGO6.133͍Gdisablesfstandout,butenablesthedispla!yofASCIMIcodesabo!vef127,andtheinstruction33.CANINVERSE1GrestoresE[thedefaultsituationinwhic!hstandoutisenabledandtheextragraphiccharacters 33GcannotfbMeprin!ted.Gmparse3.PARSEwordGoutputs\thelistthatw!ouldresultiftheinput\wordwereenteredinrespMonsetoaREADLISTGopMeration.{Thatis,GPARSEREADWORDUhasthesamevdDalueasREADLISTforthesamec!haractersGread.GSeef[READLIST],page20,,[READ!WORD],fpage20,Gmrunparse3.RUNPARSEwordorlistGoutputs2the2listthatw!ouldresultiftheinputw!ordorlistw!ereenteredas2aninstructionGline;8c!haracterssuchasin xopMeratorsandparenthesesareseparatemembMersoftheoutput.GNotefthatsublistsofarunparsedlistarenotthemselv!esrunparsed.ߍ1933͍GZ3 QCommuunication(#Gc3.1Tfransmitters33GNote:IfathereisavdDariablenamedPRINTDEPTHLIMITwithanonnegativ!eintegervdDalue, 33Gthencomplexlistandarra!ystructureswillbMeprin!tedonlytotheallo!weddepth.XThatis,Gmem!bMersMofmembMersof...0ofmembMerswillbeLallo!wedMonlysofar.0Themem!bersomittedGbMecauseqtheyqarejustpastthedepthlimitareindicatedb!yanellipsisforeac!hone,soaGtoMo-deepflistoft!wofmembersfwillprin!tas[......]7c`.33GIfthereisavdDariablenamedPRINTWIDTHLIMITwithanonnegativ!eintegervdDalue,*thenonlyGthe rstsoman!ymembMersofanyarrayorlistwillbMeprinted.AsingleellipsisreplacesallGmissing6data6withinthestructure.Thewidthlimitalsoappliestothen!umbMerof6charactersGprin!tedinaword,qexceptthataPRINTWIDTHLIMITbMet!ween0and9willbMetreatedasifitGw!ere10whenappliedtow!ords.Thislimitappliesnotonlytothetop-lev!elprinteddatumGbutftoan!ysubstructureswithinit.GSeef[PRINTDEPTHLIMIT],page90,,[PRINTWIDTHLIMIT],page90,GIf[,thereisa[-vdDariablenamedFULLPRINTPwhosevalueis[-TRUE,j7thenw!ords[,thatwerecreatedGusingNbac!kslashMorverticalMbar(toincludec!haractersthatw!ouldotherwisenotbMetreatedasGpartdZofd[aw!ord)areprin!tedwiththebac!kslashesorv!erticalbarssho!wn,qsothattheprin!tedGresultacouldbMere-readb!yLogotoproducethesamevdDalue.IfFULLPRINTPisTRUEthentheGempt!yfword(howeveritwascreated)printsas||.(Otherwiseitprintsasnothingatall.)GSeef[FULLPRINTP],page90,. Gmprint3.PRINTthing.PRthing.(PRINTthing1thing2...).(PRthing1thing2...)Gcommand.пPrin!ts the inputorinputstothecurren!twritestream(initiallythescreen).пAllGthe*#inputs*"areprin!tedonasingleline,Kseparatedb!yspaces,endingwitha*"newline.iIfanGinputVisUalist,squarebrac!ketsVarenotprin!tedaroundit,butbrac!ketsVareprintedVaroundGsublists.Bracesfarealw!aysfprintedaroundarrays. Gmtypie3.TYPEthing.(TYPEthing1thing2...)Gcommand.Prin!tstheinputorinputslikePRINT, >exceptthatnonewlinecharacterisprintedGattheendandm!ultipleinputsarenotseparatedb!yspaces.ќNote:}printingtothescreenisGordinarilylinebu erednR;/thatis,Othec!haractersyouprintusingTYPEwillnotactuallyappMearGonGmshow3.SHOWthing.(SHOWthing1thing2...)Gcommand.DPrin!tstheinputorinputslikePRINT, exceptthatifaninputisalistitisprin!tedGinsidefsquarebrac!kets.GSeef[PRINT],page19,.7܍Gc3.2Receivers%>Gmreadlist3.READLIST.RLGreadsalinefromthereadstream(initiallythek!eybMoard)andoutputsthatlineasalist.TheGline7Mis7Nseparatedin!tomembMers7Masthoughitw!eretypMed7Minsquarebrac!kets7Minaninstruction.GIf4Athe4Breadstreamisa le,Kandtheendof leisreac!hed,KREADLISToutputstheempt!ywordG(not')theempt!ylist).tREADLISTproMcessesbackslash,@verticalbar,@andtildecharactersintheGread/stream;the.outputlistwillnotcon!tainthesec!haractersbuttheywillha!vehad/theirGusualfe ect.READLISTdoMesnot,ho!wever,ftreatsemicolonasacommen!tcharacter.%=Gmreadword3.READWORD.RWGreadsLalinefromMthereadstreamandoutputsthatlineasaw!ord.TheoutputisasingleGw!ord.even/ifthelinecon!tainsspaces,abrackets,`etc.t6Ifthe/readstreamisa le,aandtheGendP of leisreac!hed,zrREADWORDoutputstheemptylist(nottheemptyword).READWORDGproMcesses|,bac!kslash,verticalbar,andtildecharacters|-inthereadstream._0InthecaseofGatildeusedforlinecon!tinuation,2theoutputworddopesincludethetildeandthenewlineGc!haracters,iso5that4theuserprogramcantellexactlywhattheuserentered.JVeerticalbarsGinGmreadrawline3.READRAWLINEGreadsLalinefromMthereadstreamandoutputsthatlineasaw!ord.TheoutputisasingleGw!ordnevennifthelinecon!tainsspaces,ybrackets,etc.@Ifnthenreadstreamisa le,yandtheendGoff? leisf>reac!hed,sREADRAWLINEoutputstheempt!ylist(nottheemptyf>word).{READRAWLINE9GChapterf3:Comm!unication"m2133͍Goutputstheexactstringofc!haractersastheyappMearintheline,withnospMecialmeaning 33Gforfbac!kslash,verticalbar,tilde,oranyotherformattingcharacters.33GSeef[READ!WORD],page20,.LύGmreadchar3.READCHAR.RCGreadsasinglec!haracterfromthereadstreamandoutputsthatc!haracterasaw!ord.IftheGreadLstreamisa le,andtheendof leMisreac!hed,READCHARoutputstheempt!ylist(nottheGempt!y0word).$otherOPENvdDarian!ts,will>acceptasinputat!wo-element=list,@3inGwhic!h6the6 rstelementmust6bMeavdDariablename,Landthesecondm!ustbMeapMositiv!einteger.GA~c!haracter~bu erof~thespMeci edsizewillbe~created.ЩWhenaSETWRITEisdonewiththisGsameflist(inthesenseof.EQ,notacop!ye,soyoumustdosomethinglike.?make"buf[foo100].?openwrite:buf.?setwrite:bufED[...].?close:bufGChapterf3:Comm!unication"m2333͍Gandfnotjust33.?openwrite[foo100] 33.?setwrite[foo100]Gand̐sȏon),theprin!tedcharactersarestored̑inthebu er;ߥwhenaCLOSEisdonewiththeGsamelistasinput,thec!haractersfromthebu er(treatedasonelongw!ord,evenifspacesGandfnewlinesareincluded)bMecomethevdDalueofthespeci edvdDariable.Gmopienappend3.OPENAPPENDfilenameGcommand.ROpMensthenamed leforwriting.RIfthe lealreadyexists,thewritepMositionisGinitiallyfsettotheendoftheold le,sothatnewlywrittendatawillbMeappendedtoit.Gmopienupdate3.OPENUPDATEfilenameGcommand.vOpMens.the.named leforreadingandwriting.vThereadandwritepMositionisGinitiallyVHsettotheendoftheold le,@ifan!ye.Note:=eachVHopMen lehasonlyoneposition,GforwbMothwreadingandwriting.KIfa leopMenedforupdateiswbothREADERandWRITERwattheGsame$_time,>`then$^SETREADPOSwillalsoa ectWRITEPOSandvicev!ersa.Also,>`ifyou$_alternateGreadingandwritingthesame le, y!oumustSETREADPOSbMetweenawriteandaread, andGSETWRITEPOSfbMet!weenareadandawrite.GSeed[READER],pagec25,,[WRITER],paged25,,[SETREADPOS],page25,,[SETWRITE-GPOS],fpage25,Gmclose3.CLOSEfilenameGcommand.LClosesUthenamed le.Ifthe lew!ascurrentlythereaderorwriter,TthentheGreaderforwriterisc!hangedtothefkeybMoardorscreen,asifSETREAD[]BJ*orSETWRITE[]GhadfbMeendone.Gmallopien3.ALLOPENGoutputsalistwhosemem!bMersarethenamesofall lescurren!tlyopMen.̤ThislistdoMesnotGincludefthedribble le,ifan!ye.Gmcloseall3.CLOSEALL(libraryprocedure)Gcommand.ClosesfallopMen les.AbbreviatesFOREACHALLOPEN[CLOSE?]GSeef[F!OREACH],page76,,[CLOSE],page23,Gmerase le.ERASEFILEfilename+G243)BERKELEYfLOGO6.133͍.ERFfilename33Gcommand.Erasesf(deletes,remo!ves)fthenamed le,whic!hshouldnotcurrentlybMeopen.hGmdribble3.DRIBBLEfilenameGcommand.jCreates anew lewhosenameistheinput,lik!eOPENWRITE,andbMeginsrecording 33Ginthat leev!erythingthatisreadfromthekeybMoardorwrittentotheterminal.Thatis,GthiswritingisinadditiontothewritingtoWRITER.>Thein!tentistocreateatranscriptofGafLogosession,includingthingslik!epromptcharactersandinteractions.33GSeef[OPENWRITE],page22,,[WRITER],page25,Gmnoidribble3.NODRIBBLEGcommand.Stopsfcop!yinginformationintothedribble le,andclosesthe le.Gmsetread3.SETREADfilenameGcommand.|Mak!esGtheGnamed lethereadstream,ousedforREADLIST,etc.}The lem!ust 33GalreadybMeopenwithOPENREADorOPENUPDATE.Iftheinputistheempt!ylist,:'thenthereadGstreambMecomesthek!eyboard,(asusual.:ChangingthereadstreamdoMesnotclosethe leGthatfw!aspreviouslythereadstream,soitispMossibletoalternatebet!weenf les.33GSeef[READLIST],page20,,[OPENREAD],page22,,[OPENUPD!AeTE],page23,Gmsetwrite3.SETWRITEfilenameGcommand.Mak!esthenamed lethewritestream,[usedforPRINT,[etc.The lem!ust 33Galready3bMeopen3withOPENWRITE,VOPENAPPEND,or3OPENUPDATE.oIftheinputistheempt!yGlist,%8then the writestreambMecomesthescreen,as usual.xHtmarginspaces,Aandonev!eryinvoMcation 33Gof{eSETCURSORthe{fmarginswillbMeaddedtotheinputxandycoMordinates.\(CURSORwillGrepMort5the5cursorposition5relativ!etothemargins,LsothatthisshiftwillbMein!visibletoLogoGprograms.)ThevpurpMoseofwthiscommandistoaccommoMdatethedispla!yofterminalscreensGin;lecture;hallswithinadequateTV;monitorsthatmissthetopandleftedgesofthescreen.33GSeef[SETCURSOR],page26,.35Gmsettextcolor3.SETTEXTCOLORforegroundbackground.SETTCforegroundbackgroundGcommand(wxWidgetsonly).Theinputsarecolorn!umbMers,orRGBXcolorlists,asforturtleGgraphics.Theforegroundandbac!kgroundcolorsforthetextscreen/splitscreentextwindo!wGarec!hangedtothegiv!envdDalues.Thechangea ectstextalreadyprin!tedasw!ellasfutureGtextfprin!ting;thereisonlyonetextcolorfortheentirewindow.GCommand{p(non-wxWidgetsWindo!ws{qandDOS{eextendedonly).ϋTheinputsarecolorn!um-GbMers,vasjforturtlejgraphics.Feutureprin!tingtothetextwindo!wwillusethespMeci edcolorsGfor:foreground:(thec!haractersprinted):andbackground:(thespaceunderthosec!harac-Gters).*qUsingSTANDOUTwillrev!erttothedefaulttextwindo!wcolors.*qIntheDOSextendedG(ucblogo.exe)v!ersion,colorsintextscreenmoMdearelimitedtonumbMers0-7,andthecol-Goringʁappliesonlytoʀtextprin!tedbytheprogram,ӇnottotheechoingofʀtexttypMedbytheGuser.A8NeitherlimitationappliestothetextpMortionofsplitscreenmoMde,:vwhic!hisactuallyGdra!wnfasgraphicsinternallye.GSeef[STeANDOUT],page17,.35Gmincreasefont3.INCREASEFONT.DECREASEFONTGcommand(wxWidgetsonly).sIncreaseordecreasethesizeofthefon!tusedinthetextandGeditfwindo!wstothenextlargerorsmalleravdDailablesize.34Gmsettextsize3.SETTEXTSIZEheightGcommandK(wxWidgetsonly).4SettheL"pMoin!tsize"ofthefon!tusedinthetextandeditGwindo!ws'to'~thegiven'~integerinput.a&Thedesired'~sizemay'~notbMea!vdDailable,Ginwhich'caseGthe;nearesta!vdDailable-(3+4).-3+43means>(-3)+4Gmproiduct3.PRODUCTnum1num2.(PRODUCTnum1num2num3...).num1*num2GoutputsftheproMductofitsinputs.Gmquotient3.QUOTIENTnum1num2.(QUOTIENTnum).num1/num2GoutputsU)thequotien!tU*ofitsinputs.'ThequotientoftwoU*integersisanintegerU*ifandonlyGifQthedividendisam!ultipleofthedivisor.(Inotherwords,|QUOTIENT52M8is2.5,|not2,Gbut?QUOTIENT42Lzuis?2,unot>2.0|itdoMestherigh!tthing.)(fWithasingleinput,uQUOTIENTGoutputsfthereciproMcaloftheinput.>G303)BERKELEYfLOGO6.133͍Gmremainder3.REMAINDERnum1num233GoutputsRtheSremainderondividingn!um1mbyRnum29;ZbMothmustSbMeintegersSandtheresultis 33Ganfin!tegerwiththesamesignasnum1.Gmmoidulo.MODULOnum1num2GoutputsRtheSremainderondividingn!um1mbyRnum29;ZbMothmustSbMeintegersSandtheresultis 33Ganfin!tegerwiththesamesignasnum2.Gmint.INTnumGoutputsM-itsM.inputwithfractionalpartremo!ved,vi.e.,vanM-integerwithM-thesamesignasthe 33Ginput,jwhose[absolute[vdDalueisthelargestin!tegerlessthanorequaltotheabsolutevdDalueofGthefinput.Gmround3.ROUNDnumGoutputsfthenearestin!tegertotheinput.Gmsqrt.SQRTnumGoutputsfthesquareroMotoftheinput,whic!hmustbMenonnegative.Gmpiower.POWERnum1num2Goutputsfn!um1tothenum2pMower.Ifnum1isnegative,thennum2mustbMeaninteger.Gmexp.EXPnumGoutputsfey(2.718281828+)totheinputpMo!wer.Gmlog10.LOG10numGoutputsfthecommonlogarithmoftheinput.Gmln.LNnumGoutputsfthenaturallogarithmoftheinput. MGChapterf4:Arithmetic:>3133͍Gmsin3.SINdegrees33Goutputsfthesineofitsinput,whic!histakenindegrees.uGmradsin.RADSINradiansGoutputsfthesineofitsinput,whic!histakeninradians.uGmcos.COSdegreesGoutputsfthecosineofitsinput,whic!histakenindegrees.uGmradcos.RADCOSradiansGoutputsfthecosineofitsinput,whic!histakeninradians.uGmarctan.ARCTANnum 33.(ARCTANxy)Goutputs the arctangen!t,#indegrees,ofits input. Witht!wo inputs,outputsthe arctangen!tGoffy/x,ifxisnonzero,or90or{90depMendingonthesignofye,ifxiszero.uGmradarctan3.RADARCTANnum.(RADARCTANxy)Goutputs the arctangen!t,#inradians,ofits input. Witht!wo inputs,outputs thearctangen!tGoffy/x,ifxisnonzero,orpi/2or{pi/2depMendingonthesignofye,ifxiszero.GThefexpression2*(RADARCTAN01)icanbMeusedtogetthevdDalueofpi.uGmiseq3.ISEQfromto(libraryprocedure)Goutputsfalistofthein!tegersfromfromtoto,inclusive..?showiseq37.[34567].?showiseq73.[76543]uGmrseq3.RSEQfromtocount(libraryprocedure)Goutputsfalistofcoun!tfequallyspacedrationalnumbMersbet!weenffromandto,inclusiv!e. &}G323)BERKELEYfLOGO6.133͍.?showrseq359 33.[33.253.53.7544.254.54.755].?showrseq355.[33.544.55]gGc4.2Numericf@PredicatesIGmlessp3.LESSPnum1num2.LESS?num1num2.num1num233GoutputsfTRUEifits rstinputisstrictlygreaterthanitssecond.IGmlessequalp.LESSEQUALPnum1num2.LESSEQUAL?num1num2.num1<=num233GoutputsfTRUEifits rstinputislessthanorequaltoitssecond.IGmgreaterequalp.GREATEREQUALPnum1num2.GREATEREQUAL?num1num2.num1>=num233GoutputsfTRUEifits rstinputisgreaterthanorequaltoitssecond.hGc4.3Randomf@Numbs3ersIGmrandom.RANDOMnum.(RANDOMstartend)33Gwith}one}input,outputsarandomnonnegativ!einteger}lessthanitsinput,whic!hmust}bMeaGpMositiv!efinteger.GWith\t!wo\inputs,kyRANDOMoutputsarandomin!tegergreaterthanorequaltothe rstinput,Gandlessthanorequaltothesecondinput.^Bothinputsm!ustbMeintegers,andthe rstGm!ustRbMeQlessthanthesecond.,(RANDOM09)M}uisequivdDalen!ttoRANDOM107aK;(RANDOM38)LEMisGequivdDalen!tfto(RANDOM6)+3H^.!-GChapterf4:Arithmetic:>3333͍Gmrerandom3.RERANDOM 33.(RERANDOMseed)33Gcommand.`Mak!es'$the'#resultsofRANDOMreproMducible.Ordinarily'$thesequenceofrandomGn!umbMersisdi eren!teachtimeLogoisused.~Ifyouneedthesamesequenceofpseudo-randomGn!umbMers repeatedlye,%@e.g.Ntodebugaprogram,sa!yRERANDOMbMeforethe rstinvoMcationofGRANDOM.Ify!ouneedmorethanonerepMeatablesequence,youcangiveRERANDOManintegerGinput;feac!hpMossibleinputselectsauniquesequenceofnumbMers.~Gc4.4Printf@FformattingGmform.FORMnumwidthprecision33Goutputsaw!ord containingaprin!tablerepresentationof num,pMossiblyprecededbyspacesG(andthereforenotan!umbMerforpurposesofpMerformingarithmeticopMerations),withatleastGwidthc!haracters,includingexactlyprecisiondigitsafterthedecimalpMoin!t.D(IfprecisionisG0fthentherewillbMenodecimalpoin!tintheoutput.)GAs9a9debuggingfeature,OQ(FORMnum-1formatgy)willprin!tthe oatingpMoint9numaccordingGtoftheCprin!tfformat,toallow.tohex:num.opform:num-1"|%08X%08X|.endGtoallo!w ndingouttheexactresultof oatingpMoin!toperations.]ThepreciseformatneededGma!yfbMemachine-depMendent.}Gc4.5Bitwisef@Ops3erationsGmbitand3.BITANDnum1num2.(BITANDnum1num2num3...)Goutputsfthebit!wiseandofitsinputs,whichmustbMeintegers.GSeef[AND],page35,.Gmbitor3.BITORnum1num2.(BITORnum1num2num3...)Goutputsfthebit!wiseoroofitsinputs,whichmustbMeintegers.GSeef[OR],page35,.Gmbitxor3.BITXORnum1num2"3͍G343)BERKELEYfLOGO6.133͍.(BITXORnum1num2num3...)33Goutputsfthebit!wiseexclusiveoroofitsinputs,whichmustbMeintegers.GSeef[OR],page35,.Gmbitnot3.BITNOTnumGoutputsfthebit!wisenotfofitsinput,whichmustbMeaninteger.GSeef[NOT],page35,.Gmashift3.ASHIFTnum1num2Goutputsn!um1Iarithmetic-shiftedtotheleftbynum2Ibits.Ifnum2Jisnegative,theshiftis 33Gtoftherigh!twithsignextension.TheinputsmustbMeintegers.Gmlshift3.LSHIFTnum1num2Goutputsn!um1logical-shiftedtotheleftbynum2bits.IIfnum2isnegative,theshiftisto 33Gthefrigh!twithzero ll.TheinputsmustbMeintegers.#inwhic!hcaseitistakenasanGexpression@ torun;thatexpressionm!ustproMduceaTRUEorFALSEvdDalue. ListexpressionsGareA4evdDaluatedA3fromlefttorigh!t;bassoMonasaFALSEvdDalueisfound,UqtheremaininginputsareGnotfexamined.Example:.MAKE"RESULTAND[NOT(:X=0)][(1/:X)>.5]Gtofa!voidthedivisionbyzeroifthe rstpartisfalse.GSeef[CASEIGNOREDP],page89,.Gmor3.ORtf1tf2.(ORtf1tf2tf3...)GoutputsTRUEifan!yinputisTRUE,otherwiseFALSE.$AllinputsmustbMeTRUEorFALSE.G(Comparisoniscase-insensitiv!eregardlessofthevdDalueofCASEIGNOREDP.Thatis,trueorGTrueorTRUEareallthesame.)AninputcanbMealist,>inwhic!hcaseitistakenasanGexpression@ torun;thatexpressionm!ustproMduceaTRUEorFALSEvdDalue. ListexpressionsGareevdDaluatedfromlefttorigh!t;assoMonasaTRUEvalueisfound,theremaininginputsareGnotfexamined.Example:.IFOR:X=0[some.long.computation][...]Gtofa!voidthelongcomputationifthe rstconditionismet.GSeef[CASEIGNOREDP],page89,.Gmnot3.NOTtfGoutputsKTRUEJiftheinputisFALSE,andvicev!ersa.TheinputcanbMealist,inwhic!hcaseGitfistak!enasanexpressiontorun;thatexpressionmustproMduceaTRUEorFALSEvdDalue.$@433%H3733͍GZ6 QGraphics$kGBerk!eleyLogoprovidestraditionalLogoturtlegraphicswithoneturtle.AMultipleturtles, 33Gdynamic=turtles,8andcollision>detectionarenotsuppMorted.cThisisthemosthardw!are-GdepMenden!tpartofLogo;Mssomefeaturesmayexistonsomemachinesbutnotothers.+Nev-Gertheless,9the|goal|hasbMeentomak!eLogoprogramsaspMortableaspMossible,9ratherthanGtotak!efullestadvdDantageofthecapabilitiesofeac!hmachine.\Inparticular,^LogoattemptsGtoscalethescreensothatturtlecoMordinates[{100{100]and[100100] tonthegraphicsGwindo!w,fandsothattheaspMectratiois1:1.33GThecen!terofthegraphicswindow(whichmayormaynotbMetheentirescreen,KdepMendingGon1themac!hineused)1isturtleloMcation[00].Positive1X1istotheright;wpMositiveY1isup.GHeadingsi'(angles)i(aremeasuredindegreescloMc!kwisefromthepMositiv!eYiaxis.s(Thisdi ersGfromthecommonmathematicalcon!ventionofmeasuringanglescoun!tercloMckwisefromtheGpMositiv!es{Xsnaxis.)Theturtleisrepresenteds|asanisoMcelestriangle;ttheactualturtlepositionGisKatthemidpMoin!tofthebase(theshortside).*However,#theturtleisdrawnonestepbMehindGitsJactualpMosition,ԂsothattheIdispla!yofthebaseoftheturtle'striangledoMesnotobscureGaflinedra!wnpMerpendicularftoit(aswouldhappMenafterdrawingasquare).GColorsare,ofcourse,hardw!are-depMendent.`However,Logoprovidespartialhardwareinde-GpMendencefb!yinterpretingcolornumbMers0through7uniformlyonallcomputers:.0 Tblack-P1blue32green3cyan.4 Tred9|5magenta"}6yellow(=7whiteGWherepMossible, Logopro!videsadditionaluser-settablecolors;!ho!wmanyareavdDailablede-GpMends¡on¢thehardw!areandopMeratingsystemen!vironment.If¡atleast16colorsarea!vdDailable,GLogoftriestopro!videuniforminitialsettingsforthecolors8-15:4F8 Tbrown-P9tan310forest"}11aqua.12 Tsalmon"}13purple14orange15greyGLogofbMeginswithablac!kbackgroundandwhitepMen. )捍Gc6.1Tfurtlef@MotionGmforward3.FORWARDdist.FDdistGmo!veswtheturtleforw!ard,inthedirectionthatit'sfacing,b!ythespMeci eddistance(measuredGinfturtlesteps).Gmback3.BACKdist.BKdistGmo!ves}@theturtlebac!kward,i.e.,exactly}@oppMositetothedirectionthatit'sfacing,b!ytheGspMeci edfdistance.(Theheadingoftheturtledoesnotc!hange.)&HɍG383)BERKELEYfLOGO6.133͍Gmleft3.LEFTdegrees 33.LTdegrees33GturnsWHtheturtleWGcoun!tercloMckwiseWHbythespMeci edWGangle,measuredindegrees(1/360ofaGcircle).JGmright.RIGHTdegrees.RTdegrees33GturnsftheturtlecloMc!kwisebythespMeci edangle,measuredindegrees(1/360ofacircle).JGmsetpios.SETPOSposGmo!vestheturtletoanabsolutepMositioninthegraphicswindo!w.Theinputisalistoft!wo 33Gn!umbMers,ftheXandYcoordinates.JGmsetxy.SETXYxcorycorGmo!vesbtheturtlebtoanabsolutepMositioninthegraphicswindo!w. Thetwobinputsare 33Gn!umbMers,ftheXandYcoordinates.IGmsetx.SETXxcorGmo!vesrGtherHturtlehorizon!tallyfromitsoldpMositiontoanewabsolutehorizon!talcoMordinate. 33GThefinputisthenewXcoMordinate.JGmsety.SETYycorGmo!vestheturtlev!erticallyfromitsoldpMositiontoanewabsoluteverticalcoMordinate.ԶThe 33GinputfisthenewYcoMordinate.JGmsetheading.SETHEADINGdegrees.SETHdegrees33Gturns^the]turtletoanewabsoluteheading.Theinputisan!umbMer,the^headingindegreesGcloMc!kwiseffromthepositiv!eYaxis.JGmhome.HOME33Gmo!vesftheturtletothecen!terofthescreen.EquivdDalenttoSETPOS[00]SETHEADING0.GSeef[SETPOS],page38,,See[SETHEADING],page38,.'U/GChapterf6:GraphicsC3933͍Gmarc3.ARCangleradius33Gdra!wsanarcofacircle,withtheturtleatthecenter,withthespMeci edradius,startingat 33Gthe Iturtle'sheadingandextendingcloMc!kwisethroughthespeci edangle.TheturtledoesGnotfmo!ve.OGc6.2Tfurtlef@MotionQueriesOGmpios.POS33Goutputsftheturtle'scurren!tpMosition,asalistoftwonumbMers,theXandYcoordinates.OGmxcor.XCOR(libraryprocedure)Goutputsfan!umbMer,ftheturtle'sXcoordinate.OGmycor.YCOR(libraryprocedure)Goutputsfan!umbMer,ftheturtle'sYcoordinate.OGmheading.HEADINGGoutputsfan!umbMer,ftheturtle'sheadingindegrees.OGmtowards.TOWARDSposGoutputsan!umbMer,&theheadingatwhic!htheturtleshouldbefacingsothatitw!ouldpoin!t 33Gfromfitscurren!tpMositiontothepositiongiv!enastheinput.OGmscrunch.SCRUNCHGoutputsalistcon!tainingtwonumbMers,theXձandYղscrunchfactors,asusedbySETSCRUNCH. 33G(ButfnotethatSETSCRUNCHtak!estwonumbMersasinputs,notonelistofnumbMers.)GSeef[SETSCR!UNCH],page42,.OGc6.3Tfurtlef@andWindowControlOGmshowturtle.SHOWTURTLE 33.STGmak!esftheturtlevisible.(\;G403)BERKELEYfLOGO6.133͍Gmhideturtle3.HIDETURTLE 33.HT33Gmak!es2Ithe2Hturtleinvisible. It'sa2HgoMod2Iideatodothiswhiley!ou'reinthemiddleofaGcomplicatedfdra!wing,bMecausehidingtheturtlespeedsupthedra!wingsubstantiallye.=rGmclean.CLEAN33Gerasesalllinesthattheturtlehasdra!wnonthegraphicswindo!w.Theturtle'sstate(pMosi-Gtion,fheading,pMenmode,etc.)isnotc!hanged.=rGmclearscreen.CLEARSCREEN.CS33Gerases\hthe\ggraphicswindo!wandsendstheturtletoitsinitialpMositionandheading.Lik!eGHOMEfandCLEANtogether.GSeef[HOME],page38,.=qGmwrap3.WRAPGtellstheturtletoen!terwrapmoMde:Feromnowon,-iftheturtleisaskedtomovepasttheGbMoundaryPofPthegraphicswindo!w,aitwill"wraparound"andreappMearattheoppMositeedgeGofthewindo!w.=ThetopedgewrapstothebMottomedge,9whiletheleftedgewrapstotheGrigh!tedge.(SothewindowistopMologicallyequivdDalenttoatorus.)Thisistheturtle'sinitialGmoMde.ComparefWINDOWandFENCE.GSeef[FENCE],page40,.=rGmwindow3.WINDOWGtellsrtherturtletoen!terwindowrmoMde:vFeromno!won,iftheturtleisask!edtomo!verpastGthebMoundary~ofthegraphicswindo!w,itwillmo!veo screen.}&Thevisiblegraphicswindo!wGis considered asjustpartofanin nitegraphicsplane;;theturtlecanbMean!ywhereontheGplane.(IfOy!ouNlosetheturtle,' HOMEwillbringitbac!ktothecen!terofthewindo!w.)CompareGWRAPfandFENCE.GSeef[HOME],page38,.=rGmfence3.FENCEGtells)theturtletoen!terfencemoMde:bFeromnowon,)Zifthe(turtleisaskedtomovepasttheGbMoundaryofthegraphicswindo!w,>ditwillmoveasfarasitcanandthenstopattheedgeGwithfan"outofbMounds"errormessage.CompareWRAPandWINDOW.)bэGChapterf6:GraphicsC4133͍GSeef[WRAP],page40,.Gm ll3.FILL33G llsinaregionofthegraphicswindo!wcontainingtheturtleandbMoundedb!ylinesthat 33Gha!ve8 bMeen8 drawnearlier.Thisis8 notpMortable;itdoesn't8 w!orkforallmac!hines,\sandmayGnotfw!orkexactlythesamewayondi erentmachines.Gm lled.FILLEDcolorinstructions33Grunsʼntheňinstructions,Qremem!bMeringallpoin!tsňvisitedbyturtleňmotioncommands,QstartingGandendingRwithZtheturtle'sinitialpMosition.'Thendra!ws(ignoringpenmode)theresult-GingEpMolygon,mbinEthecurren!tpencolor,mb llingthepolygonwiththegiv!enEcolor,mbwhichEcanGbMe{Ra{Scolorn!umber{Sor{RanR!GB{list.\TheinstructionlistcannotincludeanotherFILLEDGin!voMcation.(wxWidgetsfonly)Gmlabiel.LABELtext33Gtak!es2awordorlistasinput,andprints1theinputonthegraphicswindow,startingattheGturtle'sfpMosition.Gmsetlabielheight.SETLABELHEIGHTheight33Gcommand](wxWidgetsonly).Teak!esapMositive]integerargumentandtriesto]setthefontGsizefsogthatthec!haracterheightg(includingdescenders)isthatman!yturtlesteps.^ThisGwillbMedi eren!tfromthenumbMerofscreenpixelsifSETSCRUNCHhasbeenused.eAlso,noteGthatSETSCRUNCHc!hangesthefontsizetotrytopreserv!ethisheightinturtlesteps.qNoteGthatBthequeryopMerationcorrespondingtoAthiscommandisLABELSIZE,9notLABELHEIGHT,GbMecausefittellsy!outhewidthaswellastheheightofcharactersinthecurrentfont.Gmtextscreen.TEXTSCREEN.TS33GrearrangesthesizeandpMositionofwindo!wstomaximizethespacea!vdDailableinthetextGwindo!w(thewindowusedforinteractionwithLogo)..Thedetailsdi eramongmachines.GComparefSPLITSCREENandFULLSCREEN.GSeef[SPLITSCREEN],page42,.Gmfullscreen3.FULLSCREEN.FSGrearrangesBGthesizeBFandpMositionofwindo!wstomaximizethespacea!vdDailableinthegraphicsGwindo!w.Thefdetailsdi eramongmachines.CompareSPLITSCREENandTEXTSCREEN.*l3G423)BERKELEYfLOGO6.133͍GSincetherem!ustbMeatextwindo!wtoallo!wprinting(includingtheprin!tingoftheLogo 33Gprompt),^Logo9automatically9switc!hesfromfullscreentosplitscreenwhenev!eranything9isGprin!ted.33GInq"theq!DOSpv!ersion,switchingfromq"fullscreentosplitscreenlosesthepartofthepictureGthat'shiddenb!y thetextwindow.[Thisdesigndecisionfollowsfromthe scarcityofmemorye,GsoXthattheextraXmemorytoremem!bMeraninvisiblepartofaXdrawingseemstoMoexpensiv!e.]35Gmsplitscreen3.SPLITSCREEN.SSGrearrangesxEthesizexDandpMositionofwindo!wstoallo!wsomeroMomfortextin!teractionwhilealsoGk!eepingmostofthegraphicswindowvisible.KThedetailsdi eramongmachines.JCompareGTEXTSCREENfandFULLSCREEN.GSeef[TEXTSCREEN],page41,.34Gmsetscrunch3.SETSCRUNCHxscaleyscaleGadjusts?theaspMectratio?andscalingofthegraphicsdispla!ye.Afterthiscommandisused,GallfurtherturtlemotionwillbMeadjustedb!ymultiplyingthehorizontalandverticalextentGof%Bthemotion%Ab!ythetwonumbMersgiven%Aasinputs. ZqFeorexample,aftertheinstructionGSETSCRUNCH21g motion'ataheadingof45degreeswillmo!ve'twiceasfarhorizontallyGas6v!erticallye. 8If6yoursquaresdon't6comeoutsquare,trythis. 8(Alternativ!elye,you6canGdelibMeratelyfmisadjusttheaspectratiotodra!wanellipse.)GFeorCallDmoMderncomputers,bothDscalefactorsareinitially1.vFeorDOS0mac!hines,thescaleGfactorsareinitiallysetaccordingtowhatthehardw!areclaimstheaspMectratiois,buttheGhardw!aresometimeslies.FeorDOS,thevdDaluessetb!ySETSCRUNCHareremem!bMeredina leG(calledfscrunch.dat)andareautomaticallyputin!toe ectwhenaLogosessionbMegins.35Gmrefresh3.REFRESHG(command)tellsLogotoremem!bMertheturtle'smotionssothattheycanbMeusedforhigh-Gresolution+prin!ting(wxWidgets)+ortorefreshthegraphicswindo!wifitismo!ved,M$resized,Gorfo!verlayed(non-wxWidgets).Thisisthedefault.34Gmnorefresh3.NOREFRESHG(command)tellsLogonottoremem!bMertheturtle'smotions,whichmaybMeusefultosaveGtimeandmemoryify!ourprogramisinteractiveoranimated,ratherthandrawingastaticGpicturey!ou'llwanttoprintlater(wxWidgets).Innon-wxWidgetsversions,usingNORE-GFRESHJ\ma!yJpreventJLogofromrestoringthegraphicsimageafterthewindo!wismo!ved,Gresized,foro!verlayed.35Gc6.4Tfurtlef@andWindowQueries+vGChapterf6:GraphicsC4333͍Gmshownp3.SHOWNP 33.SHOWN?33GoutputsTRUEiftheturtleissho!wn(visible),FALSEiftheturtleishidden.ёSeeSHOWTURTLEGandfHIDETURTLE.GSeef[SHO!WTUReTLE],page39,,[HIDETURTLE],page40,.񍍑Gmscreenmoide3.SCREENMODEGoutputsUNtheUMw!ordTEXTSCREEN,SPLITSCREEN,orFULLSCREENdepMendingonthecurren!tGscreenfmoMde.񍍑Gmturtlemoide3.TURTLEMODEGoutputsfthew!ordWRAP,FENCE,orWINDOWdepMendingonthecurrentturtlemoMde.Gmlabielsize3.LABELSIZEG(wxWidgets;only)outputs;alistoft!wo;pMositiveintegers,Qthewidthand;heightofcharacters 33Gdispla!yed>byLABEL>measuredinturtlesteps(whic!hwillbMedi erentfrom>screenpixelsifGSETSCRUNCHFhasFbMeenused).#ThereisnoSETLABELSIZEbMecausethewidthandheigh!tofGafon!tarenotseparatelycon!trollable,pro!videduthattthatpMositionw!aswithinthegraphicswindo!w,>inturtlecoMordinates.G(wxWidgetsfonly)CGmbuttonp.BUTTONP.BUTTON?33GoutputsJTRUEIifamousebuttonisdo!wnandthemouseiso!verJthegraphicswindo!w.~OnceGthexzbuttonx{isdo!wn,BUTTONPremainstrueun!tilthebuttonisreleased,ev!enifthemouseisGdraggedfoutofthegraphicswindo!w.CGmbutton.BUTTON33Goutputs0ifnomousebuttonhasbMeenpushedinsidetheLogowindo!wsincethelastcallGtoqBUTTON.dOtherwise,޴itoutputsanin!tegerbMetweenr1and3indicatingwhichbuttonwasGmostrecen!tlypressed.'Ordinarily1meansleft,2meansright,and3~meanscenter,butGopMeratingfsystemsma!yrecon gurethese.0H3314933͍GZ7 QWaGorkspacezManagemenut1Gc7.1Pros3ceduref@De nitionڍGmto3.TOprocname:input1:input2... T(specialform)33Gcommand. Prepares Logo toacceptaproMcedurede nition. Theprocedurewill benamed 33GproMcnameanditherem!ustnotalreadybeaprocedureib!ythatname.(]TheinputswillbeGcalled{input1[etc.ϭAn!ynumbMerofinputs{areallowed,Yincludingnone.ϭNames{ofproMceduresGandfinputsarecase-insensitiv!e.GUnlik!e8oeveryother8nLogoproMcedure,\TO8Itakesasits8ninputstheactualwords8ntypMedintheGinstructionYline,iasiftheyw!ereallYquoted,ratherthantheresultsofevdDaluatingexpressionsGtofpro!videtheinputs.(That'swhatspMecialformmeans.)GThisVbv!ersionofLogoallowsvdDariablenumbMersofinputstoaprocedure.1AftertheprocedureGnamefcomefourkindsofthings,inthisorpder-:ED1.>0ormoreREQUIREDinputs:FOO:FROBOZZED2.>0ormoreOPTIONALinputs[:BAZ87][:THINGO5+9]ED3.>0or1RESTinputD[:GARPLY]ED4.>0or1DEFAULTnumber-P5GEv!ery?KproMcedure?Jhasaminim!um,Sdefault,andmaxim!um?KnumbMerof?Jinputs.(ThelattercanGbMefin nite.)GThe:minim!um9numbMerofinputs9isthenumbMer9ofrequiredinputs,/whichmust9come rst.GAfrequiredinputisindicatedb!ythe.:inputnameGnotation.GAfteralltherequiredinputscanbMezeroormoreoptionalinputs,eac!hofwhic!hisrepresen!tedGb!yfthefollowingnotation:.[:inputnamedefault.value.expression]GWhentheproMcedureisin!voked,ifactualinputsarenotsuppliedfortheseoptionalinputs,Gthe2default2vdDalueexpressionsareevdDaluatedtosetvalues2forthecorrespMondinginputnames.GTheinputsareproMcessedfromlefttorigh!t,nsoadefaultvdDalueexpressioncanbMebasedonGearlierfinputs.Example:.toproc:inlist[:startvaluefirst:inlist]GIfftheproMcedureisin!vokedfbysaying.proc[abc]Gthen$the%vdDariableinlistwillha!ve$thevdDalue[ABC]1andthevdDariablestartvaluewillGha!vefthevdDalueA.IftheproMcedureisin!vokedfbysaying2AG503)BERKELEYfLOGO6.133͍.(proc[abc]"x)33Gthenfinlistwillha!vefthevdDalue[ABC]/randstartvaluewillha!vefthevalueX.GAfter!all"therequiredandoptionalinputcancomeasinglerest3!input, represen!tedby!the 33Gfollo!wingfnotation:.[:inputname]GThispisarestinputratherthananqoptionalinputbMecausethereisnodefaultvdDalueexpres-Gsion.There$can$bMeatmostonerestinput.WhentheproMcedureisin!voked,>{thevdDalue$ofthisGinputnamewill}bMe}alistcon!tainingalloftheactualinputspro!videdthatwere}notusedforGrequiredforoptionalinputs.Example:.toproc:in1[:in2"foo][:in3"baz][:in4]GIffthisproMcedureisin!vokedfbysaying.proc"xGthenin1hasthevdDalueX,3in2hasthevdDalueFOO,3in3hasthevalueBAZ,3andin4hastheGvdDaluef[](theempt!ylist).Ifit'sinvokedbysaying.(proc"a"b"c"d"e)Gthenin1hasthevdDalueA,jin2hasthevdDalueB,jin3hasthevdDalueC,jandin4hasthevdDalueG[DE].ϙ.GThemaximumn!umbMerofinputsforaproMcedureisin niteifarestinputisgiv!en;*otherwise,Gitfisthen!umbMerfofrequiredinputsplusthen!umberfofoptionalinputs.GTheEdefaultOln!umbMerEofinputsforaprocedure,mIwhic!hEisthenumbMerofinputsEthatitwillGacceptifitsin!voMcationisnotenclosedinparen!theses,0isordinarilyequaltotheminim!umGn!umbMer.KIfyouwantadi erentdefaultnumbMeryoucanindicatethatbyputtingthedesiredGdefaultfn!umbMerasthelastthingontheTOline.example:.toproc:in1[:in2"foo][:in3]3GThisproMcedurehasaminim!umofoneinput,u1adefaultofthreeinputs,u1andanin niteGmaxim!um.GLogorespMondstotheTOcommandb!yenteringproMcedurede nitionmoMde.&ThepromptGc!haracterPpchangesPofrom?to>andwhatev!erinstructionsy!outypMePobecomepartPooftheGde nitionfun!tilyoutypMealinecontainingonlythewordEND.:Gmde ne3.DEFINEprocnametextGcommand.mDe nesBaproMcedurewithnameprocnameandtexttext.lIfBthereisalreadyaGproMcedurewiththesamename,"thenewde nitionreplacestheoldone.Thetext inputm!ustGbMeCalistwhosemem!bersarelists.gThe rstmem!berisalistofinputs;+itlookslik!eaTOGlinebutwithoutthew!ordTO,ֹwithouttheproMcedurename,ֹandwithoutthecolonsbMeforeGinputnames.TInotherw!ords, BthemembMersofthis rstsublistarewordsforthenamesofGrequiredK inputsKandlistsforthenamesofoptionalorrestinputs.pTheremainingsublistsof3ݍGChapterf7:WeorkspaceManagemen!t5133͍Gthe/5textl6inputmak!eupthe/6bMody/5oftheproMcedure,G withonesublistforeac!hinstructionline 33GofthebModye.`(ThereisnoENDlineinthetextinput.)`Itisanerrortorede neaprimitiv!eGproMcedurefunlessthevdDariableREDEFPhasthevalueTRUE.33GSeef[REDEFP],page91,.gGmtext3.TEXTprocnameGoutputsthetextoftheproMcedurenamedproMcname0intheformexpMectedb!yDEFINE:'alist 33Gof lists,*the rstofwhic!hdescribMestheinputstotheproMcedureandtherestofwhic!haretheGlines3Wof3XitsbModye.The3WtextdoMesnotre ectformattinginformationusedwhentheproMcedureGw!asfde ned,suchascontinuationlinesandextraspaces.hGmfulltext.FULLTEXTprocname33Goutputsarepresen!tationoftheproMcedureprocname inwhic!hformattinginformationisGpreserv!ed.If9theproMcedurewasde nedwithTO,]EDIT,or9LOAD,thentheoutputisalistGof w!ords.Eachwordrepresents oneentire lineofthede nitionintheformoutputb!yGREADWORD,o7includingG extraGspacesandcon!tinuationG lines.Thelastmem!bMeroftheoutputGrepresen!tsxtheENDxline.ΚIftheproMcedurew!asde nedwithDEFINE,thentheoutputisalistGofaklists.Iftheselistsareprin!ted,o7onepMerline,theresultwillloMoklik!eade nitionusingTO.GNote:thefoutputfromFULLTEXTisnotsuitableforuseasinputtoDEFINE!GSeef[TO],page49,,[EDIT],page61,,[LO!AD],page63,,[DEFINE],page50,.gGmcopydef3.COPYDEFnewnameoldnameGcommand.=Mak!esanewnamechaproMcedureidenticaltooldname.=ThelattermaybMeaprimi-Gtiv!e.Ifnewname\wasalreadyde ned,itspreviousde nitionislost.Ifnewname\w!asalreadyGa,primitiv!e,Dtherede nitionisnotpMermittedunless,thevdDariableREDEFPhasthevalueTRUE.GNote:8dialectsofLogodi erastotheorderofinputstoCOPYDEF.Thisdialectuses"MAKEGorder,"fnot"NAMEorder."GSeef[REDEFP],page91,,[SAȈVE],page62,,[PO],page56,,[POT],page57,.gGc7.2Vfariablef@De nitionhGmmake3.MAKEvarnamevalueGcommand.AssignsxthevdDaluevalue4tothevariablenamedvarname,uwhic!hmustbMeaword.GVeariableCnamesareCcase-insensitiv!e.IfavdDariablewiththesamenamealreadyexists,jtheGvdDaluefofthatvariableisc!hanged.Ifnot,anewglobalvariableiscreated.gGmname3.NAMEvaluevarname(libraryprocedure)4ЍG523)BERKELEYfLOGO6.133͍Gcommand.SamefasMAKEbutwiththeinputsinrev!erseorder."L΍Gmloical3.LOCALvarname 33.LOCALvarnamelist.(LOCALvarname1varname2...)33Gcommand.Accepts%asinputsoneor$morew!ords,*oralistofwords.A vdDariableiscreatedGfor#eac!h#ofthesew!ords,=withthatw!ordasitsname.DThevdDariablesareloMcaltothecurren!tlyGrunningOproMcedure.ټLogovdDariablesfollo!wdynamicOscoperules;UavdDariablethatOislocaltoGa6proMcedure7isa!vdDailabletoany7subproMcedureinvokedby7thatproMcedure.NThevdDariablesGcreated7b!y8LOCALhave8noinitialvdDalue;Ktheymust8bMeassignedavdDalue(e.g.,lwithMAKE)GbMeforeftheprocedureattemptstoreadtheirvdDalue.GSeef[MAKE],page51,."LύGmloicalmake3.LOCALMAKEvarnamevalue(libraryprocedure)Gcommand.4SMak!es9the8namedvdDariableloMcal,mlikeLOCAL,mandassignsitthegivenvdDalue,mlikeGMAKE.GSeef[LOCAL],page52,,See[MAKE],page51,."L΍Gmthing3.THINGvarname.:quoted.varnameGoutputs2the1vdDalueofthevariable1whosenameistheinput.AIfthereismorethanonesuc!hGvdDariable,"the֫innermost֬loMcalvariableof֫thatnameisc!hosen.nThecolonnotationisanGabbreviationfnotforTHINGbutforthecom!bination.thing"Gsofthat:FOOKtmeansTHING"FOO=# ."L΍Gmglobal3.GLOBALvarname.GLOBALvarnamelist.(GLOBALvarname1varname2...)Gcommand.Accepts]qas]pinputsoneormorew!ords,3oralistofwords.A]AglobalvdDariableisGcreatedforeac!hofthesew!ords,withthatwordasitsname.TheonlyreasonthisisnecessaryGiskthatky!oumightwantktousethe"setter"notationSETXYZforavdDariableXYZthatdoMesGnotwalreadywha!veawvdDalue;AGLOBAL"XYZF;?makesthatlegal.KNote:ƂIftherewiscurrentlywaloMcalGvdDariablekofthesamejname,thiscommanddoMes*not*mak!eLogousetheglobalvdDalueinsteadGofftheloMcalone.5 GChapterf7:WeorkspaceManagemen!t5333͍Gc7.3Props3ertyf@Lists33GNote:NamesMofLpropMert!ylistsarealw!aysLcase-insensitive.0NamesofLindividualpropMerties 33GareМcase-sensitiv!eНorcase-insensitivedepMendingНonthevdDalueofCASEIGNOREDP,^whic!hisTRUEGb!yfdefault.33GSeef[CASEIGNOREDP],page89,.GIn\@principle,ev!erypMossible\?nameisthenameofapropMert!ylist,whichis\?initiallyemptye. 33GSoJLogonev!ergivesa"nosuchpropMertylist"error,asitwouldforunde nedproMcedureorGvdDariableQnames.ButtheRprimitiv!eproMceduresthatdealwith"all"propMert!ylists(CONTENTS,GPLISTS,>etc.)list$onlynonempt!yones.Teo"erase"a$propMert!ylist[ERASE],page57,>meansGtofmak!eitemptye,removingallpropMertiesfromit.Gmpprop3.PPROPplistnamepropnamevalue33Gcommand.ڢAddsapropMert!ytotheplistname9propert!ylistwithnamepropname9andvdDalueGvdDalue.Gmgprop.GPROPplistnamepropname33Goutputs6wthe6xvdDalueofthepropnamepropMert!yintheplistname~propMert!ylist,Z{ortheempt!yGlistfifthereisnosuc!hpropMertye.Gmremprop.REMPROPplistnamepropname33Gcommand.6Remo!vesrtheqpropMertynamedrpropname`xfromthepropMert!ylistnamedplistname.Gmplist.PLISTplistnameGoutputscalistwhoseoMdd-n!umberedcmemberscarethenames,_andwhoseev!en-numbered 33Gmem!bMersarethevdDalues,4ofthepropertiesinthepropert!ylistnamedplistname.nTheoutputGis0acop!yoftheactualpropMertylist;changingpropMertieslaterwillnotmagicallychangeaGlistfoutputearlierb!yPLIST.Gc7.4Wforkspacef@PredicatesGmproicedurep.PROCEDUREPname.PROCEDURE?name33GoutputsfTRUEiftheinputisthenameofaproMcedure.Gmprimitivep.PRIMITIVEPname.PRIMITIVE?name6G543)BERKELEYfLOGO6.133͍Goutputss^TRUEs]iftheinputisthenameofaprimitiv!eproMcedure(onebuiltin!toLogo). 33GNoteIthatIsomeoftheproMceduresdescribedinthisIdocumen!tarelibraryIprocedures,rnotGprimitiv!es.pGmde nedp3.DEFINEDPname.DEFINED?name33Goutputs`vTRUE`uiftheinputisthenameofauser-de nedproMcedure,includingalibraryGproMcedure.pGmnamep.NAMEPname.NAME?name33GoutputsfTRUEiftheinputisthenameofavdDariable.pGmplistp.PLISTPname.PLIST?name33GoutputsETRUEEiftheinputisthenameofanonempty=propMert!ylist.(Inprincipleev!erywordGisthenameofapropMert!ylist;;ifyouhaven'tputanypropMertiesinit,PLISTofthatnameGoutputsfanempt!ylist,ratherthangivinganerrormessage.)pGc7.5Wforkspacef@Queries33GNote:qAllproMcedureswhoseinputisindicatedascon!tentslistXwillacceptasinglew!ordG(tak!en_~as_aproMcedurename),alistofw!ords(takenas_namesofproMcedures),oralistofGthreeflistsasdescribMedundertheCONTENTScommandabo!ve.pGmcontents.CONTENTS33Goutputs5a4"con!tentslist,"4i.e., alistofthreelistscon!tainingnamesofde nedproMcedures,GvdDariables,Giand/propMert!ylistsrespectiv!elye.IThislistincludesall/unburiednameditemsintheGw!orkspace.pGmburied.BURIED33Goutputsfacon!tentsflistincludingallburiednameditemsinthew!orkspace.pGmtraced.TRACEDGoutputsfacon!tentsflistincludingalltracednameditemsinthew!orkspace.pGmsteppied.STEPPED7硍GChapterf7:WeorkspaceManagemen!t5533͍Goutputsfacon!tentsflistincludingallsteppMednameditemsinthew!orkspace.6܍Gmproicedures3.PROCEDURES33Goutputsalistofthenamesofallun!burieduser-de nedproMceduresinthew!orkspace.Note 33Gthat[this\isalistofnames,'+notacon!tentslist.(However,'+proMcedures[thatrequireacon!tentsGlistfasinputwillacceptthislist.)Gmprimitives3.PRIMITIVES33GoutputsY)alistoftheY*namesofallprimitiv!eproMceduresintheworkspace.NotethatthisisaGlistJ/ofJ.names,\notacon!tentsJ/list.(However,\proMceduresthatJ.requireacon!tentslistJ.asinputGwillfacceptthislist.)Gmnames3.NAMES33Goutputs@a@con!tentslist@consistingofanempt!ylist(indicatingnoproMcedurenames)follo!wedGb!yfalistofallunburiedvdDariablenamesintheworkspace.6ݍGmplists.PLISTS33Goutputsxacon!tentsxlistxconsistingoft!woxemptylists(indicatingxnoproMceduresorvdDariables)Gfollo!wedfbyalistofallunburiednonemptypropMertylistsintheworkspace.6܍Gmnamelist.NAMELISTvarname(libraryprocedure).NAMELISTvarnamelist33Goutputs{acon!tents{listconsistingzofanempt!ylistfollowedbyalistzofthenameornamesGgiv!enJasinput.ThisisusefulinconjunctionwithworkspacecontrolproMceduresthatrequireGafcon!tentslistasinput.6܍Gmpllist.PLLISTplname(libraryprocedure).PLLISTplnamelist33GoutputsMacon!tentsMlistconsistingMoft!woMemptylistsfollowedbyalistMofthenameornamesGgiv!enJasinput.ThisisusefulinconjunctionwithworkspacecontrolproMceduresthatrequireGafcon!tentslistasinput.GSeef[CONTENTS],page54,.6܍Gmarity3.ARITYprocedurename8ﲍG563)BERKELEYfLOGO6.133͍Goutputsu$alistofthreen!umbMers:{Ytheu$minimum,default,andmaxim!umnumbMerofinputs 33GfortheproMcedurewhosenameistheinput.-Itisanerrorifthereisnosuc!hproMcedure.-AGmaxim!umfof-1meansthatthenumbMerofinputsisunlimited. Gmnoides3.NODES33Goutputsalistoft!wonumbMers.XThe rstrepresentsthenumbMerofnodesofmemorycurren!tlyGin>use.aThesecondsho!wsthemaximumnumbMerofnodesthat>ha!ve>beeninuseatan!ytimeGsinceGtheFlastin!voMcationofGNODES.~(A/nodeisFasmallbloMc!kofcomputermemoryasusedGb!y$Logo.XEachnumbMerusesone$node.XEac!hnon-numeric$wordusesonenoMde,DCplussomeGnon-noMdehmemoryhforthec!haractersinthew!ord.%}EachharraytakeshonenoMde,plussomeGnon-noMdememorye,asw!ellasthememoryrequiredb!yitselemen!ts.EachlistrequiresoneGnoMde\per\elemen!t, aswell\asthememorywithintheelemen!ts.)iIfyou\wantto\tracktheGmemoryיuseofanטalgorithm,itisbMestify!ouinvokeGCattheטbMeginningofeachiteration,Gsincefotherwisethemaxim!umwillincludestoragethatisunusedbutnotyetcollected."Gc7.6Wforkspacef@Insps3ection Gmpio.PRINTOUTcontentslist.POcontentslist33Gcommand.(Prin!tsnEtonFthewritestreamthede nitionsofallproMcedures,yvdDariables,yandprop-Gert!yflistsnamedintheinputcontentslist. Gmpioall.POALL(libraryprocedure)33Gcommand.Prin!tsfallunburiedde nitionsintheworkspace.AbbreviatesPOCONTENTSB.GSeef[CONTENTS],page54,. Gmpiops.POPS(libraryprocedure)Gcommand.3Prin!ts.the-de nitionsofallun!buriedproMceduresinthew!orkspace.3Abbreviates 33GPOPROCEDURES\.GSeef[PO],page56,,[PR!OCEDURES],page55,. Gmpions.PONS(libraryprocedure)Gcommand.Prin!tsTthede nitionsofallTunburiedvdDariablesintheworkspace.Abbreviates 33GPONAMES@.GSeef[PO],page56,,[NAMES],page55,.9|GChapterf7:WeorkspaceManagemen!t5733͍Gmpiopls3.POPLS(libraryprocedure)33Gcommand.˽Prin!tsKthecontentsofallunburiednonemptypropMertylistsintheworkspace. 33GAbbreviatesfPOPLISTS7c`.GSeef[PO],page56,,[PLISTS],page55,.0Gmpion.PONvarname(libraryprocedure) 33.PONvarnamelistGcommand.Prin!tsfthede nitionsofthenamedvdDariable(s).GAbbreviatesfPONAMELISTvarname(list)^.GSeef[PO],page56,,[NAMELIST],page55,.0Gmpiopl3.POPLplname(libraryprocedure).POPLplnamelistGcommand.Prin!tsfthede nitionsofthenamedpropMertylist(s).GAbbreviatesfPOPLLISTplname(list).GSeef[PO],page56,,[PLLIST],page55,.0Gmpiot3.POTcontentslistGcommand.5qPrin!tsØthe×titlelinesofthenamedproMceduresandthede nitionsofthenamedGvdDariablesѺandpropMert!ylists._Feorpropert!ylists,܏theentirelistisѻshownononelineinsteadGoffasaseriesofPPROPinstructionsasinPO.GSeef[PPR!OP],page53,,[PO],page56,.0Gmpiots3.POTS(libraryprocedure)Gcommand.XPrin!tsthetitlelinesofallunburiedproMceduresintheworkspace.XAbbreviatesGPOTPROCEDURESb.GSeef[PR!OCEDURES],page55,.$nHGc7.7Wforkspacef@Control0Gmerase3.ERASEcontentslist.ERcontentslist:G583)BERKELEYfLOGO6.133͍Gcommand.Uandpropert!y%slistsnamedintheinput.That 33Gis,fthenameditemswillbMereturnedtoviewinCONTENTS,etc.GSeef[CONTENTS],page54,.Gmunburyall3.UNBURYALL(libraryprocedure)Gcommand.AbbreviatesfUNBURYBURIED.GSeef[BURIED],page54,.Gmunburyname3.UNBURYNAMEvarname(libraryprocedure) 33.UNBURYNAMEvarnamelistGcommand.AbbreviatesfUNBURYNAMELISTvarname(list).GSeef[UNBUReY],page59,,[NAMELIST],page55,.<G603)BERKELEYfLOGO6.133͍Gmburiedp3.BURIEDPcontentslist 33.BURIED?contentslist33GoutputsGTRUEifFthe rstproMcedure, vdDariable,orpropMert!yGlistnamedinthecon!tentsGlistisGburied,|FALSErifrnot.hOnlythe rstthinginthelististested;{themostcommonusewillbMeGwith6aw!ordasinput,Z namingaproMcedure,Z butacontentslistisallowedsothatyoucanGBURIEDPf[[][variable]]orBURIEDP[[][][proplist]].؍Gmtrace.TRACEcontentslist33Gcommand.cMarks}thenameditemsfortracing.A}wmessageisprin!tedwheneveratracedGproMcedure isin!voked,Pgiving theactualinput vdDalues,Qandwhenev!eratracedproMcedureSTOPsGorOUTPUTs.uAlmessageisprin!tedwheneveranewvdDalueisassignedtoatracedvdDariableGusing:ZMAKE.A:4messageis:[prin!tedwheneveranew:[propMertyisgivento:[atracedpropMertyGlistfusingPPROP.GSeef[STOP],page69,,[OUTPUT],page69,,[MAKE],page51,,[PPR!OP],page53,.؍Gmuntrace3.UNTRACEcontentslistGcommand.Teurnsfo tracingforthenameditems.ٍGmtracedp.TRACEDPcontentslist 33.TRACED?contentslistGoutputsGTRUEifFthe rstproMcedure, vdDariable,orpropMert!yGlistnamedinthecon!tentsGlistisGtraced,FALSE{Jif{Knot.Onlythe rstthinginthelististested;themostcommonusewillbMeGwith6aw!ordasinput,Z namingaproMcedure,Z butacontentslistisallowedsothatyoucanGTRACEDPf[[][variable]]orTRACEDP[[][][proplist]].؍Gmstep3.STEPcontentslistGcommand.Marks9the9nameditemsforstepping.Whenev!er9asteppMedprocedureisin!voked,Geac!h0instructionlineintheproMcedurebody/isprin!tedbeforebeingexecuted,nandLogow!aitsGfor>>theuserto>=t!ypMeanewlineattheterminal.dA>messageisprin!tedwheneverasteppMedGvdDariablenameisshado!wed8bMecausealocalvdDariableofthesamenameiscreatedeitherasaGproMcedurefinputorb!ytheLOCALcommand.GSeef[LOCAL],page52,.؍Gmunstep3.UNSTEPcontentslistGcommand.Teurnsfo steppingforthenameditems.=/GChapterf7:WeorkspaceManagemen!t6133͍Gmsteppiedp3.STEPPEDPcontentslist 33.STEPPED?contentslist33GoutputsGTRUEifFthe rstproMcedure, vdDariable,orpropMert!yGlistnamedinthecon!tentsGlistisGsteppMed,5FALSEifnot.3Onlythe rstthinginthelististested;themostcommonusewillGbMe\witha\w!ordasinput,kInamingaproMcedure,kIbutacon!tents\listisallo!wed\sothaty!oucanGSTEPPEDPf[[][variable]]orSTEPPEDP[[][][proplist]].@Gmedit.EDITcontentslist.EDcontentslist.(EDIT).(ED)33Gcommand.IfTWin!vokedTVwithaninput,EDITwritesthede nitionsofthenameditemsin!toGajtempMorary lejandeditsthat le,usinganeditorthatdepMendsontheplatformy!ou'reGusing.In7wxWidgets,Aand6intheMacOS/Classicv!ersion,thereis6aneditorbuiltin!toLogo.GInH{thenon-wxWidgetsv!ersionsforUnix,pMacOSHRX,Windows,pandDOS,LogousesyourGfa!voriteeditorasdeterminedb!ytheEDITORenvironmentvdDariable.Ifyoudon'thaveanGEDITORVvdDariable,editsthede nitionsusingjove.Ifin!vokedVwithoutaninput,EDITeditsGthe(same lelefto!ver(fromapreviousEDIT)orEDITFILEinstruction.#Wheny!ouleavetheGeditor,LogoIreadstherevisedde nitionsandmoMdi esJthew!orkspaceaccordinglye.)ItisnotGanferroriftheinputincludesnamesforwhic!hthereisnopreviousde nition.GIf<6thereis<7avdDariableLOADNOISILYwhosevalueis<7TRUE,athen,after<6lea!vingtheeditor,aTOGcommands?inthe?tempMorary leprin!t`procnamefdefined'(whereproMcnameisthenameofGthe proMcedurebeingde ned);"G623)BERKELEYfLOGO6.133͍GInthewxWidgetsv!ersion,EDITFILEaskswhetherornoty!ouwanttoloadthe lein!toLogo 33Gwhen}y!ou nishediting.Thisallowsyouto}useEDITFILEtoeditdata leswithoutleavingGLogo.Gmedall3.EDALL(libraryprocedure)33Gcommand.AbbreviatesfEDITCONTENTS.GSeef[CONTENTS],page54,.Gmedps.EDPS(libraryprocedure)Gcommand.AbbreviatesfEDITPROCEDURES.GSeef[EDIT],page61,,[PR!OCEDURES],page55,.Gmedns.EDNS(libraryprocedure)Gcommand.AbbreviatesfEDITNAMES.GSeef[EDIT],page61,,[NAMES],page55,.Gmedpls.EDPLS(libraryprocedure)Gcommand.AbbreviatesfEDITPLISTS.GSeef[EDIT],page61,,[PLISTS],page55,.Gmedn.EDNvarname(libraryprocedure) 33.EDNvarnamelistGcommand.AbbreviatesfEDITNAMELISTvarname(list).GSeef[EDIT],page61,,[NAMELIST],page55,.Gmedpl.EDPLplname(libraryprocedure) 33.EDPLplnamelistGcommand.AbbreviatesfEDITPLLISTplname(list).GSeef[EDIT],page61,,[PLLIST],page55,.Gmsave.SAVEfilenameGcommand.Sa!vesthede nitionsofallun!buriedproMcedures,vdDariables,andnonemptyprop- 33Gert!yflistsinthenamed le.EquivdDalentto?/GChapterf7:WeorkspaceManagemen!t6333͍.tosave:filename 33.local"oldwriter.make"oldwriterwriter.openwrite:filename.setwrite:filename.poall.setwrite:oldwriter.close:filename.end33GExceptionallye,"SAVEЖcanbMeЗusedwithnoinputandwithoutparen!thesesifitisthelastGthingVonUthecommandline.ʬInthiscase, the lenamefromthemostrecen!tLOADorSAVEGcommandfwillbMeused.(ItisanerroriftherehasbeennopreviousLOADorSAVE.)&hGmsavel3.SAVELcontentslistfilename(libraryprocedure)Gcommand.Sa!ves@thede nitionsofthe@proMcedures,TvdDariables,and@propert!y@listsspeci edb!yGcon!tentslistftofthe lenamed lename.&hGmload3.LOADfilenameGcommand.мReadsinstructionsfromthenamed leandexecutesthem.мThe lecanincludeGproMcedurede nitionswithTO,7andtheseareacceptedev!enifaproMcedureb!ythesamenameGalreadywexists.Ifthe lexassignsalistvdDaluetoavdDariablenamedSTARTUP,thenthatlistisGrun ,asaninstructionlistafter -the leisloaded. /IfthereisavdDariableLOADNOISILYwhoseGvdDalueisTRUE,GthenTOcommandsinthe leprin!t`procnamefdefined'(whereproMcnameGisthenameoftheproMcedurebeingde ned);ifLOADNOISILYisFALSEorunde ned,Q]TOGcommandsfinthe learecarriedoutsilen!tlye.GSeef[STeARTUP],page91,,See[LO!ADNOISILY],page90,.&hGmcslsload3.CSLSLOADnameGcommand.Loads the named le,lik!eLOAD,butfrom thedirectorycon!tainingtheComputerGSciencefLogoSt!yleprogramsinsteadofthecurrentuser'sdirectorye.GSeef[LO!AD],page63,.&hGmhelp3.HELPname.(HELP)Gcommand.KPrin!ts information fromthereferenceman!ualabMouttheprimitiv!eproMcedureGnamed.\b!y.]theinput.Withnoinput,F_listsalltheprimitiv!esabMoutwhic!hhelpisa!vdDailable.IfGthere=is=anen!vironmentvdDariable=LOGOHELP,RthenitsvdDalueistak!enasthedirectoryinwhic!hGtofloMokforhelp les,insteadofthedefaulthelpdirectorye.@6JG643)BERKELEYfLOGO6.133͍GIfqbHELPqaiscalledwiththenameofade nedproMcedureforwhic!hthereisnohelp le,{itwill 33Gprin!tIthetitleIlineoftheproMcedurefollowedIbylinesfromtheproMcedureIbodyIthatstartGwithfsemicolon,stoppingwhenanon-semicolonlineisseen.33GExceptionallye,1theeHELPcommandcandbMeusedwithoutitsdefaultinputandwithoutparen-Gthesesfpro!videdthatnothingfollowsitontheinstructionline.Gmseteditor3.SETEDITORpathGcommand.TeellsLogotousethespMeci edprogramasitseditorinsteadofthedefaulteditor.GThefformatofapathdepMendsony!ouroperatingsystem.Gmsetlibloic3.SETLIBLOCpathGcommand.TeellsKLogoJtousethespMeci eddirectoryasitslibraryinsteadofthedefault.G(Note\that]man!yLogo"primitive"]proMceduresareactuallyfoundinthelibrarye,sotheyGma!ybMecomeunavdDailableifyournewlibrarydoMesnotincludethem!)TheformatofapathGdepMendsfony!ouroperatingsystem.Gmsetcslsloic3.SETCSLSLOCpathGcommand.pTeellsLogotousethespMeci eddirectoryfortheCSLSLOADcommand,`insteadofGthefdefaultdirectorye.TheformatofapathdepMendsony!ouroperatingsystem.GSeef[CSLSLO!AD],page63,.Gmsethelploic3.SETHELPLOCpathGcommand.TeellsgQLogogRtoloMokinthespeci edgRdirectoryfortheinformationpro!videdbytheGHELPcommand,1instead ofthedefaultdirectorye.,Theformat ofapathdepMendsony!ourGopMeratingfsystem.Gmsettemploic3.SETTEMPLOCpathGcommand.TeellshLogotowriteeditortempMorary lesinthespeci eddirectoryratherthanGinTtheSdefaultdirectorye.RYouTm!usthaveTwritepMermissionforthisdirectorye.RTheformatofGafpathdepMendsony!ouroperatingsystem.Gmgc3.GC.(GCanything)Gcommand. 1VRunsthegarbagecollector,sreclaimingun!usednoMdes. 1WLogodoesthiswhenGnecessaryan!ywaye,Pbutyoumaywanttousethiscommandtocon!trolexactlywhenLogodoMesGit.ɝInparticular,then!umbMersoutputbytheNODESopMerationwillnotbMev!erymeaningfulA@GChapterf7:WeorkspaceManagemen!t6533͍Gunless`MgarbagehasbMeen`Ncollected. AnotherreasontouseGCisthatagarbagecollection 33Gtak!esanoticeablefractionofasecond,andy!oumaywanttoschedulecollectionsfortimesGbMefore or aftersometime-criticalanimation.Ifin!voked withanargumen!t(ofan!yvdDalue),+GCGrunsafullgarbagecollection,^includingK`y cmr10GCTWA(GarbageCollectTerulyWorthlessA!toms,Gwhic!h"means"thatitremoves"fromLogo'smemoryw!ordsthatusedtobMeprocedure"orGvdDariableMnamesbutMaren'tan!ymore);kDwithoutanargument,_pGCdoMesMagenerationalgarbageGcollection,whic!hHmeansthatHonlyrecentlycreatedHnoMdesareexamined. ŋ(ThelatterisGusuallyfgoModenough.)Gm.setsegmentsize3..SETSEGMENTSIZEnum33Gcommand.|Sets6Cthen!umbMer6CofnodesthatLogoallocatesfromtheoperatingsystematonceGton!um,whichmustbMeapositiv!einteger.TThenameisdottedbMecausebadthingswillGhappMen]ify!ouusea]numbMerthat'stoosmallortoolargefory!our]computer.TheinitialGvdDaluekisl16,000formostsystems,Ӭbutissmallerfor68000-basedMacs.MakingitlargerGwillʋspMeedupcomputations(b!yreducingthenumbMerofgarbagecollections)atthecostofGalloMcatingfmorememorythannecessarye.BK033CQ6733͍GZ8 QConutrolzStructures&+卍Gc8.1Control33GNote:inthefollo!wingdescriptions,*aninstructionlistcanbMealistoraword.Inthelatter 33Gcase,thew!ordisparsedintolistformbMeforeitisrun.}`Thus,RUNREADWORDJ?orRUNREADLISTGwillw!ork.YTheformerisslightlypreferablebMecauseitallowsforacontinuedline(with~)Gthatfincludesacommen!t(with;)onthe rstline.33GAtf{inputm!ustbMethewordTRUE,thewordFALSE,oralist.Ifit'salist,thenitm!ustbMeGaaLogoexpression,owhic!hwillbMeevdDaluatedatoproduceavdDaluethatm!ustbeTRUEorFALSE.GThefcomparisonswithTRUEandFALSEarealw!aysfcase-insensitive.GArunlistcanconsistofeitherasingleexpression(thatproMducesavdDalue)orzeroormoreGinstructionsf(thatdosomething,ratherthanoutputavdDalue),depMendingonthecon!text:.PRINTIFELSE:X<0["NEGATIVE]["POSITIVE] T;onevalueineachcase.REPEAT4[PRINT"APRINT"B] T;twoinstructionsGmrun3.RUNinstructionlistGcommandoropMeration.=RunstheLogoinstructionsintheinputlist;:outputsifthelistGcon!tainsfanexpressionthatoutputs.GSeef[READ!WORD],page20,,[READLIST],page20,.Gmrunresult3.RUNRESULTinstructionlistGruns/the/instructionsintheinput;toutputsanempt!ylistifthoseinstructionsproMducenoGoutput,"or Ka Llistwhoseonlymem!bMeristheoutputfromrunningtheinputinstructionlist.GUsefulfforin!ventingfcommand-or-opMerationcon!trolstructures:.local"result.make"resultrunresult[something].ifemptyp:result[stop].outputfirst:resultGmrepieat3.REPEATnuminstructionlistGcommand.RunsftheinstructionlistfrepMeatedlye,n!umtimes.Gmforever.FOREVERinstructionlistGcommand.Runswthe"instructionlist"repMeatedlye,;un!tilsomethingvinsidetheinstructionlist 33G(suc!hfasSTOPorTHROW)makesitstop.GSeef[STOP],page69,,See[THR!OW],fpage69,.DR'G683)BERKELEYfLOGO6.133͍Gmrepicount3.REPCOUNT33GoutputstherepMetitioncoun!toftheinnermostcurren!tREPEATorFOREVER,vstartingfrom1. 33GIffnoREPEATorFOREVERisactiv!e,outputs{1.GTheabbreviation#canbMeusedforREPCOUNTunlesstheREPEATisinsidethetemplateinputGtofahigherorderproMceduresuc!hasFOREACH,inwhichcase#hasadi erentmeaning.؍Gmif3.IFtfinstructionlist.(IFtfinstructionlist1instructionlist2)Gcommand.LIfitheh rstinputhasthevdDalueTRUE,thenIFrunsthesecondinput.LIftheG rst݂inputhasthevdDalueFALSE,HthenIFdoMesnothing.1(Ifgiv!enathirdinput,IFtactslik!eGIFELSE,fasdescribMedbelo!w.)Itisanerrorifthe rstinputisnoteitherTRUEorFALSE.GFeorxcompatibilit!ywithxearlierversionsofLogo,ifxanIFinstructionisnotenclosedinGparen!theses,butthe rstthingontheinstructionlineafterthesecondinputexpressionisGanKliterallistnJ(i.e.,Dalistinsquarebrac!kets),DtheIFnKistreatedasifitw!ereIFELSE,CbutaGw!arningmessageisgiven.cIfthisabMerrantIFappMearsinaproMcedurebodye,Athew!arningisGgiv!enfonlythe rsttimetheproMcedureisinvokedineachLogosession.؍Gmifelse3.IFELSEtfinstructionlist1instructionlist2GcommandoropMeration. Ifthe rstinputhasthevdDalueTRUE,thenIFELSErunsthesecondGinput.);Ifj0thej/ rstinputhasthevdDalueFALSE,"thenIFELSErunsthethirdinput.);IFELSEGoutputsfavdDalueiftheinstructionlistfcon!tainsanexpressionthatoutputsavalue.ٍGmtest3.TESTtfGcommand.ڳRemem!bMersitsinput,whichmustbMeTRUEorFALSE,forusebylaterIFTRUEorGIFFALSEinstructions.Thee ectofTESTisloMcaltotheprocedureinwhic!hitisused;anyGcorrespMondingfIFTRUEorIFFALSEm!ustbeinthesameprocedureorasubprocedure.GSeef[IFFȈALSE],page68,.؍Gmiftrue3.IFTRUEinstructionlist.IFTinstructionlistGcommand.Runsitsinputifthemostrecen!tTESTinstructionhadaTRUEinput.TheTESTGm!ustfhavebMeeninthesameprocedureorasuperprocedure.؍Gmi alse3.IFFALSEinstructionlist.IFFinstructionlistE\2GChapterf8:Con!trolStructuresf[6933͍Gcommand.qRunsB!itsinputB"ifthemostrecen!tTESTinstructionhadaFALSEinput.qTheTEST 33Gm!ustfhavebMeeninthesameprocedureorasuperprocedure.33GSeef[TEST],page68,.5Gmstop3.STOPGcommand.EndstherunningoftheproMcedureinwhic!hitappMears.Con!trolisreturnedtoGthecon!textinwhichthatproMcedurewasinvoked.ThestoppMedproceduredoesnotoutputGafvdDalue.5Gmoutput3.OUTPUTvalue.OPvalueGcommand.DEndsAtheArunningoftheproMcedureinwhic!hitappMears.DThatprocedureAoutputsGtheJvdDalueIvalue8Qtothecon!textIinwhichitwasIinvoked.)Don'tbMeconfused:OOUTPUTIitselfisGafcommand,buttheproMcedurethatin!vokesfOUTPUTisanoperation.4Gmcatch3.CATCHtaginstructionlistGcommand˪or˫opMeration.MRunsitssecondinput.MOutputsifthatinstructionlistoutputs.MIf,Gwhilerunningtheinstructionlist,aTHROWinstructionisexecutedwithatagequaltothe rstGinputj(case-insensitiv!ecomparison),kthentherunningoftheinstructionlistjisterminatedGimmediatelye.|InPthiscasetheCATCHoutputsifavdDalueinputisgiv!entoTHROW.ThetagGm!ustfbMeaword.GIfthetagisthew!ordERROR,аthenanyerrorconditionthatarisesduringtherunningofGtheinstructionlisthasthee ectofTHROW"ERRORLinsteadofprin!tinganerrormessageandGreturning?totoplev!el.TheCATCHdoMes?notoutputifanerroriscaugh!t.Also,fduringtheGrunningoftheinstructionlist,thevdDariableERRACTistempMorarilyun!bound.(IfthereisanGerror3while2ERRACThasavdDalue,ethatvalue3istak!enasaninstructionlisttobMerunafterGprin!tingftheerrormessage.TypicallythevdDalueofERRACT,ifanye,isthelist[PAUSE].)GSeef[ERR!OR],page70,,[ERRACT],page89,,[PeAUSE],page70,.5Gmthrow3.THROWtag.(THROWtagvalue)Gcommand.MustbMeusedwithinthescopMeofaCATCHwithanequaltag.EndstherunningGof}the~instructionlistoftheCATCH.ѐIfTHROWisusedwithonlyoneinput,thecorrespMondingGCATCH#kdoMes#jnotoutputavdDalue.TIfTHROWisusedwitht!wo#kinputs,Bthesecondpro!videsanGoutputffortheCATCH.GTHROW"TOPLEVELkthe$startingvdDalueofthevdDariable;O(3)aw!ordorlistthatwill 33GbMe_evdDaluatedto^determinean!umber,the^limit_vdDalueofthevariable;-[(4)^anoptionalw!ordGorlistthatwillbMeevdDaluatedtodeterminethestepsize."JIfthefourthmem!bMerismissing,GtheFstepFsizewillbMe1or{1depMendingonwhetherthelimitvdDalueisgreaterthanorlessGthanfthestartingvdDalue,respMectiv!elye.33GTheNsecondNinputisaninstructionlist. Thee ectofFORistorunthatinstructionlistGrepMeatedlye,assigning a newvdDaluetothecon!trolvdDariable(theonenamedb!ythe rstmem!bMerGofontheforcon!trollist)eachtime.ˊFirstoothestartingvdDalueisassignedtothecon!trolvdDariable.GThen?the@vdDalueiscomparedtothelimitvdDalue.{FORiscompletewhenthesignof(currentG-flimit)aisthesameasbthesignofthestepsize.(Ifnoexplicitstepsizeispro!vided,theGinstructionlistoisalw!aysorunatleastonce.Anexplicitstepsizecanleadtoazero-tripFOR,Ge.g.,|FOR[I101]...)i.iDOtherwise,|theinstructionlistisrun,thenthestepisaddedtoGthefcurren!tvdDalueofthecontrolvdDariableandFORreturnstothecomparisonstep..?for[i271.5][print:i].2.3.5.5.6.5.?GSeef[R!UN],page67,.Gmdo.while3.DO.WHILEinstructionlisttfexpression(libraryprocedure)Gcommand. RepMeatedly9evdDaluatestheinstructionlistvaslongastheevaluatedtfexpres-sionGremains]TRUE.ifthedatainputis[AfBCDE]GandHEthetemplateisbMeingevdDaluatedwith?replacedb!yB,[then?RESTwouldbMereplacedbyG[CfDE]6e.Iffm!ultipleparallelslotsareused,then(?REST1); goMeswith?1,etc.GInatemplate,ithesym!bMol#representsthepMositioninthedatainputofthemem!bMercurrentlyGbMeingusedasthe?slot- ller.9Thatis,ifthedatainputis[AfBCDE]>,andthetemplateisGbMeingfevdDaluatedwith?replacedb!yB,then#wouldbMereplacedby2.!Gmmap3.MAPtemplatedata(libraryprocedure).(MAPtemplatedata1data2...)Goutputs.aw!ord/orlist,_depMendingonthet!ypMeofthedatainput,_ofthesamelengthasGthatxdatainput.(Ifmorethanonedatainputaregiv!en,=theoutputisofthesametypMeasGdata1.)Eac!hmembMeroftheoutputistheresultofevdDaluatingthetemplateMlist,F llingtheGslotsIwiththecorrespMondingmem!ber(s)ofthedatainput(s).(Alldatainputsm!ustbetheGsamelength.)gInthecaseofaw!ordoutput,theresultsofthetemplateevdDaluationm!ustbMeGw!ords,fandtheyareconcatenatedwithWORD.GIn2atemplate,Jthesym!bMol?RESTrepresents2thepMortionofthedatainputtotherigh!toftheGmem!bMer Hcurrently Gbeing Husedasthe?slot- ller.KThatis,>ifthedatainputis[AfBCDE]Gand9thetemplateisbMeingevdDaluated9with?replacedb!yB,^then?RESTwouldbMereplacedGb!yf[CDE]'.Iffmultipleparallelslotsareused,then(?REST1); goMeswith?1,etc.GInatemplate,ithesym!bMol#representsthepMositioninthedatainputofthemem!bMercurrentlyGbMeingusedasthe?slot- ller.9Thatis,ifthedatainputis[AfBCDE]>,andthetemplateisGbMeingfevdDaluatedwith?replacedb!yB,then#wouldbMereplacedby2.GSeef[W!ORD],page9,.!Gmmap.se3.MAP.SEtemplatedata(libraryprocedure).(MAP.SEtemplatedata1data2...)Goutputs#a#listformedb!yevdDaluatingthetemplatelistrepMeatedlyandconcatenatingtheGresultseusingSENTENCE.`Thatis,rthemem!bMersofetheoutputarethemembMerseoftheresultsGof/ptheevdDaluations.xThe/ooutputlistmigh!t,Qtherefore,QbMeofadi eren!tlengthfromthatofGtheedatainput(s).@(IftheresulteofanevdDaluationistheempt!ylist,ritcontributesnothingtoGthef naloutput.)Thedatainputsma!ybMewordsorlists.GIn2atemplate,Jthesym!bMol?RESTrepresents2thepMortionofthedatainputtotherigh!toftheGmem!bMer Hcurrently Gbeing Husedasthe?slot- ller.KThatis,>ifthedatainputis[AfBCDE]GandHEthetemplateisbMeingevdDaluatedwith?replacedb!yB,[then?RESTwouldbMereplacedbyG[CfDE]6e.Iffm!ultipleparallelslotsareused,then(?REST1); goMeswith?1,etc.NG783)BERKELEYfLOGO6.133͍GInatemplate,ithesym!bMol#representsthepMositioninthedatainputofthemem!bMercurrently 33GbMeingusedasthe?slot- ller.9Thatis,ifthedatainputis[AfBCDE]>,andthetemplateisGbMeingfevdDaluatedwith?replacedb!yB,then#wouldbMereplacedby2.33GSeef[SENTENCE],page9,.iGm lter3.FILTERtftemplatedata(libraryprocedure)Goutputsqarw!ordorlist,depMendingonthet!ypMeofthedatainput,con!tainingasubsetofthe 33Gmem!bMers7-(for7.alist)orc!haracters(foraw!ord)oftheinput.ThetemplateisevdDaluatedonceGforeac!hmembMerorcharacterofthedata,anditm!ustproMduceaTRUEorFALSEvdDalue.CIfGthefvdDalueisTRUE,thenthecorrespMondinginputconstituen!tisincludedintheoutput.33.?printfilter"vowelp"elephant.eea.?GIn2atemplate,Jthesym!bMol?RESTrepresents2thepMortionofthedatainputtotherigh!toftheGmem!bMer Hcurrently Gbeing Husedasthe?slot- ller.KThatis,>ifthedatainputis[AfBCDE]GandHEthetemplateisbMeingevdDaluatedwith?replacedb!yB,[then?RESTwouldbMereplacedbyG[CfDE]6e.GInatemplate,ithesym!bMol#representsthepMositioninthedatainputofthemem!bMercurrentlyGbMeingusedasthe?slot- ller.9Thatis,ifthedatainputis[AfBCDE]>,andthetemplateisGbMeingfevdDaluatedwith?replacedb!yB,then#wouldbMereplacedby2.hGm nd3.FINDtftemplatedata(libraryprocedure)GoutputsYthe rstYconstituen!tofthedatainput(the rstmem!bMerofalist,orthe rstGc!haracterofaword)forwhichthevdDalueproMducedb!yevdDaluatingthetemplatewiththatGconsituen!tfinitsslotisTRUE.Ifthereisnosuchconstituent,theemptylistisoutput.GIn2atemplate,Jthesym!bMol?RESTrepresents2thepMortionofthedatainputtotherigh!toftheGmem!bMer Hcurrently Gbeing Husedasthe?slot- ller.KThatis,>ifthedatainputis[AfBCDE]GandHEthetemplateisbMeingevdDaluatedwith?replacedb!yB,[then?RESTwouldbMereplacedbyG[CfDE]6e.GInatemplate,ithesym!bMol#representsthepMositioninthedatainputofthemem!bMercurrentlyGbMeingusedasthe?slot- ller.9Thatis,ifthedatainputis[AfBCDE]>,andthetemplateisGbMeingfevdDaluatedwith?replacedb!yB,then#wouldbMereplacedby2.iGmreduce3.REDUCEtemplatedata(libraryprocedure)GoutputstheresultofapplyingthetemplateRtoaccum!ulatethemembMersofthedatainput.GThe5template6m!ustbMeat!wo-slot5function.OLTypicallyitis6anassoMciative6functionnameGlik!eSUM.Ifthedatainputhasonlyoneconstituen!t(membMerinalistorc!haracterinaGw!ord),theGoutputisHthatconsituent.Otherwise,thetemplateis rstappliedHwith?1 lledGwiththenext-to-lastconsitien!tand?2withthelastconstituen!t.@Then,:WiftherearemoreOOGChapterf8:Con!trolStructuresf[7933͍Gconstituen!ts,VltheBntemplateBmisappliedwith?1 lledwiththenextconstituen!ttotheleftand 33G?2withtheresultfromthepreviousevdDaluation.ThisproMcesscon!tinuesuntilallconstituen!tsGha!vefbMeenused.Thedatainputma!ynotbeempt!ye.33GNote:Ifthetemplateis,߈lik!eSUM,thenameofaproMcedurethatiscapableofacceptingGarbitrarily(man!yinputs,4itis)moreecienttouseAPPLYinsteadofREDUCE.3#ThelatterisGgoModfforassoMciativ!eproceduresthatha!vefbeenwrittentoacceptexactlyt!wofinputs:.tomax:a:b.outputifelse:a>:b[:a][:b].endff.printreduce"max[...]GAlternativ!elye,REDUCE?canbMeusedtowriteMAXasa>procedurethatacceptsan!ynumbMerofGinputs,fasSUMdoMes:.tomax[:inputs]2.ifemptyp:inputs~@8[(throw"error[notenoughinputstomax])].outputreduce[ifelse?1>?2[?1][?2]]:inputs.endGSeef[SUM],page29,,[APPLeY],page76,.ZGmcrossmap3.CROSSMAPtemplatelistlist(libraryprocedure).(CROSSMAPtemplatedata1data2...)Goutputs҄alistcon!taining҃theresultsoftemplateevdDaluations.b7Each҃datalistcontributestoGaeslotdinthetemplate;then!umbMerofeslotsisequaltothen!umbMereofdatalistinputs.AsaGspMecialcase,ifonlyonedatalistinputisgiv!en,thatlististak!enasalistofdatalists,andGeac!hDofitsmembMersEcontributesvdDaluestoaslot.CROSSMAPdi ersfromEMAPinthatinsteadGoftakingmem!bMersfromthedatainputsinparallel,Iittak!esallpMossiblecom!binationsofGmem!bMersfofdatainputs,whichneednotbMethesamelength..?show(crossmap[word?1?2][abc][1234]).[a1a2a3a4b1b2b3b4c1c2c3c4].?GFeor compatibilit!ywiththeversioninthe rsteditionofCSLSٓRcmr71|s,CROSSMAPtemplatesmayGusefthenotation:1insteadof?1toindicateslots.GSeef[MAP],page77,.ZGmcascade3.CASCADEendtesttemplatestartvalue(libraryprocedure).(CASCADEendtesttmp1sv1tmp2sv2...).(CASCADEendtesttmp1sv1tmp2sv2...finaltemplate)G ff= /㏟-=1"q[ cmsl9ComputerTScienceLogoSt9ylePG803)BERKELEYfLOGO6.133͍Goutputs-the-resultofapplyingatemplate(orsev!eraltemplates,FasexplainedbMelo!w)repeat- 33Gedlye,withagiv!envdDalue llingtheslotthe rsttime,andtheresultofeachapplicationG llingftheslotforthefollo!wingapplication.33GInthesimplestcase,CASCADEhasthreeinputs.pThesecondinputisaone-slotexpressionGtemplate.aXThat'templateisevdDaluatedsomen!umbMer'oftimes(perhapszero).aXOnthe rstGevdDaluation,5Ntheslotis lledwiththethirdinput;H(onsubsequen!tevdDaluations,5Ntheslotis lledGwithnSthenTresultofthepreviousevdDaluation.,Then!umbMerofnSevdDaluationsisdeterminedb!ytheG rstinput.ThiscanbMeeitheranonnegativ!einteger, inwhichcasethetemplateisevdDaluatedGthat7man!y7times,Norapredicateexpressiontemplate,Ninwhic!hcaseitisevdDaluated(withtheGsame^slot^ llerthatwillbMeusedfortheevdDaluationofthesecondinput)repMeatedlye,m:andtheGCASCADEqevdDaluationrcon!tinuesaslongasrthepredicatevdDalueisFALSE.(Inotherw!ords, theGpredicateftemplateindicatestheconditionforstopping.)GIfthetemplateisevdDaluatedzerotimes, ltheoutputfromCASCADEisthethird(startvdDalue)Ginput.Otherwise,ftheoutputisthevdDalueproMducedb!ythelasttemplateevaluation.GCASCADEtemplatesma!yincludethesym!bMol#torepresen!tthen!umbMeroftimesthetemplateGhasʻbMeenevdDaluated.JThisslotis lledwith1forthe rstevaluation,2forthesecond,andGsofon..?showcascade5[lput#?][].[12345].?showcascade[vowelpfirst?][bf?]"spring.ing.?showcascade5[#*?]1.120.?GSev!eral/cascadedresultscanbMecomputedinparallelbyprovidingadditionaltemplate-GstartvdDalue\pairsas[inputstoCASCADE.Inthiscase,alltemplates(includingtheendtestGtemplate,(ifhused)aregm!ulti-slot,)withthehnumbMerofslotsgequaltothenumbMergofpairsofGinputs.˿InKeac!hKroundofevdDaluations,t.?2,t/forexample,represen!tstheresultKofevdDaluatingGthesecondtemplateinthepreviousround.yIfthetotaln!umbMerofinputs(includingtheG rstendtestinput)isoMdd,7thentheoutputfromCASCADEisthe nalvdDalueofthe rstGtemplate.QIfJ7theJ8totaln!umbMerofJ7inputsisev!en,s+thenthelastinputisatemplatethatisGevdDaluatedfonce,aftertheendtestissatis ed,todeterminetheoutputfromCASCADE..tofibonacci:n.output(cascade:n[?1+?2]1[?1]0).endff.topiglatin:word.output(cascade[vowelpfirst?]~<[wordbf?first?]~<:word~<[word?"ay]).endQGChapterf8:Con!trolStructuresf[8133͍Gmcascade.23.CASCADE.2endtesttemp1startval1temp2startval2 T(libraryprocedure)33Goutputs*Itheresultofin!voking*ICASCADEwiththe*Jsameinputs.iTheonlydi erenceisthat 33Gthefdefaultn!umbMerfofinputsis v!einsteadofthree.Gmtransfer.TRANSFERendtesttemplateinbasket(libraryprocedure)GoutputstheresultofrepMeatedevdDaluationofthetemplate.ThetemplateisevdDaluatedonce 33Gforeac!hmembMerofthelistinbasket.-RTRANSFERmaintainsanoutbasketthatisinitiallyGtheYempt!yXlist.كAftereachXevdDaluationofthetemplate,theresultingvdDaluebMecomesthenewGoutbask!et.GInthetemplate,Ythesym!bMol?INrepresentsthecurrentmembMerfromtheinbasket;theGsym!bMolѠ?OUTѡrepresentstheentireѡcurrentoutbasket._OtherѡslotsymbMolsshouldѡnotbeGused.GIfthe rst(endtest=)inputisanempt!ylist,"evdDaluationcon!tinuesuntilallinbasketmem-GbMersha!vebeenused.8Ifnot,7the rstinputm!ustbMeapredicateexpressiontemplate,7andGevdDaluationfcon!tinuesuntileitherthattemplate'svdDalueisTRUEortheinbasketisusedup.Rҍ33SЍ8333͍GZ9 QMacros#ԍGc.macro33..MACROprocname:input1:input2... T(specialform) 33..DEFMACROprocnametext33GA)macro)is)aspMecialkindofprocedurewhoseoutputis)evdDaluatedasLogoinstructionsinGtheġcon!textĢofthemacro'scaller.8.MACROisexactlylik!eTOexceptthatthenewproMcedureGbMecomesfamacro;.DEFMACROisexactlylik!eDEFINEwiththesameexception.GMacrosKareusefulKforin!ventingKnewcon!trolstructurescomparabletoREPEAT,uSIF,andKsoGon.uSuc!hcontrolstructurescanalmost,>butnotquite,>bMeduplicatedb!yordinaryLogoGproMcedures.Feorfexample,hereisanordinaryprocedurev!ersionofREPEAT:.tomy.repeat:num:instructions.if:num=0[stop].run:instructions.my.repeat:num-1:instructions.endGThisfv!ersionworks neformostpurpMoses,e.g.,.my.repeat5[print"hello]GBut?itdoMesn't?w!orkiftheinstructionstobMecarriedoutincludeOUTPUT,eSTOP,or?LOCAL.GFeorfexample,considerthisproMcedure:.toexample.print[Guessmysecretword. TYougetthreeguesses.].repeat3[type"|??|~hv@ifreadword="secret[pr"Right!stop]].print[Sorry,thewordwas"secret"!].endGThisHproMcedurew!orksaswritten,[PbutifMY.REPEATisusedinsteadofREPEAT,itw!on'tworkGbMecauseftheSTOPwillstopMY.REPEATinsteadofstoppingEXAMPLEasdesired.GTheX%solutionX&istomak!eMY.REPEATamacro.Insteadofactuallycarryingoutthecomputa-Gtion,amacrom!ustreturnalistcon!tainingLogoinstructions.@Thecon!tentsofthatlistareGevdDaluatedasiftheyappMearedinplaceofthecalltothemacro.0Here'samacrov!ersionofGREPEAT:..macromy.repeat:num:instructions.if:num=0[output[]].outputsentence:instructions~<(list"my.repeat:num-1:instructions).endGEv!ery\macrois]anopMeration|itm!ustalwaysoutputsomething.6Evenin]thebasecase,GMY.REPEAToutputsanempt!yinstructionlist.Teosho!whowMY.REPEATworks,:let'staketheGexampleT G843)BERKELEYfLOGO6.133͍.my.repeat5[print"hello]33GFeorfthisexample,MY.REPEATwilloutputtheinstructionlist.[print"hellomy.repeat4[print"hello]]GLogomthenmexecutestheseinstructionsinplaceoftheoriginalin!voMcationmofMY.REPEAT;this 33Gprin!tsfhelloonceandinvokesanotherrepMetition.GTheRFtec!hniqueRGjustshown,}>althoughfairlyeasyRGtounderstand,hasthedefectRGofslo!wnessGbMecauseJeac!hrepetitionhastoconstructanKinstructionlistforevdDaluation.dAnotherap-Gproac!h3)istomake3(MY.REPEATamacrothatworksjustlikethe3(non-macroversionunlesstheGinstructionsftobMerepeatedincludeOUTPUTorSTOP:..macromy.repeat:num:instructions.catch"repeat.catchtag~Qw[oprepeat.donerunresult[repeat1:num:instructions]].op[].endff.torepeat1:num:instructions.if:num=0[throw"repeat.catchtag].run:instructions..maybeoutputrepeat1:num-1:instructions.end.torepeat.done:repeat.result.ifemptyp:repeat.result[op[stop]].oplist"outputquotedfirst:repeat.result.end33GIf|the|instructionsdonotincludeSTOPorOUTPUT,{thenREPEAT1willreac!hitsbasecaseGandin!vokeTHROW.Asaresult,MY.REPEAT'slastinstructionlinewilloutputanemptylist,Gso[athe[bevdDaluationofthemacroresultb!ythecallerwilldonothing.ButifaSTOPorOUTPUTGhappMens,]thenKREPEAT.DONEwillKoutputaSTOPorOUTPUTinstructionthatwillbMeexecutedGinfthecaller'scon!text.GThezmacro-de ningzcommandsha!veznamesstartingwithadotbMecausemacrosareanGadvdDancedH\featureofLogo;Vit'seasytogetintroubleb!yde ningamacrothatdoMesn'tGterminate,forb!yfailingtoconstructtheinstructionlistpropMerlye.GLispusersshouldnotethatLogomacrosarenotspMecialforms.Thatis,theinputstotheGmacro84are83evdDaluatednormallye,N=astheyw!ouldbMeforan!yotherLogoproMcedure."It'sonlytheGoutputffromthemacrothat'shandledun!usuallye.GHere'sfanotherexample:..macrolocalmake:name:value.output(list"local9|~y>word"":name>~y>"apply9|~U GChapterf9:MacrosL58533͍y>""make9|~ 33y>(list:name:value)).end33GIt'sfusedthisw!ay:.totry 33.localmake"garply"hello.print:garply.end33GLOCALMAKEfoutputsthelist.[loMcalf"garplyapply"mak!e[garplyhello]]GThereasonfortheuseofAPPLYistoa!voidhavingtodecidewhetherornotthesecond 33Ginput0toMAKErequiresaquotationmarkbMeforeit.;(Inthiscaseitw!ould|MAKEf"GARPLYG"HELLOf|butthequotationmarkw!ouldbMewrongifthevdDaluewerealist.)33GIt'sfoftencon!venientftousethe`functiontoconstructtheinstructionlist:..macrolocalmake:name:value 33.op`[local,[word"":name]apply"make[,[:name],[:value]]].end33GOnftheotherhand,`isprett!yslow,sinceit'streerecursiveandwritteninLogo.GSee[TO],page49, , [DEFINE],page50,,[APPLeY],page76,, [STOP],page69,, [OUT- 33GPUT],fpage69,.㐍Gm.defmacro3GSeef[dMA!CRO],page83,.㑍Gmmacrop.MACROPname.MACRO?name33GoutputsfTRUEifitsinputisthenameofamacro.㐍Gmmacroiexpand.MACROEXPANDexpr(libraryprocedure)Gtak!es@asAitsinputaLogoexpressionthatin!vokes@amacro(thatis,onethatbMeginswith 33Gtheinamejofamacro)andoutputsthetheLogoexpressionin!towhichithemacrow!ouldGtranslateftheinputexpression...macrolocalmake:name:value.op`[local,[word"":name]apply"make[,[:name],[:value]]].endff.?showmacroexpand[localmake"pi3.14159].[local"piapply"make[pi3.14159]]VS33W썟8733͍GZ10 QErrorzPro=cessingҍGIfanerroroMccurs,aLogotak!esthefollowingsteps.First,aifthereisanavdDailablevariable 33GnamedvERRACT,Logotak!esitsvdDalueasaninstructionlistandrunsvtheinstructions.NTheGopMerationERRORma!ybeusedwithintheinstructions(once)toexaminetheerrorcondition.GIfuthetinstructionlistin!vokesPAUSE,rtheuerrormessageisprin!tedbMeforethepausehappMens.GCertainVerrorsarereco!verable;q"forVoneofthoseerrors,fziftheinstructionlistoutputsavdDalue,GthatvdDalueisusedinplaceoftheexpressionthatcausedtheerror.(IfERRACTin!vokesPAUSEGandyStheyRuserthenin!vokesySCONTINUEwithaninput, thatinputbMecomestheoutputfromGPAUSEfandthereforetheoutputfromtheERRACTinstructionlist.)33GItPisPpMossibleforanERRACTinstructionlisttoproMduceaninappropriatevdDalueornovdDalueGwhereloneisneeded.Asaresult,)thesameerrorconditioncouldrecurforev!erbMecauseGof)this(mec!hanism.R%Teoavoid)thatdanger,ifthesame(errorconditionoMccurst!wiceinaGro!wgfromhanERRACTinstructionlistwithoutuserin!teraction,ާthemessage`Erractfloop'isGprin!ted and controlreturns totoplevel. "Withoutuser interaction"means thatifERRACTGin!vokesxPAUSEyandtheuserpro!videsanincorrectvdDalue,thisloMopprev!entionxmechanismGdoMesfnottak!ee ectandtheusergetstotryagain.GDuringd+thed,runningoftheERRACTinstructionlist,ERRACTisloMcallyun!bound,soand+errorGinŋtheŌERRACTinstructionsthemselv!eswillnotcausealoMop.;NInparticular,UanerrorduringGapausewillnotcauseapause-within-a-pauseunlesstheuserreassignsthevdDalue[PAUSE]Gto/ERRACT/duringthepause.yButsuc!hanerrorwillnotreturntotoplev!el;t8itwillremainGwithinftheoriginalpauseloMop.GIfthereisnoa!vdDailableERRACTvdDalue,{Logohandlestheerrorb!ygeneratinganin!ternalGTHROW"ERRORW ?.(A[user[program[canalsogenerateanerrorconditiondelibMeratelyb!yin-Gv!oking@pTHROW.)If@othisthrowis@onotcaughtby@oaCATCH"ERRORM|intheuserprogram,fitisGev!entuallyPcaughtQeitherbythetoplevelQinstructionloMoporbyQapauseloMop,whichQprintstheGerrormessage.JAnin!voMcationofCATCH"ERRORJkUinauserprogramloMcallyun!bindsERRACT,msoGthee ectisthatwhic!heverofERRACTandCATCH"ERRORK/^ismoreloMcalwilltak!eprecedence.GIfCa oatingCpMoin!tover owoMccursduringCanarithmeticoperation,kBorCat!wo-inputCmathe-Gmatical;Wfunction(lik!e;VPOWER)isinvokedwithan;Villegalcombinationofinputs,Pthe`doesn'tGlike'!messagereferstothe secondopMerand,butshouldbe tak!enasmeaningthecombina-Gtion.GSeey[ERRA!CT],page89,,[THROW],ypage69,,[ERROR],page70,,[CAeTCH],ypage69,,G[PeA!USE],fpage70,,[CONTINUE],page70,.ύGc10.1Errorf@Cos3des33GHerelaremthen!umericcoMdesthatappMearasthe rstmem!bMerofthelistoutputb!yERRORwhenGanerroriscaugh!t,"withthecorrespMondingmessages.Somemessagesmayhavetwodi erentGcoMdesdependingonwhetherornottheerrorisreco!verable(thatis,asubstitutevdDaluecanGbMey2pro!videdthroughthey1ERRACTmechanism)inthespMeci ccontext.V@SomemessagesareGw!arnings9aratherthanerrors;]thesewillnotbMecaught.Errors0and32aresobadthatLogoGexitsfimmediatelye.:x0Fatalinternalerror T(can'tfbMecaugh!t)X%G883)BERKELEYfLOGO6.133͍:x1Outofmemory 33:x2Stackoverflow:x3Turtleoutofbounds:x4procdoesn'tlikedatumasinput T(notfreco!verable):x5procdidn'toutputtoproc:x6Notenoughinputstoproc:x7procdoesn'tlikedatumasinput T(reco!verable):x8Toomuchinside()'s:x9 TYoudon'tsaywhattodowithdatum4F10')'notfound4F11varhasnovalue4F12Unexpected')'4F13Idon'tknowhowtoproc T(reco!verable)4F14Can'tfindcatchtagforthrowtag4F15procisalreadydefined4F16Stopped4F17Alreadydribbling4F18Filesystemerror4F19AssumingyoumeanIFELSE,notIF T(w!arningfonly)4F20varshadowedbylocalinprocedurecall T(w!arningfonly)4F21Throw"Error4F22procisaprimitive4F23Can'tuseTOinsideaprocedure4F24Idon'tknowhowtoproc T(notfreco!verable)4F25IFTRUE/IFFALSEwithoutTEST4F26Unexpected']'4F27Unexpected'}'4F28Couldn'tinitializegraphics4F29Macroreturnedvalueinsteadofalist4F30Youdon'tsaywhattodowithvalue4F31CanonlyuseSTOPorOUTPUTinsideaprocedure4F32APPLYdoesn'tlikebadthingasinput4F33ENDinsidemulti-lineinstruction4F34Reallyoutofmemory T(can'tfbMecaugh!t)4F35user-generatederrormessage(THROW"ERRORmessage)4F36ENDinsidemulti-lineinstruction4F37Baddefaultexpressionforoptionalinput:expr4F38Can'tuseOUTPUTorSTOPinsideRUNRESULT4F39 TAssumingyoumeant'FD100',notFD100(orfsimilar)4F40Ican'topenfilefilename4F41Filefilenamealreadyopen4F42Filefilenamenotopen4F43Runlist[exprexpr]hasmorethanoneexpression.Y0i8933͍GZ11 QSp=ecialzVaGariables",aGLogotak!esspMecialactionifan!yofthefollo!wingvdDariablenamesexists.,Theyfollo!wthe 33Gnormaloscopingrules,soaproMcedurecanlocallysetoneofthemtoolimitthescopeofitse ect.GInitiallye,bno vdDariables existexceptforALLOWGETSET,bCASEIGNOREDP,bandUNBURYONEDIT,Gwhic!hfareTRUEandburied.z⍍Gcallowgetset33.ALLOWGETSET6(variable)33GifTRUE,)indicatesthatanattempttouseaproMcedurethatdoesn'texistshouldbetak!enasGanHimplicitgetterorsetterproMcedure(setteriftheG rstthreelettersofthenameareSET)GforfavdDariableofthesamename(withouttheSETifappropriate).Gmbuttonact3.BUTTONACT6(variable)Gif"nonempt!ye,QshouldbMeaninstructionlistthatwillbeevdDaluatedwhenev!eramousebuttonGis?pressed.gNotethattheuserma!y>have?releasedthebuttonbMeforetheinstructionsareGevdDaluated.7BUTTONswilltstilloutputwhic!hbuttonw!asmostrecen!tlypressed.6CLICKPOSwillGoutput ]the \pMositionofthemousecursoratthemomen!tthebuttonw!aspressed;(variable)Gafrealn!umbMerfindicatingtheLogov!ersionnumbMer,e.g.,5.5Gmlogoplatform3.LOGOPLATFORM4>(variable)Gonefofthefollo!wingwords:wxWidgets,X11,Windows,orUnix-nographics.\L33]S39333͍GZ12 QInuternationalization)GBerk!eleyLogohaslimitedsuppMortfornon-English-speakingusers.Alas,thereisnoUnicode 33GsuppMort,fandhigh-bit-onASCIIcodesw!orkinsomecontextsbutnotothers.33GIftiy!outhwanttotranslateBerkeleythLogoforusewithanotherlanguage,~htherearethreemainGthingsfy!ouhavetodo:.1.Primitivenames.2.Error(andother)messages.3.DocumentationGFeorCprimitiv!eCnames,Wtheeasiestthingistopro!videastartup lethatde nesaliasesfortheGEnglishfprimitiv!enames,usingCOPYDEF:.COPYDEF"AVANT"FORWARDGThisQshouldtak!ecareQofit,bunlessy!ourlanguage'snameforoneprimitiveQisspMelledliketheGEnglishfnamefofadi eren!tprimitive.ȻInthatcasefyouhavetofturnREDEFPonandbMesureGtofcop!ythenon-con ictingnamebMeforeoverwritingthecon ictingone!G"Primitiv!es"gthatareactuallyintheLogolibrarye,-gofcourse,canjustbMereplacedoraug-Gmen!tedfwithnative-language-namedLogoproMceduresand lenames.GOf1courseLogoprogramswillstillnotloMok1lik!eyournativelanguageifthewordorderisGdramaticallyfdi eren!t,espMeciallyifyoudon'tputverbsbMeforetheirobjects.GFeorGerrorFmessages,thereisa lenamedMessagesinthelogolibdirectorywithtextsofGmessages,eoneUVpMerUWline.Yeoucanreplacethiswitha lefory!ourownUVlanguage.Donotadd,Gdelete,ort=reordertother-language-namedpredicates>generatethealternatew!ords.ThiscanbMeGdone0b!yleavingUseAlternateNamesfalse,Hfandinsteadofde ningtheother-languagepred-GicatesfwithCOPYDEF,doitthisw!ay:.tofrench.boolean:bool.ifequalp:bool"true[output"vrai].ifequalp:bool"false[output"faux].output:bool;shouldn'thappen.endff.tomake.french.predicate:french:english:arity.define:french`[[[inputs],[:arity]][outputfrench.booleanEDapply,[word"":english]:inputs]].end.?make.french.predicate"egal?"equal?2.?pregal?34.faux.?pregal?44.vrai.?prequal?34.false.?prequal?44_a9533͍.true33GThedthirdinputtodmake.french.predicateisthen!umbMerdofinputsthatthepredicateex- 33GpMects.This'solutionisn'tquite'perfectbecausethein xpredicates'(=,@<,@>)will'stilloutputGin;English.$If:y!ouwant:themtogeneratealternate-languagew!ords,CsetUseAlternateNamesGtofTRUEinstead.GSomeofthew!ordsinthissectionoftheMessages learenamesofLogoprimitiv!es(OUTPUT,GSTOP,(GOTO,(TAG,IF,IFELSE,TO,.MACRO).uTeo 0translate /thesenames,(y!oumust 0useCOPYDEFGasjdescribMedearlier,vinadditiontoc!hangingthenamesinMessages.Yeoushouldbeconsis-Gten!tfinthesetwosteps.Don'tforgetthepMeriodfin.macro!GFeorCdoMcumen!tation,:therearetwokinds: thismanualandthehelp les.%tThelatterareGgenerated"automatically"fromthisman!ualify!ouhaveaUnix"system,Bsointhatcasey!ouGneed"8only"7translatethisman!ual,signsatthebMeginningsoflines.)GTheprogrammakefile.cma!yrequiremoMdi cationbecauseafewoftheprimitiv!enamesGarefspMecialcases(e.g.,LOG10istheonlynamewithdigitsincluded).GIfy!oudon'thaveUnixtoMols, youcanjusttranslateeachhelp leindividuallye.UApMeriodinGarprimitiv!enamerisrepresentedasaDrinthe lename;thereareno lesforquestionmarksGbMecausetheHELPcommandloMoksforthe lenamedafterthecorrespMondingprimitiv!ethatGendsfinP.`l፟33at9733͍GZINDEX_33L&c*.Go cmr9*čU5" cmmi9:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W29#ڍc+GߤN cmtt9+U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Jլ29c{G-MፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:29#ٍc./G.defmacropU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:nL83 G.eq,U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:i15 G.macroU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Mڬ83G.ma9ybAeoutputnSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/071G.setbf-U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:13G.set rstDU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:13G.setitemFjU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:G13G.setsegmen9tsize|U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:X65&Xc/.G/čU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W29#ڍk<G<U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Jլ32 G<= U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c32G<>;eU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:B15#ٍc=/G=MፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:14k>.G>U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Jլ32G>= U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c32c`/G`U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P72L&kcAcallopAen6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:x23 \Allo9wGetSetLU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 4 ]allo9wgetset%U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c89andU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P35applySU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/76arcፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:39arctanRSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/31arit9yU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Mڬ55arra9y6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:9arra9y?pU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:1h14arra9yp ፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ξ14arra9ytolistۍU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:K10asciiNiU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F16ashift뿍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:34) 썒kcBcbac9koU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L37bac9kgroundU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h46bAefore?U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:t15bAeforepQpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L15bfoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:K11bfs&jU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F11bg6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:46bitand6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:33bitnot؋U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h34bitorK7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 33bitxorčU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:33bkSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/37bl U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:12buriedQፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:54buried?0U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ60buriedpSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:060buryፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:n59bury9all pU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L59buryname)⍑U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:꾬59but rstKU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 11but rstsU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Gά11butlastU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c12buttonU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P47button?nōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/47buttonactU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P89buttonp U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:47b9ye3U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:71btG983)BERKELEYfLOGO6.133&cC Gcascade 1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 79 <Gcascade.2U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P81GcaseцU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:b74 =Gcase-insensitiv9e8эU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:6GcaseignoredpNU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:*89Gcatc9huፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:669Gc9hars6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:417GcleanU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:40GclearscreenkU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:CG40GcleartextU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:m۬26Gclic9kpAosh1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:) 47GcloseU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:I23GcloseallцU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:b23GcočU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W70Gcom9bine6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:x10GcommandlineU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:89Gcommen9tsgU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:(6GComputerƉc4gScienceƉc4gLogoƉc4gSt9yle`U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:<1GcondU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P74Gcon9tentsU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P54Gcon9tinueTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h70Gcop9ydefፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:51GCop9yrightlU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:,1GcosU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Ԭ31Gcoun9tSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/16GcrossmapȹU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:79GcsU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c40GcslsloadGU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:$63Gct U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:26Gcursor̢U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:26,%cD Gdecreasefon9tU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:լ27Gde neLU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: ۬50Gde ned?ōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:w54Gde nedpTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:54GdelimitersNU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:*6GdequeueU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:14Gdi erence0U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:29Gdo.un9tilU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:qh73Gdo.whileSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W/73GdribbleU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:۬24,%cE GedTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h61Gedall7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P62GeditMpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L61Gedit leōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:O61GeditorJōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 61GednU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ62Gedns 1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 62GedplSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W/62GedplsцU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:b62Gedps 1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 62Gempt9y?uoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:6L14&empt9ypōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ӡ14 eofq?U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:25eofp6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:x25 epspictU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:47equal?TU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h14equalpፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:14erU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:۬57erallQፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:58eraseU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:լ57erase leCNU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:+23erfpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:nL23ernU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:T58ernsۍU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:58erplJōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 58erplsU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Fլ58erpsۍU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:58erractHU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:89errorEpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:M70errorsU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:A87expፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:30kcF3fdoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:K37fenceU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h40 le?U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ26 lepSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W/26 lloU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L41 lledMpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L41 lterU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Mi78 ndMፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:78 rst܍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ø10 rsts>U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:11fon9t U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:28forlU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:,72foreac9hoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L76forev9erhU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:)i67formፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:n33forw9ardU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:37fputoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:K9fsU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:jԬ41fullprin9tpRSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/90fullscreenkU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:,41fulltextSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W/51:kcG3gcčU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W64gensym-U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:10getterU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L2global U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:52gotoTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ71gpropU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Mڬ53greater?7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:32greaterequal?U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P32greaterequalp-pU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:M32greaterpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Qi32c,GINDEXy`9933&cH`Gheading7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P39 GhelpSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W/63 GhideturtleU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L40GhomeTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h38Gh9tU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:x40Y_cI_Gif4U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:68Gifelse%U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c68Gi oU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:K68Gi alseU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:jc68GiftuፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:668Giftrue0U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ68GignoreoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L72Gincreasefon9tU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Fc27Gin9tnōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/30Gin9vokeuoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:6L76GiseqgU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:(31GitemōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ӡ12Y^cK`Gk9ey?ōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ӡ26Gk9eyactTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h90Gk9eypU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:p26VcLGlabAelnSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/041 GlabAelsizenjU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/F43GlastۍU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:11Glea9vingTucblogo1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:z 5GleftuoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:6L38Gless?乍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:32Glessequal?U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Bz32GlessequalpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Ϭ32GlesspU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:B32Gline-con9tinuationōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ӡ6GlistU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c9Glist?U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:q14GlistpNiU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F14Glisttoarra9yۍU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:K10Gln U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:30GloadčU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W63Gloadnoisily뿍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:90Gloadpict U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:46GloAcalU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:qh52GloAcalmak9enSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/052Glog10čU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W30GlogohelpSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W/63Glogoplatform嗀U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:91Glogo9version#NU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:*91Glo9wercaseU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:M17Glput U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:9GlshiftۍU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:34GltoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L38&kcMꍒmacro?U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:uڬ85 cmacroAexpandU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:T85macropRSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/85mak9eSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W/51mapTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ77 cmap.seF܍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:77mdarra9yOU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:10mditemU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ12mdsetitemMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c13mem9bAerU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:i17mem9bAer?ፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:15mem9bAerp7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:T15min9us&jU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F29moAdulo4U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:30mousepAos乍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:470kcNꍒnameTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h51name?3U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:54namelistMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Ԭ55namepU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ54namesU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P55noAdesU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:jc56noAdribble0U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ24norefresh죍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:42notTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ35notequal?U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ15notequalpnSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/015n9umbAer?SU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:016n9umbAerpkU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:,160kcOꍒop6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:69opAenappend 7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:23opAenreadፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:22opAen9updatepU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L23opAen9writeU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L22orፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:35outputU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P69dZG100-BERKELEYfLOGO6.133&cPgGpaletteLU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: ۬46 GparseU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:M18GpausejU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F70GpAc4U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:45GpAdU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:qh43GpAe3U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:44GpAenU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:p46GpAencolor0U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ45GpAendo9wnMpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L43GpAendo9wn?,U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:i45 GpAendo9wnpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:45GpAeneraseU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:44GpAenmode 7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:45GpAenpain9t7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P44GpAenpattern)pU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:M46GpAenrev9erse&kU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:G44GpAensize1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:q 46GpAen9upU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:43Gpic9k؋U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h12GplistNiU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F53Gplist?-U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:b54GplistpۍU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:54GplistsU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Jy55GpllistU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c55GpAoSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/56GpAoall,U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ56GpAonnōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/57GpAonsU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:jԬ56GpAopnōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/13GpAopl4U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:57GpAoplsoMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:0)57GpAopsU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:jԬ56GpAos-U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:b39GpAot4U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:57GpAotsoMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:0)57GpAo9wer)⍑U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:꾬30GppropK7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 53Gppt6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:44GprU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:T19Gpre xpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:nL22Gprimitiv9e?SU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/53Gprimitiv9epU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:T53Gprimitiv9esD1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:55 Gprin9t*SU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:019Gprin9tdepthlimitU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:uh90Gprin9toutU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:uڬ56Gprin9twidthlimitፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:90GproAcedure?GU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:53GproAcedurep7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:53GproAceduresU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:d55GproAductlU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:,29GpuoU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L43GpushU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:I13Gp9x6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:44&kcQqueuem⍑U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:.14 @quotednSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/012quotien9tSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W/29|kcRradarctanU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:31radcosKU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 31radsinMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:)31randomōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:32ra9wasciiDU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:16 Arc pU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L21rcsDU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:21readc9har쌍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:i21readc9hars'U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:蜬21readerU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Qi25readlistKMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: *20readpAos܍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:g25readra9wline-⍑U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:20readw9ordፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:r20redefpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:t91reduceU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Ѕ78refreshU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:d42remainder⍑U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ƿ30remdupSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:012remo9veፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:12rempropO7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:53repAcoun9tU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Mi68repAeatrSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:3067rerandom pU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L33rev9erse@U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:10righ9tlU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:,38rlōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:20roundK7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 30rseqᅪU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:31rtK7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 38runU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h67runparseU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:18runparsingMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:*6runresult U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Ԭ67rwōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:20ykcSsa9veU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:q62sa9velgU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:(63sa9vepict%U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:լ46screenmoAde)U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c43scrunc9hU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:39scrunc9h.dat*ۍU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:븬42seF܍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:9sen9tenceU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:p9setbac9kgroundU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:M45setbgU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P45setcslsloAcAU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:64setcursor:U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Ϭ26seteditorNU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:*64esGINDEX|10133 Gsetfon9tU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:I28 jGsethцU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:b38Gsetheading U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:̜38 iGsethelploAcgNU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:(*64GsetitemMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P*12GsetlabAelheigh9tɇU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c41GsetlibloAcU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:q64Gsetmargins+U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:26GsetpaletteɇU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c44GsetpAcU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:q44GsetpAen,U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:45GsetpAencolorU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:nc44GsetpAenpatternU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:fլ45GsetpAensizeU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:^44GsetpAosU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:j38Gsetpre x)U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:լ22GsetreadjU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F24GsetreadpAos#dU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:A25Gsetscrunc9heU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:&y42GsettcU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:I27GsettemploAcU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:i64Gsetter U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:2Gsettextcolor1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:27GsettextsizegdU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:(A27Gset9writedU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:%24Gset9writepAos֍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:25GsetxiU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F38GsetxyU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:P38Gset9yU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:38Gshell 1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U: 21Gsho9w&jU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F20Gsho9wn?0U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Q 43Gsho9wnp-U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:b43Gsho9wturtle*jU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F39GsinGMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:*31GsplitscreenDHU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:$42Gsqrt#U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:䜬30Gss@U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:42GstGMU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:*39GstandoutU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:I17GstartingTucblogo3U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ά5GstartupU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Nb91GstepцU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:b60GsteppAedU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:i54GsteppAed?1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:I61GsteppAedp%U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:c61Gstop0U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Q 69Gsubstring?ՍU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h16GsubstringpE+U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:16GsumU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Ԭ29kcT 썒tagčU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W72 @tempU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:61 AtemplateōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:O74testU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:I68textU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ51textscreen܍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:41textsize܍U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:27thingčU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W52thro9wlU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:,69to؋U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:h49to9wardsjU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:GF39traceU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:۬60tracedU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:T54traced?rōU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:360tracedpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:60transfer1U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:e81turtlemoAde)pU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:M43t9ypAe3U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:19$}kcU 썒un9buryፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:59un9buryall1oU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L59un9burynameQፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:59un9buryoneditU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:uh91unstepjU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F60un9tilU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:qh73un9trace0U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:ڬ60uppAercasedU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:%17usealternatenamesU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:Ϭ91${kcV 썒vbarred?⍑U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:J16vbarredp'7U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:16$}kcWw9aituፑU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:671whileSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:W/73 @windo9wSU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:/40w9ordlU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:,9w9ordpU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:uڬ14wrap pU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:L40writepAos*jU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:F25writerTU:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:025${kcX 썒xcors6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:439kcYycors6U:pU:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:U:439fa"33۶;C6ïsmN # cmbx12kgff cmmi12cNff cmbx12ZNG cmbx12QNj cmbx12?!", 3 cmsy10> b> 3 cmmi10= BERKELEY LOGO 6.1: About This Document
[Top] [Contents] [Index] [ ? ]

About This Document

This document was generated on December 27, 2019 using texi2html 5.0.

The buttons in the navigation panels have the following meaning:

Button Name Go to From 1.2.3 go to
[ << ] FastBack Beginning of this chapter or previous chapter 1
[ < ] Back Previous section in reading order 1.2.2
[ Up ] Up Up section 1.2
[ > ] Forward Next section in reading order 1.2.4
[ >> ] FastForward Next chapter 2
[Top] Top Cover (top) of document  
[Contents] Contents Table of contents  
[Index] Index Index  
[ ? ] About About (help)  

where the Example assumes that the current position is at Subsubsection One-Two-Three of a document of the following structure:

  • 1. Section One
    • 1.1 Subsection One-One
      • ...
    • 1.2 Subsection One-Two
      • 1.2.1 Subsubsection One-Two-One
      • 1.2.2 Subsubsection One-Two-Two
      • 1.2.3 Subsubsection One-Two-Three     <== Current Position
      • 1.2.4 Subsubsection One-Two-Four
    • 1.3 Subsection One-Three
      • ...
    • 1.4 Subsection One-Four

[Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_ovr.html0000664000175000017500000001101013601426471016733 0ustar jjcjjc BERKELEY LOGO 6.1: Short Table of Contents
[Top] [Contents] [Index] [ ? ]

Short Table of Contents


[Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_toc.html0000664000175000017500000011221113601426471016717 0ustar jjcjjc BERKELEY LOGO 6.1: Table of Contents
[Top] [Contents] [Index] [ ? ]

Table of Contents


[Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_fot.html0000664000175000017500000000632113601426471016726 0ustar jjcjjc BERKELEY LOGO 6.1: Footnotes
[Top] [Contents] [Index] [ ? ]

Footnotes

(1)

Computer Science Logo Style


[Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_17.html0000664000175000017500000002647013601426471016374 0ustar jjcjjc BERKELEY LOGO 6.1: INDEX: X – Y
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

INDEX: X – Y

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  
Index Entry  Section

X
xcor xcor

Y
ycor ycor

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_16.html0000664000175000017500000007204213601426471016367 0ustar jjcjjc BERKELEY LOGO 6.1: INDEX: S – W
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

INDEX: S – W

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  
Index Entry  Section

S
save save
savel savel
savepict savepict
screenmode screenmode
scrunch scrunch
scrunch.dat setscrunch
se sentence
sentence sentence
setbackground setbackground
setbg setbackground
setcslsloc setcslsloc
setcursor setcursor
seteditor seteditor
setfont setfont
seth setheading
setheading setheading
sethelploc sethelploc
setitem setitem
setlabelheight setlabelheight
setlibloc setlibloc
setmargins setmargins
setpalette setpalette
setpc setpencolor
setpen setpen
setpencolor setpencolor
setpenpattern setpenpattern
setpensize setpensize
setpos setpos
setprefix setprefix
setread setread
setreadpos setreadpos
setscrunch setscrunch
settc settextcolor
settemploc settemploc
setter 1.2 Getter/Setter Variable Syntax
settextcolor settextcolor
settextsize settextsize
setwrite setwrite
setwritepos setwritepos
setx setx
setxy setxy
sety sety
shell shell
show show
shown? shownp
shownp shownp
showturtle showturtle
sin sin
splitscreen splitscreen
sqrt sqrt
ss splitscreen
st showturtle
standout standout
starting ucblogo 1.3 Entering and Leaving Logo
startup startup
step step
stepped stepped
stepped? steppedp
steppedp steppedp
stop stop
substring? substringp
substringp substringp
sum sum

T
tag tag
temp edit
template 8.2 Template-based Iteration
test test
text text
textscreen textscreen
textsize textsize
thing thing
throw throw
to to
towards towards
trace trace
traced traced
traced? tracedp
tracedp tracedp
transfer transfer
turtlemode turtlemode
type type

U
unbury unbury
unburyall unburyall
unburyname unburyname
unburyonedit unburyonedit
unstep unstep
until until
untrace untrace
uppercase uppercase
usealternatenames usealternatenames

V
vbarred? vbarredp
vbarredp vbarredp

W
wait wait
while while
window window
word word
wordp wordp
wrap wrap
writepos writepos
writer writer

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_15.html0000664000175000017500000010237013601426471016364 0ustar jjcjjc BERKELEY LOGO 6.1: INDEX: M – R
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

INDEX: M – R

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  
Index Entry  Section

M
macro? macrop
macroexpand macroexpand
macrop macrop
make make
map map
map.se map.se
mdarray mdarray
mditem mditem
mdsetitem mdsetitem
member member
member? memberp
memberp memberp
minus minus
modulo modulo
mousepos mousepos

N
name name
name? namep
namelist namelist
namep namep
names names
nodes nodes
nodribble nodribble
norefresh norefresh
not not
notequal? notequalp
notequalp notequalp
number? numberp
numberp numberp

O
op output
openappend openappend
openread openread
openupdate openupdate
openwrite openwrite
or or
output output

P
palette palette
parse parse
pause pause
pc pencolor
pd pendown
pe penerase
pen pen
pencolor pencolor
pendown pendown
pendown? pendownp
pendownp pendownp
penerase penerase
penmode penmode
penpaint penpaint
penpattern pensize
penreverse penreverse
pensize pensize
penup penup
pick pick
plist plist
plist? plistp
plistp plistp
plists plists
pllist pllist
po po
poall poall
pon pon
pons pons
pop pop
popl popl
popls popls
pops pops
pos pos
pot pot
pots pots
power power
pprop pprop
ppt penpaint
pr print
prefix prefix
primitive? primitivep
primitivep primitivep
primitives primitives
print print
printdepthlimit printdepthlimit
printout po
printwidthlimit printwidthlimit
procedure? procedurep
procedurep procedurep
procedures procedures
product product
pu penup
push push
px penreverse

Q
queue queue
quoted quoted
quotient quotient

R
radarctan radarctan
radcos radcos
radsin radsin
random random
rawascii rawascii
rc readchar
rcs readchars
readchar readchar
readchars readchars
reader reader
readlist readlist
readpos readpos
readrawline readrawline
readword readword
redefp redefp
reduce reduce
refresh refresh
remainder remainder
remdup remdup
remove remove
remprop remprop
repcount repcount
repeat repeat
rerandom rerandom
reverse reverse
right right
rl readlist
round round
rseq rseq
rt right
run run
runparse runparse
runparsing 1.4 Tokenization
runresult runresult
rw readword

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_14.html0000664000175000017500000007442513601426471016374 0ustar jjcjjc BERKELEY LOGO 6.1: INDEX: E – L
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

INDEX: E – L

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  
Index Entry  Section

E
ed edit
edall edall
edit edit
editfile editfile
editor edit
edn edn
edns edns
edpl edpl
edpls edpls
edps edps
empty? emptyp
emptyp emptyp
eof? eofp
eofp eofp
epspict epspict
equal? equalp
equalp equalp
er erase
erall erall
erase erase
erasefile erasefile
erf erasefile
ern ern
erns erns
erpl erpl
erpls erpls
erps erps
erract erract
error error
errors 10.1 Error Codes
exp exp

F
fd forward
fence fence
file? filep
filep filep
fill fill
filled filled
filter filter
find find
first first
firsts firsts
font font
for for
foreach foreach
forever forever
form form
forward forward
fput fput
fs fullscreen
fullprintp fullprintp
fullscreen fullscreen
fulltext fulltext

G
gc gc
gensym gensym
getter 1.2 Getter/Setter Variable Syntax
global global
goto goto
gprop gprop
greater? greaterp
greaterequal? greaterequalp
greaterequalp greaterequalp
greaterp greaterp

H
heading heading
help help
hideturtle hideturtle
home home
ht hideturtle

I
if if
ifelse ifelse
iff iffalse
iffalse iffalse
ift iftrue
iftrue iftrue
ignore ignore
increasefont increasefont
int int
invoke invoke
iseq iseq
item item

K
key? keyp
keyact keyact
keyp keyp

L
label label
labelsize labelsize
last last
leaving ucblogo 1.3 Entering and Leaving Logo
left left
less? lessp
lessequal? lessequalp
lessequalp lessequalp
lessp lessp
line-continuation 1.4 Tokenization
list list
list? listp
listp listp
listtoarray listtoarray
ln ln
load load
loadnoisily loadnoisily
loadpict loadpict
local local
localmake localmake
log10 log10
logohelp help
logoplatform logoplatform
logoversion logoversion
lowercase lowercase
lput lput
lshift lshift
lt left

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_13.html0000664000175000017500000007256013601426471016371 0ustar jjcjjc BERKELEY LOGO 6.1: INDEX
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

INDEX

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  
Index Entry  Section

*
* product

+
+ sum

-
- difference

.
.defmacro .macro
.eq .eq
.macro .macro
.maybeoutput .maybeoutput
.setbf .setbf
.setfirst .setfirst
.setitem .setitem
.setsegmentsize .setsegmentsize

/
/ quotient

<
< lessp
<= lessequalp
<> notequalp

=
= equalp

>
> greaterp
>= greaterequalp

 

A
allopen allopen
AllowGetSet 1.2 Getter/Setter Variable Syntax
allowgetset allowgetset
and and
apply apply
arc arc
arctan arctan
arity arity
array array
array? arrayp
arrayp arrayp
arraytolist arraytolist
ascii ascii
ashift ashift

B
back back
background background
before? beforep
beforep beforep
bf butfirst
bfs butfirsts
bg background
bitand bitand
bitnot bitnot
bitor bitor
bitxor bitxor
bk back
bl butlast
buried buried
buried? buriedp
buriedp buriedp
bury bury
buryall buryall
buryname buryname
butfirst butfirst
butfirsts butfirsts
butlast butlast
button button
button? buttonp
buttonact buttonact
buttonp buttonp
bye bye

C
cascade cascade
cascade.2 cascade.2
case case
case-insensitive 1.4 Tokenization
caseignoredp caseignoredp
catch catch
char char
clean clean
clearscreen clearscreen
cleartext cleartext
clickpos clickpos
close close
closeall closeall
co continue
combine combine
commandline commandline
comments 1.4 Tokenization
Computer_Science_Logo_Style 1.1 Overview
cond cond
contents contents
continue continue
copydef copydef
Copyright 1.1 Overview
cos cos
count count
crossmap crossmap
cs clearscreen
cslsload cslsload
ct cleartext
cursor cursor

D
decreasefont increasefont
define define
defined? definedp
definedp definedp
delimiters 1.4 Tokenization
dequeue dequeue
difference difference
do.until do.until
do.while do.while
dribble dribble

Jump to:   *   +   -   .   /   <   =   >   `  
A   B   C   D   E   F   G   H   I   K   L   M   N   O   P   Q   R   S   T   U   V   W   X   Y  

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_12.html0000664000175000017500000003016413601426471016362 0ustar jjcjjc BERKELEY LOGO 6.1: 12 Internationalization
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

12 Internationalization

Berkeley Logo has limited support for non-English-speaking users. Alas, there is no Unicode support, and high-bit-on ASCII codes work in some contexts but not others.

If you want to translate Berkeley Logo for use with another language, there are three main things you have to do:

1. Primitive names
2. Error (and other) messages
3. Documentation

For primitive names, the easiest thing is to provide a startup file that defines aliases for the English primitive names, using COPYDEF:

COPYDEF "AVANT "FORWARD

This should take care of it, unless your language’s name for one primitive is spelled like the English name of a different primitive. In that case you have to turn REDEFP on and be sure to copy the non-conflicting name before overwriting the conflicting one!

"Primitives" that are actually in the Logo library, of course, can just be replaced or augmented with native-language-named Logo procedures and filenames.

Of course Logo programs will still not look like your native language if the word order is dramatically different, especially if you don’t put verbs before their objects.

For error messages, there is a file named ‘Messages’ in the ‘logolib’ directory with texts of messages, one per line. You can replace this with a file for your own language. Do not add, delete, or reorder lines; Logo finds messages by line number. The sequences %p, %s, and %t in these messages represent variable parts of the message and should not be translated. (%p PRINTs the variable part, while %s SHOWs it – that is, the difference is about whether or not brackets are shown surrounding a list. %t means that the variable part is a C text string rather than a Logo object.) If you want to change the order of two variable parts (no reorderable message has more than two), you would for example replace the line

%p doesn't like %s as input

with

%+s is a lousy input to %p

The plus sign tells the message printer to reverse the order; you must reverse the order of %p and %s, if both are used, to match. The plus sign goes just after the first percent sign in the message, which might not be at the beginning of the line. The sequence \n in a message represents a newline; don’t be fooled into thinking that the n is part of the following word.

Some messages appear twice in the file; this isn’t a mistake. The two spaces before to in I don't know how\ \ to aren’t a mistake either. The message containing just %p is for user-provided error messages in THROW "ERROR. The message "\ \ in %s\n%s" is the part of all error messages that indicates where the error occurred if it was inside a procedure; you might want to change the word in to your language. %s defined\n is what LOAD prints for each procedure defined if the variable LOADNOISILY is TRUE. "to %p\nend\n\n" is what EDIT puts in the temporary file if you ask to edit a procedure that isn’t already defined.

Also in the ‘Messages’ file are lines containing only one word each; the first of these is the word true. Some of these words are recognized by Logo in user input; some are generated by Logo; some are both. For example, the words TRUE and FALSE are recognized as Boolean values by IF and IFELSE, and are also generated by Logo as outputs from the primitive predicates such as EQUALP. The word END is recognized as the end of a procedure definition, and may be generated when Logo reconstructs a procedure body for PO or EDIT. I’ve used capital letters in this paragraph for easier reading, but the words in the ‘Messages’ file should be in lower case.

If you replace these with non-English words, Logo will recognize both the English names and your alternate names. For example, if you replace the word true with vrai then Logo will understand both of these:

IF "TRUE [PRINT "YES]
IF "VRAI [PRINT "YES]

The variable UseAlternateNames determines whether Logo will generate other-language names – for example, whether predicate functions return the other-language alternates for TRUE and FALSE. This variable is FALSE by default, meaning that the English words will be generated.

You might wish to have English-named predicate functions generate English TRUE and FALSE, while other-language-named predicates generate the alternate words. This can be done by leaving UseAlternateNames false, and instead of defining the other-language predicates with COPYDEF, do it this way:

to french.boolean :bool
if equalp :bool "true [output "vrai]
if equalp :bool "false [output "faux]
output :bool	; shouldn't happen
end

to make.french.predicate :french :english :arity
define :french `[[[inputs] ,[:arity]]
                 [output french.boolean
			    apply ,[word "" :english] :inputs]]
end

? make.french.predicate "egal? "equal? 2
? pr egal? 3 4
faux
? pr egal? 4 4
vrai
? pr equal? 3 4
false
? pr equal? 4 4
true

The third input to make.french.predicate is the number of inputs that the predicate expects. This solution isn’t quite perfect because the infix predicates (=, <, >) will still output in English. If you want them to generate alternate-language words, set UseAlternateNames to TRUE instead.

Some of the words in this section of the ‘Messages’ file are names of Logo primitives (OUTPUT, STOP, GOTO, TAG, IF, IFELSE, TO, .MACRO). To translate these names, you must use COPYDEF as described earlier, in addition to changing the names in ‘Messages’. You should be consistent in these two steps. Don’t forget the period in .macro!

For documentation, there are two kinds: this manual and the help files. The latter are generated automatically from this manual if you have a Unix system, so in that case you need only translate this manual, maintaining the format. (The automatic helpfile generator notices things like capital letters, tabs, hyphens, and equal signs at the beginnings of lines.) The program makefile.c may require modification because a few of the primitive names are special cases (e.g., LOG10 is the only name with digits included).

If you don’t have Unix tools, you can just translate each helpfile individually. A period in a primitive name is represented as a D in the filename; there are no files for question marks because the HELP command looks for the file named after the corresponding primitive that ends in P.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_11.html0000664000175000017500000011075213601426471016363 0ustar jjcjjc BERKELEY LOGO 6.1: 11 Special Variables
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

11 Special Variables

Logo takes special action if any of the following variable names exists. They follow the normal scoping rules, so a procedure can locally set one of them to limit the scope of its effect. Initially, no variables exist except for ALLOWGETSET, CASEIGNOREDP, and UNBURYONEDIT, which are TRUE and buried.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

allowgetset

ALLOWGETSET                           (variable)

if TRUE, indicates that an attempt to use a procedure that doesn’t exist should be taken as an implicit getter or setter procedure (setter if the first three letters of the name are SET) for a variable of the same name (without the SET if appropriate).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

buttonact

BUTTONACT                           (variable)

if nonempty, should be an instruction list that will be evaluated whenever a mouse button is pressed. Note that the user may have released the button before the instructions are evaluated. BUTTON will still output which button was most recently pressed. CLICKPOS will output the position of the mouse cursor at the moment the button was pressed; this may be different from MOUSEPOS if the user moves the mouse after clicking.

Note that it’s possible for the user to press a button during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting BUTTONACT to the empty list. One easy way to do that is the following:

make "buttonact [button.action]

to button.action [:buttonact []]
... ; whatever you want the button to do
end

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

caseignoredp

CASEIGNOREDP                                (variable)

if TRUE, indicates that lower case and upper case letters should be considered equal by EQUALP, BEFOREP, MEMBERP, etc. Logo initially makes this variable TRUE, and buries it.

See section equalp , beforep , memberp .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

commandline

COMMANDLINE                                (variable)

contains any text appearing after a hyphen on the command line used to start Logo.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

erract

ERRACT                                      (variable)

an instructionlist that will be run in the event of an error. Typically has the value [PAUSE] to allow interactive debugging.

See section pause .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

fullprintp

FULLPRINTP                               (variable)

if TRUE, then words that were created using backslash or vertical bar (to include characters that would otherwise not be treated as part of a word) are printed with the backslashes or vertical bars shown, so that the printed result could be re-read by Logo to produce the same value. If FULLPRINTP is TRUE then the empty word (however it was created) prints as ||. (Otherwise it prints as nothing at all.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

keyact

KEYACT                               (variable)

if nonempty, should be an instruction list that will be evaluated whenever a key is pressed on the keyboard. The instruction list can use READCHAR to find out what key was pressed. Note that only keys that produce characters qualify; pressing SHIFT or CONTROL alone will not cause KEYACT to be evaluated.

Note that it’s possible for the user to press a key during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting KEYACT to the empty list. One easy way to do that is the following:

make "keyact [key.action]

to key.action [:keyact []]
... ; whatever you want the key to do
end

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

loadnoisily

LOADNOISILY                                 (variable)

if TRUE, prints the names of procedures defined when loading from a file (including the temporary file made by EDIT).

See section edit .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

printdepthlimit

PRINTDEPTHLIMIT                             (variable)

if a nonnegative integer, indicates the maximum depth of sublist structure that will be printed by PRINT, etc.

See section print .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

printwidthlimit

PRINTWIDTHLIMIT                             (variable)

if a nonnegative integer, indicates the maximum number of members in any one list that will be printed by PRINT, etc.

See section print .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

redefp

REDEFP                                      (variable)

if TRUE, allows primitives to be erased (ERASE) or redefined (COPYDEF).

See section erase , copydef .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

startup

STARTUP                                     (variable)

if assigned a list value in a file loaded by LOAD, that value is run as an instructionlist after the loading.

See section load .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

unburyonedit

UNBURYONEDIT                            (variable)

if TRUE, causes any procedure defined during EDIT or LOAD to be unburied, so that it will be saved by a later SAVE. Files that want to define and bury procedures must do it in that order.

See section edit , See section load , See section save .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

usealternatenames

USEALTERNATENAMES					(variable)

if TRUE, causes Logo to generate non-English words (from the ‘Messages’ file) instead of TRUE, FALSE, END, etc.

Logo provides the following buried variables that can be used by programs:


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

logoversion

LOGOVERSION                                   (variable)

a real number indicating the Logo version number, e.g., 5.5


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

logoplatform

LOGOPLATFORM                                   (variable)

one of the following words: wxWidgets, X11, Windows, or Unix-nographics.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_10.html0000664000175000017500000002766513601426471016374 0ustar jjcjjc BERKELEY LOGO 6.1: 10 Error Processing
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10 Error Processing

If an error occurs, Logo takes the following steps. First, if there is an available variable named ERRACT, Logo takes its value as an instructionlist and runs the instructions. The operation ERROR may be used within the instructions (once) to examine the error condition. If the instructionlist invokes PAUSE, the error message is printed before the pause happens. Certain errors are recoverable; for one of those errors, if the instructionlist outputs a value, that value is used in place of the expression that caused the error. (If ERRACT invokes PAUSE and the user then invokes CONTINUE with an input, that input becomes the output from PAUSE and therefore the output from the ERRACT instructionlist.)

It is possible for an ERRACT instructionlist to produce an inappropriate value or no value where one is needed. As a result, the same error condition could recur forever because of this mechanism. To avoid that danger, if the same error condition occurs twice in a row from an ERRACT instructionlist without user interaction, the message ‘Erract loop’ is printed and control returns to toplevel. "Without user interaction" means that if ERRACT invokes PAUSE and the user provides an incorrect value, this loop prevention mechanism does not take effect and the user gets to try again.

During the running of the ERRACT instructionlist, ERRACT is locally unbound, so an error in the ERRACT instructions themselves will not cause a loop. In particular, an error during a pause will not cause a pause-within-a-pause unless the user reassigns the value [PAUSE] to ERRACT during the pause. But such an error will not return to toplevel; it will remain within the original pause loop.

If there is no available ERRACT value, Logo handles the error by generating an internal THROW "ERROR. (A user program can also generate an error condition deliberately by invoking THROW.) If this throw is not caught by a CATCH "ERROR in the user program, it is eventually caught either by the toplevel instruction loop or by a pause loop, which prints the error message. An invocation of CATCH "ERROR in a user program locally unbinds ERRACT, so the effect is that whichever of ERRACT and CATCH "ERROR is more local will take precedence.

If a floating point overflow occurs during an arithmetic operation, or a two-input mathematical function (like POWER) is invoked with an illegal combination of inputs, the ‘doesn't like’ message refers to the second operand, but should be taken as meaning the combination.

See section erract , throw , error , catch , pause , continue .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

10.1 Error Codes

Here are the numeric codes that appear as the first member of the list output by ERROR when an error is caught, with the corresponding messages. Some messages may have two different codes depending on whether or not the error is recoverable (that is, a substitute value can be provided through the ERRACT mechanism) in the specific context. Some messages are warnings rather than errors; these will not be caught. Errors 0 and 32 are so bad that Logo exits immediately.

  0	Fatal internal error  (can't be caught)
  1	Out of memory
  2	Stack overflow
  3	Turtle out of bounds
  4	proc doesn't like datum as input  (not recoverable)
  5	proc didn't output to proc
  6	Not enough inputs to proc
  7	proc doesn't like datum as input  (recoverable)
  8	Too much inside ()'s
  9 	You don't say what to do with datum
 10	')' not found
 11	var has no value
 12	Unexpected ')'
 13	I don't know how to proc  (recoverable)
 14	Can't find catch tag for throwtag
 15	proc is already defined
 16	Stopped
 17	Already dribbling
 18	File system error
 19	Assuming you mean IFELSE, not IF  (warning only)
 20	var shadowed by local in procedure call  (warning only)
 21	Throw "Error
 22	proc is a primitive
 23	Can't use TO inside a procedure
 24	I don't know how to proc  (not recoverable)
 25	IFTRUE/IFFALSE without TEST
 26	Unexpected ']'
 27	Unexpected '}'
 28	Couldn't initialize graphics
 29	Macro returned value instead of a list
 30	You don't say what to do with value
 31	Can only use STOP or OUTPUT inside a procedure
 32	APPLY doesn't like badthing as input
 33	END inside multi-line instruction
 34	Really out of memory  (can't be caught)
 35	user-generated error message (THROW "ERROR message)
 36	END inside multi-line instruction
 37	Bad default expression for optional input: expr
 38	Can't use OUTPUT or STOP inside RUNRESULT
 39 	Assuming you meant 'FD 100', not FD100  (or similar)
 40	I can't open file filename
 41	File filename already open
 42	File filename not open
 43	Runlist [expr expr] has more than one expression.

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_9.html0000664000175000017500000004305613601426471016314 0ustar jjcjjc BERKELEY LOGO 6.1: 9 Macros
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

9 Macros


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

.macro

.MACRO procname :input1 :input2 ...			(special form)
.DEFMACRO procname text

A macro is a special kind of procedure whose output is evaluated as Logo instructions in the context of the macro’s caller. .MACRO is exactly like TO except that the new procedure becomes a macro; .DEFMACRO is exactly like DEFINE with the same exception.

Macros are useful for inventing new control structures comparable to REPEAT, IF, and so on. Such control structures can almost, but not quite, be duplicated by ordinary Logo procedures. For example, here is an ordinary procedure version of REPEAT:

to my.repeat :num :instructions
if :num=0 [stop]
run :instructions
my.repeat :num-1 :instructions
end

This version works fine for most purposes, e.g.,

my.repeat 5 [print "hello]

But it doesn’t work if the instructions to be carried out include OUTPUT, STOP, or LOCAL. For example, consider this procedure:

to example
print [Guess my secret word.  You get three guesses.]
repeat 3 [type "|?? | ~
          if readword = "secret [pr "Right! stop]]
print [Sorry, the word was "secret"!]
end

This procedure works as written, but if MY.REPEAT is used instead of REPEAT, it won’t work because the STOP will stop MY.REPEAT instead of stopping EXAMPLE as desired.

The solution is to make MY.REPEAT a macro. Instead of actually carrying out the computation, a macro must return a list containing Logo instructions. The contents of that list are evaluated as if they appeared in place of the call to the macro. Here’s a macro version of REPEAT:

.macro my.repeat :num :instructions
if :num=0 [output []]
output sentence :instructions ~
                (list "my.repeat :num-1 :instructions)
end

Every macro is an operation — it must always output something. Even in the base case, MY.REPEAT outputs an empty instruction list. To show how MY.REPEAT works, let’s take the example

my.repeat 5 [print "hello]

For this example, MY.REPEAT will output the instruction list

[print "hello my.repeat 4 [print "hello]]

Logo then executes these instructions in place of the original invocation of MY.REPEAT; this prints hello once and invokes another repetition.

The technique just shown, although fairly easy to understand, has the defect of slowness because each repetition has to construct an instruction list for evaluation. Another approach is to make MY.REPEAT a macro that works just like the non-macro version unless the instructions to be repeated include OUTPUT or STOP:

.macro my.repeat :num :instructions
catch "repeat.catchtag ~
      [op repeat.done runresult [repeat1 :num :instructions]]
op []
end

to repeat1 :num :instructions
if :num=0 [throw "repeat.catchtag]
run :instructions
.maybeoutput repeat1 :num-1 :instructions
end

to repeat.done :repeat.result
if emptyp :repeat.result [op [stop]]
op list "output quoted first :repeat.result
end

If the instructions do not include STOP or OUTPUT, then REPEAT1 will reach its base case and invoke THROW. As a result, MY.REPEAT’s last instruction line will output an empty list, so the evaluation of the macro result by the caller will do nothing. But if a STOP or OUTPUT happens, then REPEAT.DONE will output a STOP or OUTPUT instruction that will be executed in the caller’s context.

The macro-defining commands have names starting with a dot because macros are an advanced feature of Logo; it’s easy to get in trouble by defining a macro that doesn’t terminate, or by failing to construct the instruction list properly.

Lisp users should note that Logo macros are not special forms. That is, the inputs to the macro are evaluated normally, as they would be for any other Logo procedure. It’s only the output from the macro that’s handled unusually.

Here’s another example:

.macro localmake :name :value
output (list "local          ~
             word "" :name   ~
             "apply          ~
             ""make          ~
             (list :name :value))
end

It’s used this way:

to try
localmake "garply "hello
print :garply
end

LOCALMAKE outputs the list

[local "garply apply "make [garply hello]]

The reason for the use of APPLY is to avoid having to decide whether or not the second input to MAKE requires a quotation mark before it. (In this case it would — MAKE "GARPLY "HELLO — but the quotation mark would be wrong if the value were a list.)

It’s often convenient to use the function to construct the instruction list:

.macro localmake :name :value
op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]]
end

On the other hand, is pretty slow, since it’s tree recursive and written in Logo.

See section to , define , apply , stop , output .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

.defmacro

See section .macro .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

macrop

MACROP name
MACRO? name

outputs TRUE if its input is the name of a macro.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

macroexpand

MACROEXPAND expr				(library procedure)

takes as its input a Logo expression that invokes a macro (that is, one that begins with the name of a macro) and outputs the the Logo expression into which the macro would translate the input expression.

.macro localmake :name :value
op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]]
end

? show macroexpand [localmake "pi 3.14159]
[local "pi apply "make [pi 3.14159]]

[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_8.html0000664000175000017500000034474213601426471016321 0ustar jjcjjc BERKELEY LOGO 6.1: 8 Control Structures
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8 Control Structures


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.1 Control

Note: in the following descriptions, an instructionlist can be a list or a word. In the latter case, the word is parsed into list form before it is run. Thus, RUN READWORD or RUN READLIST will work. The former is slightly preferable because it allows for a continued line (with ~) that includes a comment (with ;) on the first line.

A tf input must be the word TRUE, the word FALSE, or a list. If it’s a list, then it must be a Logo expression, which will be evaluated to produce a value that must be TRUE or FALSE. The comparisons with TRUE and FALSE are always case-insensitive.

A runlist can consist of either a single expression (that produces a value) or zero or more instructions (that do something, rather than output a value), depending on the context:

PRINT IFELSE :X<0 ["NEGATIVE] ["POSITIVE]  ; one value in each case
REPEAT 4 [PRINT "A PRINT "B]  ; two instructions

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

run

RUN instructionlist

command or operation. Runs the Logo instructions in the input list; outputs if the list contains an expression that outputs.

See section readword , readlist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

runresult

RUNRESULT instructionlist

runs the instructions in the input; outputs an empty list if those instructions produce no output, or a list whose only member is the output from running the input instructionlist. Useful for inventing command-or-operation control structures:

local "result
make "result runresult [something]
if emptyp :result [stop]
output first :result

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

repeat

REPEAT num instructionlist

command. Runs the instructionlist repeatedly, num times.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

forever

FOREVER instructionlist

command. Runs the "instructionlist" repeatedly, until something inside the instructionlist (such as STOP or THROW) makes it stop.

See section stop , See section throw .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

repcount

REPCOUNT

outputs the repetition count of the innermost current REPEAT or FOREVER, starting from 1. If no REPEAT or FOREVER is active, outputs –1.

The abbreviation # can be used for REPCOUNT unless the REPEAT is inside the template input to a higher order procedure such as FOREACH, in which case # has a different meaning.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

if

IF tf instructionlist
(IF tf instructionlist1 instructionlist2)

command. If the first input has the value TRUE, then IF runs the second input. If the first input has the value FALSE, then IF does nothing. (If given a third input, IF acts like IFELSE, as described below.) It is an error if the first input is not either TRUE or FALSE.

For compatibility with earlier versions of Logo, if an IF instruction is not enclosed in parentheses, but the first thing on the instruction line after the second input expression is a literal list (i.e., a list in square brackets), the IF is treated as if it were IFELSE, but a warning message is given. If this aberrant IF appears in a procedure body, the warning is given only the first time the procedure is invoked in each Logo session.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

ifelse

IFELSE tf instructionlist1 instructionlist2

command or operation. If the first input has the value TRUE, then IFELSE runs the second input. If the first input has the value FALSE, then IFELSE runs the third input. IFELSE outputs a value if the instructionlist contains an expression that outputs a value.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

test

TEST tf

command. Remembers its input, which must be TRUE or FALSE, for use by later IFTRUE or IFFALSE instructions. The effect of TEST is local to the procedure in which it is used; any corresponding IFTRUE or IFFALSE must be in the same procedure or a subprocedure.

See section iffalse .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

iftrue

IFTRUE instructionlist
IFT instructionlist

command. Runs its input if the most recent TEST instruction had a TRUE input. The TEST must have been in the same procedure or a superprocedure.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

iffalse

IFFALSE instructionlist
IFF instructionlist

command. Runs its input if the most recent TEST instruction had a FALSE input. The TEST must have been in the same procedure or a superprocedure.

See section test .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

stop

STOP

command. Ends the running of the procedure in which it appears. Control is returned to the context in which that procedure was invoked. The stopped procedure does not output a value.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

output

OUTPUT value
OP value

command. Ends the running of the procedure in which it appears. That procedure outputs the value value to the context in which it was invoked. Don’t be confused: OUTPUT itself is a command, but the procedure that invokes OUTPUT is an operation.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

catch

CATCH tag instructionlist

command or operation. Runs its second input. Outputs if that instructionlist outputs. If, while running the instructionlist, a THROW instruction is executed with a tag equal to the first input (case-insensitive comparison), then the running of the instructionlist is terminated immediately. In this case the CATCH outputs if a value input is given to THROW. The tag must be a word.

If the tag is the word ERROR, then any error condition that arises during the running of the instructionlist has the effect of THROW "ERROR instead of printing an error message and returning to toplevel. The CATCH does not output if an error is caught. Also, during the running of the instructionlist, the variable ERRACT is temporarily unbound. (If there is an error while ERRACT has a value, that value is taken as an instructionlist to be run after printing the error message. Typically the value of ERRACT, if any, is the list [PAUSE].)

See section error , erract , pause .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

throw

THROW tag
(THROW tag value)

command. Must be used within the scope of a CATCH with an equal tag. Ends the running of the instructionlist of the CATCH. If THROW is used with only one input, the corresponding CATCH does not output a value. If THROW is used with two inputs, the second provides an output for the CATCH.

THROW "TOPLEVEL can be used to terminate all running procedures and interactive pauses, and return to the toplevel instruction prompt. Typing the system interrupt character (<alt-S> for wxWidgets; otherwise normally <control-C> for Unix, <control-Q> for DOS, or <command-period> for Mac) has the same effect.

THROW "ERROR can be used to generate an error condition. If the error is not caught, it prints a message (THROW "ERROR) with the usual indication of where the error (in this case the THROW) occurred. If a second input is used along with a tag of ERROR, that second input is used as the text of the error message instead of the standard message. Also, in this case, the location indicated for the error will be, not the location of the THROW, but the location where the procedure containing the THROW was invoked. This allows user-defined procedures to generate error messages as if they were primitives. Note: in this case the corresponding CATCH "ERROR, if any, does not output, since the second input to THROW is not considered a return value.

THROW "SYSTEM immediately leaves Logo, returning to the operating system, without printing the usual parting message and without deleting any editor temporary file written by EDIT.

See section edit .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

error

ERROR

outputs a list describing the error just caught, if any. If there was not an error caught since the last use of ERROR, the empty list will be output. The error list contains four members: an integer code corresponding to the type of error, the text of the error message (as a single word including spaces), the name of the procedure in which the error occurred, and the instruction line on which the error occurred.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pause

PAUSE

command or operation. Enters an interactive pause. The user is prompted for instructions, as at toplevel, but with a prompt that includes the name of the procedure in which PAUSE was invoked. Local variables of that procedure are available during the pause. PAUSE outputs if the pause is ended by a CONTINUE with an input.

If the variable ERRACT exists, and an error condition occurs, the contents of that variable are run as an instructionlist. Typically ERRACT is given the value [PAUSE] so that an interactive pause will be entered in the event of an error. This allows the user to check values of local variables at the time of the error.

Typing the system quit character (<alt-S> for wxWidgets; otherwise normally <control-\> for Unix, <control-W> for DOS, or <command-comma> for Mac) will also enter a pause.

See section erract .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

continue

CONTINUE value
CO value
(CONTINUE)
(CO)

command. Ends the current interactive pause, returning to the context of the PAUSE invocation that began it. If CONTINUE is given an input, that value is used as the output from the PAUSE. If not, the PAUSE does not output.

Exceptionally, the CONTINUE command can be used without its default input and without parentheses provided that nothing follows it on the instruction line.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

wait

WAIT time

command. Delays further execution for time 60ths of a second. Also causes any buffered characters destined for the terminal to be printed immediately. WAIT 0 can be used to achieve this buffer flushing without actually waiting.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

bye

BYE

command. Exits from Logo; returns to the operating system.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

.maybeoutput

.MAYBEOUTPUT value				(special form)

works like OUTPUT except that the expression that provides the input value might not, in fact, output a value, in which case the effect is like STOP. This is intended for use in control structure definitions, for cases in which you don’t know whether or not some expression produces a value. Example:

to invoke :function [:inputs] 2
.maybeoutput apply :function :inputs
end

? (invoke "print "a "b "c)
a b c
? print (invoke "word "a "b "c)
abc

This is an alternative to RUNRESULT. It’s fast and easy to use, at the cost of being an exception to Logo’s evaluation rules. (Ordinarily, it should be an error if the expression that’s supposed to provide an input to something doesn’t have a value.)

See section output , stop , runresult .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

goto

GOTO word

command. Looks for a TAG command with the same input in the same procedure, and continues running the procedure from the location of that TAG. It is meaningless to use GOTO outside of a procedure.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

tag

TAG quoted.word

command. Does nothing. The input must be a literal word following a quotation mark ("), not the result of a computation. Tags are used by the GOTO command.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

ignore

IGNORE value					(library procedure)

command. Does nothing. Used when an expression is evaluated for a side effect and its actual value is unimportant.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

` list						(library procedure)

outputs a list equal to its input but with certain substitutions. If a member of the input list is the word ‘,’ (comma) then the following member should be an instructionlist that produces an output when run. That output value replaces the comma and the instructionlist. If a member of the input list is the word ‘,@’ (comma atsign) then the following member should be an instructionlist that outputs a list when run. The members of that list replace the ‘,@’ and the instructionlist. Example:

show `[foo baz ,[bf [a b c]] garply ,@[bf [a b c]]]

will print

[foo baz [b c] garply b c]

A word starting with ‘,’ or ‘,@’ is treated as if the rest of the word were a one-word list, e.g., ‘,:foo’ is equivalent to ‘,[:Foo]’.

A word starting with ‘",’ (quote comma) or ‘:,’ (colon comma) becomes a word starting with ‘"’ or ‘:’ but with the result of running the substitution (or its first word, if the result is a list) replacing what comes after the comma.

Backquotes can be nested. Substitution is done only for commas at the same depth as the backquote in which they are found:

? show `[a `[b ,[1+2] ,[foo ,[1+3] d] e] f]
[a ` [b , [1+2] , [foo 4 d] e] f]

?make "name1 "x
?make "name2 "y
? show `[a `[b ,:,:name1 ,",:name2 d] e]
[a ` [b , [:x] , ["y] d] e]

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

for

FOR forcontrol instructionlist			(library procedure)

command. The first input must be a list containing three or four members: (1) a word, which will be used as the name of a local variable; (2) a word or list that will be evaluated as by RUN to determine a number, the starting value of the variable; (3) a word or list that will be evaluated to determine a number, the limit value of the variable; (4) an optional word or list that will be evaluated to determine the step size. If the fourth member is missing, the step size will be 1 or –1 depending on whether the limit value is greater than or less than the starting value, respectively.

The second input is an instructionlist. The effect of FOR is to run that instructionlist repeatedly, assigning a new value to the control variable (the one named by the first member of the forcontrol list) each time. First the starting value is assigned to the control variable. Then the value is compared to the limit value. FOR is complete when the sign of (current - limit) is the same as the sign of the step size. (If no explicit step size is provided, the instructionlist is always run at least once. An explicit step size can lead to a zero-trip FOR, e.g., FOR [I 1 0 1] ...). Otherwise, the instructionlist is run, then the step is added to the current value of the control variable and FOR returns to the comparison step.

? for [i 2 7 1.5] [print :i]
2
3.5
5
6.5
?

See section run .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

do.while

DO.WHILE instructionlist tfexpression		(library procedure)

command. Repeatedly evaluates the instructionlist as long as the evaluated

@var{tfexpres-sion}
remains TRUE. Evaluates the first input first, so the instructionlist is always run at least once. The tfexpression must be an expressionlist whose value when evaluated is TRUE or FALSE.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

while

WHILE tfexpression instructionlist		(library procedure)

command. Repeatedly evaluates the instructionlist as long as the evaluated

@var{tfexpres-sion}
remains TRUE. Evaluates the first input first, so the instructionlist may never be run at all. The tfexpression must be an expressionlist whose value when evaluated is TRUE or FALSE.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

do.until

DO.UNTIL instructionlist tfexpression		(library procedure)

command. Repeatedly evaluates the instructionlist as long as the evaluated

@var{tfexpres-sion}
remains FALSE. Evaluates the first input first, so the instructionlist is always run at least once. The tfexpression must be an expressionlist whose value when evaluated is TRUE or FALSE.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

until

UNTIL tfexpression instructionlist		(library procedure)

command. Repeatedly evaluates the instructionlist as long as the evaluated

@var{tfexpres-sion}
remains FALSE. Evaluates the first input first, so the instructionlist may never be run at all. The tfexpression must be an expressionlist whose value when evaluated is TRUE or FALSE.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

case

CASE value clauses					(library procedure)

command or operation. The second input is a list of lists (clauses); each clause is a list whose first element is either a list of values or the word ELSE and whose butfirst is a Logo expression or instruction. CASE examines the clauses in order. If a clause begins with the word ELSE (upper or lower case), then the butfirst of that clause is evaluated and CASE outputs its value, if any. If the first input to CASE is a member of the first element of a clause, then the butfirst of that clause is evaluated and CASE outputs its value, if any. If neither of these conditions is met, then CASE goes on to the next clause. If no clause is satisfied, CASE does nothing. Example:

to vowelp :letter
output case :letter [ [[a e i o u] "true] [else "false] ]
end

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

cond

COND clauses						(library procedure)

command or operation. The input is a list of lists (clauses); each clause is a list whose first element is either an expression whose value is TRUE or FALSE, or the word ELSE, and whose butfirst is a Logo expression or instruction. COND examines the clauses in order. If a clause begins with the word ELSE (upper or lower case), then the butfirst of that clause is evaluated and CASE outputs its value, if any. Otherwise, the first element of the clause is evaluated; the resulting value must be TRUE or FALSE. If it’s TRUE, then the butfirst of that clause is evaluated and COND outputs its value, if any. If the value is FALSE, then COND goes on to the next clause. If no clause is satisfied, COND does nothing. Example:

to evens :numbers	; select even numbers from a list
op cond [ [[emptyp :numbers] []]
          [[evenp first :numbers]	; assuming EVENP is defined
           fput first :numbers evens butfirst :numbers]
          [else evens butfirst :numbers] ]
end

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

8.2 Template-based Iteration

The procedures in this section are iteration tools based on the idea of a template. This is a generalization of an instruction list or an expression list in which slots are provided for the tool to insert varying data. Four different forms of template can be used.

The most commonly used form for a template is ‘explicit-slot’ form, or ‘question mark’ form. Example:

? show map [? * ?] [2 3 4 5]
[4 9 16 25]
?

In this example, the MAP tool evaluated the template [? * ?] repeatedly, with each of the members of the data list [2 3 4 5] substituted in turn for the question marks. The same value was used for every question mark in a given evaluation. Some tools allow for more than one datum to be substituted in parallel; in these cases the slots are indicated by ?1 for the first datum, ?2 for the second, and so on:

? show (map [(word ?1 ?2 ?1)] [a b c] [d e f])
[ada beb cfc]
?

If the template wishes to compute the datum number, the form (? 1) is equivalent to ?1, so (? ?1) means the datum whose number is given in datum number 1. Some tools allow additional slot designations, as shown in the individual descriptions.

The second form of template is the ‘named-procedure’ form. If the template is a word rather than a list, it is taken as the name of a procedure. That procedure must accept a number of inputs equal to the number of parallel data slots provided by the tool; the procedure is applied to all of the available data in order. That is, if data ?1 through ?3 are available, the template "PROC is equivalent to [PROC ?1 ?2 ?3].

? show (map "word [a b c] [d e f])
[ad be cf]
?

to dotprod :a :b	; vector dot product
op apply "sum (map "product :a :b)
end

The third form of template is ‘named-slot’ or ‘lambda’ form. This form is indicated by a template list containing more than one member, whose first member is itself a list. The first member is taken as a list of names; local variables are created with those names and given the available data in order as their values. The number of names must equal the number of available data. This form is needed primarily when one iteration tool must be used within the template list of another, and the ? notation would be ambiguous in the inner template. Example:

to matmul :m1 :m2 [:tm2 transpose :m2]	; multiply two matrices
output map [[row] map [[col] dotprod :row :col] :tm2] :m1
end

The fourth form is ‘procedure text’ form, a variant of lambda form. In this form, the template list contains at least two members, all of which are lists. This is the form used by the DEFINE and TEXT primitives, and APPLY accepts it so that the text of a defined procedure can be used as a template.

Note: The fourth form of template is interpreted differently from the others, in that Logo considers it to be an independent defined procedure for the purposes of OUTPUT and STOP. For example, the following two instructions are identical:

? print apply [[x] :x+3] [5]
8
? print apply [[x] [output :x+3]] [5]
8

although the first instruction is in named-slot form and the second is in procedure-text form. The named-slot form can be understood as telling Logo to evaluate the expression :x+3 in place of the entire invocation of apply, with the variable x temporarily given the value 5. The procedure-text form can be understood as invoking the procedure

to foo :x
output :x+3
end

with input 5, but without actually giving the procedure a name. If the use of OUTPUT were interchanged in these two examples, we’d get errors:

? print apply [[x] output :x+3] [5]
Can only use output inside a procedure
? print apply [[x] [:x+3]] [5]
You don't say what to do with 8

The named-slot form can be used with STOP or OUTPUT inside a procedure, to stop the enclosing procedure.

The following iteration tools are extended versions of the ones in Appendix B of the book Computer Science Logo Style, Volume 3: Advanced Topics by Brian Harvey [MIT Press, 1987]. The extensions are primarily to allow for variable numbers of inputs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

apply

APPLY template inputlist

command or operation. Runs the template, filling its slots with the members of inputlist. The number of members in inputlist must be an acceptable number of slots for template. It is illegal to apply the primitive TO as a template, but anything else is okay. APPLY outputs what template outputs, if anything.

See section to .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

invoke

INVOKE template input				(library procedure)
(INVOKE template input1 input2 ...)

command or operation. Exactly like APPLY except that the inputs are provided as separate expressions rather than in a list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

foreach

FOREACH data template				(library procedure)
(FOREACH data1 data2 ... template)

command. Evaluates the template list repeatedly, once for each member of the data list. If more than one data list are given, each of them must be the same length. (The data inputs can be words, in which case the template is evaluated once for each character.)

In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc.

In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

map

MAP template data				(library procedure)
(MAP template data1 data2 ...)

outputs a word or list, depending on the type of the data input, of the same length as that data input. (If more than one data input are given, the output is of the same type as data1.) Each member of the output is the result of evaluating the template list, filling the slots with the corresponding member(s) of the data input(s). (All data inputs must be the same length.) In the case of a word output, the results of the template evaluation must be words, and they are concatenated with WORD.

In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc.

In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2.

See section word .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

map.se

MAP.SE template data				(library procedure)
(MAP.SE template data1 data2 ...)

outputs a list formed by evaluating the template list repeatedly and concatenating the results using SENTENCE. That is, the members of the output are the members of the results of the evaluations. The output list might, therefore, be of a different length from that of the data input(s). (If the result of an evaluation is the empty list, it contributes nothing to the final output.) The data inputs may be words or lists.

In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc.

In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2.

See section sentence .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

filter

FILTER tftemplate data				(library procedure)

outputs a word or list, depending on the type of the data input, containing a subset of the members (for a list) or characters (for a word) of the input. The template is evaluated once for each member or character of the data, and it must produce a TRUE or FALSE value. If the value is TRUE, then the corresponding input constituent is included in the output.

? print filter "vowelp "elephant 
eea 
?

In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E].

In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

find

FIND tftemplate data				(library procedure)

outputs the first constituent of the data input (the first member of a list, or the first character of a word) for which the value produced by evaluating the template with that consituent in its slot is TRUE. If there is no such constituent, the empty list is output.

In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E].

In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

reduce

REDUCE template data				(library procedure)

outputs the result of applying the template to accumulate the members of the data input. The template must be a two-slot function. Typically it is an associative function name like SUM. If the data input has only one constituent (member in a list or character in a word), the output is that consituent. Otherwise, the template is first applied with ?1 filled with the next-to-last consitient and ?2 with the last constituent. Then, if there are more constituents, the template is applied with ?1 filled with the next constituent to the left and ?2 with the result from the previous evaluation. This process continues until all constituents have been used. The data input may not be empty.

Note: If the template is, like SUM, the name of a procedure that is capable of accepting arbitrarily many inputs, it is more efficient to use APPLY instead of REDUCE. The latter is good for associative procedures that have been written to accept exactly two inputs:

to max :a :b
output ifelse :a > :b [:a] [:b]
end

print reduce "max [...]

Alternatively, REDUCE can be used to write MAX as a procedure that accepts any number of inputs, as SUM does:

to max [:inputs] 2
if emptyp :inputs ~
   [(throw "error [not enough inputs to max])]
output reduce [ifelse ?1 > ?2 [?1] [?2]] :inputs
end

See section sum , apply .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

crossmap

CROSSMAP template listlist			(library procedure)
(CROSSMAP template data1 data2 ...)

outputs a list containing the results of template evaluations. Each data list contributes to a slot in the template; the number of slots is equal to the number of data list inputs. As a special case, if only one data list input is given, that list is taken as a list of data lists, and each of its members contributes values to a slot. CROSSMAP differs from MAP in that instead of taking members from the data inputs in parallel, it takes all possible combinations of members of data inputs, which need not be the same length.

? show (crossmap [word ?1 ?2] [a b c] [1 2 3 4])
[a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4]
?

For compatibility with the version in the first edition of CSLS (1), CROSSMAP templates may use the notation :1 instead of ?1 to indicate slots.

See section map .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

cascade

CASCADE endtest template startvalue		(library procedure)
(CASCADE endtest tmp1 sv1 tmp2 sv2 ...)
(CASCADE endtest tmp1 sv1 tmp2 sv2 ... finaltemplate)

outputs the result of applying a template (or several templates, as explained below) repeatedly, with a given value filling the slot the first time, and the result of each application filling the slot for the following application.

In the simplest case, CASCADE has three inputs. The second input is a one-slot expression template. That template is evaluated some number of times (perhaps zero). On the first evaluation, the slot is filled with the third input; on subsequent evaluations, the slot is filled with the result of the previous evaluation. The number of evaluations is determined by the first input. This can be either a nonnegative integer, in which case the template is evaluated that many times, or a predicate expression template, in which case it is evaluated (with the same slot filler that will be used for the evaluation of the second input) repeatedly, and the CASCADE evaluation continues as long as the predicate value is FALSE. (In other words, the predicate template indicates the condition for stopping.)

If the template is evaluated zero times, the output from CASCADE is the third (startvalue) input. Otherwise, the output is the value produced by the last template evaluation.

CASCADE templates may include the symbol # to represent the number of times the template has been evaluated. This slot is filled with 1 for the first evaluation, 2 for the second, and so on.

? show cascade 5 [lput # ?] []
[1 2 3 4 5]
? show cascade [vowelp first ?] [bf ?] "spring
ing
? show cascade 5 [# * ?] 1
120
?

Several cascaded results can be computed in parallel by providing additional template-startvalue pairs as inputs to CASCADE. In this case, all templates (including the endtest template, if used) are multi-slot, with the number of slots equal to the number of pairs of inputs. In each round of evaluations, ?2, for example, represents the result of evaluating the second template in the previous round. If the total number of inputs (including the first endtest input) is odd, then the output from CASCADE is the final value of the first template. If the total number of inputs is even, then the last input is a template that is evaluated once, after the end test is satisfied, to determine the output from CASCADE.

to fibonacci :n
output (cascade :n [?1 + ?2] 1 [?1] 0)
end

to piglatin :word
output (cascade [vowelp first ?] ~
                [word bf ? first ?] ~
                :word ~
                [word ? "ay])
end

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

cascade.2

CASCADE.2 endtest temp1 startval1 temp2 startval2  (library procedure)

outputs the result of invoking CASCADE with the same inputs. The only difference is that the default number of inputs is five instead of three.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

transfer

TRANSFER endtest template inbasket		(library procedure)

outputs the result of repeated evaluation of the template. The template is evaluated once for each member of the list inbasket. TRANSFER maintains an outbasket that is initially the empty list. After each evaluation of the template, the resulting value becomes the new outbasket.

In the template, the symbol ?IN represents the current member from the inbasket; the symbol ?OUT represents the entire current outbasket. Other slot symbols should not be used.

If the first (endtest) input is an empty list, evaluation continues until all inbasket members have been used. If not, the first input must be a predicate expression template, and evaluation continues until either that template’s value is TRUE or the inbasket is used up.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_7.html0000664000175000017500000054434013601426471016314 0ustar jjcjjc BERKELEY LOGO 6.1: 7 Workspace Management
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7 Workspace Management


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.1 Procedure Definition


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

to

TO procname :input1 :input2 ...			(special form)

command. Prepares Logo to accept a procedure definition. The procedure will be named procname and there must not already be a procedure by that name. The inputs will be called input1 etc. Any number of inputs are allowed, including none. Names of procedures and inputs are case-insensitive.

Unlike every other Logo procedure, TO takes as its inputs the actual words typed in the instruction line, as if they were all quoted, rather than the results of evaluating expressions to provide the inputs. (That’s what special form means.)

This version of Logo allows variable numbers of inputs to a procedure. After the procedure name come four kinds of things, in this order:

    1.   0 or more REQUIRED inputs    :FOO :FROBOZZ
    2.   0 or more OPTIONAL inputs    [:BAZ 87] [:THINGO 5+9]
    3.   0 or 1 REST input            [:GARPLY]
    4.   0 or 1 DEFAULT number        5

Every procedure has a minimum, default, and maximum number of inputs. (The latter can be infinite.)

The minimum number of inputs is the number of required inputs, which must come first. A required input is indicated by the

:inputname

notation.

After all the required inputs can be zero or more optional inputs, each of which is represented by the following notation:

[:inputname default.value.expression]

When the procedure is invoked, if actual inputs are not supplied for these optional inputs, the default value expressions are evaluated to set values for the corresponding input names. The inputs are processed from left to right, so a default value expression can be based on earlier inputs. Example:

to proc :inlist [:startvalue first :inlist]

If the procedure is invoked by saying

proc [a b c]

then the variable inlist will have the value [A B C] and the variable startvalue will have the value A. If the procedure is invoked by saying

(proc [a b c] "x)

then inlist will have the value [A B C] and startvalue will have the value X.

After all the required and optional input can come a single rest input, represented by the following notation:

[:inputname]

This is a rest input rather than an optional input because there is no default value expression. There can be at most one rest input. When the procedure is invoked, the value of this inputname will be a list containing all of the actual inputs provided that were not used for required or optional inputs. Example:

to proc :in1 [:in2 "foo] [:in3 "baz] [:in4]

If this procedure is invoked by saying

proc "x

then in1 has the value X, in2 has the value FOO, in3 has the value BAZ, and in4 has the value [] (the empty list). If it’s invoked by saying

(proc "a "b "c "d "e)

then in1 has the value A, in2 has the value B, in3 has the value C, and in4 has the value [D E].

The maximum number of inputs for a procedure is infinite if a rest input is given; otherwise, it is the number of required inputs plus the number of optional inputs.

The default number of inputs for a procedure, which is the number of inputs that it will accept if its invocation is not enclosed in parentheses, is ordinarily equal to the minimum number. If you want a different default number you can indicate that by putting the desired default number as the last thing on the TO line. example:

to proc :in1 [:in2 "foo] [:in3] 3

This procedure has a minimum of one input, a default of three inputs, and an infinite maximum.

Logo responds to the TO command by entering procedure definition mode. The prompt character changes from ? to > and whatever instructions you type become part of the definition until you type a line containing only the word END.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

define

DEFINE procname text

command. Defines a procedure with name procname and text text. If there is already a procedure with the same name, the new definition replaces the old one. The text input must be a list whose members are lists. The first member is a list of inputs; it looks like a TO line but without the word TO, without the procedure name, and without the colons before input names. In other words, the members of this first sublist are words for the names of required inputs and lists for the names of optional or rest inputs. The remaining sublists of the text input make up the body of the procedure, with one sublist for each instruction line of the body. (There is no END line in the text input.) It is an error to redefine a primitive procedure unless the variable REDEFP has the value TRUE.

See section redefp .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

text

TEXT procname

outputs the text of the procedure named procname in the form expected by DEFINE: a list of lists, the first of which describes the inputs to the procedure and the rest of which are the lines of its body. The text does not reflect formatting information used when the procedure was defined, such as continuation lines and extra spaces.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

fulltext

FULLTEXT procname

outputs a representation of the procedure procname in which formatting information is preserved. If the procedure was defined with TO, EDIT, or LOAD, then the output is a list of words. Each word represents one entire line of the definition in the form output by READWORD, including extra spaces and continuation lines. The last member of the output represents the END line. If the procedure was defined with DEFINE, then the output is a list of lists. If these lists are printed, one per line, the result will look like a definition using TO. Note: the output from FULLTEXT is not suitable for use as input to DEFINE!

See section to , edit , load , define .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

copydef

COPYDEF newname oldname

command. Makes newname a procedure identical to oldname. The latter may be a primitive. If newname was already defined, its previous definition is lost. If newname was already a primitive, the redefinition is not permitted unless the variable REDEFP has the value TRUE.

Note: dialects of Logo differ as to the order of inputs to COPYDEF. This dialect uses "MAKE order," not "NAME order."

See section redefp , save , po , pot .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.2 Variable Definition


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

make

MAKE varname value

command. Assigns the value value to the variable named varname, which must be a word. Variable names are case-insensitive. If a variable with the same name already exists, the value of that variable is changed. If not, a new global variable is created.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

name

NAME value varname				(library procedure)

command. Same as MAKE but with the inputs in reverse order.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

local

LOCAL varname
LOCAL varnamelist
(LOCAL varname1 varname2 ...)

command. Accepts as inputs one or more words, or a list of words. A variable is created for each of these words, with that word as its name. The variables are local to the currently running procedure. Logo variables follow dynamic scope rules; a variable that is local to a procedure is available to any subprocedure invoked by that procedure. The variables created by LOCAL have no initial value; they must be assigned a value (e.g., with MAKE) before the procedure attempts to read their value.

See section make .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

localmake

LOCALMAKE varname value				(library procedure)

command. Makes the named variable local, like LOCAL, and assigns it the given value, like MAKE.

See section local , See section make .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

thing

THING varname
:quoted.varname

outputs the value of the variable whose name is the input. If there is more than one such variable, the innermost local variable of that name is chosen. The colon notation is an abbreviation not for THING but for the combination

thing "

so that :FOO means THING "FOO.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

global

GLOBAL varname
GLOBAL varnamelist
(GLOBAL varname1 varname2 ...)

command. Accepts as inputs one or more words, or a list of words. A global variable is created for each of these words, with that word as its name. The only reason this is necessary is that you might want to use the "setter" notation SETXYZ for a variable XYZ that does not already have a value; GLOBAL "XYZ makes that legal. Note: If there is currently a local variable of the same name, this command does *not* make Logo use the global value instead of the local one.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.3 Property Lists

Note: Names of property lists are always case-insensitive. Names of individual properties are case-sensitive or case-insensitive depending on the value of CASEIGNOREDP, which is TRUE by default.

See section caseignoredp .

In principle, every possible name is the name of a property list, which is initially empty. So Logo never gives a "no such property list" error, as it would for undefined procedure or variable names. But the primitive procedures that deal with "all" property lists (CONTENTS, PLISTS, etc.) list only nonempty ones. To "erase" a property list erase means to make it empty, removing all properties from it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pprop

PPROP plistname propname value

command. Adds a property to the plistname property list with name propname and value value.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

gprop

GPROP plistname propname

outputs the value of the propname property in the plistname property list, or the empty list if there is no such property.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

remprop

REMPROP plistname propname

command. Removes the property named propname from the property list named plistname.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

plist

PLIST plistname

outputs a list whose odd-numbered members are the names, and whose even-numbered members are the values, of the properties in the property list named plistname. The output is a copy of the actual property list; changing properties later will not magically change a list output earlier by PLIST.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.4 Workspace Predicates


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

procedurep

PROCEDUREP name
PROCEDURE? name

outputs TRUE if the input is the name of a procedure.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

primitivep

PRIMITIVEP name
PRIMITIVE? name

outputs TRUE if the input is the name of a primitive procedure (one built into Logo). Note that some of the procedures described in this document are library procedures, not primitives.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

definedp

DEFINEDP name
DEFINED? name

outputs TRUE if the input is the name of a user-defined procedure, including a library procedure.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

namep

NAMEP name
NAME? name

outputs TRUE if the input is the name of a variable.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

plistp

PLISTP name
PLIST? name

outputs TRUE if the input is the name of a nonempty property list. (In principle every word is the name of a property list; if you haven’t put any properties in it, PLIST of that name outputs an empty list, rather than giving an error message.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.5 Workspace Queries

Note: All procedures whose input is indicated as contentslist will accept a single word (taken as a procedure name), a list of words (taken as names of procedures), or a list of three lists as described under the CONTENTS command above.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

contents

CONTENTS

outputs a "contents list," i.e., a list of three lists containing names of defined procedures, variables, and property lists respectively. This list includes all unburied named items in the workspace.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

buried

BURIED

outputs a contents list including all buried named items in the workspace.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

traced

TRACED

outputs a contents list including all traced named items in the workspace.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

stepped

STEPPED

outputs a contents list including all stepped named items in the workspace.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

procedures

PROCEDURES

outputs a list of the names of all unburied user-defined procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

primitives

PRIMITIVES

outputs a list of the names of all primitive procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

names

NAMES

outputs a contents list consisting of an empty list (indicating no procedure names) followed by a list of all unburied variable names in the workspace.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

plists

PLISTS

outputs a contents list consisting of two empty lists (indicating no procedures or variables) followed by a list of all unburied nonempty property lists in the workspace.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

namelist

NAMELIST varname				(library procedure)
NAMELIST varnamelist

outputs a contents list consisting of an empty list followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pllist

PLLIST plname					(library procedure)
PLLIST plnamelist

outputs a contents list consisting of two empty lists followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input.

See section contents .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

arity

ARITY procedurename

outputs a list of three numbers: the minimum, default, and maximum number of inputs for the procedure whose name is the input. It is an error if there is no such procedure. A maximum of -1 means that the number of inputs is unlimited.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

nodes

NODES

outputs a list of two numbers. The first represents the number of nodes of memory currently in use. The second shows the maximum number of nodes that have been in use at any time since the last invocation of NODES. (A node is a small block of computer memory as used by Logo. Each number uses one node. Each non-numeric word uses one node, plus some non-node memory for the characters in the word. Each array takes one node, plus some non-node memory, as well as the memory required by its elements. Each list requires one node per element, as well as the memory within the elements.) If you want to track the memory use of an algorithm, it is best if you invoke GC at the beginning of each iteration, since otherwise the maximum will include storage that is unused but not yet collected.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.6 Workspace Inspection


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

po

PRINTOUT contentslist
PO contentslist

command. Prints to the write stream the definitions of all procedures, variables, and property lists named in the input contents list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

poall

POALL						(library procedure)

command. Prints all unburied definitions in the workspace. Abbreviates PO CONTENTS.

See section contents .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pops

POPS						(library procedure)

command. Prints the definitions of all unburied procedures in the workspace. Abbreviates PO PROCEDURES.

See section po , procedures .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pons

PONS						(library procedure)

command. Prints the definitions of all unburied variables in the workspace. Abbreviates PO NAMES.

See section po , names .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

popls

POPLS						(library procedure)

command. Prints the contents of all unburied nonempty property lists in the workspace. Abbreviates PO PLISTS.

See section po , plists .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pon

PON varname					(library procedure)
PON varnamelist

command. Prints the definitions of the named variable(s).
Abbreviates PO NAMELIST varname(list).

See section po , namelist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

popl

POPL plname					(library procedure)
POPL plnamelist

command. Prints the definitions of the named property list(s).
Abbreviates PO PLLIST plname(list).

See section po , pllist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pot

POT contentslist

command. Prints the title lines of the named procedures and the definitions of the named variables and property lists. For property lists, the entire list is shown on one line instead of as a series of PPROP instructions as in PO.

See section pprop , po .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pots

POTS						(library procedure)

command. Prints the title lines of all unburied procedures in the workspace. Abbreviates POT PROCEDURES.

See section procedures .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

7.7 Workspace Control


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

erase

ERASE contentslist
ER contentslist

command. Erases from the workspace the procedures, variables, and property lists named in the input. Primitive procedures may not be erased unless the variable REDEFP has the value TRUE.

See section redefp .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

erall

ERALL

command. Erases all unburied procedures, variables, and property lists from the workspace. Abbreviates ERASE CONTENTS.

See section contents .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

erps

ERPS

command. Erases all unburied procedures from the workspace.
Abbreviates ERASE PROCEDURES.

See section erase , procedures .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

erns

ERNS

command. Erases all unburied variables from the workspace. Abbreviates ERASE NAMES.

See section erase , names .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

erpls

ERPLS

command. Erases all unburied property lists from the workspace.
Abbreviates ERASE PLISTS.

See section erase , plists .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

ern

ERN varname					(library procedure)
ERN varnamelist

command. Erases from the workspace the variable(s) named in the input. Abbreviates ERASE NAMELIST varname(list).

See section erase , namelist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

erpl

ERPL plname					(library procedure)
ERPL plnamelist

command. Erases from the workspace the property list(s) named in the input. Abbreviates ERASE PLLIST plname(list).

See section erase , pllist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

bury

BURY contentslist

command. Buries the procedures, variables, and property lists named in the input. A buried item is not included in the lists output by CONTENTS, PROCEDURES, VARIABLES, and PLISTS, but is included in the list output by BURIED. By implication, buried things are not printed by POALL or saved by SAVE.

See section contents , procedures , pons , plists , poall , save .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

buryall

BURYALL                                         (library procedure)

command. Abbreviates BURY CONTENTS.

See section contents .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

buryname

BURYNAME varname				(library procedure)
BURYNAME varnamelist

command. Abbreviates BURY NAMELIST varname(list).

See section bury , namelist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

unbury

UNBURY contentslist

command. Unburies the procedures, variables, and property lists named in the input. That is, the named items will be returned to view in CONTENTS, etc.

See section contents .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

unburyall

UNBURYALL					(library procedure)

command. Abbreviates UNBURY BURIED.

See section buried .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

unburyname

UNBURYNAME varname				(library procedure)
UNBURYNAME varnamelist

command. Abbreviates UNBURY NAMELIST varname(list).

See section unbury , namelist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

buriedp

BURIEDP contentslist
BURIED? contentslist

outputs TRUE if the first procedure, variable, or property list named in the contents list is buried, FALSE if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can BURIEDP [[] [variable]] or BURIEDP [[] [] [proplist]].


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

trace

TRACE contentslist

command. Marks the named items for tracing. A message is printed whenever a traced procedure is invoked, giving the actual input values, and whenever a traced procedure STOPs or OUTPUTs. A message is printed whenever a new value is assigned to a traced variable using MAKE. A message is printed whenever a new property is given to a traced property list using PPROP.

See section stop , output , make , pprop .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

untrace

UNTRACE contentslist

command. Turns off tracing for the named items.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

tracedp

TRACEDP contentslist
TRACED? contentslist

outputs TRUE if the first procedure, variable, or property list named in the contents list is traced, FALSE if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can TRACEDP [[] [variable]] or TRACEDP [[] [] [proplist]].


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

step

STEP contentslist

command. Marks the named items for stepping. Whenever a stepped procedure is invoked, each instruction line in the procedure body is printed before being executed, and Logo waits for the user to type a newline at the terminal. A message is printed whenever a stepped variable name is shadowed because a local variable of the same name is created either as a procedure input or by the LOCAL command.

See section local .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

unstep

UNSTEP contentslist

command. Turns off stepping for the named items.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

steppedp

STEPPEDP contentslist
STEPPED? contentslist

outputs TRUE if the first procedure, variable, or property list named in the contents list is stepped, FALSE if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can STEPPEDP [[] [variable]] or STEPPEDP [[] [] [proplist]].


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

edit

EDIT contentslist
ED contentslist
(EDIT)
(ED)

command. If invoked with an input, EDIT writes the definitions of the named items into a temporary file and edits that file, using an editor that depends on the platform you’re using. In wxWidgets, and in the MacOS Classic version, there is an editor built into Logo. In the non-wxWidgets versions for Unix, MacOS X, Windows, and DOS, Logo uses your favorite editor as determined by the EDITOR environment variable. If you don’t have an EDITOR variable, edits the definitions using jove. If invoked without an input, EDIT edits the same file left over from a previous EDIT or EDITFILE instruction. When you leave the editor, Logo reads the revised definitions and modifies the workspace accordingly. It is not an error if the input includes names for which there is no previous definition.

If there is a variable LOADNOISILY whose value is TRUE, then, after leaving the editor, TO commands in the temporary file print ‘procname defined’ (where procname is the name of the procedure being defined); if LOADNOISILY is FALSE or undefined, TO commands in the file are carried out silently.

If there is an environment variable called TEMP, then Logo uses its value as the directory in which to write the temporary file used for editing.

Exceptionally, the EDIT command can be used without its default input and without parentheses provided that nothing follows it on the instruction line.

See section loadnoisily , See section editfile .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

editfile

EDITFILE filename

command. Starts the Logo editor, like EDIT, but instead of editing a temporary file it edits the file specified by the input. When you leave the editor, Logo reads the revised file, as for EDIT. EDITFILE also remembers the filename, so that a subsequent EDIT command with no input will re-edit the same file.

EDITFILE is intended as an alternative to LOAD and SAVE. You can maintain a workspace file yourself, controlling the order in which definitions appear, maintaining comments in the file, and so on.

In the wxWidgets version, EDITFILE asks whether or not you want to load the file into Logo when you finish editing. This allows you to use EDITFILE to edit data files without leaving Logo.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

edall

EDALL						(library procedure)

command. Abbreviates EDIT CONTENTS.

See section contents .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

edps

EDPS						(library procedure)

command. Abbreviates EDIT PROCEDURES.

See section edit , procedures .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

edns

EDNS						(library procedure)

command. Abbreviates EDIT NAMES.

See section edit , names .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

edpls

EDPLS						(library procedure)

command. Abbreviates EDIT PLISTS.

See section edit , plists .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

edn

EDN varname					(library procedure)
EDN varnamelist

command. Abbreviates EDIT NAMELIST varname(list).

See section edit , namelist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

edpl

EDPL plname					(library procedure)
EDPL plnamelist

command. Abbreviates EDIT PLLIST plname(list).

See section edit , pllist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

save

SAVE filename

command. Saves the definitions of all unburied procedures, variables, and nonempty property lists in the named file. Equivalent to

to save :filename
local "oldwriter
make "oldwriter writer
openwrite :filename
setwrite :filename
poall
setwrite :oldwriter
close :filename
end

Exceptionally, SAVE can be used with no input and without parentheses if it is the last thing on the command line. In this case, the filename from the most recent LOAD or SAVE command will be used. (It is an error if there has been no previous LOAD or SAVE.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

savel

SAVEL contentslist filename			(library procedure)

command. Saves the definitions of the procedures, variables, and property lists specified by contentslist to the file named filename.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

load

LOAD filename

command. Reads instructions from the named file and executes them. The file can include procedure definitions with TO, and these are accepted even if a procedure by the same name already exists. If the file assigns a list value to a variable named STARTUP, then that list is run as an instructionlist after the file is loaded. If there is a variable LOADNOISILY whose value is TRUE, then TO commands in the file print ‘procname defined’ (where procname is the name of the procedure being defined); if LOADNOISILY is FALSE or undefined, TO commands in the file are carried out silently.

See section startup , See section loadnoisily .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

cslsload

CSLSLOAD name

command. Loads the named file, like LOAD, but from the directory containing the Computer Science Logo Style programs instead of the current user’s directory.

See section load .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

help

HELP name
(HELP)

command. Prints information from the reference manual about the primitive procedure named by the input. With no input, lists all the primitives about which help is available. If there is an environment variable LOGOHELP, then its value is taken as the directory in which to look for help files, instead of the default help directory.

If HELP is called with the name of a defined procedure for which there is no help file, it will print the title line of the procedure followed by lines from the procedure body that start with semicolon, stopping when a non-semicolon line is seen.

Exceptionally, the HELP command can be used without its default input and without parentheses provided that nothing follows it on the instruction line.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

seteditor

SETEDITOR path

command. Tells Logo to use the specified program as its editor instead of the default editor. The format of a path depends on your operating system.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setlibloc

SETLIBLOC path

command. Tells Logo to use the specified directory as its library instead of the default. (Note that many Logo "primitive" procedures are actually found in the library, so they may become unavailable if your new library does not include them!) The format of a path depends on your operating system.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setcslsloc

SETCSLSLOC path

command. Tells Logo to use the specified directory for the CSLSLOAD command, instead of the default directory. The format of a path depends on your operating system.

See section cslsload .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

sethelploc

SETHELPLOC path

command. Tells Logo to look in the specified directory for the information provided by the HELP command, instead of the default directory. The format of a path depends on your operating system.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

settemploc

SETTEMPLOC path

command. Tells Logo to write editor temporary files in the specified directory rather than in the default directory. You must have write permission for this directory. The format of a path depends on your operating system.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

gc

GC
(GC anything)

command. Runs the garbage collector, reclaiming unused nodes. Logo does this when necessary anyway, but you may want to use this command to control exactly when Logo does it. In particular, the numbers output by the NODES operation will not be very meaningful unless garbage has been collected. Another reason to use GC is that a garbage collection takes a noticeable fraction of a second, and you may want to schedule collections for times before or after some time-critical animation. If invoked with an argument (of any value), GC runs a full garbage collection, including GCTWA (Garbage Collect Truly Worthless Atoms, which means that it removes from Logo’s memory words that used to be procedure or variable names but aren’t any more); without an argument, GC does a generational garbage collection, which means that only recently created nodes are examined. (The latter is usually good enough.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

.setsegmentsize

.SETSEGMENTSIZE num

command. Sets the number of nodes that Logo allocates from the operating system at once to num, which must be a positive integer. The name is dotted because bad things will happen if you use a number that’s too small or too large for your computer. The initial value is 16,000 for most systems, but is smaller for 68000-based Macs. Making it larger will speed up computations (by reducing the number of garbage collections) at the cost of allocating more memory than necessary.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_6.html0000664000175000017500000042354313601426471016314 0ustar jjcjjc BERKELEY LOGO 6.1: 6 Graphics
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6 Graphics

Berkeley Logo provides traditional Logo turtle graphics with one turtle. Multiple turtles, dynamic turtles, and collision detection are not supported. This is the most hardware-dependent part of Logo; some features may exist on some machines but not others. Nevertheless, the goal has been to make Logo programs as portable as possible, rather than to take fullest advantage of the capabilities of each machine. In particular, Logo attempts to scale the screen so that turtle coordinates [–100 –100] and [100 100] fit on the graphics window, and so that the aspect ratio is 1:1.

The center of the graphics window (which may or may not be the entire screen, depending on the machine used) is turtle location [0 0]. Positive X is to the right; positive Y is up. Headings (angles) are measured in degrees clockwise from the positive Y axis. (This differs from the common mathematical convention of measuring angles counterclockwise from the positive X axis.) The turtle is represented as an isoceles triangle; the actual turtle position is at the midpoint of the base (the short side). However, the turtle is drawn one step behind its actual position, so that the display of the base of the turtle’s triangle does not obscure a line drawn perpendicular to it (as would happen after drawing a square).

Colors are, of course, hardware-dependent. However, Logo provides partial hardware independence by interpreting color numbers 0 through 7 uniformly on all computers:

0  black        1  blue         2  green        3  cyan
4  red          5  magenta      6  yellow       7 white

Where possible, Logo provides additional user-settable colors; how many are available depends on the hardware and operating system environment. If at least 16 colors are available, Logo tries to provide uniform initial settings for the colors 8-15:

 8  brown        9  tan         10  forest      11  aqua
12  salmon      13  purple      14  orange      15  grey

Logo begins with a black background and white pen.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.1 Turtle Motion


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

forward

FORWARD dist
FD dist

moves the turtle forward, in the direction that it’s facing, by the specified distance (measured in turtle steps).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

back

BACK dist
BK dist

moves the turtle backward, i.e., exactly opposite to the direction that it’s facing, by the specified distance. (The heading of the turtle does not change.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

left

LEFT degrees
LT degrees

turns the turtle counterclockwise by the specified angle, measured in degrees (1/360 of a circle).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

right

RIGHT degrees
RT degrees

turns the turtle clockwise by the specified angle, measured in degrees (1/360 of a circle).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setpos

SETPOS pos

moves the turtle to an absolute position in the graphics window. The input is a list of two numbers, the X and Y coordinates.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setxy

SETXY xcor ycor

moves the turtle to an absolute position in the graphics window. The two inputs are numbers, the X and Y coordinates.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setx

SETX xcor

moves the turtle horizontally from its old position to a new absolute horizontal coordinate. The input is the new X coordinate.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

sety

SETY ycor

moves the turtle vertically from its old position to a new absolute vertical coordinate. The input is the new Y coordinate.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setheading

SETHEADING degrees
SETH degrees

turns the turtle to a new absolute heading. The input is a number, the heading in degrees clockwise from the positive Y axis.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

home

HOME

moves the turtle to the center of the screen. Equivalent to SETPOS [0 0] SETHEADING 0.

See section setpos , See section setheading .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

arc

ARC angle radius

draws an arc of a circle, with the turtle at the center, with the specified radius, starting at the turtle’s heading and extending clockwise through the specified angle. The turtle does not move.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.2 Turtle Motion Queries


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pos

POS

outputs the turtle’s current position, as a list of two numbers, the X and Y coordinates.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

xcor

XCOR						(library procedure)

outputs a number, the turtle’s X coordinate.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

ycor

YCOR						(library procedure)

outputs a number, the turtle’s Y coordinate.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

heading

HEADING

outputs a number, the turtle’s heading in degrees.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

towards

TOWARDS pos

outputs a number, the heading at which the turtle should be facing so that it would point from its current position to the position given as the input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

scrunch

SCRUNCH

outputs a list containing two numbers, the X and Y scrunch factors, as used by SETSCRUNCH. (But note that SETSCRUNCH takes two numbers as inputs, not one list of numbers.)

See section setscrunch .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.3 Turtle and Window Control


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

showturtle

SHOWTURTLE
ST

makes the turtle visible.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

hideturtle

HIDETURTLE
HT

makes the turtle invisible. It’s a good idea to do this while you’re in the middle of a complicated drawing, because hiding the turtle speeds up the drawing substantially.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

clean

CLEAN

erases all lines that the turtle has drawn on the graphics window. The turtle’s state (position, heading, pen mode, etc.) is not changed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

clearscreen

CLEARSCREEN
CS

erases the graphics window and sends the turtle to its initial position and heading. Like HOME and CLEAN together.

See section home .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

wrap

WRAP

tells the turtle to enter wrap mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will "wrap around" and reappear at the opposite edge of the window. The top edge wraps to the bottom edge, while the left edge wraps to the right edge. (So the window is topologically equivalent to a torus.) This is the turtle’s initial mode. Compare WINDOW and FENCE.

See section fence .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

window

WINDOW

tells the turtle to enter window mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move offscreen. The visible graphics window is considered as just part of an infinite graphics plane; the turtle can be anywhere on the plane. (If you lose the turtle, HOME will bring it back to the center of the window.) Compare WRAP and FENCE.

See section home .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

fence

FENCE

tells the turtle to enter fence mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move as far as it can and then stop at the edge with an "out of bounds" error message. Compare WRAP and WINDOW.

See section wrap .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

fill

FILL

fills in a region of the graphics window containing the turtle and bounded by lines that have been drawn earlier. This is not portable; it doesn’t work for all machines, and may not work exactly the same way on different machines.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

filled

FILLED color instructions

runs the instructions, remembering all points visited by turtle motion commands, starting and ending with the turtle’s initial position. Then draws (ignoring penmode) the resulting polygon, in the current pen color, filling the polygon with the given color, which can be a color number or an RGB list. The instruction list cannot include another FILLED invocation. (wxWidgets only)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

label

LABEL text

takes a word or list as input, and prints the input on the graphics window, starting at the turtle’s position.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setlabelheight

SETLABELHEIGHT height

command (wxWidgets only). Takes a positive integer argument and tries to set the font size so that the character height (including descenders) is that many turtle steps. This will be different from the number of screen pixels if SETSCRUNCH has been used. Also, note that SETSCRUNCH changes the font size to try to preserve this height in turtle steps. Note that the query operation corresponding to this command is LABELSIZE, not LABELHEIGHT, because it tells you the width as well as the height of characters in the current font.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

textscreen

TEXTSCREEN
TS

rearranges the size and position of windows to maximize the space available in the text window (the window used for interaction with Logo). The details differ among machines. Compare SPLITSCREEN and FULLSCREEN.

See section splitscreen .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

fullscreen

FULLSCREEN
FS

rearranges the size and position of windows to maximize the space available in the graphics window. The details differ among machines. Compare SPLITSCREEN and TEXTSCREEN.

Since there must be a text window to allow printing (including the printing of the Logo prompt), Logo automatically switches from fullscreen to splitscreen whenever anything is printed.

In the DOS version, switching from fullscreen to splitscreen loses the part of the picture that’s hidden by the text window. [This design decision follows from the scarcity of memory, so that the extra memory to remember an invisible part of a drawing seems too expensive.]


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

splitscreen

SPLITSCREEN
SS

rearranges the size and position of windows to allow some room for text interaction while also keeping most of the graphics window visible. The details differ among machines. Compare TEXTSCREEN and FULLSCREEN.

See section textscreen .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setscrunch

SETSCRUNCH xscale yscale

adjusts the aspect ratio and scaling of the graphics display. After this command is used, all further turtle motion will be adjusted by multiplying the horizontal and vertical extent of the motion by the two numbers given as inputs. For example, after the instruction SETSCRUNCH 2 1 motion at a heading of 45 degrees will move twice as far horizontally as vertically. If your squares don’t come out square, try this. (Alternatively, you can deliberately misadjust the aspect ratio to draw an ellipse.)

For all modern computers, both scale factors are initially 1. For DOS machines, the scale factors are initially set according to what the hardware claims the aspect ratio is, but the hardware sometimes lies. For DOS, the values set by SETSCRUNCH are remembered in a file (called ‘scrunch.dat’) and are automatically put into effect when a Logo session begins.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

refresh

REFRESH

(command) tells Logo to remember the turtle’s motions so that they can be used for high-resolution printing (wxWidgets) or to refresh the graphics window if it is moved, resized, or overlayed (non-wxWidgets). This is the default.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

norefresh

NOREFRESH

(command) tells Logo not to remember the turtle’s motions, which may be useful to save time and memory if your program is interactive or animated, rather than drawing a static picture you’ll want to print later (wxWidgets). In non-wxWidgets versions, using NOREFRESH may prevent Logo from restoring the graphics image after the window is moved, resized, or overlayed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.4 Turtle and Window Queries


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

shownp

SHOWNP
SHOWN?

outputs TRUE if the turtle is shown (visible), FALSE if the turtle is hidden. See SHOWTURTLE and HIDETURTLE.

See section showturtle , hideturtle .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

screenmode

SCREENMODE

outputs the word TEXTSCREEN, SPLITSCREEN, or FULLSCREEN depending on the current screen mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

turtlemode

TURTLEMODE

outputs the word WRAP, FENCE, or WINDOW depending on the current turtle mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

labelsize

LABELSIZE

(wxWidgets only) outputs a list of two positive integers, the width and height of characters displayed by LABEL measured in turtle steps (which will be different from screen pixels if SETSCRUNCH has been used). There is no SETLABELSIZE because the width and height of a font are not separately controllable, so the inverse of this operation is SETLABELHEIGHT, which takes just one number for the desired height.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.5 Pen and Background Control

The turtle carries a pen that can draw pictures. At any time the pen can be UP (in which case moving the turtle does not change what’s on the graphics screen) or DOWN (in which case the turtle leaves a trace). If the pen is down, it can operate in one of three modes: PAINT (so that it draws lines when the turtle moves), ERASE (so that it erases any lines that might have been drawn on or through that path earlier), or REVERSE (so that it inverts the status of each point along the turtle’s path).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pendown

PENDOWN
PD

sets the pen’s position to DOWN, without changing its mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

penup

PENUP
PU

sets the pen’s position to UP, without changing its mode.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

penpaint

PENPAINT
PPT

sets the pen’s position to DOWN and mode to PAINT.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

penerase

PENERASE
PE

sets the pen’s position to DOWN and mode to ERASE.

See section erase .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

penreverse

PENREVERSE
PX

sets the pen’s position to DOWN and mode to REVERSE. (This may interact in system-dependent ways with use of color.)

See section reverse .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setpencolor

SETPENCOLOR colornumber.or.rgblist
SETPC colornumber.or.rgblist

sets the pen color to the given number, which must be a nonnegative integer. There are initial assignments for the first 16 colors:

 0  black	 1  blue	 2  green	 3  cyan
 4  red		 5  magenta	 6  yellow	 7 white
 8  brown	 9  tan		10  forest	11  aqua
12  salmon	13  purple	14  orange	15  grey

but other colors can be assigned to numbers by the PALETTE command. Alternatively, sets the pen color to the given RGB values (a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setpalette

SETPALETTE colornumber rgblist

sets the actual color corresponding to a given number, if allowed by the hardware and operating system. Colornumber must be an integer greater than or equal to 8. (Logo tries to keep the first 8 colors constant.) The second input is a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setpensize

SETPENSIZE size

sets the thickness of the pen. The input is either a single positive integer or a list of two positive integers (for horizontal and vertical thickness). Some versions pay no attention to the second number, but always have a square pen.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setpenpattern

SETPENPATTERN pattern

sets hardware-dependent pen characteristics. This command is not guaranteed compatible between implementations on different machines.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setpen

SETPEN list					(library procedure)

sets the pen’s position, mode, thickness, and hardware-dependent characteristics according to the information in the input list, which should be taken from an earlier invocation of PEN.

See section pen .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setbackground

SETBACKGROUND colornumber.or.rgblist
SETBG colornumber.or.rgblist

set the screen background color by slot number or RGB values. See SETPENCOLOR for details.

See section setpencolor .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.6 Pen Queries


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pendownp

PENDOWNP
PENDOWN?

outputs TRUE if the pen is down, FALSE if it’s up.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

penmode

PENMODE

outputs one of the words PAINT, ERASE, or REVERSE according to the current pen mode.

See section erase , reverse .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pencolor

PENCOLOR
PC

outputs a color number, a nonnegative integer that is associated with a particular color, or a list of RGB values if such a list was used as the most recent input to SETPENCOLOR. There are initial assignments for the first 16 colors:

 0  black        1  blue         2  green        3  cyan
 4  red          5  magenta      6  yellow       7 white
 8  brown        9  tan         10  forest      11  aqua
12  salmon      13  purple      14  orange      15  grey

but other colors can be assigned to numbers by the PALETTE command.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

palette

PALETTE colornumber

outputs a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the color associated with the given number.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pensize

PENSIZE

outputs a list of two positive integers, specifying the horizontal and vertical thickness of the turtle pen. (In some implementations, including wxWidgets, the two numbers are always equal.)

PENPATTERN

outputs system-specific pen information.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pen

PEN						(library procedure)

outputs a list containing the pen’s position, mode, thickness, and hardware-specific characteristics, for use by SETPEN.

See section setpen .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

background

BACKGROUND
BG

outputs the graphics background color, either as a slot number or as an RGB list, whichever way it was set. (See PENCOLOR.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.7 Saving and Loading Pictures


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

savepict

SAVEPICT filename

command. Writes a file with the specified name containing the state of the graphics window, including any nonstandard color palette settings, in Logo’s internal format. This picture can be restored to the screen using LOADPICT. The format is not portable between platforms, nor is it readable by other programs. epspict to export Logo graphics for other programs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

loadpict

LOADPICT filename

command. Reads the specified file, which must have been written by a SAVEPICT command, and restores the graphics window and color palette settings to the values stored in the file. Any drawing previously on the screen is cleared.

See section savepict .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

epspict

EPSPICT filename

command. Writes a file with the specified name, containing an Encapsulated Postscript (EPS) representation of the state of the graphics window. This file can be imported into other programs that understand EPS format. Restrictions: the drawing cannot use FILL, PENERASE, or PENREVERSE; any such instructions will be ignored in the translation to Postscript form.

See section fill , See section penerase , See section penreverse .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

6.8 Mouse Queries


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

mousepos

MOUSEPOS

outputs the coordinates of the mouse, provided that it’s within the graphics window, in turtle coordinates. If the mouse is outside the graphics window, then the last position within the window is returned. Exception: If a mouse button is pressed within the graphics window and held while the mouse is dragged outside the window, the mouse’s position is returned as if the window were big enough to include it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

clickpos

CLICKPOS

outputs the coordinates that the mouse was at when a mouse button was most recently pushed, provided that that position was within the graphics window, in turtle coordinates. (wxWidgets only)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

buttonp

BUTTONP
BUTTON?

outputs TRUE if a mouse button is down and the mouse is over the graphics window. Once the button is down, BUTTONP remains true until the button is released, even if the mouse is dragged out of the graphics window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

button

BUTTON

outputs 0 if no mouse button has been pushed inside the Logo window since the last call to BUTTON. Otherwise, it outputs an integer between 1 and 3 indicating which button was most recently pressed. Ordinarily 1 means left, 2 means right, and 3 means center, but operating systems may reconfigure these.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_5.html0000664000175000017500000002625013601426471016305 0ustar jjcjjc BERKELEY LOGO 6.1: 5 Logical Operations
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5 Logical Operations


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

and

AND tf1 tf2
(AND tf1 tf2 tf3 ...)

outputs TRUE if all inputs are TRUE, otherwise FALSE. All inputs must be TRUE or FALSE. (Comparison is case-insensitive regardless of the value of CASEIGNOREDP. That is, true or True or TRUE are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a TRUE or FALSE value. List expressions are evaluated from left to right; as soon as a FALSE value is found, the remaining inputs are not examined. Example:

MAKE "RESULT AND [NOT (:X = 0)] [(1 / :X) > .5]

to avoid the division by zero if the first part is false.

See section caseignoredp .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

or

OR tf1 tf2
(OR tf1 tf2 tf3 ...)

outputs TRUE if any input is TRUE, otherwise FALSE. All inputs must be TRUE or FALSE. (Comparison is case-insensitive regardless of the value of CASEIGNOREDP. That is, true or True or TRUE are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a TRUE or FALSE value. List expressions are evaluated from left to right; as soon as a TRUE value is found, the remaining inputs are not examined. Example:

IF OR :X=0 [some.long.computation] [...]

to avoid the long computation if the first condition is met.

See section caseignoredp .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

not

NOT tf

outputs TRUE if the input is FALSE, and vice versa. The input can be a list, in which case it is taken as an expression to run; that expression must produce a TRUE or FALSE value.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_4.html0000664000175000017500000022670213601426471016310 0ustar jjcjjc BERKELEY LOGO 6.1: 4 Arithmetic
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4 Arithmetic


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.1 Numeric Operations


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

sum

SUM num1 num2
(SUM num1 num2 num3 ...)
num1 + num2

outputs the sum of its inputs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

difference

DIFFERENCE num1 num2
num1 - num2

outputs the difference of its inputs. Minus sign means infix difference in ambiguous contexts (when preceded by a complete expression), unless it is preceded by a space and followed by a nonspace. (See also MINUS.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

minus

MINUS num
- num

outputs the negative of its input. Minus sign means unary minus if the previous token is an infix operator or open parenthesis, or it is preceded by a space and followed by a nonspace. There is a difference in binding strength between the two forms:

MINUS 3 + 4     means   -(3+4)
- 3 + 4         means   (-3)+4

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

product

PRODUCT num1 num2
(PRODUCT num1 num2 num3 ...)
num1 * num2

outputs the product of its inputs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

quotient

QUOTIENT num1 num2
(QUOTIENT num)
num1 / num2

outputs the quotient of its inputs. The quotient of two integers is an integer if and only if the dividend is a multiple of the divisor. (In other words, QUOTIENT 5 2 is 2.5, not 2, but QUOTIENT 4 2 is 2, not 2.0 — it does the right thing.) With a single input, QUOTIENT outputs the reciprocal of the input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

remainder

REMAINDER num1 num2

outputs the remainder on dividing num1 by num2; both must be integers and the result is an integer with the same sign as num1.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

modulo

MODULO num1 num2

outputs the remainder on dividing num1 by num2; both must be integers and the result is an integer with the same sign as num2.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

int

INT num

outputs its input with fractional part removed, i.e., an integer with the same sign as the input, whose absolute value is the largest integer less than or equal to the absolute value of the input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

round

ROUND num

outputs the nearest integer to the input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

sqrt

SQRT num

outputs the square root of the input, which must be nonnegative.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

power

POWER num1 num2

outputs num1 to the num2 power. If num1 is negative, then num2 must be an integer.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

exp

EXP num

outputs e (2.718281828+) to the input power.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

log10

LOG10 num

outputs the common logarithm of the input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

ln

LN num

outputs the natural logarithm of the input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

sin

SIN degrees

outputs the sine of its input, which is taken in degrees.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

radsin

RADSIN radians

outputs the sine of its input, which is taken in radians.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

cos

COS degrees

outputs the cosine of its input, which is taken in degrees.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

radcos

RADCOS radians

outputs the cosine of its input, which is taken in radians.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

arctan

ARCTAN num
(ARCTAN x y)

outputs the arctangent, in degrees, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or 90 or –90 depending on the sign of y, if x is zero.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

radarctan

RADARCTAN num
(RADARCTAN x y)

outputs the arctangent, in radians, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or pi/2 or –pi/2 depending on the sign of y, if x is zero.

The expression 2*(RADARCTAN 0 1) can be used to get the value of pi.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

iseq

ISEQ from to					(library procedure)

outputs a list of the integers from from to to, inclusive.

? show iseq 3 7
[3 4 5 6 7]
? show iseq 7 3
[7 6 5 4 3]

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

rseq

RSEQ from to count				(library procedure)

outputs a list of count equally spaced rational numbers between from and to, inclusive.

? show rseq 3 5 9 
[3 3.25 3.5 3.75 4 4.25 4.5 4.75 5] 
? show rseq 3 5 5
[3 3.5 4 4.5 5]

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.2 Numeric Predicates


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

lessp

LESSP num1 num2
LESS? num1 num2
num1 < num2

outputs TRUE if its first input is strictly less than its second.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

greaterp

GREATERP num1 num2
GREATER? num1 num2
num1 > num2

outputs TRUE if its first input is strictly greater than its second.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

lessequalp

LESSEQUALP num1 num2
LESSEQUAL? num1 num2
num1 <= num2

outputs TRUE if its first input is less than or equal to its second.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

greaterequalp

GREATEREQUALP num1 num2
GREATEREQUAL? num1 num2
num1 >= num2

outputs TRUE if its first input is greater than or equal to its second.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.3 Random Numbers


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

random

RANDOM num
(RANDOM start end)

with one input, outputs a random nonnegative integer less than its input, which must be a positive integer.

With two inputs, RANDOM outputs a random integer greater than or equal to the first input, and less than or equal to the second input. Both inputs must be integers, and the first must be less than the second. (RANDOM 0 9) is equivalent to RANDOM 10; (RANDOM 3 8) is equivalent to (RANDOM 6)+3.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

rerandom

RERANDOM
(RERANDOM seed)

command. Makes the results of RANDOM reproducible. Ordinarily the sequence of random numbers is different each time Logo is used. If you need the same sequence of pseudo-random numbers repeatedly, e.g. to debug a program, say RERANDOM before the first invocation of RANDOM. If you need more than one repeatable sequence, you can give RERANDOM an integer input; each possible input selects a unique sequence of numbers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.4 Print Formatting


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

form

FORM num width precision

outputs a word containing a printable representation of num, possibly preceded by spaces (and therefore not a number for purposes of performing arithmetic operations), with at least width characters, including exactly precision digits after the decimal point. (If precision is 0 then there will be no decimal point in the output.)

As a debugging feature, (FORM num -1 format) will print the floating point num according to the C printf format, to allow

to hex :num
op form :num -1 "|%08X %08X|
end

to allow finding out the exact result of floating point operations. The precise format needed may be machine-dependent.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

4.5 Bitwise Operations


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

bitand

BITAND num1 num2
(BITAND num1 num2 num3 ...)

outputs the bitwise and of its inputs, which must be integers.

See section and .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

bitor

BITOR num1 num2
(BITOR num1 num2 num3 ...)

outputs the bitwise or of its inputs, which must be integers.

See section or .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

bitxor

BITXOR num1 num2
(BITXOR num1 num2 num3 ...)

outputs the bitwise exclusive or of its inputs, which must be integers.

See section or .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

bitnot

BITNOT num

outputs the bitwise not of its input, which must be an integer.

See section not .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

ashift

ASHIFT num1 num2

outputs num1 arithmetic-shifted to the left by num2 bits. If num2 is negative, the shift is to the right with sign extension. The inputs must be integers.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

lshift

LSHIFT num1 num2

outputs num1 logical-shifted to the left by num2 bits. If num2 is negative, the shift is to the right with zero fill. The inputs must be integers.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_3.html0000664000175000017500000030441613601426471016306 0ustar jjcjjc BERKELEY LOGO 6.1: 3 Communication
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3 Communication


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.1 Transmitters

Note: If there is a variable named PRINTDEPTHLIMIT with a nonnegative integer value, then complex list and array structures will be printed only to the allowed depth. That is, members of members of... of members will be allowed only so far. The members omitted because they are just past the depth limit are indicated by an ellipsis for each one, so a too-deep list of two members will print as [... ...].

If there is a variable named PRINTWIDTHLIMIT with a nonnegative integer value, then only the first so many members of any array or list will be printed. A single ellipsis replaces all missing data within the structure. The width limit also applies to the number of characters printed in a word, except that a PRINTWIDTHLIMIT between 0 and 9 will be treated as if it were 10 when applied to words. This limit applies not only to the top-level printed datum but to any substructures within it.

See section printdepthlimit , printwidthlimit

If there is a variable named FULLPRINTP whose value is TRUE, then words that were created using backslash or vertical bar (to include characters that would otherwise not be treated as part of a word) are printed with the backslashes or vertical bars shown, so that the printed result could be re-read by Logo to produce the same value. If FULLPRINTP is TRUE then the empty word (however it was created) prints as ||. (Otherwise it prints as nothing at all.)

See section fullprintp .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

print

PRINT thing
PR thing
(PRINT thing1 thing2 ...)
(PR thing1 thing2 ...)

command. Prints the input or inputs to the current write stream (initially the screen). All the inputs are printed on a single line, separated by spaces, ending with a newline. If an input is a list, square brackets are not printed around it, but brackets are printed around sublists. Braces are always printed around arrays.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

type

TYPE thing
(TYPE thing1 thing2 ...)

command. Prints the input or inputs like PRINT, except that no newline character is printed at the end and multiple inputs are not separated by spaces. Note: printing to the screen is ordinarily line buffered; that is, the characters you print using TYPE will not actually appear on the screen until either a newline character is printed (for example, by PRINT or SHOW) or Logo tries to read from the keyboard (either at the request of your program or after an instruction prompt). This buffering makes the program much faster than it would be if each character appeared immediately, and in most cases the effect is not disconcerting. To accommodate programs that do a lot of positioned text display using TYPE, Logo will force printing whenever SETCURSOR is invoked. This solves most buffering problems. Still, on occasion you may find it necessary to force the buffered characters to be printed explicitly; this can be done using the WAIT command. WAIT 0 will force printing without actually waiting.

See section setcursor , wait


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

show

SHOW thing
(SHOW thing1 thing2 ...)

command. Prints the input or inputs like PRINT, except that if an input is a list it is printed inside square brackets.

See section print .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.2 Receivers


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

readlist

READLIST
RL

reads a line from the read stream (initially the keyboard) and outputs that line as a list. The line is separated into members as though it were typed in square brackets in an instruction. If the read stream is a file, and the end of file is reached, READLIST outputs the empty word (not the empty list). READLIST processes backslash, vertical bar, and tilde characters in the read stream; the output list will not contain these characters but they will have had their usual effect. READLIST does not, however, treat semicolon as a comment character.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

readword

READWORD
RW

reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, READWORD outputs the empty list (not the empty word). READWORD processes backslash, vertical bar, and tilde characters in the read stream. In the case of a tilde used for line continuation, the output word does include the tilde and the newline characters, so that the user program can tell exactly what the user entered. Vertical bars in the line are also preserved in the output. Backslash characters are not preserved in the output.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

readrawline

READRAWLINE

reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, READRAWLINE outputs the empty list (not the empty word). READRAWLINE outputs the exact string of characters as they appear in the line, with no special meaning for backslash, vertical bar, tilde, or any other formatting characters.

See section readword .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

readchar

READCHAR
RC

reads a single character from the read stream and outputs that character as a word. If the read stream is a file, and the end of file is reached, READCHAR outputs the empty list (not the empty word). If the read stream is the keyboard, echoing is turned off when READCHAR is invoked, and remains off until READLIST or READWORD is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context.

See section readlist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

readchars

READCHARS num
RCS num

reads num characters from the read stream and outputs those characters as a word. If the read stream is a file, and the end of file is reached, READCHARS outputs the empty list (not the empty word). If the read stream is the keyboard, echoing is turned off when READCHARS is invoked, and remains off until READLIST or READWORD is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context.

See section readlist , readword


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

shell

SHELL command
(SHELL command wordflag)

Under Unix, outputs the result of running command as a shell command. (The command is sent to ‘/bin/sh’, not ‘csh’ or other alternatives.) If the command is a literal list in the instruction line, and if you want a backslash character sent to the shell, you must use \\ to get the backslash through Logo’s reader intact. The output is a list containing one member for each line generated by the shell command. Ordinarily each such line is represented by a list in the output, as though the line were read using READLIST. If a second input is given, regardless of the value of the input, each line is represented by a word in the output as though it were read with READWORD. Example:

to dayofweek
output first first shell [date]
end

This is first first to extract the first word of the first (and only) line of the shell output.

Under MacOS X, SHELL works as under Unix. SHELL is not available under Mac Classic.

Under DOS, SHELL is a command, not an operation; it sends its input to a DOS command processor but does not collect the result of the command.

Under Windows, the wxWidgets version of Logo behaves as under Unix (except that DOS-style commands are understood; use dir rather than ls). The non-wxWidgets version behaves like the DOS version.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.3 File Access


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setprefix

SETPREFIX string

command. Sets a prefix that will be used as the implicit beginning of filenames in OPENREAD, OPENWRITE, OPENAPPEND, OPENUPDATE, LOAD, and SAVE commands. Logo will put the appropriate separator character (slash for Unix, backslash for DOS/Windows, colon for MacOS Classic) between the prefix and the filename entered by the user. The input to SETPREFIX must be a word, unless it is the empty list, to indicate that there should be no prefix.

See section openread , See section openwrite , See section openappend , See section openupdate , See section load , See section save .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

prefix

PREFIX

outputs the current file prefix, or [] if there is no prefix.

See section setprefix .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

openread

OPENREAD filename

command. Opens the named file for reading. The read position is initially at the beginning of the file.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

openwrite

OPENWRITE filename

command. Opens the named file for writing. If the file already existed, the old version is deleted and a new, empty file created.

OPENWRITE, but not the other OPEN variants, will accept as input a two-element list, in which the first element must be a variable name, and the second must be a positive integer. A character buffer of the specified size will be created. When a SETWRITE is done with this same list (in the sense of .EQ, not a copy, so you must do something like

? make "buf [foo 100]
? openwrite :buf
? setwrite :buf
    [...]
? close :buf

and not just

? openwrite [foo 100]
? setwrite [foo 100]

and so on), the printed characters are stored in the buffer; when a CLOSE is done with the same list as input, the characters from the buffer (treated as one long word, even if spaces and newlines are included) become the value of the specified variable.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

openappend

OPENAPPEND filename

command. Opens the named file for writing. If the file already exists, the write position is initially set to the end of the old file, so that newly written data will be appended to it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

openupdate

OPENUPDATE filename

command. Opens the named file for reading and writing. The read and write position is initially set to the end of the old file, if any. Note: each open file has only one position, for both reading and writing. If a file opened for update is both READER and WRITER at the same time, then SETREADPOS will also affect WRITEPOS and vice versa. Also, if you alternate reading and writing the same file, you must SETREADPOS between a write and a read, and SETWRITEPOS between a read and a write.

See section reader , writer , setreadpos , setwritepos


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

close

CLOSE filename

command. Closes the named file. If the file was currently the reader or writer, then the reader or writer is changed to the keyboard or screen, as if SETREAD [] or SETWRITE [] had been done.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

allopen

ALLOPEN

outputs a list whose members are the names of all files currently open. This list does not include the dribble file, if any.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

closeall

CLOSEALL					(library procedure)

command. Closes all open files. Abbreviates FOREACH ALLOPEN [CLOSE ?]

See section foreach , close


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

erasefile

ERASEFILE filename
ERF filename

command. Erases (deletes, removes) the named file, which should not currently be open.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

dribble

DRIBBLE filename

command. Creates a new file whose name is the input, like OPENWRITE, and begins recording in that file everything that is read from the keyboard or written to the terminal. That is, this writing is in addition to the writing to WRITER. The intent is to create a transcript of a Logo session, including things like prompt characters and interactions.

See section openwrite , writer


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

nodribble

NODRIBBLE

command. Stops copying information into the dribble file, and closes the file.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setread

SETREAD filename

command. Makes the named file the read stream, used for READLIST, etc. The file must already be open with OPENREAD or OPENUPDATE. If the input is the empty list, then the read stream becomes the keyboard, as usual. Changing the read stream does not close the file that was previously the read stream, so it is possible to alternate between files.

See section readlist , openread , openupdate


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setwrite

SETWRITE filename

command. Makes the named file the write stream, used for PRINT, etc. The file must already be open with OPENWRITE, OPENAPPEND, or OPENUPDATE. If the input is the empty list, then the write stream becomes the screen, as usual. Changing the write stream does not close the file that was previously the write stream, so it is possible to alternate between files.

If the input is a list, then its first element must be a variable name, and its second and last element must be a positive integer; a buffer of that many characters will be allocated, and will become the writestream. If the same list (same in the .EQ sense, not a copy) has been used as input to OPENWRITE, then the already-allocated buffer will be used, and the writer can be changed to and from this buffer, with all the characters accumulated as in a file. When the same list is used as input to CLOSE, the contents of the buffer (as an unparsed word, which may contain newline characters) will become the value of the named variable. For compatibility with earlier versions, if the list has not been opened when the SETWRITE is done, it will be opened implicitly, but the first SETWRITE after this one will implicitly close it, setting the variable and freeing the allocated buffer.

See section print , openwrite ; openappend ; openupdate


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

reader

READER

outputs the name of the current read stream file, or the empty list if the read stream is the terminal.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

writer

WRITER

outputs the name of the current write stream file, or the empty list if the write stream is the screen.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setreadpos

SETREADPOS charpos

command. Sets the file pointer of the read stream file so that the next READLIST, etc., will begin reading at the charposth character in the file, counting from 0. (That is, SETREADPOS 0 will start reading from the beginning of the file.) Meaningless if the read stream is the keyboard.

See section readlist .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setwritepos

SETWRITEPOS charpos

command. Sets the file pointer of the write stream file so that the next PRINT, etc., will begin writing at the charposth character in the file, counting from 0. (That is, SETWRITEPOS 0 will start writing from the beginning of the file.) Meaningless if the write stream is the screen.

See section print .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

readpos

READPOS

outputs the file position of the current read stream file.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

writepos

WRITEPOS

outputs the file position of the current write stream file.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

eofp

EOFP
EOF?

predicate, outputs TRUE if there are no more characters to be read in the read stream file, FALSE otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

filep

FILEP filename
FILE? filename					(library procedure)

predicate, outputs TRUE if a file of the specified name exists and can be read, FALSE otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

3.4 Terminal Access


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

keyp

KEYP
KEY?

predicate, outputs TRUE if there are characters waiting to be read from the read stream. If the read stream is a file, this is equivalent to NOT EOFP. If the read stream is the terminal, then echoing is turned off and the terminal is set to cbreak (character at a time instead of line at a time) mode. It remains in this mode until some line-mode reading is requested (e.g., READLIST). The Unix operating system forgets about any pending characters when it switches modes, so the first KEYP invocation will always output FALSE.

See section eofp , readlist


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

cleartext

CLEARTEXT
CT

command. Clears the text window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setcursor

SETCURSOR vector

command. The input is a list of two numbers, the x and y coordinates of a text window position (origin in the upper left corner, positive direction is southeast). The text cursor is moved to the requested position. This command also forces the immediate printing of any buffered characters.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

cursor

CURSOR

outputs a list containing the current x and y coordinates of the text cursor. Logo may get confused about the current cursor position if, e.g., you type in a long line that wraps around or your program prints escape codes that affect the screen strangely.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setmargins

SETMARGINS vector

command. The input must be a list of two numbers, as for SETCURSOR. The effect is to clear the screen and then arrange for all further printing to be shifted down and to the right according to the indicated margins. Specifically, every time a newline character is printed (explicitly or implicitly) Logo will type x_margin spaces, and on every invocation of SETCURSOR the margins will be added to the input x and y coordinates. (CURSOR will report the cursor position relative to the margins, so that this shift will be invisible to Logo programs.) The purpose of this command is to accommodate the display of terminal screens in lecture halls with inadequate TV monitors that miss the top and left edges of the screen.

See section setcursor .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

settextcolor

SETTEXTCOLOR foreground background
SETTC foreground background

command (wxWidgets only). The inputs are color numbers, or RGB color lists, as for turtle graphics. The foreground and background colors for the textscreen/splitscreen text window are changed to the given values. The change affects text already printed as well as future text printing; there is only one text color for the entire window.

Command (non-wxWidgets Windows and DOS extended only). The inputs are color numbers, as for turtle graphics. Future printing to the text window will use the specified colors for foreground (the characters printed) and background (the space under those characters). Using STANDOUT will revert to the default text window colors. In the DOS extended (‘ucblogo.exe’) version, colors in textscreen mode are limited to numbers 0-7, and the coloring applies only to text printed by the program, not to the echoing of text typed by the user. Neither limitation applies to the text portion of splitscreen mode, which is actually drawn as graphics internally.

See section standout .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

increasefont

INCREASEFONT
DECREASEFONT

command (wxWidgets only). Increase or decrease the size of the font used in the text and edit windows to the next larger or smaller available size.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

settextsize

SETTEXTSIZE height

command (wxWidgets only). Set the "point size" of the font used in the text and edit windows to the given integer input. The desired size may not be available, in which case the nearest available size will be used. Note: There is only a slight correlation between these integers and pixel sizes. Our rough estimate is that the number of pixels of height is about 1.5 times the point size, but it varies for different fonts. See SETLABELHEIGHT for a different approach used for the graphics window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

textsize

TEXTSIZE

(wxWidgets only) outputs the "point size" of the font used in the text and edit windows. See SETTEXTSIZE for a discussion of font sizing. See LABELSIZE for a different approach used for the graphics window.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setfont

SETFONT fontname

command (wxWidgets only). Set the font family used in all windows to the one named by the input. Try ‘Courier’ or ‘Monospace’ as likely possibilities. Not all computers have the same fonts installed. It’s a good idea to stick with monospace fonts (ones in which all characters have the same width).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

font

FONT

(wxWidgets only) outputs the name of the font family used in all windows.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_2.html0000664000175000017500000035334113601426471016306 0ustar jjcjjc BERKELEY LOGO 6.1: 2 Data Structure Primitives
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2 Data Structure Primitives


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.1 Constructors


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

word

WORD word1 word2
(WORD word1 word2 word3 ...)

outputs a word formed by concatenating its inputs.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

list

LIST thing1 thing2
(LIST thing1 thing2 thing3 ...)

outputs a list whose members are its inputs, which can be any Logo datum (word, list, or array).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

sentence

SENTENCE thing1 thing2
SE thing1 thing2
(SENTENCE thing1 thing2 thing3 ...)
(SE thing1 thing2 thing3 ...)

outputs a list whose members are its inputs, if those inputs are not lists, or the members of its inputs, if those inputs are lists.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

fput

FPUT thing list

outputs a list equal to its second input with one extra member, the first input, at the beginning. If the second input is a word, then the first input must be a one-letter word, and FPUT is equivalent to WORD.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

lput

LPUT thing list

outputs a list equal to its second input with one extra member, the first input, at the end. If the second input is a word, then the first input must be a one-letter word, and LPUT is equivalent to WORD with its inputs in the other order.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

array

ARRAY size
(ARRAY size origin)

outputs an array of size members (must be a positive integer), each of which initially is an empty list. Array members can be selected with ITEM and changed with SETITEM. The first member of the array is member number 1 unless an origin input (must be an integer) is given, in which case the first member of the array has that number as its index. (Typically 0 is used as the origin if anything.) Arrays are printed by PRINT and friends, and can be typed in, inside curly braces; indicate an origin with {a b c}@0.

See section item , setitem , print .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

mdarray

MDARRAY sizelist				(library procedure)
(MDARRAY sizelist origin)

outputs a multi-dimensional array. The first input must be a list of one or more positive integers. The second input, if present, must be a single integer that applies to every dimension of the array.

Ex: (MDARRAY [3 5] 0) outputs a two-dimensional array whose members range from [0 0] to [2 4].


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

listtoarray

LISTTOARRAY list
(LISTTOARRAY list origin)

outputs an array of the same size as the input list, whose members are the members of the input list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

arraytolist

ARRAYTOLIST array

outputs a list whose members are the members of the input array. The first member of the output is the first member of the array, regardless of the array’s origin.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

combine

COMBINE thing1 thing2				(library procedure)

if thing2 is a word, outputs WORD thing1 thing2. If thing2 is a list, outputs FPUT thing1 thing2.

See section word , fput


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

reverse

REVERSE list					(library procedure)

outputs a list whose members are the members of the input list, in reverse order.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

gensym

GENSYM						(library procedure)

outputs a unique word each time it’s invoked. The words are of the form G1, G2, etc.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.2 Data Selectors


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

first

FIRST thing

if the input is a word, outputs the first character of the word. If the input is a list, outputs the first member of the list. If the input is an array, outputs the origin of the array (that is, the index of the first member of the array).


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

firsts

FIRSTS list

outputs a list containing the FIRST of each member of the input list. It is an error if any member of the input list is empty. (The input itself may be empty, in which case the output is also empty.) This could be written as

to firsts :list
output map "first :list
end

but is provided as a primitive in order to speed up the iteration tools MAP, MAP.SE, and FOREACH.

to transpose :matrix
if emptyp first :matrix [op []]
op fput firsts :matrix transpose bfs :matrix
end

See section map , map.se , foreach


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

last

LAST wordorlist

if the input is a word, outputs the last character of the word. If the input is a list, outputs the last member of the list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

butfirst

BUTFIRST wordorlist
BF wordorlist

if the input is a word, outputs a word containing all but the first character of the input. If the input is a list, outputs a list containing all but the first member of the input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

butfirsts

BUTFIRSTS list
BFS list

outputs a list containing the BUTFIRST of each member of the input list. It is an error if any member of the input list is empty or an array. (The input itself may be empty, in which case the output is also empty.) This could be written as

to butfirsts :list
output map "butfirst :list
end

but is provided as a primitive in order to speed up the iteration tools MAP, MAP.SE, and FOREACH.

See section map , map.se , foreach


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

butlast

BUTLAST wordorlist
BL wordorlist

if the input is a word, outputs a word containing all but the last character of the input. If the input is a list, outputs a list containing all but the last member of the input.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

item

ITEM index thing

if the thing is a word, outputs the indexth character of the word. If the thing is a list, outputs the indexth member of the list. If the thing is an array, outputs the indexth member of the array. Index starts at 1 for words and lists; the starting index of an array is specified when the array is created.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

mditem

MDITEM indexlist array				(library procedure)

outputs the member of the multidimensional array selected by the list of numbers indexlist.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pick

PICK list					(library procedure)

outputs a randomly chosen member of the input list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

remove

REMOVE thing list				(library procedure)

outputs a copy of list with every member equal to thing removed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

remdup

REMDUP list					(library procedure)

outputs a copy of list with duplicate members removed. If two or more members of the input are equal, the rightmost of those members is the one that remains in the output.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

quoted

QUOTED thing					(library procedure)

outputs its input, if a list; outputs its input with a quotation mark prepended, if a word.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.3 Data Mutators


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

setitem

SETITEM index array value

command. Replaces the indexth member of array with the new value. Ensures that the resulting array is not circular, i.e., value may not be a list or array that contains array.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

mdsetitem

MDSETITEM indexlist array value			(library procedure)

command. Replaces the member of array chosen by indexlist with the new value.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

.setfirst

.SETFIRST list value

command. Changes the first member of list to be value.

WARNING: Primitives whose names start with a period are dangerous. Their use by non-experts is not recommended. The use of .SETFIRST can lead to circular list structures, which will get some Logo primitives into infinite loops, and to unexpected changes to other data structures that share storage with the list being modified.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

.setbf

.SETBF list value

command. Changes the butfirst of list to be value.

WARNING: Primitives whose names start with a period are dangerous. Their use by non-experts is not recommended. The use of .SETBF can lead to circular list structures, which will get some Logo primitives into infinite loops; unexpected changes to other data structures that share storage with the list being modified; or to Logo crashes and coredumps if the butfirst of a list is not itself a list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

.setitem

.SETITEM index array value

command. Changes the indexth member of array to be value, like SETITEM, but without checking for circularity.

WARNING: Primitives whose names start with a period are dangerous. Their use by non-experts is not recommended. The use of .SETITEM can lead to circular arrays, which will get some Logo primitives into infinite loops.

See section setitem.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

push

PUSH stackname thing				(library procedure)

command. Adds the thing to the stack that is the value of the variable whose name is stackname. This variable must have a list as its value; the initial value should be the empty list. New members are added at the front of the list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

pop

POP stackname					(library procedure)

outputs the most recently PUSHed member of the stack that is the value of the variable whose name is stackname and removes that member from the stack.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

queue

QUEUE queuename thing				(library procedure)

command. Adds the thing to the queue that is the value of the variable whose name is queuename. This variable must have a list as its value; the initial value should be the empty list. New members are added at the back of the list.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

dequeue

DEQUEUE queuename				(library procedure)

outputs the least recently QUEUEd member of the queue that is the value of the variable whose name is queuename and removes that member from the queue.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.4 Predicates


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

wordp

WORDP thing
WORD? thing

outputs TRUE if the input is a word, FALSE otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

listp

LISTP thing
LIST? thing

outputs TRUE if the input is a list, FALSE otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

arrayp

ARRAYP thing
ARRAY? thing

outputs TRUE if the input is an array, FALSE otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

emptyp

EMPTYP thing
EMPTY? thing

outputs TRUE if the input is the empty word or the empty list, FALSE otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

equalp

EQUALP thing1 thing2
EQUAL? thing1 thing2
thing1 = thing2

outputs TRUE if the inputs are equal, FALSE otherwise. Two numbers are equal if they have the same numeric value. Two non-numeric words are equal if they contain the same characters in the same order. If there is a variable named CASEIGNOREDP whose value is TRUE, then an upper case letter is considered the same as the corresponding lower case letter. (This is the case by default.) Two lists are equal if their members are equal. An array is only equal to itself; two separately created arrays are never equal even if their members are equal. (It is important to be able to know if two expressions have the same array as their value because arrays are mutable; if, for example, two variables have the same array as their values then performing SETITEM on one of them will also change the other.)

See section caseignoredp , setitem


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

notequalp

NOTEQUALP thing1 thing2
NOTEQUAL? thing1 thing2
thing1 <> thing2

outputs FALSE if the inputs are equal, TRUE otherwise. See EQUALP for the meaning of equality for different data types.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

beforep

BEFOREP word1 word2
BEFORE? word1 word2

outputs TRUE if word1 comes before word2 in ASCII collating sequence (for words of letters, in alphabetical order). Case-sensitivity is determined by the value of CASEIGNOREDP. Note that if the inputs are numbers, the result may not be the same as with LESSP; for example, BEFOREP 3 12 is false because 3 collates after 1.

See section caseignoredp , lessp


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

.eq

.EQ thing1 thing2

outputs TRUE if its two inputs are the same datum, so that applying a mutator to one will change the other as well. Outputs FALSE otherwise, even if the inputs are equal in value.

WARNING: Primitives whose names start with a period are dangerous. Their use by non-experts is not recommended. The use of mutators can lead to circular data structures, infinite loops, or Logo crashes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

memberp

MEMBERP thing1 thing2
MEMBER? thing1 thing2

if thing2 is a list or an array, outputs TRUE if thing1 is EQUALP to a member of thing2, FALSE otherwise. If thing2 is a word, outputs TRUE if thing1 is a one-character word EQUALP to a character of thing2, FALSE otherwise.

See section equalp .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

substringp

SUBSTRINGP thing1 thing2
SUBSTRING? thing1 thing2

if thing1 or thing2 is a list or an array, outputs FALSE. If thing2 is a word, outputs TRUE if thing1 is EQUALP to a substring of thing2, FALSE otherwise.

See section equalp .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

numberp

NUMBERP thing
NUMBER? thing

outputs TRUE if the input is a number, FALSE otherwise.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

vbarredp

VBARREDP char
VBARRED? char
BACKSLASHEDP char                               (library procedure)
BACKSLASHED? char                               (library procedure)

outputs TRUE if the input character was originally entered into Logo within vertical bars (|) to prevent its usual special syntactic meaning, FALSE otherwise. (Outputs TRUE only if the character is a backslashed space, tab, newline, or one of ()[]+-*/=<>":;\~?| )

The names BACKSLASHEDP and BACKSLASHED? are included in the Logo library for backward compatibility with the former names of this primitive, although it does not output TRUE for characters originally entered with backslashes.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

2.5 Queries


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

count

COUNT thing

outputs the number of characters in the input, if the input is a word; outputs the number of members in the input, if it is a list or an array. (For an array, this may or may not be the index of the last member, depending on the array’s origin.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

ascii

ASCII char

outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing vbarred punctuation, and returns the character code for the corresponding punctuation character without vertical bars. (Compare RAWASCII.)


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

rawascii

RAWASCII char

outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing themselves. To find out the ASCII code of an arbitrary keystroke, use RAWASCII RC.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

char

CHAR int

outputs the character represented in the ASCII code by the input, which must be an integer between 0 and 255.

See section ascii .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

member

MEMBER thing1 thing2

if thing2 is a word or list and if MEMBERP with these inputs would output TRUE, outputs the portion of thing2 from the first instance of thing1 to the end. If MEMBERP would output FALSE, outputs the empty word or list according to the type of thing2. It is an error for thing2 to be an array.

See section memberp .


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

lowercase

LOWERCASE word

outputs a copy of the input word, but with all uppercase letters changed to the corresponding lowercase letter.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

uppercase

UPPERCASE word

outputs a copy of the input word, but with all lowercase letters changed to the corresponding uppercase letter.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

standout

STANDOUT thing

outputs a word that, when printed, will appear like the input but displayed in standout mode (boldface, reverse video, or whatever your version does for standout). The word contains machine-specific magic characters at the beginning and end; in between is the printed form (as if displayed using TYPE) of the input. The output is always a word, even if the input is of some other type, but it may include spaces and other formatting characters. Note: a word output by STANDOUT while Logo is running on one machine will probably not have the desired effect if printed on another type of machine.

In the Macintosh classic version, the way that standout works is incompatible with the use of characters whose ASCII code is greater than 127. Therefore, you have a choice to make: The instruction

CANINVERSE 0 

disables standout, but enables the display of ASCII codes above 127, and the instruction

CANINVERSE 1 

restores the default situation in which standout is enabled and the extra graphic characters cannot be printed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

parse

PARSE word

outputs the list that would result if the input word were entered in response to a READLIST operation. That is, PARSE READWORD has the same value as READLIST for the same characters read.

See section readlist , readword


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

runparse

RUNPARSE wordorlist

outputs the list that would result if the input word or list were entered as an instruction line; characters such as infix operators and parentheses are separate members of the output. Note that sublists of a runparsed list are not themselves runparsed.


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual_1.html0000664000175000017500000007524713601426470016312 0ustar jjcjjc BERKELEY LOGO 6.1: 1.1 Overview
[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.1 Overview

Copyright © 1993 by the Regents of the University of California

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>.

This is a program that is still being written. Many things are missing, including adequate documentation. This manual assumes that you already know how to program in Logo, and merely presents the details of this new implementation.

Read Computer Science Logo Style, Volume 1: Symbolic Computing by Brian Harvey (MIT Press, 1997) for a tutorial on Logo programming with emphasis on symbolic computation.

Here are the special features of this dialect of Logo:

Source file compatible among Unix, DOS, Windows, and Mac platforms.

Random-access arrays.

Variable number of inputs to user-defined procedures.

Mutators for list structure (dangerous).

Pause on error, and other improvements to error handling.

Comments and continuation lines; formatting is preserved when
procedure definitions are saved or edited.

Terrapin-style tokenization (e.g., [2+3] is a list with one member)
but LCSI-style syntax (no special forms except TO).  The best of
both worlds.

First-class instruction and expression templates (see APPLY).

Macros.

Features not found in Berkeley Logo include robotics, music, animation, parallelism, and multimedia. For those, buy a commercial version.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.2 Getter/Setter Variable Syntax

Logo distinguishes procedures from variables. A procedure is a set of instructions to carry out some computation; a variable is a named container that holds a data value such as a number, word, list, or array.

In traditional Logo syntax, a non-numeric word typed without punctuation represents a request to invoke the procedure named by that word. A word typed with a preceding quotation mark represents the word itself. For example, in the instruction

	PRINT FIRST "WORD

the procedures named FIRST and PRINT are invoked, but the procedure named WORD is not invoked; the word W-O-R-D is the input to FIRST.

What about variables? There are two things one can do with a variable: give it a value, and find out its value. To give a variable a value, Logo provides the primitive procedure MAKE, which requires two inputs: the name of the variable and the new value to be assigned. The first input, the name of the variable, is just a word, and if (as is almost always the case) the programmer wants to assign a value to a specific variable whose name is known in advance, that input is quoted, just as any known specific word would be:

	MAKE "MY.VAR FIRST "WORD

gives the variable named MY.VAR the value W (the first letter of WORD).

To find the value of a variable, Logo provides the primitive procedure THING, which takes a variable name as its input, and outputs the value of the accessible variable with that name. Thus

	PRINT THING "MY.VAR

will print W (supposing the MAKE above has been done). Since finding the value of a specific, known variable name is such a common operation, Logo also provides an abbreviated notation that combines THING with quote:

	PRINT :MY.VAR

The colon (which Logo old-timers pronounce "dots") replaces THING and " in the earlier version of the instruction.

Newcomers to Logo often complain about the need for all this punctuation. In particular, Logo programmers who learned about dots and quotes without also learning about THING wonder why an instruction such as

	MAKE "NEW.VAR :OLD.VAR

uses two different punctuation marks to identify the two variables. (Having read the paragraphs above, you will understand that actually both variable names are quoted, but the procedure THING is invoked to find the value of OLD.VAR, since it’s that value, not OLD.VAR’s name, that MAKE needs to know. It wouldn’t make sense to ask for THING of NEW.VAR, since we haven’t given NEW.VAR a value yet.)

Although Logo’s punctuation rules make sense once understood, they do form a barrier to entry for the Logo beginner. Why, then, couldn’t Logo be designed so that an unpunctuated word would represent a procedure if there is a procedure by that name, or a variable if there is a variable by that name? Then we could say

	PRINT MY.VAR

and Logo would realize that MY.VAR is the name of a variable, not of a procedure. The traditional reason not to use this convention is that Logo allows the same word to name a procedure and a variable at the same time. This is most often important for words that name data types, as in the following procedure:

	TO PLURAL :WORD
	OUTPUT WORD :WORD "S
	END

Here the name WORD is a natural choice for the input to PLURAL, since it describes the kind of input that PLURAL expects. Within the procedure, we use WORD to represent Logo’s primitive procedure that combines two input words to form a new, longer word; we use :WORD to represent the variable containing the input, whatever actual word is given when PLURAL is invoked.

	? PRINT PLURAL "COMPUTER
	COMPUTERS

However, if a Logo instruction includes an unquoted word that is not the name of a procedure, Logo could look for a variable of that name instead. This would allow a "punctuationless" Logo, provided that users who want to work without colons for variables choose variable names that are not also procedure names.

What about assigning a value to a variable? Could we do without the quotation mark on MAKE’s first input? Alas, no. Although the first input to MAKE is usually a constant, known variable name, sometimes it isn’t, as in this example:

	TO INCREMENT :VAR
	MAKE :VAR (THING :VAR)+1	; Note: it's not "VAR here!
	END

	? MAKE "X 5
	? INCREMENT "X
	? PRINT :X
	6

The procedure INCREMENT takes a variable name as its input and changes the value of that variable. In this example there are two variables; the variable whose name is VAR, and whose value is the word X; and the variable whose name is X and whose value changes from 5 to 6. Suppose we changed the behavior of MAKE so that it took the word after MAKE as the name of the variable to change; we would be unable to write INCREMENT:

	TO INCREMENT :VAR		; nonworking!
	MAKE VAR (THING VAR)+1
	END

This would assign a new value to VAR, not to X.

What we can do is to allow an alternative to MAKE, a "setter" procedure for a particular variable. The notation will be

	? SETFOO 7
	? PRINT FOO
	7

SETFOO is a "setter procedure" that takes one input (in this case the input 7) and assigns its value to the variable named FOO.

Berkeley Logo allows users to choose either the traditional notation, in which case the same name can be used both for a procedure and for a variable, or the getter/setter notation, in which variable FOO is set with SETFOO and examined with FOO, but the same name can’t be used for procedure and variable.

Here is how this choice is allowed: Berkeley Logo uses traditional notation, with procedures distinct from variables. However, if there is a variable named AllowGetSet whose value is TRUE (which there is, by default, when Logo starts up), then if a Logo instruction refers to a nonexistent procedure (so that the error message "I don’t know how to ..." would result), Logo tries the following two steps:

	1.  If the name is at least four characters long, and the first three
	characters are the letters SET (upper or lower case), and if the name
	is followed in the instruction by another value, and if the name
	without the SET is the name of a variable that already exists, then
	Logo will invoke MAKE with its first input being the name without the
	SET, and its second input being the following value.

	2.  If step 1’s conditions are not met, but the name is
	the name of an accessible variable, then Logo will invoke
	THING with that name as input, to find the variable’s value.

Step 1 requires that the variable already exist so that misspellings of names of SETxxx primitives (e.g., SETHEADING) will still be caught, instead of silently creating a new variable. The command GLOBAL can be used to create a variable without giving it a value.

One final point: The TO command in Logo has always been a special case; the rest of the line starting with TO is not evaluated as ordinary Logo expressions are. In particular, the colons used to mark the names of inputs to the procedure do not cause THING to be invoked. They are merely mnemonic aids, reminding the Logo user that these words are names of variables. (Arguably, this nonstantard behavior of TO adds to Logo beginners’ confusion about colons.) To a programmer using colonless variable references, the colons in the TO line are unnecessary and meaningless. Berkeley Logo therefore makes the colons optional:

	TO FOO :IN1 :IN2

and

	TO FOO IN1 IN2

are both allowed.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.3 Entering and Leaving Logo

The process to start Logo depends on your operating system:

Unix:

Type the word logo to the shell. (The directory in which you’ve installed Logo must be in your path.)

DOS:

Change directories to the one containing Logo (probably C:\UCBLOGO). Then type UCBLOGO for the large memory version, or BL for the 640K version.

Mac:

Double-click on the LOGO icon within the "UCB Logo" folder.

Windows:

Double-click on the UCBWLOGO icon in the UCBLOGO folder.

To leave Logo, enter the command bye.

On startup, Logo looks for a file named ‘startup.lg’ in the system Logo library and, if found, loads it. Then it looks for ‘startup.lg’ in the user’s home directory, or the current directory, depending on the operating system, and loads that. These startup files can be used to predefine procedures, e.g., to provide non-English names for primitive procedures.

Under Unix, DOS, or Windows, if you include one or more filenames on the command line when starting Logo, those files will be loaded before the interpreter starts reading commands from your terminal. If you load a file that executes some program that includes a bye command, Logo will run that program and exit. You can therefore write standalone programs in Logo and run them with shell/batch scripts. To support this technique, Logo does not print its usual welcoming and parting messages if you give file arguments to the logo command.

If a command line argument is just a hyphen, then all command line arguments after the hyphen are not taken as filenames, but are instead collected in a list, one word per argument; the buried variable COMMAND.LINE contains that list of arguments, or the empty list if there are none. On my Linux system, if the first line of an executable shell script is #!/usr/local/bin/logo - (note the hyphen) then the script can be given command line arguments and they all end up in :COMMAND.LINE along with the script’s path. Experiment.

If you type your interrupt character (see table below) Logo will stop what it’s doing and return to top-level, as if you did THROW "TOPLEVEL. If you type your quit character Logo will pause as if you did PAUSE.

            wxWidgets      Unix       DOS/Windows     Mac Classic

toplevel      alt-S   usually ctrl-C    ctrl-Q     command-. (period)

pause         alt-P   usually ctrl-\    ctrl-W     command-, (comma)

If you have an environment variable called LOGOLIB whose value is the name of a directory, then Logo will use that directory instead of the default library. If you invoke a procedure that has not been defined, Logo first looks for a file in the current directory named ‘proc.lg’ where proc is the procedure name in lower case letters. If such a file exists, Logo loads that file. If the missing procedure is still undefined, or if there is no such file, Logo then looks in the library directory for a file named ‘proc’ (no ‘.lg’) and, if it exists, loads it. If neither file contains a definition for the procedure, then Logo signals an error. Several procedures that are primitive in most versions of Logo are included in the default library, so if you use a different library you may want to include some or all of the default library in it.


[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1.4 Tokenization

Names of procedures, variables, and property lists are case-insensitive. So are the special words END, TRUE, and FALSE. Case of letters is preserved in everything you type, however.

Within square brackets, words are delimited only by spaces and square brackets. [2+3] is a list containing one word. Note, however, that the Logo primitives that interpret such a list as a Logo instruction or expression (RUN, IF, etc.) reparse the list as if it had not been typed inside brackets.

After a quotation mark outside square brackets, a word is delimited by a space, a square bracket, or a parenthesis.

A word not after a quotation mark or inside square brackets is delimited by a space, a bracket, a parenthesis, or an infix operator +-*/=<>. Note that words following colons are in this category. Note that quote and colon are not delimiters. Each infix operator character is a word in itself, except that the two-character sequences <=, >=, and <> (the latter meaning not-equal) with no intervening space are recognized as a single word.

A word consisting of a question mark followed by a number (e.g., ?37), when runparsed (i.e., where a procedure name is expected), is treated as if it were the sequence

( ? 37 )

making the number an input to the ? procedure. (See the discussion of templates, below.) This special treatment does not apply to words read as data, to words with a non-number following the question mark, or if the question mark is backslashed.

A line (an instruction line or one read by READLIST or READWORD) can be continued onto the following line if its last character is a tilde (~). READWORD preserves the tilde and the newline; READLIST does not.

Lines read with READRAWLINE are never continued.

An instruction line or a line read by READLIST (but not by READWORD) is automatically continued to the next line, as if ended with a tilde, if there are unmatched brackets, parentheses, braces, or vertical bars pending. However, it’s an error if the continuation line contains only the word END; this is to prevent runaway procedure definitions. Lines explicitly continued with a tilde avoid this restriction.

If a line being typed interactively on the keyboard is continued, either with a tilde or automatically, Logo will display a tilde as a prompt character for the continuation line.

A semicolon begins a comment in an instruction line. Logo ignores characters from the semicolon to the end of the line. A tilde as the last character still indicates a continuation line, but not a continuation of the comment. For example, typing the instruction

print "abc;comment ~
def

will print the word abcdef. Semicolon has no special meaning in data lines read by READWORD or READLIST, but such a line can later be reparsed using RUNPARSE and then comments will be recognized.

The two-character sequence #! at the beginning of a line also starts a comment. Unix users can therefore write a file containing Logo commands, starting with the line

#! /usr/local/bin/logo

(or wherever your Logo executable lives) and the file will be executable directly from the shell.

To include an otherwise delimiting character (including semicolon or tilde) in a word, precede it with backslash (\). If the last character of a line is a backslash, then the newline character following the backslash will be part of the last word on the line, and the line continues onto the following line. To include a backslash in a word, use \\. If the combination backslash-newline is entered at the terminal, Logo will issue a backslash as a prompt character for the continuation line. All of this applies to data lines read with READWORD or READLIST as well as to instruction lines.

A line read with READRAWLINE has no special quoting mechanism; both backslash and vertical bar (described below) are just ordinary characters.

An alternative notation to include otherwise delimiting characters in words is to enclose a group of characters in vertical bars. All characters between vertical bars are treated as if they were letters. In data read with READWORD the vertical bars are preserved in the resulting word. In data read with READLIST (or resulting from a PARSE or RUNPARSE of a word) the vertical bars do not appear explicitly; all potentially delimiting characters (including spaces, brackets, parentheses, and infix operators) appear unmarked, but tokenized as though they were letters. Within vertical bars, backslash may still be used; the only characters that must be backslashed in this context are backslash and vertical bar themselves.

Characters entered between vertical bars are forever special, even if the word or list containing them is later reparsed with PARSE or RUNPARSE. Characters typed after a backslash are treated somewhat differently: When a quoted word containing a backslashed character is runparsed, the backslashed character loses its special quality and acts thereafter as if typed normally. This distinction is important only if you are building a Logo expression out of parts, to be RUN later, and want to use parentheses. For example,

PRINT RUN (SE "\( 2 "+ 3 "\))

will print 5, but

RUN (SE "MAKE ""|(| 2)

will create a variable whose name is open-parenthesis. (Each example would fail if vertical bars and backslashes were interchanged.)

A normally delimiting character entered within vertical bars is EQUALP to the same character without the vertical bars, but can be distinguished by the VBARREDP predicate. (However, VBARREDP returns TRUE only for characters for which special treatment is necessary: whitespace, parentheses, brackets, infix operators, backslash, vertical bar, tilde, quote, question mark, colon, and semicolon.)


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/docs/html/usermanual.html0000664000175000017500000001666013601426470016064 0ustar jjcjjc BERKELEY LOGO 6.1: 1 Introduction

BERKELEY LOGO 6.1

Berkeley Logo User Manual

Brian Harvey

@vsize = 8.9 in @parskip = 7 pt @parindent = 0 pt

[ << ] [ < ] [ Up ] [ > ] [ >> ]         [Top] [Contents] [Index] [ ? ]

1 Introduction


[ << ] [ >> ]           [Top] [Contents] [Index] [ ? ]

This document was generated on December 27, 2019 using texi2html 5.0.

ucblogo-6.1/csls/0000775000175000017500000000000013575571772012101 5ustar jjcjjcucblogo-6.1/csls/ttt0000664000175000017500000000703613557147341012634 0ustar jjcjjc;; Overall orchestration to ttt local [me you position] draw.board init if equalp :me "x [meplay 5] forever [ if already.wonp :me [print [I win!] stop] if tiedp [print [Tie game!] stop] youplay getmove ;; ask person for move if already.wonp :you [print [You win!] stop] if tiedp [print [Tie game!] stop] meplay pickmove make.triples ;; compute program's move ] end to make.triples output map "substitute.triple [123 456 789 147 258 369 159 357] end to substitute.triple :combination output map [item ? :position] :combination end to already.wonp :player output memberp (word :player :player :player) (make.triples) end to tiedp output not reduce "or map.se "numberp arraytolist :position end to youplay :square draw :you :square setitem :square :position :you end to meplay :square draw :me :square setitem :square :position :me end ;; Initialization to draw.board splitscreen clearscreen hideturtle drawline [-20 -50] 0 120 drawline [20 -50] 0 120 drawline [-60 -10] 90 120 drawline [-60 30] 90 120 end to drawline :pos :head :len penup setpos :pos setheading :head pendown forward :len end to init make "position {1 2 3 4 5 6 7 8 9} print [Do you want to play first (X)] type [or second (O)? Type X or O:] choose print [For each move, type a digit 1-9.] end to choose local "side forever [ make "side readchar pr :side if equalp :side "x [choosex stop] if equalp :side "o [chooseo stop] type [Huh? Type X or O:] ] end to chooseo make "me "x make "you "o end to choosex make "me "o make "you "x end ;; Get opponent's moves to getmove local "square forever [ type [Your move:] make "square readchar print :square if numberp :square ~ [if and (:square > 0) (:square < 10) [if freep :square [output :square]]] print [not a valid move.] ] end to freep :square output numberp item :square :position end ;; Compute program's moves to pickmove :triples local "try make "try find.win :me if not emptyp :try [output :try] make "try find.win :you if not emptyp :try [output :try] make "try find.fork if not emptyp :try [output :try] make "try find.advance if not emptyp :try [output :try] output find [memberp ? :position] [5 1 3 7 9 2 4 6 8] end to find.win :who output filter "numberp find "win.nowp :triples end to win.nowp :triple output equalp (filter [not numberp ?] :triple) (word :who :who) end to find.fork local "singles make "singles singles :me if emptyp :singles [output []] output repeated.number reduce "word :singles end to singles :who output filter [singlep ? :who] :triples end to singlep :triple :who output equalp (filter [not numberp ?] :triple) :who end to repeated.number :squares output find [memberp ? ?rest] filter "numberp :squares end to find.advance output best.move filter "numberp find [singlep ? :me] :triples end to best.move :my.single local "your.singles if emptyp :my.single [output []] make "your.singles singles :you if emptyp :your.singles [output first :my.single] ifelse (count filter [? = first :my.single] reduce "word :your.singles) > 1 [ output first :my.single ] [ output last :my.single ] end ;; Drawing moves on screen to draw :who :square move :square ifelse :who = "x [drawx] [drawo] end to move :square penup setpos thing word "box :square end to drawo pendown arc 360 18 end to drawx setheading 45 pendown repeat 4 [forward 25.5 back 25.5 right 90] end make "box1 [-40 50] make "box2 [0 50] make "box3 [40 50] make "box4 [-40 10] make "box5 [0 10] make "box6 [40 10] make "box7 [-40 -30] make "box8 [0 -30] make "box9 [40 -30] ucblogo-6.1/csls/tower0000664000175000017500000000202213557147341013147 0ustar jjcjjcprogram tower; {This program solves the 5-disk tower of hanoi problem.} procedure hanoi(number:integer;from,onto,other:char); {Recursive procedure that solves a subproblem of the original problem, moving some number of disks, not necessarily 5. To move n disks, it must get the topmost n-1 out of the way, move the nth to the target stack, then move the n-1 to the target stack.} procedure movedisk(number:integer;from,onto:char); {This procedure moves one single disk. It assumes that the move is legal, i.e., the disk is at the top of its stack and the target stack has no smaller disks already. Procedure hanoi is responsible for making sure that's all true.} begin {movedisk} writeln('Move disk ',number:1,' from ',from,' to ',onto) end; {movedisk} begin {hanoi} if number <> 0 then begin hanoi(number-1,from,other,onto); movedisk(number,from,onto); hanoi(number-1,other,onto,from) end end; {hanoi} begin {main program} hanoi(5,'a','b','c') end. ucblogo-6.1/csls/student0000664000175000017500000010676513557147341013520 0ustar jjcjjcto student :prob say [The problem to be solved is] :prob make "prob map.se [depunct ?] :prob localmake "orgprob :prob student1 :prob ~ [[[the perimeter of ! rectangle] [twice the sum of the length and width of the rectangle]] [[two numbers] [one of the numbers and the other number]] [[two numbers] [one number and the other number]]] end to student1 :prob :idioms local [simsen shelf aunits units wanted ans var lasteqn ref eqt1 beg end idiom reply] make "prob idioms :prob if match [^ two numbers #] :prob ~ [make "idiom find [match (sentence "^beg first ? "#end) :orgprob] :idioms ~ tryidiom stop] while [match [^beg the the #end] :prob] [make "prob (sentence :beg "the :end)] say [With mandatory substitutions the problem is] :prob ifelse match [# @:in [[as old as] [age] [years old]] #] :prob ~ [ageprob] [make "simsen bracket :prob] lsay [The simple sentences are] :simsen foreach [aunits wanted ans var lasteqn ref units] [make ? []] make "shelf filter [not emptyp ?] map.se [senform ?] :simsen lsay [The equations to be solved are] :shelf make "units remdup :units if trysolve :shelf :wanted :units :aunits [print [The problem is solved.] stop] make "eqt1 remdup geteqns :var if not emptyp :eqt1 [lsay [Using the following known relationships] :eqt1] student2 :eqt1 end to student2 :eqt1 make "var remdup sentence (map.se [varterms ?] :eqt1) :var make "eqt1 sentence :eqt1 vartest :var if not emptyp :eqt1 ~ [if trysolve (sentence :shelf :eqt1) :wanted :units :aunits [print [The problem is solved.] stop]] make "idiom find [match (sentence "^beg first ? "#end) :orgprob] :idioms if not emptyp :idiom [tryidiom stop] lsay [Do you know any more relationships among these variables?] :var make "reply readlist if equalp :reply [yes] [print [Tell me.] make "reply readlist] if equalp :reply [no] [print [] print [I can't solve this problem.] stop] make "reply map.se [depunct ?] :reply if dlm last :reply [make "reply butlast :reply] if not match [^beg is #end] :reply [print [I don't understand that.] stop] make "shelf sentence :shelf :eqt1 student2 (list (list "equal opform :beg opform :end)) end ;; Mandatory substitutions to depunct :word if emptyp :word [output []] if equalp first :word "$ [output sentence "$ depunct butfirst :word] if equalp last :word "% [output sentence depunct butlast :word "percent] if memberp last :word [. ? |;| ,] [output sentence depunct butlast :word last :word] if emptyp butfirst :word [output :word] if equalp last2 :word "'s [output sentence depunct butlast butlast :word "s] output :word end to last2 :word output word (last butlast :word) (last :word) end to idioms :sent local "number output changes :sent ~ [[[the sum of] ["sum]] [[square of] ["square]] [[of] ["numof]] [[how old] ["what]] [[is equal to] ["is]] [[years younger than] [[less than]]] [[years older than] ["plus]] [[percent less than] ["perless]] [[less than] ["lessthan]] [[these] ["the]] [[more than] ["plus]] [[first two numbers] [[the first number and the second number]]] [[three numbers] [[the first number and the second number and the third number]]] [[one half] [0.5]] [[twice] [[2 times]]] [[$ !number] [sentence :number "dollars]] [[consecutive to] [[1 plus]]] [[larger than] ["plus]] [[per cent] ["percent]] [[how many] ["howm]] [[is multiplied by] ["ismulby]] [[is divided by] ["isdivby]] [[multiplied by] ["times]] [[divided by] ["divby]]] end to changes :sent :list localmake "keywords map.se [findkey first ?] :list output changes1 :sent :list :keywords end to findkey :pattern if equalp first :pattern "!:in [output first butfirst :pattern] if equalp first :pattern "?:in [output sentence (item 2 :pattern) (item 3 :pattern)] output first :pattern end to changes1 :sent :list :keywords if emptyp :sent [output []] if memberp first :sent :keywords [output changes2 :sent :list :keywords] output fput first :sent changes1 butfirst :sent :list :keywords end to changes2 :sent :list :keywords changes3 :list :list output fput first :sent changes1 butfirst :sent :list :keywords end to changes3 :biglist :nowlist if emptyp :nowlist [stop] if changeone first :nowlist [changes3 :biglist :biglist stop] changes3 :biglist butfirst :nowlist end to changeone :change local "end if not match (sentence first :change [#end]) :sent [output "false] make "sent run (sentence "sentence last :change ":end) output "true end ;; Division into simple sentences to bracket :prob output bkt1 finddelim :prob end to finddelim :sent output finddelim1 :sent [] [] end to finddelim1 :in :out :simples if emptyp :in ~ [ifelse emptyp :out [output :simples] [output lput (sentence :out ".) :simples]] if dlm first :in ~ [output finddelim1 (nocap butfirst :in) [] (lput (sentence :out first :in) :simples)] output finddelim1 (butfirst :in) (sentence :out first :in) :simples end to nocap :words if emptyp :words [output []] if personp first :words [output :words] output sentence (lowercase first :words) butfirst :words end to bkt1 :problist local [first word rest] if emptyp :problist [output []] if not memberp ", first :problist ~ [output fput first :problist bkt1 butfirst :problist] if match [if ^first , !word:qword #rest] first :problist ~ [output bkt1 fput (sentence :first ".) fput (sentence :word :rest) butfirst :problist] if match [^first , and #rest] first :problist ~ [output fput (sentence :first ".) (bkt1 fput :rest butfirst :problist)] output fput first :problist bkt1 butfirst :problist end ;; Age problems to ageprob local [beg end sym who num subj ages] while [match [^beg as old as #end] :prob] [make "prob sentence :beg :end] while [match [^beg years old #end] :prob] [make "prob sentence :beg :end] while [match [^beg will be when #end] :prob] ~ [make "sym gensym make "prob (sentence :beg "in :sym [years . in] :sym "years :end)] while [match [^beg was when #end] :prob] ~ [make "sym gensym make "prob (sentence :beg :sym [years ago .] :sym [years ago] :end)] while [match [^beg !who:personp will be in !num years #end] :prob] ~ [make "prob (sentence :beg :who [s age in] :num "years #end)] while [match [^beg was #end] :prob] [make "prob (sentence :beg "is :end)] while [match [^beg will be #end] :prob] [make "prob (sentence :beg "is :end)] while [match [^beg !who:personp is now #end] :prob] ~ [make "prob (sentence :beg :who [s age now] :end)] while [match [^beg !num years from now #end] :prob] ~ [make "prob (sentence :beg "in :num "years :end)] make "prob ageify :prob ifelse match [^ !who:personp ^end s age #] :prob ~ [make "subj sentence :who :end] [make "subj "someone] make "prob agepron :prob make "end :prob make "ages [] while [match [^ !who:personp ^beg age #end] :end] ~ [push "ages (sentence "and :who :beg "age)] make "ages butfirst reduce "sentence remdup :ages while [match [^beg their ages #end] :prob] [make "prob (sentence :beg :ages :end)] make "simsen map [agesen ?] bracket :prob end to ageify :sent if emptyp :sent [output []] if not personp first :sent [output fput first :sent ageify butfirst :sent] catch "error [if equalp first butfirst :sent "s [output fput first :sent ageify butfirst :sent]] output (sentence first :sent [s age] ageify butfirst :sent) end to agepron :sent if emptyp :sent [output []] if not pronoun first :sent [output fput first :sent agepron butfirst :sent] if posspro first :sent [output (sentence :subj "s agepron butfirst :sent)] output (sentence :subj [s age] agepron butfirst :sent) end to agesen :sent local [when rest num] make "when [] if match [in !num years #rest] :sent ~ [make "when sentence "pluss :num make "sent :rest] if match [!num years ago #rest] :sent ~ [make "when sentence "minuss :num make "sent :rest] output agewhen :sent end to agewhen :sent if emptyp :sent [output []] if not equalp first :sent "age [output fput first :sent agewhen butfirst :sent] if match [in !num years #rest] butfirst :sent ~ [output (sentence [age pluss] :num agewhen :rest)] if match [!num years ago #rest] butfirst :sent ~ [output (sentence [age minuss] :num agewhen :rest)] if equalp "now first butfirst :sent ~ [output sentence "age agewhen butfirst butfirst :sent] output (sentence "age :when agewhen butfirst :sent) end ;; Translation from sentences into equations to senform :sent make "lasteqn senform1 :sent output :lasteqn end to senform1 :sent local [one two verb1 verb2 stuff1 stuff2 factor] if emptyp :sent [output []] if match [^ what are ^one and ^two !:dlm] :sent ~ [output fput (qset :one) (senform (sentence [what are] :two "?))] if match [^ what !:in [is are] #one !:dlm] :sent ~ [output (list qset :one)] if match [^ howm !one is #two !:dlm] :sent ~ [push "aunits (list :one) output (list qset :two)] if match [^ howm ^one do ^two have !:dlm] :sent ~ [output (list qset (sentence [the number of] :one :two "have))] if match [^ howm ^one does ^two have !:dlm] :sent ~ [output (list qset (sentence [the number of] :one :two "has))] if match [^ find ^one and #two] :sent ~ [output fput (qset :one) (senform sentence "find :two)] if match [^ find #one !:dlm] :sent [output (list qset :one)] make "sent filter [not article ?] :sent if match [^one ismulby #two] :sent ~ [push "ref (list "product opform :one opform :two) output []] if match [^one isdivby #two] :sent ~ [push "ref (list "quotient opform :one opform :two) output []] if match [^one is increased by #two] :sent ~ [push "ref (list "sum opform :one opform :two) output []] if match [^one is #two] :sent ~ [output (list (list "equal opform :one opform :two))] if match [^one !verb1:verb ^factor as many ^stuff1 as ^two !verb2:verb ^stuff2 !:dlm] ~ :sent ~ [if emptyp :stuff2 [make "stuff2 :stuff1] output (list (list "equal ~ opform (sentence [the number of] :stuff1 :one :verb1) ~ opform (sentence :factor [the number of] :stuff2 :two :verb2)))] if match [^one !verb1:verb !factor:numberp #stuff1 !:dlm] :sent ~ [output (list (list "equal ~ opform (sentence [the number of] :stuff1 :one :verb1) ~ opform (list :factor)))] say [This sentence form is not recognized:] :sent throw "error end to qset :sent localmake "opform opform filter [not article ?] :sent if not operatorp first :opform ~ [queue "wanted :opform queue "ans list :opform oprem :sent output []] localmake "gensym gensym queue "wanted :gensym queue "ans list :gensym oprem :sent output (list "equal :gensym opform (filter [not article ?] :sent)) end to oprem :sent output map [ifelse equalp ? "numof ["of] [?]] :sent end to opform :expr local [left right op] if match [^left !op:op2 #right] :expr [output optest :op :left :right] if match [^left !op:op1 #right] :expr [output optest :op :left :right] if match [^left !op:op0 #right] :expr [output optest :op :left :right] if match [#left !:dlm] :expr [make "expr :left] output nmtest filter [not article ?] :expr end to optest :op :left :right output run (list (word "tst. :op) :left :right) end to tst.numof :left :right if numberp last :left [output (list "product opform :left opform :right)] output opform (sentence :left "of :right) end to tst.divby :left :right output (list "quotient opform :left opform :right) end to tst.tothepower :left :right output (list "expt opform :left opform :right) end to expt :num :pow if :pow < 1 [output 1] output :num * expt :num :pow - 1 end to tst.per :left :right output (list "quotient ~ opform :left ~ opform (ifelse numberp first :right [:right] [fput 1 :right])) end to tst.lessthan :left :right output opdiff opform :right opform :left end to opdiff :left :right output (list "sum :left (list "minus :right)) end to tst.minus :left :right if emptyp :left [output list "minus opform :right] output opdiff opform :left opform :right end to tst.minuss :left :right output tst.minus :left :right end to tst.sum :left :right local [one two three] if match [^one and ^two and #three] :right ~ [output (list "sum opform :one opform (sentence "sum :two "and :three))] if match [^one and #two] :right ~ [output (list "sum opform :one opform :two)] say [sum used wrong:] :right throw "error end to tst.squared :left :right output list "square opform :left end to tst.difference :left :right local [one two] if match [between ^one and #two] :right [output opdiff opform :one opform :two] say [Incorrect use of difference:] :right throw "error end to tst.plus :left :right output (list "sum opform :left opform :right) end to tst.pluss :left :right output tst.plus :left :right end to square :x output :x * :x end to tst.square :left :right output list "square opform :right end to tst.percent :left :right if not numberp last :left ~ [say [Incorrect use of percent:] :left throw "error] output opform (sentence butlast :left ((last :left) / 100) :right) end to tst.perless :left :right if not numberp last :left ~ [say [Incorrect use of percent:] :left throw "error] output (list "product ~ (opform sentence butlast :left ((100 - (last :left)) / 100)) ~ opform :right) end to tst.times :left :right if emptyp :left [say [Incorrect use of times:] :right throw "error] output (list "product opform :left opform :right) end to nmtest :expr if match [& !:numberp #] :expr [say [argument error:] :expr throw "error] if and (equalp first :expr 1) (1 < count :expr) ~ [make "expr (sentence 1 plural (first butfirst :expr) (butfirst butfirst :expr))] if and (numberp first :expr) (1 < count :expr) ~ [push "units (list first butfirst :expr) ~ output (list "product (first :expr) (opform butfirst :expr))] if numberp first :expr [output first :expr] if memberp "this :expr [output this :expr] if not memberp :expr :var [push "var :expr] output :expr end to this :expr if not emptyp :ref [output pop "ref] if not emptyp :lasteqn [output first butfirst last :lasteqn] if equalp first :expr "this [make "expr butfirst :expr] push "var :expr output :expr end ;; Solving the equations to trysolve :shelf :wanted :units :aunits local "solution make "solution solve :wanted :shelf (ifelse emptyp :aunits [:units] [:aunits]) output pranswers :ans :solution end to solve :wanted :eqt :terms output solve.reduce solver :wanted :terms [] [] "insufficient end to solve.reduce :soln if emptyp :soln [output []] if wordp :soln [output :soln] if emptyp butfirst :soln [output :soln] local "part make "part solve.reduce butfirst :soln output fput (list (first first :soln) (subord last first :soln :part)) :part end to solver :wanted :terms :alis :failed :err local [one result restwant] if emptyp :wanted [output :err] make "one solve1 (first :wanted) ~ (sentence butfirst :wanted :failed :terms) ~ :alis :eqt [] "insufficient if wordp :one ~ [output solver (butfirst :wanted) :terms :alis (fput first :wanted :failed) :one] make "restwant (sentence :failed butfirst :wanted) if emptyp :restwant [output :one] make "result solver :restwant :terms :one [] "insufficient if listp :result [output :result] output solver (butfirst :wanted) :terms :alis (fput first :wanted :failed) :one end to solve1 :x :terms :alis :eqns :failed :err local [thiseq vars extras xterms others result] if emptyp :eqns [output :err] make "thiseq subord (first :eqns) :alis make "vars varterms :thiseq if not memberp :x :vars ~ [output solve1 :x :terms :alis (butfirst :eqns) (fput first :eqns :failed) :err] make "xterms fput :x :terms make "extras setminus :vars :xterms make "eqt remove (first :eqns) :eqt if not emptyp :extras ~ [make "others solver :extras :xterms :alis [] "insufficient ifelse wordp :others [make "eqt sentence :failed :eqns output solve1 :x :terms :alis (butfirst :eqns) (fput first :eqns :failed) :others] [make "alis :others make "thiseq subord (first :eqns) :alis]] make "result solveq :x :thiseq if listp :result [output lput :result :alis] make "eqt sentence :failed :eqns output solve1 :x :terms :alis (butfirst :eqns) (fput first :eqns :failed) :result end to solveq :var :eqn local [left right] make "left first butfirst :eqn ifelse occvar :var :left ~ [make "right last :eqn] [make "right :left make "left last :eqn] output solveq1 :left :right "true end to solveq1 :left :right :bothtest if :bothtest [if occvar :var :right [output solveqboth :left :right]] if equalp :left :var [output list :var :right] if wordp :left [output "unsolvable] local "oper make "oper first :left if memberp :oper [sum product minus quotient] [output run (list word "solveq. :oper)] output "unsolvable end to solveqboth :left :right if not equalp first :right "sum [output solveq1 (subterm :left :right) 0 "false] output solveq.rplus :left butfirst :right [] end to solveq.rplus :left :right :newright if emptyp :right [output solveq1 :left (simone "sum :newright) "false] if occvar :var first :right ~ [output solveq.rplus (subterm :left first :right) butfirst :right :newright] output solveq.rplus :left butfirst :right (fput first :right :newright) end to solveq.sum if emptyp butfirst butfirst :left [output solveq1 first butfirst :left :right "true] output solveq.sum1 butfirst :left :right [] end to solveq.sum1 :left :right :newleft if emptyp :left [output solveq.sum2] if occvar :var first :left ~ [output solveq.sum1 butfirst :left :right fput first :left :newleft] output solveq.sum1 butfirst :left (subterm :right first :left) :newleft end to solveq.sum2 if emptyp butfirst :newleft [output solveq1 first :newleft :right "true] localmake "factor factor :newleft :var if equalp first :factor "unknown [output "unsolvable] if equalp last :factor 0 [output "unsolvable] output solveq1 first :factor (divterm :right last :factor) "true end to solveq.minus output solveq1 (first butfirst :left) (minusin :right) "false end to solveq.product output solveq.product1 :left :right end to solveq.product1 :left :right if emptyp butfirst butfirst :left [output solveq1 (first butfirst :left) :right "true] if not occvar :var first butfirst :left ~ [output solveq.product1 (fput "product butfirst butfirst :left) (divterm :right first butfirst :left)] localmake "rest simone "product butfirst butfirst :left if occvar :var :rest [output "unsolvable] output solveq1 (first butfirst :left) (divterm :right :rest) "false end to solveq.quotient if occvar :var first butfirst :left ~ [output solveq1 (first butfirst :left) (simtimes list :right last :left) "true] output solveq1 (simtimes list :right last :left) (first butfirst :left) "true end to denom :fract :addends make "addends simplus :addends localmake "den last :fract if not equalp first :addends "quotient ~ [output simdiv list (simone "sum (remop "sum list (distribtimes (list :addends) :den) first butfirst :fract)) :den] if equalp :den last :addends ~ [output simdiv (simplus list (first butfirst :fract) (first butfirst :addends)) :den] localmake "lowterms simdiv list :den last :addends output simdiv list (simplus (simtimes list first butfirst :fract last :lowterms) (simtimes list first butfirst :addends first butfirst :lowterms)) ~ (simtimes list first butfirst :lowterms last :addends) end to distribtimes :trms :multiplier output simplus map [simtimes (list ? :multiplier)] :trms end to distribx :expr local [oper args] if emptyp :expr [output :expr] make "oper first :expr if not operatorp :oper [output :expr] make "args map [distribx ?] butfirst :expr if reduce "and map [numberp ?] :args [output run (sentence [(] :oper :args [)])] if equalp :oper "sum [output simplus :args] if equalp :oper "minus [output minusin first :args] if equalp :oper "product [output simtimes :args] if equalp :oper "quotient [output simdiv :args] output fput :oper :args end to divterm :dividend :divisor if equalp :dividend 0 [output 0] output simdiv list :dividend :divisor end to factor :exprs :var local "trms make "trms map [factor1 :var ?] :exprs if memberp "unknown :trms [output fput "unknown :exprs] output list :var simplus :trms end to factor1 :var :expr localmake "negvar minusin :var if equalp :var :expr [output 1] if equalp :negvar :expr [output -1] if emptyp :expr [output "unknown] if equalp first :expr "product [output factor2 butfirst :expr] if not equalp first :expr "quotient [output "unknown] localmake "dividend first butfirst :expr if equalp :var :dividend [output (list "quotient 1 last :expr)] if not equalp first :dividend "product [output "unknown] localmake "result factor2 butfirst :dividend if equalp :result "unknown [output "unknown] output (list "quotient :result last :expr) end to factor2 :trms if memberp :var :trms [output simone "product (remove :var :trms)] if memberp :negvar :trms [output minusin simone "product (remove :negvar :trms)] output "unknown end to maybeadd :num :rest if equalp :num 0 [output :rest] output fput :num :rest end to maybemul :num :rest if equalp :num 1 [output :rest] output fput :num :rest end to minusin :expr if emptyp :expr [output -1] if equalp first :expr "sum [output fput "sum map [minusin ?] butfirst :expr] if equalp first :expr "minus [output last :expr] if memberp first :expr [product quotient] ~ [output fput first :expr (fput (minusin first butfirst :expr) butfirst butfirst :expr)] if numberp :expr [output minus :expr] output list "minus :expr end to occvar :var :expr if emptyp :expr [output "false] if wordp :expr [output equalp :var :expr] if operatorp first :expr [output not emptyp find [occvar :var ?] butfirst :expr] output equalp :var :expr end to remfactor :num :den foreach butfirst :num [remfactor1 ?] output (list "quotient (simone "product butfirst :num) (simone "product butfirst :den)) end to remfactor1 :expr local "neg if memberp :expr :den ~ [make "num remove :expr :num make "den remove :expr :den stop] make "neg minusin :expr if not memberp :neg :den [stop] make "num remove :expr :num make "den minusin remove :neg :den end to remop :oper :exprs output map.se [ifelse equalp first ? :oper [butfirst ?] [(list ?)]] :exprs end to simdiv :list local [num den numop denop] make "num first :list make "den last :list if equalp :num :den [output 1] if numberp :den [output simtimes (list (quotient 1 :den) :num)] make "numop first :num make "denop first :den if equalp :numop "quotient ~ [output simdiv list (first butfirst :num) (simtimes list last :num :den)] if equalp :denop "quotient ~ [output simdiv list (simtimes list :num last :den) (first butfirst :den)] if and equalp :numop "product equalp :denop "product [output remfactor :num :den] if and equalp :numop "product memberp :den :num [output remove :den :num] output fput "quotient :list end to simone :oper :trms if emptyp :trms [output ifelse equalp :oper "product [1] [0]] if emptyp butfirst :trms [output first :trms] output fput :oper :trms end to simplus :exprs make "exprs remop "sum :exprs localmake "factor [unknown] catch "simplus ~ [foreach :terms ~ [make "factor (factor :exprs ?) ~ if not equalp first :factor "unknown [throw "simplus]]] if not equalp first :factor "unknown [output fput "product remop "product :factor] localmake "nums 0 localmake "nonnums [] localmake "quick [] catch "simplus [simplus1 :exprs] if not emptyp :quick [output :quick] if not equalp :nums 0 [push "nonnums :nums] output simone "sum :nonnums end to simplus1 :exprs if emptyp :exprs [stop] simplus2 first :exprs simplus1 butfirst :exprs end to simplus2 :pos local "neg make "neg minusin :pos if numberp :pos [make "nums sum :pos :nums stop] if memberp :neg butfirst :exprs [make "exprs remove :neg :exprs stop] if equalp first :pos "quotient ~ [make "quick (denom :pos (maybeadd :nums sentence :nonnums butfirst :exprs)) ~ throw "simplus] push "nonnums :pos end to simtimes :exprs local [nums nonnums quick] make "nums 1 make "nonnums [] make "quick [] catch "simtimes [foreach remop "product :exprs [simtimes1 ?]] if not emptyp :quick [output :quick] if equalp :nums 0 [output 0] if not equalp :nums 1 [push "nonnums :nums] output simone "product :nonnums end to simtimes1 :expr if equalp :expr 0 [make "nums 0 throw "simtimes] if numberp :expr [make "nums product :expr :nums stop] if equalp first :expr "sum ~ [make "quick distribtimes (butfirst :expr) (simone "product maybemul :nums sentence :nonnums ?rest) throw "simtimes] if equalp first :expr "quotient ~ [make "quick simdiv (list (simtimes (list (first butfirst :expr) (simone "product maybemul :nums sentence :nonnums ?rest))) (last :expr)) throw "simtimes] push "nonnums :expr end to subord :expr :alist output distribx subord1 :expr :alist end to subord1 :expr :alist if emptyp :alist [output :expr] output subord (substop (last first :alist) (first first :alist) :expr) ~ (butfirst :alist) end to substop :val :var :expr if emptyp :expr [output []] if equalp :expr :var [output :val] if not operatorp first :expr [output :expr] output fput first :expr map [substop :val :var ?] butfirst :expr end to subterm :minuend :subtrahend if equalp :minuend 0 [output minusin :subtrahend] if equalp :minuend :subtrahend [output 0] output simplus (list :minuend minusin :subtrahend) end to varterms :expr if emptyp :expr [output []] if numberp :expr [output []] if wordp :expr [output (list :expr)] if operatorp first :expr [output map.se [varterms ?] butfirst :expr] output (list :expr) end ;; Printing the solutions to pranswers :ans :solution print [] if equalp :solution "unsolvable ~ [print [Unable to solve this set of equations.] output "false] if equalp :solution "insufficient ~ [print [The equations were insufficient to find a solution.] output "false] localmake "gotall "true foreach :ans [if prans ? :solution [make "gotall "false]] if not :gotall [print [] print [Unable to solve this set of equations.]] output :gotall end to prans :ans :solution localmake "result find [equalp first ? first :ans] :solution if emptyp :result [output "true] print (sentence cap last :ans "is unitstring last :result) print [] output "false end to unitstring :expr if numberp :expr [output roundoff :expr] if equalp first :expr "product ~ [output sentence (unitstring first butfirst :expr) (reduce "sentence butfirst butfirst :expr)] if (and (listp :expr) (not numberp first :expr) (not operatorp first :expr)) ~ [output (sentence 1 (singular first :expr) (butfirst :expr))] output :expr end to roundoff :num if (abs (:num - round :num)) < 0.0001 [output round :num] output :num end to abs :num output ifelse (:num < 0) [-:num] [:num] end ;; Using known relationships to geteqns :vars output map.se [gprop varkey ? "eqns] :vars end to varkey :var local "word if match [number of !word #] :var [output :word] output first :var end ;; Assuming equality of similar variables to vartest :vars if emptyp :vars [output []] local [var beg end] make "var first :vars output (sentence (ifelse match [^beg !:pronoun #end] :var [vartest1 :var (sentence :beg "& :end) butfirst :vars] [[]]) (vartest1 :var (sentence "# :var "#) butfirst :vars) (vartest butfirst :vars)) end to vartest1 :target :pat :vars output map [varequal :target ?] filter [match :pat ?] :vars end to varequal :target :var print [] print [Assuming that] print (sentence (list :target) [is equal to] (list :var)) output (list "equal :target :var) end ;; Optional substitutions to tryidiom make "prob (sentence :beg last :idiom :end) while [match (sentence "^beg first :idiom "#end) :prob] ~ [make "prob (sentence :beg last :idiom :end)] say [The problem with an idiomatic substitution is] :prob student1 :prob (remove :idiom :idioms) end ;; Utility procedures to qword :word output memberp :word [find what howm how] end to dlm :word output memberp :word [. ? |;|] end to article :word output memberp :word [a an the] end to verb :word output memberp :word [have has get gets weigh weighs] end to personp :word output memberp :word [Mary Ann Bill Tom Sally Frank father uncle] end to pronoun :word output memberp :word [he she it him her they them his her its] end to posspro :word output memberp :word [his her its] end to op0 :word output memberp :word [pluss minuss squared tothepower per sum difference numof] end to op1 :word output memberp :word [times divby square] end to op2 :word output memberp :word [plus minus lessthan percent perless] end to operatorp :word output memberp :word [sum minus product quotient expt square equal] end to plural :word localmake "plural gprop :word "plural if not emptyp :plural [output :plural] if not emptyp gprop :word "sing [output :word] if equalp last :word "s [output :word] output word :word "s end to singular :word localmake "sing gprop :word "sing if not emptyp :sing [output :sing] if not emptyp gprop :word "plural [output :word] if equalp last :word "s [output butlast :word] output :word end to setminus :big :little output filter [not memberp ? :little] :big end to say :herald :text print [] print :herald print [] print :text print [] end to lsay :herald :text print [] print :herald print [] foreach :text [print cap ? print []] end to cap :sent if emptyp :sent [output []] output sentence (word uppercase first first :sent butfirst first :sent) ~ butfirst :sent end ;; The pattern matcher to match :pat :sen if prematch :pat :sen [output rmatch :pat :sen] output "false end to prematch :pat :sen if emptyp :pat [output "true] if listp first :pat [output prematch butfirst :pat :sen] if memberp first first :pat [! @ # ^ & ?] [output prematch butfirst :pat :sen] if emptyp :sen [output "false] localmake "rest member first :pat :sen if not emptyp :rest [output prematch butfirst :pat :rest] output "false end to rmatch :pat :sen local [special.var special.pred special.buffer in.list] if or wordp :pat wordp :sen [output "false] if emptyp :pat [output emptyp :sen] if listp first :pat [output special fput "!: :pat :sen] if memberp first first :pat [? # ! & @ ^] [output special :pat :sen] if emptyp :sen [output "false] if equalp first :pat first :sen [output rmatch butfirst :pat butfirst :sen] output "false end to special :pat :sen set.special parse.special butfirst first :pat " output run word "match first first :pat end to parse.special :word :var if emptyp :word [output list :var "always] if equalp first :word ": [output list :var butfirst :word] output parse.special butfirst :word word :var first :word end to set.special :list make "special.var first :list make "special.pred last :list if emptyp :special.var [make "special.var "special.buffer] if memberp :special.pred [in anyof] [set.in] if not emptyp :special.pred [stop] make "special.pred first butfirst :pat make "pat fput first :pat butfirst butfirst :pat end to set.in make "in.list first butfirst :pat make "pat fput first :pat butfirst butfirst :pat end to match! if emptyp :sen [output "false] if not try.pred [output "false] make :special.var first :sen output rmatch butfirst :pat butfirst :sen end to match? make :special.var [] if emptyp :sen [output rmatch butfirst :pat :sen] if not try.pred [output rmatch butfirst :pat :sen] make :special.var first :sen if rmatch butfirst :pat butfirst :sen [output "true] make :special.var [] output rmatch butfirst :pat :sen end to match# make :special.var [] output #test #gather :sen end to #gather :sen if emptyp :sen [output :sen] if not try.pred [output :sen] make :special.var lput first :sen thing :special.var output #gather butfirst :sen end to #test :sen if rmatch butfirst :pat :sen [output "true] if emptyp thing :special.var [output "false] output #test2 fput last thing :special.var :sen end to #test2 :sen make :special.var butlast thing :special.var output #test :sen end to match& output &test match# end to &test :tf if emptyp thing :special.var [output "false] output :tf end to match^ make :special.var [] output ^test :sen end to ^test :sen if rmatch butfirst :pat :sen [output "true] if emptyp :sen [output "false] if not try.pred [output "false] make :special.var lput first :sen thing :special.var output ^test butfirst :sen end to match@ make :special.var :sen output @test [] end to @test :sen if @try.pred [if rmatch butfirst :pat :sen [output "true]] if emptyp thing :special.var [output "false] output @test2 fput last thing :special.var :sen end to @test2 :sen make :special.var butlast thing :special.var output @test :sen end to try.pred if listp :special.pred [output rmatch :special.pred first :sen] output run list :special.pred quoted first :sen end to quoted :thing if listp :thing [output :thing] output word "" :thing end to @try.pred if listp :special.pred [output rmatch :special.pred thing :special.var] output run list :special.pred thing :special.var end to always :x output "true end to in :word output memberp :word :in.list end to anyof :sen output anyof1 :sen :in.list end to anyof1 :sen :pats if emptyp :pats [output "false] if rmatch first :pats :sen [output "true] output anyof1 :sen butfirst :pats end ;; Sample word problems make "ann [Mary is twice as old as Ann was when Mary was as old as Ann is now. If Mary is 24 years old, how old is Ann?] make "guns [The number of soldiers the Russians have is one half of the number of guns they have. They have 7000 guns. How many soldiers do they have?] make "jet [The distance from New York to Los Angeles is 3000 miles. If the average speed of a jet plane is 600 miles per hour, find the time it takes to travel from New York to Los Angeles by jet.] make "nums [A number is multiplied by 6 . This product is increased by 44 . This result is 68 . Find the number.] make "radio [The price of a radio is $69.70. If this price is 15 percent less than the marked price, find the marked price.] make "sally [The sum of Sally's share of some money and Frank's share is $4.50. Sally's share is twice Frank's. Find Frank's and Sally's share.] make "ship [The gross weight of a ship is 20000 tons. If its net weight is 15000 tons, what is the weight of the ships cargo?] make "span [If 1 span is 9 inches, and 1 fathom is 6 feet, how many spans is 1 fathom?] make "sumtwo [The sum of two numbers is 96, and one number is 16 larger than the other number. Find the two numbers.] make "tom [If the number of customers Tom gets is twice the square of 20 per cent of the number of advertisements he runs, and the number of advertisements he runs is 45, what is the number of customers Tom gets?] make "uncle [Bill's father's uncle is twice as old as Bill's father. 2 years from now Bill's father will be 3 times as old as Bill. The sum of their ages is 92 . Find Bill's age.] ;; Initial data base pprop "distance "eqns ~ [[equal [distance] [product [speed] [time]]] [equal [distance] [product [gas consumtion] [number of gallons of gas used]]]] pprop "feet "eqns ~ [[equal [product 1 [feet]] [product 12 [inches]]] [equal [product 1 [yards]] [product 3 [feet]]]] pprop "feet "sing "foot pprop "foot "plural "feet pprop "gallons "eqns ~ [[equal [distance] [product [gas consumtion] [number of gallons of gas used]]]] pprop "gas "eqns ~ [[equal [distance] [product [gas consumtion] [number of gallons of gas used]]]] pprop "inch "plural "inches pprop "inches "eqns [[equal [product 1 [feet]] [product 12 [inches]]]] pprop "people "sing "person pprop "person "plural "people pprop "speed "eqns [[equal [distance] [product [speed] [time]]]] pprop "time "eqns [[equal [distance] [product [speed] [time]]]] pprop "yards "eqns [[equal [product 1 [yards]] [product 3 [feet]]]] ucblogo-6.1/csls/streams0000664000175000017500000000407113557147341013473 0ustar jjcjjc; Implementation of SICP streams (lazy-evaluation lists) in Logo. ; Since we don't have special forms, we put the second argument to STREAM ; in a (quoted) list. ; Since we don't have lexical scope, we use substitution (`) into saved ; expressions. to stream :car :delayed.cdr output fput :car (list "*delayed* :delayed.cdr) end to head :stream output first :stream end to tail :stream if emptyp bf :stream [output []] if not equalp first bf :stream "*delayed* [output bf :stream] localmake "result run last :stream .setbf :stream :result output :result end ; higher order functions for streams ; Remember that if the functional argument uses local variables, it has to ; be backquoted. to stream.map :fun [:streams] 2 if emptyp first :streams [output []] output stream apply :fun firsts :streams ~ `[(apply "stream.map fput ,[quoted :fun] (map "tail ,[:streams]))] end to stream.filter :fun :stream if emptyp :stream [output []] if invoke :fun head :stream ~ [output stream head :stream `[stream.filter ,[quoted :fun] tail ,[:stream]]] output stream.filter :fun tail :stream end to flatten :stream.of.streams if emptyp :stream.of.streams [output []] output flatten1 head :stream.of.streams :stream.of.streams end to flatten1 :stream :delayed.more.streams if emptyp :stream [output flatten tail :delayed.more.streams] output stream (head :stream) ~ `[flatten1 tail ,[:stream] ,[:delayed.more.streams]] end ; helper for debugging to show.stream :stream [:num 10] show show.stream1 :stream :num end to show.stream1 :stream :num if emptyp :stream [output []] if equalp :num 0 [output [...]] output fput head :stream (show.stream1 tail :stream :num-1) end ; examples to integers.from :n output stream :n `[integers.from ,[:n+1]] end make "integers integers.from 1 to sieve :stream output stream (head :stream) ~ `[sieve stream.filter [not divisiblep ? ,[head :stream]] tail ,[:stream]] end to divisiblep :big :small output 0 = remainder :big :small end make "primes sieve tail :integers ucblogo-6.1/csls/solitaire0000664000175000017500000002363613557147341014020 0ustar jjcjjcto solitaire print [Welcome to solitaire] instruct localmake "allranks [A 2 3 4 5 6 7 8 9 10 J Q K] localmake "numranks map "ranknum :allranks localmake "suits [H S D C] localmake "reds [H D] localmake "deckarray (listtoarray (crossmap "word :allranks :suits) 0) localmake "upping "false catch "exit [forever [onegame cleartext]] cleartext end to s solitaire end to onegame print [Shuffling, please wait...] local [card cards digit pile where] localmake "onto [] local map [word "top ?] :suits local cascade 9 [(sentence (word "shown #) (word "hidden #) ?)] [] localmake "ranks :allranks localmake "numstacks 7 local map [word "num ?] :numranks foreach :numranks [make word "num ? 4] localmake "hand shuffle 52 :deckarray setempty "pile initstacks foreach :suits [settop ? "] redisplay catch "endgame [forever [catch "bell [parsecmd]]] end ;; Initialization to instruct print [] print [Here are the commands you can type:] type "| | type (sentence standout "+ standout "=) type "| | print [Deal three cards onto pile] instruct1 "P [Play top card from pile] instruct1 "R [Redisplay the board] instruct1 "? [Retype these instructions] instruct1 "card [Play that card] instruct1 "M [Move same card again] instruct1 "W [Play up as much as possible (Win)] instruct1 "G [Give up (start a new game)] instruct1 "X [Exit to Logo] print [A card consists of a rank:] type "| | print (sentence standout [A 2 3 4 5 6 7 8 9 10 J Q K] "or standout "T [for 10]) print [followed by a suit:] type "| | print standout [H S D C] print (sentence [or followed by] standout ". [to play all possible suits up]) print [] print [If you make a mistake, hit delete or backspace.] print [] print [To move an entire stack,] type "| | print [hit the shifted stack number:] type "| | print (sentence standout [! @ # $ % ^ &] [for stacks]) type "| | print [1 2 3 4 5 6 7] print [] end to instruct1 :key :meaning type "| | type standout :key repeat 5-count :key [type "| |] print :meaning end to shuffle :len :array if :len=0 [output arraytolist :array] localmake "choice random :len localmake "temp item :choice :array setitem :choice :array (item :len-1 :array) setitem :len-1 :array :temp output shuffle :len-1 :array end to initstacks for [num 1 7] [inithidden :num turnup :num] end to inithidden :num localmake "name hidden :num setempty :name repeat :num [push :name deal] end ;; Reading and interpreting user commands to parsecmd if emptyp :digit [setcursor [1 22] type "| | setcursor [1 22]] local "char make "char uppercase readchar if equalp :char "T [parsedigit 1 parsezero stop] if memberp :char [1 2 3 4 5 6 7 8 9 A J Q K] [parsedigit :char stop] if equalp :char "0 [parsezero stop] if memberp :char :suits [play.by.name :char stop] if equalp :char ". [allup stop] if equalp :char "W [wingame stop] if equalp :char "M [again stop] if memberp :char [+ =] [hand3 stop] if equalp :char "R [redisplay stop] if equalp :char "? [helper stop] if equalp :char "P [playpile stop] if and equalp :char "|(| not emptyp :digit [cheat stop] if and equalp :char "|)| not emptyp :digit [newstack stop] if memberp :char [! @ # $ % ^ & * ( )] ~ [playstack :char [! @ # $ % ^ & * ( )] stop] if memberp :char (list "| | char 8 char 127) [rubout stop] if equalp :char "G [throw "endgame] if equalp :char "X [throw "exit] bell end to parsedigit :char if not emptyp :digit [bell] make "digit :char type :digit end to parsezero if not equalp :digit 1 [bell] make "digit 10 type 0 end to rubout setcursor [1 22] type "| | setcursor [1 22] setempty "digit end to bell if not :upping [type char 7] setempty "digit throw "bell end ;; Deal three cards from the hand to hand3 if not emptyp :digit [bell] if and emptyp :hand emptyp :pile [bell] push "pile deal repeat 2 [if not emptyp :hand [push "pile deal]] dispile dishand end to deal if emptyp :hand [make "hand reverse :pile setempty "pile] if emptyp :hand [output []] output pop "hand end ;; Select card to play by position (pile or stack) or by name to playpile if emptyp :pile [bell] if not emptyp :digit [bell] make "card first :pile make "where [rempile] carddis :card playcard end to playstack :which :list if not emptyp :digit [bell] foreach :list [if equalp :which ? [playstack1 # stop]] end to playstack1 :num if greaterp :num :numstacks [bell] if stackemptyp shown :num [bell] make "card last thing shown :num make "where sentence "remshown :num carddis :card playcard end to play.by.name :char if emptyp :digit [bell] if equalp :digit 1 [make "digit "a] type :char wait 0 make "card word :digit :char setempty "digit findcard if not emptyp :where [playcard] end to findcard if findpile [stop] make "where findshown if emptyp :where [bell] end to findpile if emptyp :pile [output "false] if equalp :card first :pile [make "where [rempile] output "true] output "false end to findshown for [num 1 :numstacks] ~ [if memberp :card thing shown :num [output sentence "remshown :num]] output [] end ;; Figure out all possible places to play card, then pick one to playcard setempty "onto if not coveredp [checktop] if and not :upping ~ or (emptyp :onto) (not upsafep rank :card) ~ [checkonto] if emptyp :onto [bell] run :where run first :onto end to coveredp if equalp :where [rempile] [output "false] output not equalp :card first thing shown last :where end to upsafep :rank if memberp :rank [A 2] [output "true] output equalp 0 thing word "num ((ranknum :rank)-2) end to checktop if (ranknum rank :card) = 1 + (ranknum top suit :card) ~ [push "onto (list "playtop word "" suit :card)] end to checkonto for [num :numstacks 1] ~ [ifelse stackemptyp shown :num [checkempty :num] [checkfull :num thing shown :num]] end to checkempty :num if equalp rank :card "k [push "onto (list "playonto :num)] end to checkfull :num :stack if equalp (redp :card) (redp first :stack) [stop] if ((ranknum rank first :stack) = 1 + (ranknum rank :card)) ~ [push "onto (list "playonto :num)] end ;; Play card, step 1: remove from old position to rempile make "cards (list (pop "pile)) dispile end to remshown :num setempty "cards remshown1 :num (count thing shown :num) if stackemptyp shown :num [turnup :num disstack :num] end to remshown1 :num :length do.until [push "cards (pop shown :num)] ~ [equalp :card first :cards] for [i 1 [count :cards]] ~ [setcursor list (5*:num - 4) (5+:length-:i) type "| |] end to turnup :num setempty shown :num if stackemptyp hidden :num [stop] push (shown :num) (pop hidden :num) end ;; Play card, step 2: put in new position to playtop :suit localmake "var word "num ranknum rank :card settop :suit rank :card distop :suit make :var (thing :var)-1 if (thing :var)=0 [make "ranks butfirst :ranks] end to playonto :num localmake "row 4+count thing shown :num localmake "col 5*:num-4 for [i 1 [count :cards]] ~ [localmake "card pop "cards push (shown :num) :card setcursor list :col :row+:i carddis :card] end ;; Update screen display to redisplay cleartext for [num 1 :numstacks] [disstack :num] foreach :suits "distop dispile dishand setcursor [1 22] setempty "digit end to disstack :num setcursor list (-3 + 5 * :num) 4 type ifelse stackemptyp hidden :num ["| |] ["-] if stackemptyp shown :num [setcursor list (-4 + 5 * :num) 5 type "| | stop] localmake "stack (thing shown :num) localmake "col 5*:num-4 for [i [count :stack] 1] ~ [setcursor list :col :i+4 carddis pop "stack] end to distop :suit if emptyp top :suit [stop] if equalp :suit "H [distop1 4 stop] if equalp :suit "S [distop1 11 stop] if equalp :suit "D [distop1 18 stop] distop1 25 end to distop1 :col setcursor list :col 2 carddis word (top :suit) :suit end to dispile setcursor [32 23] ifelse emptyp :pile [type "| |] [carddis first :pile] end to dishand setcursor [27 23] type count :hand type "| | end to carddis :card ifelse memberp suit :card :reds [redtype :card] [blacktype :card] type "| | end to redtype :word type :word end to blacktype :word type standout :word end ;; Miscellaneous user commands to again if not emptyp :digit [bell] if emptyp :onto [bell] make "where list "remshown last pop "onto if emptyp :onto [bell] carddis :card run :where run first :onto end to helper cleartext instruct print standout [type any key to continue] ignore rc redisplay end to allup if emptyp :digit [bell] if equalp :digit 1 [make "digit "a] localmake "upping "true type ". wait 0 foreach map [word :digit ?] [H S D C] ~ [catch "bell [make "card ? findcard if not emptyp :where [playcard]]] setempty "digit end to wingame type "W localmake "cursor cursor foreach :ranks [if not upsafep ? [stop] make "digit ? ~ allup ~ setempty "digit ~ setcursor :cursor] if equalp (map "top [H S D C]) [K K K K] ~ [ct print [you win!] wait 120 throw "endgame] end to newstack localmake "num :numstacks+1 setcursor [1 22] type "| | if not equalp :digit 9 [bell] setempty hidden :num setempty shown :num make "numstacks :num setempty "digit end to cheat setcursor [1 22] type "| | if not equalp :digit 8 [bell] if and emptyp :hand emptyp :pile [bell] push "pile deal dispile dishand setempty "digit end ;; Data abstraction (ranks) to rank :card output butlast :card end to ranknum :rank if emptyp :rank [output 0] if numberp :rank [output :rank] if :rank = "A [output 1] if :rank = "J [output 11] if :rank = "Q [output 12] if :rank = "K [output 13] end ;; Data abstraction (suits) to suit :card output last :card end to redp :card output memberp (suit :card) :reds end ;; Data abstraction (tops) to top :suit output thing word "top :suit end to settop :suit :value make (word "top :suit) :value end ;; Data abstraction (card stacks) to shown :num output word "shown :num end to hidden :num output word "hidden :num end ;; Data abstraction (pushdown stacks) to stackemptyp :name output emptyp thing :name end to setempty :stack make :stack [] end ucblogo-6.1/csls/psort0000664000175000017500000000400713557147341013163 0ustar jjcjjcprogram psort; {partition sort demo} var data: array [0..100] of integer; i: integer; procedure showdata; {print the array} var i: integer; begin {showdata} for i := 0 to 99 do begin if i mod 20 = 0 then writeln; write(data[i]:3) end; writeln; writeln end; {showdata} function median(lower,upper:integer):integer; {find the median of three values from the data array} var mid: integer; begin mid := (lower+upper) div 2; if (data[lower] <= data[mid]) and (data[mid] <= data[upper]) then median := mid else if (data[lower] >= data[mid]) and (data[mid] >= data[upper]) then median := mid else if (data[mid] <= data[lower]) and (data[lower] <= data[upper]) then median := lower else if (data[mid] >= data[lower]) and (data[lower] >= data[upper]) then median := lower else median := upper end; procedure sort(lower,upper:integer); {sort part of the array} var key,i,j:integer; procedure exch(var a,b:integer); {exchange two integers} var temp:integer; begin {exch} temp := a; a := b; b := temp end; {exch} begin {sort} if upper > lower then begin exch (data[lower],data[median(lower,upper)]); key := data[lower]; i := lower; j := upper+1; repeat i := i+1 until data[i] >= key; repeat j := j-1 until data[j] <= key; while (i <= j) do begin exch(data[i], data[j]); repeat i := i+1 until data[i] >= key; repeat j := j-1 until data[j] <= key end; exch(data[lower], data[j]); sort(lower,j-1); sort(i,upper) end end; {sort} begin {main program} data[100] := 200; for i := 0 to 99 do data[i] := random(100); writeln('Data before sorting:'); showdata; sort(0,99); writeln('Data after sorting:'); showdata end. ucblogo-6.1/csls/pour0000664000175000017500000000553613557147341013011 0ustar jjcjjc;; Initialization to pour :sizes :goal local [oldstates pitchers won] make "oldstates (list all.empty :sizes) make "pitchers fput 0 (map [#] :sizes) make "won "false win breadth.first make.path [] all.empty :sizes end to all.empty :list output map [0] :list end ;; Tree search to breadth.first :root op breadth.descend (list :root) end to breadth.descend :queue if emptyp :queue [output []] if :won [output last :queue] op breadth.descend sentence (butfirst :queue) ~ (children first :queue) end ;; Generate children to children :path output map.se [children1 :path ?] :pitchers end to children1 :path :from output map.se [child :path :from ?] :pitchers end to child :path :from :to local [state newstate] if :won [output []] if equalp :from :to [output []] make "state path.state :path if not riverp :from ~ [if equalp (water :from) 0 [output []]] if not riverp :to ~ [if equalp (water :to) (size :to) [output []]] make "newstate (newstate :state :from :to) if memberp :newstate :oldstates [output []] make "oldstates fput :newstate :oldstates if memberp :goal :newstate [make "won "true] output (list make.path (fput list :from :to path.moves :path) :newstate) end to newstate :state :from :to if riverp :to [output replace :state :from 0] if riverp :from [output replace :state :to (size :to)] if (water :from) < (room :to) ~ [output replace2 :state ~ :from 0 ~ :to ((water :from)+(water :to))] output replace2 :state ~ :from ((water :from)-(room :to)) ~ :to (size :to) end ;; Printing the result to win :path if emptyp :path [print [Can't do it!] stop] foreach (reverse path.moves :path) "win1 print sentence [Final quantities are] (path.state :path) end to win1 :move print (sentence [Pour from] (printform first :move) [to] (printform last :move)) end to printform :pitcher if riverp :pitcher [output "river] output size :pitcher end ;; Path data abstraction to make.path :moves :state output fput :moves :state end to path.moves :path output first :path end to path.state :path output butfirst :path end ;; Pitcher data abstraction to riverp :pitcher output equalp :pitcher 0 end to size :pitcher output item :pitcher :sizes end to water :pitcher output item :pitcher :state end to room :pitcher output (size :pitcher)-(water :pitcher) end ;; List processing utilities to replace :list :index :value if equalp :index 1 [output fput :value butfirst :list] output fput first :list (replace butfirst :list :index-1 :value) end to replace2 :list :index1 :value1 :index2 :value2 if equalp :index1 1 ~ [output fput :value1 replace butfirst :list :index2-1 :value2] if equalp :index2 1 ~ [output fput :value2 replace butfirst :list :index1-1 :value1] output fput first :list ~ replace2 butfirst :list :index1-1 :value1 :index2-1 :value2 end ucblogo-6.1/csls/poker0000664000175000017500000000306213557147341013134 0ustar jjcjjcto pokerhand :cards local [ranks suits rankarray] poker.init :cards if fourp [print [four of a kind] stop] if full.housep [print [full house] stop] if threep [print [three of a kind] stop] if pairp [print ifelse paircount = 1 [[one pair]] [[two pairs]] stop] if ace.highp [print ifelse flushp [[royal flush]] [[straight]] stop] if straightp [print ifelse flushp [[straight flush]] [[straight]] stop] if flushp [print [flush] stop] print [nothing!] end to poker.init :cards make "ranks map [ranknum butlast ?] :cards make "suits remdup map "last :cards make "rankarray {0 0 0 0 0 0 0 0 0 0 0 0 0} foreach :ranks [setitem ? :rankarray (item ? :rankarray)+1] end to ranknum :rank if :rank = "a [output 1] if :rank = "j [output 11] if :rank = "q [output 12] if :rank = "k [output 13] output :rank end to fourp output memberp 4 :rankarray end to threep output memberp 3 :rankarray end to pairp output memberp 2 :rankarray end to full.housep output and threep pairp end to paircount output count locate 2 1 end to locate :number :index if :index > 13 [output []] if (item :index :rankarray) = :number ~ [output fput :index (locate :number :index+1)] output locate :number :index+1 end to flushp output emptyp butfirst :suits end to straightp output nogap (reduce "min :ranks) 5 end to min :a :b output ifelse :a < :b [:a] [:b] end to nogap :smallest :howmany if :howmany=0 [output "true] if not equalp (item :smallest :rankarray) 1 [output "false] output nogap :smallest+1 :howmany-1 end to ace.highp if not equalp (item 1 :rankarray) 1 [output "false] output nogap 10 4 end ucblogo-6.1/csls/plot0000664000175000017500000000164013557147341012772 0ustar jjcjjcto plot :inputs keyword :inputs [maxharm 5 deltax 2 yscale 75 cycles 1 xrange 230 skip 2] localmake "xscale :cycles*180/:xrange splitscreen clearscreen hideturtle penup setpos list (-:xrange) 0 pendown for [x :deltax [2*:xrange] :deltax] ~ [setpos list (xcor+:deltax) (:yscale * series :maxharm)] end ;; Compute the Fourier series values to series :harmonic if :harmonic < 1 [output 0] output (term :harmonic)+(series :harmonic-:skip) end to term :harmonic output (sin :xscale * :harmonic * :x) / :harmonic end ;; Handle keyword inputs .macro keyword :inputs :defaults if or (wordp :inputs) (numberp first :inputs) ~ [make "inputs sentence (first :defaults) :inputs] output `[local ,[filter [not numberp ?] :defaults] setup.values ,[:defaults] setup.values ,[:inputs]] end to setup.values :list if emptyp :list [stop] make first :list first butfirst :list setup.values butfirst butfirst :list end ucblogo-6.1/csls/playfair0000664000175000017500000000403313557147341013622 0ustar jjcjjcto playfair :keyword :message local [matrix a b c d e f g h i j k l m n o p q r s t u v w x y z] setkeyword jtoi lowercase :keyword output encode (reduce "word :message) end ;; Prepare the code array to setkeyword :word make "matrix reorder word :word (remove :word "abcdefghiklmnopqrstuvwxyz) make "j :i end to remove :letters :string if emptyp :string [output "] if memberp first :string :letters [output remove :letters bf :string] output word first :string remove :letters bf :string end to reorder :string output reorder1 :string (mdarray [5 5]) 1 1 end to reorder1 :string :array :row :column if :row=6 [output :array] if :column=6 [output reorder1 :string :array :row+1 1] mdsetitem (list :row :column) :array first :string make first :string (list :row :column) output reorder1 (butfirst :string) :array :row :column+1 end ;; Encode the message to encode :message if emptyp :message [output "] if emptyp butfirst :message [output paircode first :message "q] if equalp (jtoi first :message) (jtoi first butfirst :message) ~ [output word (paircode first :message "q) (encode butfirst :message)] output word (paircode first :message first butfirst :message) ~ (encode butfirst butfirst :message) end to paircode :one :two local [row1 column1 row2 column2] make "row1 first thing :one make "column1 last thing :one make "row2 first thing :two make "column2 last thing :two if :row1 = :row2 ~ [output letters (list :row1 rotate (:column1+1)) ~ (list :row1 rotate (:column2+1))] if :column1 = :column2 ~ [output letters (list rotate (:row1+1) :column1) ~ (list rotate (:row2+1) :column1)] output letters (list :row1 :column2) (list :row2 :column1) end to rotate :index output ifelse :index = 6 [1] [:index] end to letters :one :two output word letter :one letter :two end to letter :rowcol output itoj mditem :rowcol :matrix end ;; I and J conversion to jtoi :word output map [ifelse equalp ? "j ["i] [?]] :word end to itoj :letter if :letter = "i [if (random 3) = 0 [output "j]] output :letter end ucblogo-6.1/csls/pascal0000664000175000017500000007265713557147341013277 0ustar jjcjjcto compile :file if namep "peekchar [ern "peekchar] if namep "peektoken [ern "peektoken] if not namep "idlist [opsetup] if not emptyp :file [openread :file] setread :file ignore error catch "error [program] localmake "error error if not emptyp :error [print first butfirst :error] setread [] if not emptyp :file [close :file] end ;; Global setup to opsetup make "numregs 32 make "memsize 3000 pprop "|=| "binary [eql 2 [boolean []] 1] pprop "|<>| "binary [neq 2 [boolean []] 1] pprop "|<| "binary [less 2 [boolean []] 1] pprop "|>| "binary [gtr 2 [boolean []] 1] pprop "|<=| "binary [leq 2 [boolean []] 1] pprop "|>=| "binary [geq 2 [boolean []] 1] pprop "|+| "binary [add 2 [[] []] 2] pprop "|-| "binary [sub 2 [[] []] 2] pprop "or "binary [lor 2 [boolean boolean] 2] pprop "|*| "binary [mul 2 [[] []] 3] pprop "|/| "binary [quo 2 [real []] 3] pprop "div "binary [div 2 [integer integer] 3] pprop "mod "binary [rem 2 [integer integer] 3] pprop "and "binary [land 2 [boolean boolean] 3] pprop "|+| "unary [plus 1 [[] []] 4] pprop "|-| "unary [minus 1 [[] []] 4] pprop "not "unary [lnot 1 [boolean boolean] 4] make "idlist `[[trunc function int [1 ,[framesize.fun+1]]] [round function round [1 ,[framesize.fun+1]]] [random function random [1 ,[framesize.fun+1]]]] make "int [integer real] make "round [integer real] make "random [integer integer] end ;; Block structure to program mustbe "program localmake "progname token ifbe "|(| [ignore commalist [id] mustbe "|)|] mustbe "|;| localmake "lexical.depth 0 localmake "namesused [] localmake "needint "false localmake "needround "false localmake "needrandom "false localmake "idlist :idlist localmake "frame [0 0] localmake "id (list :progname "program (newlname :progname) :frame) push "idlist :id localmake "codeinto word "% :progname make :codeinto [] localmake "framesize framesize.proc program1 mustbe ". code [exit] foreach [int round random] "plibrary make :codeinto reverse thing :codeinto end to program1 localmake "regsused (array :numregs 0) for [i reg.firstfree :numregs-1] [setitem :i :regsused "false] ifbe "var [varpart] .setfirst butfirst :frame :framesize if :lexical.depth = 0 [code (list "add reg.globalptr reg.zero reg.zero) code (list "add reg.frameptr reg.zero reg.zero) code (list "addi reg.stackptr reg.zero :framesize)] localmake "bodytag gensym code (list "jump (word "" :bodytag)) tryprocpart code :bodytag mustbe "begin blockbody "end end to plibrary :func if not thing (word "need :func) [stop] code :func code (list "rload reg.firstfree (memaddr framesize.fun reg.frameptr)) code (list (word "s :func) reg.retval reg.firstfree) code (list "add reg.stackptr reg.frameptr reg.zero) code (list "rload reg.frameptr (memaddr frame.prevframe reg.stackptr)) code (list "jr reg.retaddr) end ;; Variable declarations to varpart local [token namelist type] make "token token make "peektoken :token if reservedp :token [stop] vargroup foreach :namelist [newvar ? :type] mustbe "|;| varpart end to vargroup make "namelist commalist [id] mustbe ": ifbe "packed [] make "type token ifelse equalp :type "array [make "type arraytype] [typecheck :type] end to id local "token make "token token if letterp ascii first :token [output :token] make "peektoken :token output [] end to arraytype local [ranges type] mustbe "|[| make "ranges commalist [range] mustbe "|]| mustbe "of make "type token typecheck :type output list :type :ranges end to range local [first last] make "first range1 mustbe ".. make "last range1 if :first > :last ~ [(throw "error (sentence [array bounds not increasing:] :first ".. :last))] output list :first (1 + :last - :first) end to range1 local "bound make "bound token if equalp first :bound "' [output ascii first butfirst :bound] if equalp :bound "|-| [make "bound minus token] if equalp :bound int :bound [output :bound] (throw "error sentence [array bound not ordinal:] :bound) end to typecheck :type if memberp :type [real integer char boolean] [stop] (throw "error sentence [undefined type] :type) end to newvar :pname :type if reservedp :pname [(throw "error sentence :pname [reserved word])] push "idlist (list :pname :type (list :lexical.depth :framesize) "false) make "framesize :framesize + ifelse listp :type [arraysize :type] [1] end to arraysize :type output reduce "product map [last ?] last :type end ;; Procedure and function declarations to tryprocpart ifbeelse "procedure ~ [procedure tryprocpart] ~ [ifbe "function [function tryprocpart]] end to procedure proc1 "procedure framesize.proc end to function proc1 "function framesize.fun end to proc1 :proctype :framesize localmake "procname token localmake "lexical.depth :lexical.depth+1 localmake "frame (list :lexical.depth 0) push "idlist (list :procname :proctype (newlname :procname) :frame) localmake "idlist :idlist make lname :procname [] ifbe "|(| [arglist] if equalp :proctype "function ~ [mustbe ": localmake "type token typecheck :type make lname :procname fput :type thing lname :procname] mustbe "|;| code lname :procname code (list "store reg.retaddr (memaddr frame.retaddr reg.frameptr)) program1 if equalp :proctype "function ~ [code (list "rload reg.retval (memaddr frame.retval reg.frameptr))] code (list "rload reg.retaddr (memaddr frame.retaddr reg.frameptr)) code (list "add reg.stackptr reg.frameptr reg.zero) code (list "rload reg.frameptr (memaddr frame.prevframe reg.stackptr)) code (list "jr reg.retaddr) mustbe "|;| end to arglist local [token namelist type varflag] make "varflag "false ifbe "var [make "varflag "true] vargroup foreach :namelist [newarg ? :type :varflag] ifbeelse "|;| [arglist] [mustbe "|)|] end to newarg :pname :type :varflag if reservedp :pname [(throw "error sentence :pname [reserved word])] localmake "pointer (list :lexical.depth :framesize) push "idlist (list :pname :type :pointer :varflag) make "framesize :framesize + ifelse (and listp :type not :varflag) ~ [arraysize :type] [1] queue lname :procname ifelse :varflag [list "var :type] [:type] end ;; Statement part to blockbody :endword statement ifbeelse "|;| [blockbody :endword] [mustbe :endword] end to statement local [token type] ifbe "begin [compound stop] ifbe "for [pfor stop] ifbe "if [pif stop] ifbe "while [pwhile stop] ifbe "repeat [prepeat stop] ifbe "write [pwrite stop] ifbe "writeln [pwriteln stop] make "token token make "peektoken :token if memberp :token [|;| end until] [stop] make "type gettype :token if emptyp :type [(throw "error sentence :token [can't begin statement])] if equalp :type "procedure [pproccall stop] if equalp :type "function [pfunset stop] passign end ;; Compound statement to compound blockbody "end end ;; Structured statements to pfor local [var init step final looptag endtag testreg] make "var token mustbe "|:=| make "init pinteger pexpr make "step 1 ifbeelse "downto [make "step -1] [mustbe "to] make "final pinteger pexpr mustbe "do make "looptag gensym make "endtag gensym code :looptag localmake "id getid :var codestore :init (id.pointer :id) (id.varp :id) 0 make "testreg newregister code (list (ifelse :step<0 ["less] ["gtr]) :testreg :init :final) code (list "jumpt :testreg (word "" :endtag)) regfree :testreg statement code (list "addi :init :init :step) code (list "jump (word "" :looptag)) code :endtag regfree :init regfree :final end to prepeat local [cond looptag] make "looptag gensym code :looptag blockbody "until make "cond pboolean pexpr code (list "jumpf :cond (word "" :looptag)) regfree :cond end to pif local [cond elsetag endtag] make "cond pboolean pexpr make "elsetag gensym make "endtag gensym mustbe "then code (list "jumpf :cond (word "" :elsetag)) regfree :cond statement code (list "jump (word "" :endtag)) code :elsetag ifbe "else [statement] code :endtag end to pwhile local [cond looptag endtag] make "looptag gensym make "endtag gensym code :looptag make "cond pboolean pexpr code (list "jumpf :cond (word "" :endtag)) regfree :cond mustbe "do statement code (list "jump (word "" :looptag)) code :endtag end ;; Simple statements: write and writeln to pwrite mustbe "|(| pwrite1 end to pwrite1 pwrite2 ifbe "|)| [stop] ifbeelse ", [pwrite1] [(throw "error [missing comma])] end to pwrite2 localmake "result pwrite3 ifbe ": [.setfirst (butfirst :result) token] code :result if not equalp first :result "putstr [regfree last :result] end to pwrite3 localmake "token token if equalp first :token "' ~ [output (list "putstr 1 (list butlast butfirst :token))] make "peektoken :token localmake "result pexpr if equalp first :result "char [output (list "putch 1 pchar :result)] if equalp first :result "boolean [output (list "puttf 1 pboolean :result)] if equalp first :result "integer [output (list "putint 10 pinteger :result)] output (list "putreal 20 preal :result) end to pwriteln ifbe "|(| [pwrite1] code [newline] end ;; Simple statements: procedure call to pproccall localmake "pname token localmake "id getid :pname localmake "lname id.lname :id localmake "vartypes thing :lname pproccall1 framesize.proc end to pproccall1 :offset code (list "store reg.newfp (memaddr frame.save.newfp reg.stackptr)) code (list "add reg.newfp reg.stackptr reg.zero) code (list "addi reg.stackptr reg.stackptr (last id.frame :id)) code (list "store reg.frameptr (memaddr frame.prevframe reg.newfp)) localmake "newdepth first id.frame :id ifelse :newdepth > :lexical.depth ~ [code (list "store reg.frameptr (memaddr frame.outerframe reg.newfp))] ~ [localmake "tempreg newregister code (list "rload :tempreg (memaddr frame.outerframe reg.frameptr)) repeat (:lexical.depth - :newdepth) [code (list "rload :tempreg (memaddr frame.outerframe :tempreg))] code (list "store :tempreg (memaddr frame.outerframe reg.newfp)) regfree :tempreg] if not emptyp :vartypes [mustbe "|(| procargs :vartypes :offset] for [i reg.firstfree :numregs-1] ~ [if item :i :regsused [code (list "store :i (memaddr frame.regsave+:i reg.frameptr))]] code (list "add reg.frameptr reg.newfp reg.zero) code (list "rload reg.newfp (memaddr frame.save.newfp reg.frameptr)) code (list "jal reg.retaddr (word "" :lname)) for [i reg.firstfree :numregs-1] ~ [if item :i :regsused [code (list "rload :i (memaddr frame.regsave+:i reg.frameptr))]] end to procargs :types :offset if emptyp :types [mustbe "|)| stop] localmake "next procarg first :types :offset if not emptyp butfirst :types [mustbe ",] procargs butfirst :types :offset+:next end to procarg :type :offset local "result if equalp first :type "var [output procvararg last :type] if listp :type [output procarrayarg :type] make "result check.type :type pexpr code (list "store :result (memaddr :offset reg.newfp)) regfree :result output 1 end to procvararg :ftype local [pname id type index] make "pname token make "id getid :pname make "type id.type :id ifelse wordp :ftype ~ [setindex "true] ~ [make "index 0] if not equalp :type :ftype ~ [(throw "error sentence :pname [arg wrong type])] localmake "target memsetup (id.pointer :id) (id.varp :id) :index localmake "tempreg newregister code (list "addi :tempreg (last :target) (first :target)) code (list "store :tempreg (memaddr :offset reg.newfp)) regfree last :target regfree :tempreg output 1 end to procarrayarg :type localmake "pname token localmake "id getid :pname if not equalp :type (id.type :id) ~ [(throw "error (sentence "array :pname [wrong type for arg]))] localmake "size arraysize :type localmake "rtarget memsetup (id.pointer :id) (id.varp :id) 0 localmake "pointreg newregister code (list "addi :pointreg reg.newfp :offset) localmake "ltarget (list 0 :pointreg) copyarray output :size end ;; Simple statements: assignment statement (including function value) to passign local [name id type index value pointer target] make "name token make "index [] ifbe "|[| [make "index commalist [pexpr] mustbe "|]|] mustbe "|:=| make "id getid :name make "pointer id.pointer :id make "type id.type :id passign1 end to pfunset local [name id type index value pointer target] make "name token make "index [] if not equalp :name :procname ~ [(throw "error sentence [assign to wrong function] :name)] mustbe "|:=| make "pointer (list :lexical.depth frame.retval) make "type first thing lname :name make "id (list :name :type :pointer "false) passign1 end to passign1 if and (listp :type) (emptyp :index) [parrayassign :id stop] setindex "false make "value check.type :type pexpr codestore :value (id.pointer :id) (id.varp :id) :index regfree :value end to noimmediate :value if equalp exp.mode :value "immediate ~ [localmake "reg newregister code (list "addi :reg reg.zero exp.value :value) output (list exp.type :value "register :reg)] output :value end to check.type :type :result if equalp :type "real [output preal :result] if equalp :type "integer [output pinteger :result] if equalp :type "char [output pchar :result] if equalp :type "boolean [output pboolean :result] end to preal :expr [:pval noimmediate :expr] if equalp exp.type :pval "real [output exp.value :pval] output pinteger :pval end to pinteger :expr [:pval noimmediate :expr] local "type make "type exp.type :pval if memberp :type [integer boolean char] [output exp.value :pval] (throw "error sentence exp.type :pval [isn't ordinal]) end to pchar :expr [:pval noimmediate :expr] if equalp exp.type :pval "char [output exp.value :pval] (throw "error sentence exp.type :pval [not character value]) end to pboolean :expr [:pval noimmediate :expr] if equalp exp.type :pval "boolean [output exp.value :pval] (throw "error sentence exp.type :pval [not true or false]) end to parrayassign :id localmake "right token if equalp first :right "' ~ [pstringassign :type (butlast butfirst :right) stop] localmake "rid getid :right if not equalp (id.type :id) (id.type :rid) ~ [(throw "error (sentence "arrays :name "and :right [unequal types]))] localmake "size arraysize id.type :id localmake "ltarget memsetup (id.pointer :id) (id.varp :id) 0 localmake "rtarget memsetup (id.pointer :rid) (id.varp :rid) 0 copyarray end to pstringassign :type :string if not equalp first :type "char [stringlose] if not emptyp butfirst last :type [stringlose] if not equalp (last first last :type) (count :string) [stringlose] localmake "ltarget memsetup (id.pointer :id) (id.varp :id) 0 pstringassign1 newregister (first :ltarget) (last :ltarget) :string regfree last :ltarget end to pstringassign1 :tempreg :offset :reg :string if emptyp :string [regfree :tempreg stop] code (list "addi :tempreg reg.zero ascii first :string) code (list "store :tempreg (memaddr :offset :reg)) pstringassign1 :tempreg :offset+1 :reg (butfirst :string) end to stringlose (throw "error sentence :name [not string array or wrong size]) end ;; Multiple array indices to linear index computation to setindex :parseflag ifelse listp :type ~ [if :parseflag [mustbe "|[| make "index commalist [pexpr] mustbe "|]| ] make "index lindex last :type :index make "type first :type] ~ [make "index 0] end to lindex :bounds :index output lindex1 (offset pinteger noimmediate first :index first first :bounds) ~ butfirst :bounds butfirst :index end to lindex1 :sofar :bounds :index if emptyp :bounds [output :sofar] output lindex1 (nextindex :sofar last first :bounds pinteger noimmediate first :index first first :bounds) ~ butfirst :bounds butfirst :index end to nextindex :old :factor :new :offset code (list "muli :old :old :factor) localmake "newreg offset :new :offset code (list "add :old :old :newreg) regfree :newreg output :old end to offset :indexreg :lowbound if not equalp :lowbound 0 [code (list "subi :indexreg :indexreg :lowbound)] output :indexreg end ;; Memory interface: load and store instructions to codeload :reg :pointer :varflag :index localmake "target memsetup :pointer :varflag :index code (list "rload :reg targetaddr) regfree last :target end to codestore :reg :pointer :varflag :index localmake "target memsetup :pointer :varflag :index code (list "store :reg targetaddr) regfree last :target end to targetaddr output memaddr (first :target) (last :target) end to memaddr :offset :index output (word :offset "\( :index "\)) end to memsetup :pointer :varflag :index localmake "depth first :pointer localmake "offset last :pointer local "newreg ifelse equalp :depth 0 ~ [make "newreg reg.globalptr] ~ [ifelse equalp :depth :lexical.depth [make "newreg reg.frameptr] [make "newreg newregister code (list "rload :newreg (memaddr frame.outerframe reg.frameptr)) repeat (:lexical.depth - :depth) - 1 [code (list "rload :newreg (memaddr frame.outerframe :newreg))]]] if :varflag ~ [ifelse :newreg = reg.frameptr [make "newreg newregister code (list "rload :newreg (memaddr :offset reg.frameptr))] [code (list "rload :newreg (memaddr :offset :newreg))] make "offset 0] if not equalp :index 0 ~ [code (list "add :index :index :newreg) regfree :newreg make "newreg :index] output list :offset :newreg end to copyarray localmake "looptag gensym localmake "sizereg newregister code (list "addi :sizereg reg.zero :size) code :looptag localmake "tempreg newregister code (list "rload :tempreg (memaddr (first :rtarget) (last :rtarget))) code (list "store :tempreg (memaddr (first :ltarget) (last :ltarget))) code (list "addi (last :rtarget) (last :rtarget) 1) code (list "addi (last :ltarget) (last :ltarget) 1) code (list "subi :sizereg :sizereg 1) code (list "gtr :tempreg :sizereg reg.zero) code (list "jumpt :tempreg (word "" :looptag)) regfree :sizereg regfree :tempreg regfree last :ltarget regfree last :rtarget end ;; Expressions to pexpr local [opstack datastack parenlevel] make "opstack [[popen 1 0]] make "datastack [] make "parenlevel 0 output pexpr1 end to pexpr1 local [token op] make "token token while [equalp :token "|(|] [popen make "token token] make "op pgetunary :token if not emptyp :op [output pexprop :op] push "datastack pdata :token make "token token while [and (:parenlevel > 0) (equalp :token "|)| )] ~ [pclose make "token token] make "op pgetbinary :token if not emptyp :op [output pexprop :op] make "peektoken :token pclose if not emptyp :opstack [(throw "error [too many operators])] if not emptyp butfirst :datastack [(throw "error [too many operands])] output pop "datastack end to pexprop :op while [(op.prec :op) < (1 + op.prec first :opstack)] [ppopop] push "opstack :op output pexpr1 end to popen push "opstack [popen 1 0] make "parenlevel :parenlevel + 1 end to pclose while [(op.prec first :opstack) > 0] [ppopop] ignore pop "opstack make "parenlevel :parenlevel - 1 end to pgetunary :token output gprop :token "unary end to pgetbinary :token output gprop :token "binary end to ppopop local [op function args left right type reg] make "op pop "opstack make "function op.instr :op if equalp :function "plus [stop] make "args op.nargs :op make "right pop "datastack make "left (ifelse equalp :args 2 [pop "datastack] [[[] []]]) make "type pnewtype :op exp.type :left exp.type :right if equalp exp.mode :left "immediate ~ [localmake "leftreg newregister code (list "addi :leftreg reg.zero exp.value :left) make "left (list exp.type :left "register :leftreg)] ifelse equalp exp.mode :left "register ~ [make "reg exp.value :left] ~ [ifelse equalp exp.mode :right "register [make "reg exp.value :right] [make "reg newregister]] if equalp :function "minus ~ [make "left (list exp.type :right "register reg.zero) make "function "sub make "args 2] if equalp exp.mode :right "immediate ~ [make "function word :function "i] ifelse equalp :args 2 ~ [code (list :function :reg exp.value :left exp.value :right)] ~ [code (list :function :reg exp.value :right)] if not equalp :reg exp.value :left [regfree exp.value :left] if (and (equalp exp.mode :right "register) (not equalp :reg exp.value :right)) ~ [regfree exp.value :right] push "datastack (list :type "register :reg) end to pnewtype :op :ltype :rtype local "type make "type op.types :op if emptyp :ltype [make "ltype :rtype] if not emptyp last :type [pchecktype last :type :ltype :rtype] if and (equalp :ltype "real) (equalp :rtype "integer) [make "rtype "real] if and (equalp :ltype "integer) (equalp :rtype "real) [make "ltype "real] if not equalp :ltype :rtype [(throw "error [type clash])] if emptyp last :type ~ [if not memberp :rtype [integer real] [(throw "error [nonarithmetic type])]] if emptyp first :type [output :rtype] output first :type end to pchecktype :want :left :right if not equalp :want :left [(throw "error (sentence :left "isn't :want))] if not equalp :want :right [(throw "error (sentence :right "isn't :want))] end ;; Expression elements to pdata :token if equalp :token "true [output [boolean immediate 1]] if equalp :token "false [output [boolean immediate 0]] if equalp first :token "' [output pchardata :token] if numberp :token [output (list numtype :token "immediate :token)] localmake "id getid :token if emptyp :id [(throw "error sentence [undefined symbol] :token)] localmake "type id.type :id if equalp :type "function [output pfuncall :token] local "index setindex "true localmake "reg newregister codeload :reg (id.pointer :id) (id.varp :id) :index output (list :type "register :reg) end to pchardata :token if not equalp count :token 3 ~ [(throw "error sentence :token [not single character])] output (list "char "immediate ascii first butfirst :token) end to numtype :number if memberp ". :number [output "real] if memberp "e :number [output "real] output "integer end to pfuncall :pname localmake "id getid :pname localmake "lname id.lname :id if namep (word "need :lname) [make (word "need :lname) "true] localmake "vartypes thing :lname localmake "returntype first :vartypes make "vartypes butfirst :vartypes pproccall1 framesize.fun localmake "reg newregister code (list "add :reg reg.retval reg.zero) output (list :returntype "register :reg) end ;; Parsing assistance to code :stuff if emptyp :stuff [stop] push :codeinto :stuff end to commalist :test [:sofar []] local [result token] make "result run :test if emptyp :result [output :sofar] ifbe ", [output (commalist :test (lput :result :sofar))] output lput :result :sofar end .macro ifbe :wanted :action localmake "token token if equalp :token :wanted [output :action] make "peektoken :token output [] end .macro ifbeelse :wanted :action :else localmake "token token if equalp :token :wanted [output :action] make "peektoken :token output :else end to mustbe :wanted localmake "token token if equalp :token :wanted [stop] (throw "error (sentence "expected :wanted "got :token)) end to newregister for [i reg.firstfree :numregs-1] ~ [if not item :i :regsused [setitem :i :regsused "true output :i]] (throw "error [not enough registers available]) end to regfree :reg setitem :reg :regsused "false end to reservedp :word output memberp :word [and array begin case const div do downto else end ~ file for forward function goto if in label mod nil ~ not of packed procedure program record repeat set ~ then to type until var while with] end ;; Lexical analysis to token local [token char] if namep "peektoken [make "token :peektoken ern "peektoken output :token] make "char getchar if equalp :char "|{| [skipcomment output token] if equalp :char char 32 [output token] if equalp :char char 13 [output token] if equalp :char char 10 [output token] if equalp :char "' [output string "'] if memberp :char [+ - * / = ( , ) |[| |]| |;|] [output :char] if equalp :char "|<| [output twochar "|<| [= >]] if equalp :char "|>| [output twochar "|>| [=]] if equalp :char ". [output twochar ". [.]] if equalp :char ": [output twochar ": [=]] if numberp :char [output number :char] if letterp ascii :char [output token1 lowercase :char] (throw "error sentence [unrecognized character:] :char) end to skipcomment if equalp getchar "|}| [stop] skipcomment end to string :string local "char make "char getchar if not equalp :char "' [output string word :string :char] make "char getchar if equalp :char "' [output string word :string :char] make "peekchar :char output word :string "' end to twochar :old :ok localmake "char getchar if memberp :char :ok [output word :old :char] make "peekchar :char output :old end to number :num local "char make "char getchar if equalp :char ". ~ [make "char getchar ~ ifelse equalp :char ". ~ [make "peektoken ".. output :num] ~ [make "peekchar :char output number word :num ".]] if equalp :char "e [output number word :num twochar "e [+ -]] if numberp :char [output number word :num :char] make "peekchar :char output :num end to token1 :token local "char make "char getchar if or letterp ascii :char numberp :char ~ [output token1 word :token lowercase :char] make "peekchar :char output :token end to letterp :code if and (:code > 64) (:code < 91) [output "true] output and (:code > 96) (:code < 123) end to getchar local "char if namep "peekchar [make "char :peekchar ern "peekchar output :char] if eofp [output char 1] output rc1 end to rc1 local "result make "result readchar type :result output :result end ;; Data abstraction: ID List to newlname :word if memberp :word :namesused [output gensym] if namep word "% :word [output gensym] push "namesused :word output word "% :word end to lname :word local "result make "result getid :word if not emptyp :result [output item 3 :result] (throw "error sentence [unrecognized identifier] :word) end to gettype :word local "result make "result getid :word if not emptyp :result [output item 2 :result] (throw "error sentence [unrecognized identifier] :word) end to getid :word [:list :idlist] if emptyp :list [output []] if equalp :word first first :list [output first :list] output (getid :word butfirst :list) end to id.type :id output item 2 :id end to id.pointer :id output item 3 :id end to id.lname :id output item 3 :id end to id.varp :id output item 4 :id end to id.frame :id output item 4 :id end ;; Data abstraction: Frame slots to frame.retaddr output 0 end to frame.save.newfp output 1 end to frame.outerframe output 2 end to frame.prevframe output 3 end to frame.regsave output 4 end to framesize.proc output 4+:numregs end to frame.retval output 4+:numregs end to framesize.fun output 5+:numregs end ;; Data abstraction: Operators to op.instr :op output first :op end to op.nargs :op output first bf :op end to op.types :op output item 3 :op end to op.prec :op output last :op end ;; Data abstraction: Expressions to exp.type :exp output first :exp end to exp.mode :exp output first butfirst :exp end to exp.value :exp output last :exp end ;; Data abstraction: Registers to reg.zero output 0 end to reg.retaddr output 1 end to reg.stackptr output 2 end to reg.globalptr output 3 end to reg.frameptr output 4 end to reg.newfp output 5 end to reg.retval output 6 end to reg.firstfree output 7 end ;; Runtime (machine simulation) to prun :progname localmake "prog thing word "% :progname localmake "regs (array :numregs 0) local filter "wordp :prog foreach :prog [if wordp ? [make ? ?rest]] localmake "memory (array :memsize 0) setitem 0 :regs 0 if not procedurep "add [runsetup] prun1 :prog end to prun1 :pc if emptyp :pc [stop] if listp first :pc [run first :pc] prun1 butfirst :pc end to rload :reg :offset :index setitem :reg :regs (item (item :index :regs)+:offset :memory) end to store :reg :offset :index setitem (item :index :regs)+:offset :memory (item :reg :regs) end to runsetup foreach [[add sum] [sub difference] [mul product] [quo quotient] [div [int quotient]] [rem remainder] [land product] [lor [tobool lessp 0 sum]] [eql [tobool equalp]] [neq [tobool not equalp]] [less [tobool lessp]] [gtr [tobool greaterp]] [leq [tobool not greaterp]] [geq [tobool not lessp]]] ~ [define first ? `[[dest src1 src2] [setitem :dest :regs ,@[last ?] (item :src1 :regs) (item :src2 :regs)]] define word first ? "i `[[dest src1 immed] [setitem :dest :regs ,@[last ?] (item :src1 :regs) :immed]]] foreach [[lnot [difference 1]] [sint int] [sround round] [srandom random]] ~ [define first ? `[[dest src] [setitem :dest :regs ,@[last ?] (item :src :regs)]] define word first ? "i `[[dest immed] [setitem :dest :regs ,@[last ?] :immed]]] end to tobool :tf output ifelse :tf [1] [0] end to jump :label make "pc fput :label thing :label end to jumpt :reg :label if (item :reg :regs)=1 [jump :label] end to jumpf :reg :label if (item :reg :regs)=0 [jump :label] end to jr :reg make "pc item :reg :regs end to jal :reg :label setitem :reg :regs :pc jump :label end to putch :width :reg spaces :width 1 type char (item :reg :regs) end to putstr :width :string spaces :width (count first :string) type :string end to puttf :width :bool spaces :width 1 type ifelse (item :bool :regs)=0 ["F] ["T] end to putint :width :reg localmake "num (item :reg :regs) spaces :width count :num type :num end to putreal :width :reg putint :width :reg end to spaces :width :count if :width > :count [repeat :width - :count [type "| |]] end to newline print [] end to exit make "pc [exit] end ucblogo-6.1/csls/multi0000664000175000017500000000122213557147341013142 0ustar jjcjjcprogram multi; {Multinomial expansion problem} var memo: array [0..4, 0..7] of integer; i,j: integer; function t(n,k:integer) : integer; function realt(n,k:integer) : integer; {without memoization} begin {realt} if k = 0 then realt := 1 else if n = 0 then realt := 0 else realt := t(n,k-1)+t(n-1,k) end; {realt} begin {t} if memo[n,k] < 0 then memo[n,k] := realt(n,k); t := memo[n,k] end; {t} begin {main program} {initialization} for i := 0 to 4 do for j := 0 to 7 do memo[i,j] := -1; {How many terms in (a+b+c+d)^7?} writeln(t(4,7)); end. ucblogo-6.1/csls/mines0000664000175000017500000003356613557147341013143 0ustar jjcjjc; Minesweeper game ; Mouse clicks call HIT procedure ; Main data structure: array of arrays, e.g., ; (ITEM (ITEM STATUS 3) 5) for row 3 column 5. ; Values are: HIDDEN (tan square), ; FLAGGED (flagged as a mine), ; SHOWN (open, non-mine, shows number of mined neighbors), ; BORDER (just outside of actual playing field). ; Notice that a FLAGGED square might not really be a mine. ; (Player can make mistakes!) ; Actual mines are listed in MINES (list of [row col] lists). cslsload "buttons to mines if :LogoPlatform = "Windows [maximize.window "true] localmake "inference "false localmake "newnmines 100 localmake "newsize 15 localmake "halfsize 10 localmake "squaresize 2*:halfsize localmake "maxxmax :halfsize*15*2 localmake "maxymax :halfsize*15 localmake "sizechoice 3 localmake "hardchoice 2 localmake "sizes [5 10 15] localmake "hardness [38.1 44.45 59.26] localmake "windows ifelse :LogoPlatform="Windows [16] [0] if :LogoPlatform="wxWidgets [make "windows 16] norefresh catch "quit [forever [catch "newgame [setup :newnmines :newsize :newsize*2]]] refresh cs ct setpc 7 st end ; ------------------------ Initial setup --------------------------------- to setup :nmines :rows :columns cs ct wait 0 ht fs localmake "mines [] ; list of [row col] lists localmake "statuses (array :rows+2 -1) ; status of each square localmake "xmax :halfsize*:columns localmake "ymax :halfsize*:rows localmake "opening "true localmake "playing "true ; false only at end of game for [i -1 :rows] [setitem :i :statuses (array :columns+2 -1)] putmines :nmines ; Choose mined squares randomly. setbg 0 setup.buttons make "nhidden :rows * :columns borderrow -1 :columns borderrow :rows :columns ; mark nonexistent squares just outside field as BORDER ; to simplify how-many-of-my-neighbors computations bordersides :rows-1 hint ; open some safe squares so we don't have to guess blindly localmake "prevmines -1 pu setxy :maxxmax-100-2*:windows :maxymax+14 setpc 7 label [Mines left:] showminesleft action.loop end to putmines :num ; Choose random square, and make it a mine unless it already was one. if :num = 0 [stop] localmake "row random :rows localmake "col random :columns if member? (list :row :col) :mines [putmines :num stop] make "mines fput (list :row :col) :mines putmines :num-1 end to setup.buttons init.buttons setbutton (list -:maxxmax :maxymax+10) [60 20] [throw "newgame] ~ "false 0 "|NEW GAME| "G setbutton (list 80-:maxxmax :maxymax+10) [40 20] [action.off throw "quit] ~ "false 0 "QUIT "Q caption (list 160-:maxxmax-:windows :maxymax+10) [60 20] "infer: drawinferbuttons caption (list -:maxxmax -(:maxymax+30)) [60 20] "size: caption (list 160-:maxxmax-:windows -(:maxymax+30)) [80 20] "difficulty: drawsizebuttons setbutton (list -:xmax -:ymax) (list 2*:xmax 2*:ymax) ~ [hit :mousepos showminesleft] "false 9 "|| [] ; Entire board is one big button. showboard "false ; input is TRUE to uncover entire board at end of game pu end to drawinferbuttons rebutton (list 200-:maxxmax :maxymax+10) [20 20] ~ [make "inference "true drawinferbuttons] ~ :inference 0 "Y "Y rebutton (list 230-:maxxmax :maxymax+10) [20 20] ~ [make "inference "false drawinferbuttons] ~ not :inference 0 "N "N end to drawsizebuttons make "newsize item :sizechoice :sizes make "newnmines int (item :hardchoice :hardness)*:newsize*:newsize/100 rebutton (list 40-:maxxmax -(:maxymax+30)) [20 20] ~ [make "sizechoice 1 drawsizebuttons] ~ :sizechoice=1 0 "S "S rebutton (list 70-:maxxmax -(:maxymax+30)) [20 20] ~ [make "sizechoice 2 drawsizebuttons] ~ :sizechoice=2 0 "M "M rebutton (list 100-:maxxmax -(:maxymax+30)) [20 20] ~ [make "sizechoice 3 drawsizebuttons] ~ :sizechoice=3 0 "L "L rebutton (list 230-:maxxmax -(:maxymax+30)) [20 20] ~ [make "hardchoice 1 drawsizebuttons] ~ :hardchoice=1 0 "1 "1 rebutton (list 260-:maxxmax -(:maxymax+30)) [20 20] ~ [make "hardchoice 2 drawsizebuttons] ~ :hardchoice=2 0 "2 "2 rebutton (list 290-:maxxmax -(:maxymax+30)) [20 20] ~ [make "hardchoice 3 drawsizebuttons] ~ :hardchoice=3 0 "3 "3 end to showminesleft if :prevmines=:nmines [stop] setpensize [2 2] penerase if :prevmines > 99 [pu seth 0 setxy :maxxmax-30 :maxymax+14 invoke word "draw int :prevmines/100 7] if :prevmines > 9 [pu seth 0 setxy :maxxmax-19 :maxymax+14 invoke word "draw int (remainder :prevmines 100)/10 7] if :prevmines > -1 [pu seth 0 setxy :maxxmax-8 :maxymax+14 invoke word "draw remainder :prevmines 10 7] penpaint if :nmines > 99 [pu seth 0 setxy :maxxmax-30 :maxymax+14 invoke word "draw int :nmines/100 7] if :nmines > 9 [pu seth 0 setxy :maxxmax-19 :maxymax+14 invoke word "draw int (remainder :nmines 100)/10 7] if :nmines > -1 [pu seth 0 setxy :maxxmax-8 :maxymax+14 invoke word "draw remainder :nmines 10 7] make "prevmines :nmines pu seth 0 setpensize [1 1] end ; --------------------------- Mark border squares ------------------------- to borderrow :row :col ; Mark all squares on this row (including -1 and :columns) as border setstatus :row :col "border if :col < 0 [stop] borderrow :row :col-1 end to bordersides :row ; Mark squares -1 and :columns on all rows as border if :row < 0 [stop] setstatus :row -1 "border setstatus :row :columns "border bordersides :row-1 end ; ---------------------- Initial and final display of entire board -------- to showboard :over ; Input is FALSE during setup, TRUE when a mine is uncovered and game ends. setpc 7 for [y -:ymax :ymax :squaresize] [pu setxy -:xmax :y pd setxy :xmax :y] for [x -:xmax :xmax :squaresize] [pu setxy :x -:ymax pd setxy :x :ymax] pu turtlerows :rows-1 end to turtlerows :row if :row < 0 [stop] turtlerow :columns-1 turtlerows :row-1 end to turtlerow :col if :col < 0 [stop] ifelse :over [ ; game over, only hidden squares need be displayed if "hidden = status :row :col [onesquare] if and ("flagged = status :row :col) (not member? (list :row :col) :mines) [ ; but indicate mistakenly flagged ones setx (:col*:squaresize)-:xmax sety (:row*:squaresize)-:ymax setpensize [3 3] setpc 4 ; draw red X over mine symbol pd setxy xcor+:squaresize ycor+:squaresize pu setx xcor-:squaresize pd setxy xcor+:squaresize ycor-:squaresize pu setpensize [1 1] setpc 7 ] ] [ ; game starting, mark each square as hidden setstatus :row :col "hidden ] turtlerow :col - 1 end to onesquare action.once setx (:col*:squaresize)-:xmax sety (:row*:squaresize)-:ymax ifelse member? (list :row :col) :mines [ setpc 2 ; thick green border pu setxy xcor+1 ycor+1 pd repeat 4 [fd :squaresize-2 rt 90] pu setxy xcor+1 ycor+1 pd filled 13 [repeat 4 [fd :squaresize-4 rt 90]] ] [ setpc 11 ; grey in aqua border for empty pu setxy xcor+1 ycor+1 pd filled 15 [repeat 4 [fd :squaresize-2 rt 90]] ] end ; ---------------- Start game by uncovering a few safe squares -------------- to hint [:tries 30] [:inference "true] if :tries=0 [stop] ; limit number of attempts localmake "ohidden :nhidden localmake "ry random :rows localmake "rx random :columns if and equalp status :ry :rx "hidden not member? (list :ry :rx) :mines [ catch "error [hitsquare :ry :rx] if (:ohidden - :nhidden) > 5 [stop] ; stop when at least 5 neighbors were opened ] (hint :tries-1) end ; -------- Main player activity, mouse clicks on minefield squares ----- to hit :pos ; Convert mouse (pixel) coordinate to column and row numbers ; (square is :squaresize x :squaresize pixels) if not :playing [stop] localmake "opening equalp :button 1 ; true to open, false to flag catch "error [hitsquare (int (((last :pos) + :ymax) / :squaresize)) (int (((first :pos) + :xmax) / :squaresize))] end to hitsquare :row :col ; Called on player mouse click and automatic opening of neighbors ; when infering. if :nhidden = 0 [stop] ; No hidden squares, game is over. if (or (:row<0) (:row>=:rows) (:col<0) (:col>=:columns)) [stop] penup setx (:col*:squaresize)-:xmax ; Move turtle over chosen square sety (:row*:squaresize)-:ymax localmake "status status :row :col localmake "near neighbors :row :col "minecheck if not equal? :status "shown [ ; Clicking on hidden or flagged square. if not :opening [showflag stop] ; FLAG mode. (Below is OPEN mode.) if :status = "flagged [showflag stop] ; Can't open flagged square. setstatus :row :col "shown ; This square is now shown. if member? (list :row :col) :mines [lose stop] ; Oops! setpc 11 ; aqua border pu setxy xcor+1 ycor+1 pd filled 15 [repeat 4 [fd :squaresize-2 rt 90]] setpensize [2 2] seth 0 pu setxy xcor+6 ycor+3 if :near>0 word "draw :near ; Run procedure to draw digit pu setpensize [1 1] seth 0 make "nhidden :nhidden - 1 ; Keep track of number of squares still hidden. if :nhidden = 0 [win stop] ; If all squares shown or flagged, we win! if and (not equal? :near 0) (not :inference) [stop] ; Finished if no automatic inference ] ; Automatic inference section: localmake "hnear neighbors :row :col "hiddencheck localmake "fnear neighbors :row :col "flaggedcheck ifelse :fnear = :near [ ; If number of neighboring mines equals localmake "opening "true ; number of flagged neighbors, hitfriends :row :col ; all hidden neighbors must be safe ; (unless player has flagged wrongly!) ] [ if (:hnear + :fnear) = :near [ ; If number of neighboring mines equals localmake "opening "false ; number of non-shown (hidden or flagged) hitfriends :row :col ; neighbors, all hidden neighbors must be ; mines. ] ] end ; --------------- Automatic inference to speed up game ------------------ ; Either OPEN or FLAG all eight immediate neighbors unless already open or ; flagged. Note mutual recursion: HITSQUARE calls HITFRIENDS to do inference; ; HITFRIENDS calls HITSQUARE for each inferred opening/flagging. to hitfriends :row :col hitfriendsrow :row-1 :col hitfriendsrow :row :col hitfriendsrow :row+1 :col end to hitfriendsrow :row :col hitfriend :row :col-1 hitfriend :row :col hitfriend :row :col+1 end to hitfriend :row :col if "hidden = status :row :col [hitsquare :row :col] end ; Here's where we count the neighbors that have some property ; (being truly mined, being flagged as mined, or being hidden). ; Third input is a procedure that takes ROW and COL inputs, ; returning 1 if property is satisfied, 0 if not. to neighbors :row :col :check output (nrow :row-1 :col) + (nrow :row :col) + (nrow :row+1 :col) end to nrow :row :col output (invoke :check :row :col-1) + (invoke :check :row :col) + ~ (invoke :check :row :col+1) end ; Here are the three property-checking procedures. to minecheck :row :col output ifelse member? (list :row :col) :mines [1] [0] end to hiddencheck :row :col output ifelse "hidden = status :row :col [1] [0] end to flaggedcheck :row :col output ifelse "flagged = status :row :col [1] [0] end ; --------------------- Flag mode (user says where mines are) -------------- to showflag if :nhidden = 0 [stop] ; Game is over, no action allowed. localmake "flagged status :row :col ifelse :flagged = "hidden [ ; Square was hidden, so flag it. if :nmines = 0 [stop] ; But don't allow more flags than actual mines. setstatus :row :col "flagged setpc 7 filled 2 [repeat 4 [fd :squaresize rt 90]] pu setxy xcor+6 ycor+3 drawflag ; with purple flag make "nmines :nmines-1 make "nhidden :nhidden-1 ] [ if not equal? :flagged "flagged [stop] ; Square was shown, can't flag it. setstatus :row :col "hidden setpc 7 filled 9 [repeat 4 [fd :squaresize rt 90]] make "nmines :nmines + 1 make "nhidden :nhidden + 1 ] if :nhidden = 0 [win] ; Flagged last mine, so win. end to drawflag setpc 13 ; purple for flag setpensize [2 2] pd fd 5 filled 13 [repeat 4 [fd 5 rt 90]] end ; ------------ Notify user when game is won or lost ------------------- to win make "playing "false make "nhidden 0 ; print [You win!!!!] pu setxy :xmax+3 0 ; flash screen green repeat 5 [setpc 2 fill wait 0 action.once setpc 0 fill wait 0] end to lose make "playing "false setpc 6 ; Yellow square on purple setpensize [3 3] pu setxy xcor+3 ycor+3 pd filled 13 [repeat 4 [fd :squaresize-6 rt 90]] ; Show which mine was hit setpensize [1 1] make "nhidden 0 ; print [You lose!!!!] pu setxy :xmax+3 0 ; flash screen red repeat 5 [setpc 4 fill wait 0 action.once setpc 0 fill wait 0] showboard "true end ; --------------- data abstraction for statuses array ------------- to status :row :col output item :col (item :row :statuses) end to setstatus :row :col :value setitem :col (item :row :statuses) :value end ; -------------------- draw digits ---------------------- to draw1 [:color 4] setpc :color ; red pd rt 90 fd 6 bk 3 lt 90 fd 12 lt 90+45 fd 4 end to draw2 [:color 13] setpc :color ; purple pu setxy xcor-1 ycor+2 pd rt 90 fd 6 bk 6 lt 45 fd 8 rt 45 pu bk 3 pd arc -180 3 end to draw3 [:color 0] setpc :color ; black pu fd 12 rt 90 pd fd 6 rt 90+45 fd 7 pu lt 45 fd 3 pd arc -130 3 end to draw4 [:color 8] setpc :color ; brown pu fd 6 pd fd 6 bk 6 rt 90 fd 6 bk 3 lt 90 fd 6 bk 12 end to draw5 [:color 10] setpc :color ; forest pu fd 12 pd rt 90 fd 6 bk 6 rt 90 fd 5 pu fd 3 pd arc -180 3 end to draw6 [:color 12] setpc :color ; salmon pu fd 7 rt 90 fd 1 pd repeat 270 [fd 0.07 rt 1] repeat 45 [fd 0.3 rt 2] end to draw7 [:color 1] setpc :color ; blue pu fd 11 rt 90 pd fd 6 rt 90+30 fd 9 end to draw8 [:color 5] setpc :color ; magenta pu fd 3 rt 90 fd 2 pd arc 359 3 pu lt 90 fd 6 pd arc 359 3 end to draw9 [:color 7] setpc :color pu fd 12 rt 90 fd 6 rt 90 ; like 6 but upside down pu fd 7 rt 90 fd 1 pd repeat 270 [fd 0.07 rt 1] repeat 45 [fd 0.3 rt 2] end to draw0 [:color 7] setpc :color pu fd 6 pd repeat 90 [fd (2-repcount/90)*6/150 rt 1] repeat 90 [fd (1+repcount/90)*6/150 rt 1] repeat 90 [fd (2-repcount/90)*6/150 rt 1] repeat 90 [fd (1+repcount/90)*6/150 rt 1] end ucblogo-6.1/csls/math0000664000175000017500000001631413557147341012751 0ustar jjcjjc;;; Logic problem inference system ;; Establish categories to category :category.name :members print (list "category :category.name :members) if not namep "categories [make "categories []] make "categories lput :category.name :categories make :category.name :members foreach :members [pprop ? "category :category.name] end ;; Verify and falsify matches to verify :a :b settruth :a :b "true end to falsify :a :b settruth :a :b "false end to settruth :a :b :truth.value if equalp (gprop :a "category) (gprop :b "category) [stop] localmake "oldvalue get :a :b if equalp :oldvalue :truth.value [stop] if equalp :oldvalue (not :truth.value) ~ [(throw "error (sentence [inconsistency in settruth] :a :b :truth.value))] print (list :a :b "-> :truth.value) store :a :b :truth.value settruth1 :a :b :truth.value settruth1 :b :a :truth.value if not emptyp :oldvalue ~ [foreach (filter [equalp first ? :truth.value] :oldvalue) [apply "settruth butfirst ?]] end to settruth1 :a :b :truth.value apply (word "find not :truth.value) (list :a :b) foreach (gprop :a "true) [settruth ? :b :truth.value] if :truth.value [foreach (gprop :a "false) [falsify ? :b] pprop :a (gprop :b "category) :b] pprop :a :truth.value (fput :b gprop :a :truth.value) end to findfalse :a :b foreach (filter [not equalp get ? :b "true] peers :a) ~ [falsify ? :b] end to findtrue :a :b if equalp (count peers :a) (1+falses :a :b) ~ [verify (find [not equalp get ? :b "false] peers :a) :b] end to falses :a :b output count filter [equalp "false get ? :b] peers :a end to peers :a output thing gprop :a "category end ;; Common types of clues to differ :list print (list "differ :list) foreach :list [differ1 ? ?rest] end to differ1 :a :them foreach :them [falsify :a ?] end to justbefore :this :that :lineup falsify :this :that falsify :this last :lineup falsify :that first :lineup justbefore1 :this :that :lineup end to justbefore1 :this :that :slotlist if emptyp butfirst :slotlist [stop] equiv :this (first :slotlist) :that (first butfirst :slotlist) justbefore1 :this :that (butfirst :slotlist) end ;; Remember conditional linkages to implies :who1 :what1 :truth1 :who2 :what2 :truth2 implies1 :who1 :what1 :truth1 :who2 :what2 :truth2 implies1 :who2 :what2 (not :truth2) :who1 :what1 (not :truth1) end to implies1 :who1 :what1 :truth1 :who2 :what2 :truth2 localmake "old1 get :who1 :what1 if equalp :old1 :truth1 [settruth :who2 :what2 :truth2 stop] if equalp :old1 (not :truth1) [stop] if memberp (list :truth1 :who2 :what2 (not :truth2)) :old1 ~ [settruth :who1 :what1 (not :truth1) stop] if memberp (list :truth1 :what2 :who2 (not :truth2)) :old1 ~ [settruth :who1 :what1 (not :truth1) stop] store :who1 :what1 ~ fput (list :truth1 :who2 :what2 :truth2) :old1 end to equiv :who1 :what1 :who2 :what2 implies :who1 :what1 "true :who2 :what2 "true implies :who2 :what2 "true :who1 :what1 "true end to xor :who1 :what1 :who2 :what2 implies :who1 :what1 "true :who2 :what2 "false implies :who1 :what1 "false :who2 :what2 "true end ;; Interface to property list mechanism to get :a :b output gprop :a :b end to store :a :b :val pprop :a :b :val pprop :b :a :val end ;; Print the solution to solution foreach thing first :categories [solve1 ? butfirst :categories] end to solve1 :who :order type :who foreach :order [type "| | type gprop :who ?] print [] end ;; Get rid of old problem data to cleanup if not namep "categories [stop] ern :categories ern "categories erpls end ;; Anita Harnadek's problem to cub.reporter cleanup category "first [Jane Larry Opal Perry] category "last [Irving King Mendle Nathan] category "age [32 38 45 55] category "job [drafter pilot sergeant driver] differ [Jane King Larry Nathan] says "Jane "Irving 45 says "King "Perry "driver says "Larry "sergeant 45 says "Nathan "drafter 38 differ [Mendle Jane Opal Nathan] says "Mendle "pilot "Larry says "Jane "pilot 45 says "Opal 55 "driver says "Nathan 38 "driver print [] solution end to says :who :what1 :what2 print (list "says :who :what1 :what2) xor :who :what1 :who :what2 end ;; Diane Baldwin's problem to foote.family cleanup category "when [1st 2nd 3rd 4th 5th] category "name [Felix Fred Frank Francine Flo] category "street [Field Flag Fig Fork Frond] category "item [food film flashlight fan fiddle] category "position [1 2 3 4 5] print [Clue 1] justbefore "Flag "2nd :position justbefore "2nd "Fred :position print [Clue 2] male [film Fig 5th] print [Clue 3] justbefore "flashlight "Fork :position justbefore "Fork "1st :position female [1st] print [Clue 4] falsify "5th "Frond falsify "5th "fan print [Clue 5] justbefore "Francine "Frank :position justbefore "Francine "Frank :when print [Clue 6] female [3rd Flag] print [Clue 7] justbefore "fiddle "Frond :when justbefore "Flo "fiddle :when print [] solution end to male :stuff differ sentence :stuff [Francine Flo] end to female :stuff differ sentence :stuff [Felix Fred Frank] end ;;; Combinatorics toolkit to combs :list :howmany if equalp :howmany 0 [output [[]]] if equalp :howmany count :list [output (list :list)] output sentence (map [fput first :list ?] combs (butfirst :list) (:howmany-1)) ~ (combs (butfirst :list) :howmany) end to fact :n output cascade :n [# * ?] 1 end to perms :n :r if equalp :r 0 [output 1] output :n * perms :n-1 :r-1 end to choose :n :r output (perms :n :r)/(fact :r) end ;; The socks problem to socks :list localmake "total combs (expand :list) 2 localmake "matching filter [equalp first ? last ?] :total print (sentence [there are] count :total [possible pairs of socks.]) print (sentence [of these,] count :matching [are matching pairs.]) print sentence [probability of match =] ~ word (100 * (count :matching)/(count :total)) "% end to expand :list if emptyp :list [output []] if numberp first :list ~ [output cascade (first :list) [fput first butfirst :list ?] (expand butfirst butfirst :list)] output fput first :list expand butfirst :list end to socktest localmake "first pick [brown brown brown brown brown brown blue blue blue blue] localmake "second ~ pick (ifelse equalp :first "brown ~ [[brown brown brown brown brown blue blue blue blue]] ~ [[brown brown brown brown brown brown blue blue blue]]) output equalp :first :second end ;; The Simplex lock problem to lock :buttons output cascade :buttons [? + lock1 :buttons #] 1 end to lock1 :total :buttons localmake "perms perms :total :buttons output cascade (twoto (:buttons-1)) [? + lock2 :perms #-1 1] 0 end to lock2 :perms :links :factor if equalp :links 0 [output :perms/(fact :factor)] if equalp (remainder :links 2) 0 ~ [output lock2 :perms/(fact :factor) :links/2 1] output lock2 :perms (:links-1)/2 :factor+1 end to twoto :power output cascade :power [2 * ?] 1 end to simplex :buttons output 2 * f :buttons end to f :n if equalp :n 0 [output 1] output cascade :n [? + ((choose :n (#-1)) * f (#-1))] 0 end to simp :n output round (fact :n)/(power (ln 2) (:n+1)) end ;; The multinomial expansion problem to t :n :k if equalp :k 0 [output 1] if equalp :n 0 [output 0] output (t :n :k-1)+(t :n-1 :k) end ucblogo-6.1/csls/match0000664000175000017500000000667513557147341013125 0ustar jjcjjcto match :pat :sen local [special.var special.pred special.buffer in.list] if or wordp :pat wordp :sen [output "false] if emptyp :pat [output emptyp :sen] if listp first :pat [output special fput "!: :pat :sen] if memberp first first :pat [? # ! & @ ^] [output special :pat :sen] if emptyp :sen [output "false] if equalp first :pat first :sen [output match butfirst :pat butfirst :sen] output "false end ;; Parsing quantifiers to special :pat :sen set.special parse.special butfirst first :pat " output run word "match first first :pat end to parse.special :word :var if emptyp :word [output list :var "always] if equalp first :word ": [output list :var butfirst :word] output parse.special butfirst :word word :var first :word end to set.special :list make "special.var first :list make "special.pred last :list if emptyp :special.var [make "special.var "special.buffer] if memberp :special.pred [in anyof] [set.in] if not emptyp :special.pred [stop] make "special.pred first butfirst :pat make "pat fput first :pat butfirst butfirst :pat end to set.in make "in.list first butfirst :pat make "pat fput first :pat butfirst butfirst :pat end ;; Exactly one match to match! if emptyp :sen [output "false] if not try.pred [output "false] make :special.var first :sen output match butfirst :pat butfirst :sen end ;; Zero or one match to match? make :special.var [] if emptyp :sen [output match butfirst :pat :sen] if not try.pred [output match butfirst :pat :sen] make :special.var first :sen if match butfirst :pat butfirst :sen [output "true] make :special.var [] output match butfirst :pat :sen end ;; Zero or more matches to match# make :special.var [] output #test #gather :sen end to #gather :sen if emptyp :sen [output :sen] if not try.pred [output :sen] make :special.var lput first :sen thing :special.var output #gather butfirst :sen end to #test :sen if match butfirst :pat :sen [output "true] if emptyp thing :special.var [output "false] output #test2 fput last thing :special.var :sen end to #test2 :sen make :special.var butlast thing :special.var output #test :sen end ;; One or more matches to match& output &test match# end to &test :tf if emptyp thing :special.var [output "false] output :tf end ;; Zero or more matches (as few as possible) to match^ make :special.var [] output ^test :sen end to ^test :sen if match butfirst :pat :sen [output "true] if emptyp :sen [output "false] if not try.pred [output "false] make :special.var lput first :sen thing :special.var output ^test butfirst :sen end ;; Match words in a group to match@ make :special.var :sen output @test [] end to @test :sen if @try.pred [if match butfirst :pat :sen [output "true]] if emptyp thing :special.var [output "false] output @test2 fput last thing :special.var :sen end to @test2 :sen make :special.var butlast thing :special.var output @test :sen end ;; Applying the predicates to try.pred if listp :special.pred [output match :special.pred first :sen] output run list :special.pred quoted first :sen end to quoted :thing if listp :thing [output :thing] output word "" :thing end to @try.pred if listp :special.pred [output match :special.pred thing :special.var] output run list :special.pred thing :special.var end ;; Special predicates to always :x output "true end to in :word output memberp :word :in.list end to anyof :sen output anyof1 :sen :in.list end to anyof1 :sen :pats if emptyp :pats [output "false] if match first :pats :sen [output "true] output anyof1 :sen butfirst :pats end ucblogo-6.1/csls/master0000664000175000017500000002731213557147341013313 0ustar jjcjjc; [Mastermind game] cslsload "buttons cslsload "streams to master [:numsquares 4] [:dup.ok "false] [:mysecret "true] ; Mastermind game program. ; Program is controlled by mouse clicks or keystrokes. if :LogoPlatform = "Windows [maximize.window "true] window if :LogoPlatform = "wxWidgets [localmake "fontsize labelsize] localmake "colors "ROYGBV localmake "colornums [[R 4] [O 14] [Y 6] [G 2] [B 1] [V 13]] localmake "exact "true local [numguesses numcolors column guess gotnum winloop permuting] local [perms oldcount newcount guess.exact guess.inexact guess.word] catch "quit [forever [ catch "master [ make "numguesses 0 make "numcolors 0 make "column 0 make "winloop "false initdraw ; Clear screen, draw color palette ifelse :mysecret [ ifelse :dup.ok ; Choose secret permutation [make "secret (choose.dup :numsquares :colors)] [make "secret (choose.nodup :numsquares :colors)] newguess ; Display first guess frame action.loop ; Read keyboard characters or mouse clicks ] [ catch "win [ ; User's secret, program has to guess. ifelse :dup.ok [ make "permuting "false ; Lots of cases with dups okay, so make "perms (list copies :numsquares "x) make "newcount 0 ; find colors systematically first. catch "perm [ for [i 1 6] [ ; Learn how many red, then orange, etc. make "oldcount :newcount doguess subst :i "x head :perms make "newcount :guess.exact + :guess.inexact make "perms flatten stream.map `[insert ,[:newcount-:oldcount] ,:i ?] :perms make "perms stream.filter `[okay? ? ,:guess.exact ,:guess.inexact ,:guess.word] :perms check.consistency :perms if equalp :newcount :numsquares [throw "perm] ] check.consistency [] ; Tried all colors, user lied. ] make "permuting "true ] [ make "perms perms "123456 :numsquares ; not :dup.ok make "permuting equalp :numsquares 6 ] forever [ ; common portion doguess head :perms if equalp :numsquares :guess.exact + :guess.inexact ~ [make "permuting "true] make "perms stream.filter `[okay? ? ,:guess.exact ,:guess.inexact ,:guess.word] :perms check.consistency :perms ] ; Can't get here; either doguess finds a winner or ; check.consistency complains. ] ; We get here on throw "win from doguess. move [15 12] setpc 7 label "WIN! ct print (sentence [I win in] :numguesses "turns.) make "winloop "true action.loop ] ]]] cs ct setpc 7 st end ;;; ================== LOGIC FOR MY GUESSES (USER SECRET) ================= to doguess :guessword ; Present computer's guess to user and ask about matches. newguess ; Draw frame for guess. make "guess.word :guessword ; Remember my colors. foreach :guessword [apply "putguess item ? :colornums] ; Show colors. askexact ; Ask user for exact matches. make "gotnum "false catch "ready [action.loop] pu setpos [150 205] setpc 0 filled 0 [repeat 2 [fd 35 rt 90 fd 110 rt 90]] setpc 7 ifelse :guess.exact < :numsquares [ ; Not all colors are exact. ifelse :permuting [ ; If we know all the colors, make "exact "false ; compute how many are inexact getnum :numsquares-:guess.exact ; without asking. ] [ askinexact ; Otherwise, ask for inexact. make "gotnum "false catch "ready [action.loop] pu setpos [150 205] setpc 0 filled 0 [repeat 2 [fd 35 rt 90 fd 110 rt 90]] setpc 7 if :guess.exact + :guess.inexact > :numsquares ~ [check.consistency []] ; Quick error message if too many matches. ] ] [ throw "win ; All colors are exact, we win. ] end to subst :new :old :word ; For dups-okay guessing: Substitute the next trial color for ; all unknown squares in a partial permutation. output map [ifelse equalp ? :old [:new] [?]] :word end to copies :num :letter output cascade :num [word ? :letter] " end to insert :num :new :word ; For dups-okay guessing: We've learned that there are :NUM instances ; of color :NEW in the secret combination, so stick that many of them into ; a still-possible partial permutation, in every possible size=:NUM ; subset of the unknown slots. ; The result is a *stream* of possible (partial) permutations. if :num=0 [output (list :word)] ; No slots needed, just one result. if emptyp :word [output []] ; Not enough slots, no results! if equalp first :word "x ; Else combine results of choosing or ~ [op flatten ; not choosing to replace into this X. stream insert :num-1 :new word :new butfirst :word `[(list stream.map [word "x ?] insert ,:num ",:new bf ",:word )]] output stream.map `[word ",[first :word] ?] insert :num :new butfirst :word end to check.consistency :str ; If the stream of still-possible permutations is empty, then ; the user has lied to us. if emptyp :str [ct print [Error -- inconsistent answers!] repeat 2 [setbg 4 wait 1 setbg 0 wait 1] type [Click or type anything to restart.] wait 0 waitforclick throw "master] end to perms :word :num ; Output the stream of permutations of :NUM letters chosen from :WORD. if :num=0 [output (list "|| )] if emptyp :word [output []] ; Can't happen (would mean :num>count :word). output flatten stream.map ~ `[[letter] stream.map `[word ,:letter ?] perms remonce :letter ,:word ,[:num-1]] ~ :word end to okay? :perm :guess.exact :guess.inexact :guess.word output and (equalp :guess.exact exact :perm :guess.word) ~ (equalp :guess.inexact inexact :perm :guess.word) end to askexact ; ct type "|How many EXACT matches? | ; pu setpos [185 210] setpc 6 label "EXACT? localmake "caption.scrunch 1.5 setbutton [152 210] [100 25] [] "true 0 "EXACT? [] ern "caption.scrunch make "exact "true end to askinexact ; ct type "|How many INEXACT matches? | ; pu setpos [185 210] setpc 6 label "INEXACT? localmake "caption.scrunch 1.5 setbutton [152 210] [100 25] [] "true 0 "INEXACT? [] ern "caption.scrunch make "exact "false end ;;; ================== LOGIC FOR USER GUESSES (MY SECRET) ================= to choose.dup :number :colors if :number = 0 [output "] output word (pick :colors) (choose.nodup :number-1 :colors) end to choose.nodup :number :colors if :number = 0 [output "] make "color pick :colors output word :color (choose.nodup :number-1 remonce :color :colors) end ;;;;; ================ Used by both kinds of logic ====================== to exact :secret :guess if empty? :secret [output 0] output ehelp + (exact butfirst :secret butfirst :guess) end to ehelp ifelse equal? (first :secret) (first :guess) [output 1] [output 0] end to inexact :secret :guess output (anymatch :secret :guess) - (exact :secret :guess) end to anymatch :secret :guess if empty? :secret [output 0] if member? first :secret :guess ~ [output 1 + anymatch (butfirst :secret) (remonce first :secret :guess)] output anymatch butfirst :secret :guess end to remonce :this :those if empty? :those [output "] if equal? :this first :those [output butfirst :those] output word (first :those) (remonce :this butfirst :those) end ;;;;; =================== USER INTERFACE (DRAWING) ======================= to initdraw fs init.buttons localmake "bigwidth ifelse :LogoPlatform = "wxWidgets [5*first :fontsize] [40] localmake "bigbutton list :bigwidth 25 localmake "tallheight ifelse :LogoPlatform="wxWidgets [2+2*last :fontsize] [30] localmake "tallbutton list :bigwidth :tallheight ifelse :mysecret ~ [colorchart 6 "ROYGBV [4 14 6 2 1 13] 165 setbutton [-245 -15] :bigbutton [clear] "false 0 "erase "DEL] ~ [numchart 0 165] setbutton pos0 [-245 -45] :bigbutton [if not :winloop [guess]] "true 0 "OK "RET setbutton nxt :tallheight :tallbutton [throw "master] "false 0 [new game] "N setbutton nxt 25 :bigbutton [throw "quit] "false 0 "quit "Q ignore nxt 10 setbutton nxt :tallheight :tallbutton [make "mysecret "true throw "master] ~ :mysecret 0 [I guess] "I setbutton nxt :tallheight :tallbutton [make "mysecret "false throw "master] ~ (not :mysecret) 0 [Logo guess] "L caption [-245 206] [65 29] [Number |of colors:|] numsquares -170 2 6 caption [-10 206] [65 29] [Duplicates allowed:] ifelse :LogoPlatform = "wxWidgets [ localmake "buttonx ((first :fontsize)*10)-5 setbutton list :buttonx 210 [25 25] [make "dup.ok "true throw "master] ~ :dup.ok 0 "yes [] setbutton list :buttonx+30 210 [25 25] [make "dup.ok "false throw "master] ~ (not :dup.ok) 0 "no [] ] [ setbutton [70 210] [25 25] [make "dup.ok "true throw "master] ~ :dup.ok 0 "yes [] setbutton [100 210] [25 25] [make "dup.ok "false throw "master] ~ (not :dup.ok) 0 "no [] ] end to numsquares :xcor :num :last if :num > :last [stop] setbutton (list :xcor 210) [25 25] `[make "numsquares ,:num throw "master] ~ (:num = :numsquares) 0 :num [] numsquares :xcor+30 :num+1 :last end to colorchart :num :names :colors :ycor if :num = 0 [stop] setbutton (list -245 :ycor) [25 25] ~ `[putguess ",[first :names] ,[first :colors]] "false ~ (first :colors) [] (first :names) colorchart :num-1 bf :names bf :colors :ycor-30 end to numchart :num :ycor if :num > :numsquares [stop] setbutton (list -245 :ycor) [25 25] ~ `[if not :winloop [getnum ,:num]] "false 0 :num :num numchart :num+1 :ycor-30 end to pos0 :pos make "controlpos :pos output :pos end to nxt :height make "controlpos list (first :controlpos) ((last :controlpos) - (:height + 5)) output :controlpos end to move :start ; Move the turtle to the given coordinates ; relative to the lower left corner of the first empty square ; in the current frame. ; Depends on :COLUMN (0 or 1 for >14 guesses), :NUMGUESSES, and :NUMCOLORS ; Note, since :NUMGUESSES starts at 1, ; first frame is at [-180 170] not [-180 200]. pu setpos (list (-145 + (first :start) + 210*:column + 25*(:numcolors-1)) (200 + (last :start) - 30*(:numguesses - 14*:column))) pd end ; ----------------------------------------------- to newguess ; Called from MASTER for first guess frame, ; then from GUESS for later guess frames (my secret), ; or from DOGUESS (user's secret). make "numguesses :numguesses+1 if :numguesses > 14 [make "column 1] make "numcolors 1 move [0 0] drawframe make "guess " end to drawframe setpc 7 seth 0 repeat :numsquares [square 25 rt 90 fd 25 lt 90] end to square :side repeat 4 [fd :side rt 90] end ;;;;; =================== USER INTERFACE (READING) ======================= to waitforclick action.off ; Wait for any key or mouse click, then return, ignoring which/where. if buttonp [while [buttonp] [] stop] if keyp [ignore rc stop] waitforclick end ; ----------- Procedures to carry out user commands --------------- to getnum :num [:cursor cursor] ; Called for digit key or mouse click on digit button. make ifelse :exact ["guess.exact] ["guess.inexact] :num move list ifelse :exact [15] [35] 12 setpc 0 filled 0 [repeat 4 [fd 20 rt 90]] setpc 7 label :num ; type :num setcursor :cursor make "gotnum "true end to putguess :colorletter :colornumber ; Called from mouse click in color palette; ; first input is a letter for :GUESS (e.g. R for red), ; second input is a Logo color number for SETPC (e.g. 4 for red). if :numcolors < 1 [stop] if :numcolors > :numsquares [stop] if not :dup.ok [if member? :colorletter :guess [stop]] make "guess word :guess :colorletter move [0 0] filled :colornumber [repeat 4 [fd 25 rt 90]] make "numcolors :numcolors+1 end to clear ; Called by clicking ERASE button if :numcolors < 2 [stop] make "guess butlast :guess make "numcolors :numcolors-1 move [0 0] filled 0 [repeat 4 [fd 25 rt 90]] end to guess ; Called by clicking GUESS button. if not :mysecret [if :gotnum [ct wait 0 throw "ready] stop] if not (:numcolors > :numsquares) [stop] ifelse equal? :guess :secret [ move [15 12] setpc 7 label "WIN! print (sentence [You win in] :numguesses "turns.) ] [ move [15 12] setpc 7 label exact :secret :guess move [35 12] setpc 7 label inexact :secret :guess newguess ] end ucblogo-6.1/csls/fsm0000664000175000017500000002336413557147341012610 0ustar jjcjjc;;; Finite State Machine Interpreter (FSM) to game :which fsm thing word "mach :which end to fsm :machine cleartext setcursor [0 3] localmake "start startpart :machine localmake "moves movepart :machine localmake "accept acceptpart :machine fsm1 :start end to fsm1 :here ifelse memberp :here :accept [accept] [reject] fsm1 (fsmnext :here readchar) end to fsmnext :here :input blank if memberp :input (list char 13 char 10) ~ [print ifelse memberp :here :accept ["| ACCEPT|] ["| REJECT|] output :start] type :input catch "error [output last find [fsmtest :here :input ?] :moves] output -1 end to fsmtest :here :input :move output and (equalp :here arrowtail :move) (memberp :input arrowtext :move) end ;; Display machine state to accept display "accept end to reject display "reject end to blank display "| | end to display :text localmake "oldpos cursor setcursor [15 1] type :text setcursor :oldpos end ;; Data abstraction for machines to startpart :machine output first :machine end to movepart :machine output first bf :machine end to acceptpart :machine output last :machine end to make.machine :start :moves :accept output (list :start :moves :accept) end ;; Data abstraction for arrows to arrowtail :arrow output first :arrow end to arrowtext :arrow output first butfirst :arrow end to arrowhead :arrow output last :arrow end to make.arrow :tail :text :head output (list :tail :text :head) end ;; Machine descriptions for the guessing game make "mach1 [1 [[1 AB 1]] [1]] make "mach2 [1 [[1 ABC 2] [2 ABC 1]] [1]] make "mach3 [1 [[1 A 2] [2 B 3] [3 ABC 3]] [3]] make "mach4 [1 [[1 A 2] [1 B 3] [1 C 4] [2 A 1] [3 B 1] [4 C 1]] [1]] make "mach5 [1 [[1 ABC 2] [2 B 1]] [1]] make "mach6 [1 [[1 A 2] [2 AB 2] [2 C 3] [3 AB 2] [3 C 3]] [3]] make "mach7 [1 [[1 AB 1] [1 C 2] [2 C 1]] [1]] make "mach8 [1 [[1 A 2] [1 BC 1] [2 A 1] [2 BC 2]] [1]] make "mach9 [1 [[1 AB 1] [1 C 2] [2 A 3] [2 B 1] [3 A 1]] [1]] make "mach10 [1 [[1 A 2] [1 BC 1] [2 A 2] [2 B 3] [2 C 1] [3 A 2] [3 B 1] [3 C 4] [4 A 2] [4 B 5] [4 C 1] [5 A 6] [5 BC 1] [6 ABC 6]] [6]] ;;; Regular Expression to FSM Translation (MACHINE) to machine :regexp localmake "nextstate 0 output optimize determine nondet :regexp end ;; First step: make a possibly nondeterministic machine to nondet :regexp if and (wordp :regexp) (equalp count :regexp 1) [output ndletter :regexp] if wordp :regexp [output ndor reduce "sentence :regexp] if equalp first :regexp "or [output ndor butfirst :regexp] if equalp first :regexp "* [output ndmany last :regexp] output ndconcat :regexp end ;; Alphabet rule to ndletter :letter localmake "from newstate localmake "to newstate output make.machine :from (list (make.arrow :from :letter :to)) (list :to) end ;; Concatenation rule to ndconcat :exprs output reduce "string (map "nondet :exprs) end to string :machine1 :machine2 output (make.machine (startpart :machine1) (sentence (movepart :machine1) (splice acceptpart :machine1 :machine2) (movepart :machine2)) (stringa (acceptpart :machine1) (startpart :machine2) (acceptpart :machine2))) end to stringa :accept1 :start2 :accept2 if memberp :start2 :accept2 [output sentence :accept1 :accept2] output :accept2 end ;; Alternatives rule to ndor :exprs localmake "newstart newstate localmake "machines (map "nondet :exprs) localmake "accepts map.se "acceptpart :machines output (make.machine :newstart (sentence map.se "movepart :machines map.se "or.splice :machines) ifelse not emptyp find [memberp (startpart ?) (acceptpart ?)] :machines [fput :newstart :accepts] [:accepts]) end to or.splice :machine output map [newtail ? :newstart] (arrows.from.start :machine) end ;; Repetition rule to ndmany :regexp localmake "machine nondet :regexp output (make.machine (startpart :machine) sentence (movepart :machine) (splice (acceptpart :machine) :machine) fput (startpart :machine) (acceptpart :machine)) end ;; Generate moves from a bunch of given states (:accepts) duplicating ;; the moves from the start state of some machine (:machine). ;; Used for concatenation rule to splice two formerly separate machines; ;; used for repetition rule to "splice" a machine to itself. to splice :accepts :machine output map.se [copy.to.accepts ?] (arrows.from.start :machine) end to arrows.from.start :machine output filter [equalp startpart :machine arrowtail ?] movepart :machine end to copy.to.accepts :move output map [newtail :move ?] :accepts end to newtail :arrow :tail output make.arrow :tail (arrowtext :arrow) (arrowhead :arrow) end ;; Make a new state number to newstate make "nextstate :nextstate+1 output :nextstate end ;; Second step: Turn nondeterministic FSM into a deterministic one ;; Also eliminates "orphan" (unreachable) states. to determine :machine localmake "moves movepart :machine localmake "accepts acceptpart :machine localmake "states [] localmake "join.state.list [] localmake "newmoves nd.traverse (startpart :machine) output make.machine (startpart :machine) ~ :newmoves ~ filter [memberp ? :states] :accepts end to nd.traverse :state if memberp :state :states [output []] make "states fput :state :states localmake "newmoves (check.nd filter [equalp arrowtail ? :state] :moves) output sentence :newmoves map.se "nd.traverse (map "arrowhead :newmoves) end to check.nd :movelist if emptyp :movelist [output []] localmake "letter arrowtext first :movelist localmake "heads sort map "arrowhead ~ filter [equalp :letter arrowtext ?] :movelist if emptyp butfirst :heads ~ [output fput first :movelist check.nd filter [not equalp :letter arrowtext ?] :movelist] localmake "check.heads member :heads :join.state.list if not emptyp :check.heads ~ [output fput make.arrow :state :letter first butfirst :check.heads ~ check.nd filter [not equalp :letter arrowtext ?] :movelist] localmake "join.state newstate make "join.state.list fput :heads fput :join.state :join.state.list make "moves sentence :moves ~ map [make.arrow :join.state arrowtext ? arrowhead ?] ~ filter [memberp arrowtail ? :heads] :moves if not emptyp find [memberp ? :accepts] :heads ~ [make "accepts sentence :accepts :join.state] output fput make.arrow :state :letter :join.state ~ check.nd filter [not equalp :letter arrowtext ?] :movelist end to sort :list if emptyp :list [output []] output insert first :list sort butfirst :list end to insert :value :sorted if emptyp :sorted [output (list :value)] if :value = first :sorted [output :sorted] if :value < first :sorted [output fput :value :sorted] output fput first :sorted insert :value butfirst :sorted end ;; Third step: Combine redundant states. ;; Also combines arrows with same head and tail: [1 A 2] [1 B 2] -> [1 AB 2]. to optimize :machine localmake "stubarray array :nextstate foreach (movepart :machine) "array.save localmake "states sort fput (startpart :machine) ~ map "arrowhead movepart :machine localmake "start startpart :machine foreach reverse :states [optimize.state ? ?rest] output (make.machine :start map.se [fix.arrows ? item ? :stubarray] :states filter [memberp ? :states] acceptpart :machine) end to array.save :move setitem (arrowtail :move) :stubarray ~ stub.add (arrow.stub :move) (item (arrowtail :move) :stubarray) end to stub.add :stub :stublist if emptyp :stublist [output (list :stub)] if (stub.head :stub) < (stub.head first :stublist) ~ [output fput :stub :stublist] if (stub.head :stub) = (stub.head first :stublist) ~ [output fput make.stub letter.join (stub.text :stub) (stub.text first :stublist) stub.head :stub butfirst :stublist] output fput first :stublist (stub.add :stub butfirst :stublist) end to letter.join :this :those if emptyp :those [output :this] if beforep :this first :those [output word :this :those] output word (first :those) (letter.join :this butfirst :those) end to optimize.state :state :others localmake "candidates filter (ifelse memberp :state acceptpart :machine [[memberp ? acceptpart :machine]] [[not memberp ? acceptpart :machine]]) ~ :others localmake "mymoves item :state :stubarray localmake "twin find [equalp (item ? :stubarray) :mymoves] :candidates if emptyp :twin [stop] make "states remove :state :states if equalp :start :state [make "start :twin] foreach :states ~ [setitem ? :stubarray (cascade [emptyp ?2] [stub.add (change.head :state :twin first ?2) ?1] filter [not equalp stub.head ? :state] item ? :stubarray [butfirst ?2] filter [equalp stub.head ? :state] item ? :stubarray)] end to change.head :from :to :stub if not equalp (stub.head :stub) :from [output :stub] output list (stub.text :stub) :to end to fix.arrows :state :stublist output map [stub.arrow :state ?] :stublist end ;; Data abstraction for "stub" arrow (no tail) to arrow.stub :arrow output butfirst :arrow end to make.stub :text :head output list :text :head end to stub.text :stub output first :stub end to stub.head :stub output last :stub end to stub.arrow :tail :stub output fput :tail :stub end ucblogo-6.1/csls/format0000664000175000017500000000536213557147341013311 0ustar jjcjjcto format :from :to openread :from openwrite :to setread :from setwrite :to init.vars loop setread [] setwrite [] close :from close :to end to init.vars make "pageheight 66 make "topmar 6 make "lines 54 make "leftmar 7 make "width 65 make "filltab 5 make "nofilltab 0 make "parskip 1 make "spacing 1 make "started "false make "filling "true make "printed 0 make "inline [] end to loop forever [if process nextword [stop]] end ;; Add a word to the output file, starting a new line if necessary to process :word if listp :word [output "true] if not :started [start] if (:linecount+1+count :word) > :width [putline] addword :word output "false end to addword :word if not emptyp :line [make "linecount :linecount+1] make "line lput :word :line make "linecount :linecount+count :word end to putline repeat :leftmar+:indent [type "| |] putwords :line ((count :line)-1) (:width-:linecount) newline skip :spacing end to putwords :line :spaces :filler local "perword if emptyp :line [stop] type first :line make "perword ifelse :spaces > 0 [int ((:filler+:spaces-1)/:spaces)] [0] if :filler > 0 [repeat :perword [type "| |]] type "| | putwords (butfirst :line) (:spaces-1) (:filler-:perword) end ;; Get the next input word, reading a new line if necessary to nextword if not emptyp :inline [output extract.word] if not :filling [break] make "inline readword if listp :inline [break output []] if emptyp :inline [break output nextword] if equalp first :inline "|*| ~ [run butfirst :inline make "inline "] make "inline skipspaces :inline output nextword end to extract.word local "result make "result firstword :inline make "inline skipfirst :inline output :result end to firstword :word if emptyp :word [output "] if equalp first :word "| | [output "] output word (first :word) (firstword butfirst :word) end to skipfirst :word if emptyp :word [output "] if equalp first :word "| | [output skipspaces :word] output skipfirst butfirst :word end to skipspaces :word if emptyp :word [output "] if equalp first :word "| | [output skipspaces butfirst :word] output :word end ;; Formatting helpers to start make "started "true repeat :topmar [print []] newindent end to newindent newline make "indent ifelse :filling [:filltab] [:nofilltab] make "linecount :indent end to newline make "line [] make "indent 0 make "linecount 0 end to break if emptyp :line [stop] make "linecount :width putline newindent if :filling [skip :parskip] end ;; Formatting commands to be invoked by the user to skip :howmany break repeat :howmany [print []] make "printed :printed+:howmany if :printed < :lines [stop] repeat :pageheight-:printed [print []] make "printed 0 end to nofill break make "filling "false newindent end to yesfill break if not :filling [skip :parskip] make "filling "true newindent end ucblogo-6.1/csls/dotgame0000664000175000017500000002077713557147341013450 0ustar jjcjjc;;; Connect-the-dots game to dotgame :size ; Connect-the-dots game. Input is the number of dots on each side. if :LogoPlatform = "Windows [maximize.window "true] ht cs setpc 7 setpensize [6 6] localmake "offset (:size-1)*20 pu setpos list -:offset -:offset board :size localmake "lines ~ se (crossmap [list (list ?1 ?2) (list ?1 1+?2)] (iseq 0 :size-1) (iseq 0 :size-2)) ~ (crossmap [list (list ?1 ?2) (list 1+?1 ?2)] (iseq 0 :size-2) (iseq 0 :size-1)) localmake "computer 0 localmake "person 0 localmake "numboxes (:size-1)*(:size-1) localmake "boxlists (array 5 0) localmake "oldmove [] for [i 1 4] [setitem :i :boxlists []] setitem 0 :boxlists ~ (crossmap [list ?1 ?2] (iseq 0 :size-2) (iseq 0 :size-2)) localmake "boxes (array :size-1 0) for [i 0 :size-2] [setitem :i :boxes (array :size-1 0)] CATCH "WIN [FOREVER [PERSONMOVE COMMOVE]] ; play the game! if not emptyp :oldmove [ ; make the last move white setpc 7 pu setpos map [40*? - :offset] first :oldmove pd setpos map [40*? - :offset] last :oldmove ] if computer > :person ~ [print (se [you lost] :computer "to :person)] if :computer < :person ~ [print (se [you won] :person "to :computer)] if :computer = :person [print (se [tie game])] setpensize [1 1] end ; --------------- Initial board display ------------------------- to board :num repeat :num [dots :num] end to dots :num pd repeat :num [fd 0 pu rt 90 fd 40 lt 90 pd] pu lt 90 fd 40 * :num rt 90 fd 40 end ; -------------- Human player's move --------------------- to personmove ; Read a mouse click, turn it into a move if legal. localmake "move gmove if not legal? :move [print [Not a legal move! Try again.] personmove stop] drawline :move 6 localmake "direction reverse (map "difference (last :move) (first :move)) localmake "found "false fillboxes 6 "person if :found [personmove] end to gmove while [not buttonp] [] while [buttonp] [] output findline (map [? + :offset] mousepos) end to findline :pos ; Find the nearest vertical or horizontal line to the mouse click. localmake "xrem remainder (first :pos)+10 40 localmake "yrem remainder (last :pos)+10 40 localmake "xpos (first :pos)+10-:xrem localmake "ypos (last :pos)+10-:yrem if :xrem > :yrem ~ [output list (list :xpos/40 :ypos/40) (list :xpos/40+1 :ypos/40)] output list (list :xpos/40 :ypos/40) (list :xpos/40 :ypos/40+1) end to legal? :move ; Output true if this is an undrawn line segment connecting two dots. output memberp :move :lines end ; ----------------- Computer's move ---------------------- to commove ; The computer chooses a move, does the housekeeping for it. ; Strategy: complete boxes if possible, otherwise pick a move that doesn't ; let the opponent complete a box. ifelse not emptyp (item 3 :boxlists) [ localmake "move lastline first (item 3 :boxlists) ] [ localmake "goodlines filter "lineokay? :lines ifelse not emptyp :goodlines [ localmake "move pick :goodlines ] [ localmake "cohorts [] makecohorts :lines localmake "move lastline first smallest :cohorts ] ] drawline :move 4 localmake "direction reverse (map "difference (last :move) (first :move)) localmake "found "false fillboxes 4 "computer if :found [commove] end to lineokay? :move ; Output true if this move won't let the opponent complete a box. localmake "direction reverse (map "difference (last :move) (first :move)) output and (boxokay? first :move) ~ (boxokay? (map "difference (first :move) :direction)) end to boxokay? :box ; Output true if this box has fewer than 2 edges already drawn. if or ((first :box) < 0) ((last :box) < 0) [output "true] if or ((first :box) > (:size-2)) ((last :box) > (:size-2)) [output "true] localmake "count item (last :box) item (first :box) :boxes if emptyp :count [make "count 0] output :count<2 end to lastline :box ; Box has three lines drawn; find the missing one for us to draw. if memberp (list :box (map "sum :box [0 1])) :lines [ output (list :box (map "sum :box [0 1]))] if memberp (list :box (map "sum :box [1 0])) :lines [ output (list :box (map "sum :box [1 0]))] if memberp (list (map "sum :box [0 1]) (map "sum :box [1 1])) :lines [ output (list (map "sum :box [0 1]) (map "sum :box [1 1]))] if memberp (list (map "sum :box [1 0]) (map "sum :box [1 1])) :lines [ output (list (map "sum :box [1 0]) (map "sum :box [1 1]))] output [] ; box was full already (from makecohort) end to makecohorts :lines ; Partition the available boxes into chains, to look for the smallest. ; Note, the partition is not necessarily optimal -- this algorithm needs work. ; It's important that LINES be a local variable here, so that we can "draw" ; lines hypothetically that we're not really going to draw on the board. while [not emptyp :lines] [ localmake "cohort [] makecohort first :lines push "cohorts :cohort ] end to makecohort :line ; Group all the boxes in a chain that starts with this line. ; Mark the line as drawn (locally to caller), then look in both directions ; for completable boxes. make "lines remove :line :lines localmake "direction reverse (map "difference (last :line) (first :line)) makecohort1 (map "difference (first :line) :direction) makecohort1 first :line end to makecohort1 :box ; Examine one of the boxes adjoining the line just hypothetically drawn. ; It has 0, 1, or 2 undrawn sides. (If 3 or 4, wouldn't have gotten here.) ; 0 sides -> count the box if not already, but no further lines in the chain. ; 1 side -> count the box, continue the chain with its last side. ; 2 sides -> the box isn't ready to complete, so it's not in this chain. if or ((first :box) < 0) ((last :box) < 0) [stop] if or ((first :box) > (:size-2)) ((last :box) > (:size-2)) [stop] localmake "togo filter [memberp (list (map "sum :box first ?) (map "sum :box last ?)) :lines] ~ [[[0 0] [0 1]] [[0 0] [1 0]] [[1 0] [1 1]] [[0 1] [1 1]]] if (count :togo)=2 [stop] if not memberp :box :cohort [push "cohort :box] if emptyp :togo [stop] localmake "line (list (map "sum :box first first :togo) (map "sum :box last first :togo)) makecohort :line end to smallest :cohorts [:sofar []] [:minsize :numboxes+1] if emptyp :cohorts [output :sofar] if (count first :cohorts) < :minsize ~ [output (smallest bf :cohorts first :cohorts count first :cohorts)] output (smallest bf :cohorts :sofar :minsize) end ; ----------- Common procedures for person and computer moves -------- to drawline :move :color ; Actually draw the selected move on the screen. if not emptyp :oldmove [ setpc 7 pu setpos map [40*? - :offset] first :oldmove pd setpos map [40*? - :offset] last :oldmove ] setpc :color pu setpos map [40*? - :offset] first :move pd setpos map [40*? - :offset] last :move make "oldmove :move end to fillboxes :color :owner ; Implicit inputs (inherited from caller): ; :move is the move someone just made. ; :direction is [1 0] for vertical move, [0 1] for horizontal. ; Note that the line is drawn, check the two boxes (maybe) on either side, ; color them and count them for the appropriate player, see if game over. make "lines remove :move :lines if boxbefore? :move [fillbox (map "difference (first :move) :direction)] if boxafter? :move [fillbox first :move] testwin end to boxafter? :move ; Output true if the box above or to the right of the move is now complete. output (increment first :move)=4 end to boxbefore? :move ; Output true if the box below or to the left of the move is now complete. localmake "p3 (map "difference (first :move) :direction) output (increment :p3)=4 end to increment :box ; If this isn't a box at all (might be if the move was on a border), ; just output []. Otherwise, increment the number in the :boxes array, ; and move this box from one of the :boxlists to the next higher one. ; Output the new count of number of lines drawn in this box. if or ((first :box) < 0) ((last :box) < 0) [output []] if or ((first :box) > (:size-2)) ((last :box) > (:size-2)) [output []] localmake "count item (last :box) item (first :box) :boxes if emptyp :count [make "count 0] setitem (last :box) item (first :box) :boxes :count+1 setitem :count :boxlists (remove :box item :count :boxlists) setitem :count+1 :boxlists (fput :box item :count+1 :boxlists) output :count+1 end to fillbox :box ; Color in a completed box, increase the box count of its owner, and ; flag that a box was completed. pu setpos (map [40*? - :offset] :box) filled :color [repeat 4 [fd 40 rt 90]] make :owner (thing :owner)+1 make "found "true end ; ------------------- Endgame processing -------------------- to testwin if :computer+:person = :numboxes [throw "win] end ucblogo-6.1/csls/doctor0000664000175000017500000006305313557147341013314 0ustar jjcjjcto doctor local [text sentence stuff a b c rules keywords memory] make "memory [] print [Hello, I am the doctor. What can I do for you?] print [Please end your remarks with an empty line.] print [] loop end ;; Controlling the conversation to loop make "text tokenize getstuff [] make "sentence getsentence :text analyze :sentence :keywords print [] loop end ;; Reading and preparing the input to getstuff :stuff localmake "line readlist if emptyp :line [output :stuff] output getstuff sentence :stuff :line end to tokenize :text output map.se [tokenword ? "] :text end to tokenword :word :out if emptyp :word [output :out] if memberp first :word [, " ] [output tokenword butfirst :word :out] if memberp first :word [. ? ! |;|] [output sentence :out ".] output tokenword butfirst :word word :out first :word end to getsentence :text make "keywords [] output getsentence1 decapitalize :text [] end to getsentence1 :text :out if emptyp :text [output :out] if equalp first :text ". ~ [ifelse emptyp :keywords ~ [output getsentence1 decapitalize butfirst :text []] [output :out]] checkpriority first :text output getsentence1 butfirst :text sentence :out translate first :text end to decapitalize :text if emptyp :text [output []] output fput lowercase first :text butfirst :text end to checkpriority :word localmake "priority gprop :word "priority if emptyp :priority [stop] if emptyp :keywords [make "keywords ( list :word ) stop] ifelse :priority > ( gprop first :keywords "priority ) ~ [make "keywords fput :word :keywords] ~ [make "keywords lput :word :keywords] end to translate :word localmake "new gprop :word "translation output ifelse emptyp :new [:word] [:new] end ;; Choosing the rule and replying to analyze :sentence :keywords local [rules keyword] if emptyp :keywords [norules stop] make "keyword first :keywords make "rules gprop :keyword "rules if wordp first :rules ~ [make "keyword first :rules make "rules gprop :keyword "rules] checkrules :keyword :rules end to checkrules :keyword :rules if not match first :rules :sentence ~ [checkrules :keyword butfirst butfirst :rules stop] dorule first butfirst :rules end to dorule :rule localmake "print first gprop :keyword :rule pprop :keyword :rule lput :print butfirst gprop :keyword :rule if equalp :print "newkey [analyze :sentence butfirst :keywords stop] if wordp :print [checkrules :print gprop :print "rules stop] if equalp first :print "pre ~ [analyze reconstruct first butfirst :print butfirst butfirst :print stop] print capitalize reconstruct :print memory :keyword :sentence end to reconstruct :sentence if emptyp :sentence [output []] if not equalp ": first first :sentence ~ [output fput first :sentence reconstruct butfirst :sentence] output sentence reword first :sentence reconstruct butfirst :sentence end to reword :word if memberp last :word [. ? ,] [output addpunct reword butlast :word last :word] output thing butfirst :word end to addpunct :stuff :char if wordp :stuff [output word :stuff :char] if emptyp :stuff [output :char] output sentence butlast :stuff word last :stuff :char end to capitalize :text if emptyp :text [output []] output fput (word uppercase first first :text butfirst first :text) butfirst :text end to memory :keyword :sentence local [rules rule name] make "rules gprop :keyword "memr if emptyp :rules [stop] if not match first :rules :sentence [stop] make "name last :rules make "rules gprop :keyword :name make "rule first :rules pprop :keyword :name lput :rule butfirst :rules make "memory fput reconstruct :sentence :memory end to norules ifelse :memflag [usememory] [lastresort] make "memflag not :memflag end to lastresort print first :lastresort make "lastresort lput first :lastresort butfirst :lastresort end to usememory if emptyp :memory [lastresort stop] print capitalize first :memory make "memory butfirst :memory end ;; Predicates for patterns to beliefp :word output not emptyp gprop :word "belief end to familyp :word output not emptyp gprop :word "family end ;; Procedures for adding to the script to addrule :word :pattern :results localmake "propname gensym pprop :word "rules (sentence gprop :word "rules list :pattern :propname) pprop :word :propname :results end to addmemr :word :pattern :results localmake "propname gensym pprop :word "memr (sentence gprop :word "memr list :pattern :propname) pprop :word :propname :results end ;; data make "gensym.number 80 make "lastresort [[I am not sure I understand you fully.] [Please go on.] [What does that suggest to you?] [Do you feel strongly about discussing such things?]] make "memflag "false pprop "alike "priority 10 pprop "alike "rules [dit] pprop "always "priority 1 pprop "always "rules [[#] g69] pprop "always "g69 [[Can you think of a specific example?] [When?] [What incident are you thinking of?] [Really, always?] [What if this never happened?]] pprop "am "priority 0 pprop "am "translation "are pprop "am "rules [[# are you #stuff] g18 [#] g19] pprop "am "g18 [[Do you believe you are :stuff?] [Would you want to be :stuff?] [You wish I would tell you you are :stuff.] [What would it mean if you were :stuff?] how] pprop "am "g19 [[Why do you say "am"?] [I don't understand that.]] pprop "are "priority 0 pprop "are "rules [[#a there are #b you #c] g20 [# there are &stuff] g21 [# are I #stuff] g22 [are #] g23 [# are #stuff] g24] pprop "are "g20 [[pre [:a there are :b] are]] pprop "are "g21 [[What makes you think there are :stuff?] [Do you usually consider :stuff?] [Do you wish there were :stuff?]] pprop "are "g22 [[Why are you interested in whether I am :stuff or not?] [Would you prefer if I weren't :stuff?] [Perhaps I am :stuff in your fantasies.] [Do you sometimes think I am :stuff?] how] pprop "are "g23 [how] pprop "are "g24 [[Did you think they might not be :stuff?] [Would you like it if they were not :stuff?] [What if they were not :stuff?] [Possibly they are :stuff.]] pprop "ask "priority 0 pprop "ask "rules [[# you ask #] g77 [# you ! asking #] g78 [# I #] g79 [#] g80] pprop "ask "g77 [how] pprop "ask "g78 [how] pprop "ask "g79 [you] pprop "ask "g80 [newkey] pprop "because "priority 0 pprop "because "rules [[#] g64] pprop "because "g64 [[Is that the real reason?] [Don't any other reasons come to mind?] [Does that reason seem to explain anything else?] [What other reasons might there be?] [You're not concealing anything from me, are you?]] pprop "believe "belief "true pprop "bet "belief "true pprop "brother "family "true pprop "can "priority 0 pprop "can "rules [[# can I #stuff] g58 [# can you #stuff] g59 [#] g60] pprop "can "g58 [[You believe I can :stuff, don't you?] how [You want me to be able to :stuff.] [Perhaps you would like to be able to :stuff yourself.]] pprop "can "g59 [[Whether or not you can :stuff depends more on you than on me.] [Do you want to be able to :stuff?] [Perhaps you don't want to :stuff.] how] pprop "can "g60 [how newkey] pprop "cant "translation "can't pprop "certainly "priority 0 pprop "certainly "rules [yes] pprop "children "family "true pprop "computer "priority 50 pprop "computer "rules [[#] g17] pprop "computer "g17 [[Do computers worry you?] [Why do you mention computers?] [What do you think machines have to do with your problem?] [Don't you think computers can help people?] [What about machines worries you?] [What do you think about machines?]] pprop "computers "priority 50 pprop "computers "rules [computer] pprop "dad "translation "father pprop "dad "family "true pprop "daddy "translation "father pprop "daddy "family "true pprop "deutsch "priority 0 pprop "deutsch "rules [[#] g15] pprop "deutsch "g15 [[I'm sorry, I speak only English.]] pprop "dit "rules [[#] g72] pprop "dit "g72 [[In what way?] [What resemblance do you see?] [What does that similarity suggest to you?] [What other connections do you see?] [What do you suppose that resemblance means?] [What is the connection, do you suppose?] [Could there really be some connection?] how] pprop "dont "translation "don't pprop "dream "priority 3 pprop "dream "rules [[#] g9] pprop "dream "g9 [[What does that dream suggest to you?] [Do you dream often?] [What persons appear in your dreams?] [Don't you believe that dream has something to do with your problem?] [Do you ever wish you could flee from reality?] newkey] pprop "dreamed "priority 4 pprop "dreamed "rules [[# you dreamed #stuff] g7 [#] g8] pprop "dreamed "g7 [[Really :stuff?] [Have you ever fantasied :stuff while you were awake?] [Have you dreamed :stuff before?] dream newkey] pprop "dreamed "g8 [dream newkey] pprop "dreams "translation "dream pprop "dreams "priority 3 pprop "dreams "rules [dream] pprop "dreamt "translation "dreamed pprop "dreamt "priority 4 pprop "dreamt "rules [dreamed] pprop "espanol "priority 0 pprop "espanol "rules [deutsch] pprop "everybody "priority 2 pprop "everybody "rules [everyone] pprop "everyone "priority 2 pprop "everyone "rules [[# !a:in [everyone everybody nobody noone] #] g68] pprop "everyone "g68 [[Really, :a?] [Surely not :a.] [Can you think of anyone in particular?] [Who, for example?] [You are thinking of a very special person.] [Who, may I ask?] [Someone special perhaps.] [You have a particular person in mind, don't you?] [Who do you think you're talking about?] [I suspect you're exaggerating a little.]] pprop "father "family "true pprop "feel "belief "true pprop "francais "priority 0 pprop "francais "rules [deutsch] pprop "hello "priority 0 pprop "hello "rules [[#] g16] pprop "hello "g16 [[How do you do. Please state your problem.]] pprop "how "priority 0 pprop "how "rules [[#] g63] pprop "how "g63 [[Why do you ask?] [Does that question interest you?] [What is it you really want to know?] [Are such questions much on your mind?] [What answer would please you most?] [What do you think?] [What comes to your mind when you ask that?] [Have you asked such questions before?] [Have you asked anyone else?]] pprop "husband "family "true pprop "i "priority 0 pprop "i "translation "you pprop "i "rules [[# you !:in [want need] #stuff] g32 [# you are # !stuff:in [sad unhappy depressed sick] #] g33 [# you are # !stuff:in [happy elated glad better] #] g34 [# you was #] g35 [# you !:beliefp you #stuff] g36 [# you # !:beliefp # i #] g37 [# you are #stuff] g38 [# you !:in [can't cannot] #stuff] g39 [# you don't #stuff] g40 [# you feel #stuff] g41 [# you #stuff i #] g42 [#stuff] g43] pprop "i "g32 [[What would it mean to you if you got :stuff?] [Why Do you want :stuff?] [Suppose you got :stuff soon.] [What if you never got :stuff?] [What would getting :stuff mean to you?] [You really want :stuff.] [I suspect you really don't want :stuff.]] pprop "i "g33 [[I'm sorry to hear you are :stuff.] [Do you think coming here will help you not to be :stuff?] [I'm sure it's not pleasant to be :stuff.] [Can you explain what made you :stuff?] [Please go on.]] pprop "i "g34 [[How have I helped you to be :stuff?] [Has your treatment made you :stuff?] [What makes you :stuff just now?] [Can you explain why you are suddenly :stuff?] [Are you sure?] [What do you mean by :stuff?]] pprop "i "g35 [was] pprop "i "g36 [[Do you really think so?] [But you are not sure you :stuff.] [Do you really doubt you :stuff?]] pprop "i "g37 [you] pprop "i "g38 [[Is it because you are :stuff that you came to me?] [How long have you been :stuff?] [Do you believe it normal to be :stuff?] [Do you enjoy being :stuff?]] pprop "i "g39 [[How do you know you can't :stuff?] [Have you tried?] [Perhaps you could :stuff now.] [Do you really want to be able to :stuff?]] pprop "i "g40 [[Don't you really :stuff?] [Why don't you :stuff?] [Do you wish to be able to :stuff?] [Does that trouble you?]] pprop "i "g41 [[Tell me more about such feelings.] [Do you often feel :stuff?] [Do you enjoy feeling :stuff?] [Of what does feeling :stuff remind you?]] pprop "i "g42 [[Perhaps in your fantasy we :stuff each other.] [Do you wish to :stuff me?] [You seem to need to :stuff me.] [Do you :stuff anyone else?]] pprop "i "g43 [[You say :stuff.] [Can you elaborate on that?] [Do you say :stuff for some special reason?] [That's quite interesting.]] pprop "i'm "priority 0 pprop "i'm "translation "you're pprop "i'm "rules [[# you're #stuff] g31] pprop "i'm "g31 [[pre [you are :stuff] I]] pprop "if "priority 3 pprop "if "rules [[#a if #b had #c] g5 [# if #stuff] g6] pprop "if "g5 [[pre [:a if :b might have :c] if]] pprop "if "g6 [[Do you think it's likely that :stuff?] [Do you wish that :stuff?] [What do you think about :stuff?]] pprop "is "priority 0 pprop "is "rules [[&a is &b] g61 [#] g62] pprop "is "g61 [[Suppose :a were not :b.] [Perhaps :a really is :b.] [Tell me more about :a.]] pprop "is "g62 [newkey] pprop "italiano "priority 0 pprop "italiano "rules [deutsch] pprop "like "priority 10 pprop "like "rules [[# !:in [am is are was] # like #] g70 [#] g71] pprop "like "g70 [dit] pprop "like "g71 [newkey] pprop "machine "priority 50 pprop "machine "rules [computer] pprop "machines "priority 50 pprop "machines "rules [computer] pprop "maybe "priority 0 pprop "maybe "rules [perhaps] pprop "me "translation "you pprop "mom "translation "mother pprop "mom "family "true pprop "mommy "translation "mother pprop "mommy "family "true pprop "mother "family "true pprop "my "priority 2 pprop "my "translation "your pprop "my "rules [[# your # !a:familyp #b] g55 [# your &stuff] g56 [#] g57] pprop "my "g55 [[Tell me more about your family.] [Who else in your family :b?] [Your :a?] [What else comes to mind when you think of your :a?]] pprop "my "g56 [[Your :stuff?] [Why do you say your :stuff?] [Does that suggest anything else which belongs to you?] [Is it important to you that your :stuff?]] pprop "my "g57 [newkey] pprop "my "memr [[# your &stuff] g12] pprop "my "g12 [[Earlier you said your :stuff.] [But your :stuff.] [Does that have anything to do with your statement about :stuff?]] pprop "myself "translation "yourself pprop "name "priority 15 pprop "name "rules [[#] g14] pprop "name "g14 [[I am not interested in names.] [I've told you before I don't care about names\; please continue.]] pprop "no "priority 0 pprop "no "rules [[no] g53 [#] g54] pprop "no "g53 [xxyyzz [pre [x no] no]] pprop "no "g54 [[Are you saying "no" just to be negative?] [You are being a bit negative.] [Why not?] [Why "no"?] newkey] pprop "nobody "priority 2 pprop "nobody "rules [everyone] pprop "noone "priority 2 pprop "noone "rules [everyone] pprop "perhaps "priority 0 pprop "perhaps "rules [[#] g13] pprop "perhaps "g13 [[You don't seem quite certain.] [Why the uncertain tone?] [Can't you be more positive?] [You aren't sure.] [Don't you know?]] pprop "problem "priority 5 pprop "problem "rules [[#a !b:in [is are] your !c:in [problem problems] #] g73 [# your !a:in [problem problems] !b:in [is are] #c] g74 [#] g75] pprop "problem "g73 [[:a :b your :c.] [Are you sure :a :b your :c?] [Perhaps :a :b not your real :c.] [You think you have problems?] [Do you often think about :a?]] pprop "problem "g74 [[Your :a :b :c?] [Are you sure your :a :b :c?] [Perhaps your real :a :b not :c.] [You think you have problems?]] pprop "problem "g75 [[Please continue, this may be interesting.] [Have you any other problems you wish to discuss?] [Perhaps you'd rather change the subject.] [You seem a bit uneasy.] newkey] pprop "problem "memr [[#stuff is your problem #] g76] pprop "problem "g76 [[Earlier you mentioned :stuff.] [Let's talk further about :stuff.] [Tell me more about :stuff.] [You haven't mentioned :stuff for a while.]] pprop "problems "priority 5 pprop "problems "rules [problem] pprop "remember "priority 5 pprop "remember "rules [[# you remember #stuff] g2 [# do I remember #stuff] g3 [#] g4] pprop "remember "g2 [[Do you often think of :stuff?] [Does thinking of :stuff bring anything else to mind?] [What else do you remember?] [Why do you remember :stuff just now?] [What in the present situation reminds you of :stuff?]] pprop "remember "g3 [[Did you think I would forget :stuff?] [Why do you think I should recall :stuff now?] [What about :stuff?] what [You mentioned :stuff.]] pprop "remember "g4 [newkey] pprop "same "priority 10 pprop "same "rules [dit] pprop "sister "family "true pprop "sorry "priority 0 pprop "sorry "rules [[#] g1] pprop "sorry "g1 [[Please don't apologize.] [Apologies are not necessary.] [What feelings do you have when you apologize?] [I've told you that apologies are not required.]] pprop "svenska "priority 0 pprop "svenska "rules [deutsch] pprop "think "belief "true pprop "was "priority 2 pprop "was "rules [[# was you #stuff] g26 [# you was #stuff] g27 [# was I #stuff] g28 [#] g29] pprop "was "g26 [[What if you were :stuff?] [Do you think you were :stuff?] [Were you :stuff?] [What would it mean if you were :stuff?] [What does " :stuff " suggest to you?] how] pprop "was "g27 [[Were you really?] [Why do you tell me you were :stuff now?] [Perhaps I already knew you were :stuff.]] pprop "was "g28 [[Would you like to believe I was :stuff?] [What suggests that I was :stuff?] [What do you think?] [Perhaps I was :stuff.] [What if I had been :stuff?]] pprop "was "g29 [newkey] pprop "we "translation "you pprop "we "priority 0 pprop "we "rules [I] pprop "were "priority 0 pprop "were "translation "was pprop "were "rules [was] pprop "what "priority 0 pprop "what "rules [[!:in [what where] #] g10 [# !a:in [what where] #b] g11] pprop "what "g10 [how] pprop "what "g11 [[Tell me about :a :b.] [:a :b?] [Do you want me to tell you :a :b?] [Really.] [I see.] newkey] pprop "where "priority 0 pprop "where "rules [how] pprop "why "priority 0 pprop "why "rules [[# why don't I #stuff] g65 [# why can't you #stuff] g66 [#] g67] pprop "why "g65 [[Do you believe I don't :stuff?] [Perhaps I will :stuff in good time.] [Should you :stuff yourself?] [You want me to :stuff?] how] pprop "why "g66 [[Do you think you should be able to :stuff?] [Do you want to be able to :stuff?] [Do you believe this will help you to :stuff?] [Have you any idea why you can't :stuff?] how] pprop "why "g67 [[Why indeed?] [Why "why"?] [Why not?] how newkey] pprop "wife "family "true pprop "wish "belief "true pprop "wont "translation "won't pprop "xxyyzz "priority 0 pprop "xxyyzz "rules [[#] g50] pprop "xxyyzz "g50 [[You're being somewhat short with me.] [You don't seem very talkative today.] [Perhaps you'd rather talk about something else.] [Are you using monosyllables for some reason?] newkey] pprop "yes "priority 0 pprop "yes "rules [[yes] g51 [#] g52] pprop "yes "g51 [xxyyzz [pre [x yes] yes]] pprop "yes "g52 [[You seem quite positive.] [You are sure.] [I see.] [I understand.] newkey] pprop "you "priority 0 pprop "you "translation "I pprop "you "rules [[# I remind you of #] g44 [# I are # you #] g45 [# I # are #stuff] g46 [# I #stuff you] g47 [# I &stuff] g48 [#] g49] pprop "you "g44 [dit] pprop "you "g45 [newkey] pprop "you "g46 [[What makes you think I am :stuff?] [Does it please you to believe I am :stuff?] [Perhaps you would like to be :stuff.] [Do you sometimes wish you were :stuff?]] pprop "you "g47 [[Why do you think I :stuff you?] [You like to think I :stuff you, don't you?] [What makes you think I :stuff you?] [Really, I :stuff you?] [Do you wish to believe I :stuff you?] [Suppose I did :stuff you. what would that mean?] [Does someone else believe I :stuff you?]] pprop "you "g48 [[We were discussing you, not me.] [Oh, I :stuff?] [Is this really relevant to your problem?] [Perhaps I do :stuff.] [Are you glad to know I :stuff?] [Do you :stuff?] [What are your feelings now?]] pprop "you "g49 [newkey] pprop "you're "priority 0 pprop "you're "translation "I'm pprop "you're "rules [[# I'm #stuff] g30] pprop "you're "g30 [[pre [I are :stuff] you]] pprop "your "priority 0 pprop "your "translation "my pprop "your "rules [[# my #stuff] g25] pprop "your "g25 [[Why are you concerned over my :stuff?] [What about your own :stuff?] [Are you worried about someone else's :stuff?] [Really, my :stuff?]] pprop "yourself "translation "myself to match :pat :sen local [special.var special.pred special.buffer in.list] if or wordp :pat wordp :sen [output "false] if emptyp :pat [output emptyp :sen] if listp first :pat [output special fput "!: :pat :sen] if memberp first first :pat [? # ! & @ ^] [output special :pat :sen] if emptyp :sen [output "false] if equalp first :pat first :sen [output match butfirst :pat butfirst :sen] output "false end ;; Parsing quantifiers to special :pat :sen set.special parse.special butfirst first :pat " output run word "match first first :pat end to parse.special :word :var if emptyp :word [output list :var "always] if equalp first :word ": [output list :var butfirst :word] output parse.special butfirst :word word :var first :word end to set.special :list make "special.var first :list make "special.pred last :list if emptyp :special.var [make "special.var "special.buffer] if memberp :special.pred [in anyof] [set.in] if not emptyp :special.pred [stop] make "special.pred first butfirst :pat make "pat fput first :pat butfirst butfirst :pat end to set.in make "in.list first butfirst :pat make "pat fput first :pat butfirst butfirst :pat end ;; Exactly one match to match! if emptyp :sen [output "false] if not try.pred [output "false] make :special.var first :sen output match butfirst :pat butfirst :sen end ;; Zero or one match to match? make :special.var [] if emptyp :sen [output match butfirst :pat :sen] if not try.pred [output match butfirst :pat :sen] make :special.var first :sen if match butfirst :pat butfirst :sen [output "true] make :special.var [] output match butfirst :pat :sen end ;; Zero or more matches to match# make :special.var [] output #test #gather :sen end to #gather :sen if emptyp :sen [output :sen] if not try.pred [output :sen] make :special.var lput first :sen thing :special.var output #gather butfirst :sen end to #test :sen if match butfirst :pat :sen [output "true] if emptyp thing :special.var [output "false] output #test2 fput last thing :special.var :sen end to #test2 :sen make :special.var butlast thing :special.var output #test :sen end ;; One or more matches to match& output &test match# end to &test :tf if emptyp thing :special.var [output "false] output :tf end ;; Zero or more matches (as few as possible) to match^ make :special.var [] output ^test :sen end to ^test :sen if match butfirst :pat :sen [output "true] if emptyp :sen [output "false] if not try.pred [output "false] make :special.var lput first :sen thing :special.var output ^test butfirst :sen end ;; Match words in a group to match@ make :special.var :sen output @test [] end to @test :sen if @try.pred [if match butfirst :pat :sen [output "true]] if emptyp thing :special.var [output "false] output @test2 fput last thing :special.var :sen end to @test2 :sen make :special.var butlast thing :special.var output @test :sen end ;; Applying the predicates to try.pred if listp :special.pred [output match :special.pred first :sen] output run list :special.pred quoted first :sen end to quoted :thing if listp :thing [output :thing] output word "" :thing end to @try.pred if listp :special.pred [output match :special.pred thing :special.var] output run list :special.pred thing :special.var end ;; Special predicates to always :x output "true end to in :word output memberp :word :in.list end to anyof :sen output anyof1 :sen :in.list end to anyof1 :sen :pats if emptyp :pats [output "false] if match first :pats :sen [output "true] output anyof1 :sen butfirst :pats end ucblogo-6.1/csls/diff0000664000175000017500000000766513557147341012741 0ustar jjcjjcto diff :file1 :file2 :output local "caseignoredp make "caseignoredp "false openread :file1 openread :file2 if not emptyp :output [openwrite :output] setwrite :output print [DIFF results:] print sentence [< File 1 =] :file1 print sentence [> File 2 =] :file2 diff.same (makefile 1 :file1) (makefile 2 :file2) print "========== setread [] setwrite [] close :file1 close :file2 if not emptyp :output [close :output] end ;; Skip over identical lines in the two files. to diff.same :fib1 :fib2 local [line1 line2] do.while [make "line1 getline :fib1 make "line2 getline :fib2 if and listp :line1 listp :line2 [stop] ; Both files ended. ] [equalp :line1 :line2] addline :fib1 :line1 ; Difference found. addline :fib2 :line2 diff.differ :fib1 :fib2 end ;; Remember differing lines while looking for ones that match. to diff.differ :fib1 :fib2 local "line make "line readline :fib1 addline :fib1 :line ifelse memberp :line lines :fib2 ~ [diff.found :fib1 :fib2] ~ [diff.differ :fib2 :fib1] end to diff.found :fib1 :fib2 local "lines make "lines member2 (last butlast lines :fib1) ~ (last lines :fib1) ~ (lines :fib2) ifelse emptyp :lines ~ [diff.differ :fib2 :fib1] ~ [report :fib1 :fib2 (butlast butlast lines :fib1) (firstn (lines :fib2) (count lines :fib2)-(count :lines))] end to member2 :line1 :line2 :lines if emptyp butfirst :lines [output []] if and equalp :line1 first :lines equalp :line2 first butfirst :lines ~ [output :lines] output member2 :line1 :line2 butfirst :lines end to firstn :stuff :number if :number = 0 [output []] output fput (first :stuff) (firstn butfirst :stuff :number-1) end ;; Read from file or from saved lines. to getline :fib nextlinenum :fib output readline :fib end to readline :fib if savedp :fib [output popsaved :fib] setread filename :fib output readword end ;; Matching lines found, now report the differences. to report :fib1 :fib2 :lines1 :lines2 local [end1 end2 dashes] if equalp (which :fib1) 2 [report :fib2 :fib1 :lines2 :lines1 stop] print "========== make "end1 (linenum :fib1)+(count :lines1)-1 make "end2 (linenum :fib2)+(count :lines2)-1 make "dashes "false ifelse :end1 < (linenum :fib1) [ print (sentence "INSERT :end1+1 (word (linenum :fib2) "- :end2)) ] [ifelse :end2 < (linenum :fib2) [ print (sentence "DELETE (word (linenum :fib1) "- :end1) :end2+1) ] [ print (sentence "CHANGE (word (linenum :fib1) "- :end1) (word (linenum :fib2) "- :end2)) make "dashes "true ]] process :fib1 "|< | :lines1 :end1 if :dashes [print "-----] process :fib2 "|> | :lines2 :end2 diff.same :fib1 :fib2 end to process :fib :prompt :lines :end foreach :lines [type :prompt print ?] savelines :fib butfirst butfirst chop :lines (lines :fib) setlines :fib [] setlinenum :fib :end+2 end to chop :counter :stuff if emptyp :counter [output :stuff] output chop butfirst :counter butfirst :stuff end ;; Constructor, selectors, and mutators for File Information Block (FIB) ;; Five elements: file number, file name, line number, ;; differing lines, and saved lines for re-reading. to makefile :number :name local "file make "file array 5 ; Items 4 and 5 will be empty lists. setitem 1 :file :number setitem 2 :file :name setitem 3 :file 0 output :file end to which :fib output item 1 :fib end to filename :fib output item 2 :fib end to linenum :fib output item 3 :fib end to nextlinenum :fib setitem 3 :fib (item 3 :fib)+1 end to setlinenum :fib :value setitem 3 :fib :value end to addline :fib :line setitem 4 :fib (lput :line item 4 :fib) end to setlines :fib :value setitem 4 :fib :value end to lines :fib output item 4 :fib end to savelines :fib :value setitem 5 :fib (sentence :value item 5 :fib) end to savedp :fib output not emptyp item 5 :fib end to popsaved :fib local "result make "result first item 5 :fib setitem 5 :fib (butfirst item 5 :fib) output :result end ucblogo-6.1/csls/crypto0000664000175000017500000001670313557147341013342 0ustar jjcjjcto crypto :text make "text map "uppercase :text make "fulltext :text make "moretext [] make "textstack [] if not procedurep "letterp [copydef "letterp "namep] forletters "A "Z "initvars make "maxcount 0 initcount "single initcount "triple cleartext histogram :text redisplay "false if or guess.single guess.triple [showclear :text] parseloop end ;; Initialization to initcount :type setlist. :type [] setcount. :type 0 end to initvars :letter setcnt :letter 0 make :letter "| | setunbound :letter end ;; Histogram to histogram :text foreach :text [localmake "word filter "letterp ? foreach :word "histlet prepare.guess :word] end to histlet :letter localmake "cnt 1+cnt :letter setcursor list (index :letter) (nonneg 24-:cnt) type :letter setcnt :letter :cnt if :maxcount < :cnt [make "maxcount :cnt] end ;; Guessing letters to prepare.guess :word if equalp count :word 1 [tally "single :word] if equalp count :word 3 [tally "triple :word] end to tally :type :word localmake "countvar word :type :word if not memberp :word list. :type ~ [setlist. :type fput :word list. :type make :countvar 0] localmake "count (thing :countvar)+1 make :countvar :count if :count > (count. :type) ~ [setcount. :type :count setmax. :type :word] end to guess.single if emptyp (list. "single) [output "false] if emptyp butfirst (list. "single) ~ [qbind first (list. "single) "A output "true] qbind (max. "single) "A qbind (ifelse equalp first (list. "single) (max. "single) [last (list. "single)] [first (list. "single)]) ~ "I output "true end to guess.triple if emptyp (list. "triple) [output "false] if :maxcount < (3+cnt last (max. "triple)) ~ [qbind first (max. "triple) "T qbind first butfirst (max. "triple) "H qbind last (max. "triple) "E output "true] output "false end ;; Keyboard commands to parseloop forever [parsekey uppercase readchar] end to parsekey :char if :char = "@ [fullclear stop] if :char = "+ [moretext stop] if :char = "- [lesstext stop] if not letterp :char [beep stop] bind :char uppercase readchar end ;; Keeping track of guesses to bind :from :to if not equalp :to "| | [if not letterp :to [beep stop] if boundp :to [beep stop]] if letterp thing :from [dark thing :from] make :from :to fixtop :from if letterp :to [light :to] showclear :text end to qbind :from :to if letterp thing :from [stop] make :from :to fixtop :from light :to end ;; Maintaining the display to redisplay :flag cleartext showtop alphabet showcode :text if :flag [showclear :text] end ;; Top section of display (letter counts and guesses) to showtop setcursor [0 0] showrow "A "E showrow "F "J showrow "K "O showrow "P "T showrow "U "Y showrow "Z "Z end to showrow :from :to forletters :from :to [setposn ? cursor onetop ?] print [] end to onetop :letter localmake "count cnt :letter if :count = 0 [type word :letter "| | stop] localmake "text (word :letter "- twocol :count "- thing :letter) ifelse :maxcount < :count+3 [invtype :text] [type :text] type "| | end to twocol :number if :number > 9 [output :number] output word 0 :number end to fixtop :letter setcursor posn :letter onetop :letter end ;; Middle section of display (guessed cleartext letters) to alphabet setcursor [6 6] forletters "A "Z [ifelse boundp ? [invtype ?] [type ?]] end to light :letter setcursor list 6+(index :letter) 6 invtype :letter setbound :letter end to dark :letter setcursor list 6+(index :letter) 6 type :letter setunbound :letter end ;; Bottom section of display (coded text) to showcode :text make "moretext [] showcode1 8 0 :text end to showcode1 :row :col :text if emptyp :text [make "moretext [] stop] if :row > 22 [stop] if and equalp :row 16 equalp :col 0 [make "moretext :text] if (:col+count first :text) > 37 [showcode1 :row+2 0 :text stop] codeword :row :col first :text showcode1 :row (:col+1+count first :text) butfirst :text end to codeword :row :col :word setcursor list :col :row invtype :word end ;; Bottom section of display (cleartext) to showclear :text showclear1 8 0 :text 2 end to showclear1 :row :col :text :delta if emptyp :text [stop] if :row > 23 [stop] if keyp [stop] if (:col+count first :text) > 37 ~ [showclear1 :row+:delta 0 :text :delta stop] clearword :row :col first :text showclear1 :row (:col+1+count first :text) butfirst :text :delta end to clearword :row :col :word setcursor list :col :row+1 foreach :word [ifelse letterp ? [type thing ?] [type ?]] end ;; Windowing commands to fullclear cleartext showclear1 0 0 :fulltext 1 print [] invtype [type any char to redisplay] ignore readchar redisplay "true end to moretext if emptyp :moretext [beep stop] push "textstack :text make "text :moretext redisplay "true end to lesstext if emptyp :textstack [beep stop] make "text pop "textstack redisplay "true end ;; Iteration tool for letters to forletters :from :to :action for [lettercode [ascii :from] [ascii :to]] ~ [apply :action (list char :lettercode)] end ;; Data abstraction (constructors and selectors) to setbound :letter make word "bound :letter "true end to setunbound :letter make word "bound :letter "false end to boundp :letter output thing word "bound :letter end to setcnt :letter :thing make (word "cnt :letter) :thing end to cnt :letter output thing (word "cnt :letter) end to setposn :letter :thing make (word "posn :letter) :thing end to posn :letter output thing (word "posn :letter) end to setcount. :word :thing make (word "count. :word) :thing end to count. :word output thing (word "count. :word) end to setlist. :word :thing make (word "list. :word) :thing end to list. :word output thing (word "list. :word) end to setmax. :word :thing make (word "max. :word) :thing end to max. :word output thing (word "max. :word) end ;; Miscellaneous helpers to index :letter output (ascii :letter)-(ascii "A) end to beep tone 440 15 end to invtype :text type standout :text end to nonneg :number output ifelse :number < 0 [0] [:number] end ;; Sample cryptograms make "cgram1 [Dzynufqyjulli, jpqhq ok yr hoxpj qnzeujory qceqwj xhrtoyx zw oyjr u trhjptpolq trhln. oynqqn, rzh qceqkkogq eryeqhy tojp whrvlqfk rd qnzeujory uj whqkqyj kofwli fquyk jpuj jpq |xhrty-zwk| nr yrj pugq kzep u trhln. u nqeqyj qnzeujory uofk uj, whqwuhqk drh, u frhq trhjptpolq dzjzhq, tojp u noddqhqyj erffzyoji kwohoj, noddqhqyj reezwujoryk, uyn frhq hqul zjoloji jpuy ujjuoyoyx kjujzk uyn kuluhi.] make "cgram2 [Lvo vfkp lfzj md opaxflimn iz lm gitokflo fnp zlkonblvon f hmalv'z inilifliuo, fnp fl lvo zfyo liyo lm zoo lm il lvfl vo jnmwz wvfl iz noxozzfkh lm xmco wilv lvo mnbminb fxliuilioz fnp xaglako md zmxiolh, zm lvfl viz inilifliuo xfn to kogoufnl. il iz ftzakp lm lvinj lvfl lviz lfzj xfn to fxxmycgizvop th zm yaxv zillinb in f tms dfxinb dkmnl, yfnicagflinb zhytmgz fl lvo pikoxlimn md pizlfnl fpyinizlkflmkz. lviz iz kflvok f wfh lm kobiyonl fnp tkfinwfzv.] make "cgram3 [Pcodl hbdcx qxdrdlh yihcodr, hbd rzbiier gxd lih ziyqdhdlh hi hdgzb gwhbdlhcz echdxgzf, xdgnclp gr g ydglr ia ecudxghcil gln zwehcoghcil. gln c niwuh hbgh yirh ia wr jbi rdxciwref xdgn gln jxchd hbd dlpecrb eglpwgpd dodx edgxldn ch uf hbd xiwhd ia "xwl, rqih, xwl" hi rcegr ygxldx.] make "cgram4 [Jw btn xnsgsyp ejke gfebbcg, dtyjbn fbccsksg, ryu fbccsksg nswcsfpsu pes usgjns, wnssuba, ryu wtptns bw pes qbtyk, pesns zbtcu ls yb knrujyk, yb psgpjyk svfsxp rg r psrfejyk aspebu, ryu yb lcrfilbrnu dtykcsg. jy wrfp, zs rns ksppjyk cbfigpsx gfesutcjyk ryu knrujyk pb pes xbjyp bw pbnptns.] ucblogo-6.1/csls/cards0000664000175000017500000000237413557147341013115 0ustar jjcjjcprogram cards; {Shuffle a deck of cards} var ranks:array [0..51] of integer; suits:array [0..51] of char; i:integer; procedure showdeck; {Print the deck arrays} begin {showdeck} for i := 0 to 51 do begin if i mod 13 = 0 then writeln; write(ranks[i]:3,suits[i]); end; writeln; writeln end; {showdeck} procedure deck; {Create the deck in order} var i,j:integer; suitnames:packed array [0..3] of char; begin {deck} suitnames := 'HSDC'; for i := 0 to 12 do for j := 0 to 3 do begin ranks[13*j+i] := i+1; suits[13*j+i] := suitnames[j] end; writeln('The initial deck:'); showdeck end; {deck} procedure shuffle; {Shuffle the deck randomly} var rank,i,j:integer; suit:char; begin {shuffle} for i := 51 downto 1 do {For each card in the deck} begin j := random(i+1); {Pick a random card before it} rank := ranks[i]; {Interchange ranks} ranks[i] := ranks[j]; ranks[j] := rank; suit := suits[i]; {Interchange suits} suits[i] := suits[j]; suits[j] := suit end; writeln('The shuffled deck:'); showdeck end; {shuffle} begin {main program} deck; shuffle end. ucblogo-6.1/csls/buttons0000664000175000017500000001537213557147341013521 0ustar jjcjjc;;; Primitive GUI for Logo games. ;;; Displays buttons, then accepts mouseclicks or keystrokes ;;; to control actions. ;;; To clear the screen and all the remembered buttons: ;;; init.buttons ;;; To install a button: ;;; SETBUTTON [150 130] [40 25] [make "mysecret "true throw "newgame] ~ ;;; :mysecret 0 [Logo guess] [] ;;; ;;; Inputs are: ;;; 1. Position of lower left corner of button ;;; 2. Size [x y] of button ;;; 3. Action to take if button pressed ;;; 4. TRUE if box should be drawn thick, FALSE if thin ;;; 5. Color to fill box (0 if no fill) ;;; 6. Text caption inside button (a word or a two-word list for ;;; a two-line caption) or empty list for no caption ;;; 7. Equivalent keystroke (empty list if no equivalent keystroke) ;;; (DEL means char 8 or 127; RET means char 10 or 13) ;;; (Keystroke inside list, e.g., [X], means don't draw it.) ;;; REBUTTON (same inputs as SETBUTTON) looks for existing matching button ;;; and, if found, just redraws border (possibly changing thickness). ;;; To display a descriptive caption (e.g., for a group of buttons) ;;; without making a button: ;;; CAPTION [150 130] [40 25] [Number |of boxes:|] ;;; CENTER.CAPTION [150 130] [40 25] [Number |of boxes:|] ;;; ;;; Inputs are position, size, caption. ;;; CENTER.CAPTION centers the text within the box; CAPTION puts it ;;; at the left edge of the box. ;;; To loop reading keystrokes or mouseclicks and taking actions as set: ;;; ACTION.LOOP ;;; Within an action, :CHAR is the character typed (or zero if the action ;;; was triggered by a mouse click), :BUTTON is the mouse button pressed ;;; (or zero if the action was triggered by a keystroke), and :MOUSEPOS is ;;; the mouse position (or unspecified for a keystroke). Actions triggered ;;; by a mouse click happen when the mouse button is released. ; ----------------------------- ;;; IMPORTANT: Here is how we know the size of a text character as ;;; drawn by the LABEL command. Change these numbers if necessary: make "labelcharsize ifelse equalp :LogoPlatform "Windows [[8 13]] [[6 11]] ; if equalp :LogoPlatform "wxWidgets [make "labelcharsize [7 14]] if equalp :LogoPlatform "wxWidgets [make "labelcharsize labelsize] ; ----------------------------- to init.buttons cs ht make "buttons [] end ; ----------------------------- to setbutton :corner :size :action :thickp :fillcolor :caption :key center.caption :corner :size :caption pu setpos :corner seth 0 pd setpensize ifelse :thickp [[3 3]] [[1 1]] setpc 7 apply "button.rectangle :size setpensize [1 1] if not equalp :fillcolor 0 [ button.offset :corner 5 5 setpc :fillcolor fill setpc 7 ] if (and (not listp :key) (not emptyp :key) (not equalp :key :caption)) [ caption (list (sum first :corner first :size 4) last :corner) ~ (list (first :labelcharsize) (last :size)) ~ :key ] if and (listp :key) (not emptyp :key) [make "key first :key] push "buttons (list :corner :size :key :action) end to rebutton :corner :size :action :thickp :fillcolor :caption :key localmake "thekey :key if and listp :key not emptyp :key [make "thekey first :key] localmake "test (list :corner :size :thekey :action) localmake "button find [equalp ? :test] :buttons if emptyp :button ~ [setbutton :corner :size :action :thickp :fillcolor :caption :key stop] penup setpos :corner seth 0 setpc 7 penerase setpensize [3 3] apply "button.rectangle :size penpaint setpensize ifelse :thickp [[3 3]] [[1 1]] apply "button.rectangle :size setpensize [1 1] end to button.offset :corner :dx :dy penup setxy (first :corner)+:dx (last :corner)+:dy end to button.rectangle :x :y repeat 2 [fd :y rt 90 fd :x rt 90] end ; ----------------------------- to caption :corner :size :caption if emptyp :caption [stop] localmake "oldscrunch scrunch if not namep "caption.scrunch [localmake "caption.scrunch 1] localmake "myscrunch map [? * :caption.scrunch] :oldscrunch localmake "y (last :labelcharsize)*:caption.scrunch setpc 7 ifelse listp :caption [ button.offset :corner 0 ((14-:y)+((last :size)-25)/3) if :caption.scrunch <> 1 [apply "setscrunch :myscrunch] label last :caption if :caption.scrunch <> 1 [apply "setscrunch :oldscrunch] button.offset :corner 0 ((14-:y)+:y+2*((last :size)-25)/3) if :caption.scrunch <> 1 [apply "setscrunch :myscrunch] label first :caption if :caption.scrunch <> 1 [apply "setscrunch :oldscrunch] ] [ button.offset :corner 0 ((17-:y)+((last :size)-17)/2) if :caption.scrunch <> 1 [apply "setscrunch :myscrunch] label :caption if :caption.scrunch <> 1 [apply "setscrunch :oldscrunch] ] end to center.caption :corner :size :caption if emptyp :caption [stop] localmake "oldscrunch scrunch if not namep "caption.scrunch [localmake "caption.scrunch 1] localmake "myscrunch map [? * :caption.scrunch] :oldscrunch localmake "halfx (first :labelcharsize)*:caption.scrunch/2 localmake "y (last :labelcharsize)*:caption.scrunch setpc 7 ifelse listp :caption [ button.offset :corner (1+(first :size)/2-:halfx*(count last :caption)) ~ ((14-:y)+((last :size)-25)/3) if :caption.scrunch <> 1 [apply "setscrunch :myscrunch] label last :caption if :caption.scrunch <> 1 [apply "setscrunch :oldscrunch] button.offset :corner (1+(first :size)/2-:halfx*(count first :caption)) ~ ((14-:y)+:y+2*((last :size)-25)/3) if :caption.scrunch <> 1 [apply "setscrunch :myscrunch] label first :caption if :caption.scrunch <> 1 [apply "setscrunch :oldscrunch] ] [ button.offset :corner (1+(first :size)/2-:halfx*(count :caption)) ~ ((17-:y)+((last :size)-17)/2) if :caption.scrunch <> 1 [apply "setscrunch :myscrunch] label :caption if :caption.scrunch <> 1 [apply "setscrunch :oldscrunch] ] end ; ----------------------------- to action.loop [:buttonact [button.mouseclick]] [:keyact [button.readkey]] action.once forever [wait 100] end to action.off ern [buttonact keyact] ern "keyact end to action.once if keyp [button.readkey] if buttonp [button.mouseclick] end to button.readkey [:char rc] [:button 0] [:buttonact []] [:keyact []] foreach :buttons [ localmake "key item 3 ? ifelse equalp :key "DEL [ if memberp (ascii :char) [8 127] [run last ? action.once stop] ] [ ifelse equalp :key "RET [ if memberp (ascii :char) [10 13] [run last ? action.once stop] ] [ if equalp :char :key [run last ? action.once stop] ] ] ] end to button.mouseclick [:mousepos clickpos] [:button button] [:char 0] ~ [:buttonact []] [:keyact []] while [buttonp] [] ; wait for release of button foreach :buttons [ if apply "button.inrange ? [run last ? action.once stop] ] end to button.inrange :corner :size :key :action (foreach :mousepos :corner :size [ if ?1 < ?2 [output "false] if ?1 > (?2 + ?3) [output "false] ]) output "true end ucblogo-6.1/csls/basic0000664000175000017500000001501413557147341013075 0ustar jjcjjcto basic make "linenumbers [] make "readline [] forever [basicprompt] end to basicprompt print [] print "READY print [] make "line basicread if emptyp :line [stop] ifelse numberp first :line [compile split :line] [immediate :line] end to compile :commands make "number first :commands make :number :line ifelse emptyp butfirst :commands ~ [eraseline :number] ~ [makedef (word "basic% :number) butfirst :commands] end to makedef :name :commands make "definition [[]] foreach :commands [run list (word "compile. first ?) ?] queue "definition (list "nextline :number) define :name :definition make "linenumbers insert :number :linenumbers end to insert :num :list if emptyp :list [output (list :num)] if :num = first :list [output :list] if :num < first :list [output fput :num :list] output fput first :list (insert :num butfirst :list) end to eraseline :num make "linenumbers remove :num :linenumbers end to immediate :line if equalp :line [list] [foreach :linenumbers [print thing ?] stop] if equalp :line [run] [run (list (word "basic% first :linenumbers)) stop] if equalp :line [exit] [throw "toplevel] print sentence [Invalid command:] :line end ;; Compiling each BASIC command to compile.end :command queue "definition [stop] end to compile.goto :command queue "definition (list (word "basic% last :command) "stop) end to compile.gosub :command queue "definition (list (word "basic% last :command)) end to compile.return :command queue "definition [stop] end to compile.print :command make "command butfirst :command while [not emptyp :command] [c.print1] queue "definition [print []] end to c.print1 make "exp expression ifelse equalp first first :exp "" ~ [make "sym gensym make word "%% :sym butfirst butlast first :exp queue "definition list "type word ":%% :sym] ~ [queue "definition fput "type :exp] if emptyp :command [stop] make "delimiter pop "command if equalp :delimiter ", [queue "definition [type char 9] stop] if equalp :delimiter "\; [stop] (throw "error [Comma or semicolon needed in print.]) end to compile.input :command make "command butfirst :command if equalp first first :command "" ~ [make "sym gensym make "prompt pop "command make word "%% :sym butfirst butlast :prompt queue "definition list "type word ":%% :sym] while [not emptyp :command] [c.input1] end to c.input1 make "var pop "command queue "definition (list "make (word ""% :var) "readvalue) if emptyp :command [stop] make "delimiter pop "command if equalp :delimiter ", [stop] (throw "error [Comma needed in input.]) end to compile.let :command make "command butfirst :command make "var pop "command make "delimiter pop "command if not equalp :delimiter "= [(throw "error [Need = in let.])] make "exp expression queue "definition (sentence "make (word ""% :var) :exp) end to compile.if :command make "command butfirst :command make "exp expression make "delimiter pop "command if not equalp :delimiter "then [(throw "error [Need then after if.])] queue "definition (sentence "if :exp (list c.if1)) end to c.if1 local "definition make "definition [[]] run list (word "compile. first :command) :command ifelse (count :definition) = 2 ~ [output last :definition] ~ [make "newname word "% gensym define :newname :definition output (list :newname)] end to compile.for :command make "command butfirst :command make "var pop "command make "delimiter pop "command if not equalp :delimiter "= [(throw "error [Need = after for.])] make "start expression make "delimiter pop "command if not equalp :delimiter "to [(throw "error [Need to after for.])] make "end expression queue "definition (sentence "make (word ""% :var) :start) queue "definition (sentence "make (word ""let% :var) :end) make "newname word "% gensym queue "definition (sentence "make (word ""next% :var) (list (list :newname))) queue "definition (list :newname) define :name :definition make "name :newname make "definition [[]] end to compile.next :command make "command butfirst :command make "var pop "command queue "definition (sentence "make (word ""% :var) (word ":% :var) [+ 1]) queue "definition (sentence [if not greaterp] (word ":% :var) (word ":let% :var) (list (list "run (word ":next% :var) "stop))) end ;; Compile an expression for LET, IF, PRINT, or FOR to expression make "expr [] make "token expr1 while [not emptyp :token] [queue "expr :token make "token expr1] output :expr end to expr1 if emptyp :command [output []] make "token pop "command if memberp :token [+ - * / = < > ( )] [output :token] if memberp :token [, \; : then to] [push "command :token output []] if numberp :token [output :token] if equalp first :token "" [output :token] output word ":% :token end ;; reading input to basicread output basicread1 readword [] " end to basicread1 :input :output :token if emptyp :input [if not emptyp :token [push "output :token] output reverse :output] if equalp first :input "| | [if not emptyp :token [push "output :token] output basicread1 (butfirst :input) :output "] if equalp first :input "" [if not emptyp :token [push "output :token] output breadstring butfirst :input :output "] if memberp first :input [+ - * / = < > ( ) , \; :] ~ [if not emptyp :token [push "output :token] output basicread1 (butfirst :input) (fput first :input :output) "] output basicread1 (butfirst :input) :output (word :token first :input) end to breadstring :input :output :string if emptyp :input [(throw "error [String needs ending quote.])] if equalp first :input "" ~ [output basicread1 (butfirst :input) (fput (word "" :string "") :output) "] output breadstring (butfirst :input) :output (word :string first :input) end to split :line output fput first :line split1 (butfirst :line) [] [] end to split1 :input :output :command if emptyp :input [if not emptyp :command [push "output reverse :command] output reverse :output] if equalp first :input ": [if not emptyp :command [push "output reverse :command] output split1 (butfirst :input) :output []] output split1 (butfirst :input) :output (fput first :input :command) end ;; Runtime library to nextline :num make "target member :num :linenumbers if not emptyp :target [make "target butfirst :target] if not emptyp :target [run (list (word "basic% first :target))] end to readvalue while [emptyp :readline] [make "readline basicread] output pop "readline end ucblogo-6.1/csls/algs0000664000175000017500000001442113557147341012743 0ustar jjcjjc;;; Algorithms and Data Structures ;; Local optimization of quadratic formula to quadratic :a :b :c localmake "root sqrt (:b * :b-4 * :a * :c) localmake "x1 (-:b+:root)/(2 * :a) localmake "x2 (-:b-:root)/(2 * :a) print (sentence [The solutions are] :x1 "and :x2) end ;; Memoization of T function to t :n :k localmake "result gprop :n :k if not emptyp :result [output :result] make "result realt :n :k pprop :n :k :result output :result end to realt :n :k if equalp :k 0 [output 1] if equalp :n 0 [output 0] output (t :n :k-1) + (t :n-1 :k) end ;; Speedup of Simplex function to simplex :buttons output 2 * first (cascade :buttons [fput (sumprods butfirst ?2 ?1) ?1] [1] [fput 1 nextrow ?2] [1 1]) end to sumprods :a :b output reduce "sum (map "product :a :b) end to nextrow :combs if emptyp butfirst :combs [output :combs] output fput (sum first :combs first butfirst :combs) nextrow butfirst :combs end ;; Sorting -- selection sort to ssort :list if emptyp :list [output []] output ssort1 (first :list) (butfirst :list) [] end to ssort1 :min :in :out if emptyp :in [output fput :min ssort :out] if lessthanp :min (first :in) ~ [output ssort1 :min (butfirst :in) (fput first :in :out)] output ssort1 (first :in) (butfirst :in) (fput :min :out) end ;; Sorting -- partition sort to psort :list if emptyp :list [output []] if emptyp butfirst :list [output :list] localmake "split ((first :list) + (last :list)) / 2 if lessthanp first :list :split ~ [output psort1 :split (butfirst :list) (list first :list) []] output psort1 :split (butlast :list) (list last :list) [] end to psort1 :split :in :low :high if emptyp :in [output sentence (psort :low) (psort :high)] if lessthanp first :in :split ~ [output psort1 :split (butfirst :in) (fput first :in :low) :high] output psort1 :split (butfirst :in) :low (fput first :in :high) end ;; Sorting -- count comparisons to lessthanp :a :b if not namep "comparisons [make "comparisons 0] make "comparisons :comparisons+1 output :a < :b end to howmany print :comparisons ern "comparisons end ;; Abstract Data Type for Trees: Constructor to tree :datum :children output fput :datum :children end ;; Tree ADT: Selectors to datum :node output first :node end to children :node output butfirst :node end ;; Tree ADT: Mutator to addchild :tree :child .setbf :tree (fput :child butfirst :tree) end ;; Tree ADT: other procedures to leaf :datum output tree :datum [] end to leaves :leaves output map [leaf ?] :leaves end to leafp :node output emptyp children :node end ;; The World tree to worldtree make "world ~ tree "world ~ (list (tree "France leaves [Paris Dijon Avignon]) (tree "China leaves [Beijing Shanghai Guangzhou Suzhou]) (tree [United States] (list (tree [New York] leaves [[New York] Albany Rochester Armonk] ) (tree "Massachusetts leaves [Boston Cambridge Sudbury Maynard] ) (tree "California leaves [[San Francisco] Berkeley [Palo Alto] Pasadena] ) (tree "Washington leaves [Seattle Olympia] ) ) ) (tree "Canada (list (tree "Ontario leaves [Toronto Ottawa Windsor] ) (tree "Quebec leaves [Montreal Quebec Lachine] ) (tree "Manitoba leaves [Winnipeg]) ) ) ) end to locate :city output locate1 :city :world "false end to locate1 :city :subtree :wanttree if and :wanttree (equalp :city datum :subtree) [output :subtree] if leafp :subtree ~ [ifelse equalp :city datum :subtree [output (list :city)] [output []]] localmake "lower locate.in.forest :city (children :subtree) :wanttree if emptyp :lower [output []] output ifelse :wanttree [:lower] [fput (datum :subtree) :lower] end to locate.in.forest :city :forest :wanttree if emptyp :forest [output []] localmake "child locate1 :city first :forest :wanttree if not emptyp :child [output :child] output locate.in.forest :city butfirst :forest :wanttree end to cities :name output cities1 (finddatum :name :world) end to cities1 :subtree if leafp :subtree [output (list datum :subtree)] output map.se [cities1 ?] children :subtree end to finddatum :datum :tree output locate1 :name :tree "true end ;; Area code/city pairs ADT to areacode :pair output first :pair end to city :pair output butfirst :pair end ;; Area code linear search make "codelist [[202 Washington] [206 Seattle] [212 New York] [213 Los Angeles] [215 Philadelphia] [303 Denver] [305 Miami] [313 Detroit] [314 St. Louis] [401 Providence] [404 Atlanta] [408 Sunnyvale] [414 Milwaukee] [415 San Francisco] [504 New Orleans] [608 Madison] [612 St. Paul] [613 Kingston] [614 Columbus] [615 Nashville] [617 Boston] [702 Las Vegas] [704 Charlotte] [712 Sioux City] [714 Anaheim] [716 Rochester] [717 Scranton] [801 Salt Lake City] [804 Newport News] [805 Ventura] [808 Honolulu]] to listcity :code output city find [equalp :code areacode ?] :codelist end ;; Area code binary tree search to balance :list if emptyp :list [output []] if emptyp butfirst :list [output leaf first :list] output balance1 (int (count :list)/2) :list [] end to balance1 :count :in :out if equalp :count 0 ~ [output tree (first :in) (list balance reverse :out balance butfirst :in)] output balance1 (:count-1) (butfirst :in) (fput first :in :out) end to treecity :code output city treecity1 :code :codetree end to treecity1 :code :tree if emptyp :tree [output [0 no city]] localmake "datum datum :tree if :code = areacode :datum [output :datum] if :code < areacode :datum [output treecity1 :code lowbranch :tree] output treecity1 :code highbranch :tree end to lowbranch :tree if leafp :tree [output []] output first children :tree end to highbranch :tree if leafp :tree [output []] output last children :tree end ucblogo-6.1/config.h0000664000175000017500000000407213601426454012540 0ustar jjcjjc/* config.h. Generated from config.h.in by configure. */ /* config.h.in. Generated automatically from configure.in by autoheader. */ /* Define if you need to in order for stat and other things to work. */ /* #undef _POSIX_SOURCE */ /* Define as the return instruction for signal handlers. */ #define SIGRET /* Define as the return type of signal handlers (int or void). */ #define RETSIGTYPE void /* Define if signal handlers take an argument. */ #define SIG_TAKES_ARG /* Define to `unsigned' if doesn't define. */ /* #undef size_t */ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you have the matherr function. */ /* #undef HAVE_MATHERR */ /* Define if you have the sigsetmask function. */ #define HAVE_SIGSETMASK 1 /* Define if you have the sigvec function. */ /* #undef HAVE_SIGVEC */ /* Define if you have the srandom function. */ #define HAVE_SRANDOM 1 /* Define if you have the usleep function. */ #define HAVE_USLEEP 1 /* Define if you have the memcpy function. */ #define HAVE_MEMCPY 1 /* Define if you have the header file. */ #define HAVE_SGTTY_H 1 /* Define if you have the header file. */ #define HAVE_TERMIO_H 1 /* Define if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define if you have the header file. */ #define HAVE_STRING_H 1 /* Define if you have the header file. */ #define HAVE_TERMCAP_H 1 /* Define if you have the header file. */ /* #undef HAVE_TERMLIB_H */ /* Define if you have the header file. */ #define HAVE_CURSES_H 1 /* Define if you have the BSD library (-lBSD). */ #define HAVE_LIBBSD 1 /* Define if you have the curses library (-lcurses). */ /* #undef HAVE_LIBCURSES */ /* Define if you have the m library (-lm). */ #define HAVE_LIBM 1 /* Define if you have the termcap library (-ltermcap). */ #define HAVE_LIBTERMCAP 1 /* Define if you have the termlib library (-ltermlib). */ /* #undef HAVE_LIBTERMLIB */ /* Define if you have the wx library. */ #define HAVE_WX 1 ucblogo-6.1/makefile0000664000175000017500000000752313601426454012626 0ustar jjcjjcCC = gcc CFLAGS = -g -O2 -DHAVE_WX -O0 -DUSE_OLD_TTY CXX = g++ CXXFLAGS = -g -O2 -DHAVE_WX -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread LDFLAGS = LIBS = -lSM -lICE -lbsd -lm -pthread -lwx_gtk3u_xrc-3.0 -lwx_gtk3u_webview-3.0 -lwx_gtk3u_html-3.0 -lwx_gtk3u_qa-3.0 -lwx_gtk3u_adv-3.0 -lwx_gtk3u_core-3.0 -lwx_baseu_xml-3.0 -lwx_baseu_net-3.0 -lwx_baseu-3.0 -ltermcap -lX11 prefix = /usr/local BINDIR = $(prefix)/bin LIBLOC = $(prefix)/lib/logo LINKER = g++ -o # LIBLOC = `pwd` OBJS = coms.o error.o eval.o files.o graphics.o init.o intern.o \ libloc.o lists.o logodata.o main.o math.o mem.o paren.o parse.o \ print.o wrksp.o nographics.o git.o obj.o wxMain.o wxTerminal.o wxTurtleGraphics.o TextEditor.o wxterm.o SRCS = coms.c error.c eval.c files.c graphics.c init.c intern.c \ libloc.c lists.c logodata.c main.c math.c mem.c paren.c parse.c \ print.c wrksp.c nographics.c obj.c wxMain.cpp wxTerminal.cpp wxTurtleGraphics.cpp TextEditor.cpp wxterm.c HDRS = globals.h logo.h xgraphics.h logo: $(OBJS) $(LINKER) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o logo everything: logo logolib/Messages helpfiles helpfiles/HELPCONTENTS #logo-mode mem.o: mem.c $(CC) $(CFLAGS) -O0 -c mem.c git.c: $(SRCS) echo 'char* GIT = "('`git describe||echo NA|tr -d '\r'`')";' > git.c tags: $(SRCS) ctags --format=1 -N $(SRCS) $(HDRS) # ctags -t $(SRCS) $(HDRS) libloc.c: echo 'char *libloc="'$(LIBLOC)'/logolib";' > libloc.c echo 'char *helploc="'$(LIBLOC)'/helpfiles";' >> libloc.c echo 'char *cslsloc="'$(LIBLOC)'/csls";' >> libloc.c echo 'char *temploc="/tmp";' >> libloc.c echo 'char *separator="/";' >> libloc.c logolib/Messages: makelib Messages chmod +x makelib ./makelib cp -f Messages logolib helpfiles: mkdir helpfiles helpfiles/HELPCONTENTS: makehelp usermanual ./makehelp sort helptemp | pr -5 -t -l999 -w80 >> helpfiles/HELPCONTENTS rm helptemp makehelp: makehelp.c $(CC) -o makehelp makehelp.c clean: rm -f *.o libloc.c # cd emacs; $(MAKE) clean ship: rm -f config.h config.cache config.log config.status rm -f makefile makehelp logo *.o libloc.c # cd emacs; $(MAKE) ship cd docs; $(MAKE) ship install: everything for d in $(BINDIR) $(LIBLOC) $(LIBLOC)/logolib $(LIBLOC)/helpfiles $(LIBLOC)/csls; do [ -d $$d ] || mkdir -p $$d || exit 1; done cp logo $(BINDIR)/. cp -f logolib/* $(LIBLOC)/logolib/. cp -f helpfiles/* $(LIBLOC)/helpfiles/. cp -f csls/* $(LIBLOC)/csls/. # (cd emacs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE) install) (cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE) install) # prefix=$(prefix); LIBLOC=$(LIBLOC); BINDIR=$(BINDIR); export prefix LIBLOC BINDIR; cd emacs; $(MAKE) install logo-mode: # (cd emacs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE)) # @prefix=$(prefix); LIBLOC=$(LIBLOC); BINDIR=$(BINDIR); export prefix LIBLOC BINDIR; cd emacs; $(MAKE) make-docs: (cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) $(MAKE) all) mac: everything mkdir -p UCBLogo.app mkdir -p UCBLogo.app/Contents cp Info.plist UCBLogo.app/Contents/ cp PkgInfo UCBLogo.app/Contents/ cp pbdevelopment.plist UCBLogo.app/Contents/ mkdir -p UCBLogo.app/Contents/Resources/csls cp csls/[a-z]* UCBLogo.app/Contents/Resources/csls cp -r helpfiles UCBLogo.app/Contents/Resources/ cp -r logolib UCBLogo.app/Contents/Resources/ cp logo.icns UCBLogo.app/Contents/Resources/ mkdir -p UCBLogo.app/Contents/MacOS/ cp logo UCBLogo.app/Contents/MacOS/UCBLogo ucblogo.dmg : mac rm -f ucblogo.dmg ucblogo_base.dmg hdiutil create -size 15m -fs HFS+ -volname "UCBLogo" ucblogo_base.dmg hdiutil attach ucblogo_base.dmg cp -a UCBLogo.app /Volumes/UCBLogo/ cp docs/usermanual.pdf /Volumes/UCBLogo/UCBLogoUserManual.pdf hdiutil detach /Volumes/UCBLogo/ hdiutil convert ucblogo_base.dmg -format UDZO -o ucblogo.dmg ucblogo-6.1/tests/0000775000175000017500000000000013575571772012277 5ustar jjcjjcucblogo-6.1/tests/_suite-template.lg0000664000175000017500000000270213575571772015725 0ustar jjcjjc;MAKING A NEW TEST SUITE: ;------------------------- ;1) replace $title with the human-readable title ;2) replace $suite with the short name of the suite (alpha/numeric) ;3) remove these comments ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; BERKELEY LOGO ;; ;; $title ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InstallSuite [$title] [Tests.$suite.Setup] ;; The list of all OOP unit tests ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAKE "Tests.$suite [ ;list tests here Tests.$suite.SampleTest ] ;; Test Suite setup procedure, main entry ;; point for all tests in this suite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to Tests.$suite.Setup RunTests :Tests.$suite end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; HELPERS, MISC ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; ADD INDIVIDUAL UNIT TESTS BELOW ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;all tests must return T/F indicating success/failure to Tests.$suite.SampleTest OUTPUT (AND [EQUAL? 0 0] [EQUAL? 0 0] [EQUAL? 0 0] [EQUAL? 0 0]) end ucblogo-6.1/tests/_how-to.txt0000664000175000017500000000064613575571772014422 0ustar jjcjjcRunning Tests ------------- Open logo, then load the root test framework, "UnitTests.lg" To run all tests, type: RunAll To run individual tests, execute the name of the test, such as: Tests.Arithmetic.Difference Creating Test Suites -------------------- To create a new test suite, copy _suite-template.lg and rename to "UnitTests-SuiteName.lg". Then follow the instructions in the the template. ucblogo-6.1/tests/UnitTests.lg0000664000175000017500000000575413575571772014600 0ustar jjcjjc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; BERKELEY LOGO ;; ;; UNIT TEST FRAMEWORK ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; Use InstallSuite to add a test suite ;; ;; setup procedure to the global list ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAKE "Tests.All [] to InstallSuite :SetupProc :SuiteName MAKE "Tests.All se :Tests.All (list (list :SuiteName :SetupProc)) end ;; Procedure for executing tests ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to RunTests :Tests IFELSE [EMPTY? :Tests] [STOP] [ PrintTestName (WORD FIRST :Tests "...\ ) ; PrepTest sets two vars, Success and Err ; Success = 1 means the value returned was True ; Error = 1 means the code crashed ; Any code that doesn't return a value will crash RUN PrepTest FIRST :Tests IFELSE [Equal? :Success 1] [PRINT "Ok] [ IFELSE [Equal? :Err 1] [PRINT [\ \ \ \ \ \ \ Error]] [ PRINT [\ \ \ \ \ \ \ Failed]]] RunTests BF :Tests ] end ;; Runs ALL tests installed into :Tests.All ;; These should be setup procs that in turn ;; call RunTests, not individual Unit Tests ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to RunAll PRINT [--------------------------] PRINT [ Berkeley Logo Unit Tests] PRINT [--------------------------] PRINT se [Test Suites: ] (count :Tests.All) FOREACH :Tests.All [PRINT " (PrintHeader LAST ? ) (RUN FIRST ?) PRINT [----------------------------------------------------------]] PRINT [] PRINT [All tests completed.] end ;; HELPER PROCS ;;;;;;;;;;;;;;;; to PrepTest :TestCode OUTPUT (se [make "success 0] ~ [make "err 1] ~ [CATCH "Error ] ~ (list (se [IFELSE] (list :testcode) ~ (list [make "success 1 make "err 0]) ~ (list [make "success 0 make "err 0]))) ~ ) end to PrintHeader :Title PRINT (se [\[] :Title [\]]) ;REPEAT ((countdeep :title) + 4) [TYPE "-] PRINT [----------------------------------------------------------] end to PrintTestName :TestName Type :TestName REPEAT 45 - count :TestName [Type "\ ] end to CountDeep :lst make "i 0 foreach :lst [ foreach ? [ make "i :i + 1 ] make "i :i + 1 ] output :i - 1 end ;; Import each individual test suite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;LOAD "UnitTests-Eval.lg ;LOAD "UnitTests-Turtle.lg ;LOAD "UnitTests-Lang.lg ;LOAD "UnitTests-LogoLib-Loops.lg ;LOAD "UnitTests-Mem.lg LOAD "UnitTests-Arithmetic.lg LOAD "UnitTests-Bitwise.lg LOAD "UnitTests-Constructors.lg LOAD "UnitTests-Predicates.lg LOAD "UnitTests-Random.lg LOAD "UnitTests-OOP.lg ucblogo-6.1/tests/UnitTests-Random.lg0000664000175000017500000000262313575571772016006 0ustar jjcjjc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; BERKELEY LOGO ;; ;; Random Number Unit Tests ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InstallSuite [Random Numbers] [Tests.Random.Setup] ;; The list of all OOP unit tests ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAKE "Tests.Random [ ;list tests here Tests.Random.RandomNumMonadic Tests.Random.RandomNumDyadic ] ;; Test Suite setup procedure, main entry ;; point for all tests in this suite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to Tests.Random.Setup RunTests :Tests.Random end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; HELPERS, MISC ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; ADD INDIVIDUAL UNIT TESTS BELOW ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;all tests must return T/F indicating success/failure to Tests.Random.RandomNumMonadic OUTPUT (AND [(Random 1) = 0]) end to Tests.Random.RandomNumDyadic Make "Num3 (Random 3 5) print (AND [(Random -1 0) = -1] [GreaterEqual? :num3 3] [LessEqual? :num3 5]) end ucblogo-6.1/tests/UnitTests-Predicates.lg0000664000175000017500000000457413575571772016660 0ustar jjcjjc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; BERKELEY LOGO ;; ;; Predicates Test Suite ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InstallSuite [Predicates] [Tests.Predicates.Setup] ;; The list of all OOP unit tests ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAKE "Tests.Predicates [ ;list tests here Tests.Predicates.LessP Tests.Predicates.Less? Tests.Predicates.GreaterP Tests.Predicates.Greater? Tests.Predicates.LessEqualP Tests.Predicates.LessEqual? Tests.Predicates.GreaterEqualP Tests.Predicates.GreaterEqual? ] ;; Test Suite setup procedure, main entry ;; point for all tests in this suite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to Tests.Predicates.Setup RunTests :Tests.Predicates end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; HELPERS, MISC ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; ADD INDIVIDUAL UNIT TESTS BELOW ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;all tests must return T/F indicating success/failure to Tests.Predicates.LessP OUTPUT (AND [LESSP 1 2] [LESSP 0 1] [LESSP -1 0]) end to Tests.Predicates.Less? OUTPUT (AND [LESS? 1 2] [LESS? 0 1] [LESS? -1 0]) end to Tests.Predicates.GreaterP OUTPUT (AND [GreaterP 2 1] [GreaterP 1 0] [GreaterP 0 -1]) end to Tests.Predicates.Greater? OUTPUT (AND [Greater? 2 1] [Greater? 1 0] [Greater? 0 -1]) end to Tests.Predicates.LessEqualP OUTPUT (AND [LessEqualP 2 2] [LessEqualP 0 1] [LessEqualP -3 -3]) end to Tests.Predicates.LessEqual? OUTPUT (AND [LessEqual? 2 2] [LessEqual? 0 1] [LessEqual? -3 -3]) end to Tests.Predicates.GreaterEqualP OUTPUT (AND [GreaterEqualP 2 2] [GreaterEqualP 1 0] [GreaterEqualP -1 -1]) end to Tests.Predicates.GreaterEqual? OUTPUT (AND [GreaterEqual? 2 2] [GreaterEqual? 1 0] [GreaterEqual? -1 -1]) enducblogo-6.1/tests/UnitTests-OOP.lg0000664000175000017500000001211113575571772015214 0ustar jjcjjc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; BERKELEY LOGO ;; ;; OOP TEST SUITE ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InstallSuite [OOP Tests] [Tests.OOP.Setup] ;; The list of all OOP unit tests ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAKE "Tests.OOP [ Tests.OOP.Ask Tests.OOP.Exist Tests.OOP.Make Tests.OOP.MakeMany Tests.OOP.OneOf Tests.OOP.OneOfCheckVar Tests.OOP.OverrideExist Tests.OOP.Parents Tests.OOP.TalkTo Tests.OOP.Usual Tests.OOP.UsualChain ;; The following are strictly regression tests Tests.OOP.ChildWontChangeParent Tests.OOP.MemberFunctionOverride Tests.OOP.CaseSensitiveMemberVars Tests.OOP.OverriddenMethods ] ;; Test Suite setup procedure, main entry ;; point for all tests in this suite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to Tests.OOP.Setup RunTests :Tests.OOP end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; HELPERS & OBJECTS ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to ignore :value end make "ABase kindof logo ask :ABase [to Exist] have "avar make "avar 1 end make "ExistChild kindof logo ask :ExistChild [to Exist] make "avar 2 end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; ADD INDIVIDUAL UNIT TESTS BELOW ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to safecheck :obj :var :expected make "success 0 CATCH "Error [ignore (ask thing :obj [thing :var]) make "success 1] OUTPUT IFELSE [equal? :success 0] [equal? 0 1] [equal? (ask thing :obj [thing :var]) 1] end to Tests.OOP.Ask make "bob kindof logo make "dummy ask :bob [self] OUTPUT EQUAL? 1 1 end to Tests.OOP.Exist make "bob oneof :ABase OUTPUT EQUAL? (ASK :bob [:avar]) 1 end to Tests.OOP.Make make "bob kindof logo OUTPUT Equal? 1 1 end to Tests.OOP.MakeMany make "loqi kindof logo make "geetha kindof logo make "chaidan (kindof :loqi :geetha) OUTPUT equal? (Count ask :chaidan [parents]) 2 end to Tests.OOP.OneOf make "bob oneof :ABase OUTPUT Equal? 1 1 end to Tests.OOP.OneOfCheckVar make "bob oneof :ABase OUTPUT EQUAL? (ASK :bob [:avar]) 1 end to Tests.OOP.OverrideExist make "bob kindof :ExistChild ask :bob [exist] ;OUTPUT safecheck "bob "avar 2 OUTPUT Equal? (ask :bob [:avar]) 2 end to Tests.OOP.Parents make "bob kindof logo make "jim kindof :bob OUTPUT AND (ask :jim [parents]) = (list :bob) (ask :bob [parents]) = (list Logo) end to Tests.OOP.TalkTo make "bob kindof logo ask :bob [have "hat] ask :bob [make "hat "red] talkto :bob make "result equal? :hat "red talkto Logo OUTPUT :result end ;; Syntax to test ;; Usual.Method (inside an object proc call) ;; Overriding methods (by redefining exsiting methods) ;; Exist / overriding Exist ;; Usual.Exist (inside overriden exist) ;; Make "OBj OneOf :OtherObj (a combination of KindOf and Exist) ;; Make "NewObj (OneOf :Obj "prop value) -- initialize with specific values ;; HaveMake "Name Value (have combined with make) make "Usual1 something ask :Usual1 [to foo] op "True end Make "Usual2 kindof :Usual1 ask :Usual2 [to foo] op usual.foo end make "Usual3 kindof :Usual2 ask :Usual3 [to foo] op usual.foo end to Tests.OOP.Usual OUTPUT equalp (ask :Usual2 [foo]) "True end to Tests.OOP.UsualChain OUTPUT equalp (ask :Usual3 [foo]) "True end ;; ------------------------------------------------- ;; REGRESSION TESTS ;; ------------------------------------------------- ;; This regression tests verifies ;; that when you change a child value ;; the parent value remains unchanged to Tests.OOP.ChildWontChangeParent make "bob oneof Logo ask :bob [have "hat] ask :bob [make "hat "blue] make "joe oneof :bob ask :joe [make "hat "red] OUTPUT (ask :bob [:hat]) = (ask :joe [:hat]) end to Tests.OOP.CaseSensitiveMemberVars make "bob something ask :bob [have "aVarIable] ask :bob [make "aVarIable 1] ask :bob [make "avariable 2] OUTPUT equal? (ask :bob [:avariable]) 2 end make "a something ask :a [to foo :x] output :x end make "b kindof :a ask :b [to foo] OUTPUT usual.foo "True end to Tests.OOP.OverriddenMethods make "c kindof :b (ask :c [make "baz foo]) OUTPUT equal? (ask :c [:baz]) "True end ;; This is setup for the next test ;; When an object has a function with the ;; same name as its parent's, the child's method ;; should be called, not the parent's method make "MemRegr KindOf Logo to OOP.Regr.foo OUTPUT 1 end ask :MemRegr [to OOP.Regr.foo] OUTPUT 0 end to Tests.OOP.MemberFunctionOverride OUTPUT equal? (ASK :MemRegr [OOP.Regr.foo]) 0 end ;; TODO: Need to test the TO proc on objects ;; but logo doesn't like it when you use ;; TO inside a TO ucblogo-6.1/tests/UnitTests-Constructors.lg0000664000175000017500000000560313575571772017277 0ustar jjcjjc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; BERKELEY LOGO ;; ;; Constructors ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InstallSuite [Constructors] [Tests.Constructors.Setup] ;; The list of all OOP unit tests ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAKE "Tests.Constructors [ ;list tests here Tests.Constructors.Word Tests.Constructors.List Tests.Constructors.ListMany Tests.Constructors.Sentence Tests.Constructors.SentenceMany Tests.Constructors.FPut Tests.Constructors.LPut Tests.Constructors.Array Tests.Constructors.MDArray Tests.Constructors.MDArrayMulti ] ;; Test Suite setup procedure, main entry ;; point for all tests in this suite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to Tests.Constructors.Setup RunTests :Tests.Constructors end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; HELPERS, MISC ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; ADD INDIVIDUAL UNIT TESTS BELOW ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;all tests must return T/F indicating success/failure to Tests.Constructors.Word MAKE "x WORD "1 "2 OUTPUT (AND [WORD? :x] [equal? :x "12]) end to Tests.Constructors.List MAKE "x list "1 "2 OUTPUT (AND [LIST? :x] [EQUAL? COUNT :x 2]) end to Tests.Constructors.ListMany MAKE "x (list "1 "2 "3 "4) OUTPUT (AND [LIST? :x] [EQUAL? COUNT :x 4]) end to Tests.Constructors.Sentence MAKE "x se "1 "2 MAKE "y SENTENCE "3 "4 OUTPUT (AND [LIST? :x] [EQUAL? COUNT :x 2] [LIST? :y] [EQUAL? COUNT :y 2]) end to Tests.Constructors.SentenceMany MAKE "x (se "1 "2 "3 "4 "5) MAKE "y (SENTENCE "3 "4 "5 "6 "7) OUTPUT (AND [LIST? :x] [EQUAL? COUNT :x 5] [LIST? :y] [EQUAL? COUNT :y 5]) end to Tests.Constructors.FPut MAKE "x LIST "4 "5 MAKE "X FPUT "1 :x OUTPUT (AND [LIST? :x] [EQUAL? COUNT :x 3] [EQUAL? FIRST :x "1] [EQUAL? LAST :x "5]) end to Tests.Constructors.LPut MAKE "x LIST "4 "5 MAKE "x LPUT "1 :x OUTPUT (AND [LIST? :x] [EQUAL? COUNT :x 3] [EQUAL? FIRST :x "4] [EQUAL? LAST :x "1]) end to Tests.Constructors.Array MAKE "x ARRAY 2 OUTPUT (AND [ARRAY? :x]) end to Tests.Constructors.MDArray MAKE "x MDARRAY 2 OUTPUT (AND [ARRAY? :x]) end to Tests.Constructors.MDArrayMulti MAKE "y (MDARRAY [2 2] 0) OUTPUT (AND [ARRAY? :y]) end ucblogo-6.1/tests/UnitTests-Bitwise.lg0000664000175000017500000000460313575571772016174 0ustar jjcjjc ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; BERKELEY LOGO ;; ;; Bitwise Operations ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InstallSuite [Bitwise Operations] [Tests.Bitwise.Setup] ;; The list of all OOP unit tests ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAKE "Tests.Bitwise [ ;list tests here Tests.Bitwise.BitAnd Tests.Bitwise.BitOr Tests.Bitwise.BitXOr Tests.Bitwise.BitNot Tests.Bitwise.AShift Tests.Bitwise.LShift ] ;; Test Suite setup procedure, main entry ;; point for all tests in this suite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to Tests.Bitwise.Setup RunTests :Tests.Bitwise end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; HELPERS, MISC ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; ADD INDIVIDUAL UNIT TESTS BELOW ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;all tests must return T/F indicating success/failure to Tests.Bitwise.BitAnd OUTPUT (AND [EQUAL? (BITAND 0 1) 0] [EQUAL? (BITAND 1 257) 1] [EQUAL? (BITAND 256 1280) 256] [EQUAL? (BITAND 2 4) 0]) end to Tests.Bitwise.BitOr OUTPUT (AND [EQUAL? (BITOR 0 1) 1] [EQUAL? (BITOR 1 256) 257] [EQUAL? (BITOR 256 1024) 1280] [EQUAL? (BITOR 2 4) 6]) end to Tests.Bitwise.BitXor OUTPUT (AND [EQUAL? (BITXOR 0 1) 1] [EQUAL? (BITXOR 1 256) 257] [EQUAL? (BITXOR 256 1280) 1024] [EQUAL? (BITXOR 7 7) 0]) end to Tests.Bitwise.BitNot OUTPUT (AND [EQUAL? (BITNOT 0) -1] [EQUAL? (BITNOT 1) -2] [EQUAL? (BITNOT -8) 7] [EQUAL? (BITNOT -1) 0]) end to Tests.Bitwise.AShift OUTPUT (AND [EQUAL? (ASHIFT 0 1) 0] [EQUAL? (ASHIFT 1 4) 16] [EQUAL? (ASHIFT 2 -1) 1] [EQUAL? (ASHIFT -1 -1) -1]) end to Tests.Bitwise.LShift OUTPUT (AND [EQUAL? (LSHIFT 0 1) 0] [EQUAL? (LSHIFT 1 4) 16] [EQUAL? (LSHIFT 2 -1) 1] [GREATEREQUAL? (LSHIFT -1 -1) 0]) end ucblogo-6.1/tests/UnitTests-Arithmetic.lg0000664000175000017500000001027513575571772016661 0ustar jjcjjc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; BERKELEY LOGO ;; ;; Arithmetic Test Suite ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; InstallSuite [Arithmetic Tests] [Tests.Arithmetic.Setup] ;; The list of all OOP unit tests ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; MAKE "Tests.Arithmetic [ ;list tests here Tests.Arithmetic.Add Tests.Arithmetic.Sum Tests.Arithmetic.Subtract Tests.Arithmetic.Difference Tests.Arithmetic.Minus Tests.Arithmetic.Negative Tests.Arithmetic.Multiply Tests.Arithmetic.Product Tests.Arithmetic.Divide Tests.Arithmetic.Quotient Tests.Arithmetic.Remainder Tests.Arithmetic.Modulo Tests.Arithmetic.Int Tests.Arithmetic.Round Tests.Arithmetic.Sqrt Tests.Arithmetic.Power Tests.Arithmetic.Exp Tests.Arithmetic.Log10 ; Incomplete: ;Tests.Arithmetic.Ln ;Tests.Arithmetic.Sin ;Tests.Arithmetic.RadSin ;Tests.Arithmetic.Cos ;Tests.Arithmetic.RadCos ;Tests.Arithmetic.ArcTan ;Tests.Arithmetic.ISeq ;Tests.Arithmetic.RSeq ] ;; Test Suite setup procedure, main entry ;; point for all tests in this suite ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; to Tests.Arithmetic.Setup RunTests :Tests.Arithmetic end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; HELPERS, MISC ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; ADD INDIVIDUAL UNIT TESTS BELOW ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;all tests must return T/F indicating success/failure to Tests.Arithmetic.Add OUTPUT EQUAL? 1 + 1 2 end to Tests.Arithmetic.Sum OUTPUT EQUAL? (SUM 1 2 3 -1) 5 end to Tests.Arithmetic.Subtract OUTPUT (AND [EQUAL? 1 - 1 0] [EQUAL? -1 - 1 -2]) end to Tests.Arithmetic.Difference OUTPUT EQUAL? (DIFFERENCE 1 1) 0 end to Tests.Arithmetic.Minus OUTPUT EQUAL? (MINUS 1) -1 end to Tests.Arithmetic.Negative OUTPUT EQUAL? -1 -1 end to Tests.Arithmetic.Product OUTPUT EQUAL? (PRODUCT 1 2 3 4) 24 end to Tests.Arithmetic.Multiply OUTPUT (AND [EQUAL? 1 * 100 100] [EQUAL? 2 * 3 6] [EQUAL? 2 * 0 0] [EQUAL? -1 * 5 -5]) end to Tests.Arithmetic.Divide OUTPUT EQUAL? 10 / 2 5 end to Tests.Arithmetic.Quotient OUTPUT (AND [EQUAL? (QUOTIENT 10 2) 5] [EQUAL? (QUOTIENT 10) 0.1]) end to Tests.Arithmetic.Remainder OUTPUT (AND [EQUAL? (REMAINDER 9 2) 1] [EQUAL? (REMAINDER 10 10) 0]) end to Tests.Arithmetic.Modulo OUTPUT (AND [EQUAL? (MODULO 9 2) 1] [EQUAL? (MODULO 10 10) 0]) end to Tests.Arithmetic.Int OUTPUT (AND [EQUAL? (INT 9.2) 9] [EQUAL? (INT 9.9) 9]) end to Tests.Arithmetic.Round OUTPUT (AND [EQUAL? (ROUND 9.2) 9] [EQUAL? (ROUND 9.9) 10]) end to Tests.Arithmetic.SQRT OUTPUT (AND [EQUAL? (SQRT 9) 3] [EQUAL? (SQRT 441) 21]) end to Tests.Arithmetic.POWER OUTPUT (AND [EQUAL? (POWER 3 2) 9] [EQUAL? (POWER 21 2) 441]) end to Tests.Arithmetic.EXP OUTPUT (AND [EQUAL? (EXP 0) 1] [EQUAL? (EXP 1) 2.71828182845904523536]) end to Tests.Arithmetic.LOG10 OUTPUT (AND [EQUAL? (LOG10 1) 0] [EQUAL? (LOG10 10) 1] [EQUAL? (LOG10 100) 2] [EQUAL? (LOG10 1000) 3]) end to Tests.Arithmetic.LN OUTPUT (AND [EQUAL? (LN 10) 4.6051701859880913680359829093687] [EQUAL? (LN 100) 4.6051701859880913680359829093687]) end to Tests.Arithmetic.Sin OUTPUT EQUAL? 0 1 end to Tests.Arithmetic.RadSin OUTPUT EQUAL? 0 1 end to Tests.Arithmetic.Cos OUTPUT EQUAL? 0 1 end to Tests.Arithmetic.RadCos OUTPUT EQUAL? 0 1 end to Tests.Arithmetic.ArcTan OUTPUT EQUAL? 0 1 end to Tests.Arithmetic.RadArcTan OUTPUT EQUAL? 0 1 end to Tests.Arithmetic.ISeq OUTPUT EQUAL? 0 1 end to Tests.Arithmetic.RSeq OUTPUT EQUAL? 0 1 end ucblogo-6.1/configure_hand0000775000175000017500000017753113575571772014054 0ustar jjcjjc#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated automatically using autoconf version 2.10 # Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. # Defaults: ac_help= ac_default_prefix=/usr/local # Any additions from configure.in: ac_help="$ac_help --with-x use the X Window System" # Initialize some variables set by options. # The variables have the same names as the options, with # dashes changed to underlines. build=NONE cache_file=./config.cache exec_prefix=NONE host=NONE no_create= nonopt=NONE no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= target=NONE verbose= x_includes=NONE x_libraries=NONE wx_config_path=NONE wx_enable=maybe bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datadir='${prefix}/share' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' libdir='${exec_prefix}/lib' includedir='${prefix}/include' oldincludedir='/usr/include' infodir='${prefix}/info' mandir='${prefix}/man' # Initialize some other variables. subdirs= MFLAGS= MAKEFLAGS= ac_prev= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval "$ac_prev=\$ac_option" ac_prev= continue fi case "$ac_option" in -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; *) ac_optarg= ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case "$ac_option" in -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir="$ac_optarg" ;; -build | --build | --buil | --bui | --bu) ac_prev=build ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build="$ac_optarg" ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file="$ac_optarg" ;; -datadir | --datadir | --datadi | --datad | --data | --dat | --da) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ | --da=*) datadir="$ac_optarg" ;; -disable-* | --disable-*) ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` eval "enable_${ac_feature}=no" ;; -enable-* | --enable-*) ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } fi ac_feature=`echo $ac_feature| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "enable_${ac_feature}='$ac_optarg'" ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix="$ac_optarg" ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he) # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat << EOF Usage: configure [options] [host] Options: [defaults in brackets after descriptions] Configuration: --cache-file=FILE cache test results in FILE --help print this message --no-create do not create output files --quiet, --silent do not print \`checking...' messages --version print the version of autoconf that created configure Directory and file names: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [same as prefix] --bindir=DIR user executables in DIR [EPREFIX/bin] --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] --libexecdir=DIR program executables in DIR [EPREFIX/libexec] --datadir=DIR read-only architecture-independent data in DIR [PREFIX/share] --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data in DIR [PREFIX/com] --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] --libdir=DIR object code libraries in DIR [EPREFIX/lib] --includedir=DIR C header files in DIR [PREFIX/include] --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] --infodir=DIR info documentation in DIR [PREFIX/info] --mandir=DIR man documentation in DIR [PREFIX/man] --srcdir=DIR find the sources in DIR [configure dir or ..] --program-prefix=PREFIX prepend PREFIX to installed program names --program-suffix=SUFFIX append SUFFIX to installed program names --program-transform-name=PROGRAM run sed PROGRAM on installed program names EOF cat << EOF Host type: --build=BUILD configure for building on BUILD [BUILD=HOST] --host=HOST configure for HOST [guessed] --target=TARGET configure for TARGET [TARGET=HOST] Features and packages: --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR EOF if test -n "$ac_help"; then echo "--enable and --with options recognized:$ac_help" fi exit 0 ;; -host | --host | --hos | --ho) ac_prev=host ;; -host=* | --host=* | --hos=* | --ho=*) host="$ac_optarg" ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir="$ac_optarg" ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir="$ac_optarg" ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir="$ac_optarg" ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir="$ac_optarg" ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst \ | --locals | --local | --loca | --loc | --lo) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* \ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) localstatedir="$ac_optarg" ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir="$ac_optarg" ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir="$ac_optarg" ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix="$ac_optarg" ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix="$ac_optarg" ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix="$ac_optarg" ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name="$ac_optarg" ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir="$ac_optarg" ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir="$ac_optarg" ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site="$ac_optarg" ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir="$ac_optarg" ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir="$ac_optarg" ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target="$ac_optarg" ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers) echo "configure generated by autoconf version 2.10" exit 0 ;; -with-* | --with-*) ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` case "$ac_option" in *=*) ;; *) ac_optarg=yes ;; esac eval "with_${ac_package}='$ac_optarg'" ;; -without-* | --without-*) ac_package=`echo $ac_option|sed -e 's/-*without-//'` # Reject names that are not valid shell variable names. if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } fi ac_package=`echo $ac_package| sed 's/-/_/g'` eval "with_${ac_package}=no" ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes="$ac_optarg" ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries="$ac_optarg" ;; -wx-config_path=* | --wx-config_path=*) wx_config_path="$ac_optarg" ;; -wx-enable | --wx-enable | -wx | --wx) wx_enable=yes;; -wx-disable | --wx-disable | -nowx | --nowx) wx_enable=no;; -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } ;; *) if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then echo "configure: warning: $ac_option: invalid host type" 1>&2 fi if test "x$nonopt" != xNONE; then { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } fi nonopt="$ac_option" ;; esac done if test -n "$ac_prev"; then { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } fi trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 # File descriptor usage: # 0 standard input # 1 file creation # 2 errors and warnings # 3 some systems may open it to /dev/tty # 4 used on the Kubota Titan # 6 checking for... messages and results # 5 compiler messages saved in config.log if test "$silent" = yes; then exec 6>/dev/null else exec 6>&1 fi exec 5>./config.log echo "\ This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. " 1>&5 # Strip out --no-create and --no-recursion so they do not pile up. # Also quote any args containing shell metacharacters. ac_configure_args= for ac_arg do case "$ac_arg" in -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c) ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) ac_configure_args="$ac_configure_args '$ac_arg'" ;; *) ac_configure_args="$ac_configure_args $ac_arg" ;; esac done # NLS nuisances. # Only set LANG and LC_ALL to C if already set. # These must not be set unconditionally because not all systems understand # e.g. LANG=C (notably SCO). if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi if test "${LANG+set}" = set; then LANG=C; export LANG; fi # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -rf conftest* confdefs.h # AIX cpp loses on an empty file, so make sure it contains at least a newline. echo > confdefs.h # A filename unique to this package, relative to the directory that # configure is in, which we can look for to find out if srcdir is correct. ac_unique_file=coms.c # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then its parent. ac_prog=$0 ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. srcdir=$ac_confdir if test ! -r $srcdir/$ac_unique_file; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r $srcdir/$ac_unique_file; then if test "$ac_srcdir_defaulted" = yes; then { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } else { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } fi fi srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` # Prefer explicitly selected file to automatically selected ones. if test -z "$CONFIG_SITE"; then if test "x$prefix" != xNONE; then CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" else CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" fi fi for ac_site_file in $CONFIG_SITE; do if test -r "$ac_site_file"; then echo "loading site script $ac_site_file" . "$ac_site_file" fi done if test -r "$cache_file"; then echo "loading cache $cache_file" . $cache_file else echo "creating cache $cache_file" > $cache_file fi ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. ac_cpp='$CPP $CPPFLAGS' ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then ac_n= ac_c=' ' ac_t=' ' else ac_n=-n ac_c= ac_t= fi else ac_n= ac_c='\c' ac_t= fi # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then ac_cv_prog_CC="gcc" break fi done IFS="$ac_save_ifs" fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:" ac_prog_rejected=no for ac_dir in $PATH; do test -z "$ac_dir" && ac_dir=. if test -f $ac_dir/$ac_word; then if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" break fi done IFS="$ac_save_ifs" if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# -gt 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift set dummy "$ac_dir/$ac_word" "$@" shift ac_cv_prog_CC="$@" fi fi fi fi CC="$ac_cv_prog_CC" if test -n "$CC"; then echo "$ac_t""$CC" 1>&6 else echo "$ac_t""no" 1>&6 fi test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } fi echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then ac_cv_prog_gcc=yes else ac_cv_prog_gcc=no fi fi echo "$ac_t""$ac_cv_prog_gcc" 1>&6 if test $ac_cv_prog_gcc = yes; then GCC=yes if test "${CFLAGS+set}" != set; then echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_prog_gcc_g'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else echo 'void f(){}' > conftest.c if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then ac_cv_prog_gcc_g=yes else ac_cv_prog_gcc_g=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_prog_gcc_g" 1>&6 if test $ac_cv_prog_gcc_g = yes; then CFLAGS="-g -O" else CFLAGS="-O" fi fi else GCC= test "${CFLAGS+set}" = set || CFLAGS="-g" fi echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # This must be in double quotes, not single quotes, because CPP may get # substituted into the Makefile and "${CC-cc}" will confuse make. CPP="${CC-cc} -E" # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:667: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 rm -rf conftest* CPP="${CC-cc} -E -traditional-cpp" cat > conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:682: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then : else echo "$ac_err" >&5 rm -rf conftest* CPP=/lib/cpp fi rm -f conftest* fi rm -f conftest* ac_cv_prog_CPP="$CPP" fi CPP="$ac_cv_prog_CPP" else ac_cv_prog_CPP="$CPP" fi echo "$ac_t""$CPP" 1>&6 echo $ac_n "checking for POSIXized ISC""... $ac_c" 1>&6 if test -d /etc/conf/kconfig.d && grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1 then echo "$ac_t""yes" 1>&6 ISC=yes # If later tests want to check for ISC. cat >> confdefs.h <<\EOF #define _POSIX_SOURCE 1 EOF if test "$GCC" = yes; then CC="$CC -posix" else CC="$CC -Xp" fi else echo "$ac_t""no" 1>&6 ISC= fi TERMOFILE="term.o" TERMFILE="term.c" GRAPHICSOFILE=" xgraphics.o " GRAPHICSFILE=" xgraphics.c " #Alan input # If wx is enabled, then x will be disabled. if test "$wx_enable" = maybe; then if test "-x /usr/local/bin/wx-config" -o "-x `which wx-config`" ; then wx_enable='yes'; echo "Found wx, activating it as default" ; fi fi if test "$wx_enable" = yes; then #with_x=no if test $wx_config_path != NONE; then if test -x $wx_config_path; then cd . # we are good fi elif test -x /usr/local/bin/wx-config ; then echo "checking valid wx installation" wx_config_path='/usr/local/bin/wx-config'; elif test -x `which wx-config` ; then wx_config_path=`which wx-config` else echo "configure: error: cannot find wx-config" 1>&2; exit 1; fi cat >> confdefs.h <<\EOF #define HAVE_WX 1 EOF WXOFILES="wxMain.o wxTerminal.o wxTurtleGraphics.o TextEditor.o" WXSRCFILES="wxMain.cpp wxTerminal.cpp wxTurtleGraphics.cpp TextEditor.cpp" LIBS="$LIBS "`$wx_config_path --libs`; CXXFLAGS="$CXXFLAGS -DHAVE_WX "`$wx_config_path --cxxflags`; CFLAGS="$CFLAGS -DHAVE_WX " TERMOFILE="wxterm.o" TERMFILE="wxterm.c" GRAPHICSOFILE="" GRAPHICSFILE="" LINKER='$(CXX)' else LINKER='$(CC)' fi # If we find X, set shell vars x_includes and x_libraries to the # paths, otherwise set no_x=yes. # Uses ac_ vars as temps to allow command line to override cache and checks. # --without-x overrides everything else, but does not touch the cache. echo $ac_n "checking for X""... $ac_c" 1>&6 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then withval="$with_x" : fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then # Both variables are already set. have_x=yes else if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=NO ac_x_libraries=NO rm -fr conftestdir if mkdir conftestdir; then cd conftestdir # Make sure to not put "make" in the Imakefile rules, since we grep it out. cat > Imakefile <<'EOF' acfindx: @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"' EOF if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering...", which would confuse us. eval `${MAKE-make} acfindx 2>/dev/null | grep -v make` # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl; do if test ! -f $ac_im_usrlibdir/libX11.$ac_extension && test -f $ac_im_libdir/libX11.$ac_extension; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. case "$ac_im_incroot" in /usr/include) ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;; esac case "$ac_im_usrlibdir" in /usr/lib | /lib) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;; esac fi cd .. rm -fr conftestdir fi if test "$ac_x_includes" = NO; then # Guess where to find include files, by looking for this one X11 .h file. test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h # First, try using that file with no special directory specified. cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:791: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* # We can compile using X headers with no special include directory. ac_x_includes= else echo "$ac_err" >&5 rm -rf conftest* # Look for the header file in a standard set of common directories. for ac_dir in \ /usr/X11R6/include \ /usr/X11R5/include \ /usr/X11R4/include \ \ /usr/X11R6/include/X11 \ /usr/X11R5/include/X11 \ /usr/X11R4/include/X11 \ \ /usr/include/X11R6 \ /usr/include/X11R5 \ /usr/include/X11R4 \ \ /usr/local/X11R6/include \ /usr/local/X11R5/include \ /usr/local/X11R4/include \ \ /usr/local/include/X11R6 \ /usr/local/include/X11R5 \ /usr/local/include/X11R4 \ \ /usr/X11/include \ /usr/include/X11 \ /usr/local/X11/include \ /usr/local/include/X11 \ \ /usr/X386/include \ /usr/x386/include \ /usr/XFree86/include/X11 \ \ /usr/include \ /usr/local/include \ /usr/unsupported/include \ /usr/athena/include \ /usr/local/x11r5/include \ /usr/lpp/Xamples/include \ \ /usr/openwin/include \ /usr/openwin/share/include \ ; \ do if test -r "$ac_dir/$x_direct_test_include"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest* fi # $ac_x_includes = NO if test "$ac_x_libraries" = NO; then # Check for the libraries. test -z "$x_direct_test_library" && x_direct_test_library=Xt test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. ac_x_libraries= else rm -rf conftest* LIBS="$ac_save_LIBS" # First see if replacing the include by lib works. for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \ /usr/X11R6/lib \ /usr/X11R5/lib \ /usr/X11R4/lib \ \ /usr/lib/X11R6 \ /usr/lib/X11R5 \ /usr/lib/X11R4 \ \ /usr/local/X11R6/lib \ /usr/local/X11R5/lib \ /usr/local/X11R4/lib \ \ /usr/local/lib/X11R6 \ /usr/local/lib/X11R5 \ /usr/local/lib/X11R4 \ \ /usr/X11/lib \ /usr/lib/X11 \ /usr/local/X11/lib \ /usr/local/lib/X11 \ \ /usr/X386/lib \ /usr/x386/lib \ /usr/XFree86/lib/X11 \ \ /usr/lib \ /usr/local/lib \ /usr/unsupported/lib \ /usr/athena/lib \ /usr/local/x11r5/lib \ /usr/lpp/Xamples/lib \ \ /usr/openwin/lib \ /usr/openwin/share/lib \ ; \ do for ac_extension in a so sl; do if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f conftest* fi # $ac_x_libraries = NO if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then # Didn't find X anywhere. Cache the known absence of X. ac_cv_have_x="have_x=no" else # Record where we found X for the cache. ac_cv_have_x="have_x=yes \ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries" fi fi fi eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then echo "$ac_t""$have_x" 1>&6 no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes \ ac_x_includes=$x_includes ac_x_libraries=$x_libraries" echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6 fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. X_CFLAGS="$X_CFLAGS -DX_DISPLAY_MISSING" else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would be nice to have a more robust check for the -R ld option than # just checking for Solaris. # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" if test "`(uname) 2>/dev/null`" = SunOS && uname -r | grep '^5' >/dev/null; then X_LIBS="$X_LIBS -R $x_libraries" fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS="$LDFLAGS" LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for -lICE""... $ac_c" 1>&6 ac_lib_var=`echo ICE'_'IceConnectionNumber | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lICE $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" else echo "$ac_t""no" 1>&6 fi LDFLAGS="$ac_save_LDFLAGS" # Check for system-dependent libraries X programs must link with. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X # libraries were built with DECnet support. And karl@cs.umb.edu says # the Alpha needs dnet_stub (dnet does not exist). echo $ac_n "checking for -ldnet""... $ac_c" 1>&6 ac_lib_var=`echo dnet'_'dnet_ntoa | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" else echo "$ac_t""no" 1>&6 fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for -ldnet_stub""... $ac_c" 1>&6 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" else echo "$ac_t""no" 1>&6 fi fi # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Not sure which flavor of 386 UNIX this is, but it seems harmless to # check for it. echo $ac_n "checking for -lnsl""... $ac_c" 1>&6 ac_lib_var=`echo nsl'_'t_accept | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" else echo "$ac_t""no" 1>&6 fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT 2.0. # But -lsocket is broken on IRIX, according to simon@lia.di.epfl.ch. if test "`(uname) 2>/dev/null`" != IRIX; then echo $ac_n "checking for -lsocket""... $ac_c" 1>&6 ac_lib_var=`echo socket'_'socket | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lsocket $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 X_EXTRA_LIBS="$X_EXTRA_LIBS -lsocket" else echo "$ac_t""no" 1>&6 fi fi fi fi echo $ac_n "checking for -lm""... $ac_c" 1>&6 ac_lib_var=`echo m'_'atan | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lm $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo m | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi echo $ac_n "checking for -lBSD""... $ac_c" 1>&6 ac_lib_var=`echo BSD'_'signal | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lBSD $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo BSD | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi echo $ac_n "checking for -lbsd""... $ac_c" 1>&6 ac_lib_var=`echo bsd'_'signal | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lbsd $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_lib=HAVE_LIB`echo bsd | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi tcap=no echo $ac_n "checking for -ltermcap""... $ac_c" 1>&6 ac_lib_var=`echo termcap'_'tgetstr | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ltermcap $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_LIBTERMCAP 1 EOF LIBS="$LIBS -ltermcap" tcap=yes else echo "$ac_t""no" 1>&6 fi if test $tcap = no; then echo $ac_n "checking for -ltermlib""... $ac_c" 1>&6 ac_lib_var=`echo termlib'_'tgetstr | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-ltermlib $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_LIBTERMLIB 1 EOF LIBS="$LIBS -ltermlib" tcap=yes else echo "$ac_t""no" 1>&6 fi fi if test $tcap = no; then echo $ac_n "checking for -lcurses""... $ac_c" 1>&6 ac_lib_var=`echo curses'_'tgetstr | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_LIBCURSES 1 EOF LIBS="$LIBS -lcurses" tcap=yes else echo "$ac_t""no" 1>&6 fi fi if test $tcap = no; then echo $ac_n "checking for -lncurses""... $ac_c" 1>&6 ac_lib_var=`echo ncurses'_'tgetstr | tr './+\055' '__p_'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=no" fi rm -f conftest* LIBS="$ac_save_LIBS" fi if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then echo "$ac_t""yes" 1>&6 cat >> confdefs.h <<\EOF #define HAVE_LIBNCURSES 1 EOF LIBS="$LIBS -lncurses" tcap=yes else echo "$ac_t""no" 1>&6 fi fi # If we cannot run a trivial program, we must be cross compiling. echo $ac_n "checking whether cross-compiling""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_c_cross'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else if test "$cross_compiling" = yes; then ac_cv_c_cross=yes else cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then ac_cv_c_cross=no else ac_cv_c_cross=yes fi fi rm -fr conftest* fi echo "$ac_t""$ac_cv_c_cross" 1>&6 cross_compiling=$ac_cv_c_cross echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #include #include #include EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1496: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* ac_cv_header_stdc=yes else echo "$ac_err" >&5 rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "memchr" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat > conftest.$ac_ext < EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "free" >/dev/null 2>&1; then : else rm -rf conftest* ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : else cat > conftest.$ac_ext < #define ISLOWER(c) ('a' <= (c) && (c) <= 'z') #define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); exit (0); } EOF { (eval echo configure:1561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } if test -s conftest && (./conftest; exit) 2>/dev/null; then : else ac_cv_header_stdc=no fi fi rm -fr conftest* fi fi echo "$ac_t""$ac_cv_header_stdc" 1>&6 if test $ac_cv_header_stdc = yes; then cat >> confdefs.h <<\EOF #define STDC_HEADERS 1 EOF fi for ac_hdr in sgtty.h termio.h unistd.h string.h do ac_safe=`echo "$ac_hdr" | tr './\055' '___'` echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" { (eval echo configure:1593: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* eval "ac_cv_header_$ac_safe=yes" else echo "$ac_err" >&5 rm -rf conftest* eval "ac_cv_header_$ac_safe=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_hdr=HAVE_`echo $ac_hdr | tr 'abcdefghijklmnopqrstuvwxyz./\055' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ___'` cat >> confdefs.h <&6 fi done echo $ac_n "checking for size_t""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < #if STDC_HEADERS #include #endif EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "size_t" >/dev/null 2>&1; then rm -rf conftest* ac_cv_type_size_t=yes else rm -rf conftest* ac_cv_type_size_t=no fi rm -f conftest* fi echo "$ac_t""$ac_cv_type_size_t" 1>&6 if test $ac_cv_type_size_t = no; then cat >> confdefs.h <<\EOF #define size_t unsigned EOF fi echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6 # if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then # echo $ac_n "(cached) $ac_c" 1>&6 # else cat > conftest.$ac_ext < #include #ifdef signal #undef signal #endif #ifdef __cplusplus extern "C" void (*signal (int, void (*)(int)))(int); #else void (*signal ()) (); #endif int main() { return 0; } int t() { int i; ; return 0; } EOF if { (eval echo configure:1672: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* ac_cv_type_signal=void cat >> confdefs.h <> confdefs.h <&6 cat >> confdefs.h <&6 cat > conftest.$ac_ext < #include #ifdef signal #undef signal #endif /* void (*signal (int, RETSIGTYPE (*)(int))); */ int main() { return 0; } RETSIGTYPE t(int foo) { int i; signal(SIGINT,t); return 0; } EOF if { (eval echo configure:1672: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* cat >> confdefs.h <&6 else rm -rf conftest* cat >> confdefs.h <&6 fi for ac_func in usleep srandom sigvec sigsetmask drem irint bcopy memcpy do echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext < /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 builtin and then its argument prototype would still apply. */ char $ac_func(); int main() { return 0; } int t() { /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined (__stub_$ac_func) || defined (__stub___$ac_func) choke me #else $ac_func(); #endif ; return 0; } EOF if { (eval echo configure:1721: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; }; then rm -rf conftest* eval "ac_cv_func_$ac_func=yes" else rm -rf conftest* eval "ac_cv_func_$ac_func=no" fi rm -f conftest* fi if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then echo "$ac_t""yes" 1>&6 ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` cat >> confdefs.h <&6 fi done if test $ac_cv_prog_gcc = yes; then echo $ac_n "checking whether ${CC-cc} needs -traditional""... $ac_c" 1>&6 if eval "test \"`echo '$''{'ac_cv_prog_gcc_traditional'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else ac_pattern="Autoconf.*'x'" cat > conftest.$ac_ext < Autoconf TIOCGETP EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "$ac_pattern" >/dev/null 2>&1; then rm -rf conftest* ac_cv_prog_gcc_traditional=yes else rm -rf conftest* ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat > conftest.$ac_ext < Autoconf TCGETA EOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | egrep "$ac_pattern" >/dev/null 2>&1; then rm -rf conftest* ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi echo "$ac_t""$ac_cv_prog_gcc_traditional" 1>&6 if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi if test "$no_x" != yes; then LIBS="$LIBS -lX11" fi trap '' 1 2 15 cat > confcache <<\EOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs. It is not useful on other systems. # If it contains results you don't want to keep, you may remove or edit it. # # By default, configure uses ./config.cache as the cache file, # creating it if it does not exist already. You can give configure # the --cache-file=FILE option to use a different cache file; that is # what configure does when it calls configure scripts in # subdirectories, so they share the cache. # Giving --cache-file=/dev/null disables caching, for debugging configure. # config.status only pays attention to the cache file if you give it the # --recheck option to rerun configure. # EOF # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. (set) 2>&1 | sed -n "s/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=\${\1='\2'}/p" \ >> confcache if cmp -s $cache_file confcache; then : else if test -w $cache_file; then echo "updating cache $cache_file" cat confcache > $cache_file else echo "not updating unwritable cache $cache_file" fi fi rm -f confcache trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Any assignment to VPATH causes Sun make to only execute # the first set of double-colon rules, so remove it if not needed. # If there is a colon in the path, we need to keep it. if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' fi trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 DEFS=-DHAVE_CONFIG_H # Without the "./", some shells look in PATH for config.status. : ${CONFIG_STATUS=./config.status} echo creating $CONFIG_STATUS rm -f $CONFIG_STATUS cat > $CONFIG_STATUS </dev/null | sed 1q`: # # $0 $ac_configure_args # # Compiler output produced by configure, useful for debugging # configure, is in ./config.log if it exists. ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" for ac_option do case "\$ac_option" in -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; -version | --version | --versio | --versi | --vers | --ver | --ve | --v) echo "$CONFIG_STATUS generated by autoconf version 2.10" exit 0 ;; -help | --help | --hel | --he | --h) echo "\$ac_cs_usage"; exit 0 ;; *) echo "\$ac_cs_usage"; exit 1 ;; esac done ac_given_srcdir=$srcdir trap 'rm -fr `echo "makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 EOF cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF $ac_vpsub $extrasub s%@GRAPHICSOFILE@%$GRAPHICSOFILE%g s%@GRAPHICSFILE@%$GRAPHICSFILE%g s%@TERMOFILE@%$TERMOFILE%g s%@TERMFILE@%$TERMFILE%g s%@WXOFILES@%$WXOFILES%g s%@WXSRCFILES@%$WXSRCFILES%g s%@LINKER@%$LINKER%g s%@CFLAGS@%$CFLAGS%g s%@CPPFLAGS@%$CPPFLAGS%g s%@CXXFLAGS@%$CXXFLAGS%g s%@DEFS@%$DEFS%g s%@LDFLAGS@%$LDFLAGS%g s%@LIBS@%$LIBS%g s%@exec_prefix@%$exec_prefix%g s%@prefix@%$prefix%g s%@program_transform_name@%$program_transform_name%g s%@bindir@%$bindir%g s%@sbindir@%$sbindir%g s%@libexecdir@%$libexecdir%g s%@datadir@%$datadir%g s%@sysconfdir@%$sysconfdir%g s%@sharedstatedir@%$sharedstatedir%g s%@localstatedir@%$localstatedir%g s%@libdir@%$libdir%g s%@includedir@%$includedir%g s%@oldincludedir@%$oldincludedir%g s%@infodir@%$infodir%g s%@mandir@%$mandir%g s%@CC@%$CC%g s%@CPP@%$CPP%g s%@X_CFLAGS@%$X_CFLAGS%g s%@X_PRE_LIBS@%$X_PRE_LIBS%g s%@X_LIBS@%$X_LIBS%g s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g CEOF EOF cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then # Support "outfile[:infile]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac # Adjust relative srcdir, etc. for subdirectories. # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" # A "../" for each directory in $ac_dir_suffix. ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` else ac_dir_suffix= ac_dots= fi case "$ac_given_srcdir" in .) srcdir=. if test -z "$ac_dots"; then top_srcdir=. else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; *) # Relative path. srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" top_srcdir="$ac_dots$ac_given_srcdir" ;; esac echo creating "$ac_file" rm -f "$ac_file" configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." case "$ac_file" in *Makefile*) ac_comsub="1i\\ # $configure_input" ;; *) ac_comsub= ;; esac sed -e "$ac_comsub s%@configure_input@%$configure_input%g s%@srcdir@%$srcdir%g s%@top_srcdir@%$top_srcdir%g " -f conftest.subs $ac_given_srcdir/$ac_file_in > $ac_file fi; done rm -f conftest.subs # These sed commands are passed to sed as "A NAME B NAME C VALUE D", where # NAME is the cpp macro being defined and VALUE is the value it is being given. # # ac_d sets the value in "#define NAME VALUE" lines. ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' ac_dC='\3' ac_dD='%g' # ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_uB='\([ ]\)%\1#\2define\3' ac_uC=' ' ac_uD='\4%g' # ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' ac_eB='$%\1#\2define\3' ac_eC=' ' ac_eD='%g' CONFIG_HEADERS=${CONFIG_HEADERS-"config.h"} for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then # Support "outfile[:infile]", defaulting infile="outfile.in". case "$ac_file" in *:*) ac_file_in=`echo "$ac_file"|sed 's%.*:%%'` ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; *) ac_file_in="${ac_file}.in" ;; esac echo creating $ac_file rm -f conftest.frag conftest.in conftest.out cp $ac_given_srcdir/$ac_file_in conftest.in EOF # Transform confdefs.h into a sed script conftest.vals that substitutes # the proper values into config.h.in to produce config.h. And first: # Protect against being on the right side of a sed subst in config.status. # Protect against being in an unquoted here document in config.status. rm -f conftest.vals cat > conftest.hdr <<\EOF s/[\\&%]/\\&/g s%[\\$`]%\\&%g s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp s%ac_d%ac_u%gp s%ac_u%ac_e%gp EOF sed -n -f conftest.hdr confdefs.h > conftest.vals rm -f conftest.hdr # This sed command replaces #undef with comments. This is necessary, for # example, in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. cat >> conftest.vals <<\EOF s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% EOF # Break up conftest.vals because some shells have a limit on # the size of here documents, and old seds have small limits too. # Maximum number of lines to put in a single here document. ac_max_here_lines=12 rm -f conftest.tail while : do ac_lines=`grep -c . conftest.vals` # grep -c gives empty output for an empty file on some AIX systems. if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi # Write a limited-size here document to conftest.frag. echo ' cat > conftest.frag <> $CONFIG_STATUS sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS echo 'CEOF sed -f conftest.frag conftest.in > conftest.out rm -f conftest.in mv conftest.out conftest.in ' >> $CONFIG_STATUS sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail rm -f conftest.vals mv conftest.tail conftest.vals done rm -f conftest.vals cat >> $CONFIG_STATUS <<\EOF rm -f conftest.frag conftest.h echo "/* $ac_file. Generated automatically by configure. */" > conftest.h cat conftest.in >> conftest.h rm -f conftest.in if cmp -s $ac_file conftest.h 2>/dev/null; then echo "$ac_file is unchanged" rm -f conftest.h else # Remove last slash and all that follows it. Not all systems have dirname. ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then # The file is in a subdirectory. test ! -d "$ac_dir" && mkdir "$ac_dir" fi rm -f $ac_file mv conftest.h $ac_file fi fi; done exit 0 EOF chmod +x $CONFIG_STATUS rm -fr confdefs* $ac_clean_files test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 ucblogo-6.1/ztcterm.c0000664000175000017500000004170613575571772013001 0ustar jjcjjc/* * ztcterm.c IBM screen module mak * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "logo.h" #include "globals.h" #include #include #include #include #include #include #include #include #include "ztcterm.h" char *LogoPlatformName="DOS"; /************************************************************/ unsigned _stack = 8000; /* 5000 for debugging, 65000 for real */ BOOLEAN in_graphics_mode = FALSE, in_splitscreen = FALSE; BOOLEAN have_been_in_graphics_mode = FALSE, can_do_color = FALSE; BOOLEAN in_erase_mode = FALSE; /* NOTE NOTE NOTE: graphics.c really really believes that the top left * corner of the screen has hardware coords (0,0). Zortech has (0,0) * in the BOTTOM left. It's hopeless to fix graphics.c so instead we * use the following kludge: go ahead and think the screen is upside down, * and switch to Zortech coords only in draw_line! */ int ibm_screen_bottom; int current_write_mode = FG_MODE_SET; int current_vis = 0; fg_color_t turtle_color, bg_color; fg_color_t dull, bright; fg_coord_t texth; fg_coord_t MaxX, MaxY; int ztc_penwidth = 1, ztc_linepattern = -1; fg_box_t ztc_box, ztc_textbox, text_scroll_box, text_last_line_box, clear_box; void rgb_init(void); int scrunching = FALSE; fg_line_t the_line; fg_coord_t ztc_x, ztc_y; fg_color_t ztc_textcolor; fg_color_t ztc_text_bgcolor = 0; fg_coord_t ztc_graph_textx, ztc_graph_texty; FIXNUM pen_color = 0, back_ground = 7; void moveto(int x, int y) { ztc_x = (fg_coord_t)x; ztc_y = (fg_coord_t)y; } void lineto(int x, int y) { msm_hidecursor(); fg_make_line(the_line, ztc_x, MaxY-ztc_y, (fg_coord_t)x, MaxY-(fg_coord_t)y); fg_drawthickline((in_erase_mode ? bg_color : turtle_color), current_write_mode, ~0, FG_LINE_SOLID, the_line, ztc_box, ztc_penwidth); moveto(x, y); msm_showcursor(); } void outtext(char *s) { msm_hidecursor(); fg_puts((in_erase_mode ? bg_color : turtle_color), current_write_mode, ~0, FG_ROT0, ztc_x, MaxY-ztc_y, s, fg.displaybox); msm_showcursor(); } void gr_mode(void) { int errorcode; if (!in_graphics_mode) { msm_hidecursor(); x_coord = x_margin; y_coord = y_margin; errorcode = fg_init(); if (have_been_in_graphics_mode) { in_graphics_mode = TRUE; if (turtle_shown && !refresh_p) draw_turtle(); redraw_graphics(); } else { if (errorcode == 0) err_logo(BAD_GRAPH_INIT, NIL); else { in_graphics_mode = have_been_in_graphics_mode = TRUE; if (can_do_color = (fg.nsimulcolor > 16 /* != fg.ncolormap */ )) { rgb_init(); dull = fg.nsimulcolor-1; bright = 7; } else { turtle_color = FG_HIGHLIGHT; dull = FG_WHITE; bright = FG_HIGHLIGHT; } bg_color = FG_BLACK; ztc_set_penc(7); if (ztc_textcolor == FG_WHITE) ztc_textcolor = dull; back_ground = 0; ztc_box[FG_X1] = ztc_textbox[FG_X1] = text_scroll_box[FG_X1] = text_last_line_box[FG_X1] = clear_box[FG_X1] = fg.displaybox[FG_X1]; ztc_textbox[FG_Y1] = fg.displaybox[FG_Y1]; ztc_box[FG_X2] = ztc_textbox[FG_X2] = text_scroll_box[FG_X2] = text_last_line_box[FG_X2] = clear_box[FG_X2] = MaxX = fg.displaybox[FG_X2]; ztc_box[FG_Y2] = MaxY = clear_box[FG_Y2] = fg.displaybox[FG_Y2]; y_scale = (double)fg.pixelx/(double)fg.pixely; { FILE *fp = fopen("scrunch.dat","r"); if (fp != NULL) { scrunching = TRUE; if (filelength(fileno(fp)) > 0) { fread(&x_scale, sizeof(FLONUM), 1, fp); fread(&y_scale, sizeof(FLONUM), 1, fp); } fclose(fp); } } if (MaxY == 479) texth = 16; else texth = (MaxY+1)/25; ztc_box[FG_Y1] = 4*texth+1; clear_box[FG_Y1] = 4*texth; ibm_screen_bottom = MaxY - (ztc_box[FG_Y1]); ztc_textbox[FG_Y2] = 4*texth-1; text_scroll_box[FG_Y2] = 3*texth-1; text_scroll_box[FG_Y1] = 0; text_last_line_box[FG_Y2] = texth-1; lclearscreen(NIL); lcleartext(NIL); in_splitscreen = TRUE; } } msm_showcursor(); } } void nop() { } void init_ibm_memory(void) { } volatile int ctrl_c_count = 0; BOOLEAN check_ibm_stop(void) { int key; int __ss *p; /* if (kbhit()) getch(); */ /* allow DOS to test for control-C */ p = &key; if ((int)p < 500) { err_logo(STACK_OVERFLOW, NIL); return(1); } if (((key = bioskey(1)) == (4113)) || ctrl_c_count > 0) { /* control-q */ if (ctrl_c_count == 0) getch(); ctrl_c_count = 0; err_logo(STOP_ERROR,NIL); return(1); } if (key == (4375)) { /* control-w */ getch(); to_pending = 0; lpause(NIL); } return (0); } void term_init_ibm(void) { disp_open(); msm_init(); msm_setareay(0,(disp_numrows-1)*8); msm_showcursor(); ztc_textcolor = FG_WHITE; tty_charmode = 0; x_max = 80; y_max = 25; x_coord = y_coord = 0; so_arr[0] = '\1'; so_arr[1] = '\0'; se_arr[0] = '\2'; se_arr[1] = '\0'; } void ibm_gotoxy(int x, int y) { if (in_graphics_mode) { if (!in_splitscreen) lsplitscreen(NIL); if (y >= 4) y = 3; ztc_graph_texty = texth*(3-y); fg_adjustxy(FG_ROT0, x, &ztc_graph_textx, &ztc_graph_texty, fg.charbox); } else { disp_move(y, x); msm_hidecursor(); disp_flush(); msm_showcursor(); } } fg_color_t color_table[8] = {0, 9, 10, 11, 12, 13, 14, 15}; FIXNUM hw_color(FIXNUM c) { if (can_do_color) return c; if (c >= 0 && c < 8) return color_table[c]; if (c < 0) return c; return c-8; } void ibm_clear_text(void) { if (in_graphics_mode) { if (in_splitscreen) erase_graphics_top(); } else { disp_move(0,0); disp_eeop(); msm_hidecursor(); disp_flush(); msm_showcursor(); } } void ibm_clear_screen(void) { msm_hidecursor(); fg_fillbox(bg_color, FG_MODE_SET, ~0, clear_box); msm_showcursor(); } void ibm_plain_mode(void) { if (in_graphics_mode) ztc_textcolor = dull; else disp_endstand(); } void ibm_bold_mode(void) { if (in_graphics_mode) ztc_textcolor = bright; else disp_startstand(); } NODE *set_text_color(NODE *args) { int fore, back; fore = getint(pos_int_arg(args)); if (NOT_THROWING) { back = getint(pos_int_arg(cdr(args))); if (NOT_THROWING) { ztc_textcolor = hw_color(fore); ztc_text_bgcolor = hw_color(back); disp_setattr((back&07)<<4 | (fore&07)); } } return UNBOUND; } void erase_graphics_top(void) { msm_hidecursor(); fg_fillbox(FG_BLACK, FG_MODE_SET, ~0, ztc_textbox); msm_showcursor(); ztc_graph_textx = 0; ztc_graph_texty = 3*texth; } /************************************************************/ /* These are the machine-specific graphics definitions. All versions must provide a set of functions analogous to these. */ void save_pen(pen_info *p) { p->h = ztc_x; p->v = ztc_y; p->vis = current_vis; p->width = ztc_penwidth; p->color = turtle_color; get_pen_pattern(p->pattern); p->mode = get_ibm_pen_mode(); } void restore_pen(pen_info *p) { moveto(p->h, p->v); current_vis = p->vis; ztc_penwidth = p->width; set_ibm_pen_mode(p->mode); /* must restore mode before color */ turtle_color = p->color; set_pen_pattern(p->pattern); } struct rgbcolor { int red, green, blue; } the_palette[256] = { {0,0,0}, {0,0,0}, /* entries -2 and -1 */ {0, 0, 0}, {0, 0, 255}, {0, 255, 0}, {0, 255, 255}, {255, 0, 0}, {255, 0, 255}, {255, 255, 0}, {255, 255, 255}, {155, 96, 59}, {197, 136, 18}, {100, 162, 64}, {120, 187, 187}, {255, 149, 119}, {144, 113, 208}, {255, 163, 0}, {183, 183, 183}}; void rgb_init(void) { int i,j; for (i=0; i<16; i++) { fg_setpalette(i+2, the_palette[i+2].red, the_palette[i+2].green, the_palette[i+2].blue); for (j=i+16; j= 255) return; the_palette[slot].red = (r+128)/256; the_palette[slot].green = (g+128)/256; the_palette[slot].blue = (b+128)/256; fg_setpalette(slot-1, the_palette[slot].red, the_palette[slot].green, the_palette[slot].blue); } void get_palette(int slot, unsigned int *r, unsigned int *g, unsigned int *b) { slot+=2; *r = the_palette[slot % 256].red * 256; *g = the_palette[slot % 256].green * 256; *b = the_palette[slot % 256].blue * 256; } void ibm_pen_down(void) { current_write_mode = FG_MODE_SET; turtle_color = hw_color(pen_color); in_erase_mode = FALSE; } void ibm_pen_xor(void) { current_write_mode = FG_MODE_XOR; turtle_color = hw_color(pen_color)^bg_color; in_erase_mode = FALSE; } void ibm_pen_erase(void) { if (!in_erase_mode) { current_write_mode = FG_MODE_SET; turtle_color = hw_color(pen_color); in_erase_mode = TRUE; } } int get_ibm_pen_mode(void) { if (in_erase_mode) return 2; else return current_write_mode; } void set_ibm_pen_mode(int m) { switch (m) { case 2: ibm_pen_erase(); break; case FG_MODE_SET: ibm_pen_down(); break; case FG_MODE_XOR: ibm_pen_xor(); break; } } int get_ibm_pen_width(void) { return ztc_penwidth; } void set_pen_pattern(char *pat) { ztc_linepattern = *(int *)pat; } void set_list_pen_pattern(NODE *arg) { NODE *temp; temp = cnv_node_to_numnode(car(arg)); ztc_linepattern = getint(temp); } void get_pen_pattern(char *pat) { *(int *)pat = ztc_linepattern; } NODE *Get_node_pen_pattern(void) { return(cons(make_intnode(0-1L), NIL)); } void label(char *s) { gr_mode(); moveto(g_round(screen_x_coord), g_round(screen_y_coord)); outtext(s); } void logofill(void) { msm_hidecursor(); fg_fill(ztc_x, MaxY-ztc_y, turtle_color, turtle_color); msm_showcursor(); } void erase_screen(void) { ibm_clear_screen(); } void t_screen(void) { if (in_graphics_mode) { fg_term(); in_graphics_mode = FALSE; in_splitscreen = FALSE; y_max = 25; } } void s_screen(void) { int save_vis; if (in_graphics_mode && !in_splitscreen) { if (turtle_shown && (screen_y_coord > (MaxY - (4*texth+1)))) { save_vis = current_vis; current_vis = -1; lhome(NIL); current_vis = save_vis; } erase_graphics_top(); } if (!have_been_in_graphics_mode) gr_mode(); in_splitscreen = TRUE; ztc_box[FG_Y1] = 4*texth+1; clear_box[FG_Y1] = 4*texth; ibm_screen_bottom = MaxY - (ztc_box[FG_Y1]); y_max = 4; gr_mode(); } void f_screen(void) { if (in_graphics_mode && in_splitscreen) erase_graphics_top(); in_splitscreen = FALSE; ztc_box[FG_Y1] = clear_box[FG_Y1] = 0; ibm_screen_bottom = MaxY; gr_mode(); } FIXNUM mickey_x(void) { int x,y; (void)msm_getstatus(&x,&y); return x-screen_x_center; } #define screen_x_coord ((screen_x_center) + turtle_x) #define screen_y_coord ((screen_y_center) - turtle_y) FIXNUM mickey_y(void) { int x,y; (void)msm_getstatus(&x,&y); return screen_y_center-y; } BOOLEAN Button(void) { int x,y,b; b = msm_getstatus(&x,&y); if (b&1) return 1; if (b&2) return 2; if (b&4) return 3; return 0; } void tone(FIXNUM pitch, FIXNUM duration) { FIXNUM period = 2400000L/pitch; /* 200000 */ FIXNUM cycles = duration * pitch/60; if (cycles > 0) sound_tone((int)cycles, (int)period, (int)period); } FIXNUM t_height(void) { return 18; } FLONUM t_half_bottom(void) { return 6.0; } FLONUM t_side(void) { return 19.0; } void check_scroll(void) { msm_hidecursor(); fg_blit(text_scroll_box, 0, texth, fg.activepage, fg.activepage); fg_fillbox(FG_BLACK, FG_MODE_SET, ~0, text_last_line_box); msm_showcursor(); } void ztc_put_char(int ch) { fg_box_t temp_box; msm_hidecursor(); if (in_graphics_mode && !in_splitscreen) lsplitscreen(NIL); if (ch != '\1' && ch != '\2') { if (in_graphics_mode) { if (ch == '\n') { ztc_graph_textx = 0; if (ztc_graph_texty - texth >= 0) ztc_graph_texty -= texth; else check_scroll(); } else if (ch == '\b') { if (ztc_graph_textx > 0) fg_adjustxy(FG_ROT180, 1, &ztc_graph_textx, &ztc_graph_texty, fg.charbox); } else if (ch == '\t') { fg_adjustxy(FG_ROT0, 8 - (x_coord&07), &ztc_graph_textx, &ztc_graph_texty, fg.charbox); if (ztc_graph_textx >= MaxX) print_char(stdout,'\n'); } else { if (ztc_text_bgcolor != 0) { temp_box[FG_X1] = temp_box[FG_X2] = ztc_graph_textx; temp_box[FG_Y1] = temp_box[FG_Y2] = ztc_graph_texty; fg_adjustxy(FG_ROT0, 2, &temp_box[FG_X2], &temp_box[FG_Y2], fg.charbox); temp_box[FG_Y2] += texth-1; fg_fillbox(ztc_text_bgcolor, FG_MODE_SET, ~0, temp_box); } fg_putc(ztc_textcolor, FG_MODE_SET, ~0, FG_ROT0, ztc_graph_textx, ztc_graph_texty, ch, fg.displaybox); fg_adjustxy(FG_ROT0, 1, &ztc_graph_textx, &ztc_graph_texty, fg.charbox); if (ztc_graph_textx >= MaxX) print_char(stdout,'\n'); } } else disp_putc(ch); } msm_showcursor(); } BOOLEAN cursor_off = 0; void fix_cursor(void) { if (!cursor_off && !in_graphics_mode) { msm_hidecursor(); disp_hidecursor(); msm_showcursor(); cursor_off++; } } void zflush(void) { msm_hidecursor(); if (in_graphics_mode) fg_flush(); else { disp_flush(); if (cursor_off) disp_showcursor(); cursor_off = 0; } msm_showcursor(); } void newline_bugfix(void) { msm_hidecursor(); if (!in_graphics_mode) { if (disp_cursorrow+1 < disp_numrows) new_line(stdout); else disp_move(disp_numrows-1,0); disp_flush(); } msm_showcursor(); y_coord--; } char graph_line_buffer[200]; char *graph_line_pointer = NULL; int ztc_getc(FILE *strm) { int ch; fg_color_t save_textcolor; if (strm != stdin || !interactive || !in_graphics_mode) return getc(strm); if (graph_line_pointer != NULL) { ch = *graph_line_pointer++; if (ch == '\t') graph_line_pointer += 2; if (ch != '\0') return ch; } graph_line_pointer = graph_line_buffer; do { msm_hidecursor(); fg_putc(dull, FG_MODE_XOR, ~0, FG_ROT0, ztc_graph_textx, ztc_graph_texty, '_', fg.displaybox); msm_showcursor(); ch = getch(); msm_hidecursor(); fg_putc(dull, FG_MODE_XOR, ~0, FG_ROT0, ztc_graph_textx, ztc_graph_texty, '_', fg.displaybox); if (ch == '\r' || ch == '\n') { ch = '\n'; *graph_line_pointer++ = ch; print_char(stdout,'\n'); *graph_line_pointer = '\0'; graph_line_pointer = graph_line_buffer; msm_showcursor(); return *graph_line_pointer++; } else if (ch == '\t') { int i = 8 - (x_coord & 07); *graph_line_pointer++ = '\t'; *graph_line_pointer++ = (char)i; *graph_line_pointer++ = '\t'; print_char(stdout, '\t'); } else if (ch == 0177 || ch == '\b') { if (graph_line_pointer != graph_line_buffer) { graph_line_pointer--; if (*graph_line_pointer == '\t') { int i = (int)*--graph_line_pointer; --graph_line_pointer; while (i-- > 0) print_char(stdout, '\b'); } else { print_char(stdout, '\b'); save_textcolor = ztc_textcolor; ztc_textcolor = ztc_text_bgcolor; print_char(stdout, *graph_line_pointer); ztc_textcolor = save_textcolor; print_char(stdout, '\b'); } } } else if (ch == 17 || ch == 23) { print_char(stdout,'\n'); graph_line_pointer = NULL; msm_showcursor(); return ch; } else { *graph_line_pointer++ = ch; print_char(stdout, ch); } msm_showcursor(); } while (ch != '\n'); graph_line_pointer = graph_line_buffer; return *graph_line_pointer++; } void ztc_getcr(void) { (void) ztc_getc(stdin); graph_line_pointer = NULL; } ucblogo-6.1/wxGlobals.h0000664000175000017500000000567313575571772013263 0ustar jjcjjc/* * wxGlobals.h wx logo global references module * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #define SCREEN_WIDTH 1 #define SCREEN_HEIGHT 2 #define BACK_GROUND 3 #define IN_SPLITSCREEN 4 #define IN_GRAPHICS_MODE 5 #define X_COORD 6 #define Y_COORD 7 #define X_MAX 8 #define Y_MAX 9 #define EDIT_STATE 10 // used for the text editor flag #define NO_INFO 0 #define DO_LOAD 1 #define NO_LOAD 2 //terminal size in characters #define TERM_ROWS 25 #define TERM_COLS 82 // fonts extern "C" char wx_font_face[]; extern "C" int wx_font_size; extern "C" int label_height; #define FONT_CFG(fm,sz) sz, wxFONTFAMILY_MODERN, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false, wxString(fm,wxConvUTF8) /* wxMain */ #define NAME_BUFFER_SIZE 300 #define MAXOUTBUFF 4096 #define MAXINBUFF 4096 #define BUFF_LEN 4096 //should be a power of two. #define buff_empty (buff_push_index == buff_pop_index) #define buff_push(c) buff[buff_push_index++] = c; \ buff_push_index = buff_push_index % BUFF_LEN; \ if(buff_push_index == buff_pop_index) { \ fprintf(stderr, "buff push warning: pushindex = popindex\n. discarding last push"); \ buff_push_index = (buff_push_index - 1) % BUFF_LEN; \ } #define buff_pop(c) c = buff[buff_pop_index++]; \ buff_pop_index = buff_pop_index % BUFF_LEN extern char buff[]; extern int buff_push_index; extern int buff_pop_index; extern int alreadyAlerted; extern char output_buffer[]; extern int output_index; /* wxTerminal */ class TurtleCanvas; class TextEditor; extern wxCommandEvent * haveInputEvent; extern LogoFrame *logoFrame; extern LogoEventManager *logoEventManager; extern wxMenuBar* menuBar; extern wxBoxSizer *topsizer; extern TextEditor *editWindow; extern TurtleCanvas * turtleGraphics; /* wxTurtleGraphics */ // the size of the turtle graphics window extern "C" int getInfo(int); extern "C" void setInfo(int, int); extern wxMemoryDC *m_memDC; /* wxTextEdit */ extern char * file; // using this is safe because the other thread is sleeping // and it stack is also asleep extern "C" int check_wx_stop(int force_yield); extern "C" int internal_check(); #define wxdprintf if (wx_Debugging) printf extern int wx_Debugging; /* in wxMain */ ucblogo-6.1/win32trm.c0000664000175000017500000011542013575571772012771 0ustar jjcjjc/* -*-C-*- * win32trm.c -- Module to provide Win32 API compliant graphics routines * * Copyright (C) 1996 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "logo.h" #include "globals.h" #include "win32trm.h" #include "ucbwlogo/resource.h" // #define WIN32_S LRESULT CALLBACK ParentWindowFunc(HWND, UINT, WPARAM, LPARAM); char szWinName[] = "UCBLogo"; char szGraphWinName[] = "UCBLogoGraph"; char szConWinName[] = "UCBLogoConsole"; char *LogoPlatformName="Windows"; pen_info turtlePen; HBRUSH hbrush, textbrush; HBITMAP hbitG, hbitmG, hbitC, hbitmC; RECT allRect; HDC GraphDC, memGraphDC, ConDC, memConDC; HWND hGraphWnd, hConWnd, hMainWnd; /* color and palette related information */ static COLORREF palette[266]; FIXNUM back_ground, pen_color, old_pen_color; int maxX, maxY, greeted = 0; int pre_turtle_pen_mode; long Xsofar, Ysofar; int w_button = 0; FIXNUM mouse_x = 0, mouse_y = 0; BOOLEAN in_erase_mode, update_pos, seen_once = FALSE; int in_graphics_mode, in_splitscreen; static char **win32_lines; // for recording what should appear in the text win static char input_lines[2][200]; char *read_line, buffered_char; int cur_line = 0, cur_index = 0, read_index, hpos = 0, margin, cur_len; int char_mode = 0, input_line = 0, input_index = 0; int line_avail = FALSE, char_avail = FALSE; char *winPasteText = NULL, *winPastePtr = NULL; char *myScreen = NULL; int maxXChar, maxYChar; /* Default font behavior set here: OEM_FIXED_FONT, ANSI_FIXED_FONT, or default */ BOOLEAN oemfont = FALSE; BOOLEAN ansifont = TRUE; #ifdef WIN32_DEBUG void WinDebug(char *s) { ndprintf("%t", s); } #endif int win32_screen_right(void) { RECT r; GetClientRect(hMainWnd, &r); return (int) r.right; } int win32_screen_bottom(void) { RECT r; GetClientRect(hMainWnd, &r); return (int) r.bottom; } void moveto(int x, int y) { /* no invalidation of the rectangle, etc needs to be done. */ turtlePen.h = x; turtlePen.v = y; MoveCursor(x, y); } void lineto(int x, int y) { turtlePen.h = x; turtlePen.v = y; LineTo(memGraphDC, x, y); LineTo(GraphDC, x, y); /* Good old Windows does us the favor of leaving out the endpoint, so we have to beat it up */ LineTo(memGraphDC, x, y+1); LineTo(GraphDC, x, y+1); MoveCursor(x, y); } void win32_go_away(void) { int i; if (read_line != NULL) free(read_line); for (i = 0; i < NUM_LINES; i++) if (win32_lines[i] != NULL) free(win32_lines[i]); if (win32_lines != NULL) free(win32_lines); DeleteDC(memConDC); DeleteDC(memGraphDC); DeleteDC(GraphDC); DeleteDC(ConDC); DeleteObject(turtlePen.hpen); DeleteObject(hbrush); DeleteObject(textbrush); DeleteObject(hbitC); DeleteObject(hbitmC); DeleteObject(hbitG); DeleteObject(hbitmG); exit(0); } void win32_update_text(void) { RECT r; GetClientRect(hConWnd, &r); BitBlt(ConDC, 0, 0, r.right, r.bottom, memConDC, 0, 0, SRCCOPY); } void win32_repaint_screen(void) { PostMessage(hMainWnd, WM_SETFOCUS, 0, 0); } void win32_advance_line(void) { TEXTMETRIC tm; RECT r, inv, foo; int xpos, ypos; GetClientRect(hConWnd, &r); GetTextMetrics(memConDC, &tm); xpos = (tm.tmAveCharWidth * x_coord); ypos = ((tm.tmHeight + tm.tmExternalLeading) * y_coord); if ((ypos + 2 * (tm.tmHeight + tm.tmExternalLeading)) >= r.bottom) { memmove(myScreen, myScreen+maxXChar, maxXChar*(maxYChar-1)); ScrollDC(ConDC, 0, - (tm.tmHeight + tm.tmExternalLeading), &r, &r, NULL, &inv); FillRect(ConDC, &inv, textbrush); foo.left = 0; foo.right = Xsofar; foo.top = 0; foo.bottom = Ysofar; ScrollDC(memConDC, 0, - (tm.tmHeight + tm.tmExternalLeading), &foo, &foo, NULL, &inv); FillRect(memConDC, &inv, textbrush); } } void draw_string(char *str) { TEXTMETRIC tm; int x, y; GetTextMetrics(memGraphDC, &tm); x = turtlePen.h; y = turtlePen.v; TextOut(memGraphDC, x, y - tm.tmHeight, str, strlen(str)); TextOut(GraphDC, x, y - tm.tmHeight, str, strlen(str)); /* restore position */ moveto(x, y); } char *eight_dot_three_helper(char *in) { static char out[20]; char *filename, *extension; filename = strtok(in, "."); extension = strtok(NULL, "."); if (extension) sprintf(out, "%.8s.%.3s", filename, extension); else sprintf(out, "%.8s", filename); return out; } char *eight_dot_three(char *in) { static char out[100]; char *last, *last_sep, *fear; int index; if (last_sep = strrchr(in, '\\')) { index = last_sep - in; index++; strncpy(out, in, index); out[index] = '\0'; last = (char *)malloc((strlen(in) - index + 3) * sizeof(char)); strncpy(last, &in[index], strlen(in) - index); last[strlen(in) - index] = '\0'; } else if (last_sep = strrchr(in, ':')) { index = last_sep - in; index++; strncpy(out, in, index); out[index] = '\0'; last = (char *)malloc((strlen(in) - index + 3) * sizeof(char)); strncpy(last, &in[index], strlen(in) - index); last[strlen(in) - index] = '\0'; } for (fear = last; *fear != '\0'; fear++) if (*fear == '?') *fear = 'Q'; fear = eight_dot_three_helper(last); strcat(out, fear); free(last); return out; } void MoveCursor(int newx, int newy) { MoveToEx(memGraphDC, newx, newy, NULL); MoveToEx(GraphDC, newx, newy, NULL); } void win32_erase_screen(void) { PatBlt(memGraphDC, 0, 0, maxX, maxY, PATCOPY); PatBlt(GraphDC, 0, 0, maxX, maxY, PATCOPY); } void win32_set_bg(FIXNUM c) { /* * set global variables that denote the background color, create a new * brush with the desired color, repaint the memory context, wait for * WM_PAINT, and redraw the old display (using the records...) */ back_ground = c; hbrush = CreateSolidBrush(palette[back_ground+2]); SelectObject(memGraphDC, hbrush); DeleteObject(SelectObject(GraphDC, hbrush)); PatBlt(memGraphDC, 0, 0, maxX, maxY, PATCOPY); PatBlt(GraphDC, 0, 0, maxX, maxY, PATCOPY); SetBkColor(memGraphDC, palette[back_ground+2]); SetBkColor(GraphDC, palette[back_ground+2]); redraw_graphics(); } void win32_clear_text(void) { // RECT r; /* * Draw over the entire client area, so that in split screen mode, for * example, there are no ghosts, when the user returns to textscreen mode. */ // GetClientRect(hConWnd, &r); memset(myScreen, ' ',maxXChar*maxYChar); FillRect(ConDC, &allRect, textbrush); FillRect(memConDC, &allRect, textbrush); } LRESULT CALLBACK GraphWindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HFONT hfont; PAINTSTRUCT ps; switch (message) { case WM_CREATE: /* * Now, create a copy of the entire screen in memory to act as a virtual * window to record turtle motions so they can be repainted in a * WM_PAINT message. */ GraphDC = GetDC(hwnd); memGraphDC = CreateCompatibleDC(GraphDC); maxX = GetSystemMetrics(SM_CXSCREEN); maxY = GetSystemMetrics(SM_CYSCREEN); hbitmG = CreateCompatibleBitmap(GraphDC, maxX, maxY); SelectObject(memGraphDC, hbitmG); hbitG = CreateCompatibleBitmap(GraphDC, maxX, maxY); SelectObject(GraphDC, hbitG); if (oemfont) { hfont = GetStockObject(OEM_FIXED_FONT); SelectObject(memGraphDC, hfont); SelectObject(GraphDC, hfont); } if (ansifont) { hfont = GetStockObject(ANSI_FIXED_FONT); SelectObject(memGraphDC, hfont); SelectObject(GraphDC, hfont); } /* * first-time initialization of the brush for the background requires * setting the back_ground, and selecting the right color. while * there may be stock objects that contain the right color for the * initial pen/brush, subsequent changes might try to delete these * "stock" pens/brushes, and that would be "Bad". */ back_ground = 0; hbrush = CreateSolidBrush(palette[back_ground+2]); SetBkColor(memGraphDC, palette[back_ground+2]); SetBkColor(GraphDC, palette[back_ground+2]); SelectObject(memGraphDC, hbrush); SelectObject(GraphDC, hbrush); /* * first-time initialization of the pen structure requires setting up * all of the fields in the data first, then creating a new pen object */ turtlePen.h = 0; /* ?? */ turtlePen.v = 0; /* ?? */ turtlePen.vis = 0; turtlePen.mode = WIN_PEN_DOWN; turtlePen.width = 1; /* default */ turtlePen.color = pen_color = old_pen_color = 7; /* turtlePen.pattern = ... ? */ turtlePen.hpen = CreatePen(PS_SOLID, turtlePen.width, palette[2+turtlePen.color]); SetTextColor(memGraphDC, palette[2+turtlePen.color]); SetTextColor(GraphDC, palette[2+turtlePen.color]); SelectObject(memGraphDC, turtlePen.hpen); SelectObject(GraphDC, turtlePen.hpen); PatBlt(memGraphDC, 0, 0, maxX, maxY, PATCOPY); PatBlt(GraphDC, 0, 0, maxX, maxY, PATCOPY); break; case WM_LBUTTONDOWN: w_button = 1; goto abutton; case WM_RBUTTONDOWN: w_button = 2; goto abutton; case WM_MBUTTONDOWN: w_button = 3; abutton: SetCapture(hwnd); case WM_MOUSEMOVE: mouse_x = (LOWORD(lParam))-(screen_width/2); mouse_y = (screen_height/2)-(HIWORD(lParam)); break; case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: w_button = 0; ReleaseCapture(); break; case WM_USER: InvalidateRect(hGraphWnd, NULL, 1); case WM_PAINT: BeginPaint(hGraphWnd, &ps); BitBlt(ps.hdc, 0, 0, maxX, maxY, memGraphDC, 0, 0, SRCCOPY); EndPaint(hGraphWnd, &ps); break; case WM_DESTROY: /* end program */ PostQuitMessage(0); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } void win32_text_cursor(void) { print_char(stdout, '_'); update_coords('\b'); } void DrawBoxOutline(POINT ptBeg, POINT ptEnd) { SetROP2(ConDC, R2_NOT); SelectObject(ConDC, GetStockObject(NULL_BRUSH)); Rectangle(ConDC, ptBeg.x, ptBeg.y, ptEnd.x, ptEnd.y); } LRESULT CALLBACK ConsoleWindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HFONT hfont; PAINTSTRUCT ps; RECT rect; TEXTMETRIC tm; HGLOBAL hClipMemory, hCopyText; PSTR pClipMemory, copyText; static int fBlocking=FALSE, haveBlock=FALSE; static POINT ptBeg, ptEnd; static int chBegX, chBegY, chEndX, chEndY; char *copyPtr; int i,j; switch (message) { case WM_CREATE: ConDC = GetDC(hwnd); memConDC = CreateCompatibleDC(ConDC); allRect.left = allRect.top = 0; allRect.right = maxX = GetSystemMetrics(SM_CXSCREEN); allRect.bottom = maxY = GetSystemMetrics(SM_CYSCREEN); hbitmC = CreateCompatibleBitmap(ConDC, maxX, maxY); SelectObject(memConDC, hbitmC); hbitC = CreateCompatibleBitmap(ConDC, maxX, maxY); SelectObject(ConDC, hbitC); if (oemfont) { hfont = GetStockObject(OEM_FIXED_FONT); SelectObject(memConDC, hfont); SelectObject(ConDC, hfont); } if (ansifont) { hfont = GetStockObject(ANSI_FIXED_FONT); SelectObject(memConDC, hfont); SelectObject(ConDC, hfont); } textbrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); SelectObject(memConDC, textbrush); SelectObject(ConDC, textbrush); FillRect(memConDC, &allRect, textbrush); GetClientRect(hConWnd, &rect); GetTextMetrics(ConDC, &tm); maxXChar = maxX / tm.tmAveCharWidth; maxYChar = maxY / (tm.tmHeight + tm.tmExternalLeading); myScreen = (char *)malloc(maxXChar * maxYChar); memset(myScreen, ' ',maxXChar*maxYChar); ibm_plain_mode(); break; case WM_LBUTTONDOWN: if (haveBlock) DrawBoxOutline(ptBeg, ptEnd); GetTextMetrics(memConDC, &tm); ptEnd.x = LOWORD(lParam); ptEnd.y = HIWORD(lParam); ptEnd.x = (ptEnd.x/tm.tmAveCharWidth) * tm.tmAveCharWidth; ptEnd.y = (ptEnd.y/(tm.tmHeight + tm.tmExternalLeading)) * (tm.tmHeight + tm.tmExternalLeading); ptBeg.x = ptEnd.x; ptBeg.y = ptEnd.y; DrawBoxOutline(ptBeg, ptEnd); SetCapture(hwnd); fBlocking = TRUE; haveBlock = FALSE; return 0; case WM_MOUSEMOVE: GetTextMetrics(memConDC, &tm); if (fBlocking) { DrawBoxOutline(ptBeg, ptEnd); ptEnd.x = LOWORD(lParam); ptEnd.y = HIWORD(lParam); ptEnd.x = (ptEnd.x/tm.tmAveCharWidth) * tm.tmAveCharWidth; ptEnd.y = (ptEnd.y/(tm.tmHeight + tm.tmExternalLeading)) * (tm.tmHeight + tm.tmExternalLeading); DrawBoxOutline(ptBeg, ptEnd); } return 0; case WM_LBUTTONUP: if (fBlocking) { ReleaseCapture(); fBlocking = FALSE; haveBlock=TRUE; GetClientRect(hConWnd, &rect); if (ptEnd.x >= 0 && ptEnd.y >= 0 && ptEnd.x < rect.right && ptEnd.y < rect.bottom) { GetTextMetrics(memConDC, &tm); chBegX = ptBeg.x/tm.tmAveCharWidth; chBegY = ptBeg.y/(tm.tmHeight + tm.tmExternalLeading); chEndX = ptEnd.x/tm.tmAveCharWidth; chEndY = ptEnd.y/(tm.tmHeight + tm.tmExternalLeading); } else { DrawBoxOutline(ptBeg, ptEnd); haveBlock = FALSE; } } return 0; case WM_CHAR: if (haveBlock) DrawBoxOutline(ptBeg, ptEnd); if (char_mode) { buffered_char = (char)wParam; char_avail++; haveBlock = FALSE; return 0; } print_space(stdout); // flush cursor update_coords('\b'); if ((char) wParam == '\b') { if (cur_index > 0) { update_coords('\b'); print_space(stdout); update_coords('\b'); win32_text_cursor(); cur_index--; } else { MessageBeep(0); haveBlock = FALSE; win32_lines[cur_line][cur_index++] = (char) wParam; print_char(stdout, (char) wParam); win32_text_cursor(); } } else if ((char) wParam == '\r') { // line ready, let's go! print_char(stdout, '\n'); haveBlock = FALSE; win32_lines[cur_line][cur_index++] = '\n'; // reader code expects \n win32_lines[cur_line][cur_index] = '\0'; cur_len = cur_index; read_line = (char *)malloc((strlen(win32_lines[cur_line]) + 1) * sizeof(char)); strncpy(read_line, win32_lines[cur_line], cur_index + 1); line_avail = 1; read_index = 0; if (++cur_line >= NUM_LINES) cur_line %= NUM_LINES; // wrap around cur_index = 0; return 0; } else if ((char)wParam == 17 || (char)wParam == 23) { haveBlock = FALSE; print_char(stdout, '\n'); read_line = (char *)malloc(sizeof(char)); *read_line = (char)wParam; line_avail = 1; read_index = 0; cur_index = 0; return 0; } else if ((char)wParam == 3 && haveBlock) { /* ^C for copy */ int temp; haveBlock = FALSE; if (chEndX < chBegX) { temp = chEndX; chEndX = chBegX; chBegX = temp; } if (chEndY < chBegY) { temp = chEndY; chEndY = chBegY; chBegY = temp; } hCopyText = GlobalAlloc(GHND, (chEndY-chBegY)*(2+chEndX-chBegX)+1); copyText = GlobalLock(hCopyText); copyPtr = copyText; for (i=chBegY; i= NUM_LINES) cur_line %= NUM_LINES; // wrap around cur_index = 0; return; } if (ch != 3 && ch != 22 && ch != '\n') { win32_lines[cur_line][cur_index++] = ch; print_char(stdout, ch); } ch = *winPastePtr++; } free(winPasteText); winPasteText = NULL; } NODE *win32_get_node_pen_pattern(void) { return cons(make_intnode(-1), NIL); } NODE *maximize(NODE *args) { int big=torf_arg(args); ShowWindow(hMainWnd, (big ? SW_MAXIMIZE : SW_RESTORE)); UpdateWindow(hMainWnd); return UNBOUND; } void logofill(void) { COLORREF col; hbrush = CreateSolidBrush(palette[2+pen_color]); SelectObject(memGraphDC, hbrush); DeleteObject(SelectObject(GraphDC, hbrush)); col = GetPixel(memGraphDC, g_round(screen_x_coord), g_round(screen_y_coord)); (void)ExtFloodFill(memGraphDC, g_round(screen_x_coord), g_round(screen_y_coord), col, FLOODFILLSURFACE); (void)ExtFloodFill(GraphDC, g_round(screen_x_coord), g_round(screen_y_coord), col, FLOODFILLSURFACE); hbrush = CreateSolidBrush(palette[2+back_ground]); SelectObject(memGraphDC, hbrush); DeleteObject(SelectObject(GraphDC, hbrush)); } void get_pen_pattern(void) { } void set_pen_pattern(void) { } void get_palette(int slot, unsigned int *r, unsigned int *g, unsigned int *b) { if (slot > 263 || (slot >= 0 && slot < 8) || slot < -2) // 256 rgb values return; slot+=2; *b = ((palette[slot % 264] & 0x00ff0000) >> 16) * 256; *g = ((palette[slot % 264] & 0x0000ff00) >> 8) * 256; *r = (palette[slot % 264] & 0x000000ff) * 256; } void set_palette(int slot, unsigned int r, unsigned int g, unsigned int b) { if (slot > 263 || (slot >= 0 && slot < 8) || slot < -2) // 256 rgb values return; slot+=2; palette[slot] = RGB(r/256, g/256, b/256); } void save_pen(pen_info *p) { POINT pt; p->vis = pen_vis; p->color = pen_color; GetCurrentPositionEx(memGraphDC, &pt); p->h = (int) pt.x; p->v = (int) pt.y; p->width = turtlePen.width; p->mode = turtlePen.mode; } void restore_pen(pen_info *p) { pen_vis = p->vis; MoveCursor(p->h, p->v); turtlePen.mode = p->mode; win32_set_pen_mode(turtlePen.mode); turtlePen.width = p->width; pen_color = p->color; turtlePen.hpen = CreatePen(PS_SOLID, turtlePen.width, (in_erase_mode ? palette[2+back_ground] : palette[2+pen_color])); SelectObject(memGraphDC, turtlePen.hpen); DeleteObject(SelectObject(GraphDC, turtlePen.hpen)); } void set_list_pen_pattern(void) { } void label(char *str) { draw_string(str); } void plain_xor_pen(void) { win32_set_pen_mode(WIN_PEN_REVERSE); } BOOLEAN check_ibm_stop(void) { MSG msg; SHORT s; static int count; if ((s = GetAsyncKeyState(VK_CONTROL)) < 0) { if ((s = GetAsyncKeyState(65 + ('q' - 'a')) < 0)) { err_logo(STOP_ERROR,NIL); return (1); } if ((s = GetAsyncKeyState(65 + ('w' - 'a')) < 0)) { // control w to_pending = 0; lpause(NIL); } } count++; count %= 300; // empirical value if (!count) { if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { if (msg.message == WM_QUIT) ; else { TranslateMessage(&msg); DispatchMessage(&msg); } } } return FALSE; } void win32_con_full_screen(void) { RECT r; PAINTSTRUCT ps; if (in_graphics_mode && !in_splitscreen) return; in_graphics_mode = 1; in_splitscreen = 0; GetClientRect(hMainWnd, &r); /* position coordinates are relative to the parent's frame. */ MoveWindow(hGraphWnd, 0, 0, r.right, r.bottom, TRUE); ShowWindow(hConWnd, SW_HIDE); ShowWindow(hGraphWnd, SW_SHOWNORMAL); BeginPaint(hGraphWnd, &ps); BitBlt(ps.hdc, 0, 0, maxX, maxY, memGraphDC, 0, 0, SRCCOPY); EndPaint(hGraphWnd, &ps); redraw_graphics(); } void win32_prepare_draw(void) { if (in_graphics_mode) return; win32_con_split_screen(); } long upscroll_text(int limit) { TEXTMETRIC tm; RECT r, inv; int y_new, offset, old, rbot; GetClientRect(hMainWnd, &r); GetTextMetrics(memConDC, &tm); y_new = r.bottom; y_new /= (tm.tmHeight + tm.tmExternalLeading); rbot = y_new * (tm.tmHeight + tm.tmExternalLeading); y_new--; if (limit > 0 && limit < y_new) { y_new = limit; rbot = r.bottom = (limit+1) * (tm.tmHeight + tm.tmExternalLeading); } offset = y_coord - y_new; if (offset > 0) { old = (y_coord + 1) * (tm.tmHeight + tm.tmExternalLeading); BitBlt(ConDC, 0, 0, maxX, maxY, memConDC, 0, old-rbot, SRCCOPY); inv.left = 0; inv.right = allRect.right; inv.top = rbot - 1; inv.bottom = allRect.bottom; BitBlt(memConDC, 0, 0, maxX, maxY, ConDC, 0, 0, SRCCOPY); FillRect(memConDC, &inv, textbrush); y_coord = y_new; } return r.bottom; } void reshow_text(void) { TEXTMETRIC tm; RECT r, foo; ShowWindow(hConWnd, SW_SHOW); GetClientRect(hConWnd, &r); GetTextMetrics(memConDC, &tm); FillRect(ConDC, &r, textbrush); if (r.right > Xsofar) { foo.left = Xsofar; foo.right = r.right; foo.top = 0; foo.bottom = allRect.bottom; FillRect(memConDC, &foo, textbrush); Xsofar = r.right; } if (r.bottom > Ysofar) { foo.left = 0; foo.right = r.right; foo.top = Ysofar; foo.bottom = r.bottom; FillRect(memConDC, &foo, textbrush); Ysofar = r.bottom; } BitBlt(ConDC, 0, 0, r.right, r.bottom, memConDC, 0, 0, SRCCOPY); ValidateRect(hConWnd, &r); x_max = r.right; x_max /= tm.tmAveCharWidth; x_max--; y_max = r.bottom; y_max /= (tm.tmHeight + tm.tmExternalLeading); y_max--; } void win32_con_split_screen(void) { RECT r; PAINTSTRUCT ps; long vert; if (in_graphics_mode && in_splitscreen) return; in_graphics_mode = in_splitscreen = 1; ShowWindow(hConWnd, SW_SHOW); vert = upscroll_text(3); GetClientRect(hMainWnd, &r); MoveWindow(hConWnd, 0, r.bottom - vert - 6, r.right, vert + 6, FALSE); MoveWindow(hGraphWnd, 0, 0, r.right, r.bottom - vert - 8, TRUE); ShowWindow(hGraphWnd, SW_HIDE); BeginPaint(hGraphWnd, &ps); BitBlt(ps.hdc, 0, 0, maxX, maxY, memGraphDC, 0, 0, SRCCOPY); EndPaint(hGraphWnd, &ps); reshow_text(); redraw_graphics(); ShowWindow(hGraphWnd, SW_SHOW); if (!seen_once) { seen_once = TRUE; lclearscreen(NIL); } } void win32_con_text_screen(void) { RECT r; if (!in_graphics_mode) return; in_graphics_mode = in_splitscreen = 0; (void)upscroll_text(0); GetClientRect(hMainWnd, &r); MoveWindow(hConWnd, 0, 0, r.right, r.bottom, FALSE); ShowWindow(hGraphWnd, SW_HIDE); reshow_text(); } void win32_turtle_prep(void) { if (in_erase_mode) { /* current pen color != "real" pen color */ turtlePen.hpen = CreatePen(PS_SOLID, turtlePen.width, palette[2+pen_color]); SelectObject(memGraphDC, turtlePen.hpen); DeleteObject(SelectObject(GraphDC, turtlePen.hpen)); } else { SelectObject(memGraphDC, turtlePen.hpen); SelectObject(GraphDC, turtlePen.hpen); } update_pos = FALSE; pre_turtle_pen_mode = SetROP2(memGraphDC, R2_XORPEN); (void)SetROP2(GraphDC, R2_XORPEN); } void win32_turtle_end(void) { if (in_erase_mode) { /* * current pen color should now be set to background color to resume * "erase mode" */ turtlePen.hpen = CreatePen(PS_SOLID, turtlePen.width, palette[2+back_ground]); SelectObject(memGraphDC, turtlePen.hpen); DeleteObject(SelectObject(GraphDC, turtlePen.hpen)); } else { SelectObject(memGraphDC, turtlePen.hpen); SelectObject(GraphDC, turtlePen.hpen); } update_pos = TRUE; SetROP2(memGraphDC, pre_turtle_pen_mode); SetROP2(GraphDC, pre_turtle_pen_mode); } void win32_init_palette(void) { palette[2] = RGB(0, 0, 0); /* black */ palette[3] = RGB(0, 0, 255); /* blue */ palette[4] = RGB(0, 255, 0); /* green */ palette[5] = RGB(0, 255, 255); /* cyan */ palette[6] = RGB(255, 0, 0); /* red */ palette[7] = RGB(255, 0, 255); /* magenta */ palette[8] = RGB(255, 255, 0); /* yellow */ palette[9] = RGB(255, 255, 255); /* white */ palette[10] = RGB(155, 96, 59); /* brown */ palette[11] = RGB(197, 136, 18); /* tan */ palette[12] = RGB(100, 162, 64); /* forest */ palette[13] = RGB(120, 187, 187); /* aqua */ palette[14] = RGB(255, 149, 119); /* salmon */ palette[15] = RGB(144, 113, 208); /* purple */ palette[16] = RGB(255, 163, 0); /* orange */ palette[17] = RGB(183, 183, 183); /* gray */ /* rest are user defined */ } void win32_set_pen_color(int c) { draw_turtle(); turtlePen.color = pen_color = c; if (!in_erase_mode) { turtlePen.hpen = CreatePen(PS_SOLID, turtlePen.width, palette[2+turtlePen.color]); SelectObject(memGraphDC, turtlePen.hpen); DeleteObject(SelectObject(GraphDC, turtlePen.hpen)); } SetTextColor(memGraphDC, palette[2+pen_color]); SetTextColor(GraphDC, palette[2+pen_color]); draw_turtle(); } int win32_set_pen_width(int w) { int old; old = turtlePen.width; turtlePen.width = w; turtlePen.hpen = CreatePen(PS_SOLID, turtlePen.width, (in_erase_mode ? palette[2+back_ground] : palette[2+turtlePen.color])); SelectObject(memGraphDC, turtlePen.hpen); DeleteObject(SelectObject(GraphDC, turtlePen.hpen)); return old; } NODE *win32_lsetcursor(NODE *args) { NODE *arg; TEXTMETRIC tm; int xpos, ypos; GetTextMetrics(memConDC, &tm); arg = pos_int_vector_arg(args); if (NOT_THROWING) { x_coord = x_margin + getint(car(arg)); y_coord = y_margin + getint(cadr(arg)); while ((x_coord >= x_max || y_coord >= y_max) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); if (NOT_THROWING) { arg = pos_int_vector_arg(args); x_coord = x_margin + getint(car(arg)); y_coord = y_margin + getint(cadr(arg)); } } } xpos = tm.tmAveCharWidth * x_coord; ypos = (tm.tmHeight + tm.tmExternalLeading) * y_coord; if (NOT_THROWING) { MoveToEx(memConDC, xpos, ypos, NULL); MoveToEx(ConDC, xpos, ypos, NULL); } return(UNBOUND); } void win32_pen_erase(void) { win32_set_pen_mode(WIN_PEN_ERASE); } void win32_pen_down(void) { win32_set_pen_mode(WIN_PEN_DOWN); } void win32_pen_reverse(void) { win32_set_pen_mode(WIN_PEN_REVERSE); } void win32_set_pen_mode(int newmode) { int rop2_mode, newpc; turtlePen.mode = newmode; if (newmode == WIN_PEN_ERASE) in_erase_mode = TRUE; else in_erase_mode = FALSE; if (newmode == WIN_PEN_REVERSE) rop2_mode = R2_XORPEN; else rop2_mode = R2_COPYPEN; SetROP2(memGraphDC, rop2_mode); SetROP2(GraphDC, rop2_mode); if (newmode == WIN_PEN_ERASE) newpc = back_ground; else newpc = pen_color; turtlePen.hpen = CreatePen(PS_SOLID, turtlePen.width, palette[2+newpc]); SelectObject(memGraphDC, turtlePen.hpen); DeleteObject(SelectObject(GraphDC, turtlePen.hpen)); } LRESULT CALLBACK ParentWindowFunc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { RECT r; switch (message) { case WM_CHAR: SendMessage(hConWnd, WM_CHAR, wParam, lParam); break; case WM_SIZE: case WM_EXITSIZEMOVE: if (wParam != SIZE_MINIMIZED) { if (!in_graphics_mode) { // Text screen mode in_graphics_mode = 1; win32_con_text_screen(); } else if (in_splitscreen) { in_splitscreen = 0; win32_con_split_screen(); } else { in_graphics_mode = 0; win32_con_full_screen(); } } case WM_MOVE: case WM_SETFOCUS: case WM_EXITMENULOOP: if (!in_graphics_mode || in_splitscreen) SendMessage(hConWnd, WM_USER, wParam, lParam); if (in_graphics_mode) SendMessage(hGraphWnd, WM_USER, wParam, lParam); win32_update_text(); break; case WM_PAINT: /* * The parent window really has nothing to draw. Therefore, all that * the parent window's paint function does is dispatch the appropriate * message to the child window. */ if (!in_graphics_mode || in_splitscreen) SendMessage(hConWnd, WM_PAINT, wParam, lParam); if (in_graphics_mode) SendMessage(hGraphWnd, WM_PAINT, wParam, lParam); GetClientRect(hwnd, &r); ValidateRect(hwnd, &r); break; case WM_CREATE: hConWnd = CreateWindow(szConWinName, NULL, WS_CHILDWINDOW | WS_VISIBLE | WS_BORDER, 0, 0, 0, 0, hwnd, (HMENU) (2 << 8), (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), NULL); hGraphWnd = CreateWindow(szGraphWinName, NULL, WS_CHILDWINDOW | WS_VISIBLE | WS_BORDER, 0, 0, 0, 0, hwnd, (HMENU) (4 << 8), (HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE), NULL); break; case WM_DESTROY: /* end program */ win32_go_away(); break; default: return DefWindowProc(hwnd, message, wParam, lParam); } return 0; } void CharOut(int c) { TEXTMETRIC tm; RECT r; int xpos, ypos; char nog[3]; sprintf(nog, "%c", c); if (x_coord < maxXChar && y_coord < maxYChar) myScreen[(y_coord * maxXChar) + x_coord] = c; GetTextMetrics(memConDC, &tm); xpos = tm.tmAveCharWidth * x_coord; ypos = (tm.tmHeight + tm.tmExternalLeading) * y_coord; r.left = xpos; r.right = (xpos + tm.tmAveCharWidth); r.top = ypos; r.bottom = (ypos + tm.tmHeight + tm.tmExternalLeading); TextOut(memConDC, xpos, ypos, nog, 1); TextOut(ConDC, xpos, ypos, nog, 1); } int win32_putc(int c, FILE *strm) { if (strm == stdout || strm == stderr) { if (c == '\n') win32_advance_line(); else if (c == '\t') /* do nothing */ ; else if (c == '\007') tone(400,30); else { if (x_coord == x_max) new_line(strm); CharOut(c); } return 0; } return putc(c, strm); } void win32_charmode_on(void) { char_mode = 1; } void win32_charmode_off(void) { char_mode = 0; } void ibm_bold_mode(void) { SetTextColor(memConDC, GetSysColor(COLOR_WINDOW)); SetTextColor(ConDC, GetSysColor(COLOR_WINDOW)); SetBkColor(memConDC, GetSysColor(COLOR_WINDOWTEXT)); SetBkColor(ConDC, GetSysColor(COLOR_WINDOWTEXT)); } void ibm_plain_mode(void) { SetTextColor(memConDC, GetSysColor(COLOR_WINDOWTEXT)); SetTextColor(ConDC, GetSysColor(COLOR_WINDOWTEXT)); SetBkColor(memConDC, GetSysColor(COLOR_WINDOW)); SetBkColor(ConDC, GetSysColor(COLOR_WINDOW)); } NODE *set_text_color(NODE *args) { int fore, back; fore = getint(pos_int_arg(args)); if (NOT_THROWING) { back = getint(pos_int_arg(cdr(args))); if (NOT_THROWING) { SetTextColor(memConDC, palette[2+fore]); SetTextColor(ConDC, palette[2+fore]); SetBkColor(memConDC, palette[2+back]); SetBkColor(ConDC, palette[2+back]); } } return UNBOUND; } /* Thanks to George Mills for the tone code! */ /* was: MessageBeep(0xffffffff); */ void tone(FIXNUM pitch, FIXNUM duration) { OSVERSIONINFO VersionInformation; unsigned char count_lo; unsigned char count_hi; FIXNUM count; clock_t NumTicksToWait; memset(&VersionInformation, 0, sizeof(OSVERSIONINFO)); VersionInformation.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if (pitch < 37) pitch = 37; GetVersionEx(&VersionInformation); if (VersionInformation.dwPlatformId == VER_PLATFORM_WIN32_NT) Beep(pitch, duration); else { count = 1193180L / pitch; count_lo = LOBYTE(count); count_hi = HIBYTE(count); _asm { mov al, 0xB6 out 0x43, al mov al, count_lo out 0x42, al mov al, count_hi out 0x42, al xor al, al in al, 0x61 or al, 0x03 out 0x61, al } NumTicksToWait = duration + clock(); while (NumTicksToWait > clock()); _asm { xor al, al in al, 0x61 xor al, 0x03 out 0x61, al } } } ucblogo-6.1/usermanual0000664000175000017500000045732513575571772013254 0ustar jjcjjcBerkeley Logo User Manual * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . This is a program that is still being written. Many things are missing, including adequate documentation. This manual assumes that you already know how to program in Logo, and merely presents the details of this new implementation. Read _Computer_Science_Logo_Style,_Volume_1:_ _Symbolic_Computing_ by Brian Harvey (MIT Press, 1997) for a tutorial on Logo programming with emphasis on symbolic computation. Here are the special features of this dialect of Logo: Source file compatible among Unix, DOS, Windows, and Mac platforms. Random-access arrays. Variable number of inputs to user-defined procedures. Mutators for list structure (dangerous). Pause on error, and other improvements to error handling. Comments and continuation lines; formatting is preserved when procedure definitions are saved or edited. Terrapin-style tokenization (e.g., [2+3] is a list with one member) but LCSI-style syntax (no special forms except TO). The best of both worlds. First-class instruction and expression templates (see APPLY). Macros. Features *not* found in Berkeley Logo include robotics, music, GUIs, animation, parallelism, and multimedia. For those, buy a commercial version. GETTER/SETTER VARIBLE SYNTAX ============================ Logo distinguishes PROCEDURES from VARIABLES. A procedure is a set of instructions to carry out some computation; a variable is a named container that holds a data value such as a number, word, list, or array. In traditional Logo syntax, a non-numeric word typed without punctuation represents a request to invoke the procedure named by that word. A word typed with a preceding quotation mark represents the word itself. For example, in the instruction PRINT FIRST "WORD the procedures named FIRST and PRINT are invoked, but the procedure named WORD is not invoked; the word W-O-R-D is the input to FIRST. What about variables? There are two things one can do with a variable: give it a value, and find out its value. To give a variable a value, Logo provides the primitive procedure MAKE, which requires two inputs: the name of the variable and the new value to be assigned. The first input, the name of the variable, is just a word, and if (as is almost always the case) the programmer wants to assign a value to a specific variable whose name is known in advance, that input is quoted, just as any known specific word would be: MAKE "MY.VAR FIRST "WORD gives the variable named MY.VAR the value W (the first letter of WORD). To find the value of a variable, Logo provides the primitive procedure THING, which takes a variable name as its input, and outputs the value of the accessible variable with that name. Thus PRINT THING "MY.VAR will print W (supposing the MAKE above has been done). Since finding the value of a specific, known variable name is such a common operation, Logo also provides an abbreviated notation that combines THING with quote: PRINT :MY.VAR The colon (which Logo old-timers pronounce "dots") replaces THING and " in the earlier version of the instruction. Newcomers to Logo often complain about the need for all this punctuation. In particular, Logo programmers who learned about dots and quotes without also learning about THING wonder why an instruction such as MAKE "NEW.VAR :OLD.VAR uses two different punctuation marks to identify the two variables. (Having read the paragraphs above, you will understand that actually both variable names are quoted, but the procedure THING is invoked to find the value of OLD.VAR, since it's that value, not OLD.VAR's name, that MAKE needs to know. It wouldn't make sense to ask for THING of NEW.VAR, since we haven't given NEW.VAR a value yet.) Although Logo's punctuation rules make sense once understood, they do form a barrier to entry for the Logo beginner. Why, then, couldn't Logo be designed so that an unpunctuated word would represent a procedure if there is a procedure by that name, or a variable if there is a variable by that name? Then we could say PRINT MY.VAR and Logo would realize that MY.VAR is the name of a variable, not of a procedure. The traditional reason not to use this convention is that Logo allows the same word to name a procedure and a variable at the same time. This is most often important for words that name data types, as in the following procedure: TO PLURAL :WORD OUTPUT WORD :WORD "S END Here the name WORD is a natural choice for the input to PLURAL, since it describes the kind of input that PLURAL expects. Within the procedure, we use WORD to represent Logo's primitive procedure that combines two input words to form a new, longer word; we use :WORD to represent the variable containing the input, whatever actual word is given when PLURAL is invoked. ? PRINT PLURAL "COMPUTER COMPUTERS However, if a Logo instruction includes an unquoted word that is *not* the name of a procedure, Logo could look for a variable of that name instead. This would allow a "punctuationless" Logo, ** PROVIDED THAT USERS WHO WANT TO WORK WITHOUT COLONS FOR VARIABLES CHOOSE VARIABLE NAMES THAT ARE NOT ALSO PROCEDURE NAMES. ** What about assigning a value to a variable? Could we do without the quotation mark on MAKE's first input? Alas, no. Although the first input to MAKE is *usually* a constant, known variable name, sometimes it isn't, as in this example: TO INCREMENT :VAR MAKE :VAR (THING :VAR)+1 ; Note: it's not "VAR here! END ? MAKE "X 5 ? INCREMENT "X ? PRINT :X 6 The procedure INCREMENT takes a variable name as its input and changes the value of that variable. In this example there are two variables; the variable whose name is VAR, and whose value is the word X; and the variable whose name is X and whose value changes from 5 to 6. Suppose we changed the behavior of MAKE so that it took the word after MAKE as the name of the variable to change; we would be unable to write INCREMENT: TO INCREMENT :VAR ; nonworking! MAKE VAR (THING VAR)+1 END This would assign a new value to VAR, not to X. What we can do is to allow an *alternative* to MAKE, a "setter" procedure for a particular variable. The notation will be ? SETFOO 7 ? PRINT FOO 7 SETFOO is a "setter procedure" that takes one input (in this case the input 7) and assigns its value to the variable named FOO. Berkeley Logo allows users to choose either the traditional notation, in which case the same name can be used both for a procedure and for a variable, or the getter/setter notation, in which variable FOO is set with SETFOO and examined with FOO, but the same name can't be used for procedure and variable. Here is how this choice is allowed: Berkeley Logo uses traditional notation, with procedures distinct from variables. However, if there is a variable named AllowGetSet whose value is TRUE (which there is, by default, when Logo starts up), then if a Logo instruction refers to a *nonexistent* procedure (so that the error message "I don't know how to ..." would result), Logo tries the following two steps: 1. If the name is at least four characters long, and the first three characters are the letters SET (upper or lower case), and if the name is followed in the instruction by another value, and if the name without the SET is the name of a variable that already exists, then Logo will invoke MAKE with its first input being the name without the SET, and its second input being the following value. 2. If step 1's conditions are not met, but the name is the name of an accessible variable, then Logo will invoke THING with that name as input, to find the variable's value. Step 1 requires that the variable already exist so that misspellings of names of SETxxx primitives (e.g., SETHEADING) will still be caught, instead of silently creating a new variable. The command GLOBAL can be used to create a variable without giving it a value. One final point: The TO command in Logo has always been a special case; the rest of the line starting with TO is not evaluated as ordinary Logo expressions are. In particular, the colons used to mark the names of inputs to the procedure do not cause THING to be invoked. They are merely mnemonic aids, reminding the Logo user that these words are names of variables. (Arguably, this nonstantard behavior of TO adds to Logo beginners' confusion about colons.) To a programmer using colonless variable references, the colons in the TO line are unnecessary and meaningless. Berkeley Logo therefore makes the colons optional: TO FOO :IN1 :IN2 and TO FOO IN1 IN2 are both allowed. ENTERING AND LEAVING LOGO ========================= The process to start Logo depends on your operating system: Unix: Type the word {\tt logo} to the shell. (The directory in which you've installed Logo must be in your path.) DOS: Change directories to the one containing Logo (probably C:\UCBLOGO). Then type UCBLOGO for the large memory version, or BL for the 640K version. Mac: Double-click on the LOGO icon within the "UCB Logo" folder. Windows: Double-click on the UCBWLOGO icon in the UCBLOGO folder. To leave Logo, enter the command "bye". On startup, Logo looks for a file named "startup.lg" in the system Logo library and, if found, loads it. Then it looks for "startup.lg" in the user's home directory, or the current directory, depending on the operating system, and loads that. These startup files can be used to predefine procedures, e.g., to provide non-English names for primitive procedures. Under Unix, DOS, or Windows, if you include one or more filenames on the command line when starting Logo, those files will be loaded before the interpreter starts reading commands from your terminal. If you load a file that executes some program that includes a "bye" command, Logo will run that program and exit. You can therefore write standalone programs in Logo and run them with shell/batch scripts. To support this technique, Logo does not print its usual welcoming and parting messages if you give file arguments to the logo command. If a command line argument is just a hyphen, then all command line arguments after the hyphen are not taken as filenames, but are instead collected in a list, one word per argument; the buried variable COMMAND.LINE contains that list of arguments, or the empty list if there are none. On my Linux system, if the first line of an executable shell script is #!/usr/local/bin/logo - (note the hyphen) then the script can be given command line arguments and they all end up in :COMMAND.LINE along with the script's path. Experiment. If you type your interrupt character (see table below) Logo will stop what it's doing and return to toplevel, as if you did THROW "TOPLEVEL. If you type your quit character Logo will pause as if you did PAUSE. wxWidgets Unix DOS/Windows Mac toplevel alt-S usually ctrl-C ctrl-Q command-. (period) pause alt-P usually ctrl-\ ctrl-W command-, (comma) If you have an environment variable called LOGOLIB whose value is the name of a directory, then Logo will use that directory instead of the default library. If you invoke a procedure that has not been defined, Logo first looks for a file in the current directory named proc.lg where "proc" is the procedure name in lower case letters. If such a file exists, Logo loads that file. If the missing procedure is still undefined, or if there is no such file, Logo then looks in the library directory for a file named proc (no ".lg") and, if it exists, loads it. If neither file contains a definition for the procedure, then Logo signals an error. Several procedures that are primitive in most versions of Logo are included in the default library, so if you use a different library you may want to include some or all of the default library in it. TOKENIZATION ============ Names of procedures, variables, and property lists are case-insensitive. So are the special words END, TRUE, and FALSE. Case of letters is preserved in everything you type, however. Within square brackets, words are delimited only by spaces and square brackets. [2+3] is a list containing one word. Note, however, that the Logo primitives that interpret such a list as a Logo instruction or expression (RUN, IF, etc.) reparse the list as if it had not been typed inside brackets. After a quotation mark outside square brackets, a word is delimited by a space, a square bracket, or a parenthesis. A word not after a quotation mark or inside square brackets is delimited by a space, a bracket, a parenthesis, or an infix operator +-*/=<>. Note that words following colons are in this category. Note that quote and colon are not delimiters. Each infix operator character is a word in itself, except that the two-character sequences <= >= and <> (the latter meaning not-equal) with no intervening space are recognized as a single word. A word consisting of a question mark followed by a number (e.g., ?37), when runparsed (i.e., where a procedure name is expected), is treated as if it were the sequence ( ? 37 ) making the number an input to the ? procedure. (See the discussion of templates, below.) This special treatment does not apply to words read as data, to words with a non-number following the question mark, or if the question mark is backslashed. A line (an instruction line or one read by READLIST or READWORD) can be continued onto the following line if its last character is a tilde (~). READWORD preserves the tilde and the newline; READLIST does not. Lines read with READRAWLINE are never continued. An instruction line or a line read by READLIST (but not by READWORD) is automatically continued to the next line, as if ended with a tilde, if there are unmatched brackets, parentheses, braces, or vertical bars pending. However, it's an error if the continuation line contains only the word END; this is to prevent runaway procedure definitions. Lines eplicitly continued with a tilde avoid this restriction. If a line being typed interactively on the keyboard is continued, either with a tilde or automatically, Logo will display a tilde as a prompt character for the continuation line. A semicolon begins a comment in an instruction line. Logo ignores characters from the semicolon to the end of the line. A tilde as the last character still indicates a continuation line, but not a continuation of the comment. For example, typing the instruction print "abc;comment ~ def will print the word abcdef. Semicolon has no special meaning in data lines read by READWORD or READLIST, but such a line can later be reparsed using RUNPARSE and then comments will be recognized. The two-character sequence #! at the beginning of a line also starts a comment. Unix users can therefore write a file containing Logo commands, starting with the line #! /usr/local/bin/logo (or wherever your Logo executable lives) and the file will be executable directly from the shell. To include an otherwise delimiting character (including semicolon or tilde) in a word, precede it with backslash (\). If the last character of a line is a backslash, then the newline character following the backslash will be part of the last word on the line, and the line continues onto the following line. To include a backslash in a word, use \\. If the combination backslash-newline is entered at the terminal, Logo will issue a backslash as a prompt character for the continuation line. All of this applies to data lines read with READWORD or READLIST as well as to instruction lines. A line read with READRAWLINE has no special quoting mechanism; both backslash and vertical bar (described below) are just ordinary characters. An alternative notation to include otherwise delimiting characters in words is to enclose a group of characters in vertical bars. All characters between vertical bars are treated as if they were letters. In data read with READWORD the vertical bars are preserved in the resulting word. In data read with READLIST (or resulting from a PARSE or RUNPARSE of a word) the vertical bars do not appear explicitly; all potentially delimiting characters (including spaces, brackets, parentheses, and infix operators) appear unmarked, but tokenized as though they were letters. Within vertical bars, backslash may still be used; the only characters that must be backslashed in this context are backslash and vertical bar themselves. Characters entered between vertical bars are forever special, even if the word or list containing them is later reparsed with PARSE or RUNPARSE. Characters typed after a backslash are treated somewhat differently: When a quoted word containing a backslashed character is runparsed, the backslashed character loses its special quality and acts thereafter as if typed normally. This distinction is important only if you are building a Logo expression out of parts, to be RUN later, and want to use parentheses. For example, PRINT RUN (SE "\( 2 "+ 3 "\)) will print 5, but RUN (SE "MAKE ""|(| 2) will create a variable whose name is open-parenthesis. (Each example would fail if vertical bars and backslashes were interchanged.) A character entered with backslash is EQUALP to the same character without the backslash, but can be distinguished by the VBARREDP predicate. (However, VBARREDP returns TRUE only for characters for which special treatment is necessary: whitespace, parentheses, brackets, infix operators, backslash, vertical bar, tilde, quote, question mark, colon, and semicolon.) DATA STRUCTURE PRIMITIVES ========================= CONSTRUCTORS ------------ WORD word1 word2 (WORD word1 word2 word3 ...) outputs a word formed by concatenating its inputs. LIST thing1 thing2 (LIST thing1 thing2 thing3 ...) outputs a list whose members are its inputs, which can be any Logo datum (word, list, or array). SENTENCE thing1 thing2 SE thing1 thing2 (SENTENCE thing1 thing2 thing3 ...) (SE thing1 thing2 thing3 ...) outputs a list whose members are its inputs, if those inputs are not lists, or the members of its inputs, if those inputs are lists. FPUT thing list outputs a list equal to its second input with one extra member, the first input, at the beginning. If the second input is a word, then the first input must be a one-letter word, and FPUT is equivalent to WORD. LPUT thing list outputs a list equal to its second input with one extra member, the first input, at the end. If the second input is a word, then the first input must be a one-letter word, and LPUT is equivalent to WORD with its inputs in the other order. ARRAY size (ARRAY size origin) outputs an array of "size" members (must be a positive integer), each of which initially is an empty list. Array members can be selected with ITEM and changed with SETITEM. The first member of the array is member number 1 unless an "origin" input (must be an integer) is given, in which case the first member of the array has that number as its index. (Typically 0 is used as the origin if anything.) Arrays are printed by PRINT and friends, and can be typed in, inside curly braces; indicate an origin with {a b c}@0. MDARRAY sizelist (library procedure) (MDARRAY sizelist origin) outputs a multi-dimensional array. The first input must be a list of one or more positive integers. The second input, if present, must be a single integer that applies to every dimension of the array. Ex: (MDARRAY [3 5] 0) outputs a two-dimensional array whose members range from [0 0] to [2 4]. LISTTOARRAY list (LISTTOARRAY list origin) outputs an array of the same size as the input list, whose members are the members of the input list. ARRAYTOLIST array outputs a list whose members are the members of the input array. The first member of the output is the first member of the array, regardless of the array's origin. COMBINE thing1 thing2 (library procedure) if thing2 is a word, outputs WORD thing1 thing2. If thing2 is a list, outputs FPUT thing1 thing2. REVERSE list (library procedure) outputs a list whose members are the members of the input list, in reverse order. GENSYM (library procedure) outputs a unique word each time it's invoked. The words are of the form G1, G2, etc. SELECTORS --------- FIRST thing if the input is a word, outputs the first character of the word. If the input is a list, outputs the first member of the list. If the input is an array, outputs the origin of the array (that is, the INDEX OF the first member of the array). FIRSTS list outputs a list containing the FIRST of each member of the input list. It is an error if any member of the input list is empty. (The input itself may be empty, in which case the output is also empty.) This could be written as to firsts :list output map "first :list end but is provided as a primitive in order to speed up the iteration tools MAP, MAP.SE, and FOREACH. to transpose :matrix if emptyp first :matrix [op []] op fput firsts :matrix transpose bfs :matrix end LAST wordorlist if the input is a word, outputs the last character of the word. If the input is a list, outputs the last member of the list. BUTFIRST wordorlist BF wordorlist if the input is a word, outputs a word containing all but the first character of the input. If the input is a list, outputs a list containing all but the first member of the input. BUTFIRSTS list BFS list outputs a list containing the BUTFIRST of each member of the input list. It is an error if any member of the input list is empty or an array. (The input itself may be empty, in which case the output is also empty.) This could be written as to butfirsts :list output map "butfirst :list end but is provided as a primitive in order to speed up the iteration tools MAP, MAP.SE, and FOREACH. BUTLAST wordorlist BL wordorlist if the input is a word, outputs a word containing all but the last character of the input. If the input is a list, outputs a list containing all but the last member of the input. ITEM index thing if the "thing" is a word, outputs the "index"th character of the word. If the "thing" is a list, outputs the "index"th member of the list. If the "thing" is an array, outputs the "index"th member of the array. "Index" starts at 1 for words and lists; the starting index of an array is specified when the array is created. MDITEM indexlist array (library procedure) outputs the member of the multidimensional "array" selected by the list of numbers "indexlist". PICK list (library procedure) outputs a randomly chosen member of the input list. REMOVE thing list (library procedure) outputs a copy of "list" with every member equal to "thing" removed. REMDUP list (library procedure) outputs a copy of "list" with duplicate members removed. If two or more members of the input are equal, the rightmost of those members is the one that remains in the output. QUOTED thing (library procedure) outputs its input, if a list; outputs its input with a quotation mark prepended, if a word. MUTATORS -------- SETITEM index array value command. Replaces the "index"th member of "array" with the new "value". Ensures that the resulting array is not circular, i.e., "value" may not be a list or array that contains "array". MDSETITEM indexlist array value (library procedure) command. Replaces the member of "array" chosen by "indexlist" with the new "value". .SETFIRST list value command. Changes the first member of "list" to be "value". WARNING: Primitives whose names start with a period are DANGEROUS. Their use by non-experts is not recommended. The use of .SETFIRST can lead to circular list structures, which will get some Logo primitives into infinite loops, and to unexpected changes to other data structures that share storage with the list being modified. .SETBF list value command. Changes the butfirst of "list" to be "value". WARNING: Primitives whose names start with a period are DANGEROUS. Their use by non-experts is not recommended. The use of .SETBF can lead to circular list structures, which will get some Logo primitives into infinite loops; unexpected changes to other data structures that share storage with the list being modified; or to Logo crashes and coredumps if the butfirst of a list is not itself a list. .SETITEM index array value command. Changes the "index"th member of "array" to be "value", like SETITEM, but without checking for circularity. WARNING: Primitives whose names start with a period are DANGEROUS. Their use by non-experts is not recommended. The use of .SETITEM can lead to circular arrays, which will get some Logo primitives into infinite loops. PUSH stackname thing (library procedure) command. Adds the "thing" to the stack that is the value of the variable whose name is "stackname". This variable must have a list as its value; the initial value should be the empty list. New members are added at the front of the list. POP stackname (library procedure) outputs the most recently PUSHed member of the stack that is the value of the variable whose name is "stackname" and removes that member from the stack. QUEUE queuename thing (library procedure) command. Adds the "thing" to the queue that is the value of the variable whose name is "queuename". This variable must have a list as its value; the initial value should be the empty list. New members are added at the back of the list. DEQUEUE queuename (library procedure) outputs the least recently QUEUEd member of the queue that is the value of the variable whose name is "queuename" and removes that member from the queue. PREDICATES ---------- WORDP thing WORD? thing outputs TRUE if the input is a word, FALSE otherwise. LISTP thing LIST? thing outputs TRUE if the input is a list, FALSE otherwise. ARRAYP thing ARRAY? thing outputs TRUE if the input is an array, FALSE otherwise. EMPTYP thing EMPTY? thing outputs TRUE if the input is the empty word or the empty list, FALSE otherwise. EQUALP thing1 thing2 EQUAL? thing1 thing2 thing1 = thing2 outputs TRUE if the inputs are equal, FALSE otherwise. Two numbers are equal if they have the same numeric value. Two non-numeric words are equal if they contain the same characters in the same order. If there is a variable named CASEIGNOREDP whose value is TRUE, then an upper case letter is considered the same as the corresponding lower case letter. (This is the case by default.) Two lists are equal if their members are equal. An array is only equal to itself; two separately created arrays are never equal even if their members are equal. (It is important to be able to know if two expressions have the same array as their value because arrays are mutable; if, for example, two variables have the same array as their values then performing SETITEM on one of them will also change the other.) NOTEQUALP thing1 thing2 NOTEQUAL? thing1 thing2 thing1 <> thing2 outputs FALSE if the inputs are equal, TRUE otherwise. See EQUALP for the meaning of equality for different data types. BEFOREP word1 word2 BEFORE? word1 word2 outputs TRUE if word1 comes before word2 in ASCII collating sequence (for words of letters, in alphabetical order). Case-sensitivity is determined by the value of CASEIGNOREDP. Note that if the inputs are numbers, the result may not be the same as with LESSP; for example, BEFOREP 3 12 is false because 3 collates after 1. .EQ thing1 thing2 outputs TRUE if its two inputs are the same datum, so that applying a mutator to one will change the other as well. Outputs FALSE otherwise, even if the inputs are equal in value. WARNING: Primitives whose names start with a period are DANGEROUS. Their use by non-experts is not recommended. The use of mutators can lead to circular data structures, infinite loops, or Logo crashes. MEMBERP thing1 thing2 MEMBER? thing1 thing2 if "thing2" is a list or an array, outputs TRUE if "thing1" is EQUALP to a member of "thing2", FALSE otherwise. If "thing2" is a word, outputs TRUE if "thing1" is a one-character word EQUALP to a character of "thing2", FALSE otherwise. SUBSTRINGP thing1 thing2 SUBSTRING? thing1 thing2 if "thing1" or "thing2" is a list or an array, outputs FALSE. If "thing2" is a word, outputs TRUE if "thing1" is EQUALP to a substring of "thing2", FALSE otherwise. NUMBERP thing NUMBER? thing outputs TRUE if the input is a number, FALSE otherwise. VBARREDP char VBARRED? char BACKSLASHEDP char (library procedure) BACKSLASHED? char (library procedure) outputs TRUE if the input character was originally entered into Logo within vertical bars (|) to prevent its usual special syntactic meaning, FALSE otherwise. (Outputs TRUE only if the character is a backslashed space, tab, newline, or one of ()[]+-*/=<>":;\~?| ) The names BACKSLASHEDP and BACKSLASHED? are included in the Logo library for backward compatibility with the former names of this primitive, although it does *not* output TRUE for characters originally entered with backslashes. QUERIES ------- COUNT thing outputs the number of characters in the input, if the input is a word; outputs the number of members in the input, if it is a list or an array. (For an array, this may or may not be the index of the last member, depending on the array's origin.) ASCII char outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing vbarred punctuation, and returns the character code for the corresponding punctuation character without vertical bars. (Compare RAWASCII.) RAWASCII char outputs the integer (between 0 and 255) that represents the input character in the ASCII code. Interprets control characters as representing themselves. To find out the ASCII code of an arbitrary keystroke, use RAWASCII RC. CHAR int outputs the character represented in the ASCII code by the input, which must be an integer between 0 and 255. MEMBER thing1 thing2 if "thing2" is a word or list and if MEMBERP with these inputs would output TRUE, outputs the portion of "thing2" from the first instance of "thing1" to the end. If MEMBERP would output FALSE, outputs the empty word or list according to the type of "thing2". It is an error for "thing2" to be an array. LOWERCASE word outputs a copy of the input word, but with all uppercase letters changed to the corresponding lowercase letter. UPPERCASE word outputs a copy of the input word, but with all lowercase letters changed to the corresponding uppercase letter. STANDOUT thing outputs a word that, when printed, will appear like the input but displayed in standout mode (boldface, reverse video, or whatever your version does for standout). The word contains machine-specific magic characters at the beginning and end; in between is the printed form (as if displayed using TYPE) of the input. The output is always a word, even if the input is of some other type, but it may include spaces and other formatting characters. Note: a word output by STANDOUT while Logo is running on one machine will probably not have the desired effect if printed on another type of machine. In the Macintosh classic version, the way that standout works is incompatible with the use of characters whose ASCII code is greater than 127. Therefore, you have a choice to make: The instruction CANINVERSE 0 disables standout, but enables the display of ASCII codes above 127, and the instruction CANINVERSE 1 restores the default situation in which standout is enabled and the extra graphic characters cannot be printed. PARSE word outputs the list that would result if the input word were entered in response to a READLIST operation. That is, PARSE READWORD has the same value as READLIST for the same characters read. RUNPARSE wordorlist outputs the list that would result if the input word or list were entered as an instruction line; characters such as infix operators and parentheses are separate members of the output. Note that sublists of a runparsed list are not themselves runparsed. COMMUNICATION ============= TRANSMITTERS ------------ Note: If there is a variable named PRINTDEPTHLIMIT with a nonnegative integer value, then complex list and array structures will be printed only to the allowed depth. That is, members of members of... of members will be allowed only so far. The members omitted because they are just past the depth limit are indicated by an ellipsis for each one, so a too-deep list of two members will print as [... ...]. If there is a variable named PRINTWIDTHLIMIT with a nonnegative integer value, then only the first so many members of any array or list will be printed. A single ellipsis replaces all missing data within the structure. The width limit also applies to the number of characters printed in a word, except that a PRINTWIDTHLIMIT between 0 and 9 will be treated as if it were 10 when applied to words. This limit applies not only to the top-level printed datum but to any substructures within it. If there is a variable named FULLPRINTP whose value is TRUE, then words that were created using backslash or vertical bar (to include characters that would otherwise not be treated as part of a word) are printed with the backslashes or vertical bars shown, so that the printed result could be re-read by Logo to produce the same value. If FULLPRINTP is TRUE then the empty word (however it was created) prints as ||. (Otherwise it prints as nothing at all.) PRINT thing PR thing (PRINT thing1 thing2 ...) (PR thing1 thing2 ...) command. Prints the input or inputs to the current write stream (initially the screen). All the inputs are printed on a single line, separated by spaces, ending with a newline. If an input is a list, square brackets are not printed around it, but brackets are printed around sublists. Braces are always printed around arrays. TYPE thing (TYPE thing1 thing2 ...) command. Prints the input or inputs like PRINT, except that no newline character is printed at the end and multiple inputs are not separated by spaces. Note: printing to the terminal is ordinarily "line buffered"; that is, the characters you print using TYPE will not actually appear on the screen until either a newline character is printed (for example, by PRINT or SHOW) or Logo tries to read from the keyboard (either at the request of your program or after an instruction prompt). This buffering makes the program much faster than it would be if each character appeared immediately, and in most cases the effect is not disconcerting. To accommodate programs that do a lot of positioned text display using TYPE, Logo will force printing whenever SETCURSOR is invoked. This solves most buffering problems. Still, on occasion you may find it necessary to force the buffered characters to be printed explicitly; this can be done using the WAIT command. WAIT 0 will force printing without actually waiting. SHOW thing (SHOW thing1 thing2 ...) command. Prints the input or inputs like PRINT, except that if an input is a list it is printed inside square brackets. RECEIVERS --------- READLIST RL reads a line from the read stream (initially the keyboard) and outputs that line as a list. The line is separated into members as though it were typed in square brackets in an instruction. If the read stream is a file, and the end of file is reached, READLIST outputs the empty word (not the empty list). READLIST processes backslash, vertical bar, and tilde characters in the read stream; the output list will not contain these characters but they will have had their usual effect. READLIST does not, however, treat semicolon as a comment character. READWORD RW reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, READWORD outputs the empty list (not the empty word). READWORD processes backslash, vertical bar, and tilde characters in the read stream. In the case of a tilde used for line continuation, the output word DOES include the tilde and the newline characters, so that the user program can tell exactly what the user entered. Vertical bars in the line are also preserved in the output. Backslash characters are not preserved in the output. READRAWLINE reads a line from the read stream and outputs that line as a word. The output is a single word even if the line contains spaces, brackets, etc. If the read stream is a file, and the end of file is reached, READRAWLINE outputs the empty list (not the empty word). READRAWLINE outputs the exact string of characters as they appear in the line, with no special meaning for backslash, vertical bar, tilde, or any other formatting characters. READCHAR RC reads a single character from the read stream and outputs that character as a word. If the read stream is a file, and the end of file is reached, READCHAR outputs the empty list (not the empty word). If the read stream is the keyboard, echoing is turned off when READCHAR is invoked, and remains off until READLIST or READWORD is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. READCHARS num RCS num reads "num" characters from the read stream and outputs those characters as a word. If the read stream is a file, and the end of file is reached, READCHARS outputs the empty list (not the empty word). If the read stream is a terminal, echoing is turned off when READCHARS is invoked, and remains off until READLIST or READWORD is invoked or a Logo prompt is printed. Backslash, vertical bar, and tilde characters have no special meaning in this context. SHELL command (SHELL command wordflag) Under Unix, outputs the result of running "command" as a shell command. (The command is sent to /bin/sh, not csh or other alternatives.) If the command is a literal list in the instruction line, and if you want a backslash character sent to the shell, you must use \\ to get the backslash through Logo's reader intact. The output is a list containing one member for each line generated by the shell command. Ordinarily each such line is represented by a list in the output, as though the line were read using READLIST. If a second input is given, regardless of the value of the input, each line is represented by a word in the output as though it were read with READWORD. Example: to dayofweek output first first shell [date] end This is "first first" to extract the first word of the first (and only) line of the shell output. Under MacOS X, SHELL works as under Unix. SHELL is not available under Mac Classic. Under DOS, SHELL is a command, not an operation; it sends its input to a DOS command processor but does not collect the result of the command. Under Windows, the wxWidgets version of Logo behaves as under Unix (except that DOS-style commands are understood; use "dir" rather than "ls"). The non-wxWidgets version behaves like the DOS version. FILE ACCESS ----------- SETPREFIX string command. Sets a prefix that will be used as the implicit beginning of filenames in OPENREAD, OPENWRITE, OPENAPPEND, OPENUPDATE, LOAD, and SAVE commands. Logo will put the appropriate separator character (slash for Unix, backslash for DOS/Windows, colon for MacOS Classic) between the prefix and the filename entered by the user. The input to SETPREFIX must be a word, unless it is the empty list, to indicate that there should be no prefix. PREFIX outputs the current file prefix, or [] if there is no prefix. See SETPREFIX. OPENREAD filename command. Opens the named file for reading. The read position is initially at the beginning of the file. OPENWRITE filename command. Opens the named file for writing. If the file already existed, the old version is deleted and a new, empty file created. OPENWRITE, but not the other OPEN variants, will accept as input a two-element list, in which the first element must be a variable name, and the second must be a positive integer. A character buffer of the specified size will be created. When a SETWRITE is done with this same list (in the sense of .EQ, not a copy, so you must do something like ? make "buf [foo 100] ? openwrite :buf ? setwrite :buf [...] ? close :buf and not just ? openwrite [foo 100] ? setwrite [foo 100] and so on), the printed characters are stored in the buffer; when a CLOSE is done with the same list as input, the characters from the buffer (treated as one long word, even if spaces and newlines are included) become the value of the specified variable. OPENAPPEND filename command. Opens the named file for writing. If the file already exists, the write position is initially set to the end of the old file, so that newly written data will be appended to it. OPENUPDATE filename command. Opens the named file for reading and writing. The read and write position is initially set to the end of the old file, if any. Note: each open file has only one position, for both reading and writing. If a file opened for update is both READER and WRITER at the same time, then SETREADPOS will also affect WRITEPOS and vice versa. Also, if you alternate reading and writing the same file, you must SETREADPOS between a write and a read, and SETWRITEPOS between a read and a write. CLOSE filename command. Closes the named file. If the file was currently the reader or writer, then the reader or writer is changed to the keyboard or screen, as if SETREAD [] or SETWRITE [] had been done. ALLOPEN outputs a list whose members are the names of all files currently open. This list does not include the dribble file, if any. CLOSEALL (library procedure) command. Closes all open files. Abbreviates FOREACH ALLOPEN [CLOSE ?] ERASEFILE filename ERF filename command. Erases (deletes, removes) the named file, which should not currently be open. DRIBBLE filename command. Creates a new file whose name is the input, like OPENWRITE, and begins recording in that file everything that is read from the keyboard or written to the terminal. That is, this writing is in addition to the writing to WRITER. The intent is to create a transcript of a Logo session, including things like prompt characters and interactions. NODRIBBLE command. Stops copying information into the dribble file, and closes the file. SETREAD filename command. Makes the named file the read stream, used for READLIST, etc. The file must already be open with OPENREAD or OPENUPDATE. If the input is the empty list, then the read stream becomes the keyboard, as usual. Changing the read stream does not close the file that was previously the read stream, so it is possible to alternate between files. SETWRITE filename command. Makes the named file the write stream, used for PRINT, etc. The file must already be open with OPENWRITE, OPENAPPEND, or OPENUPDATE. If the input is the empty list, then the write stream becomes the screen, as usual. Changing the write stream does not close the file that was previously the write stream, so it is possible to alternate between files. If the input is a list, then its first element must be a variable name, and its second and last element must be a positive integer; a buffer of that many characters will be allocated, and will become the writestream. If the same list (same in the .EQ sense, not a copy) has been used as input to OPENWRITE, then the already-allocated buffer will be used, and the writer can be changed to and from this buffer, with all the characters accumulated as in a file. When the same list is used as input to CLOSE, the contents of the buffer (as an unparsed word, which may contain newline characters) will become the value of the named variable. For compatibility with earlier versions, if the list has not been opened when the SETWRITE is done, it will be opened implicitly, but the first SETWRITE after this one will implicitly close it, setting the variable and freeing the allocated buffer. READER outputs the name of the current read stream file, or the empty list if the read stream is the terminal. WRITER outputs the name of the current write stream file, or the empty list if the write stream is the screen. SETREADPOS charpos command. Sets the file pointer of the read stream file so that the next READLIST, etc., will begin reading at the "charpos"th character in the file, counting from 0. (That is, SETREADPOS 0 will start reading from the beginning of the file.) Meaningless if the read stream is the screen. SETWRITEPOS charpos command. Sets the file pointer of the write stream file so that the next PRINT, etc., will begin writing at the "charpos"th character in the file, counting from 0. (That is, SETWRITEPOS 0 will start writing from the beginning of the file.) Meaningless if the write stream is the screen. READPOS outputs the file position of the current read stream file. WRITEPOS outputs the file position of the current write stream file. EOFP EOF? predicate, outputs TRUE if there are no more characters to be read in the read stream file, FALSE otherwise. FILEP filename FILE? filename (library procedure) predicate, outputs TRUE if a file of the specified name exists and can be read, FALSE otherwise. TERMINAL ACCESS --------------- KEYP KEY? predicate, outputs TRUE if there are characters waiting to be read from the read stream. If the read stream is a file, this is equivalent to NOT EOFP. If the read stream is the terminal, then echoing is turned off and the terminal is set to CBREAK (character at a time instead of line at a time) mode. It remains in this mode until some line-mode reading is requested (e.g., READLIST). The Unix operating system forgets about any pending characters when it switches modes, so the first KEYP invocation will always output FALSE. CLEARTEXT CT command. Clears the text window. SETCURSOR vector command. The input is a list of two numbers, the x and y coordinates of a text window position (origin in the upper left corner, positive direction is southeast). The text cursor is moved to the requested position. This command also forces the immediate printing of any buffered characters. CURSOR outputs a list containing the current x and y coordinates of the text cursor. Logo may get confused about the current cursor position if, e.g., you type in a long line that wraps around or your program prints escape codes that affect the screen strangely. SETMARGINS vector command. The input must be a list of two numbers, as for SETCURSOR. The effect is to clear the screen and then arrange for all further printing to be shifted down and to the right according to the indicated margins. Specifically, every time a newline character is printed (explicitly or implicitly) Logo will type x_margin spaces, and on every invocation of SETCURSOR the margins will be added to the input x and y coordinates. (CURSOR will report the cursor position relative to the margins, so that this shift will be invisible to Logo programs.) The purpose of this command is to accommodate the display of terminal screens in lecture halls with inadequate TV monitors that miss the top and left edges of the screen. SETTEXTCOLOR foreground background SETTC foreground background command (wxWidgets only). The inputs are color numbers, or RGB color lists, as for turtle graphics. The foreground and background colors for the textscreen/splitscreen text window are changed to the given values. The change affects text already printed as well as future text printing; there is only one text color for the entire window. command (non-wxWidgets Windows and DOS extended only). The inputs are color numbers, as for turtle graphics. Future printing to the text window will use the specified colors for foreground (the characters printed) and background (the space under those characters). Using STANDOUT will revert to the default text window colors. In the DOS extended (ucblogo.exe) version, colors in textscreen mode are limited to numbers 0-7, and the coloring applies only to text printed by the program, not to the echoing of text typed by the user. Neither limitation applies to the text portion of splitscreen mode, which is actually drawn as graphics internally. INCREASEFONT DECREASEFONT command (wxWidgets only). Increase or decrease the size of the font used in the text and edit windows to the next larger or smaller available size. SETTEXTSIZE height command (wxWidgets only). Set the "point size" of the font used in the text and edit windows to the given integer input. The desired size may not be available, in which case the nearest available size will be used. Note: There is only a slight correlation between these integers and pixel sizes. Our rough estimate is that the number of pixels of height is about 1.5 times the point size, but it varies for different fonts. See SETLABELHEIGHT for a different approach used for the graphics window. TEXTSIZE (wxWidgets only) outputs the "point size" of the font used in the text and edit windows. See SETTEXTSIZE for a discussion of font sizing. See LABELSIZE for a different approach used for the graphics window. SETFONT fontname command (wxWidgets only). Set the font family used in all windows to the one named by the input. Try 'Courier' or 'Monospace' as likely possibilities. Not all computers have the same fonts installed. It's a good idea to stick with monospace fonts (ones in which all characters have the same width). FONT (wxWidgets only) outputs the name of the font family used in all windows. ARITHMETIC ========== NUMERIC OPERATIONS ------------------ SUM num1 num2 (SUM num1 num2 num3 ...) num1 + num2 outputs the sum of its inputs. DIFFERENCE num1 num2 num1 - num2 outputs the difference of its inputs. Minus sign means infix difference in ambiguous contexts (when preceded by a complete expression), unless it is preceded by a space and followed by a nonspace. (See also MINUS.) MINUS num - num outputs the negative of its input. Minus sign means unary minus if the previous token is an infix operator or open parenthesis, or it is preceded by a space and followed by a nonspace. There is a difference in binding strength between the two forms: MINUS 3 + 4 means -(3+4) - 3 + 4 means (-3)+4 PRODUCT num1 num2 (PRODUCT num1 num2 num3 ...) num1 * num2 outputs the product of its inputs. QUOTIENT num1 num2 (QUOTIENT num) num1 / num2 outputs the quotient of its inputs. The quotient of two integers is an integer if and only if the dividend is a multiple of the divisor. (In other words, QUOTIENT 5 2 is 2.5, not 2, but QUOTIENT 4 2 is 2, not 2.0 -- it does the right thing.) With a single input, QUOTIENT outputs the reciprocal of the input. REMAINDER num1 num2 outputs the remainder on dividing "num1" by "num2"; both must be integers and the result is an integer with the same sign as num1. MODULO num1 num2 outputs the remainder on dividing "num1" by "num2"; both must be integers and the result is an integer with the same sign as num2. INT num outputs its input with fractional part removed, i.e., an integer with the same sign as the input, whose absolute value is the largest integer less than or equal to the absolute value of the input. ROUND num outputs the nearest integer to the input. SQRT num outputs the square root of the input, which must be nonnegative. POWER num1 num2 outputs "num1" to the "num2" power. If num1 is negative, then num2 must be an integer. EXP num outputs e (2.718281828+) to the input power. LOG10 num outputs the common logarithm of the input. LN num outputs the natural logarithm of the input. SIN degrees outputs the sine of its input, which is taken in degrees. RADSIN radians outputs the sine of its input, which is taken in radians. COS degrees outputs the cosine of its input, which is taken in degrees. RADCOS radians outputs the cosine of its input, which is taken in radians. ARCTAN num (ARCTAN x y) outputs the arctangent, in degrees, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or 90 or -90 depending on the sign of y, if x is zero. RADARCTAN num (RADARCTAN x y) outputs the arctangent, in radians, of its input. With two inputs, outputs the arctangent of y/x, if x is nonzero, or pi/2 or -pi/2 depending on the sign of y, if x is zero. The expression 2*(RADARCTAN 0 1) can be used to get the value of pi. ISEQ from to (library procedure) outputs a list of the integers from FROM to TO, inclusive. ? show iseq 3 7 [3 4 5 6 7] ? show iseq 7 3 [7 6 5 4 3] RSEQ from to count (library procedure) outputs a list of COUNT equally spaced rational numbers between FROM and TO, inclusive. ? show rseq 3 5 9 [3 3.25 3.5 3.75 4 4.25 4.5 4.75 5] ? show rseq 3 5 5 [3 3.5 4 4.5 5] PREDICATES ---------- LESSP num1 num2 LESS? num1 num2 num1 < num2 outputs TRUE if its first input is strictly less than its second. GREATERP num1 num2 GREATER? num1 num2 num1 > num2 outputs TRUE if its first input is strictly greater than its second. LESSEQUALP num1 num2 LESSEQUAL? num1 num2 num1 <= num2 outputs TRUE if its first input is less than or equal to its second. GREATEREQUALP num1 num2 GREATEREQUAL? num1 num2 num1 >= num2 outputs TRUE if its first input is greater than or equal to its second. RANDOM NUMBERS -------------- RANDOM num (RANDOM start end) with one input, outputs a random nonnegative integer less than its input, which must be a positive integer. With two inputs, RANDOM outputs a random integer greater than or equal to the first input, and less than or equal to the second input. Both inputs must be integers, and the first must be less than the second. (RANDOM 0 9) is equivalent to RANDOM 10; (RANDOM 3 8) is equivalent to (RANDOM 6)+3. RERANDOM (RERANDOM seed) command. Makes the results of RANDOM reproducible. Ordinarily the sequence of random numbers is different each time Logo is used. If you need the same sequence of pseudo-random numbers repeatedly, e.g. to debug a program, say RERANDOM before the first invocation of RANDOM. If you need more than one repeatable sequence, you can give RERANDOM an integer input; each possible input selects a unique sequence of numbers. PRINT FORMATTING ---------------- FORM num width precision outputs a word containing a printable representation of "num", possibly preceded by spaces (and therefore not a number for purposes of performing arithmetic operations), with at least "width" characters, including exactly "precision" digits after the decimal point. (If "precision" is 0 then there will be no decimal point in the output.) As a debugging feature, (FORM num -1 format) will print the floating point "num" according to the C printf "format", to allow to hex :num op form :num -1 "|%08X %08X| end to allow finding out the exact result of floating point operations. The precise format needed may be machine-dependent. BITWISE OPERATIONS ------------------ BITAND num1 num2 (BITAND num1 num2 num3 ...) outputs the bitwise AND of its inputs, which must be integers. BITOR num1 num2 (BITOR num1 num2 num3 ...) outputs the bitwise OR of its inputs, which must be integers. BITXOR num1 num2 (BITXOR num1 num2 num3 ...) outputs the bitwise EXCLUSIVE OR of its inputs, which must be integers. BITNOT num outputs the bitwise NOT of its input, which must be an integer. ASHIFT num1 num2 outputs "num1" arithmetic-shifted to the left by "num2" bits. If num2 is negative, the shift is to the right with sign extension. The inputs must be integers. LSHIFT num1 num2 outputs "num1" logical-shifted to the left by "num2" bits. If num2 is negative, the shift is to the right with zero fill. The inputs must be integers. LOGICAL OPERATIONS ================== AND tf1 tf2 (AND tf1 tf2 tf3 ...) outputs TRUE if all inputs are TRUE, otherwise FALSE. All inputs must be TRUE or FALSE. (Comparison is case-insensitive regardless of the value of CASEIGNOREDP. That is, "true" or "True" or "TRUE" are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a TRUE or FALSE value. List expressions are evaluated from left to right; as soon as a FALSE value is found, the remaining inputs are not examined. Example: MAKE "RESULT AND [NOT (:X = 0)] [(1 / :X) > .5] to avoid the division by zero if the first part is false. OR tf1 tf2 (OR tf1 tf2 tf3 ...) outputs TRUE if any input is TRUE, otherwise FALSE. All inputs must be TRUE or FALSE. (Comparison is case-insensitive regardless of the value of CASEIGNOREDP. That is, "true" or "True" or "TRUE" are all the same.) An input can be a list, in which case it is taken as an expression to run; that expression must produce a TRUE or FALSE value. List expressions are evaluated from left to right; as soon as a TRUE value is found, the remaining inputs are not examined. Example: IF OR :X=0 [some.long.computation] [...] to avoid the long computation if the first condition is met. NOT tf outputs TRUE if the input is FALSE, and vice versa. The input can be a list, in which case it is taken as an expression to run; that expression must produce a TRUE or FALSE value. GRAPHICS ======== Berkeley Logo provides traditional Logo turtle graphics with one turtle. Multiple turtles, dynamic turtles, and collision detection are not supported. This is the most hardware-dependent part of Logo; some features may exist on some machines but not others. Nevertheless, the goal has been to make Logo programs as portable as possible, rather than to take fullest advantage of the capabilities of each machine. In particular, Logo attempts to scale the screen so that turtle coordinates [-100 -100] and [100 100] fit on the graphics window, and so that the aspect ratio is 1:1. The center of the graphics window (which may or may not be the entire screen, depending on the machine used) is turtle location [0 0]. Positive X is to the right; positive Y is up. Headings (angles) are measured in degrees clockwise from the positive Y axis. (This differs from the common mathematical convention of measuring angles counterclockwise from the positive X axis.) The turtle is represented as an isoceles triangle; the actual turtle position is at the midpoint of the base (the short side). However, the turtle is drawn one step behind its actual position, so that the display of the base of the turtle's triangle does not obscure a line drawn perpendicular to it (as would happen after drawing a square). Colors are, of course, hardware-dependent. However, Logo provides partial hardware independence by interpreting color numbers 0 through 7 uniformly on all computers: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white Where possible, Logo provides additional user-settable colors; how many are available depends on the hardware and operating system environment. If at least 16 colors are available, Logo tries to provide uniform initial settings for the colors 8-15: 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey Logo begins with a black background and white pen. TURTLE MOTION ------------- FORWARD dist FD dist moves the turtle forward, in the direction that it's facing, by the specified distance (measured in turtle steps). BACK dist BK dist moves the turtle backward, i.e., exactly opposite to the direction that it's facing, by the specified distance. (The heading of the turtle does not change.) LEFT degrees LT degrees turns the turtle counterclockwise by the specified angle, measured in degrees (1/360 of a circle). RIGHT degrees RT degrees turns the turtle clockwise by the specified angle, measured in degrees (1/360 of a circle). SETPOS pos moves the turtle to an absolute position in the graphics window. The input is a list of two numbers, the X and Y coordinates. SETXY xcor ycor moves the turtle to an absolute position in the graphics window. The two inputs are numbers, the X and Y coordinates. SETX xcor moves the turtle horizontally from its old position to a new absolute horizontal coordinate. The input is the new X coordinate. SETY ycor moves the turtle vertically from its old position to a new absolute vertical coordinate. The input is the new Y coordinate. SETHEADING degrees SETH degrees turns the turtle to a new absolute heading. The input is a number, the heading in degrees clockwise from the positive Y axis. HOME moves the turtle to the center of the screen. Equivalent to SETPOS [0 0] SETHEADING 0. ARC angle radius draws an arc of a circle, with the turtle at the center, with the specified radius, starting at the turtle's heading and extending clockwise through the specified angle. The turtle does not move. TURTLE MOTION QUERIES --------------------- POS outputs the turtle's current position, as a list of two numbers, the X and Y coordinates. XCOR (library procedure) outputs a number, the turtle's X coordinate. YCOR (library procedure) outputs a number, the turtle's Y coordinate. HEADING outputs a number, the turtle's heading in degrees. TOWARDS pos outputs a number, the heading at which the turtle should be facing so that it would point from its current position to the position given as the input. SCRUNCH outputs a list containing two numbers, the X and Y scrunch factors, as used by SETSCRUNCH. (But note that SETSCRUNCH takes two numbers as inputs, not one list of numbers.) TURTLE AND WINDOW CONTROL ------------------------- SHOWTURTLE ST makes the turtle visible. HIDETURTLE HT makes the turtle invisible. It's a good idea to do this while you're in the middle of a complicated drawing, because hiding the turtle speeds up the drawing substantially. CLEAN erases all lines that the turtle has drawn on the graphics window. The turtle's state (position, heading, pen mode, etc.) is not changed. CLEARSCREEN CS erases the graphics window and sends the turtle to its initial position and heading. Like HOME and CLEAN together. WRAP tells the turtle to enter wrap mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will "wrap around" and reappear at the opposite edge of the window. The top edge wraps to the bottom edge, while the left edge wraps to the right edge. (So the window is topologically equivalent to a torus.) This is the turtle's initial mode. Compare WINDOW and FENCE. WINDOW tells the turtle to enter window mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move offscreen. The visible graphics window is considered as just part of an infinite graphics plane; the turtle can be anywhere on the plane. (If you lose the turtle, HOME will bring it back to the center of the window.) Compare WRAP and FENCE. FENCE tells the turtle to enter fence mode: From now on, if the turtle is asked to move past the boundary of the graphics window, it will move as far as it can and then stop at the edge with an "out of bounds" error message. Compare WRAP and WINDOW. FILL fills in a region of the graphics window containing the turtle and bounded by lines that have been drawn earlier. This is not portable; it doesn't work for all machines, and may not work exactly the same way on different machines. FILLED color instructions runs the instructions, remembering all points visited by turtle motion commands, starting *and ending* with the turtle's initial position. Then draws (ignoring penmode) the resulting polygon, in the current pen color, filling the polygon with the given color, which can be a color number or an RGB list. The instruction list cannot include another FILLED invocation. LABEL text takes a word or list as input, and prints the input on the graphics window, starting at the turtle's position. SETLABELHEIGHT height command (wxWidgets only). Takes a positive integer argument and tries to set the font size so that the character height (including descenders) is that many turtle steps. This will be different from the number of screen pixels if SETSCRUNCH has been used. Also, note that SETSCRUNCH changes the font size to try to preserve this height in turtle steps. Note that the query operation corresponding to this command is LABELSIZE, not LABELHEIGHT, because it tells you the width as well as the height of characters in the current font. TEXTSCREEN TS rearranges the size and position of windows to maximize the space available in the text window (the window used for interaction with Logo). The details differ among machines. Compare SPLITSCREEN and FULLSCREEN. FULLSCREEN FS rearranges the size and position of windows to maximize the space available in the graphics window. The details differ among machines. Compare SPLITSCREEN and TEXTSCREEN. Since there must be a text window to allow printing (including the printing of the Logo prompt), Logo automatically switches from fullscreen to splitscreen whenever anything is printed. In the DOS version, switching from fullscreen to splitscreen loses the part of the picture that's hidden by the text window. [This design decision follows from the scarcity of memory, so that the extra memory to remember an invisible part of a drawing seems too expensive.] SPLITSCREEN SS rearranges the size and position of windows to allow some room for text interaction while also keeping most of the graphics window visible. The details differ among machines. Compare TEXTSCREEN and FULLSCREEN. SETSCRUNCH xscale yscale adjusts the aspect ratio and scaling of the graphics display. After this command is used, all further turtle motion will be adjusted by multiplying the horizontal and vertical extent of the motion by the two numbers given as inputs. For example, after the instruction "SETSCRUNCH 2 1" motion at a heading of 45 degrees will move twice as far horizontally as vertically. If your squares don't come out square, try this. (Alternatively, you can deliberately misadjust the aspect ratio to draw an ellipse.) In wxWidgets only, SETSCRUNCH also changes the size of the text font used for the LABEL command to try to keep the height of characters scaled with the vertical turtle step size. For all modern computers For DOS machines, the scale factors are initially set according to what the hardware claims the aspect ratio is, but the hardware sometimes lies. For DOS, the values set by SETSCRUNCH are remembered in a file (called SCRUNCH.DAT) and are automatically put into effect when a Logo session begins. REFRESH (command) tells Logo to remember the turtle's motions so that they can be used for high-resolution printing (wxWidgets) or to refresh the graphics window if it is moved, resized, or overlayed (non-wxWidgets). This is the default. NOREFRESH (command) tells Logo not to remember the turtle's motions, which may be useful to save time and memory if your program is interactive or animated, rather than drawing a static picture you'll want to print later (wxWidgets). In non-wxWidgets versions, using NOREFRESH may prevent Logo from restoring the graphics image after the window is moved, resized, or overlayed. TURTLE AND WINDOW QUERIES ------------------------- SHOWNP SHOWN? outputs TRUE if the turtle is shown (visible), FALSE if the turtle is hidden. See SHOWTURTLE and HIDETURTLE. SCREENMODE outputs the word TEXTSCREEN, SPLITSCREEN, or FULLSCREEN depending on the current screen mode. TURTLEMODE outputs the word WRAP, FENCE, or WINDOW depending on the current turtle mode. LABELSIZE (wxWidgets only) outputs a list of two positive integers, the width and height of characters displayed by LABEL measured in turtle steps (which will be different from screen pixels if SETSCRUNCH has been used). There is no SETLABELSIZE because the width and height of a font are not separately controllable, so the inverse of this operation is SETLABELHEIGHT, which takes just one number for the desired height. PEN AND BACKGROUND CONTROL -------------------------- The turtle carries a pen that can draw pictures. At any time the pen can be UP (in which case moving the turtle does not change what's on the graphics screen) or DOWN (in which case the turtle leaves a trace). If the pen is down, it can operate in one of three modes: PAINT (so that it draws lines when the turtle moves), ERASE (so that it erases any lines that might have been drawn on or through that path earlier), or REVERSE (so that it inverts the status of each point along the turtle's path). PENDOWN PD sets the pen's position to DOWN, without changing its mode. PENUP PU sets the pen's position to UP, without changing its mode. PENPAINT PPT sets the pen's position to DOWN and mode to PAINT. PENERASE PE sets the pen's position to DOWN and mode to ERASE. PENREVERSE PX sets the pen's position to DOWN and mode to REVERSE. (This may interact in system-dependent ways with use of color.) SETPENCOLOR colornumber.or.rgblist SETPC colornumber.or.rgblist sets the pen color to the given number, which must be a nonnegative integer. There are initial assignments for the first 16 colors: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey but other colors can be assigned to numbers by the PALETTE command. Alternatively, sets the pen color to the given RGB values (a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color). SETPALETTE colornumber rgblist sets the actual color corresponding to a given number, if allowed by the hardware and operating system. Colornumber must be an integer greater than or equal to 8. (Logo tries to keep the first 8 colors constant.) The second input is a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the desired color. SETPENSIZE size sets the thickness of the pen. The input is either a single positive integer or a list of two positive integers (for horizontal and vertical thickness). Some versions pay no attention to the second number, but always have a square pen. SETPENPATTERN pattern sets hardware-dependent pen characteristics. This command is not guaranteed compatible between implementations on different machines. SETPEN list (library procedure) sets the pen's position, mode, thickness, and hardware-dependent characteristics according to the information in the input list, which should be taken from an earlier invocation of PEN. SETBACKGROUND colornumber.or.rgblist SETBG colornumber.or.rgblist set the screen background color by slot number or RGB values. See SETPENCOLOR for details. PEN QUERIES ----------- PENDOWNP PENDOWN? outputs TRUE if the pen is down, FALSE if it's up. PENMODE outputs one of the words PAINT, ERASE, or REVERSE according to the current pen mode. PENCOLOR PC outputs a color number, a nonnegative integer that is associated with a particular color, or a list of RGB values if such a list was used as the most recent input to SETPENCOLOR. There are initial assignments for the first 16 colors: 0 black 1 blue 2 green 3 cyan 4 red 5 magenta 6 yellow 7 white 8 brown 9 tan 10 forest 11 aqua 12 salmon 13 purple 14 orange 15 grey but other colors can be assigned to numbers by the PALETTE command. PALETTE colornumber outputs a list of three nonnegative numbers less than 100 specifying the percent saturation of red, green, and blue in the color associated with the given number. PENSIZE outputs a list of two positive integers, specifying the horizontal and vertical thickness of the turtle pen. (In some implementations, including wxWidgets, the two numbers are always equal.) PENPATTERN outputs system-specific pen information. PEN (library procedure) outputs a list containing the pen's position, mode, thickness, and hardware-specific characteristics, for use by SETPEN. BACKGROUND BG outputs the graphics background color, either as a slot number or as an RGB list, whichever way it was set. (See PENCOLOR.) SAVING AND LOADING PICTURES --------------------------- SAVEPICT filename command. Writes a file with the specified name containing the state of the graphics window, including any nonstandard color palette settings, in Logo's internal format. This picture can be restored to the screen using LOADPICT. The format is not portable between platforms, nor is it readable by other programs. See EPSPICT to export Logo graphics for other programs. LOADPICT filename command. Reads the specified file, which must have been written by a SAVEPICT command, and restores the graphics window and color palette settings to the values stored in the file. Any drawing previously on the screen is cleared. EPSPICT filename command. Writes a file with the specified name, containing an Encapsulated Postscript (EPS) representation of the state of the graphics window. This file can be imported into other programs that understand EPS format. Restrictions: the drawing cannot use FILL, PENERASE, or PENREVERSE; any such instructions will be ignored in the translation to Postscript form. MOUSE QUERIES ------------- MOUSEPOS outputs the coordinates of the mouse, provided that it's within the graphics window, in turtle coordinates. If the mouse is outside the graphics window, then the last position within the window is returned. Exception: If a mouse button is pressed within the graphics window and held while the mouse is dragged outside the window, the mouse's position is returned as if the window were big enough to include it. CLICKPOS outputs the coordinates that the mouse was at when a mouse button was most recently pushed, provided that that position was within the graphics window, in turtle coordinates. (wxWidgets only) BUTTONP BUTTON? outputs TRUE if a mouse button is down and the mouse is over the graphics window. Once the button is down, BUTTONP remains true until the button is released, even if the mouse is dragged out of the graphics window. BUTTON outputs 0 if no mouse button has been pushed inside the Logo window since the last call to BUTTON. Otherwise, it outputs an integer between 1 and 3 indicating which button was most recently pressed. Ordinarily 1 means left, 2 means right, and 3 means center, but operating systems may reconfigure these. WORKSPACE MANAGEMENT ==================== PROCEDURE DEFINITION -------------------- TO procname :input1 :input2 ... (special form) command. Prepares Logo to accept a procedure definition. The procedure will be named "procname" and there must not already be a procedure by that name. The inputs will be called "input1" etc. Any number of inputs are allowed, including none. Names of procedures and inputs are case-insensitive. Unlike every other Logo procedure, TO takes as its inputs the actual words typed in the instruction line, as if they were all quoted, rather than the results of evaluating expressions to provide the inputs. (That's what "special form" means.) This version of Logo allows variable numbers of inputs to a procedure. After the procedure name come four kinds of things, *in this order*: 1. 0 or more REQUIRED inputs :FOO :FROBOZZ 2. 0 or more OPTIONAL inputs [:BAZ 87] [:THINGO 5+9] 3. 0 or 1 REST input [:GARPLY] 4. 0 or 1 DEFAULT number 5 Every procedure has a MINIMUM, DEFAULT, and MAXIMUM number of inputs. (The latter can be infinite.) The MINIMUM number of inputs is the number of required inputs, which must come first. A required input is indicated by the :inputname notation. After all the required inputs can be zero or more optional inputs, each of which is represented by the following notation: [:inputname default.value.expression] When the procedure is invoked, if actual inputs are not supplied for these optional inputs, the default value expressions are evaluated to set values for the corresponding input names. The inputs are processed from left to right, so a default value expression can be based on earlier inputs. Example: to proc :inlist [:startvalue first :inlist] If the procedure is invoked by saying proc [a b c] then the variable INLIST will have the value [A B C] and the variable STARTVALUE will have the value A. If the procedure is invoked by saying (proc [a b c] "x) then INLIST will have the value [A B C] and STARTVALUE will have the value X. After all the required and optional input can come a single "rest" input, represented by the following notation: [:inputname] This is a rest input rather than an optional input because there is no default value expression. There can be at most one rest input. When the procedure is invoked, the value of this inputname will be a list containing all of the actual inputs provided that were not used for required or optional inputs. Example: to proc :in1 [:in2 "foo] [:in3 "baz] [:in4] If this procedure is invoked by saying proc "x then IN1 has the value X, IN2 has the value FOO, IN3 has the value BAZ, and IN4 has the value [] (the empty list). If it's invoked by saying (proc "a "b "c "d "e) then IN1 has the value A, IN2 has the value B, IN3 has the value C, and IN4 has the value [D E]. The MAXIMUM number of inputs for a procedure is infinite if a rest input is given; otherwise, it is the number of required inputs plus the number of optional inputs. The DEFAULT number of inputs for a procedure, which is the number of inputs that it will accept if its invocation is not enclosed in parentheses, is ordinarily equal to the minimum number. If you want a different default number you can indicate that by putting the desired default number as the last thing on the TO line. example: to proc :in1 [:in2 "foo] [:in3] 3 This procedure has a minimum of one input, a default of three inputs, and an infinite maximum. Logo responds to the TO command by entering procedure definition mode. The prompt character changes from "?" to ">" and whatever instructions you type become part of the definition until you type a line containing only the word END. DEFINE procname text command. Defines a procedure with name "procname" and text "text". If there is already a procedure with the same name, the new definition replaces the old one. The text input must be a list whose members are lists. The first member is a list of inputs; it looks like a TO line but without the word TO, without the procedure name, and without the colons before input names. In other words, the members of this first sublist are words for the names of required inputs and lists for the names of optional or rest inputs. The remaining sublists of the text input make up the body of the procedure, with one sublist for each instruction line of the body. (There is no END line in the text input.) It is an error to redefine a primitive procedure unless the variable REDEFP has the value TRUE. TEXT procname outputs the text of the procedure named "procname" in the form expected by DEFINE: a list of lists, the first of which describes the inputs to the procedure and the rest of which are the lines of its body. The text does not reflect formatting information used when the procedure was defined, such as continuation lines and extra spaces. FULLTEXT procname outputs a representation of the procedure "procname" in which formatting information is preserved. If the procedure was defined with TO, EDIT, or LOAD, then the output is a list of words. Each word represents one entire line of the definition in the form output by READWORD, including extra spaces and continuation lines. The last member of the output represents the END line. If the procedure was defined with DEFINE, then the output is a list of lists. If these lists are printed, one per line, the result will look like a definition using TO. Note: the output from FULLTEXT is not suitable for use as input to DEFINE! COPYDEF newname oldname command. Makes "newname" a procedure identical to "oldname". The latter may be a primitive. If "newname" was already defined, its previous definition is lost. If "newname" was already a primitive, the redefinition is not permitted unless the variable REDEFP has the value TRUE. Note: dialects of Logo differ as to the order of inputs to COPYDEF. This dialect uses "MAKE order," not "NAME order." VARIABLE DEFINITION ------------------- MAKE varname value command. Assigns the value "value" to the variable named "varname", which must be a word. Variable names are case-insensitive. If a variable with the same name already exists, the value of that variable is changed. If not, a new global variable is created. NAME value varname (library procedure) command. Same as MAKE but with the inputs in reverse order. LOCAL varname LOCAL varnamelist (LOCAL varname1 varname2 ...) command. Accepts as inputs one or more words, or a list of words. A variable is created for each of these words, with that word as its name. The variables are local to the currently running procedure. Logo variables follow dynamic scope rules; a variable that is local to a procedure is available to any subprocedure invoked by that procedure. The variables created by LOCAL have no initial value; they must be assigned a value (e.g., with MAKE) before the procedure attempts to read their value. LOCALMAKE varname value (library procedure) command. Makes the named variable local, like LOCAL, and assigns it the given value, like MAKE. THING varname :quoted.varname outputs the value of the variable whose name is the input. If there is more than one such variable, the innermost local variable of that name is chosen. The colon notation is an abbreviation not for THING but for the combination thing " so that :FOO means THING "FOO. GLOBAL varname GLOBAL varnamelist (GLOBAL varname1 varname2 ...) command. Accepts as inputs one or more words, or a list of words. A global variable is created for each of these words, with that word as its name. The only reason this is necessary is that you might want to use the "setter" notation SETXYZ for a variable XYZ that does not already have a value; GLOBAL "XYZ makes that legal. Note: If there is currently a local variable of the same name, this command does *not* make Logo use the global value instead of the local one. PROPERTY LISTS -------------- Note: Names of property lists are always case-insensitive. Names of individual properties are case-sensitive or case-insensitive depending on the value of CASEIGNOREDP, which is TRUE by default. In principle, every possible name is the name of a property list, which is initially empty. So Logo never gives a "no such property list" error, as it would for undefined procedure or variable names. But the primitive procedures that deal with "all" property lists (CONTENTS, PLISTS, etc.) list only nonempty ones. To "erase" a property list (see ERASE below) means to make it empty, removing all properties from it. PPROP plistname propname value command. Adds a property to the "plistname" property list with name "propname" and value "value". GPROP plistname propname outputs the value of the "propname" property in the "plistname" property list, or the empty list if there is no such property. REMPROP plistname propname command. Removes the property named "propname" from the property list named "plistname". PLIST plistname outputs a list whose odd-numbered members are the names, and whose even-numbered members are the values, of the properties in the property list named "plistname". The output is a copy of the actual property list; changing properties later will not magically change a list output earlier by PLIST. PREDICATES ---------- PROCEDUREP name PROCEDURE? name outputs TRUE if the input is the name of a procedure. PRIMITIVEP name PRIMITIVE? name outputs TRUE if the input is the name of a primitive procedure (one built into Logo). Note that some of the procedures described in this document are library procedures, not primitives. DEFINEDP name DEFINED? name outputs TRUE if the input is the name of a user-defined procedure, including a library procedure. NAMEP name NAME? name outputs TRUE if the input is the name of a variable. PLISTP name PLIST? name outputs TRUE if the input is the name of a *nonempty* property list. (In principle every word is the name of a property list; if you haven't put any properties in it, PLIST of that name outputs an empty list, rather than giving an error message.) QUERIES ------- Note: All procedures whose input is indicated as "contentslist" will accept a single word (taken as a procedure name), a list of words (taken as names of procedures), or a list of three lists as described under the CONTENTS command above. CONTENTS outputs a "contents list," i.e., a list of three lists containing names of defined procedures, variables, and property lists respectively. This list includes all unburied named items in the workspace. BURIED outputs a contents list including all buried named items in the workspace. TRACED outputs a contents list including all traced named items in the workspace. STEPPED outputs a contents list including all stepped named items in the workspace. PROCEDURES outputs a list of the names of all unburied user-defined procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.) PRIMITIVES outputs a list of the names of all primitive procedures in the workspace. Note that this is a list of names, not a contents list. (However, procedures that require a contents list as input will accept this list.) NAMES outputs a contents list consisting of an empty list (indicating no procedure names) followed by a list of all unburied variable names in the workspace. PLISTS outputs a contents list consisting of two empty lists (indicating no procedures or variables) followed by a list of all unburied nonempty property lists in the workspace. NAMELIST varname (library procedure) NAMELIST varnamelist outputs a contents list consisting of an empty list followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input. PLLIST plname (library procedure) PLLIST plnamelist outputs a contents list consisting of two empty lists followed by a list of the name or names given as input. This is useful in conjunction with workspace control procedures that require a contents list as input. ARITY procedurename outputs a list of three numbers: the minimum, default, and maximum number of inputs for the procedure whose name is the input. It is an error if there is no such procedure. A maximum of -1 means that the number of inputs is unlimited. NODES outputs a list of two numbers. The first represents the number of nodes of memory currently in use. The second shows the maximum number of nodes that have been in use at any time since the last invocation of NODES. (A node is a small block of computer memory as used by Logo. Each number uses one node. Each non-numeric word uses one node, plus some non-node memory for the characters in the word. Each array takes one node, plus some non-node memory, as well as the memory required by its elements. Each list requires one node per element, as well as the memory within the elements.) If you want to track the memory use of an algorithm, it is best if you invoke GC at the beginning of each iteration, since otherwise the maximum will include storage that is unused but not yet collected. INSPECTION ---------- PRINTOUT contentslist PO contentslist command. Prints to the write stream the definitions of all procedures, variables, and property lists named in the input contents list. POALL (library procedure) command. Prints all unburied definitions in the workspace. Abbreviates PO CONTENTS. POPS (library procedure) command. Prints the definitions of all unburied procedures in the workspace. Abbreviates PO PROCEDURES. PONS (library procedure) command. Prints the definitions of all unburied variables in the workspace. Abbreviates PO NAMES. POPLS (library procedure) command. Prints the contents of all unburied nonempty property lists in the workspace. Abbreviates PO PLISTS. PON varname (library procedure) PON varnamelist command. Prints the definitions of the named variable(s). Abbreviates PO NAMELIST varname(list). POPL plname (library procedure) POPL plnamelist command. Prints the definitions of the named property list(s). Abbreviates PO PLLIST plname(list). POT contentslist command. Prints the title lines of the named procedures and the definitions of the named variables and property lists. For property lists, the entire list is shown on one line instead of as a series of PPROP instructions as in PO. POTS (library procedure) command. Prints the title lines of all unburied procedures in the workspace. Abbreviates POT PROCEDURES. WORKSPACE CONTROL ----------------- ERASE contentslist ER contentslist command. Erases from the workspace the procedures, variables, and property lists named in the input. Primitive procedures may not be erased unless the variable REDEFP has the value TRUE. ERALL command. Erases all unburied procedures, variables, and property lists from the workspace. Abbreviates ERASE CONTENTS. ERPS command. Erases all unburied procedures from the workspace. Abbreviates ERASE PROCEDURES. ERNS command. Erases all unburied variables from the workspace. Abbreviates ERASE NAMES. ERPLS command. Erases all unburied property lists from the workspace. Abbreviates ERASE PLISTS. ERN varname (library procedure) ERN varnamelist command. Erases from the workspace the variable(s) named in the input. Abbreviates ERASE NAMELIST varname(list). ERPL plname (library procedure) ERPL plnamelist command. Erases from the workspace the property list(s) named in the input. Abbreviates ERASE PLLIST plname(list). BURY contentslist command. Buries the procedures, variables, and property lists named in the input. A buried item is not included in the lists output by CONTENTS, PROCEDURES, VARIABLES, and PLISTS, but is included in the list output by BURIED. By implication, buried things are not printed by POALL or saved by SAVE. BURYALL (library procedure) command. Abbreviates BURY CONTENTS. BURYNAME varname (library procedure) BURYNAME varnamelist command. Abbreviates BURY NAMELIST varname(list). UNBURY contentslist command. Unburies the procedures, variables, and property lists named in the input. That is, the named items will be returned to view in CONTENTS, etc. UNBURYALL (library procedure) command. Abbreviates UNBURY BURIED. UNBURYNAME varname (library procedure) UNBURYNAME varnamelist command. Abbreviates UNBURY NAMELIST varname(list). BURIEDP contentslist BURIED? contentslist outputs TRUE if the first procedure, variable, or property list named in the contents list is buried, FALSE if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can BURIEDP [[] [VARIABLE]] or BURIEDP [[] [] [PROPLIST]]. TRACE contentslist command. Marks the named items for tracing. A message is printed whenever a traced procedure is invoked, giving the actual input values, and whenever a traced procedure STOPs or OUTPUTs. A message is printed whenever a new value is assigned to a traced variable using MAKE. A message is printed whenever a new property is given to a traced property list using PPROP. UNTRACE contentslist command. Turns off tracing for the named items. TRACEDP contentslist TRACED? contentslist outputs TRUE if the first procedure, variable, or property list named in the contents list is traced, FALSE if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can TRACEDP [[] [VARIABLE]] or TRACEDP [[] [] [PROPLIST]]. STEP contentslist command. Marks the named items for stepping. Whenever a stepped procedure is invoked, each instruction line in the procedure body is printed before being executed, and Logo waits for the user to type a newline at the terminal. A message is printed whenever a stepped variable name is "shadowed" because a local variable of the same name is created either as a procedure input or by the LOCAL command. UNSTEP contentslist command. Turns off stepping for the named items. STEPPEDP contentslist STEPPED? contentslist outputs TRUE if the first procedure, variable, or property list named in the contents list is stepped, FALSE if not. Only the first thing in the list is tested; the most common use will be with a word as input, naming a procedure, but a contents list is allowed so that you can STEPPEDP [[] [VARIABLE]] or STEPPEDP [[] [] [PROPLIST]]. EDIT contentslist ED contentslist (EDIT) (ED) command. If invoked with an input, EDIT writes the definitions of the named items into a temporary file and edits that file, using an editor that depends on the platform you're using. In wxWidgets, and in the MacOS Classic version, there is an editor built into Logo. In the non-wxWidgets versions for Unix, MacOS X, Windows, and DOS, Logo uses your favorite editor as determined by the EDITOR environment variable. If you don't have an EDITOR variable, edits the definitions using jove. If invoked without an input, EDIT edits the same file left over from a previous EDIT or EDITFILE instruction. When you leave the editor, Logo reads the revised definitions and modifies the workspace accordingly. It is not an error if the input includes names for which there is no previous definition. If there is a variable LOADNOISILY whose value is TRUE, then, after leaving the editor, TO commands in the temporary file print "PROCNAME defined" (where PROCNAME is the name of the procedure being defined); if LOADNOISILY is FALSE or undefined, TO commands in the file are carried out silently. If there is an environment variable called TEMP, then Logo uses its value as the directory in which to write the temporary file used for editing. Exceptionally, the EDIT command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. EDITFILE filename command. Starts the Logo editor, like EDIT, but instead of editing a temporary file it edits the file specified by the input. When you leave the editor, Logo reads the revised file, as for EDIT. EDITFILE also remembers the filename, so that a subsequent EDIT command with no input will re-edit the same file. EDITFILE is intended as an alternative to LOAD and SAVE. You can maintain a workspace file yourself, controlling the order in which definitions appear, maintaining comments in the file, and so on. EDALL (library procedure) command. Abbreviates EDIT CONTENTS. EDPS (library procedure) command. Abbreviates EDIT PROCEDURES. EDNS (library procedure) command. Abbreviates EDIT NAMES. EDPLS (library procedure) command. Abbreviates EDIT PLISTS. EDN varname (library procedure) EDN varnamelist command. Abbreviates EDIT NAMELIST varname(list). EDPL plname (library procedure) EDPL plnamelist command. Abbreviates EDIT PLLIST plname(list). SAVE filename command. Saves the definitions of all unburied procedures, variables, and nonempty property lists in the named file. Equivalent to to save :filename local "oldwriter make "oldwriter writer openwrite :filename setwrite :filename poall setwrite :oldwriter close :filename end Exceptionally, SAVE can be used with no input and without parentheses if it is the last thing on the command line. In this case, the filename from the most recent LOAD or SAVE command will be used. (It is an error if there has been no previous LOAD or SAVE.) SAVEL contentslist filename (library procedure) command. Saves the definitions of the procedures, variables, and property lists specified by "contentslist" to the file named "filename". LOAD filename command. Reads instructions from the named file and executes them. The file can include procedure definitions with TO, and these are accepted even if a procedure by the same name already exists. If the file assigns a list value to a variable named STARTUP, then that list is run as an instructionlist after the file is loaded. If there is a variable LOADNOISILY whose value is TRUE, then TO commands in the file print "PROCNAME defined" (where PROCNAME is the name of the procedure being defined); if LOADNOISILY is FALSE or undefined, TO commands in the file are carried out silently. CSLSLOAD name command. Loads the named file, like LOAD, but from the directory containing the Computer Science Logo Style programs instead of the current user's directory. HELP name (HELP) command. Prints information from the reference manual about the primitive procedure named by the input. With no input, lists all the primitives about which help is available. If there is an environment variable LOGOHELP, then its value is taken as the directory in which to look for help files, instead of the default help directory. If HELP is called with the name of a defined procedure for which there is no help file, it will print the title line of the procedure followed by lines from the procedure body that start with semicolon, stopping when a non-semicolon line is seen. Exceptionally, the HELP command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. SETEDITOR path command. Tells Logo to use the specified program as its editor instead of the default editor. The format of a path depends on your operating system. SETLIBLOC path command. Tells Logo to use the specified directory as its library instead of the default. (Note that many Logo "primitive" procedures are actually found in the library, so they may become unavailable if your new library does not include them!) The format of a path depends on your operating system. SETHELPLOC path command. Tells Logo to look in the specified directory for the information provided by the HELP command, instead of the default directory. The format of a path depends on your operating system. SETCSLSLOC path command. Tells Logo to use the specified directory for the CSLSLOAD command, instead of the default directory. The format of a path depends on your operating system. SETTEMPLOC path command. Tells Logo to write editor temporary files in the specified directory rather than in the default directory. You must have write permission for this directory. The format of a path depends on your operating system. GC (GC anything) command. Runs the garbage collector, reclaiming unused nodes. Logo does this when necessary anyway, but you may want to use this command to control exactly when Logo does it. In particular, the numbers output by the NODES operation will not be very meaningful unless garbage has been collected. Another reason to use GC is that a garbage collection takes a noticeable fraction of a second, and you may want to schedule collections for times before or after some time-critical animation. If invoked with an input (of any value), GC runs a full garbage collection, including GCTWA (Garbage Collect Truly Worthless Atoms, which means that it removes from Logo's memory words that used to be procedure or variable names but aren't any more); without an input, GC does a generational garbage collection, which means that only recently created nodes are examined. (The latter is usually good enough.) .SETSEGMENTSIZE num command. Sets the number of nodes that Logo allocates from the operating system at once to num, which must be a positive integer. The name is dotted because bad things will happen if you use a number that's too small or too large for your computer. The initial value is 16,000 for most systems, but is smaller for 68000-based Macs. Making it larger will speed up computations (by reducing the number of garbage collections) at the cost of allocating more memory than necessary. CONTROL STRUCTURES ================== Note: in the following descriptions, an "instructionlist" can be a list or a word. In the latter case, the word is parsed into list form before it is run. Thus, RUN READWORD or RUN READLIST will work. The former is slightly preferable because it allows for a continued line (with ~) that includes a comment (with ;) on the first line. A "tf" input must be the word TRUE, the word FALSE, or a list. If it's a list, then it must be a Logo expression, which will be evaluated to produce a value that must be TRUE or FALSE. The comparisons with TRUE and FALSE are always case-insensitive. A runlist can consist of either a single expression (that produces a value) or zero or more instructions (that do something, rather than output a value), depending on the context: PRINT IFELSE :X<0 ["NEGATIVE] ["POSITIVE] ; one value in each case REPEAT 4 [PRINT "A PRINT "B] ; two instructions RUN instructionlist command or operation. Runs the Logo instructions in the input list; outputs if the list contains an expression that outputs. RUNRESULT instructionlist runs the instructions in the input; outputs an empty list if those instructions produce no output, or a list whose only member is the output from running the input instructionlist. Useful for inventing command-or-operation control structures: local "result make "result runresult [something] if emptyp :result [stop] output first :result REPEAT num instructionlist command. Runs the "instructionlist" repeatedly, "num" times. FOREVER instructionlist command. Runs the "instructionlist" repeatedly, until something inside the instructionlist (such as STOP or THROW) makes it stop. REPCOUNT outputs the repetition count of the innermost current REPEAT or FOREVER, starting from 1. If no REPEAT or FOREVER is active, outputs -1. The abbreviation # can be used for REPCOUNT unless the REPEAT is inside the template input to a higher order procedure such as FOREACH, in which case # has a different meaning. IF tf instructionlist (IF tf instructionlist1 instructionlist2) command. If the first input has the value TRUE, then IF runs the second input. If the first input has the value FALSE, then IF does nothing. (If given a third input, IF acts like IFELSE, as described below.) It is an error if the first input is not either TRUE or FALSE. For compatibility with earlier versions of Logo, if an IF instruction is not enclosed in parentheses, but the first thing on the instruction line after the second input expression is a literal list (i.e., a list in square brackets), the IF is treated as if it were IFELSE, but a warning message is given. If this aberrant IF appears in a procedure body, the warning is given only the first time the procedure is invoked in each Logo session. IFELSE tf instructionlist1 instructionlist2 command or operation. If the first input has the value TRUE, then IFELSE runs the second input. If the first input has the value FALSE, then IFELSE runs the third input. IFELSE outputs a value if the instructionlist contains an expression that outputs a value. TEST tf command. Remembers its input, which must be TRUE or FALSE, for use by later IFTRUE or IFFALSE instructions. The effect of TEST is local to the procedure in which it is used; any corresponding IFTRUE or IFFALSE must be in the same procedure or a subprocedure. IFTRUE instructionlist IFT instructionlist command. Runs its input if the most recent TEST instruction had a TRUE input. The TEST must have been in the same procedure or a superprocedure. IFFALSE instructionlist IFF instructionlist command. Runs its input if the most recent TEST instruction had a FALSE input. The TEST must have been in the same procedure or a superprocedure. STOP command. Ends the running of the procedure in which it appears. Control is returned to the context in which that procedure was invoked. The stopped procedure does not output a value. OUTPUT value OP value command. Ends the running of the procedure in which it appears. That procedure outputs the value "value" to the context in which it was invoked. Don't be confused: OUTPUT itself is a command, but the procedure that invokes OUTPUT is an operation. CATCH tag instructionlist command or operation. Runs its second input. Outputs if that instructionlist outputs. If, while running the instructionlist, a THROW instruction is executed with a tag equal to the first input (case-insensitive comparison), then the running of the instructionlist is terminated immediately. In this case the CATCH outputs if a value input is given to THROW. The tag must be a word. If the tag is the word ERROR, then any error condition that arises during the running of the instructionlist has the effect of THROW "ERROR instead of printing an error message and returning to toplevel. The CATCH does not output if an error is caught. Also, during the running of the instructionlist, the variable ERRACT is temporarily unbound. (If there is an error while ERRACT has a value, that value is taken as an instructionlist to be run after printing the error message. Typically the value of ERRACT, if any, is the list [PAUSE].) THROW tag (THROW tag value) command. Must be used within the scope of a CATCH with an equal tag. Ends the running of the instructionlist of the CATCH. If THROW is used with only one input, the corresponding CATCH does not output a value. If THROW is used with two inputs, the second provides an output for the CATCH. THROW "TOPLEVEL can be used to terminate all running procedures and interactive pauses, and return to the toplevel instruction prompt. Typing the system interrupt character (alt-S for wxWidgets; otherwise normally control-C for Unix, control-Q for DOS, or command-period for Mac) has the same effect. THROW "ERROR can be used to generate an error condition. If the error is not caught, it prints a message (THROW "ERROR) with the usual indication of where the error (in this case the THROW) occurred. If a second input is used along with a tag of ERROR, that second input is used as the text of the error message instead of the standard message. Also, in this case, the location indicated for the error will be, not the location of the THROW, but the location where the procedure containing the THROW was invoked. This allows user-defined procedures to generate error messages as if they were primitives. Note: in this case the corresponding CATCH "ERROR, if any, does not output, since the second input to THROW is not considered a return value. THROW "SYSTEM immediately leaves Logo, returning to the operating system, without printing the usual parting message and without deleting any editor temporary file written by EDIT. ERROR outputs a list describing the error just caught, if any. If there was not an error caught since the last use of ERROR, the empty list will be output. The error list contains four members: an integer code corresponding to the type of error, the text of the error message (as a single word including spaces), the name of the procedure in which the error occurred, and the instruction line on which the error occurred. PAUSE command or operation. Enters an interactive pause. The user is prompted for instructions, as at toplevel, but with a prompt that includes the name of the procedure in which PAUSE was invoked. Local variables of that procedure are available during the pause. PAUSE outputs if the pause is ended by a CONTINUE with an input. If the variable ERRACT exists, and an error condition occurs, the contents of that variable are run as an instructionlist. Typically ERRACT is given the value [PAUSE] so that an interactive pause will be entered in the event of an error. This allows the user to check values of local variables at the time of the error. Typing the system quit character (alt-S for wxWidgets; otherwise normally control-\ for Unix, control-W for DOS, or command-comma for Mac) will also enter a pause. CONTINUE value CO value (CONTINUE) (CO) command. Ends the current interactive pause, returning to the context of the PAUSE invocation that began it. If CONTINUE is given an input, that value is used as the output from the PAUSE. If not, the PAUSE does not output. Exceptionally, the CONTINUE command can be used without its default input and without parentheses provided that nothing follows it on the instruction line. WAIT time command. Delays further execution for "time" 60ths of a second. Also causes any buffered characters destined for the terminal to be printed immediately. WAIT 0 can be used to achieve this buffer flushing without actually waiting. BYE command. Exits from Logo; returns to the operating system. .MAYBEOUTPUT value (special form) works like OUTPUT except that the expression that provides the input value might not, in fact, output a value, in which case the effect is like STOP. This is intended for use in control structure definitions, for cases in which you don't know whether or not some expression produces a value. Example: to invoke :function [:inputs] 2 .maybeoutput apply :function :inputs end ? (invoke "print "a "b "c) a b c ? print (invoke "word "a "b "c) abc This is an alternative to RUNRESULT. It's fast and easy to use, at the cost of being an exception to Logo's evaluation rules. (Ordinarily, it should be an error if the expression that's supposed to provide an input to something doesn't have a value.) GOTO word command. Looks for a TAG command with the same input in the same procedure, and continues running the procedure from the location of that TAG. It is meaningless to use GOTO outside of a procedure. TAG quoted.word command. Does nothing. The input must be a literal word following a quotation mark ("), not the result of a computation. Tags are used by the GOTO command. IGNORE value (library procedure) command. Does nothing. Used when an expression is evaluated for a side effect and its actual value is unimportant. ` list (library procedure) outputs a list equal to its input but with certain substitutions. If a member of the input list is the word "," (comma) then the following member should be an instructionlist that produces an output when run. That output value replaces the comma and the instructionlist. If a member of the input list is the word ",@" (comma atsign) then the following member should be an instructionlist that outputs a list when run. The members of that list replace the ,@ and the instructionlist. Example: show `[foo baz ,[bf [a b c]] garply ,@[bf [a b c]]] will print [foo baz [b c] garply b c] A word starting with , or ,@ is treated as if the rest of the word were a one-word list, e.g., ,:FOO is equivalent to ,[:FOO]. A word starting with ", (quote comma) or :, (colon comma) becomes a word starting with " or : but with the result of running the substitution (or its first word, if the result is a list) replacing what comes after the comma. Backquotes can be nested. Substitution is done only for commas at the same depth as the backquote in which they are found: ? show `[a `[b ,[1+2] ,[foo ,[1+3] d] e] f] [a ` [b , [1+2] , [foo 4 d] e] f] ?make "name1 "x ?make "name2 "y ? show `[a `[b ,:,:name1 ,",:name2 d] e] [a ` [b , [:x] , ["y] d] e] FOR forcontrol instructionlist (library procedure) command. The first input must be a list containing three or four members: (1) a word, which will be used as the name of a local variable; (2) a word or list that will be evaluated as by RUN to determine a number, the starting value of the variable; (3) a word or list that will be evaluated to determine a number, the limit value of the variable; (4) an optional word or list that will be evaluated to determine the step size. If the fourth member is missing, the step size will be 1 or -1 depending on whether the limit value is greater than or less than the starting value, respectively. The second input is an instructionlist. The effect of FOR is to run that instructionlist repeatedly, assigning a new value to the control variable (the one named by the first member of the forcontrol list) each time. First the starting value is assigned to the control variable. Then the value is compared to the limit value. FOR is complete when the sign of (current - limit) is the same as the sign of the step size. (If no explicit step size is provided, the instructionlist is always run at least once. An explicit step size can lead to a zero-trip FOR, e.g., FOR [I 1 0 1] ...) Otherwise, the instructionlist is run, then the step is added to the current value of the control variable and FOR returns to the comparison step. ? for [i 2 7 1.5] [print :i] 2 3.5 5 6.5 ? DO.WHILE instructionlist tfexpression (library procedure) command. Repeatedly evaluates the "instructionlist" as long as the evaluated "tfexpression" remains TRUE. Evaluates the first input first, so the "instructionlist" is always run at least once. The "tfexpression" must be an expressionlist whose value when evaluated is TRUE or FALSE. WHILE tfexpression instructionlist (library procedure) command. Repeatedly evaluates the "instructionlist" as long as the evaluated "tfexpression" remains TRUE. Evaluates the first input first, so the "instructionlist" may never be run at all. The "tfexpression" must be an expressionlist whose value when evaluated is TRUE or FALSE. DO.UNTIL instructionlist tfexpression (library procedure) command. Repeatedly evaluates the "instructionlist" as long as the evaluated "tfexpression" remains FALSE. Evaluates the first input first, so the "instructionlist" is always run at least once. The "tfexpression" must be an expressionlist whose value when evaluated is TRUE or FALSE. UNTIL tfexpression instructionlist (library procedure) command. Repeatedly evaluates the "instructionlist" as long as the evaluated "tfexpression" remains FALSE. Evaluates the first input first, so the "instructionlist" may never be run at all. The "tfexpression" must be an expressionlist whose value when evaluated is TRUE or FALSE. CASE value clauses (library procedure) command or operation. The second input is a list of lists (clauses); each clause is a list whose first element is either a list of values or the word ELSE and whose butfirst is a Logo expression or instruction. CASE examines the clauses in order. If a clause begins with the word ELSE (upper or lower case), then the butfirst of that clause is evaluated and CASE outputs its value, if any. If the first input to CASE is a member of the first element of a clause, then the butfirst of that clause is evaluated and CASE outputs its value, if any. If neither of these conditions is met, then CASE goes on to the next clause. If no clause is satisfied, CASE does nothing. Example: to vowelp :letter output case :letter [ [[a e i o u] "true] [else "false] ] end COND clauses (library procedure) command or operation. The input is a list of lists (clauses); each clause is a list whose first element is either an expression whose value is TRUE or FALSE, or the word ELSE, and whose butfirst is a Logo expression or instruction. COND examines the clauses in order. If a clause begins with the word ELSE (upper or lower case), then the butfirst of that clause is evaluated and CASE outputs its value, if any. Otherwise, the first element of the clause is evaluated; the resulting value must be TRUE or FALSE. If it's TRUE, then the butfirst of that clause is evaluated and COND outputs its value, if any. If the value is FALSE, then COND goes on to the next clause. If no clause is satisfied, COND does nothing. Example: to evens :numbers ; select even numbers from a list op cond [ [[emptyp :numbers] []] [[evenp first :numbers] ; assuming EVENP is defined fput first :numbers evens butfirst :numbers] [else evens butfirst :numbers] ] end TEMPLATE-BASED ITERATION ------------------------ The procedures in this section are iteration tools based on the idea of a "template." This is a generalization of an instruction list or an expression list in which "slots" are provided for the tool to insert varying data. Four different forms of template can be used. The most commonly used form for a template is "explicit-slot" form, or "question mark" form. Example: ? show map [? * ?] [2 3 4 5] [4 9 16 25] ? In this example, the MAP tool evaluated the template [? * ?] repeatedly, with each of the members of the data list [2 3 4 5] substituted in turn for the question marks. The same value was used for every question mark in a given evaluation. Some tools allow for more than one datum to be substituted in parallel; in these cases the slots are indicated by ?1 for the first datum, ?2 for the second, and so on: ? show (map [(word ?1 ?2 ?1)] [a b c] [d e f]) [ada beb cfc] ? If the template wishes to compute the datum number, the form (? 1) is equivalent to ?1, so (? ?1) means the datum whose number is given in datum number 1. Some tools allow additional slot designations, as shown in the individual descriptions. The second form of template is the "named-procedure" form. If the template is a word rather than a list, it is taken as the name of a procedure. That procedure must accept a number of inputs equal to the number of parallel data slots provided by the tool; the procedure is applied to all of the available data in order. That is, if data ?1 through ?3 are available, the template "PROC is equivalent to [PROC ?1 ?2 ?3]. ? show (map "word [a b c] [d e f]) [ad be cf] ? to dotprod :a :b ; vector dot product op apply "sum (map "product :a :b) end The third form of template is "named-slot" or "lambda" form. This form is indicated by a template list containing more than one member, whose first member is itself a list. The first member is taken as a list of names; local variables are created with those names and given the available data in order as their values. The number of names must equal the number of available data. This form is needed primarily when one iteration tool must be used within the template list of another, and the ? notation would be ambiguous in the inner template. Example: to matmul :m1 :m2 [:tm2 transpose :m2] ; multiply two matrices output map [[row] map [[col] dotprod :row :col] :tm2] :m1 end The fourth form is "procedure text" form, a variant of lambda form. In this form, the template list contains at least two members, all of which are lists. This is the form used by the DEFINE and TEXT primitives, and APPLY accepts it so that the text of a defined procedure can be used as a template. Note: The fourth form of template is interpreted differently from the others, in that Logo considers it to be an independent defined procedure for the purposes of OUTPUT and STOP. For example, the following two instructions are identical: ? print apply [[x] :x+3] [5] 8 ? print apply [[x] [output :x+3]] [5] 8 although the first instruction is in named-slot form and the second is in procedure-text form. The named-slot form can be understood as telling Logo to evaluate the expression :x+3 in place of the entire invocation of apply, with the variable x temporarily given the value 5. The procedure-text form can be understood as invoking the procedure to foo :x output :x+3 end with input 5, but without actually giving the procedure a name. If the use of OUTPUT were interchanged in these two examples, we'd get errors: ? print apply [[x] output :x+3] [5] Can only use output inside a procedure ? print apply [[x] [:x+3]] [5] You don't say what to do with 8 The named-slot form can be used with STOP or OUTPUT inside a procedure, to stop the enclosing procedure. The following iteration tools are extended versions of the ones in Appendix B of the book _Computer_Science_Logo_Style,_Volume_3:_Advanced_Topics_ by Brian Harvey [MIT Press, 1987]. The extensions are primarily to allow for variable numbers of inputs. APPLY template inputlist command or operation. Runs the "template," filling its slots with the members of "inputlist." The number of members in "inputlist" must be an acceptable number of slots for "template." It is illegal to apply the primitive TO as a template, but anything else is okay. APPLY outputs what "template" outputs, if anything. INVOKE template input (library procedure) (INVOKE template input1 input2 ...) command or operation. Exactly like APPLY except that the inputs are provided as separate expressions rather than in a list. FOREACH data template (library procedure) (FOREACH data1 data2 ... template) command. Evaluates the template list repeatedly, once for each member of the data list. If more than one data list are given, each of them must be the same length. (The data inputs can be words, in which case the template is evaluated once for each character.) In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. MAP template data (library procedure) (MAP template data1 data2 ...) outputs a word or list, depending on the type of the data input, of the same length as that data input. (If more than one data input are given, the output is of the same type as data1.) Each member of the output is the result of evaluating the template list, filling the slots with the corresponding member(s) of the data input(s). (All data inputs must be the same length.) In the case of a word output, the results of the template evaluation must be words, and they are concatenated with WORD. In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. MAP.SE template data (library procedure) (MAP.SE template data1 data2 ...) outputs a list formed by evaluating the template list repeatedly and concatenating the results using SENTENCE. That is, the members of the output are the members of the results of the evaluations. The output list might, therefore, be of a different length from that of the data input(s). (If the result of an evaluation is the empty list, it contributes nothing to the final output.) The data inputs may be words or lists. In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. If multiple parallel slots are used, then (?REST 1) goes with ?1, etc. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. FILTER tftemplate data (library procedure) outputs a word or list, depending on the type of the data input, containing a subset of the members (for a list) or characters (for a word) of the input. The template is evaluated once for each member or character of the data, and it must produce a TRUE or FALSE value. If the value is TRUE, then the corresponding input constituent is included in the output. ? print filter "vowelp "elephant eea ? In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. FIND tftemplate data (library procedure) outputs the first constituent of the data input (the first member of a list, or the first character of a word) for which the value produced by evaluating the template with that consituent in its slot is TRUE. If there is no such constituent, the empty list is output. In a template, the symbol ?REST represents the portion of the data input to the right of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then ?REST would be replaced by [C D E]. In a template, the symbol # represents the position in the data input of the member currently being used as the ? slot-filler. That is, if the data input is [A B C D E] and the template is being evaluated with ? replaced by B, then # would be replaced by 2. REDUCE template data (library procedure) outputs the result of applying the template to accumulate the members of the data input. The template must be a two-slot function. Typically it is an associative function name like SUM. If the data input has only one constituent (member in a list or character in a word), the output is that consituent. Otherwise, the template is first applied with ?1 filled with the next-to-last consitient and ?2 with the last constituent. Then, if there are more constituents, the template is applied with ?1 filled with the next constituent to the left and ?2 with the result from the previous evaluation. This process continues until all constituents have been used. The data input may not be empty. Note: If the template is, like SUM, the name of a procedure that is capable of accepting arbitrarily many inputs, it is more efficient to use APPLY instead of REDUCE. The latter is good for associative procedures that have been written to accept exactly two inputs: to max :a :b output ifelse :a > :b [:a] [:b] end print reduce "max [...] Alternatively, REDUCE can be used to write MAX as a procedure that accepts any number of inputs, as SUM does: to max [:inputs] 2 if emptyp :inputs ~ [(throw "error [not enough inputs to max])] output reduce [ifelse ?1 > ?2 [?1] [?2]] :inputs end CROSSMAP template listlist (library procedure) (CROSSMAP template data1 data2 ...) outputs a list containing the results of template evaluations. Each data list contributes to a slot in the template; the number of slots is equal to the number of data list inputs. As a special case, if only one data list input is given, that list is taken as a list of data lists, and each of its members contributes values to a slot. CROSSMAP differs from MAP in that instead of taking members from the data inputs in parallel, it takes all possible combinations of members of data inputs, which need not be the same length. ? show (crossmap [word ?1 ?2] [a b c] [1 2 3 4]) [a1 a2 a3 a4 b1 b2 b3 b4 c1 c2 c3 c4] ? For compatibility with the version in the first edition of CSLS, CROSSMAP templates may use the notation :1 instead of ?1 to indicate slots. CASCADE endtest template startvalue (library procedure) (CASCADE endtest tmp1 sv1 tmp2 sv2 ...) (CASCADE endtest tmp1 sv1 tmp2 sv2 ... finaltemplate) outputs the result of applying a template (or several templates, as explained below) repeatedly, with a given value filling the slot the first time, and the result of each application filling the slot for the following application. In the simplest case, CASCADE has three inputs. The second input is a one-slot expression template. That template is evaluated some number of times (perhaps zero). On the first evaluation, the slot is filled with the third input; on subsequent evaluations, the slot is filled with the result of the previous evaluation. The number of evaluations is determined by the first input. This can be either a nonnegative integer, in which case the template is evaluated that many times, or a predicate expression template, in which case it is evaluated (with the same slot filler that will be used for the evaluation of the second input) repeatedly, and the CASCADE evaluation continues as long as the predicate value is FALSE. (In other words, the predicate template indicates the condition for stopping.) If the template is evaluated zero times, the output from CASCADE is the third (startvalue) input. Otherwise, the output is the value produced by the last template evaluation. CASCADE templates may include the symbol # to represent the number of times the template has been evaluated. This slot is filled with 1 for the first evaluation, 2 for the second, and so on. ? show cascade 5 [lput # ?] [] [1 2 3 4 5] ? show cascade [vowelp first ?] [bf ?] "spring ing ? show cascade 5 [# * ?] 1 120 ? Several cascaded results can be computed in parallel by providing additional template-startvalue pairs as inputs to CASCADE. In this case, all templates (including the endtest template, if used) are multi-slot, with the number of slots equal to the number of pairs of inputs. In each round of evaluations, ?2, for example, represents the result of evaluating the second template in the previous round. If the total number of inputs (including the first endtest input) is odd, then the output from CASCADE is the final value of the first template. If the total number of inputs is even, then the last input is a template that is evaluated once, after the end test is satisfied, to determine the output from CASCADE. to fibonacci :n output (cascade :n [?1 + ?2] 1 [?1] 0) end to piglatin :word output (cascade [vowelp first ?] ~ [word bf ? first ?] ~ :word ~ [word ? "ay]) end CASCADE.2 endtest temp1 startval1 temp2 startval2 (library procedure) outputs the result of invoking CASCADE with the same inputs. The only difference is that the default number of inputs is five instead of three. TRANSFER endtest template inbasket (library procedure) outputs the result of repeated evaluation of the template. The template is evaluated once for each member of the list "inbasket." TRANSFER maintains an "outbasket" that is initially the empty list. After each evaluation of the template, the resulting value becomes the new outbasket. In the template, the symbol ?IN represents the current member from the inbasket; the symbol ?OUT represents the entire current outbasket. Other slot symbols should not be used. If the first (endtest) input is an empty list, evaluation continues until all inbasket members have been used. If not, the first input must be a predicate expression template, and evaluation continues until either that template's value is TRUE or the inbasket is used up. MACROS ====== .MACRO procname :input1 :input2 ... (special form) .DEFMACRO procname text A macro is a special kind of procedure whose output is evaluated as Logo instructions in the context of the macro's caller. .MACRO is exactly like TO except that the new procedure becomes a macro; .DEFMACRO is exactly like DEFINE with the same exception. Macros are useful for inventing new control structures comparable to REPEAT, IF, and so on. Such control structures can almost, but not quite, be duplicated by ordinary Logo procedures. For example, here is an ordinary procedure version of REPEAT: to my.repeat :num :instructions if :num=0 [stop] run :instructions my.repeat :num-1 :instructions end This version works fine for most purposes, e.g., my.repeat 5 [print "hello] But it doesn't work if the instructions to be carried out include OUTPUT, STOP, or LOCAL. For example, consider this procedure: to example print [Guess my secret word. You get three guesses.] repeat 3 [type "|?? | ~ if readword = "secret [pr "Right! stop]] print [Sorry, the word was "secret"!] end This procedure works as written, but if MY.REPEAT is used instead of REPEAT, it won't work because the STOP will stop MY.REPEAT instead of stopping EXAMPLE as desired. The solution is to make MY.REPEAT a macro. Instead of actually carrying out the computation, a macro must return a list containing Logo instructions. The contents of that list are evaluated as if they appeared in place of the call to the macro. Here's a macro version of REPEAT: .macro my.repeat :num :instructions if :num=0 [output []] output sentence :instructions ~ (list "my.repeat :num-1 :instructions) end Every macro is an operation -- it must always output something. Even in the base case, MY.REPEAT outputs an empty instruction list. To show how MY.REPEAT works, let's take the example my.repeat 5 [print "hello] For this example, MY.REPEAT will output the instruction list [print "hello my.repeat 4 [print "hello]] Logo then executes these instructions in place of the original invocation of MY.REPEAT; this prints "hello" once and invokes another repetition. The technique just shown, although fairly easy to understand, has the defect of slowness because each repetition has to construct an instruction list for evaluation. Another approach is to make MY.REPEAT a macro that works just like the non-macro version unless the instructions to be repeated include OUTPUT or STOP: .macro my.repeat :num :instructions catch "repeat.catchtag ~ [op repeat.done runresult [repeat1 :num :instructions]] op [] end to repeat1 :num :instructions if :num=0 [throw "repeat.catchtag] run :instructions .maybeoutput repeat1 :num-1 :instructions end to repeat.done :repeat.result if emptyp :repeat.result [op [stop]] op list "output quoted first :repeat.result end If the instructions do not include STOP or OUTPUT, then REPEAT1 will reach its base case and invoke THROW. As a result, MY.REPEAT's last instruction line will output an empty list, so the evaluation of the macro result by the caller will do nothing. But if a STOP or OUTPUT happens, then REPEAT.DONE will output a STOP or OUTPUT instruction that will be executed in the caller's context. The macro-defining commands have names starting with a dot because macros are an advanced feature of Logo; it's easy to get in trouble by defining a macro that doesn't terminate, or by failing to construct the instruction list properly. Lisp users should note that Logo macros are NOT special forms. That is, the inputs to the macro are evaluated normally, as they would be for any other Logo procedure. It's only the output from the macro that's handled unusually. Here's another example: .macro localmake :name :value output (list "local ~ word "" :name ~ "apply ~ ""make ~ (list :name :value)) end It's used this way: to try localmake "garply "hello print :garply end LOCALMAKE outputs the list [local "garply apply "make [garply hello]] The reason for the use of APPLY is to avoid having to decide whether or not the second input to MAKE requires a quotation mark before it. (In this case it would -- MAKE "GARPLY "HELLO -- but the quotation mark would be wrong if the value were a list.) It's often convenient to use the ` function to construct the instruction list: .macro localmake :name :value op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]] end On the other hand, ` is pretty slow, since it's tree recursive and written in Logo. MACROP name MACRO? name outputs TRUE if its input is the name of a macro. MACROEXPAND expr (library procedure) takes as its input a Logo expression that invokes a macro (that is, one that begins with the name of a macro) and outputs the the Logo expression into which the macro would translate the input expression. .macro localmake :name :value op `[local ,[word "" :name] apply "make [,[:name] ,[:value]]] end ? show macroexpand [localmake "pi 3.14159] [local "pi apply "make [pi 3.14159]] ERROR PROCESSING ================ If an error occurs, Logo takes the following steps. First, if there is an available variable named ERRACT, Logo takes its value as an instructionlist and runs the instructions. The operation ERROR may be used within the instructions (once) to examine the error condition. If the instructionlist invokes PAUSE, the error message is printed before the pause happens. Certain errors are "recoverable"; for one of those errors, if the instructionlist outputs a value, that value is used in place of the expression that caused the error. (If ERRACT invokes PAUSE and the user then invokes CONTINUE with an input, that input becomes the output from PAUSE and therefore the output from the ERRACT instructionlist.) It is possible for an ERRACT instructionlist to produce an inappropriate value or no value where one is needed. As a result, the same error condition could recur forever because of this mechanism. To avoid that danger, if the same error condition occurs twice in a row from an ERRACT instructionlist without user interaction, the message "Erract loop" is printed and control returns to toplevel. "Without user interaction" means that if ERRACT invokes PAUSE and the user provides an incorrect value, this loop prevention mechanism does not take effect and the user gets to try again. During the running of the ERRACT instructionlist, ERRACT is locally unbound, so an error in the ERRACT instructions themselves will not cause a loop. In particular, an error during a pause will not cause a pause-within-a-pause unless the user reassigns the value [PAUSE] to ERRACT during the pause. But such an error will not return to toplevel; it will remain within the original pause loop. If there is no available ERRACT value, Logo handles the error by generating an internal THROW "ERROR. (A user program can also generate an error condition deliberately by invoking THROW.) If this throw is not caught by a CATCH "ERROR in the user program, it is eventually caught either by the toplevel instruction loop or by a pause loop, which prints the error message. An invocation of CATCH "ERROR in a user program locally unbinds ERRACT, so the effect is that whichever of ERRACT and CATCH "ERROR is more local will take precedence. If a floating point overflow occurs during an arithmetic operation, or a two-input mathematical function (like POWER) is invoked with an illegal combination of inputs, the "doesn't like" message refers to the second operand, but should be taken as meaning the combination. ERROR CODES ----------- Here are the numeric codes that appear as the first member of the list output by ERROR when an error is caught, with the corresponding messages. Some messages may have two different codes depending on whether or not the error is recoverable (that is, a substitute value can be provided through the ERRACT mechanism) in the specific context. Some messages are warnings rather than errors; these will not be caught. Errors 0 and 32 are so bad that Logo exits immediately. 0 Fatal internal error (can't be caught) 1 Out of memory 2 Stack overflow 3 Turtle out of bounds 4 PROC doesn't like DATUM as input (not recoverable) 5 PROC didn't output to PROC 6 Not enough inputs to PROC 7 PROC doesn't like DATUM as input (recoverable) 8 Too much inside ()'s 9 You don't say what to do with DATUM 10 ')' not found 11 VAR has no value 12 Unexpected ')' 13 I don't know how to PROC (recoverable) 14 Can't find catch tag for THROWTAG 15 PROC is already defined 16 Stopped 17 Already dribbling 18 File system error 19 Assuming you mean IFELSE, not IF (warning only) 20 VAR shadowed by local in procedure call (warning only) 21 Throw "Error 22 PROC is a primitive 23 Can't use TO inside a procedure 24 I don't know how to PROC (not recoverable) 25 IFTRUE/IFFALSE without TEST 26 Unexpected ']' 27 Unexpected '}' 28 Couldn't initialize graphics 29 Macro returned VALUE instead of a list 30 You don't say what to do with VALUE 31 Can only use STOP or OUTPUT inside a procedure 32 APPLY doesn't like BADTHING as input 33 END inside multi-line instruction 34 Really out of memory (can't be caught) 35 user-generated error message (THROW "ERROR [message]) 36 END inside multi-line instruction 37 Bad default expression for optional input: EXPR 38 Can't use OUTPUT or STOP inside RUNRESULT 39 Assuming you meant 'FD 100', not FD100 (or similar) 40 I can't open file FILENAME 41 File FILENAME already open 42 File FILENAME not open 43 Runlist [EXPR EXPR] has more than one expression. SPECIAL VARIABLES ================= Logo takes special action if any of the following variable names exists. They follow the normal scoping rules, so a procedure can locally set one of them to limit the scope of its effect. Initially, no variables exist except for ALLOWGETSET, CASEIGNOREDP, and UNBURYONEDIT, which are TRUE and buried. ALLOWGETSET (variable) if TRUE, indicates that an attempt to use a procedure that doesn't exist should be taken as an implicit getter or setter procedure (setter if the first three letters of the name are SET) for a variable of the same name (without the SET if appropriate). BUTTONACT (variable) if nonempty, should be an instruction list that will be evaluated whenever a mouse button is pressed. Note that the user may have released the button before the instructions are evaluated. BUTTON will still output which button was most recently pressed. CLICKPOS will output the position of the mouse cursor at the moment the button was pressed; this may be different from MOUSEPOS if the user moves the mouse after clicking. Note that it's possible for the user to press a button during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting BUTTONACT to the empty list. One easy way to do that is the following: make "buttonact [button.action] to button.action [:buttonact []] ... ; whatever you want the button to do end CASEIGNOREDP (variable) if TRUE, indicates that lower case and upper case letters should be considered equal by EQUALP, BEFOREP, MEMBERP, etc. Logo initially makes this variable TRUE, and buries it. COMMANDLINE (variable) contains any text appearing after a hyphen on the command line used to start Logo. ERRACT (variable) an instructionlist that will be run in the event of an error. Typically has the value [PAUSE] to allow interactive debugging. FULLPRINTP (variable) if TRUE, then words that were created using backslash or vertical bar (to include characters that would otherwise not be treated as part of a word) are printed with the backslashes or vertical bars shown, so that the printed result could be re-read by Logo to produce the same value. If FULLPRINTP is TRUE then the empty word (however it was created) prints as ||. (Otherwise it prints as nothing at all.) KEYACT (variable) if nonempty, should be an instruction list that will be evaluated whenever a key is pressed on the keyboard. The instruction list can use READCHAR to find out what key was pressed. Note that only keys that produce characters qualify; pressing SHIFT or CONTROL alone will not cause KEYACT to be evaluated. Note that it's possible for the user to press a key during the evaluation of the instruction list. If this would confuse your program, prevent it by temporarily setting KEYACT to the empty list. One easy way to do that is the following: make "keyact [key.action] to key.action [:keyact []] ... ; whatever you want the key to do end LOADNOISILY (variable) if TRUE, prints the names of procedures defined when loading from a file (including the temporary file made by EDIT). PRINTDEPTHLIMIT (variable) if a nonnegative integer, indicates the maximum depth of sublist structure that will be printed by PRINT, etc. PRINTWIDTHLIMIT (variable) if a nonnegative integer, indicates the maximum number of members in any one list that will be printed by PRINT, etc. REDEFP (variable) if TRUE, allows primitives to be erased (ERASE) or redefined (COPYDEF). STARTUP (variable) if assigned a list value in a file loaded by LOAD, that value is run as an instructionlist after the loading. UNBURYONEDIT (variable) if TRUE, causes any procedure defined during EDIT or LOAD to be unburied, so that it will be saved by a later SAVE. Files that want to define and bury procedures must do it in that order. USEALTERNATENAMES (variable) if TRUE, causes Logo to generate non-English words (from the Messages file) instead of TRUE, FALSE, END, etc. Logo provides the following buried variables that can be used by programs: LOGOVERSION (variable) a real number indicating the Logo version number, e.g., 5.5 LOGOPLATFORM (variable) one of the following words: wxWidgets, X11, Windows, or Unix-Nographics. INTERNATIONALIZATION ==================== Berkeley Logo has limited support for non-English-speaking users. Alas, there is no Unicode support, and high-bit-on ASCII codes work in some contexts but not others. If you want to translate Berkeley Logo for use with another language, there are three main things you have to do: 1. Primitive names 2. Error (and other) messages 3. Documentation For primitive names, the easiest thing is to provide a startup file that defines aliases for the English primitive names, using COPYDEF: COPYDEF "AVANT "FORWARD This should take care of it, unless your language's name for one primitive is spelled like the English name of a different primitive. In that case you have to turn REDEFP on and be sure to copy the non-conflicting name before overwriting the conflicting one! "Primitives" that are actually in the Logo library, of course, can just be replaced or augmented with native-language-named Logo procedures and filenames. Of course Logo programs will still not look like your native language if the word order is dramatically different, especially if you don't put verbs before their objects. For error messages, there is a file named Messages in the logolib directory with texts of messages, one per line. You can replace this with a file for your own language. Do not add, delete, or reorder lines; Logo finds messages by line number. The sequences %p, %s, and %t in these messages represent variable parts of the message and should not be translated. (%p PRINTs the variable part, while %s SHOWs it -- that is, the difference is about whether or not brackets are shown surrounding a list. %t means that the variable part is a C text string rather than a Logo object.) If you want to change the order of two variable parts (no reorderable message has more than two), you would for example replace the line %p doesn't like %s as input with %+s is a lousy input to %p The plus sign tells the message printer to reverse the order; you must reverse the order of %p and %s, if both are used, to match. The plus sign goes just after the first percent sign in the message, which might not be at the beginning of the line. The sequence \n in a message represents a newline; don't be fooled into thinking that the "n" is part of the following word. Some messages appear twice in the file; this isn't a mistake. The two spaces before "to" in "I don't know how to" aren't a mistake either. The message containing just "%p" is for user-provided error messages in THROW "ERROR. The message " in %s\n%s" is the part of all error messages that indicates where the error occurred if it was inside a procedure; you might want to change the word "in" to your language. "%s defined\n" is what LOAD prints for each procedure defined if the variable LOADNOISILY is TRUE. "to %p\nend\n\n" is what EDIT puts in the temporary file if you ask to edit a procedure that isn't already defined. Also in the Messages file are lines containing only one word each; the first of these is the word "true". Some of these words are recognized by Logo in user input; some are generated by Logo; some are both. For example, the words TRUE and FALSE are recognized as Boolean values by IF and IFELSE, and are also generated by Logo as outputs from the primitive predicates such as EQUALP. The word END is recognized as the end of a procedure definition, and may be generated when Logo reconstructs a procedure body for PO or EDIT. I've used capital letters in this paragraph for easier reading, but the words in the Messages file should be in lower case. If you replace these with non-English words, Logo will *recognize* both the English names and your alternate names. For example, if you replace the word "true" with "vrai" then Logo will understand both of these: IF "TRUE [PRINT "YES] IF "VRAI [PRINT "YES] The variable UseAlternateNames determines whether Logo will *generate* other-language names -- for example, whether predicate functions return the other-language alternates for TRUE and FALSE. This variable is FALSE by default, meaning that the English words will be generated. You might wish to have English-named predicate functions generate English TRUE and FALSE, while other-language-named predicates generate the alternate words. This can be done by leaving UseAlternateNames false, and instead of defining the other-language predicates with COPYDEF, do it this way: to french.boolean :bool if equalp :bool "true [output "vrai] if equalp :bool "false [output "faux] output :bool ; shouldn't happen end to make.french.predicate :french :english :arity define :french `[[[inputs] ,[:arity]] [output french.boolean apply ,[word "" :english] :inputs]] end ? make.french.predicate "egal? "equal? 2 ? pr egal? 3 4 faux ? pr egal? 4 4 vrai ? pr equal? 3 4 false ? pr equal? 4 4 true The third input to make.french.predicate is the number of inputs that the predicate expects. This solution isn't quite perfect because the infix predicates (=, <, >) will still output in English. If you want them to generate alternate-language words, set UseAlternateNames to TRUE instead. Some of the words in this section of the Messages file are names of Logo primitives (OUTPUT, STOP, GOTO, TAG, IF, IFELSE, TO, .MACRO). To translate these names, you must use COPYDEF as described earlier, in addition to changing the names in Messages. You should be consistent in these two steps. Don't forget the period in ".macro"! For documentation, there are two kinds: this manual and the help files. The latter are generated automatically from this manual if you have a Unix system, so in that case you need only translate this manual, maintaining the format. (The automatic helpfile generator notices things like capital letters, tabs, hyphens, and equal signs at the beginnings of lines.) The program makehelp.c may require modification because a few of the primitive names are special cases (e.g., LOG10 is the only name with digits included). If you don't have Unix tools, you can just translate each helpfile individually. A period in a primitive name is represented as a D in the filename; there are no files for question marks because the HELP command looks for the file named after the corresponding primitive that ends in P. ucblogo-6.1/term.c0000664000175000017500000001555413575571772012262 0ustar jjcjjc/* * term.c terminal cursor control dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "logo.h" #include "globals.h" #ifdef HAVE_UNISTD_H #include #endif #ifdef mac #include #endif #ifdef HAVE_TERMIO_H #ifdef HAVE_WX #include #else #include #endif #else #ifdef HAVE_SGTTY_H #include #endif #endif #undef TRUE #undef FALSE #ifdef HAVE_TERMCAP_H #include #ifdef HAVE_SGTTY_H #include #endif #else #ifdef HAVE_TERMLIB_H #include #else #ifdef HAVE_CURSES_H #include #endif #endif #endif #undef TRUE #undef FALSE #define FALSE 0 #define TRUE 1 int x_coord, y_coord, x_max, y_max; char PC; char *BC; char *UP; /* short ospeed; */ char bp[1024]; char cl_arr[40]; char cm_arr[40]; char so_arr[40]; char se_arr[40]; #ifdef HAVE_TERMIO_H struct termio tty_cooked, tty_cbreak; #else #ifdef HAVE_SGTTY_H struct sgttyb tty_cooked, tty_cbreak; #endif #endif int interactive, tty_charmode; extern char **environ, *tgoto(), *tgetstr(); char *termcap_ptr; int termcap_putter(char ch) { *termcap_ptr++ = ch; return 0; } #ifdef unix void termcap_getter(char *cap, char *buf) { char temp[40]; char *str; char *temp_ptr = temp; termcap_ptr = buf; str=tgetstr(cap,&temp_ptr); /* if (str == NULL) str = temp; */ tputs(str,1,termcap_putter); } #endif void term_init(void) { #ifdef unix char *emacs; /* emacs change */ int term_sg; int tgetent_result; #endif #ifdef WIN32 interactive = 1; #else interactive = isatty(0); #endif #ifdef mac term_init_mac(); return; #else #ifdef ibm #ifndef WIN32 term_init_ibm(); #endif /* WIN32 */ #else if (interactive) { #ifdef HAVE_TERMIO_H ioctl(0,TCGETA,(char *)(&tty_cooked)); tty_cbreak = tty_cooked; tty_cbreak.c_cc[VMIN] = '\01'; tty_cbreak.c_cc[VTIME] = '\0'; tty_cbreak.c_lflag &= ~(ECHO|ICANON); #else ioctl(0,TIOCGETP,(char *)(&tty_cooked)); tty_cbreak = tty_cooked; tty_cbreak.sg_flags |= CBREAK; tty_cbreak.sg_flags &= ~ECHO; #endif } tty_charmode = 0; /* The following section assumes * x_max, y_max, cm_arr, cl_arr, so_arr, se_arr * are preinitialized to 0 */ /* query terminal information from termcap database, if available */ tgetent_result = tgetent(bp, getenv("TERM")); if (tgetent_result == 1) { x_max = tgetnum("co"); y_max = tgetnum("li"); term_sg = tgetnum("sg"); x_coord = y_coord = 0; termcap_getter("cm", cm_arr); termcap_getter("cl", cl_arr); if (term_sg <= 0) { termcap_getter("so", so_arr); termcap_getter("se", se_arr); } else { /* no standout modes */ so_arr[0] = se_arr[0] = '\0'; } } /* emacs detection */ emacs = getenv("EMACS"); if (emacs && *emacs == 't') { /* started from emacs */ emacs = getenv("EMACS"); emacs = getenv("COLUMNS"); if (!emacs) x_max = 0; else x_max = atoi(emacs); emacs = getenv("LINES"); if (!emacs) y_max = 0; else y_max = atoi(emacs); } /* end emacs detection */ /* if we still don't know our size, set some defaults */ if (x_max <= 0) x_max = 80; if (y_max <= 0) y_max = 24; #endif #endif } void charmode_on() { #ifdef unix if ((readstream == stdin) && interactive && !tty_charmode) { #ifdef HAVE_TERMIO_H ioctl(0,TCSETA,(char *)(&tty_cbreak)); #else /* !HAVE_TERMIO_H */ ioctl(0,TIOCSETP,(char *)(&tty_cbreak)); #endif /* HAVE_TERMIO_H */ tty_charmode++; } #endif /* unix */ #ifdef WIN32 win32_charmode_on(); #endif } void charmode_off() { #ifdef unix if (tty_charmode) { #ifdef HAVE_TERMIO_H ioctl(0,TCSETA,(char *)(&tty_cooked)); #else /* !HAVE_TERMIO_H */ ioctl(0,TIOCSETP,(char *)(&tty_cooked)); #endif /* HAVE_TERMIO_H */ tty_charmode = 0; } #endif /* unix */ #ifdef WIN32 win32_charmode_off(); #endif } NODE *lcleartext(NODE *args) { #ifdef mac cgotoxy(x_margin + 1, y_margin + 1, stdout); ccleos(stdout); #else #ifdef ibm #ifndef WIN32 /* sowings */ ibm_clear_text(); ibm_gotoxy(x_margin, y_margin); #else /* WIN32 */ win32_clear_text(); #endif /* WIN32 || !Win32 */ #else /* !ibm */ printf("%s", cl_arr); printf("%s", tgoto(cm_arr, x_margin, y_margin)); #endif /* ibm */ #endif /* mac */ #ifdef WIN32 win32_update_text(); #else fflush(stdout); /* do it now! */ #endif fix_turtle_shownness(); #if defined(__RZTC__) zflush(); #endif x_coord = x_margin; y_coord = y_margin; return(UNBOUND); } NODE *lcursor(NODE *args) { return(cons(make_intnode((FIXNUM)(x_coord-x_margin)), cons(make_intnode((FIXNUM)(y_coord-y_margin)), NIL))); } NODE *lsetcursor(NODE *args) { fix_turtle_shownness(); #ifdef WIN32 return (win32_lsetcursor(args)); #else /* !win32 */ NODE *arg; arg = pos_int_vector_arg(args); if (NOT_THROWING) { x_coord = x_margin + getint(car(arg)); y_coord = y_margin + getint(cadr(arg)); while ((x_coord >= x_max || y_coord >= y_max) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); if (NOT_THROWING) { arg = pos_int_vector_arg(args); x_coord = x_margin + getint(car(arg)); y_coord = y_margin + getint(cadr(arg)); } } } if (NOT_THROWING) { #ifdef mac mac_gotoxy(x_coord, y_coord); #else #ifdef ibm ibm_gotoxy(x_coord, y_coord); #else printf("%s", tgoto(cm_arr, x_coord, y_coord)); #endif #endif fflush(stdout); #ifdef __RZTC__ zflush(); #endif } return(UNBOUND); #endif /* !win32 (for non-windows version of this code) */ } NODE *lsetmargins(NODE *args) { NODE *arg; arg = pos_int_vector_arg(args); if (NOT_THROWING) { x_margin = getint(car(arg)); y_margin = getint(cadr(arg)); lcleartext(NIL); } return(UNBOUND); } NODE *lstandout(NODE *args) { char textbuf[300]; char fmtbuf[100]; char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; sprintf(fmtbuf,"%s%%p%s",so_arr,se_arr); print_stringptr = textbuf; print_stringlen = 300; ndprintf((FILE *)NULL,fmtbuf,car(args)); *print_stringptr = '\0'; print_stringptr = old_stringptr; print_stringlen = old_stringlen; return(make_strnode(textbuf,NULL,(int)strlen(textbuf),STRING,strnzcpy)); } ucblogo-6.1/print.c0000664000175000017500000002365013575571772012443 0ustar jjcjjc/* * print.c logo printing module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "logo.h" #include "globals.h" #include int print_stringlen; char *print_stringptr; int force_printwidth = -1, force_printdepth = -1; int x_margin=0, y_margin=0; void real_print_node(FILE *, NODE *, int, int); #ifdef mac BOOLEAN boldmode = 0; #endif void update_coords(char ch) { int i; #ifdef ibm #if !defined(__RZTC__) && !defined(_MSC_VER) && !defined(WIN32) check_scroll(); #endif #endif #ifdef HAVE_WX int getTermInfo(int type); #if 0 int setTermInfo(int type, int val); int x_coord, y_coord, x_max, y_max; x_coord=getTermInfo(X_COORD); y_coord=getTermInfo(Y_COORD); x_max=getTermInfo(X_MAX); y_max=getTermInfo(Y_MAX); if (ch == '\n') { x_coord = 0; y_coord++; setTermInfo(X_COORD,x_coord); setTermInfo(Y_COORD,y_coord); for (i = 0; i < x_margin; i++) print_char(stdout,' '); x_coord=getTermInfo(X_COORD); y_coord=getTermInfo(Y_COORD); } else if (ch == '\b') { if (x_coord > 0) --x_coord; } else if (ch == '\t') { x_coord &= ~07; x_coord += 8; } else if (ch != '\007') x_coord++; if (x_coord > x_max && x_max > 0) { y_coord += x_coord/x_max; x_coord %= x_max; } if (y_coord > y_max) y_coord = y_max; setTermInfo(X_COORD,x_coord); setTermInfo(Y_COORD,y_coord); #endif #else if (ch == '\n') { x_coord = 0; y_coord++; for (i = 0; i < x_margin; i++) print_char(stdout,' '); } else if (ch == '\b') { if (x_coord > 0) --x_coord; } else if (ch == '\t') { x_coord &= ~07; x_coord += 8; #ifdef WIN32 } else if (ch == '\1' || ch == '\2') { #endif } else if (ch != '\007') x_coord++; if (x_coord > x_max) { y_coord += x_coord/x_max; x_coord %= x_max; } if (y_coord > y_max) y_coord = y_max; #endif } void print_char(FILE *strm, char ch) { if (strm != NULL) { if (interactive && strm==stdout) { #ifdef mac if (boldmode) { if (ch == '\2') boldmode = 0; else ch = ch | 0200; /* Not so good in Europe */ } else if (ch == '\1') boldmode = 1; #endif #ifdef ibm if (ch == '\1') ibm_bold_mode(); if (ch == '\2') ibm_plain_mode(); #if defined(__RZTC__) && !defined(WIN32) /* sowings */ ztc_put_char(ch); #elif defined(TURBO_C) if (in_graphics_mode && ibm_screen_top == 0) lsplitscreen(); if (ch == '\n' || in_graphics_mode) rd_putc(ch, strm); else if (ch != '\1' && ch != '\2') rd_putc(ch, stdout); /* takes advantage of bold attribute */ #else /* WIN32 */ if (ch != '\1' && ch != '\2') rd_putc(ch, strm); #endif /* ibm */ #else /* Unix */ rd_putc(ch, strm); #endif } else /* printing to stream but not screen */ rd_putc(ch, strm); if (strm == stdout) { if (dribblestream != NULL) rd_putc(ch, dribblestream); update_coords(ch); } } else { /* printing to string */ if (--print_stringlen > 0) *print_stringptr++ = ch; } } void print_space(FILE *strm) { print_char(strm,' '); } /*VARARGS2*/ void ndprintf(FILE *strm, char *fmt, ...) { va_list ap; NODE *nd, *ahead_node = UNBOUND, *next_ahead_node = UNBOUND; char *cp; long int i; char buf[30],ch; va_start(ap,fmt); while ((ch = *fmt++) != '\0') { if (ch == '%') { ahead_node = next_ahead_node; next_ahead_node = UNBOUND; ch = *fmt++; if (ch == '+') { /* swap arg order in error message */ next_ahead_node = va_arg(ap,NODE *); ch = *fmt++; } if (ch == 's') { /* show */ if (ahead_node != UNBOUND) { nd = ahead_node; ahead_node = UNBOUND; } else nd = va_arg(ap,NODE *); print_node(strm, nd); } else if (ch == 'p') { /* print */ if (ahead_node != UNBOUND) { nd = ahead_node; ahead_node = UNBOUND; } else nd = va_arg(ap,NODE *); if (is_list(nd)) print_help(strm,nd); else print_node(strm,nd); } else if (ch == 't') { /* text */ cp = va_arg(ap,char *); while ((ch = *cp++) != '\0') print_char(strm,ch); } else if (ch == 'd') { /* integer */ i = va_arg(ap, int); sprintf(buf,"%ld",i); cp = buf; while ((ch = *cp++) != '\0') print_char(strm,ch); } else { print_char(strm,'%'); print_char(strm,ch); } } else if (ch == '\\') { ch = *fmt++; if (ch == 'n') { print_char(strm, '\n'); } else { print_char(strm, '\\'); print_char(strm, ch); } } else print_char(strm,ch); } /* if (!strm) print_char(strm,'\0'); */ if (!strm) *print_stringptr = '\0'; va_end(ap); force_printwidth = force_printdepth = -1; } void dbprint(NODE *data) { ndprintf(stderr, "%p\n", data); } void real_print_help(FILE *strm, NODE *ndlist, int depth, int width) { NODE *arg = NIL; int wid = width; while (ndlist != NIL) { if (!is_list(ndlist)) { ndprintf(strm, " . %s", ndlist); return; } arg = car(ndlist); ndlist = cdr(ndlist); if (check_throwing) break; real_print_node(strm, arg, depth, width); if (ndlist != NIL) { print_space(strm); if (--wid == 0) { ndprintf(strm, "..."); break; } } } } void real_print_node(FILE *strm, NODE *nd, int depth, int width) { int i; char *cp; NODETYPES ndty; BOOLEAN print_backslashes = (varTrue(Fullprintp)); if (depth == 0) { ndprintf(strm, "..."); return; } if (nd == NIL) { print_char(strm,'['); print_char(strm,']'); } else if (nd == UNBOUND) { ndprintf(strm, "%s", theName(Name_nothing)); } else if ((unsigned int)nd < 200) { /* for debugging */ char num[] = "{small} "; sprintf(&num[7],"%d",nd); ndprintf(strm,num); } else if ((ndty = nodetype(nd)) & NT_PRIM) { ndprintf(strm, "PRIM"); } else if (ndty == CONT) { ndprintf(strm, "[ %s]", cons(make_intnode((FIXNUM)car(nd)), cdr(nd))); } else if (ndty & NT_LIST) { print_char(strm,'['); real_print_help(strm, nd, depth-1, width); print_char(strm,']'); } else if (ndty == ARRAY) { int i = 0, dim = getarrdim(nd), wid; NODE **pp = getarrptr(nd); if (width < 0) wid = dim; else wid = (dim > width ? width : dim); print_char(strm,'{'); while (i < wid) { real_print_node(strm,*pp++,depth-1,width); if (++i < dim) print_space(strm); } if (wid < dim) ndprintf(strm, "..."); print_char(strm,'}'); if (print_backslashes && (getarrorg(nd) != 1)) { char org[] = "@ "; sprintf(&org[1],"%d",getarrorg(nd)); ndprintf(strm,org); } } else if (ndty == QUOTE) { print_char(strm, '\"'); print_node(strm, car(nd)); } else if (ndty == COLON) { print_char(strm, ':'); print_node(strm, car(nd)); #ifdef OBJECTS } else if (ndty == OBJECT) { NODE *old_obj = current_object; NODE *printform; current_object = nd; /* printform = val_eval_driver(cons(theName(Name_representation), NIL)); */ printform = lrepresentation(NIL); current_object = old_obj; real_print_node(strm, printform, depth, width); #endif } else if (print_backslashes && (nd == Null_Word)) { ndprintf(strm, "||"); } else { int wid, dots=0; nd = cnv_node_to_strnode(nd); cp = getstrptr(nd); if (width < 0) wid = getstrlen(nd); else { wid = (width < 10 ? 10 : width); wid = (wid < getstrlen(nd) ? wid : getstrlen(nd)); } if (wid < getstrlen(nd)) dots++; if (!backslashed(nd)) for (i = 0; i < wid; i++) { print_char(strm,*cp++); } else if (print_backslashes == FALSE) { for (i = 0; i < wid; i++) { print_char(strm,clearparity(*cp++)); } } else { for (i = 0; i < wid; i++) { if (getparity(cp[i])) break; } if (i < wid) { /* word was in vbars */ if (strchr("\":", *cp)) { print_char(strm, *cp++); wid--; } print_char(strm,'|'); for (i = 0; i < wid; i++) { print_char(strm,clearparity(*cp++)); } print_char(strm,'|'); } else for (i = 0; i < wid; i++) { if (strchr(special_chars,(int)*cp)) { print_char(strm,'\\'); } print_char(strm,*cp++); } }; if (dots) ndprintf(strm, "..."); } } int find_limit(NODE *nd, int forced) { int val = -1; if (forced >= 0) return forced; if (nd == NIL) return(-1); nd = cnv_node_to_numnode(valnode__caseobj(nd)); if (nodetype(nd) == INT) val = getint(nd); return(val); } void print_help(FILE *strm, NODE *nd) { real_print_help(strm, nd, find_limit(Printdepthlimit, force_printdepth), find_limit(Printwidthlimit, force_printwidth)); } void print_node(FILE *strm, NODE *nd) { real_print_node(strm, nd, find_limit(Printdepthlimit, force_printdepth), find_limit(Printwidthlimit, force_printwidth)); } void print_nobrak(FILE *strm, NODE *nd) { if (is_list(nd)) print_help(strm, nd); else print_node(strm, nd); } void new_line(FILE *strm) { print_char(strm,'\n'); } NODE *lshow(NODE *args) { print_help(writestream, args); new_line(writestream); return(UNBOUND); } void type_help(NODE *args, int sp) { NODE *arg = NIL; while (args != NIL) { arg = car(args); args = cdr(args); if (is_list(arg)) print_help(writestream, arg); else print_node(writestream, arg); if (sp && (args != NIL)) { print_space(writestream); } } } NODE *ltype(NODE *args) { type_help(args,0); return(UNBOUND); } NODE *lprint(NODE *args) { type_help(args,1); new_line(writestream); return(UNBOUND); } ucblogo-6.1/parse.c0000664000175000017500000004462613575571772012427 0ustar jjcjjc/* * parse.c logo parser module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifdef HAVE_WX #ifdef WIN32 #define NEW_WIN32 #endif #undef WIN32 #endif #ifdef WIN32 #include #endif #include "logo.h" #include "globals.h" #ifdef HAVE_TERMIO_H #ifdef HAVE_WX #ifndef NEW_WIN32 #include #endif #else #include #endif #else #ifdef HAVE_SGTTY_H #include #endif #endif #include #ifdef ibm #ifndef _MSC_VER #include extern int getch(void); #endif /* _MSC_VER */ #endif #ifdef __RZTC__ #include #endif # ifdef HAVE_WX #ifdef getc #undef getc #endif #define getc getFromWX_2 #define getch getFromWX extern int check_wx_stop(int force_yield); extern void wx_enable_scrolling(); extern void wx_refresh(); #endif FILE *readstream; FILE *writestream; FILE *loadstream; FILE *dribblestream = NULL; int input_blocking = 0; NODE *deepend_proc_name = NIL; #if 0 char *cmdHistory[HIST_MAX] = {0}; char **hist_inptr, **hist_outptr; #endif int readingInstruction = 0; int rd_getc(FILE *strm) { int c; #ifdef WIN32 MSG msg; #endif #ifndef WIN32 /* skip this section ... */ #ifdef __RZTC__ if (strm == stdin) zflush(); c = ztc_getc(strm); #else c = getc(strm); #endif if (strm == stdin && c != EOF) update_coords(c); #ifndef mac if (c == '\r') return rd_getc(strm); #endif #ifdef ibm if (c == 17 && interactive && strm==stdin) { /* control-q */ to_pending = 0; err_logo(STOP_ERROR,NIL); if (input_blocking) { #ifdef SIG_TAKES_ARG logo_stop(0); #else logo_stop(); #endif } } if (c == 23 && interactive && strm==stdin) { /* control-w */ #ifndef __RZTC__ getc(strm); /* eat up the return */ #endif #ifdef SIG_TAKES_ARG logo_pause(0); #else logo_pause(); #endif return(rd_getc(strm)); } #endif #else /* WIN32 */ if (strm == stdin) { if (winPasteText && !line_avail) winDoPaste(); if (!line_avail) { win32_text_cursor(); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); if (line_avail) break; } } c = read_line[read_index++]; if (c == 17 && interactive && strm==stdin) { /* control-q */ to_pending = 0; err_logo(STOP_ERROR,NIL); line_avail = 0; free(read_line); if (input_blocking) logo_stop(0); return('\n'); } if (c == 23 && interactive && strm==stdin) { /* control-w */ line_avail = 0; free(read_line); logo_pause(0); return(rd_getc(strm)); } if (c == '\n') { line_avail = 0; free(read_line); } } else /* reading from a file */ c = getc(strm); #endif /* WIN32 */ #ifdef ecma return((c == EOF) ? c : ecma_clear(c)); #else return(c); #endif } void rd_print_prompt(char *str) { #ifdef ibm #if defined(__RZTC__) || defined(WIN32) if (in_graphics_mode && !in_splitscreen) #else #ifndef _MSC_VER if (in_graphics_mode && ibm_screen_top == 0) #endif /* _MSC_VER */ #endif lsplitscreen(NIL); #endif #ifdef HAVE_WX if(in_graphics_mode && !in_splitscreen) lsplitscreen(NIL); #endif #ifdef mac extern int in_fscreen(void); if (in_fscreen()) lsplitscreen(NIL); #endif ndprintf(stdout,"%t",str); #if defined(__RZTC__) && !defined(WIN32) /* sowings */ zflush(); #endif } #if defined(__RZTC__) && !defined(WIN32) /* sowings */ void zrd_print_prompt(char *str) { newline_bugfix(); rd_print_prompt(str); } #else #define zrd_print_prompt rd_print_prompt #endif #define into_line(chr) {if (phys_line >= p_end) { \ p_len += MAX_PHYS_LINE; \ p_pos = phys_line - p_line; \ p_line = realloc(p_line, p_len); \ p_end = &p_line[p_len-1]; \ phys_line = &p_line[p_pos]; \ } \ *phys_line++ = (chr);} char *p_line = 0, *p_end; int p_len = MAX_PHYS_LINE; char ender[100]; NODE *reader(FILE *strm, char *prompt) { int c = 0, dribbling, vbar = 0, paren = 0; int bracket = 0, brace = 0, p_pos, contin=1, insemi=0, raw=0; char *phys_line, *lookfor = ender; NODETYPES this_type = STRING; NODE *ret; char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; fix_turtle_shownness(); //readingInstruction = !strcmp(prompt, "? "); readingInstruction = (strm == stdin); #ifdef HAVE_WX wx_refresh(); if(readingInstruction) { wx_enable_scrolling(); } #endif print_stringptr = ender; print_stringlen = 99; ndprintf(NULL, "\n%p\n", theName(Name_end)); *print_stringptr = '\0'; print_stringptr = old_stringptr; print_stringlen = old_stringlen; if (!strcmp(prompt, "RW")) { /* called by readword */ prompt = ""; contin = 0; } if (!strcmp(prompt, "RAW")) { /* called by readrawline */ prompt = ""; contin = 0; raw = 1; } charmode_off(); #ifdef WIN32 dribbling = 0; #else dribbling = (dribblestream != NULL && strm == stdin); #endif if (p_line == 0) { p_line = malloc(MAX_PHYS_LINE); if (p_line == NULL) { err_logo(OUT_OF_MEM, NIL); return UNBOUND; } p_end = &p_line[MAX_PHYS_LINE-1]; } phys_line = p_line; if (strm == stdin && *prompt) { if (interactive) { rd_print_prompt(prompt); #ifdef WIN32 win32_update_text(); #endif } } if (strm == stdin) { input_blocking++; erract_errtype = FATAL; } #ifndef TIOCSTI if (!setjmp(iblk_buf)) { #endif c = rd_getc(strm); /* if ((c=='\b' || c=='\127') && strm==stdin && interactive) { silent_load(LogoLogo, logolib); c = rd_getc(strm); } */ /* 6.0 */ #ifdef mac if (c == '\r') c = '\n'; /* seen in raw mode by keyp, never read */ #endif while (c != EOF && (vbar || paren || bracket || brace || c != '\n') && NOT_THROWING) { if (dribbling) rd_putc(c, dribblestream); if (!raw && c == '\\' && (c = rd_getc(strm)) != EOF) { if (dribbling) rd_putc(c, dribblestream); c = setparity(c); this_type = BACKSLASH_STRING; if (c == setparity('\n') && strm == stdin) { if (interactive) zrd_print_prompt("\\ "); } } if (c != EOF) into_line(c); if (raw) { c = rd_getc(strm); continue; } if (*prompt && (c&0137) == ((*lookfor)&0137)) { lookfor++; if (*lookfor == 0) { if (deepend_proc_name != NIL) err_logo(DEEPEND, deepend_proc_name); else err_logo(DEEPEND_NONAME, NIL); break; } } else lookfor = ender; if (c == '|' && !insemi) { vbar = !vbar; this_type = VBAR_STRING; } else if (contin && !vbar && !insemi) { if (c == '(') paren++; else if (paren && c == ')') paren--; else if (c == '[') bracket++; else if (bracket && c == ']') bracket--; else if (c == '{') brace++; else if (brace && c == '}') brace--; else if (c == ';') insemi++; } if (this_type == STRING && strchr(special_chars, c)) this_type = VBAR_STRING; if (/* (vbar || paren ...) && */ c == '\n') { insemi = 0; if (strm == stdin) { if (interactive) zrd_print_prompt(vbar ? "| " : "~ "); } } while (!vbar && c == '~' && (c = rd_getc(strm)) != EOF) { int gotspc = 0; while (c == ' ' || c == '\t') { gotspc = 1; c = rd_getc(strm); } if (dribbling) rd_putc(c, dribblestream); if (c != '\n' && gotspc) into_line(' '); into_line(c); if (c == '\n') { insemi = 0; if (interactive && strm == stdin) zrd_print_prompt("~ "); } else if (c == '(') paren++; else if (paren && c == ')') paren--; else if (c == '[') bracket++; else if (bracket && c == ']') bracket--; else if (c == '{') brace++; else if (brace && c == '}') brace--; else if (c == ';') insemi++; } if (c != EOF) c = rd_getc(strm); } #ifndef TIOCSTI } #endif *phys_line = '\0'; input_blocking = 0; #if defined(__RZTC__) && !defined(WIN32) /* sowings */ fix_cursor(); if (interactive && strm == stdin) newline_bugfix(); #endif if (dribbling) rd_putc('\n', dribblestream); if (c == EOF && strm == stdin) { if (interactive) clearerr(stdin); rd_print_prompt("\n"); } if (phys_line == p_line) return(Null_Word); /* so emptyp works */ ret = make_strnode(p_line, (struct string_block *)NULL, (int)strlen(p_line), this_type, strnzcpy); #if 0 if (strm == stdin && !strcmp(prompt, "? ")){ char *histline = malloc(1+strlen(p_line)); strcpy(histline, p_line); *hist_inptr++ = histline; if (hist_inptr >= &cmdHistory[HIST_MAX]) { hist_inptr = cmdHistory; } if (*hist_inptr) { free(*hist_inptr); *hist_inptr = 0; } hist_outptr = hist_inptr; } #endif //added (evan) readingInstruction = 0; return(ret); } NODE *list_to_array(NODE *list) { NODE *np = list, *result; FIXNUM len = 0, i; for (; np; np = cdr(np)) len++; result = make_array(len); setarrorg(result,1); for (i = 0, np = list; np; np = cdr(np)) (getarrptr(result))[i++] = car(np); return(result); } #define parens(ch) (ch == '(' || ch == ')' || ch == ';') #define infixs(ch) (ch == '*' || ch == '/' || ch == '+' || ch == '-' || ch == '=' || ch == '<' || ch == '>') #define white_space(ch) (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\0') NODE *parser_iterate(char **inln, char *inlimit, struct string_block *inhead, BOOLEAN semi, int endchar) { char ch, *wptr = NULL; static char terminate = '\0'; /* KLUDGE */ NODE *outline = NIL, *lastnode = NIL, *tnode = NIL; int windex = 0, vbar = 0; NODETYPES this_type = STRING; BOOLEAN broken = FALSE; do { /* get the current character and increase pointer */ ch = **inln; if (!vbar && windex == 0) wptr = *inln; if (++(*inln) >= inlimit) *inln = &terminate; /* skip through comments and line continuations */ while (!vbar && ((semi && ch == ';') || #ifdef WIN32 (ch == '~' && (**inln == 012 || **inln == 015)))) { while (ch == '~' && (**inln == 012 || **inln == 015)) { #else (ch == '~' && **inln == '\n'))) { while (ch == '~' && **inln == '\n') { #endif if (++(*inln) >= inlimit) *inln = &terminate; ch = **inln; if (windex == 0) wptr = *inln; else { if (**inln == ']' || **inln == '[' || **inln == '{' || **inln == '}') { ch = ' '; break; } else { broken = TRUE; } } if (++(*inln) >= inlimit) *inln = &terminate; } if (semi && ch == ';') { #ifdef WIN32 if (**inln != 012 && **inln != 015) #else if (**inln != '\n') #endif do { ch = **inln; if (windex == 0) wptr = *inln; else broken = TRUE; if (++(*inln) >= inlimit) *inln = &terminate; } #ifdef WIN32 while (ch != '\0' && ch != '~' && **inln != 012 && **inln != 015); #else /* !Win32 */ while (ch != '\0' && ch != '~' && **inln != '\n'); #endif if (ch != '\0' && ch != '~') ch = '\n'; } } /* flag that this word will be of BACKSLASH_STRING type */ if (getparity(ch)) this_type = BACKSLASH_STRING; if (ch == '|') { vbar = !vbar; this_type = VBAR_STRING; broken = TRUE; /* so we'll copy the chars */ } else if (vbar || (!white_space(ch) && ch != ']' && ch != '{' && ch != '}' && ch != '[')) windex++; if (vbar) continue; else if (ch == endchar) break; else if (ch == ']') err_logo(UNEXPECTED_BRACKET, NIL); else if (ch == '}') err_logo(UNEXPECTED_BRACE, NIL); /* if this is a '[', parse a new list */ else if (ch == '[') { tnode = cons(parser_iterate(inln,inlimit,inhead,semi,']'), NIL); if (**inln == '\0') ch = '\0'; } else if (ch == '{') { tnode = cons(list_to_array (parser_iterate(inln,inlimit,inhead,semi,'}')), NIL); if (**inln == '@') { int i = 0, sign = 1; (*inln)++; if (**inln == '-') { sign = -1; (*inln)++; } while ((ch = **inln) >= '0' && ch <= '9') { i = (i*10) + ch - '0'; (*inln)++; } setarrorg(car(tnode),sign*i); } if (**inln == '\0') ch = '\0'; } /* if this character or the next one will terminate string, make the word */ else if (white_space(ch) || **inln == ']' || **inln == '[' || **inln == '{' || **inln == '}') { if (windex > 0 || this_type == VBAR_STRING) { if (broken == FALSE) tnode = cons(make_strnode(wptr, inhead, windex, this_type, strnzcpy), NIL); else { tnode = cons(make_strnode(wptr, (struct string_block *)NULL, windex, this_type, (semi ? mend_strnzcpy : mend_nosemi)), NIL); broken = FALSE; } this_type = STRING; windex = 0; } } /* put the word onto the end of the return list */ if (tnode != NIL) { if (outline == NIL) outline = tnode; else setcdr(lastnode, tnode); lastnode = tnode; tnode = NIL; } } while (ch); return(outline); } NODE *parser(NODE *nd, BOOLEAN semi) { NODE *rtn; int slen; char *lnsav; rtn = cnv_node_to_strnode(nd); slen = getstrlen(rtn); lnsav = getstrptr(rtn); rtn = parser_iterate(&lnsav,lnsav + slen,getstrhead(rtn),semi,-1); return(rtn); } NODE *lparse(NODE *args) { NODE *arg, *val = UNBOUND; arg = string_arg(args); if (NOT_THROWING) { val = parser(arg, FALSE); } return(val); } NODE *runparse_node(NODE *nd, NODE **ndsptr) { NODE *outline = NIL, *tnode = NIL, *lastnode = NIL, *snd; char *wptr, *tptr; struct string_block *whead; int wlen, wcnt, tcnt, isnumb, gotdot; NODETYPES wtyp; BOOLEAN monadic_minus = FALSE; if (nd == Minus_Tight) return cons(nd, NIL); snd = cnv_node_to_strnode(nd); wptr = getstrptr(snd); wlen = getstrlen(snd); wtyp = nodetype(snd); wcnt = 0; whead = getstrhead(snd); while (wcnt < wlen) { if (*wptr == ';') { *ndsptr = NIL; break; } if (*wptr == '"') { tcnt = 0; tptr = ++wptr; wcnt++; while (wcnt < wlen && !parens(*wptr)) { if (wtyp == BACKSLASH_STRING && getparity(*wptr)) wtyp = PUNBOUND; /* flag for "\( case */ wptr++, wcnt++, tcnt++; } if (wtyp == PUNBOUND) { wtyp = BACKSLASH_STRING; tnode = cons(make_quote(intern(make_strnode(tptr, NULL, tcnt, wtyp, noparity_strnzcpy))), NIL); } else tnode = cons(make_quote(intern(make_strnode(tptr, whead, tcnt, wtyp, strnzcpy))), NIL); } else if (*wptr == ':') { tcnt = 0; tptr = ++wptr; wcnt++; while (wcnt < wlen && !parens(*wptr) && !infixs(*wptr)) wptr++, wcnt++, tcnt++; tnode = cons(make_colon(intern(make_strnode(tptr, whead, tcnt, wtyp, strnzcpy))), NIL); } else if (wcnt == 0 && *wptr == '-' && monadic_minus == FALSE && wcnt+1 < wlen && !white_space(*(wptr+1))) { /* minus sign with space before and no space after is unary */ tnode = cons(make_intnode((FIXNUM)0), NIL); monadic_minus = TRUE; } else if (parens(*wptr) || infixs(*wptr)) { if (monadic_minus) tnode = cons(Minus_Tight, NIL); else if (wcnt+1 < wlen && ((*wptr == '<' && (*(wptr+1) == '=' || *(wptr+1) == '>')) || (*wptr == '>' && *(wptr+1) == '='))) { tnode = cons(intern(make_strnode(wptr, whead, 2, STRING, strnzcpy)), NIL); wptr++, wcnt++; } else tnode = cons(intern(make_strnode(wptr, whead, 1, STRING, strnzcpy)), NIL); monadic_minus = FALSE; wptr++, wcnt++; } else { tcnt = 0; tptr = wptr; /* isnumb 4 means nothing yet; * 0 means digits so far, 1 means just saw * 'e' so minus can be next, 2 means no longer * eligible even if an 'e' comes along */ isnumb = 4; gotdot = 0; if (*wptr == '?') { isnumb = 3; /* turn ?5 to (? 5) */ wptr++, wcnt++, tcnt++; } while (wcnt < wlen && !parens(*wptr) && (!infixs(*wptr) || (isnumb == 1 && (*wptr == '-' || *wptr == '+')))) { if (isnumb == 4 && isdigit(*wptr)) isnumb = 0; if (isnumb == 0 && tcnt > 0 && (*wptr == 'e' || *wptr == 'E')) isnumb = 1; else if (!(isdigit(*wptr) || (!gotdot && *wptr == '.')) || isnumb == 1) isnumb = 2; if (*wptr == '.') gotdot++; wptr++, wcnt++, tcnt++; } if (isnumb == 3 && tcnt > 1) { /* ?5 syntax */ NODE *qmtnode; qmtnode = cons_list(0, Left_Paren, Query, cnv_node_to_numnode (make_strnode(tptr+1, whead, tcnt-1, wtyp, strnzcpy)), END_OF_LIST); if (outline == NIL) { outline = qmtnode; } else { setcdr(lastnode, qmtnode); } lastnode = cddr(qmtnode); tnode = cons(Right_Paren, NIL); } else if (isnumb < 2 && tcnt > 0) { tnode = cons(cnv_node_to_numnode(make_strnode(tptr, whead, tcnt, wtyp, strnzcpy)), NIL); } else tnode = cons(intern(make_strnode(tptr, whead, tcnt, wtyp, strnzcpy)), NIL); } if (outline == NIL) outline = tnode; else setcdr(lastnode, tnode); lastnode = tnode; } return(outline); } NODE *runparse(NODE *ndlist) { NODE *curnd = NIL, *outline = NIL, *tnode = NIL, *lastnode = NIL; char *str; if (nodetype(ndlist) == RUN_PARSE) return parsed__runparse(ndlist); if (!is_list(ndlist)) { err_logo(BAD_DATA_UNREC, ndlist); return(NIL); } if (ndlist != NIL && is_word(curnd=car(ndlist)) && getstrlen(curnd) >= 2 && (str=getstrptr(curnd)) && *str++ == '#' && *str == '!') return NIL; /* shell-script #! treated as comment line */ while (ndlist != NIL) { curnd = car(ndlist); ndlist = cdr(ndlist); if (!is_word(curnd)) tnode = cons(curnd, NIL); else { if (!numberp(curnd)) tnode = runparse_node(curnd, &ndlist); else tnode = cons(cnv_node_to_numnode(curnd), NIL); } if (tnode != NIL) { if (outline == NIL) outline = tnode; else setcdr(lastnode, tnode); lastnode = tnode; while (cdr(lastnode) != NIL) { lastnode = cdr(lastnode); if (check_throwing) break; } } if (check_throwing) break; } return(outline); } NODE *lrunparse(NODE *args) { NODE *arg; arg = car(args); while (nodetype(arg) == ARRAY && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); } if (NOT_THROWING && !aggregate(arg)) arg = parser(arg, TRUE); if (NOT_THROWING) return runparse(arg); return UNBOUND; } ucblogo-6.1/paren.c0000664000175000017500000003126413575571772012414 0ustar jjcjjc/* * paren.c logo parenthesizing module dko * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #define WANT_EVAL_REGS 1 #include "logo.h" #include "globals.h" #include #ifdef OBJECTS #undef procnode__caseobj #define procnode__caseobj procValue #endif NODE *the_generation; void check_library(NODE *first) { if (procnode__caseobj(first) == UNDEFINED && NOT_THROWING && first != Null_Word) silent_load(first, NULL); /* try ./.lg */ if (procnode__caseobj(first) == UNDEFINED && NOT_THROWING && first != Null_Word){ silent_load(first, logolib); /* try / */ } } /* Set the line pointer for a tree. */ void make_line(NODE *tree, NODE *line) { setobject(tree, line); settype(tree, LINE); } void untreeify(NODE *node) { if (node==NIL) return; settreepair__tree(node, NIL); settype(node, CONS); } void untreeify_line(NODE *line) { if (line != NIL && is_list(line)) { untreeify_line(car(line)); untreeify_line(cdr(line)); untreeify(line); } } void untreeify_body(NODE *body) { NODE *body_ptr; for (body_ptr = body; body_ptr != NIL; body_ptr = cdr(body_ptr)) { untreeify_line(car(body_ptr)); } untreeify(body); } void untreeify_proc(NODE *tproc) { untreeify_body(bodylist__procnode(tproc)); } /* Treeify a body by appending the trees of the lines. */ void make_tree_from_body(NODE *body) { NODE *body_ptr, *end_ptr = NIL, *tree = NIL; if (body == NIL || (is_tree(body) && generation__tree(body) == the_generation)) return; if (is_tree(body)) untreeify_body(body); for (body_ptr = body; body_ptr != NIL; body_ptr = cdr(body_ptr)) { tree = car(body_ptr); if (tree == NIL) continue; /* skip blank line */ this_line = tree; make_tree(tree); if (is_tree(tree)) { tree = tree__tree(tree); make_line(tree, car(body_ptr)); if (end_ptr == NIL) settree__tree(body, tree); else setcdr(end_ptr, tree); if (generation__tree(car(body_ptr)) == UNBOUND) setgeneration__tree(body, UNBOUND); /* untreeify(car(body_ptr)); */ while (cdr(tree) != NIL) tree = cdr(tree); end_ptr = tree; } else { /* error while treeifying */ untreeify(body); return; } } settype(body, TREE); } NODE *tree_dk_how; /* Treeify a list of tokens (runparsed or not). */ void make_tree(NODE *list) { NODE *tree = NIL; NODE *paren_line(NODE *); if (list == NIL || (is_tree(list) && generation__tree(list) == the_generation)) return; if (!runparsed(list)) make_runparse(list); tree_dk_how = NIL; tree = paren_line(parsed__runparse(list)); if (tree != NIL && tree != UNBOUND) { settype(list, TREE); settree__tree(list, tree); if (tree_dk_how != NIL || stopping_flag==THROWING) setgeneration__tree(list, UNBOUND); } } NODE *gather_args(NODE *, NODE *, NODE **, BOOLEAN, NODE **); NODE *paren_infix(NODE *, NODE **, int, BOOLEAN); NODE *gather_some_args(int, int, NODE **, BOOLEAN, NODE **); /* Fully parenthesize a complete line, i.e. transform it from a flat list * to a tree. */ NODE *paren_line(NODE *line) { NODE *retval = NIL; NODE *paren_expr(NODE **expr, BOOLEAN inparen); NODE *paren_infix(NODE *left, NODE **rest, int old_pri, BOOLEAN inparen); if (line == NIL) return line; retval = paren_expr(&line, FALSE); if (NOT_THROWING && retval != UNBOUND) { retval = paren_infix(retval, &line, -1, FALSE); retval = cons(retval, paren_line(line)); } return retval; } /* See if an unknown procedure name starts with SET */ int is_setter(NODE *name) { NODE *string = cnv_node_to_strnode(name); if (getstrlen(string) < 4) return FALSE; // check to see if name begins with "set" return !low_strncmp(getstrptr(string), "set", 3); } #ifdef OBJECTS /* See if procedure name starts with Usual this is used in OOP to explicitly call a parents methods, Usual.Foo */ int is_usual(NODE *name) { NODE *string = cnv_node_to_strnode(name); // first rule out all words shorter than 8 chars if (getstrlen(string) < 8) return FALSE; // check to see if name begins with "usual." return !low_strncmp(getstrptr(string), "usual.", 6); } #endif // OBJECTS /* Check for FD100, give warning, insert space FD100 is assumed to be a typo, that is, we think the user meant FD 100, not FD100 */ NODE *missing_alphabetic, *missing_numeric; int missing_space(NODE *name) { NODE *str = strnode__caseobj(name); char *s = getstrptr(str); FIXNUM len = getstrlen(str); char *t; char ch; char alpha[100], numer[100]; int i; NODE *first; t = s+len-1; ch = *t; if (!isdigit(ch)) return 0; i = 1; while ((t>s) && (isdigit(*--t))) i++; if (t<=s) return 0; strncpy(numer,t+1,i); numer[i] = '\0'; strncpy(alpha,s,len-i); alpha[len-i] = '\0'; first = intern(make_strnode(alpha, 0, len-i, STRING, strnzcpy)); check_library(first); if (procnode__caseobj(first) == UNDEFINED) return 0; missing_alphabetic = first; missing_numeric = make_intnode(atoi(numer)); err_logo(MISSING_SPACE, cons_list(0, cons_list(0, missing_alphabetic, missing_numeric, END_OF_LIST), name, END_OF_LIST)); return 1; } /* Parenthesize an expression. Set expr to the node after the first full * expression. */ NODE *paren_expr(NODE **expr, BOOLEAN inparen) { NODE *first = NIL, *tree = NIL, *pproc, *retval; NODE **ifnode = (NODE **)NIL; // no expression given if (*expr == NIL) { // check if we are in a paren, if so error if (inparen) err_logo(PAREN_MISMATCH, NIL); return *expr; } // get the first element in the expression, // and pop if off the stack first = car(*expr); pop(*expr); if (nodetype(first) == CASEOBJ && !numberp(first)) { if (first == Left_Paren) { tree = paren_expr(expr, TRUE); tree = paren_infix(tree, expr, -1, TRUE); if (*expr == NIL) err_logo(PAREN_MISMATCH, NIL); else if (car(*expr) != Right_Paren) { /* throw the rest away */ int parens; for (parens = 0; *expr; pop(*expr)) { if (car(*expr) == Left_Paren) parens++; else if (car(*expr) == Right_Paren) if (parens-- == 0) { pop(*expr); break; } } first = tree /* car(tree) */ ; /* 6.0 */ tree = cons(Not_Enough_Node, NIL); /* tell eval */ tree_dk_how=UNBOUND; if (is_list(first)) first = car(first); if (nodetype(first) != CASEOBJ || procnode__caseobj(first) == UNDEFINED) err_logo(DK_HOW, first); else err_logo(TOO_MUCH, first); } else pop(*expr); retval = tree; } else if (first == Right_Paren) { err_logo(UNEXPECTED_PAREN, NIL); if (inparen) push(first, *expr); retval = NIL; } else if (first == Minus_Sign) { push(Minus_Tight, *expr); retval = paren_infix(make_intnode((FIXNUM) 0), expr, -1, inparen); } else { /* it must be a procedure */ check_library(first); pproc = procnode__caseobj(first); if (pproc == UNDEFINED) { if (missing_space(first)) { push(missing_numeric, *expr); first = missing_alphabetic; pproc = procnode__caseobj(first); retval = gather_args(first, pproc, expr, inparen, ifnode); if (retval != UNBOUND) { retval = cons(first, retval); } } else if (is_setter(first)) { retval = gather_some_args(0, 1, expr, inparen, ifnode); if (retval != UNBOUND) { retval = cons(first, retval); } #ifdef OBJECTS } else if (is_usual(first)) { // the proc starts with "usual.", so chop it off and // try to find the proc name after the dot NODE *name = cnv_node_to_strnode(first); proc = getInheritedProc(make_strnode(getstrptr(name) + 6, getstrhead(name), getstrlen(name) - 6, nodetype(name), strnzcpy), current_object); retval = gather_some_args(minargs__procnode(proc), maxargs__procnode(proc), expr, inparen, ifnode); return cons(first, retval); #endif /* OBJECTS */ } else { retval = cons(first, NIL); tree_dk_how = first; } } else if (nodetype(pproc) == INFIX && NOT_THROWING) { err_logo(NOT_ENOUGH, first); retval = cons(first, NIL); } else { /* Kludge follows to turn IF to IFELSE sometimes. */ if (isName(first, Name_if)) { ifnode = &first; } retval = gather_args(first, pproc, expr, inparen, ifnode); if (retval != UNBOUND) { retval = cons(first, retval); } } } } else if (is_list(first)) { /* quoted list */ retval = make_quote(first); } else { return first; } return retval; } /* Gather the correct number of arguments to proc into a list. Set args to * immediately after the last arg. */ NODE *gather_args(NODE *newfun, NODE *pproc, NODE **args, BOOLEAN inparen, NODE **ifnode) { int min, max; NODE /* *oldfun, */ *result; if (nodetype(pproc) == CONS) { min = (inparen ? getint(minargs__procnode(pproc)) : getint(dfltargs__procnode(pproc))); max = (inparen ? getint(maxargs__procnode(pproc)) : getint(dfltargs__procnode(pproc))); } else { /* primitive */ min = (inparen ? getprimmin(pproc) : getprimdflt(pproc)); if (min < 0) { /* special form */ result = *args; *args = NIL; return result; /* oldfun = fun; fun = newfun; result = (*getprimfun(pproc))(*args); fun = oldfun; return result; */ } /* Kludge follows to allow EDIT and CO without input without paren */ if (getprimmin(pproc) == OK_NO_ARG) min = 0; max = (inparen ? getprimmax(pproc) : getprimdflt(pproc)); } return gather_some_args(min, max, args, inparen, ifnode); } /* Make a list of the next n expressions, where n is between min and max. * Set args to immediately after the last expression. */ NODE *gather_some_args(int min, int max, NODE **args, BOOLEAN inparen, NODE **ifnode) { NODE *paren_infix(NODE *left, NODE **rest, int old_pri, BOOLEAN inparen); if (*args == NIL || car(*args) == Right_Paren || (nodetype(car(*args)) == CASEOBJ && nodetype(procnode__caseobj(car(*args))) == INFIX)) { if (min > 0) return cons(Not_Enough_Node, NIL); } else if (max == 0) { if (ifnode != (NODE **)NIL && is_list(car(*args))) { /* if -> ifelse kludge */ NODE *retval; err_logo(IF_WARNING, NIL); *ifnode = theName(Name_ifelse); retval = paren_expr(args, FALSE); retval = paren_infix(retval, args, -1, inparen); return cons(retval, gather_some_args(min, max, args, inparen, (NODE **)NIL)); } } else { if (max < 0) max = 0; /* negative max means unlimited */ if (car(*args) != Right_Paren && (nodetype(car(*args)) != CASEOBJ || nodetype(procnode__caseobj(car(*args))) != INFIX)) { NODE *retval = paren_expr(args, FALSE); retval = paren_infix(retval, args, -1, inparen); return cons(retval, gather_some_args(min - 1, max - 1, args, inparen, ifnode)); } } return NIL; } /* Calculate the priority of a procedure. */ int priority(NODE *proc_obj) { NODE *pproc; if (proc_obj == Minus_Tight) return PREFIX_PRIORITY+4; if (nodetype(proc_obj) != CASEOBJ || (pproc = procnode__caseobj(proc_obj)) == UNDEFINED || nodetype(pproc) != INFIX) return 0; return getprimpri(pproc); } /* Parenthesize an infix expression. left_arg is the expression on the left * (already parenthesized), and rest is a pointer to the list starting with the * infix procedure, if it's there. Set rest to after the right end of the * infix expression. */ NODE *paren_infix(NODE *left_arg, NODE **rest, int old_pri, BOOLEAN inparen) { NODE *infix_proc, *retval; int pri; // check to make sure we really got an infix expression if (*rest == NIL || !(pri = priority(infix_proc = car(*rest))) || pri <= old_pri) return left_arg; pop(*rest); retval = paren_expr(rest, inparen); retval = paren_infix(retval, rest, pri, inparen); retval = cons_list(0,infix_proc, left_arg, retval, END_OF_LIST); return paren_infix(retval, rest, old_pri, inparen); } ucblogo-6.1/obj.c0000664000175000017500000005423413575571772012063 0ustar jjcjjc/* * obj.c logo object functions module scc * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "logo.h" #include "globals.h" #ifdef OBJECTS extern NODE *make_object(NODE *canonical, NODE *oproc, NODE *val, NODE *plist, NODE *casestrnd); NODE *logo_object, *current_object; NODE *name_arg(NODE *args); NODE *assoc(NODE *name, NODE *alist); FIXNUM gensymnum = 1; /* Creates new license plate for object */ NODE *newplate(void) { char buffer[20]; sprintf(buffer,"G%d", gensymnum++); return make_strnode(buffer, NULL, strlen(buffer), STRING, strnzcpy); return UNBOUND; } /* ----------------------------- OBJECT ADT ----------------------------- */ /* Looks for a variable in the specified object only. Is aware of the special case where the OOP Object is Logo, in which it looks up the variable in the global hash table. name: a caseobj node oop_obj: an OOP object node returns: a hashtable entry, or UNBOUND */ NODE* get_var(NODE* name, NODE* oop_obj) { if (oop_obj == logo_object) { NODE* result = object__caseobj(name); // only non-local values should be considered // as part of the Logo object return result; /* if (!flag__object(result, IS_LOCAL_VALUE) && flag__object(result, HAS_GLOBAL_VALUE)) { return result; }else{ return UNBOUND; } */ }else{ // search the variable list for the name NODE* val = assoc(name, getvars(oop_obj)); if(val == NIL){ return UNBOUND; }else{ return getobject(val); } } } NODE* get_varvalue(NODE* name, NODE* oop_obj){ NODE* binding = get_var(name, oop_obj); if (binding != UNBOUND) return valnode__object(binding); else return binding; } /* Create a new variable in the OOP object which entails creating a new hashtable entry and adding it to the var list for the OOP object. Like get_var, it is aware of the global Logo object, and will create the variable in the global hashtable. name: a caseobj node, or a string node (which will be interned) value: any node, or possibly UNBOUND oop_obj: an OOP object node returns: a newly created hashtable entry */ NODE* create_var(NODE* name, NODE* value, NODE* oop_obj) { // first intern the name, incase it's a string NODE *binding; NODE *sym = intern(name); if (oop_obj == logo_object){ // because this is a logo symbol, the hash // entry will have been created as part of // the intern() process, so we can look up // the entry right away binding = object__caseobj(sym); }else{ // now look up the caseobj in the OOP obj binding = get_var(sym, oop_obj); // if unbound, then bind it if (binding == UNBOUND) { NODE* lownd = make_strnode(getstrptr(strnode__caseobj(name)), (struct string_block *)NULL, getstrlen(strnode__caseobj(name)), STRING, noparitylow_strnzcpy); binding = make_object(lownd, UNDEFINED, value, NIL,name); setvars(oop_obj, cons(lownd, getvars(oop_obj))); setobject(getvars(oop_obj), binding); // can return early because the binding is created // and the value has been set, so there is nothing // more to do return binding; } } setflag__object(binding, HAS_GLOBAL_VALUE); // TODO: does this mean that values can never be explicitly // set to NIL? if (value){ // assertion: this should work for Logo or generic OOP object setvalnode__object(binding, value); } return binding; } /* Gets a procedure by name for a given object name: a caseobj node, the name of the procedure oop_obj: an OOP object node returns: either the procedure node or UNDEFINED */ NODE* get_proc(NODE* name, NODE* oop_obj){ if (oop_obj == logo_object){ return procnode__caseobj(name); }else{ // assoc returns a list spine pair, where the car // points to the proc's cannonical name and the // object points to the hash table entry, which // contains the proc-node internally NODE* proc = assoc(name, getprocs(oop_obj)); if (proc == NIL){ return UNDEFINED; }else{ return procnode__object(getobject(proc)); } } } NODE* set_proc(NODE* name, NODE* procnode, NODE* oop_obj){ if (oop_obj != logo_object) { NODE* lownd = make_strnode(getstrptr(strnode__caseobj(name)), (struct string_block *)NULL, getstrlen(strnode__caseobj(name)), STRING, noparitylow_strnzcpy); NODE* binding = make_object(lownd, procnode, UNBOUND, NIL,name); setprocs(oop_obj, cons(name, getprocs(oop_obj))); setobject(getprocs(oop_obj), binding); //procnode); return binding; }else{ setprocnode__caseobj(name, procnode); return object__caseobj(name); } } // ----------------------------- // /* Creates a new object */ NODE *newobj(void) { /* obj-upgrade: * this currently creates a new object with a linked list of * variables. the new object layout will create a linked list * of hash table entries instead, and the first entry will be * the licenseplate of the object. * * make_obj(can, proc, val, plist, casestrnd) can be used to * to create a new hashtable entry * the same binding code can be used, but it will * * Questions: * - Seems like parents should be uneffected, is this right? */ NODE *result = newnode(OBJECT); create_var(theName(Name_licenseplate), newplate(), result); //NODE *binding = newnode(CONS); //setcar(binding, theName(Name_licenseplate)); //setobject(binding, newplate()); //setvars(result, binding); return result; } /* Initializes Object Logo */ void obj_init(void) { // kludge: since logo_object is not set when newobj() is called // the license plate gets created in the object instead of // in the global hash table, so copy it over. The order // of the following 3 lines is very important! current_object = newobj(); NODE* logo_plate = get_varvalue(theName(Name_licenseplate), current_object); logo_object = current_object; // now copy over the license plate to the global hash-table create_var(theName(Name_licenseplate), logo_plate, logo_object); create_var(theName(Name_name), make_static_strnode("Logo"), logo_object); //setvars(logo_object, cons(theName(Name_name), getvars(logo_object))); //setobject(getvars(logo_object), make_static_strnode("Logo")); /* [[initlist] [exist output self]] */ askexist = cons(cons(theName(Name_initlist), NIL), cons(cons(theName(Name_exist), cons(theName(Name_output), cons(theName(Name_self), NIL))), NIL)); } /* Outputs the Logo object, ancestor of all other objects. * @params - none */ NODE *llogo(NODE *args) { return(logo_object); } /* Creates and outputs an object whose parent is the Logo object. * @params - none */ NODE *lsomething(NODE *args) { NODE *val; val = newobj(); setparents(val, cons(logo_object, NIL)); return val; } /* Creates and outputs an object, whose parent is Object, or whose parents * are Object1, Object2, etc., or the elements of ObjectList. * @params - Object or ObjectList or (Object1 Object2 etc.) */ NODE *lkindof(NODE *args) { NODE *argcopy = args; NODE *val = UNBOUND; if (is_list(car(args))) { if (cdr(args) != NIL) { err_logo(TOO_MUCH, NIL); /* too many inputs */ } args = car(args); } /* now args is always a list of objects */ /* make sure they're all really objects */ for (argcopy = args; (argcopy != NIL && NOT_THROWING); argcopy = cdr(argcopy)) { while (!is_object(car(argcopy)) && NOT_THROWING) { setcar(argcopy, err_logo(BAD_DATA, car(argcopy))); } } if (NOT_THROWING) { val = newobj(); setparents(val, args); } return val; } /* Creates an object whose parent is Object or whose parents are the elements * of ObjectList, Asks the new object to Exist, and then outputs the object. * Any remaining inputs after the first are collected into a list and made * the value of the public variable InitList, used to initialize the newly * created object. * @params - Object or ObjectList or (Object Input1 Input2 etc.) or * (ObjectList Input1 Input2 etc.) */ NODE *loneof(NODE *args) { NODE *val = UNBOUND, *argcopy; if (!is_list(car(args))) { setcar(args, cons(car(args), NIL)); } /* now the first arg is always a list of objects */ /* make sure they're really objects */ argcopy = car(args); while (argcopy != NIL && NOT_THROWING) { while (!is_object(car(argcopy)) && NOT_THROWING) { setcar(argcopy, err_logo(BAD_DATA, car(argcopy))); } argcopy = cdr(argcopy); } if (NOT_THROWING) { val = newobj(); setparents(val, car(args)); /* apply [[InitList] [Exist Output Self]] cdr(args) */ return make_cont(withobject_continuation, cons(val, make_cont(begin_apply, cons(askexist, cons(cons(cdr(args), NIL), NIL))))); } return val; } /* Each object will be given an Exist method by the user. * The global Exist does nothing at all. */ NODE *lexist(NODE *args) { return UNBOUND; } /* Creates the object variable named Symbol, or the object variables named , * SymbolList within the current object. * @params - Symbol or SymbolList */ NODE *lhave(NODE *args) { if (is_list(car(args))) { if (cdr(args) != NIL) { err_logo(TOO_MUCH, NIL); /* too many inputs */ } args = car(args); } /* now args is always a list of symbols. args should not equal to NIL because that is checked for before. */ while (args != NIL && NOT_THROWING) { NODE *sym = intern(car(args)); NODE *binding = get_var(sym, current_object); //NODE *binding = assoc(sym, getvars(current_object)); if (binding == UNBOUND) { binding = create_var(sym, UNBOUND, current_object); //setvars(current_object, cons(sym, getvars(current_object))); //setobject(getvars(current_object), UNBOUND); } args = cdr(args); } return UNBOUND; } /* USUAL.FOO has to be recognized in paren.c as a reference to the FOO method in the parent(s), provided we are in the body of FOO, so that we know how many inputs it takes. Then in eval.c we have to look for the parent(s)' FOO method. So there is no lusual() -- it's not a Logo primitive */ /* Changes to Object the object in which subsequent top level instruction will * be run until the next time TalkTo is run * @params - Object */ NODE *ltalkto(NODE *args) { while (!is_object(car(args)) && NOT_THROWING) setcar(args, err_logo(BAD_DATA, car(args))); if (NOT_THROWING) current_object = car(args); return UNBOUND; } /* Runs RunList, with Object as the current object for the duration of the * Ask. After RunList finishes, the current object reverts to what it was * before the Ask. * @params - Object RunList */ NODE *lask(NODE *args) { while (!is_object(car(args)) && NOT_THROWING) setcar(args, err_logo(BAD_DATA, car(args))); if (NOT_THROWING) { return make_cont(withobject_continuation, cons(car(args), make_cont(begin_seq, cadr(args)))); } return UNBOUND; } /* Outputs the current object (the object itself, not its name) * @params - none */ NODE *lself(NODE *args) { return current_object; } /* Outputs a list containing the parent(s) of the current Object. The Logo * Object has no parents. * @params - none */ NODE *lparents(NODE *args) { return getparents(current_object); } /* Outputs a list of the names of the object variables owned by (not * inherited by) the current object. * @params - none */ NODE *lmynames(NODE *args) { return getvars(current_object); } /* Outputs TRUE if Symbol is the name of an object variable owned by the * current object, FALSE otherwise. * @params - Symbol */ NODE *lmynamep(NODE *args) { NODE *arg; arg = name_arg(args); if (NOT_THROWING) { arg = intern(arg); return torf(get_var(arg, current_object) != UNBOUND); if (current_object == logo_object) { return torf(flag__caseobj(arg, HAS_GLOBAL_VALUE)); }else{ return torf(get_var(arg, current_object) != UNBOUND); //return torf(assoc(arg, getvars(current_object)) != NIL); } } return UNBOUND; } /* Outputs a list of the names of the procedures owned by (not inherited * by) the current object. * @params - none */ NODE *lmyprocs(NODE *args) { return getprocs(current_object); } /* Outputs TRUE if Symbol is the name of a procedure owned by the current * object, FALSE otherwise. * @params - Symbol */ NODE *lmyprocp(NODE *args) { NODE *arg; if (current_object == logo_object) return lprocedurep(args); /* return lprocp or just call it? */ else { arg = name_arg(args); if (NOT_THROWING) return torf(assoc(arg, getprocs(current_object)) != NIL); } return UNBOUND; } /* Outputs the object that owns the accessible variable named Symbol. If there * is no such accessible variable, or if it is not an object or global * variable, an error is signalled. * @params - Symbol */ /* to whosename :name if mynamep :name [output self] if equalp self Logo [(throw "error se [No accessible variable] :name)] output usual.whosename :name end */ NODE *lwhosename(NODE *args) { NODE *arg = name_arg(args); return varInThisObject(arg, TRUE); } /* Outputs the object that owns the accessible procedure named Symbol. If * there is no such accessible procedure, an error is signalled. * @params - Symbol */ /* to whoseproc :name if myprocp :name [output self] if equalp self Logo [(throw "error [No procedure named] :name)] output usual.whoseproc :name end */ /* Helper function */ NODE *assoc(NODE *name, NODE *alist) { while (alist != NIL) { if (compare_node(name, car(alist), TRUE) == 0) return alist; alist = cdr(alist); } return(NIL); } /* Looks up value in dynamic bindings and then in Object Hierarchy. If the * value is found in one place but not the other, then the value is * returned. Otherwise, an error is signalled. * @params - name */ NODE *varValue(NODE *name) { NODE *val; name = intern(name); val = varInObjectHierarchy(name, TRUE); //get_varvalue(name, current_object); //valnode__caseobj(name); if ((val != UNBOUND) && flag__caseobj(name, IS_LOCAL_VALUE)) { if (varInObjectHierarchy(name, FALSE) != (NODE *)(-1)) { err_logo(LOCAL_AND_OBJ, name); return UNBOUND; } // else { // return val; /* local binding */ //} } return val; //val = varInObjectHierarchy(name, TRUE); //return((val == (NODE *)(-1)) ? UNBOUND : val); } /* Returns the value associated with name, depends on if the logo_object is * included in the hierarchy or not. */ NODE *varInObjectHierarchy(NODE *name, BOOLEAN includeLogo) { NODE *result, *parentList; result = get_var(name, current_object); //result = assoc(name, getvars(current_object)); if (result != UNBOUND) { // i = includeLogo, c => cur = logo, result // i c, (i or !c) // 0 0, 1 don't include logo, c != logo // 0 1, 0 don't include logo, c = logo // 1 0, 1 include logo, c != logo wron // 1 1, 1 include logo, c = logo if (includeLogo || (current_object != logo_object)){ return valnode__object(result);}} for (parentList = parent_list(current_object); parentList != NIL; parentList = cdr(parentList)) { result = get_var(name, car(parentList)); if (result != UNBOUND){ if (includeLogo || (car(parentList) != logo_object)){ return valnode__object(result);}} } return (NODE *)(-1); /* if (!includeLogo) { return (NODE *)(-1); } result = intern(name); if (flag__caseobj(result, IS_LOCAL_VALUE)) { return (NODE *)(-1); } return valnode__caseobj(result); */ } /* Returns the object which contains the name, depends on if the * logo_object is included in the hierarchy or not. */ NODE *varInThisObject(NODE *name, BOOLEAN includeLogo) { NODE *object, *result, *parentList; result = get_var(name, current_object); //result = assoc(name, getvars(current_object)); if (result != UNBOUND){ if (includeLogo || (current_object != logo_object)){ return current_object;}} for (parentList = parent_list(current_object); parentList != NIL && result == UNBOUND; parentList = cdr(parentList)) { object = car(parentList); result = get_var(name, object); if (result != UNBOUND){ if (includeLogo || (object != logo_object)){ return object;}} //result = assoc(name, getvars(car(parentList))); //if (result != UNBOUND) return object; } return NIL; /* if (!includeLogo) return NIL; result = intern(name); if (flag__caseobj(result, IS_LOCAL_VALUE)) return NIL; return logo_object; */ } /* Returns the procedure associated with name. */ extern void dbprint(NODE*); /* * Finds an inherited procedure, returns it and also sets * the parent handle to the parent the proc came from */ NODE *getInheritedProcWithParent(NODE *name, NODE *obj, NODE **parent){ NODE *result, *parentList; // initialize the return value // incase there are no parents result = UNDEFINED; for (parentList = parent_list(obj); parentList != NIL && result == UNDEFINED; parentList = cdr(parentList)) { result = get_proc(name, car(parentList)); if (parent != 0){ *parent = car(parentList); } } // result should be UNDEFINED or a proc at this point return result; } /* Searches the parents for the given proc * if found, returns the proc * if not found, returns UNDEFINED */ NODE *getInheritedProc(NODE *name, NODE *obj){ NODE *result, *parentList; // initialize the return value // incase there are no parents result = UNDEFINED; for (parentList = parent_list(obj); parentList != NIL && result == UNDEFINED; parentList = cdr(parentList)) { result = get_proc(name, car(parentList)); } // result should be UNDEFINED or a proc at this point return result; //return getInheritedProcWithParent(name, obj, (NODE**)0); } NODE *procValueWithParent(NODE *name, NODE **owner){ NODE *result, *parentList; result = get_proc(name, current_object); if (result != UNDEFINED) { if (owner != 0){ *owner = current_object; } return result; } // search all parents, will return UNDEFINED if not found return getInheritedProcWithParent(name, current_object, owner); } NODE *procValue(NODE *name) { return procValueWithParent(name, (NODE**)0); } /* (define (parent-list obj) (define (help obj) (let ((p (parents obj))) (if (null? p) (list obj) (cons obj (flatten (map parent-list p)))))) (remdup (cdr (help obj)))) */ extern NODE* remdup(NODE *seq); NODE *parent_list_help(NODE *obj) { NODE *p, *out, *tail; out = tail = cons(obj, NIL); for (p = getparents(obj); p != NIL; p = cdr(p)) { setcdr(tail, parent_list_help(car(p))); while (cdr(tail) != NIL) tail = cdr(tail); } return out; } NODE *parent_list(NODE *obj) { return remdup(cdr(parent_list_help(obj))); } /* (define (remdup seq) (cond ((null? seq) '()) ((memq (car seq) (cdr seq)) (remdup (cdr seq))) (else (cons (car seq) (remdup (cdr seq)))))) */ NODE* remdup(NODE *seq) { NODE* okay; if (seq == NIL) return seq; /* finds the first element of new seq list */ while (memq(car(seq), cdr(seq))) { seq = cdr(seq); } for (okay = seq; cdr(okay) != NIL; okay = cdr(okay)) { while (memq(cadr(okay), cddr(okay))) { setcdr(okay, cddr(okay)); } } return seq; } /* returns true if item is a member of list, returns false otherwise */ BOOLEAN memq(NODE *item, NODE *list) { while (list != NIL) { if (item == car(list)) return TRUE; list = cdr(list); } return FALSE; } /* representation of an object */ NODE *lrepresentation(NODE *args) { NODE *license, *binding, *classbind; char buffer[200]; char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; print_stringlen = 200; print_stringptr = buffer; license = get_varvalue(theName(Name_licenseplate), current_object); //assoc(theName(Name_licenseplate), getvars(current_object)); ndprintf(NULL, "${Object %p", license); //getobject(license)); binding = get_varvalue(theName(Name_name), current_object); //binding = assoc(theName(Name_name), getvars(current_object)); if (binding != NIL && binding != UNBOUND) { ndprintf(NULL, ": %p", binding); } classbind = get_varvalue(theName(Name_class), current_object); //classbind = assoc(theName(Name_class), getvars(current_object)); if (classbind != UNBOUND) { if (binding == UNBOUND) { ndprintf(NULL, ":"); }else { ndprintf(NULL, ","); } ndprintf(NULL, " the class %p", classbind); } else { classbind = varInObjectHierarchy(theName(Name_class), FALSE); if (classbind != UNBOUND && classbind != (NODE *)(-1)) { if (binding == NIL) { ndprintf(NULL, ":"); } else { ndprintf(NULL, ","); } ndprintf(NULL, " a %p", classbind); } } ndprintf(NULL, "}"); print_stringptr = '\0'; print_stringptr = old_stringptr; print_stringlen = old_stringlen; return make_strnode(buffer, NULL, strlen(buffer), STRING, strnzcpy); } #endif ucblogo-6.1/math.c0000664000175000017500000004035713575571772012243 0ustar jjcjjc/* * math.c logo math functions module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "logo.h" #include "globals.h" #include #include #include #define isdigit(dig) (dig >= '0' && dig <= '9') int numberp(NODE *snd) { int dl,dr, pcnt, plen; char *p; if (is_number(snd)) return(1); snd = cnv_node_to_strnode(snd); if (snd == UNBOUND) return(0); p = getstrptr(snd); plen = getstrlen(snd); pcnt = dl = dr = 0; if (plen >= MAX_NUMBER) { return(0); } if (pcnt < plen && *p == '-') p++, pcnt++; while (pcnt < plen && isdigit(*p)) p++, pcnt++, dl++; if (pcnt < plen && *p == '.') { p++, pcnt++; while (pcnt < plen && isdigit(*p)) p++, pcnt++, dr++; } if (pcnt < plen && (dl || dr) && (*p == 'E' || *p == 'e')) { p++, pcnt++; if (pcnt < plen && (*p == '+' || *p == '-')) p++, pcnt++; while (pcnt < plen && isdigit(*p)) p++, pcnt++, dr++; } if ((dl == 0 && dr == 0) || pcnt != plen) return (0); else return (dr + 1); } NODE *lrandom(NODE *arg) { NODE *val; unsigned long r, base, range; val = pos_int_arg(arg); if (NOT_THROWING) { if (cdr(arg)==0) { /* (random 10) => (0, 10) */ base = 0; range = getint(val); } else { /* (random 3 10) => (3, 8) */ base = getint(val); val = pos_int_arg(arg); if (NOT_THROWING) { /* (random 0 9) <=> (random 10) */ range = getint(val); range = range + 1 - base; } } } if (NOT_THROWING) { #ifdef HAVE_SRANDOM r = (range <= 0 ? 0 : random() % range); #else r = (((long)rand()) << 15) | rand(); r = (range <= 0 ? 0 : r % range); #endif r += base; val = newnode(INT); setint(val, (FIXNUM)r); return(val); } else return(UNBOUND); } NODE *lrerandom(NODE *arg) { int seed=1; if (arg != NIL) { seed = int_arg(arg); } if (NOT_THROWING) { #ifdef HAVE_SRANDOM srandom((int)seed); #else srand((int)seed); #endif } return(UNBOUND); } jmp_buf oflo_buf; BOOLEAN handling_oflo = FALSE; #ifdef SIG_TAKES_ARG #define sig_arg 0 RETSIGTYPE handle_oflo(int sig) { #else #define sig_arg RETSIGTYPE handle_oflo() { #endif signal(SIGFPE, handle_oflo); if (handling_oflo) longjmp(oflo_buf,1); SIGRET } void math_init() { signal(SIGFPE, handle_oflo); } #ifdef HAVE_MATHERR int matherr(struct exception *x) { if (x->type == UNDERFLOW) return(1); longjmp(oflo_buf,1); } #endif #ifdef mac FLONUM degrad = 0.017453292520; #else FLONUM degrad = 3.141592653589793227020265931059839203954/180.0; #endif #if defined(mac)||defined(ibm) #define errchk(x) {errno = 0; x; if (errno) err_logo(BAD_DATA_UNREC,arg);} #include #else #define errchk(x) x #endif NODE *binary(NODE *args, char fcn) { NODE *arg, *val; BOOLEAN imode; FIXNUM iarg = 0, ival = 0, oval, nval; FLONUM farg = 0.0, fval = 0.0; int sign, wantint=0; /* Force imode, arg and fval into the stack because otherwise they may be clobbered during setjmp/longjmp. Especially on Sparc. */ (void)&imode; (void)&arg; (void)&fval; /* if (fcn == '%' || fcn == 'm') arg = integer_arg(args); else */ arg = numeric_arg(args); args = cdr(args); if (stopping_flag == THROWING) return UNBOUND; if (nodetype(arg) == INT) { imode = TRUE; ival = getint(arg); } else { imode = FALSE; fval = getfloat(arg); } if (args == NIL) { /* one argument supplied */ if (imode) switch(fcn) { case '-': ival = -ival; break; case '~': ival = ~ival; break; case 's': case 'c': case 't': case 'S': case 'C': case 'T': case 'q': case 'e': case 'g': case 'n': case '/': imode = FALSE; fval = (FLONUM)ival; break; } if (imode == FALSE) { if (!setjmp(oflo_buf)) { switch(fcn) { case '-': fval = -fval; break; case '/': if (fval == 0.0) err_logo(BAD_DATA_UNREC,arg); else fval = 1/fval; break; case '~': err_logo(BAD_DATA_UNREC,arg); break; case 'c': fval = 90.0 - fval; case 's': /* Kahan sez we can't just multiply any old * angle by degrad, but have to get into the * range 0-45 first */ sign = (fval < 0.0); if (sign) fval = -fval; #ifndef HAVE_DREM fval = fmod(fval,360.0); #else fval = drem(fval,360.0); #endif if (fval > 180.0) { fval -= 180.0; sign = !sign; } if (fval > 90.0) fval = 180.0 - fval; if (fval > 45.0) fval = cos((90.0-fval)*degrad); else fval = sin(fval*degrad); if (sign) fval = -fval; break; case 't': fval = atan(fval)/degrad; break; case 'S': fval = sin(fval); break; case 'C': fval = cos(fval); break; case 'T': fval = atan(fval); break; case 'q': errchk(fval = sqrt(fval)); break; case 'e': errchk(fval = exp(fval)); break; case 'g': errchk(fval = log10(fval)); break; case 'n': errchk(fval = log(fval)); break; case 'r': fval += (fval < 0 ? -0.5 : 0.5); case 'i': handling_oflo = TRUE; if (fval > (FLONUM)MAXLOGOINT || fval < -(FLONUM)MAXLOGOINT) handle_oflo(sig_arg); ival = (FIXNUM)fval; imode = TRUE; handling_oflo = FALSE; break; } } else { /* overflow */ if (fcn == 'r' || fcn == 'i') { if (fval < 0.0) fval = ceil(fval); else fval = floor(fval); } else err_logo(BAD_DATA_UNREC,arg); } } /* end float case */ } /* end monadic */ while (args != NIL && NOT_THROWING) { /* if (fcn == '%' || fcn == 'm') arg = integer_arg(args); else */ arg = numeric_arg(args); args = cdr(args); if (stopping_flag == THROWING) return UNBOUND; if (nodetype(arg) == INT) { if (imode) iarg = getint(arg); else farg = (FLONUM)getint(arg); } else { if (imode) { fval = (FLONUM)ival; imode = FALSE; } farg = getfloat(arg); } if (imode) { oval = ival; handling_oflo = TRUE; if (setjmp(oflo_buf) == 0) { switch(fcn) { case '-': iarg = -iarg; case '+': if (iarg < 0) { nval = ival + iarg; if (nval >= ival) { imode = FALSE; fcn = '+'; fval = (FLONUM)ival; farg = (FLONUM)iarg; } else ival = nval; } else { nval = ival + iarg; if (nval < ival) { imode = FALSE; fcn = '+'; fval = (FLONUM)ival; farg = (FLONUM)iarg; } else ival = nval; } break; case '/': if (iarg == 0) err_logo(BAD_DATA_UNREC,arg); else if (ival % iarg != 0) { imode = FALSE; fval = (FLONUM)ival; farg = (FLONUM)iarg; } else ival /= iarg; break; case '%': if (iarg == 0) err_logo(BAD_DATA_UNREC,arg); else ival %= iarg; break; case 'm': if (iarg == 0) err_logo(BAD_DATA_UNREC,arg); else ival %= iarg; if ((ival < 0) != (iarg < 0)) ival += iarg; break; case '&': ival &= iarg; break; case '|': ival |= iarg; break; case '^': ival ^= iarg; break; case 'a': case 'l': if (iarg < 0) { if (fcn == 'a') ival >>= -iarg; else ival = (unsigned)ival >> -iarg; } else ival <<= iarg; break; case '*': if (ival < SAFEINT && ival > -SAFEINT && iarg < SAFEINT && iarg > -SAFEINT) { ival *= iarg; break; } wantint++; default: /* math library */ imode = FALSE; fval = (FLONUM)ival; farg = (FLONUM)iarg; } } else { /* integer overflow detected */ imode = FALSE; fval = (FLONUM)oval; farg = (FLONUM)iarg; } handling_oflo = FALSE; } if (imode == FALSE) { handling_oflo = TRUE; if (setjmp(oflo_buf) == 0) { switch(fcn) { case '+': fval += farg; break; case '-': fval -= farg; break; case '*': fval *= farg; if (wantint) { wantint = 0; if (fval <= MAXLOGOINT && fval >= -MAXLOGOINT) { imode = TRUE; ival = (FIXNUM)fval; } } break; case '/': if (farg == 0.0) err_logo(BAD_DATA_UNREC,arg); else fval /= farg; break; case 't': errchk(fval = atan2(farg,fval)/degrad); break; case 'T': errchk(fval = atan2(farg,fval)); break; case 'p': errchk(fval = pow(fval,farg)); break; case '%': if (farg == 0.0) err_logo(BAD_DATA_UNREC,arg); else errchk(fval = fmod(fval,farg)); break; case 'm': if (farg == 0.0) err_logo(BAD_DATA_UNREC,arg); else errchk(fval = fmod(fval,farg)); if ((fval < 0.0) != (farg < 0.0)) fval += farg; break; default: /* logical op */ if (nodetype(arg) == INT) err_logo(BAD_DATA_UNREC, make_floatnode(fval)); else err_logo(BAD_DATA_UNREC,arg); } } else { /* floating overflow detected */ err_logo(BAD_DATA_UNREC,arg); } handling_oflo = FALSE; } /* end floating point */ } /* end dyadic */ if (NOT_THROWING) { if (imode) { val = newnode(INT); setint(val, ival); } else { val = newnode(FLOATT); setfloat(val, fval); } return(val); } return(UNBOUND); } NODE *ladd(NODE *args) { if (args == NIL) return make_intnode(0L); return(binary(args, '+')); } NODE *lsub(NODE *args) { return(binary(args, '-')); } NODE *lmul(NODE *args) { if (args == NIL) return make_intnode(1L); return(binary(args, '*')); } NODE *ldivide(NODE *args) { return(binary(args, '/')); } NODE *lremainder(NODE *args) { return(binary(args, '%')); } NODE *lmodulo(NODE *args) { return(binary(args, 'm')); } NODE *lbitand(NODE *args) { if (args == NIL) return make_intnode(-1); return(binary(args, '&')); } NODE *lbitor(NODE *args) { if (args == NIL) return make_intnode(0); return(binary(args, '|')); } NODE *lbitxor(NODE *args) { if (args == NIL) return make_intnode(0); return(binary(args, '^')); } NODE *lashift(NODE *args) { return(binary(args, 'a')); } NODE *llshift(NODE *args) { return(binary(args, 'l')); } NODE *lbitnot(NODE *args) { return(binary(args, '~')); } NODE *lsin(NODE *args) { return(binary(args, 's')); } NODE *lcos(NODE *args) { return(binary(args, 'c')); } NODE *latan(NODE *args) { return(binary(args, 't')); } NODE *lradsin(NODE *args) { return(binary(args, 'S')); } NODE *lradcos(NODE *args) { return(binary(args, 'C')); } NODE *lradatan(NODE *args) { return(binary(args, 'T')); } NODE *lsqrt(NODE *args) { return(binary(args, 'q')); } NODE *linteg(NODE *args) { return(binary(args, 'i')); } NODE *lroundx(NODE *args) { /* There's an lround in */ return(binary(args, 'r')); } NODE *lexp(NODE *args) { return(binary(args, 'e')); } NODE *llog10(NODE *args) { return(binary(args, 'g')); } NODE *lln(NODE *args) { return(binary(args, 'n')); } NODE *lpower(NODE *args) { return(binary(args, 'p')); } int compare_numnodes(NODE *n1, NODE *n2) { FLONUM f; FIXNUM i; if (nodetype(n1) == INT) { if (nodetype(n2) == INT) { i = getint(n1) - getint(n2); return (i == 0L ? 0 : (i > 0L ? 1 : -1)); } else { f = (FLONUM)getint(n1) - getfloat(n2); return(f == 0.0 ? 0 : (f > 0.0 ? 1 : -1)); } } else { if (nodetype(n2) == INT) { f = getfloat(n1) - (FLONUM)getint(n2); return(f == 0.0 ? 0 : (f > 0.0 ? 1 : -1)); } else { f = getfloat(n1) - getfloat(n2); return(f == 0.0 ? 0 : (f > 0.0 ? 1 : -1)); } } } NODE *torf(BOOLEAN tf) { return (tf ? TrueName() : FalseName()); } NODE *llessp(NODE *args) { NODE *n1, *n2; n1 = numeric_arg(args); n2 = numeric_arg(cdr(args)); if (NOT_THROWING) { return torf(compare_numnodes(n1, n2) < 0); } return(UNBOUND); } NODE *llessequalp(NODE *args) { NODE *n1, *n2; n1 = numeric_arg(args); n2 = numeric_arg(cdr(args)); if (NOT_THROWING) { return torf(compare_numnodes(n1, n2) <= 0); } return(UNBOUND); } NODE *lgreaterp(NODE *args) { NODE *n1, *n2; n1 = numeric_arg(args); n2 = numeric_arg(cdr(args)); if (NOT_THROWING) { return torf(compare_numnodes(n1, n2) > 0); } return(UNBOUND); } NODE *lgreaterequalp(NODE *args) { NODE *n1, *n2; n1 = numeric_arg(args); n2 = numeric_arg(cdr(args)); if (NOT_THROWING) { return torf(compare_numnodes(n1, n2) >= 0); } return(UNBOUND); } int compare_node(NODE *n1, NODE *n2, BOOLEAN ignorecase) { NODE *a1 = NIL, *a2 = NIL, *nn1 = NIL, *nn2 = NIL; int icmp = 0, cmp_len; NODETYPES nt1, nt2; if (n1 == n2) return 0; nt1 = nodetype(n1); nt2 = nodetype(n2); if (!(nt1 & NT_WORD) || !(nt2 & NT_WORD)) return -9999; if (nt1==QUOTE && is_list(node__quote(n1))) return -9999; if (nt2==QUOTE && is_list(node__quote(n2))) return -9999; if (nt1 == CASEOBJ && nt2 == CASEOBJ && ignorecase && (object__caseobj(n1) == object__caseobj(n2))) return 0; if ((nt1 & NT_NUMBER) && (nt2 & NT_NUMBER)) return compare_numnodes(n1, n2); if (nt1 & NT_NUMBER) { nn2 = cnv_node_to_numnode(n2); if (nn2 != UNBOUND) { icmp = compare_numnodes(n1, nn2); return icmp; } } if (nt2 & NT_NUMBER) { nn1 = cnv_node_to_numnode(n1); if (nn1 != UNBOUND) { icmp = compare_numnodes(nn1, n2); return icmp; } } a1 = cnv_node_to_strnode(n1); a2 = cnv_node_to_strnode(n2); nt1 = nodetype(a1); nt2 = nodetype(a2); if (nt1 == STRING && nt2 == STRING) { if (getstrptr(a1) == getstrptr(a2)) icmp = getstrlen(a1) - getstrlen(a2); else { cmp_len = (getstrlen(a1) > getstrlen(a2)) ? getstrlen(a2) : getstrlen(a1); if (ignorecase) icmp = low_strncmp(getstrptr(a1), getstrptr(a2), cmp_len); else icmp = strncmp(getstrptr(a1), getstrptr(a2), cmp_len); if (icmp == 0) icmp = getstrlen(a1) - getstrlen(a2); } } else if (nt1 & NT_BACKSL || nt2 & NT_BACKSL) { if (getstrptr(a1) == getstrptr(a2)) icmp = getstrlen(a1) - getstrlen(a2); else { cmp_len = (getstrlen(a1) > getstrlen(a2)) ? getstrlen(a2) : getstrlen(a1); if (ignorecase) icmp = noparitylow_strncmp(getstrptr(a1), getstrptr(a2), cmp_len); else icmp = noparity_strncmp(getstrptr(a1), getstrptr(a2), cmp_len); if (icmp == 0) icmp = getstrlen(a1) - getstrlen(a2); } } else err_logo(FATAL, NIL); return(icmp); } BOOLEAN equalp_help(NODE *arg1, NODE *arg2, BOOLEAN ignc) { if (is_list(arg1)) { if (!is_list(arg2)) return FALSE; while (arg1 != NIL && arg2 != NIL) { if (!equalp_help(car(arg1), car(arg2), ignc)) return FALSE; arg1 = cdr(arg1); arg2 = cdr(arg2); if (check_throwing) break; } return (arg1 == NIL && arg2 == NIL); } else if (is_list(arg2)) return FALSE; else if (nodetype(arg1) == ARRAY) { if (nodetype(arg2) != ARRAY) return FALSE; return (arg1 == arg2); } else if (nodetype(arg2) == ARRAY) return FALSE; else return (!compare_node(arg1, arg2, ignc)); } NODE *lequalp(NODE *args) { NODE *arg1, *arg2; BOOLEAN val; arg1 = car(args); arg2 = cadr(args); if (varTrue(Caseignoredp)) val = equalp_help(arg1, arg2, TRUE); else val = equalp_help(arg1, arg2, FALSE); return(torf(val)); } NODE *lnotequalp(NODE *args) { NODE *arg1, *arg2; BOOLEAN val; arg1 = car(args); arg2 = cadr(args); if (varTrue(Caseignoredp)) val = equalp_help(arg1, arg2, TRUE); else val = equalp_help(arg1, arg2, FALSE); return(torf(!val)); } NODE *l_eq(NODE *args) { return torf(car(args) == cadr(args)); } NODE *lbeforep(NODE *args) { NODE *arg1, *arg2; int val; arg1 = string_arg(args); arg2 = string_arg(cdr(args)); if (varTrue(Caseignoredp)) val = compare_node(arg1, arg2, TRUE); else val = compare_node(arg1, arg2, FALSE); return (val < 0 ? TrueName() : FalseName()); } ucblogo-6.1/macterm.h0000664000175000017500000001051013575571772012733 0ustar jjcjjc/* * macterm.h mac-specific graphics macros mak * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include extern WindowPtr graphics_window, listener_window; /* mak */ #define GR_SIZE 30000 #define prepare_to_draw GetPort(&savePort); SetPort(graphics_window) #define done_drawing SetPort(savePort) #define prepare_to_draw_turtle nop() #define done_drawing_turtle nop() #define screen_left 1 #define screen_right (graphics_window->portRect.right - 1) #define screen_top 1 #define screen_bottom (graphics_window->portRect.bottom - 1) #define screen_height (1 + screen_bottom - screen_top) #define screen_width (1 + screen_right - screen_left) #define screen_x_center (screen_left + (screen_width)/2) #define screen_y_center (screen_top + (screen_height)/2) #define turtle_left_max ((screen_left) - (screen_x_center)) #define turtle_right_max ((screen_right) - (screen_x_center)) #define turtle_top_max ((screen_y_center) - (screen_top)) #define turtle_bottom_max ((screen_y_center) - (screen_bottom)) #define screen_x_coord ((screen_x_center) + turtle_x) #define screen_y_coord ((screen_y_center) - turtle_y) #define turtle_height 18 #define turtle_half_bottom 6.0 #define turtle_side 19.0 #define clear_screen erase_screen() #define line_to(x,y) LineTo(x,y) #define move_to(x,y) MoveTo(x,y) #define draw_string(s) DrawString(s) #define set_pen_vis(v) graphics_window->pnVis = v #define set_pen_mode(m) graphics_window->pnMode = m #define set_pen_color(c) mac_set_pc(c) #define set_back_ground(c) mac_set_bg(c); #define set_pen_width(w) graphics_window->pnSize.h = w #define set_pen_height(h) graphics_window->pnSize.v = h #define set_pen_x(x) graphics_window->pnLoc.h = x #define set_pen_y(y) graphics_window->pnLoc.v = y /* pen_info is a stucture type with fields for the various pen characteristics including the location, size, color, mode (e.g. XOR or COPY), pattern, visibility (0 = visible) */ typedef struct { PenState ps; int vis; long color; } pen_info; #define p_info_x(p) p.ps.pnLoc.h #define p_info_y(p) p.ps.pnLoc.v #define pen_width graphics_window->pnSize.h #define pen_height graphics_window->pnSize.v #define pen_mode graphics_window->pnMode #define pen_vis graphics_window->pnVis #define pen_x graphics_window->pnLoc.h #define pen_y graphics_window->pnLoc.v #define get_node_pen_pattern Get_node_pen_pattern() #define pen_reverse graphics_window->pnMode = patXor #define pen_erase graphics_window->pnMode = patBic #define pen_down graphics_window->pnMode = patCopy #define button Button() #define mouse_x mickey_x() #define mouse_y mickey_y() #define full_screen f_screen() #define split_screen s_screen() #define text_screen t_screen() #define max(x,y) ((x > y) ? x : y) /* colors #define blackColor 33 #define whiteColor 30 #define redColor 205 #define greenColor 341 #define blueColor 409 #define cyanColor 273 #define magentaColor 137 #define yellowColor 69 */ extern GrafPtr savePort; extern int x_coord, y_coord, x_max, y_max, tty_charmode; extern char so_arr[], se_arr[]; extern void save_pen(), restore_pen(), plain_xor_pen(), set_pen_pattern(); extern void set_list_pen_pattern(), get_pen_pattern(), erase_screen(); extern void t_screen(), s_screen(), f_screen(), tone(), logofill(), nop(); extern FIXNUM mickey_x(), mickey_y(); extern NODE *Get_node_pen_pattern(); extern void c_to_pascal_string(), pascal_to_c_string(); extern FIXNUM pen_color, back_ground; extern void mac_set_pc(), mac_set_bg(); extern void get_palette(int slot, unsigned int *r, unsigned int *g, unsigned int *b); extern void set_palette(int slot, unsigned int r, unsigned int g, unsigned int b); ucblogo-6.1/macterm.c0000664000175000017500000004231613575571772012737 0ustar jjcjjc/* * macterm.c macintosh screen module mak * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "logo.h" #include "globals.h" #include "macterm.h" #include #include #include #include #include #include #include #include char *LogoPlatformName="MacOS-Classic"; char windowtitle[100]; FILE *graphics, *console; WindowPtr graphics_window, listener_window; GrafPtr savePort; extern WindowPtr myWindow; /* the editor window */ FIXNUM pen_color = 7, back_ground = 0; /************************************************************/ void nop() { } int can_do_color = 0, want_color = 0; PaletteHandle the_palette; void get_can_do_color(void) { long ans; if (!Gestalt(gestaltQuickdrawVersion, &ans)) can_do_color = (ans != 0); } void init_mac_memory(void) { unsigned long AZ, AL; /* SetApplLimit((Ptr)(GetApplLimit() - 150000L)); MaxApplZone(); */ AL = (unsigned long)GetApplLimit(); AZ = (unsigned long)ApplicZone(); /* SetApplLimit((Ptr) ( (AZ + ((AL-AZ)*3)/4) & 0x00fffffe )); */ /* SetApplLimit((Ptr)(AZ + 300000L)); */ SetApplLimit((Ptr)((AZ + ((AL-AZ)*3)/4) & -2L)); /* PCB */ MaxApplZone(); } BOOLEAN check_mac_stop(void) { char the_key_map[16]; static int full = 400; static int gotkey = 0; extern void ProcessEvent(void); if (FreeMem() < 3000) { err_logo(STACK_OVERFLOW, NIL); return(1); } GetKeys((unsigned long *)&the_key_map); if (the_key_map[5] & 128 && the_key_map[6] & 128) { /* period and command are down */ if (!gotkey) { gotkey = 1; FlushEvents(everyEvent, 0); #ifdef SIG_TAKES_ARG logo_stop(0); #else logo_stop(); #endif return 1; } } else if (the_key_map[5] & 8 && the_key_map[6] & 128) { /* comma and command are down */ if (!gotkey) { gotkey = 1; FlushEvents(everyEvent, 0); #ifdef SIG_TAKES_ARG logo_pause(0); #else logo_pause(); #endif } } else gotkey = 0; if (--full == 0) { ProcessEvent(); full = 400; } return(0); } void term_init_mac(void) { MenuHandle menu_handle; get_can_do_color(); tty_charmode = 0; x_max = 80; y_max = 24; console_options.title = (unsigned char *)windowtitle; console_options.top-= 5; console_options.left-= 5; strncpy((char *)console_options.title, (char const *)"\pGraphics", 9); want_color = 1; graphics = fopenc(); want_color = 0; cgotoxy(1, 1, graphics); graphics_window = FrontWindow(); if (can_do_color) { the_palette = GetNewPalette(131); SetPalette(graphics_window, the_palette, 1); ActivatePalette(graphics_window); } SizeWindow(graphics_window, graphics_window->portRect.right, graphics_window->portRect.bottom - 1, 0); cs_helper(TRUE); console_options.top+= 10; console_options.left+= 10; strncpy((char *)console_options.title, (char const *)"\pBerkeley Logo", 14); console = fopenc(); lregulartext(NIL); cinverse(1,stdout); listener_window = FrontWindow(); console_options.title[0] = 0; menu_handle = GetMHandle(3); AppendMenu(menu_handle, "\p(-;(Accept Editor Changes/A;(Cancel Editor Changes"); AppendMenu(menu_handle, "\p(-;(Page Setup;(Print/P"); SetUpWindows(); prepare_to_draw; mac_set_bg(0L); mac_set_pc(7L); save_color(); done_drawing; x_coord = y_coord = 0; so_arr[0] = '\1'; so_arr[1] = '\0'; se_arr[0] = '\2'; se_arr[1] = '\0'; } void mac_gotoxy(int x, int y) { /* 4.4 if (x_coord < 0) x_coord = 0; if (x_coord >= console_options.ncols) x_coord = console_options.ncols - 1; if (y_coord < 0) y_coord = 0; if (y_coord >= console_options.nrows) y_coord = console_options.nrows - 1; */ cgotoxy(x_coord + 1, y_coord + 1, stdout); } /************************************************************/ /* These are primitives that can only exist on the mac and/or are ad hoc things Michael invented that we probably don't want to keep around in Berkeley Logo. */ NODE *lsetwindowtitle(NODE *arg) { NODE *name; name = string_arg(arg); if (name != UNBOUND) { noparity_strnzcpy((char *)(windowtitle + 1), getstrptr(name), (int)getstrlen(name)); windowtitle[0] = (char)getstrlen(name); } return(UNBOUND); } void option_helper(short* var, NODE *arg) { NODE *val; val = integer_arg(arg); if (NOT_THROWING) *var = (short)getint(val); } NODE *lsettextfont(NODE *arg) { option_helper(&console_options.txFont, arg); return(UNBOUND); } NODE *lsettextsize(NODE *arg) { option_helper(&console_options.txSize, arg); return(UNBOUND); } NODE *lsettextstyle(NODE *arg) { option_helper(&console_options.txFace, arg); return(UNBOUND); } NODE *lsetwindowsize(NODE *args) { NODE *xnode, *ynode = UNBOUND, *arg; arg = pos_int_vector_arg(args); if (NOT_THROWING) { xnode = car(arg); ynode = cadr(arg); console_options.ncols = max((int)getint(xnode), 40); console_options.nrows = max((int)getint(ynode), 5); } return(UNBOUND); } NODE *lsetwindowxy(NODE *args) { NODE *xnode, *ynode = UNBOUND, *arg; arg = pos_int_vector_arg(args); if (NOT_THROWING) { xnode = car(arg); ynode = cadr(arg); console_options.left = (int)getint(xnode); console_options.top = (int)getint(ynode); } return(UNBOUND); } NODE *lnewconsole(NODE *args) { FILE *c, *old; int was_graphics; was_graphics = (FrontWindow() == graphics_window); chide(stdin); fclose(stdin); fclose(stdout); fclose(stderr); c = fopenc(); fclose(stdin); fclose(stdout); freopenc(c, stdin); freopenc(c, stdout); freopenc(c, stderr); lcleartext(NIL); cinverse(1,stdout); if (was_graphics) { graphics_window = FrontWindow(); graphics = c; } else { listener_window = FrontWindow(); console = c; x_max = console_options.ncols; y_max = console_options.nrows; } return(UNBOUND); } NODE *lgraphtext(NODE *args) { freopenc(graphics, stdin); freopenc(graphics, stdout); freopenc(graphics, stderr); return(UNBOUND); } NODE *lregulartext(NODE *args) { freopenc(console, stdin); freopenc(console, stdout); freopenc(console, stderr); return(UNBOUND); } NODE *lcaninverse(NODE *args) { FIXNUM onoff = int_arg(args); if (NOT_THROWING) cinverse(onoff, stdin); return(UNBOUND); } /************************************************************/ /* These are the machine-specific graphics definitions. All versions must provide a set of functions analogous to these. */ void save_pen(pen_info *p) { GetPort(&savePort); SetPort(graphics_window); GetPenState(&(p->ps)); p->vis = graphics_window->pnVis; // p->color = graphics_window->fgColor; p->color = pen_color; SetPort(savePort); } void restore_pen(pen_info *p) { GetPort(&savePort); SetPort(graphics_window); SetPenState(&(p->ps)); graphics_window->pnVis = p->vis; // graphics_window->fgColor = p->color; mac_set_pc(p->color); SetPort(savePort); } void plain_xor_pen(void) { PenNormal(); PenMode(patXor); } FIXNUM color_table[8] = {33, 409, 341, 273, 205, 137, 69, 30}; FIXNUM hw_color(FIXNUM c) { if (c >= 0 && c < 8) return color_table[c]; if (c < 0) return c; return c-8; } int palette_color(FIXNUM c) { if (c == 7) return 0; if (c >= 0 && c < 7) return c+1; return c; } void mac_set_pc(FIXNUM c) { pen_color = c; if (can_do_color) PmForeColor(palette_color(c+2)); else graphics_window->fgColor = hw_color(c); } void mac_set_bg(FIXNUM c) { back_ground = c; if (can_do_color) PmBackColor(palette_color(c+2)); else graphics_window->bkColor = hw_color(c); redraw_graphics(); } void set_palette(int slot, unsigned int r, unsigned int g, unsigned int b) { RGBColor rgb; if (can_do_color) { slot+=2; rgb.red = r; rgb.green = g; rgb.blue = b; SetEntryColor(the_palette, slot, &rgb); SetEntryUsage(the_palette, slot, pmTolerant, 2000); ActivatePalette(graphics_window); redraw_graphics(); } } void get_palette(int slot, unsigned int *r, unsigned int *g, unsigned int *b) { RGBColor rgb; if (can_do_color) { slot+=2; GetEntryColor(the_palette, palette_color((FIXNUM)slot), &rgb); *r = rgb.red; *g = rgb.green; *b = rgb.blue; } else { *r = (slot&4 ? 65000 : 0); *g = (slot&2 ? 65000 : 0); *b = (slot&1 ? 65000 : 0); } } void set_pen_pattern(char *pat) { PenPat((struct Pattern *)pat); } void set_list_pen_pattern(NODE *arg) { NODE *cur_num, *temp; char p_arr[8]; int count; cur_num = arg; for (count = 0 ; count <= 7 && cur_num != NIL && NOT_THROWING ; count++) { temp = cnv_node_to_numnode(car(cur_num)); p_arr[count] = (char)getint(temp); cur_num = cdr(cur_num); } PenPat((struct Pattern *)p_arr); } #ifdef SYMANTEC_C union myPattU { char patt_ch[8]; struct Pattern patt_p; }; typedef union myPattU myPatt; void get_pen_pattern(char *pat) { PenState oil; int count; myPatt my_patt; GetPenState(&oil); my_patt.patt_p = oil.pnPat; for (count = 0; count < 8; count++) *(char *)(pat + count) = my_patt.patt_ch[count]; } NODE *Get_node_pen_pattern() { PenState oil; int count; myPatt my_patt; GetPenState(&oil); my_patt.patt_p = oil.pnPat; return(cons(make_intnode((FIXNUM)(my_patt.patt_ch[0])), cons(make_intnode((FIXNUM)(my_patt.patt_ch[1])), cons(make_intnode((FIXNUM)(my_patt.patt_ch[2])), cons(make_intnode((FIXNUM)(my_patt.patt_ch[3])), cons(make_intnode((FIXNUM)(my_patt.patt_ch[4])), cons(make_intnode((FIXNUM)(my_patt.patt_ch[5])), cons(make_intnode((FIXNUM)(my_patt.patt_ch[6])), cons(make_intnode((FIXNUM)(my_patt.patt_ch[7])), NIL))))))))); } #else void get_pen_pattern(char *pat) { PenState oil; int count; GetPenState(&oil); for (count = 0; count < 8; count++) *(char *)(pat + count) = oil.pnPat[count]; } NODE *Get_node_pen_pattern() { PenState oil; int count; GetPenState(&oil); return(cons(make_intnode((FIXNUM)(oil.pnPat[0])), cons(make_intnode((FIXNUM)(oil.pnPat[1])), cons(make_intnode((FIXNUM)(oil.pnPat[2])), cons(make_intnode((FIXNUM)(oil.pnPat[3])), cons(make_intnode((FIXNUM)(oil.pnPat[4])), cons(make_intnode((FIXNUM)(oil.pnPat[5])), cons(make_intnode((FIXNUM)(oil.pnPat[6])), cons(make_intnode((FIXNUM)(oil.pnPat[7])), NIL))))))))); } #endif void label(char *s) { short tmode; GetPort(&savePort); SetPort(graphics_window); MoveTo(g_round(graphics_window->portRect.right/2.0 + turtle_x), g_round(graphics_window->portRect.bottom/2.0 - turtle_y)); switch(pen_mode) { case patCopy : tmode = srcOr; break; case patBic : tmode = srcBic; break; case patXor : tmode = srcXor; break; default : tmode = srcCopy; break; /* can't happen */ } TextFont(monaco); TextSize(9); TextMode(tmode); DrawString((unsigned char const *)s); SetPort(savePort); } void logofill(void) { BitMap mask; if (can_do_color) { prepare_to_draw; mask.bounds = (*(graphics_window->visRgn))->rgnBBox; mask.bounds.right = mask.bounds.right - mask.bounds.left; mask.bounds.left = 0; mask.bounds.bottom = mask.bounds.bottom - mask.bounds.top; mask.bounds.top = 0; mask.rowBytes = ((mask.bounds.right + 15) / 8) & ~1; mask.baseAddr = malloc(mask.rowBytes * mask.bounds.bottom); if (mask.baseAddr == NULL) { err_logo(OUT_OF_MEM, NIL); done_drawing; return; } SeedCFill(&(graphics_window->portBits), &mask, &((*(graphics_window->visRgn))->rgnBBox), &(mask.bounds), graphics_window->pnLoc.h, graphics_window->pnLoc.v, 0, 0L); CopyMask(&mask, &mask, &(graphics_window->portBits), &(mask.bounds), &(mask.bounds), &((*(graphics_window->visRgn))->rgnBBox)); free(mask.baseAddr); done_drawing; } } void erase_screen(void) { int old_vis; GetPort(&savePort); SetPort(graphics_window); old_vis = graphics_window->pnVis; graphics_window->pnVis = 0; EraseRect(&graphics_window->portRect); graphics_window->pnVis = old_vis; SetPort(savePort); } void t_screen(void) { SelectWindow(listener_window); console_options.ncols = 80; console_options.nrows = 25; console_options.left = 15; console_options.top = 55; strncpy((char *)console_options.title, (char *)"\pBerkeley Logo", 14); lnewconsole(NIL); MoveWindow(myWindow, 15, 55, TRUE); MySizeWindow(myWindow, 488, 283); SelectWindow(listener_window); myGrow(listener_window, (listener_window == FrontWindow())); } void s_screen(void) { Rect bounds; int v; if (can_do_color) v = ((*(((CGrafPtr)graphics_window)->portPixMap))->bounds.bottom - (*(((CGrafPtr)graphics_window)->portPixMap))->bounds.top) - 84; else v = (graphics_window->portBits.bounds.bottom - graphics_window->portBits.bounds.top) - 84; SelectWindow(listener_window); console_options.ncols = 80; console_options.nrows = 6; console_options.left = 5; console_options.top = v + 6; strncpy((char *)console_options.title, (char *)"\pBerkeley Logo", 14); lnewconsole(NIL); MoveWindow(myWindow, 5, v, TRUE); MySizeWindow(myWindow, 488, 80); SelectWindow(listener_window); myGrow(listener_window, (listener_window == FrontWindow())); } void f_screen(void) { Rect bounds; int v; if (can_do_color) v = ((*(((CGrafPtr)graphics_window)->portPixMap))->bounds.bottom - (*(((CGrafPtr)graphics_window)->portPixMap))->bounds.top) - 84; else v = (graphics_window->portBits.bounds.bottom - graphics_window->portBits.bounds.top) - 84; SelectWindow(listener_window); console_options.ncols = 80; console_options.nrows = 0; console_options.left = 5; console_options.top = v + 52; strncpy((char *)console_options.title, (char *)"\pBerkeley Logo", 14); lnewconsole(NIL); MoveWindow(myWindow, 5, v, TRUE); MySizeWindow(myWindow, 488, 80); SelectWindow(graphics_window); myGrow(graphics_window, (graphics_window == FrontWindow())); } int in_fscreen(void) { return (console_options.nrows == 0); } FIXNUM mickey_x(void) { Point the_mouse; GetPort(&savePort); SetPort(graphics_window); GetMouse(&the_mouse); SetPort(savePort); return((FIXNUM)(the_mouse.h - graphics_window->portRect.right/2)); } FIXNUM mickey_y(void) { Point the_mouse; GetPort(&savePort); SetPort(graphics_window); GetMouse(&the_mouse); SetPort(savePort); return((FIXNUM)(graphics_window->portRect.bottom/2 - the_mouse.v)); } #ifdef SYMANTEC_C SndChannelPtr SoundChannel = NIL; #endif /* see Inside Macintosh vol. 2 pp. 237-241 for pitch values */ void tone(FIXNUM pitch, FIXNUM duration) { #ifndef SYMANTEC_C struct { int mode; int freq; int amp; int dur; } sound_rec; sound_rec.mode = -1; sound_rec.freq = (int)(387205L/pitch); sound_rec.amp = 200; sound_rec.dur = (int)duration; StartSound(&sound_rec, (long)8, (char *)(-1)); while (!SoundDone()) ; #endif #ifdef SYMANTEC_C SndCommand MyCommand; SCStatus ChannelStatus; pitch = (int) 60+((log(pitch/261.625))/(log(twelfthRootTwo))); duration *= 34; /* ticks to half-milliseconds */ if (duration>0 && duration<65536 && pitch >=0 && pitch<128) { if (SoundChannel == NIL) { SndNewChannel(&SoundChannel, squareWaveSynth, initMono+initChanLeft, (ProcPtr)NIL); } if (SoundChannel != NIL) { MyCommand.cmd = freqDurationCmd; MyCommand.param1 = duration; MyCommand.param2 = pitch; SndDoImmediate(SoundChannel, &MyCommand); ChannelStatus.scChannelBusy = true; while (ChannelStatus.scChannelBusy == true) SndChannelStatus(SoundChannel, sizeof(ChannelStatus), &ChannelStatus); } } #endif } /************************************************************/ void c_to_pascal_string(char *str, int len) { int count = len; char prev; while (count > 0) { prev = str[count - 1]; str[count] = clearparity(prev); count--; } str[0] = len; } void fixMacType(NODE *arg) { char *fnstr; FSSpec theFSSpec; arg = cnv_node_to_strnode(car(arg)); if (arg == UNBOUND) return; fnstr = (char *) malloc((size_t)getstrlen(arg) + 1); if (fnstr == NULL) { err_logo(FILE_ERROR, make_static_strnode("Not enough memory")); return; } noparity_strnzcpy(fnstr, getstrptr(arg), getstrlen(arg)); c_to_pascal_string(fnstr, getstrlen(arg)); FSMakeFSSpec(0, 0L, (unsigned char *)fnstr, &theFSSpec); HCreate(theFSSpec.vRefNum, theFSSpec.parID, theFSSpec.name, '????', 'EPSF'); } ucblogo-6.1/logodata.c0000664000175000017500000003317313575571772013102 0ustar jjcjjc/* * logodata.c logo data management module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #define WANT_EVAL_REGS 1 #include "logo.h" #include "globals.h" #include #ifdef ibm #if !defined(__RZTC__) && !defined(_MSC_VER) #include #endif #endif char special_chars[] = " \t\n(?????+++~)[]-*/=<>\"\\:;|{}"; #ifdef ecma #include #define upper_p(ch) (isupper((ch) & 0377)) #define lower_p(ch) (islower((ch) & 0377)) char ecma_array[128]; int ecma_size = sizeof(special_chars)-1; char ecma_set(int ch) { ch &= 0377; if (ch >= 128) return(ch); return(ecma_array[ch]); } char ecma_clear(int ch) { ch &= 0377; if (ch < ecma_begin || ch >= ecma_begin+sizeof(special_chars)-1) return(ch); if (ch >= 007 && ch <= 015 && ch != 013) return(ch); return(special_chars[ch - ecma_begin]); } int ecma_get(int ch) { ch &= 0377; return ((ch >= ecma_begin && ch < ecma_begin+sizeof(special_chars)-1) && (ch < 007 || ch > 015 || ch == 013)); } #else #define upper_p(c) (c >= 'A' && c <= 'Z') #define lower_p(c) (c >= 'a' && c <= 'z') #endif char *strnzcpy(char *s1, char *s2, int n) { strncpy(s1, s2, n); s1[n] = '\0'; return(s1); } char *word_strnzcpy(char *s1, NODE *kludge, int n) { /* KLUDGE! */ char *temp = s1; while (kludge != NIL) { strncpy(s1, getstrptr(car(kludge)), getstrlen(car(kludge))); s1 += getstrlen(car(kludge)); kludge = cdr(kludge); } temp[n] = '\0'; return(temp); } char *noparity_strnzcpy(char *s1, char *s2, int n) { int i; for (i = 0; i < n; i++) s1[i] = clearparity(s2[i]); s1[n] = '\0'; return(s1); } char *backslashed_strnzcpy(char *s1, char *s2, int n) { int i,j; for (i = 0, j = 0; i < n; i++) { if (getparity(s2[i])) s1[j++] = '\\'; s1[j++] = clearparity(s2[i]); } s1[j] = '\0'; return(s1); } char *mend_strnzcpy(char *s1, char *s2, int n) { int i, vbar = 0; for (i = 0; i < n; ) { while (*s2 == '|') { vbar = !vbar; s2++; } if (vbar) { if (strchr(special_chars,(int)*s2)) s1[i++] = setparity(*s2++); else s1[i++] = *s2++; } else { while (*s2 == ';' || (*s2 == '~' && *(s2 + 1) == '\n')) { while (*s2 == '~' && *(s2 + 1) == '\n') s2 += 2; if (*s2 == ';') do { s2++; } while (*s2 != '\0' && *s2 != '~' && *(s2 + 1) != '\n'); } if (*s2 != '|') s1[i++] = *s2++; } } s1[n] = '\0'; return(s1); } char *mend_nosemi(char *s1, char *s2, int n) { int i, vbar = 0; for (i = 0; i < n; ) { while (*s2 == '|') { vbar = !vbar; s2++; } if (vbar) { if (strchr(special_chars,(int)*s2)) s1[i++] = setparity(*s2++); else s1[i++] = *s2++; } else { while ((*s2 == '~' && *(s2 + 1) == '\n')) { while (*s2 == '~' && *(s2 + 1) == '\n') s2 += 2; } if (*s2 != '|') s1[i++] = *s2++; } } s1[n] = '\0'; return(s1); } char *quote_strnzcpy(char *s1, char *s2, int n) { s1[0] = '"'; strncpy(s1 + 1, s2, n - 1); s1[n] = '\0'; return(s1); } char *colon_strnzcpy(char *s1, char *s2, int n) { s1[0] = ':'; strncpy(s1 + 1, s2, n - 1); s1[n] = '\0'; return(s1); } #define uncapital(c) ((c) - 'A' + 'a') char *low_strnzcpy(char *s1, char *s2, int n) { char *temp = s1; int i; for (i = 0; i < n; i++) { if (upper_p(*s2)) *s1++ = uncapital(*s2++); else *s1++ = *s2++; } *s1 = '\0'; return(temp); } #define capital(c) ((c) - 'a' + 'A') char *cap_strnzcpy(char *s1, char *s2, int n) { char *temp = s1; int i; for (i = 0; i < n; i++) { if (lower_p(*s2)) *s1++ = capital(*s2++); else *s1++ = *s2++; } *s1 = '\0'; return(temp); } char *noparitylow_strnzcpy(char *s1, char *s2, int n) { int i; char c, *temp = s1; for (i = 0; i < n; i++) { c = clearparity(*s2++); if (upper_p(c)) *s1++ = uncapital(c); else *s1++ = c; } *s1 = '\0'; return(temp); } int low_strncmp(char *s1, char *s2, int n) { int i; for (i = 0; i < n; i++) { if (*s1 != *s2) { if (upper_p(*s2)) { if (upper_p(*s1)) { if (uncapital(*s1) != uncapital(*s2)) return(uncapital(*s1) - uncapital(*s2)); } else { if (*s1 != uncapital(*s2)) return(*s1 - uncapital(*s2)); } } else if (upper_p(*s1)) { if (uncapital(*s1) != *s2) return(uncapital(*s1) - *s2); } else return(*s1 - *s2); } s1++, s2++; } return(0); } int noparity_strncmp(char *s1, char *s2, int n) { int i; for (i = 0; i < n; i++) { if (clearparity(*s1) != clearparity(*s2)) return(clearparity(*s1) - clearparity(*s2)); s1++, s2++; } return(0); } int noparitylow_strncmp(char *s1, char *s2, int n) { int i; char c1, c2; for (i = 0; i < n; i++) { c1 = clearparity(*s1); c2 = clearparity(*s2); if (c1 != c2) { if (upper_p(c2)) { if (upper_p(c1)) { if (uncapital(c1) != uncapital(c2)) return(uncapital(c1) - uncapital(c2)); } else { if (c1 != uncapital(c2)) return(c1 - uncapital(c2)); } } else if (upper_p(c1)) { if (uncapital(c1) != c2) return(uncapital(c1) - c2); } else return(c1 - c2); } s1++, s2++; } return(0); } NODE *make_strnode(char *strptr, struct string_block *strhead, int len, NODETYPES typ, char *(*copy_routine)()) { NODE *strnode; if (len == 0 && Null_Word != NIL) return(Null_Word); strnode = newnode(typ); if (strhead == NULL) { strhead = (struct string_block *) malloc((size_t)len + sizeof(FIXNUM) + 1); if (strhead == NULL) { err_logo(OUT_OF_MEM, NIL); return UNBOUND; } (*copy_routine) (strhead->str_str, strptr, len); strptr = strhead->str_str; setstrrefcnt(strhead, 0); } setstrlen(strnode, len); setstrptr(strnode, strptr); setstrhead(strnode, strhead); incstrrefcnt(strhead); return(strnode); } void make_runparse(NODE *ndi) { NODE *rp_list; rp_list = runparse(ndi); setobject(ndi, rp_list); settype(ndi, RUN_PARSE); } NODE *make_quote(NODE *qnd) { NODE *nd; nd = cons(qnd, NIL); settype(nd, QUOTE); return(nd); } NODE *maybe_quote(NODE *nd) { if (nodetype(nd) == CONT) nd = cdr(nd); if (nd == UNBOUND || aggregate(nd) || numberp(nd)) return(nd); return(make_quote(nd)); } NODE *make_caseobj(NODE *cstrnd, NODE *obj) { NODE *nd; nd = cons(cstrnd, obj); settype(nd, CASEOBJ); return(nd); } NODE *make_colon(NODE *cnd) { NODE *nd; nd = cons(cnd, NIL); settype(nd, COLON); return(nd); } NODE *make_intnode(FIXNUM i) { NODE *nd = newnode(INT); setint(nd, i); return(nd); } NODE *make_floatnode(FLONUM f) { NODE *nd = newnode(FLOATT); setfloat(nd, f); return(nd); } NODE *cnv_node_to_numnode(NODE *ndi) { NODE *val; int dr; char s2[MAX_NUMBER], *s = s2; if (is_number(ndi)) return(ndi); ndi = cnv_node_to_strnode(ndi); if (ndi == UNBOUND) return(UNBOUND); if (((getstrlen(ndi)) < MAX_NUMBER) && (dr = numberp(ndi))) { if (backslashed(ndi)) noparity_strnzcpy(s, getstrptr(ndi), getstrlen(ndi)); else strnzcpy(s, getstrptr(ndi), getstrlen(ndi)); if (*s == '+') ++s; if (s2[getstrlen(ndi)-1] == '.') s2[getstrlen(ndi)-1] = 0; if (dr - 1 || getstrlen(ndi) > 9) { val = newnode(FLOATT); setfloat(val, atof(s)); } else { val = newnode(INT); setint(val, atol(s)); } return(val); } else { return(UNBOUND); } } NODE *cnv_node_to_strnode(NODE *nd) { char s[MAX_NUMBER]; if (nd == UNBOUND || aggregate(nd)) { return(UNBOUND); } switch(nodetype(nd)) { case STRING: case BACKSLASH_STRING: case VBAR_STRING: return(nd); case CASEOBJ: return strnode__caseobj(nd); case QUOTE: nd = cnv_node_to_strnode(node__quote(nd)); nd = make_strnode(getstrptr(nd), (struct string_block *)NULL, getstrlen(nd) + 1, nodetype(nd), quote_strnzcpy); return(nd); case COLON: nd = cnv_node_to_strnode(node__colon(nd)); nd = make_strnode(getstrptr(nd), (struct string_block *)NULL, getstrlen(nd) + 1, nodetype(nd), colon_strnzcpy); return(nd); case INT: sprintf(s, "%ld", getint(nd)); return(make_strnode(s, (struct string_block *)NULL, (int)strlen(s), STRING, strnzcpy)); case FLOATT: sprintf(s, "%0.15g", getfloat(nd)); return(make_strnode(s, (struct string_block *)NULL, (int)strlen(s), STRING, strnzcpy)); } return(UNBOUND); /* Can't get here, but makes compiler happy */ } NODE *make_static_strnode(char *strptr) { NODE *strnode = newnode(STRING); setstrptr(strnode, strptr); setstrhead(strnode, NULL); setstrlen(strnode, (int)strlen(strptr)); return(strnode); } NODE *cons_list(int dummy, ...) { va_list ap; NODE *nptr, *outline = NIL, *lastnode = NIL, *val; va_start(ap, dummy); while ( (nptr = va_arg(ap, NODE *)) != END_OF_LIST) { val = cons(nptr, NIL); if (outline == NIL) { outline = val; lastnode = outline; } else { setcdr(lastnode, val); lastnode = val; } } va_end(ap); return(outline); } NODE *make_array(FIXNUM len) { NODE *node; NODE **data; node = newnode(ARRAY); setarrorg(node,1); setarrdim(node,len); data = (NODE **)malloc((size_t)len * sizeof(NODE *)); if (data == NULL) { err_logo(OUT_OF_MEM, NIL); return UNBOUND; } setarrptr(node,data); while (--len >= 0) *data++ = NIL; return(node); } NODE *llowercase(NODE *args) { NODE *arg; arg = string_arg(args); if (NOT_THROWING) { return make_strnode(getstrptr(arg), (struct string_block *)NULL, getstrlen(arg), nodetype(arg), low_strnzcpy); } return UNBOUND; } NODE *luppercase(NODE *args) { NODE *arg; arg = string_arg(args); if (NOT_THROWING) { return make_strnode(getstrptr(arg), (struct string_block *)NULL, getstrlen(arg), nodetype(arg), cap_strnzcpy); } return UNBOUND; } /* property list stuff */ NODE *getprop(NODE *plist, NODE *name, BOOLEAN before) { NODE *prev = NIL; BOOLEAN caseig = FALSE; if (varTrue(Caseignoredp)) caseig = TRUE; while (plist != NIL) { if (compare_node(name,car(plist),caseig) == 0) { return(before ? prev : plist); } prev = plist; plist = cddr(plist); } return(NIL); } NODE *lgprop(NODE *args) { NODE *plname, *pname, *plist, *val = NIL; plname = string_arg(args); pname = string_arg(cdr(args)); if (NOT_THROWING) { plname = intern(plname); plist = plist__caseobj(plname); if (plist != NIL) val = getprop(plist, pname, FALSE); if (val != NIL) return cadr(val); } return NIL; } NODE *lpprop(NODE *args) { NODE *plname, *pname, *newval, *plist, *val = NIL; plname = string_arg(args); pname = string_arg(cdr(args)); newval = car(cddr(args)); if (NOT_THROWING) { plname = intern(plname); if (flag__caseobj(plname, PLIST_TRACED)) { ndprintf(writestream, "%t %s %s %s", message_texts[TRACE_PPROP], maybe_quote(plname), maybe_quote(pname), maybe_quote(newval)); if (ufun != NIL) ndprintf(writestream,message_texts[ERROR_IN],ufun,this_line); new_line(writestream); } plist = plist__caseobj(plname); if (plist != NIL) val = getprop(plist, pname, FALSE); if (val != NIL) setcar(cdr(val), newval); else setplist__caseobj(plname, cons(pname, cons(newval, plist))); need_save = 1; } return(UNBOUND); } NODE *lremprop(NODE *args) { NODE *plname, *pname, *plist, *val = NIL; BOOLEAN caseig = FALSE; if (varTrue(Caseignoredp)) caseig = TRUE; plname = string_arg(args); pname = string_arg(cdr(args)); if (NOT_THROWING) { plname = intern(plname); plist = plist__caseobj(plname); if (plist != NIL) { if (compare_node(car(plist), pname, caseig) == 0) setplist__caseobj(plname, cddr(plist)); else { val = getprop(plist, pname, TRUE); if (val != NIL) setcdr(cdr(val), cddr(cddr(val))); } } } return(UNBOUND); } NODE *copy_list(NODE *arg) { NODE *tnode, *lastnode = NIL, *val = NIL; while (arg != NIL) { tnode = cons(car(arg), NIL); arg = cdr(arg); if (val == NIL) { lastnode = val = tnode; } else { setcdr(lastnode, tnode); lastnode = tnode; } } return(val); } NODE *lplist(NODE *args) { NODE *plname, *plist, *val = NIL; plname = string_arg(args); if (NOT_THROWING) { plname = intern(plname); plist = plist__caseobj(plname); if (plist != NIL) val = copy_list(plist); } return(val); } /* Boolean foreign language stuff */ int isName(NODE *nod, enum words wd) { return ((compare_node(nod, translations[wd].English, TRUE) == 0) || (compare_node(nod, translations[wd].Alt, TRUE) == 0)); } int varTrue(NODE *varb) { return isName(valnode__caseobj(varb), Name_true); } NODE *theName(enum words wd) { return(varTrue(UseAlternateNames) ? translations[wd].Alt : translations[wd].English); } NODE *TrueName() { return theName(Name_true); } NODE *FalseName() { return theName(Name_false); } ucblogo-6.1/logo.h0000664000175000017500000005345613575571772012263 0ustar jjcjjc/* * logo.h logo header file dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef _LOGO_H #define _LOGO_H // #define OBJECTS /* #define MEM_DEBUG */ #define ecma /* for European extended character set using parity bit */ #ifdef WIN32 #define ibm #undef __RZTC__ #define HAVE_MEMCPY #define SIG_TAKES_ARG #endif #ifdef __ZTC__ #ifndef THINK_C #define __RZTC__ #endif #endif #ifdef THINK_C #define mac #define HAVE_MEMCPY #endif #ifdef __TURBOC__ #define ibm #endif #ifdef __RZTC__ #define ibm #define HAVE_MEMCPY #define SIG_TAKES_ARG #endif #ifdef _MSC_VER #define ibm #endif #if !defined(ibm) && !defined(mac) #ifndef unix #define unix #endif #include "config.h" #ifndef X_DISPLAY_MISSING #define x_window #endif #else #define RETSIGTYPE void #define SIGRET #ifndef STDC_HEADERS #define STDC_HEADERS #endif #endif #include #include #include #ifdef STDC_HEADERS #include #else #include #include extern char *getenv(); #endif #ifndef HAVE_WX #ifdef ibm #include #endif #endif #ifdef HAVE_WX #undef ibm #define check_throwing (check_wx_stop(0) || stopping_flag == THROWING) #else #ifdef mac #define check_throwing (check_mac_stop() || stopping_flag == THROWING) #else #if defined(ibm) #define check_throwing (check_ibm_stop() || stopping_flag == THROWING) #else #if defined(HAVE_X11) #define check_throwing (check_X11_stop() || stopping_flag == THROWING) #else #define check_throwing (stopping_flag == THROWING) #endif #endif #endif #endif typedef enum {wrapmode, fencemode, windowmode} mode_type; #define WORDSIZE (8*sizeof(long)) #define NIL (NODE *) 0 #define UNBOUND Unbound #define UNDEFINED Unbound #define END_OF_LIST (NODE *) 2 #define HASH_LEN 1021 /* a prime number */ #ifdef __RZTC__ #define SEG_SIZE 2000 #else #ifdef THINK_C #define SEG_SIZE 4000 #else #define SEG_SIZE 16000 /* Should be a fairly big number for optimal GC Performance */ #endif #endif #define MAX_PHYS_LINE 5000 #define MAX_NUMBER 200 /* max number of digits in a float */ #define HIST_MAX 50 /* number of remembered instruction lines */ #define STOP_PRIORITY 0 #define OUTPUT_PRIORITY 1 #define MAYBE_PRIORITY 2 #define TAIL_PRIORITY 2 /* largest tailcall priority */ #define MACRO_PRIORITY 3 #define PREFIX_PRIORITY 4 typedef long int NODETYPES; #ifdef OBJECTS #define NT_METHOD (NODETYPES)0100000000 #define NT_OBJ (NODETYPES)040000000 #endif #define NT_LOCAL (NODETYPES)020000000 #define NT_STACK (NODETYPES)010000000 #define NT_CONT (NODETYPES)04000000 #define NT_INFIX (NODETYPES)02000000 #define NT_LINE (NODETYPES)01000000 #define NT_TAILFORM (NODETYPES)0400000 #define NT_MACRO (NODETYPES)0200000 #define NT_TREE (NODETYPES)0100000 #define NT_EMPTY (NODETYPES)040000 #define NT_AGGR (NODETYPES)020000 #define NT_LIST (NODETYPES)010000 #define NT_RUNP (NODETYPES)004000 #define NT_ARRAY (NODETYPES)002000 #define NT_WORD (NODETYPES)001000 #define NT_NUMBER (NODETYPES)000400 #define NT_FLOAT (NODETYPES)000200 #define NT_PRIM (NODETYPES)000100 #define NT_VBAR (NODETYPES)000040 #define NT_STRING (NODETYPES)000020 #define NT_BACKSL (NODETYPES)000010 #define NT_PUNCT (NODETYPES)000004 #define NT_COLON (NODETYPES)000002 #define NT_CASEOBJ (NODETYPES)000001 #define PNIL (NODETYPES)(NT_EMPTY|NT_AGGR|NT_LIST) #define PUNBOUND (NODETYPES)0 #define CONS (NODETYPES)(NT_AGGR|NT_LIST) #define STRING (NODETYPES)(NT_WORD|NT_STRING) #define INT (NODETYPES)(NT_WORD|NT_NUMBER) #define FLOATT (NODETYPES)(NT_WORD|NT_NUMBER|NT_FLOAT) #define PRIM (NODETYPES)(NT_PRIM) #define MACRO (NODETYPES)(NT_PRIM|NT_MACRO) #define TAILFORM (NODETYPES)(NT_PRIM|NT_TAILFORM) #define CASEOBJ (NODETYPES)(NT_WORD|NT_CASEOBJ) #define INFIX (NODETYPES)(NT_PRIM|NT_INFIX) #define TREE (NODETYPES)(NT_AGGR|NT_LIST|NT_TREE) #define RUN_PARSE (NODETYPES)(NT_AGGR|NT_LIST|NT_RUNP) #define QUOTE (NODETYPES)(NT_WORD|NT_PUNCT) #define COLON (NODETYPES)(NT_WORD|NT_PUNCT|NT_COLON) #define BACKSLASH_STRING (NODETYPES)(NT_WORD|NT_STRING|NT_BACKSL) #define VBAR_STRING (NODETYPES)(NT_WORD|NT_STRING|NT_BACKSL|NT_VBAR) #define ARRAY (NODETYPES)(NT_AGGR|NT_ARRAY) #define LINE (NODETYPES)(NT_LINE|NT_LIST|NT_AGGR) #define CONT (NODETYPES)(NT_CONT|NT_LIST) #define STACK (NODETYPES)(NT_STACK|NT_LIST) #define NTFREE (NODETYPES)(-1) #define LOCALSAVE (NODETYPES)(CONS|NT_LOCAL) #ifdef OBJECTS #define OBJECT (NODETYPES)(NT_OBJ) #define METHOD (NODETYPES)(NT_AGGR|NT_LIST|NT_METHOD) #endif #define aggregate(nd) (nodetype(nd) & NT_AGGR) #define is_cont(nd) (nodetype(nd) == CONT) #define is_list(nd) (nodetype(nd) & NT_LIST) #define is_tree(nd) (nodetype(nd) & NT_TREE) #define is_string(nd) (nodetype(nd) & NT_STRING) #define is_number(nd) (nodetype(nd) & NT_NUMBER) #define is_prim(nd) (nodetype(nd) & NT_PRIM) #define is_word(nd) (nodetype(nd) & NT_WORD) #define runparsed(nd) (nodetype(nd) & NT_RUNP) #define backslashed(nd) (nodetype(nd) & NT_BACKSL) #define is_tailform(nd) (nodetype(nd) == TAILFORM) #ifdef OBJECTS #define is_object(nd) (nodetype(nd) == NT_OBJ) #define is_method(nd) (nodetype(nd) == NT_METHOD) #endif typedef enum { FATAL, OUT_OF_MEM, STACK_OVERFLOW, TURTLE_OUT_OF_BOUNDS, BAD_DATA_UNREC, DIDNT_OUTPUT, NOT_ENOUGH, BAD_DATA, TOO_MUCH, DK_WHAT, PAREN_MISMATCH, NO_VALUE, UNEXPECTED_PAREN, DK_HOW, NO_CATCH_TAG, ALREADY_DEFINED, STOP_ERROR, ALREADY_DRIBBLING, FILE_ERROR, IF_WARNING, SHADOW_WARN, USER_ERR, IS_PRIM, NOT_INSIDE, DK_HOW_UNREC, NO_TEST, UNEXPECTED_BRACKET, UNEXPECTED_BRACE, BAD_GRAPH_INIT, ERR_MACRO, DK_WHAT_UP, AT_TOPLEVEL, APPLY_BAD_DATA, DEEPEND, OUT_OF_MEM_UNREC, USER_ERR_MESSAGE, DEEPEND_NONAME, BAD_DEFAULT, RUNRES_STOP, MISSING_SPACE, CANT_OPEN_ERROR, ALREADY_OPEN_ERROR, NOT_OPEN_ERROR, RUNNABLE_ARG, // I removed conditional inclusion of LOCAL_AND_OBJ because // it the messages text file does not have the ability to // conditionally include the text for the message, resulting // in a shift by 1 when compiled with OBJECTS LOCAL_AND_OBJ, /* below this point aren't actually error codes, just messages */ THANK_YOU, NICE_DAY, NOSHELL_MAC, TYPE_EXIT, ERROR_IN, ERRACT_LOOP, PAUS_ING, TRACE_STOPS, TRACE_OUTPUTS, NO_FILE, NO_FIONREAD, MEM_LOW, CANT_OPEN, ALREADY_OPEN, NOT_OPEN, TRACE_PPROP, WELCOME_TO, CANT_STOP, CANT_GC, EXIT_NOW, LOAD_DEF, TRACE_MAKE, EMPTY_PROC, POT_PLIST, NO_HELP, NO_HELPON, MORE_HELP, MAX_MESSAGE} ERR_TYPES; /* MAX_MESSAGE must be last */ #ifdef WIN32 #define BOOLEAN int #else typedef int BOOLEAN; #endif #define FALSE 0 #define TRUE 1 #define SPECIAL_COLORS 5 #define FILLED_COLOR_INDEX 0 #define FILLED_COLOR_OFFSET -5 #define BACKGROUND_COLOR_INDEX 1 #define BACKGROUND_COLOR_OFFSET -4 #define PEN_COLOR_INDEX 2 #define PEN_COLOR_OFFSET -3 #define TEXT_BG_COLOR_INDEX 3 #define TEXT_BG_COLOR_OFFSET -2 #define TEXT_FG_COLOR_INDEX 4 #define TEXT_FG_COLOR_OFFSET -1 #define even_p(x) !(x & 0x1) #define FIXNUM long #define FLONUM double #define MAXLOGOINT 0x7fffffff #define SAFEINT 0x00003fff /* safe to multiply w/o overflow */ struct string_block { unsigned FIXNUM str_refcnt; char str_str[1]; /* This array will be of variable length really */ }; #define getstrrefcnt(sh) ((sh)->str_refcnt) #define setstrrefcnt(sh, v) ((sh)->str_refcnt = (v)) #define incstrrefcnt(sh) (((sh)->str_refcnt)++) #define decstrrefcnt(sh) (--((sh)->str_refcnt)) typedef struct logo_node { NODETYPES node_type; int my_gen; /* Nodes's Generation */ /*GC*/ int gen_age; /* How many times to GC at this generation */ long int mark_gc; /* when marked */ struct logo_node *next; /* Link together nodes of the same age */ /*GC*/ struct logo_node *oldyoung_next; union { struct { struct logo_node *ncar; struct logo_node *ncdr; struct logo_node *nobj; /* used only for oblist etc */ } ncons; struct { char *nstring_ptr; struct string_block *nstring_head; FIXNUM nstring_len; } nstring; struct { struct logo_node * (*nprim_fun) (); short npriority; short nmin_args; short ndef_args; short nmax_args; } nprim; FIXNUM nint; FLONUM nfloat; struct { FIXNUM narray_dim; FIXNUM narray_origin; struct logo_node **narray_data; } narray; #ifdef OBJECTS struct { struct logo_node *nvars; struct logo_node *nprocs; struct logo_node *nparents; } nobject; struct { struct logo_node *nparent; struct logo_node *nprocname; } nmethod; #endif } nunion; } NODE; #define settype(node, type) ((node)->node_type = (type)) #define n_car nunion.ncons.ncar #define n_cdr nunion.ncons.ncdr #define n_obj nunion.ncons.nobj #define getobject(node) ((node)->n_obj) #define car(node) ((node)->n_car) #define cdr(node) ((node)->n_cdr) #define caar(node) ((node)->n_car->n_car) #define cadr(node) ((node)->n_cdr->n_car) #define cdar(node) ((node)->n_car->n_cdr) #define cddr(node) ((node)->n_cdr->n_cdr) #define n_str nunion.nstring.nstring_ptr #define n_len nunion.nstring.nstring_len #define n_head nunion.nstring.nstring_head #define getstrptr(node) ((node)->n_str) #define getstrlen(node) ((node)->n_len) #define getstrhead(node) ((node)->n_head) #define setstrptr(node,ptr) ((node)->n_str = (ptr)) #define setstrlen(node,len) ((node)->n_len = (len)) #define setstrhead(node,ptr) ((node)->n_head = (ptr)) #define n_int nunion.nint #define getint(node) ((node)->n_int) #define setint(node,num) ((node)->n_int = (num)) #define n_float nunion.nfloat #define getfloat(node) ((node)->n_float) #define setfloat(node,num) ((node)->n_float = (num)) #define n_pfun nunion.nprim.nprim_fun #define n_ppri nunion.nprim.npriority #define n_pmin nunion.nprim.nmin_args #define n_pdef nunion.nprim.ndef_args #define n_pmax nunion.nprim.nmax_args #define getprimfun(node) ((node)->n_pfun) #define setprimfun(node,fun) ((node)->n_pfun = (fun)) #define getprimmin(node) ((node)->n_pmin) #define setprimmin(node,num) ((node)->n_pmin = (num)) #define getprimmax(node) ((node)->n_pmax) #define setprimmax(node,num) ((node)->n_pmax = (num)) #define getprimdflt(node) ((node)->n_pdef) #define setprimdflt(node,num) ((node)->n_pdef = (num)) #define getprimpri(node) ((node)->n_ppri) #define setprimpri(node,num) ((node)->n_ppri = (num)) /* Special value for pmin, means that it's * OK if primitive name on line by itself even though defltargs=1 (ED, CO) */ #define OK_NO_ARG 01000 #define n_dim nunion.narray.narray_dim #define n_org nunion.narray.narray_origin #define n_array nunion.narray.narray_data #define getarrdim(node) ((node)->n_dim) #define getarrorg(node) ((node)->n_org) #define getarrptr(node) ((node)->n_array) #define setarrdim(node,len) ((node)->n_dim = (len)) #define setarrorg(node,org) ((node)->n_org = (org)) #define setarrptr(node,ptr) ((node)->n_array = (ptr)) #ifdef OBJECTS #define n_vars nunion.nobject.nvars #define n_procs nunion.nobject.nprocs #define n_parents nunion.nobject.nparents #define getvars(node) ((node)->n_vars) #define getprocs(node) ((node)->n_procs) #define getparents(node) ((node)->n_parents) #define setvars(node, vars) ((node)->n_vars = (vars)) #define setprocs(node, procs) ((node)->n_procs = (procs)) #define setparents(node, parents) ((node)->n_parents = (parents)) #define getsymbol(frame) car(frame) #define getvalue(frame) cadr(frame) #define n_parent nunion.nmethod.nparent #define n_procname nunion.nmethod.nprocname #define getparent(node) ((node)->n_parent) #define getprocname(node) ((node)->n_procname) #endif /* OBJECTS */ #ifdef ecma #define clearparity(ch) ecma_clear(ch) #define setparity(ch) ecma_set(ch) #define getparity(ch) ecma_get(ch) #define ecma_begin 003 /* first char used for quoteds */ #else #define clearparity(ch) (ch & 0x7f) #define setparity(ch) (ch | 0x80) #define getparity(ch) (ch & 0x80) #endif typedef enum { RUN, STOP, OUTPUT, THROWING, MACRO_RETURN } CTRLTYPE; struct segment { struct segment *next; FIXNUM size; #ifdef mac struct logo_node nodes[1]; #else #ifdef __RZTC__ struct logo_node nodes[1]; #else struct logo_node nodes[0]; #endif #endif }; #define NOT_THROWING (stopping_flag != THROWING) #define RUNNING (stopping_flag == RUN) #define STOPPING (stopping_flag == STOP) #define canonical__object(o) car(o) #define procnode__object(o) cadr(o) #define setprocnode__object(o,v) setcar(cdr(o), v) #define valnode__object(o) cadr(cdr(o)) #define setvalnode__object(o,v) setcar(cddr(o), v) #define plist__object(o) cadr(cddr(o)) #define setplist__object(o,v) setcar(cdr(cddr(o)), v) #define obflags__object(o) car(cddr(cddr(o))) #define caselistptr__object(o) cddr(cddr(o)) #define caselist__object(o) cdr(cddr(cddr(o))) #define strnode__caseobj(co) car(co) #define object__caseobj(c) cdr(c) #define procnode__caseobj(c) procnode__object(object__caseobj(c)) #define setprocnode__caseobj(c,v) setprocnode__object(object__caseobj(c),v) #define valnode__caseobj(c) valnode__object(object__caseobj(c)) #define setvalnode__caseobj(c,v) setvalnode__object(object__caseobj(c),v) #define plist__caseobj(c) plist__object(object__caseobj(c)) #define setplist__caseobj(c,v) setplist__object(object__caseobj(c),v) #define obflags__caseobj(c) obflags__object(object__caseobj(c)) #define text__procnode(p) car(p) #define formals__procnode(p) caar(p) #define bodylist__procnode(p) cdar(p) #define bodywords__procnode(p) cadr(p) #define setbodywords__procnode(p,v) setcar(cdr(p),v) #define minargs__procnode(p) car(cddr(p)) #define dfltargs__procnode(p) cadr(cddr(p)) #define maxargs__procnode(p) car(cddr(cddr(p))) #define unparsed__runparse(rn) rn #define parsed__runparse(rn) getobject(rn) #define node__quote(q) car(q) #define node__colon(c) car(c) #define valnode__colon(c) valnode__caseobj(node__colon(c)) #define unparsed__tree(t) t #define treepair__tree(t) (getobject(t)) #define settreepair__tree(t, v) setobject(t, v) #define generation__tree(t) (car(treepair__tree(t))) #define setgeneration__tree(t, g) setcar(treepair__tree(t), g) #define tree__tree(t) cdr(treepair__tree(t)) #define settree__tree(t, v) settreepair__tree(t, cons(the_generation, v)) #define unparsed__line(l) (getobject(l)) #define generation__line(l) (generation__tree(unparsed__line(l))) #define tree__line(l) l #define cont__cont(c) (FIXNUM)car(c) #define val__cont(c) cdr(c) /* Object flags. Ones settable by users via bury_helper must come in threes * for proc, val, plist even if meaningless for some of those. */ #define PROC_BURIED 01 #define VAL_BURIED 02 #define PLIST_BURIED 04 #define PROC_TRACED 010 #define VAL_TRACED 020 #define PLIST_TRACED 040 #define PROC_STEPPED 0100 #define VAL_STEPPED 0200 #define PLIST_STEPPED 0400 #define PROC_MACRO 01000 #define PERMANENT 02000 #define HAS_GLOBAL_VALUE 04000 #define IS_LOCAL_VALUE 010000 #ifdef OBJECTS #define MIXED_ARITY 020000 #endif #define PROC_SPECFORM 040000 #define setflag__caseobj(c,f) ((obflags__caseobj(c))->n_int |= (f)) #define clearflag__caseobj(c,f) ((obflags__caseobj(c))->n_int &= ~(f)) #define flag__caseobj(c,f) (int)((obflags__caseobj(c))->n_int & (f)) #define flag__object(o,f) (int)((obflags__object(o))->n_int & (f)) #define setflag__object(c,f) ((obflags__object(c))->n_int |= (f)) #define clearflag__object(c,f) ((obflags__object(c))->n_int &= ~(f)) #define is_macro(c) (flag__caseobj(c, PROC_MACRO)) #define push(obj, stack) stack = cons(obj, stack) #define pop(stack) stack = cdr(stack) /* evaluator labels, needed by macros in other files */ /* (Put the commonly used ones first.) */ #ifdef OBJECTS #define do_list(x) \ x(no_reset_args) x(eval_sequence_continue) \ x(accumulate_arg) x(compound_apply_continue) \ x(after_const_arg) x(begin_seq) x(begin_apply) \ x(set_args_continue) x(macro_return) \ x(repeat_continuation) x(repeat_followup) \ x(runresult_continuation) x(runresult_followup) \ x(catch_continuation) x(catch_followup) x(after_lambda) \ x(after_maybeoutput) \ x(withobject_continuation) x(withobject_followup) \ x(goto_continuation) \ x(begin_line) x(end_line) \ x(all_done) \ x(fall_off_want_output) x(op_want_stop) x(after_constant) #else /* OBJECTS */ #define do_list(x) \ x(no_reset_args) x(eval_sequence_continue) \ x(accumulate_arg) x(compound_apply_continue) \ x(after_const_arg) x(begin_seq) x(begin_apply) \ x(set_args_continue) x(macro_return) \ x(repeat_continuation) x(repeat_followup) \ x(runresult_continuation) x(runresult_followup) \ x(catch_continuation) x(catch_followup) x(after_lambda) \ x(after_maybeoutput) \ x(goto_continuation) \ x(begin_line) x(end_line) \ x(all_done) \ x(fall_off_want_output) x(op_want_stop) x(after_constant) #endif /* OBJECTS */ #define do_enum(x) x, enum labels { do_list(do_enum) NUM_TOKENS }; /* similarly, names that might be translated in Messages file */ #ifdef OBJECTS #define do_trans(x) \ x(true) x(false) x(end) x(output) x(stop) x(goto) x(tag) \ x(if) x(ifelse) x(to) x(macro) x(toplevel) x(system) x(error) x(nothing) \ x(textscreen) x(splitscreen) x(fullscreen) x(paint) x(erase) x(reverse) \ x(wrap) x(fence) x(window) x(sum) x(difference) x(product) x(quotient) \ x(equalp) x(lessp) x(greaterp) x(lessequalp) x(greaterequalp) \ x(notequalp) \ x(name) x(class) x(self) \ x(licenseplate) x(initlist) x(exist) #else #define do_trans(x) \ x(true) x(false) x(end) x(output) x(stop) x(goto) x(tag) \ x(if) x(ifelse) x(to) x(macro) x(toplevel) x(system) x(error) x(nothing) \ x(textscreen) x(splitscreen) x(fullscreen) x(paint) x(erase) x(reverse) \ x(wrap) x(fence) x(window) x(sum) x(difference) x(product) x(quotient) \ x(equalp) x(lessp) x(greaterp) x(lessequalp) x(greaterequalp) \ x(notequalp) #endif #define wd_enum(x) Name_ ## x, enum words { do_trans(wd_enum) NUM_WORDS }; struct wdtrans { NODE *English; NODE *Alt; }; /* evaluator val_status flags, used also in coms.c */ #define VALUE_OK 1 /* [instr instr instr exp] */ #define NO_VALUE_OK 2 /* [instr instr instr instr] */ #define OUTPUT_OK 4 /* [instr instr OUTPUT exp instr] */ #define STOP_OK 8 /* [instr instr STOP instr] */ #define OUTPUT_TAIL 16 /* not [repeat n [... output ...]] */ #define STOP_TAIL 32 /* not [repeat n [... stop ...]] */ /* evaluator registers that need saving around evals */ /* Node pointers must all come before other types. proc must be first; val_status must be first non-node. See end of init(). */ struct registers { NODE *r_proc; /* the procedure definition */ NODE *r_argl; /* evaluated argument list */ NODE *r_unev; /* list of unevaluated expressions */ NODE *r_fun; /* current function name */ NODE *r_ufun; /* current user-defined function name */ NODE *r_var; /* frame pointer into var_stack */ NODE *r_vsp; /* temp ptr into var_stack */ NODE *r_qm_list; /* question mark list */ NODE *r_formals; /* list of formal parameters */ NODE *r_last_ufun; /* the function that called this one */ NODE *r_this_line; /* the current instruction line */ NODE *r_last_line; /* the line that called this one */ NODE *r_current_unode; /* a pair to identify this proc call */ NODE *r_didnt_output_name; /* name of the proc that didn't OP */ NODE *r_didnt_get_output; /* procedure wanting output from EVAL */ FIXNUM r_val_status; /* tells what EVAL_SEQUENCE should do: */ FIXNUM r_tailcall; /* 0 in sequence, 1 for tail, -1 for arg */ FIXNUM r_repcount; /* count for repeat */ FIXNUM r_user_repcount; FIXNUM r_ift_iff_flag; #ifdef OBJECTS NODE *r_usual_parent; NODE *r_usual_caller; #endif }; /* definitions for evaluator registers */ #ifdef WANT_EVAL_REGS #define proc (regs.r_proc) #define argl (regs.r_argl) #define unev (regs.r_unev) #define fun (regs.r_fun) #define ufun (regs.r_ufun) #define var (regs.r_var) #define vsp (regs.r_vsp) #define qm_list (regs.r_qm_list) #define formals (regs.r_formals) #define last_ufun (regs.r_last_ufun) #define this_line (regs.r_this_line) #define last_line (regs.r_last_line) #define current_unode (regs.r_current_unode) #define didnt_output_name (regs.r_didnt_output_name) #define didnt_get_output (regs.r_didnt_get_output) #define val_status (regs.r_val_status) #define tailcall (regs.r_tailcall) #define repcount (regs.r_repcount) #define user_repcount (regs.r_user_repcount) #define ift_iff_flag (regs.r_ift_iff_flag) #ifdef OBJECTS #define usual_parent (regs.r_usual_parent) #define usual_caller (regs.r_usual_caller) #endif #endif #endif /* _LOGO_H */ ucblogo-6.1/lists.c0000664000175000017500000004226313575571772012446 0ustar jjcjjc/* * lists.c logo list functions module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include "logo.h" #include "globals.h" #include NODE *bfable_arg(NODE *args) { NODE *arg = car(args); while ((arg == NIL || arg == UNBOUND || arg == Null_Word || nodetype(arg) == ARRAY) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); } return arg; } NODE *list_arg(NODE *args) { NODE *arg = car(args); while (!(arg == NIL || is_list(arg)) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); } return arg; } NODE *lbutfirst(NODE *args) { NODE *val = UNBOUND, *arg; arg = bfable_arg(args); if (NOT_THROWING) { if (is_list(arg)) val = cdr(arg); else { setcar(args, cnv_node_to_strnode(arg)); arg = car(args); if (getstrlen(arg) > 1) val = make_strnode(getstrptr(arg) + 1, getstrhead(arg), getstrlen(arg) - 1, nodetype(arg), strnzcpy); else val = Null_Word; } } return(val); } NODE *lbutlast(NODE *args) { NODE *val = UNBOUND, *lastnode = NIL, *tnode, *arg; arg = bfable_arg(args); if (NOT_THROWING) { if (is_list(arg)) { args = arg; val = NIL; while (cdr(args) != NIL) { tnode = cons(car(args), NIL); if (val == NIL) { val = tnode; lastnode = tnode; } else { setcdr(lastnode, tnode); lastnode = tnode; } args = cdr(args); if (check_throwing) break; } } else { setcar(args, cnv_node_to_strnode(arg)); arg = car(args); if (getstrlen(arg) > 1) val = make_strnode(getstrptr(arg), getstrhead(arg), getstrlen(arg) - 1, nodetype(arg), strnzcpy); else val = Null_Word; } } return(val); } NODE *lfirst(NODE *args) { NODE *val = UNBOUND, *arg; if (nodetype(car(args)) == ARRAY) { return make_intnode((FIXNUM)getarrorg(car(args))); } arg = bfable_arg(args); if (NOT_THROWING) { if (is_list(arg)) val = car(arg); else { setcar(args, cnv_node_to_strnode(arg)); arg = car(args); val = make_strnode(getstrptr(arg), getstrhead(arg), 1, nodetype(arg), strnzcpy); } } return(val); } NODE *lfirsts(NODE *args) { NODE *val = UNBOUND, *arg, *argp, *tail; arg = list_arg(args); if (car(args) == NIL) return(NIL); if (NOT_THROWING) { val = cons(lfirst(arg), NIL); tail = val; for (argp = cdr(arg); argp != NIL; argp = cdr(argp)) { setcdr(tail, cons(lfirst(argp), NIL)); tail = cdr(tail); if (check_throwing) break; } if (stopping_flag == THROWING) { return UNBOUND; } } return(val); } NODE *lbfs(NODE *args) { NODE *val = UNBOUND, *arg, *argp, *tail; arg = list_arg(args); if (car(args) == NIL) return(NIL); if (NOT_THROWING) { val = cons(lbutfirst(arg), NIL); tail = val; for (argp = cdr(arg); argp != NIL; argp = cdr(argp)) { setcdr(tail, cons(lbutfirst(argp), NIL)); tail = cdr(tail); if (check_throwing) break; } if (stopping_flag == THROWING) { return UNBOUND; } } return(val); } NODE *llast(NODE *args) { NODE *val = UNBOUND, *arg; arg = bfable_arg(args); if (NOT_THROWING) { if (is_list(arg)) { args = arg; while (cdr(args) != NIL) { args = cdr(args); if (check_throwing) break; } val = car(args); } else { setcar(args, cnv_node_to_strnode(arg)); arg = car(args); val = make_strnode(getstrptr(arg) + getstrlen(arg) - 1, getstrhead(arg), 1, nodetype(arg), strnzcpy); } } return(val); } NODE *llist(NODE *args) { return(args); } NODE *lemptyp(NODE *arg) { return torf(car(arg) == NIL || car(arg) == Null_Word); } NODE *char_arg(NODE *args) { NODE *arg = car(args), *val; val = cnv_node_to_strnode(arg); while ((val == UNBOUND || getstrlen(val) != 1) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); val = cnv_node_to_strnode(arg); } setcar(args,val); return(val); } NODE *lascii(NODE *args) { FIXNUM i; NODE *val = UNBOUND, *arg; arg = char_arg(args); if (NOT_THROWING) { if (nodetype(arg) == BACKSLASH_STRING) i = (FIXNUM)(*getstrptr(arg)) & 0377; else i = (FIXNUM)clearparity(*getstrptr(arg)) & 0377; val = make_intnode(i); } return(val); } NODE *lrawascii(NODE *args) { FIXNUM i; NODE *val = UNBOUND, *arg; arg = char_arg(args); if (NOT_THROWING) { i = (FIXNUM)((unsigned char)*getstrptr(arg)); val = make_intnode(i); } return(val); } NODE *lvbarredp(NODE *args) { char i; NODE *arg; arg = char_arg(args); if (NOT_THROWING) { i = *getstrptr(arg); return torf(getparity(i)); } return(UNBOUND); } NODE *lchar(NODE *args) { NODE *val = UNBOUND, *arg; char c; arg = pos_int_arg(args); if (NOT_THROWING) { c = (char)getint(arg); val = make_strnode(&c, (struct string_block *)NULL, 1, STRING, strnzcpy); } return(val); } NODE *lcount(NODE *args) { int cnt = 0; NODE *arg; arg = car(args); if (arg != NIL && arg != Null_Word) { if (is_list(arg)) { args = arg; for (; args != NIL; cnt++) { args = cdr(args); if (check_throwing) break; } } else if (nodetype(arg) == ARRAY) { cnt = getarrdim(arg); } else { setcar(args, cnv_node_to_strnode(arg)); cnt = getstrlen(car(args)); } } return(make_intnode((FIXNUM)cnt)); } NODE *lfput(NODE *args) { NODE *lst, *arg; if (is_word(cadr(args)) && is_word(car(args)) && getstrlen(cnv_node_to_strnode(car(args))) == 1) return lword(args); arg = car(args); lst = list_arg(cdr(args)); if (NOT_THROWING) return cons(arg,lst); else return UNBOUND; } NODE *llput(NODE *args) { NODE *lst, *arg, *val = UNBOUND, *lastnode = NIL, *tnode = NIL; if (is_word(cadr(args)) && is_word(car(args)) && getstrlen(cnv_node_to_strnode(car(args))) == 1) return lword(cons(cadr(args), cons(car(args), NIL))); arg = car(args); lst = list_arg(cdr(args)); if (NOT_THROWING) { val = NIL; while (lst != NIL) { tnode = cons(car(lst), NIL); if (val == NIL) { val = tnode; } else { setcdr(lastnode, tnode); } lastnode = tnode; lst = cdr(lst); if (check_throwing) break; } if (val == NIL) val = cons(arg, NIL); else setcdr(lastnode, cons(arg, NIL)); } return(val); } NODE *string_arg(NODE *args) { NODE *arg = car(args), *val; val = cnv_node_to_strnode(arg); while (val == UNBOUND && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); val = cnv_node_to_strnode(arg); } setcar(args,val); return(val); } NODE *lword(NODE *args) { NODE *val = NIL, *arg = NIL; int cnt = 0; NODETYPES str_type = STRING; if (args == NIL) return Null_Word; val = args; while (val != NIL && NOT_THROWING) { arg = string_arg(val); val = cdr(val); if (NOT_THROWING) { if (backslashed(arg)) str_type = VBAR_STRING; cnt += getstrlen(arg); } } if (NOT_THROWING) val = make_strnode((char *)args, (struct string_block *)NULL, cnt, str_type, word_strnzcpy); /* kludge */ else val = UNBOUND; return(val); } NODE *lsentence(NODE *args) { NODE *tnode = NIL, *lastnode = NIL, *val = NIL, *arg = NIL; while (args != NIL && NOT_THROWING) { arg = car(args); while (nodetype(arg) == ARRAY && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); } args = cdr(args); if (stopping_flag == THROWING) break; if (is_list(arg)) { if (args == NIL) { /* 5.2 */ if (val == NIL) val = arg; else setcdr(lastnode, arg); break; } else while (arg != NIL && NOT_THROWING) { tnode = cons(car(arg), NIL); arg = cdr(arg); if (val == NIL) val = tnode; else setcdr(lastnode, tnode); lastnode = tnode; } } else { tnode = cons(arg, NIL); if (val == NIL) val = tnode; else setcdr(lastnode, tnode); lastnode = tnode; } } if (stopping_flag == THROWING) { return UNBOUND; } return(val); } NODE *lwordp(NODE *arg) { arg = car(arg); return torf(arg != UNBOUND && !aggregate(arg)); } NODE *llistp(NODE *arg) { arg = car(arg); return torf(is_list(arg)); } NODE *lnumberp(NODE *arg) { setcar(arg, cnv_node_to_numnode(car(arg))); return torf(car(arg) != UNBOUND); } NODE *larrayp(NODE *arg) { return torf(nodetype(car(arg)) == ARRAY); } NODE *memberp_help(NODE *args, BOOLEAN notp, BOOLEAN substr) { NODE *obj1, *obj2, *val; int leng; int caseig = varTrue(Caseignoredp); val = FalseName(); obj1 = car(args); obj2 = cadr(args); if (is_list(obj2)) { if (substr) return FalseName(); while (obj2 != NIL && NOT_THROWING) { if (equalp_help(obj1, car(obj2), caseig)) return (notp ? obj2 : TrueName()); obj2 = cdr(obj2); if (check_throwing) break; } return (notp ? NIL : FalseName()); } else if (nodetype(obj2) == ARRAY) { int len = getarrdim(obj2); NODE **data = getarrptr(obj2); if (notp) err_logo(BAD_DATA_UNREC,obj2); if (substr) return FalseName(); while (--len >= 0 && NOT_THROWING) { if (equalp_help(obj1, *data++, caseig)) return TrueName(); } return FalseName(); } else { NODE *tmp; int i; if (aggregate(obj1)) return (notp ? Null_Word : FalseName()); setcar (cdr(args), cnv_node_to_strnode(obj2)); obj2 = cadr(args); setcar (args, cnv_node_to_strnode(obj1)); obj1 = car(args); tmp = NIL; if (obj1 != UNBOUND && obj2 != UNBOUND && getstrlen(obj1) <= getstrlen(obj2) && (substr || (getstrlen(obj1) == 1))) { leng = getstrlen(obj2) - getstrlen(obj1); setcar(cdr(args),make_strnode(getstrptr(obj2), getstrhead(obj2), getstrlen(obj1), nodetype(obj2), strnzcpy)); tmp = cadr(args); for (i = 0; i <= leng; i++) { if (equalp_help(obj1, tmp, caseig)) { if (notp) { setstrlen(tmp,leng+getstrlen(obj1)-i); return tmp; } else return TrueName(); } setstrptr(tmp, getstrptr(tmp) + 1); } } return (notp ? Null_Word : FalseName()); } } NODE *lmemberp(NODE *args) { return(memberp_help(args, FALSE, FALSE)); } NODE *lsubstringp(NODE *args) { return(memberp_help(args, FALSE, TRUE)); } NODE *lmember(NODE *args) { return(memberp_help(args, TRUE, FALSE)); } NODE *integer_arg(NODE *args) { NODE *arg = car(args), *val; FIXNUM i; FLONUM f; val = cnv_node_to_numnode(arg); while ((nodetype(val) != INT) && NOT_THROWING) { if (nodetype(val) == FLOATT && fmod((f = getfloat(val)), 1.0) == 0.0 && f >= -(FLONUM)MAXLOGOINT && f < (FLONUM)MAXLOGOINT) { #if HAVE_IRINT i = irint(f); #else i = (FIXNUM)f; #endif val = make_intnode(i); break; } setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); val = cnv_node_to_numnode(arg); } setcar(args,val); if (nodetype(val) == INT) return(val); return UNBOUND; } FIXNUM int_arg(NODE *args) { NODE *arg =integer_arg(args); if (NOT_THROWING) return getint(arg); return 0; } NODE *litem(NODE *args) { int i; NODE *obj, *val; val = integer_arg(args); obj = cadr(args); while ((obj == NIL || obj == Null_Word) && NOT_THROWING) { setcar(cdr(args), err_logo(BAD_DATA, obj)); obj = cadr(args); } if (NOT_THROWING) { i = getint(val); if (is_list(obj)) { if (i <= 0) { err_logo(BAD_DATA_UNREC, val); return UNBOUND; } while (--i > 0) { obj = cdr(obj); if (obj == NIL) { err_logo(BAD_DATA_UNREC, val); return UNBOUND; } } return car(obj); } else if (nodetype(obj) == ARRAY) { i -= getarrorg(obj); if (i < 0 || i >= getarrdim(obj)) { err_logo(BAD_DATA_UNREC, val); return UNBOUND; } return (getarrptr(obj))[i]; } else { if (i <= 0) { err_logo(BAD_DATA_UNREC, val); return UNBOUND; } setcar (cdr(args), cnv_node_to_strnode(obj)); obj = cadr(args); if (i > getstrlen(obj)) { err_logo(BAD_DATA_UNREC, val); return UNBOUND; } return make_strnode(getstrptr(obj) + i - 1, getstrhead(obj), 1, nodetype(obj), strnzcpy); } } return(UNBOUND); } int circular(NODE *arr, NODE *new) { if (new == NIL) return(0); else if (nodetype(new) == ARRAY) { int i = getarrdim(new); NODE **p = getarrptr(new); if (new == arr) return(1); while (--i >= 0) { if (circular(arr,*p++)) return(1); } return(0); } else if (is_list(new)) { while (new != NIL) { if (circular(arr,car(new))) return(1); new = cdr(new); } return(0); } else return(0); } NODE *setitem_helper(NODE *args, BOOLEAN safe) { int i; NODE *obj, *val, *cont; val = integer_arg(args); obj = cadr(args); while (nodetype(obj) != ARRAY && NOT_THROWING) { setcar(cdr(args), err_logo(BAD_DATA, obj)); obj = cadr(args); } cont = car(cddr(args)); if (NOT_THROWING) { i = getint(val); if (safe) { while (circular(obj,cont) && NOT_THROWING) { setcar(cddr(args), err_logo(BAD_DATA, cont)); cont = car(cddr(args)); } } if (NOT_THROWING) { i -= getarrorg(obj); while ((i < 0 || i >= getarrdim(obj)) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, val)); val = integer_arg(args); i = getint(val); } if (NOT_THROWING) { (getarrptr(obj))[i] = cont; check_valid_oldyoung(obj, cont); } } } return(UNBOUND); } NODE *lsetitem(NODE *args) { return setitem_helper(args, TRUE); } NODE *l_setitem(NODE *args) { return setitem_helper(args, FALSE); } NODE *larray(NODE *args) { NODE *arg; FIXNUM d, o; arg = pos_int_arg(args); if (cdr(args) != NIL) o = int_arg(cdr(args)); else o = 1; if (NOT_THROWING) { d = getint(arg); arg = make_array(d); setarrorg(arg,o); return arg; } return UNBOUND; } NODE *llisttoarray(NODE *args) { int len = 0, org = 1, i; NODE *p, *arr = UNBOUND; while (car(args) != NIL && !is_list(car(args)) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, car(args))); } if (cdr(args) != NIL) { p = cnv_node_to_numnode(car(cdr(args))); while (nodetype(p) != INT && NOT_THROWING) { setcar(cdr(args), err_logo(BAD_DATA, car(cdr(args)))); p = cnv_node_to_numnode(car(cdr(args))); } } if (NOT_THROWING) { for (p = car(args); p != NIL; p = cdr(p)) len++; if (cdr(args) != NIL) org = getint(car(cdr(args))); arr = make_array(len); setarrorg(arr,org); i = 0; for (p = car(args); p != NIL; p = cdr(p)) (getarrptr(arr))[i++] = car(p); } return(arr); } NODE *larraytolist(NODE *args) { NODE *p = NIL, *arg; int i; while (nodetype(car(args)) != ARRAY && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, car(args))); } if (NOT_THROWING) { arg = car(args); for (i = getarrdim(arg) - 1; i >= 0; i--) p = cons(getarrptr(arg)[i], p); return p; } return UNBOUND; } FLONUM float_arg(NODE *args) { NODE *arg = car(args), *val; val = cnv_node_to_numnode(arg); while (!is_number(val) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); val = cnv_node_to_numnode(arg); } setcar(args,val); if (nodetype(val) == FLOATT) return getfloat(val); if (nodetype(val) == INT) return (FLONUM)getint(val); return 0.0; } NODE *lform(NODE *args) { FLONUM number; int width, precision = 0; char result[100]; char format[20]; char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; number = float_arg(args); width = (int)int_arg(cdr(args)); if (width < 0) { print_stringptr = format; print_stringlen = 20; ndprintf((FILE *)NULL,"%p\n",string_arg(cddr(args))); *print_stringptr = '\0'; print_stringptr = old_stringptr; print_stringlen = old_stringlen; } else precision = (int)int_arg(cddr(args)); if (NOT_THROWING) { if (width >= 100) width = 99; if (width < 0) sprintf(result,format,number); else sprintf(result,"%*.*f",width,precision,number); return(make_strnode(result, (struct string_block *)NULL, (int)strlen(result), STRING, strnzcpy)); } return(UNBOUND); } NODE *l_setfirst(NODE *args) { NODE *list, *newval; list = car(args); newval = cadr(args); while (NOT_THROWING && (list == NIL || !is_list(list))) { setcar(args, err_logo(BAD_DATA,list)); list = car(args); } setcar(list,newval); return(UNBOUND); } NODE *l_setbf(NODE *args) { NODE *list, *newval; list = car(args); newval = cadr(args); while (NOT_THROWING && (list == NIL || !is_list(list))) { setcar(args, err_logo(BAD_DATA,list)); list = car(args); } setcdr(list,newval); return(UNBOUND); } ucblogo-6.1/intern.c0000664000175000017500000000751613575571772012611 0ustar jjcjjc/* * intern.c logo data interning module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "logo.h" #include "globals.h" NODE *hash_table[HASH_LEN] = {NIL}; void map_oblist(void (*fcn)()) { int i; NODE *nd; for (i = 0; i < HASH_LEN; i++) for (nd = hash_table[i]; nd != NIL; nd = cdr(nd)) (*fcn) (car(nd)); } FIXNUM hash(char *s, int len) { /* Map S to an integer in the range 0 .. HASH_LEN-1. */ /* Method attributed to Peter Weinberger, adapted from Aho, Sethi, */ /* and Ullman's book, Compilers: Principles, Techniques, and */ /* Tools; figure 7.35. */ unsigned FIXNUM h = 0, g; while (--len >= 0) { h = (h << 4) + (FIXNUM)(*s++); g = h & (0xf << (WORDSIZE-4)); if (g != 0) { h ^= g ^ (g >> (WORDSIZE-8)); } } return h % HASH_LEN; } NODE *make_case(NODE *casestrnd, NODE *obj) { NODE *new_caseobj, *clistptr; clistptr = caselistptr__object(obj); new_caseobj = make_caseobj(casestrnd, obj); setcdr(clistptr, cons(new_caseobj, cdr(clistptr))); return(new_caseobj); } NODE *make_object(NODE *canonical, NODE *oproc, NODE *val, NODE *plist, NODE *casestrnd) { NODE *temp; temp = cons_list(0, canonical, oproc, val, plist, make_intnode((FIXNUM)0), END_OF_LIST); make_case(casestrnd, temp); return(temp); } NODE *make_instance(NODE *casend, NODE *lownd) { NODE *obj; FIXNUM hashind; /* Called only if arg isn't already in hash table */ obj = make_object(lownd, UNDEFINED, UNBOUND, NIL, casend); hashind = hash(getstrptr(lownd), getstrlen(lownd)); push(obj,(hash_table[hashind])); return car(caselist__object(obj)); } NODE *find_instance(NODE *lownd) { NODE *hash_entry, *thisobj = NIL; int cmpresult; hash_entry = hash_table[hash(getstrptr(lownd), getstrlen(lownd))]; while (hash_entry != NIL) { thisobj = car(hash_entry); cmpresult = compare_node(lownd, canonical__object(thisobj), FALSE); if (cmpresult == 0) break; else hash_entry = cdr(hash_entry); } if (hash_entry == NIL) return(NIL); else return(thisobj); } int case_compare(NODE *nd1, NODE *nd2) { if (backslashed(nd1) && backslashed(nd2)) { if (getstrlen(nd1) != getstrlen(nd2)) return(1); return(strncmp(getstrptr(nd1), getstrptr(nd2), getstrlen(nd1))); } if (backslashed(nd1) || backslashed(nd2)) return(1); return(compare_node(nd1, nd2, FALSE)); } NODE *find_case(NODE *strnd, NODE *obj) { NODE *clist; clist = caselist__object(obj); while (clist != NIL && case_compare(strnd, strnode__caseobj(car(clist)))) clist = cdr(clist); if (clist == NIL) return(NIL); else return(car(clist)); } NODE *intern(NODE *nd) { NODE *obj, *casedes, *lownd; if (nodetype(nd) == CASEOBJ) return(nd); nd = cnv_node_to_strnode(nd); lownd = make_strnode(getstrptr(nd), (struct string_block *)NULL, getstrlen(nd), STRING, noparitylow_strnzcpy); if ((obj = find_instance(lownd)) != NIL) { if ((casedes = find_case(nd, obj)) == NIL) casedes = make_case(nd, obj); } else casedes = make_instance(nd, lownd); return(casedes); } ucblogo-6.1/graphics.c0000664000175000017500000015556313575571772013120 0ustar jjcjjc/* * graphics.c logo graphics module mak * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifdef WIN32 #include #endif /* WIN32 */ #define WANT_EVAL_REGS 1 #include "logo.h" /* #include "globals.h" has been moved further down */ #include #ifdef HAVE_WX #include "wxGraphics.h" #elif defined(mac) #include "macterm.h" #elif defined(WIN32) #include "win32trm.h" #elif defined(__RZTC__) #include #include "ztcterm.h" #elif defined(x_window) #include "xgraphics.h" #elif defined(ibm) #include "ibmterm.h" #else #include "nographics.h" #endif /* end this whole big huge tree */ #include "globals.h" #ifdef HAVE_WX int drawToPrinter=0; int turtlePosition_x=0; int turtlePosition_y=0; extern void wx_adjust_label_height(); #endif #if defined(__RZTC__) && !defined(WIN32) /* sowings */ #define total_turtle_bottom_max (-(MaxY/2)) #else #define total_turtle_bottom_max turtle_bottom_max #endif /* types of graphics moves that can be recorded */ #define FINISHED 0 /* must be zero */ #define LINEXY 1 #define MOVEXY 2 #define LABEL 3 #define SETPENVIS 4 #define SETPENMODE 5 #define SETPENCOLOR 6 #define SETPENSIZE 7 #define SETPENPATTERN 8 #define FILLERUP 9 #define ARC 10 #define SETPENRGB 11 #define NEXTBUFFER 12 #define STARTFILL 13 #define ENDFILL 14 #define COLORFILL 15 /* NOTE: See the files (macterm.c and macterm.h) or (ibmterm.c and ibmterm.h) for examples of the functions and macros that this file assumes exist. */ #define One (sizeof(void *)) #define Two (2*One) #define Three (3*One) #define Four (4*One) #define Big (sizeof(FLONUM)) #define PENMODE_PAINT 0 #define PENMODE_ERASE 1 #define PENMODE_REVERSE 2 int internal_penmode = PENMODE_PAINT; int drawing_turtle = 0; enum s_md screen_mode = SCREEN_TEXT; mode_type current_mode = wrapmode; FLONUM turtle_x = 0.0, turtle_y = 0.0, turtle_heading = 0.0; FLONUM x_scale = 1.0, y_scale = 1.0; BOOLEAN turtle_shown = FALSE, user_turtle_shown = TRUE; int graphics_setup = 0; FLONUM wanna_x = 0.0, wanna_y = 0.0; BOOLEAN out_of_bounds = FALSE; void setpos_bynumber(FLONUM, FLONUM); void internal_hideturtle(void); int max_palette_slot = 0; char record_buffer[GR_SIZE]; char *record = 0; FIXNUM record_index = 0; int last_recorded = -1; pen_info orig_pen; BOOLEAN refresh_p = TRUE; BOOLEAN doing_filled = FALSE; /************************************************************/ double pfmod(double x, double y) { double temp = fmod(x,y); if (temp < 0) return temp+y; return temp; } FLONUM cut_error(FLONUM n) { n *= 1000000; n = (n > 0 ? floor(n) : ceil(n)); n /= 1000000; if (n == -0.0) n = 0.0; return(n); } FIXNUM g_round(FLONUM n) { n += (n < 0.0 ? -0.5 : 0.5); if ((n < 0.0 ? -n : n) > MAXLOGOINT) err_logo(TURTLE_OUT_OF_BOUNDS, NIL); if (n < 0.0) return((FIXNUM)ceil(n)); return((FIXNUM)floor(n)); } /************************************************************/ void draw_turtle_helper(void); void check_x_high(void); void check_x_low(void); void forward(FLONUM); void draw_turtle(void) { unsigned int r=0, g=0, b=0; int old_color=pen_color; int save_vis; #ifdef HAVE_WX if (drawToPrinter) return; #endif if (!turtle_shown) { if (!graphics_setup) { graphics_setup++; turtle_shown = TRUE; } return; } drawing_turtle = 1; turtle_shown = 0; /* get_palette(pen_color, &r, &g, &b); if (r==0 && g==0 && b==0) { set_pen_color(7); } */ save_vis=pen_vis; pen_vis = -1; forward(-1); draw_turtle_helper(); /* all that follows is for "turtle wrap" effect */ if ((turtle_y > turtle_top_max - turtle_height) && (current_mode == wrapmode)) { turtle_y -= (screen_height + 1); draw_turtle_helper(); check_x_high(); check_x_low(); turtle_y += (screen_height + 1); } if ((turtle_y < turtle_bottom_max + turtle_height) && (current_mode == wrapmode)) { turtle_y += (screen_height + 1); draw_turtle_helper(); check_x_high(); check_x_low(); turtle_y -= (screen_height + 1); } check_x_high(); check_x_low(); turtle_shown = 0; set_pen_color(old_color); forward(1); set_pen_vis(save_vis); turtle_shown = 1; drawing_turtle = 0; } void check_x_high(void) { if ((turtle_x > turtle_right_max - turtle_height) && (current_mode == wrapmode)) { turtle_x -= (screen_width + 1); draw_turtle_helper(); turtle_x += (screen_width + 1); } } void check_x_low(void) { if ((turtle_x < turtle_left_max + turtle_height) && (current_mode == wrapmode)) { turtle_x += (screen_width + 1); draw_turtle_helper(); turtle_x -= (screen_width + 1); } } void draw_turtle_helper(void) { pen_info saved_pen; FLONUM real_heading; int left_x, left_y, right_x, right_y, top_x, top_y; #if 1 /* Evan Marshall Manning */ double cos_real_heading, sin_real_heading; FLONUM delta_x, delta_y; #endif prepare_to_draw; prepare_to_draw_turtle; save_pen(&saved_pen); plain_xor_pen(); pen_vis = 0; set_pen_width(1); set_pen_height(1); real_heading = -turtle_heading + 90.0; cos_real_heading = cos((FLONUM)(real_heading*degrad)); sin_real_heading = sin((FLONUM)(real_heading*degrad)); delta_x = x_scale*(FLONUM)(sin_real_heading*turtle_half_bottom); delta_y = y_scale*(FLONUM)(cos_real_heading*turtle_half_bottom); left_x = g_round(turtle_x - delta_x); left_y = g_round(turtle_y + delta_y); right_x = g_round(turtle_x + delta_x); right_y = g_round(turtle_y - delta_y); top_x = g_round(turtle_x + x_scale*(FLONUM)(cos_real_heading*turtle_side)); top_y = g_round(turtle_y + y_scale*(FLONUM)(sin_real_heading*turtle_side)); /* move to right, draw to left, draw to top, draw to right */ move_to(screen_x_center + right_x, screen_y_center - right_y); line_to(screen_x_center + left_x, screen_y_center - left_y); line_to(screen_x_center + top_x, screen_y_center - top_y); line_to(screen_x_center + right_x, screen_y_center - right_y); restore_pen(&saved_pen); done_drawing_turtle; done_drawing; } /************************************************************/ void forward_helper(FLONUM); BOOLEAN safe_to_save(void); void save_line(void), save_move(void), save_vis(void), save_mode(void); void save_color(void), save_size(void), save_pattern(void); void save_string(char *, int); void save_arc(FLONUM, FLONUM, FLONUM, FLONUM, FLONUM, FLONUM, FLONUM, FLONUM); void right(FLONUM a) { prepare_to_draw; draw_turtle(); turtle_heading += a; turtle_heading = pfmod(turtle_heading,360.0); draw_turtle(); done_drawing; } NODE *numeric_arg(NODE *args) { NODE *arg = car(args), *val; val = cnv_node_to_numnode(arg); while (val == UNBOUND && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); val = cnv_node_to_numnode(arg); } setcar(args,val); return(val); } NODE *lright(NODE *arg) { NODE *val; FLONUM a; val = numeric_arg(arg); if (NOT_THROWING) { if (nodetype(val) == INT) a = (FLONUM)getint(val); else a = getfloat(val); right(a); } return(UNBOUND); } NODE *lleft(NODE *arg) { NODE *val; FLONUM a; val = numeric_arg(arg); if (NOT_THROWING) { if (nodetype(val) == INT) a = (FLONUM)getint(val); else a = getfloat(val); right(-a); } return(UNBOUND); } FLONUM wrap_right(FLONUM, FLONUM, FLONUM, FLONUM, FLONUM); FLONUM wrap_left(FLONUM, FLONUM, FLONUM, FLONUM, FLONUM); FLONUM wrap_up(FLONUM, FLONUM, FLONUM, FLONUM, FLONUM); FLONUM wrap_down(FLONUM, FLONUM, FLONUM, FLONUM, FLONUM); void forward(FLONUM d) { // #ifndef WIN32 internal_hideturtle(); // #endif prepare_to_draw; draw_turtle(); forward_helper(d); draw_turtle(); done_drawing; wanna_x = turtle_x; wanna_y = turtle_y; out_of_bounds = FALSE; } void forward_helper(FLONUM d) { FLONUM real_heading, dx, dy, x1, y1, x2, y2, newd = 0.0; FIXNUM rx2, ry2; wraploop: if (newd != 0.0) d = newd; real_heading = -turtle_heading + 90.0; x1 = screen_x_coord; y1 = screen_y_coord; dx = (FLONUM)(cos((FLONUM)(real_heading*degrad))*d*x_scale); dy = (FLONUM)(sin((FLONUM)(real_heading*degrad))*d*y_scale); if ((dx < 0 && dx > -0.000001) || (dx > 0 && dx < 0.000001)) dx = 0; if ((dy < 0 && dy > -0.000001) || (dy > 0 && dy < 0.000001)) dy = 0; x2 = x1 + dx; y2 = y1 - dy; move_to(g_round(x1), g_round(y1)); save_move(); if (!drawing_turtle && check_throwing) return; if (internal_penmode == PENMODE_REVERSE && pen_vis == 0 && d > 0.0) { line_to(g_round(x1), g_round(y1)); /* flip the corner */ save_line(); } rx2 = g_round(x2); ry2 = g_round(y2); if (!drawing_turtle && check_throwing) return; if (current_mode == windowmode || (rx2 >= screen_left && rx2 <= screen_right && ry2 >= screen_top && ry2 <= screen_bottom)) { turtle_x = turtle_x + dx; turtle_y = turtle_y + dy; line_to(rx2, ry2); save_line(); } else { if (rx2 > screen_right && g_round(x1) == screen_right) { move_to(screen_left, g_round(y1)); turtle_x = turtle_left_max; goto wraploop; } if (ry2 < screen_top && g_round(y1) == screen_top) { move_to(g_round(x1), screen_bottom); turtle_y = turtle_bottom_max; goto wraploop; } if (rx2 < screen_left && g_round(x1) == screen_left) { move_to(screen_right, g_round(y1)); turtle_x = turtle_right_max; goto wraploop; } if (ry2 > screen_bottom && g_round(y1) == screen_bottom) { move_to(g_round(x1), screen_top); turtle_y = turtle_top_max; goto wraploop; } if ((newd = wrap_right(d, x1, y1, x2, y2)) != 0.0) goto wraploop; if ((newd = wrap_left(d, x1, y1, x2, y2)) != 0.0) goto wraploop; if ((newd = wrap_up(d, x1, y1, x2, y2)) != 0.0) goto wraploop; if ((newd = wrap_down(d, x1, y1, x2, y2)) != 0.0) goto wraploop; } if (internal_penmode == PENMODE_REVERSE && pen_vis == 0 && d < 0.0) { line_to(g_round(screen_x_coord), g_round(screen_y_coord)); save_line(); } } FLONUM wrap_right(FLONUM d, FLONUM x1, FLONUM y1, FLONUM x2, FLONUM y2) { FLONUM yi, newd; FIXNUM ryi; if (x2 > screen_right + 0.5) { yi = ((y2 - y1)/(x2 - x1)) * (screen_right + 1 - x1) + y1; ryi = g_round(yi); if (ryi >= screen_top && ryi <= screen_bottom) { line_to(screen_right, ryi); save_line(); turtle_x = turtle_left_max; turtle_y = screen_y_center - yi; if (current_mode == wrapmode) { newd = d * ((x2 - screen_right - 1)/(x2 - x1)); if (newd*d > 0) return(newd); } else { turtle_x = turtle_right_max; err_logo(TURTLE_OUT_OF_BOUNDS, NIL); } } } return(0.0); } FLONUM wrap_left(FLONUM d, FLONUM x1, FLONUM y1, FLONUM x2, FLONUM y2) { FLONUM yi, newd; FIXNUM ryi; if (x2 < screen_left - 0.5) { yi = ((y1 - y2)/(x2 - x1)) * (x1 + 1 - screen_left) + y1; ryi = g_round(yi); if (ryi >= screen_top && ryi <= screen_bottom) { line_to(screen_left, ryi); save_line(); turtle_x = turtle_right_max; turtle_y = screen_y_center - yi; if (current_mode == wrapmode) { newd = d * ((x2 + 1 - screen_left)/(x2 - x1)); if (newd*d > 0) return(newd); } else { turtle_x = turtle_left_max; err_logo(TURTLE_OUT_OF_BOUNDS, NIL); } } } return(0.0); } FLONUM wrap_up(FLONUM d, FLONUM x1, FLONUM y1, FLONUM x2, FLONUM y2) { FLONUM xi, newd; FIXNUM rxi; if (y2 < screen_top - 0.5) { xi = ((x2 - x1)/(y1 - y2)) * (y1 + 1 - screen_top) + x1; rxi = g_round(xi); if (rxi >= screen_left && rxi <= screen_right) { line_to(rxi, screen_top); save_line(); turtle_x = xi - screen_x_center; turtle_y = turtle_bottom_max; if (current_mode == wrapmode) { newd = d * ((y2 + 1 - screen_top)/(y2 - y1)); if (newd*d > 0) return(newd); } else { turtle_y = turtle_top_max; err_logo(TURTLE_OUT_OF_BOUNDS, NIL); } } else if (rxi >= (screen_left-1) && rxi <= (screen_right+1)) { rxi = (rxi > screen_right ? screen_right : screen_left); line_to(rxi, screen_top); save_line(); turtle_x = xi - screen_x_center; turtle_y = turtle_bottom_max; if (current_mode == wrapmode) { newd = d * ((y2 + 1 - screen_top)/(y2 - y1)); if (newd*d > 0) return(newd); } else { turtle_y = turtle_top_max; err_logo(TURTLE_OUT_OF_BOUNDS, NIL); } } } return(0.0); } FLONUM wrap_down(FLONUM d, FLONUM x1, FLONUM y1, FLONUM x2, FLONUM y2) { FLONUM xi, newd; FIXNUM rxi; if (y2 > screen_bottom + 0.5) { xi = ((x2 - x1)/(y2 - y1)) * (screen_bottom + 1 - y1) + x1; rxi = g_round(xi); if (rxi >= screen_left && rxi <= screen_right) { line_to(rxi, screen_bottom); save_line(); turtle_x = xi - screen_x_center; turtle_y = turtle_top_max; if (current_mode == wrapmode) { newd = d * ((y2 - screen_bottom - 1)/(y2 - y1)); if (newd*d > 0) return(newd); } else { turtle_y = turtle_bottom_max; err_logo(TURTLE_OUT_OF_BOUNDS, NIL); } } else if (rxi >= (screen_left-1) && rxi <= (screen_right+1)) { rxi = (rxi > screen_right ? screen_right : screen_left); line_to(rxi, screen_bottom); save_line(); turtle_x = xi - screen_x_center; turtle_y = turtle_top_max; if (current_mode == wrapmode) { newd = d * ((y2 - screen_bottom - 1)/(y2 - y1)); if (newd*d > 0) return(newd); } else { turtle_y = turtle_bottom_max; err_logo(TURTLE_OUT_OF_BOUNDS, NIL); } } } return(0.0); } FLONUM get_number(NODE *arg) { NODE *val = numeric_arg(arg); if (NOT_THROWING) { if (nodetype(val) == INT) return (FLONUM)getint(val); else return getfloat(val); } else return 0.0; } NODE *lforward(NODE *arg) { FLONUM d = get_number(arg); if (NOT_THROWING) { forward(d); } return(UNBOUND); } NODE *lback(NODE *arg) { FLONUM d = get_number(arg); if (NOT_THROWING) { forward(-d); } return(UNBOUND); } NODE *lshowturtle(NODE *args) { if(!graphics_setup) graphics_setup++; prepare_to_draw; if (!turtle_shown) { turtle_shown = TRUE; draw_turtle(); } done_drawing; user_turtle_shown = TRUE; return(UNBOUND); } void internal_hideturtle() { if(!graphics_setup) graphics_setup++; prepare_to_draw; if (turtle_shown) { draw_turtle(); turtle_shown = FALSE; } done_drawing; } NODE *lhideturtle(NODE *args) { internal_hideturtle(); user_turtle_shown = FALSE; return(UNBOUND); } void fix_turtle_shownness() { if (graphics_setup #if !defined(x_window) || defined(HAVE_WX) && screen_mode != SCREEN_TEXT #endif ) { if(user_turtle_shown) (void)lshowturtle(NIL); } } NODE *lshownp(NODE *args) { return(user_turtle_shown ? TrueName() : FalseName()); } NODE *lsetheading(NODE *arg) { NODE *val; val = numeric_arg(arg); if (NOT_THROWING) { prepare_to_draw; draw_turtle(); if (nodetype(val) == INT) turtle_heading = (FLONUM)getint(val); else turtle_heading = getfloat(val); turtle_heading = pfmod(turtle_heading,360.0); draw_turtle(); done_drawing; } return(UNBOUND); } NODE *lheading(NODE *args) { return(make_floatnode(turtle_heading)); } NODE *vec_arg_helper(NODE *args, BOOLEAN floatok, BOOLEAN three) { NODE *arg = car(args), *val1, *val2, *val3 = NIL; while (NOT_THROWING) { if (arg != NIL && is_list(arg) && cdr(arg) != NIL && (three ? (cddr(arg) != NIL && cdr(cddr(arg)) == NIL) : cddr(arg) == NIL)) { val1 = cnv_node_to_numnode(car(arg)); val2 = cnv_node_to_numnode(cadr(arg)); if (three) val3 = cnv_node_to_numnode(car(cddr(arg))); if (val1 != UNBOUND && val2 != UNBOUND && (floatok || (nodetype(val1) == INT && getint(val1) >= 0 && nodetype(val2) == INT && getint(val2) >= 0 && (!three || (nodetype(val3) == INT && getint(val3) >= 0))))) { setcar(arg, val1); setcar(cdr(arg), val2); if (three) setcar (cddr(arg), val3); return(arg); } } setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); } return(UNBOUND); } NODE *vector_arg(NODE *args) { return vec_arg_helper(args,TRUE,FALSE); } NODE *pos_int_vector_arg(NODE *args) { return vec_arg_helper(args,FALSE,FALSE); } NODE *rgb_arg(NODE *args) { return vec_arg_helper(args,TRUE,TRUE); } FLONUM towards_helper(FLONUM x, FLONUM y, FLONUM from_x, FLONUM from_y) { FLONUM m, a, tx, ty; tx = from_x/x_scale; ty = from_y/y_scale; if (x != tx || y != ty) { if (x == tx) a = (y < ty) ? -90 : 90; else { m = (y - ty)/(x - tx); a = atan(m)/degrad; if (x < tx) a = fmod(a + 180.0,360.0); } a = -(a - 90.0); return (a < 0 ? 360.0+a : a); } return 0.0; } NODE *ltowards(NODE *args) { NODE *xnode, *ynode = UNBOUND, *arg; FLONUM x, y; arg = vector_arg(args); if (NOT_THROWING) { xnode = car(arg); ynode = cadr(arg); x = ((nodetype(xnode) == FLOATT) ? getfloat(xnode) : (FLONUM)getint(xnode)); y = ((nodetype(ynode) == FLOATT) ? getfloat(ynode) : (FLONUM)getint(ynode)); return make_floatnode(towards_helper(x, y, turtle_x, turtle_y)); } return(UNBOUND); } NODE *lpos(NODE *args) { return(cons(make_floatnode(cut_error(turtle_x/x_scale)), cons(make_floatnode(cut_error(turtle_y/y_scale)), NIL))); } NODE *lscrunch(NODE *args) { return(cons(make_floatnode(x_scale), cons(make_floatnode(y_scale), NIL))); } NODE *lhome(NODE *args) { prepare_to_draw; out_of_bounds = FALSE; setpos_bynumber((FLONUM)0.0, (FLONUM)0.0); draw_turtle(); turtle_heading = 0.0; draw_turtle(); done_drawing; return(UNBOUND); } void cs_helper(int centerp) { #if defined(x_window) && !HAVE_WX clearing_screen++; #endif prepare_to_draw; clear_screen; #if defined(x_window) && !HAVE_WX clearing_screen==0; #endif if (centerp) { wanna_x = wanna_y = turtle_x = turtle_y = turtle_heading = 0.0; out_of_bounds = FALSE; move_to(screen_x_coord, screen_y_coord); } if (!graphics_setup) { graphics_setup++; turtle_shown = TRUE; } draw_turtle(); save_pen(&orig_pen); p_info_x(orig_pen) = g_round(screen_x_coord); p_info_y(orig_pen) = g_round(screen_y_coord); (void)safe_to_save(); record = record_buffer; record_index = One; last_recorded = -1; record[record_index] = FINISHED; if (turtle_x != 0.0 || turtle_y != 0.0) save_move(); if (pen_vis != 0) save_vis(); if (internal_penmode != PENMODE_PAINT) save_mode(); if (pen_color != 7) save_color(); if (pen_width != 1 || pen_height != 1) save_size(); done_drawing; } NODE *lclearscreen(NODE *args) { cs_helper(TRUE); return(UNBOUND); } NODE *lclean(NODE *args) { cs_helper(FALSE); return(UNBOUND); } void setpos_commonpart(FLONUM target_x, FLONUM target_y) { FLONUM scaled_x, scaled_y, tx, ty, save_heading; BOOLEAN wrapping = FALSE; if (NOT_THROWING) { scaled_x = target_x * x_scale; scaled_y = target_y * y_scale; wrapping = scaled_x > turtle_right_max || scaled_x < turtle_left_max || scaled_y > turtle_top_max || scaled_y < turtle_bottom_max; if (current_mode == fencemode && wrapping) err_logo(TURTLE_OUT_OF_BOUNDS, NIL); else if (current_mode == wrapmode && (wrapping || out_of_bounds)) { save_heading = turtle_heading; turtle_heading = towards_helper(target_x, target_y, wanna_x, wanna_y); tx = wanna_x/x_scale; ty = wanna_y/y_scale; #define sq(z) ((z)*(z)) forward_helper(sqrt(sq(target_x - tx) + sq(target_y - ty))); turtle_heading = save_heading; wanna_x = scaled_x; wanna_y = scaled_y; out_of_bounds = wrapping; } else { out_of_bounds = FALSE; wanna_x = turtle_x = scaled_x; wanna_y = turtle_y = scaled_y; line_to(g_round(screen_x_coord), g_round(screen_y_coord)); save_line(); } draw_turtle(); done_drawing; } } void setpos_bynumber(FLONUM target_x, FLONUM target_y) { if (NOT_THROWING) { prepare_to_draw; draw_turtle(); move_to(g_round(screen_x_coord), g_round(screen_y_coord)); setpos_commonpart(target_x, target_y); done_drawing; } } void setpos_helper(NODE *xnode, NODE *ynode) { FLONUM target_x, target_y; if (NOT_THROWING) { internal_hideturtle(); prepare_to_draw; draw_turtle(); move_to(g_round(screen_x_coord), g_round(screen_y_coord)); target_x = ((xnode == NIL) ? turtle_x/x_scale : ((nodetype(xnode) == FLOATT) ? getfloat(xnode) : (FLONUM)getint(xnode))); target_y = ((ynode == NIL) ? turtle_y/y_scale : ((nodetype(ynode) == FLOATT) ? getfloat(ynode) : (FLONUM)getint(ynode))); setpos_commonpart(target_x, target_y); done_drawing; } } NODE *lsetpos(NODE *args) { NODE *arg = vector_arg(args); if (NOT_THROWING) { setpos_helper(car(arg), cadr(arg)); } return(UNBOUND); } NODE *lsetxy(NODE *args) { NODE *xnode, *ynode; xnode = numeric_arg(args); ynode = numeric_arg(cdr(args)); if (NOT_THROWING) { setpos_helper(xnode, ynode); } return(UNBOUND); } NODE *lsetx(NODE *args) { NODE *xnode; xnode = numeric_arg(args); if (NOT_THROWING) { setpos_helper(xnode, NIL); } return(UNBOUND); } NODE *lsety(NODE *args) { NODE *ynode; ynode = numeric_arg(args); if (NOT_THROWING) { setpos_helper(NIL, ynode); } return(UNBOUND); } NODE *lwrap(NODE *args) { prepare_to_draw; draw_turtle(); current_mode = wrapmode; while (turtle_x > turtle_right_max) { turtle_x -= screen_width; } while (turtle_x < turtle_left_max) { turtle_x += screen_width; } while (turtle_y > turtle_top_max) { turtle_y -= screen_height; } while (turtle_y < turtle_bottom_max) { turtle_y += screen_height; } move_to(screen_x_coord, screen_y_coord); draw_turtle(); done_drawing; return(UNBOUND); } NODE *lfence(NODE *args) { (void)lwrap(args); /* get turtle inside the fence */ prepare_to_draw; draw_turtle(); current_mode = fencemode; draw_turtle(); done_drawing; return(UNBOUND); } NODE *lwindow(NODE *args) { prepare_to_draw; draw_turtle(); current_mode = windowmode; draw_turtle(); done_drawing; return(UNBOUND); } NODE *lturtlemode(NODE *args) { switch (current_mode) { case wrapmode: return(theName(Name_wrap)); case fencemode: return(theName(Name_fence)); case windowmode: return(theName(Name_window)); } return(UNBOUND); /* Can't get here, but makes compiler happy */ } NODE *lfill(NODE *args) { prepare_to_draw; draw_turtle(); logofill(); draw_turtle(); if (safe_to_save()) { save_move(); last_recorded = record[record_index] = FILLERUP; record_index += One; record[record_index] = FINISHED; } done_drawing; return(UNBOUND); } NODE *llabel(NODE *arg) { char textbuf[300]; short theLength; char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; print_stringptr = textbuf; print_stringlen = 300; ndprintf((FILE *)NULL,"%p",car(arg)); *print_stringptr = '\0'; print_stringptr = old_stringptr; print_stringlen = old_stringlen; if (NOT_THROWING) { prepare_to_draw; draw_turtle(); theLength = strlen(textbuf); #ifdef mac c_to_pascal_string(textbuf, theLength); #endif label(textbuf); save_string(textbuf,theLength); draw_turtle(); done_drawing; } return(UNBOUND); } NODE *ltextscreen(NODE *args) { text_screen; screen_mode = SCREEN_TEXT; return(UNBOUND); } NODE *lsplitscreen(NODE *args) { if (!graphics_setup) { graphics_setup++; // turtle_shown = TRUE; } split_screen; screen_mode = SCREEN_SPLIT; return(UNBOUND); } NODE *lfullscreen(NODE *args) { if (!graphics_setup) { graphics_setup++; // turtle_shown = TRUE; } full_screen; screen_mode = SCREEN_FULL; return(UNBOUND); } NODE *lscreenmode(NODE *args) { switch (screen_mode) { case SCREEN_TEXT: return(theName(Name_textscreen)); case SCREEN_SPLIT: return(theName(Name_splitscreen)); case SCREEN_FULL: return(theName(Name_fullscreen)); } return(UNBOUND); /* Can't get here, but makes compiler happy */ } NODE *lpendownp(NODE *args) { return(pen_vis == 0 ? TrueName() : FalseName()); } NODE *lpencolor(NODE *args) { if (pen_color == PEN_COLOR_OFFSET) return lpalette(cons(make_intnode(PEN_COLOR_OFFSET),NIL)); return(make_intnode((FIXNUM)pen_color)); } NODE *lbackground(NODE *args) { if (back_ground == BACKGROUND_COLOR_OFFSET) return lpalette(cons(make_intnode(BACKGROUND_COLOR_OFFSET),NIL)); return(make_intnode((FIXNUM)back_ground)); } NODE *lpensize(NODE *args) { return(cons(make_intnode((FIXNUM)pen_width), cons(make_intnode((FIXNUM)pen_height), NIL))); } NODE *lpenpattern(NODE *args) { return(get_node_pen_pattern); } NODE *lpendown(NODE *args) { pen_vis = 0; save_vis(); return(UNBOUND); } NODE *lpenup(NODE *args) { if (pen_vis == 0) pen_vis--; save_vis(); return(UNBOUND); } NODE *lpenpaint(NODE *args) { internal_penmode = PENMODE_PAINT; pen_down; save_mode(); return(lpendown(NIL)); } NODE *lpenerase(NODE *args) { internal_penmode = PENMODE_ERASE; pen_erase; save_mode(); return(lpendown(NIL)); } NODE *lpenreverse(NODE *args) { internal_penmode = PENMODE_REVERSE; pen_reverse; save_mode(); return(lpendown(NIL)); } NODE *lpenmode(NODE *args) { switch(internal_penmode) { case PENMODE_PAINT: return theName(Name_paint); case PENMODE_ERASE: return theName(Name_erase); case PENMODE_REVERSE: return theName(Name_reverse); } return(UNBOUND); /* Can't get here, but makes compiler happy */ } NODE *lsetpencolor(NODE *arg) { NODE *val; if (NOT_THROWING) { prepare_to_draw; if (is_list(car(arg))) { val = make_intnode(PEN_COLOR_OFFSET); lsetpalette(cons(val,arg)); } else val = pos_int_arg(arg); set_pen_color(getint(val)); save_color(); done_drawing; } return(UNBOUND); } NODE *lsetbackground(NODE *arg) { NODE *val; if (!graphics_setup) { graphics_setup++; turtle_shown=TRUE; } if (NOT_THROWING) { prepare_to_draw; if (is_list(car(arg))) { val = make_intnode(BACKGROUND_COLOR_OFFSET); lsetpalette(cons(val,arg)); } else val = pos_int_arg(arg); set_back_ground(getint(val)); done_drawing; } return(UNBOUND); } NODE *lsetpalette(NODE *args) { NODE *slot = integer_arg(args); NODE *arg = rgb_arg(cdr(args)); int slotnum = (int)getint(slot); if (slotnum < -SPECIAL_COLORS) { err_logo(BAD_DATA_UNREC, slot); } else if (NOT_THROWING && ((slotnum > 7) || (slotnum < 0))) { // prepare_to_draw; set_palette(slotnum, (unsigned int)(get_number(arg)*65535/100.0), (unsigned int)(get_number(cdr(arg))*65535/100.0), (unsigned int)(get_number(cddr(arg))*65535/100.0)); if (pen_color == slotnum) { set_pen_color(slotnum); } // done_drawing; if (slotnum > max_palette_slot) max_palette_slot = slotnum; } return(UNBOUND); } NODE *make_rgbnode(unsigned int val) { FLONUM result=val * 100.0 / 65535.0; if (result == g_round(result)) return make_intnode((FIXNUM)result); else return make_floatnode(result); } NODE *lpalette(NODE *args) { NODE *arg = integer_arg(args); unsigned int r=0, g=0, b=0; if (getint(arg) < -SPECIAL_COLORS) err_logo(BAD_DATA_UNREC, arg); if (NOT_THROWING) { get_palette((int)getint(arg), &r, &g, &b); return cons(make_rgbnode(r), cons(make_rgbnode(g), cons(make_rgbnode(b), NIL))); } return UNBOUND; } void save_palette(FILE *fp) { unsigned int colors[3]; int i; fwrite(&max_palette_slot, sizeof(int), 1, fp); for (i=8; i <= max_palette_slot; i++) { get_palette(i, &colors[0], &colors[1], &colors[2]); fwrite(colors, sizeof(int), 3, fp); } } void restore_palette(FILE *fp) { unsigned int colors[3]; int i, nslots; fread(&nslots, sizeof(int), 1, fp); if (nslots > max_palette_slot) max_palette_slot = nslots; for (i=8; i <= nslots; i++) { fread(colors, sizeof(int), 3, fp); set_palette(i, colors[0], colors[1], colors[2]); } } NODE *lsetpensize(NODE *args) { NODE *arg; prepare_to_draw; if (is_list(car(args))) { arg = pos_int_vector_arg(args); if (NOT_THROWING) { set_pen_width((int)getint(car(arg))); set_pen_height((int)getint(cadr(arg))); } } else { /* 5.5 accept single number for [n n] */ arg = pos_int_arg(args); if (NOT_THROWING) { set_pen_width((int)getint(arg)); set_pen_height((int)getint(arg)); } } if (NOT_THROWING) save_size(); done_drawing; return(UNBOUND); } NODE *lsetpenpattern(NODE *args) { NODE *arg; arg = car(args); while ((!is_list(arg)) && NOT_THROWING) arg = err_logo(BAD_DATA, arg); if (NOT_THROWING) { prepare_to_draw; set_list_pen_pattern(arg); save_pattern(); done_drawing; } return(UNBOUND); } NODE *lsetscrunch(NODE *args) { NODE *xnode, *ynode; xnode = numeric_arg(args); ynode = numeric_arg(cdr(args)); if (NOT_THROWING) { prepare_to_draw; draw_turtle(); x_scale = (nodetype(xnode) == FLOATT) ? getfloat(xnode) : (FLONUM)getint(xnode); y_scale = (nodetype(ynode) == FLOATT) ? getfloat(ynode) : (FLONUM)getint(ynode); draw_turtle(); done_drawing; #ifdef __RZTC__ { FILE *fp = fopen("scrunch.dat","r"); if (fp != NULL) { fclose(fp); fp = fopen("scrunch.dat","w"); if (fp != NULL) { fwrite(&x_scale, sizeof(FLONUM), 1, fp); fwrite(&y_scale, sizeof(FLONUM), 1, fp); fclose(fp); } } } #endif #ifdef HAVE_WX //update the label height! wx_adjust_label_height(); #endif } return(UNBOUND); } NODE *lmousepos(NODE *args) { return(cons(make_floatnode(mouse_x/x_scale), cons(make_floatnode(mouse_y/y_scale), NIL))); } #ifdef HAVE_WX NODE *lclickpos(NODE *args) { return(cons(make_floatnode(click_x/x_scale), cons(make_floatnode(click_y/y_scale), NIL))); } #endif NODE *lbuttonp(NODE *args) { if (button) return(TrueName()); return(FalseName()); } NODE *lbutton(NODE *args) { #ifdef HAVE_WX return(make_intnode(lastbutton)); #else return(make_intnode(button)); #endif } NODE *ltone(NODE *args) { NODE *p, *d; FIXNUM pitch, duration; p = numeric_arg(args); d = numeric_arg(cdr(args)); if (NOT_THROWING) { pitch = (nodetype(p) == FLOATT) ? (FIXNUM)getfloat(p) : getint(p); duration = (nodetype(d) == FLOATT) ? (FIXNUM)getfloat(d) : getint(d); if (pitch > 0) tone(pitch, duration); } return(UNBOUND); } void do_arc(FLONUM count, FLONUM ang, FLONUM radius, FLONUM delta, FLONUM tx, FLONUM ty, FLONUM angle, FLONUM thead, BOOLEAN save) { FLONUM x; FLONUM y; FLONUM i; BOOLEAN save_refresh = refresh_p; FLONUM save_x = turtle_x; FLONUM save_y = turtle_y; int pen_state; refresh_p = 0; if (save) { x = sin(ang*3.141592654/180.0)*radius; y = cos(ang*3.141592654/180.0)*radius; turtle_x = tx+x*x_scale; turtle_y = ty+y*y_scale; } /* draw each line segment of arc (will do wrap) */ for (i=1.0;i<=count;i=i+1.0) { /* calc x y */ x = sin(ang*3.141592654/180.0)*radius; y = cos(ang*3.141592654/180.0)*radius; setpos_bynumber(tx/x_scale+x, ty/y_scale+y); ang = ang + delta; } /* assure we draw something and end in the exact right place */ x = sin((thead+angle)*3.141592654/180.0)*radius; y = cos((thead+angle)*3.141592654/180.0)*radius; setpos_bynumber(tx/x_scale+x, ty/y_scale+y); if (save) { pen_state = pen_vis; pen_vis = -1; setpos_bynumber(tx/x_scale, ty/y_scale); pen_vis = pen_state; turtle_x = save_x; turtle_y = save_y; } refresh_p = save_refresh; } NODE *larc(NODE *arg) { NODE *val1; NODE *val2; FLONUM angle; FLONUM radius; FLONUM ang; FLONUM tx; FLONUM ty; FLONUM count; FLONUM delta; FLONUM x; FLONUM y; int turtle_state; int pen_state; /* get args */ val1 = numeric_arg(arg); val2 = numeric_arg(cdr(arg)); if (NOT_THROWING) { if (nodetype(val1) == INT) angle = (FLONUM)getint(val1); else angle = getfloat(val1); if (nodetype(val2) == INT) radius = (FLONUM)getint(val2); else radius = getfloat(val2); internal_hideturtle(); prepare_to_draw; draw_turtle(); /* save and force turtle state */ turtle_state = turtle_shown; turtle_shown = 0; /* grab things before they change and use for restore */ ang = turtle_heading; tx = turtle_x; ty = turtle_y; /* calculate resolution parameters */ if (angle > 360.0) angle = 360.0+fmod(angle, 360.0); if (angle < -360.0) angle = -(360.0+fmod(-angle, 360.0)); count = fabs(angle*radius/200.0); /* 4.5 */ if (count == 0.0) count = 1.0; delta = angle/count; /* jump to begin of first line segment without drawing */ x = sin(ang*3.141592654/180.0)*radius; y = cos(ang*3.141592654/180.0)*radius; pen_state = pen_vis; pen_vis = -1; save_vis(); setpos_bynumber(tx/x_scale+x, ty/y_scale+y); pen_vis = pen_state; save_vis(); ang = ang + delta; save_arc(count, ang, radius, delta, tx, ty, angle, turtle_heading); do_arc(count, ang, radius, delta, tx, ty, angle, turtle_heading, 0); /* restore state */ pen_state = pen_vis; pen_vis = -1; save_vis(); setpos_bynumber(tx/x_scale, ty/y_scale); pen_vis = pen_state; save_vis(); turtle_shown = turtle_state; draw_turtle(); wanna_x = turtle_x; wanna_y = turtle_y; out_of_bounds = FALSE; pen_state = pen_vis; pen_vis = -1; save_vis(); forward_helper((FLONUM)0.0); /* Lets fill work -- dunno why */ pen_vis = pen_state; save_vis(); done_drawing; } return(UNBOUND); } #ifdef HAVE_WX int insidefill = 0; struct mypoint { int x,y; }; NODE *lfilled(NODE *args) { NODE *val, *arg; char *start, *ptr; int start_idx, idx, count, color; unsigned int r,g,b; struct mypoint *points, *point; FLONUM x1,y1,lastx,lasty; int old_refresh = refresh_p; prepare_to_draw; if (is_list(car(args))) { val = make_intnode(FILLED_COLOR_OFFSET); lsetpalette(cons(val,args)); } else val = pos_int_arg(args); done_drawing; color = getint(val); old_refresh = refresh_p; refresh_p = 1; /* have to save polygon to fill it */ if (!safe_to_save() || insidefill) { err_logo(BAD_GRAPH_INIT, NIL); refresh_p = old_refresh; return UNBOUND; } insidefill = 1; start = record; start_idx = record_index; x1 = screen_x_coord; y1 = screen_y_coord; arg = runnable_arg(cdr(args)); if (NOT_THROWING) { last_recorded = record[record_index] = STARTFILL; record_index += Three; /* Will be filled in at endfill */ record[record_index] = FINISHED; if (color == FILLED_COLOR_OFFSET) { get_palette(FILLED_COLOR_OFFSET, &r, &g, &b); last_recorded = record[record_index] = COLORFILL; *(unsigned int *)(record + record_index + One) = r; *(unsigned int *)(record + record_index + Two) = g; *(unsigned int *)(record + record_index + Three) = b; record_index += Four; } doing_filled = TRUE; (void)evaluator(arg, begin_line); doing_filled = FALSE; } insidefill = 0; if (!safe_to_save()) { err_logo(BAD_GRAPH_INIT, NIL); refresh_p = old_refresh; return UNBOUND; } if (NOT_THROWING) { last_recorded = record[record_index] = ENDFILL; *(char **)(record + record_index + One) = start; *(int *)(record + record_index + Two) = start_idx; record_index += Three; record[record_index] = FINISHED; count=0; for (ptr = start, idx = start_idx; ptr[idx] != FINISHED; ) { switch (ptr[idx]) { case (LINEXY) : case (MOVEXY) : count++; case (SETPENMODE) : case (SETPENSIZE) : case (STARTFILL) : case (ENDFILL) : idx += Three; break; case (LABEL) : idx += (One+2 + ptr[idx + One] + (One-1)) & ~(One-1); break; case (SETPENVIS) : case (FILLERUP) : idx += One; break; case (SETPENCOLOR) : idx += Two; break; case (SETPENRGB) : case (COLORFILL) : idx += Four; break; case (SETPENPATTERN) : idx += One+8; break; case (ARC) : idx += 9*Big; break; case (NEXTBUFFER): ptr = *(char **)(ptr); idx = One; break; } } point = points = malloc((count+1)*sizeof(struct mypoint)); point->x = g_round(x1); point->y = g_round(y1); point++; ptr = start; idx = start_idx; *(int *)(start + start_idx + One) = count+1; *(int *)(start + start_idx + Two) = color; while (ptr[idx] != FINISHED) { switch (ptr[idx]) { case (LINEXY) : case (MOVEXY) : lastx = *(int *)(ptr + idx + One); lasty = *(int *)(ptr + idx + Two); point->x = screen_x_center+lastx; point->y = screen_y_center-lasty; point++; case (SETPENMODE) : case (SETPENSIZE) : case (STARTFILL) : case (ENDFILL) : idx += Three; break; case (LABEL) : idx += (One+2 + ptr[idx + One] + (One-1)) & ~(One-1); break; case (SETPENVIS) : case (FILLERUP) : idx += One; break; case (SETPENCOLOR) : idx += Two; break; case (SETPENRGB) : case (COLORFILL) : idx += Four; break; case (SETPENPATTERN) : idx += One+8; break; case (ARC) : idx += 9*Big; break; case (NEXTBUFFER): ptr = *(char **)(ptr); idx = One; break; } } doFilled(color, count+1, points); free(points); } refresh_p = old_refresh; if (!refresh_p) { record = start; record_index = start_idx; record[record_index] = FINISHED; } return UNBOUND; } NODE *lprintpict(NODE *args) { if (args != NIL) wxlPrintPreviewPict(); else wxlPrintPict(); return UNBOUND; } NODE *lprinttext(NODE *args) { if (args != NIL) wxlPrintPreviewText(); else wxlPrintText(); return UNBOUND; } #endif /************************************************************/ /* The rest of this file implements the recording of moves in the graphics window and the playing back of those moves. It's needed on machines like the Macintosh where the contents of the graphics window can get erased and need to be redrawn. On machines where no graphics redrawing is necessary, set the size of the recording buffer to 1 in logo.h. */ BOOLEAN safe_to_save(void) { char *newbuf; if (!refresh_p || drawing_turtle) return FALSE; if (record == 0) { /* first time */ record = record_buffer; *(char **)(record) = 0; record_index = One; return TRUE; } if (record_index < (GR_SIZE - 300)) return TRUE; /* room here */ if (*(char **)(record) != 0) { /* already allocated next one */ *(record + record_index) = NEXTBUFFER; record = *(char **)(record); record_index = One; return TRUE; } newbuf = malloc(GR_SIZE); /* get a new buffer */ if (newbuf == NULL) return FALSE; /* failed */ *(record + record_index) = NEXTBUFFER; *(char **)(record) = newbuf; record = newbuf; *(char **)(record) = 0; record_index = One; return TRUE; } void save_lm_helper (void) { *(int *)(record + record_index + One) = g_round(turtle_x); *(int *)(record + record_index + Two) = g_round(turtle_y); record_index += Three; } void save_line(void) { if (safe_to_save()) { last_recorded = record[record_index] = LINEXY; save_lm_helper(); record[record_index] = FINISHED; } } void save_move(void) { if (safe_to_save()) { if (record_index >= Three && last_recorded == MOVEXY && !doing_filled) record_index -= Three; last_recorded = record[record_index] = MOVEXY; save_lm_helper(); record[record_index] = FINISHED; } } void save_vis(void) { if (safe_to_save()) { last_recorded = record[record_index] = SETPENVIS; record[record_index + 1] = pen_vis; record_index += One; record[record_index] = FINISHED; } } void save_mode(void) { if (safe_to_save()) { last_recorded = record[record_index] = SETPENMODE; #if defined(x_window) && !HAVE_WX *(GC *)(record + record_index + One) = pen_mode; #else *(int *)(record + record_index + One) = pen_mode; #endif *(int *)(record + record_index + Two) = internal_penmode; record_index += Three; save_color(); } } void save_color(void) { unsigned int r,g,b; if (safe_to_save()) { if (pen_color == PEN_COLOR_OFFSET) { get_palette(pen_color, &r, &g, &b); last_recorded = record[record_index] = SETPENRGB; *(unsigned int *)(record + record_index + One) = r; *(unsigned int *)(record + record_index + Two) = g; *(unsigned int *)(record + record_index + Three) = b; record_index += Four; } else { last_recorded = record[record_index] = SETPENCOLOR; *(int *)(record + record_index + One) = pen_color; record_index += Two; } record[record_index] = FINISHED; } } void save_size(void) { if (safe_to_save()) { last_recorded = record[record_index] = SETPENSIZE; *(int *)(record + record_index + One) = pen_width; *(int *)(record + record_index + Two) = pen_height; record_index += Three; record[record_index] = FINISHED; } } void save_pattern(void) { if (safe_to_save()) { last_recorded = record[record_index] = SETPENPATTERN; get_pen_pattern(&record[record_index + One]); record_index += One+8; record[record_index] = FINISHED; } } void save_string(char *s, int len) { int count; if (safe_to_save()) { last_recorded = record[record_index] = LABEL; record[record_index + One] = (unsigned char)len; for (count = 0; count <= len; count++) record[record_index + One+1 + count] = s[count]; record[record_index + One+2 + len] = '\0'; record_index += (One+2 + len + (One-1)) & ~(One-1); record[record_index] = FINISHED; } } void save_arc(FLONUM count, FLONUM ang, FLONUM radius, FLONUM delta, FLONUM tx, FLONUM ty, FLONUM angle, FLONUM thead) { if (safe_to_save()) { last_recorded = record[record_index] = ARC; *(FLONUM *)(record + record_index + Big) = count; *(FLONUM *)(record + record_index + 2 * Big) = ang; *(FLONUM *)(record + record_index + 3 * Big) = radius; *(FLONUM *)(record + record_index + 4 * Big) = delta; *(FLONUM *)(record + record_index + 5 * Big) = tx; *(FLONUM *)(record + record_index + 6 * Big) = ty; *(FLONUM *)(record + record_index + 7 * Big) = angle; *(FLONUM *)(record + record_index + 8 * Big) = thead; record_index += 9*Big; record[record_index] = FINISHED; } } NODE *lrefresh(NODE *args) { refresh_p = TRUE; return(UNBOUND); } NODE *lnorefresh(NODE *args) { refresh_p = FALSE; return(UNBOUND); } void redraw_graphics(void) { FLONUM save_tx, save_ty, save_th; FIXNUM r_index = One; char *bufp = record_buffer; int lastx, lasty; pen_info saved_pen; BOOLEAN saved_shown; #if defined(__RZTC__) && !defined(WIN32) BOOLEAN save_splitscreen = in_splitscreen; #endif #ifdef HAVE_WX char *start, *ptr; int start_idx, idx, count, color; unsigned int r,g,b; struct mypoint *points = 0, *point = 0; #endif if (!refresh_p ) { /* clear_screen; draw_turtle(); */ return; } prepare_to_draw; if(!graphics_setup){ done_drawing; return; } save_tx = turtle_x; save_ty = turtle_y; save_th = turtle_heading; saved_shown = turtle_shown; turtle_shown = FALSE; save_pen(&saved_pen); restore_pen(&orig_pen); #if defined(__RZTC__) && !defined(WIN32) full_screen; #endif erase_screen(); wanna_x = wanna_y = turtle_x = turtle_y = turtle_heading = 0.0; out_of_bounds = FALSE; move_to(screen_x_coord, screen_y_coord); internal_penmode = PENMODE_PAINT; pen_down; set_pen_color((FIXNUM)7); set_pen_width(1); set_pen_height(1); #ifdef __TURBOC__ moveto(p_info_x(orig_pen),p_info_y(orig_pen)); #endif lastx = lasty = 0; while (bufp[r_index] != FINISHED) { turtle_x = (FLONUM)(lastx); turtle_y = (FLONUM)(lasty); switch (bufp[r_index]) { case (LINEXY) : lastx = *(int *)(bufp + r_index + One); lasty = *(int *)(bufp + r_index + Two); line_to(screen_x_center+lastx, screen_y_center-lasty); r_index += Three; #ifdef HAVE_WX if (point != NULL) { point->x = screen_x_center+lastx; point->y = screen_y_center-lasty; point++; } #endif break; case (MOVEXY) : lastx = *(int *)(bufp + r_index + One); lasty = *(int *)(bufp + r_index + Two); move_to(screen_x_center+lastx, screen_y_center-lasty); r_index += Three; #ifdef HAVE_WX if (point != NULL) { point->x = screen_x_center+lastx; point->y = screen_y_center-lasty; point++; } #endif break; case (LABEL) : draw_string((unsigned char *)(bufp + r_index + One+1)); move_to(screen_x_center+lastx, screen_y_center-lasty); r_index += (One+2 + bufp[r_index + One] + (One-1)) & ~(One-1); break; case (SETPENVIS) : set_pen_vis(bufp[r_index + 1]); r_index += One; break; case (SETPENMODE) : #if defined(x_window) && !HAVE_WX set_pen_mode(*(GC *)(bufp + r_index + One)); #else set_pen_mode(*(int *)(bufp + r_index + One)); #endif internal_penmode = *(int *)(bufp + r_index + Two); r_index += Three; break; case (SETPENCOLOR) : set_pen_color((FIXNUM)(*(int *)(bufp + r_index + One))); r_index += Two; break; case (SETPENRGB) : set_palette(PEN_COLOR_OFFSET, (*(int *)(bufp + r_index + One)), (*(int *)(bufp + r_index + Two)), (*(int *)(bufp + r_index + Three))); set_pen_color((FIXNUM)(PEN_COLOR_OFFSET)); r_index += Four; break; case (COLORFILL) : #ifdef HAVE_WX set_palette(FILLED_COLOR_OFFSET, (*(int *)(bufp + r_index + One)), (*(int *)(bufp + r_index + Two)), (*(int *)(bufp + r_index + Three))); #endif r_index += Four; break; case (STARTFILL) : #ifdef HAVE_WX point = points = malloc((*(int *)(bufp + r_index + One)) * sizeof(struct mypoint)); if (point != NULL) { point->x = screen_x_center+lastx; point->y = screen_y_center-lasty; point++; } #endif r_index += Three; break; case (ENDFILL) : #ifdef HAVE_WX start = *(char **)(bufp + r_index + One); start_idx = *(int *)(bufp + r_index + Two); doFilled((*(int *)(start + start_idx + Two)), (*(int *)(start + start_idx + One)), points); free(points); point = points = 0; #endif r_index += Three; break; case (SETPENSIZE) : set_pen_width(*(int *)(bufp + r_index + One)); set_pen_height(*(int *)(bufp + r_index + Two)); r_index += Three; break; case (SETPENPATTERN) : set_pen_pattern(&bufp[r_index + One]); r_index += One+8; break; case (FILLERUP) : logofill(); r_index += One; break; case (ARC) : do_arc(*(FLONUM *)(bufp + r_index + Big), *(FLONUM *)(bufp + r_index + 2 * Big), *(FLONUM *)(bufp + r_index + 3 * Big), *(FLONUM *)(bufp + r_index + 4 * Big), *(FLONUM *)(bufp + r_index + 5 * Big), *(FLONUM *)(bufp + r_index + 6 * Big), *(FLONUM *)(bufp + r_index + 7 * Big), *(FLONUM *)(bufp + r_index + 8 * Big), 1); r_index += 9*Big; break; case (NEXTBUFFER): bufp = *(char **)(bufp); r_index = One; break; } } restore_pen(&saved_pen); turtle_shown = saved_shown; #if defined(__RZTC__) && !defined(WIN32) if (save_splitscreen) {split_screen;} #endif turtle_x = save_tx; turtle_y = save_ty; turtle_heading = save_th; draw_turtle(); done_drawing; } NODE *lsavepict(NODE *args) { FILE *fp; static int bg; FIXNUM want, cnt; FIXNUM zero = 0; char *p; char *buf = record_buffer; #if defined(WIN32)||defined(ibm) extern NODE *lopen(NODE *, char *); lopen(args,"wb"); #else lopenwrite(args); #endif if (NOT_THROWING) { fp = (FILE *)file_list->n_obj; save_palette(fp); fwrite(&record_index, sizeof(FIXNUM), 1, fp); while (buf != record) { want = GR_SIZE; p = buf; while (want > 0) { cnt = fwrite(p, 1, want, fp); if (ferror(fp) || cnt <= 0) { err_logo(FILE_ERROR, make_static_strnode("File too big")); lclose(args); return UNBOUND; } want -= cnt; p += cnt; } buf = *(char **)(buf); } (void)fwrite(&zero, One, 1, fp); want = record_index; p = record + One; while (want > 0) { cnt = fwrite(p, 1, want, fp); if (ferror(fp) || cnt <= 0) { err_logo(FILE_ERROR, make_static_strnode("File too big")); lclose(args); return UNBOUND; } want -= cnt; p += cnt; } bg = (int)back_ground; fwrite(&bg, sizeof(int), 1, fp); lclose(args); } return UNBOUND; } NODE *lloadpict(NODE *args) { FILE *fp; static int bg; FIXNUM want, cnt, next, rec_idx; char *p, *buf=record_buffer, *newbuf; #if defined(WIN32)||defined(ibm) extern NODE *lopen(NODE *, char *); lopen(args,"rb"); #else lopenread(args); #endif if (NOT_THROWING) { prepare_to_draw; fp = (FILE *)file_list->n_obj; restore_palette(fp); fread(&rec_idx, sizeof(FIXNUM), 1, fp); if (rec_idx < 0 || rec_idx >= GR_SIZE) { err_logo(FILE_ERROR, make_static_strnode("File bad format")); lclose(args); return UNBOUND; } (void)fread(&next, One, 1, fp); while (next != 0) { want = GR_SIZE - One; p = buf + One; while (want > 0) { cnt = fread(p, 1, want, fp); if (ferror(fp) || cnt <= 0) { record_index = 0; last_recorded = -1; done_drawing; err_logo(FILE_ERROR, make_static_strnode("File bad format")); lclose(args); return UNBOUND; } want -= cnt; p += cnt; } newbuf = *(char **)(buf); if (newbuf == 0) { newbuf = malloc(GR_SIZE); /* get a new buffer */ if (newbuf == NULL) { done_drawing; err_logo(FILE_ERROR, make_static_strnode("Not enough memory.")); lclose(args); return UNBOUND; } *(char **)(buf) = newbuf; } buf = newbuf; (void)fread(&next, One, 1, fp); } want = rec_idx; p = buf + One; while (want > 0) { cnt = fread(p, 1, want, fp); if (ferror(fp) || cnt <= 0) { done_drawing; err_logo(FILE_ERROR, make_static_strnode("File bad format")); lclose(args); return UNBOUND; } want -= cnt; p += cnt; } record = buf; record_index = rec_idx; fread(&bg, sizeof(int), 1, fp); lclose(args); set_back_ground((FIXNUM)bg); done_drawing; } return UNBOUND; } void ps_string(FILE *fp, char *p) { int ch; while ((ch = *p++)) { if (ch=='(' || ch==')' || ch=='\\') fprintf(fp, "\\"); fprintf(fp, "%c", ch); } } void rgbprint(FILE *fp, int cnum) { unsigned int r=0, g=0, b=0; get_palette(cnum, &r, &g, &b); fprintf(fp, "%6.4f %6.4f %6.4f", ((double)r)/65535, ((double)g)/65535, ((double)b)/65535); } #ifdef mac extern void fixMacType(NODE *args); #endif NODE *lepspict(NODE *args) { FILE *fp; int r_index = One, act=0, lastx = 0, lasty = 0, vis = 0; char *bufp = record_buffer; #ifdef mac fixMacType(args); lopenappend(args); #else lopenwrite(args); #endif if (NOT_THROWING) { fp = (FILE *)file_list->n_obj; fprintf(fp, "%%!PS-Adobe-3.0 EPSF-3.0\n"); ndprintf(fp, "%%Title: %p\n", car(args)); fprintf(fp, "%%%%Creator: Logo2PS 1.1; Copyright 1997, Vladimir Batagelj\n"); fprintf(fp, "%%%%BoundingBox: %d %d %d %d\n", screen_left, screen_top, screen_right, screen_bottom); fprintf(fp, "%%%%EndComments\n"); ndprintf(fp, "%%Page: %p\n", car(args)); fprintf(fp, "1 setlinecap 1 setlinejoin\n"); fprintf(fp, "/Courier 9 selectfont\n"); fprintf(fp, "gsave\n"); rgbprint(fp, back_ground); fprintf(fp, " setrgbcolor\n"); fprintf(fp, "%d %d moveto %d %d lineto %d %d lineto %d %d lineto\n", screen_left, screen_top, screen_right, screen_top, screen_right, screen_bottom, screen_left, screen_bottom); fprintf(fp, " closepath fill grestore\n"); fprintf(fp, "%d %d moveto\n", screen_x_center, screen_y_center); while (bufp[r_index] != FINISHED) { switch (bufp[r_index]) { case (LINEXY) : if (!vis) { lastx = screen_x_center + *(int *)(bufp + r_index + One); lasty = screen_y_center + *(int *)(bufp + r_index + Two); fprintf(fp, "%d %d lineto\n", lastx, lasty); r_index += Three; act++; break; /* else fall through */ } case (MOVEXY) : lastx = screen_x_center + *(int *)(bufp + r_index + One); lasty = screen_y_center + *(int *)(bufp + r_index + Two); fprintf(fp, "%d %d moveto\n", lastx, lasty); r_index += Three; break; case (LABEL) : fprintf(fp, "gsave -5 1 rmoveto ("); ps_string(fp, bufp + r_index + One+1); fprintf(fp, ") show grestore\n"); fprintf(fp, "%d %d moveto\n", lastx, lasty); r_index += (One+2 + bufp[r_index + One] + (One-1)) & ~(One-1); break; case (SETPENVIS) : vis = bufp[r_index + 1]; r_index += One; break; case (SETPENMODE) : r_index += Three; break; case (SETPENCOLOR) : if (act) { fprintf(fp, "stroke %d %d moveto\n", lastx, lasty); act = 0; } rgbprint(fp, (*(int *)(bufp + r_index + One))); fprintf(fp, " setrgbcolor\n"); r_index += Two; break; case (SETPENRGB) : if (act) { fprintf(fp, "stroke %d %d moveto\n", lastx, lasty); act = 0; } set_palette(-1, (*(int *)(bufp + r_index + One)), (*(int *)(bufp + r_index + Two)), (*(int *)(bufp + r_index + Three))); rgbprint(fp, -1); fprintf(fp, " setrgbcolor\n"); r_index += Four; break; case (SETPENSIZE) : if (act) { fprintf(fp, "stroke %d %d moveto\n", lastx, lasty); act = 0; } fprintf(fp, "%d setlinewidth\n", (*(int *)(bufp + r_index + One))); r_index += Three; break; case (SETPENPATTERN) : r_index += One+8; break; case (FILLERUP) : r_index += One; break; case (ARC) : { FLONUM tx = screen_x_center + *(FLONUM *)(bufp + r_index + 5*Big); FLONUM ty = screen_y_center + *(FLONUM *)(bufp + r_index + 6*Big); FLONUM radius = *(FLONUM *)(bufp + r_index + 3*Big); FLONUM angle =*(FLONUM *)(bufp + r_index + 7*Big); FLONUM thead = *(FLONUM *)(bufp + r_index + 8*Big); /* move to beginning of the arc */ fprintf(fp, "%f %f moveto\n", tx + radius * cos(degrad * (90 - thead - angle)), ty + radius * sin(degrad * (90 - thead - angle))); /* x-coord y-coord r ang1 ang2 arc - */ fprintf(fp, "%f %f %f %f %f arc\n", tx, ty, radius, 90 - thead - angle, 90 - thead); /* bring ps-pen back to where turtle is */ fprintf(fp, "%d %d moveto\n", lastx, lasty); } r_index += 9*Big; break; case (NEXTBUFFER): bufp = *(char **)(bufp); r_index = One; break; case (STARTFILL): case (ENDFILL): r_index += Three; break; case (COLORFILL): r_index += Four; break; } } fprintf(fp, "stroke\nshowpage\n%%%%EOF\n"); lclose(args); } return UNBOUND; } ucblogo-6.1/ucblogo.png0000664000175000017500000020742013601420003013244 0ustar jjcjjcPNG  IHDR\rfbKGD pHYs  tIME IDATxa$WvV$܄ J;(AtCLCʠh@5>-̇1l$,6PTʁ2 U  +1!Fq#[o=ۯeƝy#ss;- RIpsf) CfA,65MOFz]z^YfQ^{0(֌5kcD\[8b=<՚z:j3?ucͨf=z&".ԋ5EkI4Ze:(jyg 1DwBtqpk}{5Wy51;f)(tv~i?Yڹ`{g2I0&aL6;x^xoId0v V[p113/w|LdC ӼҎx^x3&o\@n Ъcܱ]D-h{un@}-0wϫ{[$A.QeqPYl\-IBN^4dĂsn&Lν,h^2^^U1I1!D4dI}ϠQ-d*Drʒm1rMo:Hj!=6o ytf?@ޙzxz[1˃ [?>L\<~QUi!D T>tѝyfgs::ɃHu.,/g3d#fvMwO,˭AgMk\[6U&y|Uߟ@-PXFT6v % Fh >V{؁XCܳ~c߷gqܕN.U~cjsyJG5^d=$C4q7y2l Xm w;7mMGY]fǂvԃ׼?̡: ޜ;ζB/ϳM8LZc"1} v:txv^ o|VZƓh\+9Ʒ&!ܱן[oYC}Wwhw ,tߕIklSˬ~,56K^']cCMޟ{ݎ_rKx#n_~G+O7Onnh5:u߻:E}2QOvrsT|Qۮ(k'?{u6n]x]@Xw4`ܱVsC=7Qy.~h)jkm%?GUp,CC{FGL gb;o uwhwF}-*p)(+X\DXQT [ĢhʦM<2u'}(%'X{3O.׶s:k⺥-w~77C4Dn4syT^yZ=οh;7w) LnQ\KG^k;RϝX,\Pm@I%\DesStI~뮮^^ګl8oDGa̘פ_`W,E۔IJ4ȶj>&T8؅nh:-3ϼ׺&d Z/{> +9|7ii *z;*y ]}CMlh(492eG>pЉ!Ic%Ɍq[YYkgՊ YJ_P,E$!s[JC$nvsg$3]210z/4x:CU;8;karCM!eIJZ}H| oi̳fV|xz||vJd1 c( mY^Fy0ҔOSҋ99zIk1.ydB54'BBz !%.d pN;dl:Q^7GCþG9h;oGCilfCCF HDW qDȬiu\e::Dd]CEP5[a9{uQ&iG4-[|/O삫gÏ1YP0!)6QfG+TPqz)b#66ȣ{"JX^.jypҢt2KWŖN%砽O yIeZ5̫er%pˤ5YȾY| f5)3U9+ko\0ŗȡXKM }_eS"6nȬ@@eZRz".m,;@GFK]hm$u;F: mơ'~?~Bz%dq1%Gb#}ŝj4鈪(QɄ*o{` 6F'suY$_QW2NGkґ {E%,瘻OE拏 +em+w=Xd|_#ȷ?.ohOf܂9u^KE]eZSo7i=Kke0"m-v>4w.)SKҺGbW,$iXb}=NJYs\\.m6iZctvgS>ypVu{ʯ~X]L&d>WZYKlYՋVBg,QEŨSŖzFZUUGZs J.LM{Rv>Aa= On{nv4,=vo5'rvϵUt5mқ#z\W> #Σ͔Q y=wﺊf]M~JjtU x쫡*^ŔdO`Nk:v*d՗s5vabn&<>al4-2x*TL7nrrɩILJ6uf3.,*3s$d1b <tz a b>N{ \! /wq\{!v9HxT\v-JOX^;yv1gʸj,jOm5\uk:F;;poR Կ~ Dvo;Qj6:EG: CY_%xMiGENA]*]v:0Pj<=])lDX,Rׯ㢠Gv]pu wI!2ypUk2J^ p3 T.J%X]*0P[qwUM({Y q:DMud[^iX} .sq@PX(1gwygfC%muX2擕`~6n2š>2=%pf.?,MG0wsEBa.l*6\|$]}&/=9~„==dn WVXCT{6e\1.`ɒzS\Y?g@Xv #XoysAl/6qR`imyK_.ٯyg~t&s=|Hv;•U/v#_-@"5xҫ >j~zrtqyrؤzO&شFB p: )]csQlpd%֓(Ƹ˄/I08ڟ&V ډeYuCs3QI6g$3E2SўyϊYLFGmh 2Oc>kT߰Ԡź6~;zEQl~KvUka؀{H}c݉ez3;\s;z5v,)'rȏ>1RB zķi#,71Ldq|*Uق[5QQ^~qM̙}Ʀ6$2+N%SsL(; GJҋ|UΏ^CP]L/~_7)1 1;#;6Dw*+EeGd}{vT FZRKtBl3HRE_#gdWe|yJ y T' j` }w+keܳ1Qֈ,P & KzvJ5e Ul\~dN*W$\3lObR4j[^iH g"_ߕi^  ~*mF~HyǤ"Kn;8$Ë#!qwu /eHN$_f.Y<${~e ( ysD! q)=~;a;Y| r +[w GԤ!ͳf>_zh4C\iߩۜxw-}QɈyN!fbg r2M;T[gٙ `Ew~P΢l=@8wQIFxGC!}?{y Yc𻩬k7'![t|ZA;Lp( k|OM.î}~ ‒Ry8!\cW m)26`>QM2i L^A%Lژ$^8GBdtiRGCeAeҼO`DY=iXnSW{қi _SЪ}-a yVPuՁ=~7iĖU֫< .C|KI5F܃ !W6Ǩܺ:%S3 )67 {4 [g2 w|?t71)ecHz HC5CU}[S _:zXR\*U^2;8-. up%dQvqBVZmgk,\G̏eLc ʪ#!0U' OzC̫%]v{_DX>$I`6&%o=g( @5!@ԲH@ ]>!{vvwF5j?s!@ml:PjLڰ 5sƏRwyOA|>"Tr.ktGb@C-{Ģvhm\=Aio.'qel8_/ʐ3 p[&%բ^__+@M 企@Nb6;u%T_փǗpWZʞ @[⎐ OP+ꚬ&io$߫7Zivq qG2<¦cP®%MQ * ޝϴnJgLf9ڦ$h5 fE./)&n&*Iϋ0 d&((u S..Zo5_[3 B^<7ޮ-+CcK OawՁ٫#xY#'Z9t !]|C.jy JXPEzF_\A=պ3pq~f$IheAV=[8~ f3s]<_~GSf1C5#Aμ?KKknk`gQy#= {|4xW98]?],d[w>16BS]^Cr/Zr)۳ j=TI1nl/t,YXTz}=-r`b7M`}UG}}^W'1f\{P&o+)r/98'nPO>ɘWk^5*e :2c;r_v6jKweC뽾 *{Ofw?C;r0 p!K b VLR~e-K}y+vAk0N-Z)Ʃa5`Ӽm œiJ<~hx6D<^x!f|޷A\9 !腝;z߯ԫ V Uᰨ*5W[]ɻsZ7÷7*qU xl:=-QDo)xޥ p J^B_gHp Eϩʂ^\R=l:[PR5V]TD:"s2Vs)i^UBRUBoeQuAotǟ~`Ϩ*fo3_0OٖO2랝<6{wKKnzv) I.ͱz< S2f1}>N9֠}X!Ƭ'(^w/QqxR@|;n}tYW[>DKIAI!UA.K{xFY8wK"{Nrc1P#-߯+V\.3]]_?<`T5EM-fW!_5%*~W2--zK)W$G'LqgQ\I̿K3TzPH(,VOq7ZX;*L1 ARo(<\ZryJqSjqŰ!&ݺ! 4z݇zeD%c C=~H 5Vb{ ,z]l#Uv>>['-˳vd1{M-  ۂb<._iރyg)_4yeLO«K&PiM/88˺}/}P5X"qߩ=יW72\ "=ACY xGWT̝\Kͳ&Ϲ`badB,.iC Yʗ2Ԇxkv=꺰*#Lߌj1p]sgj TLu%R5; xAɚ9(.*5';y7`֐nAI֛(007)O??lx1.ޘbc}w6/߲(!N{= ;l{;}&\kY}мn40}rݠ3)(w_:=b{i,?/>컼렚W SqO7G:gXJ*ސjڲ{~7-ށ1eEgL6̹7X]pGYVu\^km="HG5b->, Ǐ4Ã&i {D(JR {DT17&_KN o'k"UÐcz̾c,лC8EZMyؑ{=V&6,8<]ٜQUI`&UZMx.-~~Xw2MoZz CU^ӣ.rҝLLJ>8X6 @3MW틤39EA6M){’bHDhd\眼$FJ4YˑY!P'Y ] zm2맜 28L6k vutAlB;u<=;g>wֱ[}i:szKqHK=MeA]:;gČbFQ-}9U[00UL ˜X gӊ*`ÞTܧ`ɜhHDeAU]f':g.ᾹYssyukk"B鸫$27m$Z@8\Su!|9-kσ'+ԵBJDI;/mSx9{Z u`= "Zi[uN#t kz:sFV/^sH$؏QEH"b䤓a*U&4t5_q)77\5s ѫpiכZ="^PQJ+tebG}ʋ_?c!ߨsLuHvU,ị̆;gCs_u Qx{ZCuaݼ(.y[HMHj }-q^{_|عK=Co(^o㻐? |Rm'|iG[s~*ʱ77Y8be )LF\-®Y\kUIF)U\C6X/g_cfQHPcaŚz1Honsݖ 8ZN~σdQԻRW+Gqߺ|ogC(zk/t/b}\3_y)1"МH=׼vJ#]Q/^7(rX}d֯!rvh*zRpе;T*^ZOǿGg\|/q~NI,W dJremvsO1M&` M-|Ej^34'eg?œKlC2ZM\qԞOmZ E)JLϏq2gNc[Lj1L^֓s1 %Tn*|]vhn,Xҕ=OA'S^Uts SM9MؕC >&k;zBΊlG@l]j Gwx1K̚}L+X5B)#˂[?"cXmR& )3u~ÓŻ6B W]pBB|""R3{-n"d}wO9$P{[LCşy)?}K$9ҎTUy\?*)g> 2Ay n{Zk3>?~ų/~V)~H8>z7栦p>Q̽dB`sURT]1U="J* c251MLqu%'\ t}޺O*l4e`\qu}M\V\m{.NUjrh:&[8ǘR⪌=fGk·6&wKQ)}WȽ;_:a@_ қ[le5u/Teݻu??}O28^e=I!/gn*v]P:=Ɣzŝyny_s~d2Qĵ7?6߾e gr' G,fB+EnF'mI!M Ew-I85 $A,UZۄKB`š:݇."2=$*!I SJ*CA΋:SӐ"̮±7"Ĝ% {o2Oeb俗swDbc?&;[ι<~W$\o!e#cY>OOO/jŌc DyϩŸr-e6,8)H$@4yxfEN>Y5(I׿brq礟|BǤ2iʅ)htn!]K%].YYؒ,sNc{^I9!-||¯h ;;4ZnwN7W_6ڹ\@y]gvt!YZ9_?й=ij’Zx k#Qd*z߫WX_ߡjNşry]w:; Ofx(^s~zӧ'$?уQSLʊ*5U1E`qDzgJr6^puzsҫ ٲs} FVY6%I?Oӣ?Ւ}NO̍nJ"]Q}1S c z/&\1i#,˘o+BX[aՏNNd<sҭ|W?4T׎*6Sоր]ةt"ka2Y~gko/?;al9,qC.{Zvq9@B>?Gk6٩w1qcK-FBw0j,ӿsn<'%$GLko|ˊ[.&",SْtE4IfzS1+^4 `=)Y9>?G9{sV՘,ݠuĆA3k" {+2L8? yzSژ8()6EMY:t4Qɧ;Y!Scr`E~w\Kчpwwe8I5,@(T&wl3o[$~HU*,| A<L=ʒ_Cb?8Cj.qHp0/Ä$sj>IWf50S0S 9qN85MXٜ V03 u+/X. IRc .͘YRP`8>IXLV5CƓFgu-l4n)L!NN~N9y2I')- 5`H.( goRCPkWdYd.s plV!)/ S#t [n[rYC pC 뮗2MEiFTz%4eu;_ANEj()P#'q@=k?Fl`v *o:v9d6DFw}'ݴnu\9TFyw0 @thjm kg: *v R-!kv3 t}V "%=}J2pt4SPgyu>Մ > )F~*ay&k/e[23Tn c{KG-й2.~ƳdH8ksCo`y}lAzyCzqdmLT)Uz1T9sITOf}qrEQMPIl)̀o#+~e}~>3& MAj͘5sbatB-7iAWk|6"s[q1‹k`ر7vuJ2=>4C*]2NWߡ^eV2]{l?//ddKeuf൓a^w=IB+=TL(RTA0b5~q=I7ŚO_Q7}):4+֫F OQhˋ%m,"a,n&.(!\p]^|f|W ίV`&M2!_vuC5cC_;MOM',[HSּ`R9<&ZrSYr\^$Xڒx\Q`I<0ްF5[Ȓeaʹ}y鑠[W/|k}3tIs%>SDYPU[o{dRk\DJ/? qy [j.v=jv3H1JP(_p5_(%4]}EEYL3Eߟ+/U)ٰ^)^<;iQ_]qy,E/ќciM1rMt^UeO%UQ5/J^uqYQ D.q &$`J Кk=^b WY$\% W@l#B}^FӰy.}Qv!{t<!6j3ҕ]Su$/0[:ɐ=>WjY\Ì;s vU' Iy4dՐ<7Q{?>+bGӘ8,Nϸ)I b1ឍsyWWK.[.[pSdY'<ڿ-x4ܹg{˫,Y-ꂬJ(tBjgE0NfZItD97MIc N yKLػJ9/K~lrP)+8#tY5uQ^o(FwH\L}OzLQW텘ۜ{gs%3咔-= Hu?Bô'_g ]nEWy}[[k{;辪{kH뫬vxsXK.c(8MƦ+0DiodvKmmam'`t\8p8bi =Lf<<\!owp[6k $G-p,{'|HշKOxۑZ(feox_883cU5OWm>1(x:E} Gs㣄;UUW+KYUT{ʖP8,vuۏN mZHW c5!lx{QUPKVo3uqA)(1.$hd|?bC?:"`^E0HmHPF;ERL#c{rW`HAb=N}0x)|{E8Y9N.&"L'8z!P>wV? 6s!0:_؉=>Њ4Mo%O^6)o5^SV泵ss%#f@-R_T̋JXSNI?ta&d,ZuqYV#TG"R n6lK :UrtfDTJ/]N S P%phv⹶`cJ+ fI}`V@Ao=|A,i]Yġ\P!g?9Edg6mwM>ٿv{r!5t*?~.:$t^b2 AրJ' "Ƕxq&/ɄpMI7dvCetg_(8z#KJ,h4Ƭo2zcsR]KQc1՚g$1+ϮZHo6쩊 /^|$Xg%Oy_ry|̰NI)勔8]{IDM1q'ٌxGy kb;e<gwƚŧ@L6T1 L9*ݥdWw3_?[7g}я`g.>?CRفZkkFă(f+T 2Ӛ&uqaN0&ڂԟaTY79YC?F<K\{i13Αwlܒ`N _fO؟dfŒyM̑͊T$!8`e0QH\h dP ]@5@L$.)ҋ^U/6l*84c2yyOsed6eF*x !#)̢l4 Κ\8u;F2]^?[51`(;JNƀ >vMu5{.A僚;pm{):;㻝!ϽN186sBl/ũ: T"b’IQy{GhC=ٗ)ׯIBЬfV5K)ɩXɨ^l;~b.V}N-T` S+l 7ԊHջ}w%jhfw]U ?#-d>Wd !t=D}EA_{9U=Okச0~/p:.P"($=ݸcw`yW1<HZys|l3n*'n>+T5w$ɯzڕ̢^}0U3 DZjnЉt5 ԶGxr+2kPeYDYf; ^|5wE!go/\]qJ]gXmP?Q{h\Oְzy{sԻ[)Wby2A+_I'o'<9G3j5%H+N6_MWB8CH#g vTuʳ薨2 Bc/SN=?=-cH/D%1ӋccBlu 1KkĶ E֤۳Z@e}5}\C褅N8#⹡)jZm:""(0։B}~DiJ$dIcևe,)JJB`-s/Ej[ H}6_`#N8==c9s$T(sBu5ISj!m)ސpf؁2_o}F{@Of7 Ԕ1 a>>aDB<~|tzç'hENIfH y3P^pq3m&436xq e.MizW>O "\ɑq\p ٶPff}DƦX{&'4o`3mB*3l[ dđBKA^lɲ-n/}BZ._n9#!]_^ݗھSs>/XG S.%PD5T~SepRf[QG ]Q{2wᙈL[҃&+hVW$D/5F/DkCnaB|Isd"CX)A圞D@Lfk_L f|Mx~BbsI5[M\6?K~lwu=Yg|* Q AC֤hcmʄa ֐9seC_ Et-$ZITq/aGxnAwuT !_ƨ݇f;~2rRr7K1̛Cy'ZRJCqqGbgw7/VNy|0 ]Cprɒl/sdAID u¿89 KLsiH?I@>mk"5[>˸?wEScL j=,F mXE7,A-YhC%@ jbR@ȗnv|kkq9aف rIiyc75C.m]eCp7$7-[E^훺i~́\]UCȑe"y+_>*R3yN2ҚxZs~b iޒ4^sVpѴ^d_!FMo[4תV5Ln8<\5ou 99d j@Ŗ1ior5 ) XC-Y#X6sg;&A(Dnp^bhG-9T4RdX؋ֱ(wj)Ȑ7ӏZ.eALBDuO/vcۇ!t?Q8z'<*S#5%lZkC>?Ĵ;U'靤Ȃ}-x|Nrd7V]jٲuVd,iS -')@G=XXf^;. l".%a9M WLRnsTٚ}qv1<͇;eYD-)dȨCOt ?`+ b0:k.7dz<ŧ_<41/&u#qB@83/ʷ* Y! ZDӛZgu2i=;SuCM8wmNMf1_0oZˣՆՌ fUE%#-{ r.}ΜmU}e0gY̏W7SpSMO3E|uĊGsEO?u ?zz'_K0k]nn=Y% k~W M;-ufuE]W 5٦"Z]̃9y-[9T)J',s[Snlqu{PwTz\Ngy&!9c>]~yn>7n3FnC^F^0b,MGSuMAT'pJ0,8hV;_w7sYM=_xWT $Bԕe&%;C.bsCY#ц蝆xUfYPؕ%بl߳[k-9㽦dHNfп/4pKj3LRdrf}'oT!v%*;_ 0's||ӇnN!'WkF).30|jzٜlQJE}X>bOgϛE))dt#Gay#+ ~e1Ox%Ѣ"l0ϯ&Rȣ5yUn2Ѱ EUT;0^9eY@ަ, SZ͑lœ IDATuYRG:˭_bD]yF~Sb7eCkdyMQ[Y[,\SsR"ќhjgUU߱,8qf&Y)}j#M O^rbsu= CLَԍ`$3p)إp|B&ϵ)N}J+](C۽f3^~/f z~:UsE]b^mo-?>$jM@Fk i(mF;EG5d.3ëW wl>1Yw+kw${?o[DY٫gm5&b1S jBQ9/kv/)|%S8)!X*RsK&f`AƬ bS{ JS仪f2]=}X&#nHE2:O<-} _SMC7ޅ\&}u\wnUa^  Y[~wzxuU}2{;'ptr܈~8̿]LǽXF(>ҭjQS$ME첦T{f<{~%BIccXjD| scΞSȄ|A*@vh;㮼1 U:D@1йR C O U>SLVeOd#:lFz\TGM]̿)⑯##Q5Or"Z]1p- FĈ8Q~HwO$Z%hY`X" %B)+.%Rd"WH>ON(uNI8>a$h%TډqDqB#kW*P&ut y6x*tl68p\>z~9 Vߐ+jGa,mW Y?:(O>$ped݁]펭[ Q[dyG4RODjv^K+@1| Bw?a/c/sΟy_s)3>{~r9Zɻ]GQ O6}^` 41ۋ/Ț k %&-Qpk![|YE˂Pr@qc̹a5I.HɈwwRq~K3zI\al=q6 V{}%8௸95^*\H0I&]]%>jW.7Br Fg@=[ P";yN~|w8>8B'K/SNK"aت;;m3ol6gٹ{RqQ*gio7tO5ĺwV[m!KRp_OےaY@tLe3>BrC$9 N"/ʆLaEֈ\dY${yIKN8rg%)RlaQ֢"AF# ;0l |.Gܓ dcӍ20}ʣNցY4U~XHzO#}orSnAk{)epyc_Y +2Pu<]%X>HpV2jC~y-c Rp}u8'k+N|w|e//)e|6sſd+V=YCm;7՜ޥFs?GDV?zfl[HW$V4W\o#fx+݈ȿaW]݇DXT~|b aؓ 2܁R0+ﲘ)+\da fjb,a )Kvҏj1iۊ\}:{7Cݳ@ӺKOoJ?4}1㺟wY@N= ?8]wWE{Ѯ>br{[tn:#`DҙDE llT BQ_05/ދf3.k溤jO _~o0WIYzEScˊ?29W&T8fyPOg<ݒ^YgT9G#bWQs(^یwψW+_pcfQPڈ6eW)%xg7b,0U7 1nyG͠XcR`()a^7ٜ?ؚWUM)nJsT\WPjb  h:%m'qr3I7Vub\[p=7ߎQIQJ~ӟݯ:VPW+Us:ܑf'ʻZ~R}C C%PЦsT ݲV;Z#[(KTUUM5QrE5Wlʜju]n|symn6_ełUX=#Gꘝ5V--v3ZIx@eg:#/_e=g?U}w?,C+K,0E^s5{Tm*VIU-o(!+JU9jd! :ȹjv~P25:[5B支6beovKB?b% Td)m))gmK}-3|Ί<;CpJ9W vh(bQ:\\~#W·)wR'y5n3uEPduUfD[ol0)CMK\^H=v$mTYCX9+Ls%5f;Ô%cVz;{-k-#_ɒlytCŌM3g>F#V{ v$ ӻƐ}!Jg0[C5;=!ԘT,xq7kDPpPo .oҔjSW/&k6ݹr]*kCQ΁ Xy*#қ3jF^-ga3[ûfw62G`}2FCG۰.]V_a̍B;ݰf;CvgmdAWȹg:+tuB'$O~JXj6c^5鄲$G7] )ߒ~5Zkt/޸$ [n@aZGN,efcHl *4 m|iHG }>'M'/?'%2"S[Lj4ҶX o0$kٚ5E76ݢDĖn)DnQrQtv_MSw(cIPhH?o05֦kc>w~:ߝ~}7MuNj:sC? 4)Ն1}0kʰM{iwXr(d6|[>{~JyyN|xtD$ʁ}X!hlxvfeL܃C(1hEd2ZRY%6V`%34V߶]P~ȏNJ\3iNXFcە[M0%{+4HMK`u!G'qѲ(}sTnh.-|j"cmr ϩyْ \hC19Ͽ^p;\n;qvӪߋbUmXJ~;]^_ܡbfj$\Wk6iN <\yйcņMY"hylSr*&J*wP:e7+2WoF.]?Գres# SVwj 0gj? ]B=~?>3Gn8ձS FHwViT9ڭfJZv#Y@]whuC,t^?]?Nt5=:b*JؓȺ5|*Z:@'Lh TBlJ;QAw⢸oF#tU!g샺z$$; *@SJ l3"rdo{]fbwCl/8W Z \?y׎ւ[mAUl^F Ai-IoSjjEsAg*Xl;X(~a@+J <.W`+^ްEax͞u3hMLK53^Pזy}7gԶPrI_S/`񐺬ٹ¼N57P!kvV?$-݌62Z90nX+ގف]=} [ym|AȻHU5,YOЧ4YyL~廇-w߄~._? *8st(!j~m@n-y_Mۑ1*zM 4%Ak]Jd1$+(K5AKINpnfgنl~a7293iKW1_kwd1MTEPE].3ZlN+o[ tPT+frQ>D(E u]fBUʗ?GDpI)9UnHg;ĨCp{ۯq0-G/r7EnNsCMJ_ &ch:>C[,`cvYO\?ġv#eM n RzЭwoGعmX\+ E7u<)vx/n^~wd5yEyU?g~`iĪ|JD=c1b;+ j8Ps[]u˪gՊ+bKW3#ٙq#@  )[eR[7u)"n6T/9|^qD]~kTz&E$_=<9iY=Dp(YO7|?smo){?|L4/ҔOïYʋ*SVSM^{r!#s^~<'O׬W%%_fD.vngTWa[wWHSV4Y?c7Uonf_Oun \ܲzpüZ᷿g?VMkn#ʛO7_TusׯYTYe?7>U|fy}݅bhjOQ1%zljՃUg؇ow)P/ Qe:<}?Bs>/z. {ۼ" )%~oV@cyέ@=sn o2Ki^Sȇwrc\_emݪJH#ΕAk6bA̡4S?5ɲ@9/HޣbN/8g4Ek.dڦlъX!I;ŝ 4:~Ј-YK)LiڄF%oKdl1[e㕨wgYkz1h(Q(ntƕփI/^.׾ꖯثl)u*-8Wo5/<_woPez+n>f{dC_|t'8,tH5܆JPq)_=ބS 5gߐ9zG.[ic~'ǟrCsSN)lAd2t!1F,:|{"x}Dg,YIJ`)V[li] tcli0- Z6:yaYܐ9⦇6ǴԒ` “YX+ۧkE8/oһϕWCI'&<ң ]˱#YT o+G3uD 4&w NK} iH-}?^g!ϟsFv%>R'RoɷlJj$(Lnݿ^0),˻ۦR^Ж%:mi 1`, [02U/eS~v'saR: #~n:`Nlw+֟kk6l_O~_a]sk.-2OvG8P)םOGy, IDATi&"r6ɛ+~mCHw SpTpuy͓K_}ţ]a.+MOKdH͙8<)c0e;{BHKg ?H$՜e[Rnx{.CP moeyUJ6yYCx4DUA-roΦ_W̄b%%U *ѓ'M߂-8ϨY-y=j(/VM4u4n_%?b EmkR=ᮄ|.sd6T`>)Pb3Ӥ i}wwӔ@<4id$v#}At`ݏ}Bp1 )%DJL,B:#)ږc1:Bp/'x~paIN~V Bic?u| C"S/!KP2 @La1$ozKBn mI/Y979\Q6݉:nTB:QKE lUyGn>{\}\_iW&) Od#+uߚğ7.4Y\LHwzM?ixNN< Q}kp?_ A}㻘E7($1Ǥζ AnebIaˑA7/_Zn>'OJaK6{ʹ PIu[t*}Ka)Y ,:F&QC ,{,ZŊc2"-_[Գv#L^t4\,¸_Ñ~c6T][}Sx$PajVPU>j;f!?f9ɒSd%:A R#̢ 8N|~3S\%9pi{q @:Y9 /H4"QDˈޝȗщ%ӭ1hRXKo S_rǧ0'v& 0$g|  f$~ˈOkH=ir"[ߏ(-_ko[-RC}ݪtpb9{\0.t~8S:V}9K9;}η[B}\nF3qeX3֬1V,a[:!mM,d;v`(J8s@۝EtU@^4^Z q&^Qy< Ȝ)k{>ɳ~SGƇaP17k,x/%hhw[;N8BM݇ҟ0wC\?0ހã8z2CZ"՜t9*Ju `1Ap>"H+dҌrQXm0ZضBѷ3.l瘴P$E訙wXI;e7`Vh P=pEwojSQv'j_EX`Q*ošPCh  q"Āӭ{RbT. E.o b_p`Dp |Ds9??ǔ(nbή~,k60M-65H&($n9ENQ ,Ev DdSLZ c>M0A[&Fh!.j7U<61}6vz'snD6uv\sw UcFVPDQϚFoOa #e+o 5.eym.6F 䰑K$Z#p".0"WX(\l5 cȍ( 4| w2`N͋H·\eYv=:ɭm|57hĀm~}rfO x蒃y`rW B>x>e|<}o\ QE{BC~ζ̱] _@&}&1CRzJӐZ MoA,B E%2y 0!O6T`$TqA-5ӡ# |?O?Rqh[!]FŚ::n78H o.kЭL}ڧ@ x~G|'h$^]_貅XEĚ(^Rh-,b"5MQ u&v!iõf[v=RAڳ"=_=30Bʐ?%+v_bz%:awQoB|ȭkN\hb~? ǟ>s^ W4̅:FBYn8@':\\a Qr]~8b8_0Fx}n|}67.Lt ?zww:aE +h2 +QKzP*fm6`d(lm m$*KJ|ec?2ud9zM@a ۆ" PM;l-Lw/QLs R?E/}}44ssbYw9Fӈ슿Rc8*+,iĩ+~B@`X>B U 41| $"Jv~,H ߶N' e'ˤmE ,Ӟ\4:/RFن riݱSQG՝}".S1F~D`73~ŻߚŧP_BTtRNkBe\cڍV7q`e(c;2E]QOD.%Eiُ-&m?T4ķe( źnLJ}%lsCnP)cMeqr+:ӍCQ)"=QaG!nJ7^)ހ b]oM^<=n$d>{ BvK`]}2"]|Y6 v\gv5}νp7L4L8*J*&k7q訡mr[,~whʀy~cYĢir|A/QL@\ƒ k5rh>vgHɩߛ? hx]E>D?xe + ӽf :<1@nu!Y~w~uZ/#;L1׎k>2tfO!}!R6 @YdnĦdlF˂QX Hf>'B#(rQ8&ϛhZ6'kI)d `Mr 51죭#osGʔ冺 }u,b=B݋a,}\VTk #cMME1|T}.DW_ CVܺg͵A\rΈpr5ʼ?A4,wƑ.0,[C_my1, 8>|xD' z}Cl,Q؉1ڛ!-` E\pIwHEt1PR8QF="P]Tp(\b*op[ tƆXXY\pnΩS݅6E~Z4F ~=FH/\]U 9#,B6V3u!}7a>>8#tpQX! LZRP3DrOZ1N@+tX(PH|kP syEvƾl#KV `_d: AqQHJy a@I0B/߳][@\\ʭ>G)[*?;o"?{TqW wT@hEs Fq:ԃc &.:apgǀU bk"$Rm,7MXԘ<g~vFn Y,f=Oɍqmf@ ' ϻ;T|o5JCl71% t';=7.!NP a#t˕8企]BADvB]%ثuU ^3sףRqڈ't^:"C*FR01хD' I#G -K}:IRV! Q$Z2A[EHըd ։B5vHS)H%Sj;ڔV`7kAESŸєۑ W>sFkO*gmG+&bWRJpgudފ&,GWj|z{@ёlwlvw6lrqӴ^V$b B ݀RaҔ4="вD+E|cQBA!(%2^O b>ll@^ mHע߇b|}|>c>s (isv0/뇹+]X u7!?jBjw)XG1&Dاt &S@0T 63} `5nNߢDLD*㹹"H$y죅f<;dr2i<\(Qel3 %d`_ Br:{$ ES*C=\RoM C=WR:is1Znu6D㻛t;wt]\_UUz}E__gCx`#La5{3)IB3l+rHV/x"igؽNjwYAf^չ:jЮON=g3.ٽo8zs;x.?%xy`8glx\z펝e{~ѯf{߿i0k՝Zäynkvݑ4t̻O><Z}9w%q6/,:;[lݮ8NJ@>㑔brt?MvXv3)&4ߵȮ)~xCzE۶n?hg]:d|n:vtx1$-u7|H}l$?yywS>=8}PLIZWdӁesPx2%YH^z\o޻!_9Ê؇چnBv$=H}v4ٱhJAFvK{jv]aNs@>3b%Sɇ 9 ~ĩvVaJx䴣=uwaww&o To=ۭhIw zC`tlBt}Kͫo:]s8c&d^E&Vu0M}첿=zy$qvL ypI6LpƜg/Z䴶<_bHL&0Z&@ǀ$ɿ~L h 0G8) di+կ6nfhъYum+`V<[ KJ}Ɵ ۆmq?< ~K.J?}F,)D75*VҰ7RQ6pMV #r`sQQWTҩk`eSQKj i0ۻ[kiIL]pOiq!"cףPZF.v uFĊN'`$@;ck,>|8 dp\ 'LSܢl,e5$5O˙h}qWxeW&|[͗d}h8NbaѹMcޚDLg3?k@|vqE3~)>4H5Pݎ8wtp~ txss÷*b#~i89u"^o^mhO$7=o^|۷4'":q٩;{ۢ_ݲyuNO]? 3vG-鏰;Nc#sKv/89<) l"o?p]wM}õuPv5ub:ccry{~Ƿ -brt>?{"$>SrvCf,柽 84538]gz Au\}mwIO}g=NX $䵙R"oŒ.j@m)]Cq=:۹u4' fnA`t-vBG?ft;(&E׆+|'vpg6߹ -@h3'H!]E?pWI{[o_}7-o{޾&~QS'.1F7atרc^mxG?>۷(#W|o_|F|+NMNgM@` g'и Sw[w X>K_Xx2CS+9,xRd ޅ^jw3:)!XM69q~}H Aa]-^ ?Š ,b["05 ZL[YլܺB@шBUY 7k_@s/9{dY)VZ:ʃ{,,T5!Fh͊z&s IDATi+ϟ27^_P +.1.AFU,Ԇט [<䶡nb_*a6%ˏzrK1+ c/ eBO={`6F%g9`_}MR!ܧyfOk3'j5 lC yHMT-O[ TՏx+]I\M)(&.]8q_^྘3SvSȓ}6\$LE'vhGeZR:]~P?KԁM9߱t?PۚWkP}mB\9^NO8bN.|C'T%vRo~J&c~ Ψ?S vcloa[H(&< cw}b !}hP;D[4\{[1~؛0\Уގ3ٵ9bф&륍M3|¦l9z&&`,^ y&vWڝ$J4F!XaW16"mw +gr}q>_&Ń%砖زЪc<^P o>0fW1pwK},~)WR-h L@/(Ϩ.\=}g?%՗H:s0JB' yd>'ڇ{bAJ{WL<3Z&T})З]ii -iĖXd7VU6᥈Ǩkr?\&K^T ~syB>6!X41rq106hqF@8~2qWA[P<lAӁp"׍8UKTInM3{.I\ Mmĩ~]}m,9w vӋV/X\,i}DzZ:YEcI+ϱ6IIB_=wF)Z& ?l XQ^`j,U߫@@kKScCcJFq_*f<1C.;-@!LOP}L58I>~QئlebRf5Ț`yߕ(rL8՛ݽ@zP?GZ܄xm4_z!~!Ͷb47+ͦw\N/n1A˟<ӄv}PT6ɂb%<.Dg,ƺ}f/g0Kf2R \IGTsܡώi =zUS}Ol^h`?|hc ;;݃HS֍.%Ļ~R5k:?4EbɼZrw7jcQFT痠 J&3D G 0J!8*9sQWR;}C\/zY`sOUC=@1.;g,򻪰3PKPjTyl_?>auxУEn.X,Lقj񈪗\A]bچ;櫗/DL ao`vy_W4HvvE#LSPTKe}/gq .E,x<5 Tb7|Q">ۇ*Қ<4Ya<6ߘY^ݨM$4w+ F~f믍;:-&bO]\Iq * !*JrhrLܬI=$Vc&R5DR\-Ja6r~8߬^??}w) fVԒs49*C j4M `ί-Anr+ݹ{0yl"kqO'>yyyy5$s1ăt Ё^8Qgy>ߥroQGVDQ5 TmIw~E@y,r7nj5`Mg} ?,**PDg.vx&R/*^ ~!Mâb^ͩ([.R^7PG}\ߡﮩۖƂ^BKRsn*5L8,%modn)knLdFK¦>Fi`G95-9p}#KΏ<3>!Ձdy< `QWf96yL-xlٱ}~h.?&=$(Dzs=Lӧ Q([&_)rFV~r`˭); ,/(ke]n( B*z׬Wˋ,T2٘P7e炽ޑ{D2n U UvLv BsrH?OFm2&I<>Pվ 3h]{|Q}Ӄ]q:RMhĘAKU˰ ۽F|0hJ-Ivk*j6PMZ9YO>׽st)ł\&c@kd^Avοs>^^P֢: wF"kFm=R8!^X4S7][ptwpz`bwsu?0M4Tss(~eA>wΙ f w".8؁#l#1C*3@g?x<+B^o*ݥ"=|Hc;{u1.;q,C2CQws4Zev3x!L.dQȘ@w阸yL б#mg7wB U k! 1"2GO;f?e=f9FR?X*gy㍺D,{,xB(Ɯuh!۟g$ui{Jlr.}Rr`#=޹&Yl8HJQZ{X~F]nv lU`w53>_o?sr?o;k%07Q;a@+Z/q⠺1L !BLd.[UmH D5#I68[uLWeXfEц\2JH߽cRcŝػ&LOZ`PNMU}~\kPZ֔,MY "!깃ƙ}qyzhx<е?+ Pّٶ0cXjxkZiݰb g3sB]PIz(.y.MKh%(e]@s{Uߜw}yTú_LbKػncU|xcK:։dhC:CYgS\kd駟aZI0"ǝIoN$V'y&sq(0(u.pחWpa~nwSΤENh4{q^Ѧ;BpgA;S;>|M5؁jv󟜺 vzӷ;o;; rrGps]˨NÌzƫr°;Ua,,v EQE[U2b+ğ :Ǫ.BSɘKO &l}* DyDK ;tTB K()*F(4u* 'S+^Ch^o\Z)QCChSdW{O%Y&Q@^h&ǑI:λg*Y8'u-dAbl@kMj~aΌ[Ksi5Ȳf㢐yя 7+,zu4Pfa lf8v!Pk$֠A1hǬڗ^'GEXq༙.- nQL*_E8}ĮݣXlbLg3$ERCu*e*%1)z#1گ: 9V%lkb8`*a#9h>' L=_ҶENg)"U #9fBY|'WK>y32A!Mx}%e-:n-PQ݋ؙ@2n!fR=ѧGfvLHvnon!MO#j(&,)c\)"Aql7;F]xJvHA(~2﬎ǚcκFوeqSlfCiD J~l"cJ\;Š`fGDʰ"k p/bڋV@Ӕ{@O~KW.x3s]01w֍pc=У uOBv?/h 8U8$eEEtQj:1zȯ—{Nd5P{`RjΕOKXgb<1F;18;Bݚ!&V̢ c+Jh+\gJUɜ\*Ý{-E*Q:q(;:RX'fŌj>hjL颼@ B"ż@Z0jHb9"P=ܑMwNQ+}%Ъ)@ծCB35Y#ЍDĬ؃^# X&jJkJV{ވ,ҮzvhÝ4XBq;79i_ĺ` Xh۽zLmGB e } |}agp~-Ck $%R*Ը.^{R}Fw }PHt;=g Կ妽qF_9!`)#7V`P2kK~IaQC"f"g/X/Z{1 21gIzQљ-R K{:(bkQ!=09XJ0?!]{^͡rC}m|L:ёp@i0H*%bPk+%687_%:qft2'L{n8r9(RU%S>؅قceG|<j2w͍ Lcc zQ_"g0&#JΡ^T?[р7IG J&ޘNs%Jr5%UUpiDGMJ^ӊXj l3>L::o5Ԛjí/٢\b횇ZhL/UcHbtJD79u|oZ;+[nGtit|iy|k1RN}(Ce;v1GiWǻ&zHk}^ +=W"I01R= k!ݏy0ĥC)ʬ: )2H{. i1N>q$ Hz[7Xs״ M@;/;\ֽV0'jtv8[6 `T~#dmoV:ELr;֟u #Z^m[ʶfc7N}n YlH+*@mrƹ(5@!3BU(4f}K m0^AKjzA$RBmpB }z$^džVktSS.Ab!(+0ZlV8 EX3j{h,QԅUJ9~ZVozWb0PA5 c hcz0!'8?ChG#=PܢMqiXDD,VАsgP)I֫^C?;o;ƲaվOY̐ϙ}??浘c.sǗЙֽ6 j!s(Q:n>({ejRF!kԿe#uaSo[ţMIѨE(KcOi&BU ]y Cwc3HxӨݏr !` 6mX{cumd D ;cѺZbmF%!b|Y̨f NR^_brz̸7ܙbꊅF>C5 ݭ.zC ̍2%C|'hJˏPB >^~ ]Լ= *@' \m՗J 59A[{?g/f65 Ɨz.1EA1D{SD}{b.Ā_c/痔2%eQPʦ#wι94m8-q߃O> ;L\7?8w,"_sA; yFVGp$)ld궊?o?:a.q䣟ه jsmrxG3Ēӳ)v7{tRuHv9?ãg't4t8^k~p>g;a*g٣/S~"OI0QwM=p<d Wh1)qmxvOؕSi:~Hw#x{Nݎz! %ַH:L1D?ej?x0=ێߟX&'l)7߼tXחpBg?#u뚦oW-؎Vu9|5N.8ʄ{FǾۑr#iг<+.D^`!S u<#'uAcͱbӄd﩮R.9:qxV MY76טi1y+3 *u,+j[:y/B/!s)gC]V4Y̓ǡ+2~\=Gpdi Ѻl VfͦzN_D@(+cEk43dKˊ/ \pW߳IKѬfZazƝd4mo=._m  ?W%R|,^q#CÎƤR8ۇ^Hdqw n&cϕYns0ȅNRradQ5tT3b?b~˧AF+JCڂ;iJ2<#!TˤЉtCDf cXsJ1wyA<хA 4.=`~]{/sd/7gk4EM-UUzˏ+MP)Dm_BZyQ:p"·@Zmo~+iyvU1W;ln\T%s/qVQkCF9f3PTi)PF )Nn՛ ]SUyo{74 yq BS&7sЖJ PPMR+zj8b6#=Gb@>v훀ᡇ&?ǚy5qCjM~|9'`9z:XFr<8n3P3?˙zG;9:+7vo_sqXV eZAX#OMc>1N6JCQ_0[o6lzawu͆1փH/*&Mz=Tf֣#Qs$~cn_ܤ knvxGI:MWvoCͮkl` oV c?@[R^A#;I3~G,:m999(L AmZ?Xrٺ}T 厺PFp'}/nH(vO*E5mYН8y0 =Z{L uou=c!] M-+OuKY00S c,#X="-]k:> T3y^7;K2Eh%yҹj]2p CceX2y~칆`0PI#0 Nji8/Xw\G_;_w8A!?gaA4FFz>pqBaV(/ ${>p_ /[θ凜{uakѥ6ٺF34 ]W ae]\-7 =M-xk?Z2?⹷\ؘVXL3ȴv8_o;~73Ys/ԻPd'H]ReS'0mZ vWűㄟ|TNq[$YI L-Y Jg~u;Iv=%ž^uUPLbj1IѩAg)'k Ppup o[pƿT#GS쮠X&cIkwȣYvLOwOKtb`k)PRO8wB2?vʎ??ikc!^{D}mIR[g&q}Iɇ}Lg f֎ģ{\́~[0>"^@&S{7ߑ]yLE^'y*eJCqZxd}5]`b>eR*9jzH%g&Dx ޶)u&&!K~r2֜ט:ߋz sЄ^רb1W1GYg) motPV}} 0LV!18:Q-B1pmZkwJEEZ}y'F~}ȉ3t2c*yfў|\<'V%@\V \s 0l9Lz3J;C=] gp0z=mţh_XKnƶ5Ƭ_a}b DϐЮCDc~DyhP^-y50P EX? 5z }+**ʭzԵvV1`?҆Bְ߱mk5p#L ԌET=3P\V e #\nf a=FF|cces.c#5v>u_Z !*$_ :<V^!y\ ǭJΨΗ,z~x}zR^IHX:i1]ЯoQ}%`9KO8[^۫=rk#ɱ ~_̻c1@}г/XU)12߽LjfȪdq_׮^RkjZKPvՒs}5v,u>+O1O+sf\}yf cXw?Ǭ_cI46H!O134,̫Ïl64Bz37`"5hyAyu=:TJpz6o C!^2CI +#f#}> Poj<IH#,^Q}2JF~^/z] WVw4a|,񗳄!Ռ$Ax@{.}|,VCWpSHWoMwN7״+K -n.|8F`)ݿyßrx%fvv鱥Bk&TE`S_c__bQxWyUCѓ}] JLg _.Ra͆&ӮX7%u i6 X^>~..%`ot߲rTN8SU{{(˟혀4/|[8q4kfMC0=|`N˨C0cubJa[|=2L~K1q AĽv??SdCW8$4Gv-;W.Rcα3\9?t/$::˄滦g-|נ',N)'ɤjq7oOɤ9sץ> ;!R)::DC5ɓ&,O PnǓ-t:uT;BUC&ĝͼ: ;v,DU7b$H)F5ӓ =8&.f{ ~_|Vϩ*юV??C/CѷgT} \a* ww+9};u&sh>9X5:^bU̕G3*Ci f ] KԈac&δ~kE .5JxAR~I38bdYj("+gq0 E`|=_| r;2_6w'6̠jO  u@_ud'8d1^>S!A1%iۃڱǜ6Dx7cE0=qE?6s+#n1<"ӌ915bLْ|c*cgG2:$iucyHOm)ژրً`0tne[QX]cZh&UD3 CF^.ЭSo6B֩؈X6ڥFd*"G*sȃx>+{catgRthƬWiD0Y̧P&JID}(6$LeT.pV,2nh]2/WstZX#wԌeD3_Ԝܽ(/',*_E=hQzqٮPv IDAT:G;oދ.&a=dzQ;~pȏ<FG #TX^ccVa1LÌEƏ_W*vZD8U7 V(66 N=w(f8ZQ&.nbN6q*+n[L0C)/nuͦpq]BRฏ`Iߓ*Խmo g|N8D'1ɯv۠L!]dűͻ2cHwd<ۂ꿍^[={R9`kqvzIM6Zf_P$u@4T5Fq|);nui:JpD{ȥ6~@K c,6sKqUkZ$Tu`} v^OkWZɥ;O$єpb{63 g:8wj1W_0P]?4nΗ@%qG[VM h̪ݗU{/P 91f1;.׻ws5zU;XRoa8#6$N#|{I":lSj>@s*uj)8TjM.w6U0*Ru༌~&S;XY#vCyIHNVT7**P#~34mPqDTkTޅsI连+ }<`vD@Zq7:rogkI^ƷQ-0ZkFihjk;cCNy&=wz/Nx;p|vpjcfCJ4Jڋ~& #DZmyFVX+%Xo^'I>WJʝxFEYL yE:Z5[P?s(XC_ חiܻ k|n%9/tzwh3ƞ{~Y$A%ظ" PO$G)y9C(  .(A$ r@tthh栁zZ=ܺ [ ; tZ {ȅnȂ>dT4T^ wCڂك[֥2##Qswݘ.s@Fj:N6&ӌk!%s #85 }'s+BEy7*^TÎH !8@ C6^Zۘ7p0iyזW 's&J[ /z|Rƈ}uT&p̫1m s\7(7MD-~g8"?_kTj\U 0FkjtX%|R5D4bte/aB S8 &ai:ֻ%(`X_Nu]KJ-n` *5܏%Liư0P&[RQ'ȗ& rG|Qc#Asrz~mFM?kh.sx˱b4:!'f܂SH, ~Vph[_C=T vX_ݎXs M ꆻޥ%/~sIo|mBF ȝ4ɝa! L|qc^A#jIwQ0g2Odžƶ6kU\[#w՟+ԅV/z!z6"X-"z+X_Rw]k\!У&7~:F#KWXV2L?P KA٧t6*C8xL̝B΄2c5 W<|ŴXwt^ٖ:b+gl}5W֓?\ ;}mI>87ДKǃ0My>>{nHU-󆵁 Mӻ>DQ6ʠiz砜R J9eJY,!_MUmf,T4ƚ:5D?%yqwY*N͹󇰌'$0=Vȸ3j NsļJ:°<كO7kqlb…*u=]MBǔC뻝a>MpPN9[Pk /\}MX}C_c#ڲ *"Ko΅:BeɼUF%Js[9L9Zgd} FQ+EŃmO6s Q^ 潳(T-0(([noJW3r OmU O25 ]"HQ~*?'[kTB#$/soy%#Me#ͷ0"v[aY#FH"dGȻ nrr]_ CRbc6]5UI_anܭ!qݥ-[>wb7`@SOR%\e̹gS D'B/ ^em_>l-Ppnxf?Z||#J/1ik@@[9n+ TUi0\*r=*' rmU$TU:d; Mü@oO*"%WO}oQIM>1B~AcOEuG~8r νmC4H;# ?n #ӊ'HW~ UU@,-_Vg߮,10wՄS t|+Lye,!υ<'c;+Cn5s6Hu8j..?fiQ^]sP?6KaCPV:|/l,xYomP\HwT)mUÉPC}#vZT9!1+sOMb8<UZ(1藪w~e󑀪튑PځР0mCPuLKZrd%iiM1E;(2Ӳ?#f4VvFGy(#Jxʓ?u#!꿝7qM7'Q ̮#V3QOY.X.V ;YVP@#7%Td݂l^xFpʣ' ԢcVd]A !͎ۊ_^XE_캌d94 ?a>Q;%JF|"Ў>[Wuc0Vsqmwf%^8+FYQ("3Rգ wwJh' 9Lj>1B;10LL@zNt ({Ho?sSL\l|FK5rvQf:FD/&+ŧ#!ͫQ@vju]rIi.VӏrDZzsNP56h9yxnAk\x4}ys9//mq <{8,EZ/ۡ~\[:4'F$DR'^{zMќI!_p}̊Tv1E\ĭ2#Ib-p WLrvTՆ? ;t~ P ^އ>sμ >]aOnɱLdu Z2 d{nodmG͟^$ p"4#Tf1؀k+ EKB_ZG7N;/bvJ=k'ԣsAd_ID2c!kpZOyc8[tpC&an70]6k>?7\]"3nj%jJ0n׍wbiQNGߍgn܇cyOA"C )awE0n-2ž'y8'?VLH}.6>w jzkC$#C5<߂ֵA*TѨֿ֘4湥ύmm9lŒȩ<1jtfn~|O{ Z|m{Q^F%'b|@c=Tw[N_%QJsSY RYkyf><'1𱜸|}-bCT:})@~ccF2>la6*ah|BRmۆ#&>j9c[YΉS``Ʀ\(c2mÒܪ3n ]% w`;_l޲ {ӓ>CAS#\/(/הy%d9>SؗR_U7vmԥM-5u@Z5aG2rd pDJmnǖ9Tj(棐HRg<_kП-cǒ8}gETp쳤ƅ<*I v]x- ſ*Ƞiv3{-5BB4K x=>B)w] 7}Rk#w{2wqzw+[Tvm .0&7 g10\ ZذD~ғsi}`fd} nxwhu'Y>m5dyF(љeh$ e((ÞXD_s&o bE0[pj41-'XR?>]dFFaY0K0t s: Clpqcύ0%ߵ'ȕ;}I>tŔWzhu;d$r=fʱhH$WrtH1}Aqzj MH']1`GZa`Jx?Uws^vA( .l082`=2 j'cq§7 gkxPO-[Jqe_a65[nT22ٌucCۣq759 uSF>Mcx>< [z29nj2-7<촇/ `XZ#MP$l =t UI{sxތSt찇"d&wQ+Zޔ"\ o~Is+ޒ[fhtǫGq"-R-)b,ho9͍%Ijp,tFACqDUHSyU`@pDkc乱r~VkR:YF:/V:۟xp$L{Lh {/2Nez@Zf껐)dQQp,>,wζF.ϽB2ch0KW#q%AI hgwO3"A2tg;#gLG:667_>ifxtrm㮠X,޻PO I7T*Eãw M.)=YqfKȨ6_#]nGնHڰOIGcjQhg3 XBѶT ?x=X!U=C0_nř7֌C#n.|Ug2clTE8F jSՉ8\C흰S[kc"8 J`Z]"cYT#A cr0`Bi9zx!O/%ϐr,&$We,if҇b8,:w[k6bnv \Zd rǪ3d'UCӠUǎf$~iWg ״_ߕGC ={rNi0K 'RnPf}! *4% eh2E(o;ZfȅqFnrꜺR,vT ].Y{؛!n񳊱YݥZcnSJagκmKg7qC]W?v]R,bd)@ŭfx I1j0$:Q}?#.?myuӊd%w(Vi-W`ff4bs)Y(W?fvRӘ7[H4`'R>!ngpifY265F[PY˽nic?YsormVQt[+ ޞVӖbC`^Wi7ME's#βQw>} >ۇ5=?}l+<18{-d!M5&z)2(xkuMξHMDG C0S1xB S{&K\G ܋jFn/)oEawXX )zPp/?DrtCG_!ai]V+1%r\krZZW TT})i0䬩=66V@ 4n6Tk!؊I nJ'iFj4B /bA1*mCUJ5NgfHrMiF Y"(- R.>#ŬP:X/ \$BejHӛtwtH.ջ"_w\ tp7VBXy߳ݸc6b8Fxδ]h]R:jJBA2D0'Us?K+Dc=p&ȡaOuzD8(+5'&;y$ o7`@eP߿F-z *3rCRPS_5kQ]5|@-9[|R>gV4nOu?d2 j\L>H:M̍Mo {Ny( l1~|"g2gEFbxDu~7D*xxԿO>5$1|E*?QӮPV&Udpbr{ɤ^R!XRp5!(Ɠ*݊<)uBO;u:f,f#Ykn6!' ?Z.`mʛ /It l_@Ao+TaJ:T M;rm^D\W7<46<`5֥gZs}WJ\!A[;QjS~Qwig Sc>cOGLMszѪcꔉZ(J3?Ko;rHE܍wpH[m H1Ǫ/2KXN;^BB.1ztMǴcB-vCʠZ$P^-дlf t?^=<ɳ{hMVb YWP, wʜr̿h37o8mh7 ;reՊ{ӱ5yQ;ќT7;N oFAn`UgNƏގ+^U܁^nI^8"_;#nGF]I!-G9K) G}GSš:a!BÝUHc6!,\twCX勢gǴ5bᔭS{MѲ^Q>zPq vݏyqy.٭LAkAw*GՂ,-l 7 5(SډorliQd#Ȣ@uEbi^3TgXt.CVAp> ]6Jq͐;R܃t߀:C8X4bl"[{HI#\!HKMB߇4šC0g眘Ht#?Nz\R_Ks&bpΩ>kcpOP隲TTv $/?ӫg2^ZO?Cҿ*Y~K*g KYQ2m.+Ht]m(J~rTh`D!wt֛hfd7{ouu:D9LFznMCu6}wufiǼr:Wcݍjm|4"P̎K9cq2a *mQo?.oP7\B.A25X"PLzx1Gt'3R;aщ~OX!qAjzGfG D`bQM*g5@/tx#JQ<{#4E#rPɜJ!>lsEU"~,*J]"%,{G!>z{ t@ih;E#t ˣQtj.:1o:aux+;{e 0 h![p% hV:Ǣx}+y|]w]҇/䛇q$<є{P=T>kzǡr9g lsAl,}5hloHhcY% /V3eXnR,B5 1P˒R Rzi66=`c(~8M- .x\6 Q"rC箤0B#+.@]~kd`QxQ~"p,R:|a9$Ω')HmO~임h;c糧ְ_;9G֖9LN;Al6Vd,X9/yf\){+Ա,a[ 3 hLN( %dۊ\K\.$MkJgSI5MGj)w7dEAC1ii7`k6 k3[h1U#c}ކ$3DkfƺM]3 GNU General Public License v3.0 - GNU Project - Free Software Foundation (FSF)

GNU GENERAL PUBLIC LICENSE

Version 3, 29 June 2007

Copyright © 2007 Free Software Foundation, Inc. <https://fsf.org/>

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The GNU General Public License is a free, copyleft license for software and other kinds of works.

The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too.

When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things.

To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others.

For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.

Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it.

For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions.

Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users.

Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free.

The precise terms and conditions for copying, distribution and modification follow.

TERMS AND CONDITIONS

0. Definitions.

“This License” refers to version 3 of the GNU General Public License.

“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks.

“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations.

To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work.

A “covered work” means either the unmodified Program or a work based on the Program.

To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well.

To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying.

An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion.

1. Source Code.

The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work.

A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language.

The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it.

The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work.

The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source.

The Corresponding Source for a work in source code form is that same work.

2. Basic Permissions.

All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law.

You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you.

Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary.

3. Protecting Users' Legal Rights From Anti-Circumvention Law.

No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures.

When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures.

4. Conveying Verbatim Copies.

You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program.

You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee.

5. Conveying Modified Source Versions.

You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions:

  • a) The work must carry prominent notices stating that you modified it, and giving a relevant date.
  • b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”.
  • c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it.
  • d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so.

A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate.

6. Conveying Non-Source Forms.

You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways:

  • a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange.
  • b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge.
  • c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b.
  • d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements.
  • e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d.

A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work.

A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product.

“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made.

If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM).

The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network.

Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying.

7. Additional Terms.

“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions.

When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission.

Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms:

  • a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or
  • b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or
  • c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or
  • d) Limiting the use for publicity purposes of names of licensors or authors of the material; or
  • e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or
  • f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors.

All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying.

If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms.

Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way.

8. Termination.

You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11).

However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation.

Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice.

Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10.

9. Acceptance Not Required for Having Copies.

You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so.

10. Automatic Licensing of Downstream Recipients.

Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License.

An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts.

You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it.

11. Patents.

A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”.

A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License.

Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version.

In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party.

If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid.

If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it.

A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007.

Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law.

12. No Surrender of Others' Freedom.

If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program.

13. Use with the GNU Affero General Public License.

Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such.

14. Revised Versions of this License.

The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.

Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation.

If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program.

Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version.

15. Disclaimer of Warranty.

THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.

16. Limitation of Liability.

IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

17. Interpretation of Sections 15 and 16.

If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee.

END OF TERMS AND CONDITIONS

How to Apply These Terms to Your New Programs

If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.

To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found.

    <one line to give the program's name and a brief idea of what it does.>
    Copyright (C) <year>  <name of author>

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.

Also add information on how to contact you by electronic and paper mail.

If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode:

    <program>  Copyright (C) <year>  <name of author>
    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
    This is free software, and you are welcome to redistribute it
    under certain conditions; type `show c' for details.

The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”.

You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see <https://www.gnu.org/licenses/>.

The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read <https://www.gnu.org/licenses/why-not-lgpl.html>.

ucblogo-6.1/LICENSE0000664000175000017500000010451513575571772012150 0ustar jjcjjc GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ucblogo-6.1/files.c0000664000175000017500000004444713575571772012420 0ustar jjcjjc/* * files.c logo file management module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifdef WIN32 #include #endif /* WIN32 */ #include "logo.h" #include "globals.h" #ifdef HAVE_WX #define getc getFromWX_2 #define ungetc wxUnget_c int reading_char_now = 0; #endif #ifdef HAVE_TERMIO_H #ifdef HAVE_WX #include #else #include #endif #else #ifdef HAVE_SGTTY_H #include #endif #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef mac #include #endif #ifdef ibm #ifndef _MSC_VER #include #ifndef __RZTC__ #include #endif /* ZTC */ #endif /* MSC_VER */ extern int getch(), kbhit(); #ifdef __RZTC__ #include #endif #endif NODE *file_list = NULL; NODE *reader_name = NIL, *writer_name = NIL, *file_prefix = NIL; int need_save = 0; /* nonzero if workspace changed since save */ NODE *save_name = NIL; /* filename of last save or load command */ char *asciiz(NODE *arg) { char *out = (char *)malloc(getstrlen(arg)+1); return noparity_strnzcpy(out, getstrptr(arg), getstrlen(arg)); } NODE *lseteditor(NODE *args) { NODE *arg; arg = cnv_node_to_strnode(car(args)); if (arg == UNBOUND) err_logo(BAD_DATA_UNREC, arg); else { editor = asciiz(arg); editorname = strrchr(editor, (int)'/'); if (editorname == NULL) editorname = strrchr(editor, (int)'\\'); if (editorname == NULL) editorname = strrchr(editor, (int)':'); editorname = (editorname ? editorname+1 : editor); } return UNBOUND; } NODE *lsetlibloc(NODE *args) { NODE *arg; arg = cnv_node_to_strnode(car(args)); if (arg == UNBOUND) err_logo(BAD_DATA_UNREC, arg); else logolib = asciiz(arg); return UNBOUND; } NODE *lsethelploc(NODE *args) { NODE *arg; arg = cnv_node_to_strnode(car(args)); if (arg == UNBOUND) err_logo(BAD_DATA_UNREC, arg); else helpfiles = asciiz(arg); return UNBOUND; } NODE *lsetcslsloc(NODE *args) { NODE *arg; arg = cnv_node_to_strnode(car(args)); if (arg == UNBOUND) err_logo(BAD_DATA_UNREC, arg); else csls = asciiz(arg); return UNBOUND; } NODE *lsettemploc(NODE *args) { NODE *arg; arg = cnv_node_to_strnode(car(args)); if (arg == UNBOUND) err_logo(BAD_DATA_UNREC, arg); else tempdir = asciiz(arg); return UNBOUND; } NODE *lsetprefix(NODE *args) { NODE *arg; if (car(args) == NIL) file_prefix = NIL; else { arg = cnv_node_to_strnode(car(args)); if (arg == UNBOUND) err_logo(BAD_DATA_UNREC, arg); else file_prefix = arg; } return UNBOUND; } NODE *lprefix(NODE *args) { return file_prefix; } FILE *open_file(NODE *arg, char *access) { char *fnstr; FILE *tstrm; char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; if (is_list(arg)) { /* print to string */ if (*access != 'w') { err_logo(BAD_DATA_UNREC, arg); return NULL; } else { FIXNUM i = int_arg(cdr(arg)); if (NOT_THROWING && i > 0 && cddr(arg) == NIL) { char *tmp = (char *)malloc(i); *tmp = '\0'; return (FILE *)tmp; } err_logo(BAD_DATA_UNREC, car(arg)); return NULL; } } arg = cnv_node_to_strnode(arg); if (arg == UNBOUND) return(NULL); if (file_prefix != NIL) { print_stringlen = getstrlen(file_prefix) + getstrlen(arg) + 2; fnstr = (char *)malloc((size_t)print_stringlen + 1); } else fnstr = (char *) malloc((size_t)getstrlen(arg) + 1); if (fnstr == NULL) { err_logo(FILE_ERROR, make_static_strnode(message_texts[MEM_LOW])); print_stringptr = old_stringptr; print_stringlen = old_stringlen; return NULL; } if (file_prefix != NIL) { print_stringptr = fnstr; ndprintf((FILE *)NULL, "%p%t%p", file_prefix, separator, arg); *print_stringptr = '\0'; print_stringptr = old_stringptr; print_stringlen = old_stringlen; } else noparity_strnzcpy(fnstr, getstrptr(arg), getstrlen(arg)); tstrm = fopen(fnstr, access); free(fnstr); return(tstrm); } NODE *ldribble(NODE *arg) { if (dribblestream != NULL) err_logo(ALREADY_DRIBBLING, NIL); else { dribblestream = open_file(car(arg), "w+"); if (dribblestream == NULL) err_logo(CANT_OPEN_ERROR, car(arg)); } return(UNBOUND); } NODE *lnodribble(NODE *args) { if (dribblestream != NULL) { fclose(dribblestream); dribblestream = NULL; } return(UNBOUND); } FILE *find_file(NODE *arg, BOOLEAN remove) { NODE *t, *prev = NIL; FILE *fp = NULL; t = file_list; while (t != NIL) { if ((is_list(arg) && arg == car(t)) || (!is_list(arg) && (compare_node(arg, car(t), FALSE) == 0))) { fp = (FILE *)t->n_obj; if (remove) { t->n_obj = NIL; if (prev == NIL) file_list = cdr(t); else setcdr(prev, cdr(t)); } break; } prev = t; t = cdr(t); } return fp; } NODE *lopen(NODE *arg, char *mode) { FILE *tmp; arg = car(arg); if (find_file(arg, FALSE) != NULL) err_logo(ALREADY_OPEN_ERROR, arg); else if ((tmp = open_file(arg, mode)) != NULL) { push(arg, file_list); file_list->n_obj = (NODE *)tmp; } else err_logo(CANT_OPEN_ERROR, arg); return(UNBOUND); } NODE *lopenread(NODE *arg) { return(lopen(arg,"r")); } NODE *lopenwrite(NODE *arg) { return(lopen(arg,"w")); } NODE *lopenappend(NODE *arg) { return(lopen(arg,"a")); } NODE *lopenupdate(NODE *arg) { return(lopen(arg,"a+")); } NODE *lallopen(NODE *args) { return(file_list); } NODE *lclose(NODE *arg) { FILE *tmp; NODE *margs; if ((tmp = find_file(car(arg), TRUE)) == NULL) err_logo(NOT_OPEN_ERROR, car(arg)); else if (is_list (car(arg))) { margs = cons(caar(arg), cons(make_strnode((char *)tmp, NULL, strlen((char *)tmp), STRING, strnzcpy), NIL)); lmake(margs); free((char *)tmp); } else fclose(tmp); if ((is_list(car(arg)) && car(arg) == writer_name) || (!is_list(car(arg)) && (compare_node(car(arg), writer_name, FALSE) == 0))) { writer_name = NIL; writestream = stdout; } if ((is_list(car(arg)) && car(arg) == reader_name) || (!is_list(car(arg)) && (compare_node(car(arg), reader_name, FALSE) == 0))) { reader_name = NIL; readstream = stdin; } return(UNBOUND); } char *write_buf = 0; NODE *lsetwrite(NODE *arg) { FILE *tmp; NODE *margs; if (writestream == NULL) { /* Any setwrite finishes earlier write to string */ *print_stringptr = '\0'; writestream = stdout; if (find_file(writer_name, FALSE) == NULL) { /* pre-5.4 compatibility mode, implicitly close string */ margs = cons(car(writer_name), cons(make_strnode(write_buf, NULL, strlen(write_buf), STRING, strnzcpy), NIL)); lmake(margs); free(write_buf); } writer_name = NIL; } if (car(arg) == NIL) { writestream = stdout; writer_name = NIL; } else if (is_list(car(arg))) { /* print to string */ FIXNUM i = int_arg(cdar(arg)); if ((tmp = find_file(car(arg), FALSE)) != NULL) { writestream = NULL; writer_name = car(arg); print_stringptr = (char *)tmp + strlen((char *)tmp); print_stringlen = i - strlen((char *)tmp); } else if (NOT_THROWING && i > 0 && cddr(car(arg)) == NIL) { writestream = NULL; writer_name = copy_list(car(arg)); print_stringptr = write_buf = (char *)malloc(i); print_stringlen = i; } else err_logo(BAD_DATA_UNREC, car(arg)); } else if ((tmp = find_file(car(arg), FALSE)) != NULL) { writestream = tmp; writer_name = car(arg); } else err_logo(NOT_OPEN_ERROR, car(arg)); return(UNBOUND); } NODE *lsetread(NODE *arg) { FILE *tmp; if (car(arg) == NIL) { readstream = stdin; reader_name = NIL; } else if ((tmp = find_file(car(arg), FALSE)) != NULL) { readstream = tmp; reader_name = car(arg); } else err_logo(NOT_OPEN_ERROR, car(arg)); return(UNBOUND); } NODE *lreader(NODE *args) { return(reader_name); } NODE *lwriter(NODE *args) { return(writer_name); } NODE *lerasefile(NODE *arg) { char *fnstr; arg = cnv_node_to_strnode(car(arg)); if (arg == UNBOUND) return(UNBOUND); fnstr = malloc((size_t)getstrlen(arg) + 1); if (fnstr == NULL) { err_logo(FILE_ERROR, make_static_strnode(message_texts[MEM_LOW])); return UNBOUND; } strnzcpy(fnstr, getstrptr(arg), getstrlen(arg)); unlink(fnstr); free(fnstr); return(UNBOUND); } NODE *lsave(NODE *arg) { FILE *tmp; NODE *name; if (arg == NIL) name = save_name; else name = car(arg); tmp = writestream; if (name != NIL) { writestream = open_file(name, "w+"); if (writestream != NULL) { lpo(cons(lcontents(NIL), NIL)); fclose(writestream); need_save = 0; save_name = name; } else err_logo(CANT_OPEN_ERROR, car(arg)); } else err_logo(NOT_ENOUGH, NIL); writestream = tmp; return(UNBOUND); } void runstartup(NODE *oldst) { NODE *st; st = valnode__caseobj(Startup); if (st != oldst && st != NIL && is_list(st)) { eval_driver(st); } } void silent_load(NODE *arg, char *prefix) { FILE *tmp_stream; NODE *tmp_line, *exec_list; char load_path[200]; NODE *st = valnode__caseobj(Startup); /* This procedure is called three ways: * silent_load(NIL,*argv) loads *argv * silent_load(proc,logolib) loads logolib/proc * silent_load(proc,NULL) loads proc.lg * The "/" or ".lg" is supplied by this procedure as needed. */ /* [This is no longer true! But for Windows we change FOO? to FOOQ.] * In the case that this procedure is called to load a procedure from the * logo library, it must first truncate the name of the procedure to * eight characters, to find the filename (so as to be compatible with * MS-DOS) */ if (prefix == NULL && arg == NIL) return; strcpy(load_path, (prefix == NULL ? "" : (arg == NIL ? prefix : addsep(prefix)))); if (arg != NIL) { arg = cnv_node_to_strnode(arg); if (arg == UNBOUND) return; if (!strncmp(getstrptr(arg), ".", getstrlen(arg))) return; if (!strncmp(getstrptr(arg), "..", 2)) return; if (getstrlen(arg) > 150) return; noparitylow_strnzcpy(load_path + (int)strlen(load_path), getstrptr(arg), getstrlen(arg)); if (prefix == NULL) strcat(load_path, ".lg"); /* #ifdef WIN32 */ else if (arg != NIL) { char *cp; for (cp = load_path; *cp != '\0'; cp++) if (*cp == '?') *cp = 'Q'; } /* strcpy(load_path, eight_dot_three(load_path)); */ /* #endif */ } tmp_stream = loadstream; tmp_line = current_line; loadstream = fopen(load_path, "r"); if (loadstream != NULL) { #ifdef OBJECTS // make sure the library executes // in the context of the logo object NODE* temp_object = current_object; current_object = logo_object; #endif while (!(feof(loadstream)) && NOT_THROWING) { current_line = reader(loadstream, ""); exec_list =parser(current_line, TRUE); if (exec_list != NIL) eval_driver(exec_list); } fclose(loadstream); runstartup(st); #ifdef OBJECTS // restore the old current object current_object = temp_object; #endif } else if (arg == NIL || prefix == csls) err_logo(CANT_OPEN_ERROR, make_strnode(load_path, NULL, strlen(load_path), STRING, strnzcpy)); loadstream = tmp_stream; current_line = tmp_line; } NODE *lcslsload(NODE *arg) { NODE *save_prefix = file_prefix; file_prefix = NIL; silent_load(car(arg),csls); file_prefix = save_prefix; save_name = car(arg); return UNBOUND; } NODE *lload(NODE *arg) { FILE *tmp; NODE *tmp_line, *exec_list; NODE *st = valnode__caseobj(Startup); tmp = loadstream; tmp_line = current_line; loadstream = open_file(car(arg), "r"); if (loadstream != NULL) { while (!(feof(loadstream)) && NOT_THROWING) { current_line = reader(loadstream, ""); exec_list = parser(current_line, TRUE); if (exec_list != NIL) eval_driver(exec_list); } fclose(loadstream); save_name = car(arg); runstartup(st); } else err_logo(CANT_OPEN_ERROR, car(arg)); loadstream = tmp; current_line = tmp_line; return(UNBOUND); } NODE *lreadlist(NODE *args) { NODE *val; val = parser(reader(readstream, ""), FALSE); if (feof(readstream)) { return(Null_Word); } return(val); } NODE *lreadword(NODE *args) { NODE *val; val = reader(readstream, "RW"); /* fake prompt flags no auto-continue */ if (feof(readstream)) { return(NIL); } return(val); } NODE *lreadrawline(NODE *args) { NODE *val; val = reader(readstream, "RAW"); /* fake prompt flags no specials */ if (feof(readstream)) { return(NIL); } return(val); } int readchar_lookahead_buf = -1; NODE *lreadchar(NODE *args) { #ifdef WIN32 MSG msg; #endif /* WIN32 */ char c; if (readchar_lookahead_buf >= 0) { c = (char)readchar_lookahead_buf; readchar_lookahead_buf = -1; return(make_strnode((char *)&c, (struct string_block *)NULL, 1, (getparity(c) ? BACKSLASH_STRING : STRING), strnzcpy)); } charmode_on(); input_blocking++; #ifdef HAVE_WX if (interactive && readstream==stdin) { reading_char_now = 1; c = getFromWX(); reading_char_now = 0; } else c = (char)getc(readstream); #else #ifndef TIOCSTI if (!setjmp(iblk_buf)) #endif { #ifdef mac csetmode(C_RAW, stdin); while ((c = (char)getc(readstream)) == EOF && readstream == stdin); csetmode(C_ECHO, stdin); #else /* !mac */ #ifdef ibm if (interactive && readstream==stdin) #ifndef WIN32 c = (char)getch(); #else /* WIN32 */ { win32_update_text(); if (!char_avail) while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); if (char_avail) break; } c = buffered_char; char_avail = 0; } #endif /* WIN32 */ else c = (char)getc(readstream); if (c == 17) { /* control-q */ to_pending = 0; err_logo(STOP_ERROR,NIL); } if (c == 23) { /* control-w */ #ifdef SIG_TAKES_ARG logo_pause(0); #else logo_pause(); #endif return(lreadchar(NIL)); } #else /* !ibm */ c = (char)getc(readstream); #endif /* ibm */ #endif /* mac */ } #endif /* wx */ input_blocking = 0; #ifdef HAVE_WX if ((!interactive || readstream!=stdin) && feof(readstream)) { #else if (feof(readstream)) { #endif return(NIL); } return(make_strnode((char *)&c, (struct string_block *)NULL, 1, (getparity(c) ? BACKSLASH_STRING : STRING), strnzcpy)); } NODE *lreadchars(NODE *args) { unsigned int c, i; struct string_block *strhead = NULL; char *strptr= NULL; NODETYPES type = STRING; char *cp; c = (unsigned int)getint(pos_int_arg(args)); if (stopping_flag == THROWING) return UNBOUND; charmode_on(); input_blocking++; #ifndef TIOCSTI if (!setjmp(iblk_buf)) #endif { strhead = malloc((size_t)(c + sizeof(FIXNUM) + 1)); if (strhead == NULL) { err_logo(FILE_ERROR, make_static_strnode(message_texts[MEM_LOW])); return UNBOUND; } strptr = strhead->str_str; #ifdef HAVE_WX if (interactive && readstream==stdin) { reading_char_now = 1; cp=strptr; for (i=c; i != 0; --i) { *cp++ = getFromWX(); } reading_char_now = 0; } else c = (unsigned int)fread(strptr, 1, (size_t)c, readstream); #else c = (unsigned int)fread(strptr, 1, (size_t)c, readstream); #endif setstrrefcnt(strhead, 0); } input_blocking = 0; #ifndef TIOCSTI if (stopping_flag == THROWING) return(UNBOUND); #endif if (c <= 0) { free(strhead); return(NIL); } for (i = 0; i < c; i++) if (getparity(strptr[i])) type = BACKSLASH_STRING; return(make_strnode(strptr, strhead, (int)c, type, strnzcpy)); } NODE *leofp(NODE *args) { int c; #ifdef HAVE_WX if (interactive && readstream==stdin) return FalseName(); #endif c = getc(readstream); if (c == EOF) return(TrueName()); ungetc(c,readstream); return(FalseName()); } NODE *lkeyp(NODE *args) { #if defined(unix) | defined(__WXMSW__) long nc; #endif int c; #ifdef WIN32 MSG msg; int old_mode; #endif if (readchar_lookahead_buf >= 0) return TrueName(); if (readstream == stdin && interactive) { charmode_on(); fflush(stdout); fix_turtle_shownness(); #ifdef HAVE_WX return(wxKeyp() ? TrueName() : FalseName()); #else #if defined(__RZTC__) && !defined(WIN32) /* sowings */ zflush(); #endif #ifdef WIN32 win32_update_text(); #endif #if defined(mac) csetmode(C_RAW, stdin); c = ungetc(getc(readstream), readstream); csetmode(C_ECHO, stdin); return(c == EOF ? FalseName() : TrueName()); #elif defined(ibm) #ifdef WIN32 old_mode = char_mode; char_mode = 1; while (PeekMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if (char_avail/* ||cur_index */ ) break; } char_mode = old_mode; return ((char_avail /* ||cur_index */ ) ? TrueName() : FalseName()); #else return(kbhit() ? TrueName() : FalseName()); #endif #else #ifdef FIONREAD ioctl(0,FIONREAD,(int *)(&nc)); #else ndprintf(stdout, "%t\n", message_texts[NO_FIONREAD]); nc = 1; /* pretend there's a char so we don't loop */ #endif if (nc > 0) return(TrueName()); else return(FalseName()); #endif #endif /* wx */ } c = getc(readstream); if (feof(readstream)) return(FalseName()); else { ungetc(c, readstream); return(TrueName()); } } NODE *lreadpos(NODE *args) { return(make_intnode(ftell(readstream))); } NODE *lsetreadpos(NODE *arg) { NODE *val = pos_int_arg(arg); if (NOT_THROWING) { fseek(readstream,getint(val),0); } return(UNBOUND); } NODE *lwritepos(NODE *args) { return(make_intnode(ftell(writestream))); } NODE *lsetwritepos(NODE *arg) { NODE *val = pos_int_arg(arg); if (NOT_THROWING) { fseek(writestream,getint(val),0); } return(UNBOUND); } ucblogo-6.1/.gitignore0000664000175000017500000000041213601420003013064 0ustar jjcjjc*.o git.c libloc.c makefile makehelp logo config.h config.log config.status docs/html/ docs/ucblogo.info docs/usermanual.aux docs/usermanual.cp docs/usermanual.cps docs/usermanual.dvi docs/usermanual.log docs/usermanual.ps docs/usermanual.toc helpfiles/HELPCONTENTS ucblogo-6.1/README.md0000664000175000017500000000511113601420003012354 0ustar jjcjjc# UCBLogo ## Berkeley Logo interpreter This is a free (both senses) interpreter for the Logo programming language. The interpreter was written primarily by Daniel Van Blerkom, Brian Harvey, Michael Katz, Douglas Orleans and Joshua Cogliati. Thanks to Fred Gilham for the X11 code. Emacs logo-mode by Hrvoje Blazevic. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses/. ## About this project This uses the repository https://github.com/jrincayc/ucblogo-code created for further UCBLogo development. The current version is 6.1 Changes for this release: * The license has been changed to GPL3. * The wxWidgets version updated to compile and run with version 3.0. * Adjustments made to compile and run on newer OSX versions. * Variety fixes like fixing implicit function definitions, fixing a line cursor behaviour, etc. Here is an overview of the repository: * csls - Programs form [Brian Harvey's trilogy "Computer Science Logo Style"](https://people.eecs.berkeley.edu/~bh/). * docs - Usermanual in variety formats and brief manual page. * helpfiles - files for UCBLogo interactive help. * test - Unit tests. * / - program source code and [a Program Logic Manual](/plm). The executable file in this distribution includes libraries from the [wxWidgets project](http://wxwidgets.org/). The Microsoft Windows version is distributed with runtime library libgcc_s_dw2-1.dll and libstdc++-6.dll, from the [MinGW project](http://www.mingw.org/). Those libraries are also covered by the Gnu GPL. We do not distribute their source code; you can download it from their respective web sites. ## Usage To build Logo under *nix, do this: ``` ./configure make ``` ## Previous versions For getting UCBLogo previous versions such as version 6.0 if you're running wxWidgets or 5.4 if not, please visit [Brian Harvey's UCBLogo GitHub repository](https://github.com/brianharvey/UCBLogo). The distribution for frozen platforms includes version 5.3 for DOS and Mac Classic (pre-OS X) still may be reached at [Brian Harvey's personal page](https://people.eecs.berkeley.edu/~bh/). ucblogo-6.1/error.c0000664000175000017500000002054713575571772012442 0ustar jjcjjc/* * error.c logo error module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #define WANT_EVAL_REGS 1 #include "logo.h" #include "globals.h" #ifdef HAVE_TERMIO_H #ifdef HAVE_WX #include #else #include #endif #else #ifdef HAVE_SGTTY_H #include #endif #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef HAVE_STRING_H #include #endif #ifdef mac #include #endif NODE *throw_node = NIL; NODE *err_mesg = NIL; ERR_TYPES erract_errtype; char *message_texts[MAX_MESSAGE+NUM_WORDS]; void err_print(char *buffer) { int save_flag = stopping_flag; int errtype; NODE *errargs, *oldfullp; FILE *fp; char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; if (err_mesg == NIL) return; if (buffer == NULL) { fp = stdout; } else { if (writestream == NULL) lsetwrite(the_generation); /* setwrite [] */ print_stringptr = buffer; print_stringlen = 200; fp = NULL; } stopping_flag = RUN; oldfullp = valnode__caseobj(Fullprintp); setvalnode__caseobj(Fullprintp, TrueName()); errtype = getint(car(err_mesg)); errargs = cadr(err_mesg); force_printdepth = 5; force_printwidth = 80; if (errargs == NIL) ndprintf(fp, message_texts[errtype]); else if (cdr(errargs) == NIL) ndprintf(fp, message_texts[errtype], car(errargs)); else ndprintf(fp, message_texts[errtype], car(errargs), cadr(errargs)); if (car(cddr(err_mesg)) != NIL && buffer == NULL) { ndprintf(fp, message_texts[ERROR_IN], car(cddr(err_mesg)), cadr(cddr(err_mesg))); } err_mesg = NIL; if (buffer == NULL) new_line(fp); else { *print_stringptr = '\0'; print_stringptr = old_stringptr; print_stringlen = old_stringlen; } setvalnode__caseobj(Fullprintp, oldfullp); stopping_flag = save_flag; } NODE *err_logo(ERR_TYPES error_type, NODE *error_desc) { BOOLEAN recoverable = FALSE, warning = FALSE, uplevel = FALSE; NODE *err_act, *val = UNBOUND; switch(error_type) { case FATAL: prepare_to_exit(FALSE); ndprintf(stdout,"%t\n",message_texts[FATAL]); exit(1); case OUT_OF_MEM_UNREC: prepare_to_exit(FALSE); ndprintf(stdout,"%t\n",message_texts[OUT_OF_MEM_UNREC]); exit(1); case OUT_OF_MEM: use_reserve_tank(); break; case DIDNT_OUTPUT: if (didnt_output_name != NIL) { last_call = didnt_output_name; } if (error_desc == NIL) { error_desc = car(didnt_get_output); ufun = cadr(didnt_get_output); this_line = cadr(cdr(didnt_get_output)); } err_mesg = cons_list(0, last_call, error_desc, END_OF_LIST); recoverable = TRUE; break; case NOT_ENOUGH: if (error_desc == NIL) err_mesg = cons_list(0, fun, END_OF_LIST); else err_mesg = cons_list(0, error_desc, END_OF_LIST); break; case BAD_DATA: recoverable = TRUE; case BAD_DATA_UNREC: err_mesg = cons_list(0, fun, error_desc, END_OF_LIST); break; case DK_WHAT_UP: uplevel = TRUE; case DK_WHAT: err_mesg = cons_list(0, error_desc, END_OF_LIST); break; case DK_HOW: case APPLY_BAD_DATA: case NO_VALUE: recoverable = TRUE; case DK_HOW_UNREC: case NO_CATCH_TAG: case ALREADY_DEFINED: case FILE_ERROR: case IS_PRIM: case AT_TOPLEVEL: case ERR_MACRO: case RUNNABLE_ARG: case TOO_MUCH: case DEEPEND: case BAD_DEFAULT: case CANT_OPEN_ERROR: case ALREADY_OPEN_ERROR: case NOT_OPEN_ERROR: err_mesg = cons_list(0, error_desc, END_OF_LIST); break; case SHADOW_WARN: err_mesg = cons_list(0, error_desc, END_OF_LIST); case IF_WARNING: warning = TRUE; break; case MISSING_SPACE: warning = TRUE; err_mesg = error_desc; break; case USER_ERR_MESSAGE: uplevel = TRUE; err_mesg = cons_list(0, error_desc, END_OF_LIST); break; case NO_TEST: err_mesg = cons_list(0, fun, END_OF_LIST); break; default: err_mesg = NIL; } didnt_output_name = NIL; if (uplevel && ufun != NIL) { ufun = last_ufun; this_line = last_line; } if (ufun != NIL) err_mesg = cons_list(0, err_mesg, ufun, this_line, END_OF_LIST); else err_mesg = cons_list(0, err_mesg, NIL, NIL, END_OF_LIST); err_mesg = cons(make_intnode((FIXNUM)error_type), err_mesg); if (warning) { err_print(NULL); return(UNBOUND); } err_act = valnode__caseobj(Erract); if (err_act != NIL && err_act != UNDEFINED) { if (error_type != erract_errtype) { erract_errtype = error_type; setvalnode__caseobj(Erract, NIL); val = err_eval_driver(err_act, recoverable); setvalnode__caseobj(Erract, err_act); if (recoverable == TRUE && val != UNBOUND) { return(val); } else if (recoverable == FALSE && val != UNBOUND) { ndprintf(stdout, message_texts[DK_WHAT], val); ndprintf(stdout, "\n"); val = UNBOUND; throw_node = theName(Name_toplevel); } else { /* if (err_mesg != NIL) */ { /* is this ever wrong? */ throw_node = theName(Name_error); stopping_flag = THROWING; output_node = UNBOUND; } return(UNBOUND); } } else { ndprintf(stdout,"%t\n", message_texts[ERRACT_LOOP]); throw_node = theName(Name_toplevel); } } else { /* no erract */ throw_node = theName(Name_error); } stopping_flag = THROWING; output_node = UNBOUND; return(val); } NODE *lerror(NODE *args) { NODE *val, *save_err = err_mesg; char buffer[200]; if (err_mesg == NIL) return NIL; err_print(buffer); err_mesg = save_err; setcar(cdr(err_mesg), make_strnode(buffer, (struct string_block *)NULL, strlen(buffer), STRING, strnzcpy)); val = err_mesg; err_mesg = NIL; return(val); } /* #ifndef HAVE_MEMCPY void memcpy(char *to, char *from, size_t len) { while (--len >= 0) *to++ = *from++; } #endif */ NODE *lpause(NODE *args) { NODE *elist = NIL, *val = UNBOUND, *uname = NIL; int sav_input_blocking; #ifndef TIOCSTI jmp_buf sav_iblk; #endif if (err_mesg != NIL) err_print(NULL); ndprintf(stdout, "%t\n", message_texts[PAUS_ING]); if (inside_evaluator) { uname = ufun; ufun = NIL; #ifndef TIOCSTI memcpy((char *)(&sav_iblk), (char *)(&iblk_buf), sizeof(jmp_buf)); #endif sav_input_blocking = input_blocking; input_blocking = 0; #ifdef mac csetmode(C_ECHO, stdin); fflush(stdin); #endif while (RUNNING) { if (uname != NIL) print_node(stdout, uname); elist = reader(stdin, "? "); if (NOT_THROWING) elist = parser(elist, TRUE); else elist = NIL; #ifndef WIN32 if (feof(stdin) && !isatty(0)) lbye(NIL); #endif #ifdef __RZTC__ if (feof(stdin)) rewind(stdin); #endif if (elist != NIL) eval_driver(elist); if (stopping_flag == THROWING) { if (compare_node(throw_node, Pause, TRUE) == 0) { val = output_node; output_node = UNBOUND; stopping_flag = RUN; #ifndef TIOCSTI memcpy((char *)(&iblk_buf), (char *)(&sav_iblk), sizeof(jmp_buf)); #endif input_blocking = sav_input_blocking; if (uname != NIL) { ufun = uname; } return(val); } else if (isName(throw_node, Name_error)) { err_print(NULL); stopping_flag = RUN; } } } #ifndef TIOCSTI memcpy((char *)(&iblk_buf), (char *)(&sav_iblk), sizeof(jmp_buf)); #endif input_blocking = sav_input_blocking; unblock_input(); if (uname != NIL) { ufun = uname; } /* } else { stopping_flag = THROWING; throw_node = theName(Name_toplevel); */ } else { ndprintf(stdout, "? "); #ifdef HAVE_WX flushFile(stdout); #else fflush(stdout); #endif } return(val); } NODE *lcontinue(NODE *args) { stopping_flag = THROWING; throw_node = Pause; if (args != NIL) output_node = car(args); else output_node = UNBOUND; return(UNBOUND); } ucblogo-6.1/wxterm.c0000664000175000017500000001417113575571772012633 0ustar jjcjjc/* * wxterm.c terminal cursor control dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "logo.h" #include "globals.h" #ifdef HAVE_UNISTD_H #include #endif #ifdef mac #include #endif #ifdef HAVE_TERMIO_H #include #else #ifdef HAVE_SGTTY_H #include #endif #endif #undef TRUE #undef FALSE #ifdef HAVE_TERMCAP_H #include #else #ifdef HAVE_TERMLIB_H #include #else #ifdef HAVE_CURSES_H #include #endif #endif #endif #undef TRUE #undef FALSE #define FALSE 0 #define TRUE 1 char PC; char *BC; char *UP; /* short ospeed; */ char bp[1024]; char cl_arr[40]; char cm_arr[40]; char so_arr[40]; char se_arr[40]; #ifdef HAVE_TERMIO_H struct termios tty_cooked, tty_cbreak; #else #ifdef HAVE_SGTTY_H struct sgttyb tty_cooked, tty_cbreak; #endif #endif int interactive, tty_charmode; int getTermInfo(int type); int setTermInfo(int type, int val); extern char **environ, *tgoto(), *tgetstr(); char *termcap_ptr; char* LogoPlatformName="wxWidgets"; char wx_font_face[300] = "Courier"; //300 matches lsetfont in wxterm.c int wx_font_size = 12; int label_height = 15; int termcap_putter(char ch) { *termcap_ptr++ = ch; return 0; } #ifdef unix void termcap_getter(char *cap, char *buf) { } #endif void term_init(void) { interactive = 1; } void setCharMode(int); void charmode_on() { setCharMode(1); } void charmode_off() { setCharMode(0);; } char* wx_fgets(char* s, int n, FILE* stream) { char c; char * orig = s; if (stream != stdin) { return fgets(s, n, stream); } charmode_on(); n --; c = ' '; while (c != '\n' && n != 0) { c = getFromWX_2(stream); s[0] = c; s++; n--; } return orig; } extern void wxClearText(); NODE *lcleartext(NODE *args) { int x_coord, y_coord; x_coord=getTermInfo(X_COORD); y_coord=getTermInfo(Y_COORD); wxClearText(); x_coord = x_margin; y_coord = y_margin; setTermInfo(X_COORD,x_coord); setTermInfo(Y_COORD,y_coord); return(UNBOUND); } NODE *lcursor(NODE *args) { int x_coord, y_coord; x_coord=getTermInfo(X_COORD); y_coord=getTermInfo(Y_COORD); return(cons(make_intnode((FIXNUM)(x_coord-x_margin)), cons(make_intnode((FIXNUM)(y_coord-y_margin)), NIL))); } extern void wxSetCursor(int, int); extern void wx_refresh(); NODE *lsetcursor(NODE *args) { int x_coord, y_coord, x_max, y_max; NODE *arg; fix_turtle_shownness(); wx_refresh(); x_coord=getTermInfo(X_COORD); y_coord=getTermInfo(Y_COORD); x_max=getTermInfo(X_MAX); y_max=getTermInfo(Y_MAX); arg = pos_int_vector_arg(args); if (NOT_THROWING) { x_coord = x_margin + getint(car(arg)); y_coord = y_margin + getint(cadr(arg)); while ((x_coord >= x_max || y_coord >= y_max) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); if (NOT_THROWING) { arg = pos_int_vector_arg(args); x_coord = x_margin + getint(cadr(arg)); y_coord = y_margin + getint(car(arg)); } } } if (NOT_THROWING) { wxSetCursor(x_coord,y_coord); } return(UNBOUND); } NODE *lsetmargins(NODE *args) { NODE *arg; arg = pos_int_vector_arg(args); if (NOT_THROWING) { x_margin = getint(cadr(arg)); y_margin = getint(car(arg)); lcleartext(NIL); } return(UNBOUND); } NODE *lstandout(NODE *args) { char textbuf[300]; char fmtbuf[100]; char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; sprintf(fmtbuf,"%c%%p%c",17,17); print_stringptr = textbuf; print_stringlen = 300; ndprintf((FILE *)NULL,fmtbuf,car(args)); *print_stringptr = '\0'; print_stringptr = old_stringptr; print_stringlen = old_stringlen; return make_strnode(textbuf,NULL,(int)strlen(textbuf),STRING,strnzcpy); } extern void wxSetFont(char *fm, int sz); NODE *lfont(NODE *arg) { NODE *val; return make_static_strnode(wx_font_face); } NODE *lsetfont(NODE *arg) { char textbuf[300]; print_stringptr = textbuf; print_stringlen = 300; ndprintf((FILE *)NULL, "%p", car(arg)); *print_stringptr = '\0'; if (NOT_THROWING) { wxSetFont(textbuf, wx_font_size); } return(UNBOUND); } NODE *lsettextsize(NODE *arg) { NODE *val = integer_arg(arg); if (NOT_THROWING) { wxSetFont(wx_font_face, getint(val)); } return(UNBOUND); } NODE *ltextsize(NODE *arg) { return make_intnode(wx_font_size); } extern void wx_adjust_label_height(); NODE *lsetlabelheight(NODE *arg) { NODE *val = integer_arg(arg); label_height = getint(val); wx_adjust_label_height(); return(UNBOUND); } extern void wx_get_label_size(int *w, int *h); NODE *llabelsize(NODE *arg) { int w,h; wx_get_label_size(&w, &h); return cons(make_intnode(w/x_scale), cons(make_intnode(h/y_scale), NIL)); } extern void wxSetTextColor(FIXNUM, FIXNUM); NODE *set_text_color(NODE *args) { NODE *fgcolor, *bgcolor; if (is_list(car(args))) { fgcolor = make_intnode(TEXT_FG_COLOR_OFFSET); lsetpalette(cons(fgcolor,args)); } else { fgcolor = pos_int_arg(args); } if (is_list(cadr(args))) { bgcolor = make_intnode(TEXT_BG_COLOR_OFFSET); lsetpalette(cons(bgcolor,cdr(args))); } else { bgcolor = pos_int_arg(cdr(args)); } if (NOT_THROWING) { wxSetTextColor(getint(fgcolor)+SPECIAL_COLORS, getint(bgcolor)+SPECIAL_COLORS); } return UNBOUND; } void color_init() { wxSetTextColor(7+SPECIAL_COLORS, 0+SPECIAL_COLORS); } ucblogo-6.1/wrksp.c0000664000175000017500000013571413575571772012462 0ustar jjcjjc/* * wrksp.c logo workspace management module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifdef HAVE_WX #define fgets wx_fgets #endif #include #ifdef WIN32 #include #endif #define WANT_EVAL_REGS 1 #include "logo.h" #include "globals.h" #ifdef HAVE_WX int wxEditFile(char *); #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef ibm #include "process.h" #endif #ifdef HAVE_TERMIO_H #ifdef HAVE_WX #include #else #include #endif #else #ifdef HAVE_SGTTY_H #include #endif #endif #ifdef OBJECTS extern NODE* get_var(NODE*, NODE*); extern NODE* get_proc(NODE*, NODE*); extern NODE* set_proc(NODE*, NODE*, NODE*); #endif char *editor, *editorname, *tempdir; int to_pending = 0; NODE *make_procnode(NODE *lst, NODE *wrds, int min, int df, int max) { return(cons_list(0, lst, wrds, make_intnode((FIXNUM)min), make_intnode((FIXNUM)df), make_intnode((FIXNUM)max), END_OF_LIST)); } NODE *get_bodywords(NODE *pproc, NODE *name) { NODE *val = bodywords__procnode(pproc); NODE *head = NIL, *tail = NIL; if (val != NIL) return(val); name = intern(name); head = cons_list(0, (is_macro(name) ? theName(Name_macro) : theName(Name_to)), name, END_OF_LIST); tail = cdr(head); val = formals__procnode(pproc); while (val != NIL) { if (is_list(car(val))) setcdr(tail, cons(cons(make_colon(caar(val)), cdar(val)), NIL)); else if (nodetype(car(val)) == INT) setcdr(tail, cons(car(val),NIL)); else setcdr(tail, cons(make_colon(car(val)),NIL)); tail = cdr(tail); val = cdr(val); } head = cons(head, NIL); tail = head; val = bodylist__procnode(pproc); while (val != NIL) { setcdr(tail, cons(runparse(car(val)), NIL)); tail = cdr(tail); val = cdr(val); } setcdr(tail, cons(cons(theName(Name_end), NIL), NIL)); /* setbodywords__procnode(pproc,head); */ /* confuses copydef */ return(head); } NODE *name_arg(NODE *args) { while (aggregate(car(args)) && NOT_THROWING) setcar(args, err_logo(BAD_DATA, car(args))); return car(args); } NODE *proc_name_arg(NODE *args) { while ((aggregate(car(args)) || numberp(car(args))) && NOT_THROWING) setcar(args, err_logo(BAD_DATA, car(args))); return car(args); } NODE *ltext(NODE *args) { NODE *name, *val = UNBOUND; name = proc_name_arg(args); if (NOT_THROWING) { name=intern(name); check_library(name); val = procnode__caseobj(name); if (val == UNDEFINED) { err_logo(DK_HOW_UNREC,name); return UNBOUND; } else if (is_prim(val)) { err_logo(IS_PRIM,name); return UNBOUND; } else return text__procnode(val); } return UNBOUND; } NODE *lfulltext(NODE *args) { NODE *name, *val = UNBOUND; name = proc_name_arg(args); if (NOT_THROWING) { name=intern(name); check_library(name); val = procnode__caseobj(name); if (val == UNDEFINED) { err_logo(DK_HOW_UNREC,name); return UNBOUND; } else if (is_prim(val)) { err_logo(IS_PRIM,name); return UNBOUND; } else return get_bodywords(val,name); } return UNBOUND; } BOOLEAN all_lists(NODE *val) { if (val == NIL) return TRUE; if (!is_list(car(val))) return FALSE; return all_lists(cdr(val)); } #ifdef OBJECTS BOOLEAN proc_exists(NODE *name) { return get_proc(name, current_object) != UNDEFINED; // if (current_object == logo_object) // return procnode__caseobj(name) != UNDEFINED; // else // return assoc(name, getprocs(current_object)) != NIL; } BOOLEAN prim_exists(NODE *name) { NODE *proc_node = get_proc(name, current_object); return (proc_node == UNDEFINED ? FALSE : is_prim(proc_node)); // if (current_object == logo_object) // return is_prim(procnode__caseobj(name)); // else // binding = assoc(name, getprocs(current_object)); // return (binding==NIL ? FALSE : is_prim(getobject(binding))); } int find_old_default(NODE *name) { NODE *p; if (flag__caseobj(name, MIXED_ARITY)) return -2; p = procValue(name); if (p == UNDEFINED) return -1; return (is_prim(p) ? getprimdflt(p) : getint(dfltargs__procnode(p))); } #endif /* OBJECTS */ NODE *define_helper(NODE *args, BOOLEAN macro_flag) { /* macro_flag is -1 for anonymous function */ NODE *name = NIL, *val = NIL, *arg = NIL; int minimum = 0, deflt = 0, maximum = 0, old_default = -1; int redef = (varTrue(Redefp)); if (macro_flag >= 0) { name = proc_name_arg(args); if (NOT_THROWING) { name = intern(name); val = procnode__caseobj(name); if (!redef && is_prim(val)) { err_logo(IS_PRIM,name); return UNBOUND; } else if (val != UNDEFINED) { old_default = (is_prim(val) ? getprimdflt(val) : getint(dfltargs__procnode(val))); } } if (NOT_THROWING) { val = cadr(args); while ((val == NIL || !is_list(val) || !all_lists(val)) && NOT_THROWING) { setcar(cdr(args), err_logo(BAD_DATA, val)); val = cadr(args); } if (NOT_THROWING) val = deep_copy(val); /* 5.4 fixes bug about defined procedures sharing tree form */ } } else { /* lambda */ val = args; } if (NOT_THROWING) { args = car(val); if (args != NIL) { make_runparse(args); args = parsed__runparse(args); } setcar(val, args); while (args != NIL) { arg = car(args); if (arg != NIL && is_list(arg) && maximum != -1) { make_runparse(arg); arg = parsed__runparse(arg); setcar(args, arg); setcar(arg, intern(car(arg))); /* fixes crash for # as arg */ maximum++; if (arg == NIL || !is_word(car(arg))) { err_logo(BAD_DATA_UNREC, arg); break; } if (cdr(arg) == NIL) maximum = -1; } else if (nodetype(arg) == INT) { if ((unsigned)getint(arg) <= (unsigned) maximum && getint(arg) >= minimum) { deflt = getint(arg); } else { err_logo(BAD_DATA_UNREC, arg); break; } } else if (is_word(arg) && maximum == minimum) { minimum++; maximum++; deflt++; } else { err_logo(BAD_DATA_UNREC, arg); break; } args = cdr(args); if (check_throwing) break; } } if (macro_flag < 0) { return make_procnode(val, NIL, minimum, deflt, maximum); } else if (NOT_THROWING) { setprocnode__caseobj(name, make_procnode(val, NIL, minimum, deflt, maximum)); if (macro_flag) setflag__caseobj(name, PROC_MACRO); else clearflag__caseobj(name, PROC_MACRO); if (deflt != old_default && old_default >= 0) { the_generation = cons(NIL, NIL); } need_save = 1; } return(UNBOUND); } NODE *ldefine(NODE *args) { return define_helper(args, FALSE); } NODE *ldefmacro(NODE *args) { return define_helper(args, TRUE); } NODE *anonymous_function(NODE *text) { return define_helper(text, -1); } char *strncasestr(char *big, char *little, FIXNUM len) { char *p, *q, pc, qc; FIXNUM i; while (*big != '\0') { while ((pc = *big++) != '\0' && tolower(pc) != tolower(*little)) ; if (pc == '\0') return NULL; p = big; q = little+1; i = len; while (--i > 0 && (qc = *q++) != '\0') { if ((pc = *p++) == '\0') return NULL; if (pc == '~') { while ((pc = *p++) != '\0' && pc != '\n') ; if (pc == '\0') return NULL; pc = *p++; } if (tolower(pc) != tolower(qc)) break; } if (i == 0) return big-1; } return NULL; /* not reached, I think */ } NODE *find_to(NODE *line) { char *lp = getstrptr(line); NODE *funn = cnv_node_to_strnode(fun); char *fp = getstrptr(funn); FIXNUM len = getstrlen(funn); char *p, c; p = lp; while (p != NULL) { p = strncasestr(p, fp, len); if (p == NULL) return(line); /* punt */ if ((c = *(p+len)) == ' ' || c == '\t' || c == '\n') { if (p == lp || ((c = *(p-1)) == ' ' || c == '\t' || c == '\n')) return make_strnode(p, getstrhead(line), getstrlen(line)-(p-lp), nodetype(line), strcpy); if (c == '[') return make_strnode(p, getstrhead(line), strchr(p, ']')-p, nodetype(line), strcpy); } p++; } return line; } NODE *to_helper(NODE *args, BOOLEAN macro_flag) { NODE *arg = NIL, *tnode = NIL, *proc_name, *forms = NIL, *lastnode = NIL, *body_words, *lastnode2, *body_list; int minimum = 0, deflt = 0, maximum = 0, old_default = -1; if (ufun != NIL && loadstream == stdin) { err_logo(NOT_INSIDE,NIL); return(UNBOUND); } if (args == NIL) { err_logo(NOT_ENOUGH,NIL); return(UNBOUND); } deepend_proc_name = proc_name = car(args); args = cdr(args); if (nodetype(proc_name) != CASEOBJ) err_logo(BAD_DATA_UNREC, proc_name); #ifdef OBJECTS else if ((proc_exists(proc_name) && loadstream == stdin) || prim_exists(proc_name)) #else /* OBJECTS */ else if ((procnode__caseobj(proc_name) != UNDEFINED && loadstream == stdin) || is_prim(procnode__caseobj(proc_name))) #endif /* OBJECTS */ err_logo(ALREADY_DEFINED, proc_name); else { #ifdef OBJECTS old_default = find_old_default(proc_name); #else /* OBJECTS */ NODE *old_proc = procnode__caseobj(proc_name); if (old_proc != UNDEFINED) { old_default = (is_prim(old_proc) ? getprimdflt(old_proc) : getint(dfltargs__procnode(old_proc))); } #endif /* OBJECTS */ while (args != NIL) { arg = car(args); args = cdr(args); if (nodetype(arg) == CONS && maximum != -1) { make_runparse(arg); arg = parsed__runparse(arg); maximum++; if (arg == NIL || !is_word(car(arg))) { err_logo(BAD_DATA_UNREC, arg); break; } if (nodetype(car(arg)) == COLON) setcar(arg, node__colon(car(arg))); if (nodetype(car(arg)) == QUOTE) setcar(arg, node__quote(car(arg))); if (cdr(arg) == NIL) maximum = -1; } else if (nodetype(arg) == INT) { if ((unsigned)getint(arg) <= (unsigned) maximum && getint(arg) >= minimum) { deflt = getint(arg); } else { err_logo(BAD_DATA_UNREC, arg); break; } } else if (is_word(arg) && maximum == minimum) { if (nodetype(arg) == COLON) arg = node__colon(arg); if (nodetype(arg) == QUOTE) arg = node__quote(arg); minimum++; maximum++; deflt++; } else { err_logo(BAD_DATA_UNREC, arg); break; } tnode = cons(arg, NIL); if (forms == NIL) forms = tnode; else setcdr(lastnode, tnode); lastnode = tnode; } } if (NOT_THROWING) { body_words = cons(find_to(current_line), NIL); lastnode2 = body_words; body_list = cons(forms, NIL); lastnode = body_list; to_pending++; /* for int or quit signal */ while (NOT_THROWING && to_pending && (!feof(loadstream))) { tnode = cons(reader(loadstream, "> "), NIL); if ((feof(loadstream))) { tnode = cons(theName(Name_end), NIL); } setcdr(lastnode2, tnode); lastnode2 = tnode; tnode = cons(parser(car(tnode), TRUE), NIL); if (car(tnode) != NIL && isName(caar(tnode), Name_end)){ break; } else if (car(tnode) != NIL) { setcdr(lastnode, tnode); lastnode = tnode; } } if (to_pending && NOT_THROWING) { #ifdef OBJECT // proc is a hash-table entry NODE* proc_obj; proc_obj = set_proc(proc_name, make_procnode(body_list, body_words, minimum, deflt, maximum), current_object); if (macro_flag) setflag__object(proc_obj, PROC_MACRO); else clearflag__object(proc_obj, PROC_MACRO); if (deflt != old_default && old_default >= 0) { the_generation = cons(NIL, NIL); } if (loadstream == stdin || varTrue(LoadNoisily)) { ndprintf(stdout, message_texts[LOAD_DEF], proc_name); } if (loadstream != stdin && varTrue(UnburyOnEdit)) { clearflag__object(proc_obj, PROC_BURIED); } /*if (current_object != logo_object) { setprocs(current_object, cons(proc_name, getprocs(current_object))); setobject(getprocs(current_object), make_procnode(body_list, body_words, minimum, deflt, maximum)); }else{ setprocnode__caseobj(proc_name, make_procnode(body_list, body_words, minimum, deflt, maximum)); }*/ #else setprocnode__caseobj(proc_name, make_procnode(body_list, body_words, minimum, deflt, maximum)); if (macro_flag) setflag__caseobj(proc_name, PROC_MACRO); else clearflag__caseobj(proc_name, PROC_MACRO); if (deflt != old_default && old_default >= 0) { the_generation = cons(NIL, NIL); } if (loadstream == stdin || varTrue(LoadNoisily)) { ndprintf(stdout, message_texts[LOAD_DEF], proc_name); } if (loadstream != stdin && varTrue(UnburyOnEdit)) { clearflag__caseobj(proc_name, PROC_BURIED); } #endif } to_pending = 0; need_save = 1; } deepend_proc_name = NIL; return(UNBOUND); } NODE *lto(NODE *args) { return to_helper(args, FALSE); } NODE *lmacro(NODE *args) { return to_helper(args, TRUE); } #ifdef OBJECTS /* If binding found in object hierarchy and as local, flag error, same as varValue. If binding found only in object hierarchy, set it. Otherwise (including if no binding found at all) set valnode in symbol table. Need to distinguish var local to --this-- procedure from var inherited from caller. Former is allowed to conflict with object variable. */ NODE *lmake(NODE *args) { NODE *what, *object, *bindings, *binding; what = name_arg(args); if (NOT_THROWING) { what = intern(what); if (varInObjectHierarchy(what, FALSE) != (NODE *)(-1)) { if (flag__caseobj(what, IS_LOCAL_VALUE)) { err_logo(LOCAL_AND_OBJ, what); return UNBOUND; } else { need_save = 1; object = varInThisObject(what, FALSE); // assertion, object should never = NIL at this point binding = get_var(what, object); /* for (bindings = getvars(object); bindings != NIL; bindings = cdr(bindings)) { if (car(bindings) == what) { setobject(bindings, cadr(args)); break; } }*/ } } else { binding = object__caseobj(what); //setvalnode__caseobj(what, cadr(args)); if (!flag__caseobj(what, IS_LOCAL_VALUE)) { setflag__caseobj(what, HAS_GLOBAL_VALUE); need_save = 1; } } // at this piont we should have a hash table entry // in the binding variable setvalnode__object(binding, cadr(args)); if (flag__object(binding, VAL_TRACED)) { NODE *tvar = maybe_quote(cadr(args)); ndprintf(writestream, message_texts[TRACE_MAKE], make_quote(what), tvar); if (ufun != NIL) { ndprintf(writestream,message_texts[ERROR_IN],ufun,this_line); } new_line(writestream); } } return(UNBOUND); } #else /* OBJECTS */ NODE *lmake(NODE *args) { NODE *what; what = name_arg(args); if (NOT_THROWING) { what = intern(what); setvalnode__caseobj(what, cadr(args)); if (!flag__caseobj(what, IS_LOCAL_VALUE)) { setflag__caseobj(what, HAS_GLOBAL_VALUE); need_save = 1; } if (flag__caseobj(what, VAL_TRACED)) { NODE *tvar = maybe_quote(cadr(args)); ndprintf(writestream, message_texts[TRACE_MAKE], make_quote(what), tvar); if (ufun != NIL) { ndprintf(writestream,message_texts[ERROR_IN],ufun,this_line); } new_line(writestream); } } return(UNBOUND); } #endif /* OBJECTS */ NODE *llocal(NODE *args) { NODE *arg = NIL; if (tailcall != 0) return UNBOUND; if (args==NIL) return UNBOUND; while (is_list(car(args)) && cdr(args) != NIL && NOT_THROWING) setcar(args, err_logo(BAD_DATA, car(args))); if (is_list(car(args))) args = car(args); while (args != NIL && NOT_THROWING) { arg = car(args); while (!is_word(arg) && NOT_THROWING) { arg = err_logo(BAD_DATA, arg); setcar(args, arg); /* prevent crash in lapply */ } if (NOT_THROWING) { arg = intern(arg); setcar(args, arg); /* local [a b] faster next time */ if (not_local(arg,var_stack)) { push(arg, var_stack); if (flag__caseobj(arg, IS_LOCAL_VALUE)) settype(var_stack, LOCALSAVE); setobject(var_stack, valnode__caseobj(arg)); setflag__caseobj(arg, IS_LOCAL_VALUE); } setvalnode__caseobj(arg, UNBOUND); tell_shadow(arg); args = cdr(args); } if (check_throwing) break; } return(UNBOUND); } NODE *lglobal(NODE *args) { NODE *arg = NIL; if (args==NIL) return UNBOUND; while (is_list(car(args)) && cdr(args) != NIL && NOT_THROWING) setcar(args, err_logo(BAD_DATA, car(args))); if (is_list(car(args))) args = car(args); while (args != NIL && NOT_THROWING) { arg = car(args); while (!is_word(arg) && NOT_THROWING) { arg = err_logo(BAD_DATA, arg); setcar(args, arg); /* prevent crash in lapply */ } if (NOT_THROWING) { arg = intern(arg); setcar(args, arg); /* local [a b] faster next time */ setflag__caseobj(arg, HAS_GLOBAL_VALUE); args = cdr(args); } if (check_throwing) break; } return(UNBOUND); } NODE *cnt_list = NIL; NODE *cnt_last = NIL; int want_buried = 0; typedef enum {c_PROCS, c_VARS, c_PLISTS, c_PRIMS, c_PROCSnPRIMS} CNTLSTTYP; CNTLSTTYP contents_list_type; #ifdef OBJECTS //OBJECTS4 /* For ancestry lists */ typedef enum {NORMAL, ANCESTRY} LSTFORM; /* For type of list wanted */ typedef enum {ACCESSIBLE, OWNED, INHERITED} LSTTYP; void contents_map(NODE *sym); NODE *mergesrt(NODE *nd); void putname(NODE *name, NODE *obj, LSTFORM format); void special_contents_map(NODE *sym, LSTFORM format); /* Depending on the current contents_list_type, this returns the variables or procedures of the current object. Signals error if plists */ NODE *contentsListType(NODE *obj) { switch (contents_list_type) { case c_VARS: return getvars(obj); case c_PROCS: return getprocs(obj); case c_PLISTS: err_logo(BAD_DATA, make_static_strnode("objects don't have plists!")); return; } } void normal_special_contents_map(NODE *sym) { special_contents_map(sym, NORMAL); } void ancestry_special_contents_map(NODE *sym) { special_contents_map(sym, ANCESTRY); } void fmt_map_oblist(LSTFORM format) { if (format == NORMAL) map_oblist(normal_special_contents_map); else map_oblist(ancestry_special_contents_map); } /** new things **/ /* get_contents with special format and normal format */ NODE *get_special_contents(LSTFORM format, LSTTYP type) { cnt_list = NIL; cnt_last = NIL; if (current_object == logo_object) fmt_map_oblist(format); else { /* for accessible, owned, or inherited, the current object's vars/procs have to be in cnt_list */ NODE *mylist = contentsListType(current_object); /* contains vars or procs of current object */ while (mylist != NIL) { putname(caar(mylist), current_object, format); mylist = cdr(mylist); } /* do not need to add parents' vars/procs for owned, but do for accessible and inherited */ if (type == ACCESSIBLE || type == INHERITED) { /* add your parents */ NODE *parlst = parent_list(current_object); while (parlst != NIL) { if (car(parlst) == logo_object) { fmt_map_oblist(format); } else { mylist = contentsListType(car(parlst)); while (mylist != NIL) { putname(caar(mylist), car(parlst), format); /* put name of var or proc, associated with parent object */ mylist = cdr(mylist); } } parlst = cdr(parlst); } /* if accessible, then remove the shadowed vars/procs */ if (type == ACCESSIBLE) { // TODO: Find removeShadowed //cnt_list = removeShadowed(cnt_list); } } } return(cnt_list); } /* used for getting the normal plist contents */ NODE *get_plistcontents() { cnt_list = NIL; cnt_last = NIL; map_oblist(contents_map); cnt_list = mergesrt(cnt_list); return(cnt_list); } /* puts name or name with object into cnt_list */ void putname(NODE *name, NODE *obj, LSTFORM format) { NODE *newNode; if (format == NORMAL) newNode = name; else newNode = cons(name, cons(obj, NIL)); if (cnt_list == NIL) { cnt_list = cons(newNode, NIL); cnt_last = cnt_list; } else { setcdr(cnt_last, newNode); cnt_last = cdr(cnt_last); } } /* contents_map for special format */ void special_contents_map(NODE *sym, LSTFORM format) { int flag_check = PROC_BURIED; if (want_buried) flag_check = want_buried; switch(contents_list_type) { case c_PROCS: check_library(sym); if (procnode__object(sym) == UNDEFINED || is_prim(procnode__object(sym))) return; if (bck(flag__object(sym,flag_check))) return; break; case c_VARS: flag_check <<= 1; if (valnode__object(sym) == UNBOUND) return; if (bck(flag__object(sym,flag_check))) return; break; case c_PLISTS: err_logo(BAD_DATA, UNBOUND); //contents_list_type } putname(canonical__object(sym), logo_object, format); } /* checks if the car of the item is equal to the car of something in alist */ BOOLEAN carequal(NODE *item, NODE *alist) { while (alist != NIL) { if (car(item) == caar(alist)) return TRUE; alist = cdr(alist); } return FALSE; } #endif int bck(int flag) { return (want_buried ? !flag : flag); } void contents_map(NODE *sym) { int flag_check = PROC_BURIED; if (want_buried) flag_check = want_buried; switch(contents_list_type) { case c_PROCS: check_library(sym); if (procnode__object(sym) == UNDEFINED || is_prim(procnode__object(sym))) return; if (bck(flag__object(sym,flag_check))) return; break; case c_PRIMS: if (procnode__object(sym) == UNDEFINED || !is_prim(procnode__object(sym))) return; break; case c_PROCSnPRIMS: check_library(sym); if (procnode__object(sym) == UNDEFINED) return; if (bck(flag__object(sym,flag_check))) return; break; case c_VARS: flag_check <<= 1; if (valnode__object(sym) == UNBOUND) return; if (bck(flag__object(sym,flag_check))) return; break; case c_PLISTS: flag_check <<= 2; if (plist__object(sym) == NIL) return; if (bck(flag__object(sym,flag_check))) return; break; } if (cnt_list == NIL) { cnt_list = cons(canonical__object(sym), NIL); cnt_last = cnt_list; } else { setcdr(cnt_last, cons(canonical__object(sym), NIL)); cnt_last = cdr(cnt_last); } } void ms_listlist(NODE *nd) { while (nd != NIL) { setcar(nd, cons(car(nd), NIL)); nd = cdr(nd); } } NODE *merge(NODE *a, NODE *b) { NODE *ret, *tail; if (a == NIL) return(b); if (b == NIL) return(a); if (compare_node(car(a),car(b),FALSE) < 0) { ret = a; tail = a; a = cdr(a); } else { ret = b; tail = b; b = cdr(b); } while (a != NIL && b != NIL) { if (compare_node(car(a),car(b),FALSE) < 0) { setcdr(tail, a); a = cdr(a); } else { setcdr(tail, b); b = cdr(b); } tail = cdr(tail); } if (b == NIL) setcdr(tail, a); else setcdr(tail, b); return ret; } void mergepairs(NODE *nd) { while (nd != NIL && cdr(nd) != NIL) { setcar(nd, merge(car(nd), cadr(nd))); setcdr(nd, cddr(nd)); nd = cdr(nd); } } NODE *mergesrt(NODE *nd) { /* spelled funny to avoid library conflict */ if (nd == NIL) return(NIL); if (cdr(nd) == NIL) return(nd); ms_listlist(nd); while (cdr(nd) != NIL) mergepairs(nd); return car(nd); } NODE *get_contents() { cnt_list = NIL; cnt_last = NIL; map_oblist(contents_map); cnt_list = mergesrt(cnt_list); return(cnt_list); } #ifdef OBJECTS //OBJECTS4 /* calls to new special_contents */ NODE *lcontents(NODE *args) { NODE *ret; want_buried = 0; contents_list_type = c_PLISTS; ret = cons(get_plistcontents(), NIL); contents_list_type = c_VARS; push(get_special_contents(ACCESSIBLE, NORMAL), ret); contents_list_type = c_PROCS; push(get_special_contents(ACCESSIBLE, NORMAL), ret); cnt_list = NIL; return(ret); } NODE *lburied(NODE *args) { NODE *ret; want_buried = PROC_BURIED; contents_list_type = c_PLISTS; ret = cons(get_plistcontents(), NIL); contents_list_type = c_VARS; push(get_special_contents(INHERITED, ANCESTRY), ret); contents_list_type = c_PROCS; push(get_special_contents(INHERITED, ANCESTRY), ret); cnt_list = NIL; return(ret); } NODE *ltraced(NODE *args) { NODE *ret; want_buried = PROC_TRACED; contents_list_type = c_PLISTS; ret = cons(get_plistcontents(), NIL); contents_list_type = c_VARS; push(get_special_contents(INHERITED, ANCESTRY), ret); /* not sure: INHERITED? */ contents_list_type = c_PROCS; push(get_special_contents(INHERITED, ANCESTRY), ret); /* not sure: INHERITED? */ cnt_list = NIL; return(ret); } NODE *lstepped(NODE *args) { NODE *ret; want_buried = PROC_STEPPED; contents_list_type = c_PLISTS; ret = cons(get_plistcontents(), NIL); contents_list_type = c_VARS; push(get_special_contents(INHERITED, ANCESTRY), ret); /* not sure: INHERITED? */ contents_list_type = c_PROCS; push(get_special_contents(INHERITED, ANCESTRY), ret); /* not sure: INHERITED? */ cnt_list = NIL; return(ret); } NODE *lprocedures(NODE *args) { NODE *ret; want_buried = 0; contents_list_type = c_PROCS; ret = get_special_contents(ACCESSIBLE, NORMAL); cnt_list = NIL; return(ret); } NODE *lnames(NODE *args) { NODE *ret; want_buried = 0; contents_list_type = c_VARS; ret = cons(NIL, cons(get_special_contents(ACCESSIBLE, NORMAL), NIL)); cnt_list = NIL; return(ret); } NODE *lplists(NODE *args) { NODE *ret; want_buried = 0; contents_list_type = c_PLISTS; ret = cons(NIL, cons(NIL, cons(get_plistcontents(), NIL))); cnt_list = NIL; return(ret); } #else /* OBJECTS */ NODE *lcontents(NODE *args) { NODE *ret; want_buried = 0; contents_list_type = c_PLISTS; ret = cons(get_contents(), NIL); contents_list_type = c_VARS; push(get_contents(), ret); contents_list_type = c_PROCS; push(get_contents(), ret); cnt_list = NIL; return(ret); } NODE *lburied(NODE *args) { NODE *ret; want_buried = PROC_BURIED; contents_list_type = c_PLISTS; ret = cons(get_contents(), NIL); contents_list_type = c_VARS; push(get_contents(), ret); contents_list_type = c_PROCS; push(get_contents(), ret); cnt_list = NIL; return(ret); } NODE *ltraced(NODE *args) { NODE *ret; want_buried = PROC_TRACED; contents_list_type = c_PLISTS; ret = cons(get_contents(), NIL); contents_list_type = c_VARS; push(get_contents(), ret); contents_list_type = c_PROCSnPRIMS; push(get_contents(), ret); cnt_list = NIL; return(ret); } NODE *lstepped(NODE *args) { NODE *ret; want_buried = PROC_STEPPED; contents_list_type = c_PLISTS; ret = cons(get_contents(), NIL); contents_list_type = c_VARS; push(get_contents(), ret); contents_list_type = c_PROCS; push(get_contents(), ret); cnt_list = NIL; return(ret); } NODE *lprocedures(NODE *args) { NODE *ret; want_buried = 0; contents_list_type = c_PROCS; ret = get_contents(); cnt_list = NIL; return(ret); } NODE *lnames(NODE *args) { NODE *ret; want_buried = 0; contents_list_type = c_VARS; ret = cons(NIL, cons(get_contents(), NIL)); cnt_list = NIL; return(ret); } NODE *lplists(NODE *args) { NODE *ret; want_buried = 0; contents_list_type = c_PLISTS; ret = cons(NIL, cons(NIL, cons(get_contents(), NIL))); cnt_list = NIL; return(ret); } #endif /* OBJECTS */ NODE *lprimitives(NODE *args) { NODE *ret; want_buried = 0; contents_list_type = c_PRIMS; ret = get_contents(); cnt_list = NIL; return(ret); } NODE *one_list(NODE *nd) { if (!is_list(nd)) return(cons(nd,NIL)); return nd; } void three_lists(NODE *arg, NODE **proclst, NODE **varlst, NODE **plistlst) { if (nodetype(car(arg)) == CONS) arg = car(arg); if (!is_list(car(arg))) *proclst = arg; else { *proclst = car(arg); if (cdr(arg) != NIL) { *varlst = one_list(cadr(arg)); if (cddr(arg) != NIL) { *plistlst = one_list(car(cddr(arg))); } } } if (!is_list(*proclst) || !is_list(*varlst) || !is_list(*plistlst)) { err_logo(BAD_DATA_UNREC,arg); *plistlst = *varlst = *proclst = NIL; } } char *expand_slash(NODE *wd) { char *result, *cp, *cp2; int i, len = getstrlen(wd), j; for (cp = getstrptr(wd), i=0, j = len; --j >= 0; ) if (getparity(*cp++)) i++; result = malloc(len+i+1); if (result == NULL) { err_logo(OUT_OF_MEM, NIL); return 0; } for (cp = getstrptr(wd), cp2 = result, j = len; --j >= 0; ) { if (getparity(*cp)) *cp2++ = '\\'; *cp2++ = clearparity(*cp++); } *cp2 = '\0'; return result; } NODE *po_helper(NODE *arg, int just_titles) { /* just_titles is -1 for EDIT, 0 for PO, 1 for HELP, 3 for POT */ NODE *proclst = NIL, *varlst = NIL, *plistlst = NIL, *tvar = NIL; NODE *plist, *oldfullp; oldfullp = valnode__caseobj(Fullprintp); setvalnode__caseobj(Fullprintp, theName(Name_true)); three_lists(arg, &proclst, &varlst, &plistlst); while (proclst != NIL) { if (aggregate(car(proclst))) { err_logo(BAD_DATA_UNREC, car(proclst)); break; } else { check_library(intern(car(proclst))); tvar = procnode__caseobj(intern(car(proclst))); } if (tvar == UNDEFINED) { if (just_titles < 0) { ndprintf(writestream,message_texts[EMPTY_PROC],car(proclst)); } else { err_logo(DK_HOW_UNREC, car(proclst)); break; } } else if (nodetype(tvar) & NT_PRIM) { err_logo(IS_PRIM, car(proclst)); break; } else { tvar = get_bodywords(tvar,car(proclst)); if (just_titles > 2) { if (is_list(car(tvar))) print_nobrak(writestream, car(tvar)); else { char *str = expand_slash(car(tvar)); ndprintf(writestream, "%t", str); free(str); } } else while (tvar != NIL) { if (is_list(car(tvar))) { if (just_titles == 2) break; print_nobrak(writestream, car(tvar)); } else { char *str = expand_slash(car(tvar)); if (just_titles == 2 && *str != ';') break; ndprintf(writestream, "%t", str); free(str); } new_line(writestream); tvar = cdr(tvar); if (just_titles == 1) just_titles++; } new_line(writestream); } proclst = cdr(proclst); if (check_throwing) break; } while (varlst != NIL && NOT_THROWING) { if (aggregate(car(varlst))) { err_logo(BAD_DATA_UNREC, car(varlst)); break; } else tvar = maybe_quote(valnode__caseobj(intern(car(varlst)))); if (tvar == UNBOUND) { if (just_titles >= 0) { err_logo(NO_VALUE, car(varlst)); break; } } else { ndprintf(writestream, message_texts[TRACE_MAKE], make_quote(car(varlst)), tvar); new_line(writestream); } varlst = cdr(varlst); if (check_throwing) break; } while (plistlst != NIL && NOT_THROWING) { if (aggregate(car(plistlst))) { err_logo(BAD_DATA_UNREC, car(plistlst)); break; } else { plist = plist__caseobj(intern(car(plistlst))); if (plist != NIL && just_titles > 0) { ndprintf(writestream, message_texts[POT_PLIST], maybe_quote(car(plistlst)), plist); } else while (plist != NIL) { ndprintf(writestream, "%t %s %s %s\n", message_texts[TRACE_PPROP], maybe_quote(car(plistlst)), maybe_quote(car(plist)), maybe_quote(cadr(plist))); plist = cddr(plist); } } plistlst = cdr(plistlst); if (check_throwing) break; } setvalnode__caseobj(Fullprintp, oldfullp); return(UNBOUND); } NODE *lpo(NODE *arg) { return(po_helper(arg,0)); } NODE *lpot(NODE *arg) { return(po_helper(arg,3)); } NODE *lerase(NODE *arg) { NODE *proclst = NIL, *varlst = NIL, *plistlst = NIL; NODE *nd, *what; int redef = (varTrue(Redefp)); three_lists(arg, &proclst, &varlst, &plistlst); if (proclst != NIL) the_generation = cons(NIL, NIL); while (proclst != NIL) { if (aggregate(car(proclst))) { err_logo(BAD_DATA_UNREC, car(proclst)); break; } nd = intern(car(proclst)); if (!redef && is_prim(procnode__caseobj(nd))) { err_logo(IS_PRIM, nd); break; } setprocnode__caseobj(nd, UNDEFINED); proclst = cdr(proclst); } while (varlst != NIL && NOT_THROWING) { if (aggregate(car(varlst))) { err_logo(BAD_DATA_UNREC, car(varlst)); break; } what = intern(car(varlst)); setvalnode__caseobj(what, UNBOUND); if (!flag__caseobj(what, IS_LOCAL_VALUE)) clearflag__caseobj(what, HAS_GLOBAL_VALUE); varlst = cdr(varlst); } while (plistlst != NIL && NOT_THROWING) { if (aggregate(car(plistlst))) { err_logo(BAD_DATA_UNREC, car(plistlst)); break; } setplist__caseobj(intern(car(plistlst)), NIL); plistlst = cdr(plistlst); } return(UNBOUND); } NODE *erall_helper(BOOLEAN procs, BOOLEAN vals, BOOLEAN plists) { NODE *nd, *obj; int loop; int redef = (varTrue(Redefp)); for (loop = 0; loop < HASH_LEN ; loop++) { for (nd = hash_table[loop]; nd != NIL; nd = cdr(nd)) { obj = car(nd); if (procs && !flag__object(obj, PROC_BURIED) && (procnode__object(obj) != UNDEFINED) && (redef || !is_prim(procnode__object(obj)))) setprocnode__object(obj, UNDEFINED); if (vals && !flag__object(obj, VAL_BURIED)) setvalnode__object(obj, UNBOUND); if (plists && !flag__object(obj, PLIST_BURIED)) setplist__object(obj, NIL); } } return UNBOUND; } NODE *lerall(NODE *args) { return erall_helper(TRUE, TRUE, TRUE); } NODE *lerps(NODE *args) { return erall_helper(TRUE, FALSE, FALSE); } NODE *lerns(NODE *args) { return erall_helper(FALSE, TRUE, FALSE); } NODE *lerpls(NODE *args) { return erall_helper(FALSE, FALSE, TRUE); } NODE *bury_helper(NODE *arg, BOOLEAN flag, BOOLEAN setp) { NODE *proclst = NIL, *varlst = NIL, *plistlst = NIL; three_lists(arg, &proclst, &varlst, &plistlst); while (proclst != NIL) { if (aggregate(car(proclst))) { err_logo(BAD_DATA_UNREC, car(proclst)); break; } if (setp) setflag__caseobj(intern(car(proclst)), flag); else return torf(flag__caseobj(intern(car(proclst)), flag)); proclst = cdr(proclst); if (check_throwing) break; } flag <<= 1; while (varlst != NIL && NOT_THROWING) { if (aggregate(car(varlst))) { err_logo(BAD_DATA_UNREC, car(varlst)); break; } if (setp) setflag__caseobj(intern(car(varlst)), flag); else return torf(flag__caseobj(intern(car(varlst)), flag)); varlst = cdr(varlst); if (check_throwing) break; } flag <<= 1; while (plistlst != NIL && NOT_THROWING) { if (aggregate(car(plistlst))) { err_logo(BAD_DATA_UNREC, car(plistlst)); break; } if (setp) setflag__caseobj(intern(car(plistlst)), flag); else return torf(flag__caseobj(intern(car(plistlst)), flag)); plistlst = cdr(plistlst); if (check_throwing) break; } if (!setp) err_logo(BAD_DATA_UNREC, NIL); return(UNBOUND); } NODE *lbury(NODE *arg) { return bury_helper(arg,PROC_BURIED,TRUE); } NODE *ltrace(NODE *arg) { return bury_helper(arg,PROC_TRACED,TRUE); } NODE *lstep(NODE *arg) { return bury_helper(arg,PROC_STEPPED,TRUE); } NODE *lburiedp(NODE *arg) { return bury_helper(arg,PROC_BURIED,FALSE); } NODE *ltracedp(NODE *arg) { return bury_helper(arg,PROC_TRACED,FALSE); } NODE *lsteppedp(NODE *arg) { return bury_helper(arg,PROC_STEPPED,FALSE); } NODE *unbury_helper(NODE *arg, int flag) { NODE *proclst = NIL, *varlst = NIL, *plistlst = NIL; three_lists(arg, &proclst, &varlst, &plistlst); while (proclst != NIL) { if (aggregate(car(proclst))) { err_logo(BAD_DATA_UNREC, car(proclst)); break; } clearflag__caseobj(intern(car(proclst)), flag); proclst = cdr(proclst); if (check_throwing) break; } flag <<= 1; while (varlst != NIL && NOT_THROWING) { if (aggregate(car(varlst))) { err_logo(BAD_DATA_UNREC, car(varlst)); break; } clearflag__caseobj(intern(car(varlst)), flag); varlst = cdr(varlst); if (check_throwing) break; } flag <<= 1; while (plistlst != NIL && NOT_THROWING) { if (aggregate(car(plistlst))) { err_logo(BAD_DATA_UNREC, car(plistlst)); break; } clearflag__caseobj(intern(car(plistlst)), flag); plistlst = cdr(plistlst); if (check_throwing) break; } return(UNBOUND); } NODE *lunbury(NODE *arg) { return unbury_helper(arg,PROC_BURIED); } NODE *luntrace(NODE *arg) { return unbury_helper(arg,PROC_TRACED); } NODE *lunstep(NODE *arg) { return unbury_helper(arg,PROC_STEPPED); } char *addsep(char *path) { static char result[256]; strcpy(result, path); if (result[0]) strcat(result, separator); return result; } char tmp_filename[500] = ""; int isEditFile = 0; int setTermInfo(int type, int val); NODE *leditfile(NODE *args) { NODE *arg = cnv_node_to_strnode(car(args)); #ifdef HAVE_WX setTermInfo(EDIT_STATE, NO_INFO); isEditFile=1; #endif if (NOT_THROWING) { noparity_strnzcpy(tmp_filename, getstrptr(arg), getstrlen(arg)); return ledit(NIL); } else return UNBOUND; } NODE *ledit(NODE *args) { FILE *holdstrm; #ifdef HAVE_WX int doSave; int getTermInfo(int); #endif #ifdef unix #ifndef HAVE_UNISTD_H extern int getpid(); #endif #endif #ifdef __RZTC__ BOOLEAN was_graphics; #endif NODE *tmp_line = NIL, *exec_list = NIL; if (tmp_filename[0] == '\0' || args != NIL) { #ifndef unix sprintf(tmp_filename, "%stemp.txt", addsep(tempdir)); #else sprintf(tmp_filename, "%s/logo%d", tempdir, (int)getpid()); #endif } #ifdef HAVE_WX if(!isEditFile){ setTermInfo(EDIT_STATE,DO_LOAD); } isEditFile=0; #endif if (args != NIL) { holdstrm = writestream; writestream = fopen(tmp_filename, "w"); if (writestream != NULL) { po_helper(args,-1); fclose(writestream); writestream = holdstrm; } else { err_logo(FILE_ERROR, make_static_strnode("Could not create editor file")); writestream = holdstrm; return(UNBOUND); } } if (stopping_flag == THROWING) return(UNBOUND); #ifdef mac if (!mac_edit()) return(UNBOUND); #else /* !mac */ #ifdef HAVE_WX doSave = wxEditFile(tmp_filename); if(!doSave || getTermInfo(EDIT_STATE) != DO_LOAD) return(UNBOUND); #else #ifdef ibm #ifdef __RZTC__ was_graphics = in_graphics_mode; if (in_graphics_mode) t_screen(); zflush(); #endif /* ztc */ if (spawnlp(P_WAIT, editor, editorname, tmp_filename, NULL)) { err_logo(FILE_ERROR, make_static_strnode ("Could not launch the editor")); return(UNBOUND); } #ifdef __RZTC__ if (was_graphics) s_screen(); else lcleartext(NIL); #endif /* ztc */ #ifdef WIN32 win32_repaint_screen(); #endif #else /* !ibm (so unix) */ if (fork() == 0) { execlp(editor, editorname, tmp_filename, 0); exit(1); } wait(0); #endif /* ibm */ #endif /* wx */ #endif /* mac */ holdstrm = loadstream; tmp_line = current_line; loadstream = fopen(tmp_filename, "r"); if (loadstream != NULL) { while (!feof(loadstream) && NOT_THROWING) { current_line = reader(loadstream, ""); exec_list = parser(current_line, TRUE); if (exec_list != NIL) eval_driver(exec_list); } fclose(loadstream); } else err_logo(FILE_ERROR, make_static_strnode("Could not read editor file")); loadstream = holdstrm; current_line = tmp_line; return(UNBOUND); } NODE *lthing(NODE *args) { NODE *val = UNBOUND, *arg; arg = name_arg(args); #ifdef OBJECTS if (NOT_THROWING) val = varValue(arg); #else if (NOT_THROWING) val = valnode__caseobj(intern(arg)); #endif while (val == UNBOUND && NOT_THROWING) val = err_logo(NO_VALUE, car(args)); return(val); } NODE *lnamep(NODE *args) { NODE *arg; arg = name_arg(args); if (NOT_THROWING) #ifdef OBJECTS return torf(varValue(arg) != UNBOUND); #else return torf(valnode__caseobj(intern(arg)) != UNBOUND); #endif return UNBOUND; } NODE *lprocedurep(NODE *args) { NODE *arg; arg = name_arg(args); if (NOT_THROWING) { arg = intern(arg); check_library(arg); return torf(procnode__caseobj(arg) != UNDEFINED); } return UNBOUND; } NODE *lplistp(NODE *args) { NODE *arg; arg = name_arg(args); if (NOT_THROWING) return torf(plist__caseobj(intern(arg)) != NIL); return UNBOUND; } NODE *check_proctype(NODE *args, int wanted) { NODE *arg, *cell = NIL; int isprim; arg = proc_name_arg(args); if (NOT_THROWING) check_library(intern(arg)); if (NOT_THROWING && (cell = procnode__caseobj(intern(arg))) == UNDEFINED) { return(FalseName()); } if (wanted == 2) return torf(is_macro(intern(arg))); isprim = is_prim(cell); if (NOT_THROWING) return torf((isprim != 0) == wanted); return(UNBOUND); } NODE *lprimitivep(NODE *args) { return(check_proctype(args,1)); } NODE *ldefinedp(NODE *args) { return(check_proctype(args,0)); } NODE *lmacrop(NODE *args) { return(check_proctype(args,2)); } NODE *larity(NODE *args) { NODE *arg = proc_name_arg(args); FIXNUM min; if (NOT_THROWING) { arg = intern(arg); check_library(arg); arg = procnode__caseobj(arg); if is_prim(arg) { min = getprimmin(arg); if (min == OK_NO_ARG) min = 0; return cons_list(0, make_intnode(min), make_intnode(getprimdflt(arg)), make_intnode(getprimmax(arg)), END_OF_LIST); } else if (arg == UNDEFINED) { err_logo(DK_HOW_UNREC, car(args)); return UNBOUND; } else { return cons_list(0, minargs__procnode(arg), dfltargs__procnode(arg), maxargs__procnode(arg), END_OF_LIST); } } return UNBOUND; } NODE *cpdf_newname(NODE *name, NODE*titleline) { NODE *nname=cnv_node_to_strnode(name); char *namestr=getstrptr(nname); char *titlestr=getstrptr(titleline); char buf[2000]; char *p1, *p2; p1 = titlestr+strcspn(titlestr, " \t"); p1 = p1+strspn(p1, " \t"); p2 = p1+strcspn(p1, " \t"); sprintf(buf, "%.*s%.*s%s", p1-titlestr, titlestr, getstrlen(nname), namestr, p2); return make_strnode(buf, NULL, strlen(buf), STRING, strcpy); } NODE *lcopydef(NODE *args) { NODE *arg1, *arg2; int redef = (varTrue(Redefp)); int old_default = -1, new_default; arg1 = proc_name_arg(args); arg2 = proc_name_arg(cdr(args)); if (NOT_THROWING) { arg1 = intern(arg1); arg2 = intern(arg2); check_library(arg2); } if (NOT_THROWING && procnode__caseobj(arg2) == UNDEFINED) err_logo(DK_HOW, arg2); if (NOT_THROWING && !redef && is_prim(procnode__caseobj(arg1))) err_logo(IS_PRIM, arg1); if (NOT_THROWING) { NODE *old_proc = procnode__caseobj(arg1); NODE *new_proc = procnode__caseobj(arg2); if (old_proc != UNDEFINED) { old_default = (is_prim(old_proc) ? getprimdflt(old_proc) : getint(dfltargs__procnode(old_proc))); } new_default = (is_prim(new_proc) ? getprimdflt(new_proc) : getint(dfltargs__procnode(new_proc))); if (old_default != new_default && old_default >= 0) { the_generation = cons(NIL, NIL); } if (is_prim(new_proc)) setprocnode__caseobj(arg1, new_proc); else { NODE *bwds=get_bodywords(new_proc,arg1); /* 5.5 */ setprocnode__caseobj(arg1, make_procnode(text__procnode(new_proc), cons(cpdf_newname(arg1,car(bwds)), cdr(bwds)), getint(minargs__procnode(new_proc)), getint(dfltargs__procnode(new_proc)), getint(maxargs__procnode(new_proc)))); } /* setflag__caseobj(arg1, PROC_BURIED); */ if (is_macro(arg2)) setflag__caseobj(arg1, PROC_MACRO); else clearflag__caseobj(arg1, PROC_MACRO); if (flag__caseobj(arg2, PROC_SPECFORM)) setflag__caseobj(arg1, PROC_SPECFORM); else clearflag__caseobj(arg1, PROC_SPECFORM); } return(UNBOUND); } char *fixhelp(char *ptr, int len) { static char result[32]; char *p, c; for (p = result; --len >= 0; *p++ = c) { c = *ptr++; if (c == '?') c = 'p'; else if (c == '.') c = 'd'; } *p = '\0'; return result; } char inops[] = "+-*/=<>"; NODE *lhelp(NODE *args) { NODE *arg = NIL, *pproc; char buffer[1024]; #ifndef WIN32 char junk[20]; #endif FILE *fp; int lines; #ifdef __RZTC__ size_t len; #endif if (args == NIL) { /* #ifdef WIN32 sprintf(buffer, "%sHELPCONT", addsep(helpfiles)); #else */ sprintf(buffer, "%sHELPCONTENTS", addsep(helpfiles)); /* #endif */ } else if (is_word(car(args)) && car(args) != Null_Word) { arg = llowercase(args); /* setcar(args, arg); */ if (getstrlen(arg) == 1) { char *cp = strchr(inops,*(getstrptr(arg))); if (cp != NULL) { arg=cnv_node_to_strnode(theName(Name_sum+(cp-inops))); } } if (getstrlen(arg) == 2) { if (!strncmp(getstrptr(arg), "<=", 2)) arg=cnv_node_to_strnode(theName(Name_lessequalp)); if (!strncmp(getstrptr(arg), ">=", 2)) arg=cnv_node_to_strnode(theName(Name_greaterequalp)); if (!strncmp(getstrptr(arg), "<>", 2)) arg=cnv_node_to_strnode(theName(Name_notequalp)); } //sprintf(result, "%s", fixhelp(getstrptr(arg), getstrlen(arg))); //sprintf(buffer, "%s%s", addsep(helpfiles), result); sprintf(buffer, "%s%s", addsep(helpfiles), fixhelp(getstrptr(arg), getstrlen(arg))); //printf("Buffer: %s\n", buffer); #ifdef __RZTC__ /* defined(ibm) || defined(WIN32) */ if (strlen(buffer) > (len = strlen(addsep(helpfiles))+8)) { buffer[len+5] = '\0'; buffer[len+4] = buffer[len+3]; buffer[len+3] = buffer[len+2]; buffer[len+2] = buffer[len+1]; buffer[len+1] = buffer[len]; buffer[len] = '.'; } #endif } else { err_logo(BAD_DATA_UNREC, car(args)); return UNBOUND; } fp = fopen(buffer, "r"); if (fp == NULL) { if (args == NIL) ndprintf(writestream, message_texts[NO_HELP]); else { check_library(intern(car(args))); pproc = procnode__caseobj(intern(car(args))); if (is_list(pproc)) { po_helper(args, 1); } else ndprintf(writestream, message_texts[NO_HELPON], arg); } } else { (void)ltextscreen(NIL); lines = 0; fgets(buffer, 200, fp); while (NOT_THROWING && !feof(fp)) { #ifdef HAVE_WX int getTermInfo(int val); if (interactive && writestream==stdout && ++lines >= getTermInfo(Y_MAX)) { #else if (interactive && writestream==stdout && ++lines >= y_max) { #endif ndprintf(writestream, message_texts[MORE_HELP]); input_blocking++; #ifndef TIOCSTI if (!setjmp(iblk_buf)) #endif #ifdef __RZTC__ ztc_getcr(); print_char(stdout, '\n'); #else #ifdef WIN32 (void)reader(stdin, ""); #else fgets(junk, 19, stdin); #endif #endif input_blocking = 0; update_coords('\n'); lines = 1; } ndprintf(writestream, "%t", buffer); fgets(buffer, 200, fp); } fclose(fp); } return UNBOUND; } ucblogo-6.1/main.c0000664000175000017500000001645613601420003012203 0ustar jjcjjc/* * main.c logo main procedure module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifdef WIN32 #include #include /* needed? */ #endif #include "logo.h" #include "globals.h" #ifdef HAVE_TERMIO_H #ifdef HAVE_WX #include #else #include #endif #else #ifdef HAVE_SGTTY_H #include #endif #endif #ifdef __RZTC__ #include #define SIGQUIT SIGTERM #include #endif #ifndef TIOCSTI #include jmp_buf iblk_buf; #endif #ifdef HAVE_UNISTD_H #include #endif #ifdef mac #include #endif NODE *current_line = NIL; NODE **bottom_stack; /*GC*/ NODE *command_line = NIL; /* 6.0 command line args after files */ int stop_quietly_flag=0; void unblock_input(void) { if (input_blocking) { input_blocking = 0; #ifdef mac csetmode(C_ECHO, stdin); fflush(stdin); #endif #ifdef TIOCSTI ioctl(0,TIOCSTI,"\n"); #else longjmp(iblk_buf,1); #endif } } extern int in_eval_save; #ifdef SIG_TAKES_ARG #define sig_arg 0 RETSIGTYPE logo_stop(int sig) #else #define sig_arg RETSIGTYPE logo_stop() #endif { if (inside_gc || in_eval_save) { int_during_gc = 1; } else { charmode_off(); to_pending = 0; if (!stop_quietly_flag) err_logo(STOP_ERROR,NIL); stop_quietly_flag = 0; #ifdef __RZTC__ if (!input_blocking) #endif signal(SIGINT, logo_stop); unblock_input(); } SIGRET } #ifdef SIG_TAKES_ARG #define sig_arg 0 RETSIGTYPE logo_pause(int sig) #else #define sig_arg RETSIGTYPE logo_pause() #endif { if (inside_gc || in_eval_save) { int_during_gc = 2; } else { charmode_off(); to_pending = 0; #ifdef bsd sigsetmask(0); #else #if !defined(mac) && !defined(_MSC_VER) signal(SIGQUIT, logo_pause); #endif #endif lpause(NIL); } SIGRET } #ifdef SIG_TAKES_ARG #define sig_arg 0 RETSIGTYPE mouse_down(int sig) #else #define sig_arg RETSIGTYPE mouse_down() #endif { NODE *line; if (inside_gc || in_eval_save) { if (int_during_gc == 0) int_during_gc = 3; } else { line = valnode__caseobj(Buttonact); if (line != UNBOUND && line != NIL) { if (inside_evaluator) { eval_buttonact = line; } else { eval_driver(line); fix_turtle_shownness(); } } } SIGRET } int keyact_set() { NODE *line; line = valnode__caseobj(Keyact); return (line != UNBOUND && line != NIL); } void do_keyact(int); #ifdef SIG_TAKES_ARG #define sig_arg 0 RETSIGTYPE delayed_keyact(int sig) #else #define sig_arg RETSIGTYPE delayed_keyact() #endif { do_keyact(readchar_lookahead_buf); SIGRET } void do_keyact(int ch) { NODE *line; readchar_lookahead_buf = ch; if (inside_gc || in_eval_save) { if (int_during_gc == 0) int_during_gc = 4; } else { line = valnode__caseobj(Keyact); if (line != UNBOUND && line != NIL) { if (inside_evaluator) { eval_buttonact = line; } else { eval_driver(line); fix_turtle_shownness(); } } } } RETSIGTYPE (*intfuns[])() = {0, logo_stop, logo_pause, mouse_down, delayed_keyact}; void delayed_int() { #ifdef SIG_TAKES_ARG (void)(*intfuns[int_during_gc])(0); #else (void)(*intfuns[int_during_gc])(); #endif } #if defined(__RZTC__) && !defined(WIN32) /* sowings */ void _far _cdecl do_ctrl_c(void) { ctrl_c_count++; } #endif #ifdef HAVE_WX int wx_leave_mainloop = 0; int start (int argc,char ** argv) { #else int main(int argc, char *argv[]) { #endif NODE *exec_list = NIL; NODE *cl_tail = NIL; int argc2; char **argv2; #ifdef SYMANTEC_C extern void (*openproc)(void); extern void __open_std(void); openproc = &__open_std; #endif #ifdef mac init_mac_memory(); #endif bottom_stack = &exec_list; /*GC*/ #ifndef HAVE_WX #ifdef x_window x_window_init(argc, argv); #endif #endif (void)addseg(); term_init(); init(); math_init(); #ifdef ibm signal(SIGINT, SIG_IGN); #if defined(__RZTC__) && !defined(WIN32) /* sowings */ _controlc_handler = do_ctrl_c; controlc_open(); #endif #else /* !ibm */ signal(SIGINT, logo_stop); #endif /* ibm */ #ifdef mac signal(SIGQUIT, SIG_IGN); #else /* !mac */ //signal(SIGQUIT, logo_pause); #endif /* SIGQUITs never happen on the IBM */ if (argc < 2) { #ifndef WIN32 if (1 || isatty(1)) // fix this. for interactive from menu bar. #endif { #ifdef HAVE_WX extern char *GIT; #endif char version[64]; lcleartext(NIL); #ifdef HAVE_WX strcpy(version,"6.1"); strcat(version,GIT); #else strcpy(version,"5.6"); #endif ndprintf(stdout, message_texts[WELCOME_TO], version); new_line(stdout); } } #ifdef HAVE_WX setvalnode__caseobj(LogoVersion, make_floatnode(6.1)); #else setvalnode__caseobj(LogoVersion, make_floatnode(5.6)); #endif setflag__caseobj(LogoVersion, VAL_BURIED); argv2 = argv; argc2 = argc; if (!strcmp(*argv+strlen(*argv)-4, "logo")) { argv++; while (--argc > 0 && strcmp(*argv, "-") && NOT_THROWING) { argv++; } } argv++; while (--argc > 0) { if (command_line == NIL) cl_tail = command_line = cons(make_static_strnode(*argv++), NIL); else { setcdr(cl_tail, cons(make_static_strnode(*argv++), NIL)); cl_tail = cdr(cl_tail); } } setvalnode__caseobj(CommandLine, command_line); silent_load(Startuplg, logolib); #ifndef WIN32 silent_load(Startuplg, getenv("HOME")); /* load startup.lg */ #else silent_load(Startuplg, NULL); /* load startup.lg */ #endif if (!strcmp(*argv2+strlen(*argv2)-4, "logo")) { argv2++; while (--argc2 > 0 && strcmp(*argv2, "-") && NOT_THROWING) { silent_load(NIL,*argv2++); } } for (;;) { if (NOT_THROWING) { check_reserve_tank(); current_line = reader(stdin,"? "); #ifdef __RZTC__ (void)feof(stdin); if (!in_graphics_mode) printf(" \b"); fflush(stdout); #endif #ifndef WIN32 if (feof(stdin) && !isatty(0)) lbye(NIL); #endif #ifdef __RZTC__ if (feof(stdin)) clearerr(stdin); #endif if (NOT_THROWING) { exec_list = parser(current_line, TRUE); if (exec_list != NIL) eval_driver(exec_list); } } #ifdef HAVE_WX if (wx_leave_mainloop) { break; } #endif if (stopping_flag == THROWING) { if (isName(throw_node, Name_error)) { err_print(NULL); } else if (isName(throw_node, Name_system)) break; else if (!isName(throw_node, Name_toplevel)) { err_logo(NO_CATCH_TAG, throw_node); err_print(NULL); } stopping_flag = RUN; } if (stopping_flag == STOP || stopping_flag == OUTPUT) { /* ndprintf(stdout, "%t\n", message_texts[CANT_STOP]); */ stopping_flag = RUN; } } //prepare_to_exit(TRUE); exit(0); return 0; } ucblogo-6.1/mem.c0000664000175000017500000004704313575571772012067 0ustar jjcjjc/* * mem.c logo memory management module dvb 6/28/88 * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #define WANT_EVAL_REGS 1 #include "logo.h" #include "globals.h" extern NODE *stack, *numstack, *expresn, *val, *parm, *catch_tag, *arg; /* #ifdef ibm */ /* #ifndef __RZTC__ */ /* #include */ /* #endif */ /* #endif */ #ifdef PUNY #define GCMAX 1000 #else #ifdef THINK_C #define GCMAX 8000 #else #ifdef __RZTC__ #define GCMAX 3000 #else #define GCMAX 16000 #endif #endif #endif #ifdef THINK_C extern NODE *gcstack[]; #else NODE *gcstack[GCMAX]; #endif NODE **mark_gcstack = gcstack; NODE **gctop = gcstack; NODE **gcbottom = gcstack; long int mem_nodes = 0, mem_max = 0; /* for Logo NODES primitive */ /* GC heuristic parameters. These parameters can be modified to fine tune the performance of the GC program. The values below are a good set of default parameters that should work well for most data */ /* Number of times to collect at the current GC state before going to the next state. Basically the number of times a given generation is collected before its members are moved to an older generation */ #define gc_age_threshold 4 FIXNUM seg_size = SEG_SIZE; /* A new segment of nodes is added if fewer than freed_threshold nodes are freed in one GC run */ #define freed_threshold ((long int)(seg_size * 0.4)) NODE *free_list = NIL; /* global ptr to free node list */ struct segment *segment_list = NULL; /* global ptr to segment list */ long int mem_allocated = 0, mem_freed = 0; /* The number of generations */ #define NUM_GENS 4 /* ptr to list of Nodes in the same generation */ NODE *generation[NUM_GENS] = {NIL}; /* ptr to list of nodes that point to younger nodes */ NODE *oldyoungs = NIL; long int current_gc = 0; long int gc_stack_malloced = 0; long int gc_stack_size = GCMAX; long int gc_overflow_flag = 0; NODE *reserve_tank = NIL; BOOLEAN inside_gc = 0, int_during_gc = 0; int next_gen_gc = 0, max_gen = 0; int mark_gen_gc; /* #define GC_DEBUG 1 /* */ /* #define GC_TWOBYTE 1 /* Use 2-byte stack offset in mark phase */ #ifdef GC_DEBUG long int num_examined; #endif NODE *lsetsegsz(NODE *args) { NODE *num = pos_int_arg(args); if (NOT_THROWING) seg_size = getint(num); return UNBOUND; } BOOLEAN addseg(void) { long int p; struct segment *newseg; if ((newseg = (struct segment *)malloc(sizeof(struct segment) + seg_size*sizeof(struct logo_node))) != NULL) { newseg->next = segment_list; newseg->size = seg_size; segment_list = newseg; for (p = 0; p < seg_size; p++) { newseg->nodes[p].next = free_list; free_list = &newseg->nodes[p]; settype(&newseg->nodes[p], NTFREE); } return 1; } else return 0; } #ifdef THINK_C #pragma options(!global_optimizer) #endif #ifdef WIN32 #pragma optimize("",off) #endif /* Think C tries to load ptr_val->node_type early if optimized */ BOOLEAN valid_pointer (volatile NODE *ptr_val) { struct segment* current_seg; unsigned long int ptr = (unsigned long int)ptr_val; FIXNUM size; if (ptr_val == NIL) return 0; for (current_seg = segment_list; current_seg != NULL; current_seg = current_seg->next) { size = current_seg->size; if ((ptr >= (unsigned long int)¤t_seg->nodes[0]) && (ptr <= (unsigned long int)¤t_seg->nodes[size-1]) && ((ptr - (unsigned long int)¤t_seg->nodes[0])% (sizeof(struct logo_node)) == 0)) return (ptr_val->node_type != NTFREE); } return 0; } #ifdef THINK_C #pragma options(global_optimizer) #endif #ifdef WIN32 /* #pragma optimize("",on) */ #endif NODETYPES nodetype(NODE *nd) { if (nd == NIL) return (PNIL); return(nd->node_type); } void check_oldyoung(NODE *old, NODE *new) { if (valid_pointer(new) && (new->my_gen < old->my_gen) && old->oldyoung_next == NIL) { old->oldyoung_next = oldyoungs; oldyoungs = old; } } void check_valid_oldyoung(NODE *old, NODE *new) { if (new == NIL) return; if ((new->my_gen < old->my_gen) && old->oldyoung_next == NIL) { old->oldyoung_next = oldyoungs; oldyoungs = old; } } /* setcar/cdr/object should be called only when the new pointee is really * a node. Otherwise just directly assign to the field (e.g. for CONTs). */ void setobject(NODE *nd, NODE *newobj) { nd->n_obj = newobj; check_valid_oldyoung(nd, newobj); } void setcar(NODE *nd, NODE *newcar) { nd->n_car = newcar; check_valid_oldyoung(nd, newcar); } void setcdr(NODE *nd, NODE *newcdr) { nd->n_cdr = newcdr; check_valid_oldyoung(nd, newcdr); } #ifdef THINK_C #pragma options(honor_register) #endif #ifdef WIN32 #pragma optimize("",off) #endif void do_gc(BOOLEAN full) { register NODE *pa, *pb, *pc, *pd, *pe; /* get registers onto stack */ register int aa, bb, cc, dd, ee; int_during_gc = 0; inside_gc++; gc(full); inside_gc = 0; if (int_during_gc != 0) { delayed_int(); } } NODE *newnode(NODETYPES type) { register NODE *newnd; static NODE phony; while ((newnd = free_list) == NIL && NOT_THROWING) { do_gc(FALSE); } if (newnd != NIL) { free_list = newnd->next; newnd->n_car = NIL; newnd->n_cdr = NIL; newnd->n_obj = NIL; newnd->my_gen = 0; newnd->gen_age = gc_age_threshold; newnd->mark_gc = 0; newnd->next = generation[0]; generation[0] = newnd; newnd->oldyoung_next = NIL; settype(newnd, type); mem_nodes++; if (mem_nodes > mem_max) mem_max = mem_nodes; return(newnd); } else return &phony; } #ifdef THINK_C #pragma options(!honor_register) #endif #ifdef WIN32 /* #pragma optimize("",on) */ #endif NODE *cons(NODE *x, NODE *y) { NODE *val = newnode(CONS); /* New node can't possibly point to younger one, so no need to check */ val->n_car = x; val->n_cdr = y; return(val); } #define mmark(child) {if ((child)->my_gen < nd->my_gen) \ {mark(child); got_young++;}} NODE **inter_gen_mark (NODE **prev) { /* Mark/traverse pointers to younger generations only */ NODE* nd = *prev; NODE** array_ptr; NODE* tmp_node; int loop; int got_young = 0; if (nd->my_gen <= mark_gen_gc) return &(nd->oldyoung_next); switch (nodetype(nd)) { case CONS: case CASEOBJ: case RUN_PARSE: case QUOTE: case COLON: case TREE: case LINE: case LOCALSAVE: #ifdef OBJECTS case OBJECT: case METHOD: #endif if (valid_pointer(nd->n_car)) mmark(nd->n_car); if (valid_pointer(nd->n_obj)) mmark(nd->n_obj); case CONT: if (valid_pointer(nd->n_cdr)) mmark(nd->n_cdr); break; case STACK: if (valid_pointer(nd->n_cdr)) mmark(nd->n_cdr); array_ptr = (NODE **)car(nd); loop = num_saved_nodes; while (--loop >= 0) { tmp_node = *array_ptr++; if (valid_pointer(tmp_node)) mmark(tmp_node); } break; case ARRAY: array_ptr = getarrptr(nd); loop = getarrdim(nd); while (--loop >= 0) { tmp_node = *array_ptr++; if (valid_pointer(tmp_node)) mmark(tmp_node); } break; } #ifdef WHYDOESNTTHISWORK if (!got_young) { /* nd no longer points to younger */ *prev = nd->oldyoung_next; nd->oldyoung_next = NIL; return prev; } #endif return &(nd->oldyoung_next); } void gc_inc () { NODE **new_gcstack; long int loop; if (gc_overflow_flag == 1) return; if (gctop == &mark_gcstack[gc_stack_size-1]) gctop = mark_gcstack; else gctop++; if (gctop == gcbottom) { /* gc STACK overflow */ #ifdef GC_DEBUG printf("\nAllocating new GC stack\n"); if (dribblestream != NULL) fprintf(dribblestream,"\nAllocating new GC stack\n"); #endif if ((new_gcstack = (NODE**) malloc ((size_t) sizeof(NODE *) * (gc_stack_size + GCMAX))) == NULL) { /* no room to increse GC Stack */ ndprintf(stdout, "\n%t\n", message_texts[CANT_GC]); ndprintf(stdout, "%t\n", message_texts[EXIT_NOW]); gc_overflow_flag = 1; } else { /* transfer old stack to new stack */ new_gcstack[0] = *gcbottom; if (gcbottom == &mark_gcstack[gc_stack_size-1]) gcbottom = mark_gcstack; else gcbottom++; for (loop = 1 ; gcbottom != gctop ; loop++) { new_gcstack[loop] = *gcbottom; if (gcbottom == &mark_gcstack[gc_stack_size-1]) gcbottom = mark_gcstack; else gcbottom++; } gc_stack_size = gc_stack_size + GCMAX; if (gc_stack_malloced == 1) free(mark_gcstack); gc_stack_malloced = 1; mark_gcstack = new_gcstack; gctop = &mark_gcstack[loop]; gcbottom = mark_gcstack; } } } /* Iterative mark procedure */ void mark(NODE* nd) { int loop; NODE** array_ptr; if (gc_overflow_flag == 1) return; if (!valid_pointer(nd)) return; /* NIL pointer */ if (nd->my_gen > mark_gen_gc) return; /* I'm too old */ if (nd->mark_gc == current_gc) return; /* I'm already marked */ *gctop = nd; gc_inc(); while (gcbottom != gctop) { nd = *gcbottom; if ((valid_pointer(nd)) && (nd->my_gen <= mark_gen_gc) && (nd->mark_gc != current_gc)) { if (nd->mark_gc == -1) { nd->mark_gc = 0; /* this is a caseobj during gctwa */ goto no_mark; /* so don't really mark yet */ } nd->mark_gc = current_gc; #ifdef GC_DEBUG num_examined++; #endif switch (nodetype(nd)) { case CONS: case CASEOBJ: case RUN_PARSE: case QUOTE: case COLON: case TREE: case LINE: case LOCALSAVE: #ifdef OBJECTS case OBJECT: case METHOD: #endif *gctop = nd->n_car; gc_inc(); *gctop = nd->n_obj; gc_inc(); case CONT: *gctop = nd->n_cdr; gc_inc(); break; case STACK: *gctop = nd->n_cdr; gc_inc(); array_ptr = (NODE **)car(nd); loop = num_saved_nodes; while (--loop >= 0) { *gctop = *array_ptr++; gc_inc(); } break; case ARRAY: array_ptr = getarrptr(nd); loop = getarrdim(nd); while (--loop >= 0) { *gctop = *array_ptr++; gc_inc(); } break; } } no_mark: if (gcbottom == &mark_gcstack[gc_stack_size-1]) gcbottom = mark_gcstack; else gcbottom++; } } void gc(BOOLEAN no_error) { NODE *top; NODE **top_stack; NODE *nd, *tmpnd; long int num_freed = 0; NODE **tmp_ptr, **prev; long int freed_sofar = 0; NODE** array_ptr; NODE* tmp_node; NODE *obj, *caselist; int anygood; int i; short int loop; int gen_gc; /* deepest generation to garbage collect */ int gctwa; /* garbage collect truly worthless atoms */ if (gc_overflow_flag == 1) { if (!addseg()) { err_logo(OUT_OF_MEM, NIL); if (free_list == NIL) err_logo(OUT_OF_MEM_UNREC, NIL); } return; } check_throwing; top_stack = ⊤ mark_gen_gc = gen_gc = (no_error ? max_gen : next_gen_gc); gctwa = (gen_gc == max_gen && max_gen > 1) || no_error; if (gctwa) { /* Every caseobj must be marked twice to count */ for (loop = 0; loop < HASH_LEN ; loop++) { for (nd = hash_table[loop]; nd != NIL; nd = cdr(nd)) { tmpnd = caselist__object(car(nd)); while (tmpnd != NIL) { (car(tmpnd))->mark_gc = -1; tmpnd = cdr(tmpnd); } } } } re_mark: current_gc++; #ifdef GC_DEBUG printf("gen = %d\n", gen_gc); if (dribblestream != NULL) fprintf(dribblestream,"gen = %d\n", gen_gc); num_examined = 0; #endif /* Begin Mark Phase */ /* Check globals for NODE pointers */ mark(Regs_Node); mark(stack); mark(numstack); mark(expresn); mark(val); mark(parm); mark(catch_tag); mark(arg); mark(var_stack); mark(last_call); mark(output_node); mark(output_unode); mark(throw_node); mark(err_mesg); mark(current_line); /* mark(fun); mark(ufun); mark(last_ufun); mark(this_line); mark(last_line); mark(var); mark(didnt_output_name); mark(didnt_get_output); mark(qm_list); */ mark(file_list); mark(reader_name); mark(writer_name); mark(file_prefix); mark(save_name); mark(the_generation); mark(Not_Enough_Node); mark(Unbound); mark(Listvalue); mark(Dotsvalue); mark(cnt_list); mark(cnt_last); mark(deepend_proc_name); #ifdef OBJECTS mark(logo_object); mark(current_object); mark(askexist); #endif #ifdef GC_DEBUG printf("globals %ld + ", num_examined); if (dribblestream != NULL) fprintf(dribblestream,"globals %ld + ", num_examined); num_examined = 0; #endif for (loop = 0; loop < HASH_LEN ; loop++) mark(hash_table[loop]); #ifdef GC_DEBUG printf("oblist %ld + ", num_examined); if (dribblestream != NULL) fprintf(dribblestream,"oblist %ld + ", num_examined); num_examined = 0; #endif /* Check Stack for NODE pointers */ if (top_stack < bottom_stack) { /* check direction stack grows */ for (tmp_ptr = top_stack; tmp_ptr <= bottom_stack; #if defined(THINK_C) || defined(__RZTC__) || defined(GC_TWOBYTE) tmp_ptr = (NODE **)(((unsigned long int)tmp_ptr)+2) #else tmp_ptr++ #endif ) { if (valid_pointer(*tmp_ptr)) { mark(*tmp_ptr); } } } else { for (tmp_ptr = top_stack; tmp_ptr >= bottom_stack; #if defined(THINK_C) || defined(__RZTC__) || defined(GC_TWOBYTE) tmp_ptr = (NODE **)(((unsigned long int)tmp_ptr)-2) #else tmp_ptr-- #endif ) { if (valid_pointer(*tmp_ptr)) { mark(*tmp_ptr); } } } #ifdef GC_DEBUG printf("stack %ld + ", num_examined); if (dribblestream != NULL) fprintf(dribblestream,"stack %ld + ", num_examined); num_examined = 0; #endif /* check pointers from old generations to young */ for (prev = &oldyoungs; *prev != Unbound; prev = inter_gen_mark(prev)) ; #ifdef GC_DEBUG printf("inter_gen %ld marked\n", num_examined); if (dribblestream != NULL) fprintf(dribblestream,"inter_gen %ld marked\n", num_examined); num_examined = 0; #endif if (gc_overflow_flag) return; if (gctwa) { #ifdef GC_DEBUG printf("GCTWA: "); if (dribblestream != NULL) fprintf(dribblestream,"GCTWA: "); num_examined = 0; #endif for (loop = 0; loop < HASH_LEN ; loop++) { tmpnd = NIL; for (nd = hash_table[loop]; nd != NIL; nd = cdr(nd)) { obj = car(nd); if (procnode__object(obj) == UNDEFINED && valnode__object(obj) == UNBOUND && plist__object(obj) == NIL && !flag__object(obj, PERMANENT)) { #ifdef GC_DEBUG num_examined++; #endif anygood = 0; for (caselist = caselist__object(obj); caselist != NIL; caselist = cdr(caselist)) { if ((car(caselist))->mark_gc == current_gc) { anygood = 1; break; } } if (anygood) { /* someone points here, don't gctwa */ tmpnd = nd; } else { /* do gctwa */ if (tmpnd == NIL) hash_table[loop] = cdr(hash_table[loop]); else setcdr(tmpnd, cdr(nd)); } } else /* has a value, don't gctwa */ tmpnd = nd; } } #ifdef GC_DEBUG printf("%ld collected\n", num_examined); if (dribblestream != NULL) fprintf(dribblestream,"%ld collected\n", num_examined); num_examined = 0; #endif gctwa = 0; goto re_mark; } /* Begin Sweep Phase */ for (loop = gen_gc; loop >= 0; loop--) { tmp_ptr = &generation[loop]; for (nd = generation[loop]; nd != NIL; nd = *tmp_ptr) { if (nd->mark_gc == current_gc) { if (--(nd->gen_age) == 0 && loop < NUM_GENS-1) { /* promote to next gen */ *tmp_ptr = nd->next; nd->next = generation[loop+1]; generation[loop+1] = nd; nd->my_gen = loop+1; if (max_gen == loop) max_gen++; nd->gen_age = gc_age_threshold; switch (nodetype(nd)) { case CONS: case CASEOBJ: case RUN_PARSE: case QUOTE: case COLON: case TREE: case LINE: case LOCALSAVE: #ifdef OBJECTS case OBJECT: case METHOD: #endif check_oldyoung(nd, nd->n_car); check_oldyoung(nd, nd->n_obj); case CONT: check_oldyoung(nd, nd->n_cdr); break; case STACK: check_oldyoung(nd, nd->n_cdr); array_ptr = (NODE **)car(nd); i = num_saved_nodes; while (--i >= 0) { tmp_node = *array_ptr++; check_oldyoung(nd, tmp_node); } break; case ARRAY: array_ptr = getarrptr(nd); i = getarrdim(nd); while (--i >= 0) { tmp_node = *array_ptr++; check_oldyoung(nd, tmp_node); } break; } } else { /* keep in this gen */ tmp_ptr = &(nd->next); } } else { /* free */ num_freed++; mem_nodes--; *tmp_ptr = nd->next; if (nd->oldyoung_next != NIL) { for (prev = &oldyoungs; *prev != nd; prev = &((*prev)->oldyoung_next)) ; *prev = nd->oldyoung_next; nd->oldyoung_next = NIL; } switch (nodetype(nd)) { case ARRAY: free((char *)getarrptr(nd)); break; case STACK: free((char *)car(nd)); break; case STRING: case BACKSLASH_STRING: case VBAR_STRING: if (getstrhead(nd) != NULL && decstrrefcnt(getstrhead(nd)) == 0) free(getstrhead(nd)); break; } settype (nd, NTFREE); nd->next = free_list; free_list = nd; } } #ifdef GC_DEBUG printf("%ld + ", num_freed - freed_sofar); if (dribblestream != NULL) fprintf(dribblestream,"%ld + ", num_freed - freed_sofar); #endif freed_sofar = num_freed; } #ifdef GC_DEBUG printf("= %ld freed\n", num_freed); if (dribblestream != NULL) fprintf(dribblestream,"= %ld freed\n", num_freed); #endif if (num_freed > freed_threshold) next_gen_gc = 0; else if (gen_gc < max_gen) next_gen_gc = gen_gc+1; else next_gen_gc = 0; if (num_freed < freed_threshold) { if (!addseg() && num_freed < 50 && gen_gc == max_gen && !no_error) { err_logo(OUT_OF_MEM, NIL); if (free_list == NIL) err_logo(OUT_OF_MEM_UNREC, NIL); } #ifdef __RZTC__ (void)addseg(); #endif } #ifdef GC_DEBUG /* getchar(); */ #endif } #ifdef GC_DEBUG void prname(NODE *foo) { ndprintf(stdout, "%s ", car(foo)); if (dribblestream != NULL) fprintf(dribblestream, "%s ", car(foo)); } #endif NODE *lgc(NODE *args) { do_gc(args != NIL); return UNBOUND; } NODE *lnodes(NODE *args) { long int temp_max, temp_nodes; #ifdef GC_DEBUG /* map_oblist(&prname); */ #endif do_gc(TRUE); /* get real in-use figures */ temp_max = mem_max; temp_nodes = mem_nodes; mem_max = mem_nodes; return cons(make_intnode(temp_nodes), cons(make_intnode(temp_max), NIL)); } void fill_reserve_tank(void) { NODE *newnd, *p = NIL; int i = 50; while (--i >= 0) { /* make pairs not in any generation */ if ((newnd = free_list) == NIL) break; free_list = newnd->next; settype(newnd, CONS); newnd->n_car = NIL; newnd->n_cdr = p; newnd->n_obj = NIL; newnd->next = NIL; newnd->oldyoung_next = NIL; p = newnd; } reserve_tank = p; } void use_reserve_tank(void) { NODE *nd = reserve_tank; reserve_tank = NIL; for ( ; nd != NIL; nd = cdr(nd) ) { settype(nd, NTFREE); nd->next = free_list; free_list = nd; } } void check_reserve_tank(void) { if (reserve_tank == NIL) fill_reserve_tank(); } ucblogo-6.1/globals.h0000664000175000017500000005104113575571772012732 0ustar jjcjjc/* * globals.h logo global references module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ /* main.c */ #ifdef HAVE_WX extern int start(int, char **); extern int wx_leave_mainloop; extern int check_wx_stop(int force_yield); #endif extern NODE **bottom_stack; /*GC*/ extern NODE *current_line, *exec_list; extern int main(int, char *[]); extern void unblock_input(void); extern NODE **bottom_stack; extern void delayed_int(void); extern NODE *command_line; #if defined(SIG_TAKES_ARG) RETSIGTYPE logo_stop(int); RETSIGTYPE logo_pause(int); RETSIGTYPE mouse_down(int); #define mouse_click mouse_down(0) #else RETSIGTYPE logo_stop(void); RETSIGTYPE logo_pause(void); RETSIGTYPE mouse_down(void); #define mouse_click mouse_down() #endif #ifndef TIOCSTI #include extern jmp_buf iblk_buf; #endif /* logodata.c */ extern char *strnzcpy(char *, char *, int); extern char *word_strnzcpy(char *, NODE *, int); extern char *noparity_strnzcpy(char *, char *, int); extern char *backslashed_strnzcpy(char *, char *, int); extern char *mend_strnzcpy(char *, char *, int); extern char *mend_nosemi(char *, char *, int); extern char *low_strnzcpy(char *, char *, int); extern char *cap_strnzcpy(char *, char *, int); extern char *noparitylow_strnzcpy(char *, char *, int); extern int low_strncmp(char *, char *, int); extern int noparity_strncmp(char *, char *, int); extern int noparitylow_strncmp(char *, char *, int); extern NODE *make_strnode(char *, struct string_block *, int, NODETYPES, char *(*)()); extern void make_runparse(NODE *); extern NODE *make_quote(NODE *); extern NODE *maybe_quote(NODE *); extern NODE *make_caseobj(NODE *, NODE *); extern NODE *make_colon(NODE *); extern NODE *make_intnode(FIXNUM); extern NODE *make_floatnode(FLONUM); extern NODE *cnv_node_to_numnode(NODE *); extern NODE *cnv_node_to_strnode(NODE *); extern NODE *make_static_strnode(char *); extern NODE *cons_list(int, ...); extern NODE *make_array(FIXNUM); extern NODE *llowercase(NODE *); extern NODE *luppercase(NODE *); extern NODE *lgprop(NODE *); extern NODE *lpprop(NODE *); extern NODE *lremprop(NODE *); extern NODE *copy_list(NODE *); extern NODE *lplist(NODE *); extern int isName(NODE *, enum words); extern int varTrue(NODE *); extern NODE *theName(enum words); extern NODE *TrueName(void); extern NODE *FalseName(void); #ifdef ecma extern char ecma_array[], special_chars[]; extern char ecma_set(int); extern char ecma_clear(int); extern int ecma_size; extern int ecma_get(int); #endif /* mem.c */ extern NODE *free_list; extern struct segment *segment_list; extern NODE *oldyoungs; extern BOOLEAN inside_gc, int_during_gc; extern BOOLEAN addseg(void); extern NODETYPES nodetype(NODE *); extern void check_valid_oldyoung(NODE *old, NODE *n); extern void setobject(NODE *, NODE *); extern void setcar(NODE *, NODE *); extern void setcdr(NODE *, NODE *); extern NODE *newnode(NODETYPES); extern NODE *cons(NODE *, NODE *); extern void mark(NODE *); extern void gc(BOOLEAN); extern NODE *lgc(NODE *); extern NODE *lnodes(NODE *); extern NODE *lsetsegsz(NODE *); extern void fill_reserve_tank(void); extern void use_reserve_tank(void); extern void check_reserve_tank(void); /* parse.c */ extern FILE *loadstream, *writestream, *readstream, *dribblestream; extern int input_blocking; extern NODE *current_line, *deepend_proc_name; extern NODE *reader(FILE *, char *); extern NODE *parser(NODE *, BOOLEAN); extern NODE *lparse(NODE *); extern NODE *runparse(NODE *); extern NODE *lrunparse(NODE *); #if 0 extern char *cmdHistory[]; extern char **hist_inptr, **hist_outptr; #endif /* math.c */ extern int numberp(NODE *); extern NODE *lrandom(NODE *); extern NODE *lrerandom(NODE *); extern void math_init(void); extern FLONUM degrad; extern NODE *ladd(NODE *); extern NODE *lsub(NODE *); extern NODE *lmul(NODE *); extern NODE *ldivide(NODE *); extern NODE *lremainder(NODE *); extern NODE *lmodulo(NODE *); extern NODE *lbitand(NODE *); extern NODE *lbitor(NODE *); extern NODE *lbitxor(NODE *); extern NODE *lashift(NODE *); extern NODE *llshift(NODE *); extern NODE *lbitnot(NODE *); extern NODE *lsin(NODE *); extern NODE *lcos(NODE *); extern NODE *latan(NODE *); extern NODE *lradsin(NODE *); extern NODE *lradcos(NODE *); extern NODE *lradatan(NODE *); extern NODE *lsqrt(NODE *); extern NODE *linteg(NODE *); extern NODE *lroundx(NODE *); extern NODE *lexp(NODE *); extern NODE *llog10(NODE *); extern NODE *lln(NODE *); extern NODE *lpower(NODE *); extern NODE *torf(BOOLEAN); extern NODE *llessp(NODE *); extern NODE *lgreaterp(NODE *); extern NODE *llessequalp(NODE *); extern NODE *lgreaterequalp(NODE *); extern int compare_node(NODE *, NODE *, BOOLEAN); extern BOOLEAN equalp_help(NODE *, NODE *, BOOLEAN); extern NODE *lequalp(NODE *); extern NODE *lnotequalp(NODE *); extern NODE *l_eq(NODE *); extern NODE *lbeforep(NODE *); /* intern.c */ extern NODE *hash_table[HASH_LEN]; void map_oblist(void (*)()); extern NODE *make_instance(NODE *, NODE *); extern NODE *intern(NODE *); /* print.c */ extern int print_stringlen; extern char *print_stringptr; extern int force_printwidth, force_printdepth; extern int x_margin, y_margin; extern NODE *Fullprintp; extern void update_coords(char); extern void print_char(FILE *, char); extern void print_space(FILE *); extern void ndprintf(FILE *, char *, ...); extern void real_print_help(FILE *, NODE *, int, int); extern void print_help(FILE *, NODE *); extern void print_node(FILE *, NODE *); extern void print_nobrak(FILE *, NODE *); extern void new_line(FILE *); extern NODE *lshow(NODE *); extern NODE *ltype(NODE *); extern NODE *lprint(NODE *); /* init.c */ extern NODE *Left_Paren, *Right_Paren; extern NODE *Redefp, *Caseignoredp, *Erract, *Printdepthlimit; extern NODE *Printwidthlimit, *Pause, *LoadNoisily, *AllowGetSet; extern NODE *UnburyOnEdit, *Make, *Listvalue, *Dotsvalue; extern NODE *Unbound, *Not_Enough_Node, *Buttonact, *LogoVersion; extern NODE *Minus_Sign, *Minus_Tight, *Startup, *Startuplg, *Query; extern NODE *UseAlternateNames, *LogoLogo, *LogoPlatform, *Keyact; extern NODE *CommandLine, *Null_Word; extern void init(void); extern struct wdtrans translations[]; extern char *LogoPlatformName; /* wrksp.c */ #ifdef HAVE_WX extern char* wx_fgets(char* s, int n, FILE* stream); #endif extern char *editor, *editorname, *tempdir; extern int to_pending; extern NODE *ltext(NODE *); extern NODE *lfulltext(NODE *); extern NODE *ldefine(NODE *); extern NODE *ldefmacro(NODE *); extern NODE *anonymous_function(NODE *); extern NODE *lmacro(NODE *); extern NODE *lto(NODE *); extern NODE *lmake(NODE *); extern NODE *llocal(NODE *); extern NODE *lglobal(NODE *); extern NODE *cnt_list, *cnt_last; extern NODE *lcontents(NODE *); extern NODE *lburied(NODE *); extern NODE *ltraced(NODE *); extern NODE *lstepped(NODE *); extern NODE *lprocedures(NODE *); extern NODE *lprimitives(NODE *); extern NODE *lnames(NODE *); extern NODE *lplists(NODE *); extern NODE *lpo(NODE *); extern NODE *lpot(NODE *); extern NODE *lerase(NODE *); extern NODE *lerall(NODE *); extern NODE *lerps(NODE *); extern NODE *lerns(NODE *); extern NODE *lerpls(NODE *); extern NODE *lbury(NODE *); extern NODE *ltrace(NODE *); extern NODE *lstep(NODE *); extern NODE *lburiedp(NODE *); extern NODE *ltracedp(NODE *); extern NODE *lsteppedp(NODE *); extern NODE *lunbury(NODE *); extern NODE *luntrace(NODE *); extern NODE *lunstep(NODE *); extern char *addsep(char *); extern NODE *ledit(NODE *); extern NODE *leditfile(NODE *); extern NODE *lthing(NODE *); extern NODE *lnamep(NODE *); extern NODE *lprocedurep(NODE *); extern NODE *lplistp(NODE *); extern NODE *lprimitivep(NODE *); extern NODE *ldefinedp(NODE *); extern NODE *lmacrop(NODE *); extern NODE *lcopydef(NODE *); extern NODE *lhelp(NODE *); extern NODE *larity(NODE *); /* error.c */ extern char *message_texts[]; extern NODE *throw_node; extern NODE *err_mesg; extern ERR_TYPES erract_errtype; extern void err_print(char *); extern NODE *err_logo(ERR_TYPES, NODE *); extern NODE *lerror(NODE *); extern NODE *lpause(NODE *); extern NODE *lcontinue(NODE *); /* eval.c */ extern NODE *var_stack; extern NODE *output_node, *output_unode, *last_call; extern CTRLTYPE stopping_flag; extern char *logolib, *helpfiles, *csls; extern FIXNUM dont_fix_ift; extern void eval_driver(NODE *); extern NODE *err_eval_driver(NODE *, BOOLEAN); extern NODE *lapply(NODE *); extern NODE *lqm(NODE *); extern NODE *deep_copy(NODE *); extern void tell_shadow(NODE *); extern int not_local(NODE *, NODE *); extern int num_saved_nodes; extern struct registers regs; extern NODE *Regs_Node; extern int inside_evaluator; extern NODE *evaluator(NODE *list, enum labels where); extern NODE *eval_buttonact; /* #ifdef OBJECTS extern NODE *val_eval_driver(NODE *seq); #endif */ /* lists.c */ extern NODE *lbutfirst(NODE *); extern NODE *lbutlast(NODE *); extern NODE *lfirst(NODE *); extern NODE *lfirsts(NODE *); extern NODE *lbfs(NODE *); extern NODE *llast(NODE *); extern NODE *llist(NODE *); extern NODE *lemptyp(NODE *); extern NODE *lascii(NODE *); extern NODE *lrawascii(NODE *); extern NODE *lvbarredp(NODE *); extern NODE *lchar(NODE *); extern NODE *lcount(NODE *); extern NODE *lfput(NODE *); extern NODE *llput(NODE *); extern NODE *string_arg(NODE *); extern NODE *lword(NODE *); extern NODE *lsentence(NODE *); extern NODE *lwordp(NODE *); extern NODE *llistp(NODE *); extern NODE *lnumberp(NODE *); extern NODE *larrayp(NODE *); extern NODE *lmemberp(NODE *); extern NODE *lsubstringp(NODE *); extern NODE *lmember(NODE *); extern NODE *integer_arg(NODE *); extern FIXNUM int_arg(NODE *); extern NODE *litem(NODE *); extern NODE *lsetitem(NODE *); extern NODE *l_setitem(NODE *); extern NODE *larray(NODE *); extern NODE *larraytolist(NODE *); extern NODE *llisttoarray(NODE *); extern NODE *lform(NODE *); extern NODE *l_setfirst(NODE *); extern NODE *l_setbf(NODE *); /* files.c */ #ifdef HAVE_WX extern int wxKeyp(); #endif extern NODE *file_list; extern NODE *reader_name, *writer_name, *file_prefix; extern NODE *lseteditor(NODE *); extern NODE *lsetlibloc(NODE *); extern NODE *lsetcslsloc(NODE *); extern NODE *lsethelploc(NODE *); extern NODE *lsettemploc(NODE *); extern NODE *ldribble(NODE *); extern NODE *lnodribble(NODE *); extern NODE *lopenread(NODE *); extern NODE *lopenwrite(NODE *); extern NODE *lopenappend(NODE *); extern NODE *lopenupdate(NODE *); extern NODE *lallopen(NODE *); extern NODE *lclose(NODE *); extern NODE *lsetwrite(NODE *); extern NODE *lsetread(NODE *); extern NODE *lreader(NODE *); extern NODE *lwriter(NODE *); extern NODE *lerasefile(NODE *); extern NODE *lsave(NODE *); extern void silent_load(NODE *, char *); extern NODE *lload(NODE *); extern NODE *lcslsload(NODE *); extern NODE *lsetprefix(NODE *); extern NODE *lprefix(NODE *); extern NODE *lreadlist(NODE *); extern NODE *lreadword(NODE *); extern NODE *lreadrawline(NODE *); extern NODE *lreadchar(NODE *); extern NODE *lreadchars(NODE *); extern NODE *leofp(NODE *); extern NODE *lkeyp(NODE *); extern NODE *lreadpos(NODE *); extern NODE *lsetreadpos(NODE *); extern NODE *lwritepos(NODE *); extern NODE *lsetwritepos(NODE *); extern int readchar_lookahead_buf; extern int need_save; extern NODE *save_name; /* coms.c */ extern NODE *make_cont(enum labels, NODE *); extern NODE *loutput(NODE *); extern NODE *lstop(NODE *); extern NODE *lthrow(NODE *); extern NODE *lcatch(NODE *); extern NODE *lgoto(NODE *); extern NODE *ltag(NODE *); extern NODE *lnot(NODE *); extern NODE *land(NODE *); extern NODE *lor(NODE *); extern NODE *lif(NODE *); extern NODE *lifelse(NODE *); extern NODE *lrun(NODE *); extern NODE *lrunresult(NODE *); extern NODE *pos_int_arg(NODE *); extern int torf_arg(NODE *); extern NODE *lrepeat(NODE *); extern NODE *lrepcount(NODE *); extern NODE *lforever(NODE *); extern NODE *ltest(NODE *); extern NODE *liftrue(NODE *); extern NODE *liffalse(NODE *); extern void prepare_to_exit(BOOLEAN); extern NODE *lbye(NODE *); extern NODE *lwait(NODE *); extern NODE *lshell(NODE *); NODE *runnable_arg(NODE *); /* term.c */ #ifndef HAVE_WX extern int x_coord, y_coord, x_max, y_max; #endif extern int interactive; extern void term_init(void); extern void charmode_on(void); extern void charmode_off(void); extern NODE *lcleartext(NODE *); extern NODE *lcursor(NODE *); extern NODE *lsetcursor(NODE *); extern NODE *lsetmargins(NODE *); extern NODE *lstandout(NODE *); /* libloc.c */ extern char *libloc, *helploc, *cslsloc, *temploc, *separator; /* paren.c */ extern NODE *the_generation; extern void untreeify_proc(NODE *); extern void make_tree_from_body(NODE *); extern void make_tree(NODE *); extern NODE *tree_dk_how; extern void check_library(NODE *); /* graphics.c */ #ifdef HAVE_WX #ifndef IN_SPLITSCREEN #define REMOVE_DEFINES 1 #define IN_SPLITSCREEN 4 #define IN_GRAPHICS_MODE 5 #endif int wxGetInfo(int); #define in_splitscreen wxGetInfo(IN_SPLITSCREEN) #define in_graphics_mode wxGetInfo(IN_GRAPHICS_MODE) #ifdef REMOVE_DEFINES #undef IN_SPLITSCREEN #undef IN_GRAPHICS_MODE #endif #endif extern mode_type current_mode; extern FLONUM turtle_x, turtle_y, turtle_heading, x_scale, y_scale; extern BOOLEAN turtle_shown; extern BOOLEAN refresh_p; extern FIXNUM g_round(FLONUM); void draw_turtle(void); extern NODE *numeric_arg(NODE *); extern NODE *lright(NODE *); extern NODE *lleft(NODE *); extern NODE *lforward(NODE *); extern NODE *lback(NODE *); extern NODE *lshowturtle(NODE *); extern NODE *lhideturtle(NODE *); extern NODE *lshownp(NODE *); extern NODE *lsetheading(NODE *); extern NODE *lheading(NODE *); extern NODE *pos_int_vector_arg(NODE *); extern NODE *ltowards(NODE *); extern NODE *lpos(NODE *); extern NODE *lscrunch(NODE *); extern NODE *lhome(NODE *); extern NODE *lclearscreen(NODE *); extern NODE *lclean(NODE *); extern NODE *lsetpos(NODE *); extern NODE *lsetxy(NODE *); extern NODE *lsetx(NODE *); extern NODE *lsety(NODE *); extern NODE *lwrap(NODE *); extern NODE *lfence(NODE *); extern NODE *lwindow(NODE *); extern NODE *lfill(NODE *); #ifdef HAVE_WX extern NODE *lfilled(NODE *); #endif extern NODE *llabel(NODE *); extern NODE *ltextscreen(NODE *); extern NODE *lsplitscreen(NODE *); extern NODE *lfullscreen(NODE *); extern NODE *lpendownp(NODE *); extern NODE *lpenmode(NODE *); extern NODE *lpencolor(NODE *); extern NODE *lbackground(NODE *); extern NODE *lpensize(NODE *); extern NODE *lpenpattern(NODE *); extern NODE *lpendown(NODE *); extern NODE *lpenup(NODE *); extern NODE *lpenpaint(NODE *); extern NODE *lpenerase(NODE *); extern NODE *lpenreverse(NODE *); extern NODE *lsetpencolor(NODE *); extern NODE *lsetbackground(NODE *); extern NODE *lsetpalette(NODE *); extern NODE *lpalette(NODE *); extern NODE *lsetpensize(NODE *); extern NODE *lsetpenpattern(NODE *); extern NODE *lsetscrunch(NODE *); extern NODE *lmousepos(NODE *); extern NODE *lclickpos(NODE *); extern NODE *lbuttonp(NODE *); extern NODE *lbutton(NODE *); extern NODE *ltone(NODE *); extern NODE *larc(NODE *); extern NODE *lrefresh(NODE *); extern NODE *lnorefresh(NODE *); extern NODE *lloadpict(NODE *); extern NODE *lsavepict(NODE *); extern NODE *lepspict(NODE *); extern void redraw_graphics(void); extern NODE *lscreenmode(NODE *); extern NODE *lturtlemode(NODE *); extern void fix_turtle_shownness(void); extern enum s_md {SCREEN_TEXT, SCREEN_SPLIT, SCREEN_FULL} screen_mode; #ifdef HAVE_WX extern NODE *lprintpict(NODE *), *lprinttext(NODE *); #endif #ifdef mac #define SIGQUIT SIGABRT /* macterm.c */ extern void init_mac_memory(void); extern BOOLEAN check_mac_stop(void); extern void term_init_mac(void); extern void mac_gotoxy(int, int); extern NODE *lsetwindowtitle(NODE *); extern NODE *lsettextfont(NODE *); extern NODE *lsettextsize(NODE *); extern NODE *lsettextstyle(NODE *); extern NODE *lsetwindowsize(NODE *); extern NODE *lsetwindowxy(NODE *); extern NODE *lnewconsole(NODE *); extern NODE *lgraphtext(NODE *); extern NODE *lregulartext(NODE *); extern NODE *lcaninverse(NODE *); extern BOOLEAN mac_edit(); #ifndef SYMANTEC_C extern WindowPtr graphics_window, listener_window; #endif #endif #ifdef HAVE_WX extern NODE *lfont(NODE *); extern NODE *lsetlabelheight(NODE *); extern NODE *llabelsize(NODE *); extern NODE *lsetfont(NODE *); extern NODE *lsettextsize(NODE *); extern NODE *ltextsize(NODE *); extern NODE *set_text_color(NODE *); #endif #ifdef __RZTC__ /* ztcterm.c */ extern BOOLEAN in_graphics_mode, in_splitscreen; extern int ibm_screen_bottom; #include extern fg_coord_t MaxX, MaxY; extern void outtext(char *); extern void init_ibm_memory(void); extern volatile int ctrl_c_count; extern BOOLEAN check_ibm_stop(void); extern void term_init_ibm(void); extern void ibm_gotoxy(int, int); extern void ibm_clear_text(void); extern void ibm_clear_screen(void); extern void ibm_plain_mode(void); extern void ibm_bold_mode(void); extern void erase_graphics_top(void); extern void ztc_set_penc(FIXNUM); extern void t_screen(void); extern void s_screen(void); extern void check_scroll(void); extern void ztc_put_char(int); extern void fix_cursor(void); extern void zflush(void); extern void newline_bugfix(void); extern void ztc_getcr(void); extern NODE *set_text_color(NODE *); #endif #ifdef HAVE_WX extern void init_wx(int, char**); extern void printToScreen(char c, FILE * stream); extern void flushFile(FILE * stream); extern char getFromWX(); extern char getFromWX_2(FILE * f); extern void wxLogoExit(int code); extern void wxLogoSleep(unsigned int milli); extern int wxUnget_c(int c, FILE * f); extern void wxlPrintPict(void); extern void wxlPrintPreviewPict(void); extern void wxlPrintText(void); extern void wxlPrintPreviewText(void); extern NODE*IncreaseFont(void *); extern NODE*DecreaseFont(void *); extern int turtlePosition_x; extern int turtlePosition_y; #define SCREEN_WIDTH 1 #define SCREEN_HEIGHT 2 #define BACK_GROUND 3 #define IN_SPLITSCREEN 4 #define IN_GRAPHICS_MODE 5 #define X_COORD 6 #define Y_COORD 7 #define X_MAX 8 #define Y_MAX 9 #define EDIT_STATE 10 // used for the text editor flag #define NO_INFO 0 #define DO_LOAD 1 #define NO_LOAD 2 #else extern int in_graphics_mode, in_splitscreen, cur_len, read_index; #endif #ifdef x_window /* xgraphics.c */ extern void x_window_init(int, char **); extern void check_X11_stop(void); extern int clearing_screen; #endif #ifdef WIN32 /* Win32trm.c */ #undef WIN32_DEBUG #undef CONSOLE #ifdef WIN32_DEBUG extern void WinDebug(char *); #endif extern char *read_line, buffered_char; extern int char_mode; extern int line_avail, char_avail; extern void win32_advance_line(void); extern char *eight_dot_three(char *); extern BOOLEAN check_ibm_stop(void); extern NODE* win32_lsetcursor(NODE *); extern int win32_putc(int, FILE*); extern void win32_charmode_off(void), win32_charmode_on(void); extern void win32_repaint_screen(void); extern void win32_clear_text(void); extern void ibm_plain_mode(void); extern void ibm_bold_mode(void); extern void win32_update_text(void); extern void moveto(int, int); extern void lineto(int, int); extern void draw_string(char *); extern int win32_screen_bottom(void); extern void win32_text_cursor(void); extern NODE *set_text_color(NODE *); extern void winDoPaste(void); extern char *winPasteText; extern NODE *maximize(NODE *); #define SIGQUIT SIGABRT #endif #ifdef HAVE_WX #define rd_putc printToScreen #else #ifdef WIN32 #define rd_putc win32_putc #else /* !WIN32 */ #define rd_putc putc #endif #endif #ifdef OBJECTS /* obj.c */ extern NODE *logo_object, *current_object, *askexist; extern void obj_init(void); NODE *assoc(NODE *name, NODE *alist); extern NODE *llogo(NODE *); extern NODE *lsomething(NODE *); extern NODE *lkindof(NODE *); extern NODE *loneof(NODE *); extern NODE *lexist(NODE *); extern NODE *lhave(NODE *); extern NODE *ltalkto(NODE *); extern NODE *lask(NODE *); extern NODE *lself(NODE *); extern NODE *lparents(NODE *); extern NODE *lmynames(NODE *); extern NODE *lmynamep(NODE *); extern NODE *lmyprocs(NODE *); extern NODE *lmyprocp(NODE *); extern NODE *lrepresentation(NODE *); extern NODE *varValue(NODE *); extern NODE *varInObjectHierarchy(NODE *, BOOLEAN); extern NODE *varInThisObject(NODE *, BOOLEAN); extern NODE *procValue(NODE *); extern NODE *parent_list(NODE *); #endif ucblogo-6.1/eval.c0000664000175000017500000012035013575571772012231 0ustar jjcjjc/* * eval.c logo eval/apply module dko * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #define WANT_EVAL_REGS 1 #include "logo.h" #include "globals.h" /* evaluator registers that need saving around evals */ struct registers regs; NODE *Regs_Node; int num_saved_nodes; int inside_evaluator = 0; NODE *eval_buttonact = NIL; /* node-value registers that don't need saving */ NODE *expresn = NIL, /* the current expression */ *val = NIL, /* the value of the last expression */ *stack = NIL, /* register stack */ *numstack = NIL,/* stack whose elements aren't objects */ *parm = NIL, /* the current formal */ *catch_tag = NIL, *arg = NIL; /* the current actual */ NODE *var_stack = NIL, /* the stack of variables and their bindings */ *last_call = NIL, /* the last proc called */ *output_node = NIL, /* the output of the current function */ *output_unode = NIL; /* the unode in which we saw the output */ #define DEBUGGING 0 #if DEBUGGING #define DEB_STACK 0 /* set to 1 to log save/restore */ #define DEB_CONT 0 /* set to 1 to log newcont/fetch_cont */ #define do_debug(x) \ x(expresn) x(unev) x(val) x(didnt_get_output) x(didnt_output_name) x(fun) \ x(proc) #define deb_enum(x) \ ndprintf(stdout, #x " = %s, ", x); void vs_print() { FIXNUM vs = val_status; int i; static char *vnames[] = {"VALUE_OK", "NO_VALUE_OK", "OUTPUT_OK", "STOP_OK", "OUTPUT_TAIL", "STOP_TAIL"}; static char *names[] = {"RUN", "STOP", "OUTPUT", "THROWING", "MACRO_RETURN"}; if (!varTrue(Redefp)) return; printf("Val_status = "); for (i=0; i<6; i++) { if (vs&1) { printf(vnames[i]); vs >>= 1; if (vs != 0) printf("|"); } else vs >>= 1; if (vs == 0) break; } if (vs != 0) printf("0%o", vs<<6); printf(", stopping_flag = %s\n", names[stopping_flag]); } void debprint(char *name) { if (!varTrue(Redefp)) return; printf("%s: ", name); do_debug(deb_enum) vs_print(); printf("current_unode=0x%x, output_unode=0x%x\n",current_unode, output_unode); } #define debprint2(a,b) if (varTrue(Redefp)) ndprintf(stdout,a,b) #else #define debprint(name) #define debprint2(a,b) #define DEB_STACK 0 #define DEB_CONT 0 #endif #ifdef HAVE_TERMIO_H #ifdef HAVE_WX #include #else #include #endif #else #ifdef HAVE_SGTTY_H #include #endif #endif #if DEB_STACK NODE *restname, *restline; #define save(register) ( debprint2("saving " #register " = %s ", register), \ push(register, stack), \ push(make_intnode(__LINE__), stack), \ debprint2(" at line %s\n", car(stack)), \ push(make_static_strnode(#register), stack) ) #define restore(register) ( restname = car(stack), pop(stack), \ restline = car(stack), pop(stack), \ register = car(stack), pop(stack), \ ( (strcmp(getstrptr(restname), #register)) ? (\ debprint2("*** Restoring " #register " but saved %s",\ restname), \ debprint2(" at line %s! ***\n", restline) \ ) : 0), \ debprint2("restoring " #register " = %s ", register), \ debprint2(" at line %s\n", make_intnode(__LINE__)) ) #define save2(reg1,reg2) ( save(reg1), save(reg2) ) #define restore2(reg1,reg2) ( restore(reg2), restore(reg1) ) #else #define save(register) push(register, stack) #define restore(register) (register = car(stack), pop(stack)) #define save2(reg1,reg2) (push(reg1,stack),stack->n_obj=reg2) #define restore2(reg1,reg2) (reg2 = getobject(stack), \ reg1 = car(stack), pop(stack)) #endif /* saving and restoring FIXNUMs rather than NODEs */ #define numsave(register) numpush(register,&numstack) #define numrestore(register) (register=(FIXNUM)car(numstack), numstack=cdr(numstack)) #define num2save(reg1,reg2) (numpush(reg1,&numstack),numstack->n_obj=(NODE *)reg2) #define num2restore(reg1,reg2) (reg2=(FIXNUM)getobject(numstack), \ reg1=(FIXNUM)car(numstack), numstack=cdr(numstack)) #if DEB_CONT #define newcont(tag) debprint("Newcont = " #tag); \ numsave(cont); cont = (FIXNUM)tag #else #define newcont(tag) (numsave(cont), cont = (FIXNUM)tag) #endif /* These variables are all externed in globals.h */ CTRLTYPE stopping_flag = RUN; char *logolib, *helpfiles, *csls; FIXNUM dont_fix_ift = 0; /* These variables are local to this file. */ static int trace_level = 0; /* indentation level when tracing */ /* These first few functions are externed in globals.h */ void numpush(FIXNUM obj, NODE **stack) { NODE *temp = newnode(CONT); /*GC*/ temp->n_car = (NODE *)obj; temp->n_cdr = *stack; *stack = temp; } /* forward declaration */ NODE *evaluator(NODE *list, enum labels where); /* Evaluate a line of input. */ void eval_driver(NODE *line) { evaluator(line, begin_line); } /* Evaluate a sequence of expressions until we get a value to return. * (Called from erract.) */ NODE *err_eval_driver(NODE *seq, BOOLEAN recoverable) { val_status = (recoverable ? VALUE_OK : NO_VALUE_OK) | (val_status & (OUTPUT_OK|STOP_OK)); return evaluator(seq, begin_seq); } /* The logo word APPLY. */ NODE *lapply(NODE *args) { return make_cont(begin_apply, args); } /* The logo word ? . */ NODE *lqm(NODE *args) { FIXNUM argnum = 1, i; NODE *np = qm_list; if (args != NIL) argnum = getint(pos_int_arg(args)); if (stopping_flag == THROWING) return(UNBOUND); i = argnum; while (--i > 0 && np != NIL) np = cdr(np); if (np == NIL) return(err_logo(BAD_DATA_UNREC,make_intnode(argnum))); return(car(np)); } /* The rest of the functions are local to this file. */ /* Warn the user if a local variable shadows a global one. */ void tell_shadow(NODE *arg) { if (flag__caseobj(arg, VAL_STEPPED)) err_logo(SHADOW_WARN, arg); } /* Check if a local variable is already in this frame */ int not_local(NODE *name, NODE *sp) { for ( ; sp != var; sp = cdr(sp)) { if (compare_node(car(sp),name,TRUE) == 0) { return FALSE; } } return TRUE; } /* reverse a list destructively */ NODE *reverse(NODE *list) { NODE *ret = NIL, *temp; while (list != NIL) { temp = list; list = cdr(list); setcdr(temp, ret); ret = temp; } return ret; } /* nondestructive append */ NODE *append(NODE *a, NODE *b) { if (a == NIL) return b; return cons(car(a), append(cdr(a), b)); } /* nondestructive flatten */ NODE *flatten(NODE *a) { if (a == NIL) return NIL; return append(car(a), flatten(cdr(a))); } /* Reset the var stack to the previous place holder. */ void reset_args(NODE *old_stack) { for (; var_stack != old_stack; pop(var_stack)) { if (nodetype(var_stack) & NT_LOCAL) setflag__caseobj(car(var_stack), IS_LOCAL_VALUE); else clearflag__caseobj(car(var_stack), IS_LOCAL_VALUE); setvalnode__caseobj(car(var_stack), getobject(var_stack)); } } NODE *bf3(NODE *name) { NODE *string = cnv_node_to_strnode(name); return make_strnode(getstrptr(string)+3, getstrhead(string), getstrlen(string)-3, nodetype(string), strcpy); } NODE *deep_copy(NODE *expresn) { NODE *val, **p, **q; FIXNUM arridx; if (expresn == NIL) return NIL; else if (is_list(expresn)) { val = cons(deep_copy(car(expresn)), deep_copy(cdr(expresn))); val->n_obj = deep_copy(expresn->n_obj); settype(val, nodetype(expresn)); } else if (nodetype(expresn) == ARRAY) { val = make_array(getarrdim(expresn)); setarrorg(val, getarrorg(expresn)); for (p = getarrptr(expresn), q = getarrptr(val), arridx=0; arridx < getarrdim(expresn); arridx++, p++) *q++ = deep_copy(*p); } else val = expresn; return val; } int in_eval_save = 0; void eval_save() { push(NIL, stack); int_during_gc = 0; in_eval_save = 1; settype(stack, STACK); stack->n_car = (NODE *)malloc(sizeof(regs)); if (car(stack) == NULL) { err_logo(OUT_OF_MEM_UNREC, NIL); } else { memcpy(car(stack), ®s, sizeof(regs)); } in_eval_save = 0; if (int_during_gc != 0) { delayed_int(); } } void eval_restore() { int_during_gc = 0; in_eval_save = 1; memcpy(®s, car(stack), sizeof(regs)); pop(stack); in_eval_save = 0; if (int_during_gc != 0) { delayed_int(); } } /* #ifdef OBJECTS NODE *val_eval_driver(NODE *seq) { val_status = VALUE_OK; return evaluator(seq, begin_seq); } #endif */ /* An explicit control evaluator, taken almost directly from SICP, section * 5.2. list is a flat list of expressions to evaluate. where is a label to * begin at. Return value depends on where. */ NODE *evaluator(NODE *list, enum labels where) { FIXNUM cont = 0; /* where to go next */ int i; BOOLEAN tracing = FALSE; /* are we tracing the current procedure? */ inside_evaluator++; eval_save(); var = var_stack; newcont(all_done); newcont(where); goto fetch_cont; all_done: reset_args(var); eval_restore(); if (dont_fix_ift) { ift_iff_flag = dont_fix_ift-1; dont_fix_ift = 0; } inside_evaluator--; return(val); begin_line: this_line = list; val_status = NO_VALUE_OK; newcont(end_line); begin_seq: debprint("begin_seq"); make_tree(list); if (!is_tree(list)) { val = UNBOUND; goto fetch_cont; } unev = tree__tree(list); goto eval_sequence; end_line: if (val != UNBOUND) { if (NOT_THROWING) err_logo(DK_WHAT, val); } /* val = NIL; */ goto fetch_cont; /* ----------------- EVAL ---------------------------------- */ /* Get here for actual argument, from eval_sequence (non-tail), or from tail call. */ tail_eval_dispatch: tailcall = 1; eval_dispatch: debprint("eval_dispatch"); switch (nodetype(expresn)) { case QUOTE: /* quoted literal */ val = /* deep_copy */ (node__quote(expresn)); goto fetch_cont; case COLON: /* variable */ #ifdef OBJECTS val = varValue(node__colon(expresn)); #else val = valnode__colon(expresn); #endif while (val == UNBOUND && NOT_THROWING) val = err_logo(NO_VALUE, node__colon(expresn)); goto fetch_cont; case CONS: /* procedure application */ if (tailcall == 1 && is_macro(car(expresn)) && (is_list(procnode__caseobj(car(expresn))) || isName(car(expresn), Name_goto))) { /* tail call to user-defined macro must be treated as non-tail * because the expression returned by the macro * remains to be evaluated in the caller's context */ unev = NIL; goto non_tail_eval; } fun = car(expresn); if (fun == Not_Enough_Node) { err_logo(TOO_MUCH, NIL); /* When does this happen? */ val = UNBOUND; goto fetch_cont; } if (flag__caseobj(fun, PROC_SPECFORM)) { argl = cdr(expresn); goto apply_dispatch; } if (cdr(expresn) != NIL) goto ev_application; else goto ev_no_args; case ARRAY: /* array must be copied */ val = deep_copy(expresn); goto fetch_cont; default: val = expresn; /* self-evaluating */ goto fetch_cont; } ev_no_args: /* Evaluate an application of a procedure with no arguments. */ argl = NIL; goto apply_dispatch; /* apply the procedure */ ev_application: /* Evaluate an application of a procedure with arguments. */ unev = cdr(expresn); argl = NIL; eval_arg_loop: debprint("eval_arg_loop"); if (unev == NIL) goto eval_args_done; expresn = car(unev); if (expresn == Not_Enough_Node) { if (NOT_THROWING) err_logo(NOT_ENOUGH, NIL); goto eval_args_done; } arg_from_macro: if (nodetype(expresn) != CONS) { /* Don't bother saving registers */ newcont(after_const_arg); /* if the expresn isn't a proc call */ goto eval_dispatch; } eval_save(); save(current_unode); var = var_stack; tailcall = -1; didnt_output_name = NIL; didnt_get_output = cons_list(0, fun, ufun, this_line, END_OF_LIST); val_status = VALUE_OK; /* in case of apply or catch */ newcont(accumulate_arg); goto eval_dispatch; /* evaluate the current argument */ accumulate_arg: debprint("accumulate_arg"); /* Put the evaluated argument into the argl list. */ reset_args(var); restore(current_unode); last_call = fun; if (current_unode != output_unode) { if (STOPPING || RUNNING) output_node = UNBOUND; if (stopping_flag == OUTPUT || STOPPING) { stopping_flag = RUN; val = output_node; } } if (stopping_flag == OUTPUT || STOPPING) { didnt_output_name = NIL; err_logo(DIDNT_OUTPUT, fun); } while (NOT_THROWING && val == UNBOUND) { val = err_logo(DIDNT_OUTPUT, NIL); } eval_restore(); if (stopping_flag == MACRO_RETURN) { if (val == NIL || val == UNBOUND || cdr(val) != NIL) { if (NOT_THROWING) { if (tree_dk_how != NIL && tree_dk_how != UNBOUND) err_logo(DK_HOW_UNREC, tree_dk_how); else err_logo((val!=NIL && val!=UNBOUND) ? RUNNABLE_ARG : ERR_MACRO, val); } goto eval_args_done; } expresn = car(val); stopping_flag = RUN; goto arg_from_macro; } after_const_arg: if (stopping_flag == THROWING) goto eval_args_done; push(val, argl); pop(unev); goto eval_arg_loop; eval_args_done: if (stopping_flag == THROWING) { val = UNBOUND; goto fetch_cont; } argl = reverse(argl); /* --------------------- APPLY ---------------------------- */ apply_dispatch: debprint("apply_dispatch"); /* Load in the procedure's definition and decide whether it's a compound * procedure or a primitive procedure. */ #ifdef OBJECTS extern NODE* procValueWithParent(NODE*, NODE**); NODE* parent = (NODE*)0; proc = procValueWithParent(fun, &parent); if (proc != UNDEFINED && parent != 0){ usual_parent = parent; } #else proc = procnode__caseobj(fun); #endif if (is_macro(fun)) { num2save(val_status,tailcall); save2(didnt_get_output,current_unode); didnt_get_output = the_generation; /* (cons nil nil) */ /* We want a value, but not as actual arg */ newcont(macro_return); } #ifdef OBJECTS if (proc == UNDEFINED) { /* for usual.foo support */ /* The function(fun) may be of the form usual.foo, in which case * "usual." should be stripped away, and "foo" should be * resolved in the parent(s) of the current object */ extern NODE *parent_list(NODE *obj); NODE *string = cnv_node_to_strnode(fun); // first rule out all words shorter than 8 chars if (getstrlen(string) > 6) { // check to see if name begins with "usual." if (!low_strncmp(getstrptr(string), "usual.", 6)){ usual_caller = current_object; NODE* parent = (NODE*)0; proc = getInheritedProcWithParent(make_strnode(getstrptr(string) + 6, getstrhead(string), getstrlen(string) - 6, nodetype(string), strnzcpy), usual_parent, &parent); // if a proc was found, usual_parent needs to be updated // to avoid infinite loops when usual is called multiple times if (proc != UNDEFINED) { usual_parent = parent; } } } } #endif if (proc == UNDEFINED) { /* 5.0 punctuationless variables */ if (!varTrue(AllowGetSet)) { /* No getter/setter allowed, punt */ val = err_logo(DK_HOW, fun); goto fetch_cont; } else if (argl == NIL) { /* possible var getter */ val = valnode__caseobj(fun); if (val == UNBOUND && NOT_THROWING) val = err_logo(DK_HOW, fun); else if (val != UNBOUND) { (void)ldefine(cons(fun, cons( cons(NIL,cons(cons(theName(Name_output), cons(make_colon(fun),NIL)), NIL)), NIL))); /* make real proc so no disk load next time */ setflag__caseobj(fun,PROC_BURIED); } goto fetch_cont; } else { /* var setter */ NODE *name = intern(bf3(fun)); if (valnode__caseobj(name) == UNBOUND && !(flag__caseobj(name, (HAS_GLOBAL_VALUE|IS_LOCAL_VALUE)))) { val = err_logo(DK_HOW, fun); goto fetch_cont; } (void)ldefine(cons(fun, cons( cons(Listvalue, cons(cons(Make, cons(make_quote(bf3(fun)), cons(Dotsvalue,NIL))), NIL)) ,NIL))); setflag__caseobj(fun,PROC_BURIED); argl = cons(bf3(fun), argl); if (NOT_THROWING) val = lmake(argl); goto fetch_cont; } } if (is_list(proc)) goto compound_apply; /* primitive_apply */ debprint("primitive_apply"); if (NOT_THROWING) { if ((tracing = flag__caseobj(fun, PROC_TRACED))) { for (i = 0; i < trace_level; i++) { print_space(stdout); } ndprintf(stdout, "( %s ", fun); if (argl != NIL) { arg = argl; while (arg != NIL) { print_node(stdout, maybe_quote(car(arg))); print_space(stdout); arg = cdr(arg); } } print_char(stdout, ')'); new_line(stdout); } val = (*getprimfun(proc))(argl); if (tracing && NOT_THROWING) { for (i = 0; i < trace_level; i++) { print_space(stdout); } print_node(stdout, fun); if (val == UNBOUND) ndprintf(stdout, " %t\n", message_texts[TRACE_STOPS]); else { ndprintf(stdout, " %t %s\n", message_texts[TRACE_OUTPUTS], maybe_quote(val)); } } } else val = UNBOUND; /* falls into fetch_cont */ #if DEB_CONT #define do_case(x) case x: debprint("Fetch_cont = " #x); goto x; #else #define do_case(x) case x: goto x; #endif fetch_cont: { enum labels x = (enum labels)cont; cont = (FIXNUM)car(numstack); numstack=cdr(numstack); switch (x) { do_list(do_case) default: abort(); } } /* ----------------- COMPOUND_APPLY ---------------------------------- */ compound_apply: debprint("compound_apply"); #ifdef mac check_mac_stop(); #endif #ifdef ibm check_ibm_stop(); #endif #ifdef HAVE_WX check_wx_stop(0); #endif if ((tracing = flag__caseobj(fun, PROC_TRACED))) { for (i = 0; i < trace_level; i++) print_space(writestream); trace_level++; ndprintf(writestream, "( %s ", fun); } /* Bind the actuals to the formals */ lambda_apply: vsp = var_stack; /* remember where we came in */ for (formals = formals__procnode(proc); formals != NIL; formals = cdr(formals)) { parm = car(formals); if (nodetype(parm) == INT) break; /* default # args */ if (argl != NIL) { arg = car(argl); if (tracing) { print_node(writestream, maybe_quote(arg)); print_space(writestream); } } else arg = UNBOUND; if (nodetype(parm) == CASEOBJ) { if (not_local(parm,vsp)) { push(parm, var_stack); if (flag__caseobj(parm, IS_LOCAL_VALUE)) settype(var_stack, LOCALSAVE); var_stack->n_obj = valnode__caseobj(parm); setflag__caseobj(parm, IS_LOCAL_VALUE); } tell_shadow(parm); setvalnode__caseobj(parm, arg); if (arg == UNBOUND) err_logo(NOT_ENOUGH, fun); } else if (nodetype(parm) == CONS) { /* parm is optional or rest */ if (not_local(car(parm),vsp)) { push(car(parm), var_stack); if (flag__caseobj(car(parm), IS_LOCAL_VALUE)) settype(var_stack, LOCALSAVE); var_stack->n_obj = valnode__caseobj(car(parm)); setflag__caseobj(car(parm), IS_LOCAL_VALUE); } tell_shadow(car(parm)); if (cdr(parm) == NIL) { /* parm is rest */ setvalnode__caseobj(car(parm), argl); if (tracing) { if (argl != NIL) pop(argl); while (argl != NIL) { arg = car(argl); print_node(writestream, maybe_quote(arg)); print_space(writestream); pop(argl); } } else argl = NIL; break; } if (arg == UNBOUND) { /* use default */ eval_save(); save(current_unode); var = var_stack; tailcall = -1; list = cdr(parm); didnt_get_output = cons_list(0, fun, ufun, list, END_OF_LIST); didnt_output_name = NIL; if (NOT_THROWING) make_tree(list); else list = NIL; if (!is_tree(list)) { val = UNBOUND; goto set_args_continue; } unev = tree__tree(list); val = UNBOUND; expresn = car(unev); pop(unev); if (unev != NIL) { err_logo(BAD_DEFAULT, parm); val = UNBOUND; goto set_args_continue; } newcont(set_args_continue); goto eval_dispatch; set_args_continue: if (stopping_flag == MACRO_RETURN) { if (val == NIL || val == UNBOUND || cdr(val) != NIL) { if (NOT_THROWING) err_logo((val!=NIL && val!=UNBOUND) ? RUNNABLE_ARG : ERR_MACRO, val); } else { reset_args(var); expresn = car(val); stopping_flag = RUN; didnt_get_output = cons_list(0, fun, ufun, list, END_OF_LIST); didnt_output_name = NIL; tailcall = -1; newcont(set_args_continue); goto eval_dispatch; } } restore(current_unode); last_call = fun; if (current_unode != output_unode) { if (STOPPING || RUNNING) output_node = UNBOUND; if (stopping_flag == OUTPUT || STOPPING) { stopping_flag = RUN; val = output_node; } } if (stopping_flag == OUTPUT || STOPPING) { didnt_output_name = NIL; err_logo(DIDNT_OUTPUT, fun); } while (NOT_THROWING && val == UNBOUND) { val = err_logo(DIDNT_OUTPUT, NIL); } reset_args(var); eval_restore(); parm = car(formals); if (stopping_flag == THROWING) { val = UNBOUND; goto fetch_cont; } arg = val; } setvalnode__caseobj(car(parm), arg); } if (argl != NIL) pop(argl); } if (argl != NIL) { err_logo(TOO_MUCH, fun); } if (check_throwing) { val = UNBOUND; goto fetch_cont; } vsp = NIL; if ((tracing = !is_list(fun) && flag__caseobj(fun, PROC_TRACED))) { if (NOT_THROWING) print_char(writestream, ')'); new_line(writestream); save(fun); newcont(compound_apply_continue); } last_ufun = ufun; if (!is_list(fun)) ufun = fun; last_line = this_line; this_line = NIL; /* proc = (is_list(fun) ? anonymous_function(fun) : procnode__caseobj(fun)); */ /* If that's uncommented, begin_apply must get proc from fun, not expresn */ list = bodylist__procnode(proc); /* get the body ... */ make_tree_from_body(list); if (!is_tree(list) || treepair__tree(list)==NIL) { val = UNBOUND; goto fetch_cont; } debprint("treeified body"); /* printf("list = 0x%x = ",list); dbprint(list); */ unev = tree__tree(list); if (NOT_THROWING) stopping_flag = RUN; output_node = UNBOUND; if (didnt_get_output == UNBOUND) val_status = NO_VALUE_OK | STOP_OK | STOP_TAIL; else if (didnt_get_output == NIL) val_status = NO_VALUE_OK | STOP_OK | STOP_TAIL | OUTPUT_OK | OUTPUT_TAIL; else val_status = OUTPUT_OK | OUTPUT_TAIL; if (didnt_output_name == NIL) didnt_output_name = fun; current_unode = cons(NIL,NIL); /* a marker for this proc call */ /* ----------------- EVAL_SEQUENCE ---------------------------------- */ /* Fall through from proc body, call from start or fsubr argument */ eval_sequence: debprint("eval_sequence"); /* Evaluate each expression in the sequence. Most of the complexity is in recognizing tail calls. */ if (eval_buttonact != NIL) { make_tree(eval_buttonact); if (NOT_THROWING) { if (is_tree(eval_buttonact)) { unev = append(tree__tree(eval_buttonact), unev); eval_buttonact = NIL; } } } if (!RUNNING) goto fetch_cont; if (nodetype(unev) == LINE) { if (the_generation != (generation__line(unev))) { /* something redefined while we're running */ int linenum = 0; this_line = tree__tree(bodylist__procnode(proc)); while (this_line != unev) { /* If redef isn't end of line, don't try to fix, but don't blow up either. (Maybe not called from here.) */ if (this_line == NULL) goto nofix; if (nodetype(this_line) == LINE) linenum++; this_line = cdr(this_line); } untreeify_proc(proc); make_tree_from_body(bodylist__procnode(proc)); unev = tree__tree(bodylist__procnode(proc)); while (--linenum >= 0) { do pop(unev); while (unev != NIL && nodetype(unev) != LINE); } } nofix: this_line = unparsed__line(unev); if (ufun != NIL && flag__caseobj(ufun, PROC_STEPPED)) { if (tracing) { int i = 1; while (i++ < trace_level) print_space(stdout); } print_node(stdout, this_line); (void)reader(stdin, " >>> "); } } expresn = car(unev); pop(unev); if (expresn != NIL && is_list(expresn) && (is_tailform(procnode__caseobj(car(expresn))))) { i = (int)getprimpri(procnode__caseobj(car(expresn))); if (i == OUTPUT_PRIORITY) { if (cadr(expresn) == Not_Enough_Node) { err_logo(NOT_ENOUGH,car(expresn)); val = UNBOUND; goto fetch_cont; } didnt_output_name = NIL; if (val_status & OUTPUT_TAIL) { didnt_get_output = cons_list(0,car(expresn),ufun,this_line, END_OF_LIST); fun = car(expresn); expresn = cadr(expresn); val_status = VALUE_OK; goto tail_eval_dispatch; } else if (val_status & OUTPUT_OK) { goto tail_eval_dispatch; } else if (ufun == NIL) { err_logo(AT_TOPLEVEL,car(expresn)); val = UNBOUND; goto fetch_cont; } else if (val_status & STOP_OK) { didnt_get_output = cons_list(0,car(expresn),ufun,this_line, END_OF_LIST); val_status = VALUE_OK; expresn = cadr(expresn); newcont(op_want_stop); goto eval_dispatch; op_want_stop: if (NOT_THROWING) err_logo(DK_WHAT_UP, val); goto fetch_cont; } else if (val_status & VALUE_OK) { /* pr apply [output ?] [3] */ debprint("Op with VALUE_OK"); didnt_output_name = fun; goto tail_eval_dispatch; } else { debprint("Op with none of the above"); goto tail_eval_dispatch; } } else if (i == STOP_PRIORITY) { if (ufun == NIL) { err_logo(AT_TOPLEVEL,car(expresn)); } else if (val_status & STOP_TAIL) { } else if (val_status & STOP_OK) { stopping_flag = STOP; output_unode = current_unode; } else if (val_status & OUTPUT_OK) { if (NOT_THROWING) { if (didnt_get_output == NIL || didnt_get_output == UNBOUND) { /* actually can happen: PRINT FOREACH ... will give didn't output message uplevel */ } else err_logo(DIDNT_OUTPUT, NIL); } } else { /* show runresult [stop] inside a procedure */ didnt_output_name = car(expresn); if (NOT_THROWING) { if (didnt_get_output == NIL || didnt_get_output == UNBOUND) { /* actually can happen: STOP during PAUSE */ err_logo(AT_TOPLEVEL, car(expresn)); } else err_logo(DIDNT_OUTPUT, NIL); } } val = UNBOUND; goto fetch_cont; } else { /* maybeoutput */ debprint("maybeoutput"); if (cadr(expresn) == Not_Enough_Node) { err_logo(NOT_ENOUGH,car(expresn)); val = UNBOUND; goto fetch_cont; } if (ufun == NIL) { err_logo(AT_TOPLEVEL,car(expresn)); val = UNBOUND; goto fetch_cont; } if (val_status & OUTPUT_TAIL) { didnt_output_name = NIL; if (val_status & STOP_TAIL) { expresn = cadr(expresn); didnt_get_output = NIL; val_status = VALUE_OK | NO_VALUE_OK; } else { didnt_get_output = cons_list(0,car(expresn),ufun, this_line,END_OF_LIST); expresn = cadr(expresn); val_status = VALUE_OK; } goto tail_eval_dispatch; } else if (val_status & OUTPUT_OK) { didnt_output_name = NIL; if (val_status & STOP_OK) { didnt_get_output = NIL; val_status = NO_VALUE_OK | VALUE_OK; expresn = cadr(expresn); newcont(after_maybeoutput); goto eval_dispatch; after_maybeoutput: if (val == UNBOUND) lstop(NIL); else loutput(cons(val, NIL)); goto fetch_cont; } else { goto eval_dispatch; } } else if (val_status & STOP_TAIL) { expresn = cadr(expresn); didnt_get_output = UNBOUND; val_status = NO_VALUE_OK; goto tail_eval_dispatch; } else if (val_status & STOP_OK) { expresn = cadr(expresn); didnt_get_output = UNBOUND; val_status = NO_VALUE_OK; newcont(after_maybeoutput); goto eval_dispatch; } else { goto tail_eval_dispatch; } } } if (unev == NIL) { /* falling off tail of sequence */ debprint("falling off"); if (val_status & NO_VALUE_OK) { if (val_status & VALUE_OK) /* from runresult */ didnt_get_output = NIL; else didnt_get_output = UNBOUND; } else if (val_status & VALUE_OK) { } else if (val_status & OUTPUT_OK) { next_stop_want_output: save(didnt_get_output); didnt_get_output = UNBOUND; val_status &= ~OUTPUT_TAIL; newcont(fall_off_want_output); goto tail_eval_dispatch; fall_off_want_output: restore(didnt_get_output); if (stopping_flag == OUTPUT) { goto fetch_cont; /* repeat body did output */ } if (NOT_THROWING && val != UNBOUND) { /* Don't allow just value expr w/o OUTPUT */ err_logo(DK_WHAT, val); } goto fetch_cont; } goto tail_eval_dispatch; } if (car(unev) != NIL && is_list(car(unev)) && /* next is STOP */ (is_tailform(procnode__caseobj(car(car(unev))))) && getprimpri(procnode__caseobj(car(car(unev)))) == STOP_PRIORITY) { if (val_status & STOP_TAIL) { didnt_get_output = UNBOUND; goto tail_eval_dispatch; } else if (val_status & STOP_OK) { goto non_tail_eval; } else if (val_status & OUTPUT_OK) { goto next_stop_want_output; } /* else treat as non-tail and the STOP will be caught later */ } non_tail_eval: debprint("non_tail_eval"); if (nodetype(expresn) != CONS) { /* Don't bother saving registers */ newcont(after_constant); /* if the expresn isn't a proc call */ goto eval_dispatch; } eval_save(); didnt_get_output = UNBOUND; /* tell EVAL we don't want a value */ tailcall = 0; if (nodetype(expresn) == CONS && is_prim(procnode__caseobj(car(expresn)))) { newcont(no_reset_args); /* primitive */ } else { var = var_stack; newcont(eval_sequence_continue); } goto eval_dispatch; eval_sequence_continue: reset_args(var); no_reset_args: /* allows catch "foo [local ...] to work */ eval_restore(); if (dont_fix_ift) { ift_iff_flag = dont_fix_ift-1; dont_fix_ift = 0; } debprint("eval_sequence_continue"); if (stopping_flag == MACRO_RETURN) { if (val != NIL && is_list(val) && (isName(car(val), Name_tag))) unev = cdr(val); /* from goto */ else unev = append(val, unev); val = UNBOUND; stopping_flag = RUN; if (unev == NIL) goto fetch_cont; } else { if (current_unode != output_unode) { if (STOPPING || RUNNING) output_node = UNBOUND; if (stopping_flag == OUTPUT || STOPPING) { stopping_flag = RUN; val = output_node; goto fetch_cont; } } } after_constant: if (val != UNBOUND && NOT_THROWING) { err_logo(DK_WHAT, val); val = UNBOUND; } if (NOT_THROWING && unev == NIL) { goto fetch_cont; } goto eval_sequence; compound_apply_continue: /* Only get here if tracing */ restore(parm); /* saved from fun */ --trace_level; if (NOT_THROWING) { for (i = 0; i < trace_level; i++) print_space(writestream); print_node(writestream, parm); if (val == UNBOUND) ndprintf(writestream, " %t\n", message_texts[TRACE_STOPS]); else { ndprintf(writestream, " %t %s\n", message_texts[TRACE_OUTPUTS], maybe_quote(val)); } } goto fetch_cont; /* --------------------- MACROS ---------------------------- */ macro_return: restore2(didnt_get_output,current_unode); num2restore(val_status,tailcall); debprint("macro_return"); if (current_unode != output_unode) { if (STOPPING || RUNNING) output_node = UNBOUND; if (stopping_flag == OUTPUT || STOPPING) { stopping_flag = RUN; val = output_node; } } while (!is_list(val) && NOT_THROWING) { val = err_logo(ERR_MACRO,val); } if (NOT_THROWING) { if (didnt_get_output != UNBOUND) didnt_output_name = fun; if (is_cont(val)) { newcont(cont__cont(val)); val = val__cont(val); goto fetch_cont; } if (tailcall <= 0) { list = val; make_tree(list); if (NOT_THROWING) { stopping_flag = MACRO_RETURN; if (!is_tree(list)) val = NIL; else val = tree__tree(list); } else val = UNBOUND; goto fetch_cont; } list = val; goto begin_seq; } val = UNBOUND; goto fetch_cont; #define RUNRESULT_OUTPUT_LEGAL 0 runresult_continuation: list = val; #if RUNRESULT_OUTPUT_LEGAL val_status |= VALUE_OK | NO_VALUE_OK; val_status &= ~(STOP_TAIL | OUTPUT_TAIL); #else val_status = VALUE_OK | NO_VALUE_OK | OUTPUT_OK | STOP_OK; /* output and stop are not okay, but we give our own err message */ #endif save(current_unode); newcont(runresult_followup); goto begin_seq; runresult_followup: restore(current_unode); debprint("runresult_followup"); if (current_unode != output_unode) { if (STOPPING || RUNNING) output_node = UNBOUND; if (stopping_flag == OUTPUT || STOPPING) { stopping_flag = RUN; val = output_node; } } if (STOPPING || stopping_flag == OUTPUT) err_logo(RUNRES_STOP, NIL); if (val == UNBOUND) { val = NIL; } else { val = cons(val, NIL); } goto fetch_cont; repeat_continuation: list = cdr(val); num2save(repcount,user_repcount); repcount = getint(car(val)); user_repcount = 0; repeat_again: val = UNBOUND; if (repcount == 0) { repeat_done: num2restore(repcount,user_repcount); goto fetch_cont; } user_repcount++; save2(list,var); var = var_stack; num2save(repcount,user_repcount); num2save(val_status,tailcall); val_status &= ~(VALUE_OK|OUTPUT_TAIL|STOP_TAIL); if (tailcall == 0) val_status |= NO_VALUE_OK; /* embedded repeat */ newcont(repeat_followup); goto begin_seq; repeat_followup: if (val != UNBOUND && NOT_THROWING) { err_logo(DK_WHAT, val); } num2restore(val_status,tailcall); num2restore(repcount,user_repcount); reset_args(var); restore2(list,var); if (current_unode != output_unode) { debprint("rep_foll tailcall"); if (STOPPING || RUNNING) output_node = UNBOUND; if (stopping_flag == OUTPUT || STOPPING) { stopping_flag = RUN; val = output_node; goto repeat_done; } } if (repcount > 0) /* negative means forever */ --repcount; #ifdef mac check_mac_stop(); #endif #ifdef ibm check_ibm_stop(); #endif if (RUNNING) goto repeat_again; val = UNBOUND; goto repeat_done; catch_continuation: list = cdr(val); catch_tag = car(val); if (isName(catch_tag, Name_error)) { push(Erract, var_stack); if (flag__caseobj(Erract, IS_LOCAL_VALUE)) settype(var_stack, LOCALSAVE); var_stack->n_obj = valnode__caseobj(Erract); setflag__caseobj(Erract, IS_LOCAL_VALUE); setvalnode__caseobj(Erract, UNBOUND); } save2(didnt_output_name,didnt_get_output); num2save(val_status,tailcall); save2(current_unode,catch_tag); newcont(catch_followup); val_status &= ~(STOP_TAIL | OUTPUT_TAIL); goto begin_seq; catch_followup: restore2(current_unode,catch_tag); num2restore(val_status,tailcall); restore2(didnt_output_name,didnt_get_output); if (current_unode != output_unode) { if (STOPPING || RUNNING) output_node = UNBOUND; if (stopping_flag == OUTPUT || STOPPING) { stopping_flag = RUN; val = output_node; goto fetch_cont; } } if (NOT_THROWING && val != UNBOUND && !(val_status & VALUE_OK)) err_logo(DK_WHAT, val); if (stopping_flag == THROWING && ((compare_node(throw_node, catch_tag, TRUE) == 0) || (isName(throw_node, Name_error) && isName(catch_tag, Name_error)))) { throw_node = UNBOUND; stopping_flag = RUN; val = output_node; } goto fetch_cont; #ifdef OBJECTS withobject_continuation: save2(didnt_output_name,didnt_get_output); num2save(val_status,tailcall); save2(current_unode,current_object); newcont(withobject_followup); current_object = car(val); usual_parent = current_object; newcont(cont__cont(cdr(val))); list = val = val__cont(cdr(val)); val_status &= ~(STOP_TAIL | OUTPUT_TAIL); goto fetch_cont; withobject_followup: restore2(current_unode,current_object); num2restore(val_status,tailcall); restore2(didnt_output_name,didnt_get_output); usual_parent = current_object; if (current_unode != output_unode) { if (STOPPING || RUNNING) output_node = UNBOUND; if (stopping_flag == OUTPUT || STOPPING) { stopping_flag = RUN; val = output_node; goto fetch_cont; } } if (NOT_THROWING && val != UNBOUND && !(val_status & VALUE_OK)) err_logo(DK_WHAT, val); goto fetch_cont; #endif /* OBJECTS */ goto_continuation: if (NOT_THROWING) { if (ufun == NIL) { err_logo(AT_TOPLEVEL, theName(Name_goto)); val = UNBOUND; goto fetch_cont; } proc = procnode__caseobj(ufun); list = bodylist__procnode(proc); unev = tree__tree(list); while (unev != NIL && !check_throwing) { if (nodetype(unev) == LINE) this_line = unparsed__line(unev); expresn = car(unev); pop(unev); if (is_list (expresn) && (isName(car(expresn), Name_tag)) && (nodetype(cadr(expresn)) == QUOTE) && compare_node(val, node__quote(cadr(expresn)), TRUE) == 0) { val = cons(theName(Name_tag), unev); stopping_flag = MACRO_RETURN; goto fetch_cont; } } err_logo(BAD_DATA_UNREC, val); } val = UNBOUND; goto fetch_cont; begin_apply: /* This is for lapply. */ expresn = car(val); while (nodetype(expresn) == ARRAY && NOT_THROWING) expresn = err_logo(APPLY_BAD_DATA, expresn); argl = append(cadr(val), NIL); val = UNBOUND; while (!is_list(argl) && NOT_THROWING) argl = err_logo(APPLY_BAD_DATA, argl); if (NOT_THROWING && expresn != NIL) { if (is_list(expresn)) { /* template */ if (is_list(car(expresn)) && cdr(expresn) != NIL) { if (is_list(cadr(expresn))) { /* procedure text form [[param ...] [instr ...] ...] */ proc = anonymous_function(expresn); debprint("anon func"); if (stopping_flag == THROWING) goto fetch_cont; tracing = 0; if (tailcall <= 0) { save(var); var = var_stack; newcont(after_lambda); } goto lambda_apply; } /* lambda form [[param ...] instr ...] */ formals = car(expresn); if (tailcall <= 0) { save(var); var = var_stack; newcont(after_lambda); } /* numsave(tailcall); */ tailcall = 0; llocal(formals); /* bind the formals locally */ /* numrestore(tailcall); */ for ( ; formals != NIL && argl != NIL && NOT_THROWING; formals = cdr(formals), argl = cdr(argl)) setvalnode__caseobj(car(formals), car(argl)); if (formals != NIL) { err_logo(NOT_ENOUGH, expresn); goto fetch_cont; } else if (argl != NIL) { err_logo(DK_WHAT, car(argl)); goto fetch_cont; } list = cdr(expresn); goto lambda_qm; } else { /* question-mark form [instr ...] */ qm_list = argl; list = expresn; lambda_qm: make_tree(list); if (list == NIL || !is_tree(list)) { goto fetch_cont; } unev = tree__tree(list); if (tailcall <= 0) { val_status &= ~(STOP_TAIL | OUTPUT_TAIL); save(var); var = var_stack; newcont(after_lambda); } goto eval_sequence; } } else { /* name of procedure to apply */ int min, max, n; NODE *arg; fun = intern(expresn); check_library(fun); proc = procnode__caseobj(fun); while (proc == UNDEFINED && NOT_THROWING) { val = err_logo(DK_HOW_UNREC, fun); } if (NOT_THROWING) { if (nodetype(proc) == CONS) { min = getint(minargs__procnode(proc)); max = getint(maxargs__procnode(proc)); } else { if (getprimdflt(proc) < 0) { /* special form */ err_logo(DK_HOW_UNREC, fun); /* can't apply */ goto fetch_cont; } else { min = getprimmin(proc); if (min == OK_NO_ARG) min = 0; max = getprimmax(proc); } } for (n = 0, arg = argl; arg != NIL; n++, arg = cdr(arg)); if (n < min) { err_logo(NOT_ENOUGH, NIL); } else if (n > max && max >= 0) { err_logo(TOO_MUCH, fun); } else { if (tailcall <= 0) { save(var); var = var_stack; newcont(after_lambda); } goto apply_dispatch; } } } } goto fetch_cont; after_lambda: reset_args(var); restore(var); goto fetch_cont; } ucblogo-6.1/makefile.msys0000664000175000017500000001001713601420003013570 0ustar jjcjjcCC = gcc CFLAGS = -g -O -DHAVE_WX -DX_DISPLAY_MISSING -O0 CXX = g++ CXXFLAGS = -DHAVE_WX -I$(HOME)/wxWidgets-3.0.4/include -I$(HOME)/wxWidgets-3.0.4/lib/gcc_lib/mswu -D__WXDEBUG__ -D__WXMSW__ -mthreads LDFLAGS = -mwindows WX_LIB_LOC = $(HOME)/wxWidgets-3.0.4/lib/gcc_lib/ LIBS = -lm -L/usr/local/lib -mwindows -mthreads -mwindows -Wl,--subsystem,windows -mwindows -L$(WX_LIB_LOC) -lwxmsw30u_richtext -lwxmsw30u_aui -lwxmsw30u_html -lwxmsw30u_adv -lwxmsw30u_core -lwxbase30u_net -lwxbase30u -lwxregexu -lwxtiff -lwxjpeg -lwxpng -lwxzlib -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -lctl3d32 -ladvapi32 -lwsock32 -lgdi32 prefix = /c/ucblogo BINDIR = $(prefix)/bin LIBLOC = $(prefix)/lib/logo LINKER = $(CXX) # LIBLOC = `pwd` OBJS = coms.o error.o eval.o files.o graphics.o init.o intern.o \ libloc.o lists.o logodata.o main.o math.o mem.o paren.o parse.o \ print.o wrksp.o nographics.o git.o wxMain.o wxTerminal.o wxTurtleGraphics.o TextEditor.o wxterm.o SRCS = coms.c error.c eval.c files.c graphics.c init.c intern.c config.h \ libloc.c lists.c logodata.c main.c math.c mem.c paren.c parse.c \ print.c wrksp.c nographics.c wxMain.cpp wxTerminal.cpp wxTurtleGraphics.cpp TextEditor.cpp wxterm.c HDRS = globals.h logo.h xgraphics.h all: logo.exe logolib/Messages helpfiles helpfiles/HELPCONTENTS mem.o: mem.c $(CC) $(CFLAGS) -O0 -c mem.c logo.exe: $(OBJS) windres logo_win.rc -O coff -o logo_win.res $(LINKER) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) logo_win.res -o logo.exe git.c: $(SRCS) echo 'char* GIT = "('`git describe||echo NA|tr -d '\r'`')";' > git.c config.h: config.h.msys cp config.h.msys config.h tags: $(SRCS) ctags --format=1 -N $(SRCS) $(HDRS) # ctags -t $(SRCS) $(HDRS) libloc.c: echo 'char *libloc="'$(LIBLOC)'/logolib";' > libloc.c echo 'char *helploc="'$(LIBLOC)'/helpfiles";' >> libloc.c echo 'char *cslsloc="'$(LIBLOC)'/csls";' >> libloc.c echo 'char *temploc="/tmp";' >> libloc.c echo 'char *separator="/";' >> libloc.c logolib/Messages: makelib Messages chmod +x makelib ./makelib cp -f Messages logolib helpfiles: mkdir helpfiles helpfiles/HELPCONTENTS: makehelp usermanual ./makehelp sort helptemp | pr -5 -t -w80 >> helpfiles/HELPCONTENTS rm helptemp makehelp: makehelp.c $(CC) -o makehelp makehelp.c clean: rm -f *.o libloc.c rm -Rf UCBLogo/ ship: rm -f config.h config.cache config.log config.status rm -f makefile makehelp logo *.o libloc.c cd docs; $(MAKE) ship install_win: all for d in $(BINDIR) $(LIBLOC) $(LIBLOC)/logolib $(LIBLOC)/helpfiles $(LIBLOC)/csls $(LIBLOC)/source; do [ -d $$d ] || mkdir -p $$d || exit 1; done cp logo.exe $(BINDIR)/ucblogo.exe cp /mingw/bin/libgcc_s_dw2-1.dll /mingw/bin/libstdc++-6.dll $(BINDIR)/ cp -f logolib/* $(LIBLOC)/logolib/. cp -f helpfiles/* $(LIBLOC)/helpfiles/. cp -f csls/* $(LIBLOC)/csls/. cp -f LICENSE $(LIBLOC)/ cp -f README.md $(LIBLOC)/README.txt cp -f *.[ch]* makefile.msys ucblogo.xpm logo_win.rc logologo.ico makelib Messages docs/usermanual.texi $(LIBLOC)/source/ cp -f docs/usermanual.pdf $(LIBLOC)/ #(cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE) install) # prefix=$(prefix); LIBLOC=$(LIBLOC); BINDIR=$(BINDIR); export prefix LIBLOC BINDIR; cd emacs; $(MAKE) install make-docs: (cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) $(MAKE) all) ucblogo.zip : logo.exe mkdir -p UCBLogo cp logo.exe UCBLogo/ cp -a logolib UCBLogo/ cp /mingw/bin/libgcc_s_dw2-1.dll /mingw/bin/libstdc++-6.dll UCBLogo/ zip -r ucblogo.zip UCBLogo #Note, to figure out which dlls are needed, use: # objdump.exe -x logo.exe | grep -i 'DLL Name' mac: all mkdir -p UCBLogo.app mkdir -p UCBLogo.app/Contents cp Info.plist UCBLogo.app/Contents/ cp PkgInfo UCBLogo.app/Contents/ cp pbdevelopment.plist UCBLogo.app/Contents/ mkdir -p UCBLogo.app/Contents/Resources cp -r csls UCBLogo.app/Contents/Resources/ cp -r helpfiles UCBLogo.app/Contents/Resources/ cp -r logolib UCBLogo.app/Contents/Resources/ mkdir -p UCBLogo.app/Contents/MacOS/ cp logo UCBLogo.app/Contents/MacOS/UCBLogo ucblogo-6.1/logo_win.rc0000664000175000017500000000003413577775701013275 0ustar jjcjjclogologo ICON "logologo.ico"ucblogo-6.1/config.h.msys0000664000175000017500000000003013577775701013536 0ustar jjcjjc#define RETSIGTYPE void ucblogo-6.1/inno/0000775000175000017500000000000013601420024012045 5ustar jjcjjcucblogo-6.1/inno/ucblogo.iss0000664000175000017500000000745113601420003014223 0ustar jjcjjc; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! [Setup] AppName=Berkeley Logo AppVerName=Berkeley Logo 6.1 AppVersion=6.1 AppPublisher=University of California, Berkeley AppPublisherURL=http://www.cs.berkeley.edu/~bh/logo.html AppSupportURL=https://github.com/jrincayc/ucblogo-code/issues AppUpdatesURL=https://github.com/jrincayc/ucblogo-code/releases OutputBaseFilename=ucblogo61setup OutputDir=. DefaultDirName={autopf}\UCBLogo DefaultGroupName=Berkeley Logo DisableStartupPrompt=yes DisableProgramGroupPage=yes AllowNoIcons=yes WindowStartMaximized=no LicenseFile=..\LICENSE PrivilegesRequiredOverridesAllowed=dialog commandline [Components] Name: "program"; Description: "Program Files"; Types: full compact custom; Flags: fixed Name: "help"; Description: "Help Files"; Types: full compact custom Name: "csls"; Description: "Programs from Computer Science Logo Style"; Types: full compact custom Name: "pdf"; Description: "User Manual in PDF format"; Types: full custom Name: "source"; Description: "Source Files"; Types: full custom [Tasks] Name: "programmenu"; Description: "Create a Program menu entry"; GroupDescription: "Shortcuts:" Name: "desktopicon"; Description: "Create a &desktop icon"; GroupDescription: "Shortcuts:"; MinVersion: 4,4 Name: "quicklaunchicon"; Description: "Create a &Quick Launch icon"; GroupDescription: "Shortcuts:"; MinVersion: 4,4; Flags: unchecked [Files] Source: "C:\ucblogo\bin\ucblogo.exe"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Components: program Source: "C:\ucblogo\bin\*.dll"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Components: program Source: "C:\UCBLOGO\lib\logo\CSLS\*.*"; DestDir: "{app}\CSLS"; CopyMode: alwaysoverwrite; Components: csls Source: "C:\UCBLOGO\lib\logo\HELPFILES\*.*"; DestDir: "{app}\HELPFILE"; CopyMode: alwaysoverwrite; Components: help Source: "C:\UCBLOGO\lib\logo\LOGOLIB\*.*"; DestDir: "{app}\LOGOLIB"; CopyMode: alwaysoverwrite; Components: program Source: "C:\UCBLOGO\lib\logo\LICENSE"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Components: program Source: "C:\UCBLOGO\lib\logo\README.txt"; DestDir: "{app}"; CopyMode: alwaysoverwrite; Components: program Source: "C:\UCBLOGO\lib\logo\usermanual.pdf"; DestDir: "{app}\DOCS"; CopyMode: alwaysoverwrite; Components: pdf Source: "C:\UCBLOGO\lib\logo\SOURCE\*.*"; DestDir: "{app}\SOURCE"; CopyMode: alwaysoverwrite; Components: source [Icons] Name: "{group}\Berkeley Logo"; Filename: "{app}\ucblogo.exe"; WorkingDir: "{app}"; Tasks: programmenu Name: "{autodesktop}\Berkeley Logo"; Filename: "{app}\ucblogo.exe"; WorkingDir: "{app}"; MinVersion: 4,4; Tasks: desktopicon [Registry] Root: HKA; Subkey: "Software\UCB"; Flags: uninsdeletekeyifempty Root: HKA; Subkey: "Software\UCB\UCBLogo"; Flags: uninsdeletekey Root: HKA; Subkey: "Software\UCB\UCBLogo"; ValueType: string; ValueName: "LOGOLIB"; ValueData: "{app}\LOGOLIB" Root: HKA; Subkey: "Software\UCB\UCBLogo"; ValueType: string; ValueName: "HELPFILE"; ValueData: "{app}\HELPFILE" Root: HKA; Subkey: "Software\UCB\UCBLogo"; ValueType: string; ValueName: "CSLS"; ValueData: "{app}\CSLS" [Messages] WelcomeLabel2=This will install [name/ver] on your computer.%n%nThis installer was created with the freeware Inno Setup Compiler by Jordan Russell with portions by Martijn Laan.%nhttp://www.jrsoftware.org/isinfo.php LicenseLabel=UCBLogo is free, and has NO WARRANTY. (See sections 15 and 16 below.)%nThe other license provisions are only about distributing Logo to other people. ComponentsDiskSpaceMBLabel=Current selection requires at least [kb] KB of disk space. [Run] Filename: "notepad.exe"; Parameters: "{app}\README"; Description: "View README file"; Flags: postinstall skipifsilent Filename: "{app}\ucblogo.exe"; WorkingDir: "{app}"; Description: "Launch Berkeley Logo"; Flags: postinstall skipifsilent ucblogo-6.1/ztcterm.h0000664000175000017500000001045613575571772013004 0ustar jjcjjc/* * ztcterm.h IBM-specific graphics macros mak * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #define GR_SIZE 15000 #define prepare_to_draw gr_mode() #define done_drawing nop() #define prepare_to_draw_turtle nop() #define done_drawing_turtle nop() #define screen_left 0 #define screen_right (MaxX) #define screen_top 0 #define screen_bottom (ibm_screen_bottom) #define max_screen_bottom (MaxY) #define screen_height (1 + screen_bottom - screen_top) #define max_screen_height (1 + max_screen_bottom - screen_top) #define screen_width (1 + screen_right - screen_left) #define screen_x_center (screen_left + (screen_width)/2) #define screen_y_center (screen_top + (max_screen_height)/2) #define turtle_left_max ((screen_left) - (screen_x_center)) #define turtle_right_max ((screen_right) - (screen_x_center)) #define turtle_top_max ((screen_y_center) - (screen_top)) #define turtle_bottom_max ((screen_y_center) - (screen_bottom)) #define screen_x_coord ((screen_x_center) + turtle_x) #define screen_y_coord ((screen_y_center) - turtle_y) #define turtle_height t_height() #define turtle_half_bottom t_half_bottom() #define turtle_side t_side() #define clear_screen erase_screen() #define line_to(x,y) {if (current_vis==0) lineto((int)x,(int)y); else moveto((int)x,(int)y);} #define move_to(x,y) moveto((int)x,(int)y) #define draw_string(s) outtext((char *)s) #define set_pen_vis(v) current_vis = v #define set_pen_mode(m) set_ibm_pen_mode(m) #define set_pen_color(c) {ztc_set_penc(c);} #define set_back_ground(c) {ztc_set_bg(c);} #define set_pen_width(w) {ztc_penwidth = w;} #define set_pen_height(h) {ztc_penwidth = h;} #define set_pen_x(x) moveto((int)x, ztc_y) #define set_pen_y(y) moveto(ztc_x, (int)y) /* pen_info is a stucture type with fields for the various pen characteristics including the location, size, color, mode (e.g. XOR or COPY), pattern, visibility (0 = visible) */ typedef struct { int h; int v; int vis; int width; int color; char pattern[8]; int mode; } pen_info; #define p_info_x(p) p.h #define p_info_y(p) p.v #define pen_width ztc_penwidth #define pen_height ztc_penwidth #define pen_mode get_ibm_pen_mode() #define pen_vis current_vis #define pen_x ztc_x #define pen_y ztc_y #define get_node_pen_pattern Get_node_pen_pattern() #define pen_reverse ibm_pen_xor() #define pen_erase ibm_pen_erase() #define pen_down ibm_pen_down() #define button Button() #define mouse_x mickey_x() #define mouse_y mickey_y() #define full_screen f_screen() #define split_screen s_screen() #define text_screen t_screen() /* definitions from term.c and math.c for ibmterm.c */ extern int x_coord, y_coord, x_max, y_max, tty_charmode; extern char so_arr[], se_arr[]; /* definitions from ibmterm.c for graphics.c */ extern void gr_mode(); extern void ibm_pen_erase(), ibm_pen_down(), ibm_pen_xor(); extern void set_ibm_pen_mode(); extern int get_ibm_pen_mode(); extern void save_pen(), restore_pen(), set_pen_pattern(); extern void plain_xor_pen(); extern void set_list_pen_pattern(), get_pen_pattern(), erase_screen(); extern void label(), logofill(); extern void t_screen(), s_screen(), f_screen(), tone(); extern FIXNUM mickey_x(), mickey_y(); extern NODE *Get_node_pen_pattern(); extern FIXNUM t_height(); extern FIXNUM pen_color, back_ground; extern FLONUM t_half_bottom(), t_side(); extern int current_vis, ibm_screen_bottom; extern BOOLEAN in_erase_mode; extern int ztc_penwidth; extern fg_coord_t ztc_x, ztc_y; extern void get_palette(int slot, unsigned int *r, unsigned int *g, unsigned int *b); extern void set_palette(int slot, unsigned int r, unsigned int g, unsigned int b); ucblogo-6.1/xgraphics.h0000664000175000017500000001521613557147341013272 0ustar jjcjjc/* X window system graphics header file. */ #include #include #include extern int have_x; extern int back_ground; extern void real_window_init(); void logofill(void); /* Some X-related defines. */ #define BORDER 1 #define FONT "fixed" #define NUMCOLORS 512 #define NUMINITCOLORS 16 #define EVENT_MASK (StructureNotifyMask | PointerMotionMask \ | ButtonPressMask | ButtonReleaseMask) #define DEFAULT_HEIGHT 500 #define DEFAULT_WIDTH 500 #define GR_SIZE 60000 #define checkX { \ if (have_x < 0) real_window_init(); \ if (!have_x) { \ err_logo(BAD_GRAPH_INIT,NIL); \ return; \ } \ } #define prepare_to_draw {checkX; placate_x();} #define done_drawing XFlush(dpy) extern void placate_x(); #define prepare_to_draw_turtle nop() #define done_drawing_turtle nop() #define screen_left 0 #define screen_right (screen_width-1) #define screen_top 0 #define screen_bottom (screen_height-1) /* #define screen_height (1 + screen_bottom - screen_top) */ /* #define screen_width (1 + screen_right - screen_left) */ #define screen_x_center (screen_left + (screen_width)/2) #define screen_y_center (screen_top + (screen_height)/2) #define turtle_left_max ((screen_left) - (screen_x_center)) #define turtle_right_max ((screen_right) - (screen_x_center)) #define turtle_top_max ((screen_y_center) - (screen_top)) #define turtle_bottom_max ((screen_y_center) - (screen_bottom)) #define screen_x_coord ((screen_x_center) + turtle_x) #define screen_y_coord ((screen_y_center) - turtle_y) #define turtle_height 18 #define turtle_half_bottom 6.0 #define turtle_side 19.0 #define clear_screen XClearWindow(dpy, win) #define erase_screen() XClearWindow(dpy, win) #define line_to(a,b) if(xgr_pen.vis==0)\ XDrawLine(dpy,win,xgr_pen.pm,\ xgr_pen.xpos,xgr_pen.ypos,\ (a),(b));\ xgr_pen.xpos=(a);\ xgr_pen.ypos=(b) #define move_to(a,b) xgr_pen.xpos=(a);\ xgr_pen.ypos=(b) #define draw_string(s) XDrawString(dpy,win,xgr_pen.pm,\ xgr_pen.xpos,xgr_pen.ypos,\ (s),strlen((s))); #define set_pen_vis(v) xgr_pen.vis=(v) #define set_pen_mode(m) xgr_pen.pm=(m) #define set_pen_color(c) draw_turtle();\ xgr_pen.color=c%NUMCOLORS;\ XSetForeground(dpy,draw_gc,color[2+xgr_pen.color].pixel);\ XSetForeground(dpy,reverse_gc,color[2+xgr_pen.color].pixel);\ draw_turtle(); #define set_back_ground(c) back_ground=c%NUMCOLORS;\ XSetBackground(dpy,draw_gc,color[2+back_ground].pixel);\ XSetBackground(dpy,reverse_gc,color[2+back_ground].pixel);\ XSetBackground(dpy,erase_gc,color[2+back_ground].pixel);\ XSetForeground(dpy,erase_gc,color[2+back_ground].pixel);\ XSetWindowBackground(dpy,win,color[2+back_ground].pixel);\ redraw_graphics(); #define set_pen_width(w) XSetLineAttributes(dpy, draw_gc, w, LineSolid, \ CapProjecting, JoinMiter);\ XSetLineAttributes(dpy, erase_gc, w, LineSolid, \ CapProjecting, JoinMiter);\ XSetLineAttributes(dpy, reverse_gc, w, LineSolid, \ CapProjecting, JoinMiter);\ xgr_pen.pw = w; #define set_pen_height(h) XSetLineAttributes(dpy, draw_gc, h, LineSolid, \ CapProjecting, JoinMiter);\ XSetLineAttributes(dpy, erase_gc, h, LineSolid, \ CapProjecting, JoinMiter);\ XSetLineAttributes(dpy, reverse_gc, h, LineSolid, \ CapProjecting, JoinMiter);\ xgr_pen.ph = h; #define set_pen_x(x) nop() #define set_pen_y(y) nop() /* pen_info is a stucture type with fields for the various pen characteristics including the location, size, color, mode (e.g. XOR or COPY), pattern, visibility (0 = visible) */ typedef struct { int color; int xpos; int ypos; int vis; int pw; int ph; GC pm; } pen_info; extern pen_info xgr_pen; #define p_info_x(p) (p.xpos) #define p_info_y(p) (p.ypos) /* All these should take an argument, like the two just above. Then we could support multiple turtles. */ #define pen_width xgr_pen.pw #define pen_height xgr_pen.ph #define pen_color xgr_pen.color #define pen_mode xgr_pen.pm #define pen_vis xgr_pen.vis #define pen_x (xgr_pen.xpos) #define pen_y (xgr_pen.ypos) #define get_node_pen_pattern (cons(make_intnode(-1), NIL)) #define pen_reverse pen_mode=reverse_gc #define pen_erase pen_mode=erase_gc #define pen_down pen_mode=draw_gc #define button get_button() #define mouse_x get_mouse_x() #define mouse_y get_mouse_y() /* There seems little point in implementing these unless we put everything in one window. (Possibly use a slave xterm?) */ #define full_screen nop() #define split_screen nop() #define text_screen nop() #define plain_xor_pen() pen_reverse #define label(s) XDrawImageString(dpy,win,xgr_pen.pm,\ xgr_pen.xpos,xgr_pen.ypos,\ (s), strlen(s)) #define tone(p,d) nop() #define get_pen_pattern(p) nop() #define set_pen_pattern(p) nop() #define set_list_pen_pattern(p) nop() extern void set_palette(int, unsigned int, unsigned int, unsigned int); extern void get_palette(int, unsigned int*, unsigned int*, unsigned int*); /* The sparc has fmod. So I use it. */ /* #define fmod(x,y) x */ extern void nop(); /* Global X variables. */ extern int screen_height, screen_width; extern Display *dpy; /* X server connection */ extern Window win; /* Window ID */ extern GC draw_gc, /* GC to draw with */ erase_gc, /* GC to draw with */ reverse_gc; /* GC to draw with */ extern XColor color[]; extern XColor dummy; extern int get_mouse_x(), get_mouse_y(); /* Avoid name conflicts. Note: if xgraphics.c uses True and False, bad things are likely to happen. */ #undef True #undef False ucblogo-6.1/xgraphics.c0000664000175000017500000002265213557147341013267 0ustar jjcjjc/* X window graphics for logo. Nov. 1991. */ /* Note: logo uses True and False as variables to hold references to the nodes containing the values true and false. X uses them as macros serving the functions often served by the more standard TRUE and FALSE. To avoid a conflict, don't use True and False in this file. */ #ifndef X_DISPLAY_MISSING #include #include "logo.h" #include "xgraphics.h" #include "globals.h" char *LogoPlatformName="X11"; int clearing_screen = 0; #ifdef SIGWINCH #ifdef SIG_TAKES_ARG #define sig_arg 0 RETSIGTYPE x_win_resize(int sig) #else #define sig_arg RETSIGTYPE x_win_resize() #endif { signal(SIGWINCH, x_win_resize); placate_x(); SIGRET } #endif /* SIGWINCH */ int have_x = -1; XWMHints xwmh = { (InputHint|StateHint), /* flags */ FALSE, /* input */ NormalState, /* initial_state */ 0, /* icon pixmap */ 0, /* icon window */ 0, 0, /* icon location */ 0, /* icon mask */ 0, /* Window group */ }; int screen_height = DEFAULT_HEIGHT; int screen_width = DEFAULT_WIDTH; int x_mouse_x, x_mouse_y, x_buttondown=0; /* We'll use 16 named colors for now (see xgraphics.h). The ordering here corresponds to the zero-based argument to setpencolor that gives that color -- pink is 12, turquoise is 10 etc. */ char *colorname[NUMINITCOLORS] = { "black", "blue" , "green" , "cyan" , "red" , "magenta", "yellow", "white", "brown", "tan", "dark green", /* Should be 'forest' */ "aquamarine", /* Should be 'aqua' */ "salmon", "purple", "orange", "grey" }; XColor color[NUMCOLORS+2]; XColor dummy; void nop() { } pen_info xgr_pen; int back_ground; Display *dpy; /* X server connection */ Window win; /* Window ID */ GC draw_gc, /* GC to draw with */ up_gc, /* Do nothing gc. */ erase_gc, /* Erase gc. */ reverse_gc; /* GC to reverse things. */ int screen; int save_argc; char ** save_argv; void x_window_init(int argc, char **argv) { save_argc = argc; save_argv = argv; } void real_window_init() { unsigned long fth, pad; /* Font size parameters */ unsigned long fg, bg, bd; /* Pixel values */ unsigned long bw; /* Border width */ XFontStruct *fontstruct; /* Font descriptor */ XGCValues gcv; /* Struct for creating GC */ XEvent event; /* Event received */ XSizeHints xsh; /* Size hints for window manager */ XSetWindowAttributes xswa; /* Temporary Set Window Attribute struct */ int n; /* Open X display. */ if ((dpy = XOpenDisplay(NULL)) == NULL) { have_x = 0; return; } else have_x = 1; screen = DefaultScreen(dpy); /* Load default font. */ if ((fontstruct = XLoadQueryFont(dpy, FONT)) == NULL) { have_x = 0; return; } fth = fontstruct->max_bounds.ascent + fontstruct->max_bounds.descent; /* * Select colors. */ for(n = 0; n < NUMINITCOLORS; n++) XAllocNamedColor(dpy, DefaultColormap(dpy, screen), colorname[n], &color[n+2], &dummy); for (n = NUMINITCOLORS; n < NUMCOLORS; n++) color[n+2] = color[(n+2) % NUMINITCOLORS]; xgr_pen.color = 7; /* Not much alternative to the following, because of the use of the xor operation to erase the turtle. The background HAS to be the zero pixel or the scheme won't work. */ bg = BlackPixel(dpy, screen); fg = bd = WhitePixel(dpy, screen); /* * Set the border width of the window, and the gap between the text * and the edge of the window, "pad". */ pad = BORDER; bw = 1; /* Set up size/position hints. */ xsh.flags = (PPosition | PSize); xsh.height = DEFAULT_HEIGHT; xsh.width = DEFAULT_WIDTH; xsh.x = (DisplayWidth(dpy, DefaultScreen(dpy)) - xsh.width) / 2; xsh.y = (DisplayHeight(dpy, DefaultScreen(dpy)) - xsh.height) / 2; win = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), xsh.x, xsh.y, xsh.width, xsh.height, bw, bd, bg); /* Label window. */ XSetStandardProperties(dpy, win, "BXLogo", "BXLogo", None, save_argv, save_argc, &xsh); XSetWMHints(dpy, win, &xwmh); /* Set up default color map. */ xswa.colormap = DefaultColormap(dpy, DefaultScreen(dpy)); xswa.backing_store = Always; XChangeWindowAttributes(dpy, win, CWColormap | CWBackingStore, &xswa); /* * Create GCs. */ /* Make the foreground and background fields in the GC match the fg and bg variables that were passed to the window. */ gcv.font = fontstruct->fid; gcv.background = BlackPixel(dpy, screen); gcv.foreground = WhitePixel(dpy, screen); gcv.plane_mask = AllPlanes; /* Normal drawing GC. */ draw_gc = XCreateGC(dpy, win, (GCPlaneMask | GCFont | GCForeground | GCBackground), &gcv); /* Create GC for erasing/drawing turtle. */ gcv.function = GXxor; reverse_gc = XCreateGC(dpy, win, (GCPlaneMask | GCFont | GCFunction | GCForeground | GCBackground), &gcv); /* Erase gc just draws the bacground color. */ gcv.foreground = bg; gcv.function = GXcopy; erase_gc = XCreateGC(dpy, win, (GCPlaneMask | GCFont | GCForeground | GCBackground), &gcv); gcv.function = GXnoop; up_gc = XCreateGC(dpy, win, (GCPlaneMask | GCFunction | GCForeground | GCBackground), &gcv); xgr_pen.pm = draw_gc; xgr_pen.vis = 0; XSelectInput(dpy, win, EVENT_MASK); /* * Map the window to make it visible. See Section 3.5. */ XMapWindow(dpy, win); /* * Loop, examining each event. Exit when we get mapped. */ do { /* * Get the next event */ XWindowEvent(dpy, win, StructureNotifyMask, &event); /* * Wait for the map notify event. */ if (event.type == MapNotify) { XClearWindow(dpy, win); break; } } while(1); lclearscreen(NIL); move_to(screen_x_coord, screen_y_coord); /* if(turtle_shown) draw_turtle(); */ #ifdef SIGWINCH signal(SIGWINCH, x_win_resize); #endif } void save_pen(pen_info *p) { memcpy(((char *)(p)),((char *)(&xgr_pen)),sizeof(pen_info)); } void restore_pen(pen_info *p) { memcpy(((char *)(&xgr_pen)),((char *)(p)),sizeof(pen_info)); set_pen_width(p->pw); set_pen_height(p->ph); } void placate_x() { XEvent event; XConfigureEvent *xce; XMotionEvent *xme; XButtonEvent *xbe; checkX; while(XCheckWindowEvent(dpy, win, EVENT_MASK, (XEvent *)&event)) switch(event.type) { case ConfigureNotify: xce = (XConfigureEvent *)&event; screen_height = xce->height; screen_width = xce->width; XClearWindow(dpy, win); /* if (!clearing_screen) */ redraw_graphics(); break; case MotionNotify: xme = (XMotionEvent *)&event; x_mouse_x = xme->x; x_mouse_y = xme->y; break; case ButtonPress: xbe = (XButtonEvent *)&event; #undef button x_buttondown = xbe->button; mouse_click; break; case ButtonRelease: x_buttondown = 0; break; } } void check_X11_stop() { static int count=300; if (--count == 0) { count = 300; checkX; placate_x(); } } int get_button() { checkX; placate_x(); return( x_buttondown ); } int get_mouse_x() { checkX; placate_x(); return( x_mouse_x - (screen_width / 2)); } int get_mouse_y() { checkX; placate_x(); return((screen_height / 2) - x_mouse_y); } void floodfill( XImage *img, int x, int y, unsigned long oldColor, unsigned long newColor ) { int lastBorder; int leftLimit, rightLimit; int i; if (oldColor == newColor) { /* Nothing to be done */ return; } /* Seek left */ leftLimit = (-1); for (i = x; (i >= 0); i--) { if (XGetPixel(img, i, y) != oldColor) { break; } XPutPixel(img, i, y, newColor); leftLimit = i; } if (leftLimit == (-1)) { return; } /* Seek right */ rightLimit = x; for (i = (x+1); (i < screen_width); i++) { if (XGetPixel(img, i, y) != oldColor) { break; } XPutPixel(img, i, y, newColor); rightLimit = i; } /* Look at lines above and below and start paints */ /* Above */ if (y > 0) { lastBorder = 1; for (i = leftLimit; (i <= rightLimit); i++) { int c; c = XGetPixel(img, i, y-1); if (lastBorder) { if (c == oldColor) { floodfill(img, i, y-1, oldColor, newColor); lastBorder = 0; } } else if (c != oldColor) { lastBorder = 1; } } } /* Below */ if (y < screen_height - 1) { lastBorder = 1; for (i = leftLimit; (i <= rightLimit); i++) { int c; c = XGetPixel(img, i, y+1); if (lastBorder) { if (c == oldColor) { floodfill(img, i, y+1, oldColor, newColor); lastBorder = 0; } } else if (c != oldColor) { lastBorder = 1; } } } } void logofill() { XImage *img = XGetImage(dpy, win, 0, 0, screen_width, screen_height, -1, ZPixmap ); floodfill( img, xgr_pen.xpos, xgr_pen.ypos, XGetPixel( img, xgr_pen.xpos, xgr_pen.ypos ), color[(xgr_pen.color)+2].pixel ); XPutImage( dpy, win, draw_gc, img, 0, 0, 0, 0, screen_width, screen_height ); XDestroyImage( img ); } void set_palette(int n, unsigned int r, unsigned int g, unsigned int b) { n+=2; color[n].red = r; color[n].green = g; color[n].blue = b; color[n].flags = DoRed|DoGreen|DoBlue; /* unnecessary? */ XAllocColor(dpy, DefaultColormap(dpy, DefaultScreen(dpy)), &color[n]); } void get_palette(int n, unsigned int *r, unsigned int *g, unsigned int *b) { n+=2; *r = color[n].red; *g = color[n].green; *b = color[n].blue; } #endif ucblogo-6.1/wxTurtleGraphics.h0000664000175000017500000001417513575571772014635 0ustar jjcjjc #include #include #include #include #include #include "LogoFrame.h" #include "logo.h" #include "wxTerminal.h" #include #include #include #include "wxGlobals.h" // ---------------------------------------------------------------------------- // structs // ---------------------------------------------------------------------------- struct line { short int x1; short int y1; short int x2; short int y2; short int pw; unsigned char color; unsigned char pm; int vis; }; typedef struct { int color; int xpos; int ypos; int vis; int pw; int ph; int pen_mode; } pen_info; // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- // what do we show on screen (there are too many shapes to put them all on // screen simultaneously) enum ScreenToShow { Show_Default, Show_Text, Show_Lines, Show_Brushes, Show_Polygons, Show_Mask, Show_Ops, Show_Regions, Show_Circles }; enum messageEnum { PREPARE = 0, SPLITSCREEN, FULLSCREEN, TEXTSCREEN, DRAWLINE, EDITCALL, CLEARSCREEN, SAVEPEN, RESTOREPEN, KILLAPPLICATION, SETPENCOLOR, ADDLINE, SETPENWIDTH, GETPALETTE, FLOODFILL, TOPRINTER, GETMOUSECOORDS, GETMOUSEDOWN, SETINFO, GETINFO, DRAWLABEL, CATCHUP, PRINTPICT, PRINTPREVIEWPICT, PRINTTEXT, PRINTPREVIEWTEXT }; #define PEN_REVERSE 0 #define PEN_ERASE 1 #define PEN_DOWN 2 #define NUMCOLORS 512 #define NUMINITCOLORS 16 // ---------------------------------------------------------------------------- // Classes // ---------------------------------------------------------------------------- class TurtleCanvas; // This frame will contain the TurtleCanvas class TurtleFrame : public wxFrame { public: TurtleFrame( wxFrame * parent, const wxString& title, const wxPoint& pos, const wxSize& size); // event handlers (these functions should _not_ be virtual) void OnQuit(wxCommandEvent& event); void OnShow(wxCommandEvent &event); static int back_ground, screen_height, screen_width, in_graphics_mode, in_splitscreen; static pen_info xgr_pen; int m_backgroundMode; int m_textureBackground; int m_mapMode; double m_xUserScale; double m_yUserScale; int m_xLogicalOrigin; int m_yLogicalOrigin; bool m_xAxisReversed, m_yAxisReversed; wxColour m_colourForeground, // these are _text_ colours m_colourBackground; wxBrush m_backgroundBrush; TurtleCanvas *m_canvas; TurtleCanvas * GetCanvas (); private: // any class wishing to process wxWindows events must use this macro DECLARE_EVENT_TABLE() }; struct mypoint { int x,y; }; // define a scrollable canvas for drawing onto class TurtleCanvas: public wxWindow { public: TurtleCanvas( wxFrame *parent ); virtual ~TurtleCanvas(); wxFrame *m_owner; wxPaintDC * dc; static void FinishedEvent(); static void WaitForEvent(); void OnPaint(wxPaintEvent &event); void OnSize(wxSizeEvent &event); void OnDraw(wxDC &dc); bool SetFont(const wxFont &f); void Show(ScreenToShow show) { m_show = show; Refresh(); } void internalPrepare(); void TurtlePrintPreview(wxCommandEvent& event); void PrintTurtleWindow(wxCommandEvent& event); void SetOwner (wxFrame * frame); void SetDC (wxPaintDC * dc); void drawLine(wxCommandEvent & e); void editCall(); void logoHandle ( wxCommandEvent & e); void exitApplication(); void OnFocus (wxFocusEvent & event); void LoseFocus (wxFocusEvent & event); void OnLeftDown(wxMouseEvent& event) ; void OnLeftUp(wxMouseEvent& event); void OnMiddleDown(wxMouseEvent& event) ; void OnMiddleUp(wxMouseEvent& event); void OnRightDown(wxMouseEvent& event) ; void OnRightUp(wxMouseEvent& event); void OnMouseMove(wxMouseEvent& event) ; void OnChar(wxKeyEvent& event); static void setInfo(int type, int val); static int getInfo(int type); void OnTimer (wxTimerEvent& event); void OnEraseBackGround(wxEraseEvent& event) ; void OnPageSetup(wxCommandEvent& event); static void drawOneLine(struct line *, wxDC *); static void realFloodFill(int, wxDC *); static void realdoFilled(int fillcolor, int count, struct mypoint *points, wxDC *dc); static void realDrawLabel(char *, wxDC *); static void realClearScreen(wxDC *); void PaintBackground(wxDC& dc) ; wxFrame * GetOwner(); wxDC * GetDC(); static int mousePosition_x; static int mousePosition_y; static int clickPosition_x; static int clickPosition_y; static int mouse_down_left; static int mouse_down_middle; static int mouse_down_right; static int mouse_down_last; static wxColour colors[NUMCOLORS+SPECIAL_COLORS]; private: void DrawTurtle(wxDC &dc); wxBitmap *m_bitmap; int resized; ScreenToShow m_show; wxBitmap m_smile_bmp; wxIcon m_std_icon; bool m_clip; wxTimer * m_timer; DECLARE_EVENT_TABLE() }; // ---------------------------------------------------------------------------- // Accessed by interpreter // ---------------------------------------------------------------------------- extern "C" void nop(); extern "C" void set_palette(int, unsigned int, unsigned int, unsigned int); extern "C" void get_palette(int, unsigned int*, unsigned int*, unsigned int*); extern "C" void save_pen(pen_info *p); extern "C" void restore_pen(pen_info *p); extern "C" void set_pen_patter(); extern "C" void logofill(); extern "C" void wx_clear(); extern "C" NODE lclearscreen(NODE *); extern "C" void wxDrawLine(int x1, int y1, int x2, int y2, int vis); extern "C" void wxSplitScreen(); extern "C" void wxFullScreen(); extern "C" void wxTextScreen(); extern "C" void wxPrepare(); extern "C" int wxEditFile(char * f); extern "C" int wxGetMouseX(); extern "C" int wxGetMouseY(); extern "C" int wxGetButton(); extern "C" void redraw_graphics(); extern "C" void wxSetInfo(int type, int val); extern "C" int wxGetInfo(int type); ucblogo-6.1/wxTurtleGraphics.cpp0000664000175000017500000010656013575571772015170 0ustar jjcjjc#include #include "wxTurtleGraphics.h" #include "TextEditor.h" #include #define WX_TURTLEGRAPHICS_CPP 1 using namespace std; #define SCREEN_WIDTH 1 #define SCREEN_HEIGHT 2 #define BACK_GROUND 3 #define IN_SPLITSCREEN 4 #define IN_GRAPHICS_MODE 5 // ---------------------------------------------------------------------------- // Custom Events // ---------------------------------------------------------------------------- /* The edit event */ #if 0 BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_EDIT_CUSTOM_COMMAND, 7777) END_DECLARE_EVENT_TYPES() DEFINE_EVENT_TYPE(wxEVT_EDIT_CUSTOM_COMMAND) #define EVT_EDIT_CUSTOM_COMMAND(id, fn) \ DECLARE_EVENT_TABLE_ENTRY( \ wxEVT_EDIT_CUSTOM_COMMAND, id, -2, \ (wxObjectEventFunction)(wxEventFunction)(wxCommandEventFunction)&fn, \ (wxObject *) NULL \ ), #endif /* Used for multithread event handling, as well as for a dummy event otherwise */ BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_LOGO_CUSTOM_COMMAND, 7777) END_DECLARE_EVENT_TYPES() DEFINE_EVENT_TYPE(wxEVT_LOGO_CUSTOM_COMMAND) #define EVT_LOGO_CUSTOM_COMMAND(id, fn) \ DECLARE_EVENT_TABLE_ENTRY( \ wxEVT_LOGO_CUSTOM_COMMAND, id, -1, \ (wxObjectEventFunction)(wxEventFunction)(wxCommandEventFunction)&fn, \ (wxObject *) NULL \ ), // ---------------------------------------------------------------------------- // Globals // ---------------------------------------------------------------------------- float fillScale; pen_info p; int TurtleFrame::back_ground = 0; int TurtleFrame::screen_height = 0; int TurtleFrame::screen_width = 0; int TurtleFrame::in_graphics_mode = 0; int TurtleFrame::in_splitscreen = 0; pen_info TurtleFrame::xgr_pen = p; int drawToWindow = 0; // for redraw_graphics from gui "thread" wxDC *windowDC = 0; wxMemoryDC *m_memDC; #define USE_MEMDC 1 int pictureleft = 0, pictureright = 0, picturetop = 0, picturebottom = 0; // Keep track of max range for printing. int TurtleCanvas::mousePosition_x; int TurtleCanvas::mousePosition_y; int TurtleCanvas::clickPosition_x; int TurtleCanvas::clickPosition_y; int TurtleCanvas::mouse_down_left; int TurtleCanvas::mouse_down_middle; int TurtleCanvas::mouse_down_right; int TurtleCanvas::mouse_down_last; wxColour TurtleCanvas::colors[NUMCOLORS+SPECIAL_COLORS]; int R, G, B; // Global print data, to remember settings during the session wxPrintData *g_printData = (wxPrintData*) NULL ; // Global page setup data wxPageSetupDialogData* g_pageSetupData = (wxPageSetupDialogData*) NULL; // Used for printing TurtleWindowPrintout *turtlePrintout; extern "C" int drawToPrinter; wxDC *printerDC; wxBitmap *tempBitmap; // have already called prepareToDraw int prepared = 0; TurtleFrame *turtleFrame; int turtleIndex = 0; int putInQueue = 0; #if 0 wxCommandEvent editEvent = wxCommandEvent(wxEVT_EDIT_CUSTOM_COMMAND); #endif char * file; // the location of the turtle extern "C" int turtlePosition_x; extern "C" int turtlePosition_y; #define LINEPAUSE 30 // ---------------------------------------------------------------------------- // Debug Functions // ---------------------------------------------------------------------------- /* We'll use 16 named colors for now (see xgraphics.h). The ordering here corresponds to the zero-based argument to setpencolor that gives that color -- pink is 12, turquoise is 10 etc. */ /* void PrintLines(){ struct line l; unsigned int turtleIndex = 0; for (; turtleIndexSetMarginTopLeft(wxPoint(15, 15)); g_pageSetupData->SetMarginBottomRight(wxPoint(15, 15)); #ifndef __WXMAC__ /* needed for wxWidgets 2.6 */ wxSetWorkingDirectory(wxStandardPaths::Get().GetDocumentsDir()); #endif mousePosition_x = 0; mousePosition_y = 0; clickPosition_x = 0; clickPosition_y = 0; mouse_down_left = 0; mouse_down_middle = 0; mouse_down_right = 0; mouse_down_last = 0; // initialize the TurtleCanvas::colors int i; TurtleCanvas::colors[SPECIAL_COLORS] = wxColour(0, 0, 0); TurtleCanvas::colors[SPECIAL_COLORS+1] = wxColour(0, 0, 255); TurtleCanvas::colors[SPECIAL_COLORS+2] = wxColour(0, 255, 0); TurtleCanvas::colors[SPECIAL_COLORS+3] = wxColour(0, 255, 255); TurtleCanvas::colors[SPECIAL_COLORS+4] = wxColour(255, 0, 0); TurtleCanvas::colors[SPECIAL_COLORS+5] = wxColour(255, 0, 255); TurtleCanvas::colors[SPECIAL_COLORS+6] = wxColour(255, 255, 0); TurtleCanvas::colors[SPECIAL_COLORS+7] = wxColour(255, 255, 255); TurtleCanvas::colors[SPECIAL_COLORS+8] = wxColour(155, 96, 59); TurtleCanvas::colors[SPECIAL_COLORS+9] = wxColour(197, 136, 18); TurtleCanvas::colors[SPECIAL_COLORS+10] = wxColour(100, 162, 64); TurtleCanvas::colors[SPECIAL_COLORS+11] = wxColour(120, 187, 187); TurtleCanvas::colors[SPECIAL_COLORS+12] = wxColour(255, 149, 119); TurtleCanvas::colors[SPECIAL_COLORS+13] = wxColour(144, 113, 208); TurtleCanvas::colors[SPECIAL_COLORS+14] = wxColour(255, 163, 0); TurtleCanvas::colors[SPECIAL_COLORS+15] = wxColour(183, 183, 183); for(i=SPECIAL_COLORS+16;ixgr_pen.vis = 0; int screen_width, screen_height; parent->GetSize(&screen_width, &screen_height); setInfo(SCREEN_WIDTH, screen_width); setInfo(SCREEN_HEIGHT, screen_height); turtleFrame->xgr_pen.xpos = screen_width/2; turtleFrame->xgr_pen.ypos = screen_height/2; pictureleft = pictureright = screen_width/2; picturetop = picturebottom = screen_height/2; turtleFrame->xgr_pen.color = 7; turtleFrame->xgr_pen.pw = 1; turtleFrame->xgr_pen.pen_mode = PEN_DOWN; #if USE_MEMDC m_memDC=new wxMemoryDC(); //make a bitmap the maximum size of the screen (the monitor, not the drawing area) int m_w,m_h; //monitor screen width and height wxDisplaySize(&m_w,&m_h); m_bitmap = new wxBitmap(m_w, m_h); PrepareDC(*m_memDC); wxBrush myBrush(TurtleCanvas::colors[turtleFrame->back_ground +SPECIAL_COLORS],wxSOLID); m_memDC->SelectObject(*m_bitmap); m_memDC->SetBackgroundMode( wxSOLID ); m_memDC->SetBackground( myBrush ); m_memDC->Clear(); //compute origin based on screen size vs monitor size //(BIGWIDTH - SMALLWIDTH)/2 m_memDC->SetDeviceOrigin( (m_w - screen_width)/2, (m_h - screen_height)/2 ); wxFont f(FONT_CFG(wx_font_face, wx_font_size)); m_memDC->SetFont(f); #endif } TurtleCanvas::~TurtleCanvas() { turtleGraphics = 0; } void TurtleCanvas::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxdprintf("OnPaint starts\n"); wxPaintDC dc(this); OnDraw(dc); wxdprintf("OnPaint ends\n"); } void TurtleCanvas::OnSize(wxSizeEvent& event) { wxdprintf("OnSize starts\n"); int m_w,m_h; int screen_width, screen_height; wxDisplaySize(&m_w,&m_h); logoFrame->GetSize(&screen_width, &screen_height); setInfo(SCREEN_WIDTH, screen_width); setInfo(SCREEN_HEIGHT, screen_height); #if USE_MEMDC m_memDC->SetDeviceOrigin( (m_w - screen_width)/2, (m_h - screen_height)/2 ); #endif wxClientDC dc(this); OnDraw(dc); wxdprintf("OnSize ends\n"); } extern FLONUM turtle_x, turtle_y, turtle_heading; extern "C" FLONUM x_scale, y_scale; extern "C" BOOLEAN user_turtle_shown; extern "C" FIXNUM g_round(FLONUM n); void TurtleCanvas::DrawTurtle(wxDC &dc) { FLONUM real_heading; int left_x, left_y, right_x, right_y, top_x, top_y; double cos_real_heading, sin_real_heading; FLONUM delta_x, delta_y; if (!user_turtle_shown) { return; } const FLONUM degrad = 0.017453292520; const int screen_width = wxGetInfo(SCREEN_WIDTH); const int screen_height = wxGetInfo(SCREEN_HEIGHT); const int screen_top = 0; const int screen_left = 0; const FLONUM turtle_side = 19.0; const FLONUM turtle_half_bottom = 6.0; const int screen_x_center = (screen_left + (screen_width)/2); const int screen_y_center = (screen_top + (screen_height)/2); real_heading = -turtle_heading + 90.0; cos_real_heading = cos((FLONUM)(real_heading*degrad)); sin_real_heading = sin((FLONUM)(real_heading*degrad)); delta_x = x_scale*(FLONUM)(sin_real_heading*turtle_half_bottom); delta_y = y_scale*(FLONUM)(cos_real_heading*turtle_half_bottom); left_x = g_round(turtle_x - delta_x); left_y = g_round(turtle_y + delta_y); right_x = g_round(turtle_x + delta_x); right_y = g_round(turtle_y - delta_y); top_x = g_round(turtle_x + x_scale*(FLONUM)(cos_real_heading*turtle_side)); top_y = g_round(turtle_y + y_scale*(FLONUM)(sin_real_heading*turtle_side)); /* move to right, draw to left, draw to top, draw to right */ //move_to(screen_x_center + right_x, screen_y_center - right_y); //line_to(screen_x_center + left_x, screen_y_center - left_y); dc.SetPen(wxPen(colors[turtleFrame->xgr_pen.color+SPECIAL_COLORS], turtleFrame->xgr_pen.pw, wxSOLID)); dc.DrawLine(screen_x_center + right_x, screen_y_center - right_y, screen_x_center + left_x, screen_y_center - left_y); //line_to(screen_x_center + top_x, screen_y_center - top_y); dc.DrawLine(screen_x_center + left_x, screen_y_center - left_y, screen_x_center + top_x, screen_y_center - top_y); //line_to(screen_x_center + right_x, screen_y_center - right_y); dc.DrawLine(screen_x_center + top_x, screen_y_center - top_y, screen_x_center + right_x, screen_y_center - right_y); } void TurtleCanvas::OnDraw(wxDC &dc) { int x, y; //dc.DestroyClippingRegion(); GetSize(&x, &y); #if USE_MEMDC dc.Blit(0,0,x,y,m_memDC,0,0); DrawTurtle(dc); return; #endif int unset_windowDC = 0; if(windowDC == 0) { //OnSize may be triggered multiple times... windowDC = &dc; unset_windowDC++; } drawToWindow++; redraw_graphics(); drawToWindow--; if(unset_windowDC) { windowDC = 0; unset_windowDC--; } } void TurtleCanvas::OnFocus (wxFocusEvent & event){ wxTerminal::terminal->SetFocus(); } void TurtleCanvas::LoseFocus (wxFocusEvent & event){ } void TurtleCanvas::SetOwner(wxFrame * owner) { m_owner = owner; } wxFrame * TurtleCanvas::GetOwner() { return m_owner; } wxDC * TurtleCanvas::GetDC() { return dc; } void TurtleCanvas::OnEraseBackGround(wxEraseEvent& event) { wxdprintf("Executing OnEraseBackGround\n"); } void TurtleCanvas::drawOneLine(struct line *l, wxDC *dc) { wxPen myPen; wxColour xorColor; if (l->pm==PEN_ERASE) { myPen = wxPen(TurtleCanvas::colors[turtleFrame->back_ground+ SPECIAL_COLORS], l->pw, wxSOLID); } else if (l->pm==PEN_REVERSE) { unsigned int pr, pg, pb, br, bg, bb; get_palette(l->color, &pr, &pg, &pb); get_palette(turtleFrame->back_ground, &br, &bg, &bb); xorColor=wxColour((pr^br)/256, (pg^bg)/256, (pb^bb)/256); myPen = wxPen(xorColor, l->pw, wxSOLID); } else if(drawToPrinter && turtleFrame->back_ground==0 && l->color==7){ myPen = wxPen( wxT("black"), l->pw, wxSOLID); } else { myPen = wxPen(TurtleCanvas::colors[l->color+SPECIAL_COLORS], l->pw, wxSOLID); } dc->SetPen(myPen); if(l->pm==PEN_REVERSE){ dc->SetLogicalFunction(wxXOR); } else { dc->SetLogicalFunction(wxCOPY); } if(l->vis) { dc->DrawLine(l->x1,l->y1,l->x2,l->y2); dc->DrawPoint(l->x2,l->y2); /* draw endpoint */ if (!drawToPrinter && !drawToWindow) { if (l->x2 < pictureleft) pictureleft = l->x2; if (l->x2 > pictureright) pictureright = l->x2; if (l->y2 < picturetop) picturetop = l->y2; if (l->y2 > picturebottom) picturebottom = l->y2; } } turtlePosition_x = l->x2; turtlePosition_y = l->y2; dc->SetPen(wxNullPen); } extern "C" int turtle_shown; extern "C" void draw_turtle(); extern int editor_active; //from TextEditor.cpp void TurtleCanvas::editCall(){ editor_active = 1; editWindow->Clear(); topsizer->Show(wxTerminal::terminal, 0); topsizer->Show(turtleGraphics, 0); topsizer->Show(editWindow, 1); logoFrame->SetUpEditMenu(); topsizer->Layout(); editWindow->SetFocus(); FILE * filestream; filestream = fopen(file, "r"); if (filestream == NULL) { filestream = fopen(file, "w"); } fclose(filestream); editWindow->Load(wxString(file,wxConvUTF8)); //need to busy wait and handle events... while(editor_active) { if(check_wx_stop(1)) break; wxMilliSleep(10); } } extern "C" void mouse_down(int); void TurtleCanvas::OnLeftDown(wxMouseEvent& event) { mouse_down_left = 1; mouse_down_last = 1; clickPosition_x = mousePosition_x; clickPosition_y = mousePosition_y; mouse_down(0); event.Skip(); //allow native handler to set focus } void TurtleCanvas::OnLeftUp(wxMouseEvent& event) { mouse_down_left = 0; event.Skip(); //allow native handler to set focus } void TurtleCanvas::OnMiddleDown(wxMouseEvent& event) { mouse_down_middle = 3; mouse_down_last = 3; clickPosition_x = mousePosition_x; clickPosition_y = mousePosition_y; mouse_down(0); event.Skip(); //allow native handler to set focus } void TurtleCanvas::OnMiddleUp(wxMouseEvent& event) { mouse_down_middle = 0; event.Skip(); //allow native handler to set focus } void TurtleCanvas::OnRightDown(wxMouseEvent& event) { mouse_down_right = 2; mouse_down_last = 2; clickPosition_x = mousePosition_x; clickPosition_y = mousePosition_y; mouse_down(0); event.Skip(); //allow native handler to set focus } void TurtleCanvas::OnRightUp(wxMouseEvent& event) { mouse_down_right = 0; event.Skip(); //allow native handler to set focus } void TurtleCanvas::OnMouseMove(wxMouseEvent& event){ mousePosition_x = event.m_x; mousePosition_y = event.m_y; event.Skip(); //allow native handler to set focus } extern "C" pen_info* getPen(); void TurtleCanvas::realClearScreen(wxDC *dc) { wxBrush myBrush(TurtleCanvas::colors[turtleFrame->back_ground+ SPECIAL_COLORS],wxSOLID); if(drawToPrinter && turtleFrame->back_ground==0){ myBrush.SetColour(_T("white")); } dc->SetBackgroundMode( wxSOLID ); dc->SetBackground( myBrush ); dc->Clear(); if (!drawToPrinter && !drawToWindow) { pictureleft = pictureright = getInfo(SCREEN_WIDTH)/2; picturetop = picturebottom = getInfo(SCREEN_HEIGHT)/2; } } void TurtleCanvas::realFloodFill(int color, wxDC *dc) { wxColour c; //fprintf(stderr, "realFloodFill: (x,y): (%d, %d)\n", turtlePosition_x, turtlePosition_y); dc->GetPixel(turtlePosition_x, turtlePosition_y, &c); wxBrush brush(TurtleCanvas::colors[color+SPECIAL_COLORS]); dc->SetBrush(brush); if (drawToPrinter) { dc->SetUserScale(1.0, 1.0); dc->FloodFill((long)(turtlePosition_x*fillScale), (long)(turtlePosition_y*fillScale) , c); dc->SetUserScale(fillScale, fillScale); } else { dc->FloodFill(turtlePosition_x, turtlePosition_y , c); } // dc->FloodFill(dc->LogicalToDeviceX(turtlePosition_x), dc->LogicalToDeviceY(turtlePosition_y) , c); } void TurtleCanvas::realdoFilled(int fillcolor, int count, struct mypoint *points, wxDC *dc) { wxPen myPen; wxPoint *wxpoints = (wxPoint*)malloc(count*sizeof(wxPoint)); wxPoint *wxptr; struct mypoint *ptr; for (wxptr = wxpoints, ptr = points; ptr < &points[count]; wxptr++, ptr++) { wxptr->x = ptr->x; wxptr->y = ptr->y; } if(drawToPrinter && turtleFrame->back_ground==0 && turtleFrame->xgr_pen.color==7){ myPen = wxPen( wxT("black"), turtleFrame->xgr_pen.pw, wxSOLID); } else { myPen = wxPen(colors[turtleFrame->xgr_pen.color+SPECIAL_COLORS], turtleFrame->xgr_pen.pw, wxSOLID); } dc->SetPen(myPen); wxBrush brush(TurtleCanvas::colors[fillcolor+SPECIAL_COLORS], wxSOLID); dc->SetBrush(brush); dc->DrawPolygon(count, wxpoints); free(wxpoints); } extern "C" FLONUM y_scale; extern "C" void wx_get_label_size(int *w, int *h) { /* returns size in pixels; converted to turtle steps in wxterm.c */ int descent, extlead; m_memDC->GetTextExtent(wxString("M", wxConvUTF8, wxString::npos), w, h, &descent, &extlead); } extern "C" void wx_adjust_label_height() { //take the font name, change the size based on scrunch int px_height = y_scale * label_height; int descent, extlead; int cw,ch; wxFont label_font = m_memDC->GetFont(); //now, initial guess for pt size is height / 1.5 int font_size = px_height * 3 / 2; label_font.SetPointSize(font_size); m_memDC->SetFont(label_font); m_memDC->GetTextExtent(wxString("M", wxConvUTF8, wxString::npos), &cw, &ch, &descent, &extlead); //now... first figure out whether we undershot or overshot... //this determines which direction to change the size int tmp_height = ch; wxFont tmp_font = label_font; if(tmp_height < px_height) { //increase the point size until we get two consecutive font sizes //where one is below px_height and one is above px_height int expected; while(tmp_height < px_height) { expected = tmp_font.GetPointSize() + 1; while(tmp_font.GetPointSize() != expected && expected <= 100){ expected++; tmp_font.SetPointSize(expected); } if (expected == 100) break; m_memDC->SetFont(tmp_font); m_memDC->GetTextExtent(wxString("M", wxConvUTF8, wxString::npos), &cw, &tmp_height, &descent, &extlead); if(tmp_height >= px_height) break; label_font.SetPointSize(expected); ch = tmp_height; } } else { //same as above, but decrease instead int expected; while(tmp_height > px_height) { expected = tmp_font.GetPointSize() - 1; while(tmp_font.GetPointSize() != expected && expected >= 2){ expected--; tmp_font.SetPointSize(expected); } if (expected == 2) break; m_memDC->SetFont(tmp_font); m_memDC->GetTextExtent(wxString("M", wxConvUTF8, wxString::npos), &cw, &tmp_height, &descent, &extlead); if(tmp_height <= px_height) break; label_font.SetPointSize(expected); ch = tmp_height; } } //now we have two fonts and two heights, we pick the closest one! int curr_diff = ch - px_height; int tmp_diff = tmp_height - px_height; if(curr_diff < 0) curr_diff = -curr_diff; if(tmp_diff < 0) tmp_diff = -tmp_diff; // fprintf(stderr, "ph: %d, cpt: %d, ch: %d, tpt: %d, th: %d \n", px_height, label_font.GetPointSize(), ch, tmp_font.GetPointSize(), tmp_height); if(curr_diff < tmp_diff) { m_memDC->SetFont(label_font); } else if(curr_diff > tmp_diff) { m_memDC->SetFont(tmp_font); } else { // if difference are the same, pick the smaller one if(ch < tmp_height) { m_memDC->SetFont(label_font); } else { m_memDC->SetFont(tmp_font); } } } bool TurtleCanvas::SetFont(const wxFont &f) { m_memDC->SetFont(f); wx_adjust_label_height(); return TRUE; } void TurtleCanvas::realDrawLabel(char *data, wxDC *dc) { wxString s(data, wxConvUTF8); wxCoord wid, ht; dc->GetTextExtent(s, &wid, &ht); dc->SetBackgroundMode(wxTRANSPARENT); if (turtleFrame->back_ground == 0 && drawToPrinter) { dc->SetTextBackground(TurtleCanvas::colors[SPECIAL_COLORS+7]); if (turtleFrame->xgr_pen.color == 7) dc->SetTextForeground(TurtleCanvas::colors[SPECIAL_COLORS+0]); else dc->SetTextForeground(TurtleCanvas::colors [turtleFrame->xgr_pen.color+SPECIAL_COLORS]); } else { dc->SetTextBackground(TurtleCanvas::colors[turtleFrame->back_ground+ SPECIAL_COLORS]); dc->SetTextForeground(TurtleCanvas::colors[turtleFrame->xgr_pen.color+ SPECIAL_COLORS]); } dc->DrawText(s, getPen()->xpos, getPen()->ypos-ht); if (!drawToPrinter) { if (getPen()->xpos < pictureleft) pictureleft = getPen()->xpos; if (getPen()->xpos+wid > pictureright) pictureright = getPen()->xpos+wid; if (getPen()->ypos-ht < picturetop) picturetop = getPen()->ypos-ht; if (getPen()->ypos > picturebottom) picturebottom = getPen()->ypos; } } /* A setter function for various turtle graphics properties */ void TurtleCanvas::setInfo(int type, int val){ switch (type){ case SCREEN_WIDTH: turtleFrame->screen_width = val; break; case SCREEN_HEIGHT: turtleFrame->screen_height = val; break; case BACK_GROUND: turtleFrame->back_ground = val; break; case IN_SPLITSCREEN: turtleFrame->in_splitscreen = val; break; case IN_GRAPHICS_MODE: turtleFrame->in_graphics_mode = val; break; } } /* A getter function for various turtle graphics properties */ int TurtleCanvas::getInfo(int type){ switch (type){ case SCREEN_WIDTH: return turtleFrame->screen_width; break; case SCREEN_HEIGHT: return turtleFrame->screen_height; break; case BACK_GROUND: return turtleFrame->back_ground; break; case IN_SPLITSCREEN: return turtleFrame->in_splitscreen; break; case IN_GRAPHICS_MODE: return turtleFrame->in_graphics_mode; break; } return -1; } void TurtleCanvas::OnPageSetup(wxCommandEvent& WXUNUSED(event)) { (*g_pageSetupData) = *g_printData; wxPageSetupDialog pageSetupDialog(this, g_pageSetupData); pageSetupDialog.ShowModal(); (*g_printData) = pageSetupDialog.GetPageSetupDialogData().GetPrintData(); (*g_pageSetupData) = pageSetupDialog.GetPageSetupDialogData(); } void TurtleCanvas::PrintTurtleWindow(wxCommandEvent& WXUNUSED(event)) { wxPrintDialogData printDialogData(* g_printData); wxPrinter printer(& printDialogData); TurtleWindowPrintout printout(_T("Turtle Graphics")); if (!printer.Print(turtleFrame, &printout, true /*prompt*/)) { if (wxPrinter::GetLastError() == wxPRINTER_ERROR) wxMessageBox(_T("There was a problem printing.\nPerhaps your current printer is not set correctly?"), _T("Printing"), wxOK); } else { (*g_printData) = printer.GetPrintDialogData().GetPrintData(); } } void TurtleCanvas::TurtlePrintPreview(wxCommandEvent& WXUNUSED(event)) { // Pass two printout objects: for preview, and possible printing. wxPrintDialogData printDialogData(* g_printData); wxPrintPreview *preview = new wxPrintPreview(new TurtleWindowPrintout, new TurtleWindowPrintout, & printDialogData); if (!preview->Ok()) { delete preview; wxMessageBox(_T("There was a problem previewing.\nPerhaps your current printer is not set correctly?"), _T("Previewing"), wxOK); return; } preview->SetZoom(100); wxPreviewFrame *frame = new wxPreviewFrame(preview, wxTerminal::terminal->terminal, _T("Turtle Graphics Preview"), wxPoint(100, 100), wxSize(600, 650)); frame->Centre(wxBOTH); frame->Initialize(); frame->Show(); } // ---------------------------------------------------------------------------- // TurtleFrame Class // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE(TurtleFrame, wxFrame) END_EVENT_TABLE() // frame constructor TurtleFrame::TurtleFrame(wxFrame * parent, const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(/*(wxFrame *)NULL*/ parent, -1, title, pos, size, wxDEFAULT_FRAME_STYLE | wxNO_FULL_REPAINT_ON_RESIZE) { m_canvas = new TurtleCanvas( this ); } void TurtleFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(TRUE); } TurtleCanvas * TurtleFrame::GetCanvas() { return m_canvas; } // ---------------------------------------------------------------------------- // Functions called from the interpreter thread // ---------------------------------------------------------------------------- extern "C" void nop() { } extern "C" void set_palette(int color, unsigned int r, unsigned int g, unsigned int b){ TurtleCanvas::colors[color+SPECIAL_COLORS] = wxColour(r/256,g/256,b/256); } extern "C" void get_palette(int color, unsigned int *r, unsigned int *g, unsigned int *b){ wxColour colour(TurtleCanvas::colors[color+SPECIAL_COLORS]); *r = colour.Red()*256; *g = colour.Green()*256; *b = colour.Blue()*256; } extern "C" void save_pen(pen_info *p) { memcpy(((char *)(p)),((char *)(&turtleFrame->xgr_pen)), sizeof(pen_info)); } extern "C" void restore_pen(pen_info *p) { memcpy(((char *)(&turtleFrame->xgr_pen)),((char *)(p)), sizeof(pen_info)); } extern "C" void set_pen_patter(){ nop(); } extern "C" void logofill() { if (drawToPrinter) TurtleCanvas::realFloodFill(turtleFrame->xgr_pen.color, printerDC); else if (drawToWindow) TurtleCanvas::realFloodFill(turtleFrame->xgr_pen.color, windowDC); else { #if USE_MEMDC TurtleCanvas::realFloodFill(turtleFrame->xgr_pen.color, m_memDC); #else wxDC *dc = new wxClientDC(turtleGraphics); TurtleCanvas::realFloodFill(turtleFrame->xgr_pen.color, dc); delete dc; #endif } } extern "C" void wx_refresh() { #if USE_MEMDC if(turtleGraphics) { turtleGraphics->Refresh(); turtleGraphics->Update(); } #endif } /* Clear the turtle graphics screen, and put in splitscreen if we are currently in full text mode */ extern "C" void wx_clear() { if (drawToPrinter) TurtleCanvas::realClearScreen(printerDC); else if (drawToWindow) TurtleCanvas::realClearScreen(windowDC); else { #if USE_MEMDC TurtleCanvas::realClearScreen(m_memDC); #else wxDC *dc = new wxClientDC(turtleGraphics); TurtleCanvas::realClearScreen(dc); delete dc; #endif if(!TurtleFrame::in_graphics_mode) wxSplitScreen(); } return; } extern "C" char record_buffer[]; extern "C" void wxPrepare(){ if (drawToPrinter || drawToWindow) { return; } if(!turtleFrame->in_graphics_mode) { wxSplitScreen(); } if(!prepared){ record_buffer[sizeof(int)] = 0; wx_clear(); prepared = 1; } return; } /* Have turtle graphics draw the given line */ extern "C" void wxDrawLine(int x1, int y1, int x2, int y2, int vis){ static int numLines = 0; if (!drawToPrinter && !drawToWindow) { if (numLines == LINEPAUSE) { wxMilliSleep(1); numLines = 0; } else numLines++; } wxDC *dc; struct line l; l.x1 = x1; l.y1 = y1; l.x2 = x2; l.y2 = y2; l.vis = vis; l.color = turtleFrame->xgr_pen.color; l.pm = turtleFrame->xgr_pen.pen_mode; l.pw = turtleFrame->xgr_pen.pw; if (drawToPrinter) TurtleCanvas::drawOneLine(&l, printerDC); else if (drawToWindow) TurtleCanvas::drawOneLine(&l, windowDC); else { #if USE_MEMDC TurtleCanvas::drawOneLine(&l, m_memDC); #else dc = new wxClientDC(turtleGraphics); TurtleCanvas::drawOneLine(&l, dc); delete dc; #endif } return; } extern "C" void doFilled(int fillcolor, int count, struct mypoint *points) { if (drawToPrinter) TurtleCanvas::realdoFilled(fillcolor, count, points, printerDC); else if (drawToWindow) TurtleCanvas::realdoFilled(fillcolor, count, points, windowDC); else { #if USE_MEMDC TurtleCanvas::realdoFilled(fillcolor, count, points, m_memDC); #else wxDC *dc = new wxClientDC(turtleGraphics); TurtleCanvas::realdoFilled(fillcolor, count, points, dc); delete dc; #endif } } /* Set the pen width. Notice this only takes one number, because wx only allows us to set the width and not the pen height */ extern "C" void wxSetPenWidth(int width){ turtleFrame->xgr_pen.pw = width; } extern "C" enum s_md {SCREEN_TEXT, SCREEN_SPLIT, SCREEN_FULL} screen_mode; //the event calling this never seems to trigger... void TurtleCanvas::OnChar(wxKeyEvent& event) { wxTerminal::terminal->OnChar(event); } /* Put the logoframe into splitscreen mode*/ extern "C" void wxSplitScreen(){ turtleFrame->in_graphics_mode = 1; turtleFrame->in_splitscreen = 1; topsizer->Show(wxTerminal::terminal, 1); topsizer->Show(turtleGraphics, 1); topsizer->Show(editWindow, 0); topsizer->Layout(); wxTerminal::terminal->SetFocus(); wxTerminal::terminal->deferUpdate(0); screen_mode = SCREEN_SPLIT; } /* Put the logoframe into full screen mode */ extern "C" void wxFullScreen(){ turtleFrame->in_graphics_mode = 1; turtleFrame->in_splitscreen = 0; topsizer->Show(wxTerminal::terminal, 0); topsizer->Show(turtleGraphics, 1); topsizer->Show(editWindow, 0); topsizer->Layout(); wxTerminal::terminal->SetFocus(); wxTerminal::terminal->deferUpdate(1); screen_mode = SCREEN_FULL; } /* Put the logoframe into text screen mode*/ extern "C" void wxTextScreen(){ turtleFrame->in_graphics_mode = 0; turtleFrame->in_splitscreen = 0; topsizer->Show(wxTerminal::terminal, 1); topsizer->Show(turtleGraphics, 0); topsizer->Show(editWindow, 0); topsizer->Layout(); wxTerminal::terminal->SetFocus(); wxTerminal::terminal->deferUpdate(0); screen_mode = SCREEN_TEXT; } extern "C" void wxlPrintPict(){ wxCommandEvent event(wxEVT_LOGO_CUSTOM_COMMAND); turtleGraphics->PrintTurtleWindow(event); } extern "C" void wxlPrintPreviewPict(){ wxCommandEvent event(wxEVT_LOGO_CUSTOM_COMMAND); turtleGraphics->TurtlePrintPreview(event); } extern "C" void wxlPrintText(){ wxCommandEvent event(wxEVT_LOGO_CUSTOM_COMMAND); logoFrame->OnPrintText(event); } extern "C" void wxlPrintPreviewText(){ wxCommandEvent event(wxEVT_LOGO_CUSTOM_COMMAND); logoFrame->OnPrintTextPrev(event); } void getMousePosition (int * x, int * y) { *x = TurtleCanvas::mousePosition_x - wxGetInfo(SCREEN_WIDTH)/2; *y = wxGetInfo(SCREEN_HEIGHT)/2 - TurtleCanvas::mousePosition_y; } void getClickPosition (int * x, int * y) { *x = TurtleCanvas::clickPosition_x - wxGetInfo(SCREEN_WIDTH)/2; *y = wxGetInfo(SCREEN_HEIGHT)/2 - TurtleCanvas::clickPosition_y; } extern "C" int wxGetMouseX() { int x, y; getMousePosition(&x,&y); return x; } extern "C" int wxGetMouseY() { int x, y; getMousePosition(&x,&y); return y; } extern "C" int wxGetClickX() { int x, y; getClickPosition(&x,&y); return x; } extern "C" int wxGetClickY() { int x, y; getClickPosition(&x,&y); return y; } extern "C" int wxGetButton () { return TurtleCanvas::mouse_down_left + TurtleCanvas::mouse_down_middle + TurtleCanvas::mouse_down_right; } extern "C" int wxGetLastButton () { return TurtleCanvas::mouse_down_last; } /* Show the text editor and have it load the given file */ extern "C" int wxEditFile(char * f){ file = f; alreadyDone = 0; //turtleGraphics->ProcessEvent(editEvent); turtleGraphics->editCall(); return editWindow->doSave; } extern "C" pen_info* getPen(){ return &turtleFrame->xgr_pen; } extern "C" void wxSetInfo(int type, int val) { TurtleCanvas::setInfo(type, val); } extern "C" int wxGetInfo(int type) { return TurtleCanvas::getInfo(type); } extern "C" void wxLabel(char * string) { if (drawToPrinter) TurtleCanvas::realDrawLabel(string, printerDC); else if (drawToWindow) TurtleCanvas::realDrawLabel(string, windowDC); else { #if USE_MEMDC TurtleCanvas::realDrawLabel(string, m_memDC); #else wxDC *dc = new wxClientDC(turtleGraphics); TurtleCanvas::realDrawLabel(string, dc); delete dc; #endif } } void TurtleCanvas::exitApplication() { } // ---------------------------------------------------------------------------- // TurtleWindowPrintout // ---------------------------------------------------------------------------- extern int turtle_shown; bool TurtleWindowPrintout::OnPrintPage(int page) { int w,h; wxDC *dc=GetDC(); int oldshown = turtle_shown; if (!dc) return false; #if !defined(__WXMAC__) && !defined(__WXMSW__) //using a memdc for printer here /* * Create our bitmap for copying */ dc->GetSize(&w, &h); wxMemoryDC *printMemDC = new wxMemoryDC(); wxBitmap *printBitmap = new wxBitmap(w,h); printMemDC->SelectObject(*printBitmap); printerDC = printMemDC; #else printerDC = dc; #endif #if 0 //#ifndef __WXMAC__ /* needed for wxWidgets 2.6 */ int maxX = pictureright - pictureleft; int maxY = picturebottom - picturetop; FitThisSizeToPageMargins(wxSize(maxX, maxY), *g_pageSetupData); wxRect fitRect = GetLogicalPageMarginsRect(*g_pageSetupData); wxCoord xoff = (fitRect.width - maxX) / 2 - pictureleft; //wxCoord xoff = (fitRect.width - maxX) / 2; wxCoord yoff = (fitRect.height - maxY) / 2 - picturetop; //wxCoord yoff = (fitRect.height - maxY) / 2; OffsetLogicalOrigin(xoff, yoff); #else float maxX = pictureright - pictureleft; float maxY = picturebottom - picturetop; // Let's have at least 50 device units margin float marginX = 50; float marginY = 50; // Get the size of the DC in pixels #if defined(__WXMAC__) || defined(__WXMSW__) dc->GetSize(&w, &h); //this is now done above with memDC #endif // Calculate a suitable scaling factor float scaleX=(float)((w-2*marginX)/maxX); float scaleY=(float)((h-2*marginY)/maxY); // Use x or y scaling factor, whichever fits on the DC float actualScale = wxMin(scaleX,scaleY); // Calculate the position on the DC for centring the graphic float posX = (float)((w - actualScale*maxX)/2)-pictureleft*actualScale; float posY = (float)((h - actualScale*maxY)/2)-picturetop*actualScale; // Set the scale and origin printerDC->SetUserScale(actualScale, actualScale); printerDC->SetDeviceOrigin( (long)posX, (long)posY ); fillScale = actualScale; #endif drawToPrinter = 1; turtle_shown = 0; redraw_graphics(); turtle_shown = oldshown; drawToPrinter = 0; #if !defined(__WXMAC__) && !defined(__WXMSW__) //now print the bitmap to the dc //actualPrinterDC->Blit(0,0,w,h,printMemDC,0,0); //appears not to work dc->DrawBitmap(*printBitmap, 0, 0); //delete bitmap and memorydc delete printBitmap; delete printMemDC; #endif return true; } bool TurtleWindowPrintout::OnBeginDocument(int startPage, int endPage) { if (!wxPrintout::OnBeginDocument(startPage, endPage)) return false; return true; } void TurtleWindowPrintout::GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo) { *minPage = 1; *maxPage = 1; *selPageFrom = 1; *selPageTo = 1; } bool TurtleWindowPrintout::HasPage(int pageNum) { return (pageNum == 1); } ucblogo-6.1/wxTerminal.h0000664000175000017500000002057213557147341013435 0ustar jjcjjc#ifndef INCLUDE_WXTERM #define INCLUDE_WXTERM #ifdef __GNUG__ #pragma interface #endif #include #include #define CURSOR_BLINK_DEFAULT_TIMEOUT 300 #define CURSOR_BLINK_MAX_TIMEOUT 2000 #define wxEVT_COMMAND_TERM_RESIZE wxEVT_USER_FIRST + 1000 #define wxEVT_COMMAND_TERM_NEXT wxEVT_USER_FIRST + 1001 #define EVT_TERM_RESIZE(id, fn) { wxEVT_COMMAND_TERM_RESIZE, id, -1, (wxObjectEventFunction) (wxEventFunction) (wxCommandEventFunction) &fn, (wxObject *)NULL }, class TurtleWindowPrintout: public wxPrintout { public: TurtleWindowPrintout(wxChar *title = _T("Turtle Graphics")):wxPrintout(title) {} bool OnPrintPage(int page); bool HasPage(int page); bool OnBeginDocument(int startPage, int endPage); void TurtlePrintPreview(); void GetPageInfo(int *minPage, int *maxPage, int *selPageFrom, int *selPageTo); }; // Structures for maintaining characters and lines #define WXTERM_CB_SIZE 8000 #define WXTERM_LB_SIZE 1000 struct wxterm_char_buffer { char cbuf[WXTERM_CB_SIZE]; //characters char mbuf[WXTERM_CB_SIZE]; //mode flags wxterm_char_buffer *next; //next part of buffer } ; struct wxterm_charpos { wxterm_char_buffer *buf; //which char buffer int offset; //offset into buffer int line_length; //length of line } ; #define inc_charpos(cp) cp.offset++; \ if(cp.offset == WXTERM_CB_SIZE) { \ if(!cp.buf->next) { \ cp.buf->next = (wxterm_char_buffer *) malloc(sizeof(wxterm_char_buffer)); \ memset(cp.buf->next, '\0', sizeof(wxterm_char_buffer)); \ } \ cp.buf = cp.buf->next; \ cp.offset = 0; \ } // adjust offset >= WXTERM_CB_SIZE issues #define adjust_charpos(cp) while(cp.offset >= WXTERM_CB_SIZE) { \ if(!cp.buf->next) { \ cp.buf->next = (wxterm_char_buffer *) malloc(sizeof(wxterm_char_buffer)); \ memset(cp.buf->next, '\0', sizeof(wxterm_char_buffer)); \ } \ cp.buf = cp.buf->next; \ cp.offset -= WXTERM_CB_SIZE; \ } //lineposition consists of just a buffer and an offset. #define inc_linepos(lp) lp.offset++; \ if(lp.offset == WXTERM_LB_SIZE) { \ if(!lp.buf->next) { \ lp.buf->next = (wxterm_line_buffer *) malloc(sizeof(wxterm_line_buffer)); \ memset(lp.buf->next, 0, sizeof(wxterm_line_buffer)); \ } \ lp.buf = lp.buf->next; \ lp.offset = 0; \ } //adjust offset >= WXTERM_LB_SIZE issue #define adjust_linepos(lp) while(lp.offset >= WXTERM_LB_SIZE) { \ if(!lp.buf->next) { \ lp.buf->next = (wxterm_line_buffer *) malloc(sizeof(wxterm_line_buffer)); \ memset(lp.buf->next, 0, sizeof(wxterm_line_buffer)); \ } \ lp.buf = lp.buf->next; \ lp.offset -= WXTERM_LB_SIZE; \ } struct wxterm_line_buffer { wxterm_charpos lbuf[WXTERM_LB_SIZE]; //lines wxterm_line_buffer *next; //next part of buffer }; struct wxterm_linepos { wxterm_line_buffer *buf; //which line buffer int offset; //offset into line buffer }; #define line_of(lpos) lpos.buf->lbuf[lpos.offset] #define char_of(cpos) cpos.buf->cbuf[cpos.offset] #define mode_of(cpos) cpos.buf->mbuf[cpos.offset] // enter/exit standout mode character #define TOGGLE_STANDOUT 17 class wxTerminal : public wxScrolledWindow { public: int m_charWidth; int m_charHeight; int m_width; int m_height; int m_curFG, m_curBG; private: int m_selx1, m_sely1, m_selx2, m_sely2, m_seloldx1, m_seloldy1, m_seloldx2, m_seloldy2, m_curX, m_curY, m_curFlags; //used in enableScrolling int m_vscroll_pos; //number of input lines ready int m_inputLines; bool m_inputReady; //whether ENTER was hit. bool m_selecting; // m_marking; wxColour // m_vt_colors[16], // m_pc_colors[16], m_colors[16]; wxPen // m_vt_colorPens[16], // m_pc_colorPens[16], m_colorPens[16]; wxFont m_normalFont, m_underlinedFont, m_boldFont, m_boldUnderlinedFont; wxMemoryDC m_memDC; FILE *m_printerFN; char *m_printerName; // character buffer wxterm_char_buffer *term_chars; wxterm_line_buffer *term_lines; wxterm_charpos curr_char_pos; wxterm_linepos curr_line_pos; public: int cursor_x, cursor_y; public: // mode flags enum MODES { BOLD=0x1, BLINK=0x2, UNDERLINE=0x4, INVERSE=0x8, DEFERUPDATE=0x10, // DESTRUCTBS=0x800, CURSORINVISIBLE=0x20, //SELECTED=0x40 // flag to indicate a char is selected }; char m_currMode; #if 0 enum BOLDSTYLE { DEFAULT = -1, COLOR = 0, OVERSTRIKE = 1, FONT = 2 }; #endif private: // BOLDSTYLE m_boldStyle; typedef struct { wxKeyCode keyCode; int VTKeyCode; } TermKeyMap; public: wxTerminal(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, int width = 81, int height = 25, const wxString& name = _T("wxTerminal")); virtual ~wxTerminal(); // For printing the text wxHtmlEasyPrinting *htmlPrinter; int x_coord, y_coord, x_max, y_max, isEditFile; static wxTerminal *terminal; void GetCharSize(int *cw, int *ch); bool SetFont(const wxFont& font); void GetColors(wxColor colors[16]/*, wxTerminal::BOLDSTYLE boldStyle = wxTerminal::DEFAULT*/); void deferUpdate(int); void set_mode_flag(int flag); void clear_mode_flag(int flag); void ClearSelection(); bool HasSelection(); wxString GetChars(int x1,int y1,int x2, int y2); wxString GetSelection(); void SelectAll(); wxterm_linepos GetLinePosition(int y); wxterm_charpos GetCharPosition(int x, int y); void DoCopy(); void DoPaste(); void ProcessInput(); void Flush (); void OnSize(wxSizeEvent& event); void terminalEvent (wxCommandEvent & event); void PassInputToInterp(); void setCursor (int x, int y, bool fromLogo = FALSE); //scrolling void EnableScrolling(bool want_scrolling); virtual void DrawText(wxDC& dc, int fg_color, int bg_color, int flags, int x, int y, int len, char *string); // virtual void MoveChars(int sx, int sy, int dx, int dy, int w, int h); // virtual void ClearChars(int bg_color, int x, int y, int w, int h); // virtual void ModeChange(int state); virtual void Bell(); void RenumberLines(int new_width); virtual void ResizeTerminal(int w, int h); // virtual void RequestSizeChange(int w, int h); void DebugOutputBuffer(); void InsertChar(char c); void NextLine(); virtual void PassInputToTerminal(int len, char *data); wxString *get_text(); void ClearScreen(); virtual void SelectPrinter(char *PrinterName); virtual void PrintChars(int len, char *data); //TurtleCanvas passes char to here. void OnChar(wxKeyEvent& event); void handle_backspace(); void handle_home(); void handle_end(); void handle_clear_to_end(); void handle_history_prev(); void handle_history_next(); void handle_left(); void handle_right(); private: int MapKeyCode(int keyCode); void InvertArea(wxDC &dc, int tx1, int tx2, int w, int h, bool scrolled_coord = FALSE); void MarkSelection(wxDC &dc, bool scrolled_coord = FALSE); int CheckPlatformKeys(wxKeyEvent& event); void OnKeyDown(wxKeyEvent& event); void OnEraseBackground(wxEraseEvent& event); void OnPaint(wxPaintEvent& event); void OnDraw(wxDC& dc); void GetClickCoords(wxMouseEvent& event, int *x, int *y); void OnLeftDown(wxMouseEvent& event); void OnLeftUp(wxMouseEvent& event); void OnMouseMove(wxMouseEvent& event); void LoseFocus (wxFocusEvent & event); DECLARE_EVENT_TABLE() }; enum terminalEvents { CLEARTEXT = 0, SETCURSOR }; void init_Logo_Interpreter (int argc, char ** argv); #endif /* INCLUDE_WXTERM */ ucblogo-6.1/wxTerminal.cpp0000664000175000017500000020134113575571772013774 0ustar jjcjjc/* This file implements the logo frame, which is the main frame that contains the terminal, turtle graphics and the editor. CONTAINED IN #IF 0 BLOCKS: -- if user types input, presses UP, and then DOWN, it remembers it... feature isn't very complete, though... to implement, probably need TWO copies of the history buffer */ #include #ifdef __GNUG__ #pragma implementation "wxTerminal.h" #endif // For compilers that support precompilation, includes "wx/wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif // for all others, include the necessary headers (this file is usually all you // need because it includes almost all "standard" wxWindows headers #ifndef WX_PRECOMP #include "wx/wx.h" #endif #include extern std::string pathString; #include #include extern "C" int readingInstruction; #include #include "LogoFrame.h" #include "wxGlobals.h" #include #include #include #include #include //buffered_DC #include "wxTurtleGraphics.h" #include "TextEditor.h" #ifndef __WXMSW__ #include "config.h" #endif #ifdef __WXMAC__ #include "CoreFoundation/CFBundle.h" #endif #include "wxTerminal.h" /* must come after wxTurtleGraphics.h */ #include // in Visual Studio 6.0, min and max are not defined up this point #ifndef max #define max(a,b) (((a) > (b)) ? (a) : (b)) #endif #ifndef min #define min(a,b) (((a) < (b)) ? (a) : (b)) #endif using namespace std; // ---------------------------------------------------------------------------- // Globals // ---------------------------------------------------------------------------- // This is for the input for terminal-like behavior char input_buffer [MAXINBUFF+1]; // How far into the input_buffer we are int input_index = 0; // Where the cursor is in the input_buffer int input_current_pos = 0; //history storage char *cmdHistory[HIST_MAX] = {0}; char **hist_inptr, **hist_outptr; #if 0 //temporary storage of currently typed input //so that if we retrieve history and then come back, we can see it again char latest_history_buffer[MAXINBUFF]; int latest_history_stored = 0; #endif // if logo is in character mode int logo_char_mode; extern "C" int reading_char_now; // the terminal DC wxFont old_font; wxTextAttr old_style; // when edit is called in logo TextEditor * editWindow; // the turtle graphics we are using TurtleCanvas * turtleGraphics; // this contains the previous 3 window wxBoxSizer *topsizer; LogoFrame *logoFrame; LogoEventManager *logoEventManager; // used to calculate where the cursor should be int cur_x = 0, cur_y = 0; int first = 1; int last_logo_x = 0, last_logo_y = 0; int last_input_x = 0, last_input_y = 0; // the menu wxMenuBar* menuBar; extern "C" void wxTextScreen(); char *fooargv[2] = {"UCBLogo", 0}; // This is for stopping logo asynchronously #ifdef SIG_TAKES_ARG extern "C" RETSIGTYPE logo_stop(int); extern "C" RETSIGTYPE logo_pause(int); #else extern "C" RETSIGTYPE logo_stop(); extern "C" RETSIGTYPE logo_pause(); #endif int logo_stop_flag = 0; int logo_pause_flag = 0; // this is a static reference to the main terminal wxTerminal *wxTerminal::terminal; // ---------------------------------------------------------------------------- // constants // ---------------------------------------------------------------------------- enum { Menu_File = 200, Menu_File_Save, Menu_File_Save_As, Menu_File_Load, Menu_File_Page_Setup, Menu_File_Print_Text, Menu_File_Print_Text_Prev, Menu_File_Print_Turtle, Menu_File_Print_Turtle_Prev, Menu_File_Quit, Menu_Edit = 300, Menu_Edit_Copy, Menu_Edit_Paste, Menu_Logo = 400, Menu_Logo_Stop, Menu_Logo_Pause, Menu_Font = 500, Menu_Font_Choose, Menu_Font_Inc, Menu_Font_Dec, Menu_Help = 600, Menu_Help_Man, Edit_Menu_File = 700, Edit_Menu_File_Close_Accept, Edit_Menu_File_Close_Reject, Edit_Menu_File_Page_Setup, Edit_Menu_File_Print_Text, Edit_Menu_Edit = 800, Edit_Menu_Edit_Copy, Edit_Menu_Edit_Paste, Edit_Menu_Edit_Cut, Edit_Menu_Edit_Find, Edit_Menu_Edit_Find_Next }; // ---------------------------------------------------------------------------- // LogoApplication class // ---------------------------------------------------------------------------- bool LogoApplication::OnInit() { logoFrame = new LogoFrame (_T("Berkeley Logo")); logoFrame->Show(TRUE); SetTopWindow(logoFrame); #ifndef __WXMAC__ m_mainLoop = new wxEventLoop(); #endif logoEventManager = new LogoEventManager(this); return TRUE; } extern "C" int start (int, char **); int LogoApplication::OnRun() { wxEventLoop::SetActive(m_mainLoop); //SetExitOnFrameDelete(true); wxSetWorkingDirectory(wxStandardPaths::Get().GetDocumentsDir()); // fix the working directory in mac #ifdef __WXMAC__ char path[1024]; CFBundleRef mainBundle = CFBundleGetMainBundle(); assert( mainBundle ); CFURLRef mainBundleURL = CFBundleCopyBundleURL( mainBundle); assert( mainBundleURL); CFStringRef cfStringRef = CFURLCopyFileSystemPath( mainBundleURL, kCFURLPOSIXPathStyle); assert( cfStringRef); CFStringGetCString( cfStringRef, path, 1024, kCFStringEncodingASCII); CFRelease( mainBundleURL); CFRelease( cfStringRef); //std::string pathString(path); pathString = path; pathString+="/Contents/Resources/"; // chdir(pathString.c_str()); #endif start(1, fooargv); return 0; } int LogoApplication::OnExit() { return 0; } // ---------------------------------------------------------------------------- // LogoEventManager class // ---------------------------------------------------------------------------- LogoEventManager::LogoEventManager(LogoApplication *logoApp) { m_logoApp = logoApp; } extern "C" void wx_refresh(); void LogoEventManager::ProcessEvents(int force_yield) { static int inside_yield = 0; static int yield_delay = 500; // carefully tuned fudge factor static int foo = yield_delay; foo--; if( m_logoApp->Pending() ) { while( m_logoApp->Pending() ) m_logoApp->Dispatch(); } else { if(force_yield || foo == 0) { if(!inside_yield) { inside_yield++; m_logoApp->Yield(TRUE); inside_yield--; } } } if(foo == 0) { wx_refresh(); foo = yield_delay; } } // ---------------------------------------------------------------------------- // LogoFrame class // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE (LogoFrame, wxFrame) EVT_MENU(Menu_File_Save, LogoFrame::OnSave) EVT_MENU(Menu_File_Save_As, LogoFrame::OnSaveAs) EVT_MENU(Menu_File_Load, LogoFrame::OnLoad) EVT_MENU(Menu_File_Page_Setup, TurtleCanvas::OnPageSetup) EVT_MENU(Menu_File_Print_Text, LogoFrame::OnPrintText) EVT_MENU(Menu_File_Print_Text_Prev, LogoFrame::OnPrintTextPrev) EVT_MENU(Menu_File_Print_Turtle, TurtleCanvas::PrintTurtleWindow) EVT_MENU(Menu_File_Print_Turtle_Prev, TurtleCanvas::TurtlePrintPreview) EVT_MENU(Menu_File_Quit, LogoFrame::OnQuit) EVT_MENU(Menu_Edit_Copy, LogoFrame::DoCopy) EVT_MENU(Menu_Edit_Paste, LogoFrame::DoPaste) EVT_MENU(Menu_Logo_Pause, LogoFrame::DoPause) EVT_MENU(Menu_Logo_Stop, LogoFrame::DoStop) EVT_MENU(Menu_Font_Choose, LogoFrame::OnSelectFont) EVT_MENU(Menu_Font_Inc, LogoFrame::OnIncreaseFont) EVT_MENU(Menu_Font_Dec, LogoFrame::OnDecreaseFont) EVT_MENU(Edit_Menu_File_Close_Accept, LogoFrame::OnEditCloseAccept) EVT_MENU(Edit_Menu_File_Close_Reject, LogoFrame::OnEditCloseReject) EVT_MENU(Edit_Menu_File_Page_Setup, TurtleCanvas::OnPageSetup) EVT_MENU(Edit_Menu_File_Print_Text, LogoFrame::OnEditPrint) EVT_MENU(Edit_Menu_Edit_Copy, LogoFrame::OnEditCopy) EVT_MENU(Edit_Menu_Edit_Cut, LogoFrame::OnEditCut) EVT_MENU(Edit_Menu_Edit_Paste, LogoFrame::OnEditPaste) EVT_MENU(Edit_Menu_Edit_Find, LogoFrame::OnEditFind) EVT_MENU(Edit_Menu_Edit_Find_Next, LogoFrame::OnEditFindNext) EVT_CLOSE(LogoFrame::OnCloseWindow) END_EVENT_TABLE() #include "ucblogo.xpm" extern "C" void wxSetTextColor(int fg, int bg); //this should compute the size based on the chosen font! LogoFrame::LogoFrame (const wxChar *title, int xpos, int ypos, int width, int height) : wxFrame( (wxFrame *) NULL, -1, title, wxPoint(xpos, ypos), wxSize(width, height)) { // the topsizer allows different resizeable segments in the main frame (i.e. for // turtle graphics and the terminal displaying simultaneously) SetMinSize(wxSize(100, 100)); SetIcon(wxIcon(ucblogo)); logoFrame = this; topsizer = new wxBoxSizer( wxVERTICAL ); wxTerminal::terminal = new wxTerminal (this, -1, wxPoint(-1, -1), TERM_COLS, TERM_ROWS, _T("")); turtleGraphics = new TurtleCanvas( this ); wxFont f(FONT_CFG(wx_font_face, wx_font_size)); wxTerminal::terminal->SetFont(f); AdjustSize(); wxSetTextColor(7+SPECIAL_COLORS, 0+SPECIAL_COLORS); editWindow = new TextEditor( this, -1, _T(""), wxDefaultPosition, wxSize(100,60), wxTE_MULTILINE|wxTE_RICH, f); wxTerminal::terminal->isEditFile=0; topsizer->Add( editWindow, 1, // make vertically stretchable wxEXPAND | // make horizontally stretchable wxALL, // and make border all around 2 ); topsizer->Add( turtleGraphics, 4, // make vertically stretchable wxEXPAND | // make horizontally stretchable wxALL, // and make border all around 2 ); topsizer->Add( wxTerminal::terminal, 1, // make vertically stretchable wxEXPAND | // make horizontally stretchable wxALL, // and make border all around 2 ); topsizer->Show(wxTerminal::terminal, 1); topsizer->Show(turtleGraphics, 0); topsizer->Show(editWindow, 0); SetSizer( topsizer ); //SetAutoLayout(true); //topsizer->Fit(this); //topsizer->SetSizeHints(this); wxTerminal::terminal->SetFocus(); SetUpMenu(); } extern "C" int wx_leave_mainloop; void LogoFrame::OnCloseWindow(wxCloseEvent& event) { logo_stop_flag = 1; wx_leave_mainloop++; Destroy(); } extern "C" int need_save; void LogoFrame::OnQuit(wxCommandEvent& event) { if (need_save) { wxMessageDialog dialog( NULL, _T("Save workspace before quitting?"), _T("Quit Logo"), wxYES_DEFAULT|wxYES_NO|wxCANCEL); switch ( dialog.ShowModal() ) { case wxID_YES: LogoFrame::OnSave(event); /* falls through */ case wxID_NO: Close(TRUE); } } else Close(TRUE); } void LogoFrame::SetUpMenu(){ int i; if(!menuBar) menuBar = new wxMenuBar( wxMB_DOCKABLE ); else for(i=menuBar->GetMenuCount()-1;i>=0;i--) delete menuBar->Remove(i); wxMenu *fileMenu = new wxMenu; fileMenu->Append( Menu_File_Load, _T("Load Logo Session \tCtrl-O")); fileMenu->Append( Menu_File_Save, _T("Save Logo Session \tCtrl-S")); fileMenu->Append( Menu_File_Save_As, _T("Save As...")); fileMenu->AppendSeparator(); fileMenu->Append( Menu_File_Page_Setup, _T("Page Setup")); fileMenu->Append( Menu_File_Print_Text, _T("Print Text Window")); fileMenu->Append( Menu_File_Print_Text_Prev, _T("Print Preview Text Window")); fileMenu->Append( Menu_File_Print_Turtle, _T("Print Turtle Graphics")); fileMenu->Append( Menu_File_Print_Turtle_Prev, _T("Turtle Graphics Print Preview")); fileMenu->AppendSeparator(); fileMenu->Append(Menu_File_Quit, _T("Quit UCBLogo \tCtrl-Q")); wxMenu *editMenu = new wxMenu; menuBar->Append(fileMenu, _T("&File")); menuBar->Append(editMenu, _T("&Edit")); wxMenu *logoMenu = new wxMenu; // #ifdef __WXMSW__ // editMenu->Append(Menu_Edit_Copy, _T("Copy \tCtrl-C")); // editMenu->Append(Menu_Edit_Paste, _T("Paste \tCtrl-V")); // // logoMenu->Append(Menu_Logo_Pause, _T("Pause \tCtrl-P")); // logoMenu->Append(Menu_Logo_Stop, _T("Stop \tCtrl-S")); // #else editMenu->Append(Menu_Edit_Copy, _T("Copy \tCtrl-C")); editMenu->Append(Menu_Edit_Paste, _T("Paste \tCtrl-V")); logoMenu->Append(Menu_Logo_Pause, _T("Pause \tAlt-P")); logoMenu->Append(Menu_Logo_Stop, _T("Stop \tAlt-S")); // #endif menuBar->Append(logoMenu, _T("&Logo")); wxMenu *fontMenu = new wxMenu; fontMenu->Append(Menu_Font_Choose, _T("Select Font...")); fontMenu->Append(Menu_Font_Inc, _T("Increase Font Size \tCtrl-+")); fontMenu->Append(Menu_Font_Dec, _T("Decrease Font Size \tCtrl--")); menuBar->Append(fontMenu, _T("&Font")); /*wxMenu *helpMenu = new wxMenu; helpMenu->Append(Menu_Help_Man, _T("Browse Online Manual")); menuBar->Append(helpMenu, _T("&Help"));*/ SetMenuBar(menuBar); } void LogoFrame::DoCopy(wxCommandEvent& WXUNUSED(event)){ wxTerminal::terminal->DoCopy(); } void LogoFrame::DoPaste(wxCommandEvent& WXUNUSED(event)){ wxTerminal::terminal->DoPaste(); } extern "C" void new_line(FILE *); int firstloadsave = 1; extern "C" void *save_name; void doSave(char * name, int length); void doLoad(char * name, int length); extern "C" void *cons(void*, void*); extern "C" void lsave(void*); void LogoFrame::OnSave(wxCommandEvent& event) { if (save_name != NULL) { lsave(cons(save_name, NULL)); } else { OnSaveAs(event); } } void LogoFrame::OnSaveAs(wxCommandEvent& WXUNUSED(event)) { wxFileDialog dialog(this, _T("Save Logo Workspace"), *wxEmptyString, wxEmptyString, _T("Logo workspaces(*.lg)|*.lg|All files(*)|*"), // "*", wxFD_SAVE|wxFD_OVERWRITE_PROMPT|wxFD_CHANGE_DIR ); // dialog.SetFilterIndex(1); if (dialog.ShowModal() == wxID_OK) { doSave((char *)dialog.GetPath().char_str(wxConvUTF8), dialog.GetPath().length()); new_line(stdout); } firstloadsave = 0; } void LogoFrame::OnLoad(wxCommandEvent& WXUNUSED(event)){ wxFileDialog dialog ( this, _T("Load Logo Workspace"), *wxEmptyString, wxEmptyString, _T("Logo workspaces(*.lg)|*.lg|All files(*)|*"), // "*", wxFD_OPEN|wxFD_FILE_MUST_EXIST|wxFD_CHANGE_DIR ); if (dialog.ShowModal() == wxID_OK) { doLoad((char *)dialog.GetPath().char_str(wxConvUTF8), dialog.GetPath().length()); new_line(stdout); } firstloadsave = 0; } void LogoFrame::OnPrintText(wxCommandEvent& WXUNUSED(event)){ wxHtmlEasyPrinting *htmlPrinter=wxTerminal::terminal->htmlPrinter; if(!htmlPrinter){ htmlPrinter = new wxHtmlEasyPrinting(); int fontsizes[] = { 6, 8, 12, 14, 16, 20, 24 }; htmlPrinter->SetFonts(_T("Courier"),_T("Courier"), fontsizes); } wxString *textString = wxTerminal::terminal->get_text(); htmlPrinter->PrintText(*textString); delete textString; } void LogoFrame::OnPrintTextPrev(wxCommandEvent& WXUNUSED(event)){ wxHtmlEasyPrinting *htmlPrinter=wxTerminal::terminal->htmlPrinter; if(!htmlPrinter){ htmlPrinter = new wxHtmlEasyPrinting(); int fontsizes[] = { 6, 8, 12, 14, 16, 20, 24 }; htmlPrinter->SetFonts(_T("Courier"),_T("Courier"), fontsizes); } wxString *textString = wxTerminal::terminal->get_text(); htmlPrinter->PreviewText(*textString,_T("")); } extern "C" void wxSetFont(char *fm, int sz); void LogoFrame::OnSelectFont(wxCommandEvent& WXUNUSED(event)) { wxFontData data; data.SetInitialFont(wxTerminal::terminal->GetFont()); wxFontDialog dialog(this, data); if ( dialog.ShowModal() == wxID_OK ) { wxFontData retData = dialog.GetFontData(); wxFont font = retData.GetChosenFont(); wxSetFont((char *)font.GetFaceName().char_str(wxConvUTF8), font.GetPointSize()); } } void LogoFrame::OnIncreaseFont(wxCommandEvent& WXUNUSED(event)){ int expected; wxFont font = wxTerminal::terminal->GetFont(); expected = font.GetPointSize()+1; // see that we have the font we are trying to use // since for some fonts, the next size is +2 while(font.GetPointSize() != expected && expected <= 24){ expected++; font.SetPointSize(expected); } wxSetFont(wx_font_face, expected); } void LogoFrame::OnDecreaseFont(wxCommandEvent& WXUNUSED(event)){ int expected; wxFont font = wxTerminal::terminal->GetFont(); expected = font.GetPointSize()-1; // see that we have the font we are trying to use while(font.GetPointSize() != expected && expected >= 6){ expected--; font.SetPointSize(expected); } wxSetFont(wx_font_face, expected); } extern "C" void *Unbound; extern "C" void *IncreaseFont(void *) { wxCommandEvent dummy; logoFrame->OnIncreaseFont(dummy); return Unbound; } extern "C" void *DecreaseFont(void *) { wxCommandEvent dummy; logoFrame->OnDecreaseFont(dummy); return Unbound; } void LogoFrame::AdjustSize() { int char_width, char_height; wxTerminal::terminal->GetCharSize(&char_width, &char_height); wxSize sz(char_width * TERM_COLS, char_height * TERM_ROWS + 5 ); SetClientSize(sz); //Layout(); } void LogoFrame::DoStop(wxCommandEvent& WXUNUSED(event)){ logo_stop_flag = 1; } void LogoFrame::DoPause(wxCommandEvent& WXUNUSED(event)){ logo_pause_flag = 1; } void LogoFrame::OnEditCloseAccept(wxCommandEvent& WXUNUSED(event)){ editWindow->OnCloseAccept(); } void LogoFrame::OnEditCloseReject(wxCommandEvent& WXUNUSED(event)){ editWindow->OnCloseReject(); } void LogoFrame::OnEditPrint(wxCommandEvent& WXUNUSED(event)){ editWindow->DoPrint(); } void LogoFrame::OnEditCopy(wxCommandEvent& WXUNUSED(event)){ editWindow->DoCopy(); } void LogoFrame::OnEditCut(wxCommandEvent& WXUNUSED(event)){ editWindow->DoCut(); } void LogoFrame::OnEditPaste(wxCommandEvent& WXUNUSED(event)){ editWindow->Paste(); } void LogoFrame::OnEditFind(wxCommandEvent& WXUNUSED(event)){ editWindow->OnFind(); } void LogoFrame::OnEditFindNext(wxCommandEvent& WXUNUSED(event)){ editWindow->OnFindNext(); } void LogoFrame::OnEditSave(wxCommandEvent& WXUNUSED(event)){ editWindow->OnSave(); } void LogoFrame::SetUpEditMenu(){ int i; for(i=menuBar->GetMenuCount()-1;i>=0;i--) delete menuBar->Remove(i); wxMenu *fileMenu = new wxMenu; fileMenu->Append( Edit_Menu_File_Close_Accept, _T("Close and Accept Changes \tAlt-A")); fileMenu->Append( Edit_Menu_File_Close_Reject, _T("Close and Revert Changes \tAlt-R")); fileMenu->AppendSeparator(); fileMenu->Append( Edit_Menu_File_Page_Setup, _T("Page Setup")); fileMenu->Append( Edit_Menu_File_Print_Text, _T("Print... \tCtrl-P")); wxMenu *editMenu = new wxMenu; menuBar->Append(fileMenu, _T("&File")); menuBar->Append(editMenu, _T("&Edit")); editMenu->Append(Edit_Menu_Edit_Cut, _T("Cut \tCtrl-X")); editMenu->Append(Edit_Menu_Edit_Copy, _T("Copy \tCtrl-C")); editMenu->Append(Edit_Menu_Edit_Paste, _T("Paste \tCtrl-V")); editMenu->AppendSeparator(); editMenu->Append(Edit_Menu_Edit_Find, _T("Find... \tCtrl-F")); editMenu->Append(Edit_Menu_Edit_Find_Next, _T("Find Next \tCtrl-G")); wxMenu *fontMenu = new wxMenu; fontMenu->Append(Menu_Font_Choose, _T("Select Font...")); fontMenu->Append(Menu_Font_Inc, _T("Increase Font Size \tCtrl-+")); fontMenu->Append(Menu_Font_Dec, _T("Decrease Font Size \tCtrl--")); menuBar->Append(fontMenu, _T("&Font")); logoFrame->SetMenuBar(menuBar); } // ---------------------------------------------------------------------------- // wxTerminal // ---------------------------------------------------------------------------- BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_MY_CUSTOM_COMMAND, 7777) END_DECLARE_EVENT_TYPES() DEFINE_EVENT_TYPE(wxEVT_MY_CUSTOM_COMMAND) #define EVT_MY_CUSTOM_COMMAND(id, fn) \ DECLARE_EVENT_TABLE_ENTRY( \ wxEVT_MY_CUSTOM_COMMAND, id, -1, \ (wxObjectEventFunction)(wxEventFunction)(wxCommandEventFunction)&fn, \ (wxObject *) NULL \ ), BEGIN_DECLARE_EVENT_TYPES() DECLARE_EVENT_TYPE(wxEVT_TERM_CUSTOM_COMMAND, 7777) END_DECLARE_EVENT_TYPES() DEFINE_EVENT_TYPE(wxEVT_TERM_CUSTOM_COMMAND) #define wxEVT_TERM_CUSTOM_COMMAND(id, fn) \ DECLARE_EVENT_TABLE_ENTRY( \ wxEVT_TERM_CUSTOM_COMMAND, id, -1, \ (wxObjectEventFunction)(wxEventFunction)(wxCommandEventFunction)&fn, \ (wxObject *) NULL \ ), BEGIN_EVENT_TABLE(wxTerminal, wxWindow) EVT_ERASE_BACKGROUND(wxTerminal::OnEraseBackground) EVT_PAINT(wxTerminal::OnPaint) EVT_CHAR(wxTerminal::OnChar) EVT_LEFT_DOWN(wxTerminal::OnLeftDown) EVT_LEFT_UP(wxTerminal::OnLeftUp) EVT_MOTION(wxTerminal::OnMouseMove) //EVT_MY_CUSTOM_COMMAND(-1, wxTerminal::Flush) EVT_SIZE(wxTerminal::OnSize) EVT_KILL_FOCUS(wxTerminal::LoseFocus) END_EVENT_TABLE() wxCommandEvent * haveInputEvent = new wxCommandEvent(wxEVT_MY_CUSTOM_COMMAND); extern "C" void color_init(void); wxTerminal::wxTerminal(wxWindow* parent, wxWindowID id, const wxPoint& pos, int width, int height, const wxString& name) : wxScrolledWindow(parent, id, pos, wxSize(-1, -1), wxWANTS_CHARS|wxVSCROLL, name) // wxScrolledWindow(parent, id, pos, wxSize(-1, -1), wxWANTS_CHARS, name) { //allocating char structures. term_chars = (wxterm_char_buffer *) malloc(sizeof(wxterm_char_buffer)); memset(term_chars, '\0', sizeof(wxterm_char_buffer)); term_lines = (wxterm_line_buffer *) malloc(sizeof(wxterm_line_buffer)); memset(term_lines, 0, sizeof(wxterm_line_buffer)); term_chars->next = 0; term_lines->next = 0; //initializations curr_line_pos.buf = term_lines; curr_line_pos.offset = 0; line_of(curr_line_pos).buf = term_chars; line_of(curr_line_pos).offset = 0; curr_char_pos.buf = term_chars; curr_char_pos.offset = 0; //curr_char_pos line_length not used! //initializing history hist_inptr = hist_outptr = cmdHistory; m_width = width; m_height = height; m_currMode = 0; y_max = 0; x_max = m_width - 1; // start us out not in char mode logo_char_mode = 0; // For printing the text htmlPrinter = 0; // set_mode_flag(DESTRUCTBS); wxTerminal::terminal = this; int i; m_selecting = FALSE; m_selx1 = m_sely1 = m_selx2 = m_sely2 = 0; m_seloldx1 = m_seloldy1= m_seloldx2 = m_seloldy2 = 0; //m_marking = FALSE; m_curX = -1; m_curY = -1; // m_boldStyle = FONT; GetColors(m_colors); color_init(); SetBackgroundStyle(wxBG_STYLE_CUSTOM); SetBackgroundColour(TurtleCanvas::colors[m_curBG]); SetMinSize(wxSize(50, 50)); for(i = 0; i < 16; i++) m_colorPens[i] = wxPen(m_colors[i], 1, wxSOLID); m_printerFN = 0; m_printerName = 0; wxClientDC dc(this); GetCharSize(&m_charWidth, &m_charHeight); //dc.GetTextExtent("M", &m_charWidth, &m_charHeight); // m_charWidth--; m_inputReady = FALSE; m_inputLines = 0; // int x, y; //GetSize(&x, &y); // parent->SetSize(-1,-1, m_charWidth * width, m_charHeight * height + 1); // SetScrollbars(m_charWidth, m_charHeight, 0, 30); //SetScrollRate(0, m_charHeight); //SetVirtualSize(m_charWidth * width, 2 * m_charHeight); //1 row (nothing displayed yet) // ResizeTerminal(width, height); } wxTerminal::~wxTerminal() { //clean up the buffers wxTerminal::terminal = 0; } void wxTerminal::deferUpdate(int flag) { if (flag) set_mode_flag(DEFERUPDATE); else clear_mode_flag(DEFERUPDATE); } void wxTerminal::set_mode_flag(int flag) { m_currMode |= flag; } void wxTerminal::clear_mode_flag(int flag) { m_currMode &= ~flag; } bool wxTerminal::SetFont(const wxFont& font) { wxWindow::SetFont(font); m_normalFont = font; m_underlinedFont = font; m_underlinedFont.SetUnderlined(TRUE); m_boldFont = font; m_boldFont.SetWeight(wxFONTWEIGHT_BOLD); m_boldUnderlinedFont = m_boldFont; m_boldUnderlinedFont.SetUnderlined(TRUE); GetCharSize(&m_charWidth, &m_charHeight); // wxClientDC // dc(this); // dc.GetTextExtent("M", &m_charWidth, &m_charHeight); // m_charWidth--; ResizeTerminal(m_width, m_height); if(!(m_currMode & DEFERUPDATE)) { Refresh(); } return TRUE; } void wxTerminal::GetCharSize(int *cw, int *ch) { wxClientDC dc(this); //int dummy; //dc.GetTextExtent("M", cw, &dummy); //dc.GetTextExtent("(", &dummy, ch); int descent, extlead; dc.GetTextExtent(wxString("M", wxConvUTF8, wxString::npos), cw, ch, &descent, &extlead); //for the tails of g's and y's, if needed. #ifdef __WXMSW__ *ch += descent + extlead + 1; #endif } void wxTerminal::GetColors(wxColour colors[16] /*, wxTerminal::BOLDSTYLE boldStyle*/) { colors[0] = wxColour(0, 0, 0); // black colors[1] = wxColour(255, 0, 0); // red colors[2] = wxColour(0, 255, 0); // green colors[3] = wxColour(255, 0, 255); // yellow colors[4] = wxColour(0, 0, 255); // blue colors[5] = wxColour(255, 255, 0); // magenta colors[6] = wxColour(0, 255, 255); // cyan colors[7] = wxColour(255, 255, 255); // white colors[8] = wxColour(0, 0, 0); // black colors[9] = wxColour(255, 0, 0); // red colors[10] = wxColour(0, 255, 0); // green colors[11] = wxColour(255, 0, 255); // yellow colors[12] = wxColour(0, 0, 255); // blue colors[13] = wxColour(255, 255, 0); // magenta colors[14] = wxColour(0, 255, 255); // cyan colors[15] = wxColour(255, 255, 255); // white } /* * ProcessInput() * * passes input to logo, one line at a time * and prints to terminal as well * * assumes cursor is set at last logo position already */ void wxTerminal::ProcessInput() { //pass input up to newline. int i; for(i = 0; i < input_index; i++) { if(input_buffer[i] == '\n') break; } PassInputToTerminal(i+1,input_buffer); //include '\n' last_logo_x = cursor_x; last_logo_y = cursor_y; PassInputToInterp(); m_inputLines--; if(!m_inputLines) m_inputReady = FALSE; } /* * Flush() * * Handles output from logo */ void wxTerminal::Flush (){ set_mode_flag(BOLD); if(output_index == 0) { clear_mode_flag(BOLD); return; } bool cursor_moved = FALSE; if(input_index != 0){ // set the cursor in the proper place setCursor(last_logo_x, last_logo_y); // scroll_region(last_logo_y, last_logo_y + 1, -1); cursor_moved = TRUE; } //calculate new cursor location if (output_index != 0) { ClearSelection(); //eventually, only clear if overlap with updated region? PassInputToTerminal(output_index, output_buffer); output_index = 0; } //save current cursor position to last_logo last_logo_x = cursor_x; last_logo_y = cursor_y; clear_mode_flag(BOLD); if(cursor_moved/* && readingInstruction*/){ cursor_moved = FALSE; if(m_inputReady && readingInstruction) { ProcessInput(); } else { //pass the input up to the current input location to terminal //e.g. cpos is 6, then pass chars 0 to 5 to terminal (6 chars) PassInputToTerminal(input_current_pos, input_buffer); int new_cursor_x = cursor_x, new_cursor_y = cursor_y; //pass the rest of input to terminal //e.g. inputindex is 20, then pass chars 6 to 19 to terminal (14 chars) PassInputToTerminal(input_index-input_current_pos, input_buffer+input_current_pos); // set last_input coords last_input_x = cursor_x; last_input_y = cursor_y; // and set cursor back to proper location setCursor(new_cursor_x, new_cursor_y); } } if(!(m_currMode & DEFERUPDATE)) { Refresh(); } } /* PassInputToInterp() takes all characters in the input buffer up to the FIRST '\n' and hands them off to the logo interpreter if logo_char_mode, then just send the character ** does not edit cursor locations! */ void wxTerminal::PassInputToInterp() { int i; if(logo_char_mode){ //buff[buff_index++] = input_buffer[--input_index]; buff_push(input_buffer[--input_index]); input_index = 0; input_current_pos = 0; } else { for (i = 0; i < input_index; i++) { buff_push(input_buffer[i]); if(input_buffer[i] == '\n') { break; } } int saw_newline = i; //so create a string of size i+1 and copy the contents over char *histline = (char *)malloc(1+i); for(i = 0; i < saw_newline; i++) { histline[i] = input_buffer[i]; } histline[saw_newline] = 0; //put it in the history *hist_inptr++ = histline; if (hist_inptr >= &cmdHistory[HIST_MAX]) { //wraparound hist_inptr = cmdHistory; } if (*hist_inptr) { free(*hist_inptr); *hist_inptr = 0; } hist_outptr = hist_inptr; for(i = saw_newline + 1; i < input_index; i++) { input_buffer[i - saw_newline - 1] = input_buffer[i]; } // a to b, length is b - a + 1 input_index = input_index - saw_newline - 1; input_current_pos = input_index; } } void wxTerminal::DoCopy(){ if (wxTheClipboard->Open()) { // This data objects are held by the clipboard, // so do not delete them in the app. wxTheClipboard->SetData( new wxTextDataObject(GetSelection()) ); wxTheClipboard->Close(); } } void wxTerminal::DoPaste(){ if (wxTheClipboard->Open()) { if (wxTheClipboard->IsSupported( wxDF_TEXT )) { wxClientDC dc(this); wxTextDataObject data; wxTheClipboard->GetData( data ); wxString s = data.GetText(); int i; //char chars[2]; char c; int num_newlines = 0; int len; char prev = ' '; for (i = 0; i < s.Length() && input_index < MAXINBUFF; i++){ len = 1; c = s.GetChar(i); if (c == '\n') { num_newlines++; } if (prev == ' ' && c == ' ') { continue; } prev = c; if(input_index < MAXINBUFF) { input_buffer[input_index++] = c; } else { break; } ClearSelection(); PassInputToTerminal(len, &c); } m_inputLines = num_newlines; input_current_pos = input_index; } wxTheClipboard->Close(); } } void wxTerminal::LoseFocus (wxFocusEvent & event) { } extern "C" int keyact_set(void); extern "C" void do_keyact(int); /* OnChar is called each time the user types a character in the main terminal window */ void wxTerminal::OnChar(wxKeyEvent& event) { ClearSelection(); int keyCode = 0, len; char buf[10]; keyCode = (int)event.GetKeyCode(); if (!readingInstruction && !reading_char_now && keyact_set()) { if (keyCode == WXK_RETURN) { keyCode = '\n'; } else if (keyCode == WXK_BACK) { keyCode = 8; } else if (keyCode >= WXK_START) { /* ignore it */ return; //not sure about this (evan) } else { } if (event.ControlDown()) keyCode &= 0237; if (event.AltDown()) keyCode += 0200; do_keyact(keyCode); } else if(logo_char_mode){ if (keyCode == WXK_RETURN) { keyCode = '\n'; } else if (keyCode == WXK_BACK) { keyCode = 8; } else if (keyCode >= WXK_START) { /* ignore it */ return; //not sure about this (evan) } else { } if (event.ControlDown()) keyCode &= 0237; if (event.AltDown()) keyCode += 0200; if(input_index < MAXINBUFF) { input_buffer[input_index++] = keyCode; input_current_pos++; PassInputToInterp(); } } else if (keyCode == WXK_RETURN) { //the following condition should never happen. //input_buffer is size MAXINBUFF+1, to leave room for \n char //this is the only code segment that's allowed to add a \n //in that last slot. if(input_index > MAXINBUFF) fprintf(stderr, "onChar: WXK_RETURN, moved past end of input buffer. Should never happen!\n"); if(input_current_pos < input_index) { setCursor(last_input_x, last_input_y); } // buf[0] = 10; //buf[1] = 13; //len = 2; input_buffer[input_index++] = '\n'; input_current_pos = input_index; char newline = '\n'; PassInputToTerminal(1,&newline); m_inputReady = TRUE; m_inputLines++; if(readingInstruction) { setCursor(last_logo_x, last_logo_y); ProcessInput(); } else { last_input_x = cursor_x; last_input_y = cursor_y; } } else if (keyCode == WXK_BACK) { handle_backspace(); } else if (keyCode == WXK_UP) { // up handle_history_prev(); } else if (keyCode == WXK_DOWN) { // down handle_history_next(); } else if (keyCode == WXK_LEFT) { // left handle_left(); } else if (keyCode == WXK_RIGHT) { // right handle_right(); } else if (keyCode == WXK_TAB) { // tab //do nothing for now. could be tab completion later. } else if (keyCode == WXK_DELETE) { // DEL key if(input_current_pos < input_index) { handle_right(); handle_backspace(); } } else if (keyCode == WXK_HOME) { //HOME key handle_home(); } else if (keyCode == WXK_END) { //END key handle_end(); } else if (keyCode >= WXK_START) { /* ignore it */ } else { if(input_index >= MAXINBUFF) return; buf[0] = keyCode; len = 1; int doInsert = 0; if (input_current_pos < input_index ) { // we are in the middle of input doInsert = 1; int i; for (i = input_index; i >= input_current_pos + 1; i--) { input_buffer[i] = input_buffer[i - 1]; } input_buffer[input_current_pos] = keyCode; input_index++; input_current_pos++; } else { input_buffer[input_index++] = keyCode; input_current_pos++; } if (doInsert) { cur_x = cursor_x; cur_y = cursor_y; //remember, input_current_pos - 1 has last character typed PassInputToTerminal(input_index - (input_current_pos - 1), (input_buffer + (input_current_pos - 1))); //now the cursor is where the last input position is last_input_x = cursor_x; last_input_y = cursor_y; //set cursor back to cursorPos if (cur_x == x_max) setCursor(0, cur_y + 1); else setCursor(cur_x+1, cur_y); } else { PassInputToTerminal(len, buf); //now the cursor is where the last input position is last_input_x = cursor_x; last_input_y = cursor_y; } } if(!(m_currMode & DEFERUPDATE)) { Refresh(); } } void wxTerminal::handle_backspace() { if (input_index == 0) return; if (input_current_pos == 0) return; bool removing_newline = FALSE; if(input_buffer[input_current_pos-1] == '\n') { removing_newline = TRUE; } for (int i = input_current_pos; i < input_index; i++) { input_buffer[i-1] = input_buffer[i]; } input_index--; input_current_pos--; cur_x = cursor_x - 1, cur_y = cursor_y; if(cur_x < 0) { wxterm_linepos cpos = GetLinePosition(cursor_y - 1); // x_max if wrapped line, line_length otherwise. cur_x = min(x_max, line_of(cpos).line_length); cur_y = cursor_y - 1; setCursor(cur_x, cur_y); } else { setCursor(cur_x, cur_y); } PassInputToTerminal(input_index - input_current_pos, input_buffer + input_current_pos); //cursor_x , cursor_y now at input's last location last_input_x = cursor_x; last_input_y = cursor_y; if(removing_newline) { //add a second newline, to erase contents of the last //input line. //this causes a very specific "feature".... //if last input line contains other noninput chars //then doing this will erase them too //this situation can happen when you use setcursor and hit Backspace... //it's a very specific situation that should not clash with //intended behavior... char nl = '\n'; PassInputToTerminal(1, &nl); PassInputToTerminal(1, &nl); //pass two newlines m_inputLines--; //merged two lines } else { char spc = ' '; PassInputToTerminal(1, &spc); } //set cursor back to backspace'd location setCursor(cur_x,cur_y); } void wxTerminal::handle_home() { setCursor(last_logo_x, last_logo_y); input_current_pos = 0; } void wxTerminal::handle_end() { setCursor(last_input_x, last_input_y); input_current_pos = input_index; } void wxTerminal::handle_clear_to_end() { #if 0 //old code that put spaces everyhwere... int xval; int yval; xval = cursor_x; yval = cursor_y; int i; for (i = input_current_pos; i < input_index; i++) { if(input_buffer[i] == '\n') { input_buffer[i] = '\n'; } else { input_buffer[i] = ' '; } } PassInputToTerminal(input_index-input_current_pos, &input_buffer[i]); setCursor(xval, yval); #else //make the current position the end of the buffer //update line structure accordingly char_of(curr_char_pos) = '\0'; line_of(curr_line_pos).line_length = cursor_x; y_max = cursor_y; #endif } // warning: the history buffer WRAPS around! // so to detect for the beginning/end, check for NULL string pointer void wxTerminal::handle_history_prev() { // Now get a history entry if (--hist_outptr < cmdHistory) { hist_outptr = &cmdHistory[HIST_MAX-1]; } if (*hist_outptr == 0) { wxBell(); hist_outptr++; //put it back to where it was if (hist_outptr >= &cmdHistory[HIST_MAX]) { //wraparound hist_outptr = cmdHistory; } return; } #if 0 //if we're not currently storing anything //in latest_history_buffer: //store current input buffer in it. //we are about to change the input if(!latest_history_stored) { strcpy(latest_history_buffer, input_buffer); latest_history_buffer[input_index] = 0; latest_history_stored++; } #endif handle_home(); //go to the start of input int hist_len = strlen((const char *) *hist_outptr); strcpy(input_buffer, (char *)*hist_outptr); PassInputToTerminal(hist_len, input_buffer); m_inputLines = 0; input_current_pos = hist_len; handle_clear_to_end(); //clear to the old end of input_buffer input_index = hist_len; //cursor_x , cursor_y now at input's last location last_input_x = cursor_x; last_input_y = cursor_y; } void wxTerminal::handle_history_next() { if (*hist_outptr != 0) { hist_outptr++; } if (hist_outptr >= &cmdHistory[HIST_MAX]) { //wraparound hist_outptr = cmdHistory; } if(*hist_outptr == 0) { #if 0 //if latest_history_buffer is not empty, put that here. if(latest_history_stored) { handle_home(); //go to front int latest_len = strlen(latest_history_buffer); PassInputToTerminal(latest_len, latest_history_buffer); strcpy(input_buffer, latest_history_buffer); input_current_pos = latest_len; handle_clear_to_end(); //clear to old end of input input_index = latest_len; m_inputLines = 0; latest_history_stored--; //cursor_x , cursor_y now at input's last location last_input_x = cursor_x; last_input_y = cursor_y; } else { wxBell(); } #else wxBell(); handle_home(); handle_clear_to_end(); input_current_pos = 0; input_index = 0; m_inputLines = 0; //cursor_x , cursor_y now at input's last location last_input_x = cursor_x; last_input_y = cursor_y; #endif return; } handle_home(); //jump to beginning int hist_len = strlen((const char *) *hist_outptr); strcpy(input_buffer, (char *)*hist_outptr); PassInputToTerminal(hist_len, input_buffer); m_inputLines = 0; input_current_pos = hist_len; handle_clear_to_end(); //clear to old end of input_buffer input_index = hist_len; //cursor_x , cursor_y now at input's last location last_input_x = cursor_x; last_input_y = cursor_y; } void wxTerminal::handle_left() { if(input_current_pos > 0) { if (cursor_x - 1 < 0) { //if previous char is a newline, then cursor goes to line_length //otherwise, it's a wrapped line, and should go to the end // just use min... wxterm_linepos cpos = GetLinePosition(cursor_y - 1); setCursor(min(x_max, line_of(cpos).line_length), cursor_y - 1); } else { setCursor(cursor_x - 1, cursor_y); } input_current_pos--; } } void wxTerminal::handle_right() { if(input_current_pos < input_index) { if (input_buffer[input_current_pos] == '\n' || cursor_x + 1 > x_max) { setCursor(0, cursor_y + 1); } else { setCursor(cursor_x + 1, cursor_y); } input_current_pos++; } } void wxTerminal::setCursor (int x, int y, bool fromLogo) { int vis_x,vis_y; GetViewStart(&vis_x,&vis_y); if(fromLogo) { //need to change to unscrolled coordinates if(x < 0 || x > m_width || y < 0 || y > m_height) { return; } //GetViewStart(&cursor_x,&cursor_y); cursor_x = x; cursor_y = vis_y + y; } else { cursor_x = x; cursor_y = y; } int want_x, want_y; want_x = cursor_x; want_y = cursor_y; if(cursor_y < 0) { fprintf(stderr, "cursor_y < 0 in setcursor. BAD \n"); } cursor_y = min(cursor_y,y_max); curr_line_pos = GetLinePosition(cursor_y); curr_char_pos = line_of(curr_line_pos); if(cursor_y < want_y || cursor_x > curr_char_pos.line_length) { cursor_x = curr_char_pos.line_length; } curr_char_pos.offset = curr_char_pos.offset + cursor_x; adjust_charpos(curr_char_pos); if(fromLogo && (cursor_x != want_x || cursor_y != want_y)) { //add spaces until we get to desired location if(cursor_x > x_max) { cursor_x = 0; cursor_y++; inc_linepos(curr_line_pos); } char space = ' '; char newline = '\n'; while(cursor_y != want_y) { PassInputToTerminal(1,&newline); } while(cursor_x != want_x) { PassInputToTerminal(1,&space); } } if(!(m_currMode & DEFERUPDATE)) { if(cursor_y >= vis_y && cursor_y <= vis_y + m_height - 1) { } else { Scroll(-1, cursor_y); // Refresh(); } } } void wxTerminal::OnSize(wxSizeEvent& event) { int x, y; GetSize(&x, &y); //leave one char on the right for scroll bar width if (m_width == (x / m_charWidth) - 1 && m_height == y / m_charHeight) return; x = (x / m_charWidth) - 1; y = y / m_charHeight; if (x < 1) x = 1; if (y < 1) y = 1; ResizeTerminal(x,y); Scroll(-1, cursor_y); Refresh(); } wxMemoryDC * currentMemDC = NULL; wxBitmap * currentBitmap = NULL; int oldWidth = -1; int oldHeight = -1; void wxTerminal::OnEraseBackground(wxEraseEvent &WXUNUSED(event)) { //don't erase background.. for double buffering! } extern "C" void wxSetTextColor(int fg, int bg) { wxTerminal::terminal->m_curFG = fg; wxTerminal::terminal->m_curBG = bg; wxTerminal::terminal->SetBackgroundColour( TurtleCanvas::colors[wxTerminal::terminal->m_curBG]); } void wxTerminal::OnPaint(wxPaintEvent &WXUNUSED(event)) { wxBufferedPaintDC dc(this); DoPrepareDC(dc); dc.SetBackground(TurtleCanvas::colors[m_curBG]); dc.Clear(); OnDraw(dc); } void wxTerminal::OnDraw(wxDC& dc) { //DebugOutputBuffer(); wxRect rectUpdate = GetUpdateRegion().GetBox(); CalcUnscrolledPosition(rectUpdate.x, rectUpdate.y, &rectUpdate.x, &rectUpdate.y); int lineFrom = rectUpdate.y / m_charHeight; int lineTo = rectUpdate.GetBottom() / m_charHeight; if ( lineTo > y_max) lineTo = y_max; //find the position! wxterm_linepos tlpos; tlpos.buf = term_lines; wxterm_charpos tline; tlpos.offset = lineFrom; adjust_linepos(tlpos); for ( int line = lineFrom; line <= lineTo; line++ ) { tline = line_of(tlpos); for ( int col = 0; col < tline.line_length; col++ ) { DrawText(dc, m_curFG, m_curBG, mode_of(tline), col, line, 1, &char_of(tline)); inc_charpos(tline); } inc_linepos(tlpos); } //draw text cursor as line if visible if(lineFrom <= cursor_y && cursor_y <= lineTo && !(m_currMode & CURSORINVISIBLE)) { int c_x = cursor_x; int c_y = cursor_y; int t_x = c_x*m_charWidth; int t_y = c_y*m_charHeight; dc.SetPen(wxPen(TurtleCanvas::colors[terminal->m_curFG],1)); dc.DrawLine( t_x, t_y, t_x, t_y + m_charHeight); } MarkSelection(dc,FALSE); } // gets the click coordinate (unscrolled) in terms of characters void wxTerminal::GetClickCoords(wxMouseEvent& event, int *click_x, int *click_y) { // pixel coordinates *click_x = event.GetX(); *click_y = event.GetY(); CalcUnscrolledPosition(*click_x, *click_y, click_x, click_y); // convert to character coordinates *click_x = *click_x / m_charWidth; *click_y = *click_y / m_charHeight; if(*click_x < 0) { *click_x = 0; } else if(*click_x > x_max) { *click_x = x_max; } if(*click_y < 0) { *click_y = 0; } else if(*click_y > y_max) { *click_y = y_max; } } void wxTerminal::OnLeftDown(wxMouseEvent& event) { m_selecting = TRUE; int click_x, click_y; GetClickCoords(event, &click_x, &click_y); m_selx1 = m_selx2 = click_x; m_sely1 = m_sely2 = click_y; //Refresh(); event.Skip(); //let native handler reset focus } void wxTerminal::OnLeftUp(wxMouseEvent& event) { if ((m_sely2 != m_sely1 || m_selx2 != m_selx1)) { if (wxTheClipboard->Open() ) { // This data objects are held by the clipboard, // so do not delete them in the app. wxTheClipboard->SetData( new wxTextDataObject(GetSelection()) ); wxTheClipboard->Close(); } } m_selecting = FALSE; if (HasCapture()) { // uncapture mouse ReleaseMouse(); } } void wxTerminal::OnMouseMove(wxMouseEvent& event) { if(m_selecting) { int click_x, click_y; GetClickCoords(event, &click_x, &click_y); m_selx2 = click_x; m_sely2 = click_y; if(!HasCapture()) { CaptureMouse(); } } if(!(m_currMode & DEFERUPDATE)) { Refresh(); } } void wxTerminal::ClearSelection() { if (m_sely2 != m_sely1 || m_selx2 != m_selx1) { m_sely2 = m_sely1; m_selx2 = m_selx1; } if(!(m_currMode & DEFERUPDATE)) { Refresh(); } } void wxTerminal::InvertArea(wxDC &dc, int t_x, int t_y, int w, int h, bool scrolled_coord) { if(scrolled_coord) { CalcScrolledPosition(t_x,t_y,&t_x,&t_y); //calculate if out of bounds // if(t_x < 0 || t_x > m_width * m_charWidth || // t_y < 0 || t_y > m_height * m_charHeight) { // return; //} } if (w > 0 && h > 0) { #ifndef __WXMAC__ dc.Blit( t_x, t_y, w, h, &dc, t_x, t_y, wxINVERT); #endif } } void wxTerminal::MarkSelection(wxDC &dc, bool scrolled_coord) { int pic_x1, pic_y1, pic_x2, pic_y2; if(m_sely1 > m_sely2 || (m_sely1 == m_sely2 && m_selx1 > m_selx2)) { pic_x1 = m_selx2; pic_y1 = m_sely2; pic_x2 = m_selx1; pic_y2 = m_sely1; } else { pic_x1 = m_selx1; pic_y1 = m_sely1; pic_x2 = m_selx2; pic_y2 = m_sely2; } if(pic_y1 == pic_y2) { InvertArea(dc, pic_x1 * m_charWidth, pic_y1 * m_charHeight, (pic_x2 - pic_x1)*m_charWidth, m_charHeight, scrolled_coord); } else if(pic_y1 < pic_y2) { InvertArea(dc, pic_x1 * m_charWidth, pic_y1 * m_charHeight, (x_max - pic_x1) * m_charWidth, m_charHeight, scrolled_coord); InvertArea(dc, 0, (pic_y1 + 1)*m_charHeight, x_max * m_charWidth, (pic_y2 - pic_y1 - 1)*m_charHeight, scrolled_coord); InvertArea(dc, 0, pic_y2*m_charHeight, pic_x2*m_charWidth, m_charHeight, scrolled_coord); } } bool wxTerminal::HasSelection() { return(m_selx1 != m_selx2 || m_sely1 != m_sely2); } /* * Gets characters from x1,y1 up to , but not including x2,y2 */ wxString wxTerminal::GetChars(int x1, int y1, int x2, int y2) { int tx,ty; if(y1 > y2 || (y1 == y2 && x1 > x2)) { tx = x1; ty = y1; x1 = x2; y1 = y2; x2 = tx; y2 = ty; } //this case from dragging the mouse position off screen. if(x1 < 0) x1 = 0; if(x2 < 0) x2 = 0; if(y1 < 0) y1 = 0; if(y2 < 0) y2 = 0; wxString ret; if(0 < y1 && y1 > y_max) { return ret; } wxterm_charpos a = GetCharPosition(0,y1); a.offset = a.offset + min(x1, max(0,a.line_length - 1)); adjust_charpos(a); wxterm_charpos b = GetCharPosition(0,min(y2, y_max)); b.offset = b.offset + min(x2, b.line_length); adjust_charpos(b); while(a.buf != b.buf) { // size 10, offset 5, copy 10-5=5 chars... yup ret.Append((wxChar*)a.buf->cbuf+a.offset, WXTERM_CB_SIZE-a.offset); if(a.buf->next) { a.offset = 0; a.buf = a.buf->next; } else { //bad fprintf(stderr, "BAD (getchars)\n"); } } ret.Append((wxChar*)a.buf->cbuf+a.offset, b.offset - a.offset); return ret; } wxString wxTerminal::GetSelection() { return GetChars(m_selx1,m_sely1,m_selx2,m_sely2); } void wxTerminal::SelectAll() { m_selx1 = 0; m_sely1 = 0; m_selx2 = x_max; m_sely2 = y_max; //Refresh(); } wxterm_linepos wxTerminal::GetLinePosition(int y) { wxterm_linepos lpos; lpos.buf = term_lines; lpos.offset = y; adjust_linepos(lpos); return lpos; } wxterm_charpos wxTerminal::GetCharPosition(int x, int y) { wxterm_charpos ret = line_of(GetLinePosition(y)); if(x > ret.line_length) { fprintf(stderr, "invalid longer than linelength: %d\n", ret.line_length); } ret.offset = ret.offset + x; adjust_charpos(ret); return ret; } void wxTerminal::DrawText(wxDC& dc, int fg_color, int bg_color, int flags, int x, int y, int len, char *string) { wxString str((const char *)string, wxConvUTF8, len); if(flags & BOLD) { if(flags & UNDERLINE) dc.SetFont(m_boldUnderlinedFont); else dc.SetFont(m_boldFont); } else { if(flags & UNDERLINE) dc.SetFont(m_underlinedFont); else dc.SetFont(m_normalFont); } int coord_x, coord_y; dc.SetBackgroundMode(wxSOLID); dc.SetTextBackground(TurtleCanvas::colors[bg_color]); dc.SetTextForeground(TurtleCanvas::colors[fg_color]); coord_y = y * m_charHeight; coord_x = x * (m_charWidth); for(unsigned int i = 0; i < str.Length(); i++, coord_x+=m_charWidth){ //clear the pixels first //dc.Blit(coord_x, coord_y, m_charWidth, m_charHeight, &dc, coord_x, coord_y, wxCLEAR); dc.DrawText(str.Mid(i, 1), coord_x, coord_y); // if(flags & BOLD && m_boldStyle == OVERSTRIKE) // dc.DrawText(str, x + 1, y); if(flags & INVERSE) { InvertArea(dc, coord_x, coord_y, m_charWidth, m_charHeight); // dc.Blit( coord_x, coord_y, m_charWidth, m_charHeight, &dc, coord_x, coord_y, wxINVERT); } } } void wxTerminal::Bell() { wxBell(); } void wxTerminal::RenumberLines(int new_width) { //m_width is the OLD WIDTH at this point of the code. wxterm_linepos l_pos; l_pos.buf = term_lines; l_pos.offset = 0; wxterm_charpos c_pos; c_pos.buf = term_chars; c_pos.line_length = 0; c_pos.offset = 0; wxterm_charpos last_logo_pos = GetCharPosition(last_logo_x,last_logo_y); //IMPORTANT: // * line_number stores the current line we're looking at, // * c_pos.line_length is how far into the current line we are // * c_pos.offset is the offset into the BUFFER int line_number = 0; //run until see '\0' int next_line = 0; // flag to say "mark next line". while(char_of(c_pos) != '\0') { if(c_pos.buf == curr_char_pos.buf && c_pos.offset == curr_char_pos.offset) { cursor_x = c_pos.line_length; cursor_y = line_number; curr_line_pos = l_pos; } if(c_pos.buf == last_logo_pos.buf && c_pos.offset == last_logo_pos.offset) { last_logo_x = c_pos.line_length; last_logo_y = line_number; } if(char_of(c_pos) == '\n') { next_line = 1; } else { c_pos.line_length++; if(c_pos.line_length == new_width) { next_line = 1; } } inc_charpos(c_pos); if(next_line) { line_of(l_pos).line_length = c_pos.line_length; inc_linepos(l_pos); line_of(l_pos).buf = c_pos.buf; line_of(l_pos).offset = c_pos.offset; c_pos.line_length = 0; next_line = 0; line_number++; } } if(c_pos.buf == curr_char_pos.buf && c_pos.offset == curr_char_pos.offset) { cursor_x = c_pos.line_length; cursor_y = line_number; curr_line_pos = l_pos; } if(c_pos.buf == last_logo_pos.buf && c_pos.offset == last_logo_pos.offset) { last_logo_x = c_pos.line_length; last_logo_y = line_number; } line_of(l_pos).line_length = c_pos.line_length; y_max = line_number; //sanity check on variables //fprintf(stderr, "cursor %d %d\n", cursor_x, cursor_y); //fprintf(stderr, "lastlogopos xy %d %d\n", last_logo_x, last_logo_y); } void wxTerminal::ResizeTerminal(int width, int height) { /* ** Set terminal size */ if(width != m_width) { //need to renumber the lines RenumberLines(width); m_width = width; x_max = m_width - 1; } m_height = height; //reset virtual size SetScrollRate(0, m_charHeight); //number of lines is y_max + 1 SetVirtualSize(m_width*m_charWidth,(y_max+1)*m_charHeight); } void wxTerminal::DebugOutputBuffer() { //debugging wxterm_linepos lpos; lpos.buf = term_lines; lpos.offset = 0; wxterm_charpos pos_1 = line_of(lpos); // fprintf(stderr, "WXTERMINAL STATS: \n width: %d, height: %d, \n cw: %d, ch: %d \n x_max: %d, y_max: %d \n cursor_x: %d, cursor_y: %d \n last_logo_x : %d, last_logo_y: %d \ncurr_charpos buf %d offset %d \ncurr_line buf %d offset %d\n", m_width, m_height, m_charWidth, m_charHeight, x_max, y_max,cursor_x, cursor_y, last_logo_x, last_logo_y,(int)curr_char_pos.buf, curr_char_pos.offset, (int)curr_line_pos.buf, curr_line_pos.offset); // fprintf(stderr, "WXTERMINAL CHARACTER BUFFER\n###############\n"); while(char_of(pos_1) != '\0') { if(char_of(pos_1) == '\n') { fprintf(stderr, "\\n\n"); } else { fprintf(stderr,"%c", char_of(pos_1)); } inc_charpos(pos_1); } fprintf(stderr, "|"); fprintf(stderr, "\n#############\n"); fprintf(stderr, "WXTERMINAL LINE BUFFER\n##############\n"); for(int i = 0; i <= y_max; i++) { // fprintf(stderr, "LINE %d: buf: %d, offset: %d, len: %d\n", i,(int)line_of(lpos).buf, line_of(lpos).offset, line_of(lpos).line_length); inc_linepos(lpos); } fprintf(stderr, "\n#############\n\n"); } void wxTerminal::InsertChar(char c) { //insert a character at current location //if there is a newline at the current location and we're not inserting one // scenario: // Buffer: abcde\nfgh // * X * // X = current position // * = line locations // // After insert k: // abcdek\nfgh // * X * if(char_of(curr_char_pos) == '\n' && c != '\n') { // check case if we're about to insert the last character of the line if(line_of(curr_line_pos).line_length < m_width - 1) { //have to add characters to current line, //bump characters up. wxterm_linepos lpos = curr_line_pos; wxterm_charpos pos_1 = curr_char_pos; wxterm_charpos pos_2 = pos_1; inc_charpos(pos_2); // Method of relocating characters: // need two variables, S = save, G = grab // // save 1, // S1 G // 12345678 // // grab 2, place 1, save 2 // // S2 G2 // _1345678 // // grab 3, place 2, save 3... // // S3 G3 // _1245678 // // etc... // ends when next position to grab is '\0' // (allocate buffer when necesary) // grab 8, place 7, save 8 // place 8 in that last position char save_char, save_mode; char grab_char, grab_mode; save_char = char_of(pos_1); save_mode = mode_of(pos_1); while(char_of(pos_2) != '\0') { grab_char = char_of(pos_2); grab_mode = mode_of(pos_2); char_of(pos_2) = save_char; mode_of(pos_2) = save_mode; save_char = grab_char; save_mode = grab_mode; inc_charpos(pos_1); inc_charpos(pos_2); } //insert "save" into pos2 char_of(pos_2) = save_char; mode_of(pos_2) = save_mode; //now bump all the lines up. //look at the current line number (cursor_y) // go until y_max, and adjust position of all lines +1 inc_linepos(lpos); for(int lnum = cursor_y+1; lnum <= y_max; lnum++) { inc_charpos(line_of(lpos)); inc_linepos(lpos); } } } char_of(curr_char_pos) = c; mode_of(curr_char_pos) = m_currMode; inc_charpos(curr_char_pos); } void wxTerminal::NextLine() { //points next line position to current char position, and increments line offset. inc_linepos(curr_line_pos); line_of(curr_line_pos).buf = curr_char_pos.buf; line_of(curr_line_pos).offset = curr_char_pos.offset; //line_of(curr_line_pos).line_length = 0; cursor_y++; if(cursor_y > y_max) { y_max = cursor_y; int x,y; GetVirtualSize(&x,&y); //y_max + 1 = number of lines SetVirtualSize(max(x,m_width*m_charWidth),max(y,(y_max+1)*m_charHeight)); } cursor_x = 0; } void wxTerminal::PassInputToTerminal(int len, char *data) { int i; int numspaces, j; wxterm_linepos lpos; wxterm_charpos pos_1, pos_2; int new_line_length; int vis_x,vis_y; GetViewStart(&vis_x,&vis_y); static int old_vis_y = 0; char spc = ' '; for(i = 0; i < len; i++) { switch(data[i]) { case TOGGLE_STANDOUT: // char 17 //enter/exit standout mode , ignore character m_currMode ^= INVERSE; break; case '\t': // formula is: (8 - (cursorpos%8)) spaces numspaces = (8 - (cursor_x % 8)); if(numspaces == 0) { numspaces = 8; } for(j = 0; j < numspaces; j++) { InsertChar(spc); cursor_x++; if(cursor_x > line_of(curr_line_pos).line_length) { line_of(curr_line_pos).line_length = cursor_x; } if(cursor_x > x_max) { //tab should stop inserting spaces. NextLine(); break; //out of the for loop } } break; case '\r': case '\n': new_line_length = cursor_x; InsertChar('\n'); if(i + 1 < len && ((data[i] == '\r' && data[i+1] == '\n') || //LF+CR (data[i] == '\n' && data[i+1] == '\r'))) { //CR+LF i++; } // this case triggers when you do // ? setcursor [0 0] // and then press // if this is commented out, it will still work, but the characters // will remain in the buffer! if(new_line_length < line_of(curr_line_pos).line_length && cursor_y < y_max) { //shift all the characters down. //(remove characters between inserted newline and end of line) lpos = curr_line_pos; inc_linepos(lpos); pos_1 = curr_char_pos; pos_2 = line_of(lpos); while(char_of(pos_1) != '\0') { if(char_of(pos_2) != '\0' && pos_2.buf == line_of(lpos).buf && pos_2.offset == line_of(lpos).offset) { line_of(lpos).buf = pos_1.buf; line_of(lpos).offset = pos_1.offset; inc_linepos(lpos); } char_of(pos_1) = char_of(pos_2); mode_of(pos_1) = mode_of(pos_2); inc_charpos(pos_1); inc_charpos(pos_2); } } line_of(curr_line_pos).line_length = new_line_length; NextLine(); break; default: InsertChar(data[i]); cursor_x++; if(cursor_x > line_of(curr_line_pos).line_length) { line_of(curr_line_pos).line_length = cursor_x; } if(cursor_x > x_max) { NextLine(); } break; } } if(!(m_currMode & DEFERUPDATE)) { //scroll if cursor current cursor not visible or // if we're not reading an instruction (logo output) // old_vis_y keeps track of whether the screen has changed lately if((!readingInstruction && 1 || //don't use old_vis_y?? vis_y != old_vis_y) || cursor_y < vis_y || cursor_y > vis_y + m_height - 1) { Scroll(-1, cursor_y); old_vis_y = vis_y; //Refresh(); } } } wxString * wxTerminal::get_text() { // int i; wxString *outputString = new wxString(); outputString->Clear(); outputString->Append(_T("\n")); outputString->Append(_T("\n")); outputString->Append(_T("\n")); wxString txt = GetChars(0,0,x_max,y_max); txt.Replace(_T("\n"),_T("
\n")); outputString->Append(txt); /* wxterm_linepos tlpos = term_lines; for(i=0;iappend(textString->Mid(linenumbers[i]*MAXWIDTH),MAXWIDTH); outputString->append(_T("
")); }*/ outputString->Append(_T("<\\FONT>")); outputString->Append(_T("<\\BODY>")); outputString->Append(_T("<\\HTML>")); // delete textString; return outputString; } void wxTerminal::SelectPrinter(char *PrinterName) { if(m_printerFN) { if(m_printerName[0] == '#') fclose(m_printerFN); else #if defined(__WXMSW__) fclose(m_printerFN); #else pclose(m_printerFN); #endif m_printerFN = 0; } if(m_printerName) { free(m_printerName); m_printerName = 0; } if(strlen(PrinterName)) { m_printerName = strdup(PrinterName); } } void wxTerminal::PrintChars(int len, char *data) { char pname[100]; if(!m_printerFN) { if(!m_printerName) return; if(m_printerName[0] == '#') { #if defined(__WXMSW__) sprintf(pname, "lpt%d", m_printerName[1] - '0' + 1); #else sprintf(pname, "/dev/lp%d", m_printerName[1] - '0'); #endif m_printerFN = fopen(pname, "wb"); } else { #if defined(__WXMSW__) m_printerFN = fopen(m_printerName, "wb"); #else sprintf(pname, "lpr -P%s", m_printerName); m_printerFN = popen(pname, "w"); #endif } } if(m_printerFN) { fwrite(data, len, 1, m_printerFN); } } // ---------------------------------------------------------------------------- // Functions called from the interpreter thread // ---------------------------------------------------------------------------- extern "C" void setCharMode(int mode){ logo_char_mode = mode; //if turning charmode off, flush the //buffer (not the input buffer, logo's buffer) if(!logo_char_mode) { char tmp; while(!buff_empty) { buff_pop(tmp); } } } extern "C" void wxClearText() { wxTerminal::terminal->ClearScreen(); // output_index = 0; } void wxTerminal::ClearScreen() { if(y_max > 0) { int x,y; GetVirtualSize(&x,&y); SetVirtualSize(max(x,m_width*m_charWidth),max(y,(y_max+1+m_height)*m_charHeight)); Scroll(-1,y_max+1); int vx,vy; GetViewStart(&vx,&vy); //pretend setcursor from logo so that it can insert spaces if needed wxClientDC dc(this); setCursor(0,y_max + 1 - vy, TRUE); if(!(m_currMode & DEFERUPDATE)) { Refresh(); } } } //currently does nothing. void wxTerminal::EnableScrolling(bool want_scrolling) { //wxScrolledWindow::EnableScrolling(FALSE,want_scrolling); //doesn't work return; } extern "C" void flushFile(FILE * stream); extern "C" void wxSetCursor(int x, int y){ //just call wxTerminal::setCursor with a special flag. flushFile(stdout); wxTerminal::terminal->EnableScrolling(FALSE); wxClientDC dc(wxTerminal::terminal); wxTerminal::terminal->setCursor(x,y,TRUE); } extern "C" void wxSetFont(char *fm, int sz) { int adjust_label = 0; if(fm != wx_font_face) { strcpy(wx_font_face, fm); adjust_label++; } wx_font_size = sz; wxFont f(FONT_CFG(wx_font_face, wx_font_size)); wxTerminal::terminal->SetFont(f); editWindow->SetFont(f); //TurtleCanvas memDC, set size depending on scrunch! if(adjust_label) { turtleGraphics->SetFont(f); } logoFrame->AdjustSize(); } extern "C" void wx_enable_scrolling() { wxTerminal::terminal->EnableScrolling(TRUE); } extern enum s_md {SCREEN_TEXT, SCREEN_SPLIT, SCREEN_FULL} screen_mode; extern "C" int check_wx_stop(int force_yield) { logoEventManager->ProcessEvents(force_yield); //give focus to terminal if text window shown //and Frame has focus wxWindow * focus_win = wxWindow::FindFocus(); if(wxTerminal::terminal && //screen_mode != SCREEN_FULL && // screen_text or screen_split mode !(focus_win == (wxWindow *)wxTerminal::terminal) && (focus_win == (wxWindow *)logoFrame)) { wxTerminal::terminal->SetFocus(); } if (logo_stop_flag) { logo_stop_flag = 0; #ifdef SIG_TAKES_ARG logo_stop(0); #else logo_stop(); #endif return 1; } if (logo_pause_flag) { logo_pause_flag = 0; #ifdef SIG_TAKES_ARG logo_pause(0); #else logo_pause(); #endif return 0; } return 0; } extern "C" int internal_check(){ if (logo_stop_flag) { logo_stop_flag = 0; #ifdef SIG_TAKES_ARG logo_stop(0); #else logo_stop(); #endif return 1; } if (logo_pause_flag) { logo_pause_flag = 0; #ifdef SIG_TAKES_ARG logo_pause(0); #else logo_pause(); #endif return 1; } return 0; } extern "C" int getTermInfo(int type){ switch (type){ case X_COORD: return wxTerminal::terminal->cursor_x; break; case Y_COORD: int vx,vy; wxTerminal::terminal->GetViewStart(&vx,&vy); return wxTerminal::terminal->cursor_y - vy; break; case X_MAX: //return wxTerminal::terminal->x_max; return wxTerminal::terminal->m_width; break; case Y_MAX: //return wxTerminal::terminal->y_max; return wxTerminal::terminal->m_height; break; case EDIT_STATE: return editWindow->stateFlag; break; default: return -1; } return -1; } extern "C" void setTermInfo(int type, int val){ switch (type){ case X_COORD: //wxTerminal::terminal->x_coord=val; return; break; case Y_COORD: //wxTerminal::terminal->y_coord=val; return; break; case X_MAX: return; //wxTerminal::terminal->x_max=val; break; case Y_MAX: return; //wxTerminal::terminal->y_max=val; break; case EDIT_STATE: editWindow->stateFlag=val; break; } } extern "C" void doClose() { extern int wx_leave_mainloop; if(!wx_leave_mainloop) { logoFrame->Close(TRUE); } } ucblogo-6.1/wxMain.h0000664000175000017500000000005013557147341012533 0ustar jjcjjcvoid init_wx(); void putInBuff(char c); ucblogo-6.1/wxMain.cpp0000664000175000017500000001267213577775676013127 0ustar jjcjjc#include #include #include "LogoFrame.h" #include #include #include #include "stdio.h" #include "wxTurtleGraphics.h" #include "wxGlobals.h" #ifdef __WXMAC__ #include #endif #include #include "wxTerminal.h" /* must come after wxTurtleGraphics.h */ std::string pathString; #include #ifdef HAVE_UNISTD_H #include #endif int wx_Debugging = 0; // start the application IMPLEMENT_APP(LogoApplication) extern "C" NODE *cons(NODE *, NODE *); extern "C" NODE *make_static_strnode(char *); extern "C" NODE *lload(NODE *); extern "C" NODE *lsave(NODE *); extern int logo_stop_flag; extern "C" int stop_quietly_flag; // ---------------------------------------------------------------------------- // Globals // ---------------------------------------------------------------------------- // externs from the logo interpreter extern "C" int start (int , char **); extern "C" void redraw_graphics(); // need to redraw turtle graphics int needToRefresh = 0; // IO buffer handling char nameBuffer [NAME_BUFFER_SIZE]; int nameBufferSize = 0; char output_buffer[MAXOUTBUFF]; int output_index = 0; char buff[BUFF_LEN]; int buff_push_index = 0; int buff_pop_index = 0; // ---------------------------------------------------------------------------- // misc functions // ---------------------------------------------------------------------------- extern "C" void wxLogoExit(int code) { } #define LINEPAUSE 25 // flush the output extern "C" void flushFile(FILE * stream) { static int numLines = 0; char * temp; if (numLines >= LINEPAUSE) { wxMilliSleep(1); numLines = 0; } else numLines++; wxTerminal::terminal->Flush(); } // have the interpreter go to sleep extern "C" void *eval_buttonact; extern "C" void wxLogoSleep(unsigned int milli) { //may not work on mac according to wxWidgets doc wxDateTime stop_waiting = wxDateTime::UNow() + wxTimeSpan(0,0,0,milli); flushFile(stdout); extern void wx_refresh(); wx_refresh(); if(milli <= 100) { wxMilliSleep(milli); return; } while(wxDateTime::UNow().IsEarlierThan(stop_waiting)) { if(check_wx_stop(1) || eval_buttonact) { //force yielding break; } wx_refresh(); wxMilliSleep(10); } } /* Called by the logo thread to display a character onto the terminal screen */ extern "C" void printToScreen(char c, FILE * stream) { if (stream != stdout) { putc(c, stream); return; } if (c == 0x7) { /* ^G */ wxBell(); return; } if(TurtleFrame::in_graphics_mode && !TurtleFrame::in_splitscreen) // we are in fullscreen mode wxSplitScreen(); if (output_index >= (MAXOUTBUFF - 1)) { flushFile(stdout); } if (c == '\n') { output_buffer[output_index++] = 10; output_buffer[output_index++] = 13; flushFile(stdout); } else { output_buffer[output_index++] = c; } } extern "C" char getFromWX_2(FILE * f) ; extern "C" char getFromWX() { return getFromWX_2(stdin); } extern "C" char getFromWX_2(FILE * f) { int putReturn = 0; if (f != stdin) { return getc(f); } // while (buff_index == 0 && !putReturn) { while(buff_empty && !putReturn) { if(needToRefresh){ redraw_graphics(); wxdprintf("wxMain after calling redraw graphics\n"); needToRefresh = 0; turtleGraphics->Refresh(); wxdprintf("after wxMain calling refresh()"); } // Do this while the lock is released just in case the longjump occurs if (check_wx_stop(1)) { // force yield (1) putReturn = 1; } flushFile(stdout); //if (buff_index == 0 && !putReturn) if (buff_empty && !putReturn) wxMilliSleep(1); // don't wait too long now... } char c; if (putReturn) c = '\n'; else buff_pop(c); return c; } extern "C" int wxKeyp() { int ret = 0; if (!buff_empty) ret = 1; return ret; } extern "C" int wxUnget_c(int c, FILE * f) { if (f != stdin) return ungetc(c, f); else { buff_push((char)c); return c; } } extern "C" void getExecutableDir(char * path, int maxlen) { wxString executable = wxStandardPaths::Get().GetExecutablePath(); wxString executable_dir = wxFileName(executable).GetPath(); strncpy(path, executable_dir, maxlen); path[maxlen - 1] = '\0'; } void doLoad(char * name, int length) { int i = 0; while (i < length && i < NAME_BUFFER_SIZE) { nameBuffer[i] = name[i]; i++; } nameBufferSize = (length >= NAME_BUFFER_SIZE? NAME_BUFFER_SIZE : length); (void)lload(cons(make_static_strnode(name),NIL)); stop_quietly_flag = 1; logo_stop_flag = 1; } void doSave(char * name, int length) { int i = 0; while (i < length && i < NAME_BUFFER_SIZE) { nameBuffer[i] = name[i]; i++; } nameBufferSize = (length >= NAME_BUFFER_SIZE? NAME_BUFFER_SIZE : length); (void)lsave(cons(make_static_strnode(name),NIL)); stop_quietly_flag = 1; logo_stop_flag = 1; } extern "C" const char* wxMacGetLibloc(){ #ifdef __WXMAC__ static std::string libloc; libloc=pathString; libloc+="logolib"; return libloc.c_str(); #endif return 0; } extern "C" const char* wxMacGetCslsloc(){ #ifdef __WXMAC__ static std::string cslsloc; cslsloc=pathString; cslsloc+="csls"; return cslsloc.c_str(); #endif return 0; } extern "C" const char* wxMacGetHelploc(){ #ifdef __WXMAC__ static std::string helploc; helploc=pathString; helploc+="helpfiles"; return helploc.c_str(); #endif return 0; } ucblogo-6.1/wxGraphics.h0000664000175000017500000001242613575571772013432 0ustar jjcjjc /* pen_info is a stucture type with fields for the various pen characteristics including the location, size, color, mode (e.g. XOR or COPY), pattern, visibility (0 = visible) */ typedef struct { int color; int xpos; int ypos; int vis; int pw; int ph; int pen_md; } pen_info; pen_info* getPen(); extern void wxPrepare(); extern void wxSetPenWidth(int width); extern void wxDrawLine(int x1, int y1, int x2, int y2, int vis); extern void wx_clear(); extern void wxLabel(char * string); extern void wxTextScreen(); extern void wxSplitScreen(); extern void wxFullScreen(); extern void wxSetInfo(int type, int val); extern int wxGetMouseX(); extern int wxGetMouseY(); extern int wxGetClickX(); extern int wxGetClickY(); extern int wxGetButton(); extern int wxGetLastButton(); extern void doFilled(int fillcolor, int count, struct mypoint *points); #define SCREEN_WIDTH 1 #define SCREEN_HEIGHT 2 #define BACK_GROUND 3 #define IN_SPLITSCREEN 4 #define IN_GRAPHICS_MODE 5 #define NUMCOLORS 256 #define NUMINITCOLORS 16 #define GR_SIZE 60000 #define prepare_to_draw wxPrepare() #define done_drawing nop() #define prepare_to_draw_turtle nop() #define done_drawing_turtle nop() //#define screen_height (1 + screen_bottom - screen_top) //#define screen_width (1 + screen_right - screen_left) #define screen_width wxGetInfo(SCREEN_WIDTH) #define screen_height wxGetInfo(SCREEN_HEIGHT) #define back_ground wxGetInfo(BACK_GROUND) #define xgr_pen getPen() #define screen_left 0 #define screen_right (screen_width) #define screen_top 0 #define screen_bottom (screen_height) #define screen_x_center (screen_left + (screen_width)/2) #define screen_y_center (screen_top + (screen_height)/2) #define turtle_left_max ((screen_left) - (screen_x_center)) #define turtle_right_max ((screen_right) - (screen_x_center)) #define turtle_top_max ((screen_y_center) - (screen_top)) #define turtle_bottom_max ((screen_y_center) - (screen_bottom)) #define screen_x_coord ((screen_x_center) + turtle_x) #define screen_y_coord ((screen_y_center) - turtle_y) #define turtle_height 18 #define turtle_half_bottom 6.0 #define turtle_side 19.0 #define refresh_screen() wx_refresh(); #define clear_screen wx_clear(); #define erase_screen() wx_clear(); #define line_to(a,b) wxDrawLine(xgr_pen->xpos, \ xgr_pen->ypos,a,b,!xgr_pen->vis);\ xgr_pen->xpos=(a);\ xgr_pen->ypos=(b) #define move_to(a,b) xgr_pen->xpos=(a); \ xgr_pen->ypos=(b); \ turtlePosition_x=screen_x_coord; \ turtlePosition_y=screen_y_coord; #define draw_string(s) wxLabel(s); #define set_pen_vis(v) xgr_pen->vis=(v) #define set_pen_mode(m) xgr_pen->pen_md=(m) #define set_pen_color(c) draw_turtle();\ xgr_pen->color=c%NUMCOLORS;\ draw_turtle(); #define set_back_ground(c) wxSetInfo(BACK_GROUND,c%NUMCOLORS);\ redraw_graphics(); #define set_pen_width(w) wxSetPenWidth(w); #define set_pen_height(h) nop(); #define set_pen_x(x) nop() #define set_pen_y(y) nop() #define p_info_x(p) (p.xpos) #define p_info_y(p) (p.ypos) /* All these should take an argument, like the two just above. Then we could support multiple turtles. */ #define pen_width xgr_pen->pw #define pen_height xgr_pen->pw /* not ph, which isn't set */ #define pen_color xgr_pen->color #define pen_mode xgr_pen->pen_md #define pen_vis xgr_pen->vis #define pen_x (xgr_pen->xpos) #define pen_y (xgr_pen->ypos) #define get_node_pen_pattern (cons(make_intnode(-1), NIL)) #define PEN_REVERSE 0 #define PEN_ERASE 1 #define PEN_DOWN 2 #define pen_reverse pen_mode=PEN_REVERSE #define pen_erase pen_mode=PEN_ERASE #define pen_down pen_mode=PEN_DOWN #define button wxGetButton() #define lastbutton wxGetLastButton() #define mouse_x wxGetMouseX() #define mouse_y wxGetMouseY() #define click_x wxGetClickX() #define click_y wxGetClickY() #define full_screen wxFullScreen() #define split_screen wxSplitScreen() #define text_screen wxTextScreen() #define in_splitscreen wxGetInfo(IN_SPLITSCREEN) #define in_graphics_mode wxGetInfo(IN_GRAPHICS_MODE) #define plain_xor_pen() pen_reverse #define label(s) wxLabel(s) #define tone(p,d) nop() #define get_pen_pattern(p) nop() #define set_pen_pattern(p) nop() #define set_list_pen_pattern(p) nop() extern void set_palette(int, unsigned int, unsigned int, unsigned int); extern void get_palette(int, unsigned int*, unsigned int*, unsigned int*); extern void save_pen(pen_info*), restore_pen(pen_info*); extern void logofill(); /* The sparc has fmod. So I use it. */ /* #define fmod(x,y) x */ extern void nop(); ucblogo-6.1/init.c0000664000175000017500000010044413601420003012211 0ustar jjcjjc/* * init.c logo init module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifdef WIN32 #include #endif //#ifdef HAVE_UNISTD_H #ifndef WIN32 #include #endif #define WANT_EVAL_REGS 1 #include "logo.h" #include "globals.h" #include #include #ifdef HAVE_WX void getExecutableDir(char * path, int maxlen); #endif typedef struct priminfo { char *name; short minargs; short defargs; short maxargs; short priority; NODE *(*prim) (); } PRIMTYPE; NODE *Right_Paren, *Left_Paren, *Redefp, *Caseignoredp, *Erract, *Printdepthlimit, *Printwidthlimit, *Pause, *LoadNoisily, *AllowGetSet, *UnburyOnEdit, *Fullprintp, *Make, *Listvalue, *Dotsvalue, *Unbound, *Not_Enough_Node, *Buttonact, *LogoVersion, *LogoPlatform, *LogoLogo, *CommandLine, *Keyact, #ifdef OBJECTS *askexist, #endif *Minus_Sign, *Minus_Tight, *Startup, *Startuplg, *Query, *UseAlternateNames; NODE *Null_Word = NIL; PRIMTYPE prims[] = { {"*", 1, 1, 1, PREFIX_PRIORITY + 3, lmul}, {"+", 1, 1, 1, PREFIX_PRIORITY + 2, ladd}, {"-", 1, 1, 1, PREFIX_PRIORITY + 2, lsub}, {"--", 1, 1, 1, PREFIX_PRIORITY + 4, lsub}, {".defmacro", 2, 2, 2, PREFIX_PRIORITY, ldefmacro}, {".eq", 2, 2, 2, PREFIX_PRIORITY, l_eq}, {".macro", -1, -1, -1, PREFIX_PRIORITY, lmacro}, {".maybeoutput", 1, 1, 1, MAYBE_PRIORITY, loutput}, {".setbf", 2, 2, 2, PREFIX_PRIORITY, l_setbf}, {".setfirst", 2, 2, 2, PREFIX_PRIORITY, l_setfirst}, {".setitem", 3, 3, 3, PREFIX_PRIORITY, l_setitem}, {".setsegmentsize", 1, 1, 1, PREFIX_PRIORITY, lsetsegsz}, {"/", 1, 1, 1, PREFIX_PRIORITY + 3, ldivide}, {"<", 2, 2, 2, PREFIX_PRIORITY + 1, llessp}, {"=", 2, 2, 2, PREFIX_PRIORITY + 1, lequalp}, {">", 2, 2, 2, PREFIX_PRIORITY + 1, lgreaterp}, {"<=", 2, 2, 2, PREFIX_PRIORITY + 1, llessequalp}, {"<>", 2, 2, 2, PREFIX_PRIORITY + 1, lnotequalp}, {">=", 2, 2, 2, PREFIX_PRIORITY + 1, lgreaterequalp}, {"?", 0, 0, 1, PREFIX_PRIORITY, lqm}, {"allopen", 0, 0, 0, PREFIX_PRIORITY, lallopen}, {"and", 0, 2, -1, PREFIX_PRIORITY, land}, {"apply", 2, 2, 2, MACRO_PRIORITY, lapply}, {"arc", 2, 2, 2, PREFIX_PRIORITY, larc}, {"arctan", 1, 1, 2, PREFIX_PRIORITY, latan}, {"arity", 1, 1, 1, PREFIX_PRIORITY, larity}, {"array", 1, 1, 2, PREFIX_PRIORITY, larray}, {"arrayp", 1, 1, 1, PREFIX_PRIORITY, larrayp}, {"arraytolist", 1, 1, 1, PREFIX_PRIORITY, larraytolist}, {"array?", 1, 1, 1, PREFIX_PRIORITY, larrayp}, {"ascii", 1, 1, 1, PREFIX_PRIORITY, lascii}, {"ashift", 2, 2, 2, PREFIX_PRIORITY, lashift}, #ifdef OBJECTS {"ask", 2, 2, 2, MACRO_PRIORITY, lask}, #endif {"back", 1, 1, 1, PREFIX_PRIORITY, lback}, {"background", 0, 0, 0, PREFIX_PRIORITY, lbackground}, {"beforep", 2, 2, 2, PREFIX_PRIORITY, lbeforep}, {"before?", 2, 2, 2, PREFIX_PRIORITY, lbeforep}, {"bf", 1, 1, 1, PREFIX_PRIORITY, lbutfirst}, {"bfs", 1, 1, 1, PREFIX_PRIORITY, lbfs}, {"bg", 0, 0, 0, PREFIX_PRIORITY, lbackground}, {"bitand", 0, 2, -1, PREFIX_PRIORITY, lbitand}, {"bitnot", 1, 1, 1, PREFIX_PRIORITY, lbitnot}, {"bitor", 0, 2, -1, PREFIX_PRIORITY, lbitor}, {"bitxor", 0, 2, -1, PREFIX_PRIORITY, lbitxor}, {"bk", 1, 1, 1, PREFIX_PRIORITY, lback}, {"bl", 1, 1, 1, PREFIX_PRIORITY, lbutlast}, {"buried", 0, 0, 0, PREFIX_PRIORITY, lburied}, {"buriedp", 1, 1, 1, PREFIX_PRIORITY, lburiedp}, {"buried?", 1, 1, 1, PREFIX_PRIORITY, lburiedp}, {"bury", 1, 1, 1, PREFIX_PRIORITY, lbury}, {"butfirst", 1, 1, 1, PREFIX_PRIORITY, lbutfirst}, {"butfirsts", 1, 1, 1, PREFIX_PRIORITY, lbfs}, {"butlast", 1, 1, 1, PREFIX_PRIORITY, lbutlast}, {"button", 0, 0, 0, PREFIX_PRIORITY, lbutton}, {"buttonp", 0, 0, 0, PREFIX_PRIORITY, lbuttonp}, {"button?", 0, 0, 0, PREFIX_PRIORITY, lbuttonp}, {"bye", 0, 0, 0, PREFIX_PRIORITY, lbye}, {"catch", 2, 2, 2, MACRO_PRIORITY, lcatch}, {"char", 1, 1, 1, PREFIX_PRIORITY, lchar}, {"clean", 0, 0, 0, PREFIX_PRIORITY, lclean}, {"clearscreen", 0, 0, 0, PREFIX_PRIORITY, lclearscreen}, {"cleartext", 0, 0, 0, PREFIX_PRIORITY, lcleartext}, #ifdef HAVE_WX {"clickpos", 0, 0, 0, PREFIX_PRIORITY, lclickpos}, #endif {"close", 1, 1, 1, PREFIX_PRIORITY, lclose}, {"co", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, lcontinue}, {"contents", 0, 0, 0, PREFIX_PRIORITY, lcontents}, {"continue", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, lcontinue}, {"copydef", 2, 2, 2, PREFIX_PRIORITY, lcopydef}, {"cos", 1, 1, 1, PREFIX_PRIORITY, lcos}, {"count", 1, 1, 1, PREFIX_PRIORITY, lcount}, {"cs", 0, 0, 0, PREFIX_PRIORITY, lclearscreen}, {"cslsload", 1, 1, 1, PREFIX_PRIORITY, lcslsload}, {"ct", 0, 0, 0, PREFIX_PRIORITY, lcleartext}, {"cursor", 0, 0, 0, PREFIX_PRIORITY, lcursor}, #ifdef HAVE_WX {"decreasefont", 0, 0, 0, PREFIX_PRIORITY, DecreaseFont}, #endif {"define", 2, 2, 2, PREFIX_PRIORITY, ldefine}, {"definedp", 1, 1, 1, PREFIX_PRIORITY, ldefinedp}, {"defined?", 1, 1, 1, PREFIX_PRIORITY, ldefinedp}, {"difference", 2, 2, 2, PREFIX_PRIORITY, lsub}, {"dribble", 1, 1, 1, PREFIX_PRIORITY, ldribble}, {"ed", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, ledit}, {"edit", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, ledit}, {"editfile", 1, 1, 1, PREFIX_PRIORITY, leditfile}, {"emptyp", 1, 1, 1, PREFIX_PRIORITY, lemptyp}, {"empty?", 1, 1, 1, PREFIX_PRIORITY, lemptyp}, {"eofp", 0, 0, 0, PREFIX_PRIORITY, leofp}, {"eof?", 0, 0, 0, PREFIX_PRIORITY, leofp}, {"epspict", 1, 1, 1, PREFIX_PRIORITY, lepspict}, {"equalp", 2, 2, 2, PREFIX_PRIORITY, lequalp}, {"equal?", 2, 2, 2, PREFIX_PRIORITY, lequalp}, {"er", 1, 1, 1, PREFIX_PRIORITY, lerase}, {"erall", 0, 0, 0, PREFIX_PRIORITY, lerall}, {"erase", 1, 1, 1, PREFIX_PRIORITY, lerase}, {"erasefile", 1, 1, 1, PREFIX_PRIORITY, lerasefile}, {"erf", 1, 1, 1, PREFIX_PRIORITY, lerasefile}, {"erns", 0, 0, 0, PREFIX_PRIORITY, lerns}, {"erpls", 0, 0, 0, PREFIX_PRIORITY, lerpls}, {"erps", 0, 0, 0, PREFIX_PRIORITY, lerps}, {"error", 0, 0, 0, PREFIX_PRIORITY, lerror}, #ifdef OBJECTS {"exist", 0, 0, 0, PREFIX_PRIORITY, lexist}, #endif {"exp", 1, 1, 1, PREFIX_PRIORITY, lexp}, {"fd", 1, 1, 1, PREFIX_PRIORITY, lforward}, {"fence", 0, 0, 0, PREFIX_PRIORITY, lfence}, {"fill", 0, 0, 0, PREFIX_PRIORITY, lfill}, #ifdef HAVE_WX {"filled", 2, 2, 2, PREFIX_PRIORITY, lfilled}, #endif {"first", 1, 1, 1, PREFIX_PRIORITY, lfirst}, {"firsts", 1, 1, 1, PREFIX_PRIORITY, lfirsts}, #ifdef HAVE_WX {"font", 0, 0, 0, PREFIX_PRIORITY, lfont}, #endif {"forever", 1, 1, 1, MACRO_PRIORITY, lforever}, {"form", 3, 3, 3, PREFIX_PRIORITY, lform}, {"forward", 1, 1, 1, PREFIX_PRIORITY, lforward}, {"fput", 2, 2, 2, PREFIX_PRIORITY, lfput}, {"fs", 0, 0, 0, PREFIX_PRIORITY, lfullscreen}, {"fullscreen", 0, 0, 0, PREFIX_PRIORITY, lfullscreen}, {"fulltext", 1, 1, 1, PREFIX_PRIORITY, lfulltext}, {"gc", 0, 0, 1, PREFIX_PRIORITY, lgc}, {"global", 1, 1, -1, PREFIX_PRIORITY, lglobal}, {"goto", 1, 1, 1, MACRO_PRIORITY, lgoto}, {"gprop", 2, 2, 2, PREFIX_PRIORITY, lgprop}, {"greaterp", 2, 2, 2, PREFIX_PRIORITY, lgreaterp}, {"greater?", 2, 2, 2, PREFIX_PRIORITY, lgreaterp}, {"greaterequalp", 2, 2, 2, PREFIX_PRIORITY, lgreaterequalp}, {"greaterequal?", 2, 2, 2, PREFIX_PRIORITY, lgreaterequalp}, #ifdef OBJECTS {"have", 1, 1, 1, PREFIX_PRIORITY, lhave}, #endif {"heading", 0, 0, 0, PREFIX_PRIORITY, lheading}, {"help", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, lhelp}, {"hideturtle", 0, 0, 0, PREFIX_PRIORITY, lhideturtle}, {"home", 0, 0, 0, PREFIX_PRIORITY, lhome}, {"ht", 0, 0, 0, PREFIX_PRIORITY, lhideturtle}, {"if", 2, 2, 3, MACRO_PRIORITY, lif}, {"ifelse", 3, 3, 3, MACRO_PRIORITY, lifelse}, {"iff", 1, 1, 1, MACRO_PRIORITY, liffalse}, {"iffalse", 1, 1, 1, MACRO_PRIORITY, liffalse}, {"ift", 1, 1, 1, MACRO_PRIORITY, liftrue}, {"iftrue", 1, 1, 1, MACRO_PRIORITY, liftrue}, #ifdef HAVE_WX {"increasefont", 0, 0, 0, PREFIX_PRIORITY, IncreaseFont}, #endif {"int", 1, 1, 1, PREFIX_PRIORITY, linteg}, {"item", 2, 2, 2, PREFIX_PRIORITY, litem}, {"keyp", 0, 0, 0, PREFIX_PRIORITY, lkeyp}, {"key?", 0, 0, 0, PREFIX_PRIORITY, lkeyp}, #ifdef OBJECTS {"kindof", 1, 1, -1, PREFIX_PRIORITY, lkindof}, #endif {"label", 1, 1, 1, PREFIX_PRIORITY, llabel}, #ifdef HAVE_WX {"labelsize", 0, 0, 0, PREFIX_PRIORITY, llabelsize}, #endif {"last", 1, 1, 1, PREFIX_PRIORITY, llast}, {"left", 1, 1, 1, PREFIX_PRIORITY, lleft}, {"lessp", 2, 2, 2, PREFIX_PRIORITY, llessp}, {"less?", 2, 2, 2, PREFIX_PRIORITY, llessp}, {"lessequalp", 2, 2, 2, PREFIX_PRIORITY, llessequalp}, {"lessequal?", 2, 2, 2, PREFIX_PRIORITY, llessequalp}, {"list", 0, 2, -1, PREFIX_PRIORITY, llist}, {"listp", 1, 1, 1, PREFIX_PRIORITY, llistp}, {"listtoarray", 1, 1, 2, PREFIX_PRIORITY, llisttoarray}, {"list?", 1, 1, 1, PREFIX_PRIORITY, llistp}, {"ln", 1, 1, 1, PREFIX_PRIORITY, lln}, {"load", 1, 1, 1, PREFIX_PRIORITY, lload}, {"loadpict", 1, 1, 1, PREFIX_PRIORITY, lloadpict}, {"local", 1, 1, -1, PREFIX_PRIORITY, llocal}, {"log10", 1, 1, 1, PREFIX_PRIORITY, llog10}, #ifdef OBJECTS {"logo", 0, 0, 0, PREFIX_PRIORITY, llogo}, #endif {"lowercase", 1, 1, 1, PREFIX_PRIORITY, llowercase}, {"lput", 2, 2, 2, PREFIX_PRIORITY, llput}, {"lshift", 2, 2, 2, PREFIX_PRIORITY, llshift}, {"lt", 1, 1, 1, PREFIX_PRIORITY, lleft}, {"macrop", 1, 1, 1, PREFIX_PRIORITY, lmacrop}, {"macro?", 1, 1, 1, PREFIX_PRIORITY, lmacrop}, {"make", 2, 2, 2, PREFIX_PRIORITY, lmake}, #ifndef HAVE_WX #if defined(WIN32) {"maximize.window", 1, 1, 1, PREFIX_PRIORITY, maximize}, #endif #endif {"member", 2, 2, 2, PREFIX_PRIORITY, lmember}, {"memberp", 2, 2, 2, PREFIX_PRIORITY, lmemberp}, {"member?", 2, 2, 2, PREFIX_PRIORITY, lmemberp}, {"minus", 1, 1, 1, PREFIX_PRIORITY, lsub}, {"modulo", 2, 2, 2, PREFIX_PRIORITY, lmodulo}, {"mousepos", 0, 0, 0, PREFIX_PRIORITY, lmousepos}, #ifdef OBJECTS {"mynamep", 1, 1, 1, PREFIX_PRIORITY, lmynamep}, {"mynames", 0, 0, 0, PREFIX_PRIORITY, lmynames}, {"myprocp", 1, 1, 1, PREFIX_PRIORITY, lmyprocp}, {"myprocs", 0, 0, 0, PREFIX_PRIORITY, lmyprocs}, #endif {"namep", 1, 1, 1, PREFIX_PRIORITY, lnamep}, {"name?", 1, 1, 1, PREFIX_PRIORITY, lnamep}, {"names", 0, 0, 0, PREFIX_PRIORITY, lnames}, {"nodes", 0, 0, 0, PREFIX_PRIORITY, lnodes}, {"nodribble", 0, 0, 0, PREFIX_PRIORITY, lnodribble}, {"norefresh", 0, 0, 0, PREFIX_PRIORITY, lnorefresh}, {"not", 1, 1, 1, PREFIX_PRIORITY, lnot}, {"notequalp", 2, 2, 2, PREFIX_PRIORITY, lnotequalp}, {"notequal?", 2, 2, 2, PREFIX_PRIORITY, lnotequalp}, {"numberp", 1, 1, 1, PREFIX_PRIORITY, lnumberp}, {"number?", 1, 1, 1, PREFIX_PRIORITY, lnumberp}, #ifdef OBJECTS {"oneof", 1, 1, -1, MACRO_PRIORITY, loneof}, #endif {"op", 1, 1, 1, OUTPUT_PRIORITY, loutput}, {"openappend", 1, 1, 1, PREFIX_PRIORITY, lopenappend}, {"openread", 1, 1, 1, PREFIX_PRIORITY, lopenread}, {"openupdate", 1, 1, 1, PREFIX_PRIORITY, lopenupdate}, {"openwrite", 1, 1, 1, PREFIX_PRIORITY, lopenwrite}, {"or", 0, 2, -1, PREFIX_PRIORITY, lor}, {"output", 1, 1, 1, OUTPUT_PRIORITY, loutput}, {"palette", 1, 1, 1, PREFIX_PRIORITY, lpalette}, #ifdef OBJECTS {"parents", 0, 0, 0, PREFIX_PRIORITY, lparents}, #endif {"parse", 1, 1, 1, PREFIX_PRIORITY, lparse}, {"pause", 0, 0, 0, PREFIX_PRIORITY, lpause}, {"pc", 0, 0, 0, PREFIX_PRIORITY, lpencolor}, {"pd", 0, 0, 0, PREFIX_PRIORITY, lpendown}, {"pe", 0, 0, 0, PREFIX_PRIORITY, lpenerase}, {"pencolor", 0, 0, 0, PREFIX_PRIORITY, lpencolor}, {"pendown", 0, 0, 0, PREFIX_PRIORITY, lpendown}, {"pendownp", 0, 0, 0, PREFIX_PRIORITY, lpendownp}, {"pendown?", 0, 0, 0, PREFIX_PRIORITY, lpendownp}, {"penerase", 0, 0, 0, PREFIX_PRIORITY, lpenerase}, {"penmode", 0, 0, 0, PREFIX_PRIORITY, lpenmode}, {"penpaint", 0, 0, 0, PREFIX_PRIORITY, lpenpaint}, {"penpattern", 0, 0, 0, PREFIX_PRIORITY, lpenpattern}, {"penreverse", 0, 0, 0, PREFIX_PRIORITY, lpenreverse}, {"pensize", 0, 0, 0, PREFIX_PRIORITY, lpensize}, {"penup", 0, 0, 0, PREFIX_PRIORITY, lpenup}, {"plist", 1, 1, 1, PREFIX_PRIORITY, lplist}, {"plistp", 1, 1, 1, PREFIX_PRIORITY, lplistp}, {"plist?", 1, 1, 1, PREFIX_PRIORITY, lplistp}, {"plists", 0, 0, 0, PREFIX_PRIORITY, lplists}, {"po", 1, 1, 1, PREFIX_PRIORITY, lpo}, {"pos", 0, 0, 0, PREFIX_PRIORITY, lpos}, {"pot", 1, 1, 1, PREFIX_PRIORITY, lpot}, {"power", 2, 2, 2, PREFIX_PRIORITY, lpower}, {"pprop", 3, 3, 3, PREFIX_PRIORITY, lpprop}, {"ppt", 0, 0, 0, PREFIX_PRIORITY, lpenpaint}, {"pr", 0, 1, -1, PREFIX_PRIORITY, lprint}, {"prefix", 0, 0, 0, PREFIX_PRIORITY, lprefix}, {"primitivep", 1, 1, 1, PREFIX_PRIORITY, lprimitivep}, {"primitive?", 1, 1, 1, PREFIX_PRIORITY, lprimitivep}, {"primitives", 0, 0, 0, PREFIX_PRIORITY, lprimitives}, {"print", 0, 1, -1, PREFIX_PRIORITY, lprint}, {"printout", 1, 1, 1, PREFIX_PRIORITY, lpo}, #ifdef HAVE_WX {"printpict", 0, 0, 1, PREFIX_PRIORITY, lprintpict}, {"printtext", 0, 0, 1, PREFIX_PRIORITY, lprinttext}, #endif {"procedurep", 1, 1, 1, PREFIX_PRIORITY, lprocedurep}, {"procedure?", 1, 1, 1, PREFIX_PRIORITY, lprocedurep}, {"procedures", 0, 0, 0, PREFIX_PRIORITY, lprocedures}, {"product", 0, 2, -1, PREFIX_PRIORITY, lmul}, {"pu", 0, 0, 0, PREFIX_PRIORITY, lpenup}, {"px", 0, 0, 0, PREFIX_PRIORITY, lpenreverse}, {"quotient", 1, 2, 2, PREFIX_PRIORITY, ldivide}, {"radarctan", 1, 1, 2, PREFIX_PRIORITY, lradatan}, {"radcos", 1, 1, 1, PREFIX_PRIORITY, lradcos}, {"radsin", 1, 1, 1, PREFIX_PRIORITY, lradsin}, {"random", 1, 1, 2, PREFIX_PRIORITY, lrandom}, {"rawascii", 1, 1, 1, PREFIX_PRIORITY, lrawascii}, {"rc", 0, 0, 0, PREFIX_PRIORITY, lreadchar}, {"rcs", 1, 1, 1, PREFIX_PRIORITY, lreadchars}, {"readchar", 0, 0, 0, PREFIX_PRIORITY, lreadchar}, {"readchars", 1, 1, 1, PREFIX_PRIORITY, lreadchars}, {"reader", 0, 0, 0, PREFIX_PRIORITY, lreader}, {"readlist", 0, 0, 0, PREFIX_PRIORITY, lreadlist}, {"readpos", 0, 0, 0, PREFIX_PRIORITY, lreadpos}, {"readrawline", 0, 0, 0, PREFIX_PRIORITY, lreadrawline}, {"readword", 0, 0, 0, PREFIX_PRIORITY, lreadword}, {"refresh", 0, 0, 0, PREFIX_PRIORITY, lrefresh}, {"remainder", 2, 2, 2, PREFIX_PRIORITY, lremainder}, {"remprop", 2, 2, 2, PREFIX_PRIORITY, lremprop}, {"repcount", 0, 0, 0, PREFIX_PRIORITY, lrepcount}, {"repeat", 2, 2, 2, MACRO_PRIORITY, lrepeat}, #ifdef OBJECTS {"representation", 0, 0, 0, PREFIX_PRIORITY, lrepresentation}, #endif {"rerandom", 0, 0, 1, PREFIX_PRIORITY, lrerandom}, {"right", 1, 1, 1, PREFIX_PRIORITY, lright}, {"rl", 0, 0, 0, PREFIX_PRIORITY, lreadlist}, {"round", 1, 1, 1, PREFIX_PRIORITY, lroundx}, {"rt", 1, 1, 1, PREFIX_PRIORITY, lright}, {"run", 1, 1, 1, MACRO_PRIORITY, lrun}, {"runparse", 1, 1, 1, PREFIX_PRIORITY, lrunparse}, {"runresult", 1, 1, 1, MACRO_PRIORITY, lrunresult}, {"rw", 0, 0, 0, PREFIX_PRIORITY, lreadword}, {"save", OK_NO_ARG, 1, 1, PREFIX_PRIORITY, lsave}, {"savepict", 1, 1, 1, PREFIX_PRIORITY, lsavepict}, {"screenmode", 0, 0, 0, PREFIX_PRIORITY, lscreenmode}, {"scrunch", 0, 0, 0, PREFIX_PRIORITY, lscrunch}, {"se", 0, 2, -1, PREFIX_PRIORITY, lsentence}, #ifdef OBJECTS {"self", 0, 0, 0, PREFIX_PRIORITY, lself}, #endif {"sentence", 0, 2, -1, PREFIX_PRIORITY, lsentence}, {"setbg", 1, 1, 1, PREFIX_PRIORITY, lsetbackground}, {"setbackground", 1, 1, 1, PREFIX_PRIORITY, lsetbackground}, {"setcursor", 1, 1, 1, PREFIX_PRIORITY, lsetcursor}, {"setcslsloc", 1, 1, 1, PREFIX_PRIORITY, lsetcslsloc}, #ifdef HAVE_WX {"setfont", 1, 1, 1, PREFIX_PRIORITY, lsetfont}, #endif {"seteditor", 1, 1, 1, PREFIX_PRIORITY, lseteditor}, {"seth", 1, 1, 1, PREFIX_PRIORITY, lsetheading}, {"setheading", 1, 1, 1, PREFIX_PRIORITY, lsetheading}, {"sethelploc", 1, 1, 1, PREFIX_PRIORITY, lsethelploc}, {"setitem", 3, 3, 3, PREFIX_PRIORITY, lsetitem}, #ifdef HAVE_WX {"setlabelheight", 1, 1, 1, PREFIX_PRIORITY, lsetlabelheight}, #endif {"setlibloc", 1, 1, 1, PREFIX_PRIORITY, lsetlibloc}, {"setmargins", 1, 1, 1, PREFIX_PRIORITY, lsetmargins}, {"setpalette", 2, 2, 2, PREFIX_PRIORITY, lsetpalette}, {"setpc", 1, 1, 1, PREFIX_PRIORITY, lsetpencolor}, {"setpencolor", 1, 1, 1, PREFIX_PRIORITY, lsetpencolor}, {"setpenpattern", 1, 1, 1, PREFIX_PRIORITY, lsetpenpattern}, {"setpensize", 1, 1, 1, PREFIX_PRIORITY, lsetpensize}, {"setpos", 1, 1, 1, PREFIX_PRIORITY, lsetpos}, {"setprefix", 1, 1, 1, PREFIX_PRIORITY, lsetprefix}, {"setread", 1, 1, 1, PREFIX_PRIORITY, lsetread}, {"setreadpos", 1, 1, 1, PREFIX_PRIORITY, lsetreadpos}, {"setscrunch", 2, 2, 2, PREFIX_PRIORITY, lsetscrunch}, #if defined(WIN32)|defined(ibm)|defined(HAVE_WX) {"settc", 2, 2, 2, PREFIX_PRIORITY, set_text_color}, {"settextcolor", 2, 2, 2, PREFIX_PRIORITY, set_text_color}, #endif #ifdef HAVE_WX {"settextsize", 1, 1, 1, PREFIX_PRIORITY, lsettextsize}, #endif {"settemploc", 1, 1, 1, PREFIX_PRIORITY, lsettemploc}, {"setwrite", 1, 1, 1, PREFIX_PRIORITY, lsetwrite}, {"setwritepos", 1, 1, 1, PREFIX_PRIORITY, lsetwritepos}, {"setx", 1, 1, 1, PREFIX_PRIORITY, lsetx}, {"setxy", 2, 2, 2, PREFIX_PRIORITY, lsetxy}, {"sety", 1, 1, 1, PREFIX_PRIORITY, lsety}, {"shell", 1, 1, 2, PREFIX_PRIORITY, lshell}, {"show", 0, 1, -1, PREFIX_PRIORITY, lshow}, {"shownp", 0, 0, 0, PREFIX_PRIORITY, lshownp}, {"shown?", 0, 0, 0, PREFIX_PRIORITY, lshownp}, {"showturtle", 0, 0, 0, PREFIX_PRIORITY, lshowturtle}, {"sin", 1, 1, 1, PREFIX_PRIORITY, lsin}, #ifdef OBJECTS {"something", 0, 0, 0, PREFIX_PRIORITY, lsomething}, #endif {"splitscreen", 0, 0, 0, PREFIX_PRIORITY, lsplitscreen}, {"sqrt", 1, 1, 1, PREFIX_PRIORITY, lsqrt}, {"ss", 0, 0, 0, PREFIX_PRIORITY, lsplitscreen}, {"st", 0, 0, 0, PREFIX_PRIORITY, lshowturtle}, {"standout", 1, 1, 1, PREFIX_PRIORITY, lstandout}, {"step", 1, 1, 1, PREFIX_PRIORITY, lstep}, {"stepped", 0, 0, 0, PREFIX_PRIORITY, lstepped}, {"steppedp", 1, 1, 1, PREFIX_PRIORITY, lsteppedp}, {"stepped?", 1, 1, 1, PREFIX_PRIORITY, lsteppedp}, {"stop", 0, 0, 0, STOP_PRIORITY, lstop}, {"substringp", 2, 2, 2, PREFIX_PRIORITY, lsubstringp}, {"substring?", 2, 2, 2, PREFIX_PRIORITY, lsubstringp}, {"sum", 0, 2, -1, PREFIX_PRIORITY, ladd}, {"tag", 1, 1, 1, PREFIX_PRIORITY, ltag}, #ifdef OBJECTS {"talkto", 1, 1, 1, PREFIX_PRIORITY, ltalkto}, #endif {"test", 1, 1, 1, PREFIX_PRIORITY, ltest}, {"text", 1, 1, 1, PREFIX_PRIORITY, ltext}, {"textscreen", 0, 0, 0, PREFIX_PRIORITY, ltextscreen}, #ifdef HAVE_WX {"textsize", 0, 0, 0, PREFIX_PRIORITY, ltextsize}, #endif {"thing", 1, 1, 1, PREFIX_PRIORITY, lthing}, {"throw", 1, 1, 2, PREFIX_PRIORITY, lthrow}, {"to", -1, -1, -1, PREFIX_PRIORITY, lto}, {"tone", 2, 2, 2, PREFIX_PRIORITY, ltone}, {"towards", 1, 1, 1, PREFIX_PRIORITY, ltowards}, {"trace", 1, 1, 1, PREFIX_PRIORITY, ltrace}, {"traced", 0, 0, 0, PREFIX_PRIORITY, ltraced}, {"tracedp", 1, 1, 1, PREFIX_PRIORITY, ltracedp}, {"traced?", 1, 1, 1, PREFIX_PRIORITY, ltracedp}, {"ts", 0, 0, 0, PREFIX_PRIORITY, ltextscreen}, {"turtlemode", 0, 0, 0, PREFIX_PRIORITY, lturtlemode}, {"type", 0, 1, -1, PREFIX_PRIORITY, ltype}, {"unbury", 1, 1, 1, PREFIX_PRIORITY, lunbury}, {"unstep", 1, 1, 1, PREFIX_PRIORITY, lunstep}, {"untrace", 1, 1, 1, PREFIX_PRIORITY, luntrace}, {"uppercase", 1, 1, 1, PREFIX_PRIORITY, luppercase}, {"vbarredp", 1, 1, 1, PREFIX_PRIORITY, lvbarredp}, {"vbarred?", 1, 1, 1, PREFIX_PRIORITY, lvbarredp}, {"wait", 1, 1, 1, PREFIX_PRIORITY, lwait}, {"window", 0, 0, 0, PREFIX_PRIORITY, lwindow}, {"word", 0, 2, -1, PREFIX_PRIORITY, lword}, {"wordp", 1, 1, 1, PREFIX_PRIORITY, lwordp}, {"word?", 1, 1, 1, PREFIX_PRIORITY, lwordp}, {"wrap", 0, 0, 0, PREFIX_PRIORITY, lwrap}, {"writepos", 0, 0, 0, PREFIX_PRIORITY, lwritepos}, {"writer", 0, 0, 0, PREFIX_PRIORITY, lwriter}, #ifdef mac {"setwindowtitle", 1, 1, 1, PREFIX_PRIORITY, lsetwindowtitle}, {"settextfont", 1, 1, 1, PREFIX_PRIORITY, lsettextfont}, {"settextsize", 1, 1, 1, PREFIX_PRIORITY, lsettextsize}, {"settextstyle", 1, 1, 1, PREFIX_PRIORITY, lsettextstyle}, {"setwindowsize", 1, 1, 1, PREFIX_PRIORITY, lsetwindowsize}, {"setwindowxy", 1, 1, 1, PREFIX_PRIORITY, lsetwindowxy}, {"newconsole", 0, 0, 0, PREFIX_PRIORITY, lnewconsole}, {"graphtext", 0, 0, 0, PREFIX_PRIORITY, lgraphtext}, {"regulartext", 0, 0, 0, PREFIX_PRIORITY, lregulartext}, {"caninverse", 1, 1, 1, PREFIX_PRIORITY, lcaninverse}, #endif {0, 0, 0, 0, 0, 0} }; struct wdtrans translations[NUM_WORDS]; NODE *intern_p(NODE *caseobj) { NODE *result = intern(caseobj); setflag__caseobj(result, PERMANENT); return result; } void init(void) { int i = 0; NODE *iproc = NIL, *pname = NIL, *cnd = NIL; FILE *fp; char linebuf[256]; char *sugar; static char sugarlib[100], sugarhelp[100], sugarcsls[100]; #ifdef WIN32 HKEY regKey1, regKey2, regKey3; int got_hklm = 0; char buf[200]; unsigned long int bufsiz; char *envp; #endif readstream = stdin; writestream = stdout; loadstream = stdin; fill_reserve_tank(); oldyoungs = Unbound = newnode(PUNBOUND); #ifdef HAVE_SRANDOM srandom((int)time((time_t *)NULL)); #else srand((int)time((time_t *)NULL)); #endif #ifdef ecma for (i=0; i<128; i++) ecma_array[i] = i; for (i=0; in_car = (NODE *)®s; //hist_inptr = hist_outptr = cmdHistory; #ifdef OBJECTS obj_init(); #endif /* Uncomment these to print debugging messages right away! */ /* setvalnode__caseobj(Redefp, True); setflag__caseobj(Redefp, VAL_BURIED); */ } ucblogo-6.1/win32trm.h0000664000175000017500000001216013557147341012762 0ustar jjcjjc/* -*-C-*- * Win32trm.h * * Function prototypes &c for Win32 API (Win95, WinNT) compliant * procedures. * * $Id: win32trm.h,v 1.1.1.1 2005/02/01 19:47:31 paley Exp $ * * $Log: win32trm.h,v $ * Revision 1.1.1.1 2005/02/01 19:47:31 paley * initial commit * * * (c) 1996 UC Regents, etc. * */ #include #include "logo.h" #ifndef _WIN32TRM_H /* set to 1000 for debugging, should normally be ~10k */ #define GR_SIZE 60000 #define prepare_to_draw win32_prepare_draw() #define done_drawing #define prepare_to_draw_turtle win32_turtle_prep() #define done_drawing_turtle win32_turtle_end() #define screen_left 0 #define screen_right win32_screen_right() #define screen_top 0 #define screen_bottom win32_screen_bottom() #define max_screen_bottom win32_screen_bottom() #define screen_height (1 + screen_bottom - screen_top) #define screen_width (1 + screen_right - screen_left) #define screen_x_center (screen_left + (screen_width)/2) #define screen_y_center (screen_top + (screen_height)/2) #define turtle_left_max ((screen_left) - (screen_x_center)) #define turtle_right_max ((screen_right) - (screen_x_center)) #define turtle_top_max ((screen_y_center) - (screen_top)) #define turtle_bottom_max ((screen_y_center) - (screen_bottom)) #define screen_x_coord ((screen_x_center) + turtle_x) #define screen_y_coord ((screen_y_center) - turtle_y) #define turtle_height (FIXNUM) 18 #define turtle_half_bottom (FLONUM) 6.0 #define turtle_side (FLONUM) 19.0 #define clear_screen win32_erase_screen() #define line_to(x,y) {\ if (pen_vis==0) \ lineto((int)x,(int)y); \ else \ moveto((int)x,(int)y);\ } #define move_to(x,y) moveto((int)x,(int)y) /* #define draw_string(s) outtext((char *)s) function */ #define set_pen_vis(v) { turtlePen.vis = v; } /* functionified */ #define set_pen_mode(m) win32_set_pen_mode(m) /* functionified */ #define set_pen_color(c) win32_set_pen_color(c) #define set_back_ground(c) win32_set_bg(c) /* Now functions instead of macros */ #define set_pen_width(w) win32_set_pen_width(w) #define set_pen_height(h) win32_set_pen_width(h) #define set_pen_x(x) moveto((int)x, pen_y) #define set_pen_y(y) moveto(pen_x, (int)y) #define erase_screen() win32_erase_screen() /* pen_info is a stucture type with fields for the various pen characteristics including the location, size, color, mode (e.g. XOR or COPY), pattern, visibility (0 = visible) */ typedef struct { int h; int v; int vis; int width; int color; char pattern[8]; int mode; #ifdef WIN32 HPEN hpen; #endif } pen_info; #define p_info_x(p) p.h #define p_info_y(p) p.v #define pen_width (int) turtlePen.width #define pen_height (int) turtlePen.width #define pen_mode turtlePen.mode #define pen_vis turtlePen.vis #define pen_x turtlePen.h #define pen_y turtlePen.v #define get_node_pen_pattern win32_get_node_pen_pattern() #define pen_reverse win32_pen_reverse() #define pen_erase win32_pen_erase() #define pen_down win32_pen_down() #define button (w_button) #define full_screen win32_con_full_screen() #define split_screen win32_con_split_screen() #define text_screen win32_con_text_screen() /* definitions from term.c and math.c for ibmterm.c */ extern int x_coord, y_coord, x_max, y_max, tty_charmode; extern char so_arr[], se_arr[]; extern FLONUM degrad; /* Forward declarations for graphics.c */ extern void gr_mode(), draw_turtle(); extern void win32_pen_erase(), win32_pen_down(), win32_pen_xor(); extern void win32_set_pen_mode(int), win32_set_pen_color(), win32_set_bg(); extern int get_win32_pen_mode(), win32_set_pen_width(int); extern void save_pen(pen_info*), restore_pen(pen_info*), set_pen_pattern(); extern void plain_xor_pen(); extern void set_list_pen_pattern(), get_pen_pattern(), erase_screen(); extern void label(), logofill(); extern void t_screen(), s_screen(), f_screen(), tone(); extern FIXNUM mickey_x(), mickey_y(); extern NODE *win32_get_node_pen_pattern(); extern FIXNUM t_height(); extern FIXNUM pen_color, back_ground; extern FLONUM t_half_bottom(), t_side(); extern BOOLEAN in_erase_mode; extern void win32_init_palette(), win32_pen_reverse(); extern void win32_turtle_prep(), win32_turtle_end(); extern void win32_con_text_screen(), win32_con_split_screen(); extern void win32_prepare_draw(void); extern void win32_con_full_screen(), win32_clear_text(); extern NODE* win32_lsetcursor(NODE *); extern int win32_screen_right(); extern pen_info turtlePen; extern void MoveCursor(int, int), win32_receive_char(char); extern void win32_parse_line(char*); extern FIXNUM mouse_x, mouse_y; extern int w_button; /* prototypes added by sowings */ extern BOOLEAN safe_to_save(); extern void save_lm_helper(), save_line(), save_move(); extern void save_mode(), save_color(), save_pattern(); extern void save_size(), save_vis(); extern void set_palette(int, unsigned int, unsigned int, unsigned int); extern void get_palette(int, unsigned int*, unsigned int*, unsigned int*); #define nop() {} #define WIN_PEN_ERASE 1 #define WIN_PEN_DOWN 2 #define WIN_PEN_REVERSE 3 #define NUM_LINES 100 #define CHARS_PER_LINE 200 LRESULT CALLBACK MainFunc(HWND, UINT, WPARAM, LPARAM); #define _WIN32TRM_H #endif /* !_WIN32TRM_H */ ucblogo-6.1/ucblogo.xpm0000664000175000017500000041522213557147341013312 0ustar jjcjjc/* XPM */ static const char *ucblogo[] = { /* width height ncolors chars_per_pixel */ "256 256 234 2", /* colors */ "AA c #FFFFFFFFFFFF", "BA c #F7F7FFFFA5A5", "CA c #F7F7F7F7E7E7", "DA c #F7F7F7F79C9C", "EA c #EFEFF7F7F7F7", "FA c #EFEFF7F7DEDE", "GA c #EFEFF7F7CECE", "HA c #EFEFEFEFB5B5", "IA c #EFEFE7E7ADAD", "JA c #EFEFE7E79C9C", "KA c #EFEFD6D6DEDE", "LA c #EFEFD6D6C6C6", "MA c #EFEFCECEB5B5", "NA c #EFEFCECE9C9C", "OA c #E7E7BDBDADAD", "PA c #E7E7BDBD8C8C", "AB c #E7E7ADAD9C9C", "BB c #DEDED6D69C9C", "CB c #DEDEC6C6C6C6", "DB c #DEDEA5A58C8C", "EB c #D6D6DEDEE7E7", "FB c #D6D6DEDECECE", "GB c #D6D6D6D6BDBD", "HB c #D6D6CECE8C8C", "IB c #D6D6B5B57373", "JB c #CECEE7E7F7F7", "KB c #CECECECEA5A5", "LB c #CECEBDBDADAD", "MB c #CECEBDBD8C8C", "NB c #CECEADAD5A5A", "OB c #CECEA5A58C8C", "PB c #CECE94947373", "AC c #CECE94945A5A", "BC c #C6C6CECEC6C6", "CC c #C6C6ADAD7373", "DC c #BDBDD6D6B5B5", "EC c #BDBDC6C6DEDE", "FC c #BDBDBDBDADAD", "GC c #BDBDB5B58C8C", "HC c #BDBDADADB5B5", "IC c #BDBDA5A59C9C", "JC c #BDBD9C9C5A5A", "KC c #BDBD94948C8C", "LC c #B5B5CECEA5A5", "MC c #B5B58C8C5252", "NC c #B5B584847373", "OC c #B5B57B7B6363", "PC c #ADADD6D6EFEF", "AD c #ADADCECEE7E7", "BD c #ADADCECEDEDE", "CD c #ADADCECEC6C6", "DD c #ADADBDBDC6C6", "ED c #ADADADAD8C8C", "FD c #ADADADAD7373", "GD c #ADAD8C8C8C8C", "HD c #ADAD73735252", "ID c #A5A5D6D6F7F7", "JD c #A5A5BDBDDEDE", "KD c #A5A5BDBDBDBD", "LD c #A5A5BDBDA5A5", "MD c #A5A5BDBD8C8C", "ND c #A5A59C9C8C8C", "OD c #A5A59C9C7373", "PD c #A5A59C9C5A5A", "AE c #A5A58C8C6B6B", "BE c #A5A584842929", "CE c #A5A573734A4A", "DE c #9C9CD6D69494", "EE c #9C9CD6D67B7B", "FE c #9C9CB5B5A5A5", "GE c #9C9CADADC6C6", "HE c #9C9CADADA5A5", "IE c #9C9C9C9CADAD", "JE c #9C9C94949C9C", "KE c #9C9C8C8C5252", "LE c #9C9C84848C8C", "ME c #9C9C7B7B7373", "NE c #9C9C73736363", "OE c #9C9C6B6B4242", "PE c #9C9C6B6B3939", "AF c #9494CECEF7F7", "BF c #9494B5B5DEDE", "CF c #9494B5B57373", "DF c #9494B5B56B6B", "EF c #949473732929", "FF c #949452520808", "GF c #8C8CDEDE9494", "HF c #8C8CD6D67B7B", "IF c #8C8CD6D66B6B", "JF c #8C8CCECEDEDE", "KF c #8C8CB5B5D6D6", "LF c #8484B5B5BDBD", "MF c #8484B5B5A5A5", "NF c #8484B5B58484", "OF c #8484B5B56B6B", "PF c #84849C9CBDBD", "AG c #84849C9C7B7B", "BG c #84849C9C6363", "CG c #84849494ADAD", "DG c #84848C8C9C9C", "EG c #848484845A5A", "FG c #84847B7B7B7B", "GG c #84846B6B4242", "HG c #84846B6B3131", "IG c #84846B6B1818", "JG c #84845A5A0000", "KG c #84844A4A2121", "LG c #7B7BD6D68C8C", "MG c #7B7BD6D67373", "NG c #7B7BCECEEFEF", "OG c #7B7BC6C6F7F7", "PG c #7B7BBDBDD6D6", "AH c #7B7BB5B5EFEF", "BH c #7B7BADADC6C6", "CH c #7B7BADADB5B5", "DH c #7B7B9494ADAD", "EH c #7B7B94947B7B", "FH c #7B7B6B6B6363", "GH c #7B7B63635252", "HH c #7B7B4A4A4242", "IH c #7B7B4A4A3131", "JH c #7373D6D69C9C", "KH c #7373B5B59C9C", "LH c #7373B5B58484", "MH c #7373B5B57B7B", "NH c #7373B5B56B6B", "OH c #7373ADADD6D6", "PH c #7373A5A5ADAD", "AI c #737384849C9C", "BI c #73736B6B7373", "CI c #73736B6B3939", "DI c #737363631818", "EI c #737352520000", "FI c #6B6BD6D68C8C", "GI c #6B6BA5A5DEDE", "HI c #6B6BA5A5BDBD", "II c #6B6B9C9CADAD", "JI c #6B6B9C9C9C9C", "KI c #6B6B94945A5A", "LI c #6B6B84847B7B", "MI c #6B6B7B7B7B7B", "NI c #6B6B7B7B5A5A", "OI c #6B6B6B6B3939", "PI c #6B6B63631818", "AJ c #6B6B4A4A0000", "BJ c #6B6B42421818", "CJ c #6363D6D66B6B", "DJ c #6363B5B58484", "EJ c #63639C9CCECE", "FJ c #63638C8CBDBD", "GJ c #63638484ADAD", "HJ c #63637B7B9494", "IJ c #63636B6B0000", "JJ c #63635A5A7B7B", "KJ c #63635A5A0000", "LJ c #5A5AD6D68C8C", "MJ c #5A5ABDBD9494", "NJ c #5A5AB5B56B6B", "OJ c #5A5A8C8C9C9C", "PJ c #5A5A84843939", "AK c #5A5A6B6B5A5A", "BK c #5A5A6B6B1818", "CK c #5A5A63633939", "DK c #5A5A5A5A6363", "EK c #5A5A52525252", "FK c #5A5A4A4A1818", "GK c #5A5A42424242", "HK c #5A5A42423131", "IK c #5A5A39391818", "JK c #52529C9C7373", "KK c #52529C9C5A5A", "LK c #525284845A5A", "MK c #525239390808", "NK c #4A4AD6D66B6B", "OK c #4A4ABDBD8484", "PK c #4A4A7B7B7B7B", "AL c #4A4A7B7B5A5A", "BL c #4A4A7B7B4A4A", "CL c #4A4A73739C9C", "DL c #4A4A6B6B2929", "EL c #4A4A63637B7B", "FL c #4A4A63635A5A", "GL c #4A4A5A5A3131", "HL c #4A4A21210000", "IL c #4242B5B57373", "JL c #424294945A5A", "KL c #42425A5A7B7B", "LL c #424252525A5A", "ML c #3939D6D68C8C", "NL c #3939B5B57373", "OL c #39394A4A3939", "PL c #393939395A5A", "AM c #393939391818", "BM c #393931314242", "CM c #393931312929", "DM c #393921211818", "EM c #393910100000", "FM c #313194946363", "GM c #31317B7B5A5A", "HM c #31316B6B7B7B", "IM c #31316B6B3131", "JM c #313163636363", "KM c #313163635252", "LM c #31315A5A7B7B", "MM c #2929CECE7373", "NM c #29296B6B4A4A", "OM c #292952525A5A", "PM c #29294A4A7B7B", "AN c #29294A4A3939", "BN c #212163633939", "CN c #21214A4A5A5A", "DN c #212142421818", "EN c #212139395A5A", "FN c #212131313939", "GN c #212129291818", "HN c #212121210000", "IN c #212118182121", "JN c #212110101010", "KN c #181863633131", "LN c #18185A5A2121", "MN c #181839390808", "NN c #181818183939", "ON c #181808080000", "PN c #10104A4A3939", "AO c #101031313939", "BO c #101021215252", "CO c #080842422929", "DO c #080842421818", "EO c #080829291818", "FO c #080821210000", "GO c #080810102121", "HO c #080810101010", "IO c #000018183939", "JO c #000000000000", /* pixels */ "AFJFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFJFAFAFKFAFAFKFAFAFJF", "KFAFOGAFAHAFOGKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFJFAHAFOGKFOGAFAHAF", "AFOGKFAFJFOGAFAFAHAFOGKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFAFAHAFKFOGAFAFKFOGJFAF", "AFKFAFAHOGAFKFOGKFAFJFOGAFAFOGAFKFOGJFOGAFAHAFOGAFAFOGAFOGKFNGAFOGKFAFOGAFOGAFAHAFOGKFOGAFJFOGAFOGAFOGAFKFOGJFOGAFAHAFOGAFAFOGAFOGKFNGAFOGKFAFOGAFOGAFAHAFOGKFOGAFJFOGAFOGAFOGAFKFOGJFOGAFAHAFOGAFAFOGAFOGKFNGAFOGKFAFOGAFOGAFAHAFOGKFOGAFJFOGAFOGAFOGAFKFOGJFOGAFAHAFOGAFAFOGAFOGKFNGAFOGKFAFOGAFOGAFAHAFOGKFOGAFJFOGAFOGAFOGAFKFOGJFOGAFAHAFOGAFAFOGAFOGKFNGAFOGKFAFOGAFOGAFAHAFOGKFOGAFJFOGAFOGAFOGAFKFOGJFOGAFAHAFOGAFAFOGAFOGKFNGAFOGKFAFOGAFOGAFAHAFOGKFOGAFJFOGAFOGAFOGAFKFOGJFOGAFAHAFOGAFAFOGAFOGKFAHAFOGAFKFOGOGKFAFAF", "AFOGKFAFKFOGAFAHAFAHAFKFOGKFAFOGAFKFAFAHAFJFOGKFOGKFAFAHJFAFAFAHJFAFOGKFAFAHJFAFAHJFAFOGKFAFOGKFAFAHAFAHAFKFAFAHAFJFOGKFOGKFAFAHJFAFAFAHJFAFOGKFAFAHJFAFAHJFAFOGKFAFOGKFAFAHAFAHAFKFAFAHAFJFOGKFOGKFAFAHJFAFAFAHJFAFOGKFAFAHJFAFAHJFAFOGKFAFOGKFAFAHAFAHAFKFAFAHAFJFOGKFOGKFAFAHJFAFAFAHJFAFOGKFAFAHJFAFAHJFAFOGKFAFOGKFAFAHAFAHAFKFAFAHAFJFOGKFOGKFAFAHJFAFAFAHJFAFOGKFAFAHJFAFAHJFAFOGKFAFOGKFAFAHAFAHAFKFAFAHAFJFOGKFOGKFAFAHJFAFAFAHJFAFOGKFAFAHJFAFAHJFAFOGKFAFOGKFAFAHAFAHAFKFAFAHAFJFOGKFOGKFAFAHJFAFAFAHJFAFOGKFAFOGAFAH", "AHAFAFAHAFAHAFJFOGKFOGAFKFAFOGKFAHAFOGAFKFOGAFAFKFAFOGKFAFOGOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFJFAHAFJFAHAFOGAFKFOGAFAFKFAFOGKFAFOGOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFJFAHAFJFAHAFOGAFKFOGAFAFKFAFOGKFAFOGOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFJFAHAFJFAHAFOGAFKFOGAFAFKFAFOGKFAFOGOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFJFAHAFJFAHAFOGAFKFOGAFAFKFAFOGKFAFOGOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFJFAHAFJFAHAFOGAFKFOGAFAFKFAFOGKFAFOGOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFJFAHAFJFAHAFOGAFKFOGAFAFKFAFOGKFAFOGOGKFAFOGKFOGAFKFOGJF", "JFAFAHJFOGKFAFAFKFAFAHAFOGAFKFAFOGKFAFAHAFAHKFOGAFOGKFAFOGKFAFOGAFAHAFAHJFAFOGKFAFOGAFOGAFKFOGAFOGKFOGAFKFOGKFAFOGKFOGAFOGAFKFAFOGKFAFOGAFAHAFAHJFAFOGKFAFOGAFOGAFKFOGAFOGKFOGAFKFOGKFAFOGKFOGAFOGAFKFAFOGKFAFOGAFAHAFAHJFAFOGKFAFOGAFOGAFKFOGAFOGKFOGAFKFOGKFAFOGKFOGAFOGAFKFAFOGKFAFOGAFAHAFAHJFAFOGKFAFOGAFOGAFKFOGAFOGKFOGAFKFOGKFAFOGKFOGAFOGAFKFAFOGKFAFOGAFAHAFAHJFAFOGKFAFOGAFOGAFKFOGAFOGKFOGAFKFOGKFAFOGKFOGAFOGAFKFAFOGKFAFOGAFAHAFAHJFAFOGKFAFOGAFOGAFKFOGAFOGKFOGAFKFOGKFAFOGKFOGAFOGAFKFAFOGKFAFOGKFAFAFAFAHAFKFAF", "AFAHAFAFKFAFAHOGAFOGJFOGJFAHAFAHAFOGJFAHAFJFOGAFOGKFAFOGKFAFOGKFAFJFOGKFAFOGKFAFOGKFAHAFKFOGAFAHAFAFKFAFOGJFAFAHAFAFKFOGKFAHAFOGKFAFOGKFAFJFOGKFAFOGKFAFOGKFAHAFKFOGAFAHAFAFKFAFOGJFAFAHAFAFKFOGKFAHAFOGKFAFOGKFAFJFOGKFAFOGKFAFOGKFAHAFKFOGAFAHAFAFKFAFOGJFAFAHAFAFKFOGKFAHAFOGKFAFOGKFAFJFOGKFAFOGKFAFOGKFAHAFKFOGAFAHAFAFKFAFOGJFAFAHAFAFKFOGKFAHAFOGKFAFOGKFAFJFOGKFAFOGKFAFOGKFAHAFKFOGAFAHAFAFKFAFOGJFAFAHAFAFKFOGKFAHAFOGKFAFOGKFAFJFOGKFAFOGKFAFOGKFAHAFKFOGAFAHAFAFKFAFOGJFAFAHAFAFKFOGKFAHAFOGKFOGAFKFOGAFOGKFAHAFOGAF", "JFAFAHOGAFAHJFAFAHKFAFAFOGKFOGJFAFAFOGKFOGAFKFAFAFOGAFKFAFOGKFAFOGAFKFAFOGAFOGKFAFAFKFOGAFAFAHKFOGAFOGKFAFOGAFAHKFOGAFAFOGJFOGAFAFAHKFAFOGAFKFAFOGAFOGKFAFAFKFOGAFAFAHKFOGAFOGKFAFOGAFAHKFOGAFAFOGJFOGAFAFAHKFAFOGAFKFAFOGAFOGKFAFAFKFOGAFAFAHKFOGAFOGKFAFOGAFAHKFOGAFAFOGJFOGAFAFAHKFAFOGAFKFAFOGAFOGKFAFAFKFOGAFAFAHKFOGAFOGKFAFOGAFAHKFOGAFAFOGJFOGAFAFAHKFAFOGAFKFAFOGAFOGKFAFAFKFOGAFAFAHKFOGAFOGKFAFOGAFAHKFOGAFAFOGJFOGAFAFAHKFAFOGAFKFAFOGAFOGKFAFAFKFOGAFAFAHKFOGAFOGKFAFOGAFAHKFOGAFAFOGJFAFAFOGKFAFOGAFAHJFAFJFOGKFAF", "AFAHAFKFAFKFAFOGKFAFOGAFKFOGAFAFKFOGKFAFKFOGAFKFOGKFAHAFOGKFAFOGKFAHAFOGKFOGKFAFAHAFOGAFKFOGJFAFKFOGKFOGAFKFOGJFOGAFKFOGKFAFAFKFAHAFAFOGKFAHAFOGKFOGKFAFAHAFOGAFKFOGJFAFKFOGKFOGAFKFOGJFOGAFKFOGKFAFAFKFAHAFAFOGKFAHAFOGKFOGKFAFAHAFOGAFKFOGJFAFKFOGKFOGAFKFOGJFOGAFKFOGKFAFAFKFAHAFAFOGKFAHAFOGKFOGKFAFAHAFOGAFKFOGJFAFKFOGKFOGAFKFOGJFOGAFKFOGKFAFAFKFAHAFAFOGKFAHAFOGKFOGKFAFAHAFOGAFKFOGJFAFKFOGKFOGAFKFOGJFOGAFKFOGKFAFAFKFAHAFAFOGKFAHAFOGKFOGKFAFAHAFOGAFKFOGJFAFKFOGKFOGAFKFOGJFOGAFKFOGKFAFAHAHAFAFOGKFAFKFOGAFOGKFAFAF", "AFJFOGAFOGAFAHKFAFOGKFOGAFKFOGAFOGKFAFOGAFKFOGAFAFOGJFOGAFAFOGKFAFAFAHAFAFKFAFOGJFOGKFAFOGKFAFOGAFKFAFAFAHAFKFAFAFAHAFAFOGAHKFAFOGKFOGAFAFKFOGAFAFKFAFOGJFOGKFAFOGKFAFOGAFKFAFAFAHAFKFAFAFAHAFAFOGAHKFAFOGKFOGAFAFKFOGAFAFKFAFOGJFOGKFAFOGKFAFOGAFKFAFAFAHAFKFAFAFAHAFAFOGAHKFAFOGKFOGAFAFKFOGAFAFKFAFOGJFOGKFAFOGKFAFOGAFKFAFAFAHAFKFAFAFAHAFAFOGAHKFAFOGKFOGAFAFKFOGAFAFKFAFOGJFOGKFAFOGKFAFOGAFKFAFAFAHAFKFAFAFAHAFAFOGAHKFAFOGKFOGAFAFKFOGAFAFKFAFOGJFOGKFAFOGKFAFOGAFKFAFAFAHAFKFAFAFAHAFKFAFOGKFAFAHKFAFOGAFAFKFOGAFAFOGKF", "OGAFKFOGKFOGJFAFAHAFAFKFOGAFKFAHAFAFOGJFAHAFAHAFOGKFAFAFKFOGKFAFKFOGJFAHAFOGKFOGAFKFAFAHAFAFOGJFAHAFOGAHAFKFOGAFOGJFNGAHAFKFAFOGKFOGAFKFOGAFJFAHAFOGKFOGAFKFAFAHAFAFOGJFAHAFOGAHAFKFOGAFOGJFNGAHAFKFAFOGKFOGAFKFOGAFJFAHAFOGKFOGAFKFAFAHAFAFOGJFAHAFOGAHAFKFOGAFOGJFNGAHAFKFAFOGKFOGAFKFOGAFJFAHAFOGKFOGAFKFAFAHAFAFOGJFAHAFOGAHAFKFOGAFOGJFNGAHAFKFAFOGKFOGAFKFOGAFJFAHAFOGKFOGAFKFAFAHAFAFOGJFAHAFOGAHAFKFOGAFOGJFNGAHAFKFAFOGKFOGAFKFOGAFJFAHAFOGKFOGAFKFAFAHAFAFOGJFAHAFOGAHAFKFOGAFOGJFOGAFOGKFAFOGKFAFOGAFKFAHOGAFKFOGKFAF", "JFAFAFAFOGKFAFOGJFOGKFAFAFAHAFKFOGKFAFAFKFOGAFAHKFAFOGKFOGAFOGAFOGKFAFKFOGAFOGKFAFOGAFAHKFOGAFAFKFOGJFAFAHAFKFOGKFAFAFKFOGAFOGKFAFAFAHAFKFOGAFKFOGAFOGKFAFOGAFAHKFOGAFAFKFOGJFAFAHAFKFOGKFAFAFKFOGAFOGKFAFAFAHAFKFOGAFKFOGAFOGKFAFOGAFAHKFOGAFAFKFOGJFAFAHAFKFOGKFAFAFKFOGAFOGKFAFAFAHAFKFOGAFKFOGAFOGKFAFOGAFAHKFOGAFAFKFOGJFAFAHAFKFOGKFAFAFKFOGAFOGKFAFAFAHAFKFOGAFKFOGAFOGKFAFOGAFAHKFOGAFAFKFOGJFAFAHAFKFOGKFAFAFKFOGAFOGKFAFAFAHAFKFOGAFKFOGAFOGKFAFOGAFAHKFOGAFAFKFOGJFAFAHAFKFOGKFAFAFAHAFOGKFAFOGAFKFOGAFKFAFOGAFAFOGAF", "AFAHAFOGKFAFAHAFAFKFAFOGKFNGAFOGKFAFAHAFOGKFAFKFAFOGKFOGAFAFKFOGKFAFOGAFAHAFKFAFAHAFOGKFAFAFOGKFOGAFAFKFAHAFOGAFAFOGKFOGAFAFKFOGAFOGKFAFOGKFAFOGKFAFKFAFAHAFOGKFAFAFOGKFOGAFAFKFAHAFOGAFAFOGKFOGAFAFKFOGAFOGKFAFOGKFAFOGKFAFKFAFAHAFOGKFAFAFOGKFOGAFAFKFAHAFOGAFAFOGKFOGAFAFKFOGAFOGKFAFOGKFAFOGKFAFKFAFAHAFOGKFAFAFOGKFOGAFAFKFAHAFOGAFAFOGKFOGAFAFKFOGAFOGKFAFOGKFAFOGKFAFKFAFAHAFOGKFAFAFOGKFOGAFAFKFAHAFOGAFAFKFOGAFJFAHAFAFKFOGJFOGAFKFOGAFJFAHAFAFOGKFOGJFOGAFKFOGAFKFOGAFJFOGAFKFOGAFOGKFOGJFAFAHAFAHAFKFOGAFOGAFKFAHAFKF", "AFKFOGKFAFOGKFOGAFOGAFKFOGAFAHJFAFOGKFOGAFOGKFOGAFKFAFOGKFOGAFAFOGKFAFOGJFOGAFOGKFAFAHAFAHKFAFOGKFAFOGAFJFOGKFAFOGKFAFOGKFOGAFKFOGJFAFOGKFAFOGKFAFOGAFOGKFAFAHAFAHKFAFOGKFAFOGAFJFOGKFAFOGKFAFOGKFOGAFKFOGJFAFOGKFAFOGKFAFOGAFOGKFAFAHAFAHKFAFOGKFAFOGAFJFOGKFAFOGKFAFOGKFOGAFKFOGJFAFOGKFAFOGKFAFOGAFOGKFAFAHAFAHKFAFOGKFAFOGAFJFOGKFAFOGKFAFOGKFOGAFKFOGJFAFOGKFAFOGKFAFOGAFOGKFAFAHAFAHKFAFOGKFAFOGAFJFOGKFOGAFOGKFOGAFKFOGAFOGKFAFAFAHAFKFOGAFKFOGAFKFAFAFAFKFOGAFKFOGAFKFOGAFKFOGAFAFAHKFAFAFOGKFAFAHJFOGAFKFOGKFOGAFAFAHAF", "KFOGAFAFAHAFAFKFOGKFAHOGAFAFKFAFAHAFAFJFAHAFAFJFOGAFOGKFOGAFKFAHAFAFOGKFAFKFOGKFAFAHAFKFNGAFAHAFAFKFAHAFOGKFAFOGKFAFOGKFAFKFOGAFKFAFOGKFAFOGKFAFOGKFOGKFAFAHAFKFNGAFAHAFAFKFAHAFOGKFAFOGKFAFOGKFAFKFOGAFKFAFOGKFAFOGKFAFOGKFOGKFAFAHAFKFNGAFAHAFAFKFAHAFOGKFAFOGKFAFOGKFAFKFOGAFKFAFOGKFAFOGKFAFOGKFOGKFAFAHAFKFNGAFAHAFAFKFAHAFOGKFAFOGKFAFOGKFAFKFOGAFKFAFOGKFAFOGKFAFOGKFOGKFAFAHAFKFNGAFAHAFAFOGKFOGAFKFOGAFKFOGAFKFAFOGAFKFAHAFAFOGKFOGAFKFOGAFKFAHAFOGKFAHOGAFKFOGAFOGAFKFAFOGKFAFOGKFAFOGAFKFOGAFJFOGAFKFOGAFAFAFKFOGJFAF", "AFAFAHJFAFAHJFAFAFAFKFAFAHAHAFAHJFOGKFAFAFAHAHAFKFOGAFAFKFOGAFKFOGAFKFOGAFAFAFOGKFAFNGAFKFOGJFOGAFOGKFAFAFOGKFAFOGAFAFOGOGAFKFOGAFOGKFAFOGAFOGAFKFAFAFOGJFAFAHAFKFOGJFOGAFOGKFAFAFOGKFAFOGAFAFOGOGAFKFOGAFOGKFAFOGAFOGAFKFAFAFOGKFAFAHAFKFAFKFOGAFOGAFAHAFOGAFAFOGAFAFOGAFOGKFOGAFOGKFAFOGAFOGAFKFAFAFOGJFAFAHAFKFOGJFOGAFOGKFAFAFOGKFAFOGAFAFOGOGAFKFOGAFOGKFAFOGAFOGAFKFAFAFOGJFAFAHAFKFOGJFAFAHKFAFAFAHAFKFOGAFKFOGAFAHJFOGAFJFOGKFAFOGKFOGAFKFOGAFJFOGAFAFKFAFOGAFKFOGKFOGAFAHAFOGKFAFOGKFAFAHAFKFOGAFKFOGAFAFAHAHJFOGAFAFAH", "AFOGKFAFOGKFOGAFAHAHAFAHAFJFOGKFAFAFOGKFAHAFJFOGAFJFAHAFOGKFAFOGAFKFOGAFKFAHOGKFAFOGAFKFOGAFAFKFOGKFAFAHOGKFAFOGAFKFOGKFAFKFOGAFAHAFAFJFAHAFJFAHAFOGOGKFAFAHAFKFOGAFAFKFOGKFAFAHOGKFAFOGAFKFOGKFAFKFOGAFAHAFAFJFAHAFJFAHAFNGAHAFOGKFJFNGAFAHAFJFAHAFAFKFAHAFKFOGKFAHAFJFAHAFAFJFAHAFAFJFAHAFJFAHAFOGOGKFAFAHAFKFOGAFAFKFOGKFAFAHOGKFAFOGAFKFOGKFAFKFOGAFAHAFAFJFAHAFJFAHAFOGOGKFAFOGJFOGAFKFAFOGKFOGAFOGKFOGAFKFAFOGAFKFOGAFKFAFOGKFAFOGKFAFAFOGAFKFAFOGAFKFAHAFOGKFOGAFKFOGAFAFKFOGKFAFAHAFAFOGKFOGAFKFOGAFJFAHAHAFKFAFAFAHAFJF", "JFAFOGKFAFOGKFOGJFAFAHJFAFOGKFAFOGKFAFOGJFAFOGKFAFOGKFAFAFOGAHJFAFOGAFAHAFJFAFOGKFAFOGAFKFOGAFAFAHAFAHJFAFOGAFAHKFOGAFOGKFAFAFAHJFOGKFOGAFAHAFKFOGJFAFOGKFAFOGAFKFOGAFAFAHAFAHJFAFOGAFAHKFOGAFOGKFAFAFAHJFOGKFOGAFAHAFKFOGKFAFAHJFAFOGKFAFNGAHKFNGAHKFAFNGKFAFKFAFAHAHAFKFOGAFOGKFOGAFOGKFOGAFKFOGJFAFOGKFAFOGAFKFOGAFAFAHAFAHJFAFOGAFAHKFOGAFOGKFAFAFAHJFOGKFOGAFAHAFKFOGKFAFOGKFAFOGKFOGAFOGKFAFAFAHKFAFAFAHAFAHAFAHAFKFOGAFAHAFOGAFKFOGAFAHKFOGAFAHKFAFOGAFAHKFAFAFAHAFKFOGAFOGKFAFOGKFOGKFAFOGKFOGAFKFOGAFJFAFAHAFAHKFAFAHAF", "AFAHAFAFAHAFAFKFAFOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFAHAHAFKFAFOGKFAFJFAHAFAHAFOGKFAHAFOGAFKFAHAFOGKFAFAFKFOGKFOGAFAFKFAFOGOGKFAFKFOGKFAFJFAHAFKFAFAHAFOGJFAHAFOGAFKFOGJFOGKFAFAFKFOGKFAFJFAHAFAFOGJFAHAFKFAFKFAHAFKFOGAFAFOGJFAFOGAFAFOGKFAFOGAFJFAFOGKFAFAHOGOGAFKFOGAFKFAHAFAFKFAHAFAFKFOGAFKFAFAHAFOGJFAHAFOGAFKFOGJFOGKFAFAFKFOGKFOGAFAFKFAFOGOGKFAFKFOGKFAFJFAHAFJFAFAHAFAFOGKFAFAFOGKFAFKFOGJFOGAFOGKFOGJFAHAFKFOGAFAFJFAHAFKFOGAFOGKFAFAFOGKFAFOGAFJFAHAFAFOGKFOGAFKFAHAFAFJFOGAFKFAFAHAFAFKFOGAFAFAHAFAHAFJFAHAFOGKFAF", "AFKFOGKFAFAHAFOGKFAFOGKFAFOGAFKFOGAFKFOGAFKFAFOGKFAFOGJFAFAHAFOGKFAFOGAFKFOGJFAFAFOGKFOGKFAFOGJFAFKFOGAFAHAFKFAFAFAHAHAFAHJFAFOGAFAFAFOGKFAFAFAHAFAHJFAFKFOGJFOGKFAFOGAFAFKFOGAFAHAFKFAFOGAFKFOGKFAFOGJFOGAFOGAFKFOGAFKFOGKFAFOGAFAHAHAFOGAFAHAFAHAFAHAFOGAHAFKFAFAHAFKFOGAFKFOGAFOGKFOGAFAFKFOGAFAHJFAFKFOGJFOGKFAFOGAFAFKFOGAFAHAFKFAFAFAHAHAFAHJFAFOGAFAFAFOGKFAFAFAHAFAHJFAFAHAFOGKFAFAFOGAFOGKFAFAFAHJFAFAFOGKFAFOGAFAHAHAFKFOGAFKFOGKFAFOGKFAFOGAFAHKFAFAFAHAHJFAFAFAHAFAHKFOGAFKFOGAFOGJFOGAFAFAHKFAFKFOGJFOGAFKFOGAFAFAH", "KFOGAFAFOGJFOGKFAFAHAFAFOGKFAFOGAFKFOGAFAHAFOGKFAFOGKFAFAFJFOGKFAFOGKFOGAFKFAFOGKFAHAFAFAFKFOGAFKFOGAFKFAHAFOGJFAHAFJFOGKFAFAHAFOGKFOGKFOGAFOGJFAHAFAFKFOGAFAFKFAFOGKFOGKFOGAFOGKFOGAFOGAFKFOGAFOGAFKFOGAFAFKFOGAFJFAHAFAFOGAFKFOGKFJFAHAFKFNGAFKFAHAFAFAFKFAFAFOGAFJFOGAFOGAFKFAHAFAFKFOGKFOGAFAHAFAFKFOGAFAFKFAFAHAFOGKFOGAFKFAHAFOGJFAHAFJFOGKFAFAHAFOGKFOGKFOGAFOGKFOGKFAFOGJFAHAFOGKFOGKFOGKFAFAFOGKFOGAFOGKFAFAHAFOGKFAFKFOGAFKFOGAFAFOGKFOGAFKFOGKFAFNGAHAFKFAFOGKFAHAFJFOGAFKFOGAFAFKFOGAFKFOGJFAFAHOGAFAFKFOGAFJFAHAFJF", "AFAFAHKFAFAFAHAFOGJFOGKFAFOGKFAFOGAFKFOGKFAFOGAFOGKFAFOGAHAFKFAFOGKFAFKFOGAFOGKFAFAFAHAHJFOGAFAHAFAFAHAFJFOGAFAFAHKFAFAFOGKFAFAHKFAFAFOGKFOGKFAFAFAHAHAFAFAHAFOGAFKFAFAFOGKFAFKFAFAHKFAFAHAFKFOGAFAHAFKFOGOGAFKFOGAFKFOGKFAFOGAFKFAFAFJFKFAFKFAFAFKFAFKFAFAFAHKFAFAFAFKFOGKFOGAFJFOGKFAFAFOGKFAFAHKFOGAFAFAHAFOGKFAFAHKFAFAFOGAFKFOGAFAFAHKFAFAFOGKFAFAHKFAFAFOGKFOGKFAFAFOGKFAFAFKFAFAFOGKFAFAFOGAHKFAFAFKFOGKFAFOGJFAFKFOGAFOGAFAHAFAFAHJFAFAFOGKFAFAFOGKFAFKFOGAFAHAFOGJFAFOGKFAFOGAFAHAHAFKFOGAFKFAFOGJFAFAHAFOGKFAFOGKFAFAF", "JFAHAFOGKFAHAFOGKFAFKFAFAHAFAFOGAFKFOGAFAFOGKFOGKFAFOGAFKFOGAFOGKFOGAFOGAFOGKFAFJFAHAFKFOGAFAFKFNGAHAFKFOGAFKFOGJFOGAFOGKFAFOGKFAFOGAFKFOGAFAFKFOGJFAFKFOGJFAHAFKFOGAFOGKFAFAHAFAHAFAFOGKFOGAFKFAFKFOGAFKFAFKFOGAFKFOGAFOGAFKFOGAFKFAFKFKFOHOHHIEJBHBHOHBHPGKFADAFAHAFOGAFAFJFOGAFKFOGAFOGKFAFAHAFOGKFAFOGKFAHAFAFOGKFAFOGAHAFKFOGAFKFOGKFAFOGAFKFOGAFJFAFAHAHAFAFKFAFAFOGKFAFAHAFOGKFOGKFOGAFAHAFKFAFAHAFOGKFAFOGKFAFAHOGAFAFJFAHAFKFOGKFOGAFOGKFOGAFOGKFAFOGAFKFOGJFAFKFAFOGKFAFOGJFAHAFJFOGAFKFOGAFOGKFOGAFKFOGKFAFAHAFAFAHAF", "AFJFAFAFOGJFAFKFOGAFOGAFAHKFOGKFOGAFAFAHKFAFAFAFOGKFAFAHAFKFOGAFAFKFOGAFAHKFAFOGAFAHJFAFKFOGKFAFAFAHJFOGAFAHAFKFAFAFAHKFAFOGJFAFOGKFOGAFAFAHAHAFKFOGAFOGKFAFAHKFAFOGKFAFOGAFAHJFAFAHNGKFAFAFAHAFAHAFKFAFOGKFAFAFAHAFAFOGAFAHAFBFADHIELPLBMAOGNNNGNNNAOGNGNNNGLELAIKFBFADJFOGAFAFOGAFKFAHADOGAHIDAHAFOGKFAFOGKFOGKFAFOGKFAFJFOGAFAFAHAFKFOGAFAHKFAFAFAHAFAHJFAFAHAHAFOGAHJFAFOGKFOGAFOGKFAFAFAHJFOGAFAHJFOGKFAFOGKFAFAHJFAFAHAHAFKFAFOGKFAFAFAHKFAFAFAHKFAFOGKFOGAFAFOGKFAFOGKFAFOGKFAFKFOGAFKFOGAFKFOGAFAFKFOGAFKFAFOGKFOGAFKFOG", "AHAFAHAHAFAFKFOGAFOGKFAHAFOGKFAFAFOGKFNGAFKFOGOGKFAFAHAFKFOGAFKFOGAFAHAFKFAFOGKFOGKFAFOGAFKFOGAFOGKFOGAFAFKFOGAFKFOGJFOGAFKFOGAFKFOGAFKFAHAFKFAFOGAFOGKFAFAHAFAFOGKFAFOGKFAFJFOGJFAHAFAFJFAHAFOGKFOGAFOGKFAFAHAHAFAFAHAHAHADBFIIOMIOHOEOGNCMOLOLOLANAMANCMAOEOHOEOIOANAIBFBFAFOGKFAFAFKFNGAHAFOGJFOGKFAFAHAFAFKFAFAHAFAFKFOGAFKFOGJFOGAFKFOGJFOGAFOGKFOGJFAFAHAFJFOGAFKFAFKFOGAFKFAFKFAFOGJFAHAFKFAHAFAFKFAFOGKFAFOGKFAFAHAFKFOGAFKFOGAFAFOGKFAFOGKFNGAFKFOGAFKFAFOGKFAFOGKFAFOGKFAFOGAFKFOGAFKFAFOGAFKFOGAFKFOGAFOGKFAFJFAHAFAF", "AFKFAFJFOGKFOGAFKFAFAFAHJFAFOGKFAFAFOGKFOGAFKFAFOGAFAHJFAFAFAHAFKFOGJFOGAFOGKFAFAFOGKFAFOGAFKFOGKFAFKFOGKFAFAHAFOGKFAFAFOGAFKFOGAFAFAHAFJFOGAFAHJFAFKFOGAFKFOGAFAHAFOGKFAFOGAFKFAFKFOGAFOGKFOGJFAFAFAHKFAFOGAFAHOGAHPCNGJFHILLHOHOAMGLMIBGBGNEEHAGAGBGBGEHBGFHFLOLMNHOEOANGJBFBDOGAHAFAFAHJFAFKFAFAFOGAHJFOGKFAFOGJFOGAFOGKFAFOGKFAFAFAHAFKFAFAFAHJFAFKFOGAFKFOGAFKFOGAFOGAFKFOGAFOGAFOGKFAFAFAHAFJFOGAFOGAFKFAFOGAFAFAHJFAFOGKFOGAFKFOGKFAFOGAFKFOGAFAHAFKFOGAFAHKFAFOGAFOGAFKFAFOGKFOGAFKFOGAFAHAFAHAFKFOGAFKFOGAFOGAFOGKFAFAH", "KFAFOGAFKFOGKFAFOGKFOGJFAFAHAFAFAHAHAFAFKFOGAFAHAFOGKFAFOGAHAFKFOGAFAFKFOGKFAFAFOGKFAFOGKFOGAFAHAFAFOGAFAFOGKFOGKFAFAFOGKFAHAFAHAFAHAFKFOGAFKFOGAFKFOGAFAHAFAHAFJFOGKFAFOGKFAHAFOGAFKFOGKFOGAFAFKFAHAFAFOGAHOGAFJFKFJFKFLIPNJOGNAKBGNDFDAGFDAGBGOFFDFDBGAGFDAGAGBGAGNIFNJOGNJIADAFJFAHOGAFAFAHAFAHAHAFJFAFAFOGKFOGAFKFAHAFAFOGKFAFOGAHAFKFOGAFOGKFOGAFOGAFAHAFKFOGAFKFOGAFKFOGAFOGKFOGKFAFAFOGJFOGAFKFOGKFAHAFOGAFKFOGKFAFOGKFAFAFKFOGAFAFOGJFAHAFAFAHAFJFOGAFOGJFOGAFAHAFKFAHAFAHAFAFKFAFOGAFAFJFAHAFKFOGAFOGAFKFAHAFOGKFAFAHAF", "AFOGKFOGAFAFOGKFAFOGAFAFAHJFOGKFAFAHKFOGAFKFOGJFAFKFOGAFKFAFAHAFKFOGAFAFAFOGAHKFAFOGAFKFAFAHJFAFAHAHJFAFAHAFAFKFOGAFAHKFAFAFAHJFOGKFAFOGAFAHAFKFOGAFKFOGJFAFKFOGAFAFOGAFKFAFOGKFAFOGAFKFAFAFAHKFAFKFOGAFOGJFAFAHAIKLKLLLEOJNFLAGODNDFDBGBGOFCFFDOFAGCFCFDFAGDFAGFDAGEDODLLHOBMKFAFAFAHAFAHNGADAHJFAFAHAFAHKFAFOGKFAFOGKFOGAFKFOGAFKFAFAHAFAFAHKFAFKFOGKFAFAHAFOGKFOGAFKFOGAFAFAHKFAFAFOGAHKFAFOGKFOGAFAFOGJFOGKFOGAFKFAFOGKFAFOGKFOGAFAHKFAFAFAHJFOGKFAFOGKFAFKFAFAFAHJFOGAFKFOGAFAHAHAFAHKFOGKFAFAFAHAFKFOGKFAFOGJFAFKFAFOGJFAF", "AHAFAFKFAFOGKFAFAHAFOGKFAHAFKFAFAHAFAFKFAFOGAFAFKFOGAFKFOGKFNGAFOGAFKFAHAHAFKFAFOGJFAHAFOGJFAFAHAFKFAFOGJFOGKFOGAFOGKFAFOGKFOGAFKFAFJFAHAFKFOGAFKFOGAFKFAFOGAFKFAHAFKFAHAFOGKFAFAHAFKFOGAFOGKFOGAFOGAFOGAHAFKFAIFNJOJOJNGNMIODFDLEBGBGOFCFFDEEMDMDEEEEDFEEDFEEDFAGOFBGEDAGANHOOLKFAFJFOGAFKFOGKFOGAFKFOGJFAFAHAFAFAHAFAFKFAHAFJFAHAFOGJFOGJFAHAFOGAFAFOGAFJFAHAFAFKFOGAFKFAHAFJFOGAFAHAFKFAFOGKFAFAFKFOGKFAFAFAFKFOGAFOGKFAFOGKFOGAFAFJFOGKFAHAFOGKFAFOGKFAFOGAFOGKFAHAFKFOGAFJFAHAFJFAFJFOGAFAFOGKFNGAFOGKFAFAHAFAFAHAFAHAFAFJF", "AFAHJFAFOGKFAFOGJFAFKFOGAFAHAFAHJFOGJFOGKFAFAHAFOGAFAHAFAFOGKFOGAFAHAFJFAFAHAFOGKFAFAFAHKFAFOGKFAFOGKFAFAFKFOGAFAHJFAFOGKFAFJFOGAFOGAFKFOGAFKFOGAFAFAHAFAHKFOGAFKFOGAFAFAHAFOGKFAFOGAFKFOGKFAFAFAHAFOGKFAFKFCHAOJOJNGNOLLEFDNFBGDFBGOFCFMDHFMDGFMDMDEEMDEEEEEEEEDFFDIFBGEDLIANJOMIKFAFKFOGAFAFJFAFAHAFKFOGAFJFOGKFAFAHAFOGJFOGAFKFOGKFAFAFOGKFAFAHKFOGKFOGAFKFOGAFAFAHAFOGKFOGAFKFOGJFOGAFOGKFAFOGKFOGAFAFAHAHJFAFAFAHAFOGAFKFAFOGKFOGAFAFOGKFAFAFOGKFAFOGAFAHKFAFOGAFAHAFKFOGAFKFOGAFAHAFKFOGAFAHAFKFOGAFAFAHJFOGKFAFAHJFOGAFOG", "AFJFAFOGKFAFOGKFAFAHAFKFAFJFAHAFAFKFOGAFOGAFKFOGKFAFJFNGAHAFAFKFAFJFAHAFOGJFOGKFAFAHAHAFAFOGKFAFAHAFAFOGKFOGAFAFKFOGAFKFOGAFOGAFKFAHAFOGKFAFOGAFJFAHAFKFOGAFKFAFOGAFKFOGKFOGJFAFAHAFKFOGAFAFOGKFAHAFOGAFJFKFAIGOGNGNFNEHMDODBGBGBGEEFDEEIFHFHFDFCJIFHFEEEEEEIFEEEEIFDFEEMHFDBLGNIOPFADKFAFOGAHAFKFAHAFOGAFKFOGKFAFOGJFAHAFAFKFOGAFKFAFAFOGKFAFOGJFOGAFAFAFKFOGAFKFOGJFAHAFAFAFKFOGAFAFKFOGKFAFAHAFOGAFKFAHAFKFAFOGKFAHAFJFAHAFOGKFOGAFKFAHAFAFKFOGKFAFAHAFOGKFAFOGKFAFJFOGAFKFOGAFKFOGKFOGAFKFOGKFOGAFKFOGKFOGAFKFAFAHAFAFKFAHAF", "KFAFOGAFOGKFAFOGKFAFOGAFAHAFNGKFOGAFKFAFOGKFAFOGAFAHAFKFAFAHOGAFAHAFKFOGKFAFAFOGKFAFJFOGKFAFOGAFAHKFOGAFOGKFAFAHAFKFOGAFAFAHKFAFOGKFOGAFOGKFAFOGAFAHJFOGJFOGAFAHAFAHAFJFAFAFOGAHJFOGAFKFOGAFKFOGAFAHAFAHADBHFNGNAOEOOINDAGBGBGFDDFEEDEIFHFEEEEIFOLMNBLNFDEMDIFIFEEEEIFEEDFDEOFGLJOGLBFAFOGAFAHAFAFJFOGKFAFOGAFOGAFKFAFAHKFOGAFKFOGAFOGAHKFAFOGKFAFAFAHAHJFAFAFAHAFKFAFAHJFOGKFAFAFAHKFAFAFOGKFAFAHJFAFOGKFOGAFOGKFAFAFAHAFKFOGAFAFKFOGAFKFOGOGAFKFAFOGJFAFKFOGAFAFOGKFAFKFOGAFKFOGAFAFOGKFAFOGKFAFKFOGAFAFOGKFAFOGAFAHJFOGAFKFAF", "AFOGKFAHAFAFAHAFAFOGKFOGJFAHAFAFKFOGAFOGKFAFOGKFAFJFAHAFAHAFKFAFKFOGAFKFAFOGAFKFOGAFOGKFAFOGKFOGJFAFKFAHAFAFOGKFAFOGKFAFOGKFAFOGAFAFKFAFKFAFOGKFOGKFAFAFOGAFAFJFAHAFKFOGAFOGKFAFAFKFOGAFKFAHAFJFNGAFAHIDKFELEOGNEOAMMIFDBGOFDFMDEEIFEEEEIFIFEEIFIMMNJODNBLMGEEEEIFIFEEIFEEHFMDLKDNIOCGAFOGOGAFKFAFOGKFAFAHAFAHAFKFOGAFJFOGAFOGAFKFOGAFKFAFOGKFAFKFAHAFKFOGAFOGKFOGAFOGKFOGAFAFOGKFAHAFAHAHAFAFOGKFAFOGKFOGAFAFKFOGAFOGKFOGAFJFAHAFOGKFAFOGAFKFAFOGKFOGAFKFOGAFKFOGKFAFOGOGAFAFOGKFAFOGKFAFAHAFAFOGAFKFAFOGKFAFAHAFOGKFAFKFOGAFAF", "AFAFAFAHKFOGJFOGKFAFAFKFAFAHKFOGAFKFOGAFOGAFKFOGAFOGKFAFNGKFOGAFOGKFOGAFOGKFOGAFAFAHKFAFOGAFAFAHAFOGAFKFOGKFAFOGKFAFOGKFAFOGKFAFAHOGAFAHAFOGKFAFAFOGAHKFAFAHAHAFJFOGAFKFOGKFAFAHAFOGKFOGAFAFAHAFAHJFKFIDHIEOINFLOLGLAGAGBGDFEEEEEEIFHFHFHFEEIFEEMDKKDNMNMNKIDEIFIFEEIFIFIFEEMDHFOLFOELBDAFAHNGKFOGAFAFAHJFAFKFOGAFAFAHAFKFAFAHAFOGKFAFOGAFKFOGAFOGJFAFOGKFAFKFAFAHAFKFAFKFOGAFAHAFJFOGJFAFAHKFAFOGAFKFAFAFAHAHAFKFOGJFAFKFOGAFKFOGAFOGKFAFAHAFAHAFOGKFAFOGAFAHAFKFOGAFKFAFAHKFAFOGKFAFOGAFAHJFAFAHAFOGKFAFOGAFKFOGKFAFOGAFKFOGKF", "AFKFOGJFOGAFAFKFAFAHOGAFAHAFAFKFOGAFAFAHAFKFOGAFOGKFAFOGKFOGAFOGKFAFAFOGKFAFAFKFOGKFAFOGAFKFOGJFOGKFAFOGKFAFAHAFAFOGAFOGKFOGAFAHAFKFAFJFOGKFOGAFAHAFKFAFAHAFKFOGAFKFAFOGKFAFOGJFAHAFAFAFKFOGJFAHAFKFAFBHPNHOLLNDBGAGDFBGOFEECFEEIFEEIFIFHFIFEEIFDEMDGFPJKKHFHFHFHFHFNHHFIFHFHFHFLIFOCOGJADAHAFOGAFKFOGKFAFOGAFJFAHAHAFKFOGAFKFOGKFAFOGAFKFOGAFOGKFAFOGKFAFAHAFOGJFAHAFOGAFKFOGKFOGAFKFAFOGJFAFAHAFAHAFNGAHAFJFOGAFKFOGAFOGAFAFOGKFAFKFAFAHAFJFAHAFJFAFAHAFOGKFAFOGAFKFOGKFNGAFAHAFOGAFKFOGKFAFOGKFOGJFAFAHAFJFOGKFAFOGAFKFOGAFAF", "AFOGKFAFAFAHAHAFOGJFAFAHJFOGAFOGKFOGKFAFAHAFKFAFAHAFOGKFAFAFAHJFAFOGKFAFOGOGKFAFAFOGKFAFAHAFKFAFAFOGKFAFOGAFAHKFOGKFAFAFOGKFOGJFOGAFAHAFKFAFAFAHJFOGAFAHJFAFOGKFOGAFAHAFOGKFAFOGKFOGAFAHAFKFAFAFOGAFKFKLJOANAGEDNDBGBGOFDFEEEEHFEEIFHFHFIFHFHFHFIFHFEEDEDEEEGFHFHFHFHFIFMGHFHFEEOFGLHOHMKFJFAFKFOGAFAFOGKFAFOGAFKFAFAHAFAFAHAFKFAFOGKFOGAFAFAHJFAFOGKFAFOGKFOGAFAFKFOGJFOGAFAFAFAHAFOGKFAFOGKFAFAHJFAFKFAFAHAFKFOGAFKFOGKFOGKFAFOGOGAFAHJFOGAFKFOGAFAHJFAFKFOGAFKFOGAFAFOGKFAFAFAHJFOGAFKFAFOGKFAFAFOGKFAFOGAFAFOGKFAFAHAFAFAHAF", "OGKFAFAFOGKFAFOGKFAFKFOGAFKFOGKFAFAFOGAFKFOGAFOGJFOGKFAFAFOGJFAFKFAHAFOGAFKFAFOGOGKFAFOGAFKFOGAFOGKFOGAFKFOGJFOGAFAFKFOGKFAFAFAFKFOGKFOGAFOGJFAHAFKFAFJFOGAFKFOGAFAFJFAHAFAFAHAFAFKFOGJFAHAFOGAHAFKFLFAOHNLIEDEHODBGBGDFEEEEHFIFOFEEHFIFIFHFIFIFHFIFHFHFHFHFIFHFMGHFHFMGHFIFHFHFDELKMNAOPGAFKFOGKFAFOGKFAFOGKFAHAFAHAFKFOGKFOGAFOGKFOGAFKFOGKFAFOGKFAFAHAFAFJFAHAFOGKFAFAFOGKFOGJFOGKFAFOGKFAFOGKFAFAHAFOGJFAHAFKFAFOGAFAFKFAFOGAFJFAHAFAFKFOGAFKFOGKFAFOGAFJFAHOGAFAFOGKFAFOGOGKFAFKFOGAFOGKFAFOGKFAHAFAHAFKFOGKFAFAHAFJFAHAFJF", "AFAFOGAHKFAFAHAFAFOGAFKFOGAFAFOGKFOGKFAFOGKFAFAFAFKFOGAFAHKFAFOGAFKFOGKFAFOGKFAFKFOGAFAHJFOGAFAHKFAFAFAHAFKFAFAFAHNGAFKFOGAFAHKFAFAFOGKFAFAFOGKFOGAFAHAFKFOGAFKFOGKFAFAHKFOGJFAFOGAFKFAFAFAHJFAFOGJFHJJNGLEDAGOFBGBGCFEEHFIFIFHFIFHFIFHFMGIFHFIFHFHFIFHFIFHFNHHFEEIFMGHFMGCFHFIFMDLHOLGNAIJFAFOGAFAHKFAFOGKFAFAFAHJFOGAFKFAFAHAFKFAFAFAHAFKFAFOGKFAFOGKFOGAFAFKFOGAFOGKFOGKFAFAFAFAHAFOGKFAFOGKFAFOGKFOGKFAFAFAHAFAHJFOGAFOGKFAFAHAFKFOGAFOGKFAFOGAFOGKFAFOGAFKFAFAHAHJFAFOGKFAFOGAFAFKFOGAFOGAFKFOGAFAHJFOGAFKFOGAFAHJFOGKFAFOG", "JFAHAFKFAFOGAFJFAHAFKFOGAFOGKFOGAFKFAFAHAFAFAHOGKFOGAFOGKFAFOGKFOGOGAFAFKFOGAFKFOGAFOGKFAFAFOGKFAFAFOGJFOGAFAHAHAFKFAFOGAFOGKFAFNGAHAFAFKFOGKFOGAFAFKFOGAFKFOGAFKFAFAHAFAFKFAFOGKFAHAFOGOGKFAFAHAFBFJMEOEKAGDFAGBGAGEECFHFHFHFIFHFIFHFNHIFHFIFHFMGNHHFIFHFIFIFHFIFNHHFHFHFMGIFHFDENFGLEOELJFAHAFOGKFAFOGKFAFOGKFOGAFKFOGAFOGAFKFOGAFOGJFOGAFOGKFAFAHAFAFKFAHAFOGKFAFKFOGAFAFOGKFOGKFOGKFAFOGKFOGAFAHAFKFAFAFOGJFAHAFAFKFOGKFOGAFKFOGAFKFOGKFAFAHAFAFKFAFOGKFAHAFAHAFKFAFOGKFAFOGAFKFAHOGAFAFJFAHAFJFAHAFAFKFOGAFKFOGJFOGAFAFAHAF", "AFJFOGAFAHJFAFOGKFOGAFKFAFKFOGJFOGAFOGJFOGKFAFKFOGAFKFAFOGAFKFAFKFAFAHOGAFKFOGAFAFAHJFAFAHKFAFOGKFOGKFAFKFOGAFJFOGAFAHJFAFKFOGAFKFAFAHOGAFKFAFAFAHAHAFKFOGAFAFAHAFOGKFOGAFOGKFAFAFKFOGKFAFOGKFAFOGKFENHNLIFDBGBGOFOFEEHFHFIFHFHFIFIFIFHFHFNHHFIFHFHFIFHFHFMGHFIFMGHFHFMGHFMGHFMGHFNFLKHOJMGEAFOGAFOGAFAHAFOGKFAFJFOGAFKFOGJFOGAFKFOGKFAFAFAHAFOGKFAFAHOGAFKFOGAFOGKFAFAFAHKFAFOGAFAFAFOGAFKFAFAFAHJFOGAFAHAHJFAFAHKFOGAFAFAFAHKFAFAHAFOGJFAFOGKFOGKFOGAFKFAFAFAHJFOGAFAHAFAFAHKFAFOGJFAFAHKFAFOGKFAFJFOGAFOGKFAFAFKFAFAFAHJFAFKF", "OGAFKFAHAFAFKFAHAFKFAFOGKFOGAFAFAFOGKFAFKFAFAHAFAFAHAFOGJFAHAFOGAFOGJFAFKFOGAFAHAFKFOGAFAHAFAHAFAFAHAFAFOGAFKFOGAFKFOGAFKFOGAFAHAFAHAFJFAHAFNGAHAFJFAHAFAFOGKFAHAFAHAFJFAHAFAFAHAFOGKFAFAHAFAFAHAFOHANEOEGNDBGBGOFCFEEHFHFEEGFNHIFEENHHFHFIFHFHFIFHFHFNHHFMGHFMGHFHFMGHFMGCFMGHFHFDELKDOBMOHAFAFOGKFAFJFOGKFAFOGAFKFOGAFKFOGAFKFOGAFAFKFOGJFAHAFAFNGAFKFNGAFAHAFKFOGAFOGKFOGAFKFOGKFAHAFKFOGAFOGJFAFKFOGAFKFOGAFJFOGAFOGKFAHAFAFOGJFOGKFAFAHAFAFKFOGAFAHAFOGOGKFAFJFAHAFKFOGJFAFAHAFAFKFAHAFOGKFAFOGAFKFAHAFAFKFOGOGAFOGKFAFOGAF", "JFAFAFAHJFOGAFKFOGAFAHAFOGKFAFAHKFAFOGAFOGKFAFAHKFAFAHKFAFAFAHKFOGAFOGKFAFAFAHJFOGAFKFOGJFAFAHKFOGJFOGKFAFOGAFKFOGAFKFOGAFAFAHJFOGJFAFOGKFAFKFAFAHAFJFOGKFAFOGJFOGJFOGAFKFOGKFAFAHAFOGJFAFAHJFAFAFPFIOANBGAGOFBGEEHFHFCFHFHFMDDEHFHFHFIFMGHFIFMGHFMGHFHFIFHFNHHFMGHFHFMGHFMGMGMGNFGFNHHNAOLFAFAHKFAFOGAFKFAFOGKFOGAFKFOGAFAFAHAFKFOGAFOGKFAFKFOGKFAFAHAFKFOGJFAFOGKFOGKFAFAFOGAFKFAFOGKFOGAFAHKFAFOGAFKFOGAFKFOGAFKFAFKFOGAFAHJFAFAFKFOGAFKFOGAFOGJFAFKFOGKFAFOGAFAFKFOGAFKFOGAFAHKFOGAFAFAHJFAFOGKFOGAFKFOGOGAFKFAFAHKFAFOGKFAF", "AFAFAHAFAFKFAHAFOGAFJFAHAFAFOGKFAFOGKFAHAFAFOGJFAFOGJFAFOGKFOGAFKFAFKFAFOGOGJFAFKFOGAFKFAFOGJFOGAFAFKFAFOGKFAFOGKFAFOGAFKFOGKFAFKFAFOGKFAFOGAFOGKFAFOGKFAFAHAFAFKFAFAFKFOGAFOGKFNGAFKFAFOGKFAFOGKFGJDOAMEHFDBGOFHFHFIFDEHFLKPJEHEEDEHFMGHFHFMGHFHFHFMGHFMGMGHFMGHFMGMGMGMGMGHFMGHFHFOFAOGNHIADAHAFOGAFKFOGAFAHAFAFOGAFKFAFOGKFOGAFKFOGKFOGAFOGAFAFOGJFOGAFKFAFAHAFAFKFAFAFOGKFOGAFOGKFOGAFAFKFAFOGKFOGAFJFAHAFAFAHAFAHAFAFOGKFAFOGKFOGAFAHAFKFOGKFAFAFOGKFAFAFJFAHAFOGKFAFOGKFAFJFOGAFOGKFOGAFKFOGAFKFAFOGAFJFAHAFOGKFOGAFAHAFAF", "AFAHJFOGKFAFOGKFAFAHAFKFOGKFAFOGAFKFAFOGKFOGKFAFOGKFAFOGKFAFKFOGAFOGAFAHKFAFOGAFOGKFOGAFAHKFAFAFAHAHAFOGKFAFAHAFOGKFAFOGAFKFOGAFOGKFAFOGKFAFOGKFAFAHAFOGKFAFAHOGAFAHKFAFAFAHJFAFAFAHAFAHJFAFOGKFAFELHOGLAGBGOFCFHFIFHFHFHFBNMNDOPJNHHFHFMGIFMGHFNHHFHFNHHFMGMGHFMGMGHFMGMGLGMGMGHFGFMHDLGOIIAHJFAFAHKFOGAFAHJFOGKFAFOGAFAHJFAFAFAHAFKFAFAFAHKFOGKFAFOGKFOGAFAHJFOGAFOGKFOGKFAFKFOGAFAFKFOGAHAFOGKFAFAFAHAFKFOGKFAFOGKFOGKFAFOGKFAFOGAFAHJFOGAFKFOGAFAHJFAFOGAHAFKFOGAFOGKFAFOGKFAFAFAHJFAFKFOGAFKFOGAFAHKFAFAFAHJFAFAFKFOGJFOGKF", "KFOGAFKFAFOGKFAFOGKFAFOGKFAFAHAFAHAFOGKFOGAFAFOGKFAFOGKFOGAFOGAFOGKFOGKFOGAFKFOGKFAFAFOGKFAFAFOGKFAFOGKFAFOGAFKFAFOGKFAHAFOGAFOGKFAFAHAFAFOGKFAFOGJFOGKFAFOGAFKFAFKFOGAFOGKFOGAFOGJFOGKFAFOGAFAFBFJMFOAKODNHOFHFIFHFHFHFHFKILNFOMNIMIFDEHFNHHFMGHFNHHFMGHFMGHFMGMGMGMGMGMGHFMGLGMGMGCFANEOIIKFAFOGKFAFAFOGKFAFKFAFOGKFOGKFAFOGKFAHAFOGAFOGKFOGAFAFOGKFAFAFAHAFAFKFOGKFAFAHAFAFOGAFKFOGAFKFAFOGKFAFKFOGJFAHAFOGAFJFAHAFKFAFAHAFAFAHAFAFKFAFJFAHAFAFOGKFAFOGAFKFOGAFKFOGKFAFAHAFAFOGAFKFOGAFOGKFAFOGAFOGJFAFAHOGKFAFAHAFOGKFAFAFAF", "AFKFOGAFOGAFOGKFAFOGKFAFOGAFJFOGKFAFAFOGKFAFOGKFAFOGAFAFKFOGAFAHJFAFAFAFKFOGAFAFOGKFAFAFOGAHKFAFOGKFAFOGKFAFAHAFAHAFAFKFOGKFAFAFOGKFAFAHKFAFOGAFKFAFAFOGKFAFAHAFOGAFKFOGKFAFAFAHKFAFAFOGKFAFKFAFGEAOAOEGAGOFCFHFIFNHHFHFGFDEHFBLDOIMMGHFHFIFIFMGHFHFMGHFMGMGMGHFMGMGMGMGLHMGHFMGLGLGMHANEOCHAFOGKFAFOGKFAFOGAFOGKFAFAFAFOGKFAFOGJFOGKFAFKFAFAFAHAHJFAFOGKFAFAHAFOGKFAFOGJFOGKFAFOGAFKFOGAFAHJFAFOGAFKFAFAFAHKFOGAFJFOGAFOGJFOGKFAFAHAHAFOGAFKFOGKFAFOGKFAFAHAFKFOGAFAFOGKFAFAHAHKFOGAFKFOGAFOGKFAFAHKFAFOGKFAFOGKFAFAHAFOGKFOGAF", "AFOGAFAFKFOGJFAFAHAFOGAFKFOGAFKFOGAFOGKFAFOGKFAFOGAFKFAHAFAHAFKFAFKFAHAFOGAFKFOGKFAFAHAHAFJFAFOGKFAFAHAFAFOGJFAHAFJFAHOGAFAFKFAHAFOGJFAHAFOGJFAHAFOGKFAHAFAHAFJFAHAFOGKFAFOGAFKFOGAFAHAFOGKFOGAFBHAOMNKIFDOFHFHFIFHFMGIFIFNFGFGFNFNFNFMGIFMGMGMGMGMGMGMGMGHFMGMGMGMHMGMGHFMGMGMGMGGFNHAOEOBHAHAFAFOGKFAFOGJFAHAFAFKFOGOGKFAFAHAFAFKFAFAHAFOGAHAFKFAFOGKFAFOGJFAHAFAFKFOGAFKFAFOGAFKFOGAFOGJFAFOGKFOGAFOGJFAHAFAFKFOGAFJFAHAFKFAFAHAFJFAHAFKFOGAFAFOGKFAFAHAFKFOGAFJFAHAFOGKFNGAFAFKFOGAFKFAFKFAFAHAFAFOGKFAFAHAFAFOGJFAHAFAFAFKF", "KFAFOGAHAFKFAFOGJFAFKFOGAFKFOGAFKFOGKFAFOGKFAFOGKFOGAFKFOGAFAHAFOGAFAHKFAFOGAFKFOGAFKFAFAHAFAHJFAFOGJFOGKFAFOGJFAFOGKFAFAHOGAFKFOGAFAFKFOGAFAFAHKFAFOGAFAHJFOGAFKFOGAFOGKFAFAHAFKFOGJFAFKFAFAFAHDHNNANBGEHMGNFGFIFMGMGMGMGHFIFMGGFHFHFMGMGHFMGHFMGHFMGMGMGMGLGMGLGMGHFMGMGLGMGMGLGHFLKGNPMKFJFOGKFAFOGEJGIAFNGKFOGAFKFAFOGOGKFOGAFOGKFAFAHJFAFAHAFAHAFOGKFAFOGKFOGAFOGKFAFOGAFAHKFAFAFAHKFAFOGKFAFKFOGAFOGKFAFOGAFKFOGAFKFOGAFOGJFOGAFKFOGAFKFOGAFKFOGAFAHJFAFAFAHAFKFOGAFAFKFOGAFOGKFOGAFOGAFAHJFOGKFAFOGAFKFOGKFAFOGKFOGAFAHAF", "AFOGAFKFOGAFOGKFAFAHAFOGAFOGKFAFOGAFAFKFOGAFKFOGAFKFAFOGAFKFNGAFKFOGKFAFOGAFKFOGAFAHAFAHAFKFOGAFKFOGAFKFAFOGKFAFOGKFAFAHAFJFOGAFKFOGKFOGAFKFOGJFAFOGAFKFNGAFKFAFOGKFAFKFAFOGJFOGAFKFAFAHAFOGAFJFDHAOGNEHHFHFHFHFMGIFHFHFMGIFMGMGIFHFMGMGHFLGMGMGHFMGMGMHMGMGMGMGLGMGMGHFMHMGMGFIMGGFIMHOPKJFKFOGAFADOHGJHIOGAFAFJFAHAFOGAFKFAFJFAHAFAFOGKFAFJFAHAFJFOGKFAFAHAFAFJFAHAFAFOGKFOGKFAFOGOGKFAFOGKFAFOGAFKFAHAFAFKFAHAFOGKFAFOGAFOGKFAFKFOGAFKFAFOGAFKFOGAFOGKFAFOGAHAFKFOGAFKFOGAFJFAHAFAFKFOGAFKFOGAFKFAFOGAFKFOGKFAFAHAFAFKFOGJFAF", "AFKFAFOGKFAFAFOGKFAFAHKFAFAFOGKFAFAHOGAFKFOGAFKFOGAFAHAFAHAFKFOGAFAFOGKFAFAHAFKFOGJFOGJFOGAFKFOGAFKFOGAFOGKFAFOGKFAFOGJFAFAHKFAFAFAFOGKFAFOGKFAFOGKFAFOGKFOGAFAHAFOGKFOGAFKFAFAHAFOGKFAFAHKFOGAFIIGNAOBGNFHFHFMGMGMGMGHFMGMGCFMGMGHFHFMGMGMGMGMGMGMGMGHFMGLHMGMGMGMGMGMGNHHFMGLGGFKIPNEOBHAFAFAHAFAFEJDHCGBFOGOGAFKFOGKFAFOGAFOGKFOGKFAFOGAFOGJFOGAFKFAFOGKFOGKFAFAHKFAFAFOGKFAFOGKFAFOGAFKFAFOGKFOGAFKFOGAFOGKFOGAFAFAHKFAFAFOGAFOGKFOGAFAHKFOGAFKFAFAHAFAHJFAFAHAFKFOGAFAHAFOGKFOGAFAFAHKFOGAFAHAFAHKFAFOGAFOGAFKFOGAFAFKFOGAF", "AHAFOGKFAFOGOGKFAFOGJFAFAHOGKFAFAHAFKFOGAFKFOGAFOGAFJFAHAFKFOGAFJFAHAFOGJFAHAFOGKFAFAFAFKFOGAFKFOGAFAFOGKFAFOGKFAFOGKFAFOGKFAFOGAHAHAFAFAHAFAFOGKFAFAHAFAFAFOGKFAFJFOGAFAHAFOGAFKFOGAFKFOGAFKFAFDHAOCMNHMDHFHFMGHFMGHFNHHFMGMGMGHFMGMGHFMGMGMGMGMHLGMGLGMGHFMGMGMGMHMGMGLGMGMGLGNFLKHOJMBFJFAHAHAFEJKLBMLLPFAFOGKFOGAFAFOGKFAHAFAFKFAFAHAFOGKFAFKFOGAFKFOGAFKFAFOGJFAFAHAHAFAFOGKFAFAHAFKFOGAFAHAFAFOGAFJFAHAFAFKFAFKFOGAFKFOGKFAHAFAFJFAHAFAFKFOGAFOGJFOGKFAFAHAFKFOGAFAFKFOGKFAFAFKFOGJFOGAFAFKFOGJFAFAHAFAFJFAHAFKFAHAFOGAFKF", "AFKFAFOGAFKFAFOGAFAHAFAHJFAFOGAFAHJFAFKFOGAFKFOGKFOGAFJFOGAFAFAHAFKFOGAFAFKFOGAFOGKFOGAFOGKFAFOGKFOGKFAFAFOGKFAFOGKFAFOGKFAFOGKFAFJFOGKFAFAHAFAHAFAHJFOGKFAFAFOGKFAFAFAHJFOGKFAFOGKFOGAFKFOGAFOGLFAODOBGGFHFMGHFMGMGMGMGMGMGMGMGHFMGMGMGMGLGLGMGGFNHMGMGLGMGMHMGLGMGMGMGMGMGLGGFLGLNHOGJADAHJFAFAFFJBOJOJOPKAFAFAFOGKFOGAFAFAHKFOGAFOGJFAFKFOGAFAFAHAFOGKFOGAFOGKFAFOGJFAFAHKFAFOGAFJFOGAFKFOGJFOGKFAFOGAFAHKFOGAFOGAFKFOGAFKFAFAHKFOGAFKFOGAFAFAHKFAFAFKFOGAFKFOGAFAFAHAHAFKFOGAFAHAFKFAFAFAHKFAFAFOGKFAFAHAHAFJFOGAFKFOGAFOGAF", "AHAFOGAFKFOGAFKFOGKFOGKFAFAFKFOGJFOGAFOGKFAFOGAFAFAFKFOGAFKFAHAFKFOGAFKFAHAFJFAHAFAFKFOGKFAFAHAFAFAFOGAFOGKFAFAHAFAFOGKFAFOGKFAFAFOGKFAFOGJFAHAFJFAHAFAFOGKFOGKFOGAFOGKFAFKFAFAHAFAFKFAFOGAFAFJFKFOMHONIDEHFMGMGMGMGMGHFMGMGMGHFNHNHMHMGGFNFGFNFHFGFNFMGMHMGMGMGMGMGMGMGMGMGLGHFLIHOAODDAHOGAFAHPCEJHMANNNGJJFAFOGKFOGAFKFAHAFAFJFAHAFAFKFOGAFKFOGKFOGKFAFAFOGKFAFOGKFAFOGJFAFAHAFAHAFKFOGAFKFOGAFAFKFAHAFJFOGAFOGKFOGAFKFOGAFAHAFOGKFAFOGAFKFOGJFAFOGKFOGAFAHAFKFNGAHAFJFAHAFAFOGKFOGAFOGKFNGAFOGKFAHAFAHAFKFAFOGKFAFOGKFAFKFAF", "AFAHJFAFOGAFAHAFKFAFAFOGAHKFAFKFAFAFAHAFOGKFAFAHAHJFAFAFAHAFNGKFOGAFAHAFNGAFOGKFOGAFOGKFAFOGKFOGKFOGKFAFOGAFOGKFOGAFKFAFOGKFAFOGAHJFAFOGKFAFKFOGAFKFOGKFAFOGAFAFAHKFAFOGAFOGKFAFAHOGAFAHJFOGKFAFKFPKEONMHFNFMGMGHFMGMGMGMGMGMGMGMGLGHFGFHFDEHFEHJLNHMGGFMGMGMGLJCJMGLJCJMGFINFLGLNEOMIKFAFOGOGJFOGNGFJELLMFJAFKFAFAFAFAHAFNGKFOGAFKFOGOGAFAFAHAFAFOGKFAFOGKFAFOGAFKFAFAHKFAFOGJFAFAHAFOGKFOGAFKFOGAFOGKFOGAFKFAFKFOGKFOGAFKFOGAFKFAFOGKFAFOGAFAHAFOGKFAFAFAHJFOGAFKFAFAHAFJFOGKFAFAFAHKFAFOGKFAFOGAFJFOGJFOGAFAHAFOGKFAFOGAFOGKF", "AFJFAFOGKFAHAFKFOGAFAHAFJFAFOGAFKFOGJFOGKFAFAHAFKFOGAFOGJFOGKFAFAFOGJFAFKFAHAFAFKFOGKFAFAHAFAFKFOGAFAFOGKFOGKFAFJFAHAFOGKFAFOGAFKFAFOGKFAFOGAFKFOGAFKFAFOGAFKFOGJFAFAHAFOGKFAFOGJFAFKFOGAFKFAFOGADDHIOMNNHGFLGMGMGMGMGMGMGMHMGMGMGMGMGNHKKJLDNDOMNDLLGMGFIMGMGCJMGMGCJMGMGGFGFJLHNEOPFAFOGAFAHAFKFAFGIGILMGIAFAFOGKFOGJFAHAFOGKFAFOGKFAFKFAHAFKFOGKFAFOGKFAFAHAFAHAFAHAFAFOGKFAFOGJFAHAFAFKFOGAFKFAHAFAFKFAHAFAHOGAFAFAFOGAFKFNGAFAHAFOGKFAHAFKFOGKFAFNGAHAFAFKFOGAFOGJFAHAFOGAFKFOGJFAFAHAFAFOGAFKFOGAFAFKFOGKFAFKFOGAFJFAHAFAF", "KFAFOGKFAFAFAHAFJFOGKFOGAFAHKFOGAFKFAFAFOGKFAFOGAFKFOGKFAFAFOGKFAFKFOGAFOGKFAFOGAFKFAFOGJFOGKFAFAFAHKFAFAFAFOGAFOGKFAFOGAFAHJFOGAFAHAFOGKFAFOGAFKFOGAFOGKFAFOGKFAFOGKFAFAHAFOGKFOGKFOGADOGAFAHKFOGJFELJOBLMDLGFINHMGHFMGLGMGMGMGMGLGNHLNFOJOMNMNDOJLMGLGNHFIMGMGFIMGMGMGLJGFJKMNJOMIKFKFAFOGJFOGAFOGKFJJPLGJOGBFAFOGAFAFKFOGAFOGKFAFOGAFOGKFOGAFAFOGAFKFOGAFJFOGKFOGJFOGKFAFOGKFAFAFAHKFOGAFKFOGAFKFOGAFAFKFOGJFAFAHAHJFAFOGAFKFOGJFAFAFOGJFOGAFAFOGKFAFKFOGAFAFKFOGKFAFJFOGKFOGAFKFOGAFAHKFOGKFAFOGKFOGAFAFKFOGAFOGKFOGAFKFOGAF", "OGAFKFOGAFAHAFKFOGAFAFKFAHAFAFKFOGAFAHAHAFAFAHAFKFOGAFAFKFAHAFOGKFOGAFOGKFAFOGJFAHAFAHAFAFKFOGAFOGKFAFAHAFOGKFOGKFAFOGKFAHAFAFKFOGKFAFKFAFOGAFKFOGAFOGKFAFAHAFAFOGKFAFAHAFJFAHAFAFOGJFOGAFKFAFAFJFJFDHAOFONHGFMGIFMGMGMHMGHFCJLJMGMGNJDLDNBNGMLKMGMGLGMGMGCJFIMGMHMGMGFINFNHLNJOELEJADAFAHAFOGAFOGAFGEBMFNCLKFAFOGAFKFOGAFJFAHAFAFAHAFOGKFOGAFJFAHAFKFOGAFAHAFKFOGAFAFKFAFAHAFAFKFOGJFAFKFOGAFAFOGAFJFAHOGAFKFAFAHAFKFAFAHAFKFOGAFAFKFOGKFAFAFKFOGKFAFOGAFJFAHAFOGKFAFAFOGAFAFKFOGAFJFAHAFAFKFAFAHAFAFKFAHOGAFJFAHAFAFKFOGAFAFKF", "AFOGAFKFOGJFOGAFKFOGAFOGJFOGAFOGKFAFAFAHJFOGJFOGAFKFOGAFOGKFAFAFOGKFAFKFAFOGKFAFAFAHJFOGKFAFAFAHKFAFOGKFOGKFAFAFOGAFKFAFOGKFOGAFAFOGAHAFAHKFOGAFAFAHKFAFOGKFOGAFKFOGAFAHJFAFKFOGKFAFAFOGAFOGAFOGAFKFBDJMJOIMEEGFCJMGMGMGMGMGMGNHMGLGMGMGMHMHHFGFLGLGNHMGMGMGMGLJCJMGMHGFMHAOJOLLKFBDJFOGAHAHAFAHJFAHBHLFHEKFAFOGAFOGAFKFOGAFAFAHKFAFAHJFAFAFAHAFAHJFAFAFAHJFOGAFKFOGAFOGAFAHKFOGAFKFOGAFOGKFOGKFAFOGAFKFAFOGAFAHJFAFOGKFAFAHAFKFOGAFOGKFAFOGKFAFAFOGKFAFOGAFAHKFAFOGAFAHKFOGAFAFAHAFOGKFOGAFOGKFAFAHAFOGJFAFAHAFKFOGAFOGKFOGAFAF", "KFAFKFOGAFAFKFOGAFKFAHAFAFKFAHAFAFKFOGJFAHAFAFKFAFOGAFKFOGAFKFOGKFAFOGAFOGKFAFOGKFAHAFAFOGJFAHOGAFKFOGAFKFAFAFAHAFKFOGAFJFOGKFAFOGKFAFKFOGAFAFKFOGKFAFOGKFOGAFKFOGAFOGKFAFOGAFOGAFAFOGKFAHAFOGAFOGAFJFDHAOGNNHGFMGMGMGLGMGMHMGCJMGMGMGLGGFGFMGFIMGNHCJLJMGCJLJMGCJMGGFOFANJOLLPGADJFOGKFOGAFJFKFAFAHAFECIDIDAFOGKFAHAFOGAFAFAHAFAFOGKFAFOGAFKFOGKFOGAFOGKFAFKFOGAFKFOGKFOGJFAFAHAFOGAFOGKFAFAFOGAFKFAHAFOGKFOGKFAFOGKFAFOGJFOGAFKFOGKFOGAFAHAFAHAHAFAFOGKFOGJFAFOGAFKFAHAFAFKFOGKFAHAFAFJFOGKFAFOGJFOGKFAFOGKFOGAFJFAHAFAFJFAHAF", "AFOGAFKFOGAFOGKFOGAFKFOGAFOGJFOGKFOGKFAFAFAHAHAFAHKFOGAFKFOGAFAFOGKFAFOGKFAFOGKFAFAFAHKFAFOGKFAFOGAFKFOGAFOGAHJFAFOGAFAHAFAFOGKFAFOGAFOGKFOGAFOGKFAFOGJFAFAFAHAFKFOGKFAFAHKFOGKFOGKFAFOGKFOGKFOGAFOGAFKFELHOANGFLGMGMHIFLGNHMGMGMGFIMGMHMGMGMGMGFIMGCJIFLJIFCJMHMGJHMGANJOLLBHADAHOGKFOGAFAHAFAHAFGIFJFJPFPFGIOGAFAFAHKFOGKFAFAHNGKFAFOGKFOGAFAFAFKFOGKFAFOGAFKFOGAFAFAFAHAFAHJFOGKFAFAFOGKFOGKFOGAFKFOGAFAFKFOGAFKFOGAFKFAFOGKFAFAFOGKFAFKFOGJFAFAHKFAFOGKFAFOGKFOGAFJFOGKFOGAFAFAHKFOGAFKFOGAFKFAFAFOGKFAFAFAHAFOGKFOGAFAFKFOG", "AFKFOGAFJFAHAFAFKFOGAFKFAHAFAFKFOGAFAFAFOGKFAFJFAHAFAFAHAFAFAHAHAFAFOGKFAFAHAFAFKFOGJFOGAFKFOGAFKFOGAFKFOGAFKFAFKFAHAFJFAHAFKFOGAFKFAHAFAFJFAHAFAFOGKFAFAFOGKFOGAFKFOGAFJFOGAFAFAFOGAFKFAFKFAFKFKFAFKFAFGEPNFOJKGFGFNHLJMGMGMGMGMGNHLGCJLJMGLJCJMGMGMGCJNJMGMGMGJHMGKNJOANHIADAHNGAFOGAFOGKFOGJFAFGJPLAGDFAIBHAFOGAFKFOGAFAFOGKFAFAFOGKFAFKFAFKFAHOGAFAFOGKFAHAFAFOGKFAHAFKFAHAFAFAFKFOGKFOGAFAFKFOGAFJFAHAFOGAFKFOGAFKFOGAFKFOGJFAHAFAFAHOGAFAFOGKFAFOGKFAFAFAHAFAFKFOGAFOGAFKFAHAFAFKFAFOGAFKFOGAFOGKFOGAFOGKFOGKFAFAFKFAHAFAF", "AFAFKFOGAFKFOGAFOGKFOGAFKFOGAFOGKFOGKFOGKFAFOGAFKFOGKFAFAHJFAFAHKFOGAFOGKFAFAHOGAFKFAFAFAHAFAFAHAFAHJFAFAHKFOGAFOGKFOGAFKFOGAFAFAHAFJFOGKFAFAHKFOGAFOGKFOGKFAFAFAHAFAFAHAFKFOGKFOGAFOGAFKFAFBFGEGJELIIOJAILLEOANNHGFMGIFMGLJCJMGMGMGMGMGMGLJIFMGLJCJMGLJCJMGLGNFMHANJONMPFPCJFJFAFKFAFJFAFAHJFAFOGCLBIICBBBBBDKFAFOGAFAFAHOGAFOGKFOGAFOGAFOGOGAFKFAFAHJFAFOGAFAHKFAFOGJFAFOGJFOGKFOGAFAFAFKFOGAFAFKFOGAFKFOGAFAHAFAFAHAFOGKFAFAFOGKFAFAHJFAFAHKFAFOGAFKFOGAFAHJFOGKFAFKFOGAFAHAFJFOGAHAFAHAFAHAFKFOGKFAFAFAHKFAFAFOGAHKFOGAFAHJF", "AHAFOGAFOGAFJFAHAFAFJFOGAFKFAHAFAFKFOGAFAFJFAHAFOGKFAFOGKFAFOGJFAFKFOGKFAFAHAFJFAHAFOGAHAFKFOGJFOGKFAFOGJFOGAFAHAFAFKFAFOGKFAFOGKFOGAFKFOGAFJFOGAFAFKFOGAFAFJFAHAFJFAHAFKFOGAFAFOGAFKFAFKFPFHMAOHOHOHOGOGNGNJOFOBLHFLGMGMGCJMGMGLJMGMGFIMGNHLJMGCJFIMGCJMGLGMHNJLNJOJOLLDHCHGIBHGIAFAFKFAFJFAFOGOGFJPFLAGAMAECIDKFAHAFAHAFKFAHAFOGAFAFKFAHAFJFAHAFOGKFOGAFJFOGKFAFOGKFAFAHAFAFKFOGAFKFAHOGAFKFAHOGAFKFOGAFJFAHAFJFAHAFOGKFOGAFOGKFAFOGKFAFOGKFAFOGAFKFOGAFKFAHAFKFAFOGAFKFAHAFKFOGAFKFAFJFAHAFKFOGAFAFAHAFJFOGAFAHAFJFOGAFAFJFAF", "JFAFKFOGKFOGAFKFOGAFAFAHAFOGJFAFAHAFAFAHAHAFKFOGAFOGAFKFOGAFKFOGAFOGKFAFOGJFOGAFKFOGKFAFAHAFKFAFAFOGKFAFAFKFOGJFOGAFOGKFAFOGKFAFOGKFOGAFAFAHAFKFOGKFAFAFAHAHAFAHJFOGJFAFOGKFOGOGKFAFKFMICNJNJOHOGNCMCMGNHOJOJOFOMNLKDEJHCJMGLJCJCJCJCJCJMGCJCJMGMGMGLJGFNFMHGLEOONAOAOGNHOFNGNBMGNAKDHBFKFJFAFOGOGBHHCLAHCLBLCKDOGAFOGKFAFOGAFKFAFAHKFAFAFAHAFKFOGAFAFKFOGAFKFAFOGKFAFOGKFOGAFAFKFOGAFKFAFOGAFKFAFOGAFKFOGAFKFOGAFKFOGJFAFAFAHKFAFOGKFAFOGKFAFOGKFOGAFAFAHAFJFOGAFOGKFOGAFJFOGAFKFOGAFOGAFKFOGAFAFAHKFAFAHAFKFOGJFAFOGKFOGKFAFOG", "AFKFOGAFAFAFKFOGAFKFOGJFOGKFAFAHAFKFAHAFJFOGAFJFAHAFKFOGAFKFOGAFAHAFAFAHAFAFKFOGAFKFOGAFJFOGAFAHAHAFAFOGKFOGAFAFKFOGKFAFAHAFAFAHAFAFAFOGKFAHAFOGKFAFOGAHAFKFAFJFAHAFAFAHAFAFKFAFJDOJBOHOJOHOCMEKGHEKGHAKGKHKGNJOJOLNKINFGFLGMGMGCJFIMGMGFILGMGLGFIMGLGNHBLMNJOEOIMNIBLANAOINGNHOJNINGNANMIPFBHADAHCGIELAMAOBHEKDAFOGOGJFAHAFOGAFOGKFAFNGAHAFKFOGAFKFOGAFKFOGAFOGKFOGAFKFOGAFKFOGAFKFOGAFOGJFAHAFOGKFOGAFKFOGAFKFAFOGKFAFAFOGKFAFOGKFAFOGKFAFJFAHAFAFOGKFAHAFOGKFAFAHAFKFAFOGAFKFOGAFAHAFKFOGAFKFOGKFAFOGKFOGAFKFAFOGKFAFAFOGAFKF", "AFOGAFAHKFOGAFAFAHAFKFAFAFOGKFAFAHAFNGKFAFKFOGAFKFOGAFAFAHAFKFOGJFAFAHJFOGKFAFKFOGAFAFAHAFKFOGJFAFAHKFAFOGAFAHKFAFAFOGAHJFOGKFAFAHAHKFAFOGJFAFKFOGAFKFAFAHAFAHAFKFAFOGAHAHAFAFKFDKGNJOJNHKEKGHGHFHFHGHFHFHFHGKHKGNJOLNFLNHDJLGGFLGLGJHLGMHMHEHNJLKLKIMAOHNGNONAOEHJHEHKKPJNIKMALGLOLGNGNHOEOBMLIGEDHKBLAGBEDHELCBFAFAHAHJFOGAFKFAFOGAFKFAFAHAFAFAHAFKFOGAFKFOGAFAFAFAHAFKFOGAFAHAFOGKFAFKFAFAFAHJFAFKFOGAFKFOGAFAHAFOGKFOGKFAFOGAFOGAFKFOGAFOGKFOGKFAFOGJFAFAFOGAHJFAFOGKFAFOGAFKFOGJFOGAFAFAHAFNGAFAHJFAFKFOGAFAHKFAFOGKFAFOGAF", "AHAFAFKFOGAFKFAHAFKFOGAFOGKFAFOGJFOGKFOGAFOGAFAHAFAFOGKFNGAFOGKFAFAHAFAFKFOGAFOGAFJFAHAFKFOGAFAFKFNGAFAHAFAFKFOGAFOGKFAFAFKFAFAHAFJFAFAHAFAFKFOGAFAHAFOGJFOGKFOGAFKFOGJFAHADPFLMJOJOGNEKGHNEGHGHGHGHEKGHFHFHFHFHHHOLJNJOCOGLALNIJKJKKIBLANLNLNMNEOEOJOONOIAENIHLGMGFFIMGLGMHMHEHKILKNIFLGLCMONJOMICGKBGABBHEICKBADKFOGJFAFKFAFOGAFJFAHAFAHAFKFOGKFAFOGKFAFOGAFJFAHAHAFKFOGAFAFKFOGKFAFAHOGAFOGKFOGAFOGAFAFOGAFJFAHAFKFOGAFAFOGJFAHAFKFOGAFKFAHAFAFAFOGKFAFAHAHAFKFAFAHAFAFOGKFAFOGKFAFAFKFOGJFOGKFAFKFOGAFOGAFAHAFAFOGKFAFOGKFAF", "JFAFAHAFAFAHAFAHJFOGAFAHKFAFOGKFAFAFAFKFOGKFAFAHJFAFKFOGAFAHJFAFAHJFOGKFAFAFAHKFOGAFKFOGAFKFOGAFOGKFOGJFOGKFAFAFAHKFAFOGAHAFAHJFOGAFAHJFOGAFOGKFAFAHJFAFOGKFAFKFOGAFKFAFJFFJANJOGNGKFHGHGHGHGHNIGHGGGHGHEKGHGHFHMIGHEKGNJOJOEOFOHNMNCOJOFOJNGNGNJOJOHNNIDBJAMCHNBNMHGFMGMGMGJHFIDJLHNJLININIGLJNNMJEKAHADCLDJEFCDDAFOGAFAHAFAHKFOGAFKFOGAFNGAFKFOGJFAFOGKFAFOGAFKFAFOGAFKFOGAHAFKFAFOGJFAFAHKFAFAFAHKFOGKFAFOGAFKFOGAFKFOGAFKFAFAFAHAFAFAHAFJFOGKFOGAFAFAHJFAFAHAFAHJFOGKFAFOGKFAFOGAFAHAFKFAFOGAFOGAFKFOGKFAFAHKFOGAFOGAFKFAFOG", "AFAHAFJFAHAFOGKFOGAFAFKFAFOGKFAFOGKFAHOGAFAFOGKFAFAHOGAFAFKFAFKFOGAFKFAFOGKFAHAFAFAHAFAHAFOGAFKFAHAFAFAFKFAFOGKFNGAFAHAFJFAHAFAFKFAHAFAFKFOGKFAFOGKFAFOGKFAFOGAFKFAHAFKFGJAOJOINLLFHGHGHGHGHGHNEGGGHGHGHGGAKGHAKHHFHFHHKJOGNCMFKANCMAMOLCKAKEKGLCMHNONGGIBDAGCOIHNLKGFFINJMGCJLJMGLGKHMGJKLKLLHODKHEFBFBFBFCJEICECBFAFOGJFAHAHAFKFAFOGKFAFJFAHOGAFAFAHAFOGAFKFAHAFAHAFKFOGAFJFOGAFOGKFAFOGKFAFOGKFAHAFKFAFOGKFOGAFKFOGAFKFAHAFOGAHAFKFOGJFOGAFKFOGAFKFOGKFAFAHAFKFOGAFKFAFOGKFAFOGAFKFAHAFOGAFKFOGKFOGAFKFAFOGJFAFAFAHAFKFOGAFJF", "AFKFOGAFKFOGJFAFAFAHAHAFOGKFAFOGAFAFKFAFAHKFAFOGKFAFKFOGAHAFOGAFKFOGAFOGKFAFAFAHJFAFAHJFOGKFAFOGJFOGKFOGAFOGKFAFAFAHJFOGAFKFOGAFOGJFAFAHAFKFAFOGKFAFOGKFAFOGKFOGAFAHADGJGNJOJNEKGHGHGHEGKEAEMCHDBGMCKEEGGGGGGHHHMIGGEKGNONCMGGGHCICIIHCIGGGGGHEKGNONJOEGJADADAEGHNDLDJGFFIFIMGLJNJMGLJFIGFEHLNJNAIKDHAGBGBKBICLDFBBDOGOGKFAFNGKFOGAFKFOGAFOGKFAFAHKFAFAHKFOGAFKFOGAFAHAFKFOGAFKFOGAFAFAHKFAFOGJFAFAFAHAFOGKFAFKFOGAFAFAHAFJFOGKFAFAHAFKFAFOGKFAFAFAHAFKFOGAFJFOGAFKFOGAFOGKFAFOGKFOGAFKFOGAFAHAFAFOGKFOGAFOGKFAFOGKFAFOGAFAFAHAF", "KFOGAFKFOGAFAFKFAHAFJFOGKFAFOGAFKFAHAFOGJFAFAHAFOGAFOGAFJFOGAFKFOGAFOGKFAFOGJFAHAFAHAFAFKFAFAHAFAFKFOGAFOGKFAFOGKFOGAFKFOGAFKFOGKFAFOGKFOGAFAHAFAFOGKFAFAHAFAFKFOGADBHCNJOHOINFKGHNEAEMCCECEHDKEHDHDHDHDOCMEGGGGNIGHEKGNONIHGGGGHGCIGGHHOIOINIIHOLJNJOEGHAHAHALBAMDOKIJHFIFIFICJLJCJLJCJJHEHMNDNPFLCGBMAGBGBEDFCLCKFOGOGAFNGKFOGAFKFOGAFOGKFAFKFNGAFAHAFAFKFAFOGAFJFAHAFOGAFKFOGAFKFAHAFOGAFKFOGAFOGJFOGKFOGAFOGKFAFOGKFOGAFKFAFOGJFOGAFOGKFAFOGJFAHAFOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFJFAHAFKFOGKFAFAFAHAFAFKFAHAFAHAFKFOGKFAF", "AFAFAHAFKFOGAFOGKFAFOGKFAFOGKFOGAFJFOGKFAFOGJFAFKFOGKFAFOGKFAFOGAFAHKFAFOGKFAFJFOGKFOGAFOGKFAFAHAFOGKFAFAFOGAFAHAFKFOGAFKFOGAFKFAFOGKFAFKFOGAFAHKFAFOGJFAFAHOGOGAHJFKLJOCMHKJOGNNEBGNEAEHDKEHDKEHDKEHDKEHDHDNEMCGGEGIHONAMEKGGOEGGOECIHGHGHHHGHHAMJOHNGHKBHAMALDMNHOLNGLGMLKNJMHGFLJMGLJHFBLEODKAIKAFBKBKBFCFCJEKBBCJFOGAFKFAFAFOGAFKFAFKFOGAFOGKFAFNGKFOGAFAHJFAFOGJFOGKFAFOGAFAHAFJFAFKFOGAFKFOGKFAFAFAFKFOGAFOGKFAFOGKFOGAFOGKFAFKFOGAFOGAFKFOGJFAFKFOGAFKFOGAFAFAHAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGAFAHJFOGKFOGAFAHJFOGAFKFAFOG", "OGAFJFOGAFKFOGKFAFAHAFOGAFKFOGAFKFOGAFAFKFOGAFKFOGKFAFOGKFAFOGKFAFJFAFOGKFOGAFOGAFAFKFOGKFAFOGJFAHAFAFKFOGKFOGJFOGAFKFOGAFKFOGAFOGKFAFOGAFKFOGJFAFOGKFAFOGJFAFOGIDPFAOHOHHEKGNONCKNEAEHDKEHDKEHDHDMCNEKEHDKEMCHDOCOCOIHNONGKOEOEHGGGPEHGOEGGGGOIAMONJOCOHKOLCMCMGNHOJODOJOEOMNKNBLJKLJGFMHLNHOJIAICDHAMAKBBBKBICFCDCKFOGOGAFKFOGAHAFOGKFOGAFAHAFAFOGKFOGAFOGKFAFOGKFAFKFOGAFJFAHAFKFOGAFOGKFAFOGAFAFKFAHOGAFJFAHAFOGAFKFOGAFAFKFOGAFOGAFAFKFAHAFAFOGAFOGKFAFOGKFAFAHAFKFOGAFOGAFKFAFOGAFOGAFKFOGAFAFOGKFAFKFOGAFAFJFAFKFOGAFOGJF", "JFAFOGKFOGAFAFOGKFAFAHJFOGAFAFAHAFKFOGOGAFKFOGAFAFOGAFKFAFOGKFAFOGAFAHAFAFKFOGKFOGAFAFAHAFOGKFAFAHKFOGAFAFAFKFAFKFOGAFKFOGAFAFAHAFOGKFAFOGAFKFAFOGAFAFAHKFAFOGJFKFELHOGNFHNCCMONDMEGAEHDHDKEHDKEHDHDKEHDKEHDHDKENEAEKECMONFKFHPEHHPEKGOEKGOEGGIHINJOJNJNAOHNCMAOOLOLGKOLNMGNIOGNFOKNKMEHJKAONMGJAGKBFBKBMAKBNAOBFCDDBDKFOGAFOGAFKFOGAFOGKFAFKFOGAFKFAFAFAHJFAFOGKFAFOGAFAFAHAFKFOGAFKFOGAFOGKFAFAHOGAFKFAFOGAFKFAFAHJFAFAFAHAHAFKFOGKFOGKFAFOGKFAFKFOGAFOGKFAFOGAHJFOGAFKFOGKFOGAFAHKFAFKFOGAFKFOGKFAFOGAFOGKFOGKFOGAFAFKFOGAFAF", "AFAHAFAFKFOGAFKFOGAFKFOGAFAFKFAHAFOGAFKFAFOGAFKFAHAFAHAFOGKFAFOGKFAHAFKFOGAFKFOGAFKFAHAFOGKFAFOGJFAFAFOGKFAHOGAFOGKFAFOGAFAHAFJFOGKFAFOGKFOGAFAHAFJFAHAHAFOGKFAFPGBMHOHKNENDHHEMONIHAEAEHDMCHDMCHDKEHDHDHDHDKEHDHDMCNEOIEMINOEGGOEHGGGOEGGOEGGHHGNONGNAOGLGLBLAKFLEKALELEKDKLLOLAOHOEOPNHNAOMIBHNDBCKBMAOABAKBFCNDMAECAFKFOGKFOGAFJFAHAFAFKFOGAFKFOGAFOGKFAFOGKFAFOGKFAHAFKFOGAFKFOGAFKFOGKFAFAHAFJFAHAFOGKFAHAFAHAFOGKFAHAFJFOGAFKFOGAFAFOGKFAFOGAFKFAHAFAFOGKFAFAFKFOGAFKFOGAFAFJFOGAFOGAFKFOGAFAFAHAFOGKFAFAFOGAFKFOGAFKFAHAF", "AFKFOGAFAFAHKFAFAFAHAFKFOGKFOGJFOGKFAFOGAHKFAFOGJFAFAHKFAFOGAFKFAFOGKFAFOGKFAFAFAHAFJFOGKFAFOGKFAFOGKFAFOGKFAFAHAFOGKFAFAHJFOGAFKFAFOGKFAFKFOGAFAHKFAFAFOGKFAFKFAIGOJNGGAENCLEIKJOHKAEAEEGHDKEHDKEHDMCHDKEHDHDKEOCEGAEHHAMHLHHOEHGOEHHPEHHOEGGHHCMJOGNFLALALALALLKJKLKLKALFLALFLAKOLFNGNJOHOKLLFLDFAKBDDMACBHAKBGDFCKAJFAFAHAFAHKFAFKFOGAFOGJFOGAFKFOGKFAFOGAFAFOGKFAFAFAHAFKFOGAFKFOGAFAFOGKFAFAHAFJFOGKFAFAFAHJFAFKFOGJFAFAFKFOGAFAFAHAHAFOGKFAFOGAFKFOGAFKFOGKFOGAFKFOGAFAFAHAHAFKFOGAFAHAFKFOGKFAFAHJFAFOGKFAFOGAFAHAFAFKFOG", "KFOGAFKFOGJFOGAFOGJFOGAFKFOGAFAFKFAFOGAFKFAFOGKFAFAHAFAFOGKFOGAFOGKFAFOGKFAFOGJFAHAFOGKFAFAFKFOGAFAHAFAHAFAFAFJFOGKFAFAHAFAFKFAHAFOGKFAFOGAFAHAFKFAFOGOGAHAFAFBFLLJOCMHDAEPBCCHHONCMGHNCMCAEHDHDHDKEHDKEOCHDKEHDKEHDODLEIHINIKGGGGKGPEGGHGGGHDIHGNONAOLKMHNJMHMHNJMGLGMHNHJKKKALBLNILLLLOLCMGNPLHEFBBCMAFBGBFBCBFCDCBCJDAHNGOGKFAFOGAFJFAHAFAFKFAFOGKFAFOGAFKFOGKFAFOGJFAHAFOGKFAFOGAFKFAHAFAFOGKFOGAFKFAFOGJFAHAFKFOGAFAFOGKFOGAFKFAHAFJFOGKFAFAHAFKFOGAFKFOGAFOGAFAFOGAFJFAHAFKFOGAFKFOGJFAFOGKFAFAHAFAFKFOGAFKFAHAFJFAHOGAFAF", "AFAFAHAFKFAFAFAHKFAFKFOGAFAFAHAFOGKFAFAHAFOGKFAFOGKFOGAFKFAFAHAFKFOGAFAFOGKFAFOGJFOGKFAFOGOGAFKFOGKFAFAHKFOGAFOGKFAFOGJFOGKFAFAFAHAFOGKFAFOGJFOGKFAFOGAFOGKFADHIJNJNOINEMCCCAEBKJOJNCKNELEMCEGHDKEHDKEHDKEKEOCHDAEAEMCBGGKJNHLGGOEGGGGPEKGGGGHOIEMJOANDJLGMGLJMGLJLJNJFILJMGDJNJJKALALALFLGLANGNFGGBGBMAKBKBHAFBLBLBDCADKFOGAFAFOGKFOGAFAHKFOGAFAHAFOGKFAFAHAFKFOGAFKFOGJFAFAFOGKFAFOGAFKFOGAFKFAFKFOGAFOGKFAFAFAHAFAFAHKFAFOGAFAHAFJFOGAFKFAFOGKFOGAFAFAHAFKFAFAHKFOGAFAHAFKFOGAFKFOGAFKFAFOGJFAFOGJFOGKFOGKFAFOGKFOGAFKFAFAHJF", "AFAHAFKFOGAFOGKFOGAFOGKFAFOGKFOGKFAFOGJFAHAFAFOGKFAFJFAHAFOGAFKFOGAFKFOGKFAFAHAFAFKFAFOGAFKFOGAFKFAFAHAFAFKFAHAFAFKFOGAFKFAFKFOGJFAHAFAFOGKFAFKFAFAFAHAFOGAFKFELJOCMGGAEPBNCHGJNJNONONDMOIHDAEODNEKEHDAEKEOCMCBGHDCEHKHKINONJNEKOEGGPEGGGGOEGGIKHOJONMLGFILJCJNKCJLJNJLJCJLJFIMGLGNJJKLKALALNICMNIKBNALBLBMAKBMACDICFCPCAFAFOGKFOGAFKFAFJFOGAFOGJFAHAFAFKFAHAFOGAFKFOGAFAFOGKFAHAFOGAFKFOGAFKFOGAFOGAFOGKFAFAFOGJFAHOGKFAFOGKFAFKFOGAFKFAHAFOGKFOGAFKFOGJFAHAFAHAFAFKFAFKFOGAFKFOGAFKFOGAFOGKFOGAFAHAFKFOGAFAFOGAFAFKFAHAFOGJFAF", "JFAFOGAFKFOGKFAFAFAHJFAFOGKFAFAFOGKFAFOGKFOGAFKFOGAFOGKFOGKFAFOGAFAHAFAHAFOGKFOGAFOGKFAFAHAFKFOGAFOGJFOGAHAFKFOGAFOGKFOGAFOGAFKFAFKFOGAFKFOGAFOGKFAFAFOGKFAFBHNNJOOIHDPBPBAECMONGNGLCMONONCMHHAGOCAEKEKENEFHFHGHOLJNONJOONJNONDMHHGHGGGGGGGGGGCMONFOBLLHJHCJNKCJNKLJLJCJLJNJLJNKMGLJLJLJNHJLLKKNNEFBHALCKBKBMAFCLCLDFCBCBFAHAFAFKFOGAFOGAFKFAFKFAFAHJFOGAFJFOGAFAHAFKFOGKFAFOGJFOGKFAFOGAFAHAFKFOGKFAFAFOGAHKFAFAFKFAFOGAFAHAFAHAFKFOGAFAFAHAFAFKFOGAFKFAFOGJFAFAHNGAFAHAFKFOGAFKFOGAFKFOGAFAFKFOGJFAFOGAFAHKFAFAHAFAFKFOGKFAFOG", "OGAFKFOGAFKFOGAFOGKFAFOGKFAFAHAHAFAFOGKFAFAFKFOGAFOGKFAFAFAFOGKFAFJFNGAFOGKFAFKFOGKFAFAHAFKFOGAFJFAHAFAFJFOGAFKFOGKFAFAFOGKFOGAFOGAFJFAHAFJFAHAFAFOGKFAHAFJFHJHOAMHHMEMCPBOIEMONHKGHGHCKDNONGNHLHHGGGHBJOLDMGNJNJOEMCMIHGHHHAMJOGNHKGHOENEGGHHIKJOONAOLKMJMGLJLJLJCJCJLJNJCJNKLJNKNJLJMGLJLGJIGLAGFBDCMAKBOAFCLBLBKBFBKAIDKFOGAHAFAFOGKFAHAFAHAFAHAFOGKFAFOGKFAFKFOGAFKFAFAHAFAFKFAFOGJFAHAFKFOGAFAFKFOGKFAFOGKFAHAFOGJFAHAFJFAHAFOGAFJFAHAFKFOGAFKFOGAFOGKFOGJFAHAFJFAHAFOGAFKFOGAFAFOGAFKFOGAFKFAFOGKFOGKFAFAHAFJFAHOGAFAFAFJF", "AFAHAFKFOGAFAFAHJFAFOGKFAFOGJFAFAHKFAFOGAFAHAFKFOGKFAFOGAHJFAFOGKFAFAFAHJFAFOGAFKFOGAFKFOGAFAFAHAFKFOGKFAFAFAHAFKFOGAFAHJFAFKFOGAFAHAFAHAFOGKFOGAFAHAFAHAFGEAOHOHKEGPBPBAEIKONCMHHNIOIGHHHDLDMJNONGNGNONJOJOONEMHKGGNEODPBODIHJOONJNHLGKHHFHEKONONGNFOEOLKMJFILJNJCJNKCJCJNKLJNJLJCJNKLJLJJHEHNMNDKBMADCMADCLBLBGBDCFCBCEBAFAHKFOGKFAFAFKFOGJFOGKFAFAFOGKFAFOGKFAFOGKFOGAFAHKFOGAFOGKFAFAFAHAFAHJFOGAFAFOGKFAFOGAFAHKFAFKFOGAFKFOGKFAFOGKFOGAFKFOGAFAFAHAFAFAFOGKFAFOGKFAFAFAHAFKFOGKFAFOGAFAHAFOGKFAFAFAFOGKFAFAHAFKFAFAHOGKFAF", "AFJFOGAFKFAFOGKFAFOGKFAFOGKFAFJFAHAFAHAFOGKFOGAFKFAFOGAFKFAFAHAFOGAFOGKFAFOGKFOGAFKFAFOGKFAFOGKFOGAFKFOGAFOGJFAHAFAFOGKFAFOGAFAHAFKFOGJFAHAFAFKFAHAFOGJFADOJGOEOHHOCMCPBAECMONGKGGGGHHGGEGGGHHBJGNONONJODMCMIHGGPBKCNBACPBCCFHHLHOJOJNONHNHKCMONEOHKEKGNFOKMFIMGMGNKCJNKNKLJCJNKCJNKNKNKNJLGGMGLLBLAKBMALBLBLBKBGBICNDBCEBBDAHAFAFAFKFOGAFKFOGAFAFKFOGKFAFAHAFOGAFJFOGKFAFJFOGAFAHAFAFKFOGJFAHAFOGKFAFOGKFOGAFKFOGJFAFOGAFKFOGAFKFAFAHAFAFKFAFOGAFKFOGJFOGKFOGKFAFOGKFAFOGJFAHAFOGAFAFKFAHAFKFOGKFAFAHAFOGKFAFOGJFAHAFAHAFKFOGAF", "KFAFAFAHAFAHJFAFOGAFOGAFKFOGAFOGJFAFAHKFAFOGKFOGAFOGKFOGAFAHJFAFAHKFAFOGAFKFAFOGKFOGJFAFOGKFAFOGKFOGAFKFOGKFAFAFAHKFAFOGKFAFOGKFOGAFKFAFKFOGAFAFKFAFOGAFKFPLJOOLEGAEPBPBHDGNEMCKGGGGGGGGGGGGGGGGEKCMONHLFGPBODJCPBJCMCMCJCJCNECMONGKGLHKONONONJNONBGGCOIJOFOBNNJLJFIFINKNKNKNKLJNKLJNKMLLJMGLNALMAGBMADCMAFCLBNAGBFCNDFCFBBFJFOGKFOGAFAHAFOGKFAFOGAFKFOGAFKFOGAFAHAFAFOGAHAFKFAFAHKFOGAFKFAFAFAHJFAFAHKFAFAFAHAFKFAFOGKFOGAFKFOGAFOGKFOGAFOGAHJFAFOGKFAFAFOGKFAFOGKFAFOGKFAFJFOGKFOGAFOGJFOGAFKFAFOGKFOGKFAFOGKFAFAFAHJFAFAFAFAH", "AFOGAFJFOGKFOGAFAHAFKFAHAFAFOGKFAFOGJFAFOGKFAFAFOGKFAFKFOGKFAFOGKFAFOGJFAHAFOGKFOGAFAFAHAFAFAHAFAFKFAFOGAFAFOGKFNGAFAHAFAFOGKFAFKFOGAFOGAFJFAHAHAFOGAHADDHCOONHKOCMCMCCCNIEMEMIHGGPEGGOEKGGGOEEGNEHLONEKPBCCACACACMCACACJCPBHHONGNGHGDFGIHGNHOJOAMFCBABBBGAMFODNNMKKLJFIFILJLJNKLJNKNKLJFILKMNAIHAKBLCLBMAKBKBFCNAKBLDOBFBEBAFAFOGAFOGJFOGKFAFOGKFOGAFKFOGAFKFAHAFKFAHAFJFAHAFAHAFOGKFAFOGAFOGKFAFOGKFOGAFOGJFOGAFKFOGAFKFAFOGAFAHAFAFJFAHAFKFAFAHAFAFKFAHAFAFOGKFAFOGKFAFAHOGAFAFKFAHAFAFKFOGAFOGKFOGAFAFKFOGAFKFOGJFAFAHAHAFJF", "AFKFOGAFAFOGKFAFKFOGAFKFOGKFAFOGKFAFOGKFAFOGAFAHJFAFOGAFAFOGKFAFOGKFAFAFAHAFKFAFAFAHAHJFOGKFAFAHOGAFAHKFAFAHAFOGKFAFNGKFOGAFOGAFAFKFOGKFOGAFKFAFAHJFAFAHJMONCMGHMCNCPBAEIHJOAMGGGGGGOEOEOEGGGGGGHHGNDMGGOBJCMCACMCPBACMCPBKECMONIKLEODAENECMJOJONIHBBAGAGAEDGNJOFOLNOLLKNJMGLJMGNKLJNKLJMGNMDOICGBKBOAFCKBGBKBFCOBGBLBMDMAPCBFOGKFAFKFAFAFOGAFKFAFOGKFAFAHAFOGJFAFOGKFAFAFKFOGJFAFKFOGKFAFAHJFAFOGKFAFAFAHKFAFAFAHAFKFOGAFAHJFAFAHKFOGAFKFOGAFAHJFOGAFOGKFOGAFKFAFOGAFOGKFAFKFOGAFOGKFOGAFAFKFOGAFAFKFOGOGAFKFOGAFAHAFAHJFAFAHAF", "AFOGAFKFOGKFAFAHOGAFKFOGAFAFAHAFAFOGKFAFAHAFOGKFAFOGAFKFOGKFAFAHAFAFKFOGJFAHAFNGAHAFJFAFKFAFAHAFJFOGKFAFOGJFOGKFAFAHAFAFKFAHAFKFAHOGAFAFAFKFOGAFJFOGOGBHCNJOHKEGAEPBNBHDCMONIKGGGGPEOEKGHHOEGGHGEKONEMNECCPBPBACPBACMCACDBGGDMONGGMCAEHDGGHNJOJNCKHAGABAGAFBAKONPLOLAOFOBNGMKKLJLJILLJFIILDOOLDCKBLBLCGCKBBBFCFDLBKBKBGCLBFBKFOGAFKFOGAFOGKFAHAFOGKFAFOGJFOGKFAFAHAFAFKFAHOGAFAFKFOGAFAFOGKFOGAFAHAFAFOGKFAFOGAHAFKFOGAFOGKFAFAHAFAFKFOGAFJFAHAFAFKFAHAFAFKFAHAFOGKFOGKFAFOGAFKFAHAFAFKFOGKFOGAFOGKFOGAFJFAHAFOGAFKFOGJFAFOGKFAF", "KFAFOGAFKFAFOGJFAFAHAFKFOGKFAFAHKFAFOGAFKFAFAHAFAHKFAFOGAFOGKFAFAHOGAFKFAFAFAHKFAFAHAFOGAFAHJFAFOGKFAFOGKFAFAFOGKFAFAHOGAFJFAFOGKFAFAHOGKFAFAFAHJFAFJFFJJNGNGGOCACMCKCOIONEMHHGGOEHGHGGGOEGGGGGGHKONCMAEOBFDPBPBPBACACPBOBEKONCMOEAECEEGHKONGNJOAMEKEGODKBFCCKCMKFBFGELMGNEODNDLNJMGMJLGIMCOMIKAKBMBLBKBGCKBKBFCNBMBLCLDNDLBECJFOGAFAFOGOHGEKFOGAFOGOGKFAFAFOGKFAFAHOGAFJFAFAHOGAFKFOGAFKFAFAFAHJFOGKFAFOGKFAFJFOGAFAFAHJFAFOGKFOGAFOGKFOGAFKFOGAFOGKFOGAFOGJFAFAFOGKFAFOGKFOGAFJFOGAFAFKFOGAFKFAFOGAFAHAFKFOGKFAFOGKFAFOGKFAFOG", "OGAFKFOGAFOGKFAFAFKFOGAFOGAFOGKFAFOGJFAHAFOGJFOGKFAFOGJFAHAFAFOGKFAFKFOGAFOGKFAFOGJFAHAFJFAHAFOGKFAFAFKFOGAFOGKFAFAHAFJFAHAFOGKFAFAHAFKFAFOGAHAFKFAHKFOJBOHLGGNCPBCCNCHLONCMGHOEHGGGKGOEHGHHOEGGINJOFKODGCPBPBJCPBNBPBIBLEAMONHHMCMCAEGGHLONJOAMGNONHNONHNAMINGLKFADAFJFBHELKNJODOLNJKKIPNANICGBMBGCGCHBIBGCLBHBIBHBLDCGJEKBDCOGAFOGAFAFGJOMCHAFAHAFOGAFAFAHAFAFAHAFJFAHAFAHAFKFOGAFJFAHAFOGKFAHAFKFAFAHAFAFKFOGAFKFOGKFOGAFAHAFJFAHAFAFKFOGAFKFAHAFAFJFAHAFAFKFAHAFOGAFKFOGAFKFOGAFKFOGOGAFKFOGAFKFAHAFKFOGAFAFAHAFAFOGKFAFAFJF", "AFOGAFKFOGAFOGKFOGAFKFOGKFAFOGAFOGKFAFAFAHKFAFAFOGKFAFAFAHKFOGAFOGKFOGAFAHJFAFOGKFAFAHKFOGAFAHKFAFOGOGAFKFOGKFAFOGJFAFOGKFAFAFOGAFKFOGAFAHJFAFAHAFJFAFGJJOOLNEPBJCKCGHGNONOIGGGGGGPEGGPEHHOEGGBJJNONGHOBCCJCPBCCPBPBCCOBGGONDMBGPBPBHDIHINJOHNGLEDEGOIFKCMHNJODKJFNGAHAFAFADGEJIAOAOMNMNEOAKLBNACCCCCCCCGCIBGCOBGCFDEDELGHBGIEBFOGKFAFAFCLPLDHIDOGKFAFOGAHJFAFOGKFOGAFKFOGJFAFOGKFAFOGKFOGAFOGJFAFOGAHJFOGAFOGKFOGAFKFAFAFAHJFOGAFKFOGAFOGKFOGAFKFOGAFOGKFOGAFOGKFAFAFAHAFAFAHAFKFOGAFKFAFOGAFKFOGAFKFOGAFKFOGKFAFAHAFKFOGAFOGAF", "AFKFOGAFKFAHAFOGAFKFOGAFAFOGKFOGKFAFOGKFOGAFKFAHAFAFKFOGJFOGAFAFKFOGAFAFKFOGAFKFOGAFJFOGAFAFJFAFOGKFAFKFOGAFAFOGKFAFOGKFAFKFOGJFAHAFKFOGJFAFAHAFKFAFJFGJEODMNCFDKCKECMONCMGHOEGGGGKGOEHGOEOEGGHLONCMAEOBPBCCPBPBODPBCCKCHKONFKPBPBMCMCCMJOJOGNAGHAJANAMBHBNEGNELJFNGJFAHAHAFPCECBCHEJMNMLLFGNDCEODAEBGODCCEDEDNDIBEDBGMIBMGKDGADAFAFOGOGDDAGHEADAHAFOGAFKFAFAHAFAFKFOGAFKFAFOGKFAFOGKFOGAFAFKFAFOGKFAFAFKFAHAFAFKFAFOGAFOGKFAFKFOGAFKFOGKFAFAFOGAFKFOGKFAFKFOGKFAFAHAHAFKFOGJFOGAFKFAHAFOGAFKFOGAFOGAFKFOGAFKFAFOGAFKFOGAFAHAFKF", "AFAFKFOGAFKFAFAFAHAFKFOGAFKFAFAFOGAFKFOGJFAFOGJFOGAFOGKFAFKFOGKFAFAFAHAHAFKFOGAFAFAHAFKFOGKFOGAFAFOGKFAFAFAHKFAFOGKFAFOGAFOGKFAFAFAHAFKFOGAFKFOGAFOGAFGJEOCMGHNECKDMONONEMHKGHOEGGGGOEKGGGOEHHINONHHOBCCODPBJCPBCCPBOBEGEMONGGPBPBPBHGHLJOJOCKGBBABAJADAMAOIGNLIOGKFAFOGJFAFKAMAPCECJFFJJIICGBBBMABBMAGBGBLAGBFBKBMAFCGBKBLEDGDDKFAFOGAFJDMADDKFAFAHKFOGAFOGKFOGAFAFAHJFAFOGKFAFOGAFAFKFOGKFAFOGKFAFAHAFOGKFOGAFOGKFAFAHJFAFOGAFKFOGAFAFOGKFAFAHAFOGKFAFOGAFKFAFOGJFAFAHAFKFAFOGKFAFAFAHKFOGAFKFAFAHAFAFAHAFOGKFAFAHAFJFOGKFAFOG", "KFOGAFKFOGAFOGKFAHAFOGAFKFOGAFAHAFKFOGAFAFAHAFAFKFOGKFAFOGAFKFAFNGAHAFJFOGAFKFAFOGKFOGAFKFOGAFKFOGKFAFOGKFAHAFAHAFAFOGKFAHAFAFOGKFNGAFOGAFKFOGKFAFKFOGGECNJOAMHNONONGNJNHOEMCMGHNEOEHHGGOEGGEKEMEMBGOBCCPBJCCCPBPBCCOBHHJODMMENBPBMCIHJOJOMNFHBABADADADAHBDMAOGEAFAFOGKFOGADBCMABCADEJHMLIMACACAFACAFAGAGACACACACAFBCACACALBIEGEADAFAFAHBCLALBKFAHAFOGAFAFOGAFAFKFOGKFAFOGKFOGAFKFOGKFOGAFAFOGKFAFOGJFAHAFAFKFOGKFAFOGKFAFOGKFAFOGKFAFOGKFAFOGJFAHAFOGAFKFOGAFOGKFOGAFJFOGAFOGKFAFNGAHAFAFKFOGAFAHAFKFOGJFOGKFAFOGJFOGAFKFAFAHAF", "AFKFOGAFKFOGAFOGJFOGKFAFOGAFAHJFOGAFKFOGKFAFAHAFOGKFAFOGKFOGAFOGKFAFAHAFKFOGAFAHKFAFKFOGAFAFAHAFKFOGAFAFOGJFOGJFOGKFAFAFAHKFOGAFOGKFAFAFAHAFAFOGKFOGAFAHELJOJOGNDMHKHHAKCMJNONCMHHGGOEOEGGGGCMJOHKNCGCPBPBPBJCCCPBOBAEDMONCKMCPBPBGGDMJOJOHKGCBABADADABAKEGNAKKFOGKFKFAFOGADFBMACBBDPKOMLDCAMAHALACBLALAHAHAKAGAGAMAFACAGACBHCPFBFADOGKFDDMALBAFKFOGAFAHKFAFOGAFOGKFAFOGAFAFAFAHAFKFOGAFAHAHAFOGAFKFAFAHJFOGAFKFOGAFKFOGAFAHAFAHAFOGKFAFOGKFAFAFKFAFKFOGAFKFOGAFAFKFOGAFKFOGAFOGKFAFAHJFOGAFKFOGAFAHAFKFAFOGAFAHJFAFAHAFOGAFJFAF", "OGAFAFOGAFJFAHAFAFKFAFOGKFOGKFAFKFOGAFKFAFOGJFAHAFAFOGKFAFAFOGKFAFAHAFKFOGKFAFAHAFAFOGAFOGKFAHAFOGAFOGKFAHAFAFAFKFOGAFAHAFAFKFAHAFAFKFOGKFNGAHAFJFAFOGJFMIGNGNEKGHGHAKFHFHOLHNONDMGHGGPEGGIHAMONAKOBOBJCPBJCCCNCCCOBGGONONGHPBPBMCOIEMFOJOMIBAHABABABAIAOIJNBHAFOGAFAFOGOGAHFCGBGBJEGLOLICLAMANAKALAHAGBMAMAKBIAOAMAMAMAMACBIEEHAIPFOGAFLBNAHCAFAFKFAHAFAFOGKFAHAFAFOGKFOGKFOGJFAHAFAFAHAFKFAFJFAHAFAHAFOGKFAFOGAFKFOGAFOGKFAFJFOGKFAFAHAFAFKFAHOGAFOGKFAFOGAFAFKFOGAFKFOGAFAFKFAFAHAFOGKFAFOGKFAFJFAHAFOGKFAFKFOGAFJFAHAFKFOGAF", "JFAFAHKFAFOGKFAFOGAFOGKFAFAFOGAFOGKFOGAFOGKFAFAHKFOGAFOGKFOGAFAFAHJFAFOGAFOGKFAFAHNGKFAFAFOGJFOGKFAFKFOGAFAHKFOGAFAFAHJFOGKFAFJFOGAFOGKFAFAFAHKFAFOGAHAFPGENJONIAGNEGGGGGGGHHKJOONDMGGGGHDAKEMONPEOBCCPBNBPBPBCCPBODHKJOFKAENBPBOCHLHOJODNFDBABADADABACCJNHMKFOGKFAFKFOGAFCHIEOAKBFGOLHLODHAGALAGALAKAGAMAGBHAOAKBMAGBJALBLDAIFHEKLEOHKFECOACBDDOGOGAFKFOGAFOGKFOGKFAFAFKFOGAFAFAHKFOGJFAFOGKFAFAFAHJFAFAFOGKFAFOGAFKFOGKFAFOGAFKFAFOGJFOGOGAFJFAFAHJFAFAHKFOGAHAFAFAHAFKFOGAHAFOGJFAFKFOGAFKFOGAFOGJFAFOGAFOGAFKFOGAFKFOGAFKFAF", "AFOGJFAFAHAFAFOGKFOGKFAFOGKFAHAFKFOGAFAFKFOGAFJFOGAFKFAFOGAFKFOGJFAFAHAFAFKFAFNGAFKFAFAHAHAFAFKFAFKFOGAFAFKFOGAFKFOGJFOGKFAFOGAFKFOGKFOGAFOGJFAFOGAFJFAFKFMIEOCMFHAGOCHDBGHDMIIHGNONHLHHGHHKJOCMKEGCPBCCPBPBPBPBCCHDINJOHHJCPBPBGHJNJOJOAKBBBADABABABAGGEOGJAFKFOGKFAFOGOGGELBMACBFGBMEKNDKACACAGACACAFAGACAKAHALAGAGALALBIEDGLIDGICBDAFKDHAMAHCOGKFOGAFKFAHAHAFKFAFAHAFOGAFKFAHAFAFKFAFOGKFAFOGOGKFAFAHAHAFAFOGKFOGAFKFAFOGAFKFOGAFAHAFKFAFKFOGAFKFOGAFAHAFAFJFOGKFAHAFOGKFAFOGKFAFKFOGAFAHAFAFOGKFAFOGKFOGKFOGAFKFAFOGKFAFOGAF", "AFKFAFOGKFOGKFAFAFAFOGAFKFAFAFAHAFKFOGAFOGAFAHAFKFOGAFAHKFAFOGKFAFOGKFOGAHAFOGKFAFOGAFKFAFAHAHAFOGAFKFOGKFAFAFAHAFKFAFAFOGAFAHAFOGKFAFAFAHKFAFOGKFOGAFAHIDBHOLJOHKNENCHDHDBGOCFHEKHLONEMFNJNONHHPBOBODJCPBCCODCCPBEKJOAMNECCPBMCIKONJOANBGCABADADAHAPAHNOLBFAFOGAFOGAHOGJFECFBLAMAMEJJHHHCCAAAAAKACACACAAACACACACACACAFADDHCGEPFICMAJBNGFCOAKBFCKFOGKFAFAFNGJFOGAFAHJFOGKFAFOGKFOGAFOGKFAFOGAFKFAFOGKFAFAHKFOGAFAFAHAFOGKFAFAHAFKFOGJFOGAFAHAFKFOGAFKFOGJFOGKFAFAFOGJFOGKFAFAHAFOGAFOGKFAFAHJFOGKFAFOGKFAFAFAFAHKFOGAFKFOGAFKFOG", "OGAFKFOGAFKFAFOGKFOGKFAHAFOGOGKFOGAFKFOGKFAFKFAHAFAFOGKFAFAHAFAFOGKFOGAFJFOGKFAFOGJFAHAFAHAFJFOGAFKFOGAFAFOGKFAHAFOGAFOGKFOGKFOGKFAFAFOGKFAFOGKFAFAFAHAFJFADLFAOJOGHNCKEHDHDMCAENCFHCMGNONJODMFHOBCCJCPBPBJCPBOBODCMONGKNBPBPBCEGNJOJOAMFCGAGABABABAEGGNPKADAHOGAFKFJFAFAHDDMAMANAICFGJJHCCAAAAACAAACAAACACACACAAACAAAEBECADECGEHCFAEAADFCDBOBICBFKFAFOGAFKFOGKFAHAFAFKFAFAHAFAFJFAHAFAFOGKFAHAFOGKFOGAFJFOGAFKFAHAFKFOGAFJFAHAFOGKFAFAFOGKFOGAFKFOGAFKFOGAFAFKFAHAFAFKFAFOGJFAFKFOGKFAFAHAFAFKFAFOGKFAFOGKFOGJFOGAFKFOGAFAHAFAF", "KFAFOGKFAFOGAFKFOGAFAFKFOGJFAFAFAHAFOGKFAFOGAFKFOGKFAFOGAFKFOGAFKFAFAFAHAFKFAFOGKFAFAFAHJFAFOGKFOGAFKFOGAFAHAFJFOGKFAFAFOGKFAFAFOGKFOGKFAFOGKFAFOGKFOGAFAHADADMIHOCMAEAECEKEHDHDAEMCNEGHCMONFKODOBPBPBCCPBPBCCCCGHEMJNEGPBNBAEBJONJOJNGNOLOIEDLAGAIAFKGNBHKFAFAFAHAFAFOGFJEHLBMAMBLBNCBIHCEAAACAAAAAEACACAKALACAAACACAEBECDDGEIEDDKAJBIDKDMBOBOBJDADOGOGKFAFKFAFAFAHAHAFOGKFOGAFOGKFOGKFAFAFAHJFAFAFKFOGAFKFOGAFJFOGAFKFOGAFKFOGAFOGKFAFAFOGKFOGAFKFOGAFKFOGAFOGKFOGAFOGAFKFOGAFAFKFOGAFAHJFOGAFOGKFAFOGKFAFAFAFKFOGAFAFAHJFAFAH", "AFOGAFAFAHAFAHAFAFOGKFOGAFAFKFOGJFOGKFAFOGAFKFOGAFAFAHAFAHAFKFAHAFKFOGJFAHAFOGKFOGAFOGKFAFOGKFAFKFOGAFKFOGJFOGAFKFAFAHOGKFAFAFOGKFOGAFAFOGKFAFOGKFOGAFOGKFJFBFOGGLJOGKMCAEKEHDHDKEHDODAEAKHOFKPBCCPBCCPBJCFDOBPBHKJOFKNCJCPBGGHLJOJOCMAKAMJOONHKODEGCMELBFOGAFOGJFAHAFAFOJJJKCNALBOBLEFGGDKAAAAAAACACACAHAFCOBKCMALACACBECHCIEIEFEJBJBJFLDMBLBFCHCKFOGOGAFAFAFOGAHJFAFOGKFAFKFOGKFAFKFOGAFOGJFAFAHOGAFKFOGAFKFOGAFKFOGAFKFOGAFKFOGKFAFAHAHAFAFKFOGAFAFOGAFKFAHAFAFKFOGKFAHAFKFAHAFOGKFAFJFAHAFOGKFAFOGKFAFAFOGKFOGAFAHAFKFOGAFJF", "AFKFOGAFKFOGJFOGKFAFOGAFAHKFAFAFOGKFAFOGKFOGAFKFOGKFAFAHJFOGAFAFAHAFKFAFAFAHAFAFKFOGKFAFOGKFAFOGAFKFOGAFKFAFOGKFAFOGKFAFOGKFOGKFAFAFAHJFAFOGAFKFAFOGKFAFOGAFOGAFGJGNGNFHMCAEKEHDMCHDMCNEFKONEKCCOBJCPBJCPBPBOBGGJNGNGHPBNBMCHHGOJOONNINAMDGGHNJOHNGNGNCHAFAFAHJFAFAHOGAFDHGHOBMBLBODNCNCOBMALACALALAHAMAOAJCNEOEKCMAHALBHCCBHCKCHEKBBCLFODNBKCMEJEGEAFOGOGKFAFAFAHAFAHJFAFOGAFKFAFOGAFKFOGKFAFOGKFAFOGAFKFOGAFKFOGAFKFOGAFKFOGAFAFOGKFAFKFOGAFOGKFOGKFAFOGAFAHKFOGAFAFAFAHAFOGJFOGKFAFOGAFKFAFAFOGAFKFOGAFAHKFAFAFAHJFOGAFKFOGAF", "KFOGAFAHAFKFOGAFAFOGKFAFKFOGAFOGKFAFAHAFAFKFOGAFKFOGAFJFOGAFJFAHAFKFOGAFOGJFOGKFOGAFAFOGKFAFOGAFKFOGAFOGAFOGKFAFOGKFAFAHAFOGKFAFAFOGKFAFAHAFAHAFOGKFAFOGAFOGAFKFBDELJOIKNEKEHDAEHDHDAEMEHKJNGGOBJCOBJCPBCCOBODOIONHLLENBPBMCCMJOJOCMFDGABAJAGCBGHKJOPLGEAFAFNGKFAHAFAFAFDHEKCCKBOBKCOBCCCCPDLEPBLBPBMCMBIBKCPBKCCCOBKCNCOBFCKCICDBDBJEGGPEPBNCOCFGBFOGOGAFJFAHAFJFOGKFAFOGKFOGAFOGAFKFOGAFAFOGKFAFAHAFKFOGAFAFOGKFAFOGAFAFOGKFAFOGKFAFOGAFKFOGKFAFAFOGAFKFOGJFAFAFOGKFOGJFAHAFAFKFAFOGKFAHAFAHAHAFKFOGAFOGKFAFOGOGKFAFKFOGAFKFAF", "AFAFAHJFOGAFKFOGKFAFOGAFOGKFOGKFAFOGJFOGKFAFOGKFAFAFAHAFKFOGAFAHJFOGAFAHKFAFAFOGKFOGKFAFOGAFAHKFAFAFAHKFAFAFOGAFAHAFAHJFAFAFOGAHKFAFOGKFAFAHJFAFOGAFAHKFAFAFOGAFJFBHENJOAMGGNCKEHDEGMCNEGNEMGHOBCCPBPBFDJCOBAEEMJOGGMCPBPBGGGNJOJOGLHABABABABAPAGHJOAMAIBDKFAFOGOGNGAFGIPMHHKBCAKAFBLBLBOBGGHHICPDODLBLBICAGFHHCOAMENCMAICHHGHODNAOENENEOCOBDBPBHCKFJFAFKFAFAHAHAFKFAFOGKFAFKFOGKFOGAFAFAHKFAFOGAFKFOGAFKFOGKFAFOGKFAFAHAHAFAFAHJFAFOGKFOGAFAFOGKFOGKFOGAFKFAFOGKFAFOGKFAFJFOGAFOGAFKFAFAFAHJFAFAHAFKFOGKFAFOGKFAFOGAFOGKFAFOGAF", "AFOGKFAFJFAHAFAFOGAFKFAHAFAFKFAFAHAFAFKFAFOGKFAFOGKFAHAFOGKFAFJFOGAFKFAHAFAFOGKFAFAFOGAFKFOGJFAFKFOGJFOGAFOGKFOGJFAHAFAFKFAHAFJFAFAHAFAFOGKFAFAHAFKFOGAFKFOGKFOGAFJFMIJOONHHAEHDEGMCOCEGCMJOHHGCPBPBNBPBOBFDHHONDMHDCCPBMCOIONJOJNBGGAHABADABAJCOLONEOBMMIBFAFKFOGJFAFGIENEKFBCACACAKBNAOBGGCEOBOBCCNAMANAMEGGOAKBOBICLALBGHOIAEFCGDLEFCNDMAHAGBKAADOGOGKFAHOGAFKFOGAFKFOGAFOGAFAFKFAFOGKFAFAHAFAHAFKFOGAFAHAFAHAFAFOGKFAFJFOGKFAFOGKFOGAFKFOGKFOGAFAFKFAFOGKFAHAFAHAFAFOGAFKFOGJFAHAFAHOGJFAFAHAFKFOGAFAFOGKFAFAHAFOGKFAFOGAFKF", "JFAFAFOGAFKFOGKFAFOGAFAHJFOGAFOGKFOGAFOGAFKFOGAFAFOGJFAFKFOGAFOGKFAFOGJFOGKFAFOGKFOGAFAHAFKFOGAFOGKFAFAFAHKFAFAFAFAHJFOGAFKFOGAFAHJFOGKFAFOGKFAFAHAFKFOGAFAFOGKFOGAFGECNJOCMMCLECEMCHDEGIKONCKOBCCPBCCCCDBODCMJOOIGDOBPBEGEMJOHOEKIABABADABAMAGGJOOLGKCOAOPKGJADKFAFIDGICNFHHAFAMAMAMALBJCGGHDPBLBPBOBKBOBMCOCDBBBEDMDGBNABGOEODLBICICLEFCCBMAGBDCAFOGAFAFAFAHJFAFAFAHAFAFAHJFOGAFOGAHJFAFOGJFAFAHAFOGKFAFJFOGJFOGKFAFOGKFAFOGAFAHAFAFAFAHAFKFAFAFAHJFOGAFKFOGAFAHJFAFAHKFOGAFKFAFAFAHJFAFOGKFAFAHAFKFOGAFKFOGAFKFAFKFAFOGKFAFOG", "AFKFOGAFKFOGAFOGAFKFOGKFAFAFOGKFAFKFOGKFOGAFJFAHAHAFAFKFOGAFOGKFAFAHAFAFKFAFAHAFOGKFAFKFOGAFAFOGKFOGAFOGKFAFOGKFOGJFAFAHAFOGAFKFOGAFKFAFAHAFOGKFNGAFOGKFAFOGKFOGAFKFAFHJGNJOHHAEKEHDKEOCEKONHKEDOBCCKCNCBGHHJNONOILEPBLEIHONJOFNFDGAGABABABAKBFKJOANPKGLANAOANOMPFAFOGHIPLAGLAGACBMANAOBODPBJCODICNCODOBCCPBPBCCLBEDOBOBOBOBNDNCOBOBGDNEKCKBOAMAFBBFOGAFKFAHAFBFNGAHAFKFOGKFAFKFAHAFKFAFOGKFAFOGJFOGJFAFAHAFOGAFKFAFAHAFAFOGKFAFJFOGKFOGKFAFOGAFOGKFOGAFAHAFAFOGJFAFKFOGAFKFAFOGAFOGKFAFOGKFAFKFNGAFOGAFKFOGAFAHAFAHAFOGKFAFOGAF", "AFOGKFAFOGKFAFAFAHAFKFOGKFOGAFAFOGAFKFAFAHAFAFKFAFAHAHAFKFOGKFAFOGKFOGAFOGKFAFAHAFAFAHAFKFOGKFAFAFAFAHKFAFOGKFAFKFOGKFAFAHJFOGAFKFOGAFOGJFAFKFAFAFAHJFAFOGKFAFAFOGOGADKFJMJOGNGGLEKEOCAEHKJNCMEDNDGHCKHLINJOJOGNONAMHKHKGNJOONBMEDKBJAIAHAGAAEJOKNELIMJMALIMOLFOAOCHIDGJANLEHAMALACBLBLBNALBOBPBLBLBOBNAICKBKBMAMAKBLBMACBLAHAOAMANANCNCICMAMAOAFCADAHAHAFOGOGBFAFJFOGAFAFOGAFOGKFAFOGKFAFOGKFAFAFKFOGAFKFOGKFOGAFOGKFOGAFAHAFAHAFKFOGAFOGKFAFAHJFAFKFOGKFOGKFAFOGAFOGKFAFOGKFAFAHKFAFOGKFAFOGAFKFOGKFAFOGJFAFAHJFAFAHAFOGKFAFKF", "AHAFAFAHAFAFKFOGJFAHAFAFOGAFKFAHAFKFOGAFJFAHAHAFAHAFJFOGAFKFAFAHAFAFKFOGKFAFAHAFJFAHAFKFOGAFAFKFOGOGKFAFOGKFAFOGOGAFAFJFAHAFAFKFOGAFOGKFAFAHAFOGOGKFAFOGKFAFOGKFAHJFAHAFBHBMJOJNFKNEODMEGLJNGNHKCMONONHOONGNGNGNONJOJOJOJOJNEOGNEOHNOLOIGCFCGLFOELDJJKGMBNFLKMCMEOFJAFJIHHLELALALACBNALBLBLBNCBGCCOBPALBOAHAMADCMAMALBICMAMAOAMAKBKBOBAGOBOAFCLBKAECJFJFNGOGOGAFAFOGKFAFOGKFOGKFAFAHAFAFOGKFAFAHAFOGKFAFOGKFAFAFAHAFAFKFOGKFOGAFKFOGAFAFJFOGAFKFOGAFOGKFAFAFOGAFKFOGKFAFAHAFAFOGKFAFOGKFAFOGAFKFOGAFAFOGKFAFOGKFAFOGJFOGKFAFOGAF", "JFAFAHJFOGAFOGKFAFOGKFOGAFAHAFNGKFAFOGKFAFAFNGKFAFAHAFKFOGAFOGJFOGKFAFAFOGAFAHJFAFOGKFOGAFAHNGAFKFAFOGAFKFOGAFKFAFAHOGAFKFOGAFOGKFAFAFOGKFAFAHJFAFOGAFKFOGAFKFAFKFAFAHNGAFOJGOJOGNOLHHGKGNJNONJOONONGNCMIHEKCKHKEKOLHNEOEOEOANAOCOEOJOJOANAMEOAONJKHKHILNJGMGLEOANGEKFCGLECCKCOBLBPAICOBPANAODNCOBNALBPAKBLAKBOALBPALBMBOBKBNALBPALBMBPBFCNANALBMABCECDDKFOGOGOGKFAFOGKFAFOGAFOGKFAFAHAFKFOGAFAHKFAFOGKFAFOGAFAHJFOGKFAFAFOGKFAFOGKFAFAHAFKFOGAFKFOGAFAFAHKFAFOGAFKFOGAFAHKFOGAFOGAFKFOGAFAHKFOGAFAHKFAFOGAFKFAFOGKFAFAFOGAFKFOG", "AFAHAFAFKFOGKFAFAHAFOGKFAFJFAHAFAFOGKFOGAFOGKFAFNGAFKFOGAFAHAFAFKFOGAFOGKFOGKFAFOGKFOGAFAHAFKFAFOGAFKFOGAFJFAHAFOGAFKFOGAFKFAHAFAFKFOGKFAFOGKFAFAHAFKFOGAFAHAFOGJFAHAFAHAFKFLILLAOONJOONJNJOJNGNAMHKCKGGGHGGGGGHGGCMGNJOHONMPKALKMKMOMOLEOHOJOMNNMNJILMJMJDJKMEOELJFOHGKPEAEGHHDPDPBPBJCNCPBNCOEJCMBPBPBDBPBPBAEPDPBCCDBMBOBPBJCPBPBDBNBDBJCPBPBCEKCNDFCBCJFOGKFAFAHAFAFAHAFAFKFAFOGJFAHAFKFOGJFAFAHAFAFAHAFOGKFAFKFOGAFOGKFAFAHAFAFKFAHAFOGKFAFOGAFKFOGJFAFOGKFOGAFJFAHAFAFJFAHAFKFOGAFOGKFAFAFOGJFAFAHAFAHAFOGKFAFOGAFJFAHAFAF", "AFKFOGAFOGKFAFOGKFAFAFOGKFAFKFOGAFKFAFAFAHKFAFOGKFOGAFKFOGJFOGKFAFAFAHJFAFAFOGKFAFAFKFAFNGKFOGKFAFOGAFKFOGAFKFOGKFAFOGKFOGAFKFOGAFOGKFAFOGKFAFOGKFAFOGKFAFKFOGAFAFKFOGJFOGAFAFAFDHOMJOJOHNOLOIIHGGGGGGIHCIIHGGOIBMGNJODOKMDJILNLGMGMNMGMGLCNAOGNHOCONMFMJIDJANMNBHAFDHBMHKOEPEMCNCODEDNCODKCAEOCNDAEOBEDNCNCKECENENCAEAEMCKCAEHDNEPBODODMCEGCECEOEKGOEJEADOGOGAFAFAHKFOGJFOGKFOGAFKFAFOGKFAFAFOGKFAFAHJFAFAHKFAFOGAFKFOGKFAFOGJFOGAFOGJFAFKFOGAFKFOGAFAFOGKFAFAFAHAFOGKFOGAFOGKFAFOGKFAFKFOGAFAHKFAFOGJFAFAHKFAFOGKFAFAHAFKFOGJF", "OGAFKFOGKFAFAHAFAFKFOGKFAFOGAFKFAHOGAFOGJFAFOGKFOGAFKFOGAFAFKFAFOGKFOGAFKFAHAFOGKFOGAFOGKFOGAFAFKFAHAFOGKFAFOGKFAFAHAFAFKFOGAFKFAHAFAFOGKFOGAFAHAFKFOGAFAFOGAFKFOGAFKFOGAFKFOGAFPCDHNMJOJNHKGHOEGGGGHGCIHGGGAKHKGNJOJOPNILMJLJOKLJNJFMGMFMKMIMCNCOCOJOEOKNANMNLLJFADLMGOONIKKGPIIHGHHDGGGGCEHGKGOEGGKGCEGGIHKGKGGGKGBJKGIHKGBJFKIHIHIHIHIHIHKGMKMKIKIKLEKFOGAFAFOGJFOGAFAFKFOGAFAHAFOGKFOGAFOGKFOGJFAHAFOGKFAFOGAFKFOGAFAFOGKFAFKFOGKFAFAHOGAFKFOGAFKFAHAFOGKFOGJFAHAFAFKFOGKFAFAHAFAFKFOGAFOGKFAFOGKFAFOGJFAFAHAFAFAHAFKFOGAFAF", "JFAFAFAFOGKFAFAHOGAFKFOGAFAHAFOGJFAFAHKFAFOGKFAFAFAHAFKFOGAFOGAFKFOGKFAFOGJFAFAFOGKFOGAFAFKFOGOGAFKFOGAFOGKFAFOGAFAHKFOGAFAFAHAFNGKFOGAFAFKFOGJFOGAFKFOGKFAFOGAFKFOGAFKFOGAFKFAFIDJFMIAOJOGNGHGGGGGGPEGGOEGHFKHOJOEOLNJLMJLJNLMLILLJILILILJKFMNMKMNMPNGNEOJOJOGHJFBFOMJOONFKODMCABNANAOBNANADBOBABABOAABABABABABABNADBPBPBPBPBPBNBAEMCMCPBPBCEHGPEBJGKAIADOGOGKFAFAFKFOGAFOGKFAFJFOGAFAFKFOGKFAFAFOGJFAFKFOGAFAHJFAFOGKFOGAFOGAFOGKFAFOGKFAFOGAFAFAHAFKFOGAFAFKFAFAHKFOGAFAFOGKFAFAHOGAFJFAFAHAFAHAFOGKFAFOGKFAFAHNGKFOGAFAFAHKF", "AFAFAHAHAFAFAHAFKFOGAFKFOGJFOGKFAFOGKFAFOGKFOGAFOGJFOGAFKFAHAFKFOGAFAFOGKFAFAHAHAFAFJFAHAFOGAFKFOGAFJFAHAFAFOGKFAFJFOGAFKFOGJFAHAFAFJFAHAFOGKFAFAFKFOGAFAFOGKFOGAFJFOGAFKFOGAFAHNGAFKFMIEOJOCMGGGGGGGGOEGHHKJNJOHOANFMOKLJNKMMMMNKNKMLLJOKILFMFMFMKMKMANLNAOHOGNELHEHMHOJNCKHDNDHDOBOBOBHDPBOBPBMCLBOBNEMEOAKBKCCCDBPACCBGPBPACCOBJCOBPBPBOBKCOENCOEBIDDAFAFOGAFKFOGAFKFAHAFAFKFOGAFKFOGAFKFOGAFAHAFAFKFOGAFOGKFAFOGKFOGAFAFKFAHAFAFOGKFAFAFJFAHAHAFKFOGAFKFAHAFAHAFAFKFAFOGKFAFAHAFJFAHAFOGJFOGJFAFKFAFOGKFAFOGAFKFAFAFKFOGJFAF", "KFOGJFAFAHNGJFAFOGKFAFAFKFAFAFOGKFAFOGAFKFAFAFAHKFAFOGKFAFOGKFOGAFAHAFKFOGAFKFAFAHKFAFKFOGAFAHAFKFOGAFKFOGAFKFOGAFOGKFAFOGKFAFAFAHAHAFKFOGAFOGKFOGAFAFAHAHJFAFKFOGAFKFOGAFKFOGJFOGAFAFKFHJGOJODMIHGGGGHHCMHNHOJOAOLKKHLJMMMMNKNLNKMMNKMMILLJNKLJNLNLJLGMKMBNANGNHOPLLIAOGNHHOIGGGHOCICAEGHBGPBBGGGHDAEHDGGOCNCAEGGNEMCMEOEGHNCPBNEEGMENEGHNEFHGHKGFGIEKFAFOGKFOGAFAHKFAFAHKFOGAFAFAHAFKFOGAFAFAHJFOGKFOGAFKFAFOGAFKFAFAFAHAHAFJFOGKFAFOGAFAHAFKFAFAHAFAFAHAFNGKFAFAHOGAFAHJFAFOGJFOGAFKFOGKFAFAFOGKFOGAFKFOGAFAHJFOGAFOGAFKFAFOG", "AFKFAFAHAFKFAFAHAFAFKFOGOGAFOGKFAFOGAFKFOGAFOGKFAFOGKFAFOGJFOGAFAHAFKFOGAFAHAFJFAHAFOGAFAHAFKFAFOGAFKFOGAFKFOGAFOGKFAFOGAFAFKFAHAFJFOGAFKFAFKFOGAFAHAHAFKFAFAFOGKFAFOGAFOGAFKFAFOGOGKFAFPGGJBMJOHNCMGKCMEMONJOJOGNGMLJLJNLNKMMNKMMNKMMNKNKMMLJNLNLMLOKILFMGMGMKMONEOAIENHKNDOAOBOBICOAKBGBMAKBOANAOAKBMAOBLBLBNALBLBMAMALBICLBFCGCKCIAKBOBEDOBNDNCNCBFAFOGOGAFKFAFKFOGAFJFOGAFOGKFAHAFOGKFAFOGKFAFKFOGAFAHAFAHAFKFOGAFOGKFJFOGAFKFOGAFKFOGJFAHAFNGAFKFOGJFOGKFAFAHAFJFOGKFAFAHAFAFKFAHAFKFAFOGAFKFOGAFAHAFAFOGKFOGAFOGKFOGAFAHAF", "AFOGAFKFOGAFAHJFOGKFOGJFAFAHKFAFOGKFAFOGKFOGKFAFOGKFAFOGKFAFAFAHJFAFOGKFAFNGAFOGKFAFAHJFAFAHAFAHJFAFOGAFAHAFKFAFKFAFOGKFOGAFOGJFOGAFKFOGAFOGAFKFAFJFAFAHAFAHAHAFAFAHKFAFKFOGAFOGAFKFAFKFOGIDPGLLJOJOGNJNJOJNGLOLFOFOGMILLJMLNLMMNLMLNKNLMMNLMMMLMLNKNLMLOKNLILFMOLNNMIGNNNOBCAOAKBGAHAMAHAMAMAMAHAMALAFBLAHAGBKBLAHALAGAKAKAGAMALACACACACAKALALAHABCBFOGOGJFAFOGAFOGAFAHAFKFAFAFOGJFOGKFAFAHJFAFOGAFKFAFKFOGJFOGAFKFOGKFAFAFKFOGAFAFAHAFKFAFOGKFAFOGAFKFAFAFOGAFAHJFAFAFOGKFAFAHAFOGJFAFOGAFKFOGAFKFOGKFOGKFAFAFKFAFKFAFAHAFJFAF", "AHAFAHAFJFAHAFAFKFOGAFAFOGKFAFOGKFAFAHAFOGAFAFAHAFOGAFKFOGAFAHAFKFAHAFOGAFKFOGKFAFOGKFOGAFJFOGKFAFOGKFAHAFKFOGAFOGKFOGAFKFAHAFAFKFAHAFAFOGJFAHAFAHAFOGJFAHAFJFOGKFOGAFKFOGAFOGAFKFAFAHAFOGOGJFKFLLGOJOJNJOCMEDGBNIJODOILOKLJMMNKMLMMMMMMMLMMNKMMNKNLMLMMMLMLKHJKAOKMPKJOHNLEHAMAHAHAHAHBAEAENBPBOBABOBNCOBOBCCOBABOBPBABNAABABABMBPAOBDBHAHAMANAOAHCADOGOGKFOGKFOGKFAFJFAHAFAHAHAFAFKFAFOGKFAFOGKFAHAFAHOGAFAFKFAFOGKFAFOGAFOGKFAFOGKFOGAFOGKFAFOGJFAHOGAFOGKFOGKFOGAFOGKFAFOGKFOGKFAFAHAFAHAFKFOGAFKFOGAFAFKFAHAFOGAFOGKFOGAFKF", "JFAFKFOGAFKFOGAFOGKFAFAHAFOGAFKFOGAFKFOGKFAFAHJFAFKFOGAFAFAHJFAFOGJFAFKFOGAFAFOGKFAFAFKFOGAFKFAFOGKFAFAFAHAFKFOGAFOGKFAFOGJFOGKFAFAFAHKFAFAFKFOGJFAFKFAFOGKFAFAFOGKFOGAFKFOGKFAFAFAHJFAFAFJFAFAHKFJMGOJOJOMNGHFAGBDLJONMJKOKLJMMNKNLNKMMNKMMMLMMMMMMNLNLMMMLLJNMLNEHFNGONNAIMAHALALALAMANAKBLAMALBKBMAPAOBNALALAMANAOANAICOBHABAOANAAEHHICCAKBLBOBHEPGAFOGAFKFAFOGAFAHAFKFOGJFAFAHAHAFOGAFOGKFAFAFAFAHJFAFAHOGAFAHAFOGKFAFAHAFOGKFAFOGKFAFAFOGKFAFAFKFAFAHJFAFAFAFAHKFAFOGAFKFAFOGAFAHJFAFAHAFOGKFAFOGAFAHJFOGAFAHKFOGAFAFKFOGAF", "AFOGAFKFOGAFKFOGKFAFOGJFAHAFKFOGKFAFOGKFAFAHAFAFKFOGAFKFOGKFAFAHAFAFKFOGAFKFAHAFOGKFOGAFKFAHAFAHAFAFKFOGJFOGAFAHAFKFAFAHAFAFKFAFOGKFAHAFAHAFOGKFAFAHAFOGJFOGKFAHAFAFKFOGAFKFAFOGAHAFAFKFAHAFOGJFADGEKLEOFOJOEOHKMDFGGLJOCOGMNJILLJNLMMMMMMMMMMNLMMMLNLNKMLLJILLNOMBIINJONNFGLAHACALAMALACAMAGDMEGHOBGALALALALBLBODICMALALALAMAICPBICNDGHFCLALAMAOBHEKFOGAFKFAFOGKFOGKFOGAFKFAFAHAFKFAFJFAHAFAFKFOGOGKFAFOGKFAFKFAHAFKFAFOGJFOGKFAFAHAFAFAHAHAFOGKFAHAFOGKFAFOGKFOGKFOGAFJFAHOGAFKFOGKFAFOGKFOGKFAFAHAFAFKFOGAFKFOGAFKFAFKFOGAFAF", "AFKFOGAFKFOGAFAFOGKFAFAFKFOGAFAFOGKFAFOGAFAHJFOGAFAFAHAFKFOGKFAFAHOGAFAFAHAFKFAFAFOGKFOGAFAFAHJFOGKFOGJFAFKFOGAFAHAFOGJFOGAFOGAFKFOGAFAHJFOGKFAFOGKFOGAFAFAFOGKFOGAFAFAHAFOGKFAFJFOGAFOGJFAFKFOGAFAFGEPLEOFNGNEOHNAKGHAOJOFOPNLKNLOKOKMLNLMLMLMMMMMMMLMMNKOKGMMNOJOMJOGONNLELAKAKACAKBLAOBEKEMJOONOLMECBFALECMONJOOLFGCBCAFCHKJOJNOLJJFHHCCAKAMAOBGEBFAFOGAFKFAFAFKFAFAHAFOGKFAFAHAFAHAFKFOGAFOGKFAFOGKFAFOGKFAFAFAHAFAHKFAFAFOGKFAFAHJFAFKFOGAFOGJFAFOGAFAHAFAFKFAFAFAHAFKFAFOGAFKFAFOGKFAFAFOGKFAFAHKFAFAFAHAFKFOGAFOGAFKFOGKF", "KFOGAFAFOGAFKFAHAFAFOGKFOGAFJFAHAFOGAFKFOGJFAFKFOGKFAHAFOGAFAFOGKFAFKFOGJFAHAFOGKFAHAFAFOGKFOGAFKFOGAFAFAFOGKFAFJFOGKFAFKFAHAFKFOGAFOGJFAFKFAFAFAHAFAFKFOGKFAHAFAFKFOGJFOGKFAFOGAFKFOGKFAFAFOGAFOGAFADGJIOOLKIMIMNHNEOGNGNHOJOEOLNNMILILLJNLMMMMMLNLMMMMNLLJKNANBHBMJOGOGNEHKAKAFACAKAMAFHONJOONJOJOOLLBLBCMJOJOJOJOHKHCCBEKJOJOJOJOJNEKHCCALALBMAFCBFOGOGAFKFAHOGAFOGJFOGKFAFOGJFOGJFOGAFKFOGKFAFAHAFAFAHAFOGJFOGJFAHAFAFKFAHAFOGAFKFOGAFOGKFAFKFAFOGKFAFJFAHAFOGKFOGJFAHAFOGKFOGAFJFAHAFAFOGKFAFAHAFOGKFOGJFOGAFKFOGAFKFOGAFAF", "AFAFAHKFAFOGAFAHKFOGAFOGAFAHAFKFOGAFAHAFKFAFOGAFAFOGJFOGKFAFOGKFAFOGAFKFAFOGKFAFOGJFOGKFAFOGJFAFOGAFAHKFOGAFOGKFAFAFOGAFOGKFOGAFKFAFKFOGAFOGAHKFAFOGKFAFAFOGJFOGKFAFAFOGKFAFOGKFAFAFAFOGKFOGAFKFOGAFAFLFBMEOEHDEGFFLCMCMCMBMPKJMEOEODOBLFMLJOKMLMMNKMMMMMLJLCOMIPGBOJOINEODGLACAKAKALAMAEKONJOGOGOJOHKCBEDEMJOGOINJOINLBICDMJOININJOHOLLMACACALAHADDADOGAFAHAFAHJFAFKFAFAFOGKFAFAFKFAFAHAFOGJFAFOGJFOGKFAFAHAFOGKFAFOGKFOGAFJFOGKFOGAFKFOGAFAFAHAFAHKFAFOGAFKFOGAFOGKFAFAFAHJFAFAFAHAFKFOGKFAFOGAFNGKFAFOGKFAFAFAHAFAHJFOGAFAHAF", "AFOGJFAFOGKFOGJFAFAFOGKFAFKFAFOGKFAFJFOGAFOGJFAHAHAFAFKFAFOGKFAFOGJFAHAFAHAFOGJFAHAFAFAFOGKFAFAHAFAFKFOGKFAFKFOGAFOGKFOGKFAFAFKFOGAFOGAFKFAHAFAFJFAHAFAHAHAFAFKFAFOGOGKFAFOGKFAFAHAFAHAFOGAFKFOGJFAHAHADIIEOMNLHDCNFKIAKEOBMLFADDHLLEOJOLNBLNLILOKMMMMMLMJKNAOCHHINNJOGOGOLELAMAKAHAFBCBGHONINJOJOJOHHFBOBCMHOJOJOJOHLMAOBJNONJOHOJOHOHHLBCAGAGAMAECKFOGOGADAHJFAHAFOGKFAHAFOGKFAHAFOGJFOGKFAFOGKFAFKFAFOGJFAFKFOGAFJFOGAFKFOGAFAFKFAFOGAFKFOGJFAHAFAFOGKFAHAFKFAHAFAFOGKFOGAFKFOGJFAHAFAHAFAHAFOGKFAFAHAFAFOGKFAHAFJFOGAFKFAFJF", "KFAFOGKFAFAFAHAFAHKFAFOGKFOGKFAFOGKFAFAFAHKFAFAFAHKFOGAFOGKFAFOGKFAFAFAHJFAFKFAFAFAHAHKFAFOGKFAFAHAHAFAFOGKFAFAFAHKFAFAFOGOGKFAFOGKFAFOGAFKFOGOGAFKFOGJFAFAHKFOGAFKFAFOGAFKFOGAFAHJFAFAHAFKFAFAFOGJFKFAFPGJMHOBLJHFEKIEKGNANGEIDJFADHILLJOFODOBLILMJLJMJFMCOJMJFHMHOJOGOEOFGLALAMABCMAKBGGONJOGOJOJOGHHALEEMJOINGOJOBMMALBDMJOHOJOJNONEKLBLALAHAOAKDBFOGAFAHKFAFKFOGAFOGJFAFAFOGKFOGAFAFKFAFOGAFOGAFOGKFAFOGKFAFAFAHAFKFOGAFKFOGAFOGKFAFAHAFKFAFOGKFOGAFAFAHAFOGJFAFAHKFAFKFOGAFKFAFOGKFAFNGKFAFKFOGAFJFOGKFAFOGJFOGAFKFOGAFOGAF", "AFKFAFOGAFOGKFOGJFAFAHAFOGAFAFAHAFAFOGOGKFAFAHAFJFOGAFOGKFAFOGKFOGAFOGKFAFAHAFAHAHAFJFAFAHAFAFAHAFJFAHAFKFOGAFOGKFAFOGAHAFKFAFOGKFAFOGKFAFOGKFAFKFOGAFAFKFAHAFJFAHAFOGAFKFOGAFOGJFAFAHAFKFOGAFAHAFOGAFOGAFGEPNFOLICFAGOIGNBMBHNGOGOGADLFDHLLEODOKNFMMJFMDOFOIIKFCHLLNNJONNMILAHAFBMAOAMAGHONHOHOJOONCMICNCGNONGOHOJODMODODAMJOGOJNJOJOHKLBLAMAICOBHCKFAFOGKFJFOGAFKFAHAFAFKFOGKFOGAFAFKFOGAFAHAFKFAHAFOGAFKFOGAFAHAFKFOGAFOGAFKFOGKFOGAFJFOGAFOGKFAFJFAHAFJFOGKFAFOGKFOGAFOGAFOGAFOGKFOGAFKFOGAFOGKFAFOGKFAFAHAFAFKFOGAFKFOGAFKF", "AFOGKFAFAHJFAFAFOGKFAFAHJFOGKFAFAHKFAFKFOGAFAHKFAFAFAHJFAFOGAFAFKFOGKFAFOGJFOGJFAFAHAFAHJFOGKFAFAHAFJFOGAFKFOGKFAFOGKFAFOGAFOGKFAFOGKFAFOGJFAFOGAFKFOGAFOGJFOGAFKFOGKFAFOGKFAFKFAFOGKFAFOGAFAHKFAFAFOGKFAFKFDHGOANNFEDBLGNBMKFJFAFAFOGAFJFKFAIBMFOCOEOEOHOHMKFAFIDAHLMIOINFGFAKAHAHAOALBGKJOJNJOJOJOGNNDICONONGOHOJOJOLEICAMJOJOHOJNGOBMFCLALAMALDKDNGOGAFOGAFKFOGAFJFOGAFOGKFAFAFAHAHAFKFOGKFAFOGKFAFAFAHAFKFOGJFOGAFKFOGKFAFOGAFAFKFOGAFKFOGAFOGAFAFAHKFAFAFOGKFAFAFKFOGKFAFKFOGAFAFAFAHAFJFOGAFOGKFAFOGAFKFOGAFAFKFOGAFKFAFOG", "AHAFAFOGKFAFOGAFKFOGAFKFOGAFAFJFAHAFOGAFKFOGJFAFOGAFKFOGAFKFOGKFOGAFAFOGKFAFKFOGAFJFAHAFAFKFAFAHAFKFOGAFKFOGAFAFOGJFOGAFKFOGKFAFOGKFAFOGKFAFOGKFOGAFKFAHAFAFKFOGAFKFAFAHAFAFOGAFOGKFAFOGKFAFKFOGAFKFOGAFOGADLFJMJOMILHGHGNPLBHAFKFAHAFOGAFADBDHIMICNEOEOMIKFADOGIDPGPMGOGOFGLACAGALAFCMAGKJOONHOJOJOJNFCFCHLJOHOJOJOGNICKBCMJOHOHOJOJOBMFCGACAFBOAHEKFOGOGAFKFOGAFOGAFKFAHAFAFJFAHAFKFAFOGKFAFOGKFAFAHAHAFKFOGAFAFKFOGAFKFAFOGAFKFOGOGAFKFOGAFAFKFAHOGJFAFAHAHAFAFKFOGAFKFOGAFOGAFKFOGKFAHAFOGKFAFKFOGAFKFOGAFKFAHOGAFKFOGAFOGAF", "JFAFOGKFAFOGKFOGAFKFOGAFKFOGOGAFKFOGKFOGAFKFAFOGKFOGAFAFAHAFKFAFOGKFOGAFOGAFAFKFOGAFAHJFOGAFOGJFOGAFKFOGAFAFAHKFAFAFKFOGAFAFOGAFKFOGAFOGAFAHKFAFAFAHAFKFOGAFOGKFOGAFOGKFOGKFAFOGKFAFOGKFAFOGAFKFOGAFKFOGAFOGBFHIEOANAGBGJNOLKFOGAFKFOGAFAHNGJFADJFKFHIBHKFAFOGAFOGKFHMGOGOFGKAKAGALAKBLBGKJOJNHOGNJOGNLBICINONHOJNJOINLDCBCMJOJNHOJOJODKFCLALACAMAHCKFKFAFAFAFAHKFAFOGAFAHKFOGAFKFOGAFAHAFOGAFKFAFOGJFAFAHAFKFOGAFOGKFOGAFOGKFAFOGKFAFOGAFKFOGKFAFAFKFOGAFKFAFAHOGAFAHAFOGKFAFAFAHAFAFOGJFAFKFOGAFOGAFAHAFKFOGAFKFAFOGAFKFOGKFAF", "AFOGKFAFOGKFAFKFAFOGAFKFOGAFKFAFOGKFAFAFOGAFOGKFOGAFKFOGKFOGAFOGKFOGAFAFKFAHAFOGKFAFJFAHAFOGKFAFKFAHAFAFOGKFAHAFAHAFOGAFKFAHAFKFOGAFAFKFAHAFAFKFOGJFOGAFKFOGKFAFAFOGKFAFKFAFOGKFAFOGKFAFOGKFOGAFKFAFAFOGOGJFAFKFELHOGLAKAMPLKFKFAFOGAFJFAHAFKFOGKFJFKFAFAFKFAHAFOGIDFJIOJOFHKAKAHAGAHCMAEKONGOHOJNJOINHCMACMONHOGOJOONNDCBHKJOHOINJOJOEKICOAGAKAMAIEKFOGAFAFKFAHAFOGKFOGJFAFAHAFOGAFJFAHAFJFAHAFOGKFAFOGJFOGAFKFOGKFAFAFOGKFAFOGKFAFOGAFKFOGAFAFOGKFOGAFAHAFAHAFKFOGJFAHAFAFKFOGJFAHAHAFAFKFOGAFOGKFAFKFOGAFJFOGAFAHAFKFOGAFAFAF", "AFKFAFOGAFOGAFOGKFAFOGAFAFAHAFAHJFAFOGKFAFOGKFAFAFAHAFKFAFAFAHAFAFKFOGAHAFKFOGAFOGKFAFAFAHKFAFOGAFKFOGKFAFOGJFOGKFOGAFAHAFNGKFOGAFAHAHAFJFOGKFOGAFAFAHJFAFAFOGKFAFAFOGOGAFOGKFAFOGAFOGAFKFAFOGKFAFAHOGKFOGAFOGAFLFBMEOOLJNLLJFOGAFKFOGAFAHOGAFAFOGAFAFAHAFAFNGAHJFIDBHBOJOBILACALAMAOAFCHHJOONINHOJOOLLBCBHKJOHOJNJONNFCCBGKJOGOHOJOINGKEDKBLACALBJEPGAFOGAHKFJFOGKFAFAFOGKFAFAHJFOGAFKFOGAFKFOGAFOGKFAFAFAHKFAFAFOGKFOGAFAFAHKFAFOGKFOGAFKFOGAFKFOGAFKFAFNGJFAFOGKFAFJFOGAFOGKFAFAFAHKFOGAFAFAHKFAFOGAFKFOGAFKFOGJFOGAFKFOGAFAH", "OGAFOGKFAFKFOGKFAFOGAFKFOGKFOGKFAFOGKFOGAFKFOGAFOGKFAFOGKFOGJFOGKFOGAFKFAFOGKFAFKFOGAFOGKFAFOGAFKFOGAFAFOGKFAFAFAFKFAFJFAHAFAFJFAHAFJFOGAFKFOGAFKFOGKFAFOGOGKFAFAHAHAFKFOGKFAFOGKFAFKFAHAFOGKFAFOGKFAHAFAFOGAFOGADPHBMJOJOELKFAFOGAFKFAHAFKFOGOGKFOGAFKFAHOGKFJFOGIDBHBOJOFGKALAGAMAKCLBEKONHOGOONJOINHCFAGKONJOHOJOJNJELAEKJOHOHOJNJOGHNDMACACALBHEJFAFOGKFAFOGKFAFAFOGKFAFAHAFAFKFOGAFKFOGAFJFAHAFAFKFOGKFAFNGAHAFOGAFKFAHAFAFOGKFAFKFAFOGAFKFOGAFAHAFOGKFAFOGKFAFAFOGAFKFOGAFKFOGJFAFAHAFOGKFAFJFAHAFOGAFKFOGAFAFKFAFOGKFAFJF", "JFAFAFOGAHAFKFOGAFAHKFAFAFOGKFAFOGKFAFAFAHAFKFOGKFAFOGJFAFAFOGKFAFAFAHAFAHAFOGKFAFAFAHKFAFOGKFOGAFAFAHAHAFOGKFOGOGAFAHAFKFOGAFAFKFOGAFKFOGAFAFAHAFKFOGAFKFAFOGAFKFAFOGAFKFAFOGAFOGKFAFAFAHAFOGKFAFOGKFAFAHKFAFAFOGKFPKHOGNAIJFOGKFOGAFJFAFAFAFAFOGKFOGOGJFKFAFOGAFAFGIAOIOFGHAMALAHAICOBHHJOONJNGOJOGNHCFBHHJOGOJNJOINGDKACKJOJNHOJOGNFHOBKBKACAOAHCIDAFOGAFAHJFOGAFAHKFAFOGKFOGAFAFAHJFAFKFOGAFKFOGAFOGKFAFOGKFAFAHJFAFOGKFOGAFKFOGAFOGAHKFOGAFKFAFKFOGAFOGKFAFOGAFAHKFAFOGKFAFOGKFAFOGJFOGKFAFOGAFKFOGKFOGAFAFAHAHAFAHAFAFAHAF", "AFAFAHAFKFAFOGAFAFKFOGJFAHAFOGAFKFOGAFAHAFKFOGAFAFOGKFOGAFOGKFAFKFOGJFOGJFAHAFAFOGKFAHAFAHAFAFJFAHAHAFJFAFKFOGAFKFOGKFOGAFKFAHAFOGKFAFOGKFAFAHAFKFOGAFAHAFOGJFAHAFAHAFKFOGAFAHAFKFOGAFOGJFOGKFAFOGAHAFOGKFAFKFAHOGAFCDMIPLLFAFOGOGKFOGAFKFOGKFAHAFAFAFKFAFOGAFKFOGIDGIENJOFHOAMAHALAOBLBEKONJOHOONJOINHEGAEKJOJOINJOONNDFAGHJOJOHOHOJNAELBMAKAKAOADDECOGKFAFJFAHAFOGKFAFOGKFOGAFKFOGKFOGAFOGAFOGAFKFAHAFAFOGKFOGAFKFAFOGKFOGAFKFOGAFOGKFAFAFKFOGAFOGAFKFOGKFAFOGKFOGKFAFOGKFAFAHAFAFOGKFAFKFAFOGAFKFOGAFOGAFKFAHAFJFAHAFKFOGKFAF", "KFOGJFOGAFAHKFOGKFAFAFOGKFAFAFAHAFKFOGJFOGAFKFOGAFKFAFAFAHKFAFOGAFKFAFAFOGKFAFAHAFOGJFAFAHKFOGAFJFAFAHAFAHAFAFAHAFKFAFAHAFOGKFOGAFAFAHJFAFAHJFOGAFKFAFAHKFAFAFAHJFAFAHAFKFOGJFOGAFKFOGKFAFAFOGKFAFJFAFKFAFOGAFKFOGKFOGJFJFKFAFKFAFOGKFOGAFAFOGKFAFOGAHAFAHAFAHAFAFAFBHBOGOFGFBOAOALBKCKCFHJNJOJNGOJOINFCCAHHJOHOJNJOIOPFKAGHJOINHOONHKMELBCBFAKAHCOBECAFOGAFKFAFAHJFAFOGKFAFAFAHAFKFAFAFAHKFAFAHAFOGKFOGAFKFAFAFAHAFAHKFAFAFAHAFKFOGKFAFAHAFOGKFOGKFOGAFAFOGAFKFAFOGAFAHJFAFOGKFOGAFKFOGAFOGKFAFAHAFKFAFAFAHAFAHJFAFAFAHAFAFOGKF", "OGAFAFKFAHAFAFKFOGAFOGKFAFAHAHAFKFOGAFAFKFOGAFJFAHAFOGKFAHAFOGAFKFOGAFOGKFAFOGJFOGKFAFAHAFAFJFAHAFOGJFAHAFKFOGKFAFOGAFJFOGKFAFAFKFOGKFAFAHAFAFKFOGAFAHAFAFKFOGJFAFAHAFKFOGAFAFKFOGAFKFOGAFOGKFAFAHAFAHAFOGKFAFOGKFAFKFAFKFAFAHAFAHAFAFKFAFOGKFAFAHAFKFOGJFAFKFAFOGIDBHBOGOHJMAOBAENEFHICGDINONEOJOJOONNDKAGHHOONJOJOGODGCAFHONONJODMINMELBGBFBKAOAFCECAFOGOGAFOGKFAFOGKFOGAFAHAFKFOGAFOGKFAFOGJFOGKFAFAFKFOGAFOGJFOGKFAFAFOGJFAFOGKFAFAFNGAFKFOGAFAFKFAFAHAFKFOGAFKFOGKFAFOGKFOGAFKFOGAFOGKFAFOGJFAHAFAHOGJFAHAFAFKFOGJFNGAHAFAF", "AFAHAFAFAHJFOGAFAFAHJFAFOGJFAFAHAFAFAHKFAFOGKFAFOGKFAFOGJFAFAHKFOGAFAHKFAFOGKFAFAFOGKFAFAHNGAFKFOGKFAFAFAHAFJFOGKFAFOGAFKFOGAFAHAFKFOGAFAHJFOGAFKFOGJFOGKFOGAFOGKFAFAHAFOGKFOGAFKFOGAFAFAHKFAFOGJFOGKFOGAFOGKFAFOGAFOGKFAFAHJFAFNGKFOGAFAHKFAFOGKFOGAFKFOGAFOGKFAFAFOHAOIOFGCBOAFCPBMEHCICDMJOINHOJOINJEGAGHJOHOINJOGODGAAAGONJOGNONIKGDFCBBFBCALBOBECKFOGAFAHAFAFOGKFAFAFAHJFOGAFKFOGKFAFOGKFAFAFOGAHJFOGAFAHKFAFAFOGAHKFAFOGKFAFOGOGKFAFAHAFKFOGAFOGKFAFOGAFAFAHAFAFOGAFKFAFAFAHAFKFAFOGAFOGKFAFAFAHJFAFAFAHKFOGAFKFAFAFKFOGAF", "KFAFKFOGJFOGAFKFOGKFOGAFKFOGAFJFOGKFNGAFOGKFAFOGKFAFOGKFAFOGKFOGAFAFJFOGAFKFOGAFOGKFAFAHAFKFOGAFKFAFOGAHAFKFOGAFAFOGKFOGAFKFOGJFOGAFJFAHAFAFKFAHAFOGAFKFAFAFOGKFAFAHAFOGKFAFKFOGAFKFAFOGKFAFAHAFAFKFOGAFAFKFOGAFJFOGKFAFOGKFAFAFKFOGAFOGKFAFAHAFAFKFAFOGAFKFOGAFOGIDPGBOINFGHCNAOBFCMEOAICINJOHOHOJOJOGDCAMIJOGOONJOJODGCAMEONJOINONGNNEGCGBLALAOALBDDAFOGAFJFAHOGKFAFOGJFAHAFJFAHAFOGAFJFAHAFAFAHAFKFOGAFAFKFOGAFAHAFJFAFOGKFAFOGAFKFOGAFJFOGAFJFOGKFAFOGJFAHAHAFKFAHAFKFOGAFOGKFOGAFOGKFOGKFAFOGKFOGAFKFAHAFAFKFOGAFOGKFOGAFJF", "AFOGAFKFAFAFAHAFKFAFAFAHAFKFOGAFKFOGAFAHAFAFOGKFAFOGAFAFAHKFAFAFAHAHAFKFOGAFKFOGKFAFOGJFOGAFKFOGAFOGKFAFAHAFKFOGAFKFAFAHAFAFKFAFOGKFAFAHJFOGAFAFAHKFOGAFOGKFAFOGKFAFNGKFAFOGAFKFOGAFAHJFAFOGJFOGKFAFAFAHAHAFAFAHAFKFAFOGKFAFAHAHAFKFAFAFOGKFAFAHOGAFAHJFAFOGKFOGAFAFBHENIOBIOAOBLBLBNCLBICJNJOHOJOGOGOLECANEJOJONNJOINIEKAAEJOGNJOJOHKFHHEKBKAKALBLBHCAFOGAHAFKFAFOGAFKFAFAFAHAFKFOGKFAFOGKFOGKFAFAHAFKFOGKFAFAFAHJFOGAFAHKFAFOGKFAFOGKFOGAFKFOGAFAFOGKFAFAFKFAFAHAFNGKFOGAFAHJFAFKFOGAFAFKFAFOGKFAFKFOGAFAHJFOGAFKFOGAFOGKFAFOG", "OGAFKFOGAFOGKFAFOGAFOGKFOGAFKFAHAFAFAHAFKFOGKFAFOGAFKFAHAFAFJFAHAFJFAHAFKFOGAFKFAFAHAFAFKFAHAFAFOGKFAFAFJFOGAFJFAHOGAFJFAHOGAFOGKFAFOGJFOGAFKFOGKFAFAFOGKFAFAHAFOGAFKFOGAFAHAFOGAFKFOGAFKFAHAFAFOGKFAHAFJFAHAFJFAHAFOGKFAFOGAFJFOGAFAHOGKFAFOGAFKFOGKFAFAHAFAFJFAHAFAHPLNNBIFCNACALAKCLBKCOLJOJOJOJOJOLECAAIONGOJOJOONBICAODGNJONNONOLFGNCLBFBLAMAOADDNGAHAFKFOGAFKFAHAFOGAHAFKFOGAFAFOGKFOGAFAFAHAFKFOGAFAFOGKFAHAFKFAFJFOGAFAHAFAHAFAFKFAFOGAFKFAHAFOGKFAHAFOGJFOGKFOGAFAFKFOGAFOGAFKFOGAFOGKFOGAFOGAFAHAFAFKFOGAFKFAHAFAFAHAF", "JFAFOGKFOGKFAFAHJFOGKFAFAFAHAFJFOGKFAFAHAFAFOGKFAFAHAFNGKFOGAFAHKFAFAFAHAFKFOGAFOGJFOGKFAFAFAHKFAFOGAHKFAFOGKFAFAFKFOGAFKFAFOGKFAFOGKFAFAFAHAFKFOGAFAHJFAFOGKFAFKFOGAFAFAHJFOGKFAFOGKFOGAFKFOGKFAFOGKFAFOGKFOGAFKFAFAFOGAFKFAFAFKFOGJFAFOGKFAFAHAFJFAFOGKFOGAFAFAHIDPGPMIOJJOBOAMAGBLBNAGDDMJOHOHOJOONNEKAGGJOJOJNJOGOFHLAODJNHOJOJOHKNELELBGACAMAOADDBDOGAHAFOGKFAFAFAHJFAFAHAFKFOGAFKFAFAFAHNGJFAFOGKFOGAFKFOGAFAHAFAHAFKFOGJFAFAHKFOGAFAHKFAFOGKFAFAFOGJFOGKFAFAFAFAHKFOGAFKFOGAFAHAFKFOGAFAFKFOGJFAFAHJFOGAFKFOGAFKFOGAFKFAF", "AFAHAFAFAFAFKFOGAFKFAFOGKFAHAFOGKFAFNGAFKFOGKFAFOGJFAHAFAFJFAHAFAFKFOGJFAFOGAFAHAFAFKFAFOGJFAHAFOGKFAFAFOGKFAFOGAHAFKFAHAFOGKFOGAFAHAFAFOGJFAHAFAFOGKFOGAFAHAFKFOGAFOGJFAHAFKFAFKFOGAFAFAFOGKFAFAHAFAFOGKFAFAFKFOGAFAHAFAHAFAHOGAFKFAFAHAFAFOGJFOGAFOGKFOGAFKFAHNGIDOHENNNFGBCBBMAKBKBMAODAMCMDKGLFKCMICCABGDMINOLGNINFGKAODGNHOHOONIHLEMCMBMAMAHAOABCAHNGAHAFKFAFOGOGKFAFOGJFOGAFKFAHAFOGKFAHAFAFKFOGAFAFKFOGAFAFJFOGKFOGAFKFOGAFJFOGAFOGKFAFAHAFAFOGKFOGAFKFAFAFAHAHAFAFKFOGAFKFAFKFAFOGAFKFOGAFKFAFOGKFOGAFKFOGAFAFOGAFKFOGAF", "AFKFOGAHKFOGAFKFOGAFOGKFAFAFAHJFAFOGKFOGAFAFOGKFAFOGKFOGAFOGKFOGAFOGKFAFAHJFAFAHKFOGAFOGKFAFAFAHJFAFAHOGKFAFOGKFAFOGAFJFOGKFAFAFAHJFOGKFAFOGKFOGKFAFAFKFOGJFOGAFAFAHKFAFAFAHAFOGAFKFOGKFOGAFOGAFKFOGKFAFOGAFAHAFKFOGKFAFKFOGAFKFOGAFOGKFOGKFAFAFKFOGAFAFKFOGAFKFAFOGPGPMHOGHOBMAFCOANAOBKCHDBGLBLBOBCCNAHAOBODPBKCOBNDOALAOBKECCFCGDOBHBKCABKBMAMANAFCBDOGKFAFOGAFKFAFOGKFAFOGKFOGAFJFOGAFOGJFAFAHAFKFOGAFOGKFOGKFAFAFOGKFAFOGKFOGAFKFAFAFOGAFAHKFOGJFAFAFAHAFAHAHJFAFAHJFAFAFAHAFAHAFAHJFAFOGKFOGAFOGKFAFAFAHAFKFOGKFAFOGAFKFOG", "OGAFKFAFOGKFAFOGAFAFKFOGAFOGKFOGAFAHAFAFOGKFAHAFAHAFAFKFOGKFAFJFAHAFAFOGKFOGAFJFOGAFOGKFAFOGJFAHAFOGAFKFAFOGKFAFAHAFKFOGAFAFOGKFAHAFKFAFAHAFAFJFAFAHAFOGKFAFAFKFOGKFAFOGJFAHAFJFAHOGAFAFJFAHAFKFOGKFAFAHAFOGKFAFOGKFAFOGAFKFAHAFOGAFKFOGAFAFKFAHOGAFKFOGAFJFAHAFOGIDAHOMJOHHOAKAGAFALAMAOBBGNEFCLBODLEOBKACBMEOECCOBKCOBCALBGHFHOEODFDHDAELBMAMAICNCNDPGOGAFKFNGAHAFOGKFAFOGKFAFAFAFOGKFAFKFAFOGKFOGAFKFAHAFAFKFOGAFOGKFAFAHAFAFKFOGAFKFOGKFOGJFOGAFAFKFOGJFAHAFJFAFAFKFOGAFOGKFOGJFOGKFAFOGKFAFAFOGKFAFAFOGKFOGAFKFOGAFKFOGAFAF", "JFAFOGKFAFOGKFAFAHOGAFKFOGJFAFAFAHKFOGKFAFOGAFAHJFOGKFAFAFOGAFOGKFOGKFAFAFKFOGAFKFAFOGAFAHKFAFAFAHKFOGAFOGJFAFOGJFOGAFKFOGAFKFAFAFAHAFAHKFOGAFOGKFAFAHAFOGKFOGAFAFOGKFAFOGJFOGAFKFAFAHOGAFKFOGAFAFOGAFKFOGKFAFOGKFAFOGKFOGAFKFOGKFOGAFKFOGAFOGKFAFOGAFKFOGAFKFOGJFIDPGLMGOEKLBHAKACAGALAMAGDBCFAKBFCPBMACAMAFGMEOBHBCCKBAACBLEFHMEABOBBGOBLACAHAMALBLDKFOGOGAFKFAFAHJFAFOGKFAFOGAHKFAFOGKFAFOGKFAFOGKFAFNGKFOGAFAFAHKFAFOGJFOGAFAFKFOGAFKFAFKFAFAFAHAHAFKFAFOGKFOGKFOGAFKFOGKFAFAFOGKFAFOGKFAFOGKFAFOGKFOGKFAFOGKFAFOGKFAFAFAHJF", "AFAHAFAFAHAFAFOGAFKFOGAFKFAFAFOGJFAFKFOGAFJFAHAFAFKFOGAFOGKFOGKFAFKFOGAFOGAFKFAHAFOGKFOGKFAFOGJFAHAFAFOGKFAFAHAFAFKFOGAFKFAHAFOGAHAFKFOGAFKFOGKFOGAFJFAHAFOGKFAFOGKFAFAHAFAFKFAHAFOGKFAFKFOGAFJFAHAFAHAFKFOGAFAHAFKFOGAFKFAFOGAFAFKFOGAFKFOGKFAFOGAFKFOGAFKFOGAFAFOGPGPMJOHHFCMAOAMALAMAICHEKACALAKCOBOBKBICAEKCBBKBNDLBGAKADCCGOBOACCODICMAFBMAMALBHCAFOGOGAHAFOGKFAFOGKFAFOGAFKFAFAHAFAFOGKFAFOGKFAFAHAFOGKFAFOGKFAFOGKFAFKFAHOGAFKFOGAFOGAFAHAHAFKFOGAFOGKFOGAFOGAFKFOGAFAFAHAHAFAFOGKFAFOGKFAFOGKFOGAFAFOGKFAFOGKFOGAFOGKFAF", "AFKFOGAFNGKFOGKFAFOGKFOGAFAHAHKFAFOGAFAFAHAFKFOGAFAFKFOGKFAFAFOGAFAFKFOGKFOGAFAFAHKFAFAFOGAFKFOGJFAFAHJFAFOGKFOGAFOGKFAFOGJFAFKFAFAHAFJFOGAFKFAFAFAHAFKFAFAFOGAHJFAFOGKFOGAFAFKFOGAFOGKFAFAFAHAFKFOGJFOGAFKFOGJFAFOGKFOGAFAHJFAFOGAFKFOGAFAFOGKFAFAHAFAFAHAFKFOGKFIDAHCNJOFHKBMALBLALAHCKCGDFBEBGACCEGPBICEDPBKBLALAICKCOBLBLBFCOBKBPBEGNELDMAKBLBPBHEBFAFOGJFJFAFOGKFAFOGAFAHKFOGAFAHKFOGAFOGAFKFAFOGJFAFAFOGKFAFOGAFKFOGAFAFKFAFOGAFAHKFAFOGJFAFAHAFKFOGAFAFKFOGAFAHAFKFOGKFAFJFOGKFAFOGAFAHAFOGKFAFAFAHKFAFOGAFKFAFAFAHJFAFOG", "OGAFJFAHAFOGKFAFAHAFAFKFOGAFKFAFOGAFKFOGJFAHAFJFAHAHAFAHAFAFOGKFAHOGAFAHAFAFAHAFJFOGAFAHAFKFOGAFAFOGKFAFAHAFAFKFOGKFAFOGKFAFAHAFOGJFOGAFKFOGAFKFOGJFAHAFAHAHAFKFAFAFAHAFAFKFAHOGAFAFKFAFOGAHAFKFOGAFAFKFOGAFKFAFAHAFAFAFOGKFAFOGKFAFOGAFKFAHAFOGAFKFOGKFAHAFOGAFOGIDGIPMPLICCAHALALAMAHALBLBFAFAKAMALBKBGALAFBCACACALAIAGBLBMAMALAHAGBOBEDOALAHAMAGBKAEBIDJFOGKFAHAFAFAHAFOGKFAFJFOGJFOGAFAFKFAHAFOGKFAFAHOGKFAFOGAFKFOGAFAHAHAFOGKFOGJFAFOGKFAFAHAFJFOGAFKFOGAFKFAFJFOGAFKFOGAFOGKFAFOGKFAHAFOGKFAFOGKFAHAFOGAFKFOGAFOGKFOGAFJF", "JFAFAFKFAFAFOGKFAFAHAFOGKFOGAFAHKFAFOGKFAFAFAHAFJFAFAHJFOGKFAFAFKFAFAHJFOGKFAFAHAFKFOGJFOGAFKFOGKFAFOGKFAFAHAFOGKFAFOGAFAFAHJFOGKFAFOGKFAFAFAHAFKFAFOGJFAFKFOGAFAHAHJFOGKFAFAFAHKFOGAFAHJFAFAHAFKFOGAFAFAHAFOGKFAFAHAHJFAFOGKFAFOGKFAFOGAFKFOGKFOGAFAFOGJFAFKFOGAFOGAHLMJJLBMAOAKBMAOAOANAMALAKBLBCBHALAKAFBGABAOAMALALAHALAHAKAMAMALACAMACBGAHALALAHALABCKFAFAFAHKFOGJFAFKFOGAFAFKFAFAFAHAHAFJFOGAFOGKFAFKFOGAFAHKFOGAFKFAFJFOGKFAFAFOGKFAFOGKFAFAHAFKFOGAFKFOGAFAHAFKFOGAFAFAHJFAFOGAFAFKFOGKFAFOGAFOGJFAFAHJFAFOGKFAFOGAFAHAF", "AFAFAHAFAHOGKFAFOGJFAHAFAFJFAHAFAFOGKFAFAFOGJFAHAFKFOGAFKFAFAHAFOGKFOGAFKFAFAHAFKFOGAFAFKFOGAFKFAFAHAFAFOGKFOGKFAFOGAFKFAHAFAFKFOGAFKFOGAFOGKFOGAFOGKFAFAHAFJFAHAFJFAFKFOGAFOGJFAFAHAFKFOGAFJFOGOGAFKFOGJFOGJFAFAHAFJFAFAHAFAFOGKFAFOGAFKFOGAFAFKFAFOGKFAFAHAFKFOGIDAHPMBMFHNCPBOBOBCCOBCCOBPANCHDDBPAPAOBNADBNCOCMCOBNAOANAOAKBKCICLBOAMALBNAOBNAMBPBOBKDKFAFOGJFOGAFAFKFOGAFAHAHAFAHAHAFJFOGAFKFOGKFAFOGAFKFOGJFAFAFAHAFOGAFKFOGAFOGKFAFAHAFAFOGKFAFOGKFAFOGAFKFAHAFOGKFAFOGKFOGAFKFOGKFOGAFAFOGKFAFKFAFOGKFAFOGKFAFOGKFAFKFAF", "KFOGJFOGJFAFOGAFKFAFNGKFOGAFKFOGKFAFOGOGKFAFOGKFOGAFKFOGAFOGKFOGAFAFKFOGAFOGJFOGAFKFOGAFOGKFOGAFOGKFOGAFKFAFAFOGKFAFAHAFAHJFOGAFAFAHAFKFOGKFAFOGKFAFOGKFAFOGAFKFOGAHJFAFAFAHKFAFOGADAHAFAFAHOGJFAFAHJFAFAFKFAFOGKFOGAFOGOGOGKFBFOGAHJFKFAFKFKFAFOGAHNGOGKFAFOGNGKFIDNGOMJOGKKCOBCCLBPACCOBGCJCNBKEMCPBCCIBMBNBJCODNCIBOBNBOBMBPBNBPBODJCPBOBCCCCNCMCKGKGNDBFAFOGOGOGOGKFKFAFAFKFAFAHJFAFAHKFAFOGAFAFOGAHJFAFAFKFAFKFAFKFKFAFOGAFKFNGAFOGAFAHPGAFKFOGAFKFOGAFKFOGAFJFOGAFOGKFAFAFAFAHAFKFOGAFAHJFAFOGKFAFOGKFAFOGKFAFOGKFAFOGAFAH", "OGAFAFKFAFAFJFAHAFAHAFAFKFOGAFKFAFOGAFKFAFAHAFAFKFOGAFAFOGKFAFKFOGKFOGAFOGKFAFKFOGAFKFOGKFAFAFOGKFAFKFAHAFNGAHAFAFKFAHAFJFOGAFKFAHAFKFOGAFAFOGKFAFOGKFAFOGAFKFOGHEOIEIEIEIDIDIEIEIEIEIEIDIIJEIEIOIEIEIEIKJGHGEAFOGAFAHAFKFKFKIIJDIDIEIDIEIDIDIEIEIDIDIDIKJCKDDAFAFOGNGLMGOHKKCBBOAOBLBOBLBNACCMBDBPDCEKEKGEIDIDIJGDIPEPDCCPAKBOBLBLBDBLBOBNAKBOANADBCEOEPFAFOGAFJFBDGHPIPIEIDIDIEIDIDIEIEIDIEIEIKJEIEIDIEIEIKJPIKJOIBGJEGEBHKFAFOGAHAHAFOGKFJFAFOGAFKFOGAFKFOGAFOGAFKFAHAFAFJFAHAHAFKFOGAFAFKFAFAHAFAFOGKFAFOGKFAFAHAFAFOGKFAFJF", "AFAHAFOGKFOGAFKFOGJFOGAFOGKFOGAFOGKFOGAFAHJFOGKFAFAHKFOGAFAFOGAFKFOGAFKFAFOGAFOGKFAFOGAFAFAHKFAFOGAFOGJFAFKFAFAHOGAFJFOGAFKFOGAFKFOGAFAFAHJFAFOGAFKFOGAFAHKFOGAFAGIJDIJGIGEIDIDIDIDIIGJGEIEIDIIGKJDIIGJGPIAIJFOGJFAHJFOGAFHCOIEIJGEIDIEIDIIGEIIGIGEIJGFFIGGGKFOGAFAFNGLMJOHKKCNANDLBOANCOBKBHDKEEIEIDIDIIJEIJGEIDIIGDIEIEIHGCCNAMACBGBKBLAOAMAKBKBOAOCLEKFIDAHAHAHKFEFIJJGEIIGJGEIIGJGDIIGEIIGJGDIEIIGJGIGEIDIDIEIDIKJIJIJAKEHBFADAFKFAHJFOGAFAHAFAHAFAFAHAFKFOGKFOGAFKFOGAFOGKFAFOGAFKFOGAHAFAHJFOGAFAHAFOGKFAFOGJFOGKFAFOGAFAF", "AFKFAFKFOGAFKFOGAFAFKFAHAFAFKFAFAHAFAFKFOGAFKFAFAHAFOGAFKFOGJFAHAFAFAHAFAHAFOGKFAFOGAFKFOGKFAFAHAFOGKFAFAHAFAHAFKFAFOGKFAFOGKFAFOGAFOGKFAHAFOGAFKFOGAFOGKFAFJFAFGGEIDIDIDIEIDIDIDIEIEIIJDIDIIGEIDIEIJGEIKJNDAFOGJFKFAFAFBFAIKJFFJGDIDIDIDIKJDIEIDIDIEIEIPIEHBFOGAHIDOHCNGOHHODOBOBKCOBODCEIGDIEIEIDIIGEIIGIGDIEIIGEIDIIGDIDIDIHGNDHAKBOAOBODOIEIOINBODJENGOGNGNGIDIEBKJGIGDIEIDIDIEIEIDIEIDIKJEIIGDIEIIGEIEIEIEIDIEIJGDIEIDIDIDIPHKFAFNGJFAHAFKFAFJFNGAHAFKFOGAFAFKFOGAFKFOGKFAFAHAFKFOGAFJFAHAFAFKFOGJFAHAFAFKFOGAFKFAFAHAFAHAF", "AFOGAFOGAFAHAFKFOGAFOGKFOGAFOGKFAFOGKFOGAFAHAFOGJFAFKFOGAFKFAFAFAHJFAFAHJFAFKFOGAFKFOGAFAFOGKFAFAHJFAFOGKFOGJFOGAFAHKFAFAHAFOGKFAFAHJFAFKFOGKFOGAFKFOGJFAFOGAFAHDIDIDIDIDIIGIGEIIGDIIGJGEIIGJGEIJGJGDIDIOIHEAFAHAFAFOGAFPGKIBKKJDIEIIGIGEIEIIGDIFFDIDIIJCIJEJFAFAHIDBHBOJOEKPAGCNANAPDIGKJEIIGDIIGEIDIDIEIIGEIIGEIHGEIDIDIEIEIIGHGPBMAHAMABEKJDIEIIBNADCAFOGKFAFOHEHKGDIEIIGEIDIIGDIDIIGDIIGEIDIEIDIDIIJDIDIIGIGDIDIDIJGEIJGIGIGPIHEAFAFOGJFOGAFOGAFKFAFOGAFKFOGAFAFAHAFOGKFAFOGJFOGAFAFAHAFJFOGKFAFKFAFOGKFOGAFKFOGAFOGKFAFKFOG", "AHAFOGKFAFKFOGAFKFAHAFAFKFOGKFAFOGKFOGAFAFJFOGKFAFAHAFKFOGAFOGJFAHAFOGKFAFOGAFKFOGAFJFAHAHAFAFOGKFAFOGKFOGAFAFKFAFJFOGAFAHAFKFOGAFKFOGAFOGAFAFKFOGAFKFOGAFAHAFJFKFKFAGPIEIIGEIIGEIEIDIEIIGDIKJCIEGHEBFKFJFOGOGPGAFKFKFAHAFPGDDHECICIIJEIDIDIDIDIDIDIEGHELFJFAFOGOGIDBHIOJOIHODPACCHGKJEIEIIGEIEIDIDIIGEIHGBEGCNAOAMABBNBPDIGIGDIEIKGCCNAPBDIIGDIEFIBLBFCAHOGAFKFIDAHCDAGCIEIDIJGIJEIDIKJDIEIDIIJEHCDBFAFKFHEBGIJDIEIIGEIIGDIEIEIIJOIPFAFAFOGAFAFKFAHAFAHAFKFOGAFKFOGJFOGKFAFAFAHAFAFKFOGJFAHAFKFOGAFOGAFJFOGKFAFOGAFOGKFAFAHAFAF", "JFAFKFOGAFOGKFOGAFKFOGAFAFKFOGAFKFAFAFAHKFAFAFOGKFAFOGAFKFOGAFAHJFAFKFOGKFAFOGAFKFOGAFKFAFAHNGAFAFAHAFAFKFOGOGAFAHAFKFOGJFAFOGAFAHAFKFOGKFOGAFAFAHAFAFKFOGKFOGAFAFAFKFHEEIJGIGEIIGEIJGJGJGEICIEGAFOGAFJFAHJFKFAFOGAFOGKFOGOGAFKFDDAGCIDIFFJGJGKJCIMFKFAFAFAFAHJFOGIDBHNNHOCKAEPDEIEIIGEIIGDIEIIGIGEIDIMCLBHAHAIAMAKBLAGBHBMBBEEIDIDIIGJCDIEIEIDICEBBOBLDKFOGOGKFOGOGOGAFAGDIDIDIJGDIJGJGEIIGEIJGPGPGAFOGAFAHKFLFEIIGEIIGEIDIDIDIDIDIFHGEOGAFAHAFAFKFOGJFOGAFAFAHAFKFAFAFOGAHJFAFAHKFOGKFAFAFAHAFAFAHKFOGAFAFOGKFAFAHAFOGJFAFAHJF", "AFOGAFJFAHAFAFKFAFOGAFKFOGOGAFKFOGAFOGKFOGAFOGKFAFOGKFAFOGKFAFKFAFAHOGAFAFOGKFOGAFKFOGAFOGKFAFKFOGJFAHAFOGAFKFOGKFOGAFKFOGAFJFAHAFKFOGAFAFJFAHAHAFJFAHAFAHAFAFKFAHOGAFCDPIIJJGDIDIDIDIEIDIDIOILDKFAHAFAFAFOGAFNGAHAHAFAFOGKFOGAFAFLFNIEIIGEIIJBEKFAFAFOGOGOGJFNGOGIDPFNNJOEKGGEIIGDIEIDIDIEIIGEIEIIGMBLAHALACACBHALALALACAGALANBDIDIDIKJIGKJIGEIFDMAOBHCAFOGAFJFJFAFOGOGHCDIDIDIEIJGDIDIDIDIDIEIJFJFAHAFAFAHAFADGGDIDIEIIGJGEIIGFFKJOILFAFAHAHKFAHAFAHAFAFKFOGJFAHAFOGAHAFKFAFOGKFOGAFAFAFAHAFKFOGKFOGAFKFAHAFAFOGKFAFKFAFOGJFAF", "KFAFOGAFKFOGOGAFAHJFOGAFKFAFOGAFKFOGKFAFAFAHKFAFOGKFAFOGKFAFOGAFAHJFAFAHKFAFOGKFOGAFKFOGAFOGKFAFAFOGKFOGKFAFAFAFOGKFAFOGKFOGAFKFOGAFAFAHKFAFAFAHJFOGKFAFAFAHNGAFAFAHAHLFDIJGDIEIIGEIIGDIJGJGEGOGAFAHKFOGAFKFOGKFAFAHJFAFAFOGKFOGAFOGHGDIDIDIIJPGAFOGOGKFAFAFAHKFIDIDEJIOEMPIDIDIEIDIDIIGEIDIIGDIHGNAMAMAMALAHAOBPBOBGBCACALALAKAPDKJIGEIDIIGDIDIMACBLBIEKFOGOGAFKFAFOGJFDHDIJGDIDIDIEIIGIGJGEIBGAFAHJFOGAFKFAFOGAGOIEIIGEIDIDIJGEIIGEIAGBFOGJFOGJFAFKFOGAFOGKFAFAFAHJFAFAHAFAHJFAFAFAHAHKFAFAHAFKFAFAFAHAFAHKFOGAFOGKFOGAFKFAFOG", "AFOGKFAFOGKFAFKFAHAFAFKFOGAFJFAHOGAFAFOGKFNGAFAHAFAFOGKFAFOGKFOGKFAFOGKFAFAHAFAFKFAFOGAFAFKFOGAFOGKFAFKFAFOGKFOGKFAFAHAFAFKFAHAFAFOGKFAHAFOGAFKFOGAFAFNGAHAFKFOGKFNGJFLEIJJGEIIGDIDIEIDIJGEILHOGOGJFAFKFOGAFKFAFOGJFAFAHAHAFAFAFKFJFOIJGDIEIBGKFOGAFKFAFOGAFKFAFNGIDEJANMKIGEIDIDIDIEIJGDIIGEIIGKBOANANCOBHAKAKBODODMAKAHALBMAFBLABEEIIGEIEIIGIGCBHAOALDAFOGKFAFKFOGAFKFEHEIIGEIIGDIDIEIEIEIIJJEOGKFAFAFKFNGAHAFNDPIEIIGEIDIDIEIDIJGEIBGAFNGAFKFAFOGAFKFOGKFOGAFOGKFAFOGJFAHAFAFKFAHAFJFAFOGJFOGOGAFOGJFAHAFAFJFAHAFOGAFKFOGAFKF", "AFKFAFAHAFOGKFAFAFAHAHAFKFOGAFKFAFAHJFAFOGKFOGJFOGKFAFOGAFKFAFAFOGKFAFOGAFAHKFOGAFAHKFOGKFAFAFAHKFAFOGAFOGKFAFOGAFAHJFOGAFAFKFOGKFAFOGJFAFAHKFAFKFOGAFKFAFAHAFAFOGKFKFKIEIEIIGEIIGEIDIEIDIEIKDOGKFAFOGAFKFOGAFOGKFAFOGKFAFAHAHAFAFCHIJJGEIDIGEJFAFAHAFAFKFOGAFAHNGIDDHFKPIEIIGDIDIEIDIDIIGKJHGJAMAKBOBNCNEOBLALAHAOALALAHCOAKBKALAOBPIEIDIEIEIBECALANAIEAHOGAFAFAFAFOGKFNIDIEIDIEIDIIGDIDIJGCILFAFOGKFOGAFOGKFOGAGPIEIJGDIIGEIIGEIIGDIGHJFAFAHAFAHKFOGAFAFAFKFOGKFAFAHKFAFAFAHAHAFNGKFOGAFKFAFKFAFAHKFAFOGKFOGAFKFAFOGKFAFAFOGAF", "AFOGAFAHAFKFAFNGAHAFJFOGAFKFOGAFOGKFOGAFKFOGAFAFKFAFAHAFAHAFNGAHAFAFOGKFAFJFOGAFAHAFAFKFOGAFOGKFAFOGKFOGKFAFOGJFAHAFAFKFOGKFOGAFAFOGKFAFOGKFAFOGAFKFAHAFAHAFKFOGKFAFBFIJDIDIEIDIEIIGDIDIDIGGJDNGAFOGAFKFOGAFOGKFAFOGKFAFOGKFAFKFOGAGKJIGEIGGBFOGOGAFKFOGAFKFOGKFJFPCMIPIJGIGEIDIEIIGDIIGEIDICCHAMAMAKBLBOBHALAGALACALALAMAMALALALAIAEFEIIGDIDICCCBLAOBHCKFOGOGKFAFAHAFLFPIDIJGDIJGDIDIEIIGDIOIADAHAFAFKFOGAFOGKFEGDIEIIGEIDIDIEIJGJGDIJIKFAFKFAFJFOGAFAFKFAHOGAFAFOGKFAFNGAHAFJFAFKFOGAFAHAFOGAFOGJFAFOGKFAFJFAHAFOGKFAFOGOGKFAF", "KFAFAHJFOGAFOGKFAFAHAFKFOGAFKFOGAFAFKFOGAFAFAHAHAFOGJFAFAHKFAFKFOGAFKFOGKFAFAFAHJFOGKFAFAFAHJFAFOGAFAFAFOGKFAFAFAHKFOGAFAFOGKFOGAFKFAFOGKFAFOGKFOGAFJFOGJFOGAFAFOGBFHEKJJGDIDIJGEIDIEIIGIJAGBFAFAHKFOGAFAFAHKFAFOGKFAFOGKFAFOGAFKFGGDIIGEIAGAFOGKFAFAFOGKFAFKFAFAFHEIJEIEIJGDIDIDIDIJGEIDIJCMAICOBLBOAKBLALAGAMAGAKAKACALALAFBLAHALBBEDIEIIGEIHBKALAKBHCAFOGAFAFOGKFKFJEIJEIIGEIDIJGEIDIDIDIEHAFNGAFAFKFAFOGAFJFCIDIIGJGEIDIIGEIIGEIIJEHAFOGAFOGAFKFOGOGAFKFAFAHKFAFOGAFKFAFAHAFAHAFKFAFAHKFAFOGKFAFOGAFOGAFAFKFOGKFAFOGKFAFOGKF", "AFAHAFAFKFAFKFOGAFJFOGAFKFOGAFKFAHAFOGAFKFAHAFJFOGKFAFOGJFAFOGAFJFAHOGAFAFOGJFAHAFKFAFOGKFAHAFOGAFKFAHAHAFAFKFOGJFOGAFAFKFOGAFAFKFOGKFOGAFKFOGAFKFAFOGKFAFAFKFAHOGADEGEIIGDIEIDIDIEIIGEIPILFAFAHAFAFKFAFOGKFAFOGKFAFOGKFAFOGAFKFJFPIDIEIDILFAHAFAFAFOGKFOGAFAFAHKDOIDIEIIGIGDIDIJGDIEIKJEFNALALBNDABHALAGALAMAGAKACBFCNDMACALACBOBIBPDDIDIEIDIMALAHAOAKDKFOGAHAHAFAFKFEGEIIGEIDIEIIGDIDIEIDILFOGAHAFAHAFOGAFKFHEDIEIEIJGDIDIEIDIJGDIOIDHAFAFAFKFAHAFAFKFAHAFOGJFOGAFJFAHAFOGJFOGKFOGAFOGJFAFOGKFAFOGKFAHAFKFAHOGAFAFOGKFAFAHAFAF", "AFJFOGAFOGOGAFKFOGAFKFOGAFAFAHAFJFOGKFOGAFKFOGAFKFAFOGKFAFOGKFOGAFKFAFAHAHJFAFAFAHAFOGJFAFJFOGKFOGAFJFAFAHAHAFKFAFAFAHAHAFKFOGAFOGAFOGKFAFOGJFOGAFAHAFOGKFOGAFJFOGGEOIEIJGDIDIIGIGEIDIIGCIBFOGJFOGAFOGKFAFOGAFKFAFOGAFOGKFAFAHAFDHDIDIEICIBFJFKFOGKFAFAFKFAFAHJFEGIJEIJGIGEIDIIGEIDIIGEICCKBHAKAMAMACBGAGALAGAMAFBAIJNONBGGALAMAFCMAIBKJIGDIEFHAKAMAKBFCAFOGJFKFKFOGPGOIEIFFDIDIIGJGDIDIDIEFKFOGNGAFKFOGAHAFKFKIEIDIIGEIIGEIDIIGEIDIGGJFOGAHAFAFAHKFOGAFJFOGKFAFAFAHAFKFOGKFAFAFOGKFAFAHAFAHJFAFOGKFAFAFAHAFJFAFAHAFKFOGAFJFOGAF", "OGAFJFAHAFKFOGAFKFAFOGKFAFOGKFAFOGKFAFAFOGAFKFOGAFOGKFAFAHAFAFKFOGAFJFAHAFAFKFOGJFOGKFOGAFOGAFAFJFAHAFAHAFJFOGAFOGKFAHAFKFOGAFOGKFAFKFAFOGAFAFKFAFJFAHAFOGAFKFOGAFBHIJIGJGDIDIEIEIDIIGDIGHADOGAFKFOGKFAFOGAFKFOGAFAHAFKFAFOGJFOGBGJGDIEIBGAFKFOGAFAFKFAHAFKFAHPGIJKGJGIGKJDIEIJGEIIGKJCENAMAHCHAMAFBMALAHALALAHAJEEKJOJOOIMACALAKAFBNADIEIKJMCMACBHAMADDKFOGAHAFJFOGMFKJFFIGDIDIEIJGJGIJDIFHAFNGKFOGAFJFAHAFGEOIEIIGEIIGEIDIIGEIDIDIAGKFAFOGKFAHJFOGAFKFOGAFAFOGKFAHAFOGKFAFAFOGKFAFOGJFOGKFAFAHAFAFKFOGJFAHAFAHAFKFOGAFAHAFAFKF", "JFAFOGKFAFAFAHAFOGKFAFOGKFAFOGKFAFOGAFAHKFOGAFKFOGAFOGKFAFAHAFOGKFOGAFKFOGAFOGKFAFAFAFKFOGKFOGAFAFAHKFAFAHAFKFOGAFOGJFAFOGKFAFKFOGAFOGKFAFAHOGAFOGAFAFKFKFOGAFAHAFLIIGEIDIEIDIIGDIEIIGKJLFOGBFOGAFKFOGAFAHKFAFOGJFKFOGJFAFOGAHADOIEIIGKJPHAFKFAFOGAFAHBFOGOGBDCIDIDIDIEIIGDIDIDIDIEIDICCOALBPAPAMAOANALBMAGBOAGDLLONAMGHFCIAMAFACAKAOBEFPIKGEDLAGBLAMALBBFOGAFKFOGAFGGDIIJEIJGIGEIEIIGJGIJLFKFAFOGKFAFAHAFGEOIIJEIDIDIEIIGEIDIPIIJAGKFAFOGJFOGAFAFKFOGAFKFOGAFKFOGAFAHJFAFOGAHKFAFOGKFAFAFOGKFAFAHOGAFKFAFOGKFAFAHAFJFOGKFAFOGAF", "AFAHAFAFKFOGJFOGKFAFAHAFAFAHAFAFAHAFOGKFAFKFOGAFAFOGKFAFOGJFAHAFAFKFOGAFKFAHAFAFKFAHOGAFKFOGAFKFOGKFAFOGKFAFOGKFAFKFAFAHAFAFKFOGAFOGKFAFAHAFKFOGKFAHAFAFOGJFAHAFJFOIDIJGEIDIIGEIIGEIIGPIKFAFJFJFAHAFAFOGKFAFOGAFKFOGAFKFOGOGJFKFEIEIJGOIGEAFKFOGAFOGKFAFAFOGJEDIDIDIEIIGEIEIIGEIJGIJEFNALANAJCHDOBKBOBNAKBICBGLLONJOGHNANAGBLALAKANAGCPBIBOBKBLAFBMAOAFCBDOGOGAFJFBFCIDIDIEIJGEIIGDIJGEIOIGEAFOGKFOGOGOGGEBGDIEIIGDIDIDIEIIGJGDIEHLFBFOGAFKFJFAHAFOGKFAFOGAFKFOGAFAFKFAFAHAFJFAFAHAFAFKFAHAFAFAHAFKFOGAFOGKFAFOGJFOGAFKFAFOGKFAF", "AFKFOGAFOGKFAFAFOGAHJFOGKFAFAHJFAFAHKFAFOGAFKFOGKFAFOGAFKFAFAHKFOGAFKFOGAFKFOGAFOGKFAFOGAFKFOGAFKFOGAFKFOGKFAFOGAFOGKFAFAHOGAFKFOGKFAFOGJFOGAFKFAFAHOGAFKFAFAHNGGEPIEIIGEIIGEIDIDIIGEIEGKFJFAFOGAFAHKFAFOGKFAFAHAFOGAFAFKFOGKFJIEIDIDIEGJFAHAFAFAHAHAFAHAFKFKIEIJGDIIGEIDIDIEIIGEIEINBGBLAKBOBBGOBMAKBOALAICDKJNJOCMOBFBMAMAGBHALAFCPBODOBOBLBMAMAKBLBICGENGAHAHAFLFDIEIIGDIJGDIEIIGEIDIEGJFOGNGAFAFAHHEMIDIDIIGJGEIJGIGJGEIEFAGDDAFAFOGAFKFAFKFOGAFAFAHKFAFOGAFAHAHAFAHJFOGAFAHJFOGKFOGJFOGKFAFAHAFKFOGAFAFAHKFAFOGKFAFOGKFAFOG", "AHAFAFOGKFOGAFAHAFKFAFAFOGJFAHAFOGKFAFOGJFAHAFAFOGAFKFAHAFAHAFAFKFAFOGAFOGAFKFAHAFAFOGKFOGAFKFAFOGAFKFOGAFAFAHAFOGKFAFOGJFAFKFOGAFAFOGKFAFKFOGAFAHAFKFOGAFOGKFAFAGPIEIJGIGEIDIEIIGEIKJNFBFOGAFAFOGKFAFOGJFAFAHAFKFOGAFKFOGKFAFOIIGEIIJJEAFAFKFOGAFKFOGPGAFLFPIJGEIIGEIDIDIIGDIEIIGDIKBLAMAMAGBMAGAHAMALACAHEBMJOBKKCHAHAKBMAHALAGALAMAMALBNDKBMAFBMALBOBKFAFOGJFAFBGDIDIDIDIEIIGEIIGEIHGBGJDBFBFPGJEEGDIEIEIDIEIEIIGEIKJDIEHPGOGOGAFOGAFAHAFAHAFKFOGKFOGAFKFAHAFJFJFAHAFAFKFAHAFAFKFOGAFAFKFAFAHAFJFOGAFKFOGJFAFOGKFAFAHAFOGAFJF", "JFAFAHKFAFAFAHJFOGAFAHKFAFOGJFAFKFOGAFKFAFOGKFOGKFOGAFKFOGAFAHNGAFAHJFAFAHJFAFAHKFAFKFAFOGKFOGAFKFOGAFAFAHJFAFAHKFAFOGKFAFOGAFKFOGAFKFOGAFAFKFOGJFAFOGAFOGAFAFKFGGDIIGEIDIIGEIDIDIIGKJGEAFKFOGAFKFOGAFKFOGAFNGKFOGAFOGAFPGAFGEOIEIDIIJDDOGKFOGAFPGAFAFOGKFAIDIIGEIDIDIJGDIEIIGDIEICEBAMAFCKACACAHALAKAKABCMIJOGNOBCALAMALAHALAMALACACAKALBICKBFBLAGBABLBCDAFOGAFGEGHDIIGEIDIIGEIDIDIDIEIEIPIIJIJDIIJEIDIDIDIDIDIDIDIKIJEKFJFAHOGOGOGKFAFKFNGJFOGAFAFOGKFOGAFAFAHAFAFAHJFOGAFKFOGAFAFOGKFOGAFOGJFOGAFKFOGAFKFOGAFAFOGKFAFAHAFAHAF", "AFOGKFAFAFOGKFAFKFOGKFAFAHAFAFKFOGAFAHAFAHAFOGKFAFAFOGAFJFAHAFKFOGKFAFOGKFAFOGJFAFOGAFOGKFOGAFKFOGAFOGJFAHAFAHAFAFKFOGAFKFAHAFOGAFKFOGAFKFAHOGAFAFKFAHAFAHAFKFKFDIIGEIIGEIJGEIIGDIDIGHKFKFOGAFAHAFKFOGAFKFAHAFAFKFOGAFKFAHAFAGDIDIDIGGAHAFAFOGKFAHAFOGOGBDCIDIJGDIEIIGDIEIIGEIDIEIGCLAMAFBKALAOAKCABLANDAKAMCMNCGAGAHALAHAMALAHAMAKBLAGAFCICKBIAFBMAOAOACDOGKFAHGEIJIGDIEIIGDIDIDIDIEIIGEIIJIJFFDIEIDIIGEIIJEGBGCGJFKFNGKFAFAFOGAFKFJFAHJFAHOGAFOGKFAHAFAFJFAHAFKFOGKFAFKFAFOGAFKFOGKFOGAFAHAFAFKFOGAFKFAFOGAFKFOGKFAFOGJFAFKFAF", "AFKFAFOGAHJFAFOGAFAFOGKFAFAHOGAFKFAFNGKFAFAHAFAFAHKFAFOGAFKFOGAFAFOGKFAFOGAFKFOGAFAHKFAFAFAFAHAFKFOGKFAFJFOGKFOGAFOGKFOGAFJFOGKFAFOGAFOGAFKFAFAHKFAFAFAHNGKFADHIKJEIIGKJIGEIIGEIIGEILHADOGAFOGKFOGAFKFOGAFJFOGKFOGAFAFOGAFPGBGEIEIDIAGKFOGOGAFNGKFJFAFOGLFPIDIIGJGDIEIDIIGEIDIIGDIHBMAMAMAKALAODOCFGHHGNJODMKEHACAGALALALAMAGACBLBPBFCMALBEDKBMAFBGBNAOBGEJFAFAHAGKJJGIGEIDIDIIGEIDIIGJGDIEIEIIGJGDIEIIGJGDIEGJEKFJFJFJFAFKFAFAHJFAFAFKFOGJFOGKFAFOGJFAFAHAFAHJFOGAFOGAFOGKFAFAHAFKFAFAFAHJFOGKFAFAHAFOGAHAFAHAFKFOGAFKFOGAFOGKF", "AHAFOGAFKFAFOGAFKFOGKFAFAHAFJFAHAFAHAFAFOGKFAFJFAHAFOGKFAFOGKFAFOGKFAFOGAFKFOGAFOGJFAFAHAFOGKFOGAFKFOGAFOGAFAFJFOGKFOGAFAFOGKFAFAHAFAFKFOGAFKFOGIDKFNGOGKFJFKFJIDIIGEIDIDIJGJGDIEIDICGAFAHAFAHJFAFKFOGAFOGAFKFOGAFAHAFKFOGKFOIJGDIEIHEAFKFAFOGKFAFAFKFOGHEIJJGEIDIJGDIIGEIDIDIDIPEHACBCBKBMAMANAODHDOLINIKIHOBGAGACAGAMAHAFBLAGANAOBOBMALBICMACBMAHAABKCCGKFOGJFEHEIJGEIIGDIDIEIIGJGDIEIDIDIDIJGDIJGIGEIIJDIDIEIOIAGKFOGOGAFKFAFOGKFAHAFAFOGAFKFAHAFAFOGKFOGKFOGAFAFKFOGKFAFOGKFOGAFOGKFAHAFKFAFOGJFAHAFKFAFKFOGAFKFOGAFJFAHAFAF", "AFAHJFOGAFAHKFOGAFAFOGKFAFAHAFKFOGJFOGKFAFOGKFOGAFAHJFAFAHAFOGKFAFOGKFAFOGAFKFAFAHAFAHJFOGKFAFAFAHAFKFOGKFOGAFAFKFAFAFAHAHJFAFOGKFOGKFAFOGKFOGJFOGAFAFKFOGOGBDEIDIDIDIEIDIDIEIDIFFPIJFOGKFAFAHJFOGAFKFOGKFOGAFAFKFAFAHAFOGHEDIEIIGCIJFOGAFAHAFAFOGAFOGAFEGEIIJIGEIDIEIDIIGJGDIEICCOABBMAKBNAMAMAKBFCCCOEHHPBKACAHALALAGBMAKBMALAHAMALAHAOBICOACBKBCBMAPBIEOGOGBFEIIGDIEIDIJGDIDIEIDIIGJFJFJFJFAFLFEHOIKJJGJGJGDIEIIGCIJEAFOGAFAFAFOGKFOGAFKFOGAFKFOGKFAFAFAFOGKFOGKFAFAFOGKFAFOGKFAFAFOGJFOGAFOGKFAFAFAHAFAHAFKFOGAFKFOGAFKFOGAF", "AHAFAFKFAHAFAFKFAFOGKFAFAHAFKFOGAFAFKFAFAHAFOGAFAFKFAFOGJFOGKFAFAHAFAFOGKFAHAFOGKFAHAFAFKFOGAFOGKFOGAFKFAFAFKFAHAFNGAHAFKFAFAFKFOGAFAFOGKFOGAFAFJFAHAFAFJFNGLFDIJGDIJGDIIGEIIGEIIGKIKFAFOGAFKFOGAFKFOGAFAFAFKFAHAFOGKFAFJFEHDIDIEIEHKFAFKFAHAFOGKFOGAFAFGGDIEIJGEIIGDIIGEIDIEIDILBKBLABBMALBHACBKAHALBHDHGNDGBMAMAMALAGAMAOBOBMALAFBLALALBOBKBMAKBCBNAOBHEOGNGHEDIEIIGDIJGDIDIEIIGEIEGKFAFKFOGAFKFDDHEGGEIIGEIDIDIEIDIOIDHKFAHAHAHAFAFKFOGAFKFOGAFKFOGAFAHAHAFAFKFOGAFOGKFAFAHAFAFAHAHAFAFKFAHAFAFKFOGJFAHAFJFOGAFAFOGKFAFOGAFJF", "JFAFOGAFKFOGOGAFAHJFAFOGJFOGAFKFOGOGAFAHJFAFKFOGAHAFAHKFAFAFOGKFAFAHKFAFOGKFAFAFOGKFOGAFAFKFOGKFAFAFAHAFOGAHAFKFOGKFAFAHAFAHOGAFKFOGAFKFAFAFAHOGOGKFAFOGAFKFEHEIDIEIDIIGEIDIDIIGEIJEJFAHJFAFOGAFAHAFKFOGOGKFAFAFAHKFAFOGKFNIEIIGIJHEAFAHOGAFOGKFAFAHAFAHHGIJDIEIDIEIIGEIDIIGEIIGJALAMAMANAKBMALALAMAOBEGGGOBHAMAKCNCOALALALBEDKBHAGALAGBMBMDOAMANACBOANCJEOGAFBGEIDIEIIGEIDIIGEIDIDIAGAFAHJFAFOGOGOGBFAGDIEIDIDIDIIGKJIJEFPHAFJFKFOGAFOGKFAFOGKFAFAFAFAHJFAFAHJFAFAFAHKFOGAFJFOGKFAFNGKFOGAFKFOGAFOGKFAFOGKFOGAFAHKFAFOGKFAFOGAF", "AFOGKFAFOGKFAFKFOGAFKFOGAFKFAFOGAFKFAHAFAFKFOGAFJFAHAFAFKFAHAFOGKFNGAFAHAFAFAHAHAFAFKFAHAFOGKFAFNGAHAFJFAHAFKFOGAFAFOGJFAHAFKFOGAFJFAHAFOGAHAFKFAFKFAFAFAHAFOIDIEIIGDIEIDIIGEIDIPIKFJFPGAFAFOGKFAHAFOGAFKFOGAFAHJFOGAHAFGEPIEIIGOIGEAFJFKFOGAFJFAHAFKFAHEFDIDIJGDIIGEIIGDIEIDIIGMALAFBMALBMBMALAFBFBMANANABBLAKAMCKENALAFBMAOALALAHACAIALBCCLBKBKBFBLBPBJEAFKFOIEIIGDIEIDIDIEIIGDIDIBFKFAFOGKFAHOGAFJFHEPIEIDIDIDIEIIGDIIJEGBFOGAFKFOGKFAFAHAFOGAFAHOGKFAFOGKFAFOGKFNGAFKFAFOGKFAFOGKFAFAFOGAFKFAHAFOGAFKFOGAFKFNGAFAHAFAFOGKFAF", "AFKFAFAHAFOGKFAFKFOGAFKFOGAFAHJFAFOGKFOGAFOGKFAFOGJFAFOGAFKFAFAFOGKFOGJFAFAHJFAFAHJFAFAHKFAFOGAFKFAFAHAFKFOGAFKFOGAFKFAFOGKFAFAFAHAFKFOGJFAFAHAFAHJFAFOGKFBFPIIGDIEIIGEIDIEIIGEIKIBFAFAHKFAFOGAFJFOGKFAFAFKFOGJFOGAFJFOGLEIJJGEIKIBFOGJFAFOGAFKFNGKFAFJFOIEIDIIGEIDIDIEIIGDIIGBEMALAMAFBNAICKBLAMAMAFBHAMAHALAHAMANAKBLALAFAHALABAOALAHAOBCCMBKBMALAKBKCEDJFOHDIDIEIIGDIJGDIDIEIDIEFJFJFOGOGBFAFAFOGAFDHDIIGJGDIDIEIEIIGEIOIEHJFOGAFAFOGKFAFAHJFAFKFAFOGKFAFOGAFKFOGAFAHAFAHAFOGKFAFOGAHKFAFOGAFKFAFAFAHAFAFAHAFKFOGJFOGAFKFAFOG", "KFOGAFAHAFJFOGAFOGKFAFOGAFOGKFAFAHAFAFKFOGKFAFOGKFAFOGJFAHAFAHAHAFAFKFAFOGKFAFOGKFAFOGJFAFAHAFAHAFOGJFOGAFKFOGAFKFAHAFOGJFAFOGKFAHAFOGKFAFAHAFJFOGKFOGAFAFNFDIEIIGDIEIIGEIIGDIDILIADOGPGAFOGAFAHAFKFAFAHOGAFKFOGAFKFAFKFEGEIDIDIDHAFAFAHAFOGAHAFKFAFOGJFDIDIDIEIIGEIIGDIEIIGEIKEMAMAMAMALBKBMAMAMAMAKBMAMAMAHAGAGAGBFAGAHABBHDDIBJKGNAMAOBNDNAMAMALAMAAEJEKFAGEIIGDIEIIGDIEIIGDIEIJIAFKFAFAHADOGKFAHAHHEDIJGJGDIJGDIDIJGJGIJFHAFKFAFOGKFAFOGJFAFAHAFOGKFAFOGAFKFOGAFAHAFJFAHAFKFAFOGAFKFOGAFJFAHAFAHAHAFKFOGJFAHAFAFOGAFKFOGAFKF", "AFAFAHJFAFOGKFOGAFOGKFAFAHAFOGKFAFAHAFOGKFAFOGKFAFOGKFAFAFAHJFAFAHJFAFOGKFAFOGKFAFOGKFAFOGJFAFKFOGKFAFAHAFOGJFOGAFKFOGAFAFAHJFAFAFAHJFAFOGKFOGAFKFOGKFAFOGNEEIIGEIDIDIDIIGEIDIEIKFNGAHAFKFAFOGKFOGAFOGJFAFOGAFKFOGJFAFKFOIIGEIEFPGJFOGAFKFOGAFKFOGKFAFAFCIDIDIJGEIIGEIDIDIEIIGJCKBCBCBKBNANAKBLALBOAMAKBGBHALALAHALAMACBHANBDIEIKJCIKBLALBOBKBNACBGBMAJCJEPGNIJGEIIGEIDIJGDIEIIGDILFAFOGAHJFAHJFAFNGJFLHDIJGJGDIEIDIDIEIFFEIPJBFAFAHKFAFOGKFAFOGKFOGAFOGKFAFAHAFKFAFKFOGAFJFOGAFOGKFAFAFAFAHAFKFOGJFAFAHAFKFAFOGKFAFKFOGAFAFOGAF", "AFOGKFAFOGKFAFAFKFAFOGAFKFOGKFAFOGJFAHAFAFOGKFAFOGKFAFOGJFAHAFJFAHAFOGKFAFOGKFAFOGKFOGAFAHAFKFOGAFAFOGJFAHAFAFKFAFOGAFKFOGKFOGAFOGKFOGAFAHAFKFAFOGAFKFAFKFNIJGIGDIEIIGDIEIEIIGDIKFJFOGAFKFAFOGAFAFOGKFAFAHAFKFOGAFKFAFLFKJJGIJGGADAHOGOGAFKFOGAFKFAFOGAFHGEIDIJGDIDIDIIGDIEIPIMCMAMAGAMAMBKBMAMAHAKBOAHAHACBMALAHAMAKBMALBHDKJIGDIBEHAMAOBGCLBKBMAHALAOBLDKFBKJGIGEIDIDIEIIGDIEIIGBFAHAFNGAFKFAFOGAHJFLEDIJGJGIJIGDIIJEIIGJGDILFAFJFOGAFKFOGAFKFOGAFAFKFAFOGJFAHAFOGAFKFOGAFKFOGKFAFKFAHOGKFOGAFKFOGAFJFOGAFOGKFOGAFOGKFAFOGKFAF", "JFAFAFAHKFAFOGAHAFAHJFOGAFKFAFOGKFAFKFOGAFKFOGAFAFOGKFAFOGKFAFOGJFOGAFAFOGKFAFOGAFAFAFAHAFOGOGOGAHNGKFOGJFOGAHOGNGKFOGOGJFOGKFOGAFAFKFOGJFOGAFOHAFKFOGOGAFIJEIDIDIIGEIJGDIIGKJBGAFAHJFAHAFAHKFOGAFAFOGAFAFOGAFAFAHKFAFMIIGJGPIAGOGJFAFAHKFAFAFAHAFPGAFKFLIIGJGPIEIIGDIEIIGEIDIJCMAKBMAKBDBIBHAMALALAMALAMALAGBKBLAHAMANAPDDIEIEIDICCMAGBKBOBFCOAOBHCOAICHCAGKJJGDIDIJGDIDIJGEIDIJIKFADOGAFAHAFAHBDAHJFLIEIIGEIJGEIDIIGDIEIDIPIGEKFAFAFOGAFAFAHAFKFOGAHAFOGKFAFOGKFAFOGAFKFOGAFAFOGAFOGJFAFOGKFAFOGKFOGAFKFOGAFAFKFOGAFOGKFAFOGKF", "OGAFOGKFAFOGAFJFAHAFAFKFOGAFOGKFOGAFOGAFKFOGAFKFOGKFAFOGKFAFOGKFAFAFKFOGKFOGAFAHAFOGKFKFAFKFJFKFKFAFAFAFAFKFAFAFKFAFAFAFAFAFAFJFAHAHAFAHAFOGAFKFAFAFAFOGGEIJIGDIJGEIIGEIIGEIPIMEOGJFKFNGAHAFAFKFAFAHAFKFOGKFAHKFOGAFGEOIEIJGPIBFKFOGAFKFOGAFOGJFOGKFAHAFAGEIDIEIDIEIIGEIIGDIIGCEGBCBMANAHBDBOAMAMALBOBOAMAGBMAMAMALAHAIBPEEIIGDIDINAHAHAGCOBLBLBMAMAMALBJEEGDIEIDIJGDIDIEIJGDIDIPHBDAHAFAHAFJFAFKFOGJFEFDIJGDIEIDIIGEIEIIGEIPIGEAFOGAHAFKFAHAFKFOGAFJFOGKFAFAHAFOGKFAHAFOGKFAFOGKFOGKFAFOGKFAFAHAFAFAFKFOGAFKFOGAFKFOGKFAFAHAFAF", "KFAFAFOGKFAFAHAFKFOGAFAFKFOGAFAFKFOGAFAHAFAFAHAFKFOGAFKFAFOGKFAFOGKFAFAFOGKFAFKFAHJFAFAHAFAFAFAFAFAFOGKFAFAFOGAFAFOGKFAFAFAHAFAFKFAFAHJFOGKFOGAFOGKFOGAFAFKJEIJGDIEIJGDIEIIGIJJEAFOGAFKFAFAHAFOGKFAFAHKFJFOGJFOGAFAHBGEIDIDIEGADOGKFOGAFKFOGKFAFAFAFAHAHKDIJJGDIIGDIEIDIEIDIEIPDPAKBLBKBDBIBOACBNAOBKBOAKBMAKBHAMALBNACEIJEIIGEICELBMAMAOBFDKCLBLBOBOAMCGDCIKJIGEIDIJGDIDIIGEIDIJFKFJFOGKFOGAFOGOGAFHEBKEIJGEIDIIGEIDIDIIGJGOIJFKFAFKFOGAFAHJFAFAFAHAFKFAFOGJFAFKFOGJFAFAFOGKFAFOGAFAFAHKFAFOGJFOGKFOGAFAFAHAFKFOGAFAFOGKFAFAHAF", "AFAFOGKFAFOGKFOGAFKFOGKFOGAFKFOGAFJFAHAFKFOGJFOGAFKFOGAFOGKFAFOGKFAFOGOGKFAFOGAFKFAFOGAHOGKFOGOGOGAHAHAFOGOGAFKFOGAHAFOGAHAFKFOGAFOGAFOGAFAFKFAFOGKFAFOGGEOIJGIGDIEIIGEIIGEIBKHEAHAFAFAFOGJFAHKFAFAHKFJFAHAFOGAFKFKFOIJGIGKJLFAHAFAFKFOGAFKFOGAFAHAFNGAFPGEFDIFFEIJGDIIGDIJGDIIGLBOAKBMAOBABHALAOAHAMAGBLAMAHALALBHGCEDIJGDIJGDIODIAKALALCPBODKCMBLBABODHDDIDIEIDIIGDIEIIGEIDIEGKFAFKFAHAFAHOGAFOGKFBGKJIGJGDIDIEIDIEIIGJGEIKIKFOGKFOGAFOGKFOGAFOGJFAHAFAHAFAFKFOGAFAFAHOGKFAFOGAFKFAHAFAFOGKFAFAFOGKFAFOGKFAFOGKFAFOGKFAFOGAFJF", "AFAHJFAFOGKFAFKFOGAFAFOGAFAHAFKFOGAFKFOGAFKFAFOGKFAFAHAFAHAFOGKFAFOGKFAFOGKFAFOGKFAFOGAFJFKFBFBFKFAFKFOGKFKFOGAFKFKFAFKFAFAHKFAFDDGEOGAFOGKFAFAHOGKFAFAHAFOIEIJGDIIGEIDIDIIGPIAGAFAHAHAFAFOGKFAFOGJFJFJFAFOGAFOGKFBGKJEIIGCIAFNGAHAFAFKFOGAFAFAHKFAFOGAFKFJIIJIGDIDIIGEIDIDIJGEIPALBNAICOBNAMACBGBLAMALALALALALACCOIKJEIDIIGEIDINAMAMALAOAFDAEOBGCNAOBMCHGDIEIIGDIJGDIDIEIIGKJODOGAFOGJFOGKFOGKFAFLFOIEIIGEIIGIJJGIGKJJGEIDIHEOGAFAFKFOGJFAFAFAHKFAFAFAHJFOGKFOGAFAHKFAFKFOGAFKFOGAFAHJFOGAFOGKFOGAFAFAHKFAFOGKFAFAHJFAFOGKFAFOG", "OGKFAFOGKFOGAFOGKFAFOGKFAFKFOGAFKFOGAFKFOGAFOGKFOGAFJFAHAFOGKFAFOGKFAFAHAFAFOGKFAFOGAHJFAIOIPIPIDIEIEIJGEIDIEIEIEIDIEIEIEIDIEIEIBKLKLFOGKFAFAHAFOGKFAFAHAFBGDIDIEIJGDIIGEIDIEIAGKFKFAFKFOGAFJFNGAFKFAHAFOGAFAFKFJEEIIGKJDILFOGAFJFAHAFOGKFAFOGKFAFAHAHAFAFLFCIEIDIJGDIEIDIJGDIDIPDNALBOBMAOBOALAHAMACBLACBMAMAGAODEIIGDIIGEIDIEFKBHALAOAOBLBPBLBMAKBMAPBEFEIDIDIIGEIDIEIIGDIDICGAFOGAFOGKFOGAFAFBFEGDIEIJGIGEIDIJGDIDIEIDIKIKFJFAHAFOGKFAFAFOGKFAFAHAHAFAFKFOGAFAFJFAFKFOGAFAHAFJFAHAFAFKFAFKFOGAFKFOGKFAFOGKFAFOGKFAFOGKFAFAHAF", "AFAFOGKFAFAFAHAFOGKFAFOGKFAFOGKFAFAFAHAFKFOGAFAFAFAHAFKFAFKFOGAFAFOGKFAFAHKFAFOGAFOGJFBDEGKJJGEIDIDIDIDIDIEIDIDIDIEIDIDIDIEIDIEIKJEGJFJFOGKFKFOGAFNGKFOGOGPFDIEIIGEIIGIJJGIGEICIKFADAHAFAFOGAHKFAFOGJFOGAFAFGEJEPJKJJGDIAGADAHKFAFAHJFAFOGKFAFOGAFAHAFAHJFJFJEPIEIDIJGDIIGEIDIJGHGHBHAMAOAABLBKBMAMAFBLALAMANAPADIEIDIJGEIDIIGBEKBMAMALBOBJCODOBKBOAMBCEDIDIDIJGEIDIEIDIJGDIDIFEAFKFOGJFAFOGKFKFNFCIEIEIDIIGDIEIIGEIIGEICILFAFAFKFOGAFOGKFOGKFAFOGJFAFAHAHAFKFOGAHAFOGAFKFOGJFOGAFKFOGOGAFAHAFAFAHAFKFOGAFOGAFOGKFAFOGKFAFOGJFAF", "KFOGKFAFOGAFJFOGKFAFAHAFAFOGKFAFOGAHAFKFOGAFAFKFOGJFAHAFOGOGAFKFOGKFAFOGKFAFOGAFKFAFAFPGOIEIJGJGEIIGEIEIIGEIIGEIIGEIIGEIDIEIIGEIDINDBFOGAFAFNGAFOGKFAFOGAFCDDIDIEIIGDIEIDIJGJGPIJIPGKFKFOGAFKFOGAFKFAFOGOGGEDHCKEIIGDIEFKFOGKFAFOGKFAFAHAFOGAFJFAHAFJFJFAHOGADHGDIIGEIDIEIDIIGDIEICEOAMAOBKCNAHAGBGBOAMAHABBODDIEIDIIGIGDIJGPINBKBOBLBKCPBOCEGOBOALBOBDIDIDIIGEIEIIGIGDIEIIGIJCGOGAFAHAFOGKFKFPGOIEIFFIGDIEIIGDIEIDIJGIJODAFOGAHAFJFAHAFAFKFAFOGKFAFAHAFJFOGAFKFAFKFAHAFOGKFAFAFKFOGAFKFAHAFKFAHAFKFOGAFAFKFOGKFAFOGKFAFAHAFAFKF", "AFAFAFAHKFOGAFKFAFOGKFOGAFAHAFAHJFAFAHAFKFOGAHAFKFAFKFOGKFAFOGAFKFOGAFKFOGAFKFOGKFAFAFCGBKKJIGEIIGEIDIEIEIIGEIDIEIEIIGEIEIDIIJPIAKHEJFOGAHNGKFAFAFKFAFNGKFKFKDBLIGEIDIDIJGEIDIEIIJGHKDBFAFOGAFAHNGOGOGAFPFFHDIJGJGEIGGPGAFAFOGKFAFAFAHJFAFAHKFAFOGKFAFOGJFAFAHJFHGPIDIIGJGEIDIDIDIDIBEIBMBCCLBOAMAKBGBMANBPEDIEIDIIGJCEIJGDIIGOAPAFCCCMBPBBGPBMDCCPDIGEIDIJGJGDIIGEIJGEIIGEIEIJGAIMFADOGAFGEKIBKDIEIDIDIDIDIEIDIIGEICIJEJFAFAFKFOGAFKFOGOGAFOGKFAFAHJFAFOGKFOGAFOGAFKFOGAFOGKFOGAFAFAHAFJFOGAFKFOGAFAFAHAHAFAFOGAFKFOGAFNGKFOGAF", "AFKFAHAFAFKFOGAFKFOGAFKFOGJFAHAFAFKFNGAFOGKFAFKFOGAFOGAFAFOGKFAFOGKFAFOGKFAFOGKFAFAHOGJFGEDDAGDIEIDIEIIGDIEIDIEIJGIGEIDIGGEHHEDDKFADJFAHAFAHAFAFKFAFAHJFOGAFKFHEEIDIEIJGDIDIDIDIDIIJOILIDHKFAFJFBFBFAGCIDIDIDIEIDIGGMFKFAFOGOGADOGJFAHAFAHAFAFOGKFAFOGKFAFKFAHAFDDAGIJEIJGIGDIEIIGEIDIHGHDODOBMABBHBGCPEDIDIEIDIBEPENBEIDIDICEMAKBNAMAOAKBDBFDHGEIDIEIIGDIEIJGDIEIDIDIDIDIDIDIEIIGEIPIPIEIDIJGJGIGDIEIEIIGJGIGDIEICIAGPGJFAHAHAFAFKFOGAFKFOGKFAFOGKFAFAHAFAFKFOGAFKFOGAFKFAFOGKFAFOGKFOGAFKFOGAFKFNGAHAFJFAHAFJFAHOGAFAFKFOGAFAF", "AFOGJFOGAFOGKFOGAFKFOGAFKFAFAFAHAHAFKFOGAFOGAFOGKFOGKFAFOGKFAFOGJFAFAHAFOGKFAFOGOGNGOGAFAFOGAFPHIGEIDIEIIGEIDIIGEIJGEIEGMFJFAFOGKFAFOGAFOGKFOGAFAFOGKFAFAFOGAFKFHECIDIEIIGFFDIDIIGJGEIEIEIDIEIEIDIEIDIDIDIKJEIIGEHLFBDAFOGOGAFAHKFAFAFAHKFOGKFAFOGAFOGAFOGAFKFOGAFKFAGPIEIIGEIDIDIIGEIKJDIEIDIKJDIEIKJDIEIDIIGBEMBNAIBDIEIDIIBKBMAMAMAHALBNBMCDIEIDIDIEIJGEIIGEIDIDIEIDIEIDIDIDIEIIGEIEIEIDIJGJGEIIGIGEIJGDIEIIGBGCGBDJFOGNGAHAFOGAFKFOGAFAFOGAFKFOGKFAFAHAFOGKFAFOGJFAFOGKFAFOGKFAFAFAHAFOGKFOGAFAFKFOGAFKFOGAFKFAFAHAHAFKFAFAH", "AHAFAFKFOGKFAFAFOGAFKFOGAFNGAHAFJFOGAFJFAHAFKFAHAFAFAFOGKFAFOGKFAFOGKFOGJFAFAHAFKFAFAFAFOHOGAFAFEIDIJGDIDIEIIGEIDIKJPIJEAFOGOGOGOGOGAFOGKFOGAFOGAFKFAHAFOGAFAHAFJFJFEHEFEIEIJGIGEIEIIGIGDIEIDIDIIGIGJGJGDIDIGGAGPGADJFAHOGAFKFAHAFOGJFAHAFAFOGKFOGAFKFOGKFAFOGKFOGIDGEELKJDIIGDIEIDIEIIGIGDIEIDIEIIGIGDIDIIGPDJAMAIAODDIDIDIMBLALAKBMALANACCKEEIIGDIEIEIIGIGIGIJDIJGIGEIIGJGIGEIIGEIEIIGDIJGEIDIEIIGEIKJBKOIEHHEKFJFOGOGOGOGKFOGAFKFOGAFKFAHAFKFOGAFAFOGJFOGKFAFAHAFAFOGKFAFOGAFOGKFOGJFAHAFAFKFAFAHAFKFOGAFJFAHAFAHAFJFOGAFAHAF", "JFAFOGAFKFOGAFAHJFOGAFKFAFKFAFAHAFKFOGAFKFOGAFJFOGKFOGAFAFOGKFAFOGKFAFAFOGKFAFAHJFKFAFAFAFOGOGHEEIDIEIIGEIDIEIDIDIIJCIDDOGOGJFBFAFOGAHJFAFAFKFOGOGAFKFAHKFAFAHNGAFAHJFPGEHOIIJJGIGEIJGJGJGIGIGEIKJEIDIDIHGHEKFADOGOGKFNGKFAFAFAFAHKFAFJFOGKFAFOGKFOGAFKFOGAFKFOGNGIDOGELAOFKDIFFDIJGDIEIIGEIIGEIIGEIEIIGJCIBNAMAKBMAMANAJANAIAMAMAMAGBGBKBPBHGDIJGEIDIDIEIEIIJIJEIDIEIDIEIDIEIDIDIDIDIEIDIIJDIDIEFEGAGGEDDKFKFAFAFJFAFOGAFAFOGKFAFOGAFAHAFJFOGAFAFAHKFAFOGKFAFOGKFOGKFAFOGKFAFAHAFAFKFAFAHJFOGAFAHJFOGAFKFOGAFKFOGJFAFAFKFOGJFAF", "AFAHAFKFOGAFOGKFAFKFOGAFOGAFOGJFOGAFKFOGAFKFOGAFKFOGAFKFOGKFOGAFAHAFAFOGKFAFOGJFOGKFOGKFAHOGKFEHDIEIDIEIDIJGDIEIJGKJAGJFKFAHAFJFNGAHJFKFOGKFOGAFKFAHJFJFAFAFJFJFOHAFJFAHJFBDGEEHBGGGPIDIEIIGEIDIGGBGKHGEAFOGKFOGOGKFAFKFAFKFAHAFJFOGAFOGKFAFAHAFAFKFAFOGAFKFOGKFAFAFNGOJAOHKMCDBJCPDEFDIEIDIDIDIPEFDIBPAIAKBNAFCMAOBMBOANAKBOAMAKBBBMAHAMAOBAECCMAMAKBNANCLEDDADAFAHAFJFAFAHAFJFKFBDJFADJFKFJFJFOGAFKFPGKFJFOGAFOGKFAHKFAFOGAFJFAHAFAFKFOGAFKFOGKFNGAFAHAFAFKFOGAFKFAFAHAFAFAHAFKFOGAFOGJFOGAFKFOGAFKFAFOGAFKFOGAFAFKFAHOGAFAFKF", "AFKFOGAFAFAHJFAFOGAFKFOGKFAFKFAFAHAFOGKFAFOGKFAFOGAFAHAFKFAFAFAHJFOGKFAFOGAFKFAFOGOGAFKFNGKFBDNIEIIGEIDIEIDIIGEIJGCIHEAFOGAFAFOGAFKFAFAFKFOGKFAHAFNGAFAHAHJFAFKFAFAHAFJFAFPGAHAFAFAFKFJFJFKFAFNGKFAFGEAFKFAFOGOGAFOGAFAFAHAFKFAFOGKFAFAFOGKFAFAHAFOGKFAFOGAFAFOGKFAFOGCLEOBMLEDBNAKBMAPANANANAOAHAMAHALAMAMALBMAKBLBNALBNAOAKBMAIAKBMAMAMAOBNDOAMAMAHAOAGDDGKFOGKFAFAHJFAFKFAFOGAFOGKFOGKFAFAFAFOGAHAFJFAFAFKFOGAFOGJFAFOGKFAFKFAFAHAHAFKFOGAFAFOGKFAFAHJFOGAFKFOGAFOGKFOGKFAFAHAFKFOGAFAFKFOGAFKFOGAFAHAFAHAFAFAHAHAFJFAFAHAFOG", "OGAFKFAFOGKFAFOGKFOGAFKFAFOGOGAFKFOGJFAFAHAFAFAHAFAFKFOGAFOGJFAHAFKFAFOGJFAHAFOGAFKFKFAFOGOGKDKJDIEIDIEIIGDIEIEIJGOIKFOGOGBFAHAHAFAFAFOGAFAFOGJFAFAHAHAFAFAFOGAFOGAFKFOGOGAFJFNGKFAHOGAFAFJFJFAHAFAFOGNGOGOGJFBFOGJFOGOGJFOGAFOGKFAFAHAHAFAFOGJFOGKFAFAHAFJFAHAFOGAFKFCLBOPLOCDBLBMANANAMBOBOAMAMAGBCBMAMAHAIAKBOANANADBOALBMAMAMAMAMAMANAFCICKBCBMAMAKBNALDJFOGAFAHAFAFKFOGAFKFOGKFOGAFAFOGAHAFKFAFKFAFAHOGOGAFAHAFAFOGAFJFAHOGAHAFJFOGAFKFAFOGKFAFAHAFOGKFAFOGAFKFOGAFKFAFOGAFKFOGAFKFOGAFKFOGAFOGAFJFAHAFKFOGJFAFKFOGAFJFAHAF", "JFAFOGKFAFOGKFAFAFAHAFOGKFAFAFAHAFKFAFOGJFOGKFAFAHAHAFKFOGAFOGKFAFOGAFKFAFOGKFAFOGAFAFAHKFOGAGJGJGEIDIDIEIEIIGJGEIEHAFOGKFAFAFAHKFOGAHKFOGAFKFAFOGKFAFAHKFOGAFAHKFAFOGAFAHAHNGPGAFKFAFAHKFOGJFJFOGAFOGAFAHJFAFKFAFAFAFAFOGAFOGKFAFOGKFAFAHKFAFOGAFOGAFKFKFOGJFAFAHIDAHCLIOPLICABLAMAGBLBMBMBMBKBMAOALBBBBBMAMAKBMAKBKBMAOBOBLBOAKBMAMAMAKBODODKBMAOALBPAOBKDAFOGOGJFAHAFOGAFAHAFKFAFOGKFOGAFKFOGAFAHAFAHJFAFKFOGKFOGAFKFOGAFKFAFJFOGAFKFOGAFAHKFAFOGJFAFKFOGAFKFOGAFKFOGAFOGKFOGAFAFAHAFAHKFAFKFOGKFOGAFKFOGAFKFOGAFOGKFOGAFKFAF", "AFAHAFOGAFKFOGAFOGJFOGKFAFOGKFAHAFOGKFOGAFKFAFOGJFAFKFOGAFAFKFAFOGKFAHAFOGKFAFAHAFAHAFJFOGIDFHJGEIIGDIEIDIDIEIJGIJDHAFOGKFOGAFJFOGAFKFOGAFKFOGAFKFOGAFKFOGAFAFKFAFOGAFOGKFAFAFAFOGAFOGAFAFAFOGAFKFOGKFOGKFAFAHAFAFAHAFKFOGAFKFNGOGKFAFOGJFOGAFKFAHAFAHAFOGKFAFAFJFAFKFFJBOINFGOAFBMAMANALBNAOAMALAMAHAMAHAKBHAMAMAMAMAKBLBNAKBBBMAMAGBMAMABGGGCCFCNAOBCCPDIEKFOGKFAFAFKFAFOGKFAFOGAFKFOGAFKFOGKFAFJFOGKFAFAHAFAFOGAFKFOGAFKFOGAFOGAFKFOGAFOGJFAFAHAFAFKFOGAFKFOGKFAFOGAFJFAHAFAFOGKFAHAFJFOGAFOGAFAFKFOGAFKFOGAFKFAHAFAFKFAHAFAF", "AFKFAFOGKFAFAFAHKFAFAFOGAFKFOGAFAHJFAFKFOGAFOGKFAFOGAFKFOGAHAFOGKFAFAFAHAFOGKFAFAHJFOGAFAHJFOIEIIGEIIGDIEIDIJGEIDIKDOGKFAFOGAHAFKFAFAFAFAHAFAFAHAFKFOGAFKFOGKFAFOGKFAFKFAFAFAFAFOGKFAFAHAHKFAFAFOGKFAFKFOGKFOGAHAHJFAHAHKFOGAFKFAFOGKFAFAFOGKFAFJFOGAFOGAFOGOGOGAFAFKFCLIOINFGNAMAKBMAMAOALBOAMALACBMALAMAGBHAMAMACBLAMANAFCMAIAKBMAMAFBLBOENIFDKBMAKBOBOCLEKFAFOGAHKFAFAFKFOGAFAFAHAFAFAHAFAFOGKFAFAFOGKFAFAHKFAFOGAFAFAHAFKFOGKFAFOGKFAFKFOGAFAHKFOGAFAFOGAFAFOGKFAFOGAFKFOGKFAFOGJFOGAFKFOGKFOGAFAFKFOGAFAFAHAFJFOGAFAFKFOGKF", "AHAFOGKFAFOGKFAHAFAFOGKFAHAFAFOGKFAFAFOGAFOGKFAFOGAFKFOGAFJFAHAFAFKFOGJFAHAFOGJFAHAFKFAHAFHEBKJGEIDIEIEIIGEIDIDIEGBFAFOGKFAHAFKFOGAFAHAHAFKFOGKFOGAFKFOGAFKFOGAFOGAFAHAFKFAHAHOGAFOGAHOGJFAFKFAHAFAFOGOGAFOGOGOGJFOGJFJFAHAFJFOGAHAFAFKFOGKFAFOGAFGEOGAFOGOGAFAHAHAFAFPKGOOLODHBFBCBCBMANAOBLBLBMAMAMAGBMAHAMAKBBCMAMAMAMAMAKBOALAMALAMAIAODPDNACBLBMAOAPBHEAFOGAFKFAFAHAFOGAFKFAHAFKFOGKFAFOGKFOGAFOGKFAFOGJFOGAFKFOGKFAHAFOGKFAFAHAFAFKFOGAFAFJFOGAFKFOGJFAHAHAFAFOGKFOGAFKFAFOGKFAFAFKFOGAFAFAFKFAHOGAFJFAHAFKFOGAFKFAHOGAFAF", "AFAHAFAFOGKFAFAFAHAHJFAFAFAHKFAFOGAHKFAFAHKFAFOGKFOGAFAFAHAFKFOGAFOGKFAFKFAFAFOGKFAFOGKFAFMIDIEIEIIGEIDIDIIGEIDIEHBDOGKFIDOGAHAFKFOGJFAFAHAFKFAFOGJFAFAFAHAFKFOGBFAFAHNGAFAHNGOGKFAFKFJFAHJFOGKFAFKFAFKFAFBFAFKFOGAFOGAFAFAHOGKFAFAHOGAFKFOGAFKFOGOGAFKFKFKFKFJFAFAFGEGJINPLOBMALAMAMAMAOBCCCCMANAGBHAMAMAMAHAMAHAMAMAMAKBMAMAMALAMAMABBKBOBNBMDHAMAMALBOBHCNGOGAHJFOGKFAFAFOGAFKFOGAFAFOGKFAFOGAFAHKFAFOGKFAFAFAHAFKFOGAFAHJFAFOGKFOGAFOGKFOGKFAFAFAHAFKFAFKFAFAHKFAFOGKFOGAFOGKFAFOGKFAFOGKFOGAFOGJFAFAHAFAHJFOGAFAHAFJFAFAHAF", "JFAFKFOGKFAFNGAHAFKFAFOGKFNGAFAHAFKFOGAFJFOGAFAHAFAFKFOGKFOGAFKFOGKFAFAFOGKFOGKFOGAFKFAFKFEFDIEIIGEIDIEIDIEIIJDIKFOGKFAFOGNGJFAHAFKFAFOGJFOGAFOGKFAFOGKFAHAFOGAFJFAFKFOGOGAFAFKFKFBHDHBGCIDIEIJGEIPIKGEGAIBHKFAFAFKFAFOGOGAHAFAFNGAFKFAFOGAFKFOGOGAFKFBFCGAGGGBKKJKJPIPIBJIHKELBMAMAIAPAPDHGEIDIOIMCNAMAHAKBOBDBDBLBNAKBOAKBOAKBIBODKEHGEIKJPIEIAJDICEMCKEJEKFOGJFAFJFAFAHAFKFOGAFAHAFOGKFAFAHAFOGKFAFOGKFAFOGAHAFKFOGAFAFKFAFKFOGAFKFAHAFAFKFOGAFOGKFOGAFOGAFOGJFOGAFKFOGAFAFKFOGAFAHAFAHAFAFKFOGKFAFAFJFAHAFOGKFAFJFAHAFOGAFJF", "AFOGAFKFOGAFKFAFAHAFAHJFAFAFAHJFAFAFOGKFAFAFAHJFOGKFAFAFOGKFOGAFAFOGKFOGAFOGKFAFAFAHAFOGLFKJDIDIEIIGEIIGEIDIEIEFJFAHAFKFAFOGNGKFAFOGKFAFOGKFOGAFOGKFAFOGJFOGKFAFAHAHAFAFAFKFLFJEDIIGDIAJEIEIIGEIEIEIIJDIIJPICIGGDDBFAFKFAFOGKFAFAFAHAFAHAFAHAFKFAFBHEHOIKJEIDIEIIGJGEIEIIGEIKJIGPDPANBHGEIEIIGEIKJDIODNAMAOAPAMBNAPALBPAPAIBODPEEIEIDIEIDIEIDIEIDIJGIJKJEIGGDHLDAHKFAFKFOGKFAFKFOGJFOGKFAFOGKFAFKFOGAFKFAFOGKFAFOGAFKFOGAHAFOGAFKFOGAFKFOGAFOGKFOGKFAFAHKFAFOGKFAFAFOGAFKFOGOGAFKFOGJFOGKFOGAFOGKFAFOGAHAFKFAFAFOGKFAFAHKFAFAHAF", "AFKFOGAFKFAFOGKFNGAFKFOGAFOGKFAFOGOGKFAFOGKFAHAFKFAFOGOGKFAFAFKFAHAFAFJFAHAFAFAFOGKFAHAFDGIJEIIGDIEIIGEIIGEIDIEGOGAFKFOGAFOGKFAFAHAFAFAHAFAFJFAHAFAFAHAFAFKFAFOGJFAHOGAFKFAGCIKJEIEIDIEIDIDIIJEIIGDIEIIGDIEIEIDIALDHKFAFNGAHAFKFAHAFJFAHAFJFOGAFBGCIKJEIJGEIIGDIEIEIEIIGEIDIDIEIKJDIIGEIDIDIEIDIIGKJBEOBNAMADBCCKCKCPAPACEDIEIEIDIDIIGDIEIIGEIIGEIEIJGJGJGEIKJOIAHKFOGAFKFOGAFOGAFAFKFAFOGKFAFOGAFKFOGAFOGKFAFAHAFKFOGAFJFOGKFOGAFKFOGAFKFOGKFAFAFAFAHAFAFOGKFAFOGAHAFKFOGAFKFOGAFKFAFAFAFKFAHAFAFAHAFJFAHAFAHOGKFAFOGJFAFOGKFAF", "AFAFKFOGAFAHAFOGKFOGAFKFOGKFAFAHKFAFOGAFKFOGAFAHAFOGKFAFOGAFAHAFNGKFOGAFKFOGKFOGKFAFOGBFHGEIDIJGEIDIEIIGEIIGKJLFJFOGAFKFOGKFAFOGJFOGKFAFAHKFAFKFOGKFOGOGAFAHKFJFAFAFAFDHCIJGJGDIIGEIIGEIDIFHHEOGJFJEPJKJJGJGDIJGJGIJBGGEAFNGKFAFAHKFAFOGAHAFGEBGEIDIEIDIJGIGEIEIPJLFBDMIKJDIEIIGDIDIIGEIJGEIDIDIEIDIEFHBMAPAOBCCPBCCPDIGDIEIDIEIJGIGKJEIMCODJCIBCCCIEIEIDIIGEIEIDIAGBFAFOGBFAHJFOGKFAFOGKFAFOGKFOGAFKFOGAFOGKFAFAHAFAFAHAFKFAFOGKFAFOGKFAFOGAFAHAHJFAFAHJFAFOGKFAFKFOGAFAFAHAFKFOGAFAHAHAFAFAHKFOGJFAFOGKFAFJFAFOGAFKFOGAFKFAFOG", "OGKFOGAFOGJFAHAFAFAFKFOGAFAFOGJFAFOGAFKFOGAFAFJFOGKFAFAHAFKFNGAFKFOGAFAHAFOGAFKFAFOGOGDDCIEIDIEIIGDIDIEIEIJGDIPGAFAFKFOGAFAFOGKFAFKFAFOGKFOGAFOGAFAFAHAFOGKFJFOGAFKFDHCIDIDIEIEIEIEIEIOIODKFJFAFAFKFNFCIEIJGIGDIEIEICIPFOGAFAHAFJFAFOGAFJFKFAIPIIGEIEIIGEIJGDICILFADAFGJAMEIIGDIJGJGEIDIBEIGKJDIIGKJEFPALBNAKBOBNAPDHGEIEIIGEIDIEIEIDINBGCOBOBCCKBIBBEEIIGEIDIDIEICINFAHAFAFJFOGKFAFAHAFAFOGKFAFKFOGAFAFOGKFAFOGAFKFOGKFOGAFOGKFAFOGKFAFOGJFAHAFKFAFOGKFAFOGKFAFAHAFAHAFAHAFKFOGAFJFAHAFKFOGJFAFKFAFOGKFAFAHAFAHAFKFOGKFAFOGAFJF", "AFAFAFAHJFAFKFOGAFAHAFKFOGAFKFOGAFKFOGAFKFOGKFAFAFOGKFAFOGAFKFOGAFKFAFKFOGKFOGAFKFAFAFJIDIDIEIDIEIEIIGDIIGEIEGJFKFOGAFAFAHKFAFOGOGAFOGKFAFAFAHKFAFOGKFAFAFOGOGAFAFEHCIEIDIEIDIDIDIDIDIAGKFPCAHNGOGAFJDAGEIEIEIDIEIDIEIOIGEAFNGKFAFAHKFOGADEHPIIJEIDIDIEIIGEIIJNDKFAFAFCLINPIEIJGDIEIEIIGJCJCIGEIEIIGKEDBCCICOAMAJCHGEIEIDIDIEIIGEIIGJCMAMANDOBLBNAKBMCIJEIEIIGEIDIKJOIGEAFAHJFAFOGAFAHKFOGAFOGAFAFAHKFAFKFOGAFAHJFAFAFOGKFAFOGAFOGKFAFOGKFAFAFAHAFAHJFAFOGKFAFOGJFAFKFOGJFOGAFAFAHAFJFOGAFKFOGAFOGKFAFOGKFAFAHJFOGAFAFOGKFAFOGAF", "JFOGKFAHAFAFOGAFKFAHAFOGAFKFOGKFAFOGKFAFOGKFAFAHAHAFAFOGKFOGAFKFOGAFAHOGAFAFKFAFOGAFAFEGDIEIIGEIIGDIEIIGEIKJDHADOGKFAFOGKFAFOGAFKFOGKFAFOGKFAHAFOGAFAFKFOGOGAFKFDHOIEIIGIGEIDIJGJGIJEGKFOGOGOGKFAHAFKFGEDIEIDIJGDIJGJGIJLIJFOGKFAFKFOGJFKFNIIJJGDIDIEIJGJGIJOIGEAFOGAFGJINDIJGDIEIIGEIEIHGNBJCCEIGHGJCOBICNAKBMBDIEIEIDIIGEIDIEIDIPENALAKBOBFDKCLBMAMBIGEIIGEIDIIGEIEIBGKFOGAHAFKFAHAFAFJFAHAFJFAHAFOGKFOGAFOGKFAFOGOGKFAFOGKFAFKFOGAFAHAFAFOGJFOGKFAFOGKFAFOGKFAFAHAFAHAFAFKFOGKFOGAFKFOGAFKFAHAFAFAHAFAFAHAFAFKFAHAHAFAFOGKFAF", "AFAFOGJFOGKFAFAHAFJFOGKFAFOGAFAFAHAFOGKFAFOGAFJFAFAHKFAFOGKFOGAFKFOGJFAFAHAFOGKFAFOGGEOIDIEIDIIGEIEIDIEIIGPIGENGKFAFAHKFAFOGKFAFOGAFAFOGKFAFAFAHNGAHKFAFOGAFAFOHDIIJEIJGEIDIIGEIJGDIPHAFAFAHJFAFNGAHOGKFPIDIIGEIDIIGJGEICILFAFAFOGAFNGAFCGIJEIJGDIDIDIJGEIEIDHADOGIDOGOJGNJGEIIGEIDIIGEIEICEODNANAABKBMANAOAPACIIGEIIGEIEIDIIGEIIGHBNAMAKBMBKCOBLBMANAKGKJIGEIDIEIIGEICILFAFOGKFAFNGKFOGAFKFOGAFKFOGAFAFKFOGJFAFAHKFAFAFOGKFAFOGAFKFOGJFOGKFAFAFAHAFOGKFAFOGAFOGKFAFAHJFOGKFAFAFOGKFOGAFKFOGAFAHKFOGKFOGAFAHJFOGAFKFAFAHAHAFAFAH", "KFAHAFAFKFAFOGKFAFOGKFAFOGAFKFOGKFOGKFAFAHAFAHAFOGKFAFOGKFAFAFAFOGKFAFAFJFOGKFAFAHAFHEDIDIEIIGEIEIIGKJDIEINIJFKFAFAHAFAFOGKFAFOGAFKFOGKFAFOGKFNGAFKFAFAHAFOGGEAGDIJGDIEIEIIGEIEIJGBGKFAFAHADKFOGJFJFOGAFIJJGDIEIDIEIJGJGIJEHAFOGAFJFOGKFAIEIJGIGKJIGEIJGDIOIFEOGNGOGOGMICMDIDIEIDIJGEIIGIJCECCOAOANAMAOBNANAPDDIEIDIEIDIEIIGEIKJBEIBNAICNACCPBODLBKBNAEFEIEIIGDIEIJGJGDIAGAFOGJFAHAFAFKFOGAFKFOGAFJFAHAFOGKFAFAFAHAFAFOGKFAFOGKFOGAFKFOGAFAFKFAHAFOGKFAFOGKFOGKFAFAHAFAFKFAFAHAHAFAFKFOGAFOGAFJFOGAFAFKFOGJFAFKFOGAFAHAFJFAHAFJF", "AFJFOGAFOGKFAFOGKFAFOGAFKFOGAFAFOGKFAFOGJFAFAHKFAFOGAFKFOGAFAHKFAFOGOGKFAFOGAFAHKFOGEHEIDIDIJGEIIGEIDIEIDIAGAFOGAFAHJFOGAFOGKFAFOGAFKFOGAFKFOGJFNGAFAFAHNGAFCGCIJGEIDIDIIGEIEIIGKJIEAFOGJFKFAFKFKFOGJFAFEIIGEIDIDIEIEIJGEIBGGEOGKFOGOGADGHDIJGEIEIDIEIIGEINIBDAHJFIDIDCLFKEIEIDIJGDIEIEIEIPDNANALBLBNAHAOANBDIEIEIDIEIEIIGEIEIIGLBNAKBNALBLBODPBLBKBMADIDIEIDIEIDIEIJGDIBGKFOGAHJFOGAFOGKFAFOGKFOGAFKFOGAFOGKFOGJFOGKFAFOGAFKFAFAFAHAFKFOGOGAFKFAFAFOGAFKFAFAFOGKFAFAHOGAFAHJFAFAHKFAFKFOGKFOGAFKFOGAFOGKFAFOGAFKFOGJFAFAFKFOGAF", "OGAFKFOGKFAFAHAFAFOGAFKFOGAFKFAHAFAFOGKFAFOGKFAFOGAFKFOGAFJFAHAFOGAFKFAFOGKFAHAFAFKFNIEIEIIGEIDIJGEIDIDIEIIEAHAFAHAFAFKFOGKFAFOGKFAFOGAFKFOGAFAFPGAFAFJFOGKFAGEIDIEIDIJGEIEIIGKJNIBFAFAHOGOGAFAHAFAFOGAFDIJGEIDIEIDIDIEIPIFHKFAFAFJFOGJFCIJGDIEIIGEIEIJGKJBGKFNGJFOGOGGJKJDIDIDIEIIGDIIGDIPECCICNAHBGCOAPAPDEIIGDIEIIGEIDIDIDIIGOALBNAKBLBCCOBMCLBMAJAIGDIDIEIDIDIEIJGKJNIKFAFOGAFKFOGKFAFOGAFAFKFOGAFKFAFKFOGAFAFKFAFOGJFAHAFOGOGKFAFOGAFKFAFOGKFOGJFAHAFOGKFAHAFNGAFKFAFJFOGAFJFOGAFOGAFAFKFOGAFKFAHAFAFOGKFOGAFKFAFAHOGAFKFAF", "AFAHAFAFOGKFAFAHAHJFAFOGAFAHAFKFOGAFKFOGAFKFOGAFAHJFOGAFAHAFKFOGKFAFOGAFKFAFNGKFOGBFDIIGEIEIIGEIEIDIJGEIPIJFOGKFAFAHNGAFKFAFOGKFAFAHJFAFOGKFAFAHAFAHOGAFAFKFDIJGEIIGEIDIEIDIJGEIPHKFJFJFAFOGAHJFKFAFOGGEIJEIDIEIIGIJJGEIDIDIAFAHKFOGAFBFKIEIIGEIEIDIIGJGEIHEOGKFNGAFADMIBKEIIGEIEIEIJGDIEIPDCCMAKBABLBPAMBJGEIIGEIIGEIIGEIIGEIPDMAKBMAKBMALBNBODDBNADBEIDIEIDIEIIGKJIGJGCIADOGJFOGAFKFAFOGKFOGAFAFAHAFOGKFAFAFAHAHAFOGKFAFAFAHJFAFOGKFAFAHAFAHAFOGKFAFAFAHAFOGJFOGKFOGAFAHAFKFOGAFKFOGKFOGAFAFKFOGAFKFOGAFKFAFOGKFAFOGKFAFOGAFAH", "KFAFKFAHAFOGJFAHAFAFKFAHAFKFOGAFJFAHAFJFAHAFAFOGKFOGAFAFJFAHAFJFAFAHAFAHOGAFKFOGOGEDDIEIDIDIEIJGDIIGEIDIEGAFAFJFAHAFKFOGAFOGKFAFOGKFAFOGJFAFAHJFKFBFAHKFAHHEDIKJDIEIJGDIEIIGEIDIKFJFKFAFOGAFKFAFKFOGAFLFDIJGKJIGEIEIEIIGEIOIAFJFOGNGAHADBGDIDIEIJGIJEIEIPIHEAFAHOGAFIDFHEIEIJGEIIGJGDIEIIGPDPBNAMAICABLBNBEIDIEIDIEIJGEIDIEIDIIBLBOAMAMAOAMBJCCEODOBNBEIEIIGEIIGDIEIEIEIPIAHOGAFKFOGAFOGKFAFKFAHAFJFOGKFOGAFOGJFAFKFAHAFAFOGKFOGAFKFOGAFKFOGJFOGKFAFAFOGJFOGKFAFAFAFKFOGAFKFOGAFKFOGAFAFKFOGKFOGAFOGAFKFAHAFOGKFAFOGKFOGAFJFAHAF", "AFOGAFKFAFAFOGJFOGKFOGAFAHAFKFOGAFKFOGAFKFOGKFAFAFKFOGAHAFKFOGAFAHJFAFKFAFOGAFAFKFLIEIIGEIEIIGEIEIEIIGIJAGAFOGKFAFNGAFKFOGAFOGAFOGAFAFKFOGAHJFAFOGJFAFKFAFLIKJDIEIJGEIDIEIIGDIDIADJFAFOGAFOGAFAHJFAFAFFGEIDIEIDIJGDIEIJGDIEFAHJFAFAFAHJFLFPIEIIGJGEIDIEIDILFAFOGNGAFJDOIDIIGEIDIEIEIDIEIEFNBPBOBNAKBOANAKEDIEIDIIGEIDIEIJGDIEFNAHBLBOAKBNAPBODPEMCNAMCPIIGEIDIEIEIDIIGJGOIJFOGKFAFAFAHAFOGAFOGKFOGAFKFAFAFAHKFOGAFOGKFAFAHKFAFAFAHAFKFOGAFKFAFAFOGAHKFAFAFKFOGAFAHKFAFAHAFOGKFAFOGAFAHJFAFAFOGKFAFAHAFOGJFAFAFOGAFKFAFAFAHAFKFAF", "AFKFOGAFAHOGKFAFKFAFAFOGKFAFOGKFAFOGAFKFOGAFAFOGKFOGAFJFAHAFOGAFKFOGAFOGKFOGAFKFJFPIEIEIDIEIDIEIIGDIEIPIGEAFOGAFAHAFKFOGAFAFKFAHAFOGKFAFAHAFOGAFOGOGAFAFKFPJEIJGDIEIIGEIDIEIKJBGAHAFOGAFAFKFAHAHAFAHAFOIDIIGDIJGDIEIJGIGKJLIKFAFAFKFNGAFKFBGDIJGEIEIIGDIPICGAFOGOGJFODIJJGEIDIDIEIDIEIDINBOBCCMBLBOAKBKBHGEIDIDIEIEIIGEIIGKJPDNAMAPAMBLBPBKCMCHGMCMBPEDIEIEIIGEIDIJGJGIJEGKFAFAFOGKFAHAFJFAHAFAFKFAHAFOGKFAHAFAFOGKFAFOGJFAFOGKFAHAFOGKFAFOGAFAHAFKFAFOGKFOGAFKFAHAFOGJFAHAFAFOGKFAFKFOGAFOGKFAFOGJFAHAFAFKFOGKFAHAFNGAHAFKFOGAF", "AFAFKFOGJFAFOGAFOGAHKFAFOGKFAFOGKFAFOGAFKFOGAFKFOGAFAHAFKFOGKFOGAFKFOGAFAFKFOGAFHEIJEIIGEIDIIGEIEIIGDICIAFOGAFKFAFAHAFKFOGKFAFAFOGKFAFAHAFOGAFKFBFBFGEKFAFDIJGJGEIIGEIDIIGEIPIHEAFOGAFOGAFAFKFJFAFKFAFDIEIEIIGEIEIDIIGEIDIEHAFAHKFAFAHOGBFPFGGKJJGDIEIJGIJEHKFAFAFDGOIKJJGEIEIDIIGEIIGJCNAMBOBMAKBMAMAMAIGDIDIIGEIDIEIDIEIIGCCMANAOBCCPBFDPBMCOENCCCDIEIDIDIEIIGEIIGEIEILHAFOGKFAFOGJFOGAFKFOGAFAFKFOGAFOGJFOGKFAFAFOGKFAFOGKFAFAFAHJFAFAHJFOGKFOGAFOGKFAFAFAHAFJFOGKFAFKFOGAFAHAFAHAFKFOGKFAFOGKFAFKFOGAFOGKFAFAFAHKFAFAHAFAFAH", "JFAHAFAFOGAFKFAHAFJFAFAHAFAFAHAFAFOGKFOGAFKFAHAFAFAHAFKFOGAFAFKFAFOGAFKFAHAFAHAFBGKJIGEIDIDIEIEIIGEIDIEHAFOGOGAFKFNGAFOGKFAFNGAHAFJFAHKFOGAFKFJEIJDIKJJIGEDIJGEIIGEIDIIGEIEIOIGEOGAFAFKFAHAHOGAFAHAFJEDIEIDIJGDIEIIGEIEIIJPFAFKFAFOGAFJFJFAFMFCIDIEIIGEIKJOIHEDDDGOIIJJGEIIGDIDIKJDIJCHBNANCOBOAMAMAOAJAEIEIEIEIDIDIDIJGDIEIKBMAKBNAMBLBOBKCOBAEKCNBEIIGDIEIIGEIDIJGEIPIPFKFAHAFAHAFAFKFAHAFJFAHOGAFJFAHAFAFKFOGAFOGKFAFAHAFAFKFOGJFAFAHAFAFKFOGAFAFKFOGAFOGJFOGAFKFAFOGAFAHAFKFOGAFKFOGAFAFOGKFAFOGAFKFOGKFOGAFOGKFAFOGJFAHAFJF", "AFJFOGKFAFOGAFKFOGAFAHJFOGKFAFAHAFKFAFOGKFAFOGKFOGJFAFOGKFAFOGAFAHKFAFOGAFAHJFAHCIEIJGJGDIDIIGEIEIJGDIKDOGAHAFAHAFKFOGAFOGAFKFAFAHKFAFOGOGKFHENIJGEIJGJEJFIJEIIGEIDIEIDIJGDIOIAFKFOGAFOGKFAFKFOGJFAFKIEIDIJGEIDIDIJGEIEICIKFKFAFAHAFAFAHOGAFAFKDCIDIDIDIEIDIPICKDIKJEIDIEIEIEIIGIGJCPANAOBHDNCOBKBOAMANADIDIDIJGEIDIEIDIEIEFNACBMANAOANAKBDBNCOCCCHDDIEIEIDIEIIGEIEIDIOIBFAFKFAFKFOGAFAFAHAFOGKFAFOGAFKFOGAFAFKFOGAFOGKFAFAHOGAFKFOGAFAHKFOGAFAFAHAHAFKFOGKFAFOGKFOGAFKFOGJFOGAFKFOGAFAFAHKFAFOGAFKFOGAFAFAFKFOGKFAFOGKFAFAFAHAF", "AHAFAFOGAFKFOGAFKFAHAFAFKFAFOGJFAHAFOGKFAFOGJFOGKFAFAHAFAFOGKFOGJFAFAHAFAFKFOGKFKJIGJGDIEIIGEIEIIGDIIGBFAHNGAFKFOGAFJFAHAFKFOGKFNGAFAFOGOGJFAGKJKJIGIJCHAFPIIGEIEIIGDIEIJGDINIAFAFOHAHAFKFOGAFAFJFAHOIEIJGIGEIJGIJJGDIIGEGAFAFOGKFAHAFJFAHOGOGGEAGPIEIEIIGJGJGEIEIIGEIIGEIDIDIBECCPALBNAABODAEOBOAICNAPAIGEIJGDIDIEIDIEIIGHGNALBNALBMBLBMALBNCNEPBEFEIIGDIJGDIDIEIIGDIEGAFAFOGAHOGAFKFOGKFAFKFOGAFKFOGAFKFAHOGAFKFOGKFAFAHAFKFAFOGKFAFJFOGAFKFAHAFJFAHAFAFOGAFKFOGAFKFOGAFAFKFAHAFAFOGKFAHAFOGAFKFOGAFOGKFAHOGAFAFAHAFAFKFOGJFAF", "AFAHKFAFAHAFKFOGAFKFOGOGAFAHJFAFOGKFAFOGAFKFAFAFOGKFAFAHKFAFOGKFAFAHJFKFOGOGKFDHEIEIDIEIDIEIIGEIEIDIAGBDNGAFOGAFKFAFOGAFOGAFOGAFAFAHOGAFKFAIDIJGEIEIHGOGAFGGEIIGEIEIJGDIEIJGEGPGAFAFKFOGAFKFOGAFAFAIDIJGDIEIIGJGEIJGEIOIMFAFOGKFAFOGOGAFKFHEGGEIDIIJEIIGEIEIDIEIDIEIEFNIAMCMNEMANALBPALBMBPBPBNAMBNAOBNAHGDIEIIGDIEIIGEIDIBEHBMAKBMANANAKBNAODODPDEIEIEIIGEIIGEIFFKJOIMFAFOGAFJFAFAHAFAHAFAHAFKFOGAFKFOGAFKFAFOGAFKFOGAFNGKFOGAFKFOGAFOGKFAFOGJFAFOGKFOGKFAFOGAFAFAHAFKFOGAFOGJFOGKFAFOGJFOGKFAFOGKFAFAFOGJFAFAHJFAFAHNGAFKFAFOG", "AHAFAFJFAHAFOGKFAFOGAFKFAFKFOGAFKFOGAFJFAHOGAFOGKFAFOGKFAFAHAFAFAFAFKFNGAFOGBDCIEIIGDIEIIGDIEIDIEIBKJEKFAHAFJFKFAFAHAFAFKFAHAFKFAHAFAFBFEHPIEIEIIGDIEHAFOGAGJGEIDIJGDIEIIGDIGHJFAHOGAFAFKFAHAFKFKFEGEIJGDIDIEIEIJGEIOIBGADOGOGAFKFAFAFOHEHOIDIJGIGEIDIEGJIBDKFADKFADPCGJIOINFGOBOANAKBHBLBPBJCOBNAOBNAMBJCJGDIEIEIDIDIEIDIBEPAKBMAKBMAKBMALBKCNCIGDIEIIGEIIGEIDIEIPIEHKFAFAFAHAFOGJFOGKFAFJFOGAFKFOGAFKFOGAFOGKFAHAFAFOGKFOGAFKFOGAFOGKFAFOGKFAFAHAFAFKFAFOGAFKFOGJFOGAFKFAHAFAFKFAFAHAFAFKFAFAHAFAFKFOGKFAFOGKFAFAHAFKFOGAFOGJF", "JFAFOGAFKFOGAFOGKFAFOGAFOGAFKFOGAFAFAHAFKFAFAHJFAFOGKFAFOGJFOGKFAFOGOGAFOGNGAGCIDIEIJGDIEIIGEIDIDIIJHEJFAFOGAHKFOGJFOGOGAFKFJFAFAFKFLFGGDIEIDIIGJGEILFKFAFPFDIEIIGEIEIDIDIDIKIOGAFOGKFAFAFAFAHOGJEBKEIDIEIIJDIDIJGDIEGKFJFOGAFAHJFAFKFEHPIKJEIEIJGDIFEJFAFOGNGJFOGOGIDHIIOINGGDBMAMAOAKBPAODPBJCKCCCNCCCJCEIEIIGDIIGJGDIEIBENANAKBOALBOAOANAODEGJGEIDIEIJGEIDIDIIJBGBFAFOGAHJFAHKFAFAFOGAHAFKFOGAFKFOGAFKFOGAFAFAHJFAFKFAFAFAHAFJFOGKFAFOGAFOGKFAFAHNGAFAHKFAFOGKFAFAFAHAFJFOGKFOGAFKFOGAFOGKFAFAHOGAFKFAFOGKFAFOGJFOGAFKFAFAFAF", "AFOGKFAHAFJFAHAFAFAHAFKFAHAFOGKFAFOGKFOGAFKFOGAFKFOGAFKFOGAFKFAFOGAHAFAFNGJFGHEIEIIGDIEIDIEIIGDIDIKGEHPFAFAFOGOGAFOGAFOGAFAFJFAHGENFCIIJEIJGJGEIIGCIKFOGKFJFEFDIEIJGIGEIDIEIOIAFKFAFAFADKFAHKFOGEFEIDIJGIJEIDIJGKJCILFAFOGKFAFNGAFBFPHOIKJJGIGDIIJOILFAFOGOGAHJFAHJFIDIIIOINFHOBMALBOAMALBOBPBOBJCAENCOBCCEFEIIGEIEIEIIGDIDIOBNAKBOBNAOANAOBMCHGEIIGDIDIEIDIDIIJGGPFAFAFAHKFAFKFOGAFAHAFJFOGAFKFAFOGAFAFOGAFKFOGJFAFAHOGAFOGJFOGAFKFAFOGKFAFKFAFOGKFAFOGKFAFOGKFAFOGAHAFKFOGAFAFKFOGAFKFAHAFAFAHAFKFOGAFOGKFAFOGKFAFKFAHAFAHAHAF", "AFKFAFAFAHAFKFOGKFAFAHAFJFOGKFAFAHJFAFAFAHAFKFOGAFKFOGAFKFOGAFOGOGBFKDLFLENIIJIGEIEIDIIGEIDIEIDIJGKJDIBGAIDDKFAFKFKFKFBFKFBHPFJIOIKJEIEIDIIGJGEIEINFKFAFOGBFDJDIDIJGJGDIJGJGCICGAFAFGIOGNGPCPGEHBKDIEIJGJGDIEIEIGGMFADOGOGKFKFAFOGBFBGEIEIIGEIDIJGCIBGGEAFOGAFNGKFAFIDHIGONNLENAMAMAKBMANAMBGCDBMAOALBNAABJCIGKJIGEIDIJGEIIGGCNAMAKBOBOBLBNBHGKJEIDIJGDIIGEIIJGGLFKFAFOGJFKFAFAFKFOGKFAFOGKFOGAFAHJFOGKFAFOGAFKFAFOGKFAFAHKFAFOGKFAFOGAFOGKFOGAFKFAFAHAFAFOGKFAFOGKFAFAHAFAHKFOGAFKFOGAFNGKFOGJFAFOGKFAFOGAFOGKFAFOGAFJFOGJFAFAH", "KFOGAFOGJFAHAFAHAFNGAFKFOGAFAFKFOGAFKFOGJFAHOGAFAFOGKFAFOGAFOGKFAFAGOIDIPIEIEIJGEIIGDIEIDIJGDIEIIGEIEIKJIJKJPIPIEIKJDIEIDIEIDIEIEIEIEIDIDIEIEIDIEILFAFOGAFJFKFBGIJEIEIJGIGEIEIGGAFOGOGOGAFKFBGPIDIEIIGEIIGEIDIGGLFADAHNGAHAFAHAFOGBFGGEIIGEIEIJGJGEIAJCINIJEBFBFOGOGAFHIBOINGGNAMAKBMAHAKBOBOBNAMAHANAOANAIACEDIEIIGEIEIIGKJBENAKBMAOAOBNBJCDIDIEIJGIJJGEIEIEGHEKFAFOGOGKFAFAHAFOGKFAFAHAFAFJFAHAFAFKFOGAFKFAHAFOGKFAFOGKFAFOGKFAFOGKFAFKFOGAFAHAFOGAFKFOGKFOGAFKFOGAFJFAHAFOGKFAFOGAFAHAFOGKFAFOGKFAFOGKFOGKFAFOGKFOGAFKFAFAFJF", "AFAFAHKFAFAFAHJFOGKFOGAFKFOGAFOGKFAFOGKFAFAFKFOGKFAFOGKFAFAHAFOGAFFGEIEIDIJGIGEIDIEIJGDIEIDIJGDIEIIGEIJGJGEIEIJGDIDIKJDIEIDIDIDIIGIGEIIGEIEIDIJGOIDDAHOGAFKFAFKFLICIJGEIDIJGEIDIEGJEKFBFPHGGCIEIEIDIIGJGEIOIEGDDJFAFOGKFAFNGJFAFOGBFNIEIJGEIDIEIDIJGEIEIDIKJDICIDHKDADFJIONNBIICMAMAMANANACCOBABLBNALBOBOAMAPAPDJGEIEIEIIGEIEIKEPAHBNANBKEEIAJIGIGEIEIEIIGPEEDECAFOGAHJFAFAFKFOGAFOGKFAFAHAFOGKFOGAFAFKFOGAFAFAHKFAFOGKFAFOGAFOGAFAHAFAHAFKFAFAHJFAFAHAFAFOGKFAFOGAFAHAFJFAFKFOGKFAFAHJFAFKFOGAFKFAFOGKFAFAFOGAFKFAFOGKFOGAFAHAF", "AFOGKFAFOGJFAHAFAFAFKFOGAFKFOGKFAFAHAFOGAFAHAFAHAFOGAFAFOGKFAFKFJFOIDIEIDIDIEIDIJGDIDIEIIGDIEIIGEIEIJGDIEIEIIGDIEIJGJGIGEIIGEIEIKJKJIGEIEIJGDIEIKIKFOGAFBFOGAFOGJFODDIIJIJDIIGEIEIDIDIDIDIDIEIIGDIEIJGEICIAGJFOGOGOGKFAFAHAFAFAHJFJFGGDIEIJGIGIJEIDIDIDIEIDIEIJGJGKJBKGHFNINFHOBNANAHBNALBOBOBMBMAOAKBMAMANAKBNAACIGIGEIJGDIDIPIEIEIDIEIEIIGDIEIEIDIDIIGMCMCFCBDAHAHAFOGOGKFJFAFOGKFAFOGJFAHAFAFKFAHAFOGAFKFOGJFAFAHAFAFOGKFAFKFOGKFAFJFOGAFOGJFAFAHAFJFAHAFAFOGKFAFJFAHAFAHOGAFAFOGJFAFAHAFAFAHAFOGKFAFOGAFJFAHAFOGKFAFAFOGKFAF", "JFAFAFOGKFAFJFOGKFOGAFKFOGAFAFOGKFAFAHJFAFAHJFAFAHKFOGAFKFOGAFOGEDOIKJDIEIDIDIIJEIJGEIIGEIJGDIEIIGEIDIJGIGEIJGEIIGEIEIJGDIEIIGEIJGJGEIIGEIDIJGDIKFJFJFAFOGAFAFKFOGJFDDLIOIKJEIDIJGDIIGEIDIEIDIEIEIDINIJEJFADOGOGAHAFAFOGKFKFAFBFAFKFKHEIIGJGEIKJIGEIIGEIIGEIIGEIEIEIDIDIEIKJPEIBKBNAHCOANACCOBLBOAKBMAKBOAICNAOBGBNAHDEFKJDIIGEIDIEIJGEIJGEIJGEIEIPEPDCCOBKCOBGEAFJFOGAFAFOGAFAHKFAFOGKFAFAHKFOGAFKFOGAFAHAFKFOGAFAHJFOGAFOGKFAFAFOGAHAFKFOGKFAFOGKFOGAFKFOGKFAFOGKFAFKFOGJFAFAHKFAFOGKFAFAHJFAFAHAFOGKFAFAHAFKFOGAFOGKFOGKFAFOG", "OGAFOGKFAFKFOGAFOGKFAFOGAFKFAHAFAFOGKFAFOGKFAFAHAFAFKFAHAFJFAHAFOGOGNGBDJFKFADJFAFAFJFAFKFAFJFAFKFAFJFAFKFAFJFAFKFAFJFAFJFAFKFAFJFAFAFKFAFJFAFJFPGKFAFOGKFKFOGAFOGOGAFJFKDGEAGBGEIEIKJDIIJDIEFEGHELFDDJFJFAHAHAFJFAFKFKFAFAFOGOGAFOGGEEGJGEIEIIGEIIGEIDIEIDIEIDIDIIGEIJGDIEIKJHGJCNAMAKBOBCCOBOAIAMAMAMAMAKBLBMAMAMANAHBIBJCPEIGDIEIEIDIDIEFGGBEPAIANAHAMAPBOAADAFOGAFAHAFKFOGKFAFOGKFAFAHAFAFJFOGAFAHAFKFOGAFJFAHAFOGKFAFKFOGAFAHAFKFOGAFKFOGAFAHAFKFAFOGKFAFAHAFAFOGAFKFAFOGJFAFOGKFAFOGKFAFOGJFOGKFAFAHAFKFOGAFAFKFOGAFAFAFJF", "AFAHJFAFOGAFKFOGAFAFAHAFAHAFNGKFOGAFAFAHKFAFAHJFOGKFAFOGKFAFKFOGAFOGAFAFAFAFOGAFAHAHAFAHOGNGKFOGOGJFOGAHAFNGOGKFOGAFOGAHJFOGAFAHOGAHNGJFOGKFOGAFJFAFKFAFOGAFKFOGAFOGOGAFAFKFAFAHADJFBFJFADNGJFAFAHAFOGOGOGNGKFKFOGAFAFAFAHNGAFOGOGAFOGDHOIDIJGJGDIEIDIEIDIDIDIEIEIDIEIDIIGEIEIEIPICECCABGCOBMBNAOAKBMAOAKBMAKBKBMALBLBNANAMBPAABHBNANAMBMBIBCCODMBKBOANAICCCOBJDAHKFOGAFAHAFKFAFOGJFAFOGKFOGAFOGKFAFKFOGAFKFOGAFKFAFAFOGKFAFAFAHJFOGAFKFOGAFAFAHJFOGAFAHAFOGKFAFAHAHJFOGAFAHKFAFOGAFOGAFKFOGAFKFAFAFOGAFAHJFOGAFAHKFAFAFAHAHAFAF", "AFKFAFOGKFOGAFKFOGKFAHAFJFAHAFAFKFOGKFOGAFJFOGAFKFAFOGKFOGAFOGKFAFKFKFAHKFAFKFAHAFKFAFJFAFKFAFAFBFOGAFADAHAFKFAFAFAFKFAFAFKFAFJFAFKFAFAFKFAFAFAHAFKFOGAFKFAFOGAFAFKFAFKFAHOGOGAFOGKFAFJFAHAHAFOGAFOGAFOGAFKFAFAFAFAFKFAHNGADKFKFDDPGOGADMFEGPIEIEIDIDIJGDIEIEIIGDIIGDIEIEIEIIGDIEIDICELBPALBNAABKBMAOAMAHAMAMAOAMAKBOAOAKBOALBNAMAKBHBLBPAICFDICOBMANAOAKBIBLBDDAFOGKFAFJFAHAFAHAFAFKFOGAFKFAFKFOGAFOGKFAFOGKFAFOGKFOGKFOGAFOGKFOGAFKFOGAFAFKFAHAFKFAFJFAHAFOGJFAHAFAFKFAHAFAFOGKFAHAFKFOGAFKFOGAFOGKFOGKFAFAFOGJFAFAHAHAFJFOGKF", "AFAFOGKFAFAFAHAFKFOGAFAHAFJFOGKFAFAFOGKFOGAFKFOGAFOGAFAFKFOGAFOGAHAFAFAFOGAHOGOGJFAFOGAFOGAFOGKFAFAFAHOGJFAFOGAFAHAHAFAHAFOGAFOGKFAFOGAFAFOGKFAFAHOGKFAFAFAHKFAFKFAFAHJFAFKFKFAFAFAFAHJFJFAFOGAFKFKFKFJFKFAFAFAFOGAHOGAFAFBHBGBKBKPFJFAHJFKFHENIDIEIJGIGJGIGEIEIDIEIIGEIDIDIEIDIDIEIDINBOANAOBMBKBOAKBMAMAMAMAKBMAMAKBOAMAMANAKCPADBOBCCOBJCMEPBLBKBKBKBMAMACCBDAHAFOGAHAFKFOGJFOGKFOGKFAFOGOGAFKFOGAFAFAHAFOGKFAFOGAFAFAHKFAFOGKFAFOGAFAHAHAFJFOGAFAHAFKFAFAFOGJFAFAHAFJFOGKFAFAFKFOGAFAFAHAFKFOGKFAFAFOGAHKFAFOGKFAFJFOGAFKFAF", "AHAFKFOGAFOGKFOGAFAFAHAFKFOGKFAFOGKFOGAFAFKFOGAFAFJFAHAFOGAFKFAFKFJFAHAFKFKFJFPGAFAFKFAFKFAFKFAFAFKFAFKFAFKFAFKFAFKFAFKFAFKFAFKFAFAFBFAHAFKFAFKFAFKFOGAFOGKFOGAFOGOGAHAFAHAFAFKFAHOGKFAFOGAFKFAFKFAFAFKFNGAHAHAHKFAFOGAFEHNIBJJGKJJEAFAFJFAFOGKFDDAGOIKJDIEIJGIGEIEIEIDIIGDIEIIGEIIGIJCENAMBLBNAOAMAOAKBMAMAMAMALBMANAMAKBNANAMBPBODPBPBOBNCHDMCLBLBMAMALAMAKBBDJFOGAFKFOGAFKFAFKFOGAFAFAHAFAFKFOGAFKFOGJFOGKFAFOGAFKFOGJFAFAHAFAFAFKFOGJFAFKFOGAFKFAHAFOGKFOGKFAFOGKFAFOGKFAFAHAFOGAFKFOGJFOGAFKFOGAFAHAFKFAFOGKFAFOGAFKFAFOGAF", "AFAHAFKFOGKFAFKFOGJFAFAHAFAFOGAFKFOGKFAFOGAFKFOGAHAFKFOGKFOGAFAHAFAFOGAHOGJFAFAFOGAHOGAHOGAHAFAHAHOGAHOGOGOGAHOGAHAFAHOGAHOGAHAFAHAHOGJFOGOGOGOGAFAFAFAHKFAFAFAHAFAFOGAFKFOGOGAFJFAFAFAHKFAFOGKFAFAHOGAFAHJFOGAHJFAHAFPFOIKJEIIGCIHEAFOGOGAHNGAFAHAFKFGEBGCIDIEIIGDIIGEIJGEIDIEIDIJGEICIHBOBMBKBPANAOBNAOBNAOBMAIAKBMAOAMAKBNALBPAABOBOBMBPBNECCCCLBNALBKAABOBLFAFAHAFOGKFAFOGAFAFKFOGAFAHKFOGAFAFAHAFKFAFAFOGKFAFOGAFKFOGAFAHKFOGOGAFKFAFOGAFKFOGAFJFOGAFOGKFAFOGKFAFOGKFAFOGKFOGAFAHAFKFAFOGKFAFAFAHJFOGAFAHKFAFOGKFOGAFAHAFAH", "AFJFOGAFKFAFAFOGKFAFOGJFAHAFJFAHOGAFAFKFAHAFOGAFKFOGAFKFOGAFAFJFAHAFKFAFKFOGAFAFJFAHAFKFAFJFOGOGJFNGAFAFKFAFKFAFJFNGNGAFJFAFJFOGJFOGJFAFAHAFKFAFAHAFAHAFAFKFAHAFKFKFKFAHAFAHAFAHOGAHOGAFAFOGKFAFNGOGKFOGAFAFAFJFOGJFDDGGKJJGIGEIEHKFOGAFKFJFAFKFJFNGOGAHAFBDMFEHDIEIEIIGEIDIEIDIJGEIDIEIPALBNAMBNADBMBKCCCPBMBPAKBMAOALBOAOAOAPALBNALBNAOAOBAENCNBLBOAKACBNAKCGEOGJFAHAFAFOGAFKFOGAFJFAHAFAFJFAHAFJFAHAFAHAHAFAFOGKFAFOGKFAFJFOGAFKFAHAFOGAFKFOGAFOGAFKFAFKFOGAFKFOGAFAHAFKFOGAFKFAFKFOGAFOGKFAFOGKFNGAFKFOGKFAFAFAHAFAFOGKFAFJF", "KFAFAFAHAFOGAHAFAFAHKFAFAFAHAFKFAFAHOGAFKFOGKFAFOGKFAFOGAFAHKFAFJFOGAFOGAFKFOGOGAFKFOGAFAHAFKFAFOGKFOGAFOGAFOGKFAFAFKFOGAFAHAFKFAFAFOGKFAFAHAFAHKFOGKFAFOGAFKFOGAFKFAFJFOGKFAFAHJFAFAHKFOGAFOGKFAFKFAFAFAHKFAFOGKFAFDHBKJGEIEIEIKFBFKFOGKFAFKFAFOGAFKFAFOGAFAFAFKFEGPIJGJGJGEIIGEIDIDIEIMBCCOBPBOBLBDBMBOBCCDBOBPAMBOBPALBNALBOBLBLBNAFCOBKCPDPDNCHBNAABOBOBAEGEKFAFOGKFOGKFAFOGKFOGAFKFOGAFOGKFOGAFKFOGJFAFAHKFAFOGKFAFOGAHAFKFAFOGJFAFAHKFOGAFAHKFOGAFOGAFAFAHAFKFOGJFOGAFKFOGAFOGAFKFOGAFOGAFKFOGAFAHAFAFOGAHJFAFAHKFAFOGAFAF", "OGAFOGJFAHAFJFOGKFOGAFKFOGJFAHAFAHAFJFOGAFKFAFAHAFAFAHAFOGKFAFOGAFKFOGKFOGAFKFAFKFOGAFAFJFAHAFAHAFAFKFOGJFAHAFAFAHOGAFKFOGJFAHAFOGOGKFAFAHAFJFAHAFAFAFOGKFOGAFJFAHAFOGAFKFAFOGKFAFAFKFOGAFOGKFAFOGAFOGKFAHAFOGAFAFKFKHPIJGIGEIEIAFAFOGOGAFKFAFOGAFKFOGAFKFKFAHKFOGFECIEIIGEIDIEIDIIGEIDIHBDBAECCLBNAOANALBNANAHBOANAPALBNANAPAMBNAKBOAABOBMBPBBGOBKBOBNCFDPBPBLFAFOGAFOGAFAFAHAFAFKFOGAFKFOGKFAFAFKFOGAFAFJFAHAFOGKFAFOGAFJFAHAFAHAFAFOGKFOGAFAFKFAFAFAHAFKFAHAFKFOGAFAFKFOGAFAFOGKFOGAFKFAHAFKFOGAFAHAFJFAHAFKFAFOGKFAFAHAFOGKF", "AFAHKFAFAFAHAFKFAFJFOGAFKFAFOGKFAFAHAFKFOGAFOGJFOGKFAFAHJFAFOGKFOGAFAFAFAHKFOGAFOGKFOGKFAFAFAHJFOGKFAFKFAFAHKFOGJFAFOGAFKFAFAFAHKFAFOGKFAFAHAFJFOGKFOGAFAFAHKFAFAFAHJFOGAFOGKFAFOGAHAFKFAFKFOGAFKFOGAFOGJFAFAHKFOGAFAIIJJGJGDIEIKFAFOGOGNGAFOGOGAFAFAFAHOGOGNGOGOGADPIKJJGDIDIEIDIEIDIEFNACCOCPBHAMAMAOANALBNANANAOBOAPALBNAOBLBMBMANAABPBODPBPBOBKBABICOBCCCCDDOGKFOGAFKFOGJFAFAHAFKFOGAFAFOGKFOGAFAFAHKFAFAFAHAFOGKFAFAHAFKFOGJFAFAHKFAFAFAHAHAFAHJFAFAHAFNGKFOGAFAHKFAFAHJFOGKFAFKFOGAFAFAHAFKFAFKFOGAFKFOGAFAHJFAFOGKFAFKFAF", "KFAFAFKFOGJFAHAFOGAFKFOGAFOGKFOGAFJFAHAFAHAFAHAFKFAFOGKFAFAFAHAFAFOGKFOGKFOGAFAFKFOGAFAFOGKFOGAFKFAFOGAFAHAFAFKFAFAHAFKFOGAFOGKFAFAHAFAFOGKFOGAFKFOGAFKFOGKFAFOGKFAHAFAFOGKFAFOGKFAFKFOGAFOGKFAFOGKFAFKFAFOGKFOGAFAFMFEIJGJGEIDICHKFJFOGJFAHKFKFOGOGOGAFAFAFJFKFJFJFPIDIDIEIEIKJIGEIDINBMBPBAEPBOALBNALBLBNAOAOBOBOBMBOBOBPBLBMBNAPAOBCCAEOEAENDODOBLBNALBNAPBCGOGAFAFOGAFKFAFOGKFAFOGKFAFOGKFOGAFOGKFAHAFOGKFNGAFKFOGAFKFOGAFKFAFOGKFOGAFOGKFAFJFAHAFJFAHAFKFOGAFAFJFAFAHAFOGKFAFAFOGAFKFOGJFAHAFOGOGAFKFOGAFKFOGAFJFAHAFAFOGAF", "AFAHAFOGKFAFJFOGKFOGAFKFOGAFAFKFOGAFJFOGJFAFKFOGAFOGKFAFAHAHJFAFAHKFAFAFOGKFOGKFAFAFAHAHJFAFKFOGAFOGKFOGJFOGAFOGKFAFAHAFKFOGKFAFOGJFOGKFAFOGKFOGAFAFAHAFKFAFOGKFAFAFAHKFAFOGAFKFOGAFOGKFOGAFAFAHAFOGKFAFOGKFAFAFOHAFGEOIEIJGEIDIKIKFJFAFOGKFAFAFGEKFKFAHNGKFAFAFKFAGPIEIJGDIIGJGKJEICENACCKCPBEDNALBOBNAOALBMBLBCCNAOBMBOBOBCCNALBIBMBOBJCNEODPBKCOBLBNALBDBPBLFKFOGAFKFOGAFKFAFOGKFAFOGKFAFAFAFAHJFAFAFAHAFOGKFOGAFAFAHAFKFOGAFOGKFAFAFAHJFAFAHAFJFOGAFKFOGAFKFOGAHAFAHJFAFAFOGKFOGAFOGAFKFAFAFAHJFAFAHAFAFAHAFKFOGAFKFOGKFAFOG", "AFJFOGKFAFAFOGKFAFAFOGAFKFAHAFOGAFKFOGAFAFKFOGAFOGKFAFOGAFKFAFOGKFOGAFOGKFAFAFAFAHAHAFKFAFOGAFOGAFKFOGAFAFKFOGKFAFAHAFKFOGAFAFOGKFAFKFAFAHAFAFKFOGAFKFOGAFOGKFAFOGJFAHAFAHAFAHAFJFAHAFAFAFKFOGJFAHAFAFOGKFAFOGKFAHAFAFAGOIKJDIJGKJEGHEAHAFAFAFGIAFAFAFOGAFAFOGKFAGKJDIJGEIIGEIEIEIPECCNALBMBOBDBICNALBOAKBDBMBOBMAOBNAOANANAKBOBIBLBNAMAOANANAMBPBICNAICPAHBOBKDAFAFAHAFAFOGAFOGKFAFOGAFAFKFOGOGKFAFKFOGJFAHAFAFKFAFAHAFKFOGAFOGKFAFOGKFAHAFJFAHAFOGKFAFOGKFAFOGAFJFOGKFAFOGKFOGAFKFAHAFKFOGAFOGKFOGAFKFOGJFAHAFOGAFKFOGAFOGAFJF", "AFAFKFOGAFAHAFOGKFOGKFAFOGJFOGKFAFOGKFOGAFOGKFAFAFOGKFAFAHAFAHJFAFAFAHKFAFOGAHJFAFKFOGAFAHKFAFKFOGAFAFAHKFAFAFOGKFAFOGAFKFOGAFAHAFOGAFAHJFOGAFAFAHKFAFOGKFAFOGAFAHAFJFOGJFAFAHJFAFAHKFOGAFOGKFAFKFOGAFAHAFAHJFAFKFOGAFKFFHEFKJEIJGEIOIGGAIHEKFAFAFOGAFKFLFAIGGOIDIKJJGIGEIJGEIIGCEHBMALBNAOBOBCCPBKCCCMBNAOBNANAABKBNALBNALBNANALBNALBMAKBOAOBCCGDNAHCOAKBNAPBKDOGAHAFAHKFAFOGKFAFOGKFOGOGAFKFAFOGAFOGKFAFKFOGAFOGAHJFAFOGKFAFAFOGAFKFAFAFAHAFKFOGAFOGKFAFOGKFAFAHAFKFAFOGKFAFAFAHAFJFOGAFKFOGKFAFAFAHAFKFOGAFAHJFAFOGAFAHKFAFAF", "OGKFOGAFAHAFKFAFOGKFAFOGAFAFKFAFAHAFAFKFAHAFAFKFOGKFAFOGJFOGKFAFAFOGKFAFOGAFKFAFAHAFAHAFKFOGAFOGAFKFOGKFAFNGAHAFAFOGKFOGAFKFAHAFAFKFOGJFOGAFKFOGKFAFOGKFAFAHAFOGJFAHAFKFAFOGKFAFAHAFAFKFOGKFAFOGAFKFOGJFOGKFAFOGAFOGOGAFJDKIDIJGJGDIEIIJDIEIKJPIKJEIKJKJKJIGDIJGEIIGEIEIDIEIDIPDHBPAOAMAOAOBCCAEOBMBOBOBOBNAOBNALBNAOBPAOBPAOBICNAMAOAKBOAODKECENEKCOAMAKBPAAEDHKFAFAHAFOGAFKFAFAFAHAFAFJFAHAFAHAFOGKFAFOGAFKFAHAFJFAFAHAFAFAHAHAFKFOGAFOGKFOGAFKFOGKFAFAHAFAFOGAFKFOGAFAHAFKFOGJFOGAFKFOGAFKFOGAFAHAFKFOGAFAFKFAFKFAHAFJFAFAHAF", "AFAFAFAHJFOGAFAHAFAFAHKFOGAFOGAFAHKFOGAFKFOGAFOGKFAFOGKFAFAFOGAHKFAFOGKFAFAHAFAHJFOGJFAFOGKFOGAFAHAFKFOGAFKFAFAHNGKFAFOGKFAFNGKFOGAFKFAFAFAHAFAFOGAFAHAFAHJFAFKFAFOGKFOGAFKFOGAFAHJFOGAFAFOGKFAFOGAFKFAFAFOGKFAFAHKFAFAFKFADLFPHIJEIDIEIJGEIJGJGJGEIEIIGEIKJEIDIDIKJOIPIDMAMHHPANALBOBLBOBOBOBCCOAKBMAMAMANAOADBNALBMBPBLBCCMBHBOALBNAABCCJCHDOIGGNDABOBABICAEOBJFAFOGKFAFAHAFOGAHJFOGKFAFAFAHJFAFKFOGAFAHAFOGJFAFOGKFAFAHJFAFKFOGAFKFOGJFAFOGKFAFAFOGKFAFAHAHJFAFOGKFOGJFAFOGKFAFAFAHAFKFOGAFAFAHJFOGAFKFOGAHAFOGAFKFOGAFAHJFAF", "AFKFOGJFAFKFAHAFKFAHAFAFKFOGKFAHAFAFKFOGAFKFAHAFAFOGKFOGAFAHAFKFAFOGKFAFAHAFJFOGAFKFAFAHAFAFKFAFJFOGAFKFAFOGJFAHAFAFOGKFAFOGKFOGAFKFOGAFOGJFOGKFAHAFJFOGJFAFAHAFAHAFAFJFAHAFAFOGJFOGKFAFOGKFAFOGKFAFOGKFAHAFAFOGKFOGAFOGAFAFJFKFBFKFHEEHEGCIKJEIDIEIDIEIDIIJEFKEBGDHLCDHGNINFHNANADBLBNALBOBOBDBKBOANANAKBOBPALBNAKBHDGHJCLBPALBNAOAOBLBMBLBOBNCNEPBEDPBEDOBPBKBAFKFAFOGAFKFOGAFJFAFKFOGAFOGKFAFAHOGAFAFJFOGKFAFOGKFAFOGKFAFOGAFKFOGAFKFOGAFKFOGAFOGKFAFOGAFKFAFAHAFAFKFAFAHAFAFKFOGJFAHAFAFOGJFAHAFKFAFOGAFJFOGKFOGAFKFOGKFAFAF", "AFOGKFAFOGAFKFOGAFNGKFOGAFKFAFNGKFOGAFAFAHAFNGKFOGAFAFKFOGJFOGAFOGKFAFOGJFOGAFKFOGAFAHJFOGAFOGKFAFOGKFOGKFAFOGJFAFAHAFOGAFKFAFAFAHAFAFAHKFAFAFOGKFOGAFKFAFOGKFOGKFOGAFOGKFOGKFAFAFAFOGKFAFOGAFKFOGAFKFOGJFAFAHKFOGAFAHAFOGKFAFJFJFKFKFJFJFKFAFJFAFADKFPCJFKFOGAFKFAFIDHIIOIOFGOANALBNALBNAOBOBMBOANAOBOANALBMBHBOANAGGHHOBMAMANALBNAKBNANAPANANDLEMBNALBNANAFDMBADAFOGAFAHAFKFOGAFOGAFKFOGKFAFAHJFAFAHAHAFKFAFOGKFAFOGKFAFOGKFOGAFKFOGAFAFAHAFKFOGKFAFOGKFOGAFAHJFOGKFAFOGKFOGAFOGKFAFAFAHKFAFOGJFOGAFAHKFAFAFKFAFOGKFAFOGAFAHKF", "AHAFAFOGKFOGAFJFAHAFOGKFAFOGAFKFOGAFOGKFNGAFKFOGAFKFAHAFOGAFKFAFKFOGAFAHAFKFOGAFJFAHAFAFKFOGKFAFOGKFOGAFAFOGKFAFOGJFAHAFKFOGAFOGJFOGKFAHAFKFAHAFAFKFAHAFOGKFOGAFAFKFAHAFAFKFAFOGKFOGKFAFOGAFKFOGAFKFOGAFAFAHAFAFJFAHAFAFOGAFKFAFOGAFOGAFOGAFOGAFKFAHJFNGAHAFOGAFOGOGAFHIBOJNHHDBOAMBLBNAMBFCCCOBOBNANALBNAMBPALBNAOAFHHKKCMAKBOANANANADBOBMBICNCNCOBLBNAOAMBODCCADKFOGOGJFAFOGAFAHAFKFOGAFAFOGKFAFAHAFJFAHAFOGKFAFOGKFOGAFAHAFKFAFOGKFAFAHAFKFOGAFAFKFOGAFJFOGKFAFAFOGKFOGAFKFAHAFAFOGKFAHAFAHAFAFKFOGJFAFAHOGAFOGKFAFOGKFOGJFAF", "JFAFAHKFAFAHAFOGJFAFKFAFOGKFOGAFAFAHJFAFAFAHAFKFOGAFAFAHKFOGAFOGAFKFOGJFAFOGKFOGAFKFOGAFAFKFOGAFAFOGKFAFOGKFAFOGKFAFKFOGAFAFAHKFAFAFOGJFOGAFAHJFOGAFKFOGAFAFKFOGAFOGKFOGAFOGKFAFOGAFOGKFAFOGAFAHAFOGKFOGKFAFAHKFAFKFOGAFAFOGAFAFAHNGAHJFAFAHKFAFAFAFAHJFJFOGKFAFAHAFIDDHNNJOGHCCKBOALBNANAOBOBCCOBLBPANALBJAKBNALBKBOCHKICMAMAKBNAKCPBOBODMCKCGDNDOAOAMAMAMAOBOBJFAFAFAHKFAFKFOGKFAFOGKFAFOGKFAFOGKFAFAFKFOGAFOGAFKFAFAFAHJFOGAFAHAFOGKFAFOGAFKFOGAFOGKFAFOGKFAFAHKFAFOGKFAFOGJFOGKFAFOGJFAFAHKFAFOGAFAFAHJFAFOGKFAFOGKFAFAFOGAF", "AFAHAFAFOGJFOGKFAFAHAFAHAFAFKFAFOGKFAFAFOGKFAFOGAFJFAHAFAFKFOGAFKFOGAFAFOGKFAFAFOGAFKFAHAFOGAFKFAHAFAFAHAFAFOGKFAFOGAFKFOGAFKFOGAFOGKFAFAFAHAFAFKFOGAFAFKFOGAFJFAHAFAFKFAHAFOGAFKFAHAFAFKFAHAFJFOGKFAFAFOGAFJFOGAFOGKFAHOGAFAFOGAFKFAFAFOGJFOGNGAHAHKFOGAFKFAFOGJFNGIDGJNNIOBIOBNALBPALBOAMBJCAECCDBLBMBNAOAKBOBNAMABGHHODFBLBMANAKBOBLBPAOBOBKCKCLBMACBMAKBEDOBBFKFOGAFJFAHAFOGAFAHAFAFOGKFAFOGKFAFOGKFOGAFAHAFKFOGAFOGJFOGAFAFJFAHAFAFOGKFOGAFJFAHAFAFAHAFAFAHAFAFAHAFAFOGAFAFKFAFAHAFAFOGKFAFOGAFKFOGKFAFOGKFAFOGKFOGAFAHAFKF", "AFKFOGAFKFAFAFOGKFAFOGJFOGAFOGKFAFOGAFAHKFAFOGKFAFOGJFAFOGAFKFAFOGAFAHKFAFAFOGKFAFOGAFKFOGAFOGAFKFOGAFKFOGAFAFOGKFAFOGAFKFOGAFAFAHJFAFOGKFAFAHAFAFKFOGAFOGKFAFOGJFAFOGAFKFAFAFOGAFKFOGAFOGKFAFAFAFOGKFAFAFAHAFAFAHAFAFAHKFAHAHKFOGAFOGAHKFOGAFAHJFAFAFKFOGAFAFKFAFOGIDPFIOINFGHAABOBLBNALBOBAEMCNANANAOAKBOAOANAOAIANECKKCMAMANALBNAOAMAMANANANCGDOAMAKBMAOAMBLBBDOGAFAHJFKFAFAHAFJFOGAFKFAFOGAFAFOGKFAFAFAHJFAFOGAFAHKFAFAFAHKFAFAFAHJFAFAFAHAFOGKFAFOGJFAFOGJFOGKFAFAHAFKFOGAFOGAFKFOGAFKFAFOGKFAFOGAFAFOGKFAFOGAFAFKFOGJFAFOG", "OGAFAFKFOGAFAHAFAFOGAFAFKFAHAFAFAFJFAHAFAFOGKFAFOGAFAFAFKFOGAFOGAFAFKFAFAFOGAFOGAFKFAFOGAFAFKFOGAFAFKFOGAFKFAHAFAFAFKFOGAFAFJFAHAFAFOGKFAFOGAFKFOGAFAFAHAFAFOGAFAFOGKFAFAFOGAFKFOGAFAFAHAFAFOGKFAHAFOGAFOGKFAFOGKFAFAFKFAFKFAFAFKFOGKFKFAFAFAFKFOGAFOGOGAFAFAHAFOGAFIDDHNNINEGPBOBLBOBOBABDBMCMCMBLBLBOBNAABNALBDBNAHDOIPBOBNAKCNADBLBOBMBNAOBLEHDOBOBLBMBMBKCJCJFBFOGJFAHAFAFJFOGAFKFOGAFOGKFAFOGKFAFOGAFJFAFAHAFAFKFAFOGAFJFOGAFOGKFAFOGAFJFAHAFAFOGKFAFAHAFAFKFAFOGAFKFOGAFAFKFOGAFKFOGAFOGKFAFAFAFOGAFKFAFOGAFKFOGAFKFAFAFAF", }; ucblogo-6.1/ucblogo.dsw0000775000175000017500000000103313557147341013275 0ustar jjcjjcMicrosoft Developer Studio Workspace File, Format Version 6.00 # WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! ############################################################################### Project: "ucblogo"=".\ucblogo.dsp" - Package Owner=<4> Package=<5> {{{ }}} Package=<4> {{{ }}} ############################################################################### Global: Package=<5> {{{ }}} Package=<3> {{{ }}} ############################################################################### ucblogo-6.1/ucblogo.dsp0000775000175000017500000001553713557147341013304 0ustar jjcjjc# Microsoft Developer Studio Project File - Name="ucblogo" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 CFG=ucblogo - Win32 Debug !MESSAGE This is not a valid makefile. To build this project using NMAKE, !MESSAGE use the Export Makefile command and run !MESSAGE !MESSAGE NMAKE /f "ucblogo.mak". !MESSAGE !MESSAGE You can specify a configuration when running NMAKE !MESSAGE by defining the macro CFG on the command line. For example: !MESSAGE !MESSAGE NMAKE /f "ucblogo.mak" CFG="ucblogo - Win32 Debug" !MESSAGE !MESSAGE Possible choices for configuration are: !MESSAGE !MESSAGE "ucblogo - Win32 Release" (based on "Win32 (x86) Application") !MESSAGE "ucblogo - Win32 Debug" (based on "Win32 (x86) Application") !MESSAGE # Begin Project # PROP AllowPerConfigDependencies 0 # PROP Scc_ProjName "" # PROP Scc_LocalPath "" CPP=cl.exe MTL=midl.exe RSC=rc.exe !IF "$(CFG)" == "ucblogo - Win32 Release" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 0 # PROP BASE Output_Dir "Release" # PROP BASE Intermediate_Dir "Release" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 0 # PROP Output_Dir "Release" # PROP Intermediate_Dir "Release" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD CPP /nologo /MDd /W3 /GX /Od /I "C:\wxWidgets-2.8.8\include" /I "C:\wxWidgets-2.8.8\lib\vc_lib\mswd" /D WINVER=0x400 /D wxUSE_GUI=1 /D "__WXDEBUG__" /D "HAVE_WX" /D "__WXMSW__" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /c # ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /d "NDEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 # ADD LINK32 wxmsw28d_core.lib wxmsw28d_html.lib wxbase28d.lib comctl32.lib rpcrt4.lib winmm.lib advapi32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 /libpath:"C:\wxWidgets-2.8.8\lib\vc_lib" !ELSEIF "$(CFG)" == "ucblogo - Win32 Debug" # PROP BASE Use_MFC 0 # PROP BASE Use_Debug_Libraries 1 # PROP BASE Output_Dir "Debug" # PROP BASE Intermediate_Dir "Debug" # PROP BASE Target_Dir "" # PROP Use_MFC 0 # PROP Use_Debug_Libraries 1 # PROP Output_Dir "Debug" # PROP Intermediate_Dir "Debug" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /YX /FD /GZ /c # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /I "C:\wxWidgets-2.8.8\include" /I "C:\wxWidgets-2.8.8\lib\vc_lib\mswd" /D WINVER=0x400 /D wxUSE_GUI=1 /D "__WXDEBUG__" /D "HAVE_WX" /D "__WXMSW__" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /FR /YX /FD /GZ /c # ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /d "_DEBUG" BSC32=bscmake.exe # ADD BASE BSC32 /nologo # ADD BSC32 /nologo LINK32=link.exe # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept # ADD LINK32 wxmsw28d_core.lib wxmsw28d_html.lib wxbase28d.lib comctl32.lib rpcrt4.lib winmm.lib advapi32.lib wsock32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept /libpath:"C:\wxWidgets-2.8.8\lib\vc_lib" !ENDIF # Begin Target # Name "ucblogo - Win32 Release" # Name "ucblogo - Win32 Debug" # Begin Group "Source Files" # PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" # Begin Source File SOURCE=.\coms.c # End Source File # Begin Source File SOURCE=.\error.c # End Source File # Begin Source File SOURCE=.\eval.c # End Source File # Begin Source File SOURCE=.\files.c # End Source File # Begin Source File SOURCE=.\graphics.c # End Source File # Begin Source File SOURCE=.\init.c # End Source File # Begin Source File SOURCE=.\intern.c # End Source File # Begin Source File SOURCE=.\libloc.c # End Source File # Begin Source File SOURCE=.\lists.c # End Source File # Begin Source File SOURCE=.\logodata.c # End Source File # Begin Source File SOURCE=.\main.c # End Source File # Begin Source File SOURCE=.\makehelp.c # End Source File # Begin Source File SOURCE=.\math.c # End Source File # Begin Source File SOURCE=.\mem.c # End Source File # Begin Source File SOURCE=.\obj.c # End Source File # Begin Source File SOURCE=.\paren.c # End Source File # Begin Source File SOURCE=.\parse.c # End Source File # Begin Source File SOURCE=.\print.c # End Source File # Begin Source File SOURCE=.\svn.c # End Source File # Begin Source File SOURCE=.\TextEditor.cpp # End Source File # Begin Source File SOURCE=.\wrksp.c # End Source File # Begin Source File SOURCE=.\wxMain.cpp # End Source File # Begin Source File SOURCE=.\wxterm.c # End Source File # Begin Source File SOURCE=.\wxTerminal.cpp # End Source File # Begin Source File SOURCE=.\wxTurtleGraphics.cpp # End Source File # End Group # Begin Group "Header Files" # PROP Default_Filter "h;hpp;hxx;hm;inl" # Begin Source File SOURCE=.\globals.h # End Source File # Begin Source File SOURCE=.\gpl_text.h # End Source File # Begin Source File SOURCE=.\logo.h # End Source File # Begin Source File SOURCE=.\LogoFrame.h # End Source File # Begin Source File SOURCE=.\macterm.h # End Source File # Begin Source File SOURCE=.\nographics.h # End Source File # Begin Source File SOURCE=.\TextEditor.h # End Source File # Begin Source File SOURCE=.\win32trm.h # End Source File # Begin Source File SOURCE=.\wxGlobals.h # End Source File # Begin Source File SOURCE=.\wxGraphics.h # End Source File # Begin Source File SOURCE=.\wxMain.h # End Source File # Begin Source File SOURCE=.\wxTerminal.h # End Source File # Begin Source File SOURCE=.\wxTurtleGraphics.h # End Source File # Begin Source File SOURCE=.\xgraphics.h # End Source File # Begin Source File SOURCE=.\ztcterm.h # End Source File # End Group # Begin Group "Resource Files" # PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" # End Group # End Target # End Project ucblogo-6.1/ucblogo.bmp0000664000175000017500000020206613557147341013264 0ustar jjcjjcBM66(  @@@@@@@ʦȤ' : N bu!!$$88IIYYjjzz': N bu!!$$88IIYYjjzz'' :: NNbbuu!$8IYjz ': )N 7bEuS`n|!$8IYjz'':: NN bbuu!$8IYjz $ 7 +I5\@nKV`k!v$8IYjz' : Nbu!!$$88IIYYjjzz %$8!0J)<]2Hp:TB`KlSx[o{0($H<6`PH}u(!-<2 *\/$/ lrun coms.c /^NODE *lrun(NODE *args) { \/* macroized *\/$/ lrunparse parse.c /^NODE *lrunparse(NODE *args) {$/ lrunresult coms.c /^NODE *lrunresult(NODE *args) {$/ lsave files.c /^NODE *lsave(NODE *arg) {$/ lsavepict graphics.c /^NODE *lsavepict(NODE *args) {$/ lscreenmode graphics.c /^NODE *lscreenmode(NODE *args) {$/ lscrunch graphics.c /^NODE *lscrunch(NODE *args) {$/ lsentence lists.c /^NODE *lsentence(NODE *args) {$/ lsetbackground graphics.c /^NODE *lsetbackground(NODE *arg) {$/ lsetcslsloc files.c /^NODE *lsetcslsloc(NODE *args) {$/ lsetcursor wxterm.c /^NODE *lsetcursor(NODE *args) {$/ lseteditor files.c /^NODE *lseteditor(NODE *args) {$/ lsetfont wxterm.c /^NODE *lsetfont(NODE *arg) {$/ lsetheading graphics.c /^NODE *lsetheading(NODE *arg) {$/ lsethelploc files.c /^NODE *lsethelploc(NODE *args) {$/ lsetitem lists.c /^NODE *lsetitem(NODE *args) {$/ lsetlabelheight wxterm.c /^NODE *lsetlabelheight(NODE *arg) {$/ lsetlibloc files.c /^NODE *lsetlibloc(NODE *args) {$/ lsetmargins wxterm.c /^NODE *lsetmargins(NODE *args) {$/ lsetpalette graphics.c /^NODE *lsetpalette(NODE *args) {$/ lsetpencolor graphics.c /^NODE *lsetpencolor(NODE *arg) {$/ lsetpenpattern graphics.c /^NODE *lsetpenpattern(NODE *args) { $/ lsetpensize graphics.c /^NODE *lsetpensize(NODE *args) {$/ lsetpos graphics.c /^NODE *lsetpos(NODE *args) {$/ lsetprefix files.c /^NODE *lsetprefix(NODE *args) {$/ lsetread files.c /^NODE *lsetread(NODE *arg) {$/ lsetreadpos files.c /^NODE *lsetreadpos(NODE *arg) {$/ lsetscrunch graphics.c /^NODE *lsetscrunch(NODE *args) {$/ lsetsegsz mem.c /^NODE *lsetsegsz(NODE *args) {$/ lsettemploc files.c /^NODE *lsettemploc(NODE *args) {$/ lsettextsize wxterm.c /^NODE *lsettextsize(NODE *arg) {$/ lsetwrite files.c /^NODE *lsetwrite(NODE *arg) {$/ lsetwritepos files.c /^NODE *lsetwritepos(NODE *arg) {$/ lsetx graphics.c /^NODE *lsetx(NODE *args) {$/ lsetxy graphics.c /^NODE *lsetxy(NODE *args) {$/ lsety graphics.c /^NODE *lsety(NODE *args) {$/ lshell coms.c /^NODE *lshell(NODE *args) {$/ lshow print.c /^NODE *lshow(NODE *args) {$/ lshownp graphics.c /^NODE *lshownp(NODE *args) {$/ lshowturtle graphics.c /^NODE *lshowturtle(NODE *args) {$/ lsin math.c /^NODE *lsin(NODE *args) {$/ lsplitscreen graphics.c /^NODE *lsplitscreen(NODE *args) {$/ lsqrt math.c /^NODE *lsqrt(NODE *args) {$/ lstandout wxterm.c /^NODE *lstandout(NODE *args) {$/ lstep wrksp.c /^NODE *lstep(NODE *arg) {$/ lstepped wrksp.c /^NODE *lstepped(NODE *args) {$/ lsteppedp wrksp.c /^NODE *lsteppedp(NODE *arg) {$/ lstop coms.c /^NODE *lstop(NODE *args) {$/ lsub math.c /^NODE *lsub(NODE *args) {$/ lsubstringp lists.c /^NODE *lsubstringp(NODE *args) {$/ ltag coms.c /^NODE *ltag(NODE *args) {$/ ltest coms.c /^NODE *ltest(NODE *args) {$/ ltext wrksp.c /^NODE *ltext(NODE *args) {$/ ltextscreen graphics.c /^NODE *ltextscreen(NODE *args) {$/ ltextsize wxterm.c /^NODE *ltextsize(NODE *arg) {$/ lthing wrksp.c /^NODE *lthing(NODE *args) {$/ lthrow coms.c /^NODE *lthrow(NODE *arg) {$/ ltone graphics.c /^NODE *ltone(NODE *args) {$/ ltowards graphics.c /^NODE *ltowards(NODE *args) {$/ ltrace wrksp.c /^NODE *ltrace(NODE *arg) {$/ ltraced wrksp.c /^NODE *ltraced(NODE *args) {$/ ltracedp wrksp.c /^NODE *ltracedp(NODE *arg) {$/ lturtlemode graphics.c /^NODE *lturtlemode(NODE *args) {$/ ltype print.c /^NODE *ltype(NODE *args) {$/ lunbury wrksp.c /^NODE *lunbury(NODE *arg) {$/ lunstep wrksp.c /^NODE *lunstep(NODE *arg) {$/ luntrace wrksp.c /^NODE *luntrace(NODE *arg) {$/ luppercase logodata.c /^NODE *luppercase(NODE *args) {$/ lvbarredp lists.c /^NODE *lvbarredp(NODE *args) {$/ lwait coms.c /^NODE *lwait(NODE *args) {$/ lwindow graphics.c /^NODE *lwindow(NODE *args) {$/ lword lists.c /^NODE *lword(NODE *args) {$/ lwordp lists.c /^NODE *lwordp(NODE *arg) {$/ lwrap graphics.c /^NODE *lwrap(NODE *args) {$/ lwritepos files.c /^NODE *lwritepos(NODE *args) {$/ lwriter files.c /^NODE *lwriter(NODE *args) {$/ m_memDC wxTurtleGraphics.cpp /^wxMemoryDC *m_memDC;$/ mac logo.h /^#define mac$/ make_array logodata.c /^NODE *make_array(FIXNUM len) {$/ make_case intern.c /^NODE *make_case(NODE *casestrnd, NODE *obj) {$/ make_caseobj logodata.c /^NODE *make_caseobj(NODE *cstrnd, NODE *obj) {$/ make_colon logodata.c /^NODE *make_colon(NODE *cnd) {$/ make_cont coms.c /^NODE *make_cont(enum labels cont, NODE *val) {$/ make_floatnode logodata.c /^NODE *make_floatnode(FLONUM f) {$/ make_instance intern.c /^NODE *make_instance(NODE *casend, NODE *lownd) {$/ make_intnode logodata.c /^NODE *make_intnode(FIXNUM i) {$/ make_line paren.c /^void make_line(NODE *tree, NODE *line) {$/ make_object intern.c /^NODE *make_object(NODE *canonical, NODE *oproc, NODE *val,$/ make_procnode wrksp.c /^NODE *make_procnode(NODE *lst, NODE *wrds, int min, int df, int max) {$/ make_quote logodata.c /^NODE *make_quote(NODE *qnd) {$/ make_rgbnode graphics.c /^NODE *make_rgbnode(unsigned int val) {$/ make_runparse logodata.c /^void make_runparse(NODE *ndi) {$/ make_static_strnode logodata.c /^NODE *make_static_strnode(char *strptr) {$/ make_strnode logodata.c /^NODE *make_strnode(char *strptr, struct string_block *strhead, int len,$/ make_tree paren.c /^void make_tree(NODE *list) {$/ make_tree_from_body paren.c /^void make_tree_from_body(NODE *body) {$/ map_oblist intern.c /^void map_oblist(void (*fcn)()) {$/ mark mem.c /^void mark(NODE* nd) {$/ mark_gc logo.h /^ long int mark_gc; \/* when marked *\/$/ mark_gcstack mem.c /^NODE **mark_gcstack = gcstack;$/ mark_gen_gc mem.c /^int mark_gen_gc;$/ math_init math.c /^void math_init() {$/ matherr math.c /^int matherr(struct exception *x) {$/ max_gen mem.c /^int next_gen_gc = 0, max_gen = 0;$/ max_palette_slot graphics.c /^int max_palette_slot = 0;$/ maxargs init.c /^ short maxargs;$/ maxargs__procnode logo.h /^#define maxargs__procnode(/ maybe_quote logodata.c /^NODE *maybe_quote(NODE *nd) {$/ mem_allocated mem.c /^long int mem_allocated = 0, mem_freed = 0;$/ mem_freed mem.c /^long int mem_allocated = 0, mem_freed = 0;$/ mem_max mem.c /^long int mem_nodes = 0, mem_max = 0; \/* for Logo NODES primitive *\/$/ mem_nodes mem.c /^long int mem_nodes = 0, mem_max = 0; \/* for Logo NODES primitive *\/$/ memberp_help lists.c /^NODE *memberp_help(NODE *args, BOOLEAN notp, BOOLEAN substr) {$/ mend_nosemi logodata.c /^char *mend_nosemi(char *s1, char *s2, int n) {$/ mend_strnzcpy logodata.c /^char *mend_strnzcpy(char *s1, char *s2, int n) {$/ menuBar wxTerminal.cpp /^wxMenuBar* menuBar;$/ merge wrksp.c /^NODE *merge(NODE *a, NODE *b) {$/ mergepairs wrksp.c /^void mergepairs(NODE *nd) {$/ mergesrt wrksp.c /^NODE *mergesrt(NODE *nd) { \/* spelled funny to avoid library conflict *\/$/ message_texts error.c /^char *message_texts[MAX_MESSAGE+NUM_WORDS];$/ minargs init.c /^ short minargs;$/ minargs__procnode logo.h /^#define minargs__procnode(/ missing_alphabetic paren.c /^NODE *missing_alphabetic, *missing_numeric;$/ missing_numeric paren.c /^NODE *missing_alphabetic, *missing_numeric;$/ missing_space paren.c /^int missing_space(NODE *name) {$/ mmark mem.c /^#define mmark(/ mode_type logo.h /^typedef enum {wrapmode, fencemode, windowmode} mode_type;$/ mousePosition_x wxTurtleGraphics.cpp /^int TurtleCanvas::mousePosition_x;$/ mousePosition_y wxTurtleGraphics.cpp /^int TurtleCanvas::mousePosition_y;$/ mouse_click globals.h /^#define mouse_click / mouse_down main.c /^RETSIGTYPE mouse_down(int sig)$/ mouse_down_last wxTurtleGraphics.cpp /^int TurtleCanvas::mouse_down_last;$/ mouse_down_left wxTurtleGraphics.cpp /^int TurtleCanvas::mouse_down_left;$/ mouse_down_middle wxTurtleGraphics.cpp /^int TurtleCanvas::mouse_down_middle;$/ mouse_down_right wxTurtleGraphics.cpp /^int TurtleCanvas::mouse_down_right;$/ mouse_x xgraphics.h /^#define mouse_x / mouse_y xgraphics.h /^#define mouse_y / move_to xgraphics.h /^#define move_to(/ ms_listlist wrksp.c /^void ms_listlist(NODE *nd) {$/ my_gen logo.h /^ int my_gen; \/* Nodes's Generation *\/ \/*GC*\/$/ mypoint graphics.c /^struct mypoint {$/ n_array logo.h /^#define n_array / n_car logo.h /^#define n_car / n_cdr logo.h /^#define n_cdr / n_dim logo.h /^#define n_dim / n_float logo.h /^#define n_float / n_head logo.h /^#define n_head / n_int logo.h /^#define n_int / n_len logo.h /^#define n_len / n_obj logo.h /^#define n_obj / n_org logo.h /^#define n_org / n_parent logo.h /^#define n_parent / n_parents logo.h /^#define n_parents / n_pdef logo.h /^#define n_pdef / n_pfun logo.h /^#define n_pfun / n_pmax logo.h /^#define n_pmax / n_pmin logo.h /^#define n_pmin / n_ppri logo.h /^#define n_ppri / n_procname logo.h /^#define n_procname / n_procs logo.h /^#define n_procs / n_str logo.h /^#define n_str / n_vars logo.h /^#define n_vars / name init.c /^ char *name;$/ nameBuffer wxMain.cpp /^char nameBuffer [NAME_BUFFER_SIZE];$/ nameBufferSize wxMain.cpp /^int nameBufferSize = 0;$/ name_arg wrksp.c /^NODE *name_arg(NODE *args) {$/ narray logo.h /^ } narray;$/ narray_data logo.h /^ struct logo_node **narray_data;$/ narray_dim logo.h /^ FIXNUM narray_dim;$/ narray_origin logo.h /^ FIXNUM narray_origin;$/ ncar logo.h /^ struct logo_node *ncar;$/ ncdr logo.h /^ struct logo_node *ncdr;$/ ncons logo.h /^ } ncons;$/ ndef_args logo.h /^ short ndef_args;$/ ndprintf print.c /^void ndprintf(FILE *strm, char *fmt, ...) {$/ needToRefresh wxMain.cpp /^int needToRefresh = 0;$/ need_save files.c /^int need_save = 0; \/* nonzero if workspace changed since save *\/$/ need_save wxTerminal.cpp /^extern "C" int need_save;$/ new_line print.c /^void new_line(FILE *strm) {$/ newcont eval.c /^#define newcont(/ newnode mem.c /^NODE *newnode(NODETYPES type) {$/ next logo.h /^ struct segment *next;$/ next logo.h /^ struct logo_node *next; \/* Link together nodes of the same age *\/ \/*GC*\/$/ next_gen_gc mem.c /^int next_gen_gc = 0, max_gen = 0;$/ nfloat logo.h /^ FLONUM nfloat;$/ nint logo.h /^ FIXNUM nint;$/ nmax_args logo.h /^ short nmax_args;$/ nmethod logo.h /^ } nmethod;$/ nmin_args logo.h /^ short nmin_args;$/ nobj logo.h /^ struct logo_node *nobj; \/* used only for oblist etc *\/$/ nobject logo.h /^ } nobject;$/ node__colon logo.h /^#define node__colon(/ node__quote logo.h /^#define node__quote(/ node_type logo.h /^ NODETYPES node_type;$/ nodes logo.h /^ struct logo_node nodes[0];$/ nodes logo.h /^ struct logo_node nodes[1];$/ nodetype mem.c /^NODETYPES nodetype(NODE *nd) {$/ nop nographics.c /^void nop()$/ nop wxTurtleGraphics.cpp /^extern "C" void nop() {$/ noparity_strncmp logodata.c /^int noparity_strncmp(char *s1, char *s2, int n) {$/ noparity_strnzcpy logodata.c /^char *noparity_strnzcpy(char *s1, char *s2, int n) {$/ noparitylow_strncmp logodata.c /^int noparitylow_strncmp(char *s1, char *s2, int n) {$/ noparitylow_strnzcpy logodata.c /^char *noparitylow_strnzcpy(char *s1, char *s2, int n) {$/ not_local eval.c /^int not_local(NODE *name, NODE *sp) {$/ nparent logo.h /^ struct logo_node *nparent;$/ nparents logo.h /^ struct logo_node *nparents;$/ nprim logo.h /^ } nprim;$/ nprim_fun logo.h /^ struct logo_node * (*nprim_fun) ();$/ npriority logo.h /^ short npriority;$/ nprocname logo.h /^ struct logo_node *nprocname;$/ nprocs logo.h /^ struct logo_node *nprocs;$/ nstring logo.h /^ } nstring;$/ nstring_head logo.h /^ struct string_block *nstring_head;$/ nstring_len logo.h /^ FIXNUM nstring_len;$/ nstring_ptr logo.h /^ char *nstring_ptr;$/ num2restore eval.c /^#define num2restore(/ num2save eval.c /^#define num2save(/ num_examined mem.c /^long int num_examined;$/ num_saved_nodes eval.c /^int num_saved_nodes;$/ numberp math.c /^int numberp(NODE *snd) {$/ numeric_arg graphics.c /^NODE *numeric_arg(NODE *args) {$/ numpush eval.c /^void numpush(FIXNUM obj, NODE **stack) {$/ numrestore eval.c /^#define numrestore(/ numsave eval.c /^#define numsave(/ numstack eval.c /^ *numstack = NIL,\/* stack whose elements aren't objects *\/$/ nunion logo.h /^ } nunion;$/ nvars logo.h /^ struct logo_node *nvars;$/ obflags__caseobj logo.h /^#define obflags__caseobj(/ obflags__object logo.h /^#define obflags__object(/ object__caseobj logo.h /^#define object__caseobj(/ oflo_buf math.c /^jmp_buf oflo_buf;$/ oldHeight wxTerminal.cpp /^int oldHeight = -1;$/ oldWidth wxTerminal.cpp /^int oldWidth = -1;$/ old_font wxTerminal.cpp /^wxFont old_font;$/ old_style wxTerminal.cpp /^wxTextAttr old_style;$/ oldyoung_next logo.h /^ struct logo_node *oldyoung_next;$/ oldyoungs mem.c /^NODE *oldyoungs = NIL;$/ one_list wrksp.c /^NODE *one_list(NODE *nd) {$/ open_file files.c /^FILE *open_file(NODE *arg, char *access) {$/ orig_pen graphics.c /^pen_info orig_pen;$/ ospeed wxterm.c /^short ospeed;$/ out_of_bounds graphics.c /^BOOLEAN out_of_bounds = FALSE;$/ output_buffer wxMain.cpp /^char output_buffer[MAXOUTBUFF];$/ output_index wxMain.cpp /^int output_index = 0;$/ output_node eval.c /^*output_node = NIL, \/* the output of the current function *\/$/ output_unode eval.c /^*output_unode = NIL; \/* the unode in which we saw the output *\/$/ p wxTurtleGraphics.cpp /^pen_info p;$/ p_end parse.c /^char *p_line = 0, *p_end;$/ p_info_x xgraphics.h /^#define p_info_x(/ p_info_y xgraphics.h /^#define p_info_y(/ p_len parse.c /^int p_len = MAX_PHYS_LINE;$/ p_line parse.c /^char *p_line = 0, *p_end;$/ paren_expr paren.c /^NODE *paren_expr(NODE **expr, BOOLEAN inparen) {$/ paren_infix paren.c /^NODE *paren_infix(NODE *left_arg, NODE **rest, int old_pri, BOOLEAN inparen) {$/ paren_line paren.c /^NODE *paren_line(NODE *line) {$/ parens parse.c /^#define parens(/ parm eval.c /^ *parm = NIL, \/* the current formal *\/$/ parsed__runparse logo.h /^#define parsed__runparse(/ parser parse.c /^NODE *parser(NODE *nd, BOOLEAN semi) {$/ parser_iterate parse.c /^NODE *parser_iterate(char **inln, char *inlimit, struct string_block *inhead,$/ pathString wxMain.cpp /^std::string pathString;$/ pc nographics.c /^int pw, ph, pc, pm, pv, px, py, bg;$/ pen_color xgraphics.h /^#define pen_color / pen_down xgraphics.h /^#define pen_down / pen_erase xgraphics.h /^#define pen_erase / pen_height xgraphics.h /^#define pen_height / pen_info xgraphics.h /^} pen_info;$/ pen_mode xgraphics.h /^#define pen_mode / pen_reverse xgraphics.h /^#define pen_reverse / pen_vis xgraphics.h /^#define pen_vis / pen_width xgraphics.h /^#define pen_width / pen_x xgraphics.h /^#define pen_x / pen_y xgraphics.h /^#define pen_y / pfmod graphics.c /^double pfmod(double x, double y) {$/ ph nographics.c /^int pw, ph, pc, pm, pv, px, py, bg;$/ ph xgraphics.h /^ int ph;$/ picturebottom wxTurtleGraphics.cpp /^int pictureleft = 0, pictureright = 0, picturetop = 0, picturebottom = 0;$/ pictureleft wxTurtleGraphics.cpp /^int pictureleft = 0, pictureright = 0, picturetop = 0, picturebottom = 0;$/ pictureright wxTurtleGraphics.cpp /^int pictureleft = 0, pictureright = 0, picturetop = 0, picturebottom = 0;$/ picturetop wxTurtleGraphics.cpp /^int pictureleft = 0, pictureright = 0, picturetop = 0, picturebottom = 0;$/ plain_xor_pen xgraphics.h /^#define plain_xor_pen(/ plist__caseobj logo.h /^#define plist__caseobj(/ plist__object logo.h /^#define plist__object(/ pm nographics.c /^int pw, ph, pc, pm, pv, px, py, bg;$/ pm xgraphics.h /^ GC pm;$/ po_helper wrksp.c /^NODE *po_helper(NODE *arg, int just_titles) {$/ pop logo.h /^#define pop(/ pos_int_arg coms.c /^NODE *pos_int_arg(NODE *args) {$/ pos_int_vector_arg graphics.c /^NODE *pos_int_vector_arg(NODE *args) {$/ prepare_to_draw xgraphics.h /^#define prepare_to_draw / prepare_to_draw_turtle xgraphics.h /^#define prepare_to_draw_turtle / prepare_to_exit coms.c /^void prepare_to_exit(BOOLEAN okay) {$/ prepared wxTurtleGraphics.cpp /^int prepared = 0;$/ prim init.c /^ NODE *(*prim) ();$/ prim_exists wrksp.c /^BOOLEAN prim_exists(NODE *name) {$/ priminfo init.c /^typedef struct priminfo {$/ prims init.c /^PRIMTYPE prims[] = {$/ printToScreen wxMain.cpp /^extern "C" void printToScreen(char c, FILE * stream) $/ print_char print.c /^void print_char(FILE *strm, char ch) {$/ print_help print.c /^void print_help(FILE *strm, NODE *nd) {$/ print_nobrak print.c /^void print_nobrak(FILE *strm, NODE *nd) {$/ print_node print.c /^void print_node(FILE *strm, NODE *nd) {$/ print_space print.c /^void print_space(FILE *strm) {$/ print_stringlen print.c /^int print_stringlen;$/ print_stringptr print.c /^char *print_stringptr;$/ printerDC wxTurtleGraphics.cpp /^wxDC *printerDC;$/ priority init.c /^ short priority;$/ priority paren.c /^int priority(NODE *proc_obj) {$/ prname mem.c /^void prname(NODE *foo) {$/ proc logo.h /^#define proc / proc_exists wrksp.c /^BOOLEAN proc_exists(NODE *name) {$/ proc_name_arg wrksp.c /^NODE *proc_name_arg(NODE *args) {$/ procnode__caseobj logo.h /^#define procnode__caseobj(/ procnode__caseobj paren.c /^#define procnode__caseobj / procnode__caseobj paren.c /^#undef procnode__caseobj$/ procnode__object logo.h /^#define procnode__object(/ ps_string graphics.c /^void ps_string(FILE *fp, char *p) {$/ push logo.h /^#define push(/ putInQueue wxTurtleGraphics.cpp /^int putInQueue = 0;$/ pv nographics.c /^int pw, ph, pc, pm, pv, px, py, bg;$/ pw nographics.c /^int pw, ph, pc, pm, pv, px, py, bg;$/ pw xgraphics.h /^ int pw;$/ px nographics.c /^int pw, ph, pc, pm, pv, px, py, bg;$/ py nographics.c /^int pw, ph, pc, pm, pv, px, py, bg;$/ qm_list logo.h /^#define qm_list / quote_strnzcpy logodata.c /^char *quote_strnzcpy(char *s1, char *s2, int n) {$/ r_argl logo.h /^ NODE *r_argl; \/* evaluated argument list *\/$/ r_current_unode logo.h /^ NODE *r_current_unode; \/* a pair to identify this proc call *\/$/ r_didnt_get_output logo.h /^ NODE *r_didnt_get_output; \/* procedure wanting output from EVAL *\/$/ r_didnt_output_name logo.h /^ NODE *r_didnt_output_name; \/* name of the proc that didn't OP *\/$/ r_formals logo.h /^ NODE *r_formals; \/* list of formal parameters *\/$/ r_fun logo.h /^ NODE *r_fun; \/* current function name *\/$/ r_ift_iff_flag logo.h /^ FIXNUM r_ift_iff_flag;$/ r_last_line logo.h /^ NODE *r_last_line; \/* the line that called this one *\/$/ r_last_ufun logo.h /^ NODE *r_last_ufun; \/* the function that called this one *\/$/ r_proc logo.h /^ NODE *r_proc; \/* the procedure definition *\/$/ r_qm_list logo.h /^ NODE *r_qm_list; \/* question mark list *\/$/ r_repcount logo.h /^ FIXNUM r_repcount; \/* count for repeat *\/$/ r_tailcall logo.h /^ FIXNUM r_tailcall; \/* 0 in sequence, 1 for tail, -1 for arg *\/$/ r_this_line logo.h /^ NODE *r_this_line; \/* the current instruction line *\/$/ r_ufun logo.h /^ NODE *r_ufun; \/* current user-defined function name *\/$/ r_unev logo.h /^ NODE *r_unev; \/* list of unevaluated expressions *\/$/ r_user_repcount logo.h /^ FIXNUM r_user_repcount;$/ r_val_status logo.h /^ FIXNUM r_val_status; \/* tells what EVAL_SEQUENCE should do: *\/$/ r_var logo.h /^ NODE *r_var; \/* frame pointer into var_stack *\/$/ r_vsp logo.h /^ NODE *r_vsp; \/* temp ptr into var_stack *\/$/ rd_getc parse.c /^int rd_getc(FILE *strm) {$/ rd_print_prompt parse.c /^void rd_print_prompt(char *str) {$/ rd_putc globals.h /^#define rd_putc / readchar_lookahead_buf files.c /^int readchar_lookahead_buf = -1;$/ reader parse.c /^NODE *reader(FILE *strm, char *prompt) {$/ reader_name files.c /^NODE *reader_name = NIL, *writer_name = NIL, *file_prefix = NIL;$/ readingInstruction parse.c /^int readingInstruction = 0;$/ readingInstruction wxTerminal.cpp /^extern "C" int readingInstruction;$/ reading_char_now files.c /^int reading_char_now = 0;$/ reading_char_now wxTerminal.cpp /^extern "C" int reading_char_now;$/ readstream parse.c /^FILE *readstream;$/ realClearScreen wxTurtleGraphics.cpp /^void TurtleCanvas::realClearScreen(wxDC *dc) {$/ realDrawLabel wxTurtleGraphics.cpp /^void TurtleCanvas::realDrawLabel(char *data, wxDC *dc) {$/ realFloodFill wxTurtleGraphics.cpp /^void TurtleCanvas::realFloodFill(int color, wxDC *dc) {$/ real_print_help print.c /^void real_print_help(FILE *strm, NODE *ndlist, int depth, int width) {$/ real_print_node print.c /^void real_print_node(FILE *strm, NODE *nd, int depth, int width) {$/ realdoFilled wxTurtleGraphics.cpp /^void TurtleCanvas::realdoFilled(int fillcolor, int count,$/ record graphics.c /^char *record = 0;$/ record_buffer graphics.c /^char record_buffer[GR_SIZE];$/ record_buffer wxTurtleGraphics.cpp /^extern "C" char record_buffer[];$/ record_index graphics.c /^FIXNUM record_index = 0;$/ redraw_graphics graphics.c /^void redraw_graphics(void) {$/ refresh_p graphics.c /^BOOLEAN refresh_p = TRUE;$/ registers logo.h /^struct registers {$/ regs eval.c /^struct registers regs;$/ repcount logo.h /^#define repcount / reserve_tank mem.c /^NODE *reserve_tank = NIL;$/ reset_args eval.c /^void reset_args(NODE *old_stack) {$/ restline eval.c /^NODE *restname, *restline;$/ restname eval.c /^NODE *restname, *restline;$/ restore eval.c /^#define restore(/ restore2 eval.c /^#define restore2(/ restore_palette graphics.c /^void restore_palette(FILE *fp) {$/ restore_pen wxTurtleGraphics.cpp /^extern "C" void restore_pen(pen_info *p) {$/ reverse eval.c /^NODE *reverse(NODE *list) {$/ rgb_arg graphics.c /^NODE *rgb_arg(NODE *args) {$/ rgbprint graphics.c /^void rgbprint(FILE *fp, int cnum) {$/ right graphics.c /^void right(FLONUM a) {$/ runnable_arg coms.c /^NODE *runnable_arg(NODE *args) {$/ runparse parse.c /^NODE *runparse(NODE *ndlist) {$/ runparse_node parse.c /^NODE *runparse_node(NODE *nd, NODE **ndsptr) {$/ runparsed logo.h /^#define runparsed(/ runstartup files.c /^void runstartup(NODE *oldst) {$/ s_md globals.h /^extern enum s_md {SCREEN_TEXT, SCREEN_SPLIT, SCREEN_FULL} screen_mode;$/ s_md wxTerminal.cpp /^extern enum s_md {SCREEN_TEXT, SCREEN_SPLIT, SCREEN_FULL} screen_mode;$/ s_md wxTurtleGraphics.cpp /^extern "C" enum s_md {SCREEN_TEXT, SCREEN_SPLIT, SCREEN_FULL} screen_mode;$/ safe_to_save graphics.c /^BOOLEAN safe_to_save(void) {$/ save eval.c /^#define save(/ save2 eval.c /^#define save2(/ save_arc graphics.c /^void save_arc(FLONUM count, FLONUM ang, FLONUM radius, FLONUM delta,$/ save_color graphics.c /^void save_color(void) {$/ save_line graphics.c /^void save_line(void) {$/ save_lm_helper graphics.c /^void save_lm_helper (void) {$/ save_mode graphics.c /^void save_mode(void) {$/ save_move graphics.c /^void save_move(void) {$/ save_name files.c /^NODE *save_name = NIL; \/* filename of last save or load command *\/$/ save_name wxTerminal.cpp /^extern "C" void *save_name;$/ save_palette graphics.c /^void save_palette(FILE *fp) {$/ save_pattern graphics.c /^void save_pattern(void) {$/ save_pen wxTurtleGraphics.cpp /^extern "C" void save_pen(pen_info *p) {$/ save_size graphics.c /^void save_size(void) {$/ save_string graphics.c /^void save_string(char *s, int len) {$/ save_vis graphics.c /^void save_vis(void) {$/ screen_bottom xgraphics.h /^#define screen_bottom / screen_height wxTurtleGraphics.cpp /^int TurtleFrame::screen_height = 0; $/ screen_left xgraphics.h /^#define screen_left / screen_mode graphics.c /^enum s_md screen_mode = SCREEN_TEXT;$/ screen_mode wxTurtleGraphics.cpp /^extern "C" enum s_md {SCREEN_TEXT, SCREEN_SPLIT, SCREEN_FULL} screen_mode;$/ screen_right xgraphics.h /^#define screen_right / screen_top xgraphics.h /^#define screen_top / screen_width wxTurtleGraphics.cpp /^int TurtleFrame::screen_width = 0;$/ screen_x_center xgraphics.h /^#define screen_x_center / screen_x_coord xgraphics.h /^#define screen_x_coord / screen_y_center xgraphics.h /^#define screen_y_center / screen_y_coord xgraphics.h /^#define screen_y_coord / se_arr wxterm.c /^char se_arr[40];$/ seg_size mem.c /^FIXNUM seg_size = SEG_SIZE;$/ segment logo.h /^struct segment {$/ segment_list mem.c /^struct segment *segment_list = NULL; \/* global ptr to segment list *\/$/ separator libloc.c /^char *separator="\/";$/ setCharMode wxTerminal.cpp /^extern "C" void setCharMode(int mode){$/ setCursor wxTerminal.cpp /^void wxTerminal::setCursor (int x, int y, bool fromLogo) {$/ setInfo wxTurtleGraphics.cpp /^void TurtleCanvas::setInfo(int type, int val){$/ setTermInfo wxTerminal.cpp /^extern "C" void setTermInfo(int type, int val){$/ set_back_ground xgraphics.h /^#define set_back_ground(/ set_list_pen_pattern xgraphics.h /^#define set_list_pen_pattern(/ set_mode_flag wxTerminal.cpp /^void wxTerminal::set_mode_flag(int flag) {$/ set_palette wxTurtleGraphics.cpp /^extern "C" void set_palette(int color, unsigned int r, unsigned int g, unsigned int b){$/ set_pen_color xgraphics.h /^#define set_pen_color(/ set_pen_height xgraphics.h /^#define set_pen_height(/ set_pen_mode xgraphics.h /^#define set_pen_mode(/ set_pen_patter wxTurtleGraphics.cpp /^extern "C" void set_pen_patter(){$/ set_pen_pattern xgraphics.h /^#define set_pen_pattern(/ set_pen_vis xgraphics.h /^#define set_pen_vis(/ set_pen_width xgraphics.h /^#define set_pen_width(/ set_pen_x xgraphics.h /^#define set_pen_x(/ set_pen_y xgraphics.h /^#define set_pen_y(/ setarrdim logo.h /^#define setarrdim(/ setarrorg logo.h /^#define setarrorg(/ setarrptr logo.h /^#define setarrptr(/ setbodywords__procnode logo.h /^#define setbodywords__procnode(/ setcar mem.c /^void setcar(NODE *nd, NODE *newcar) {$/ setcdr mem.c /^void setcdr(NODE *nd, NODE *newcdr) {$/ setflag__caseobj logo.h /^#define setflag__caseobj(/ setfloat logo.h /^#define setfloat(/ setgeneration__tree logo.h /^#define setgeneration__tree(/ setint logo.h /^#define setint(/ setitem_helper lists.c /^NODE *setitem_helper(NODE *args, BOOLEAN safe) {$/ setobject mem.c /^void setobject(NODE *nd, NODE *newobj) {$/ setparents logo.h /^#define setparents(/ setparity logo.h /^#define setparity(/ setplist__caseobj logo.h /^#define setplist__caseobj(/ setplist__object logo.h /^#define setplist__object(/ setpos_bynumber graphics.c /^void setpos_bynumber(FLONUM target_x, FLONUM target_y) {$/ setpos_commonpart graphics.c /^void setpos_commonpart(FLONUM target_x, FLONUM target_y) {$/ setpos_helper graphics.c /^void setpos_helper(NODE *xnode, NODE *ynode) {$/ setprimdflt logo.h /^#define setprimdflt(/ setprimfun logo.h /^#define setprimfun(/ setprimmax logo.h /^#define setprimmax(/ setprimmin logo.h /^#define setprimmin(/ setprimpri logo.h /^#define setprimpri(/ setprocnode__caseobj logo.h /^#define setprocnode__caseobj(/ setprocnode__object logo.h /^#define setprocnode__object(/ setprocs logo.h /^#define setprocs(/ setstrhead logo.h /^#define setstrhead(/ setstrlen logo.h /^#define setstrlen(/ setstrptr logo.h /^#define setstrptr(/ setstrrefcnt logo.h /^#define setstrrefcnt(/ settree__tree logo.h /^#define settree__tree(/ settreepair__tree logo.h /^#define settreepair__tree(/ settype logo.h /^#define settype(/ setvalnode__caseobj logo.h /^#define setvalnode__caseobj(/ setvalnode__object logo.h /^#define setvalnode__object(/ setvars logo.h /^#define setvars(/ sig_arg main.c /^#define sig_arg / sig_arg math.c /^#define sig_arg / silent_load files.c /^void silent_load(NODE *arg, char *prefix) {$/ size logo.h /^ FIXNUM size;$/ so_arr wxterm.c /^char so_arr[40];$/ special_chars logodata.c /^char special_chars[] = " \\t\\n(?????+++~)[]-*\/=<>\\"\\\\:;|{}";$/ split_screen xgraphics.h /^#define split_screen / sq graphics.c /^#define sq(/ stack eval.c /^ *stack = NIL, \/* register stack *\/$/ start main.c /^int start (int argc,char ** argv) {$/ stop_quietly_flag main.c /^int stop_quietly_flag=0;$/ stop_quietly_flag wxMain.cpp /^extern "C" int stop_quietly_flag;$/ stopping_flag eval.c /^CTRLTYPE stopping_flag = RUN;$/ str_refcnt logo.h /^ unsigned FIXNUM str_refcnt;$/ str_str logo.h /^ char str_str[1]; \/* This array will be of variable length really *\/$/ string_arg lists.c /^NODE *string_arg(NODE *args) {$/ string_block logo.h /^struct string_block {$/ strncasestr wrksp.c /^char *strncasestr(char *big, char *little, FIXNUM len) {$/ strnode__caseobj logo.h /^#define strnode__caseobj(/ strnzcpy logodata.c /^char *strnzcpy(char *s1, char *s2, int n) {$/ tailcall logo.h /^#define tailcall / tell_shadow eval.c /^void tell_shadow(NODE *arg) {$/ tempBitmap wxTurtleGraphics.cpp /^wxBitmap *tempBitmap;$/ tempdir wrksp.c /^char *editor, *editorname, *tempdir;$/ temploc libloc.c /^char *temploc="\/tmp";$/ term_init wxterm.c /^void term_init(void) {$/ termcap_getter wxterm.c /^void termcap_getter(char *cap, char *buf) {$/ termcap_ptr wxterm.c /^char *termcap_ptr;$/ termcap_putter wxterm.c /^int termcap_putter(char ch) {$/ terminal wxTerminal.cpp /^wxTerminal *wxTerminal::terminal;$/ text__procnode logo.h /^#define text__procnode(/ text_screen xgraphics.h /^#define text_screen / theName logodata.c /^NODE *theName(enum words wd) {$/ the_generation paren.c /^NODE *the_generation;$/ this_line logo.h /^#define this_line / three_lists wrksp.c /^void three_lists(NODE *arg, NODE **proclst, NODE **varlst, NODE **plistlst) {$/ throw_node error.c /^NODE *throw_node = NIL;$/ tmp_filename wrksp.c /^char tmp_filename[500] = "";$/ to_helper wrksp.c /^NODE *to_helper(NODE *args, BOOLEAN macro_flag) {$/ to_pending wrksp.c /^int to_pending = 0;$/ tone xgraphics.h /^#define tone(/ topsizer wxTerminal.cpp /^wxBoxSizer *topsizer;$/ torf math.c /^NODE *torf(BOOLEAN tf) {$/ torf_arg coms.c /^int torf_arg(NODE *args) {$/ total_turtle_bottom_max graphics.c /^#define total_turtle_bottom_max / towards_helper graphics.c /^FLONUM towards_helper(FLONUM x, FLONUM y, FLONUM from_x, FLONUM from_y) {$/ trace_level eval.c /^static int trace_level = 0; \/* indentation level when tracing *\/$/ translations init.c /^struct wdtrans translations[NUM_WORDS];$/ tree__line logo.h /^#define tree__line(/ tree__tree logo.h /^#define tree__tree(/ tree_dk_how paren.c /^NODE *tree_dk_how;$/ treepair__tree logo.h /^#define treepair__tree(/ tty_cbreak wxterm.c /^struct sgttyb tty_cooked, tty_cbreak;$/ tty_cbreak wxterm.c /^struct termios tty_cooked, tty_cbreak;$/ tty_charmode wxterm.c /^int interactive, tty_charmode;$/ tty_cooked wxterm.c /^struct sgttyb tty_cooked, tty_cbreak;$/ tty_cooked wxterm.c /^struct termios tty_cooked, tty_cbreak;$/ turtleFrame wxTurtleGraphics.cpp /^TurtleFrame *turtleFrame;$/ turtleGraphics wxTerminal.cpp /^TurtleCanvas * turtleGraphics; $/ turtleIndex wxTurtleGraphics.cpp /^int turtleIndex = 0;$/ turtlePosition_x graphics.c /^int turtlePosition_x=0;$/ turtlePosition_x wxTurtleGraphics.cpp /^extern "C" int turtlePosition_x;$/ turtlePosition_y graphics.c /^int turtlePosition_y=0;$/ turtlePosition_y wxTurtleGraphics.cpp /^extern "C" int turtlePosition_y;$/ turtlePrintout wxTurtleGraphics.cpp /^TurtleWindowPrintout *turtlePrintout;$/ turtle_bottom_max xgraphics.h /^#define turtle_bottom_max / turtle_half_bottom xgraphics.h /^#define turtle_half_bottom / turtle_heading graphics.c /^FLONUM turtle_x = 0.0, turtle_y = 0.0, turtle_heading = 0.0;$/ turtle_height xgraphics.h /^#define turtle_height / turtle_left_max xgraphics.h /^#define turtle_left_max / turtle_right_max xgraphics.h /^#define turtle_right_max / turtle_shown graphics.c /^BOOLEAN turtle_shown = FALSE, user_turtle_shown = TRUE;$/ turtle_shown wxTurtleGraphics.cpp /^extern "C" int turtle_shown;$/ turtle_side xgraphics.h /^#define turtle_side / turtle_top_max xgraphics.h /^#define turtle_top_max / turtle_x graphics.c /^FLONUM turtle_x = 0.0, turtle_y = 0.0, turtle_heading = 0.0;$/ turtle_y graphics.c /^FLONUM turtle_x = 0.0, turtle_y = 0.0, turtle_heading = 0.0;$/ type_help print.c /^void type_help(NODE *args, int sp) {$/ ufun logo.h /^#define ufun / unblock_input main.c /^void unblock_input(void) {$/ unbury_helper wrksp.c /^NODE *unbury_helper(NODE *arg, int flag) {$/ uncapital logodata.c /^#define uncapital(/ unev logo.h /^#define unev / ungetc files.c /^#define ungetc / unix logo.h /^#define unix$/ unparsed__line logo.h /^#define unparsed__line(/ unparsed__runparse logo.h /^#define unparsed__runparse(/ unparsed__tree logo.h /^#define unparsed__tree(/ untreeify paren.c /^void untreeify(NODE *node) {$/ untreeify_body paren.c /^void untreeify_body(NODE *body) {$/ untreeify_line paren.c /^void untreeify_line(NODE *line) {$/ untreeify_proc paren.c /^void untreeify_proc(NODE *tproc) {$/ update_coords print.c /^void update_coords(char ch) {$/ upper_p logodata.c /^#define upper_p(/ use_reserve_tank mem.c /^void use_reserve_tank(void) {$/ user_repcount logo.h /^#define user_repcount / user_turtle_shown graphics.c /^BOOLEAN turtle_shown = FALSE, user_turtle_shown = TRUE;$/ val eval.c /^ *val = NIL, \/* the value of the last expression *\/$/ val__cont logo.h /^#define val__cont(/ val_status logo.h /^#define val_status / valid_pointer mem.c /^BOOLEAN valid_pointer (volatile NODE *ptr_val) {$/ valnode__caseobj logo.h /^#define valnode__caseobj(/ valnode__colon logo.h /^#define valnode__colon(/ valnode__object logo.h /^#define valnode__object(/ var logo.h /^#define var / varTrue logodata.c /^int varTrue(NODE *varb) {$/ var_stack eval.c /^*var_stack = NIL, \/* the stack of variables and their bindings *\/$/ vec_arg_helper graphics.c /^NODE *vec_arg_helper(NODE *args, BOOLEAN floatok, BOOLEAN three) {$/ vector_arg graphics.c /^NODE *vector_arg(NODE *args) {$/ vis xgraphics.h /^ int vis;$/ vs_print eval.c /^void vs_print() {$/ vsp logo.h /^#define vsp / wanna_x graphics.c /^FLONUM wanna_x = 0.0, wanna_y = 0.0;$/ wanna_y graphics.c /^FLONUM wanna_x = 0.0, wanna_y = 0.0;$/ wd_copy init.c /^#define wd_copy(/ wd_enum logo.h /^#define wd_enum(/ wdtrans logo.h /^struct wdtrans {$/ white_space parse.c /^#define white_space(/ windowDC wxTurtleGraphics.cpp /^wxDC *windowDC = 0;$/ windowmode logo.h /^typedef enum {wrapmode, fencemode, windowmode} mode_type;$/ word_strnzcpy logodata.c /^char *word_strnzcpy(char *s1, NODE *kludge, int n) { \/* KLUDGE! *\/$/ words logo.h /^enum words {$/ wrap_down graphics.c /^FLONUM wrap_down(FLONUM d, FLONUM x1, FLONUM y1, FLONUM x2, FLONUM y2) {$/ wrap_left graphics.c /^FLONUM wrap_left(FLONUM d, FLONUM x1, FLONUM y1, FLONUM x2, FLONUM y2) {$/ wrap_right graphics.c /^FLONUM wrap_right(FLONUM d, FLONUM x1, FLONUM y1, FLONUM x2, FLONUM y2) {$/ wrap_up graphics.c /^FLONUM wrap_up(FLONUM d, FLONUM x1, FLONUM y1, FLONUM x2, FLONUM y2) {$/ wrapmode logo.h /^typedef enum {wrapmode, fencemode, windowmode} mode_type;$/ write_buf files.c /^char *write_buf = 0;$/ writer_name files.c /^NODE *reader_name = NIL, *writer_name = NIL, *file_prefix = NIL;$/ writestream parse.c /^FILE *writestream;$/ wxClearText wxTerminal.cpp /^extern "C" void wxClearText() {$/ wxDrawLine wxTurtleGraphics.cpp /^extern "C" void wxDrawLine(int x1, int y1, int x2, int y2, int vis){$/ wxEVT_TERM_CUSTOM_COMMAND wxTerminal.cpp /^#define wxEVT_TERM_CUSTOM_COMMAND(/ wxEditFile wxTurtleGraphics.cpp /^extern "C" int wxEditFile(char * f){$/ wxFontDialog wxTerminal.cpp /^ #undef wxFontDialog$/ wxFullScreen wxTurtleGraphics.cpp /^extern "C" void wxFullScreen(){$/ wxGetButton wxTurtleGraphics.cpp /^extern "C" int wxGetButton () {$/ wxGetClickX wxTurtleGraphics.cpp /^extern "C" int wxGetClickX() {$/ wxGetClickY wxTurtleGraphics.cpp /^extern "C" int wxGetClickY() {$/ wxGetInfo wxTurtleGraphics.cpp /^extern "C" int wxGetInfo(int type) {$/ wxGetLastButton wxTurtleGraphics.cpp /^extern "C" int wxGetLastButton () {$/ wxGetMouseX wxTurtleGraphics.cpp /^extern "C" int wxGetMouseX() {$/ wxGetMouseY wxTurtleGraphics.cpp /^extern "C" int wxGetMouseY() {$/ wxKeyp wxMain.cpp /^extern "C" int wxKeyp() {$/ wxLabel wxTurtleGraphics.cpp /^extern "C" void wxLabel(char * string) {$/ wxLogoExit wxMain.cpp /^extern "C" void wxLogoExit(int code) {$/ wxLogoSleep wxMain.cpp /^extern "C" void wxLogoSleep(unsigned int milli) {$/ wxMacGetCslsloc wxMain.cpp /^extern "C" const char* wxMacGetCslsloc(){$/ wxMacGetHelploc wxMain.cpp /^extern "C" const char* wxMacGetHelploc(){$/ wxMacGetLibloc wxMain.cpp /^extern "C" const char* wxMacGetLibloc(){$/ wxPrepare wxTurtleGraphics.cpp /^extern "C" void wxPrepare(){$/ wxSetCursor wxTerminal.cpp /^extern "C" void wxSetCursor(int x, int y){$/ wxSetFont wxTerminal.cpp /^extern "C" void wxSetFont(char *fm, int sz) {$/ wxSetInfo wxTurtleGraphics.cpp /^extern "C" void wxSetInfo(int type, int val) {$/ wxSetPenWidth wxTurtleGraphics.cpp /^extern "C" void wxSetPenWidth(int width){$/ wxSplitScreen wxTurtleGraphics.cpp /^extern "C" void wxSplitScreen(){$/ wxTerminal wxTerminal.cpp /^ wxTerminal::wxTerminal(wxWindow* parent, wxWindowID id,$/ wxTextScreen wxTurtleGraphics.cpp /^extern "C" void wxTextScreen(){$/ wxUnget_c wxMain.cpp /^extern "C" int wxUnget_c(int c, FILE * f) {$/ wx_Debugging wxMain.cpp /^int wx_Debugging = 0;$/ wx_adjust_label_height wxTurtleGraphics.cpp /^extern "C" void wx_adjust_label_height() {$/ wx_clear wxTurtleGraphics.cpp /^extern "C" void wx_clear() {$/ wx_enable_scrolling wxTerminal.cpp /^extern "C" void wx_enable_scrolling() {$/ wx_fgets wxterm.c /^char* wx_fgets(char* s, int n, FILE* stream) {$/ wx_font_face wxterm.c /^char wx_font_face[300] = "Courier"; \/\/300 matches lsetfont in wxterm.c$/ wx_font_size wxterm.c /^int wx_font_size = 12; $/ wx_get_label_size wxTurtleGraphics.cpp /^extern "C" void wx_get_label_size(int *w, int *h) {$/ wx_leave_mainloop main.c /^int wx_leave_mainloop = 0;$/ wx_leave_mainloop wxTerminal.cpp /^extern "C" int wx_leave_mainloop;$/ wx_refresh wxTurtleGraphics.cpp /^extern "C" void wx_refresh() {$/ wxlPrintPict wxTurtleGraphics.cpp /^extern "C" void wxlPrintPict(){$/ wxlPrintPreviewPict wxTurtleGraphics.cpp /^extern "C" void wxlPrintPreviewPict(){$/ wxlPrintPreviewText wxTurtleGraphics.cpp /^extern "C" void wxlPrintPreviewText(){$/ wxlPrintText wxTurtleGraphics.cpp /^extern "C" void wxlPrintText(){$/ x graphics.c /^ int x,y;$/ x_margin print.c /^int x_margin=0, y_margin=0;$/ x_scale graphics.c /^FLONUM x_scale = 1.0, y_scale = 1.0;$/ x_window logo.h /^#define x_window$/ xgr_pen wxTurtleGraphics.cpp /^pen_info TurtleFrame::xgr_pen = p;$/ xpos xgraphics.h /^ int xpos;$/ y graphics.c /^ int x,y;$/ y_margin print.c /^int x_margin=0, y_margin=0;$/ y_scale graphics.c /^FLONUM x_scale = 1.0, y_scale = 1.0;$/ ypos xgraphics.h /^ int ypos;$/ zrd_print_prompt parse.c /^#define zrd_print_prompt / zrd_print_prompt parse.c /^void zrd_print_prompt(char *str) {$/ ~TurtleCanvas wxTurtleGraphics.cpp /^TurtleCanvas::~TurtleCanvas() {$/ ~wxTerminal wxTerminal.cpp /^wxTerminal::~wxTerminal()$/ ucblogo-6.1/plm0000664000175000017500000021133313557147341011642 0ustar jjcjjcUnderstanding the UCBLogo evaluator Prerequisite: understanding the metacircular evaluator (MCE, SICP 4.1) Corequisite: understanding the explicit control evaluator (ECE, SICP 5.4) Contents -------- 1. Review of metacircular evaluator 1.1 Recursive structure of the evaluator 1.2 Tail call elimination in the MCE 2. The Explicit-Control Evaluator 2.1 Typical C-style procedure calling convention 2.2 Procedure calling convention in the ECE 2.3 The evaluator uses surprisingly few registers 2.4 The two-screenful version of the explicit control evaluator 2.5 Implementing explicit control in C 3. Complicating Issues in UCBLogo 3.1 Commands vs. operations 3.2 Error messages and tail call elimination 3.2a Tailforms 3.2b Tailforms handled as embedded calls 3.2c Caller-status arguments to eval-sequence and eval-dispatch 3.2d Detecting errors before they happen 3.3 Macros 3.3a Why the MCE uses special forms 3.3b Using rewriting instead of special forms 3.3c Logo continuations 3.4 Dynamic scope 3.4a Reasons for lexical scope 3.4b Reasons for dynamic scope 3.4c Shallow binding 3.5 Nonlocal exit 3.6 Lack of parentheses delimiting procedure calls 3.6a Tokenization 3.6b Monadic and dyadic minus 3.6c More on runparsing 3.6d Treeification 3.6e Procedure bodies 3.6f Changing a procedure's arity 4. Data structures and types 4.1 Pair-based types 4.2 Numeric types 4.3 String types 4.3a Internal structure of a string 4.3b How to create a string node 4.3c Including punctuation characters in words 4.4 Symbols 4.5 Quote and colon types 4.6 Arrays 4.7 Primitive procedures 5. Garbage collector 5.1 Node allocation 5.2 The mark phase 5.3 GCTWA 5.4 The sweep phase 5.5 Per-node gc data 1. Review of metacircular evaluator ----------------------------------- 1.1 Recursive structure of the evaluator In Logo, as in Scheme, evaluating an expression involves recursively evaluating other expressions, for two reasons: 1. Visible subexpressions, as in (+ (* 3 4)) 2. Expressions in the body of a procedure invoked by this expression #1 gives rise to the mutual recursion eval -> list-of-values -> eval while #2 gives rise to eval -> apply -> eval-sequence -> eval As usual with recursive problems, the resulting program is remarkably short, but it gives rise to complicated processes. In what follows, we mostly focus on recursive path #2. 1.2 Tail call elimination in the MCE Since recursion is the main built-in means for expression iterations (iterative tools such as MAP are written using recursion; for the moment we ignore Scheme's primitive DO and Logo's primitive REPEAT), it's important that implementations be able to evaluate tail calls without creating extra frames for each call. The proper handling of tail calls in the MCE depends on proper tail calling in the underlying Scheme, and also on the fact that the evaluation of the last expression in a sequence is done through a tail call to EVAL: (define (eval-sequence exps env) ; SICP p. 367 (cond ((last-exp? exps) (EVAL (FIRST-EXP EXPS) ENV)) (else (eval (first-exp exps) env) (eval-sequence (rest-exps exps) env)))) To emphasize the point, the evaluator would not handle tail calls properly if eval-sequence were written this way: (define (eval-sequence exps env) ; wrong! (let ((result (eval (first-exp exps) env))) (if (null? (rest-exps exps)) result (eval-sequence (rest-exps exps) env)))) This might seem more elegant because the call to EVAL appears only once in the definition, but that call isn't a tail call. 2. The Explicit-Control Evaluator ---------------------------------- 2.1 Typical C-style procedure calling convention In typical machine-language programming (including compiled C programs) it is the responsibility of called procedures to allocate space and save whatever might otherwise be clobbered by a recursive call. So the calling sequence (in the calling procedure) looks like where the second line represents a single machine language instruction that saves the return address in a register and jumps to the procedure. The called procedure looks like this: ... ... 2.2 Procedure calling convention in the ECE But this won't work if we want a tail-call to avoid allocating new stack space. It's the caller, not the callee, who knows that this is a tail call. Therefore the ECE makes saving the caller's job: When the caller is making a tail call rather than an embedded call, it can leave out the saving and restoring steps: That last line works because the called procedure inherits its return address from the caller. In other words, it returns directly to the caller's caller. 2.3 The evaluator uses surprisingly few registers exp an expression to be evaluated (argument to EVAL) env the current environment (argument to EVAL and EVAL-SEQUENCE) val the value of the expression (returned from EVAL) continue the current return address (set by procedure call instruction in most computers, but assigned explicitly here) proc the procedure being invoked (argument to APPLY) argl the actual argument values (argument to APPLY) unev a list of expressions (argument to EVAL-SEQUENCE) In addition, the SAVE and RESTORE operations use an implicit stack pointer register, which is never explicitly saved or restored. 2.4 The two-screenful version of the explicit control evaluator eval-dispatch: [Corresponds to EVAL in MCE] exp is self-evaluating -> val=exp, return to caller exp is variable -> val=(lookup exp env), return to caller exp is special form -> each one is different, much like MCE exp is application: SAVE STUFF EXP=(CAR EXP) CALL EVAL-DISPATCH ;operator RESTORE STUFF proc=val argl='() unev=(cdr exp) ;actual argument expressions ev-appl-operand-loop: unev is empty -> goto apply-dispatch exp=(car unev) SAVE STUFF CALL EVAL-DISPATCH RESTORE STUFF argl=(cons val argl) unev=(cdr unev) goto ev-appl-operand-loop apply-dispatch: [Corresponds to APPLY in MCE] proc is primitive -> do magic, return to caller compound-apply: unev=(procedure-parameters proc) env=(procedure-environment proc) env=(extend-environment unev argl env) unev=(procedure-body proc) goto ev-sequence ev-sequence: [Corresponds to EVAL-SEQUENCE in MCE] exp=(car unev) (cdr unev) is empty -> ev-sequence-last-exp SAVE STUFF CALL EVAL-DISPATCH RESTORE STUFF unev=(cdr unev) goto ev-sequence ev-sequence-last-exp: GOTO EVAL-DISPATCH The calls to EVAL-DISPATCH are capitalized in the above. There are four of them; the first three (operator, operand, body expression) are surrounded by save and restore operations, but the fourth (final body expression) is just a goto, without saving registers. (SICP pp 556-557.) The version above simplifies the actual ECE by leaving out an optimization in evaluating the last actual argument expression in a procedure application. It's important that special forms that evaluate subexpressions, such as IF, are written to tail-call EVAL-DISPATCH for the last subexpression, so that (if (= 2 3) (this-isnt-evaluated) (this-is-tail-called)) works correctly. 2.5 Implementing explicit control in C The C language provides labels and goto, but the labels are not first-class; you can't put a label (i.e., a memory address in your code) into a register or onto the stack. UCBLogo gets around this restriction by using a kind of pun: C has separate namespaces for labels and members of enums -- the same symbol can be used for both. So in logo.h there is a declaration of an "enum labels" whose members have the same names as labels in the evaluator (e.g., begin_seq). The newcont macro that's used in the evaluator to store a new continuation (in the ECE sense) on the stack actually stores this enum (i.e., a small nonnegative integer). This stored value is translated into an actual label at fetch_cont, which says switch (x) { begin_seq: goto begin_seq; accumulate_arg: goto accumulate_arg; ... } (The actual order of labels is determined in logo.h; I've tried to put the more commonly used ones first.) 3. Complicating Issues in UCBLogo --------------------------------- The SICP evaluators leave out one important complexity of a full Scheme implementation (the nonlocal transfer of control allowed by CALL/CC, which is somewhat like the issue raised in Logo by CATCH and THROW). Also, Logo is more complicated to interpret than Scheme, for these reasons: Commands vs. operations (not every procedure returns a value) The desire for error messages that hide tail call elimination Macros Dynamic scope Lack of parentheses delimiting procedure calls These topics are discussed in the following sections. 3.1 Commands vs. operations The UCBLogo interpreter contains an object named UNBOUND that can be used as the return value from a Logo procedure to indicate that, above the abstraction barrier, there is no return value. Consider the following Logo procedure: to bfn :n :lst if :n=0 [output :lst] output bfn :n-1 butfirst :lst end The call to BFN in the last line of the body should be a tail call. This means that we have to treat the word OUTPUT specially in the interpreter. To the user, OUTPUT is a primitive procedure that takes one input. But we can't evaluate the input expression and then call OUTPUT, because that would make the call to BFN an embedded recursion. (In other words, the call to EVAL-DISPATCH in 2.4 above that evaluates argument expressions saves and restores registers.) Instead, OUTPUT must be treated internally as a special form. When OUTPUT is seen, even if there are more unevaluated expressions in the body, its input is evaluated with a tail call (a goto) to EVAL-DISPATCH. Similarly, STOP must be treated specially. EVAL-SEQUENCE looks to see if the expression *after* the current one is the word STOP; if so, the current expression is tail-called. We must catch STOP early to handle things like to foo IF condition [tail-call-this STOP] ...more expressions... end Under some circumstances the STOP is seen as the current expression, rather than as the expression after the current one; in this case, EVAL-SEQUENCE just returns to its caller. This situation is exemplified by to foo IF condition [STOP] ...more expressions... end In eval.c, OUTPUT and STOP are referred to as "tailforms"; there is a procedure is_tailform(exp) that returns nonzero (true) if the expression is an OUTPUT or STOP expression. Note on terminology: In above-the-line documentation we distinguish between *expressions*, which return values, and *instructions*, which don't. But internally they're all expressions. A third tailform is .MAYBEOUTPUT; this tail-calls its input expression, like OUTPUT; the only difference is that it's not considered an error if the input expression returns UNBOUND instead of a value. This brings us to the next topic: 3.2 Error messages and tail call elimination First of all, in order to give error messages at all, the interpreter must maintain some extra information, mainly the names of procedures, in additional registers. The main ones are: fun the name of the current procedure ufun the name of the current user-defined procedure this_line the line in ufun's body being evaluated FUN and UFUN will be unequal if we're evaluating a call to a primitive procedure. Logo gives error messages if a return value is expected and not provided (X DIDN'T OUTPUT TO Y) or vice versa (YOU DON'T SAY WHAT TO DO WITH Z). These error messages would be straightforward were it not for tail call elimination. The obvious place to check is right after a call to EVAL-DISPATCH; the caller knows whether it wants a value or not, so it compares the value returned with UNBOUND, giving an error message when appropriate. The call to EVAL-DISPATCH for evaluating an argument would require a return value other than UNBOUND, whereas the one in EVAL-SEQUENCE for expressions other than the last would require UNBOUND. 3.2a Tailforms One complicating factor is tailforms. Consider this Logo program: to foo output print 3 end to baz show foo end When we call BAZ, we should get the error message print didn't output to output in foo But we don't call PRINT and then call OUTPUT; we just tail-call PRINT directly from FOO. So if we're not careful we'll get an incorrect message such as print didn't output to foo print didn't output to show foo didn't output to show On the other hand, consider this program: to foo print 3 end to baz show foo end This time, when we call BAZ, the message should be foo didn't output to show in baz and not anything starting "print didn't output..." To avoid these incorrect error messages, it's not enough to remember "the current procedure". We maintain additional information specifically for the DIDN'T OUTPUT message: didnt_get_output the context (fun, ufun, line) wanting output didnt_output_name the procedure that should be blamed if no o/p These should be thought of as arguments to EVAL-DISPATCH. There are three special values of didnt_get_output: UNBOUND we don't want an output NIL either output or no output is okay (from .MAYBEOUTPUT) (NIL . NIL) this is a macro, and must output, but not for anyone in particular 3.2b Tailforms handled as embedded calls Sometimes it's not good enough to handle STOP and OUTPUT as tail calls. Consider the Logo instruction repeat 5 [... if :x<0 [output 3] ...] This is legal inside a procedure body; the OUTPUT outputs from the enclosing user-defined procedure. But the evaluation of the expression that is the second input to REPEAT isn't a tail evaluation, since after it's done the repeat count must be updated and tested. So when :X is negative we can't just tail-eval the 3; that would return 3 as the value of the entire repeated expression sequence. This OUTPUT is a nonlocal exit, comparable to a THROW. So in this case we actually do call a primitive procedure named OUTPUT. (Never mind for now what OUTPUT does in this case; we'll get back to nonlocal exit later.) 3.2c Caller-status arguments to eval-sequence and eval-dispatch To make all this work, we need an extra argument to EVAL-SEQUENCE and an extra argument to EVAL-DISPATCH; these must be saved and restored with the other evaluator registers. The extra argument to EVAL-DISPATCH is didnt_get_output, mentioned earlier. The extra argument to EVAL-SEQUENCE is named val_status and is an integer containing some combination of the following flag bits: #define VALUE_OK 1 /* [instr instr instr exp] */ #define NO_VALUE_OK 2 /* [instr instr instr instr] */ #define OUTPUT_OK 4 /* [instr instr OUTPUT exp ...] */ #define STOP_OK 8 /* [instr instr STOP ...] */ #define OUTPUT_TAIL 16 /* not [repeat n [... output ...]] */ #define STOP_TAIL 32 /* not [repeat n [... stop ...]] */ Here are all the ways in which EVAL-SEQUENCE is called, with the corresponding values of val_status: entry to evaluator (from Logo prompt) NO_VALUE_OK body of procedure when output wanted OUTPUT_OK | OUTPUT_TAIL body of procedure when no o/p wanted NO_VALUE_OK | STOP_OK | STOP_TAIL body of procedure for .MAYBEOUTPUT NO_VALUE_OK | STOP_OK | STOP_TAIL | OUTPUT_OK | OUTPUT_TAIL RUNRESULT [sequence] VALUE_OK | NO_VALUE_OK | OUTPUT_OK[**] | STOP_OK[**] REPEAT n [sequence] NO_VALUE_OK | OUTPUT_OK[*] | STOP_OK[*] APPLY [sequence] args, output wanted VALUE_OK APPLY [sequence] args, no o/p wanted NO_VALUE_OK | OUTPUT_OK[*] | STOP_OK[*] [*] means that these flags are on only if they were on for the enclosing expression sequence. [**] means that OUTPUT and STOP are actually not okay inside a RUNRESULT, but the RUNRESULT handler lets STOP or OUTPUT be called and then detects and reports the error afterwards. You may wonder why RUNRESULT and REPEAT are special cases here, but not RUN, IF, and IFELSE. We'll discuss that shortly. 3.2d Detecting errors before they happen Sometimes it's not good enough to detect an error after evaluation. These situations are obscure. For example: to blorp :x repeat 5 [pr :x if :x<0 [op 3] make "x :x-1] end ? blorp 2 2 1 0 -1 You don't say what to do with 3 The OP in BLORP would be legal if the top-level instruction had been PRINT BLORP 2. When we see the OP, we know that no output is wanted, but we have to evaluate the input expression (3) anyway, just in case it prints something or has some other side effect. Because the OP is nested inside a REPEAT, it turns out, we can't just let the error be detected downstream; we have to flag the error without letting the REPEAT handler continue. So we non-tail-evaluate the 3, then after the evaluation returns, we flag the error. (Look at label op_want_stop in eval.c to see how this works.) This code is used for all cases of OUTPUT when STOP was wanted, but it's only really necessary in the REPEAT case. 3.3 Macros In the SICP evaluators, IF is a special form. This means that the evaluation of the consequent or alternative of an IF expression happens through a string of tail calls within the evaluator: eval -> eval-if -> eval (of consequent or alternative) Thus, if the entire IF expression is in tail position, the consequent or alternative is also tail-evaluated. (Of course the predicate argument to IF can't be tail-evaluated, because the job of IF isn't finished when that argument has been evaluated; the result must still be tested for true or false, and either the consequent or the alternative must be evaluated.) SICP handles COND differently; instead of directly tail-evaluating the actions of the successful COND clause, the entire expression is rewritten as an IF expression, which is then evaluated: (define (eval exp env) ; SICP page 365 (cond ... ((cond? exp) (EVAL (COND->IF EXP) ENV)) ...)) COND->IF is a rewriting procedure that returns a new expression, which is used as argument to another (tail-recursive) call to EVAL. They could have handled IF as a sort of rewriting, also, except that the rewriting procedure would need access to the environment: (define (if->exp exp env) ; compare with EVAL-IF, SICP p. 367 (if (true? (eval (if-predicate exp) env)) (if-consequent exp) (if-alternative exp))) The general name for such a rewriting procedure is a macro. 3.3a Why the MCE uses special forms Special forms in the MCE have two purposes. First, they delay (IF) or prevent (QUOTE) evaluation of subexpressions; second, they have access to the caller's environment (DEFINE, SET!). Neither of these issues comes up in quite the same way in a Logo interpreter. Delayed evaluation in Logo is done by quoting (including " and [] notations); this is why we say ifelse :x < 0 [print "negative] [print "positive] with brackets around the PRINT instructions, but not around the :X < 0 expression. [In Scheme, parentheses would be used for all three subexpressions: (if (< x 0) (display 'negative) (display 'positive)) and it's the status of IF as a special form that prevents the early evaluation of the last two subexpressions.] Access to the caller's environment isn't a problem for Logo primitives because of dynamic scope; the evaluator's ENV variable, which is a global variable in the C program, contains the correct environment when any primitive is used. So Logo's equivalent to DEFINE and SET!, namely MAKE, is an ordinary primitive. As a result, Logo has only two special forms: TO, because of its strange notation, and .MAYBEOUTPUT, because its "input" expression need not return a value. (This is the above-the-line view.) In principle there's nothing special about RUN, IF, IFELSE, REPEAT, or RUNRESULT. This simple view of the world doesn't quite hold below the line, though, because of tail call elimination. We want to foo if ... [output tail-call-this] ... end to be a tail call, so we can't recursively call the evaluator from inside the IF primitive. 3.3b Using rewriting instead of special forms Instead we make IF a macro -- that is, a rewriting procedure. If the condition is satisfied, it outputs its second input; if not, it outputs the empty list. (IFELSE outputs either its second or its third input; RUN just outputs its input.) The evaluator recognizes (in APPLY-DISPATCH) that a macro is being invoked; instead of just returning what the procedure returns, it splices the return value into the sequence of unevaluated expressions. What "splices" means, more precisely, is unev=(append val unev) [If you're reading carefully you'll notice that I'm having APPLY do something to a sequence of expressions, whereas such a sequence exists only in EVAL-SEQUENCE. Actually APPLY pushes on the control stack a return address of macro_return (so that every call to a macro is a non-tail call, by the way); when we get there, the C instruction stopping_flag = MACRO_RETURN; is executed. Back in EVAL-SEQUENCE, this flag is noted, and that's where the splicing is done. A further complication is that if the macro was in fact called from tail position, we won't return to EVAL-SEQUENCE, which tail-called EVAL-DISPATCH, so instead macro_return has to go to begin_seq (which goes to eval_sequence) itself. If the macro is called when an argument was expected, it must return exactly one expression; the MACRO_RETURN flag is caught at accumulate_arg, and the returned expression is sent to eval_dispatch.] Why not just treat RUN, IF, and IFELSE as special forms internally (that is, handle them as special cases within EVAL-DISPATCH) even though we tell users they're ordinary procedures? Two reasons: 1. The UCBLogo approach allows these to be separate C procedures, outside of eval.c, instead of making the core evaluator know about them. 2. Once we have the macro capability, we can fairly easily make it available to users, through the .MACRO primitive. (Note: As of R5RS, Scheme has a standard rewriting capability available to users, more complicated than ours, but with the same purposes.) 3.3c Logo continuations This is the entire story for RUN, IF, and IFELSE. As we've seen before, REPEAT and RUNRESULT are more complicated, because they both have more work to do after their expression-sequence arguments are evaluated. REPEAT must count down its repetition count and test for zero. RUNRESULT modifies the result of the evaluation, returning [] instead of UNBOUND and [FOO] instead of FOO. REPEAT and RUNRESULT are still considered macros, but they don't return rewritten expressions. Instead they return a special internal data type, called a "continuation." (The name is inspired by Scheme's continuations, and it's a reasonably appropriate name because it does embody "what to do next," but it's not an exact analog of Scheme continuations.) A continuation is a pair whose car is a (representation of a) label within the evaluator, and whose cdr is whatever data the code at that label expects (this generally means the inputs to the macro). The code at macro_return recognizes that the return value was a continuation; it sets VAL to the cdr of the continuation and jumps to the label specified in the car. Since most of the implementation of these Logo primitives is buried inside the core evaluator, they are similar to the special forms of the SICP evaluator. The difference is that they are recognized through the same table lookup used for ordinary procedures, rather than by special tests within EVAL-DISPATCH. GOTO and CATCH are also macros with continuations. GOTO doesn't take an expression sequence as an input; the sense in which it's a rewriting procedure is that it "rewrites" its input into the expression sequence consisting of the part of the current user procedure's body starting at the corresponding TAG and continuing until the end. In this case the resulting expression sequence replaces the previous value of UNEV instead of being spliced into it. We'll discuss CATCH shortly, under the heading of nonlocal exit, but we're not quite ready for that. 3.4 Dynamic scope It's rather a shame, I think, that the second edition of SICP no longer even mentions dynamic scope, so I have to explain what it means before discussing how it's implemented. See also _Computer Science Logo Style_ vol 1 page 49 on dynamic scope, and CSLS vol 3 page 183 on lexical scope. Within a procedure body, how do we handle references to variables that are not local to that procedure itself? In C, any variable reference within a procedure must be either to a variable local to that procedure or to a global variable; one procedure can never refer to another procedure's local variables. In Scheme, one procedure can be defined inside the body of another; the inner procedure can refer to local variables belonging to the outer one. This is called *lexical scope*. [C is lexically scoped, too, but trivially so, since there is no nesting of procedure definitions.] In Logo, when one procedure *invokes* another, the invoked procedure can refer to local variables belonging to the caller. This is called *dynamic* scope. The following would print DYNAMIC in a dynamically-scoped Scheme, but prints LEXICAL in (the actual) lexically-scoped Scheme: (define (a x) (define (b x) (c)) (define (c) x) (b 'dynamic)) (a 'lexical) Focus on the reference to X in the body of procedure C. Since C was invoked by B, its *dynamic environment* is C -> B -> A -> global whereas its *lexical environment* is C -> A -> global because C was defined inside A, not inside B. 3.4a Reasons for lexical scope Why does almost everyone prefer lexical scope? (I prefer it, too, under many circumstances, by the way.) Three reasons: 1. A complier can produce faster compiled code for a lexically scoped language, because the compiler knows which variable is meant by a variable reference without actually running the program. The rules refer only to the physical position of the procedure's definition within the program, not to who calls whom. In a dynamically scoped language, variable references can't be resolved until the program is actually running; the same reference might mean two different variables on two calls to the same procedure. 2. Lexical scope avoids "name capture" bugs, in which the programmer accidentally uses the same name for two different purposes, so that a procedure thinks it's getting one variable X when it really ends up getting a different variable X because the name was reused in a procedure that (directly or indirectly) invokes it. This is the reason most often cited. For the most part I think people who name variables X deserve what they get, but name capture does come up as a problem when writing higher-order functions in Logo, if the names of inputs to the higher-order function are common words that might appear in a template. See CSLS vol 2 page 204. 3. In Scheme, in which lexical scope is combined with first-class procedures (i.e., LAMBDA), that combination allows for persistent local state variables, and therefore for object-oriented programming, without any OOP-specific language syntax. See SICP 3.1 and 3.2 for details. 3.4b Reasons for dynamic scope Why, then, does Logo use dynamic scope? Four reasons: 1. It allows for a simple notation for higher-order functions, using first-class expressions rather than first-class procedures. We can say to add.suffix :suffix :words output map [word ? :suffix] :words end The expression template [WORD ? :SUFFIX] is evaluated inside MAP, not inside ADD.SUFFIX, and yet it has access to the latter's local variable SUFFIX. In Scheme we'd have to use LAMBDA, a more intimidating notation. 2. Some of us think that dynamic scope is just easier for kids and/or novice programmers to think about. If a variable exists, it's available for use, unless shadowed by a more recently created variable of the same name. You don't have to think about scope at all, really. 3. Debugging support is more natural. You can tell Logo to PAUSE whenever there's an error. You then have a Logo prompt, to which you type ordinary Logo instructions, but all the relevant variables are available for inspection. This is important because the actual error in your program might not be in the procedure that died, but rather in the caller of the caller of the caller of that procedure. With dynamic scope, the variables of the erroneous procedure are visible. You don't have to learn special debugging commands that mean "switch to a different environment." 4. It allows for a programming style using "semi-global" variables that are local to a top-level procedure. For example, a program to draw a complicated picture might have a SIZE input, which is then used by its subprocedures, sub-subprocedures, etc. 3.4c Shallow binding There's an efficiency problem with dynamic scope and recursive procedures. Consider the following modification of a common example: make "one 1 to fact :n if :n = 0 [output :one] output :n * fact :n-1 end Suppose we ask for FACT 5. This gives rise to an (embedded) recursive call for FACT 4, which calls FACT 3, which calls FACT 2, which calls FACT 1, which calls FACT 0, which says OUTPUT :ONE. We have to look up the variable name ONE. Is it local to the FACT 0 environment? No. So we look in the dynamically enclosing environment, for the FACT 1 call. Is it there? No, so we look in the FACT 2 environment, the FACT 3 environment, the FACT 4 environment, the FACT 5 environment, and finally the global environment, which is where we find it. This is quite time-consuming, and would be even more so if we wanted the factorial of 100. Here's the solution. Instead of putting new local bindings in a newly created environment frame, and linking that to an enclosing environment, as in SICP 3.2 and 4.1.3, we instead keep the currently active bindings in a single global table. (Since this table is used for every variable reference, we work hard at making it efficient, namely by using a hash table rather than the linear lists of SICP environments.) We still create new frames for procedure calls, but what we put in the new frames are *saved* bindings, the ones we replaced in the global table for our new local variables. These frames are used only when the called procedure returns; we restore the previous state of the global table from the saved values. This is called *shallow binding*. The implication of this technique is that every variable reference, local or global, takes constant time. The cost is that returning from a procedure call takes time proportional to the number of local variables in the procedure. Since all symbols are looked up in the global symbol table, there is no ENV register in the Logo evaluator. Instead there are two registers pointing to a stack of saved values. var_stack points to the head of the stack, where new entries are added; var points to the beginning of the current frame, so that bindings between var and var_stack are the ones that should be restored when an embedded call to eval_dispatch returns. 3.5 Nonlocal exit Despite the proper handling of tail calls, a typical program still gives rise to several nested calls to EVAL-DISPATCH. Ordinarily these are "unwound" one by one, as (Logo) procedures return values. But sometimes we want to unwind several such recursive evaluations at once. The prototypical case is a call to THROW that appears several recursive evaluations below the corresponding CATCH. Were it not for shallow binding, we could in fact leapfrog over several nested evaluations at once, just throwing out their local information, sort of like setjmp/longjmp in C. But instead we must restore all of the saved variable bindings, in the correct order, so we have to let each of the nested EVAL calls return to its caller. But we don't want those intermediate levels to keep computing; the whole point of THROW is to avoid completing some partial evaluations of expression sequences. We need some way to tell EVAL-SEQUENCE to return right away, without evaluating more expressions. This is done using another evaluator register, called stopping_flag, which should be viewed as part of the return value from EVAL. It has the following possible values: RUN program is running STOP non-tail STOP was seen OUTPUT non-tail OUTPUT was seen THROWING THROW was seen MACRO_RETURN a macro is returning a rewritten expression (see 3.3b) Logo.h defines shortcuts to test some of these states: #define NOT_THROWING (stopping_flag != THROWING) #define RUNNING (stopping_flag == RUN) #define STOPPING (stopping_flag == STOP) It's NOT_THROWING because that turns out to be the most commonly used test. The very first thing EVAL-SEQUENCE does is if (!RUNNING) goto fetch_cont; so that if we've seen a THROW (or a non-tail STOP or OUTPUT, as explained in 3.2c) we just return without further evaluation of this sequence. The continuation for CATCH calls EVAL-SEQUENCE for its second argument, then if stopping_flag is THROWING and throw_node, a global variable, is equal to its first argument, it sets stopping_flag back to RUN. (THROW can take an optional second input, which is a value for the corresponding CATCH to return. This works by setting output_node, another global variable, to the thrown value. Non-tail OUTPUT also sets output_node.) The variables throw_node and output_node don't have to be saved and restored around embedded EVAL calls, because only one THROW or OUTPUT can be active at a time. If CATCH catches THROW, who catches non-tail STOP or OUTPUT? EVAL-SEQUENCE does, after restoring registers and before looping for the next expression. And so does REPEAT, so that it won't try repeating its input any more. 3.6 Lack of parentheses delimiting procedure calls The SICP evaluators see an expression sequence as a list in which each element is one complete expression, because every non-atomic Scheme expression is enclosed in parentheses. So, for example, how many arguments are in this procedure call? One less than the number of elements in the list. Easy. Logo has a harder time, because expressions need not be parenthesized, and also because of infix arithmetic notation. The Logo evaluator sees a procedure name, realizes that this is the beginning of a procedure call, and must then look up the procedure in order to know how many input subexpressions to evaluate. Furthermore, some procedures take a variable number of inputs, so the grouping may depend on the use of optional parentheses. This grouping of tokens into subexpressions is slow, and it's wasteful to do it repeatedly for expression sequences in the body of a procedure. So UCBLogo does it once, the first time the procedure is called, and saves the result. In effect each Logo procedure is translated into a Scheme procedure, as if it had been typed in with every subexpression parenthesized and no use of infix. 3.6a Tokenization But I've skipped a step. Even the division of the characters on a line into tokens is problematic. Here's the classic problem: Should the hyphen character automatically be a token by itself? We'd like print 5-2 to work, and so we'd like the 5-2 to be understood as three tokens: 5, -, 2. On the other hand, we'd like print first [555-1212 642-8311 868-9827] to print 555-1212, not 555. There are three ways to resolve this dilemma: "Old LCSI" style: the second example prints 555. This is what Apple Logo, IBM Logo, and other early LCSI products do. "New LCSI" style: the first example gives the error I don't know how to 5-2 This is what Logowriter and later LCSI products do. "Terrapin" style: both examples work as desired. I apologize to non-Americans for naming these after the main USA Logo vendors, but that's the history I know best. UCBLogo uses Terrapin-style tokenization, which I think is clearly the best choice. To make it work, there are two sets of tokenization rules, which I call PARSE and RUNPARSE. These are in fact the names of UCBLogo primitives: ? show parse "5-2 [5-2] ? show runparse "5-2 [5 - 2] When a line is read (from keyboard or file), it is parsed. When and if that is evaluated, it's runparsed -- but even then, text within square brackets is not runparsed. (Such text will be runparsed if it is ever used as input to RUN and friends.) The precise rules are given in more detail in the "Tokenization" section of the UCBLogo User Manual. 3.6b Monadic and dyadic minus The minus sign (-) is particularly thorny for tokenization because it has three different meanings: (1) If it begins a token, and the following character is a digit, then it is part of a negative number token. (2) If it follows an open parenthesis or bracket, or if it follows a space and is not followed by a space, then it is the monadic (one-operand) negation operator. (3) Otherwise, it is the dyadic subtraction operator. The part about spaces in (2) above comes from the problem that function argument expressions are separated by spaces, not commas as in most programming languages. This, along with infix arithmetic, gives rise to an ambiguity. Does foo a - b represent a call to a one-argument function with A minus B as the argument, or a call to a two-argument function with A as the first argument and negative B as the second? The UCBLogo rule is this: foo a-b ; dyadic subtract foo a - b ; dyadic subtract foo a -b ; monadic negate Once runparsing is done, the spacing information is lost. So when a monadic negate is seen during runparsing, it is replaced by the two tokens "0" and "--": ? show runparse [a -b] [a 0 -- b] The double minus sign is an infix operator that represents subtraction but has the highest infix binding strength, so that a * 0 -- b means a*(0-b), not (a*0)-b. It's an undocumented feature that users can type |--| to get this tightly-binding subtraction operator; if they type "--" without vertical bars, they get two separate "-" tokens. 3.6c More on runparsing Once a list has been runparsed, we don't want to have to do it again, so we want to replace the old list value with the new one. But we can't quite do that, because the non-runparsed version might still be needed: to foo :x repeat 4 :x show :x end ? foo [print 5-2] 3 3 3 3 [print 5-2] We wouldn't want the last line to look like [print 5 - 2] but we also don't want to runparse the list four times. The solution is somewhat of a kludge. In UCBLogo every "pair" (as created by CONS) actually contains three components, not two: the car, the cdr, and the "object." At first the list [print 5-2] looks like this: Type: PAIR car: print cdr: [5-2] ; of course this is itself a PAIR with car 5-2 object: NIL After runparsing, it looks like this: Type: RUNPARSE car: print cdr: [5-2] object: [print 5 - 2] The car and cdr of this runparsed list (the parts seen by ordinary procedures such as SHOW) are unchanged, but the object is another list, the runparsed version. If we ask to runparse this list again, the runparse() procedure will notice that its argument is of type RUNPARSE and just return it unchanged. A defect of this approach is that the if for some reason we want to runparse the cdr of the list, we have to do it from scratch, but that rarely happens. (Another defect, since all Logo nodes are the same size, is that even ordinary pairs have to have room for an object field, even though most of these fields are unused. This is a big, although constant factor, waste of memory.) 3.6d Treeification Now we're ready to return to the problem posed at the beginning of 3.6: The form in which we *really* want this instruction list is [print [- 5 2]] That is, we want it fully parenthesized, with prefix operators. (I'm using the word "parenthesized" because that's traditional, but of course what we really want has neither parentheses nor square brackets, but rather list structure with sublists.) Note, by the way, that the Logo instruction print [- 5 2] doesn't subtract 2 from 5! This instruction, in treeified form, looks like [print "[- 5 2]] except that the quotation mark isn't really there, either; it's a node of type QUOTED. The important point is that unlike runparsing, treeification gives rise to something that is *not* in Logo surface syntax, so we don't show it to users; there is no TREEIFY primitive. Treeification is implemented similarly to runparsing; the result is this node: type: TREE car: print cdr: [5-2] object: [print [- 5 2]] 3.6e Procedure bodies Since a line can contain more than one instruction, and since an instruction can be continued onto more than one line, why bother having the concept of lines at all? Why not, like Scheme, treat newlines the same as spaces? That's what Microworlds does, so it's clearly possible. The only reason to maintain the concept of lines as important is for the sake of the user interface. When an error occurs inside a procedure body, the UCBLogo error message includes the line on which the error happened. Also, the STEP command causes a procedure to be run one line at a time. So we might represent a procedure body as a list of lines, each of which is a list of (treeified, eventually) expressions. But then we couldn't use a procedure body as argument to EVAL-SEQUENCE, which expects a list of expressions, not a list of lists of expressions. So a procedure body is a list of expressions, but some of the pairs making up the spine of the list are of type LINE, namely, the first such pair of each line of the body. In these pairs, the object field points to the text of the line (parsed, but not runparsed or treeified). When EVAL-SEQUENCE notices a LINE-type pair, it sets the evaluator register this_line to the pair's object. 3.6f Changing a procedure's arity The *arity* of a procedure is the number of inputs it takes. In UCBLogo, the procedure's arity is actually three numbers: the minimum, default, and maximum number of inputs. In this section we focus on the default number. Consider the following example: to a print (sentence b 1 2 3 4 5) end to b :x :y output :x + :y end When we call A, it should print 3 3 4 5 The first time we call A, its one body line is treeified, with this result: [print [sentence [b 1 2] 3 4 5]] Now suppose we redefine B: to b :x :y :z output :x + :y end We have change B's arity, and so the treeification of A is now incorrect! It should be re-treeified to [print [sentence [b 1 2 3] 4 5]] But if we check the arity of every procedure every time we call A, we've lost the efficiency advantage we gained by treeification. The perfect solution would be to maintain a data structure for each procedure indicating which procedures depend on its arity. Then, if the procedure is redefined in a way that changes the arity, we could re-treeify exactly those procedures that depend on it. But this would be a lot of trouble; UCBLogo, like several other Logo implementations, does something simpler. The principle is that it's pretty rare to redefine a procedure in a way that changes its arity, and so it's okay if doing that slows things down a lot. What's important is to keep the common case -- no redefinition -- fast. The global variable the_generation contains a pair. Its contents are unimportant; it's created with cons(NIL, NIL). What's important is that it's distinct from any other pair. Whenever an existing procedure is redefined in a way that changes its arity, a new pair replaces the_generation. Every LINE node in a procedure body contains a pointer to the pair that was in the_generation at the time this line was treeified. Whenever this line is run, its generation pair is compared with the_generation. If they're not equal, it means that some procedure has changed arity since the line was treeified, and so the line is re-treeified. This means that every line of every procedure must be reparsed after an arity change! This produces a noticeable slowdown. But it doesn't happen often. (Defining a new procedure doesn't require changing the_generation, because a procedure can't be called until all its subprocedures are defined. Remember that the body is treeified when the procedure is first called, not when it's defined. Logo won't save the treeification of a procedure if it has undefined subprocedures.) 4. Data structures and types ---------------------------- The basic unit of storage in Logo is the node. Every user-visible data type (word, number, list, array) and many internal types (runparse, tree, primitive, line, etc.) are stored in nodes. A node contains the following fields: type flags node_type info for garbage collector my_gen, gen_age, mark_gc, next, oldyoung_next other fields by type The type field is a collection of bits, not just an enum, so that tests can easily be made for categories. For example, many types are special-purpose pairs, so they all have the NT_LIST bit set. Numbers, strings, quoted strings, etc., all have the NT_WORD bit set. The bit NT_AGGR stands for "aggregate," which includes lists and arrays. The types are defined in logo.h. 4.1 Pair-based types The ordinary pair is of type CONS. The other pair types are RUN_PARSE, TREE, LINE, and CONT (continuation), all of which were discussed in part 3. The empty list is represented by a zero pointer, but nodetype(0) returns the type PNIL. The constructor for pairs is cons(x,y). The selectors are car, cdr, caar, cadr, cdar, and cddr. (Combined forms more than two deep are not provided in logo.h.) Ordinary pairs don't use the object field; special pairs are generally first made with cons and then mutated with setobject(pair,val). 4.2 Numeric types Numbers are a kind of word (because you can examine their digits with FIRST etc.), so the numeric type codes include the NT_WORD bit. The numeric types are INT (32-bit integer) and FLOATT (sic, because FLOAT is defined in some C header file or other; 64-bit floating point). Someday I'll get around to bignums (arbitrary-precision integers). The constructors are make_intnode and make_floatnode; the selectors (to get back the underlying numeric data) are getint and getfloat. Note that a string containing all digits counts as a number above the line! Such strings of digits result in operations such as butfirst x123 There is a procedure cnv_node_to_numnode that takes a node as its argument and, if possible, returns an equivalent INT or FLOATT node. (The argument may already be a numeric type, in which case it is returned unchanged.) If the argument can't be construed as a number, the procedure flags a BAD_DATA error, so after calling it, you should check if (NOT_THROWING) {...} for whatever computation uses the number. 4.3 String types There are three string types: STRING, BACKSLASH_STRING, and VBAR_STRING. 4.3a Internal structure of a string The string format is based on the goal of making FIRST, LAST, BUTFIRST, and BUTLAST quick for words. The characters themselves are not in the string node, because nodes have a fixed size and strings can be of any length. Instead, the characters are in a block allocated with malloc() in the following format: struct string_block { unsigned FIXNUM str_refcnt; char str_str[1]; /* This array will be of variable length really */ }; The string_block needs a reference count because different word nodes may point to substrings of it. When a word node is garbage collected, the reference count of its string_block is decremented; when the count reaches zero, the block is freed. The word node itself has three fields: #define getstrptr(node) ((node)->n_str) #define getstrlen(node) ((node)->n_len) #define getstrhead(node) ((node)->n_head) (These lines are from logo.h, which has getters and setters for all the node types.) The strptr is a pointer to the first character of the word (not necessarily the first character of the string_block). The strlen is the number of characters in the word. The strhead is a pointer to the string_block, as returned by malloc(). There is a single empty word node, pointed to by the variable Null_Word. Logo takes pains not to create any other empty word nodes, so that all empty words will be EQ? and not merely EQUAL?, to simplify comparisons. 4.3b How to create a string node Words are usually created with NODE *make_strnode(char *strptr, struct string_block *strhead, int len, NODETYPES typ, char *(*copy_routine)()) This constructor is used in two different ways. If you already have a string_block containing the characters you need, and just want to select a substring of it, you say make_strnode(strptr, strhead, len, STRING, ) because the last argument isn't used. If you have the characters in a temporary buffer and have to allocate a string_block for them, you say make_strnode(charptr, NULL, len, STRING, copy_routine) The copy routine is usually strnzcpy: char *strnzcpy(char *s1, char *s2, int n) { strncpy(s1, s2, n); s1[n] = '\0'; return(s1); } This is in logodata.c, along with various special-purpose ones with names like mend_strnzcpy that modify the copied characters in some way. For example, one version strips out comments and line continuation characters because in UCBLogo you can say ? make "foo "abc;comment ~ def ? print :foo abcdef 4.3c Including punctuation characters in words Sometimes users want to include in a word what would ordinarily be word-delimiting punctuation characters. There are two ways to do this: abc\ def backslash before special character |abc def| string of characters in vertical bars Unfortunately both the visible semantics and the underlying implementation of these has changed over time, so many names of procedures are now wrong. Originally there was only the backslash form, and it meant what vertical bars now mean. First, the above-the-line semantics: Backslashed characters are treated as non-punctuation when first seen, but if the word containing a backslashed character is runparsed, the character has its usual special meaning. By contrast, characters within vertical bars are never interpreted specially, even when runparsed. Originally, backslashed characters were special forever, and were specially marked to indicate this. The UCBLogo primitive BACKSLASHEDP checks for this special marking. Alas, backslashed characters are no longer specially marked; the backslash just gets them into the same word as their neighbors when the line is first parsed. This special marking now applies only to punctuation characters that were entered within vertical bars, so the name should be BARREDP or something like that. Now, the ugly below-the-line history. Originally, a punctuation character that was intended to be forever special was marked by having its parity bit set (0200, 0x80). This works in the USA because all the ASCII characters have codes less than 128. Therefore, UCBLogo uses functions setparity(char) -> same char with parity bit on clearparity(char) -> same char with parity bit off getparity(char) -> nonzero if char has parity bit set to manipulate these marked characters. Then European Logo users complained that Logo wasn't properly handling letters with accents, which, it turns out, are represented using ASCII codes greater than 128. The new approach uses otherwise-unused ASCII control characters, with codes less than 32 (040, 0x20, ASCII space). Some of the control characters are "format effectors": tab, backspace, formfeed, newline, return. But the others are pretty useless, and so UCBLogo uses them to represent "backslashed" (really vertical barred) punctuation characters. There are only barely enough of these unused codes for the Logo punctuation characters, though: space, tab, newline, ()[]+-*/=<>"\:;|{}~ (Don't be confused; tab is itself a control code, but backslashed-tab is a different control code!) The special node types BACKSLASH_STRING and VBAR_STRING are used if there are special characters within the word. In fact most of the interpreter doesn't worry about these types; the only important use is that compare_nodes() strips the "parity" from the characters in the strings before comparing them if either word is of either of these types. 4.4 Symbols Scheme distinguishes between a string (an array of characters) and a symbol (an indivisible atom that happens to have a printable name). Strings are for text manipulation; symbols are to name variables and the like. Logo, above the line, uses a single Word type that subsumes both of these purposes. Nevertheless, it's useful to maintain a distinction internally. When you want to find a procedure or variable in the symbol table, you don't want to spend time comparing strings letter by letter to find it. The internal equivalent of a Scheme symbol is called an "object" -- an unfortunate choice since we plan to add object-oriented programming to Logo. But for now, let's understand that the word "object" refers to this internal Logo data structure. An object is a list with the following elements: [canonical procedure value plist flags caseobj1 caseobj2 ...] The "canonical" element is a caseobj, which will be explained later. The procedure, value, and plist elements are the ones named by this symbol (the procedure FOO, the variable FOO, and the property list FOO, for example). These elements are UNDEFINED, UNBOUND, and NIL, respectively, if the symbol does not name a procedure, a variable, or a property list. The flags element is an INT node containing the following flags: #define PROC_BURIED 01 #define VAL_BURIED 02 #define PLIST_BURIED 04 #define PROC_TRACED 010 #define VAL_TRACED 020 #define PLIST_TRACED 040 #define PROC_STEPPED 0100 #define VAL_STEPPED 0200 #define PLIST_STEPPED 0400 #define PROC_MACRO 01000 #define PERMANENT 02000 The meaning of BURIED, TRACED, and STEPPED is explained in the user documentation of the Logo primitives BURY, TRACE, and STEP. (It is meaningless to step a property list, but the flag exists anyway because various primitives know that these flags come in groups of three.) PROC_MACRO means that the symbol's procedure is a macro; PERMANENT means that this symbol should not be deleted during garbage collection, even if it has no procedure, variable, or property list. (This feature is used, for example, for the special variables that users can set to control Logo's behavior, such as ERRACT and CASEIGNOREDP. Pointers to these symbols are kept in global variables so that Logo doesn't have to look them up in the symbol table each time they're used, so it's important that the symbol not be deleted and recreated.) The remaining elements are nodes of type CASEOBJ, for "case object." In Logo, names of procedures, variables, and property lists are case insensitive, so FOO and Foo and foo all name the same procedure. When a program is runparsed, all the words that might name procedures, etc., are turned from strings into symbols, so that when the program is run, the named procedures, etc., can be found quickly, by dereferencing pointers in the program, without string manipulation. But we want to remember the exact way the user typed the name, in case we print it. This may be clearer with an example. Consider these instructions: make "Foo 3 print "Foo In the first instruction, we really don't care that the user said Foo rather than FOO or some other capitalization, but in the second instruction, we want to print the word exactly as typed. But the parser doesn't know anything about the semantics of MAKE or PRINT, let alone some user-defined procedure that might do both. So we want to turn these strings into symbols, but we also want to remember the original strings. A case object is a pair whose car is a string and whose cdr is an object. Given a case object, we can dereference its car to print it, or dereference its cdr to find the procedure, variable, or property list that it names. Each object includes all of its case objects as elements, so that when we delete the object we can delete the CASEOBJs also. (This is therefore a circular structure, since the object points to the caseobj and the caseobj points to the object.) Each object also includes a "canonical caseobj," which is the one with all lower case letters; a canonical caseobj is created for every object even if the user never types the name that way. The canonical caseobj is used for case-independent comparisons. When an object is created, it is also entered into Logo's global environment, which is a hash table. The hash function is based on the canonical string. This process -- creating the object, creating the caseobj as spelled by the user, creating the canonical caseobj, and entering the object into the hash table -- is called *interning* the symbol. The procedure intern(word) takes a word of any type (number, string, caseobj, etc.) and returns the caseobj with the spelling used in the argument. If the word has already been interned, intern() finds the existing object in the hash table. If not, one is created. If the word has been interned, but not with this spelling (that is, not with this upper-lower-case pattern), a new caseobj is created that points to the existing object. Note that a caseobj is a pair, but it has NT_WORD on and NT_LIST off in its type identifier, because Logo primitives should treat it as a word, not as a list. 4.5 Quote and colon types When a line containing the notations "FOO or :FOO is parsed, these strings are converted to nodes of type QUOTE and type COLON, respectively. These nodes are pairs in which only the car is meaningful; it points to a caseobj of the word without the leading quote or colon. Like the CASEOBJ type, the QUOTE and COLON types are words above the line but pairs internally. 4.6 Arrays Like strings, arrays are represented as nodes that point to an external block of memory. Here are the selectors for array nodes: #define getarrdim(node) ((node)->n_dim) #define getarrorg(node) ((node)->n_org) #define getarrptr(node) ((node)->n_array) The array dimension is the number of elements in it. The array origin is the index used for the first element of the array (1 by default, often 0, but can be anything). The array pointer points to the actual data, which is a block of pointers to nodes. There is no need for a reference count in array blocks, because there are no primitives that extract a subarray; if you want one, you must allocate a new array and copy the desired elements manually. 4.7 Primitive procedures There are several node type codes for primitive procedures: PRIM, MACRO, TAILFORM, and INFIX. Macros are described in section 3.3; tailforms are in section 3.1; the infix operators are the usual + - * / =. All other primitives are of type PRIM. The fields of a primitive are #define getprimfun(node) ((node)->n_pfun) #define getprimmin(node) ((node)->n_pmin) #define getprimmax(node) ((node)->n_pmax) #define getprimdflt(node) ((node)->n_pdef) #define getprimpri(node) ((node)->n_ppri) Fun is a pointer to the C procedure that implements the primitive; min is the minimum number of inputs; max is the maximum number; dflt is the default number; pri is the priority of this primitive, used in treeification of expressions that involve infix operators. Multiplication and division are highest priority (tightest binding); then addition and subtraction; then comparisons; and lowest of all are prefix operators. The four numbers are stored as short (16-bit) integers, so that all five fields fit in no more space than the three pointers of a cons node. All primitive procedures are of C type NODE *foo(NODE *args) They are given a list of actual argument values and must return a (pointer to a) node, or UNBOUND if the Logo primitive should not return a value. 5. Garbage collector -------------------- This section is not a primer on garbage collection. A good general survey on this subject is Paul R. Wilson. Uniprocessor garbage collection techniques. In Proc of International Workshop on Memory Management in the Springer-Verlag Lecture Notes in Computer Science series., St. Malo, France, September 1992. http://www.cs.utexas.edu/users/oops/papers.html#gcsurvey Even before reading Wilson, read SICP 5.3 if you're a gc novice. UCBLogo uses a generational, mark-sweep garbage collector. When the interpreter needs to allocate a node, it calls newnode(), which looks for an available node. If no nodes are free, newnode() calls do_gc(), which disables pause and stop interrupts and calls gc(). But the main purpose of do_gc is that it allocates a lot of local variables, so that any register variables in its caller will be forced onto the C stack. Do_gc() and gc() take a Boolean argument, which is FALSE for a generational garbage collection and TRUE for a full garbage collection. Automatically triggered gc is generational; a full GC can be requested by the user (see the user documentation of the Logo GC command) and is implied by the use of the NODES operation, so that the in-use count shown to the user will be correct. 5.1 Node allocation All Logo data types are stored in fixed-size blocks of type (struct node), which is given the typedef name NODE. Logo allocates many of these nodes at a time; the number allocated at once can be set by the user (with the .SETSEGSIZE command), but is initially 2000 for DOS, 4000 for 68000 Mac, and 16,000 for other platforms. The global variable segment_list points to a linked list of segments; a "segment" is a contiguous block of nodes. The global variable free_list points to a linked list of unused nodes. There is only one free list, not one per segment. Segments are never deallocated, even if every node in the segment is free. A new segment is allocated only if a gc fails to free up enough nodes, so that Logo's total memory use doesn't grow unnecessarily. 5.2 The mark phase Marking a node can lead to several other nodes that should be marked. To keep track of these pending tasks, Logo uses a fixed-size stack, of size 4000 for DOS, 8000 for 68000 Mac, or 16,000 for other platforms. Long lists should not cause overruns of this stack; it's the depth of lists that matters. If the stack overflows, garbage collection stops, and the user is advised to save data and quit. (Logo maintains a small "reserve tank" of nodes so that this saving will be possible.) All node-valued global variables in the interpreter are marked first. This includes evaluator registers, some of which are not in individual C variables but in a (struct registers) block. The global variable Regs_Node is a node that points to this register block; the node itself is unused except by the garbage collector. Among the C globals are stack, which is the evaluator's data stack (a list of nodes, not a contiguous block), and var_stack, which is the stack of local procedure-call frames (containing shadowed bindings as explained in 3.4c above). Then the entries in Logo's global symbol table (the hash table) are marked. Finally, the C stack is examined. Since we don't know which entries in the stack are pointers to nodes, every value on the stack is examined to see if it could possibly be a pointer to a node. This is done by procedure valid_pointer(), which first compares the address with the position and size of each segment. If the value is within a segment, the procedure then sees whether it would address the beginning of a node within that segment. If so, the garbage collector assumes that the value is indeed a node pointer, and marks the node. This procedure is one of the places where optimizing C compilers tend to produce code that doesn't work. Some machines (DOS and 68000 Mac) have 32-bit addresses but require only 16-bit alignment. The garbage collector therefore, on those platforms, looks at overlapping 32-bit values. Also, stacks grow upward in some systems and downward in others; Logo tries to figure this out. (Almost the first thing main() does is to set the global variable bottom_stack to the address of its local variable exec_list; gc() compares this with the address of its own stack frame to determine the direction of growth.) This is a good place to look for problems when porting Berkeley Logo to a new processor or operating system. All of the above categories of marking are done only for nodes in the current generation. The garbage collector then looks for nodes in older generations that have been modified to point to newer nodes. To make this check possible, the list mutators (the C procedures setcar, setcdr, and setobject) check for old-to-young pointing as they do the mutation, and keep lists of these old-to-young-pointing nodes. 5.3 GCTWA If a single-generation gc doesn't yield enough free space, older generations are examined. When a full gc is required, Logo also performs a GCTWA (Garbage Collect Truly Worthless Atoms). Here's what that means: Ordinarily, every word read in a Logo instruction is entered into the symbol table, just in case it will become the name of a procedure, variable, or property list. Since the symbol table itself is marked, and since the symbol table points to all these symbols, the symbols are never found to be free in the mark phase. A GCTWA goes through the symbol table looking for entries that are not, in fact, the names of a procedure, variable, or property list. (A subtlety is that a symbol's value might be UNBOUND even though it is in fact a global variable, because the global binding might have been shadowed by a LOCAL command, creating a local variable that doesn't yet have a value. But this isn't a problem because in that case var_stack points to the symbol table entry, so it will be marked.) Some symbols have a PERMANENT flag associated with them, so that the entries won't be removed in GCTWA even if the names are unused; these are mainly for Logo special variables such as CaseIgnoredP. The first step in a gctwa is that all caseobj nodes are flagged; in the mark phase, mark() will not actually mark a flagged caseobj until it is called twice for the same caseobj. (The first call to mark() for a flagged caseobj just clears the flag; the second call does the normal mark operation.) This is because every caseobj is pointed to (directly or indirectly) by the hash table, and we want to know whether this caseobj is pointed to by something else, usually by appearing in the body of a procedure. After this special mark phase, the symbol table is examined for unused symbols. A symbol is used if it names a variable, procedure, or property list, or if one of its caseobj nodes has been marked. Unused symbols are removed from the symbol table. Finally, the mark phase is repeated so that non-caseobj nodes that are part of stale symbols won't be marked. 5.4 The sweep phase In addition to finding and freeing unused nodes, the sweep phase also promotes nodes that have survived a certain number of garbage collections to the next older generation. This promotion requires checking whether the node points to other nodes that are now younger than it is. If the sweep phase doesn't free enough nodes, it tries another generation. When all generations have been collected, if there still are not enough free nodes, Logo asks the operating system for another segment. If that fails, the user is notified. "Enough" is one of several tuning values defined in mem.c. Besides the size of a segment, there are three more: /* Number of times to collect at the current GC state before going to the next state. Basically the number of times a given generation is collected before its members are moved to an older generation */ #define gc_age_threshold 4 /* A new segment of nodes is added if fewer than freed_threshold nodes are freed in one GC run */ #define freed_threshold ((long int)(seg_size * 0.4)) /* The number of generations */ #define NUM_GENS 4 5.5 Per-node gc data Each node contains five words of information to support gc: int my_gen; /* Nodes's Generation */ /*GC*/ int gen_age; /* How many times to GC at this generation */ long int mark_gc; /* when marked */ struct logo_node *next; /* Link together nodes of the same age */ /*GC*/ struct logo_node *oldyoung_next; my_gen is a number in the range [0, NUM_GENS-1]. It is zero for newly allocated nodes, and increases as the node survives multiple GCs. gen_age is in the range [1, gc_age_threshold]. It is initially gc_age_threshold, and is decreased by 1 at each gc. When it hits zero, the node is promoted to a higher (older) generation, and gen_age is reset to gc_age_threshold. mark_gc is initially zero. To mark a node, it is set equal to current_gc, a counter that's incremented at each garbage collection. (If Logo runs long enough for four billion garbage collections, this won't work. :-) next is a pointer to another node in the same generation as this node; the generations are maintained as linked lists. oldyoung_next is NIL except for old nodes that point to younger nodes. Such nodes are linked together using this field. That's five words of gc information in a node that has four words of non-gc information! There has to be a better way, a project for the list of undone projects. ucblogo-6.1/pbdevelopment.plist0000664000175000017500000000043113557147341015043 0ustar jjcjjc PBXProjectSourcePath /Users/joe/UCBLogo/UCBLogo.xcode ucblogo-6.1/nographics.h0000664000175000017500000000472213557147341013437 0ustar jjcjjc /* A dummy graphics header file for computers without graphics */ #define GR_SIZE 1 #define prepare_to_draw nop() #define done_drawing nop() #define prepare_to_draw_turtle nop() #define done_drawing_turtle nop() #define screen_left 1 #define screen_right 100 #define screen_top 1 #define screen_bottom 100 #define screen_height (1 + screen_bottom - screen_top) #define screen_width (1 + screen_right - screen_left) #define screen_x_center (screen_left + (screen_width)/2) #define screen_y_center (screen_top + (screen_height)/2) #define turtle_left_max ((screen_left) - (screen_x_center)) #define turtle_right_max ((screen_right) - (screen_x_center)) #define turtle_top_max ((screen_y_center) - (screen_top)) #define turtle_bottom_max ((screen_y_center) - (screen_bottom)) #define screen_x_coord ((screen_x_center) + turtle_x) #define screen_y_coord ((screen_y_center) - turtle_y) #define turtle_height 18 #define turtle_half_bottom 6.0 #define turtle_side 19.0 #define clear_screen nop() #define line_to(x,y) nop() #define move_to(x,y) nop() #define draw_string(s) nop() #define set_pen_vis(v) nop() #define set_pen_mode(m) nop() #define set_pen_color(c) nop() #define set_pen_width(w) nop() #define set_pen_height(h) nop() #define set_pen_x(x) nop() #define set_pen_y(y) nop() #define set_back_ground(c) nop() /* pen_info is a stucture type with fields for the various pen characteristics including the location, size, color, mode (e.g. XOR or COPY), pattern, visibility (0 = visible) */ typedef struct { int dummy; } pen_info; #define p_info_x(p) p.dummy #define p_info_y(p) p.dummy #define pen_width pw #define pen_height ph #define pen_color pc #define pen_mode pm #define pen_vis pv #define pen_x px #define pen_y py #define get_node_pen_pattern make_intnode(0) #define back_ground bg #define pen_reverse nop() #define pen_erase nop() #define pen_down nop() #define button FALSE #define mouse_x 0 #define mouse_y 0 #define full_screen nop() #define split_screen nop() #define text_screen nop() #define save_pen(p) nop() #define restore_pen(p) nop() #define plain_xor_pen() nop() #define label(s) nop() #define tone(p,d) nop() #define get_pen_pattern(p) nop() #define set_pen_pattern(p) nop() #define fmod(x,y) x #define set_list_pen_pattern(p) nop() #define prepare_to_draw_turtle nop(); #define done_drawing_turtle nop(); extern int pw, ph, pc, pm, pv, px, py, bg; extern void nop(); #define logofill nop #define set_palette nop #define get_palette nop #define erase_screen nop ucblogo-6.1/nographics.c0000664000175000017500000000031013557147341013417 0ustar jjcjjc /* A dummy graphics implementation for Unix */ #ifdef X_DISPLAY_MISSING int pw, ph, pc, pm, pv, px, py, bg; #ifndef HAVE_WX char *LogoPlatformName="Unix-Nographics"; void nop() { } #endif #endif ucblogo-6.1/newtermnotes0000664000175000017500000001007413557147341013603 0ustar jjcjjc How the GUI communicates with Logo in wxWidgets: Everything is done with a single thread. We have overriden the main event loop from wxWidgets (via LogoApplication::OnRun()), and events are handled periodically through calls to check_wx_stop(), which calls LogoEventManager::ProcessEvents(). To prevent yielding too much time for event checking, we have a "fudge factor" that delays how often we yield to the wxWidgets GUI event checking code, and a parameter that let's us force yielding if we are say polling for user input. All events (key press events, window resize, etc) are handled during the yield. There is a trade-off between responsiveness in the UI (how fast the GUI recognizes that a key has been pressed) and overall speed of the program (when crunching numbers or painting) when adjusting the fudge factor. Character buffers in wxTerminal: char input_buffer[MAXINBUFF]; //stores typed input (before send to logo) in wxMain: char output_buffer[MAXOUTBUFF]; //stores output to send to terminal (from logo) char buff[BUFF_LEN]; //stores input to send to logo (from input_buffer) When polling for input, any typed characters are stored in input_buffer, which keeps track of total characters and where the cursor position is (because you can use the left and right arrow keys to go back). When the enter key is pressed, one line is put into the logo buffer (buff) and will be read from logo. Whenever logo needs to print characters to screen, the characters are put in output_buffer and will be displayed by the GUI. Terminal Display Character Storage The contents of the terminal are stored in a linked list of character arrays. There are two structures, one that stores the actual characters and mode flags (bold, standout mode, etc), and one that stores line information (where each line starts). Both are linked lists of blocks. struct wxterm_char_buffer { unsigned char cbuf[WXTERM_CB_SIZE]; //characters unsigned char mbuf[WXTERM_CB_SIZE]; //mode flags wxterm_char_buffer *next; //next part of buffer } ; struct wxterm_charpos { wxterm_char_buffer *buf; //which char buffer int offset; //offset into buffer int line_length; //length of line } ; A charpos points to some character in the character buffer. There are macros to help navigate. (line_length may or may not be used, depending on the situation). char_of(charpos) retrieves the character referenced by charpos mode_of(charpos) retrieves the mode of the character referenced by charpos inc_charpos(charpos) puts charpos to next character (goes to next block if necessary) adjust_charpos(charpos) if offset too large, adjusts charpos so that it points to the right block (commonly used to jump many characters forward) struct wxterm_line_buffer { wxterm_charpos lbuf[WXTERM_LB_SIZE]; //lines wxterm_line_buffer *next; //next part of buffer }; struct wxterm_linepos { wxterm_line_buffer *buf; //which line buffer int offset; //offset into line buffer }; A linepos references a particular line. A line is just a charpos, keeping track of where the start of the line is, and how long the line is. There are macros to help navigate this structure as well: line_of(linepos) gets line referenced by linepos. inc_linepos(linepos) puts linepos to next line adjust_linepos(linepos) if offset is too large, adjusts linepos so it points to the right block. So, our terminal references the start of the character buffer / line buffer with wxterm_char_buffer *term_chars; wxterm_line_buffer *term_lines; and references the current position (where the cursor is) with wxterm_charpos curr_char_pos; wxterm_linepos curr_line_pos; With this, it's easy to retrieve a particular line: wxterm_linepos wxTerminal::GetLinePosition(int y) { wxterm_linepos lpos; lpos.buf = term_lines; lpos.offset = y; adjust_linepos(lpos); return lpos; } Set the offset and adjust the position! DebugOutputBuffer() can be called to print out the contents and properties of the terminal. ucblogo-6.1/makelib0000775000175000017500000005127513557147341012470 0ustar jjcjjcmkdir -p logolib cp Messages* logolib cat << "ENDOFFILE" > logolib/# ;;; -*- logo -*- to # if not namep "template.number [op repcount] op :template.number end bury "# ENDOFFILE cat << "ENDOFFILE" > logolib/\` ;;; -*- logo -*- to ` :backq.list [:backq.depth 0] if emptyp :backq.list [op []] if equalp first :backq.list "` ~ [op fput "` fput (` first bf :backq.list :backq.depth+1) (` bf bf :backq.list :backq.depth)] if and wordp first :backq.list equalp first first :backq.list ", ~ [op backq.unquote (bf first :backq.list) (bf :backq.list) :backq.depth] if and wordp first :backq.list memberp first first :backq.list [" :] ~ [op backq.word (first first :backq.list) (bf first :backq.list) (bf :backq.list) :backq.depth] if wordp first :backq.list ~ [op fput first :backq.list (` bf :backq.list :backq.depth)] op fput (` first :backq.list :backq.depth) (` bf :backq.list :backq.depth) end to backq.word :backq.symbol :backq.word :backq.rest :backq.depth if emptyp :backq.word ~ [output fput :backq.symbol (` :backq.rest :backq.depth)] if not equalp first :backq.word ", ~ [output fput (word :backq.symbol :backq.word) (` :backq.rest :backq.depth)] localmake "result backq.unquote (bf :backq.word) :backq.rest :backq.depth if wordp :result [output word :backq.symbol :result] output fput (word :backq.symbol first :result) bf :result end to backq.unquote :unquote.symbol :unquote.rest :unquote.depth localmake "unquote.splicing "false if not emptyp :unquote.symbol [ if equalp first :unquote.symbol "@ [ make "unquote.splicing "true make "unquote.symbol butfirst :unquote.symbol ]] if :unquote.depth=0 [ if emptyp :unquote.symbol [output backq.combine run first :unquote.rest (` bf :unquote.rest :unquote.depth)] output backq.combine run :unquote.symbol (` :unquote.rest :unquote.depth) ] if emptyp :unquote.symbol ~ [output fput (ifelse :unquote.splicing [",@] [",]) fput (` first :unquote.rest :unquote.depth-1) (` bf :unquote.rest :unquote.depth)] if backq.all.commas :unquote.symbol ~ [output fput (ifelse :unquote.splicing [",@] [",]) fput (` (list :unquote.symbol first :unquote.rest) :unquote.depth-1) (` bf :unquote.rest :unquote.depth)] output fput (ifelse :unquote.splicing [",@] [",]) ~ fput (` (list :unquote.symbol) :unquote.depth-1) ~ (` :unquote.rest :unquote.depth) end to backq.combine :this :those output ifelse :unquote.splicing [se :this :those] [fput :this :those] end to backq.all.commas :word if emptyp :word [output "true] if equalp first :word ", ~ [if emptyp butfirst :word [output "true] if equalp first butfirst :word "@ [output backq.all.commas bf bf :word] output backq.all.commas butfirst :word] output "false end bury [` backq.word backq.unquote backq.combine backq.all.commas] ENDOFFILE cat << "ENDOFFILE" > logolib/\?rest ;;; -*- logo -*- to ?rest [:which 1] output bf item :which :template.lists end bury "?rest ENDOFFILE cat << "ENDOFFILE" > logolib/backslashedp ;;; -*- logo -*- to backslashedp :char op vbarredp :char end bury "backslashedp ENDOFFILE cat << "ENDOFFILE" > logolib/backslashed\? ;;; -*- logo -*- to backslashed? :char op vbarredp :char end bury "backslashed? ENDOFFILE cat << "ENDOFFILE" > logolib/buryall ;;; -*- logo -*- to buryall bury contents end bury "buryall ENDOFFILE cat << "ENDOFFILE" > logolib/buryname ;;; -*- logo -*- to buryname :names bury namelist :names end bury "buryname ENDOFFILE cat << "ENDOFFILE" > logolib/cascade ;;; -*- logo -*- to cascade :cascade.limit [:cascade.inputs] 3 if numberp :cascade.limit ~ [if lessp :cascade.limit 0 ~ [(throw "error (se [cascade doesn't like] :cascade.limit [as input]))] ~ make "cascade.limit `[greaterp :template.number ,[int :cascade.limit]]] local [cascade.templates template.vars cascade.final] make "cascade.templates [] make "template.vars [] make "cascade.final [?1] cascade.setup :cascade.inputs op cascade1 1 :template.vars end to cascade.setup :inputs if emptyp :inputs [stop] if emptyp bf :inputs [make "cascade.final first :inputs stop] make "cascade.templates lput first :inputs :cascade.templates make "template.vars lput first bf :inputs :template.vars cascade.setup bf bf :inputs end to cascade1 :template.number :template.vars if apply :cascade.limit :template.vars [op apply :cascade.final :template.vars] op cascade1 (:template.number+1) (cascade.eval :cascade.templates) end to cascade.eval :cascade.templates if emptyp :cascade.templates [op []] op fput (apply first :cascade.templates :template.vars) ~ (cascade.eval bf :cascade.templates) end bury [cascade cascade.setup cascade1 cascade.eval] ENDOFFILE cat << "ENDOFFILE" > logolib/cascade.2 ;;; -*- logo -*- to cascade.2 [:cascade2.inputs] 5 op apply "cascade :cascade2.inputs end bury "cascade.2 ENDOFFILE cat << "ENDOFFILE" > logolib/case ;;; -*- logo -*- .macro case :case.value :case.clauses [:caseignoredp "true] catch "case.error [output case.helper :case.value :case.clauses] (throw "error [Empty CASE clause]) end to case.helper :case.value :case.clauses if emptyp :case.clauses [output []] if emptyp first :case.clauses [throw "case.error] if or equalp first first :case.clauses "else ~ memberp :case.value first first :case.clauses ~ [output butfirst first :case.clauses] output case.helper :case.value butfirst :case.clauses end bury [case case.helper] ENDOFFILE cat << "ENDOFFILE" > logolib/closeall ;;; -*- logo -*- to closeall foreach allopen [close ?] end bury "closeall ENDOFFILE cat << "ENDOFFILE" > logolib/combine ;;; -*- logo -*- to combine :this :those if wordp :those [output word :this :those] output fput :this :those end bury "combine ENDOFFILE cat << "ENDOFFILE" > logolib/cond ;;; -*- logo -*- .macro cond :cond.clauses localmake "cond.result cond.helper :cond.clauses if equalp first :cond.result "error [(throw "error last :cond.result)] output last :cond.result end to cond.helper :cond.clauses if emptyp :cond.clauses [output [[] []]] if emptyp first :cond.clauses [output [error [Empty COND clause]]] if equalp first first :cond.clauses "else ~ [output list [] butfirst first :cond.clauses] ignore error catch "error [localmake "cond.result run first first :cond.clauses] localmake "cond.error error if not emptyp :cond.error [output list "error item 2 :cond.error] if not memberp :cond.result [true false] ~ [output list "error fput :cond.result [not TRUE or FALSE]] if :cond.result [output list [] butfirst first :cond.clauses] output cond.helper butfirst :cond.clauses end bury [cond cond.helper] ENDOFFILE cat << "ENDOFFILE" > logolib/crossmap ;;; -*- logo -*- to crossmap :cm.template [:cm.lists] 2 if emptyp bf :cm.lists [op cm1 first :cm.lists 1 []] op cm1 :cm.lists 1 [] end to cm1 :cm.lists :cm.level :template.vars if emptyp :cm.lists [op (list apply :cm.template :template.vars)] op cm2 first :cm.lists end to cm2 :cm.thislist if emptyp :cm.thislist [op []] local :cm.level make :cm.level first :cm.thislist op se (cm1 bf :cm.lists :cm.level+1 lput first :cm.thislist :template.vars) ~ (cm2 bf :cm.thislist) end bury [crossmap cm1 cm2] ENDOFFILE cat << "ENDOFFILE" > logolib/dequeue ;;; -*- logo -*- to dequeue :the.queue.name local "result make "result first thing :the.queue.name make :the.queue.name butfirst thing :the.queue.name output :result end bury "dequeue ENDOFFILE cat << "ENDOFFILE" > logolib/do.until ;;; -*- logo -*- .macro do.until :until.instr :until.cond op se :until.instr (list "until :until.cond :until.instr) end bury "do.until ENDOFFILE cat << "ENDOFFILE" > logolib/do.while ;;; -*- logo -*- .macro do.while :while.instr :while.cond op se :while.instr (list "while :while.cond :while.instr) end bury "do.while ENDOFFILE cat << "ENDOFFILE" > logolib/edall ;;; -*- logo -*- to edall edit contents end bury "edall ENDOFFILE cat << "ENDOFFILE" > logolib/edn ;;; -*- logo -*- to edn :names edit namelist :names end bury "edn ENDOFFILE cat << "ENDOFFILE" > logolib/edns ;;; -*- logo -*- to edns edit names end bury "edns ENDOFFILE cat << "ENDOFFILE" > logolib/edpl ;;; -*- logo -*- to edpl :names edit pllist :names end bury "edpl ENDOFFILE cat << "ENDOFFILE" > logolib/edpls ;;; -*- logo -*- to edpls edit plists end bury "edpls ENDOFFILE cat << "ENDOFFILE" > logolib/edps ;;; -*- logo -*- to edps edit procedures end bury "edps ENDOFFILE cat << "ENDOFFILE" > logolib/emacs.debug ;;; -*- logo -*- to emacs.debug :file_elisp_code :trace_or_step localmake "wr_elisp_code writer if namep "printwidthlimit [ localmake "pw_elisp_code :printwidthlimit ern "printwidthlimit] openwrite :file_elisp_code setwrite :file_elisp_code bury [[] [wr_elisp_code pw_elisp_code file_elisp_code trace_or_step] []] (foreach contents run (list :trace_or_step) [PROCEDURES: VARIABLES: PROPERTIES:] [[names debugged title] [pr :title pr [] pr map [[name] [op ifelse memberp :name :debugged [(word "\( :name "\))] [:name]]] :names pr []]]) close :file_elisp_code setwrite :wr_elisp_code if namep "pw_elisp_code [make "printwidthlimit :pw_elisp_code] end bury "emacs.debug ENDOFFILE cat << "ENDOFFILE" > logolib/ern ;;; -*- logo -*- to ern :names erase namelist :names end bury "ern ENDOFFILE cat << "ENDOFFILE" > logolib/erpl ;;; -*- logo -*- to erpl :names erase pllist :names end bury "erpl ENDOFFILE cat << "ENDOFFILE" > logolib/filep ;;; -*- logo -*- to filep :filename ignore error catch "error [openread :filename close :filename] output emptyp error end bury "filep ENDOFFILE cat << "ENDOFFILE" > logolib/file\? ;;; -*- logo -*- to file? :filename ignore error catch "error [openread :filename close :filename] output emptyp error end bury "file? ENDOFFILE cat << "ENDOFFILE" > logolib/filter ;;; -*- logo -*- to filter :filter.template :template.list [:template.number 1] ~ [:template.lists (list :template.list)] if emptyp :template.list [op :template.list] if apply :filter.template (list first :template.list) ~ [op combine (first :template.list) ~ (filter :filter.template bf :template.list :template.number+1)] op (filter :filter.template bf :template.list :template.number+1) end to ?rest [:which 1] output bf item :which :template.lists end bury [filter ?rest] ENDOFFILE cat << "ENDOFFILE" > logolib/find ;;; -*- logo -*- to find :find.template :template.list [:template.number 1] ~ [:template.lists (list :template.list)] if emptyp :template.list [op []] if apply :find.template (list first :template.list) [op first :template.list] op (find :find.template bf :template.list :template.number+1) end to ?rest [:which 1] output bf item :which :template.lists end bury [find ?rest] ENDOFFILE cat << "ENDOFFILE" > logolib/for ;;; -*- logo -*- .macro for :for.values :for.instr ~ [:for.var first :for.values] ~ [:for.initial run first bf :for.values] ~ [:for.final run first bf bf :for.values] ~ [:for.step forstep] ~ [:for.tester (ifelse :for.step < 0 ~ [[:for.initial < :for.final]] ~ [[:for.initial > :for.final]])] local :for.var catch "for.catchtag [op for.done runresult [forloop :for.initial]] op [] end to forloop :for.initial make :for.var :for.initial if run :for.tester [throw "for.catchtag] run :for.instr .maybeoutput forloop (:for.initial + :for.step) end to for.done :for.result if emptyp :for.result [op [stop]] op (list "output "first (list first :for.result)) end to forstep if equalp count :for.values 4 [op run last :for.values] op ifelse :for.initial > :for.final [-1] [1] end bury [for forstep forloop for.done] ENDOFFILE cat << "ENDOFFILE" > logolib/foreach ;;; -*- logo -*- .macro foreach [:foreach.inputs] 2 catch "foreach.catchtag ~ [op foreach.done runresult ~ [foreach1 bl :foreach.inputs last :foreach.inputs 1]] op [] end to foreach1 :template.lists :foreach.template :template.number if emptyp first :template.lists [throw "foreach.catchtag] apply :foreach.template firsts :template.lists .maybeoutput foreach1 bfs :template.lists :foreach.template :template.number+1 end to foreach.done :foreach.result if emptyp :foreach.result [op [stop]] op (list "output "first (list first :foreach.result)) end to ?rest [:which 1] output bf item :which :template.lists end bury [foreach foreach1 foreach.done ?rest] ENDOFFILE cat << "ENDOFFILE" > logolib/gensym ;;; -*- logo -*- to gensym if not namep "gensym.number [make "gensym.number 0] make "gensym.number :gensym.number + 1 output word "g :gensym.number end bury [[gensym] [gensym.number]] ENDOFFILE cat << "ENDOFFILE" > logolib/ignore ;;; -*- logo -*- to ignore :stuff end bury "ignore ENDOFFILE cat << "ENDOFFILE" > logolib/invoke ;;; -*- logo -*- to invoke :invoked.function [:invoke.inputs] 2 .maybeoutput apply :invoked.function :invoke.inputs end bury "invoke ENDOFFILE cat << "ENDOFFILE" > logolib/iseq ;;; -*- logo -*- to iseq :a :b if not (:a > :b) [output iseq1 :a :b] output map [[x] -1 * :x] iseq1 (-1 * :a) (-1 * :b) end to iseq1 :a :b if :a > :b [output []] output fput :a iseq1 :a + 1 :b end bury [iseq iseq1] ENDOFFILE cat << "ENDOFFILE" > logolib/localmake ;;; -*- logo -*- .macro localmake :name :value output (list "local (word "" :name) "apply ""make (list :name :value)) end bury "localmake ENDOFFILE cat << "ENDOFFILE" > logolib/macroexpand ;;; -*- logo -*- to macroexpand :expr local [name inputlist macro.result] make "name first :expr make "inputlist bf :expr if not macrop :name [(throw "error (se :name [is not a macro.]))] define "%%%$%macro.procedure text :name make "macro.result run fput "%%%$%macro.procedure :inputlist erase "%%%$%macro.procedure op :macro.result end bury "macroexpand ENDOFFILE cat << "ENDOFFILE" > logolib/map ;;; -*- logo -*- to map :map.template [:template.lists] 2 op map1 :template.lists 1 end to map1 :template.lists :template.number if emptyp first :template.lists [output first :template.lists] output combine (apply :map.template firsts :template.lists) ~ (map1 bfs :template.lists :template.number+1) end to ?rest [:which 1] output bf item :which :template.lists end bury [map map1 ?rest] ENDOFFILE cat << "ENDOFFILE" > logolib/map.se ;;; -*- logo -*- to map.se :map.se.template [:template.lists] 2 op map.se1 :template.lists 1 end to map.se1 :template.lists :template.number if emptyp first :template.lists [output []] output sentence (apply :map.se.template firsts :template.lists) ~ (map.se1 bfs :template.lists :template.number+1) end to ?rest [:which 1] output bf item :which :template.lists end bury [map.se map.se1 ?rest] ENDOFFILE cat << "ENDOFFILE" > logolib/mdarray ;;; -*- logo -*- to mdarray :sizes [:origin 1] local "array make "array (array first :sizes :origin) if not emptyp bf :sizes ~ [for [i :origin [:origin + (first :sizes) - 1]] ~ [setitem :i :array (mdarray bf :sizes :origin)]] output :array end bury "mdarray ENDOFFILE cat << "ENDOFFILE" > logolib/mditem ;;; -*- logo -*- to mditem :index :array if emptyp :index [op :array] op mditem bf :index item first :index :array end bury "mditem ENDOFFILE cat << "ENDOFFILE" > logolib/mdsetitem ;;; -*- logo -*- to mdsetitem :index :array :val setitem last :index (mditem bl :index :array) :val end bury "mdsetitem ENDOFFILE cat << "ENDOFFILE" > logolib/name ;;; -*- logo -*- to name :name.value.input :name.variable.input make :name.variable.input :name.value.input end bury "name ENDOFFILE cat << "ENDOFFILE" > logolib/namelist ;;; -*- logo -*- to namelist :names if wordp :names [output list [] (list :names)] output list [] :names end bury "namelist ENDOFFILE cat << "ENDOFFILE" > logolib/pen ;;; -*- logo -*- to pen op (list (ifelse pendownp ["pendown] ["penup]) ~ penmode pensize pencolor penpattern) end bury [pen] ENDOFFILE cat << "ENDOFFILE" > logolib/pick ;;; -*- logo -*- to pick :list output item (1+random count :list) :list end bury "pick ENDOFFILE cat << "ENDOFFILE" > logolib/pllist ;;; -*- logo -*- to pllist :names if wordp :names [output (list [] [] (list :names))] output (list [] [] :names) end bury "pllist ENDOFFILE cat << "ENDOFFILE" > logolib/poall ;;; -*- logo -*- to poall po contents end bury "poall ENDOFFILE cat << "ENDOFFILE" > logolib/pon ;;; -*- logo -*- to pon :names ignore error catch "error [po namelist :names] local "err make "err error if not emptyp :err [(throw "error first bf :err)] end bury "pon ENDOFFILE cat << "ENDOFFILE" > logolib/pons ;;; -*- logo -*- to pons po names end bury "pons ENDOFFILE cat << "ENDOFFILE" > logolib/pop ;;; -*- logo -*- to pop :the.stack.name local "result make "result first thing :the.stack.name make :the.stack.name butfirst thing :the.stack.name output :result end bury "pop ENDOFFILE cat << "ENDOFFILE" > logolib/popl ;;; -*- logo -*- to popl :names ignore error catch "error [po pllist :names] local "err make "err error if not emptyp :err [(throw "error first bf :err)] end bury "popl ENDOFFILE cat << "ENDOFFILE" > logolib/popls ;;; -*- logo -*- to popls po plists end bury "popls ENDOFFILE cat << "ENDOFFILE" > logolib/pops ;;; -*- logo -*- to pops po procedures end bury "pops ENDOFFILE cat << "ENDOFFILE" > logolib/pots ;;; -*- logo -*- to pots pot procedures end bury "pots ENDOFFILE cat << "ENDOFFILE" > logolib/push ;;; -*- logo -*- to push :the.stack.name :the.item.value make :the.stack.name fput :the.item.value thing :the.stack.name end bury "push ENDOFFILE cat << "ENDOFFILE" > logolib/queue ;;; -*- logo -*- to queue :the.queue.name :the.item.value make :the.queue.name lput :the.item.value thing :the.queue.name end bury "queue ENDOFFILE cat << "ENDOFFILE" > logolib/quoted ;;; -*- logo -*- to quoted :stuff if wordp :stuff [op word "" :stuff] op :stuff end bury "quoted ENDOFFILE cat << "ENDOFFILE" > logolib/reduce ;;; -*- logo -*- to reduce :reduce.function :reduce.list if emptyp bf :reduce.list [op first :reduce.list] op apply :reduce.function (list (first :reduce.list) ~ (reduce :reduce.function bf :reduce.list)) end bury "reduce ENDOFFILE cat << "ENDOFFILE" > logolib/remdup ;;; -*- logo -*- to remdup :list output filter [not memberp ? ?rest] :list end bury "remdup ENDOFFILE cat << "ENDOFFILE" > logolib/remove ;;; -*- logo -*- to remove :thing :list output filter [not equalp ? :thing] :list end bury "remove ENDOFFILE cat << "ENDOFFILE" > logolib/reverse ;;; -*- logo -*- to reverse :in [:out ifelse listp :in [[]] ["]] if emptyp :in [output :out] output (reverse bf :in combine first :in :out) end bury "reverse ENDOFFILE cat << "ENDOFFILE" > logolib/rseq ;;; -*- logo -*- to rseq :a :b :n output map [[x] :a + :x * (:b - :a) / (:n - 1)] iseq 0 :n - 1 end bury "rseq ENDOFFILE cat << "ENDOFFILE" > logolib/savel ;;; -*- logo -*- to savel :cont :file [:oldwr writer] openwrite :file setwrite :file po :cont setwrite :oldwr close :file end bury "savel ENDOFFILE cat << "ENDOFFILE" > logolib/setpen ;;; -*- logo -*- to setpen :pen_data ifelse equalp first bf :pen_data "reverse ~ [penreverse] ~ [ifelse equalp first bf :pen_data "erase ~ [penerase] ~ [penpaint]] ifelse equalp first :pen_data "penup [penup] [pendown] setpensize first bf bf :pen_data setpencolor first bf bf bf :pen_data setpenpattern first bf bf bf bf :pen_data end bury [setpen] ENDOFFILE cat << "ENDOFFILE" > logolib/transfer ;;; -*- logo -*- to transfer :transfer.limit :transfer.template :transfer.init output cascade.2 (ifelse emptyp :transfer.limit ~ [[emptyp ?2]] ~ [list "transfer.end.test :transfer.limit]) ~ :transfer.template [] [butfirst ?2] :transfer.init end to transfer.end.test :the.condition.expression if emptyp ?2 [output "true] output run :the.condition.expression end to ?in output first ?2 end to ?out output ?1 end bury [transfer transfer.end.test ?in ?out] ENDOFFILE cat << "ENDOFFILE" > logolib/unburyall ;;; -*- logo -*- to unburyall unbury buried end ENDOFFILE cat << "ENDOFFILE" > logolib/unburyname ;;; -*- logo -*- to unburyname :names unbury namelist :names end bury "unburyname ENDOFFILE cat << "ENDOFFILE" > logolib/until ;;; -*- logo -*- .macro until :until.cond :until.instr if run :until.cond [op []] op se :until.instr (list "until :until.cond :until.instr) end bury "until ENDOFFILE cat << "ENDOFFILE" > logolib/while ;;; -*- logo -*- .macro while :while.cond :while.instr if not run :while.cond [op []] op se :while.instr (list "while :while.cond :while.instr) end bury "while ENDOFFILE cat << "ENDOFFILE" > logolib/xcor ;;; -*- logo -*- to xcor output first pos end bury "xcor ENDOFFILE cat << "ENDOFFILE" > logolib/ycor ;;; -*- logo -*- to ycor output last pos end bury "ycor ENDOFFILE ucblogo-6.1/makehelp.c0000664000175000017500000000650713575571772013077 0ustar jjcjjc#include #include #include char line[100], line2[100], line3[100]; char name[30] = "helpfiles/"; char name2[30] = "helpfiles/"; char tocname[20], tocname2[20]; main() { FILE *in=fopen("usermanual", "r"); FILE *fp, *fp2; FILE *toc=fopen("helpfiles/HELPCONTENTS", "w"); FILE *tmp=fopen("helptemp", "w"); FILE *all=fopen("helpfiles/ALL_NAMES", "w"); char ch, *cp, *np, *tp; int intab, three, col=5; if (toc == NULL) { fprintf(stderr, "Can't open HELPCONTENTS.\n"); exit(1); } fputs("Help is available on the following:\n\n", toc); fgets(line, 100, in); while (line[0] != '-') fgets(line, 100, in); while (!feof(in)) { for (cp = line, np = &name[10], tp = tocname; (ch = *cp) == '.' || (ch >= 'A' && ch <= 'Z') || ch == '`' || ch == '0' || ch == '1'; cp++) { *tp++ = tolower(ch); if (ch == '.') ch='d'; *np++ = tolower(ch); } if (cp == line || (ch != ' ' && ch != '\t' && ch != '\n')) { fgets(line, 100, in); continue; } *tp = *np = '\0'; if (name[11] == '\0' && name[10] != '`') { fgets(line, 100, in); continue; } line2[1] = 'x'; fgets(line2, 100, in); if ((ch = line2[1]) == '-' || ch == '=') { fgets(line, 100, in); continue; } fp = fopen(name, "w"); if (fp == NULL) { fprintf(stderr, "Can't open %s\n", name); exit(1); } fprintf(tmp, "%s\n", tocname); fprintf(all, "%s\n", tocname); three = 0; ch = line2[0]; if (ch == '.' || (ch >= 'A' && ch <= 'Z')) { for (cp = line2, np = &name2[10], tp = tocname2; (ch = *cp) == '.' || (ch >= 'A' && ch <= 'Z') || ch == '?'; cp++) { *tp++ = tolower(ch); if (ch == '.') ch='d'; if (ch == '?') three++; *np++ = tolower(ch); } *tp = *np = '\0'; if (tp != tocname2 && strcmp(tocname, tocname2)) fprintf(all, "%s\n", tocname2); if (three) { fp2 = NULL; fgets(line3, 100, in); tp = tocname2; if ((ch = line3[0]) == '.' || (ch >= 'A' && ch <= 'Z')) { for (cp = line3, np = &name2[10]; (ch = *cp) == '.' || (ch >= 'A' && ch <= 'Z') || ch == '?'; cp++) { *tp++ = tolower(ch); if (ch == '.') ch='d'; *np++ = tolower(ch); } *tp = *np = '\0'; } else name2[10] = '\0'; if (tp != tocname2) fprintf(all, "%s\n", tocname); } if (name2[10] != '\0') { fp2 = fopen(name2, "w"); if (fp2 == NULL) { fprintf(stderr, "Can't open %s\n", name2); exit(1); } } else fp2 = NULL; } else fp2 = NULL; fputs(line, fp); fputs(line2, fp); if (three) fputs(line3, fp); if (fp2) { fputs(line, fp2); fputs(line2, fp2); if (three) fputs(line3, fp); } intab = 0; fgets(line, 100, in); while (!feof(in)) { if (intab && line[0] != '\t' && line[0] != '\n') break; if (!intab && line[0] == '\t') intab++; fputs(line, fp); if (fp2) fputs(line, fp2); fgets(line, 100, in); } fclose(fp); if (fp2) fclose(fp2); } fprintf(tmp, ".defmacro\n"); /* looks like abbrev for .macro */ fprintf(tmp, "+\n-\n*\n/\n=\n<\n>\n"); /* infix operators */ fprintf(tmp, "<=\n>=\n<>\n"); /* two-char infix */ fclose(tmp); fprintf(all, "+\n-\n*\n/\n=\n<\n>\n"); /* infix operators */ fprintf(all, "<=\n>=\n<>\n"); /* two-char infix */ fclose(all); fclose(toc); exit(0); } ucblogo-6.1/makefile.in0000664000175000017500000000677313601420003013221 0ustar jjcjjcCC = @CC@ CFLAGS = @CFLAGS@ @CPPFLAGS@ @X_CFLAGS@ -O0 -DUSE_OLD_TTY CXX = @CXX@ CXXFLAGS = @CXXFLAGS@ LDFLAGS = @LDFLAGS@ LIBS = @X_PRE_LIBS@ @X_LIBS@ @LIBS@ @X_EXTRA_LIBS@ prefix = @prefix@ BINDIR = $(prefix)/bin LIBLOC = $(prefix)/lib/logo LINKER = @LINKER@ # LIBLOC = `pwd` OBJS = coms.o error.o eval.o files.o graphics.o init.o intern.o \ libloc.o lists.o logodata.o main.o math.o mem.o paren.o parse.o \ print.o wrksp.o nographics.o git.o obj.o @WXOFILES@ @TERMOFILE@ @GRAPHICSOFILE@ SRCS = coms.c error.c eval.c files.c graphics.c init.c intern.c \ libloc.c lists.c logodata.c main.c math.c mem.c paren.c parse.c \ print.c wrksp.c nographics.c obj.c @WXSRCFILES@ @TERMFILE@ @GRAPHICSFILE@ HDRS = globals.h logo.h xgraphics.h logo: $(OBJS) $(LINKER) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o logo everything: logo logolib/Messages helpfiles helpfiles/HELPCONTENTS #logo-mode mem.o: mem.c $(CC) $(CFLAGS) -O0 -c mem.c git.c: $(SRCS) echo 'char* GIT = "('`git describe||echo NA|tr -d '\r'`')";' > git.c tags: $(SRCS) ctags --format=1 -N $(SRCS) $(HDRS) # ctags -t $(SRCS) $(HDRS) libloc.c: echo 'char *libloc="'$(LIBLOC)'/logolib";' > libloc.c echo 'char *helploc="'$(LIBLOC)'/helpfiles";' >> libloc.c echo 'char *cslsloc="'$(LIBLOC)'/csls";' >> libloc.c echo 'char *temploc="/tmp";' >> libloc.c echo 'char *separator="/";' >> libloc.c logolib/Messages: makelib Messages chmod +x makelib ./makelib cp -f Messages logolib helpfiles: mkdir helpfiles helpfiles/HELPCONTENTS: makehelp usermanual ./makehelp sort helptemp | pr -5 -t -l999 -w80 >> helpfiles/HELPCONTENTS rm helptemp makehelp: makehelp.c $(CC) -o makehelp makehelp.c clean: rm -f *.o libloc.c # cd emacs; $(MAKE) clean ship: rm -f config.h config.cache config.log config.status rm -f makefile makehelp logo *.o libloc.c # cd emacs; $(MAKE) ship cd docs; $(MAKE) ship install: everything for d in $(BINDIR) $(LIBLOC) $(LIBLOC)/logolib $(LIBLOC)/helpfiles $(LIBLOC)/csls; do [ -d $$d ] || mkdir -p $$d || exit 1; done cp logo $(BINDIR)/. cp -f logolib/* $(LIBLOC)/logolib/. cp -f helpfiles/* $(LIBLOC)/helpfiles/. cp -f csls/* $(LIBLOC)/csls/. # (cd emacs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE) install) (cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE) install) # prefix=$(prefix); LIBLOC=$(LIBLOC); BINDIR=$(BINDIR); export prefix LIBLOC BINDIR; cd emacs; $(MAKE) install logo-mode: # (cd emacs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE)) # @prefix=$(prefix); LIBLOC=$(LIBLOC); BINDIR=$(BINDIR); export prefix LIBLOC BINDIR; cd emacs; $(MAKE) make-docs: (cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) $(MAKE) all) mac: everything mkdir -p UCBLogo.app mkdir -p UCBLogo.app/Contents cp Info.plist UCBLogo.app/Contents/ cp PkgInfo UCBLogo.app/Contents/ cp pbdevelopment.plist UCBLogo.app/Contents/ mkdir -p UCBLogo.app/Contents/Resources/csls cp csls/[a-z]* UCBLogo.app/Contents/Resources/csls cp -r helpfiles UCBLogo.app/Contents/Resources/ cp -r logolib UCBLogo.app/Contents/Resources/ cp logo.icns UCBLogo.app/Contents/Resources/ mkdir -p UCBLogo.app/Contents/MacOS/ cp logo UCBLogo.app/Contents/MacOS/UCBLogo ucblogo.dmg : mac rm -f ucblogo.dmg ucblogo_base.dmg hdiutil create -size 15m -fs HFS+ -volname "UCBLogo" ucblogo_base.dmg hdiutil attach ucblogo_base.dmg cp -a UCBLogo.app /Volumes/UCBLogo/ cp docs/usermanual.pdf /Volumes/UCBLogo/UCBLogoUserManual.pdf hdiutil detach /Volumes/UCBLogo/ hdiutil convert ucblogo_base.dmg -format UDZO -o ucblogo.dmg ucblogo-6.1/makefile.cygwin0000664000175000017500000000750213577775676014153 0ustar jjcjjcCC = gcc -mno-cygwin CFLAGS = -g -O -DHAVE_WX -DX_DISPLAY_MISSING -O0 -mno-cygwin CXX = g++ -mno-cygwin CXXFLAGS = -DHAVE_WX -I/usr/local/lib/wx/include/msw-ansi-debug-static-2.8 -I/usr/local/include/wx-2.8 -D__WXDEBUG__ -D__WXMSW__ -mthreads -mno-cygwin LDFLAGS = -mno-cygwin -mwindows LIBS = -lm -L/usr/local/lib -mno-cygwin -mwindows -mthreads -mno-cygwin -mwindows -Wl,--subsystem,windows -mwindows /usr/local/lib/libwx_mswd_richtext-2.8.a /usr/local/lib/libwx_mswd_aui-2.8.a /usr/local/lib/libwx_mswd_qa-2.8.a /usr/local/lib/libwx_mswd_html-2.8.a /usr/local/lib/libwx_mswd_adv-2.8.a /usr/local/lib/libwx_mswd_core-2.8.a /usr/local/lib/libwx_based_net-2.8.a /usr/local/lib/libwx_based-2.8.a -lwxregexd-2.8 -lwxtiffd-2.8 -lwxjpegd-2.8 -lwxpngd-2.8 -lwxzlibd-2.8 -lrpcrt4 -loleaut32 -lole32 -luuid -lwinspool -lwinmm -lshell32 -lcomctl32 -lcomdlg32 -lctl3d32 -ladvapi32 -lwsock32 -lgdi32 -lcurses prefix = /usr/local BINDIR = $(prefix)/bin LIBLOC = $(prefix)/lib/logo LINKER = $(CXX) # LIBLOC = `pwd` OBJS = coms.o error.o eval.o files.o graphics.o init.o intern.o \ libloc.o lists.o logodata.o main.o math.o mem.o paren.o parse.o \ print.o wrksp.o nographics.o svn.o wxMain.o wxTerminal.o wxTurtleGraphics.o TextEditor.o wxterm.o SRCS = coms.c error.c eval.c files.c graphics.c init.c intern.c \ libloc.c lists.c logodata.c main.c math.c mem.c paren.c parse.c \ print.c wrksp.c nographics.c wxMain.cpp wxTerminal.cpp wxTurtleGraphics.cpp TextEditor.cpp wxterm.c HDRS = globals.h logo.h xgraphics.h all: logo logolib/Messages helpfiles helpfiles/HELPCONTENTS logo-mode mem.o: mem.c $(CC) $(CFLAGS) -O0 -c mem.c logo: $(OBJS) $(LINKER) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o logo svn.c: $(SRCS) echo 'char* SVN = "('`svnversion|tr -d '\r'`')";' > svn.c tags: $(SRCS) ctags --format=1 -N $(SRCS) $(HDRS) # ctags -t $(SRCS) $(HDRS) libloc.c: echo 'char *libloc="'$(LIBLOC)'/logolib";' > libloc.c echo 'char *helploc="'$(LIBLOC)'/helpfiles";' >> libloc.c echo 'char *cslsloc="'$(LIBLOC)'/csls";' >> libloc.c echo 'char *temploc="/tmp";' >> libloc.c echo 'char *separator="/";' >> libloc.c logolib/Messages: makelib Messages chmod +x makelib ./makelib cp -f Messages logolib helpfiles: mkdir helpfiles helpfiles/HELPCONTENTS: makehelp usermanual ./makehelp sort helptemp | pr -5 -t -w80 >> helpfiles/HELPCONTENTS rm helptemp makehelp: makehelp.c $(CC) -o makehelp makehelp.c clean: rm -f *.o libloc.c cd emacs; $(MAKE) clean ship: rm -f config.h config.cache config.log config.status rm -f makefile makehelp logo *.o libloc.c cd emacs; $(MAKE) ship cd docs; $(MAKE) ship install: all for d in $(BINDIR) $(LIBLOC) $(LIBLOC)/logolib $(LIBLOC)/helpfiles $(LIBLOC)/csls; do [ -d $$d ] || mkdir -p $$d || exit 1; done cp logo $(BINDIR)/. cp -f logolib/* $(LIBLOC)/logolib/. cp -f helpfiles/* $(LIBLOC)/helpfiles/. cp -f csls/* $(LIBLOC)/csls/. (cd emacs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE) install) (cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE) install) # prefix=$(prefix); LIBLOC=$(LIBLOC); BINDIR=$(BINDIR); export prefix LIBLOC BINDIR; cd emacs; $(MAKE) install logo-mode: (cd emacs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE)) # @prefix=$(prefix); LIBLOC=$(LIBLOC); BINDIR=$(BINDIR); export prefix LIBLOC BINDIR; cd emacs; $(MAKE) make-docs: (cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) $(MAKE) all) mac: all mkdir -p UCBLogo.app mkdir -p UCBLogo.app/Contents cp Info.plist UCBLogo.app/Contents/ cp PkgInfo UCBLogo.app/Contents/ cp pbdevelopment.plist UCBLogo.app/Contents/ mkdir -p UCBLogo.app/Contents/Resources cp -r csls UCBLogo.app/Contents/Resources/ cp -r helpfiles UCBLogo.app/Contents/Resources/ cp -r logolib UCBLogo.app/Contents/Resources/ mkdir -p UCBLogo.app/Contents/MacOS/ cp logo UCBLogo.app/Contents/MacOS/UCBLogo ucblogo-6.1/mac-makefile0000664000175000017500000000641113557147341013364 0ustar jjcjjcCC = gcc CFLAGS = -g -O -DHAVE_WX -O0 CXX = g++ CXXFLAGS = -DHAVE_WX -I/usr/local/lib/wx/include/mac-ansi-release-static-2.8 -I/usr/local/include/wx-2.8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES -D__WXMAC__ LDFLAGS = LIBS = -lm -L/usr/local/lib `wx-config --libs` -lz -ldl -lm -ltermcap prefix = /usr/local BINDIR = $(prefix)/bin LIBLOC = $(prefix)/lib/logo LINKER = $(CXX) # LIBLOC = `pwd` OBJS = coms.o error.o eval.o files.o graphics.o init.o intern.o \ libloc.o lists.o logodata.o main.o math.o mem.o paren.o parse.o \ print.o wrksp.o nographics.o actions.o states.o utils.o vt52_states.o keytrans.o wxMain.o wxTerminal.o wxTurtleGraphics.o gterm.o TextEditor.o wxterm.o SRCS = coms.c error.c eval.c files.c graphics.c init.c intern.c \ libloc.c lists.c logodata.c main.c math.c mem.c paren.c parse.c \ print.c wrksp.c nographics.c actions.cpp states.cpp utils.cpp vt52_states.cpp keytrans.cpp wxMain.cpp wxTerminal.cpp wxTurtleGraphics.cpp gterm.cpp TextEditor.cpp wxterm.c HDRS = globals.h logo.h xgraphics.h all: logo logolib/Messages helpfiles helpfiles/HELPCONTENTS logo-mode mem.o: mem.c $(CC) $(CFLAGS) -O0 -c mem.c logo: $(OBJS) $(LINKER) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o logo tags: $(SRCS) ctags --format=1 -N $(SRCS) $(HDRS) # ctags -t $(SRCS) $(HDRS) libloc.c: echo 'char *libloc="'$(LIBLOC)'/logolib";' > libloc.c echo 'char *helploc="'$(LIBLOC)'/helpfiles";' >> libloc.c echo 'char *cslsloc="'$(LIBLOC)'/csls";' >> libloc.c echo 'char *temploc="/tmp";' >> libloc.c echo 'char *separator="/";' >> libloc.c logolib/Messages: makelib Messages chmod +x makelib ./makelib cp -f Messages logolib helpfiles: mkdir helpfiles helpfiles/HELPCONTENTS: makehelp usermanual ./makehelp sort helptemp | pr -5 -t -w80 >> helpfiles/HELPCONTENTS rm helptemp makehelp: makehelp.c $(CC) -o makehelp makehelp.c clean: rm -f *.o libloc.c cd emacs; $(MAKE) clean ship: rm -f config.h config.cache config.log config.status rm -f makefile makehelp logo *.o libloc.c cd emacs; $(MAKE) ship cd docs; $(MAKE) ship install: all for d in $(BINDIR) $(LIBLOC) $(LIBLOC)/logolib $(LIBLOC)/helpfiles $(LIBLOC)/csls; do [ -d $$d ] || mkdir -p $$d || exit 1; done cp logo $(BINDIR)/. cp -f logolib/* $(LIBLOC)/logolib/. cp -f helpfiles/* $(LIBLOC)/helpfiles/. cp -f csls/* $(LIBLOC)/csls/. (cd emacs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE) install) (cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE) install) # prefix=$(prefix); LIBLOC=$(LIBLOC); BINDIR=$(BINDIR); export prefix LIBLOC BINDIR; cd emacs; $(MAKE) install logo-mode: (cd emacs; prefix=$(prefix) LIBLOC=$(LIBLOC) BINDIR=$(BINDIR) $(MAKE)) # @prefix=$(prefix); LIBLOC=$(LIBLOC); BINDIR=$(BINDIR); export prefix LIBLOC BINDIR; cd emacs; $(MAKE) make-docs: (cd docs; prefix=$(prefix) LIBLOC=$(LIBLOC) $(MAKE) all) make mac: all mkdir UCBLogo.app mkdir UCBLogo.app/Contents cp Info.plist UCBLogo.app/Contents/ cp PkgInfo UCBLogo.app/Contents/ cp pbdevelopment.plist UCBLogo.app/Contents/ mkdir UCBLogo.app/Contents/Resources cp -r csls UCBLogo.app/Contents/Resources/ cp -r helpfiles UCBLogo.app/Contents/Resources/ cp -r logolib UCBLogo.app/Contents/Resources/ mkdir UCBLogo.app/Contents/MacOS/ mv logo UCBLogo.app/Contents/MacOS/UCBLogo ucblogo-6.1/mac-fontmod.tar0000664000175000017500000031000013557147341014032 0ustar jjcjjc./include/wx/mac/carbon/fontdlg.h0100644000076500001430000001052111052666361015766 0ustar bhunknown///////////////////////////////////////////////////////////////////////////// // Name: wx/mac/carbon/fontdlg.h // Purpose: wxFontDialog class using fonts window services (10.2+). // Author: Ryan Norton // Modified by: // Created: 2004-09-25 // RCS-ID: $Id: fontdlg.h,v 1.13 2006/11/12 23:34:38 VZ Exp $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_FONTDLG_H_ #define _WX_FONTDLG_H_ #include "wx/dialog.h" #include "wx/cmndata.h" /* * Font dialog */ #ifndef wxMAC_USE_EXPERIMENTAL_FONTDIALOG #if MAC_OS_X_VERSION_MAX_ALLOWED <= MAC_OS_X_VERSION_10_2 #define wxMAC_USE_EXPERIMENTAL_FONTDIALOG 0 #else #define wxMAC_USE_EXPERIMENTAL_FONTDIALOG 1 #endif #endif #if wxMAC_USE_EXPERIMENTAL_FONTDIALOG class WXDLLEXPORT wxFontDialog : public wxDialog { public: wxFontDialog(); wxFontDialog(wxWindow *parent, const wxFontData& data); virtual ~wxFontDialog(); bool Create(wxWindow *parent, const wxFontData& data); int ShowModal(); wxFontData& GetFontData() { return m_fontData; } protected: wxFontData m_fontData; DECLARE_DYNAMIC_CLASS_NO_COPY(wxFontDialog) }; extern "C" int RunMixedFontDialog(wxFontDialog* dialog) ; #else // wxMAC_USE_EXPERIMENTAL_FONTDIALOG #if !USE_NATIVE_FONT_DIALOG_FOR_MACOSX /*! * Forward declarations */ class wxFontColourSwatchCtrl; class wxFontPreviewCtrl; class WXDLLEXPORT wxSpinCtrl; class WXDLLEXPORT wxSpinEvent; class WXDLLEXPORT wxListBox; class WXDLLEXPORT wxChoice; class WXDLLEXPORT wxButton; class WXDLLEXPORT wxStaticText; class WXDLLEXPORT wxCheckBox; /*! * Control identifiers */ #define wxID_FONTDIALOG_FACENAME 20001 #define wxID_FONTDIALOG_FONTSIZE 20002 #define wxID_FONTDIALOG_BOLD 20003 #define wxID_FONTDIALOG_ITALIC 20004 #define wxID_FONTDIALOG_UNDERLINED 20005 #define wxID_FONTDIALOG_COLOUR 20006 #define wxID_FONTDIALOG_PREVIEW 20007 #endif // !USE_NATIVE_FONT_DIALOG_FOR_MACOSX class WXDLLEXPORT wxFontDialog: public wxDialog { DECLARE_DYNAMIC_CLASS(wxFontDialog) #if !USE_NATIVE_FONT_DIALOG_FOR_MACOSX DECLARE_EVENT_TABLE() #endif public: wxFontDialog(); wxFontDialog(wxWindow *parent, const wxFontData& data); virtual ~wxFontDialog(); bool Create(wxWindow *parent, const wxFontData& data); int ShowModal(); wxFontData& GetFontData() { return m_fontData; } bool IsShown() const; void OnPanelClose(); void SetData(const wxFontData& data); #if !USE_NATIVE_FONT_DIALOG_FOR_MACOSX /// Creates the controls and sizers void CreateControls(); /// Initialize font void InitializeFont(); /// Set controls according to current font void InitializeControls(); /// Respond to font change void ChangeFont(); /// Respond to colour change void OnColourChanged(wxCommandEvent& event); /// wxEVT_COMMAND_LISTBOX_SELECTED event handler for wxID_FONTDIALOG_FACENAME void OnFontdialogFacenameSelected( wxCommandEvent& event ); /// wxEVT_COMMAND_SPINCTRL_UPDATED event handler for wxID_FONTDIALOG_FONTSIZE void OnFontdialogFontsizeUpdated( wxSpinEvent& event ); /// wxEVT_COMMAND_TEXT_UPDATED event handler for wxID_FONTDIALOG_FONTSIZE void OnFontdialogFontsizeTextUpdated( wxCommandEvent& event ); /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for wxID_FONTDIALOG_BOLD void OnFontdialogBoldClick( wxCommandEvent& event ); /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for wxID_FONTDIALOG_ITALIC void OnFontdialogItalicClick( wxCommandEvent& event ); /// wxEVT_COMMAND_CHECKBOX_CLICKED event handler for wxID_FONTDIALOG_UNDERLINED void OnFontdialogUnderlinedClick( wxCommandEvent& event ); /// wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK void OnOkClick( wxCommandEvent& event ); /// Should we show tooltips? static bool ShowToolTips(); wxListBox* m_facenameCtrl; wxSpinCtrl* m_sizeCtrl; wxCheckBox* m_boldCtrl; wxCheckBox* m_italicCtrl; wxCheckBox* m_underlinedCtrl; wxFontColourSwatchCtrl* m_colourCtrl; wxFontPreviewCtrl* m_previewCtrl; wxFont m_dialogFont; bool m_suppressUpdates; #endif // !USE_NATIVE_FONT_DIALOG_FOR_MACOSX protected: wxWindow* m_dialogParent; wxFontData m_fontData; void* m_pEventHandlerRef; }; #endif #endif // _WX_FONTDLG_H_ ./include/wx/mac/carbon/private.h0100644000076500001430000006622311054103027016000 0ustar bhunknown///////////////////////////////////////////////////////////////////////////// // Name: private.h // Purpose: Private declarations: as this header is only included by // wxWidgets itself, it may contain identifiers which don't start // with "wx". // Author: Stefan Csomor // Modified by: // Created: 1998-01-01 // RCS-ID: $Id: private.h,v 1.40.2.5 2006/03/24 13:01:18 JS Exp $ // Copyright: (c) Stefan Csomor // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #ifndef _WX_PRIVATE_H_ #define _WX_PRIVATE_H_ #include "wx/defs.h" #include "wx/app.h" #ifdef __DARWIN__ # include #else # include # include # include # include # include # include # include # include # include # include #endif #if UNIVERSAL_INTERFACES_VERSION < 0x0342 #error "please update to Apple's lastest universal headers from http://developer.apple.com/sdk/" #endif #ifndef MAC_OS_X_VERSION_10_3 #define MAC_OS_X_VERSION_10_3 1030 #endif #ifndef MAC_OS_X_VERSION_10_4 #define MAC_OS_X_VERSION_10_4 1040 #endif #ifdef __WXMAC_CARBON__ #include "wx/mac/corefoundation/cfstring.h" #endif #ifndef FixedToInt // as macro in FixMath.h for 10.3 inline Fixed IntToFixed( int inInt ) { return (((SInt32) inInt) << 16); } inline int FixedToInt( Fixed inFixed ) { return (((SInt32) inFixed) >> 16); } #endif #if wxUSE_GUI #include "wx/dc.h" #include "wx/window.h" #include "wx/toplevel.h" class wxMacPortStateHelper { DECLARE_NO_COPY_CLASS(wxMacPortStateHelper) public: wxMacPortStateHelper( GrafPtr newport) ; wxMacPortStateHelper() ; ~wxMacPortStateHelper() ; void Setup( GrafPtr newport ) ; void Clear() ; bool IsCleared() { return m_clip == NULL ; } GrafPtr GetCurrentPort() { return m_currentPort ; } private: GrafPtr m_currentPort ; GrafPtr m_oldPort ; RgnHandle m_clip ; ThemeDrawingState m_drawingState ; short m_textFont ; short m_textSize ; short m_textStyle ; short m_textMode ; } ; class WXDLLEXPORT wxMacPortSaver { DECLARE_NO_COPY_CLASS(wxMacPortSaver) public: wxMacPortSaver( GrafPtr port ); ~wxMacPortSaver(); private : GrafPtr m_port ; } ; class WXDLLEXPORT wxMacPortSetter { DECLARE_NO_COPY_CLASS(wxMacPortSetter) public: wxMacPortSetter( const wxDC* dc ) ; ~wxMacPortSetter() ; private: wxMacPortStateHelper m_ph ; const wxDC* m_dc ; } ; /* Clips to the visible region of a control within the current port */ class WXDLLEXPORT wxMacWindowClipper : public wxMacPortSaver { DECLARE_NO_COPY_CLASS(wxMacWindowClipper) public: wxMacWindowClipper( const wxWindow* win ) ; ~wxMacWindowClipper() ; private: GrafPtr m_newPort ; RgnHandle m_formerClip ; RgnHandle m_newClip ; } ; class WXDLLEXPORT wxMacWindowStateSaver : public wxMacWindowClipper { DECLARE_NO_COPY_CLASS(wxMacWindowStateSaver) public: wxMacWindowStateSaver( const wxWindow* win ) ; ~wxMacWindowStateSaver() ; private: GrafPtr m_newPort ; ThemeDrawingState m_themeDrawingState ; } ; #if wxMAC_USE_CORE_GRAPHICS class WXDLLEXPORT wxMacCGContextStateSaver { DECLARE_NO_COPY_CLASS(wxMacCGContextStateSaver) public: wxMacCGContextStateSaver( CGContextRef cg ) { m_cg = cg ; CGContextSaveGState( cg ) ; } ~wxMacCGContextStateSaver() { CGContextRestoreGState( m_cg ) ; } private: CGContextRef m_cg ; } ; #endif /* class wxMacDrawingHelper { DECLARE_NO_COPY_CLASS(wxMacDrawingHelper) public: wxMacDrawingHelper( wxWindowMac * theWindow , bool clientArea = false ) ; ~wxMacDrawingHelper() ; bool Ok() { return m_ok ; } void LocalToWindow( Rect *rect) { OffsetRect( rect , m_origin.h , m_origin.v ) ; } void LocalToWindow( Point *pt ) { AddPt( m_origin , pt ) ; } void LocalToWindow( RgnHandle rgn ) { OffsetRgn( rgn , m_origin.h , m_origin.v ) ; } const Point& GetOrigin() { return m_origin ; } private: Point m_origin ; GrafPtr m_formerPort ; GrafPtr m_currentPort ; PenState m_savedPenState ; bool m_ok ; } ; */ // app.h bool wxMacConvertEventToRecord( EventRef event , EventRecord *rec) ; #endif // wxUSE_GUI // filefn.h WXDLLEXPORT wxString wxMacFSSpec2MacFilename( const FSSpec *spec ) ; WXDLLEXPORT void wxMacFilename2FSSpec( const wxString &path , FSSpec *spec ) ; // utils.h WXDLLEXPORT wxString wxMacFindFolder(short vRefNum, OSType folderType, Boolean createFolder); template EventParamType wxMacGetEventParamType() { wxFAIL_MSG( wxT("Unknown Param Type") ) ; return 0 ; } template<> inline EventParamType wxMacGetEventParamType() { return typeQDRgnHandle ; } template<> inline EventParamType wxMacGetEventParamType() { return typeControlRef ; } template<> inline EventParamType wxMacGetEventParamType() { return typeWindowRef ; } template<> inline EventParamType wxMacGetEventParamType() { return typeMenuRef ; } template<> inline EventParamType wxMacGetEventParamType() { return typeEventRef ; } template<> inline EventParamType wxMacGetEventParamType() { return typeQDPoint ; } template<> inline EventParamType wxMacGetEventParamType() { return typeQDRectangle ; } template<> inline EventParamType wxMacGetEventParamType() { return typeBoolean; } template<> inline EventParamType wxMacGetEventParamType() { return typeSInt16; } template<> inline EventParamType wxMacGetEventParamType() { return typeSInt32; } template<> inline EventParamType wxMacGetEventParamType() { return typeUInt32; } template<> inline EventParamType wxMacGetEventParamType() { return typeRGBColor; } #if TARGET_API_MAC_OSX template<> inline EventParamType wxMacGetEventParamType() { return typeHICommand ; } template<> inline EventParamType wxMacGetEventParamType() { return typeHIPoint ; } template<> inline EventParamType wxMacGetEventParamType() { return typeHISize ; } template<> inline EventParamType wxMacGetEventParamType() { return typeHIRect ; } template<> inline EventParamType wxMacGetEventParamType() { return typeVoidPtr ; } #endif #if TARGET_API_MAC_OSX && ( MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2 ) template<> inline EventParamType wxMacGetEventParamType() { return typeCFDictionaryRef; } #endif template<> inline EventParamType wxMacGetEventParamType() { return typeCollection; } template<> inline EventParamType wxMacGetEventParamType() { return typeCGContextRef; } /* These are ambiguous template<> EventParamType wxMacGetEventParamType() { return typeGrafPtr ; } template<> EventParamType wxMacGetEventParamType() { return typeOSStatus ; } template<> EventParamType wxMacGetEventParamType() { return typeCFIndex ; } template<> EventParamType wxMacGetEventParamType() { return typeGWorldPtr ; } */ class wxMacCarbonEvent { public : wxMacCarbonEvent() { m_eventRef = 0 ; m_release = false ; } wxMacCarbonEvent( EventRef event , bool release = false ) { m_eventRef = event ; m_release = release ; } wxMacCarbonEvent(UInt32 inClassID,UInt32 inKind,EventTime inWhen = 0 /*now*/,EventAttributes inAttributes=kEventAttributeNone) { m_eventRef = NULL ; verify_noerr( MacCreateEvent( NULL , inClassID, inKind,inWhen,inAttributes,&m_eventRef) ) ; m_release = true ; } ~wxMacCarbonEvent() { if ( m_release ) ReleaseEvent( m_eventRef ) ; } OSStatus Create(UInt32 inClassID,UInt32 inKind,EventTime inWhen = 0 /*now*/,EventAttributes inAttributes=kEventAttributeNone) { verify( (m_eventRef == NULL) || m_release ) ; if ( m_eventRef && m_release ) { ReleaseEvent( m_eventRef ) ; m_release = false ; m_eventRef = NULL ; } OSStatus err = MacCreateEvent( NULL , inClassID, inKind,inWhen,inAttributes,&m_eventRef) ; if ( err == noErr ) m_release = true ; return err ; } OSStatus GetParameter( EventParamName inName, EventParamType inDesiredType, UInt32 inBufferSize, void * outData) ; template OSStatus GetParameter( EventParamName inName, EventParamType type , T *data ) { return GetParameter( inName, type , sizeof( T ) , data ) ; } template OSStatus GetParameter( EventParamName inName, T *data ) { return GetParameter( inName, wxMacGetEventParamType() , data ) ; } template T GetParameter( EventParamName inName ) { T value ; verify_noerr( GetParameter( inName, &value ) ) ; return value ; } template T GetParameter( EventParamName inName, EventParamType inDesiredType ) { T value ; verify_noerr( GetParameter( inName, inDesiredType , &value ) ) ; return value ; } OSStatus SetParameter( EventParamName inName, EventParamType inType, UInt32 inSize, const void * inData) ; template OSStatus SetParameter( EventParamName inName, EventParamType inDesiredType , const T *data ) { return SetParameter( inName, inDesiredType , sizeof( T ) , data ) ; } template OSStatus SetParameter( EventParamName inName, EventParamType inDesiredType , const T& data ) { return SetParameter( inName, inDesiredType , &data ) ; } template OSStatus SetParameter( EventParamName inName, const T *data ) { return SetParameter( inName, wxMacGetEventParamType() , data ) ; } template OSStatus SetParameter( EventParamName inName, const T& data ) { return SetParameter( inName, wxMacGetEventParamType() , &data ) ; } UInt32 GetClass() { return ::GetEventClass( m_eventRef ) ; } UInt32 GetKind() { return ::GetEventKind( m_eventRef ) ; } EventTime GetTime() { return ::GetEventTime( m_eventRef ) ; } UInt32 GetTicks() { return EventTimeToTicks( GetTime() ) ; } OSStatus SetTime( EventTime inWhen = 0 /*now*/ ) { return ::SetEventTime( m_eventRef , inWhen ? inWhen : GetCurrentEventTime() ) ; } operator EventRef () { return m_eventRef; } bool IsValid() { return m_eventRef != 0 ; } protected : EventRef m_eventRef ; bool m_release ; } ; // // helper class for allocating and deallocating Universal Proc Ptrs // template class wxMacUPP { public : wxMacUPP( procType proc ) { m_upp = NULL ; m_upp = (*newUPP)( NULL ) ; } ~wxMacUPP() { if ( m_upp ) disposeUPP( m_upp ) ; } operator uppType() { return m_upp ; } private : uppType m_upp ; } ; typedef wxMacUPP wxMacNMUPP ; template class wxMacCFRefHolder { public : wxMacCFRefHolder() : m_ref(NULL) , m_release(false) { } wxMacCFRefHolder( refType ref , bool release = true ) : m_ref(ref) , m_release(release) { } ~wxMacCFRefHolder() { CFRelease( m_ref ) ; } void Release() { if ( m_release && m_ref != NULL ) CFRelease( m_ref ) ; m_ref = NULL ; } refType Detach() { refType val = m_ref ; m_release = false ; m_ref = NULL ; return val ; } void Set( refType ref , bool release = true ) { Release() ; m_release = release ; m_ref = ref ; } operator refType () const { return m_ref; } private : refType m_ref ; bool m_release ; DECLARE_NO_COPY_CLASS( wxMacCFRefHolder ) } ; #if wxUSE_GUI /* GWorldPtr wxMacCreateGWorld( int width , int height , int depth ) ; void wxMacDestroyGWorld( GWorldPtr gw ) ; PicHandle wxMacCreatePict( GWorldPtr gw , GWorldPtr mask = NULL ) ; CIconHandle wxMacCreateCIcon(GWorldPtr image , GWorldPtr mask , short dstDepth , short iconSize ) ; void wxMacSetColorTableEntry( CTabHandle newColors , int index , int red , int green , int blue ) ; CTabHandle wxMacCreateColorTable( int numColors ) ; */ void wxMacCreateBitmapButton( ControlButtonContentInfo*info , const wxBitmap& bitmap , int forceType = 0 ) ; void wxMacReleaseBitmapButton( ControlButtonContentInfo*info ) ; #define MAC_WXCOLORREF(a) (*((RGBColor*)&(a))) #define MAC_WXHBITMAP(a) (GWorldPtr(a)) #define MAC_WXHMETAFILE(a) (PicHandle(a)) #define MAC_WXHICON(a) (IconRef(a)) #define MAC_WXHCURSOR(a) (CursHandle(a)) #define MAC_WXHRGN(a) (RgnHandle(a)) #define MAC_WXHWND(a) (WindowPtr(a)) #define MAC_WXRECPTR(a) ((Rect*)a) #define MAC_WXPOINTPTR(a) ((Point*)a) #define MAC_WXHMENU(a) ((MenuHandle)a) struct wxOpaqueWindowRef { wxOpaqueWindowRef( WindowRef ref ) { m_data = ref ; } operator WindowRef() { return m_data ; } private : WindowRef m_data ; } ; void wxMacRectToNative( const wxRect *wx , Rect *n ) ; void wxMacNativeToRect( const Rect *n , wxRect* wx ) ; void wxMacPointToNative( const wxPoint* wx , Point *n ) ; void wxMacNativeToPoint( const Point *n , wxPoint* wx ) ; wxWindow * wxFindControlFromMacControl(ControlRef inControl ) ; wxTopLevelWindowMac* wxFindWinFromMacWindow( WindowRef inWindow ) ; wxMenu* wxFindMenuFromMacMenu(MenuRef inMenuRef) ; int wxMacCommandToId( UInt32 macCommandId ) ; UInt32 wxIdToMacCommand( int wxId ) ; wxMenu* wxFindMenuFromMacCommand( const HICommand &macCommandId , wxMenuItem* &item ) ; extern wxWindow* g_MacLastWindow ; pascal OSStatus wxMacTopLevelMouseEventHandler( EventHandlerCallRef handler , EventRef event , void *data ) ; Rect wxMacGetBoundsForControl( wxWindow* window , const wxPoint& pos , const wxSize &size , bool adjustForOrigin = true ) ; ControlActionUPP GetwxMacLiveScrollbarActionProc() ; class wxMacControl { public : wxMacControl( wxWindow* peer , bool isRootControl = false ) ; wxMacControl( wxWindow* peer , ControlRef control ) ; wxMacControl( wxWindow* peer , WXWidget control ) ; virtual ~wxMacControl() ; void Init() ; virtual void Dispose() ; bool Ok() const { return GetControlRef() != NULL ; } virtual ControlRef * GetControlRefAddr() { return &m_controlRef; } virtual ControlRef GetControlRef() const { return m_controlRef ; } virtual void SetReference( SInt32 data ) ; /* void operator= (ControlRef c) { m_controlRef = c ; } operator ControlRef () { return m_controlRef; } operator ControlRef * () { return &m_controlRef; } */ // accessing data and values virtual OSStatus SetData( ControlPartCode inPartCode , ResType inTag , Size inSize , const void * inData ) ; virtual OSStatus GetData( ControlPartCode inPartCode , ResType inTag , Size inBufferSize , void * inOutBuffer , Size * outActualSize ) const ; virtual OSStatus GetDataSize( ControlPartCode inPartCode , ResType inTag , Size * outActualSize ) const ; virtual OSStatus SendEvent( EventRef ref , OptionBits inOptions = 0 ) ; virtual OSStatus SendHICommand( HICommand &command , OptionBits inOptions = 0 ) ; virtual OSStatus SendHICommand( UInt32 commandID , OptionBits inOptions = 0 ) ; virtual SInt32 GetValue() const ; virtual SInt32 GetMaximum() const ; virtual SInt32 GetMinimum() const ; virtual void SetValue( SInt32 v ) ; virtual void SetMinimum( SInt32 v ) ; virtual void SetMaximum( SInt32 v ) ; virtual void SetValueAndRange( SInt32 value , SInt32 minimum , SInt32 maximum ) ; virtual void SetRange( SInt32 minimum , SInt32 maximum ) ; virtual OSStatus SetFocus( ControlFocusPart focusPart ) ; virtual bool HasFocus() const ; virtual bool NeedsFocusRect() const ; virtual void SetNeedsFocusRect( bool needs ) ; // templated helpers Size GetDataSize( ControlPartCode inPartCode , ResType inTag ) const { Size sz ; verify_noerr( GetDataSize( inPartCode , inTag , &sz ) ) ; return sz ; } template OSStatus SetData( ControlPartCode inPartCode , ResType inTag , const T *data ) { return SetData( inPartCode , inTag , sizeof( T ) , data ) ; } template OSStatus SetData( ControlPartCode inPartCode , ResType inTag , const T& data ) { return SetData( inPartCode , inTag , sizeof( T ) , &data ) ; } template OSStatus GetData( ControlPartCode inPartCode , ResType inTag , T *data ) const { Size dummy ; return GetData( inPartCode , inTag , sizeof( T ) , data , &dummy ) ; } template T GetData( ControlPartCode inPartCode , ResType inTag ) const { T value ; verify_noerr( GetData( inPartCode , inTag , &value ) ) ; return value ; } // Flash the control for the specified amount of time virtual void Flash( ControlPartCode part , UInt32 ticks = 8 ) ; virtual void VisibilityChanged( bool shown ) ; virtual void SuperChangedPosition() ; virtual void SetFont( const wxFont & font , const wxColour& foreground , long windowStyle ) ; virtual void SetBackground( const wxBrush &brush ) ; virtual ControlPartCode HandleKey( SInt16 keyCode, SInt16 charCode, EventModifiers modifiers ) ; void SetActionProc( ControlActionUPP actionProc ) ; void SetViewSize( SInt32 viewSize ) ; SInt32 GetViewSize() const ; virtual bool IsVisible() const ; virtual void SetVisibility( bool visible , bool redraw ) ; virtual bool IsEnabled() const ; virtual bool IsActive() const ; virtual void Enable( bool enable ) ; // invalidates this control and all children virtual void InvalidateWithChildren() ; virtual void SetDrawingEnabled( bool enable ) ; #ifdef __WXMAC_OSX__ virtual bool GetNeedsDisplay() const ; #endif // where is in native window relative coordinates virtual void SetNeedsDisplay( RgnHandle where ) ; // where is in native window relative coordinates virtual void SetNeedsDisplay( Rect* where = NULL ) ; // if rect = NULL, entire view virtual void ScrollRect( wxRect *rect , int dx , int dy ) ; // in native parent window relative coordinates virtual void GetRect( Rect *r ) ; // in native parent window relative coordinates virtual void SetRect( Rect *r ) ; virtual void GetRectInWindowCoords( Rect *r ) ; virtual void GetBestRect( Rect *r ) ; virtual void SetTitle( const wxString &title ) ; // converts from Toplevel-Content relative to local static void Convert( wxPoint *pt , wxMacControl *convert , wxMacControl *to ) ; virtual void GetFeatures( UInt32 *features ) ; virtual OSStatus GetRegion( ControlPartCode partCode , RgnHandle region ) ; virtual OSStatus SetZOrder( bool above , wxMacControl* other ) ; // to be moved into a databrowser subclass virtual OSStatus SetSelectionFlags( DataBrowserSelectionFlags ) ; virtual OSStatus AddListViewColumn( DataBrowserListViewColumnDesc *columnDesc, DataBrowserTableViewColumnIndex position ) ; virtual OSStatus AutoSizeListViewColumns() ; virtual OSStatus SetHasScrollBars( bool horiz , bool vert ) ; virtual OSStatus SetTableViewHiliteStyle( DataBrowserTableViewHiliteStyle hiliteStyle ) ; virtual OSStatus SetListViewHeaderBtnHeight(UInt16 height) ; virtual OSStatus SetCallbacks(const DataBrowserCallbacks * callbacks) ; virtual OSStatus UpdateItems( DataBrowserItemID container, UInt32 numItems, const DataBrowserItemID* items, DataBrowserPropertyID preSortProperty, DataBrowserPropertyID propertyID ) ; virtual OSStatus AddItems( DataBrowserItemID container, UInt32 numItems, const DataBrowserItemID* items, DataBrowserPropertyID preSortProperty ) ; virtual OSStatus RemoveItems( DataBrowserItemID container, UInt32 numItems, const DataBrowserItemID* items, DataBrowserPropertyID preSortProperty ) ; virtual OSStatus RevealItem( DataBrowserItemID item, DataBrowserPropertyID propertyID, DataBrowserRevealOptions options ) ; virtual OSStatus GetSelectionAnchor( DataBrowserItemID * first, DataBrowserItemID * last ) ; virtual bool IsItemSelected( DataBrowserItemID item ) ; virtual OSStatus SetSelectedItems(UInt32 numItems, const DataBrowserItemID * items, DataBrowserSetOption operation ) ; // to be moved into a tab control class virtual OSStatus SetTabEnabled( SInt16 tabNo , bool enable ) ; bool IsCompositing() { return m_isCompositing ; } bool IsRootControl() { return m_isRootControl ; } protected : ControlRef m_controlRef ; wxFont m_font ; long m_windowStyle ; wxWindow* m_peer ; bool m_needsFocusRect ; bool m_isCompositing ; bool m_isRootControl ; } ; #if wxMAC_USE_CORE_GRAPHICS class WXDLLEXPORT wxMacCGPath : public wxGraphicPath { DECLARE_NO_COPY_CLASS(wxMacCGPath) public : wxMacCGPath() ; ~wxMacCGPath() ; // Starts a new subpath at void MoveToPoint( wxCoord x1 , wxCoord y1 ) ; void AddLineToPoint( wxCoord x1 , wxCoord y1 ) ; void AddQuadCurveToPoint( wxCoord cx1, wxCoord cy1, wxCoord x1, wxCoord y1 ) ; void AddRectangle( wxCoord x, wxCoord y, wxCoord w, wxCoord h ) ; void AddCircle( wxCoord x, wxCoord y , wxCoord r ) ; // closes the current subpath void CloseSubpath() ; CGPathRef GetPath() const ; private : CGMutablePathRef m_path ; } ; class WXDLLEXPORT wxMacCGContext : public wxGraphicContext { DECLARE_NO_COPY_CLASS(wxMacCGContext) public: wxMacCGContext( CGrafPtr port ) ; wxMacCGContext( CGContextRef cgcontext ) ; wxMacCGContext() ; ~wxMacCGContext() ; virtual void Clip( const wxRegion ®ion ) ; virtual void StrokePath( const wxGraphicPath *p ) ; virtual void DrawPath( const wxGraphicPath *p , int fillStyle = wxWINDING_RULE ) ; virtual void FillPath( const wxGraphicPath *p , const wxColor &fillColor , int fillStyle = wxWINDING_RULE ) ; virtual wxGraphicPath* CreatePath() ; virtual void SetPen( const wxPen &pen ) ; virtual void SetBrush( const wxBrush &brush ) ; CGContextRef GetNativeContext() ; void SetNativeContext( CGContextRef cg ) ; CGPathDrawingMode GetDrawingMode() const { return m_mode ; } private: CGContextRef m_cgContext ; CGrafPtr m_qdPort ; CGPathDrawingMode m_mode ; wxPen m_pen ; wxBrush m_brush ; } ; #endif // wxMAC_USE_CORE_GRAPHICS #ifdef __WXMAC_OSX__ CGColorSpaceRef wxMacGetGenericRGBColorSpace(void) ; void wxMacMemoryBufferReleaseProc(void *info, const void *data, size_t size) ; #endif class WXDLLEXPORT wxBitmapRefData: public wxGDIRefData { DECLARE_NO_COPY_CLASS(wxBitmapRefData) friend class WXDLLEXPORT wxIcon; friend class WXDLLEXPORT wxCursor; public: wxBitmapRefData(int width , int height , int depth); wxBitmapRefData(); ~wxBitmapRefData(); void Free() ; bool Ok() const { return m_ok ; } void SetOk( bool isOk) { m_ok = isOk ; } void SetWidth( int width ) { m_width = width ; } void SetHeight( int height ) { m_height = height ; } void SetDepth( int depth ) { m_depth = depth ; } int GetWidth() const { return m_width ; } int GetHeight() const { return m_height ; } int GetDepth() const { return m_depth ; } void *GetRawAccess() const ; void *BeginRawAccess() ; void EndRawAccess() ; bool HasAlpha() const { return m_hasAlpha ; } void UseAlpha( bool useAlpha ) ; public: #if wxUSE_PALETTE wxPalette m_bitmapPalette; #endif // wxUSE_PALETTE wxMask * m_bitmapMask; // Optional mask #ifdef __WXMAC_OSX__ CGImageRef CGImageCreate() const ; #endif // returns true if the bitmap has a size that // can be natively transferred into a true icon // if no is returned GetIconRef will still produce // an icon but it will be generated via a PICT and // rescaled to 16 x 16 bool HasNativeSize() ; // caller should increase ref count if needed longer // than the bitmap exists IconRef GetIconRef() ; // returns a Pict from the bitmap content PicHandle GetPictHandle() ; GWorldPtr GetHBITMAP(GWorldPtr * mask = NULL ) const ; void UpdateAlphaMask() const ; private : bool Create(int width , int height , int depth) ; void Init() ; int m_width; int m_height; int m_bytesPerRow ; int m_depth; bool m_hasAlpha; wxMemoryBuffer m_memBuf ; int m_rawAccessCount ; bool m_ok; #ifdef __WXMAC_OSX__ mutable CGImageRef m_cgImageRef ; #endif IconRef m_iconRef ; PicHandle m_pictHandle ; GWorldPtr m_hBitmap; GWorldPtr m_hMaskBitmap ; wxMemoryBuffer m_maskMemBuf ; int m_maskBytesPerRow ; }; class WXDLLEXPORT wxIconRefData : public wxGDIRefData { public: wxIconRefData() ; wxIconRefData( WXHICON ) ; virtual ~wxIconRefData() { Free(); } void Init() ; virtual void Free(); void SetWidth( int width ) { m_width = width ; } void SetHeight( int height ) { m_height = height ; } int GetWidth() const { return m_width ; } int GetHeight() const { return m_height ; } WXHICON GetHICON() const { return (WXHICON) m_iconRef ; } private : IconRef m_iconRef ; int m_width ; int m_height ; }; // toplevel.cpp ControlRef wxMacFindControlUnderMouse( wxTopLevelWindowMac* toplevelWindow, Point location , WindowRef window , ControlPartCode *outPart ) ; #ifdef WORDS_BIGENDIAN inline Rect* wxMacGetPictureBounds( PicHandle pict , Rect* rect ) { *rect = (**pict).picFrame ; return rect ; } #else inline Rect* wxMacGetPictureBounds( PicHandle pict , Rect* rect ) { return QDGetPictureBounds( pict , rect ) ; } #endif #endif // wxUSE_GUI #define wxMAC_DEFINE_PROC_GETTER( UPP , x ) \ UPP Get##x() \ { \ static UPP sHandler = NULL; \ if ( sHandler == NULL ) \ sHandler = New##UPP( x ); \ return sHandler; \ } //--------------------------------------------------------------------------- // wxMac string conversions //--------------------------------------------------------------------------- void wxMacSetupConverters() ; void wxMacCleanupConverters() ; void wxMacStringToPascal( const wxString&from , StringPtr to ) ; wxString wxMacMakeStringFromPascal( ConstStringPtr from ) ; // filefn.cpp wxString wxMacFSRefToPath( const FSRef *fsRef , CFStringRef additionalPathComponent = NULL ) ; OSStatus wxMacPathToFSRef( const wxString&path , FSRef *fsRef ) ; wxString wxMacHFSUniStrToString( ConstHFSUniStr255Param uniname ) ; #endif // _WX_PRIVATE_H_ ./include/wx/mac/fontdlg.h0100644000076500001430000000015511052665672014530 0ustar bhunknown#ifdef __WXMAC_CLASSIC__ #include "wx/mac/classic/fontdlg.h" #else #include "wx/mac/carbon/fontdlg.h" #endif ./src/mac/carbon/bfontdlg.cpp0100644000076500001430000000422311052665134015170 0ustar bhunknown///////////////////////////////////////////////////////////////////////////// // Name: fontdlg.cpp // Purpose: wxFontDialog class for carbon 10.2+. // Author: Ryan Norton // Modified by: // Created: 1998-01-01 // RCS-ID: $Id: fontdlg.cpp,v 1.23 2005/05/10 06:28:21 SC Exp $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // =========================================================================== // declarations // =========================================================================== // --------------------------------------------------------------------------- // headers // --------------------------------------------------------------------------- #if defined(__GNUG__) && !defined(NO_GCC_PRAGMA) #pragma implementation "fontdlg.h" #endif // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/cmndata.h" #endif #include "wx/fontdlg.h" #if !USE_NATIVE_FONT_DIALOG_FOR_MACOSX #undef wxFontDialog #include "wx/mac/fontdlg.h" IMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog) #include "wx/mac/private.h" // --------------------------------------------------------------------------- // wxFontDialog stub for mac OS's without a native font dialog // --------------------------------------------------------------------------- wxFontDialog::wxFontDialog() { m_dialogParent = NULL; } wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData& data) { Create(parent, data); } wxFontDialog::~wxFontDialog() { // empty } void wxFontDialog::SetData(wxFontData& fontdata) { m_fontData = fontdata; } bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data) { m_dialogParent = parent; m_fontData = data; // TODO: you may need to do dialog creation here, unless it's // done in ShowModal. return TRUE; } bool wxFontDialog::IsShown() const { return false; } int wxFontDialog::ShowModal() { // TODO: show (maybe create) the dialog return wxID_CANCEL; } #endif // 10.2+ ./src/mac/carbon/bfontdlgosx.mm0100644000076500001430000002637411052665204015562 0ustar bhunknown///////////////////////////////////////////////////////////////////////////// // Name: fontdlg.cpp // Purpose: wxFontDialog class. // Author: Ryan Norton // Modified by: // Created: 2004-10-03 // RCS-ID: $Id: fontdlgosx.mm,v 1.6 2005/07/28 22:08:10 VZ Exp $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // =========================================================================== // declarations // =========================================================================== // --------------------------------------------------------------------------- // headers // --------------------------------------------------------------------------- #include "wx/cmndata.h" #include "wx/fontdlg.h" #include "wx/fontutil.h" #include "wx/log.h" // ============================================================================ // implementation // ============================================================================ //Mac OSX 10.2+ only #if USE_NATIVE_FONT_DIALOG_FOR_MACOSX IMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog) // Cocoa headers #include "wx/cocoa/autorelease.h" #include "wx/cocoa/string.h" #import #import #import #import #import // --------------------------------------------------------------------------- // wxWCDelegate - Window Closed delegate // --------------------------------------------------------------------------- @interface wxWCDelegate : NSObject { bool m_bIsClosed; } // Delegate methods - (id)init; - (BOOL)windowShouldClose:(id)sender; - (BOOL)isClosed; @end // interface wxNSFontPanelDelegate : NSObject @implementation wxWCDelegate : NSObject - (id)init { [super init]; m_bIsClosed = false; return self; } - (BOOL)windowShouldClose:(id)sender { m_bIsClosed = true; [NSApp abortModal]; [NSApp stopModal]; return YES; } - (BOOL)isClosed { return m_bIsClosed; } @end // wxNSFontPanelDelegate // --------------------------------------------------------------------------- // wxWCODelegate - Window Closed or Open delegate // --------------------------------------------------------------------------- @interface wxWCODelegate : NSObject { bool m_bIsClosed; bool m_bIsOpen; } // Delegate methods - (id)init; - (BOOL)windowShouldClose:(id)sender; - (void)windowDidUpdate:(NSNotification *)aNotification; - (BOOL)isClosed; - (BOOL)isOpen; @end // interface wxNSFontPanelDelegate : NSObject @implementation wxWCODelegate : NSObject - (id)init { [super init]; m_bIsClosed = false; m_bIsOpen = false; return self; } - (BOOL)windowShouldClose:(id)sender { m_bIsClosed = true; m_bIsOpen = false; [NSApp abortModal]; [NSApp stopModal]; return YES; } - (void)windowDidUpdate:(NSNotification *)aNotification { if (m_bIsOpen == NO) { m_bIsClosed = false; m_bIsOpen = true; [NSApp abortModal]; [NSApp stopModal]; } } - (BOOL)isClosed { return m_bIsClosed; } - (BOOL)isOpen { return m_bIsOpen; } @end // wxNSFontPanelDelegate // --------------------------------------------------------------------------- // wxFontDialog // --------------------------------------------------------------------------- wxFontDialog::wxFontDialog() { } wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData& data) { Create(parent, data); } wxFontDialog::~wxFontDialog() { } bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data) { m_fontData = data; // // This is the key call - this initializes // events and window stuff for cocoa for carbon // applications. // // This is also the only call here that is // 10.2+ specific (the rest is OSX only), // which, ironically, the carbon font // panel requires. // bool bOK = NSApplicationLoad(); //autorelease pool - req'd for carbon NSAutoreleasePool *thePool; thePool = [[NSAutoreleasePool alloc] init]; //Get the initial wx font wxFont& thewxfont = m_fontData.m_initialFont; //if the font is valid set the default (selected) font of the //NSFontDialog to that font if (thewxfont.Ok()) { NSFontTraitMask theMask = 0; if(thewxfont.GetStyle() == wxFONTSTYLE_ITALIC) theMask |= NSItalicFontMask; if(thewxfont.IsFixedWidth()) theMask |= NSFixedPitchFontMask; NSFont* theDefaultFont = [[NSFontManager sharedFontManager] fontWithFamily: wxNSStringWithWxString(thewxfont.GetFaceName()) traits:theMask weight:thewxfont.GetWeight() == wxBOLD ? 9 : thewxfont.GetWeight() == wxLIGHT ? 0 : 5 size: (float)(thewxfont.GetPointSize()) ]; wxASSERT_MSG(theDefaultFont, wxT("Invalid default font for wxCocoaFontDialog!")); //Apple docs say to call NSFontManager::setSelectedFont //However, 10.3 doesn't seem to create the font panel //is this is done, so create it ourselves [[NSFontPanel sharedFontPanel] setPanelFont:theDefaultFont isMultiple:NO]; } if(m_fontData.m_fontColour.Ok()) [[NSColorPanel sharedColorPanel] setColor: [NSColor colorWithCalibratedRed:m_fontData.m_fontColour.Red() / 255.0 green:m_fontData.m_fontColour.Green() / 255.0 blue:m_fontData.m_fontColour.Blue() / 255.0 alpha:1.0] ]; else [[NSColorPanel sharedColorPanel] setColor:[NSColor blackColor]]; //We're done - free up the pool [thePool release]; return bOK; } int wxFontDialog::ShowModal() { //Start the pool. Required for carbon interaction //(For those curious, the only thing that happens //if you don't do this is a bunch of error //messages about leaks on the console, //with no windows shown or anything). NSAutoreleasePool *thePool; thePool = [[NSAutoreleasePool alloc] init]; //Get the shared color and font panel NSFontPanel* theFontPanel = [NSFontPanel sharedFontPanel]; NSColorPanel* theColorPanel = [NSColorPanel sharedColorPanel]; //Create and assign the delegates (cocoa event handlers) so //we can tell if a window has closed/open or not wxWCDelegate* theFPDelegate = [[wxWCDelegate alloc] init]; [theFontPanel setDelegate:theFPDelegate]; wxWCODelegate* theCPDelegate = [[wxWCODelegate alloc] init]; [theColorPanel setDelegate:theCPDelegate]; // // Begin the modal loop for the font and color panels // // The idea is that we first make the font panel modal, // but if the color panel is opened, unless we stop the // modal loop the color panel opens behind the font panel // with no input acceptable to it - which makes it useless. // // So we set up delegates for both the color and font panels, // and the if the font panel opens the color panel, we // stop the modal loop, and start a separate modal loop for // the color panel until the color panel closes, switching // back to the font panel modal loop once it does close. // do { // // Start the font panel modal loop // NSModalSession session = [NSApp beginModalSessionForWindow:theFontPanel]; for (;;) { [NSApp runModalSession:session]; //If the font panel is closed or the font panel //opened the color panel, break if ([theFPDelegate isClosed] || [theCPDelegate isOpen]) break; } [NSApp endModalSession:session]; //is the color panel open? if ([theCPDelegate isOpen]) { // // Start the color panel modal loop // NSModalSession session = [NSApp beginModalSessionForWindow:theColorPanel]; for (;;) { [NSApp runModalSession:session]; //If the color panel is closed, return the font panel modal loop if ([theCPDelegate isClosed]) break; } [NSApp endModalSession:session]; } //If the font panel is still alive (I.E. we broke //out of its modal loop because the color panel was //opened) return the font panel modal loop }while([theFPDelegate isClosed] == NO); //free up the memory for the delegates - we don't need them anymore [theFPDelegate release]; [theCPDelegate release]; //Get the font the user selected NSFont* theFont = [theFontPanel panelConvertFont:[NSFont userFontOfSize:0]]; //Get more information about the user's chosen font NSFontTraitMask theTraits = [[NSFontManager sharedFontManager] traitsOfFont:theFont]; int theFontWeight = [[NSFontManager sharedFontManager] weightOfFont:theFont]; int theFontSize = (int) [theFont pointSize]; //Set the wx font to the appropriate data if(theTraits & NSFixedPitchFontMask) m_fontData.m_chosenFont.SetFamily(wxTELETYPE); m_fontData.m_chosenFont.SetFaceName(wxStringWithNSString([theFont familyName])); m_fontData.m_chosenFont.SetPointSize(theFontSize); m_fontData.m_chosenFont.SetStyle(theTraits & NSItalicFontMask ? wxFONTSTYLE_ITALIC : 0); m_fontData.m_chosenFont.SetWeight(theFontWeight < 5 ? wxLIGHT : theFontWeight >= 9 ? wxBOLD : wxNORMAL); //Get the shared color panel along with the chosen color and set the chosen color NSColor* theColor = [[theColorPanel color] colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; m_fontData.m_fontColour.Set((unsigned char) ([theColor redComponent] * 255.0), (unsigned char) ([theColor greenComponent] * 255.0), (unsigned char) ([theColor blueComponent] * 255.0)); //Friendly debug stuff #ifdef FONTDLGDEBUG wxPrintf(wxT("---Font Panel---\n--NS--\nSize:%f\nWeight:%i\nTraits:%i\n--WX--\nFaceName:%s\nPointSize:%i\nStyle:%i\nWeight:%i\nColor:%i,%i,%i\n---END Font Panel---\n"), (float) theFontSize, theFontWeight, theTraits, m_fontData.m_chosenFont.GetFaceName().c_str(), m_fontData.m_chosenFont.GetPointSize(), m_fontData.m_chosenFont.GetStyle(), m_fontData.m_chosenFont.GetWeight(), m_fontData.m_fontColour.Red(), m_fontData.m_fontColour.Green(), m_fontData.m_fontColour.Blue() ); #endif //Release the pool, we're done :) [thePool release]; //Return ID_OK - there are no "apply" buttons or the like //on either the font or color panel return wxID_OK; } //old api stuff (REMOVE ME) bool wxFontDialog::IsShown() const { return false; } #endif // 10.2+ ./src/mac/carbon/fontdlg.cpp0100644000076500001430000006357511052677171015051 0ustar bhunknown///////////////////////////////////////////////////////////////////////////// // Name: src/mac/carbon/fontdlg.cpp // Purpose: wxFontDialog class for carbon 10.2+. // Author: Ryan Norton // Modified by: // Created: 1998-01-01 // RCS-ID: $Id: fontdlg.cpp,v 1.39 2006/10/21 16:39:41 VZ Exp $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // =========================================================================== // declarations // =========================================================================== // --------------------------------------------------------------------------- // headers // --------------------------------------------------------------------------- // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" #if wxUSE_FONTDLG #ifdef __BORLANDC__ #pragma hdrstop #endif #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/wxchar.h" #include "wx/dcclient.h" #include "wx/frame.h" #include "wx/textctrl.h" #include "wx/listbox.h" #include "wx/checkbox.h" #include "wx/choice.h" #include "wx/sizer.h" #include "wx/stattext.h" #include "wx/button.h" #endif #include "wx/mac/carbon/fontdlg.h" //#include "wx/fontdlg.h" #if wxMAC_USE_EXPERIMENTAL_FONTDIALOG IMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog) #include "wx/mac/private.h" // --------------------------------------------------------------------------- // wxFontDialog // --------------------------------------------------------------------------- static const EventTypeSpec eventList[] = { { kEventClassFont, kEventFontSelection } , } ; pascal OSStatus wxMacCarbonFontPanelHandler(EventHandlerCallRef nextHandler, EventRef event, void *userData) { OSStatus result = eventNotHandledErr ; wxFontDialog *fontdialog = (wxFontDialog*) userData ; wxFontData& fontdata= fontdialog->GetFontData() ; wxMacCarbonEvent cEvent( event ); switch(cEvent.GetKind()) { case kEventFontSelection : { ATSUFontID fontId = 0 ; if ( cEvent.GetParameter(kEventParamATSUFontID, &fontId) == noErr ) { FMFontStyle fontStyle = cEvent.GetParameter(kEventParamFMFontStyle); FMFontSize fontSize = cEvent.GetParameter(kEventParamFMFontSize); CFStringRef cfName = NULL; #if 1 FMFontFamily fontFamily = cEvent.GetParameter(kEventParamFMFontFamily); ATSFontFamilyRef atsfontfamilyref = FMGetATSFontFamilyRefFromFontFamily( fontFamily ) ; OSStatus err = ATSFontFamilyGetName( atsfontfamilyref , kATSOptionFlagsDefault , &cfName ) ; wxASSERT_MSG( err == noErr , wxT("ATSFontFamilyGetName failed") ); #else // we don't use the ATSU naming anymore ByteCount actualLength = 0; char *c = NULL; OSStatus err = ATSUFindFontName(fontId , kFontFamilyName, kFontUnicodePlatform, kFontNoScriptCode, kFontNoLanguageCode , 0 , NULL , &actualLength , NULL ); if ( err == noErr) { actualLength += 1 ; char *c = (char*)malloc( actualLength ); err = ATSUFindFontName(fontId, kFontFamilyName, kFontUnicodePlatform, kFontNoScriptCode, kFontNoLanguageCode, actualLength, c , NULL, NULL); cfName = CFStringCreateWithCharacters(NULL, (UniChar*) c, (actualLength-1) >> 1); } else { err = ATSUFindFontName(fontId , kFontFamilyName, kFontNoPlatformCode, kFontNoScriptCode, kFontNoLanguageCode , 0 , NULL , &actualLength , NULL ); if ( err == noErr ) { actualLength += 1 ; c = (char*)malloc(actualLength); err = ATSUFindFontName(fontId, kFontFamilyName, kFontNoPlatformCode, kFontNoScriptCode, kFontNoLanguageCode, actualLength, c , NULL, NULL); c[actualLength-1] = 0; cfName = CFStringCreateWithCString(NULL, c, kCFStringEncodingMacRoman ); } } if ( c!=NULL ) free(c); #endif if ( cfName!=NULL ) { fontdata.m_chosenFont.SetFaceName(wxMacCFStringHolder(cfName).AsString(wxLocale::GetSystemEncoding())); fontdata.m_chosenFont.SetPointSize(fontSize); fontdata.m_chosenFont.SetStyle(fontStyle & italic ? wxFONTSTYLE_ITALIC : wxFONTSTYLE_NORMAL); fontdata.m_chosenFont.SetUnderlined((fontStyle & underline)!=0); fontdata.m_chosenFont.SetWeight(fontStyle & bold ? wxFONTWEIGHT_BOLD : wxFONTWEIGHT_NORMAL); } } RGBColor fontColor ; if ( cEvent.GetParameter(kEventParamFontColor, &fontColor) == noErr ) int a = 1; //fontdata.m_fontColour.FromRGBColor((WXCOLORREF*) &fontColor); else { CFDictionaryRef dict ; if ( cEvent.GetParameter(kEventParamDictionary, &dict) == noErr ) { CFDictionaryRef attributesDict ; if ( CFDictionaryGetValueIfPresent(dict, kFontPanelAttributesKey, (const void **)&attributesDict) ) { CFDataRef tagsData; CFDataRef sizesData; CFDataRef valuesData; if ( CFDictionaryGetValueIfPresent(attributesDict, kFontPanelAttributeTagsKey, (const void **)&tagsData) && CFDictionaryGetValueIfPresent(attributesDict, kFontPanelAttributeSizesKey, (const void **)&sizesData) && CFDictionaryGetValueIfPresent(attributesDict, kFontPanelAttributeValuesKey, (const void **)&valuesData) ) { ItemCount count = CFDataGetLength(tagsData)/sizeof(ATSUAttributeTag); ATSUAttributeTag *tagPtr = (ATSUAttributeTag *)CFDataGetBytePtr(tagsData); ByteCount *sizePtr = (ByteCount *)CFDataGetBytePtr(sizesData); UInt32 *bytePtr = (UInt32*)CFDataGetBytePtr(valuesData); ATSUAttributeValuePtr valuesPtr = bytePtr ; for ( ItemCount i = 0 ; i < count ; ++i) { if ( tagPtr[i] == kATSUColorTag && sizePtr[i] == sizeof(RGBColor)) { int a = 1; //fontdata.m_fontColour.FromRGBColor((WXCOLORREF*) valuesPtr); break ; } bytePtr = (UInt32*)( (UInt8*)bytePtr + sizePtr[i]); } } } } } } break ; } ; return result ; } DEFINE_ONE_SHOT_HANDLER_GETTER( wxMacCarbonFontPanelHandler ) wxFontDialog::wxFontDialog() { } wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData& data) { Create(parent, data); } wxFontDialog::~wxFontDialog() { } bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data) { m_fontData = data; return true ; } int wxFontDialog::ShowModal() { OSStatus err ; wxFont font = *wxNORMAL_FONT ; if ( m_fontData.m_initialFont.Ok() ) { font = m_fontData.m_initialFont ; } ATSUStyle style = (ATSUStyle)font.MacGetATSUStyle(); err = SetFontInfoForSelection (kFontSelectionATSUIType,1, &style , NULL); // just clicking on ENTER will not send us any font setting event, therefore we have to make sure // that field is already correct m_fontData.m_chosenFont = font ; EventHandlerRef handler ; err = InstallApplicationEventHandler( GetwxMacCarbonFontPanelHandlerUPP(), GetEventTypeCount(eventList), eventList, this , &handler ); if ( !FPIsFontPanelVisible() ) FPShowHideFontPanel(); int retval = RunMixedFontDialog(this); ::RemoveEventHandler(handler); return retval ; } #else #if !USE_NATIVE_FONT_DIALOG_FOR_MACOSX #undef wxFontDialog #include "wx/mac/fontdlg.h" #include "wx/fontenum.h" #include "wx/colordlg.h" #include "wx/spinctrl.h" // --------------------------------------------------------------------------- // wxFontDialog stub for mac OS's without a native font dialog // --------------------------------------------------------------------------- static const wxChar *FontFamilyIntToString(int family); static int FontFamilyStringToInt(const wxChar *family); //----------------------------------------------------------------------------- // helper class - wxFontPreviewCtrl //----------------------------------------------------------------------------- class WXDLLEXPORT wxFontPreviewCtrl : public wxWindow { public: wxFontPreviewCtrl(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& sz = wxDefaultSize, long style = 0) : wxWindow(parent, id, pos, sz, style) { SetBackgroundColour(*wxWHITE); } private: void OnPaint(wxPaintEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(wxFontPreviewCtrl, wxWindow) EVT_PAINT(wxFontPreviewCtrl::OnPaint) END_EVENT_TABLE() void wxFontPreviewCtrl::OnPaint(wxPaintEvent& WXUNUSED(event)) { wxPaintDC dc(this); wxSize size = GetSize(); wxFont font = GetFont(); if ( font.Ok() ) { dc.SetFont(font); // Calculate vertical centre long w = 0, h = 0; dc.GetTextExtent( wxT("X"), &w, &h); dc.SetTextForeground(GetForegroundColour()); dc.SetClippingRegion(2, 2, size.x-4, size.y-4); dc.DrawText(_("ABCDEFGabcdefg12345"), 10, size.y/2 - h/2); dc.DestroyClippingRegion(); } } /* * A control for displaying a small preview of a colour or bitmap */ class wxFontColourSwatchCtrl: public wxControl { DECLARE_CLASS(wxFontColourSwatchCtrl) public: wxFontColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = 0); virtual ~wxFontColourSwatchCtrl(); void OnPaint(wxPaintEvent& event); void OnMouseEvent(wxMouseEvent& event); void SetColour(const wxColour& colour) { m_colour = colour; SetBackgroundColour(m_colour); } wxColour& GetColour() { return m_colour; } virtual wxSize DoGetBestSize() const { return GetSize(); } protected: wxColour m_colour; DECLARE_EVENT_TABLE() }; /* * A control for displaying a small preview of a colour or bitmap */ BEGIN_EVENT_TABLE(wxFontColourSwatchCtrl, wxControl) EVT_MOUSE_EVENTS(wxFontColourSwatchCtrl::OnMouseEvent) END_EVENT_TABLE() IMPLEMENT_CLASS(wxFontColourSwatchCtrl, wxControl) wxFontColourSwatchCtrl::wxFontColourSwatchCtrl(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style): wxControl(parent, id, pos, size, style) { SetColour(* wxWHITE); SetBackgroundStyle(wxBG_STYLE_COLOUR); } wxFontColourSwatchCtrl::~wxFontColourSwatchCtrl() { } void wxFontColourSwatchCtrl::OnMouseEvent(wxMouseEvent& event) { if (event.LeftDown()) { wxWindow* parent = GetParent(); while (parent != NULL && !parent->IsKindOf(CLASSINFO(wxDialog)) && !parent->IsKindOf(CLASSINFO(wxFrame))) parent = parent->GetParent(); wxColourData data; data.SetChooseFull(true); data.SetColour(m_colour); wxColourDialog *dialog = new wxColourDialog(parent, &data); // Crashes on wxMac (no m_peer) #ifndef __WXMAC__ dialog->SetTitle(_("Background colour")); #endif if (dialog->ShowModal() == wxID_OK) { wxColourData retData = dialog->GetColourData(); m_colour = retData.GetColour(); SetBackgroundColour(m_colour); } dialog->Destroy(); Refresh(); wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, GetId()); GetEventHandler()->ProcessEvent(event); } } /*! * wxFontDialog type definition */ IMPLEMENT_DYNAMIC_CLASS( wxFontDialog, wxDialog ) /*! * wxFontDialog event table definition */ BEGIN_EVENT_TABLE( wxFontDialog, wxDialog ) EVT_LISTBOX( wxID_FONTDIALOG_FACENAME, wxFontDialog::OnFontdialogFacenameSelected ) EVT_SPINCTRL( wxID_FONTDIALOG_FONTSIZE, wxFontDialog::OnFontdialogFontsizeUpdated ) EVT_TEXT( wxID_FONTDIALOG_FONTSIZE, wxFontDialog::OnFontdialogFontsizeTextUpdated ) EVT_CHECKBOX( wxID_FONTDIALOG_BOLD, wxFontDialog::OnFontdialogBoldClick ) EVT_CHECKBOX( wxID_FONTDIALOG_ITALIC, wxFontDialog::OnFontdialogItalicClick ) EVT_CHECKBOX( wxID_FONTDIALOG_UNDERLINED, wxFontDialog::OnFontdialogUnderlinedClick ) EVT_BUTTON( wxID_OK, wxFontDialog::OnOkClick ) EVT_BUTTON(wxID_FONTDIALOG_COLOUR, wxFontDialog::OnColourChanged) END_EVENT_TABLE() /*! * wxFontDialog constructors */ wxFontDialog::wxFontDialog( ) { m_dialogParent = NULL; } wxFontDialog::wxFontDialog(wxWindow* parent, const wxFontData& fontData) { m_dialogParent = NULL; Create(parent, fontData); } wxFontDialog::~wxFontDialog() { // empty } /*! * wxFontDialog creator */ bool wxFontDialog::Create(wxWindow* parent, const wxFontData& fontData) { m_fontData = fontData; m_suppressUpdates = false; wxString caption = _("Font"); m_facenameCtrl = NULL; m_sizeCtrl = NULL; m_boldCtrl = NULL; m_italicCtrl = NULL; m_underlinedCtrl = NULL; m_colourCtrl = NULL; m_previewCtrl = NULL; InitializeFont(); SetExtraStyle(GetExtraStyle()|wxWS_EX_BLOCK_EVENTS); wxDialog::Create( parent, wxID_ANY, caption, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER ); CreateControls(); GetSizer()->Fit(this); GetSizer()->SetSizeHints(this); Centre(); return true; } /*! * Control creation for wxFontDialog */ void wxFontDialog::CreateControls() { wxFontDialog* itemDialog1 = this; wxBoxSizer* itemBoxSizer2 = new wxBoxSizer(wxVERTICAL); itemDialog1->SetSizer(itemBoxSizer2); wxBoxSizer* itemBoxSizer3 = new wxBoxSizer(wxVERTICAL); itemBoxSizer2->Add(itemBoxSizer3, 1, wxGROW|wxALL, 5); wxFlexGridSizer* itemFlexGridSizer4 = new wxFlexGridSizer(6, 2, 10, 0); itemFlexGridSizer4->AddGrowableRow(4); itemFlexGridSizer4->AddGrowableCol(1); itemBoxSizer3->Add(itemFlexGridSizer4, 1, wxGROW|wxALL, 5); wxStaticText* itemStaticText5 = new wxStaticText( itemDialog1, wxID_STATIC, _("Font:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer4->Add(itemStaticText5, 0, wxALIGN_RIGHT|wxALIGN_TOP|wxALL|wxADJUST_MINSIZE, 5); wxBoxSizer* itemBoxSizer6 = new wxBoxSizer(wxVERTICAL); itemFlexGridSizer4->Add(itemBoxSizer6, 0, wxGROW|wxGROW, 5); wxString* m_facenameCtrlStrings = NULL; m_facenameCtrl = new wxListBox( itemDialog1, wxID_FONTDIALOG_FACENAME, wxDefaultPosition, wxSize(320, 100), 0, m_facenameCtrlStrings, wxLB_SINGLE ); itemBoxSizer6->Add(m_facenameCtrl, 0, wxGROW|wxALL, 5); wxStaticText* itemStaticText8 = new wxStaticText( itemDialog1, wxID_STATIC, _("Size:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer4->Add(itemStaticText8, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL|wxADJUST_MINSIZE, 5); m_sizeCtrl = new wxSpinCtrl( itemDialog1, wxID_FONTDIALOG_FONTSIZE, _T("12"), wxDefaultPosition, wxSize(60, -1), wxSP_ARROW_KEYS, 1, 300, 12 ); m_sizeCtrl->SetHelpText(_("The font size in points.")); if (ShowToolTips()) m_sizeCtrl->SetToolTip(_("The font size in points.")); itemFlexGridSizer4->Add(m_sizeCtrl, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL|wxALL, 5); wxStaticText* itemStaticText10 = new wxStaticText( itemDialog1, wxID_STATIC, _("Style:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer4->Add(itemStaticText10, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxALL|wxADJUST_MINSIZE, 5); wxBoxSizer* itemBoxSizer11 = new wxBoxSizer(wxHORIZONTAL); itemFlexGridSizer4->Add(itemBoxSizer11, 0, wxALIGN_LEFT|wxALIGN_CENTER_VERTICAL, 5); m_boldCtrl = new wxCheckBox( itemDialog1, wxID_FONTDIALOG_BOLD, _("Bold"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_boldCtrl->SetValue(false); m_boldCtrl->SetHelpText(_("Check to make the font bold.")); if (ShowToolTips()) m_boldCtrl->SetToolTip(_("Check to make the font bold.")); itemBoxSizer11->Add(m_boldCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); m_italicCtrl = new wxCheckBox( itemDialog1, wxID_FONTDIALOG_ITALIC, _("Italic"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_italicCtrl->SetValue(false); m_italicCtrl->SetHelpText(_("Check to make the font italic.")); if (ShowToolTips()) m_italicCtrl->SetToolTip(_("Check to make the font italic.")); itemBoxSizer11->Add(m_italicCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); if (m_fontData.GetEnableEffects()) { m_underlinedCtrl = new wxCheckBox( itemDialog1, wxID_FONTDIALOG_UNDERLINED, _("Underlined"), wxDefaultPosition, wxDefaultSize, wxCHK_2STATE ); m_underlinedCtrl->SetValue(false); m_underlinedCtrl->SetHelpText(_("Check to make the font underlined.")); if (ShowToolTips()) m_underlinedCtrl->SetToolTip(_("Check to make the font underlined.")); itemBoxSizer11->Add(m_underlinedCtrl, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); } if (m_fontData.GetEnableEffects()) { wxStaticText* itemStaticText15 = new wxStaticText( itemDialog1, wxID_STATIC, _("Colour:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer4->Add(itemStaticText15, 0, wxALIGN_RIGHT|wxALIGN_TOP|wxALL|wxADJUST_MINSIZE, 5); m_colourCtrl = new wxFontColourSwatchCtrl( itemDialog1, wxID_FONTDIALOG_COLOUR, wxDefaultPosition, wxSize(-1, 30), wxSUNKEN_BORDER|wxTAB_TRAVERSAL ); m_colourCtrl->SetHelpText(_("Click to change the font colour.")); if (ShowToolTips()) m_colourCtrl->SetToolTip(_("Click to change the font colour.")); itemFlexGridSizer4->Add(m_colourCtrl, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5); } wxStaticText* itemStaticText17 = new wxStaticText( itemDialog1, wxID_STATIC, _("Preview:"), wxDefaultPosition, wxDefaultSize, 0 ); itemFlexGridSizer4->Add(itemStaticText17, 0, wxALIGN_RIGHT|wxALIGN_TOP|wxALL|wxADJUST_MINSIZE, 5); m_previewCtrl = new wxFontPreviewCtrl( itemDialog1, wxID_FONTDIALOG_PREVIEW, wxDefaultPosition, wxSize(-1, 70), wxSUNKEN_BORDER|wxTAB_TRAVERSAL ); m_previewCtrl->SetHelpText(_("Shows a preview of the font.")); if (ShowToolTips()) m_previewCtrl->SetToolTip(_("Shows a preview of the font.")); itemFlexGridSizer4->Add(m_previewCtrl, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5); wxBoxSizer* itemBoxSizer19 = new wxBoxSizer(wxHORIZONTAL); itemBoxSizer3->Add(itemBoxSizer19, 0, wxALIGN_RIGHT|wxALL, 5); wxButton* itemButton20 = new wxButton( itemDialog1, wxID_CANCEL, _("&Cancel"), wxDefaultPosition, wxDefaultSize, 0 ); itemButton20->SetHelpText(_("Click to cancel changes to the font.")); if (ShowToolTips()) itemButton20->SetToolTip(_("Click to cancel changes to the font.")); itemBoxSizer19->Add(itemButton20, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); wxButton* itemButton21 = new wxButton( itemDialog1, wxID_OK, _("&OK"), wxDefaultPosition, wxDefaultSize, 0 ); itemButton21->SetDefault(); itemButton21->SetHelpText(_("Click to confirm changes to the font.")); if (ShowToolTips()) itemButton21->SetToolTip(_("Click to confirm changes to the font.")); itemBoxSizer19->Add(itemButton21, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5); wxFontEnumerator enumerator; enumerator.EnumerateFacenames(); wxArrayString facenames = enumerator.GetFacenames(); if (facenames) { facenames.Add(_("")); facenames.Add(_("")); facenames.Add(_("")); facenames.Add(_("")); facenames.Add(_("")); facenames.Add(_("")); facenames.Add(_("")); facenames.Sort(); m_facenameCtrl->Append(facenames); } InitializeControls(); m_previewCtrl->SetFont(m_dialogFont); if (m_fontData.GetColour().Ok()) { m_previewCtrl->SetForegroundColour(m_fontData.GetColour()); } m_previewCtrl->Refresh(); } /*! * wxEVT_COMMAND_SPINCTRL_UPDATED event handler for wxID_FONTDIALOG_FONTSIZE */ void wxFontDialog::OnFontdialogFontsizeUpdated( wxSpinEvent& WXUNUSED(event) ) { ChangeFont(); } /*! * wxEVT_COMMAND_TEXT_UPDATED event handler for wxID_FONTDIALOG_FONTSIZE */ void wxFontDialog::OnFontdialogFontsizeTextUpdated( wxCommandEvent& WXUNUSED(event) ) { ChangeFont(); } /*! * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for wxID_FONTDIALOG_BOLD */ void wxFontDialog::OnFontdialogBoldClick( wxCommandEvent& WXUNUSED(event) ) { ChangeFont(); } /*! * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for wxID_FONTDIALOG_ITALIC */ void wxFontDialog::OnFontdialogItalicClick( wxCommandEvent& WXUNUSED(event) ) { ChangeFont(); } /*! * wxEVT_COMMAND_CHECKBOX_CLICKED event handler for wxID_FONTDIALOG_UNDERLINED */ void wxFontDialog::OnFontdialogUnderlinedClick( wxCommandEvent& WXUNUSED(event) ) { ChangeFont(); } /*! * wxEVT_COMMAND_BUTTON_CLICKED event handler for wxID_OK */ void wxFontDialog::OnOkClick( wxCommandEvent& event ) { event.Skip(); } /*! * wxEVT_COMMAND_LISTBOX_SELECTED event handler for wxID_FONTDIALOG_FACENAME */ void wxFontDialog::OnFontdialogFacenameSelected( wxCommandEvent& WXUNUSED(event) ) { ChangeFont(); } void wxFontDialog::OnColourChanged(wxCommandEvent & WXUNUSED(event)) { m_fontData.SetColour(m_colourCtrl->GetColour()); m_previewCtrl->SetForegroundColour(m_colourCtrl->GetColour()); m_previewCtrl->Refresh(); } /*! * Should we show tooltips? */ bool wxFontDialog::ShowToolTips() { return true; } void wxFontDialog::InitializeFont() { int fontFamily = wxSWISS; int fontWeight = wxNORMAL; int fontStyle = wxNORMAL; int fontSize = 12; bool fontUnderline = false; wxString fontName; if (m_fontData.m_initialFont.Ok()) { fontFamily = m_fontData.m_initialFont.GetFamily(); fontWeight = m_fontData.m_initialFont.GetWeight(); fontStyle = m_fontData.m_initialFont.GetStyle(); fontSize = m_fontData.m_initialFont.GetPointSize(); fontUnderline = m_fontData.m_initialFont.GetUnderlined(); fontName = m_fontData.m_initialFont.GetFaceName(); } m_dialogFont = wxFont(fontSize, fontFamily, fontStyle, fontWeight, fontUnderline, fontName); if (m_previewCtrl) m_previewCtrl->SetFont(m_dialogFont); m_fontData.SetChosenFont(m_dialogFont); } /// Set controls according to current font void wxFontDialog::InitializeControls() { m_suppressUpdates = true; if (m_underlinedCtrl) m_underlinedCtrl->SetValue(m_dialogFont.GetUnderlined()); m_boldCtrl->SetValue(m_dialogFont.GetWeight() == wxBOLD); m_italicCtrl->SetValue(m_dialogFont.GetStyle() == wxITALIC); m_sizeCtrl->SetValue(m_dialogFont.GetPointSize()); wxString facename = m_dialogFont.GetFaceName(); if (facename.empty() || m_facenameCtrl->FindString(facename) == wxNOT_FOUND) { facename = FontFamilyIntToString(m_dialogFont.GetFamily()); } m_facenameCtrl->SetStringSelection(facename); if (m_colourCtrl && m_fontData.GetColour().Ok()) { m_colourCtrl->SetColour(m_fontData.GetColour()); m_colourCtrl->Refresh(); } m_suppressUpdates = false; } /// Respond to font change void wxFontDialog::ChangeFont() { if (m_suppressUpdates) return; bool underlined = m_underlinedCtrl ? m_underlinedCtrl->GetValue() : false; bool italic = m_italicCtrl->GetValue(); bool bold = m_boldCtrl->GetValue(); int size = m_sizeCtrl->GetValue(); wxString facename = m_facenameCtrl->GetStringSelection(); int family = FontFamilyStringToInt(facename); if (family == -1) family = wxDEFAULT; else facename = wxEmptyString; m_dialogFont = wxFont(size, family, italic ? wxITALIC : wxNORMAL, bold ? wxBOLD : wxNORMAL, underlined, facename); m_fontData.SetChosenFont(m_dialogFont); m_previewCtrl->SetFont(m_dialogFont); m_previewCtrl->Refresh(); } void wxFontDialog::SetData(const wxFontData& fontdata) { m_fontData = fontdata; } bool wxFontDialog::IsShown() const { return false; } int wxFontDialog::ShowModal() { return wxDialog::ShowModal(); } void wxFontDialog::OnPanelClose() { } const wxChar *FontFamilyIntToString(int family) { switch (family) { case wxROMAN: return _(""); case wxDECORATIVE: return _(""); case wxMODERN: return _(""); case wxSCRIPT: return _(""); case wxTELETYPE: return _(""); case wxSWISS: default: return _(""); } } int FontFamilyStringToInt(const wxChar *family) { if (!family) return wxSWISS; if (wxStrcmp(family, _("")) == 0) return wxROMAN; else if (wxStrcmp(family, _("")) == 0) return wxDECORATIVE; else if (wxStrcmp(family, _("")) == 0) return wxMODERN; else if (wxStrcmp(family, _("")) == 0) return wxSCRIPT; else if (wxStrcmp(family, _("")) == 0) return wxTELETYPE; else if (wxStrcmp(family, _("")) == 0) return wxSWISS; else return -1; } #endif // !USE_NATIVE_FONT_DIALOG_FOR_MACOSX #endif // wxMAC_USE_EXPERIMENTAL_FONTDIALOG #endif // wxUSE_FONTDLG ./src/mac/carbon/fontdlgosx.mm0100644000076500001430000003601311052677173015417 0ustar bhunknown///////////////////////////////////////////////////////////////////////////// // Name: src/mac/carbon/fontdlgosx.cpp // Purpose: wxFontDialog class. // Author: Ryan Norton // Modified by: // Created: 2004-10-03 // RCS-ID: $Id: fontdlgosx.mm,v 1.13 2006/05/25 21:08:01 ABX Exp $ // Copyright: (c) Ryan Norton // Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// #include "wx/wxprec.h" // =========================================================================== // declarations // =========================================================================== // --------------------------------------------------------------------------- // headers // --------------------------------------------------------------------------- #include "wx/mac/carbon/fontdlg.h" //#include "wx/fontdlg.h" #ifndef WX_PRECOMP #include "wx/intl.h" #include "wx/log.h" #include "wx/cmndata.h" #endif #include "wx/fontutil.h" // ============================================================================ // implementation // ============================================================================ #include "wx/cocoa/autorelease.h" #include "wx/cocoa/string.h" #if wxMAC_USE_EXPERIMENTAL_FONTDIALOG #import #import #include "wx/mac/uma.h" @interface wxMacFontPanelAccView : NSView { BOOL m_okPressed ; BOOL m_shouldClose ; NSButton* m_cancelButton ; NSButton* m_okButton ; } - (IBAction)cancelPressed:(id)sender; - (IBAction)okPressed:(id)sender; - (void)resetFlags; - (BOOL)closedWithOk; - (BOOL)shouldCloseCarbon; - (NSButton*)okButton; @end @implementation wxMacFontPanelAccView : NSView - (id)initWithFrame:(NSRect)rectBox { [super initWithFrame:rectBox]; wxMacCFStringHolder cfOkString( wxT("OK"), wxLocale::GetSystemEncoding() ); wxMacCFStringHolder cfCancelString( wxT("Cancel"), wxLocale::GetSystemEncoding() ); NSRect rectCancel = NSMakeRect( 10.0 , 10.0 , 82 , 24 ); NSRect rectOK = NSMakeRect( 100.0 , 10.0 , 82 , 24 ); NSButton* cancelButton = [[NSButton alloc] initWithFrame:rectCancel]; [cancelButton setTitle:(NSString*)cfCancelString.Detach()]; [cancelButton setBezelStyle:NSRoundedBezelStyle]; [cancelButton setButtonType:NSMomentaryPushInButton]; [cancelButton setAction:@selector(cancelPressed:)]; [cancelButton setTarget:self]; m_cancelButton = cancelButton ; NSButton* okButton = [[NSButton alloc] initWithFrame:rectOK]; [okButton setTitle:(NSString*)cfOkString.Detach()]; [okButton setBezelStyle:NSRoundedBezelStyle]; [okButton setButtonType:NSMomentaryPushInButton]; [okButton setAction:@selector(okPressed:)]; [okButton setTarget:self]; // doesn't help either, the button is not highlighted after a color dialog has been used // [okButton setKeyEquivalent:@"\r"]; m_okButton = okButton ; [self addSubview:cancelButton]; [self addSubview:okButton]; [self resetFlags]; return self; } - (void)resetFlags { m_okPressed = NO ; m_shouldClose = NO ; } - (IBAction)cancelPressed:(id)sender { m_shouldClose = YES ; [NSApp stopModal]; } - (IBAction)okPressed:(id)sender { m_okPressed = YES ; m_shouldClose = YES ; [NSApp stopModal]; } -(BOOL)closedWithOk { return m_okPressed ; } -(BOOL)shouldCloseCarbon { return m_shouldClose ; } -(NSButton*)okButton { return m_okButton ; } @end extern "C" int RunMixedFontDialog(wxFontDialog* dialog) ; int RunMixedFontDialog(wxFontDialog* dialog) { int retval = wxID_CANCEL ; bool cocoaLoaded = NSApplicationLoad(); wxASSERT_MSG(cocoaLoaded,wxT("Couldn't load Cocoa in Carbon Environment")) ; wxAutoNSAutoreleasePool pool; // setting up the ok/cancel buttons NSFontPanel* fontPanel = [NSFontPanel sharedFontPanel] ; // adjust modality for carbon environment WindowRef carbonWindowRef = (WindowRef)[fontPanel windowRef] ; SetWindowModality(carbonWindowRef, kWindowModalityAppModal , 0) ; SetWindowGroup(carbonWindowRef , GetWindowGroupOfClass(kMovableModalWindowClass)); [fontPanel setFloatingPanel:NO] ; [[fontPanel standardWindowButton:NSWindowCloseButton] setEnabled:NO] ; wxMacFontPanelAccView* accessoryView = (wxMacFontPanelAccView*) [fontPanel accessoryView] ; if ( accessoryView == nil) { NSRect rectBox = NSMakeRect( 0 , 0 , 192 , 40 ); accessoryView = [[wxMacFontPanelAccView alloc] initWithFrame:rectBox]; [fontPanel setAccessoryView:accessoryView]; [fontPanel setDefaultButtonCell:[[accessoryView okButton] cell]] ; } [accessoryView resetFlags]; NSModalSession session = [NSApp beginModalSessionForWindow:fontPanel]; [NSApp runModalSession:session]; [NSApp endModalSession:session]; // if we don't reenable it, FPShowHideFontPanel does not work [[fontPanel standardWindowButton:NSWindowCloseButton] setEnabled:YES] ; if( FPIsFontPanelVisible()) FPShowHideFontPanel() ; if ( [accessoryView closedWithOk]) { retval = wxID_OK ; } return retval ; } #else #if USE_NATIVE_FONT_DIALOG_FOR_MACOSX IMPLEMENT_DYNAMIC_CLASS(wxFontDialog, wxDialog) // Cocoa headers #import #import #import #import #import // --------------------------------------------------------------------------- // wxWCDelegate - Window Closed delegate // --------------------------------------------------------------------------- @interface wxWCDelegate : NSObject { bool m_bIsClosed; } // Delegate methods - (id)init; - (BOOL)windowShouldClose:(id)sender; - (BOOL)isClosed; @end // interface wxNSFontPanelDelegate : NSObject @implementation wxWCDelegate : NSObject - (id)init { [super init]; m_bIsClosed = false; return self; } - (BOOL)windowShouldClose:(id)sender { m_bIsClosed = true; [NSApp abortModal]; [NSApp stopModal]; return YES; } - (BOOL)isClosed { return m_bIsClosed; } @end // wxNSFontPanelDelegate // --------------------------------------------------------------------------- // wxWCODelegate - Window Closed or Open delegate // --------------------------------------------------------------------------- @interface wxWCODelegate : NSObject { bool m_bIsClosed; bool m_bIsOpen; } // Delegate methods - (id)init; - (BOOL)windowShouldClose:(id)sender; - (void)windowDidUpdate:(NSNotification *)aNotification; - (BOOL)isClosed; - (BOOL)isOpen; @end // interface wxNSFontPanelDelegate : NSObject @implementation wxWCODelegate : NSObject - (id)init { [super init]; m_bIsClosed = false; m_bIsOpen = false; return self; } - (BOOL)windowShouldClose:(id)sender { m_bIsClosed = true; m_bIsOpen = false; [NSApp abortModal]; [NSApp stopModal]; return YES; } - (void)windowDidUpdate:(NSNotification *)aNotification { if (m_bIsOpen == NO) { m_bIsClosed = false; m_bIsOpen = true; [NSApp abortModal]; [NSApp stopModal]; } } - (BOOL)isClosed { return m_bIsClosed; } - (BOOL)isOpen { return m_bIsOpen; } @end // wxNSFontPanelDelegate // --------------------------------------------------------------------------- // wxFontDialog // --------------------------------------------------------------------------- wxFontDialog::wxFontDialog() { } wxFontDialog::wxFontDialog(wxWindow *parent, const wxFontData& data) { Create(parent, data); } wxFontDialog::~wxFontDialog() { } bool wxFontDialog::Create(wxWindow *parent, const wxFontData& data) { m_fontData = data; // // This is the key call - this initializes // events and window stuff for cocoa for carbon // applications. // // This is also the only call here that is // 10.2+ specific (the rest is OSX only), // which, ironically, the carbon font // panel requires. // bool bOK = NSApplicationLoad(); //autorelease pool - req'd for carbon NSAutoreleasePool *thePool; thePool = [[NSAutoreleasePool alloc] init]; //Get the initial wx font wxFont& thewxfont = m_fontData.m_initialFont; //if the font is valid set the default (selected) font of the //NSFontDialog to that font if (thewxfont.Ok()) { NSFontTraitMask theMask = 0; if(thewxfont.GetStyle() == wxFONTSTYLE_ITALIC) theMask |= NSItalicFontMask; if(thewxfont.IsFixedWidth()) theMask |= NSFixedPitchFontMask; NSFont* theDefaultFont = [[NSFontManager sharedFontManager] fontWithFamily: wxNSStringWithWxString(thewxfont.GetFaceName()) traits:theMask weight:thewxfont.GetWeight() == wxBOLD ? 9 : thewxfont.GetWeight() == wxLIGHT ? 0 : 5 size: (float)(thewxfont.GetPointSize()) ]; wxASSERT_MSG(theDefaultFont, wxT("Invalid default font for wxCocoaFontDialog!")); //Apple docs say to call NSFontManager::setSelectedFont //However, 10.3 doesn't seem to create the font panel //is this is done, so create it ourselves [[NSFontPanel sharedFontPanel] setPanelFont:theDefaultFont isMultiple:NO]; } if(m_fontData.m_fontColour.Ok()) [[NSColorPanel sharedColorPanel] setColor: [NSColor colorWithCalibratedRed:m_fontData.m_fontColour.Red() / 255.0 green:m_fontData.m_fontColour.Green() / 255.0 blue:m_fontData.m_fontColour.Blue() / 255.0 alpha:1.0] ]; else [[NSColorPanel sharedColorPanel] setColor:[NSColor blackColor]]; //We're done - free up the pool [thePool release]; return bOK; } int wxFontDialog::ShowModal() { //Start the pool. Required for carbon interaction //(For those curious, the only thing that happens //if you don't do this is a bunch of error //messages about leaks on the console, //with no windows shown or anything). NSAutoreleasePool *thePool; thePool = [[NSAutoreleasePool alloc] init]; //Get the shared color and font panel NSFontPanel* theFontPanel = [NSFontPanel sharedFontPanel]; NSColorPanel* theColorPanel = [NSColorPanel sharedColorPanel]; //Create and assign the delegates (cocoa event handlers) so //we can tell if a window has closed/open or not wxWCDelegate* theFPDelegate = [[wxWCDelegate alloc] init]; [theFontPanel setDelegate:theFPDelegate]; wxWCODelegate* theCPDelegate = [[wxWCODelegate alloc] init]; [theColorPanel setDelegate:theCPDelegate]; // // Begin the modal loop for the font and color panels // // The idea is that we first make the font panel modal, // but if the color panel is opened, unless we stop the // modal loop the color panel opens behind the font panel // with no input acceptable to it - which makes it useless. // // So we set up delegates for both the color and font panels, // and the if the font panel opens the color panel, we // stop the modal loop, and start a separate modal loop for // the color panel until the color panel closes, switching // back to the font panel modal loop once it does close. // do { // // Start the font panel modal loop // NSModalSession session = [NSApp beginModalSessionForWindow:theFontPanel]; for (;;) { [NSApp runModalSession:session]; //If the font panel is closed or the font panel //opened the color panel, break if ([theFPDelegate isClosed] || [theCPDelegate isOpen]) break; } [NSApp endModalSession:session]; //is the color panel open? if ([theCPDelegate isOpen]) { // // Start the color panel modal loop // NSModalSession session = [NSApp beginModalSessionForWindow:theColorPanel]; for (;;) { [NSApp runModalSession:session]; //If the color panel is closed, return the font panel modal loop if ([theCPDelegate isClosed]) break; } [NSApp endModalSession:session]; } //If the font panel is still alive (I.E. we broke //out of its modal loop because the color panel was //opened) return the font panel modal loop }while([theFPDelegate isClosed] == NO); //free up the memory for the delegates - we don't need them anymore [theFPDelegate release]; [theCPDelegate release]; //Get the font the user selected NSFont* theFont = [theFontPanel panelConvertFont:[NSFont userFontOfSize:0]]; //Get more information about the user's chosen font NSFontTraitMask theTraits = [[NSFontManager sharedFontManager] traitsOfFont:theFont]; int theFontWeight = [[NSFontManager sharedFontManager] weightOfFont:theFont]; int theFontSize = (int) [theFont pointSize]; //Set the wx font to the appropriate data if(theTraits & NSFixedPitchFontMask) m_fontData.m_chosenFont.SetFamily(wxTELETYPE); m_fontData.m_chosenFont.SetFaceName(wxStringWithNSString([theFont familyName])); m_fontData.m_chosenFont.SetPointSize(theFontSize); m_fontData.m_chosenFont.SetStyle(theTraits & NSItalicFontMask ? wxFONTSTYLE_ITALIC : 0); m_fontData.m_chosenFont.SetWeight(theFontWeight < 5 ? wxLIGHT : theFontWeight >= 9 ? wxBOLD : wxNORMAL); //Get the shared color panel along with the chosen color and set the chosen color NSColor* theColor = [[theColorPanel color] colorUsingColorSpaceName:NSCalibratedRGBColorSpace]; m_fontData.m_fontColour.Set((unsigned char) ([theColor redComponent] * 255.0), (unsigned char) ([theColor greenComponent] * 255.0), (unsigned char) ([theColor blueComponent] * 255.0)); //Friendly debug stuff #ifdef FONTDLGDEBUG wxPrintf(wxT("---Font Panel---\n--NS--\nSize:%f\nWeight:%i\nTraits:%i\n--WX--\nFaceName:%s\nPointSize:%i\nStyle:%i\nWeight:%i\nColor:%i,%i,%i\n---END Font Panel---\n"), (float) theFontSize, theFontWeight, theTraits, m_fontData.m_chosenFont.GetFaceName().c_str(), m_fontData.m_chosenFont.GetPointSize(), m_fontData.m_chosenFont.GetStyle(), m_fontData.m_chosenFont.GetWeight(), m_fontData.m_fontColour.Red(), m_fontData.m_fontColour.Green(), m_fontData.m_fontColour.Blue() ); #endif //Release the pool, we're done :) [thePool release]; //Return ID_OK - there are no "apply" buttons or the like //on either the font or color panel return wxID_OK; } //old api stuff (REMOVE ME) bool wxFontDialog::IsShown() const { return false; } #endif // 10.2+ #endif ucblogo-6.1/logologo.png0000664000175000017500000017366213557147341013472 0ustar jjcjjcPNG  IHDR?1tEXtSoftwareGraphicConverter5]HTIDATxTڨ' [.bTTD3 EQ{5J H>='EM9D5k%s[Y 0 Ѷ5m݀1GIޝd?'B7/R_ğ3$?͟ U-ݼ{o'ywCd{ {7//M W  I I I I I I I W!U5v#Q6td&aYG7beT=nH7 W/o(&EmHumc0OEf}_V|@U-Mk7`S5sMF{)_Lm 6 *ڎnηVu+ڄ݄#@eh;j{x*Ru7t_' $_ߦER.Ww)4L͛k+*T MS9UXn?KQ7i[#K˞ʕ fYE'r $_EzE# ULZ-}%#2W$PWh )ʇOU]R]t @|(<%L\*S6]l*+;Ҵ/缊\svq)Pl9e̔gϚ>v׸|g- ϗ]mcsǨcF 4ubYeN^IX,ӵ$& *Vg޴d侃BfN.F(:-?q UJ.g(kx<-BjUۨ+i8?1$UE}B. lݴ׵ڹ>-'|@|06I 9@zI+6:q  "RĔiaJRSCɩYG,f8lI:J|mlbyF?mφ Xմ ʚG?hUP W{  MSz5:nWWa'/+ć"GKD#kɹRUON3wT=#1/NV)F=tFm\v-2]uk0_vfQS `M x=HER*kj_KuM\&>uOBV1Pxlel]d|!#Ռ!l,+2e #هT=.ó SBSV38p+,kKٺ6Jq ".ӟ$U6I+_k_f?ٔD6s$g>=ܓtxQAtWcVV-&ۈ϶,x 3-YUUyVlsDy-<݌cF.]O5z`^sP8)w_:䨡yin6VJ/rH.gG liuT#6Ŋ)&laݕEO04p_npi6Ԍ2=*vN,I^sl5a٪'鵯b]69@|(;)oK}Vo| P/4%,^bsL G h0ʴ%G2z }۞-l-5REu$.2DȄqFF]z8l!.CϪeXK\ ꥨHWfrJ R( 氝a#*,t=&̈́#`^T%.`xqo\H|?@W߰Y?K-dIn2jVԎ=ߊ3Ęaf <@'B t 1l>"ncl.ȏc'^A281%F|vͩI2 ?z e=hmߙ_ Z@fHaSF^AxnJsUNT",u?ם8Aa8fꩩ@J315̴Za=;BIR5( 3Vdƽ7p LMXFE6!0q̼|tʡo.7$o#T1|<~1YG8E)BѱYϖW3BSle%gY &2GB;o$tyLohfc DFV=ۂfv&xAz!w,{1!±)8vl2sjYNLH%v2ǂa,179pdDe% v1m֦|&&<%x&TBM$BDFVљU`A$mH?Idn#9޺:F챰{`aK:B0#4B|g&k%F2ccfm4yRrYH8xoPDL.ѹ k]gFCSOaY%jLY ZX0}2tՈ%ŔTC6mC3XPݾ.LTf2^Oe۸g8M-.V7T/zo9U $40DF׌pL7%{)ZHZHI1z̀aZtl!Dj=fcj`5`pLe'$Dy%!=|O Q(sOYO_Qo=/N>oUUKxxo\Dszόif"%%A5ElfLwf?SI`gp+m#3-DĶGѣIz4ň%$#@& Xr-jxTGfU>ؚ<͋|Ϥ"WKyV9XzCOة:8P uX12$v&6!cT=8V0 X>`Qz,%pyd/anSM|mK^YDߑt/=oh䌔VaUs HEk2lB-\&pIF,(yмv۱R9l'1R 2: H2xͶpH t1f„Aա0&4ʂA[X٢{r\enмFy??5sUmce ¤?t'xw\D9IqltﱫݱWPG"X 8P^>gMU';g0`nAKzPTDד&ͮ ̲b]X\▷K*hsօ'FZX^)D;dj$Qd=`Ġ =QbؤR sDQqLM@<Ҍ.xd=4TPs_16zج%UQS51:hh;\S\VSvE&Ys}9 O'$Hx3S-F | edF7rz!LǘȘ:"ڀKLp ǣxcM}) mY|ɯMhLj7k;Ӕ|/`^k_h8_υŕ -7ni@};@PәZx*lxwe|DMx7`!٩8',T=:ڨE߆N4Pq @65)As`|a7|Ufi@%uj^ݏdƤ\]ަ\|̆@."ro!O5j˾8])w aӜ D*,Z&ՃL ^3V*DBně8Ɍ۱D<ES&6qZMמ}*`uvqkJ$()WNROi\i  2G/(k==s%VE Jph7M"NP!rVm}[xM01 ƆK6!QfKvB#m!cD7Ld >ހFUȮ`ϐfo֪Ւ7Y۲k[ĕSgQj[eqt߃ Q;řWV]kUT5B! ~ WJ{R2]תss(µCF 3 6n^F5x=g=K`GZ Fc>e@bL"PGaq5f2BJcF25kL _u[STӕSFBYmZY9d̳MV^vQ{H?ħ+L/{xGI/oj:NSmȮj]rx~>kszL7¥aGq^_eYZok͟1nĐ0؄iQ*Ю(amd=:JO<}1'ZK%^Į:$ k;.;mǨ c6u1X#W* o>#frD]mks />SrE~dV Tߋ**w *kUt u]VISZe{Ixͼ+= l˰D#ƅ0}Ƚ}(FR &|_h}'z;;5aqb>J7gjL[ Ӥkb&=ޣ8M8{\'E\ w|^N㧹:̥?/lKodjm [ELMCSAl0777"6#"p\BԊE 5~Rk/w_c>7/ۿ>2|SȎ/fM?rxq.h U){,/m/ߞ21cbkpqjWGZE:1\W%|eֈgwZ͋r2-7`_˟TM3ӹOWX]iy|X># &$v(;8WH)+ͥJ'픠wR"6ao'Bk/lz6< GG"m$oDo ^;y`d̟Nv|s"CwܴA*qʇ[1Fjxe$EipeB9+ιhW𾲪39__?3iT>f*_f)W(|3t>sbښ`X!#G8My,!~iME)_^RSvCR`CI;E1c"BB:yk䍼8N=| #ҏݿO]Z?gސ x՟UUef.7sp13V 6N=fc'IaDS%Cfp>wo=z|Eٍ[g˫,bm#4!AyTm7snL~6U*2\fPw,u t//P}7|Ӟۦ3lPԖy˜|J0Eԭo8/葅\),r_:< #"# Wpc֠v-=m>ClQEcSg'igXES i7Ee1[6oFJEbiӶJ85u7}xIwO}o,zPu3)Ueu6Aq_)6M|%${#LG7e_<Ls|ȩngO hgUd7T_{Xy;˅Ǧ[yeTW4 A,е5@\ ?C/AY\ِkpFN2n$m'h(G<\v{Pď>B(x`:K m453|J^%vbQ=a#I—R"DJIDܵxt!ac}ܾط~+t3kV پ{Rb2CO!68h5[7M]h9rݸ7uƅ;>onח|oJg3+6{8൉_?_IjڄxN%Eq-nA|%^8 ]939Ӝ/{Np]D!k~>vXȊĆ?UP͘4w_R=X5B̍[[ĈLвe rvlo LnM?eߖG/fHbyߣ8C/u*+ g(aAaaP';ꇅyN\H,a& ϯ޴}TVW @>y< ȸǴ״Ǧ;ȎdG'7e[ֿ讫=kOnW;'qD+axevV7U3W91RvMmGK]坓0\ v@~f?֯5MíCB01;'m! H~݃r>վ#by4 T?ɵt?r5 }XyT {R alWO#bl_܊x~ nq ayj~9A#Z &ot4e4pQPcIEoEC_]O-дे#pyE䵣/.dgS&{ޏbkJ*u-I=_ aX/7C`$Qu$nI ,tJŏfx>FXRs}2C,o?t⠠֭/gP8#gg .ȣ,ТiQ7hjhd@QY v&0r?*eoppa Ra|ls%i~&N1.wq.z[=<۰YAOc^6CATO@C_/0C߼ML`zh>Jm /kh*lG<_R([ao ,1K(( S0,$y򐨧FU19L8HS.8ܿ{ ѽBL'p8%fMS.sRN8pX g=i=>\YCDrrjOKooh{:ۆ}'~}U(z*:RhjA['Hƙh&ugڋxT}/ۻw Q<{ Hs'z0 a(э깁jcl>U ڗD.@NWSCsqHH xN>usI|QnGGO< ] z\u x<t20VzrI>| nPWmWQ@$ס*G(S˱`_{.* 0Lڲ%4]D\|SSTsrkA }Ln)>T5W ~ wցxdr@V,bxX{ŴOXj ўNpu$gl9QcB|\{ؤ|w䯞9"&*qC}qY,HMp4t3rw3pCaF!w]goЇ*v {=]?YӍ.>L22:&P ݞbX>A,%vmĵ*}t(g&юkOepkURb~n}##yvG~8r ɨ.ֵ)ʂbEJvcuQۢu;b^p5n2 y ٫{TMmoT_8pW5CTL!C}IJQضji<oS>?] =iڑ`1lzcfw-E+#,1~VG뭩}Dl6!..61ը%Y8pjQibX¼\l NUװ՚pK )&y7dEZ Þ \uzt:>f樀#֗$d jf&Z:Kiڡj,6=%iQ^nD\`ib<QՠEdg״؞hziEN%f< xvRRV/fXـD3K-o^N$!/=v్2 \%xcV|Zsiɓ[R-.`wRG^~EI6 Ud865@j i(1wA1|yf ;8xr^Kp||57\Iç90잘Br&z'loҝ0kՓ{A7?[ks _2V_zj8! C/A:f Ka՜΅wW+P;JטښɾW}5#=cߴOſcRqUԮ 4,%WIJY!cE[G& ֨7D< I+#)( :sT>. ^@>*#**'zW頯Hw#LFlTbYh+AHRg:2d8aS{qvzj!ݙ6Iu0#c¼H<=Gotziwk%yA'ëX:5 !M~78H]*!wwSgOA>}^^\Z[[_Xޘyubekyi+}e}{__X[12?Ntn 5?mů6#4]< @Z꙽wTN[>11V>RZKF9*d zxAVZ :=ipRt;FKtBg81@wQK+Ǥف/X dt%;%:ܺ|`1jnoӿWJNϣ+b j[GvLD`:ؕ0vf|mj`~@ԙǏ, .g߷ύMt-NQo1 K6FfI3١cvl##iӶYZܶ 3ȮPZ|a@4ȣǺ/,XX?u5w6zYRS~R(;X+QvN.^>+5sCÈiΝ)Vl<_J^`ŝ=܀0AGP3I9A uX,5ztS}2{!yHzq=m㾅6h@zFp YJ:ꊷ.V'x׿]ؗ ܅o_3*TC~AEh(~FZ' p~ϡMDe{az򇖪~B-M;NfGح{}>׵<ӹ<3jnyqz'wpn~uja0RZ[Z4z<o손W0A ▂ pFLjz)J^g YDLJ\g/!^z?LՏ2s34PW8,%Prxp EAVA&0b;.՞@tƧ9uyQ I X\kKδ'Y=}D a2?O^vs*(+dK^.|"Kį!&rmԐt0=?@em/o7V'WGR4~ak}k- Hq"â+#!OMד=e3en-c@a.8. q+8i3c.{9M-6~;6z١^"c܌l tdDdـ"').fvK E) Ħ2^;J )H-vxt8O,%B˰z,/01&SYm;qk^=@_$xBjlȟ‰F mꩣ3C]_o{RÃo>ֱ)\_~—oK~_f~~@LjAQpUȜܹvJiu;[R֣04i)?FcpOܿG>@;U!+ąМJgݺH'/}>( 5,XeC܂utsXʉE G@Pkkw?!s'axFDt* nIu|RwHu--bpWQN bpMiV@B xpW!39a}ⴌs*aYARqs7ikmn-D@`+Rra+S}gc?>]"^r!T/koLJGZ( Ը]KHX>LtwK() 3la6L~:B;֏_ ibӅF~So [Q`l+!>n3{=C=)yT]fm}>~v?b%םDLǥ^E}7N?gg?7޾sT\o{R4 ny=N詃˃sƚ{2sCMտk)]t:Y]/Lz^ZZLj)Nl[xf`l(>`CHQ ^E8uM(2g8l0 a3-#R̦:-/ú2]sz J^EF:i^3v6$ Y~/.r;7+#U?~4~GMV4G5Op!(?1Bی[ie}eshm\6ߚ^૏KqHnN 쪈!"^[W< TW! 5sR!v-eM%yi%)2?b>|m'S}0z,n ŮEb~BZ/pRVג-<[T\p0PɃX  sC,M_#v_LcaDU$!/SbcepCNOXZO= ސVxas_I`c?Ut̷/?xePQw2Syv˒ʗ 3HIt yg0wĆX]+7&xTwU&cjB|ӄWH3 " ®F+P~OпG/pVp|BZtЕGV 󑽂V:9VRK?#h)ɄU=4~ YaN6@P\TFiY] ϟ=$ b|< JW3ȴɗst:[Qi@HY^䚓=UGZg)]voKnU0k[ }myc1Lޔ5T*}>u#)q ;N*~CnWlb7wuL2yprq#, MCsw[j(į0 \ *S`dr{]BxV{>׹~IJ~1;W/dg9=`)iC2bL\73rr D?̻5Nw7DOے1v۪^ռ\AvY1۔+"PO$!tcc4C K{[QPlAh_]\]x{`fuj\78Mo~I˙ 0xxK$όLt"eRjsGZO3S ayD^{>ACP PZbڳTff1i!knQ>}HZT[Y=hLG@҅b`!N=|]?'yA#b02*%e-q A3C/ H\5{󡂯PH[UB_ %/MS[W.JIS /;E<9y{gSr^ yoU >}`{x3,n(did\ WRV^Zcߖ[. |V\ј EDWxm`1ΚY`J]m'C,m)uInUI/#LRyLx.\0/>GK_^  @$i@OVQ%%#t_S1F;Mx+F5B|Pێ&NX@}y^V4MJ>zK9Zar9SwN<)|S^%$/\?)T+>sV:[\V08֑u;p7QOL1U6aZc[#uN@+ޓP!t*{] 8}i/gnxzV ӓàqIHO;(dC !1‡,'˸܌ՌtTY}Svg}=b܀k;ݡWWi]dMfFtӐw ggdَLl`VGȣ70:R`[l7ZX?Ӓ1f=q:Q- ~S8ۚ>k4i2CmTMTdU@o-ˋCr&ۣb ["1DJf; 79hdwUHS!8:%?%#lGvw~W`W7 <f@>5seH1η-4uNdn]a|~hH}qwE s|)iн*{]^ (잇NnY%*sO*c|s?5gЙރUDRiL!EypCd[1: mocs]+V) ޲0T%÷#=Z:;AEGcۆ}"3E Άj@+߽x^^.&6.#ZP[+LN7Jn'n>w'^׫TWe*NgOJɋ N;i7د~^v0#pisu|t=P bfQSG4 ᢛjQ[nd$iMM^٭+Tw% aq?ר.ƾ(<&~5ҥ%=I HL/KكdOp{Gw;%V-~N\ W>^Bg;WÛP,=Rq,M>%yeR~~||DqV":+_(^ITUbzղms>k~WPOXFz4|B^80\ݒ7YiqZ1I(Y9ښXTӐ:u3J{\:C}Y)Lh*f|4:[>kz i,DԽDÛ`fq) V0v_9T?+Ev2$>-岾 ;3;0$D_Ӻv]~jn=J4]nTw[Pz]DHqLT&ݠ¯5.U3W>%sGO?VH_ꙣUOV12Y{1Y_6P<,' S#_S';ߣʼno>O~}K93LH_{}~˧|'}5J | $m  H?D4f)3WfBގ!HʷuYEXyE<,Nd"Fl%N[nz1 z.P=R\R/0t)y}h@ruLWaJNLvsi'- )%1ձ8zib^TdyEM9:۩m0/z,+KA)EԲ$j!4R`ipEDmf}`K UdgkTӏ`.o!%N@!s ݇W5UJ3;@HɽN.Og&Fnޕ "n}hxWN43'{+:狀] Px\`{*@K G\jpHH[fKos#ӽ#Ej;t[blOPes:r#{9JZ/H{ۜ9*2^Eo[#hHH}Cˣ #[&Pfv!;=Gۀo;sKJBRZzpkw.T_VCBVT}|D!y= ]>J$d 4;ắu360qwD%(̏⿽î~Xz9@_7FgjS#҃Ür#Hc1 WQT@ɘ7?tGJ T{Y7~8iJ=⢨7p} ]DP?GVv+5啔Y Ü淬>seDN^5xN Q\SN<T\xɓܕz z/ۣV5`e`> [}]ۍѱshr]~~. 1n1^{p3#/y8O}Q~PwW㪤 HM=x ZTPY>!'9ݻ ǑBҸ׸ml$~QP>^1qqQV>^`wЛx3䀣T4o~#]jC!m>R.W?x `8 Y:1<҇a8;Ӧ fXo\Võ:ꯜ= L3`~^_j@|r s,l3Y-['SƷW-@}uS;+2*Ks#pwݵOxcU9qqs\w!)Tr?4wP L!Մ]S@hW٘A`aI7#Lν[}0J}Cj}xy88\,L̷)5qq1|p^NSQqf8㥘AI)[T|3iHs  ]"̇; љdt#$oUX}3FASJc*Pidž܇d}inu]NCn E 6J ՋmV5<'A`^!CЙAbDhlSW$((˰f&&ѝҘ˧89VN+5y&Ws2sr89XD SAJ{9pS;  n& @pPjbV,#3@SB-'35jHࡽ*ʹ$[ϔ ti@o-׾ Q; W#q\{* F**pI [# [>vֿ'\<l`F0tgzO3^ ɰ03OT6e*ڳӟ)jrOu*M؂֖ f@; G*bT'=}3s#CZIij[dxǯH<7RKī8 xO+ޮWb$ĺ_1!7;[xWWBT#+qօęirTG)>& ;+p!\qK(8KX#ũ~AN;/ 0F-^"ak餪jF;7@Pa!aUn KOewT]QQ{p  2J58+#{N蘴CHψ*pf԰qA4'WSC?}Bb1_c˟P-Cl]U.2/ bd`dUFRm2p3~m,O:{J72/0zmYǾ)ʫŒZ8eʏF C-GV>*mYԲ]JC:隱IY6ƛ=RP/@q;EHE(vߎ"nfҖ30a/kӹüO|{@lS_eڲ5L Y0unJG 2'= ;;KP)3`s1B~&@VL27J q31s05TnU|:׳keeuDh0n-%}% TDlԟ9 ů%t>>O'}X$43b-_P潈:]JXCbgSsď)w TW^٭ɨ)ĵxWX%= Yqrk4m|zSfpRbuޕCH@ `SW?JE]t?87?1\wuPe/eR[yIuA8v-%]Eߣ]U!3QeaP۹ipԚI\PuW?G(hh!{ +;-K;m/ ~igcXDbpص8&#X #mSS>#@{1 ;̍ oXHZ vT Yܿðba -Wq0q  0lb1emz4~aXF\WIpz N\',F/A+Hs; !fǀ\w[ǹ/F7?uΎ:^<\B| ?ޅo$詝fٹfؤY4*, Q;# 1ջS&V23Ek*Ȁ3f~ Z@!hWQ؅?'3KFlD3(/K;l-a_ ̅a6:6>"ɫ1՝\i(q&s[OXłvX I[1}[n%CWLE/z<Ga ྽MgLl +ebeLF7W<]ؘA,L"`!Ⱦ(H }}: ffbtXa]Gm\x߻nxXMxي!(p?]` |퓿(&hA-ؚ[r˨y1xu?'/ Ol+%"b8}_-H^1?I]};8S?PҊ (A5X#`WbWׁRFj9r$pT4MΝh}HM"fXɵ7gCF qN.GSt/ I. `ft]Lͅ9w7宿2742VF$u' }ۯb/>Ӽ4R6]7[7N,\i R s;O\1tuHdѡ?z\VZp,Yxw`HƤw赉wvҟV ϻuvߢpB;{g֕kY2mUUꗪNf#͗JtQ$ӀHa3/,1`f)cLXbƀYl8RS>jӕ޹ν}M6@'kS/a T8x)TO?.>Ջ׮NKl's\ˆIirzhŽdSeǷeYq}9y0?gN;^гsi1Xh~}[ʂ \жipj@IhC&)Oʣp;I_ʀvU?kL)z6izD\5oZxwlVȑ5L6C7[JP4-c@C7R9<-mlP%%Fڒ:?gL5u { G6p'/j|Dgр,&tpu2{&iO'/hvtؽKʨ $"a )7f EOX5i:>~Ռf%#ĝնɑYSx__R 2^8T'?Ĝpp!K^zI^ow.ۚ?weSpN0mT?Xk5:|}ۨsb9kv,jܳ u \`EgܶlM6s{yZwEyП É~)h9]Wh(PѬܡk cyޮo٘>ZS[ =xwvxoY9X5mm{vU|sᣵ ͊Sc|j\ZaР]jg7p"_ rwф4sZ_?y+ "(BMS-ɘe26Ag&`LrgEMur7 5N+^TMJ@m#E9IM);? E%肞,~E(R%h}tv.T,v(j3sT^UȅvjWTy5 GS5:gxFTfkeRL\g bdC׸ɊKmt;Y\(eC+p(Ԇ͌:Е)k0a^W'uR{)SL0~ߢ[vT/Mӂ7ݧMDM`]9AT)cl%M نSQu_˪eL< e(dY .pel헒zP{4ƕb\L6K))\]Ŗs4:oѵB'L(OP.3ǝy~.Gx$ #2"BR1OI3(D]JEOE)am$⍢~X}#x@* [X]ąΦ!DI8 'ql+i!@ !/iit5q5I)pҶ1A咤$u6RYz[ Y1oɘ7)W5aeU**s_pnvmYYciϫE{k4Fb 3n$ǽtԥ@^   Ÿ cNDLH|lV,W&2$+L ˒mʡ)v^ bdT4 1;qag9?M.}rvl^4/-SP0YwKr)\:~DLprh>GJ8<>CI pDNy;С-ƨ m2d6x5I'gt[י6zIَ8'Iϗdefd2NcI$:HP+@ w{DR NlM_欫rm߱ˋ)s}g|>#Ǒ !Yt$K0^,HΎR^;)}J_ҶD=%SbB#d$H("=T@T$$MbYqAFĺү^/H

yI?)`~2uzM~L:a4*t Ry[d;r|PdX$~]s҂2|yQz2Cp$H)l(@nfPA0c _h+3nJ5eǚc#ZR#eyբ ڋDL:!'?'ADTHxojq݆"tN-b[Sn^#G7>*&4Sg e0sI$ "S)ᬼQ\;[n/ TZy%c9/"#WiRӢg҂ PπQ@3o]Q 6e{ٰո8غ04MzMwp/_&cbL,\]JEb^ ¯/ -ͯ9SqP"WfMfq >#ޗQ.Z 9 2(+#q/(KچWA)$>Gg\Q;W|:'xm@COJ--*-lvdƀu-- rbMb^}GEI!Y7Mj{<oڷUdtpJ###?g*5 nl`YLy::M!#ӯ56|ev<iv ]+-Ď_mNERhʗHZn#"ovN[rJLiڴsp6̸Z؇.yZaKJb])Wtn)緙ǾB?w_EE%7>߶)E>G@5/ˉՒ۵)(i_6~2npNNl(|r(KBʲ$Ar;wqETUi[-q saS^` 0,P"sCRʫ<]&gx>+8q DD ʈ ψ$q4XL e#ՉŸW*lrG]P?Vok̠@ȯ^j؞*qFK}4<=fi ~` ΏXu xwfStpF/O RTR%A}_QDkl9W CvA bc_^EDŽij{&68FedY]|_K6ԼDF ~:.$ƍ b ǐ h1kwW-vܟ뮫誯7k |= =oe\?kbK6;r[FZtXnܸHiIHk0\y՞k}Pd:x'EErA` Y JT:ex6;xDbCwN@,Լ \TؗASB ,i$3CY~Q=RVTƏS Wjr_>{=EzLr a'aS> 6<O Ét%Ђi3&9K@}|B3iHOtDd32Ӂ|duU^>(?;e7Y4l.Y]czpsk98=?xq 5MZe Eyq]N3ͺɳ'3y+3l*- (=[x%&G/iv,Wm^ep' fBֺsSJϥO3&P!5pc(Mn%F|z &%mbŌTYFSH<:y{@sڦ/e3GLyISv e>k-+`\C~ĀN\#l>?!?e>2u4 \mV$7Yկ;zW_;`/Eۦg5{F{R׾W_:- hc{ǦnXvh}e Pcy$ŝSc^akCB·$DF^?M;H bLfe>':U-:[.~'C!GA躋mA<=R<5&'| c:)#!B2LL ni;a+Θ@#YGCtry|o4޶5bfۖ& i(`@ً~a$< C07ղMm#/ȡw v- Z5oO5`wE?I2^lxIJ-lrRWٜBO=*y0oqNnYvկ|MEҎI;!i1Jnx4%%ܟV[P%Y;2-a&-CH5 ll)h g<rbv1Q3?g9Wp|ṃ?9ojz^`7okH )4ݖljs4bՕg\fq#z"; &N*> 2xuvkqYw,׳8NaQ"`Vl_k9s~&v\>Wo\pqNgx#9io}p $)K(Bl*]؂%9y-2eS.MqVf~"Gl];(RIl̫2}~/pSHAc4z뢣jp[n\娈Mxg:{= wJЫ}47Ծ<o][lCkv :=ԟQ|`D >1'FXSf ~# 5ӎd@4b*`9@. r j Q63/P?`Ejsux`cĉD[wH52I=O}LM "@-1/W VD ɇCƛֻ֧x5qۣs=wV2A;_ڏ ?km汥 Uq{^n8|6 xE>vgmiiJۍKgl<Ÿ(rÔ2HƱbB҈dӣ2cݗ)s_ڱk^.ޑms[9|JFTBA,OȎˍARa"b;bhL* ;]r-2|MaZi5dڡ#$68`@a 3 / QRM/4.{V>v- \:_hBf-Pr 񍺤o侻's>?Q2>VPwRBt5o}7F÷o-Ww90cu۱=tQ3ݳ+{]jq鰴|EݭD1v?75mCem3-MKbTީ/ERw38dʏ ӟes;T yGjؑ75WM,)0 s)7Q_1gC82J8viQ}%߸4;$ƭ^N,[j4||PS'NH|ڜ_/~iUFni'YAj"# j/:hN`jȕm;! Vv{NRoڄ?aX׻Z+;[ю Jj@L[U>Eתm_be3 AٟIO&5(L'!H23xH'#N$=IvbsE63_wiPxkb4@E]<KT`.983`658%ӃI`{}pKGpʼPکHͨ2%WY:!x?L3/Q*0$f1/w%D֍ ¥B ˤGB8q\F( |Y:ciUaU'8q480iPqML* UUFA;ѧ_noLQ5]KҔؿ|Rᜬ~9avwڸ4Ҳj籞򶫲Άmݺ[wm}ݥ{ZC[iU%1-0,cSX mˢ'D$yL yO yBq[fݡ2*١A|pE15ʫXS!,2%<2aFbsX4@W_d] ҿZ%3$.wTiߕE2)e^!7{(4FVedי0n>ŽP*wu/XkfG%i}o_Sw]:hcҵ@5:&Zݳss/[|{kR=fz|XN Ϸi.]G ^qT'Ң)`e F ɣXyұЌ`QtX54O>EόωANƾ";+@xM..SjWA<+`kRL$\3u\~i;˶tϋ}~/oh91DkV@d ^>Z69 ۅi##2%6`1ͅ?9> JH63MΉȂIHecnrҤkgh~3>K9+#˴s#MS1\wL}ho9rpaݜ5[]gΝ϶>^ܻᐃJ\n[?W%URQB?& AH.V ҿ]|lYš6= Ŧ؆[ͳٴ{< YkZ U>t)UٗWgA"!{,!RtD3P7+oH6JPNljPO[}bÅ 7򍷺M{RX\g鱟^ệs}ټ>mݘvUX{?`DG-rDSI!s2`MܫDzLҒ]R64ߤG#<&_t葘Rܭ  %5ge]i)ŠGIn( 1X4ZfnLٮcVufSV~N`)ez>@ &_0Iru[ؤ|EAXcAlƾh89mkEu3|tpM 2ݎԴ\:Ofs5bp⍊N.4jq? *"ݶ̼gcJ~7HA8$1{盺ړZ q@nZUCit(,kJ=+ypO>ASd#i_tMYVFLrgS*0i"ØwyӔ{{nϛݜ6ƭs!Õ_{c-.s%]-˥ B|N|y#yHzҩ_H'06LFh6ɉGN",^taI@?i(Lɬ_3xfb0J$'/تWyTg!<:is]lؔ[4Ŗ$e%jvv`1 $'Zl.vM{14[7't;;;p{Gma5nOsѬg>ֽdyY%S#8,FWT39iEeYbض7x$$/ƴLk0# ^cKa|Z ` Wa؆W%S{](2~iIUuxFy ԸceV(" z B_`TXZۊ@wKEkLљq;4$(ER(]d?0^_bw|GbWbwôƤ|`D Q5U `siu {\Zv"q-+ƙ˗g3^_`RUUj'/nz[y0B1LphsbܖME8$A"sL+JâJNōt!Y4" t.3t&FC"=Acُ0>501.sl>w2b!Ǵ-'V1ʰ)6=9bEmÎΣ!Pnw-@̯DWo㋻G}ܤaLGʤF>z<2n%T6Ƨ2s@ns |YmbMD KB5>1kQYo4YhWon6$P`;%5iIhy"m*MK@ Gt\@+M F$>`YPL!/?2QЭN@JLjr`wuu~Lzay}veaD:_^:OApV"r K#jÒ.Nxw]wνwN˞ȉ;Pf끲ٖ5FA} T-lELyIv4KdЃQGWa|RBkk%Gy"ێ-8;jP4u<بlF()D0H-Eɥ# o'B/C=ZSۜ|^Mi#,LKځqE[*}]p^ Ȯ#^|S -O|CB _=[a~Ѳ3R-<&r(QO!eR^xP;vZgzko,Eu%go2p@Ӆ)rO>X~5`2]3^]vޛ몜yF/-\&7N̾ R0w2i::nXml]W^1]}pujk?I9o>C 1`hWՆ".7z >Z;OUOĽ#!<24n1P:p:4D wz<+?)ZB ր|UU~[Y IfTYm3z׉_Πл#a8 $. %YU5 {qIC<e$ Z ūNI$G"y{P*B ӓƩK+Ge²a8^>Y\Wݬn=tcֈ?f]u78ZWF =`As3(Un; '6ipkss:t9^QR8\uayyn %`Ry 8@3&쇯 [Vy"|^Yb"5LBEr"9ǐhK{.uˆ #e?9S(?~u!sw41uÈj: ה]Fw7o) Z| xB+%׀ `'2mG&r2K8iBW*l)iKldVmq +?VIP'%1B2aT _GTʺ*ۣ6;0Hȡ\3,l8, 5+ug.],j7-G#zg?0 ܃w}ITUeppTL&ߎW\]#mWگ˰IF5-?GI3q@2)zD~i|`MuEl P _`Q? 51#r&GxG#\ZXF |M٭2ⳓ8<@b~i84رo^bqw $a~N鐢%V萘Rf U٥4d9)H&KD( sH Tv(4:ݧ1mšz,!5;5`Zg2tFp<)8&['܀7{ܯڸ!P*ԩi$NṈ]jp&- JP]9e$~{rŶK=>>۶mtۜ}9[er㟇pa'jחV>lJW9tx]P1`ei_JzXnOでٔ0: j+1h_/`ZXQD8G 61_̌EXjFG0B"üQ@9E55p: 22G#h$L+ iMzutvU#A0Sre޸rJpr%JmyFk11S;enXJoZA 9MkPZB|].V϶dJz?L{>_Hl ZtDaY_Ә\N@g +9̷Z(XH&u7ƍ*H`hux%H@LObne3 #Fpԣq@gD#lR(ҽߏt^olm{x%AA~G5b;]j,,5h:-ǎSaذL4*ɩޮ= M-X8emsgG# ڋyl:BGrϱȾ_ **`g?)(9T#eCBNuɍ#iQV,,7EĎ̴$r߱1LbGJ{sb:aDlrpa: e-*}RKb^7I,@W\+DMGpk"H,zq/O?ǢF咂HC N `k@-jQ7pc{#5 EGr6^(,<9„pKiyp'stUgߑ&d+KR#r؇3"YmC *0>)hs״p N9ŦeЂ 8s6\* aG#|Q~|vk,&+7-՚Vd%_ y1舜И ywϷ 5.浘vm{l% hVF` H@rN?$v6Ǥr/e#a=MZ ĸiHȾrW:SD^7$?e: wY1OS6ݜmqKߥ:k"%!G`)xvKacEMʏ. \U|S4|nP7:YinHvL]x=!ݢY`っָ^Vw)Ashϧ[O|̍0b10^9Mz>r@d û)iOQb~>9'F#Y˒ ΢?DdĦĆ$Ň'Ņ:9U5笳 b%۸7?Z{>(jf%_1N)!iѰ{N KDd!u:I38(W Ӫ24ag.zp*%\ٰ`[_֭4t<̹_'bTFA.  |84}Hx/|X )e%W/Ƶ]εl-}2nȰ)u]!frMi @Q%Sq]Vm :|z'6abSnX /GpSr|Y ;rn 8EHN:PܣN >K"ѐ~_$Q4£")WYQMXa[Ÿ_iTCgyºqfRb fDIE ˋk/ 8z&&X]q?z3dnN#Bڗ}CVGLåV 6sTqQ#3N"pQAa|TαL@>tɡF2"?H .J Ǿ ('-eC` ,5| >PZ4~ȸn;2tEZ]x3vCi|crmK"ۺۼðɕo 0sX.iQa~&MRםU9ɴ<ځp3HNGҏy)849!?.h[2*Lsa/W4w/X@K@(sk|oY ŽʢEcf\Zx6 X)Gx_9{x S.u_UtT/-wu]q]M-ԹGk#s]w.(~KBVL+&,>$ >qꅣ' )>P iHR"/\:6q^w/ +Y#MG< Kb]BlF[Ͱ07ܷ1QY ]eJ ̶$mW^11&**^I\H;1)(-"yr;8ٕ3KާEߓeM1"3`|̑opht΂gF6|?W&\|PvjWYp6P0./墬_ԜwZ=Cw}wkWM{6.Yn.W=;] }לcfGCm]q=aHJqyN V?t-$Ef77.0JBv1 oks*2>h@Q'ţ֕퀔.0@by_¦<뼰c匮/ =$I]]2mHЕ*[ט֕,Q٤mQivyUGi敡8uknM:CZv1 ")?s~|Ӕ]|_,/Ghs1hpGi][V`4ag/_Lkٔ}:~r9wbT[7o9eμyeye%0n^쭚2h>3Z^[Do-U CW}b @i[P{A2-+;5*~,mAjѠ]Ux_Qj *m͡9[XM'ŽIv0S`¼!1b@Q@?8ߨ;A;D 'N~?0wxm"Ӫ%^o*Jl[mz,9ԄScksHP 6V>X[+=k2̴ 0 L K߃SM J +=Y6.NSo>} uKbZk ۺxs]--N8Ggs%ă徇K,zCMg5hdw@ҠamZgfʼ隳Ɯ+sƺEkgjw?P?2/o<;`@Ѻ[Me;g;Um.g-K | XD+̼$օvwi7sUK]l[wՕ _%8mI[]esƫ-ƞUu[{=żt%0Y g8~g3RXVVA(P itL: ӭ4W,iYfvJ6;ŰG`r E>+D%% 6TiO .4d-a[m$5ujM>7?{o:>L\teGq?x}Xfgo}3ն<^|mbn]!oejv3[hTM{yk>Y9ֵK/9aBfLjA^:̮b̝s EuNT#VKu]aCzQGBtV:YֲsVG_?4])\Z\ht5{6jk|{ZXlO\ok7R>Q6v Ը뗺j;:C+:Ǖzݹsxmn4[ oyyki[U=|:$\聏d Z3 S Q\Z8f XItʎAـ . Ei[ Y1/7cGe/) ڎز?cǾ%#`eDrO~%'ϼ2yi[۱Sack5~7D=R)V^¬=|t,$e?D2~T_6mq׭T-`e _bb&?kYUF Ep|ata0G\_ޞD ׎V*`t~%ѿ-:|[M>wB8#n?; dTOF& @6!8P³aYHrtH 0*[[9U:d ;g8h̴)7=)23WU_ЊNwIi!?Fd$0SS2S#[i"6Un H5iUJ,;wLluZo;t; ,iG^ҁbGߥ)f3/;:Sn1qiIflM]ڀ4h^5I!Q]*W@T{r?d/vya~VYvNM!pM/qzwL\[QHD_D!5QFe.Cmޣ}WWo۾x)2R<[^S %,\G֏X!5jɨ](8x%EmQ湢 L(SHБi,(d fa,LJB0GJGDnN&a4M!:.Q8ۼQ1dddps_S^{g#=$5 %KL$b'P,)b +a&^ܴMae% w?sˮg gnC`B 6!`Lj(1!CLEDY^ 1aN枊YxoM|T>,wn-lgX^-X||)7`L""-լm޶u|'_Y)}dHW龪"QR==|+ 0dWz?s K?ʢD:%dI\LN9wU&;${=r ?0% (&$8y?pj:fϧȢ)qY;qjҒxT)1?Q\w 3mNq`iѳb=|J9`)(Euxw4N}FoWk Eȩ+(NVbk6~tQ-s6nY?lznSQF2n>v,'B@&~[BgS~ZZr#?ѐ/\.RXSY 4ǐhҳ6ٿ6@S}EvjFhpSQ[ R'` ^w\4絮1tVXJ}{tNYW ̢b|2mxYaWy[w2bMhq\$ Є%>b<@TL,[}?OVGFd ,MF"qCzZ->*p~;7P }Uy'eo}DJ{n_wX&^`ppݘm.zx-ORDKţj ab{5m|@sͻzo>Yq <r`{֓'>2lp}qLp5d& d. @G8.+&؈,F54m)M@o-( falAHRS) ɥ'hw%Ygy&th#|0EsSIaʤ??Yg\O;˒ni` P^cs~W~/F|շeو4;뇞[+y$Rۮ塖ҋ] ç*r'鎈1p9Cݵn[G*\;['v=Q^ZӞT&viא&z_t,r&=}d>H20/>BbF^em0/tOYCc;g;.a%'Tdj@8qf_-ӸlQ;y~j^Lje8BskH|:鞵97aN+''d(Wv &L m>tqO[R2C}`V4(&)LO.$fHmku羪wD]@"u@w=d.d%h,J"ce>/kzj28K}W߀WI"j*3 !HK4Uۂ1S%%[֯{ .,^%X#UA͕#[?=6xʎSSю'-MHIoBJ(˝W;;>u5x[,v㌳a(\mpӖs&*)ɛ G9R37ٿK{#Ħ .)҈Q)_&/~꾭}ގ)8 /{f@76}''UG.rWl2&ťA" hAȁ1[]˂׬uEXߘ{L8z.`E2AVaa.DJChJ d vk0e^w]%NnJ 9#atzsG;wk9+ ρ;)o}:R=-Oo{U9i>;Ol֩QWCk- ',ªj3oD;nFE^vVZ]uԋ죾=F>~% :@G)~EZogޘ)0M*|XX\BG91>(DGgJg= @hbՋUwvZ=`Vo`bE¤T`%T(' ^>qnu;@fF@߽.h{.D8"R2@BzZIV"P. ;v@Q{^=7uUFNbYIh9K\!к喙G@cy2&AQ?1T#}:3O<(p޾dtd3 0I[0M{TY_CI!,s\/F d6wOg=uT]49ثoRg 3cLc{%AzHL\RHyp{, h440n kzJ}1I"B7irRbQ\E03ch17 #Q0aU1%GDŽYp^:i ~X^*f[2ZDEHw"J;;}햛=;v B _RӀg Q1ySu7 {BF{^骋(;҂_-crrd I+*,D6l<ц[+:+}psçJ`C8p/LF73^zH]>x;gMSwgK XyoqOgp"8@|2;V@^nmo4br1EA@x B"hx)5r?蹏ĂʍLjf׬ܕݏkB7eɀ >(W,9!{RGeޡ#gLb"l!iwSIcg\:.wఙjeC}4<ľDvK:B4bv+u튽MHp/YJZ 1 U,xtfT,Zߢ@g??|/M)bJP+;q;UucǑ:#UU&YS xA}Mվfs}3WA5w ~kIQTFGg|*d9mf'*igᚲ(\3Ȭ#@]%:ۂWyUb[3!ݐ,`Շ?쭼|b[Lֱg;.4KRKrŹ\#r ӧϵ[|*Ws UՔ˕Rp%@ e:\b hs__aX_g 5A$`ѱ1|PH iJ=S!R^z@L!wF{l>>g^1HO*&p`an" e-Ʊ`;s ~MIѹuB-߽IO61$/侠} L_3ns?2աQCd=k۹''&!`mS&C+ybOݖ歵n@2@Q bkխ o*:)hph~53.b*(5zKPt乮 un5wiVYw;ߵ}\(΀m ,'cuXN7M{- s @_. Ӏ(4q>%e2gSK]@XV1U=Т,4 ߌ= N Q4'DȘ莑hĩ}#[ОsˏۅUŁ&J\pI@m_v:)kG_ `B9ͧ~I߂dW㜏" e9! N#:{T:!h}sϼ xLb2>q[:<'EzU9)K N=cG>Bx2>)4(1dxg, Dyׂg.شŨ_$GŘfzP_qBYdV庣v=FF[R_LPL  qE8=zԁ+S1]_q {k^~]hP`VxmU,N*vf #!T J_-y:hWF oz]ȓ ߵfCQQƕR+9Ouq&Vc.1;ˎ7* PE氇߸j+M6@aEeb.|vyfXtoɚ ۥ䛅 &'3 `%Z/x۞2$YQkh5:V37ٯTSY_m9 +, *7@;6,NF3X1%-tGRR a! 鉛X?-< Mj\a{$?*2s7/g%A&Ƨ̵:o07퐪s_F 6 ՛7V 93]4f [|wYp6_(ib\UנqtĤDI\Ud 𶸲HpOt[ZGx}iNaloعgi Bǫ/ukwҳcȿo\C)}%g]"?3 i[lL` آNj=`X.ߋ+?D96wt8kr8O]2{h2?**y9l2,!x&הɷh=1"'(H΄A^J(+m9 3coq~o6W =sjo[^cѳ{GN;4yrϮ[+J_S&e%e%*)zr)\$٫rLD(V*8q~`&:L]eقÀ!~U`o\ ~N !gzNG-'' 敁9[tVG~b<@eh#CV1cnx-XZ[Y}8Bk՝&X", bӒK6щ~Y?m]!SMQGu o9sj>zc8f?~I(=8Z,OPޮo2 $-KEK8"Z8n{o`a3hfҳ[&{V`+gƀj^vF:"Πm֡[ĪfSΚ3hͻcv&n͎f`s]tVy*CFYsOB*,&BdId_5a0i+e*v%־1bbE#Vh"ϧ|GL U $X7NyC+DM1%G GBؐݾV{JלĊ^&2N%m,zr_ 8y^npp >9ܟg˗0C=kS`G|Ҳ68G:eqk MAaZ:[rk'mʑRM`լ4,y TL7{[ blrzrݛ`<XAK\lȨܽ.", ^jQ 8c#t+vEd0hX`HI-)-Dva`;Pڕ׮\+orb."HUr_ϼx4V !Mg2Ol RrO9=VpHMZ@s> w6rY!ձEgfzZVMKf$-h 5lO\ĹdS玙+=p4/F1  C$تKH #iAi,0ydoCDC+HE +"b5  xHj]{SIhv0uOx伦Y$f_wϿ~:Oѓ.L< ]lC_s:WynҪZp*T@U:в5aJuG7ǻT]t}jX눏6-EcG-D婦=«ڬ븥G.!ow|~`weзOq>BYxXC>(A"T>zACkhX wgf J}ZLmB4!DblCa0hFlr g UU{y8-=7g|Id! gѵpsmmd+~vfW3,/坃^]@;3o/dTm鞒.Tw1XVH#3+fޡOK#6]8sMQz1@Т"E'qH'  &EED]Q.-hp 㮜2lAX@El|n3X3!78L5%`<ނ |;P>we·ȹ-sL윟}K(l8@l |y0:ȧM@$pE ǹ)'7Yn[kfiaG0PV'DzNRyu!Y4^lW-ZcF>e;kI}h/PG[£sx< ;%:ž^ߪl.ͦZ>u(#Tֈ+ʹFx,pU+mjݙlN1A#Y ?Pe-}CAVqWHG#J?Yϵ;eϾ\x81nI_=:t(BB2r[@~&Xy <*(M>^qh,󙧞90)=w4#Ho-"Ir٥ MQ%ׇ 2Zh+ 0RТ\pV\ݥdUA_-KEU'"**<9QV.E pS /N:v^\xu.b!sWD]b])Sۇ.}VY@c''hKG7mKf.чG]2u5~fP M܁fhtʢXp}Vx'wL)Ni-3RۯbP&EpRV-m8$! L/!Ɍog'ãW‹>t8Vzk$ # |VsKL{~mI:JCW$~F t:ҡ>ɳe4wfDM;藜sv̈́Y9)i~;d'CIsP,.DOySO?%Kt <oM4 %HUNik!x@+BʹœIPg\; sqk _%nm '~ͥx=<-V$ȸz'8 s29 ZhiLyY;ի3JVT2Qiwʧe!v@$h&zeXEЩ[jZs4gU 6s0%wĬ뫟4W!rUkE pǂ]О\fڝӴ_n]S٨|%dXߗ;2"&w$v3ufסiѢGhi/~Č nP=8td4wJK>VĪÄ3@sմ:lZ51"kbƸE&fu3nYWw~-!?[3ЁI>'fڷ:M8ܥ/gѮr,-Ŝ$ӊ9ƙ;o%nZٯ\f{{TPGvkqYγӈ;&ɨQ`QʐncK>@Sճv XcW+z?R;[=kQ)3l\S``ZUOpfI;H"tе.B\tK}qb>+Gl?n9cGxd\@l4 ǎ*&Ůh3 Aň_N Bb<,wvYI\46Įl{[U?[q62Y2,gN3% tKf٩)fQv j(MK=:޸"n݊!B4 L{Gue4,uTu뗜HS8&9XP"j]m/cT!!BƽNمH& )r&6ϾεrѨ8߄rL:҉%}ҷS 0Ϧnm3]+ !~ҏ/;Q޿0N^,*{mx#%rW=S2k 4&ab^r6Du>{qWGhsngY v-6?w*$AOc @l] PD܇nz'tykBı&q֎(j6(;/>ڵ4ڜZgQ= <[vBo=s/qY2P6 d,iXj/e\N;`o`'8t;{U7M- 'δmmj t ew<<&@zdA`Zq7c[l.$74bLt f30M}!x|^Y56ݔ \!(wK]|SMe3s6eԅݵˮIjҭM+)?V+jӡzOLl,ƐOMv=QR3< @M6s@zr)k <%"*&K|pL Fɜ 9Qsܻ{RK׿/SmTV00&]0fUt.1&!J5,nkEI*51E a[#cqa\e,% v;-~~[9_UOKu $P_-p'qmA ( yw$z7XT@gD e&Xmw\;10xL},5~o?:1ܔ5U2aT*[T:v{Qk4V1nUN۴ >R-RCvɳf=Ӎ~LfS=Y2WuVOTEfXop`_$̱ s +~Yp'ߩ~;~IENDB`ucblogo-6.1/logologo.ico0000664000175000017500000022207613557147341013452 0ustar jjcjjc($(  & ! < %!  2 %" L.$1#222E/$*71/"1+3$0)O*4'W 3J#<+!C#7C"<; 9UAQ-RM5CMAPHNnP/CKX9M\E(`);]/|B=fmT~;Uk|UhJl;qwSzS+oXtjLk6?9;37EBB7@8ABBAA@7?93=>3@7@ժ~תשתݛjjl~zøĽĽĸĶĽĽĸøĽĽýĽĸĬĽĬĽĽĽĽĬĽĽĽwC8>96X_wǿ͑t_X83>;6=37eޮ֯ڭؒýýĽýĽĽĽĽýĽýĽĽýĽøýĽĸĽýĽĽĽĽĽĽĽǿwC8BB8uͿϾsI@;6;;33e֯ڪ讪֩֒߮ةøĸĽĸĶĸĶĸĸøýĸøĽĸĽýĸǿ];3;<>3@e֩گ֭k֒øĸýĽĽĽĽýĽĽĽýýýĽĽĽýĽĽýýýĽĽĸĸĽĽĸĸĽĽĽ89?6BľöǬϤ]7E377E37~޲ׯ֩kRiؒøøĸĸĸĶĸøìĸĸĽýĽĽĽĽĸýĽĽĽľxA;938ûĸϸ϶I877B8<77eً~ДܮþýĽĽýĽĽĽĽýĽĽĽĽĽĽĽĽýĽýĽĽĽĽĽĽĽĽĽĽýϸzC;?@EϬûǬÑP6;=<<><7@~֯Ѫ٪øĽĽĽĸĶĽĽĸøýĽøĽýĸĽĽĸĽĽĽýĽĸđC<;3@Ĭåÿ_@9;63><<7=ЮשծѯϽýĽýĽĽĽĽĽýĽýĽýýĽøĽýĸĽôĽøýĸĽøĸĸýĽþĸ×_3;96týĽx<<7373<<3373׭ЮЕlѕýøĸĶĸĶĸĸøĸøĸýĸϿþþýϸ÷I@3?]úķ϶s]877><<=L>Z֯֩Ѫ~kѕĽĽýĽĽĽĽĽýĽĽĽýýýĽĽĽøýýĽĽĽìĽĽĽĽĽĽýý½z]@?8wӶ†w]A<3993<><>><<7E=eׯ֭~k~྾ϬĸĶĸøýĽĽӶöýýþýþþýýĽĬǽĸĽëtCIǵ]@6;;L><@<3<<<<<77<763?Zުe@7337@ZZe㾾ĽĽĸĶĸĶĸĸøøĽĽĸĽXC87BB8>3>>>>>>6====6;3>33>33>6>>3>3=>;þǤx_C8<6>EEB<@@7A[zÿx8;;@C?;3Z֨ުjZ777>;;;?;6?63^~öĸĽĽĽĽĽĽýĽĽĽýýýĽĽĽøĶĽĸĽĽý_B78<;36;>B;;;;6>><8@7;6;<>rϥs8DAB>69EBBA77;<3=3Zt϶ǵ[B;9B88BD<<7=7?3ZG Vگٞ=6>><7@@3S;>><8;87SfͶĽĸĶĸøĽĽĽøøs<>E;;><<<<><>>=7<>>=;?B8B88BB8E><<373<]ǺYX><8=9=r_@67B;63Ctþø_7?6<7<76L><8Zz} MْE666L78ee=3E;<8<6döĽýýĽĽĽĽýĽĽĽĽøýĸwP@@=3;<>>3><<<>378DD8C<>>3>>7373>7<73=8ǾrA39;=96_ϻtC8B;6;<@^ͺX>?336963A_z| i֩e=7=33E<<<<<<3<63P_İͤzC883<>66=txCE?9>>?P¤x8<>;>>66_ӾǿsB>><<6@s g譩׮֌S3<>;>>7ڪZ7>E<<>7C]ĽĽĽìĽýĽĽĽĽĽýĽýĽýýĽøĸýĽýö_67><<<<><<@sûI86?;>6P]B>6>8<7]Ĵôõ]@>388B>7]đI8>LBD]öĽh Vړ~lZ3<<3>L>S׭Z>77<>>8C]ǽĸĶĸĶĸĸøýýĽĽӸ@><>>>><>BCtͷǑqA3;;;BB<368tĻxC38B>Cͻ} Vڒ7;>BE>>7Z߃i==<=;>BB8qĸĸýĽĽĽýĽĽĽýýýĽĽĽøĸýôӻX><<7<<<<8Xz͵ĬϺtC7;=<33B<>_þǫ_B>>D83;6PtͻǾxX@;93ArxÇh g֓֩e3<<<<73<<33IxͿýøĸĶĸøýýĽĽøǥx7><><<<>>8tθϻwA=7;9993IϸûΉ^9B87;=>7@=8P_g֭~~e<3=B3<37eׄf?333;>>93IϺĽýĽĽĽĽýĽĽĽĽýĽýýľD6;38<==79Pýt@B@DX<<6>;@8>8?]ôĶsC8<>99=3>>>7<=fуkЮ=>>3B3<7BflZ3<><<=79DĬĽϬ]?6>zD><><<7>B]Ľq3>>;7@E73IǿđXA<<=3B<3Zl=<<><<<7<7>7]ýĽýĽĽĽĽýĽýĽĽýĽĽĽĽĽĸýq8;3E733]ýϘB7=><7>;3Cĸķ]3<><8IzID363<83L~@7<77<3<77ٯ~l=<<7EE=>3CĥǽĸĸĶĸĸøĽĸĽĸA3=8<>6>;EIýĬľçðI9?>3<<;7CİP<><<6>>;Awÿ_@;>>=CtI86;8BB77骪@><>>;>AwǿýĽýĽĽĽýĽĽĽýýýĽĽĽýĽĽĽĽĽI36<><6BB=Ct@;6BB<377Z8B<<>>3E8֯~O~Z=<<<33>;=_ǺĬĽýĸĶĸøýĽýĬĸĸĸq7677>6<<3DøĽýÿxA@<3;77<7PĽxB>7<;8>;8]ÑC@968B;@϶I79=A6><3f<<<<7=>>7Zک{Z~3<<<7>3>>]ĸýĬýĽĽĽĽýĽĽĽĽøýýĽĽýĸω8=77>3>8Ŀ¿B>8>6A667PsA<6>839@ӷ[8>>7;>>>7گמ=77776>37@ީd~3<<<3<8>9PĽĽøĸĶĽĽĸøĸýøøĽϫ@><>6;<<6?Iĸ¬϶<>769<77>>87@=;A>>BPu8>3>B@97¾a83>3>><<3Ш=>><>>><<@٨6>>77<8<6IϽýìĽĽĽĽĽýĽýĽýýĽĽĽĽýĽĽĸ]3<<6@;<87>ĸ¿Ϭw@33>>33E7YϷ·ϷD?3B8@7>@UϵX;;873=>8sºJC<<73=>B_ĸĶĸĸøýýøĽĽĸs87@>;3<8ϬD6>B87;;8qͺ_3;3<<>>7_Ͼh0@>8>>=73eS333<7<<3EځZ<3<7B;;BqøĽĽĽĽýĽĽĽýýýĽĽĽøýýAB<><><8B3_ĽĽӾs3<8@>>>39qīӴD;<?BE3;3IӸa<>7><=E6e@<<<37<77678<=CĽøĽĽǸçP@7<7<>69C϶I8xh<3<<>E>=ee<<<<3<3=E譛@3EB<7>3XǽĽĸĸĽýĽĽĽĽýĽĽĽĽĸýýĽĽĿq83B<>7B<38ǸĽĸĽX39E37>;AqĸÅ83E38;98sĸϧ]8>BB<;>8_h @>;E===Z^6Z٭E33E>>3>><<3BBsĽĸĽĸĶĽĽĸøýĬĽĸĽĽĬzD37>;7<>=<_ýĬĽwP6388>@BAwýëw8;<6<;>]ĽxIBB8<;;>Cwú` @?=>>3=fS33=eZ33B<<7>=ޙ733<>@@]ǥĽýĽĽĽýĽýĽĽýĽĸýýĽĽĽZ78>>8<>>;C͊_A>>3<>3CϾx]?97=>7IzĿLJsI>37<=;BPN"=>>>E==f73BE7><@PxĿǸýĸĸĶĸĸøĽĽýĸͽP=@>6>?CĽĽøý¬đP9;<<3E;0[]A99E8;Dqu>@8B;6<>=>3=7EEBBS驩L=3<<;E77jZ@3<;33@@eĿ½Ľ϶ëw]83;><88BB<<778BE>><<3>>7;>>96CIĸĸĸĶĸøýĽøĽĽC><<>3;<7@PľľǽĽĽëSBB7>>>><78DACPXøôĽtP@<<<;;6>>38Df37>7@S֩֨Z@@87<<33E6=>3^wϸĽĸìĽýĽĽĽĽýĽĽĽĽĸýĸĽĸ]B>73<>B<8AøĽĽĽǸą[X@>??6P_wøĽǫzs]AADDD04j{S=8Zꭩ訞S38788=ejĬĽĸĽĽĽĸøýĽĽĽøĬĽĸĽýtA33><<>>CĸøĽĽ¬ĽĿJ Uj^ߪknĸĽøĽĽĽĽýĽĽĽýýýĽĽĽýĽĽĽĸýǿ_938ĽĽĽĽýôc nޯqXڪýĸĸĶĸøýĽøĽýø÷´w9>33B83;9BaĽĽĬĸ¶϶ķúǸýĽǧǽӽJ bڭ޲ׯ٭϶ýøĽĸĸýĽĽĽĽýĽĽĽĽĽĽĸøĽøìC<<<<<><39Xͻý¬ĸ϶ĽĽJ b֯ծޙЦϸĸϾǽϽĽĽĸøýĽýĸϵ_<><<><<>9CøúþĽĽĽ϶JڀnúðĽĿϿýĽýĽĽýĽĽĸýýĽĽĽĽt<3<>3<<<>Ct¬¬ĸǰts_P8EE><]tĴĸĽýN.S8777@eگ׭iހgþĬ·ǽĸĶĸĸøýýĬĬýĽĸ´<<<<<<<>BA]ľǽøǧx]8=L8>;;;L3@8@A_wĽĽìĽN0@9@=@7E7>>7==SZ?338768IIB7887788BBBB78DD]qwǽĽĽýĽĽĽýýýĽĽĽĽýĽĽϷ<<<><<>3B8CϻľìÇwP<;==E>;6=?9;@]tĽýG0DB<==7E>;>>;>>;=>;==7=76LBCC]wöϸĸĶĸøýĽĽĽĽþĺ><><>><<;9wϻĽĸĽľw88L<@EE>B<>766BBB<7BBBB6=BB87666>>>=E8EtýĽĽĽĽýĽĽĽĽýýĽwI<<><<<<<6?>8_tͤľīE767E<<7DDItzt]AB7@@X;ĽýĽĸësA7>;7876@Zj~e@77=fe=E@@7;997>>;6L?;8XwĽĽĸøĽĽøøĽĽĽøĬθIA<9<<77<77<<36338DCGǑ[ABB>>7ADC_s3997_ĽXP7L;>78<>;;xķrI@BBBD8A@9>]xĺĽýĽýĽýýĽĽĽĸý43;;6;3>>3>>3;>>>>>3?sǻӧPA>>8@@;;@zͽìx]3Z;PĽǶX77<777>7@뭲~klڮZBBL3ECĬX>9=@E>E<7E=sĸĶĸĸøýĽýýĸq39;B8BB<<<<<88B<8B88_ӶĬǿC8>EEA=><^¬ëX3>AxǴĽĽz@7E77EE<7ZѪS@E>7<@߮گe=<77=>B7=LCǬtP;6@>ED7B<3]ĽýĽĽĽýýýĽĽĽĸìĽýĿtXCC;>>;;>>>>>>>;>>3IYǬǸǾs8E>=87=EAqB>E>EA?EB68tĸĶĸøĽýĽýĸĽİĬĬ_>;@;LBEBCǾqA>B]ϸϸxD977>7EE<7ٲ0@ES>>Csϸ]<;6BD6B8E;@6EE>8CÿI;>DĽĽ]E;8XtA;?ED;78L;7>=>>ECì͵øt8>8tĸĽAL6==BEE7=eڨ63E8^훁ڮЃiX8><=>B=L=PĽúC6>8B>=>7;=IýýĽýĽĽýĽøøýĽĽµĶD3@<>=7>>AsĽĬX>>PĽĸx7687SBD7<87>3Aû_EE=6B>=@E9CwøĸĿq8>A7EE7E7=٨@6<@ܛԯղs8;B==B7>>BzǥqE>7>B<>@7EE<<<<7<»ǺĽĽη8;B^ǸǸ^8E677<7Ľĸ;P>8XİP8B;7EB<<7=S88Z첲~Y9E7E7<<<7EPzǽĽýĽýĽýýĽĽĽĽýͿ]7<<<<77E7C°C>LI¸P8L>7E77777Sڭ~ܓрǿXEE<<<<<E7<_;öýýw8<>tͺþϾe8B6<7EB<uϴΉX7=7DE=@XĽĸøýĽĽĽýĽĽĽĽýĽýøE_XAA=>PxX3996B>EPӾĽĽýĽĽĽĽĶĽĽϸzB778B;67<6<<6ADE?S>;BD8E6CtǶôĬĽĽĸøĽýĽĽýĸĽøĽýĽøĽýýĸ͎8>EA=6;DEE8E>7879=@@;>7qwýýĽýĽĽýĽøĽĽĽĸĽýħ@E><>>>B<<_ĸz8<>__B9E<<ABE67>B@_wľýĸĶĸĸøýýýýĽĽĽĽĽþX7;>7><8E7IýĸĸǥCBBIsB;<8ǴǸąI?<<<L73uýĽǥǶw87=7_ûĎ_Z3BE=8>PǺľ@<><7E<<<78f֓jg)Uݛԫ϶Ӱ^EA7?E>=;<]ǶsAB>=@8666BtǬĽĽĸøĽĽĽĽĽĸĸìĬĽĽþìӺqL>@S7>==9AýøǸͽ½?8;CǽPE8E>>7S<D<9B==;;C϶_87DD<>>8CItĽýĽýĽýýĽøĽĸĽýýĸĽχA9;@B>B@<<8qǾD@?>8A7;=E3e&[@77ҽ¥C997@E9>DBj¿Ǹ]>>6=7;E7E?BA8Xӿq8<>=>8BE>B_øýĽĽĽýýýĽĽĽýĽĽĸĸøĸĸýĸϰq<>B@>BB7BCϸĽøīAS<@ĽIB;;LE7E7>3eԕ朚ܨ7EB@ڜľϧq=;=776B@<]øøĸøýýĽýýýýýøĽĽøýýýĽýĽĽĉA>7@7=<3wýĊIE;;BB7EBB7e8B<@צĶϽwC>>B>>78BDxôP@<67B;B>E77BE_ûqA>;>EE>;>AtĽĽĸøýýýĽýĽ_A==E>E<7eڜĿú_B>7>D77<E>=7B>@tϬĽýĽøP;@7;8ĿtCE;=B8=3;BtýĸĶĸĸøýýýĽĽĽýĽĽýĽĽĽĸĸĸĽĽýØA;E>L3BB6;týĸ÷];AEIÿý=7@777E=8B8W8E<<@;B8>=?;@tý¸ýĽĽĽýýýĽĽĽøĽĸĽýĽĽĽĸĽĽĸIB@BDA8DI.^@BBB<<7>>>LD8BB88L<쮜ĶζA3S8S8EB88<_@8BL;=693]þĸøĽĽýĽýĽĽĽľ79?<>669;>@_ǻxC;9?=7]}*=37<SZ=3Be֔ӴwSB8;>;>;;;E¶<<=6=@8D>AtĽĽýĽĽĽĽĽýĽĽĽåwI7;EB>@@=><@Xq´_CDB<7EB3==<>>>=B8A_ĽĽĸøýĽĽýĽýĬĽĸĸøøøøDDDB<>EE<=?6>L;69;=C]ĿYI8>>=><>E7>E7@AADDBE;D7<;6;>EIϸĽýĽýĽýýĽøĸĸøĽĸĽýøýĽ^BE8B8@BBB8AABB<86?>8û½w@9>0sӾ(1eZ7=77EEEBES=Zݯ^@C϶C;LL@B8B8B8888E7<773<77=>B<>E78>=D8>>Cw@9;=><7E999;_()֚рde?3==>=>;<>E;=ZgϸP3;66L;=;=;;>;=6;;>>@@78[ärI@8E73>37>77=B>BBIIqwľĶĸøýýĽĽýĽĬĬĽýýĽýĽϬǿӵǸðýĸ¿(ٛ{{~~+5ǶϻĬϽϷǧϽĽýĽĽĽĽýĸĸĸøĽĽĸĽĽĽĽö(b~~lة֋k~ꚕ߯ڭĽĸĶĽĽĸøýĽýĽýĽĽĽýýøĽĸĽĽýýûJM͸ýĽĽĽĽýĽýĽĽýĽĽĸĽĽĽĽĽĽýĽĽĽĽĽĽĽýö|(ܲĽìĸĶĸĸøĽýĽýĽĽĽĽýĽĬĽĽĽĽýììĽýøýĬKՀkԚړii񮕚϶ǽĽýýýĽĽýĽĽĽýýýĽĽĽĸĸĽĽĽĽĽýĸĸýýö( )嚚ݲiܙړޘӽĶĸĶĸøýýĽýýýýĽýĽýĽĸøĽøĸĸìĽĽĸĸýχ(1߉教llٛgKljûĬĽĽĽĽĽĽĽýĽĽĽĽýĽĽĽĽĽýĸĽĸýĽĸýýĽý( )iԀllVUVVjlޔsĸĶĽĽĸøýĽĽýĽýĽýĽìĽýĽĽĽĸĽĽĽĽӬ( 1ЃliܠjٛͻĶĽýýĽĽĽĽĽýĽýĽýýĽýĽĽĽĽýĸýĽĽĸĸĸĸĸӥ( a!&.!!in1l¸ľĸĶĸĸøýĽýĽýĸýøýýýĽĽøýĽĽĽ MݙgUMVl¸ĽĽýýĽýýĽĽĽýýýĽĽĽøĸĸýĽĸøĽýĸøìĸĽĽĽýĽĽĽӥ( MggM )g½ĽĸĸĶĸøĽýĽýĽýĽýĽýĸĽĬýĬĽýĽýĽýö MԒݲgԚnK mi VľýýĽĽĽýĽĽĽĽýĽĽĽĽýĽĽøĽĸĽýĽĸĽøĸĽĽĸĽ} MԚbњgKmiiԚӾĸĸĽĸĶĽĽĸøĽýĽýĽýĽýĽĽĽĽøĬĽĽýýĽĸúMѲgԚ [nԚశýĽýĽĽĽĽĽýĽýĽĽýĽøĽýýøýýøøĽĽĽĽϷχnݪilgbgUmU lњĽĸĸĶĸĶĸĸøýýýýýýýĽøýĽĽĽýĽĬøĽĬĽĽĽĸĽĺnݲK:mUgԚ䶽ĽĽĽĽĽýĽýĽĽĽýýýĽĽĽýĽĽĽĽýýĽĽýĽĽĽH&ĿĿ| K))Ki㾥ĸĽĸĶĸøýĽĽĽĽĽýĽĽýýýĽĽĽýHaľöĸϸg1 **U侽ĽĽýĽĽýĽĽĽĽýĽĽĽĽøĽĽýĽĽøĸĽĽĽĽýýhHϽåӸ}K) *):ӸĽĽĸøĽĽĽĽĽýýĽĸýýĸøĽĸ% &%ýM)!))ϾýĽĽýýĽĽĽýĽýĽýýĽøýĽĸĽýĽĸĽĽH .[%ýǽhM)  ) K嘧ÿìĽĸøĸĶĸĶĸĸøĽýĽýĽýĽýĽýĸĽĽĽýýľh tt'ϽvvĿӥ(K)Բ "'圧ĽýĽĽĽĽĽýĽĽĽýýýĽĽĽøĸĽýýĽĽýĽþ% x[ĽþF$Hþӥ( g)!'ԘͶĸĸĶĸøýýýýýĽýýĽĽĽĽĽøĽĽĽýýĸýøþøz $Y'ûa  Hӥ( a1sݲĽĽĽĽĽýĽĽĽĽýĽĽĽĽøĽĽĽĽĸĽøøøýĽýÿϵpqUӻӧa$ -yyT % K:g! )ԲޘĽĽĽĸøýýýýýĽĸĽĽĽĬý% Fɏt.'h%  Tyy$N  wV: !)ژĽĽýĽĽĽýýĽýýĽýĽĽýĽøĽĽĽĽýýĽĽĽýýh -ɍt[z% Tyy,$v  wV:!ծKͻìĸĶĸĸøýýĽýĽýĽýĽĽĽĽýýýýìĽýĽϸrYH% ,yyH n))ݙ )ľĽĽýýýĽýýĽĽĽĽýĽĽĽýýýĽĽĽøìýĶĽĸýĽýh &tY   ,Tyyy-$ wK!') 'ޘľĽĶĸĶĸøĽĽĽĽĽýĽýøĽĽĽĽýĸĽý(  :G TyyT N$n)ggg)'KM益ĬýýĽĽĽĽĽĽýĽĽĽĽøýĽĽĽĽýý(  .s$ Ty HG ggVԚKߛĽĸĸĶĽĽĸøýýýýýýýýýýýĽýĽĽĽĽĽĽøN[ yT x n֩Юց:ڪĸĽýýýĽýĽĽĽĽýĽýĽýĽýýĽĸøĽĽýĽĽöǧ%![ ypGHلѕЯ֯ĶĽĸĶĸĸøýĽĽĽĽĽýýĽĽĽýìĸøýýĸ%"&TyyFH;ýĽýĸĽýĽĽĽýýýĽĽĽĸĸĸĸĸĸýĽýĬh !)FyyyT-F a'ޔ宯֮וޔ~gĸĽýĶĸøýĽĽĽĽĽýĽĽĽĽýĽĬýøǬN 4^\: TyyyyyTF-$%a12\2lWlkOk\\l~l\l~lVVl\lVlV1OVĽýýýýĽĽýĽĽĽĽøĸĸĸĸĸĽýĸĽĸýĽöN !\R^RW\*$yyyyTF$ HH*j~bВk~lЕ֨~~bЀV{Vg侸ĸĸĸĸĶĽĽĸøĽĽýĽýĽýĽýĽýĽĽýýĸĸýĬýĽa:\^RRRWW! TyyyTTF-&͵%4jЩЩѪѪ؋{{d?O5nǾĽýĽĽĽĽýĽĽĽĽĽĽĽĽýĽýĽĽýĽĽĽĽĽĸz)Uk^R^/^W:* -yyyyTTF$F$-GN ?//\kR\k/5O55O5555555555+52222/2wǻĸĸĶĸĸøýýýýýýýýĸĸĽýĸą%*22\RR/^4U FyyyTT-F $T$m2OO{l~lll~Rll~k~kljd55OරĽĽĽĽýĽĽĽýýýĽĽĽĽĽĬa%""::WWWW:) FFFF$&% FpyF G}'\lVk~~~\ؒ~~bǸǽĸĸøýýýýýýĽýýĽĽøĽĸĽh *:1!):***! $ yyT$$nתВܯ޲ٯ϶ĽýýýýĽĽýýýĽýĽĽĽĽĸĸĸĸĸĸĸĸýĽĸĽĸć*Ui))! _. FpT-YF a)ݲڲlڛӶĸĶĶĽĽĽĸøýĽĽĽĽĽĽĽĽĽĽøĽøöǬHVjkkl:!V*!!*!uFFFF-$h%sڛ߮ڙlҫĽĽýýýĽĸĽĽĽýĽýĽýýĽýĽĸĸĽĽýĽĽøh4ijddl*!Д~i*:g1"&G$$$%v%sߛ~~ܓllͶ϶ĸĽĸĶĸĸøýĽĽĽĽĽĽĽĽýĽ%lkkk~i! *1\.^&Hzϥ(G~dO~kijԦǶĽĽĽĽĽýĽĽĽýýýĽĽĽĽĽH2kkddkW:: Wd4s!acKڒOVlb홙WWgǾĽĽĸĸøĽýĽýĽýĽýĽýĽýýĽĽĽĽýĸĽχ%!\lkkkklWiR{\ .:z()ݲVVܚnMԀ՚KUlVbV؋ҫǬǽýĽýĽĽýøĽĽýĽĽĽĽýĽĽĽĽýþHWjkddd~lV/!i{q!'þ½仾hKٕ֋~bbbU{bbn϶ĽĸĽĽĸøýýýýýýýĽĽýĽýĽýýĸϽz Vdkkddkl*4~\ V{1[ܠXĶϾhKlٓl\ԜbnϾýýýýĽĽĽýýýĽýĽĽýĽýĽĸýǬ%*jddddk:4!\!.".qqHĽþϻhKڮbg՚ĽĸĸĶĸĸøýýýýýýýĽýĽýNl~dddkkklU!~UV~1&["ýhnٲgMϦ㸾ýýĽýýýĽĽýĽĽýýýĽĽĽýĽĸĽĽ΅:~dddklV V~!*~~O PaͽìϬٕgm㫆ҩgĸĽĸĸĶĸøýĽýĽýĽýĽýĽýĽýĽĽýĽĸĽý%!llkdjll) 11jd1r"åg'Mg૜ޚýĽýĽýýĽĽĽĽĽĽýĽĽĽĽĽĸĽHskkjiU)2V!li41[^ hg'ҜnanĽĽĸøýýýýýýýĽĽýĽĽ%UsVV\WW"R^WU R~~dbHĶgaGMgଶýýýĽĽýĽýĽýýĽýN &:[KKK)WRRR4":~\U~/ [4$$szҴýýĸĸĸĸøýýýýýýýýýĽýĽĽĬH*K) !2\\RR\!~l1~O"jHĽN%ͿԴýýýýĽýýĽĽýĽĽýýýĽĽĽĽĸĽĸĽĸĽĸĽĸĽĸĽĸĽĶĽýĽχ  U\\ROO\4 i1kd4_!vNw仸԰ýĽĸĽĸĽĽĶĶĸøýĽĽĽĽĽĽĽĽýĽýĽĽh ii4 *:\\\5OR\2:l W~~R.WaĽϾŽxnmúఽĽĽĽĽýýýĽĽĽĽĽýýĽĽĽĽøĽĽĽĽĽĽĽĽĽh !iVWRRRROOR2l~~!2dUHzG$%ndutG)'nϽϧgøýĽĽĽĽøĽĽĸøýĽĽĽĽĽĽĽýýøĽh\V 4\RRR?RRR\2UVlk2._^0! %ӧa$H֨ܛ∉MMqøh%zýøĽĽĽýĽýĽýĽĽýĽøĽh \l\^RRRRRR\2*~!:{~dR" "&϶H ,pp $ܨܠzw澶úh%øøĽĸĶĸĸøĽýĽýĽýĽýĽýĽýĽýĽýĽĽýĸh Vl{{:4RRRRRR\R\){*!\dk\1.qt.( QQ xܞĻýĽýĽýĽĽĽĽýýýĽĽĽýýýĽĽĽøĶĽχ*V~k\ROR5ORR^* U{\R~kU ))%% -Q $ܝܝ఻ĸĶĸøĽýĽýĽýĽýĽýĽýĽýĽýĽĽĽĽN!U~{k* WRROO\R\R:V{{{{k2VlU![s -p, ܝĽýĽýĽýĽýĽýĽýýĽĽĽĽýĽýĽĽĽĽøĸýͅ *kdV 2RRRRRRRjU1{{{{{1Ki*"u Tyow弼ĸøýýýýýýýýýýĽĸö%!\~~l *R\R\R\\\)V~{{{\))s_,-Y𦝲ľýýýýýýýĽýýĽýĽýĽýýĽĸĽĸh:l~k1W^WWWW2# 12~\).* YT-sĽĸĶĸĸøĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýĽĽýý*\~:UWU4! 2\k~* *2U:  F$ĥĽĽĽĽĽĽĽĽĽĽĽĽĽĽýýĽĽĽĽýýýĽĽĽĸN 4b2 *U:. 1WX4!! 11: *U\\V4$T-s㽾ĽĽĸøýýĽýøýþą2k~i!""Kgl~jjUUK)2WR\R\\FpT$qͥĽýĽýĽĽĽĽøýþͬNV~~R!4lkddddd~d~kW4!4^RRRR^W0-TYY[[ҝ丽ĽĽĸøĽýýýýýýýýýýýýýýýýýĽýĽĽh 1k~~4!lkkkddddddkkkki)WRRRRRR\2$pTFFG.&[νýýýýýýýýýýýýýýĽĽĽĽĽýĽýĽĽýĽĽĶĽ'\~2Vk~O~O~O~O~Odkki12WRO/RRO\2pprQFGG&%%櫥ĽýĸĶĸĸøýĽýĽĽa Vll!kkddddd~d~d~dkdiW2RORROO\\2FYTrTTrTYFFFFG&HhͿĽýĽĽýĽĽýýýĽĽĽøĽą)l1:kdddddddOdOdOkkj4\RRROOO\R2 ..G&G[GGGG%%  aĴĸøýýýýýýýýýýýýýýýýýýĽýĽϽNUg\jkdddddOddddddk~j!\ORRO/RR\2 &&%  Tr$vw癦νýýýýýýýýýýýýýýýýýĽĽýĽĽĽĽĽÅ): *l\ddddddddkdkdlk4 1VRRRRRRR\2.""   -T hzܚҵľĽĽĽĸøýýýýýýýýýýýýýýýýýýýĽýĽĽĽľH!Wlkdddkddkddddd\\4 1\ORRRR^RW0"[ -TpɳYHaܦϻǿýýýýýýýýýýýýýýýýýĽĽýĽýĽýýĽìĸĽÇ(!Uildddd{dkkdlkVV[[) *W^R^4W44WWs"p ҫϸĸĸĸøýýĽýøĸĸh )UUUVk~kkjjjWWUU1UKU!4WX4^WWUU.Xj-a扦浻ĽĽýýĽýýýĽĽĽøĬh )KU:UUVVWWWUUU:UUKK!.""""":[*^0rpt&Hg;ĸĸøýýýýýýýýýýýýýýýýýýýýýĽĽýĽh''KVVV:KW:V::KKKVK)    4",pp[G&%zͶĸýýýýýýýýýýýýýýýýýĽýýýĽĽĽĽĸ()KKK1VKVKVKKKK FYTppY-  4WTɳƟprYY.."GĸĸĽĽĸøýĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýýĽĽýħH!:UUK:KKKK)YpɳɡppYTrpYY[F.. &aĶĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýýĽĽýĽýĽĽýĽĸĽøN)KKKK) rƹƳƳT FYF-   %Hǥ坝ÿĸĸøýýĽøǧa%rɳr- Kz϶ҦοǺýýýýĽĽĽøýͬH QƱo 'h϶cmýýøĸøĽýýýýýýýýýýýýýýýýýýýýýýýͫhahaz% -ƹɍ-`HþýýýýýýýýýýýýýýýýýýýýýĽĽĽĽøìììììììììììììììììììììĸĽþìͅpƼƳ- %Ǭý`'xqxøììììììììììììììììììĸĸĽĽĸøýĽĽøĽĽĽĸN -ƹƼƹƹƱ-(Ľϸ|cmýýýĽĽĸýýĽýýĽýĽýþhʼƹƳƳƹƐ$%ìå件ýýýĸĸøýĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýĽýH,űƹƂƹɏ%öýýýýýĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýýýýýĽĽĽĽĽýzɱȼƹȱ,,-,oƹƍ Hĸė&aǽìĸøĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýýĽĽH-ɳȼƼƂ,,oƹHöϴJ`ýĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýýĽĽĽĽĽĽĽh ŹżoQ,QƳoþccccĸĽĽĸøýýĽøH YƹŹżƼƳɐoƹơ H|((`ýýĽýĽĽýĽøĽĽĽ% rƼŹżƳɳɳƹƳrĸϸvNNĸĸøĽýýýýýýýýýýýýýýýýýýýýýýýýĽĽÅ%rżżƼŹŹƹƹƹ hĽøhNýýýýýýýýýýýýýýýýýýýýýýýĽĽýýýĽĽĽĸýĸrŹƼŹʹƹƳT %}(''϶ĸøĸøýĽĽυ ŹŹƹżƹɍ Ǹ}håĽĽĽĽĽĸýĽhqŹżŹƹŹ- NϴhýĸĽĸøýýýýýýýýýýýýýýýýýýýýýýýýýĽýørŹŹżżƹŹr %åýýýýýýýýýýýýýýýýýýýýýýýĽýĽýĽýýĽìqżɐƼƹŹżŹƳ ĸĸĸøýĽĽÇ%YƐQ,,ƹŹƼƹƐ ĽĽĽýĽĽĽýøĽĽì% _ro,QżƹƐ$ ǽĸøýýýýýýýýýýýýýýýýýýýýýýýýýýýýøN .̟, oƼŹŹƟ zýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýĽĽĽĽhqtorŹƏ ĽĸøýýýýýýýýýýýýýýýýýýýýýýýýýýýĽýĸýĸtqƹ̍ǻĽýýýýýýýýýýýýýýýýýýýýýýýýýýýýĽøýĽĽýĽýýƳr%ĺĽĸĸøýĸ% stQ %úĽýĽĽĽøĽĸH .quuɐ. HĽĸøĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýN .rȕ$ hĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĸĽć [qrYǸĸýĽĸøýĽĸǧHtqʏ- HϽĽĬĽýýĽøøýĽ%Gqqu̟QoYǬϰĸĸøýýýýýýýýýýýýýýýýýýýýýýýýýýýýýĽh GGqo,,oɏ. %ýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýĽýĽĽĽøýH  [uQ Y̏r䶶ĸĸøýýĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýϸDž  [tu-Yr-%ĥϾýĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽøĽĽýϽa &suʟ۟[ ĽĸĽĸøýþą&suu۟tNǽĽĽýĽøĸh[squɏ̟̈̈s%ýĽĸĸøĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽþh(H% Gsquus&%ϽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽýa.suuttt[øĸøĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽøӵ% .[sqqttttts[G zϾýýĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĽĸh% &$ %aĽĽøøĸøýĽĸͅH %Gh䥺ĽĽýýĽøĸǬĸĸøĽýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýĽĽýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýĽĽĽøĿĽĸøýýĽøĶýϸøĸøýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýýĽĸøýľĽýĽĸøýĽϸĸøĸýýĸøýøĸøýĽĸøýøøýĽýϸýýucblogo-6.1/logo.icns0000664000175000017500000013712113557147341012747 0ustar jjcjjcicnsQics#His32cbcbcbaa]aabccbVVQbccb`B/?^cbccba^Z9;{`b ccbbc]aWDb ccbba^btZЁ^bccb^1}^bccb [UoH_`bbccb affacebbccb&hdbɞegabccbbedgd_ʝegbbccbbh`ee``bccadgfggc`abbccacdcddbզabcbcbbc\ٶcӪar JPV _Rr^tm s9Jxzlusz{zvy{u |MnO>5_ 4.7h V,YMQ`Q v2*󋶥iVLȄ7~5^cIuIMv)E딓IV[VTcPA.1ιȳf?r xws8mkICN#il32ٞcbccbca`cbccbRTTSbccbcOQfVTQcbccb`O\IIEDdbccb`FB>9.>Vabccbc<+#-W[cbccb WPO3*<0Debccb `Ksaf;!,u_bccb cWk]fxJ.‘\bccb dSWh]tIfњlabccb Xbdzl||︝ebccb YboBe/xýo_bccbaE=Vn_bccb aeB)\^]v`bccb c_G^Kqh(%y`bccbaaccb`pyAB^aabccbccbc^pֺЄ`cbbabccbagjfbgc^~fhgibabccbhiaafdbeffibabccbigacedl˟ݏfhgdabccba`did`fbdyѓebjgbccbabghcdiedfaeoǍÁfejfbccbahg_adgeba_ḃbgeabccbadid`adffdbdiѺ`b`bccbgib`bhfgheh\u~bccbagibchjbihegh–ncbccbbadihfhfhggchghǙbccbab fefgƶ_bccb `ffciͱ`bc bb`eӴdcsҐϏ ӿʖ `Flvu ZKm@=Mm N?HQ0j :BclI| RC{Rb޳ FQ7qb p+mmU rYdML sU#!t_:9Wfsh}pb|k|`[pe{N^NSqfPVŮVa{xTWo^^RXqwOkTXgcnbWZfj{SoonjrnKfqo~tv]hxx~O e{}vCPJJsPSXRiSUZS TSU[ g=9D:M{ c*>(/FG 6$+0:TV !!?C*Vo ?)N36Ҙ +3%F[sqv{ 9PAIlpm_ ;bSdnBB} ƖH!kP64mߚsz_$z2P&lw^`VMpcuu{BuuDgx`rsnI9xY:a|m,#KIl&0U=>9>^'p%@p=\lHOIk+-M{^cbccb dGcfUQNNEJdbccb cBbDCJD><@fbccb `?N@A>75/EW^bccb d;:60)+$.\A[cbccb daC),#'NdifbccbdN?E.%4%8C]bccbdJ7t<]4o-+]bccb_PZUG$+f`bccb dMoWSRd]K7(|_bccbaIcUˍX?a7üZ_bccbDFVm|w_vbr͐yr`bccbdLdkCv>ch\bccbcMlzkrmN^Ư]bccb cTLK[>%h>Wʽ®_bccbcU/_* ;fabccbd\,+(˾\bccbdV63&FG2*;babccb cebbcGRM;NkabccbaabbdFƽf`babccbadffgbbeggKɫsdhfgebabccbafkihacghgBqnghgfijfabccbfhhabagfda`oeif^hkfbccb`higbabhbdjppɸqglcchhcabccbcajkca`ch`ffꌩzhihiga_bccb`eihabbheaheygh`iiebccba`bfkfaacibbhf}ge^ibccbdiihdaeihc`jeb`fhڒ}ѱshedjie`bccbabiif`bcfijhhcbbcWuےpfihhd_bccbacihaab`ba__aadE̍_bab`bccbfih`bbabhfghacdh^ݦsaabccbhhfbbaahjddifahkU`ǐflf`bccbabijcabafihadigbjffbfײmg`bccbaciiba`hjje`fkfahh^Ӹ^gf`bccbadgihffgidjhegh`fhiHwqncabccbcffghhffbchfgbagiiaө^abccb`db`ba`gebfif˵^bccbabiedbf°^bccbagffhPؿabcdcdbabbLɺcbcdfng Fѯo {۠ mֽ qׯ }ֻ|v }كH>;lbkq0`eT/K+czpS=_ph9U3hx^QP=>;F@3.ٗeX?P<_=;mx^2:E[Q@~OK/}qP5Ǒ欲acMWFshI7E/({b_y8=.iQHi|yb89֜7_K{28;)3Mʴ{]c-2"*CĴs*9%4Qŵ vEE2EVŵz|HN]]obQkqEXZSHmurBrdF{qByFnQShkFS`]O}}EtuVPlUwLc~lF˰ȼImxLE}oqFmkGxDx deeIm{Mku`PIQP\Ddjs|Uj~qfkomxRTxƹEnqrmarinnwsDiKEQg@foHJ}YMDqGqLBHiLfHdpD‚Bni^pCkDbDXiTSwSjNtTrQaPGIr¯tkYGd`\ g{ʷoIMJN BFZMNTR JYVVW[J oPONXXYQ `VUW\ZZP vRXQG\YR H]XWZHJ8*JPF5?\):><&?AVEU%9=>#("-O=Jho|xp6NN=8JC`b\SNI?&GWbT5ADjKY?23&+E ]„'-'=Č '7&4CȌ 8=0=Du|~zvutpE>gtЙ}}tqr%U<$B_| 3IR# hT?P{9zXe3[Y$_z3K]3Nt4QY;ASp-KR %&&5\x)Z v$/D~y/Tf*"1;8M~6a@De60+W@!MF}1u&i#^j[ @BiCqN+$eAfv9-'+wS;0_uu.S2r}ni~~}}k` /A+A8}Zwu(qɽixk؃qt]fy|obqsquh8mk it32Redcdccdedcbbcbbcdcbaabaabcdbababddcbcddcbcddcbcddcbcddcbdbdbcbccabcddcb^^_^^]]^abcddcb_^^adccbcddcb akkf_bfhpke`bcddcb`ee`eZblK(&#,?_pdeec]bcddcbeb]]cdMD]`^ZW?%0qb``cbcddcbd^]b>)Mxz{zyvzr8q]^gabcddcbc\o< qvoknmsnjoqaQo^fbcddcb^dh Y~rmg^\+babft=vZecbcddcb`_o'!Dnlqg\XdN (cYU`eGcbcddcbgJoii^`VRYcf^SQJLc7gcbcddcb`e'Ilk]T[PLRJTVKSMJY^Tbcddcbc`_bpcdTSVLJQLNKGJIHKYEgbcddcbcd\jfa`TWdLIMLJEECCAAT 3g`bcddcbhNkaUZ;$SCEHFB@<<;;J)&ebcddcbc`j:&o\GEU:LD?EC?=6596>(fbaabcddcbh3.aRFCENVGB@@:501>:%C=bsQSaabcddcbh.+bICCA@FB7-4787-956; ^_`E_^`bcddcb`h7`=<<;=BF@996'(,J%hbE*babcddcbahTK65864,:E-B,#,=Zc`\65gabcddcb \behd/?+86/!6 8 *r[]eL7ecbcddcba`_gS K*37(&:4<; Koc[c`km\bcddcb cbageo$C*+.$("'(ha\]dRVi\abcddcb _loM/(/@7 !'=iaald^FɁ^bcddcb c`ch;**M-"#)0-M\a]Ԏ^[aebcddcb&e[ga#EdonhK ,3-/!0 ;010- 4dѲkWabcddcb&hQ(`rqojcfl2 ! .o!5'!/=C[ڭYa`bcddcb`eX mpe?&ge^f`90 :X`]bcddcb)dc\b* p92yk! )˰[\bcddcb ca`gO}9Bd.r!)*6Ƶz]`bcddcb d^`p2<|&8jv0++4.--;̺Y`bcddcbg[b^rxDv,Af )0Գ[ecbcddcbaj6&)-/#R^K-(2RU  !&Űp]cbcddcbcgV%glZ:"2rD2U1 1Ⱥ]bcddcb_gE`3A&S(X' P 1b`bcddcb_]C8GDGʱ*lP Tӽdzʾe_bdbcddcb3]Q}΋#m}'Z~)0 /Ws1jLvccDa_`bdbcddcb3hTD4gDZz-vK&^]ot3 7\``eOp^`bdbcddcb3f[N6&eE8˞#F2eZrݫ3ʥteǏ[`bdbcddcb4a`d$@R3[}&g[,ŨOLdafԤ(~ifכ[`bdbcddcb3dbH|~=`d ȷ$hcY&_bYeО>]xlͲVh^\bcddcb3d^t'A_+8 ' c>fbWd䞆Ϛɼgd__bcddcb2]kh&a>Oy 8p2`bd^]ɇܥZfabcddcb3a]_jA07}ʜ%2G Am[ca`ťϽÏ~Wfdbcddcb0h>+RAɜ(/*jg]NDۗҤȔڌ[b^abcddcb1afR3kÖ kO #m̝ͬiYcbcddcb cadkM dv{w_! g,T}oj_cbcddcblB Ym!_,ývid_abcddcb`Yp5C\'+T¹ŧt]abcddcbgedRX`ZYdbcddcb cb`hZ Z#@යdž^d`bcddcb`pY#$$,EgOadabcddcb[p?U/#H*D4\f4bd_bcddcb ^gR Z[#gjSD)<< ^ c <ߪ`d`bcddcb(g\q5$a#acdsP1p[>+kb_`(Xcd`bcddcb)ah]a_D*^g]]pe[p^c7, uslr0eib`bcddcb&`]eS`b^\^^d[Wm#63 ul<\_]bcddcb']cgefA;gZdggc^`el93 e hYvd_bcddcbabbgddbabq#6ְK i P xɁ\bcddcbcbk*=᰿]_ Pd~Yabcddcbdbaf/9\U P [}Yabcddcbdbai,4c#t Y{[abcddcbf!9ߚр|]b`bcddcbk-ϣߊ§uNbcddcbcn"X溺߷e_bcddcb _cabaca_adeb2^c_abc_^bbi.lԂ^^bca`__`a_acedbaabcddcb3ajgjioecbmef`]`]ahlkdbang&)ˎqVcdili gfijd`md`Z]`bcddcb4cjeigdgekgkef_fnipfbhomief*/ϼmjgedcqU\nioji jlighd\mm`[fbcddcb3gdkoknohom__f`Vfedkji`j[h&+ƴudifete\Vmbnfef ccihagond`q]gbcddcbC]pflfljfec__ZcZkjarbcbbYl+)ggkisbxhkʲWa]bneiikg\\cnhkjmig__bcddcb^fgligm^^b7`bbcbdfadaecn2IhekgpݸbgxXeh^hlehmedc_langmngb[bcddcb `dgckkhfn^b3_eojbeb`qZofgiilfWehebkiggjbhZbfnhlp_hdbcddcb `fmigigdhab4afgiacddgjdtgidݸ`Wdceminfc^`f^jfofmh^eebcddcb a__imgijka`b6a`aifbedcd_bqeki{g^Xb__vhqdmX\cidimheelZ^bcddcbFe`\`hijkkac`bbaaiX_lh_d`hamikhicp|婞aZhhgpoid\]]neigpdff^^bcddcbaejmmhgekb8a]hZecjla][cekiihp\g^jdhlikqcfjdjlhh`haddbcddcbGf]_kjmmkgdg]abba^e^lefg]_^clliie׾%Wbcde`_bfcba`_ea\bcddcb _f\lofemg_`bdcbc`acc`^bef`^\`b_aaclIΛ\becdbcddcb adh`lgghih_^babb^]^abba]XU\_^b aibZXeF``bedbcddcb ciejihbhda\b3e\]_hbcnpjdiob]bcbb`Xgkbj_P䛉ؽ_bdbebcddcb dadhhlihdb_\cb4`aa_bpllibdf`dggjVgdbaii_niciif~cbbИrfaluhgnbbebcddcbacbleihpcb7c[aZhefjffo_feqjfedadbedhgqciSIqimdbغwegiôojgcec]bcddcbafl`ijgfkb`e\aai0hbb`[jdilhaed[d^fmhikHAqjjxfifνfjdia_cbcddcbekdkmcfgab8`gZmidkmq`hiY\fihs_jcYhnfocf\HIlkibhigɵߢcgqia^abcddcb `bdhmlckbab*abaa`d^likkgba^_hclgaihj[^mmflf__ZVhkh߾ih{͵beihgZabcddcb aakhmjlb^abag_^`bgbgmfibjd\^dg'idcYcekhim]`selkeݒejld֫эdjel^\cbcddcbekldm`cb;h[abp_djkgfkgd^cjgjkocih\gfmge_fhldcquehji™|himkceabcddcb cbagmfklfb_cb:^a\shjhokifagb`bekikikaig^fkhh\oa`nbljffgsŰlhkn_gbcddcbK`d`ZcqfklqVadba`c\_gdffijhna`\`d_cqlihga_d[pdepgdiZsjedجgkjgch[bcddcbKj^Tjhiij_lccea`acocgldilmhl`Zfidghffqda]d\cnkfdhrUՁfhgtknhbba]bcddcb_c]giBeki\\_fdebjqm`ecnkhakie]ciagcg_`habh`oQUdUýǢhgk{ׂhhkXfj_bcddcbacphkjiCmcdgdfiaefjie^c`_qpmeVcfcrjhr[\abllinjijfWބfjlݭggdlzgVfdbcddcbf_ffgiCkmnnljjigjmibcgaff[jmqeigikaYeefjasdfggnm]&ѕncimfh{Z\iabcddcbcaamfce8d_dac[gihidbmng`[ak^`_einkfdgiih¦yzԨ]`bcbcddcb]gg[_cdeddcdbfdbaf]]lj_be_cfkmejgiek؝[`bcbcddcbdc\\ad6cdd_^bcaacefb^^\``ggi\aocjlhkhhdʻ\`bcbcddcbc``i_\7bedcec`^\`aa]ac`bkcpjfcfYaldgkmiipȧ\`bcbcddcb'a^phiUacde`ZgimffrŤǑ[`bcbcddcb(`bfrgaUZac^]_i`ie`ƺѢّ\`bcbcddcb(adk_gfghhldagditk\`bcbcddcb(c_cpdkbnkebfjddWƗےb_babcdcbab(`\ckeggfhkfakf`ڙգŲtZe^babdcbaab(a^dgj_^``gea`^ZtѸqZf`baabcdcbbc&`baa`]Z`acec`شrϹoZe^cbbcdedcd'fe^_^beg\`cb`dз귺ȴo\g`dcde H8499:ImÔ8,OktyuoT8(TW>)V*^b %|²#{(lTgi0N4TԟIzѹ0v}'r:FVհ04p?p1ӁW\1ٞ7yсiSg@ғeρ eWWJAtXNԀӀج1fiHӁaO Bø5̵ڽ-b` @oۉ3:|HDdS/վL:Imb4z OXB&ՀS ż'e)%) ?φ6-.(&9o05PR:!7wa@2%vcI1)Fѵ%""MVVWSPUT,)71*+ '^rͽfkⵚ%[cgilh^QX6OMJTO7:֨0Ť 6"Wtikjgb0$WTRPN& ;]߆;)^$+tkkihiioMQPNRJ*/79/%1b@iȰ @&zVlrjihmn"ERNPM9wdD(VȪ+MT 3gropstn\.\PTGoȼqS2ѵ+[oz(/=agL9 ;X]: mˬa̾ĸ*#@TPYE!Mu. ;"&jsȻó+qfB VSU[1i~5 D P/Yڰaʶ.63{$-XOOX0.~{J</Sqsɷɴȵ3QcIVPRRE^lg0WsLqWm/(>' IWMV-'ti/LʂӗŶ2B4G+?XV Q? i$G~ñRѐ3%lbb2>NpK<n>(դjv3B5smpB$a|ydj˛H쮗Ҷ0"Xsjrg I-6K$=r?wfӻ᫓د3j#oljp&^rl BUglm0+(rmha=)i .$5Eպoj~wsf0]tn$WtO1 =>oY˱~~~ĵ.F^v)6N"&gGVqV.]hʳÿŽ03)+@I3%I2#&!8uky/HSSUMqM0)Hr??-SowuclrcW\_`TZfaK,n,k?\YNsé_8"( luynzW@s+e1@=ȶi;(>Cu{|qp b7òő:.UҴ¾ı( a-u֋QDѾm&D:+7WNKPGȪ'A{C&iD5wך]JLۿ#PiK.'5n+~;;BQCͷ) vCkS*ĭ']K*z@)[> XERY !Ҩ'5Z225ݬ jZ [f(य'*M0՝ qtXq/़%bQN2՝ e}V{ EجN60 [O K՝T2B U L M٢\1IFGEڲ_7ȻQ$#cIX¼h,ynczåe'̘Ԯ|٪`N¦ƥ໺şԻjPȷõ4v{{zw|{}wz{wz{~v{{ojbKxyz {zzygEJ-KID?bJDLJJFA[jy^NMHBEISzFIJH DDCFKOV}3kLOMKLMm]PKLRrJ"VILMLfbGdvDvQO NS^LJHMt=YKNKLq]IXD$hMMNJUՆK^OSlLNNK\UML SMNNI4_KR1ONMM\ŕJJ^ȧeHPOGzfINJGxKKNMW4PRdHNONQƝϻͺRIwѥSLOMO`IOKJwpKMNLn4GlOLPNGԤ̵fGլINKNZOJLOJYJPNL5mI\IONLZgrEӵmHMJLktJJNNW OLOMT RT}KN&JhhʅzΪXLKKJQOMGU zGLNLd7JhXLNNMSǷΫOҮǡOMLNQuQKKOm ^JJMN~ xHKN(JuάNCة̪vMOOPJQPMJRn RNMKO ^LzHN$LƯw.!ۥ˙]IPPLU]VQKPd JNNL[#O`fKNONRvqԶϨƖN fIMKm jKNNKq4H|^NMOK[ʷϩωרƑKNNM[NPNNw VMNNL4hLZNMNKkĻ¿҉ЗhKNNKqJKOIOMN=QT[^LNPInǼ͒Dh¨ǦTKNMKHNONGJMKKcGt,mINPKlêָWG֤{MONJVKLMMK6HLMLnaNKOOM\ҚkJRЙ\MNNKg dGOLMPprqzMKPMdHrVKNNPeHMaɿPN KLLPMIm`=GHGGEBZeKPLNKZLLNLo€NQHy~qMLMwXIPOKUpNLGHfYHKOTxfEW)PLNKg\JsfI|eLJKONNPjrmTJKLH\#\JLLJanLIGFHNKFNn(tILIIKKMGY{eѫSBFJMHIIHDEDFNVb#UKLLKm]^^l…2kwb[]wѣ{f #ILLJM'|ŹɦƟ qENLFc~͑ \FMNK~Ljī֡ȩ OKKNNvkgx yp\=Ƹukƴkju ~HMKI[jMIGWWLKT!TEGNUONn`EIJtRKGMUIFJmdJLKFs7QFIMxGKGxwJJHU?LIJ_JJUHIGsRJF^QKKNHIKLIRJ%NNII{Ċ1LKJzmbWILHdnGMItKKILR6RILGX[KNBqhEMHUƌ:KLK]kGKKJªFMHUnJHJIf7rFKHJXINIZ`IKGeÍGKKJbIKJJ]ÀGLIKVIIKE;WHHLOTJLHWoGKEsKJKHknGKHGï~gILLEJJLHQ;JJLJ`NLKH_IHIvqEMIR[MKJNcYKKHM zFMLFa:oyDKNFx~GMLEoOI[|LIJR¹PLLJXsMKNHT _HMLEw:vCoIKKH^IHLKcHFGFLFcSJLIexmHLKFrMLA{JIKHKJKNKEh~KKl|^HMHhTIKIRkHLBiGETgEKKeILIYIMVƞ}uHLK]fJMKQrZKLCGPdknmi`MHKFjTEG\wLHGZ_EJH^˯cFGNŬMLJKGEIHFDAAC2d^WVUda ?9kQX\S_9 1`]]^Zk!Kv [WZZS[]XggVWXWg+@ R:oXXWZabXZSS]j1<י ܜadI[bSYUZZVYWae+'z,kf[SZaacgH$+.:}Ϯ'8)@GIJ4K`e_J?6a\@?*!E&*@BB::>GK'p-7o_if[Gm'FD<==>>:B,-'&12slmd^jc)?=K899;<ME:;;:9AJ%($)- &KNUWNE7&d+1V1"FI==@BD@/$*% IkZbce_QN9$~+pFO.A70+ "26"CuX[]\[_bb<}+()V5 27) 0FX( BsWRWVW[rG,@W+-*.4!MGJ5G$6/d&SeaYW[Z</<JM*&(.^?A;J/\(Y"1F[dm5Z0!9MB)%!(.+bVOYF>=2O/A9W'y}l0L]5%#*% L_VSd'Q-#c6-O$HqW\lsigKu0(#-4$/gSS]U >MXMM1M $<$ %-,7iOSc-M<*뭩Q3RB@# 2 J_PUU,U*@b;֢{*Ķp|ڪ3F#M?2 Z-{%,+0Ak\`a]K=%/ @`l^ZegnoeOLMGBR1 |,~+ )t[TTW[aaU@'(F5Xe~rsdmlrktgucug[X, J:\fnMXc Ḽ o;^?(Ľ'!jF(2Je cF`6Q:%'n2X%2b:CdzS8IC-(2;,L:Ϲ dK\X ,ǥ'(n8ï kd\e 'Ϟ'jZ{>`mYk 6ЬoEpw/ Ysi} GʝyGwC S{a:J@M R <ĞM9NvM}Ey,[w{|QbF^]~y%˒w^qYQԦ|ǚx8\{z|wyDPURRSZPYNlmPRQNUQcqzY47%M #]:g uo[[~4% eɂy!3,Vk0W; *m Lľ}% iGvqH!bh>.M4 $A7nK4 m&cÂo_?5h(&80 ,N~wGZRC+>u|F$<~gYoV 'tmd3L48RJ>)_,H_7(Cr_/gdSivg'<!?wqIQKFP$kiXĂwcɁe**gx y Ix 4A ~Msg97(De% O}_5`ɂ҂2Fv8@n I3Mvf~d2WJ9ZqRX Cd XKnvjRE J@<r]dhx])8 Vz,V*y*mf_yrY7g&m' e $_u\bm.}~$wA50.(2I q2j~y~Uy;dp% C$ F ^vyw#>Ҟ܍X!?sxdmb8[vlV~nhwp8u)zji[Ro u{|phxqNo Ic]{{~oRwv[ P΁)g^yyu||mHZwn 7 w|l~|~{k{{ !&! rbs{~||t@jz(֗l;" Amx!l{oIvmR]yq{(&Y~n9yqpzq)f~Rt?~rr')YvK~v9tifzst8mk@ucblogo-6.1/logo-Info.plist0000664000175000017500000000141013557147341014026 0ustar jjcjjc CFBundleDevelopmentRegion English CFBundleExecutable logo CFBundleGetInfoString CFBundleIconFile CFBundleIdentifier com.MySoftwareCompany.logo CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleShortVersionString CFBundleSignature ???? CFBundleVersion 1.0.0d1 ucblogo-6.1/kdbgrc.logo0000664000175000017500000000017113557147341013241 0ustar jjcjjc[General] DebuggerCmdStr= FileVersion=1 ProgramArgs= TTYLevel=7 WorkingDirectory= [Memory] ColumnWidths=80,0 NumExprs=0 ucblogo-6.1/gpl_text.h0000664000175000017500000005754713557147341013145 0ustar jjcjjc/* ** This file was automatically generated from gpl.html. Make changes ** to that file rather than this one. */ const char *gplText = _T("\n") _T("\n") _T("GNU General Public License\n") _T("\n") _T("\n") _T("

GNU GENERAL PUBLIC LICENSE

\n") _T("

\n") _T("Version 2, June 1991\n") _T("\n") _T("

\n") _T("\n") _T("
\n")
  _T("Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n")
  _T("59 Temple Place - Suite 330, Boston, MA  02111-1307, USA\n")
  _T("\n")
  _T("Everyone is permitted to copy and distribute verbatim copies\n")
  _T("of this license document, but changing it is not allowed.\n")
  _T("
\n") _T("\n") _T("\n") _T("\n") _T("

Preamble

\n") _T("\n") _T("

\n") _T(" The licenses for most software are designed to take away your\n") _T("freedom to share and change it. By contrast, the GNU General Public\n") _T("License is intended to guarantee your freedom to share and change free\n") _T("software--to make sure the software is free for all its users. This\n") _T("General Public License applies to most of the Free Software\n") _T("Foundation's software and to any other program whose authors commit to\n") _T("using it. (Some other Free Software Foundation software is covered by\n") _T("the GNU Library General Public License instead.) You can apply it to\n") _T("your programs, too.\n") _T("\n") _T("

\n") _T("

\n") _T(" When we speak of free software, we are referring to freedom, not\n") _T("price. Our General Public Licenses are designed to make sure that you\n") _T("have the freedom to distribute copies of free software (and charge for\n") _T("this service if you wish), that you receive source code or can get it\n") _T("if you want it, that you can change the software or use pieces of it\n") _T("in new free programs; and that you know you can do these things.\n") _T("\n") _T("

\n") _T("

\n") _T(" To protect your rights, we need to make restrictions that forbid\n") _T("anyone to deny you these rights or to ask you to surrender the rights.\n") _T("These restrictions translate to certain responsibilities for you if you\n") _T("distribute copies of the software, or if you modify it.\n") _T("\n") _T("

\n") _T("

\n") _T(" For example, if you distribute copies of such a program, whether\n") _T("gratis or for a fee, you must give the recipients all the rights that\n") _T("you have. You must make sure that they, too, receive or can get the\n") _T("source code. And you must show them these terms so they know their\n") _T("rights.\n") _T("\n") _T("

\n") _T("

\n") _T(" We protect your rights with two steps: (1) copyright the software, and\n") _T("(2) offer you this license which gives you legal permission to copy,\n") _T("distribute and/or modify the software.\n") _T("\n") _T("

\n") _T("

\n") _T(" Also, for each author's protection and ours, we want to make certain\n") _T("that everyone understands that there is no warranty for this free\n") _T("software. If the software is modified by someone else and passed on, we\n") _T("want its recipients to know that what they have is not the original, so\n") _T("that any problems introduced by others will not reflect on the original\n") _T("authors' reputations.\n") _T("\n") _T("

\n") _T("

\n") _T(" Finally, any free program is threatened constantly by software\n") _T("patents. We wish to avoid the danger that redistributors of a free\n") _T("program will individually obtain patent licenses, in effect making the\n") _T("program proprietary. To prevent this, we have made it clear that any\n") _T("patent must be licensed for everyone's free use or not licensed at all.\n") _T("\n") _T("

\n") _T("

\n") _T(" The precise terms and conditions for copying, distribution and\n") _T("modification follow.\n") _T("\n") _T("

\n") _T("\n") _T("\n") _T("

TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

\n") _T("\n") _T("\n") _T("

\n") _T("\n") _T("0.\n") _T(" This License applies to any program or other work which contains\n") _T("a notice placed by the copyright holder saying it may be distributed\n") _T("under the terms of this General Public License. The \"Program\", below,\n") _T("refers to any such program or work, and a \"work based on the Program\"\n") _T("means either the Program or any derivative work under copyright law:\n") _T("that is to say, a work containing the Program or a portion of it,\n") _T("either verbatim or with modifications and/or translated into another\n") _T("language. (Hereinafter, translation is included without limitation in\n") _T("the term \"modification\".) Each licensee is addressed as \"you\".\n") _T("

\n") _T("\n") _T("Activities other than copying, distribution and modification are not\n") _T("covered by this License; they are outside its scope. The act of\n") _T("running the Program is not restricted, and the output from the Program\n") _T("is covered only if its contents constitute a work based on the\n") _T("Program (independent of having been made by running the Program).\n") _T("Whether that is true depends on what the Program does.\n") _T("\n") _T("

\n") _T("\n") _T("1.\n") _T(" You may copy and distribute verbatim copies of the Program's\n") _T("source code as you receive it, in any medium, provided that you\n") _T("conspicuously and appropriately publish on each copy an appropriate\n") _T("copyright notice and disclaimer of warranty; keep intact all the\n") _T("notices that refer to this License and to the absence of any warranty;\n") _T("and give any other recipients of the Program a copy of this License\n") _T("along with the Program.\n") _T("

\n") _T("\n") _T("You may charge a fee for the physical act of transferring a copy, and\n") _T("you may at your option offer warranty protection in exchange for a fee.\n") _T("

\n") _T("\n") _T("2.\n") _T(" You may modify your copy or copies of the Program or any portion\n") _T("of it, thus forming a work based on the Program, and copy and\n") _T("distribute such modifications or work under the terms of Section 1\n") _T("above, provided that you also meet all of these conditions:\n") _T("

\n") _T("\n") _T("

    \n") _T("\n") _T("
  • a)\n") _T(" You must cause the modified files to carry prominent notices\n") _T(" stating that you changed the files and the date of any change.\n") _T("\n") _T("

    \n") _T("

  • b)\n") _T(" You must cause any work that you distribute or publish, that in\n") _T(" whole or in part contains or is derived from the Program or any\n") _T(" part thereof, to be licensed as a whole at no charge to all third\n") _T(" parties under the terms of this License.\n") _T("\n") _T("

    \n") _T("

  • c)\n") _T(" If the modified program normally reads commands interactively\n") _T(" when run, you must cause it, when started running for such\n") _T(" interactive use in the most ordinary way, to print or display an\n") _T(" announcement including an appropriate copyright notice and a\n") _T(" notice that there is no warranty (or else, saying that you provide\n") _T(" a warranty) and that users may redistribute the program under\n") _T(" these conditions, and telling the user how to view a copy of this\n") _T(" License. (Exception: if the Program itself is interactive but\n") _T(" does not normally print such an announcement, your work based on\n") _T(" the Program is not required to print an announcement.)\n") _T("
\n") _T("

\n") _T("\n") _T("These requirements apply to the modified work as a whole. If\n") _T("identifiable sections of that work are not derived from the Program,\n") _T("and can be reasonably considered independent and separate works in\n") _T("themselves, then this License, and its terms, do not apply to those\n") _T("sections when you distribute them as separate works. But when you\n") _T("distribute the same sections as part of a whole which is a work based\n") _T("on the Program, the distribution of the whole must be on the terms of\n") _T("this License, whose permissions for other licensees extend to the\n") _T("entire whole, and thus to each and every part regardless of who wrote it.\n") _T("

\n") _T("\n") _T("Thus, it is not the intent of this section to claim rights or contest\n") _T("your rights to work written entirely by you; rather, the intent is to\n") _T("exercise the right to control the distribution of derivative or\n") _T("collective works based on the Program.\n") _T("

\n") _T("\n") _T("In addition, mere aggregation of another work not based on the Program\n") _T("with the Program (or with a work based on the Program) on a volume of\n") _T("a storage or distribution medium does not bring the other work under\n") _T("the scope of this License.\n") _T("\n") _T("

\n") _T("\n") _T("3.\n") _T(" You may copy and distribute the Program (or a work based on it,\n") _T("under Section 2) in object code or executable form under the terms of\n") _T("Sections 1 and 2 above provided that you also do one of the following:\n") _T("\n") _T("\n") _T("\n") _T("\n") _T("

    \n") _T("\n") _T("
  • a)\n") _T(" Accompany it with the complete corresponding machine-readable\n") _T(" source code, which must be distributed under the terms of Sections\n") _T(" 1 and 2 above on a medium customarily used for software interchange; or,\n") _T("\n") _T("

    \n") _T("

  • b)\n") _T(" Accompany it with a written offer, valid for at least three\n") _T(" years, to give any third party, for a charge no more than your\n") _T(" cost of physically performing source distribution, a complete\n") _T(" machine-readable copy of the corresponding source code, to be\n") _T(" distributed under the terms of Sections 1 and 2 above on a medium\n") _T(" customarily used for software interchange; or,\n") _T("\n") _T("

    \n") _T("

  • c)\n") _T(" Accompany it with the information you received as to the offer\n") _T(" to distribute corresponding source code. (This alternative is\n") _T(" allowed only for noncommercial distribution and only if you\n") _T(" received the program in object code or executable form with such\n") _T(" an offer, in accord with Subsection b above.)\n") _T("
\n") _T("

\n") _T("\n") _T("The source code for a work means the preferred form of the work for\n") _T("making modifications to it. For an executable work, complete source\n") _T("code means all the source code for all modules it contains, plus any\n") _T("associated interface definition files, plus the scripts used to\n") _T("control compilation and installation of the executable. However, as a\n") _T("special exception, the source code distributed need not include\n") _T("anything that is normally distributed (in either source or binary\n") _T("form) with the major components (compiler, kernel, and so on) of the\n") _T("operating system on which the executable runs, unless that component\n") _T("itself accompanies the executable.\n") _T("

\n") _T("\n") _T("If distribution of executable or object code is made by offering\n") _T("access to copy from a designated place, then offering equivalent\n") _T("access to copy the source code from the same place counts as\n") _T("distribution of the source code, even though third parties are not\n") _T("compelled to copy the source along with the object code.\n") _T("

\n") _T("\n") _T("4.\n") _T(" You may not copy, modify, sublicense, or distribute the Program\n") _T("except as expressly provided under this License. Any attempt\n") _T("otherwise to copy, modify, sublicense or distribute the Program is\n") _T("void, and will automatically terminate your rights under this License.\n") _T("However, parties who have received copies, or rights, from you under\n") _T("this License will not have their licenses terminated so long as such\n") _T("parties remain in full compliance.\n") _T("\n") _T("

\n") _T("\n") _T("5.\n") _T(" You are not required to accept this License, since you have not\n") _T("signed it. However, nothing else grants you permission to modify or\n") _T("distribute the Program or its derivative works. These actions are\n") _T("prohibited by law if you do not accept this License. Therefore, by\n") _T("modifying or distributing the Program (or any work based on the\n") _T("Program), you indicate your acceptance of this License to do so, and\n") _T("all its terms and conditions for copying, distributing or modifying\n") _T("the Program or works based on it.\n") _T("\n") _T("

\n") _T("\n") _T("6.\n") _T(" Each time you redistribute the Program (or any work based on the\n") _T("Program), the recipient automatically receives a license from the\n") _T("original licensor to copy, distribute or modify the Program subject to\n") _T("these terms and conditions. You may not impose any further\n") _T("restrictions on the recipients' exercise of the rights granted herein.\n") _T("You are not responsible for enforcing compliance by third parties to\n") _T("this License.\n") _T("\n") _T("

\n") _T("\n") _T("7.\n") _T(" If, as a consequence of a court judgment or allegation of patent\n") _T("infringement or for any other reason (not limited to patent issues),\n") _T("conditions are imposed on you (whether by court order, agreement or\n") _T("otherwise) that contradict the conditions of this License, they do not\n") _T("excuse you from the conditions of this License. If you cannot\n") _T("distribute so as to satisfy simultaneously your obligations under this\n") _T("License and any other pertinent obligations, then as a consequence you\n") _T("may not distribute the Program at all. For example, if a patent\n") _T("license would not permit royalty-free redistribution of the Program by\n") _T("all those who receive copies directly or indirectly through you, then\n") _T("the only way you could satisfy both it and this License would be to\n") _T("refrain entirely from distribution of the Program.\n") _T("

\n") _T("\n") _T("If any portion of this section is held invalid or unenforceable under\n") _T("any particular circumstance, the balance of the section is intended to\n") _T("apply and the section as a whole is intended to apply in other\n") _T("circumstances.\n") _T("

\n") _T("\n") _T("It is not the purpose of this section to induce you to infringe any\n") _T("patents or other property right claims or to contest validity of any\n") _T("such claims; this section has the sole purpose of protecting the\n") _T("integrity of the free software distribution system, which is\n") _T("implemented by public license practices. Many people have made\n") _T("generous contributions to the wide range of software distributed\n") _T("through that system in reliance on consistent application of that\n") _T("system; it is up to the author/donor to decide if he or she is willing\n") _T("to distribute software through any other system and a licensee cannot\n") _T("impose that choice.\n") _T("

\n") _T("\n") _T("This section is intended to make thoroughly clear what is believed to\n") _T("be a consequence of the rest of this License.\n") _T("\n") _T("

\n") _T("\n") _T("8.\n") _T(" If the distribution and/or use of the Program is restricted in\n") _T("certain countries either by patents or by copyrighted interfaces, the\n") _T("original copyright holder who places the Program under this License\n") _T("may add an explicit geographical distribution limitation excluding\n") _T("those countries, so that distribution is permitted only in or among\n") _T("countries not thus excluded. In such case, this License incorporates\n") _T("the limitation as if written in the body of this License.\n") _T("\n") _T("

\n") _T("\n") _T("9.\n") _T(" The Free Software Foundation may publish revised and/or new versions\n") _T("of the General Public License from time to time. Such new versions will\n") _T("be similar in spirit to the present version, but may differ in detail to\n") _T("address new problems or concerns.\n") _T("

\n") _T("\n") _T("Each version is given a distinguishing version number. If the Program\n") _T("specifies a version number of this License which applies to it and \"any\n") _T("later version\", you have the option of following the terms and conditions\n") _T("either of that version or of any later version published by the Free\n") _T("Software Foundation. If the Program does not specify a version number of\n") _T("this License, you may choose any version ever published by the Free Software\n") _T("Foundation.\n") _T("\n") _T("

\n") _T("\n") _T("\n") _T("10.\n") _T(" If you wish to incorporate parts of the Program into other free\n") _T("programs whose distribution conditions are different, write to the author\n") _T("to ask for permission. For software which is copyrighted by the Free\n") _T("Software Foundation, write to the Free Software Foundation; we sometimes\n") _T("make exceptions for this. Our decision will be guided by the two goals\n") _T("of preserving the free status of all derivatives of our free software and\n") _T("of promoting the sharing and reuse of software generally.\n") _T("\n") _T("\n") _T("\n") _T("

NO WARRANTY

\n") _T("\n") _T("

\n") _T("\n") _T("11.\n") _T(" BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\n") _T("FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN\n") _T("OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\n") _T("PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\n") _T("OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n") _T("MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS\n") _T("TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE\n") _T("PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\n") _T("REPAIR OR CORRECTION.\n") _T("\n") _T("

\n") _T("\n") _T("12.\n") _T(" IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\n") _T("WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\n") _T("REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\n") _T("INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\n") _T("OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\n") _T("TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\n") _T("YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\n") _T("PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\n") _T("POSSIBILITY OF SUCH DAMAGES.\n") _T("\n") _T("

\n") _T("\n") _T("\n") _T("

END OF TERMS AND CONDITIONS

\n") _T("\n") _T("\n") _T("\n") _T("

How to Apply These Terms to Your New Programs

\n") _T("\n") _T("

\n") _T(" If you develop a new program, and you want it to be of the greatest\n") _T("possible use to the public, the best way to achieve this is to make it\n") _T("free software which everyone can redistribute and change under these terms.\n") _T("\n") _T("

\n") _T("

\n") _T(" To do so, attach the following notices to the program. It is safest\n") _T("to attach them to the start of each source file to most effectively\n") _T("convey the exclusion of warranty; and each file should have at least\n") _T("the \"copyright\" line and a pointer to where the full notice is found.\n") _T("\n") _T("

\n") _T("\n") _T("
\n")
  _T("one line to give the program's name and an idea of what it does.\n")
  _T("Copyright (C) yyyy  name of author\n")
  _T("\n")
  _T("This program is free software; you can redistribute it and/or\n")
  _T("modify it under the terms of the GNU General Public License\n")
  _T("as published by the Free Software Foundation; either version 2\n")
  _T("of the License, or (at your option) any later version.\n")
  _T("\n")
  _T("This program is distributed in the hope that it will be useful,\n")
  _T("but WITHOUT ANY WARRANTY; without even the implied warranty of\n")
  _T("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n")
  _T("GNU General Public License for more details.\n")
  _T("\n")
  _T("You should have received a copy of the GNU General Public License\n")
  _T("along with this program; if not, write to the Free Software\n")
  _T("Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.\n")
  _T("
\n") _T("\n") _T("

\n") _T("Also add information on how to contact you by electronic and paper mail.\n") _T("\n") _T("

\n") _T("

\n") _T("If the program is interactive, make it output a short notice like this\n") _T("when it starts in an interactive mode:\n") _T("\n") _T("

\n") _T("\n") _T("
\n")
  _T("Gnomovision version 69, Copyright (C) year name of author\n")
  _T("Gnomovision comes with ABSOLUTELY NO WARRANTY; for details\n")
  _T("type `show w'.  This is free software, and you are welcome\n")
  _T("to redistribute it under certain conditions; type `show c'\n")
  _T("for details.\n")
  _T("
\n") _T("\n") _T("

\n") _T("The hypothetical commands `show w' and `show c' should show\n") _T("the appropriate parts of the General Public License. Of course, the\n") _T("commands you use may be called something other than `show w' and\n") _T("`show c'; they could even be mouse-clicks or menu items--whatever\n") _T("suits your program.\n") _T("\n") _T("

\n") _T("

\n") _T("You should also get your employer (if you work as a programmer) or your\n") _T("school, if any, to sign a \"copyright disclaimer\" for the program, if\n") _T("necessary. Here is a sample; alter the names:\n") _T("\n") _T("

\n") _T("\n") _T("
\n")
  _T("Yoyodyne, Inc., hereby disclaims all copyright\n")
  _T("interest in the program `Gnomovision'\n")
  _T("(which makes passes at compilers) written\n")
  _T("by James Hacker.\n")
  _T("\n")
  _T("signature of Ty Coon, 1 April 1989\n")
  _T("Ty Coon, President of Vice\n")
  _T("
\n") _T("\n") _T("

\n") _T("This General Public License does not permit incorporating your program into\n") _T("proprietary programs. If your program is a subroutine library, you may\n") _T("consider it more useful to permit linking proprietary applications with the\n") _T("library. If this is what you want to do, use the GNU Library General\n") _T("Public License instead of this License.\n") _T("\n") _T("\n") _T("\n") ; ucblogo-6.1/evaluator.ps0000664000175000017500000037441113557147341013504 0ustar jjcjjc%!PS-Adobe-2.0 %%Creator: dvips(k) 5.86 Copyright 1999 Radical Eye Software %%Title: eva.dvi %%Pages: 1 %%PageOrder: Ascend %%BoundingBox: 0 0 596 842 %%EndComments %DVIPSWebPage: (www.radicaleye.com) %DVIPSCommandLine: dvips eva.dvi -o eva.ps %DVIPSParameters: dpi=600, compressed %DVIPSSource: TeX output 2002.08.20:1238 %%BeginProcSet: texc.pro %! /TeXDict 300 dict def TeXDict begin/N{def}def/B{bind def}N/S{exch}N/X{S N}B/A{dup}B/TR{translate}N/isls false N/vsize 11 72 mul N/hsize 8.5 72 mul N/landplus90{false}def/@rigin{isls{[0 landplus90{1 -1}{-1 1}ifelse 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale isls{ landplus90{VResolution 72 div vsize mul 0 exch}{Resolution -72 div hsize mul 0}ifelse TR}if Resolution VResolution vsize -72 div 1 add mul TR[ matrix currentmatrix{A A round sub abs 0.00001 lt{round}if}forall round exch round exch]setmatrix}N/@landscape{/isls true N}B/@manualfeed{ statusdict/manualfeed true put}B/@copies{/#copies X}B/FMat[1 0 0 -1 0 0] N/FBB[0 0 0 0]N/nn 0 N/IEn 0 N/ctr 0 N/df-tail{/nn 8 dict N nn begin /FontType 3 N/FontMatrix fntrx N/FontBBox FBB N string/base X array /BitMaps X/BuildChar{CharBuilder}N/Encoding IEn N end A{/foo setfont}2 array copy cvx N load 0 nn put/ctr 0 N[}B/sf 0 N/df{/sf 1 N/fntrx FMat N df-tail}B/dfs{div/sf X/fntrx[sf 0 0 sf neg 0 0]N df-tail}B/E{pop nn A definefont setfont}B/Cw{Cd A length 5 sub get}B/Ch{Cd A length 4 sub get }B/Cx{128 Cd A length 3 sub get sub}B/Cy{Cd A length 2 sub get 127 sub} B/Cdx{Cd A length 1 sub get}B/Ci{Cd A type/stringtype ne{ctr get/ctr ctr 1 add N}if}B/id 0 N/rw 0 N/rc 0 N/gp 0 N/cp 0 N/G 0 N/CharBuilder{save 3 1 roll S A/base get 2 index get S/BitMaps get S get/Cd X pop/ctr 0 N Cdx 0 Cx Cy Ch sub Cx Cw add Cy setcachedevice Cw Ch true[1 0 0 -1 -.1 Cx sub Cy .1 sub]/id Ci N/rw Cw 7 add 8 idiv string N/rc 0 N/gp 0 N/cp 0 N{ rc 0 ne{rc 1 sub/rc X rw}{G}ifelse}imagemask restore}B/G{{id gp get/gp gp 1 add N A 18 mod S 18 idiv pl S get exec}loop}B/adv{cp add/cp X}B /chg{rw cp id gp 4 index getinterval putinterval A gp add/gp X adv}B/nd{ /cp 0 N rw exit}B/lsh{rw cp 2 copy get A 0 eq{pop 1}{A 255 eq{pop 254}{ A A add 255 and S 1 and or}ifelse}ifelse put 1 adv}B/rsh{rw cp 2 copy get A 0 eq{pop 128}{A 255 eq{pop 127}{A 2 idiv S 128 and or}ifelse} ifelse put 1 adv}B/clr{rw cp 2 index string putinterval adv}B/set{rw cp fillstr 0 4 index getinterval putinterval adv}B/fillstr 18 string 0 1 17 {2 copy 255 put pop}for N/pl[{adv 1 chg}{adv 1 chg nd}{1 add chg}{1 add chg nd}{adv lsh}{adv lsh nd}{adv rsh}{adv rsh nd}{1 add adv}{/rc X nd}{ 1 add set}{1 add clr}{adv 2 chg}{adv 2 chg nd}{pop nd}]A{bind pop} forall N/D{/cc X A type/stringtype ne{]}if nn/base get cc ctr put nn /BitMaps get S ctr S sf 1 ne{A A length 1 sub A 2 index S get sf div put }if put/ctr ctr 1 add N}B/I{cc 1 add D}B/bop{userdict/bop-hook known{ bop-hook}if/SI save N @rigin 0 0 moveto/V matrix currentmatrix A 1 get A mul exch 0 get A mul add .99 lt{/QV}{/RV}ifelse load def pop pop}N/eop{ SI restore userdict/eop-hook known{eop-hook}if showpage}N/@start{ userdict/start-hook known{start-hook}if pop/VResolution X/Resolution X 1000 div/DVImag X/IEn 256 array N 2 string 0 1 255{IEn S A 360 add 36 4 index cvrs cvn put}for pop 65781.76 div/vsize X 65781.76 div/hsize X}N /p{show}N/RMat[1 0 0 -1 0 0]N/BDot 260 string N/Rx 0 N/Ry 0 N/V{}B/RV/v{ /Ry X/Rx X V}B statusdict begin/product where{pop false[(Display)(NeXT) (LaserWriter 16/600)]{A length product length le{A length product exch 0 exch getinterval eq{pop true exit}if}{pop}ifelse}forall}{false}ifelse end{{gsave TR -.1 .1 TR 1 1 scale Rx Ry false RMat{BDot}imagemask grestore}}{{gsave TR -.1 .1 TR Rx Ry scale 1 1 false RMat{BDot} imagemask grestore}}ifelse B/QV{gsave newpath transform round exch round exch itransform moveto Rx 0 rlineto 0 Ry neg rlineto Rx neg 0 rlineto fill grestore}B/a{moveto}B/delta 0 N/tail{A/delta X 0 rmoveto}B/M{S p delta add tail}B/b{S p tail}B/c{-4 M}B/d{-3 M}B/e{-2 M}B/f{-1 M}B/g{0 M} B/h{1 M}B/i{2 M}B/j{3 M}B/k{4 M}B/w{0 rmoveto}B/l{p -4 w}B/m{p -3 w}B/n{ p -2 w}B/o{p -1 w}B/q{p 1 w}B/r{p 2 w}B/s{p 3 w}B/t{p 4 w}B/x{0 S rmoveto}B/y{3 2 roll p a}B/bos{/SS save N}B/eos{SS restore}B end %%EndProcSet %%BeginProcSet: special.pro %! TeXDict begin/SDict 200 dict N SDict begin/@SpecialDefaults{/hs 612 N /vs 792 N/ho 0 N/vo 0 N/hsc 1 N/vsc 1 N/ang 0 N/CLIP 0 N/rwiSeen false N /rhiSeen false N/letter{}N/note{}N/a4{}N/legal{}N}B/@scaleunit 100 N /@hscale{@scaleunit div/hsc X}B/@vscale{@scaleunit div/vsc X}B/@hsize{ /hs X/CLIP 1 N}B/@vsize{/vs X/CLIP 1 N}B/@clip{/CLIP 2 N}B/@hoffset{/ho X}B/@voffset{/vo X}B/@angle{/ang X}B/@rwi{10 div/rwi X/rwiSeen true N}B /@rhi{10 div/rhi X/rhiSeen true N}B/@llx{/llx X}B/@lly{/lly X}B/@urx{ /urx X}B/@ury{/ury X}B/magscale true def end/@MacSetUp{userdict/md known {userdict/md get type/dicttype eq{userdict begin md length 10 add md maxlength ge{/md md dup length 20 add dict copy def}if end md begin /letter{}N/note{}N/legal{}N/od{txpose 1 0 mtx defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{itransform moveto}}{transform{ itransform lineto}}{6 -2 roll transform 6 -2 roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array astore/gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{PaintBlack} if}N/txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{ noflips{TR pop pop 270 rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if}ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy TR .96 dup scale neg S neg S TR}if}N/cp{pop pop showpage pm restore}N end}if}if}N/normalscale{ Resolution 72 div VResolution 72 div neg scale magscale{DVImag dup scale }if 0 setgray}N/psfts{S 65781.76 div N}N/startTexFig{/psf$SavedState save N userdict maxlength dict begin/magscale true def normalscale currentpoint TR/psf$ury psfts/psf$urx psfts/psf$lly psfts/psf$llx psfts /psf$y psfts/psf$x psfts currentpoint/psf$cy X/psf$cx X/psf$sx psf$x psf$urx psf$llx sub div N/psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR/showpage{}N/erasepage{}N/copypage{}N/p 3 def @MacSetUp}N/doclip{ psf$llx psf$lly psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll S lineto S lineto S lineto closepath clip newpath moveto}N/endTexFig{end psf$SavedState restore}N/@beginspecial{SDict begin/SpecialSave save N gsave normalscale currentpoint TR @SpecialDefaults count/ocount X/dcount countdictstack N}N/@setspecial{ CLIP 1 eq{newpath 0 0 moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR hsc vsc scale ang rotate rwiSeen{rwi urx llx sub div rhiSeen{rhi ury lly sub div}{dup}ifelse scale llx neg lly neg TR }{rhiSeen{rhi ury lly sub div dup scale llx neg lly neg TR}if}ifelse CLIP 2 eq{newpath llx lly moveto urx lly lineto urx ury lineto llx ury lineto closepath clip}if/showpage{}N/erasepage{}N/copypage{}N newpath}N /@endspecial{count ocount sub{pop}repeat countdictstack dcount sub{end} repeat grestore SpecialSave restore end}N/@defspecial{SDict begin}N /@fedspecial{end}B/li{lineto}B/rl{rlineto}B/rc{rcurveto}B/np{/SaveX currentpoint/SaveY X N 1 setlinecap newpath}N/st{stroke SaveX SaveY moveto}N/fil{fill SaveX SaveY moveto}N/ellipse{/endangle X/startangle X /yrad X/xrad X/savematrix matrix currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix setmatrix}N end %%EndProcSet TeXDict begin 39158280 55380996 1000 600 600 (eva.dvi) @start %DVIPSBitmapFont: Fa cmr10 10 1 /Fa 1 50 df49 D E %EndDVIPSBitmapFont end %%EndProlog %%BeginSetup %%Feature: *Resolution 600dpi TeXDict begin %%PaperSize: A4 %%EndSetup %%Page: 1 1 1 0 bop -630 6302 a @beginspecial 0 @llx 0 @lly 604 @urx 767 @ury 6040 @rwi @setspecial %%BeginDocument: evaluator.eps %!PS-Adobe-2.0 EPSF-2.0 %%DocumentFonts: Times-Roman %%+ Times-Bold %%+ Symbol %%BoundingBox: 0 0 604 767 %%Title:evaluator.eps %%Creator: %%CreationDate: %%EndComments %%BeginProcSet: BeachHead 2 3 %%BeachHead - v2.3 Copyright 1991-1993 Silicon Beach Software, inc. userdict /BeachHead known userdict begin /BeachHead 140 dict def BeachHead end begin /ta exch def /BeachHead_version 2 def /isWinPS false def /c 75 string def /sa 75 string def /f false def /g false def /h false def /i false def /n true def /k 0.015 def /oldmatrix 6 array def /newmatrix 6 array def /_doTexturePat false def /_strtxtmatrix null def /nulld { counttomark {null def} repeat pop } bind def mark /l /m /o /q /r /u /v /w /_cwidths /wa /x /y /z /A /B /D /E/F /G /H /I /J /K /M /N /O /P /Q /R /S /T /V /W /X /Y /ba /ca /da /ea /fa /ga /ha /ia /ja /ka ta not{/la /ma}if /_strtxtmatrix nulld /ra 256 array def ra dup dup 0 /Times-Roman findfont /Encoding get 0 128 getinterval putinterval 39 /quotesingle put 96 /grave put /Adieresis/Aring/Ccedilla/Eacute/Ntilde/Odieresis /Udieresis/aacute/agrave/acircumflex/adieresis/atilde/aring/ccedilla/eacute/egrave /ecircumflex/edieresis/iacute/igrave/icircumflex/idieresis/ntilde/oacute/ograve /ocircumflex/odieresis/otilde/uacute/ugrave/ucircumflex/udieresis/dagger/degree/cent /sterling/section/bullet/paragraph/germandbls/registered/copyright/trademark/acute /dieresis/notequal/AE/Oslash/infinity/plusminus/lessequal/greaterequal/yen/mu/partialdiff /summation/product/pi/integral/ordfeminine/ordmasculine/Omega/ae/oslash/questiondown /exclamdown/logicalnot/radical/florin/approxequal/Delta/guillemotleft/guillemotright /ellipsis/blank/Agrave/Atilde/Otilde/OE/oe/endash/emdash/quotedblleft/quotedblright /quoteleft/quoteright/divide/lozenge/ydieresis/Ydieresis/fraction/currency/guilsinglleft /guilsinglright/fi/fl/daggerdbl/periodcentered/quotesinglbase/quotedblbase/perthousand /Acircumflex/Ecircumflex/Aacute/Edieresis/Egrave/Iacute/Icircumflex/Idieresis/Igrave /Oacute/Ocircumflex/apple/Ograve/Uacute/Ucircumflex/Ugrave/dotlessi/circumflex/tilde /macron/breve/dotaccent/ring/cedilla/hungarumlaut/ogonek/caron ra 128 128 getinterval astore pop /va 256 array def ra va copy pop va 15{dup}repeat 161 /ring put 178 /Scaron put 182 /eth put 184 /Thorn put 185 /thorn put 195 /scaron put 198 /Eth put 222 /hyphen put 223 /twosuperior put 225 /threesuperior put 240 /onequarter put 249 /onehalf put 250 /periodcentered put 252 /cedilla put 253 /multiply put 254 /Yacute put version cvr 51 ge { va 245 /onesuperior put va 251 /threequarters put va 255 /yacute put } if /d { 0 1 74 { c exch 0 put } for dup c cvs pop c } bind def /qa { 0 1 74 { sa exch 0 put } for dup sa cvs pop sa 74 1 put } bind def /e { d 74 2 put } bind def /addoblique { /g true def } bind def /addheavy { /f true def } bind def /adduline { /h true def } bind def /findshadowfont { findoutlinefont BeachHead /i true put BeachHead /n true put } bind def /findoutlinefont { findbeachheadfont gof /n true def } bind def /findbeachheadfont { /f false def /g false def /h false def /i false def dup findfont dup /FontType get 0 ne { /Encoding get dup 161 get exch 162 get /cent eq exch /exclamdown eq and { userdict /BeachHead get begin qa FontDirectory sa known { pop sa findfont } { findfont dup length 1 add dict /o exch def { 1 index /FID ne 2 index /UniqueID ne and { o 3 1 roll put } { pop pop } ifelse } forall /FontName sa dup length string copy def o /Encoding isWinPS {va}{ra} ifelse put sa o definefont } ifelse end }{ findfont } ifelse }{ exch pop } ifelse } bind def /gof { userdict /BeachHead get begin dup /FontName get e FontDirectory c known { pop pop c findfont } { exch dup /FontType get 0 eq { dup maxlength 2 add dict begin { 1 index /FID ne 2 index /UniqueID ne and {def} {pop pop} ifelse }forall currentdict end dup dup /FDepVector get [ exch {gof} forall ] /FDepVector exch put exch e pop c exch definefont } { 12 dict begin dup /l exch def /FontType 3 def /FontMatrix [1 0 0 1 0 0] def /FontBBox [0 0 1 1] def /Encoding 256 array def 0 1 255 {Encoding exch /.notdef put} for dup exch maxlength 2 add dict begin { 1 index /FID ne 2 index /UniqueID ne and {def} {pop pop} ifelse }forall /PaintType 2 def /StrokeWidth 1 0 FontMatrix dtransform dup mul exch dup mul add sqrt .012 exch div def currentdict end /_dummy exch definefont /r exch def /m 1 string def /FontType 3 def /BuildChar { exch begin m 0 3 -1 roll put r setfont m stringwidth setcharwidth l setfont i { .05 -.05 moveto m show } if n { reversecolor 0 0 moveto m show reversecolor } if r setfont 0 0 moveto m show end } bind def currentdict end exch e pop c exch definefont } ifelse } ifelse end } bind def /EPSBegin { save userdict /BeachHead get begin /la exch def count /ma exch def end userdict /showpage {} put 0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit [] 0 setdash newpath } bind def /EPSEnd { userdict /BeachHead get begin count ma sub dup 0 gt {{pop}repeat} {pop}ifelse la end restore } bind def /cimage { userdict /BeachHead get begin { {readstring} } { {readhexstring} } ifelse /u exch def /colorimage where { pop 4 index dup string /v exch def dup string /w exch def dup string /x exch def dup string /y exch def string /z exch def { currentfile v u pop } { currentfile w u pop } { currentfile x u pop } { currentfile y u pop currentfile z u pop pop } 5 -1 roll { true 4 A } { true 4 /colorimage load exec } ifelse } { 4 index dup string /z exch def 4 mul string /B exch def { currentfile B u pop pop currentfile z u pop } exch { transimage } { /image load exec } ifelse } ifelse end } bind def /bhshow { userdict /BeachHead get begin h { gsave dup stringwidth pop (_) stringwidth pop div 1 scale currentpoint (_) show moveto grestore } if gsave g { [1 0 .17 1 0 0] concat } if f { /_x1 12 k mul def /_y1 12 k mul def currentpoint 3 copy _y1 add exch _x1 add exch moveto show 3 copy _y1 add exch _x1 sub exch moveto show 3 copy _y1 sub exch _x1 add exch moveto show 3 copy _y1 sub exch _x1 sub exch moveto show moveto } if show grestore end } bind def /C { D { gsave E F 3 index idtransform translate G 1 4 index 4 index {H} /image load exec grestore /I 0 def /G 0 def /D false def } if } bind def /transimage { userdict /BeachHead get begin 2 index 8 ne { /image load exec } { 4 index cvi string /H exch def /J 0 string def /K 0 def /D false def /I 0 def /G 0 def 0 1 5 index 1 sub { /F exch def 0 1 6 index 1 sub { K J length ge { 1 index dup type /stringtype ne { exec } if /J exch def /K 0 def } if J K get /K K 1 add def dup 255 eq { pop pop C } { H I 3 -1 roll put /I I 1 add def /G G 1 add def D not { /E exch def /G 1 def /D true def } { pop } ifelse } ifelse } for C } for 5{pop}repeat } ifelse end } bind def /L { D { gsave E F 8 index idtransform translate I 1 8 9 index {M} {N} {O} {P} true 4 /colorimage load exec grestore /I 0 def /D false def } if } bind def /A { 9 index cvi dup string /M exch def dup string /N exch def dup string /O exch def string /P exch def /Q 0 string def /K 0 def /D false def /I 0 def /G 0 def 0 1 10 index 1 sub { /F exch def 0 1 11 index 1 sub { K Q length ge { 6 index exec /R exch def 5 index exec /S exch def 4 index exec /T exch def 3 index exec /Q exch def /K 0 def } if R K get S K get T K get Q K get /K K 1 add def dup 0 eq 2 index 0 eq and 3 index 0 eq and 4 index 0 eq and { 5{pop}repeat L } { M I 6 -1 roll put N I 5 -1 roll put O I 4 -1 roll put P I 3 -1 roll put /I I 1 add def D not { /E exch def /D true def } { pop } ifelse } ifelse } for L } for 10{pop}repeat } bind def /bps 8 string def /bpm [8 0 0 8 0 0] def /bpp { bps } def /overlaybackpat { userdict /BeachHead get begin gsave setrgbcolor bps copy pop dup 0 get 8 div floor cvi 8 mul 1 index 2 get 8 div floor cvi 8 mul 2 index 1 get 8 div floor cvi 8 mul 8 4 index 3 get 8 div floor cvi 8 mul { 2 index 8 3 index { 1 index gsave translate 8 8 scale 8 8 false bpm /bpp load imagemask grestore } for pop } for pop pop pop grestore end } bind def /U { userdict /BeachHead get begin /V exch def /W exch def countdictstack save V 2 add 2 roll count V sub /X exch def /W load end { exec } stopped userdict /BeachHead get begin /Y exch def count X sub { pop } repeat Y 3 1 roll restore countdictstack exch sub { end } repeat end } bind def /Z ( ) def /aa { moveto { ba setfont Z end gsave 0 setgray stringwidth grestore userdict /BeachHead get begin rmoveto /ca load null ne { /da da 1 add def da ea length 1 sub le { fa ea da get ca } if } { ax ay rmoveto fa ga eq { cx cy rmoveto } if } ifelse } stopped currentdict userdict /BeachHead get ne { userdict /BeachHead get begin }if } bind def /filltextpath2 { userdict /BeachHead get begin /p exch def /s exch def /ea exch def /fillProc exch def /ia exch def currentpoint ia i and { ea s p krnshow } if moveto i /i false def currentpoint /m 1 string def /ya 0 def /t 0 def /za 0 def ea { m 0 3 -1 roll put newpath t za moveto m true charpath fillProc t s ya get add /t exch def ya 1 add /ya exch def za s ya get add /za exch def ya 1 add /ya exch def } forall moveto /i exch def ia { n i /n false def /i false def ea s p krnshow /i exch def /n exch def } if end } bind def /filltextpath { userdict /BeachHead get begin /ea exch def dup type dup /integertype eq exch /realtype eq or { /ay exch def /ax exch def /ga exch def /cy exch def /cx exch def /ca null def } { /wa 0 def /ca exch def } ifelse /ha exch def /ia exch def ia { i get { gsave 0 setgray /ca load null ne { /ca load ea kshow /wa 0 def } { cx cy ga ax ay ea awidthshow } ifelse grestore } if } if gsave currentfont ia { begin r FontMatrix makefont l FontMatrix makefont end } { null exch } ifelse /ja exch def /ka exch def /ba currentfont def _doTexturePat { systemdict /makepattern known } { false }ifelse { matrix currentmatrix _strtxtmatrix null ne { _strtxtmatrix setmatrix } if 1 -1 scale txTrnsX txTrnsY translate settexturepat setmatrix /da 0 def ea { /fa exch def Z 0 fa put ja setfont currentpoint Z show aa {exit} if } forall } { 10 setlinewidth /da 0 def currentpoint newpath 0 dup dup dup moveto lineto closepath moveto ea { /fa exch def Z 0 fa put currentpoint ja setfont count 1 add dup 1 roll Z true { charpath } stopped count count -1 roll sub { pop } repeat currentpoint {ha} 0 U pop newpath 0 dup dup dup moveto lineto closepath moveto aa {exit} if } forall } ifelse grestore ka null ne { /wa 0 def gsave 0 setgray /da 0 def ea { /fa exch def Z 0 fa put ka setfont currentpoint Z show aa {exit} if } forall grestore } if /_doTexturePat false def /_strtxtmatrix null def end } bind def /reversecolor { 1 currentrgbcolor 1 index eq 3 1 roll eq and { currentgray sub } if setgray } bind def /ftpkproc { pop Z 0 3 -1 roll put Z stringwidth neg exch neg exch rmoveto userdict /BeachHead get begin _cwidths wa get /wa wa 1 add def _cwidths wa get /wa wa 1 add def rmoveto end } bind def /xa { userdict /BeachHead get begin pop pop Z 0 3 -1 roll put currentpoint Z bhshow moveto _cwidths pa get /pa pa 1 add def _cwidths pa get /pa pa 1 add def rmoveto end } bind def /na[256{0}repeat]def mark 161 176 173 185 176 165 177 177 178 163 179 179 181 109 182 182 183 229 184 213 185 112 186 242 189 87 195 214 197 187 198 68 214 184 215 224 240 240 counttomark 2 div cvi {na 3 1 roll put} repeat pop /krnshow { dup type dup /integertype ne exch /realtype ne and {12} if /Symbol findfont exch scalefont /oa exch def /ua currentfont def /pa 0 def systemdict /cshow known currentfont /FontType get 0 eq and { /_cwidths exch def /xa load cshow } { exch userdict /BeachHead get begin h { /h false def gsave dup stringwidth pop (_) stringwidth pop div 1 scale currentpoint (_) show moveto grestore } if end { dup na exch get dup 0 eq isWinPS or { pop Z 0 3 -1 roll put currentpoint Z userdict begin bhshow end moveto } { oa setfont Z 0 3 -1 roll put currentpoint Z bhshow moveto ua setfont pop } ifelse dup pa get /pa pa 1 add def 1 index pa get /pa pa 1 add def rmoveto } forall pop } ifelse } bind def /setcmykcolor where { pop /bhsetcmykcolor/setcmykcolor load def } { /bhsetcmykcolor { 4 1 roll 3{ 3 index add neg 1 add dup 0 lt {pop 0}if 3 1 roll }repeat setrgbcolor pop }bind def }ifelse end %%EndProcSet %%BeginProcSet: gr_id 2 0 % gr_id - v2 - Copyright 1993 Silicon Beach Software, Inc. userdict /gr_id known not { userdict begin /gr_id 100 dict def /gr_idb {gr_id begin} bind def /gr_e {end end} bind def gr_idb /nulld { counttomark {null def} repeat pop } bind def mark /a /b /c /d /e /f /g /h /i /j /k /l /m /n /o /p /q /r /s /t /u /v /w /x /y /z /A /B /C /D /E /F /G /H /I /J /K /L /M nulld /bd {bind def} bind def /g_ea [] def /g_mg 60 def /g_xg 250 def /setcmykcolor where { pop /bhsetcmykcolor/setcmykcolor load def } { /bhsetcmykcolor { 4 1 roll 3{ 3 index add neg 1 add dup 0 lt {pop 0}if 3 1 roll }repeat setrgbcolor pop }bind def }ifelse /g_ss { currentscreen /scrnproc exch def /scrnangle exch def /scrnfreq exch def /scrnproc load type dup /arraytype eq exch /packedarraytype eq or { /g_ng 72 scrnfreq div dup matrix defaultmatrix dtransform mul abs def g_ng g_mg lt { /scrnfreq scrnfreq g_mg g_ng div sqrt div def scrnfreq scrnangle /scrnproc load setscreen /g_ng g_mg def } if g_ng g_xg gt { /g_ng g_xg def } if } { /g_ng g_xg def } ifelse g_ea 0 setdash } bd /g_lf { gsave /noeoclip exch def dup /y1b exch def /y2b exch def dup /x2t exch def /x2b exch def dup /y1t exch def /y2t exch def dup /x1t exch def /x1b exch def /filloff exch def /filldir exch def /colorlist exch def noeoclip { clip } { eoclip } ifelse newpath g_ss filldir 0 eq { filloff 0 lt { x1t filloff add /x1t exch def x2b filloff sub /x2b exch def } { x1b filloff sub /x1b exch def x2t filloff add /x2t exch def } ifelse /x1start x1t def /y1start y1t def /x2start x1b def /y2start y1b def /xdist x2t x1t sub def /ydist 0 def } { filloff 0 lt { y2t filloff add /y2t exch def y1b filloff sub /y1b exch def } { y1t filloff sub /y1t exch def y2b filloff add /y2b exch def } ifelse /x1start x1t def /y1start y1t def /x2start x2t def /y2start y2t def /xdist 0 def /ydist y1b y1t sub def } ifelse colorlist { /colorrec exch def colorrec 0 get /cmykStart exch def colorrec 1 get /cmykEnd exch def colorrec 2 get /ramppercent exch def /cStart cmykStart 0 get def /mStart cmykStart 1 get def /yStart cmykStart 2 get def /kStart cmykStart 3 get def /cInc cmykEnd 0 get cStart sub g_ng div def /mInc cmykEnd 1 get mStart sub g_ng div def /yInc cmykEnd 2 get yStart sub g_ng div def /kInc cmykEnd 3 get kStart sub g_ng div def /xinc xdist ramppercent mul g_ng div def /yinc ydist ramppercent mul g_ng div def xinc yinc gt {xinc}{yinc}ifelse setlinewidth newpath 0 1 g_ng { pop cStart mStart yStart kStart bhsetcmykcolor newpath x1start y1start moveto x2start y2start lineto stroke cStart cInc add /cStart exch def mStart mInc add /mStart exch def yStart yInc add /yStart exch def kStart kInc add /kStart exch def x1start xinc add /x1start exch def y1start yinc add /y1start exch def x2start xinc add /x2start exch def y2start yinc add /y2start exch def } for } forall grestore } bd /g_bf { true g_f } bd /g_cf { false g_f } bd /g_f { gsave /doBoxFill exch def /noeoclip exch def /y2 exch def /x2 exch def /y1 exch def /x1 exch def /yoff exch def /xoff exch def /colorlist exch def noeoclip { clip } { eoclip } ifelse newpath g_ss /centerX x2 x1 add 2 div xoff add def /centerY y2 y1 add 2 div yoff add def /boxRadX centerX dup x1 exch sub abs exch x2 exch sub abs 2 copy lt {exch} if pop def /boxRadY centerY dup y1 exch sub abs exch y2 exch sub abs 2 copy lt {exch} if pop def centerX dup boxRadX sub /x1 exch def boxRadX add /x2 exch def centerY dup boxRadY sub /y1 exch def boxRadY add /y2 exch def colorlist { /colorrec exch def colorrec 0 get /cmykStart exch def colorrec 1 get /cmykEnd exch def colorrec 2 get /ramppercent exch def /cStart cmykStart 0 get def /mStart cmykStart 1 get def /yStart cmykStart 2 get def /kStart cmykStart 3 get def /cInc cmykEnd 0 get cStart sub g_ng div def /mInc cmykEnd 1 get mStart sub g_ng div def /yInc cmykEnd 2 get yStart sub g_ng div def /kInc cmykEnd 3 get kStart sub g_ng div def /brwidthY boxRadY ramppercent mul g_ng div def /brwidthX boxRadX ramppercent mul g_ng div def 0 1 g_ng { pop cStart mStart yStart kStart bhsetcmykcolor doBoxFill { newpath x1 y1 moveto x2 y1 lineto x2 y2 lineto x1 y2 lineto closepath fill } { gsave newpath centerX centerY translate x2 centerX sub y2 centerY sub scale 0 0 1.4142 0 360 arc fill grestore } ifelse cStart cInc add /cStart exch def mStart mInc add /mStart exch def yStart yInc add /yStart exch def kStart kInc add /kStart exch def x1 brwidthX add /x1 exch def y1 brwidthY add /y1 exch def x2 brwidthX sub /x2 exch def y2 brwidthY sub /y2 exch def } for } forall grestore } bd /g_cvf { gsave /noeoclip exch def pop pop pop pop pop /dist exch def /colorlist exch def noeoclip { clip } { eoclip } ifelse g_ss g_c dist mul 72 div dup g_ng gt {pop}{/g_ng exch def} ifelse /g_ng g_ng round def /lwidth dist 2 mul def colorlist length 1 sub -1 0 { colorlist exch get /colorrec exch def colorrec 0 get /cmykEnd exch def colorrec 1 get /cmykStart exch def colorrec 2 get /ramppercent exch def /cStart cmykStart 0 get def /mStart cmykStart 1 get def /yStart cmykStart 2 get def /kStart cmykStart 3 get def /cInc cmykEnd 0 get cStart sub g_ng div def /mInc cmykEnd 1 get mStart sub g_ng div def /yInc cmykEnd 2 get yStart sub g_ng div def /kInc cmykEnd 3 get kStart sub g_ng div def /ldec dist ramppercent mul g_ng div 2 mul def 0 1 g_ng { pop cStart mStart yStart kStart bhsetcmykcolor lwidth setlinewidth gsave firstfill {fill /firstfill false def}{stroke} ifelse grestore cStart cInc add /cStart exch def mStart mInc add /mStart exch def yStart yInc add /yStart exch def kStart kInc add /kStart exch def /lwidth lwidth ldec sub def lwidth 0.001 le { /lwidth 0.001 def } if } for } for grestore } bd gr_e } if %%EndProcSet BeachHead begin/isWinPS false def end 1 setflat gsave newpath [1 0 0 -1 311.731 382.302] concat -100.864 -50.7439 moveto -100.864 -61.9913 lineto -130.865 -61.9913 lineto -130.865 -76.9656 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -100.864 -47.1078 moveto -97.7741 -54.8347 lineto -99.1074 -55.1982 -100.138 -55.3799 -100.864 -55.3799 curveto -101.591 -55.3799 -102.621 -55.1982 -103.955 -54.8347 curveto -100.864 -47.1078 lineto -100.864 -47.1078 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -178.38 -365.522 moveto -188.679 -365.522 lineto -188.679 48.4929 lineto -202.706 48.4929 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -174.743 -365.522 moveto -182.47 -368.612 lineto -182.834 -367.279 -183.016 -366.249 -183.016 -365.522 curveto -183.016 -364.795 -182.834 -363.765 -182.47 -362.432 curveto -174.743 -365.522 lineto -174.743 -365.522 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -266.48 -321.804 moveto -216.373 -321.804 lineto -216.373 -303.225 lineto -266.48 -303.225 lineto -266.48 -321.804 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 49.251 700.106] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Begin-Seq) [6.66 0 4.43 0 4.99 0 2.77 0 4.99 0 3.32 0 5.55 0 4.43 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -201.425 -335.015 moveto -201.425 -290.014 lineto -281.427 -290.014 lineto -281.427 -319.015 lineto -266.427 -335.015 lineto -201.425 -335.015 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 -274.741 moveto -241.426 -290.014 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 -271.104 moveto -238.336 -278.831 lineto -239.669 -279.195 -240.699 -279.377 -241.426 -279.377 curveto -242.153 -279.377 -243.183 -279.195 -244.516 -278.831 curveto -241.426 -271.104 lineto -241.426 -271.104 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 -338.742 moveto -241.426 -354.022 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 -335.106 moveto -238.336 -342.833 lineto -239.669 -343.197 -240.699 -343.378 -241.426 -343.378 curveto -242.153 -343.378 -243.183 -343.197 -244.516 -342.833 curveto -241.426 -335.106 lineto -241.426 -335.106 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -264.81 -376.811 moveto -218.042 -376.811 lineto -218.042 -358.232 lineto -264.81 -358.232 lineto -264.81 -376.811 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 50.92 755.113] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Evaluator) [6.10 0 4.99 0 4.43 0 2.77 0 4.99 0 4.43 0 2.77 0 4.99 0 3.32 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 -354.022 moveto -229.966 -354.022 -220.184 -355.34 -212.081 -357.976 curveto -203.977 -360.612 -199.926 -363.794 -199.926 -367.522 curveto -199.926 -371.25 -203.977 -374.432 -212.081 -377.068 curveto -220.184 -379.704 -229.966 -381.022 -241.426 -381.022 curveto -252.886 -381.022 -262.668 -379.704 -270.772 -377.068 curveto -278.875 -374.432 -282.927 -371.25 -282.927 -367.522 curveto -282.927 -363.794 -278.875 -360.612 -270.772 -357.976 curveto -262.668 -355.34 -252.886 -354.022 -241.426 -354.022 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -280.427 -271.013 moveto -240.426 -232.012 lineto -202.425 -271.013 lineto -280.427 -271.013 lineto closepath userdict begin BeachHead end begin 0 0 0 0 bhsetcmykcolor end gsave eofill grestore userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.328 -93.9026 moveto -240.926 -109.017 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.423 -90.3153 moveto -238.128 -97.9574 lineto -239.452 -98.3562 -240.476 -98.5652 -241.203 -98.5845 curveto -241.93 -98.6039 -242.964 -98.4496 -244.307 -98.1217 curveto -241.423 -90.3153 lineto -241.423 -90.3153 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -240.926 -157.745 moveto -240.926 -167.227 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -240.926 -154.108 moveto -237.835 -161.835 lineto -239.169 -162.199 -240.199 -162.381 -240.926 -162.381 curveto -241.652 -162.381 -242.682 -162.199 -244.016 -161.835 curveto -240.926 -154.108 lineto -240.926 -154.108 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -42.4263 251.414 moveto -42.5183 240.997 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -42.3943 255.034 moveto -39.3723 247.28 lineto -40.7087 246.928 -41.7404 246.756 -42.4673 246.762 curveto -43.1942 246.768 -44.2226 246.959 -45.5527 247.334 curveto -42.3943 255.034 lineto -42.3943 255.034 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -24.7214 -271.027 moveto -24.5183 -282.219 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -24.7868 -267.425 moveto -21.5568 -275.094 lineto -22.8833 -275.482 -23.9099 -275.682 -24.6367 -275.695 curveto -25.3634 -275.709 -26.3967 -275.546 -27.7364 -275.206 curveto -24.7868 -267.425 lineto -24.7868 -267.425 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 11.1391 -294.879 moveto 20.7152 -294.514 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 7.57266 -295.015 moveto 15.1762 -291.633 lineto 15.5902 -292.951 15.8111 -293.974 15.8388 -294.7 curveto 15.8665 -295.426 15.7242 -296.463 15.4118 -297.809 curveto 7.57266 -295.015 lineto 7.57266 -295.015 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 243.44 -42.5109 moveto 252.994 -42.5109 lineto 252.994 -98.0081 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 239.804 -42.5109 moveto 247.531 -39.4205 lineto 247.894 -40.7539 248.076 -41.784 248.076 -42.5109 curveto 248.076 -43.2377 247.894 -44.2678 247.531 -45.6012 curveto 239.804 -42.5109 lineto 239.804 -42.5109 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 253.715 -147.736 moveto 253.715 -208.511 lineto 238.213 -208.511 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 253.715 -144.1 moveto 256.805 -151.827 lineto 255.472 -152.191 254.442 -152.372 253.715 -152.372 curveto 252.988 -152.372 251.958 -152.191 250.625 -151.827 curveto 253.715 -144.1 lineto 253.715 -144.1 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 182.299 moveto 199.712 151.995 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 185.935 moveto 202.802 178.208 lineto 201.469 177.845 200.439 177.663 199.712 177.663 curveto 198.985 177.663 197.955 177.845 196.622 178.208 curveto 199.712 185.935 lineto 199.712 185.935 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 103.267 moveto 199.712 79.9974 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 106.903 moveto 202.802 99.176 lineto 201.469 98.8126 200.439 98.6309 199.712 98.6309 curveto 198.985 98.6309 197.955 98.8126 196.622 99.176 curveto 199.712 106.903 lineto 199.712 106.903 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 -0.731934 moveto 199.712 -20.0103 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 2.90417 moveto 202.802 -4.8228 lineto 201.469 -5.18625 200.439 -5.36798 199.712 -5.36798 curveto 198.985 -5.36798 197.955 -5.18625 196.622 -4.8228 curveto 199.712 2.90417 lineto 199.712 2.90417 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 -68.7383 moveto 199.712 -170.01 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 -65.1022 moveto 202.802 -72.8292 lineto 201.469 -73.1927 200.439 -73.3744 199.712 -73.3744 curveto 198.985 -73.3744 197.955 -73.1927 196.622 -72.8292 curveto 199.712 -65.1022 lineto 199.712 -65.1022 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 -250.74 moveto 199.712 -275.501 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 -247.103 moveto 202.802 -254.83 lineto 201.469 -255.194 200.439 -255.376 199.712 -255.376 curveto 198.985 -255.376 197.955 -255.194 196.622 -254.83 curveto 199.712 -247.103 lineto 199.712 -247.103 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 -324.229 moveto 199.712 -340.982 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 -320.592 moveto 202.802 -328.319 lineto 201.469 -328.683 200.439 -328.865 199.712 -328.865 curveto 198.985 -328.865 197.955 -328.683 196.622 -328.319 curveto 199.712 -320.592 lineto 199.712 -320.592 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 137.99 284.877 moveto 137.99 259.491 lineto 97.7176 259.491 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 137.99 288.513 moveto 141.08 280.786 lineto 139.747 280.423 138.717 280.241 137.99 280.241 curveto 137.263 280.241 136.233 280.423 134.9 280.786 curveto 137.99 288.513 lineto 137.99 288.513 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -42.5185 301.277 moveto -42.5185 284.996 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -42.5185 304.913 moveto -39.4282 297.186 lineto -40.7616 296.823 -41.7916 296.641 -42.5185 296.641 curveto -43.2454 296.641 -44.2755 296.823 -45.6089 297.186 curveto -42.5185 304.913 lineto -42.5185 304.913 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -42.5183 192.269 moveto -42.5183 180.994 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -42.5183 195.905 moveto -39.4279 188.178 lineto -40.7613 187.815 -41.7914 187.633 -42.5183 187.633 curveto -43.2451 187.633 -44.2752 187.815 -45.6086 188.178 curveto -42.5183 195.905 lineto -42.5183 195.905 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 1.13129 166.65 moveto 20.7152 167.492 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -2.42651 166.497 moveto 5.16074 169.917 lineto 5.58109 168.6 5.80684 167.579 5.83801 166.852 curveto 5.86919 166.126 5.73183 165.089 5.42593 163.742 curveto -2.42651 166.497 lineto -2.42651 166.497 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 307.802 moveto 59.2164 297.993 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 311.438 moveto 62.3067 303.711 lineto 60.9734 303.347 59.9433 303.166 59.2164 303.166 curveto 58.4895 303.166 57.4594 303.347 56.1261 303.711 curveto 59.2164 311.438 lineto 59.2164 311.438 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 217.263 moveto 59.2164 205.993 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 220.899 moveto 62.3067 213.172 lineto 60.9734 212.809 59.9433 212.627 59.2164 212.627 curveto 58.4895 212.627 57.4594 212.809 56.1261 213.172 curveto 59.2164 220.899 lineto 59.2164 220.899 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 125.264 moveto 59.2164 109.035 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 128.9 moveto 62.3067 121.173 lineto 60.9734 120.809 59.9433 120.628 59.2164 120.628 curveto 58.4895 120.628 57.4594 120.809 56.1261 121.173 curveto 59.2164 128.9 lineto 59.2164 128.9 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2158 13.2688 moveto 59.2174 -1.69414 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2155 16.9047 moveto 62.3065 9.17804 lineto 60.9732 8.81447 59.9431 8.63264 59.2162 8.63258 curveto 58.4893 8.63252 57.4592 8.81415 56.1258 9.17746 curveto 59.2155 16.9047 lineto 59.2155 16.9047 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -49.7378 moveto 59.2164 -63.0069 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -46.1017 moveto 62.3067 -53.8287 lineto 60.9734 -54.1921 59.9433 -54.3738 59.2164 -54.3738 curveto 58.4895 -54.3738 57.4594 -54.1921 56.1261 -53.8287 curveto 59.2164 -46.1017 lineto 59.2164 -46.1017 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -143.736 moveto 59.2164 -156.014 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -140.1 moveto 62.3067 -147.827 lineto 60.9734 -148.19 59.9433 -148.372 59.2164 -148.372 curveto 58.4895 -148.372 57.4594 -148.19 56.1261 -147.827 curveto 59.2164 -140.1 lineto 59.2164 -140.1 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -204.742 moveto 59.2164 -215.017 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -201.106 moveto 62.3067 -208.833 lineto 60.9734 -209.197 59.9433 -209.378 59.2164 -209.378 curveto 58.4895 -209.378 57.4594 -209.197 56.1261 -208.833 curveto 59.2164 -201.106 lineto 59.2164 -201.106 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -245.745 moveto 59.2164 -256.013 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -242.109 moveto 62.3067 -249.836 lineto 60.9734 -250.199 59.9433 -250.381 59.2164 -250.381 curveto 58.4895 -250.381 57.4594 -250.199 56.1261 -249.836 curveto 59.2164 -242.109 lineto 59.2164 -242.109 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -336.742 moveto 59.2164 -346.917 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2164 -333.106 moveto 62.3067 -340.833 lineto 60.9734 -341.196 59.9433 -341.378 59.2164 -341.378 curveto 58.4895 -341.378 57.4594 -341.196 56.1261 -340.833 curveto 59.2164 -333.106 lineto 59.2164 -333.106 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -100.864 54.267 moveto -100.864 40.9934 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -100.864 57.9031 moveto -97.7741 50.1762 lineto -99.1074 49.8127 -100.138 49.631 -100.864 49.631 curveto -101.591 49.631 -102.621 49.8127 -103.955 50.1762 curveto -100.864 57.9031 lineto -100.864 57.9031 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -100.864 -7.73497 moveto -100.864 -20.0162 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -100.864 -4.09886 moveto -97.7741 -11.8258 lineto -99.1074 -12.1893 -100.138 -12.371 -100.864 -12.371 curveto -101.591 -12.371 -102.621 -12.1893 -103.955 -11.8258 curveto -100.864 -4.09886 lineto -100.864 -4.09886 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.865 -107.693 moveto -130.864 -163.01 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.865 -104.057 moveto -127.774 -111.784 lineto -129.108 -112.148 -130.138 -112.329 -130.865 -112.329 curveto -131.592 -112.329 -132.622 -112.148 -133.955 -111.784 curveto -130.865 -104.057 lineto -130.865 -104.057 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.864 -243.74 moveto -130.864 -254.47 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.864 -240.104 moveto -127.774 -247.831 lineto -129.107 -248.194 -130.138 -248.376 -130.864 -248.376 curveto -131.591 -248.376 -132.621 -248.194 -133.955 -247.831 curveto -130.864 -240.104 lineto -130.864 -240.104 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.864 -285.198 moveto -130.864 -308.015 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.864 -281.562 moveto -127.774 -289.289 lineto -129.107 -289.652 -130.138 -289.834 -130.864 -289.834 curveto -131.591 -289.834 -132.621 -289.652 -133.955 -289.289 curveto -130.864 -281.562 lineto -130.864 -281.562 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.864 -340.742 moveto -130.864 -352.021 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.864 -337.106 moveto -127.774 -344.833 lineto -129.107 -345.197 -130.138 -345.378 -130.864 -345.378 curveto -131.591 -345.378 -132.621 -345.197 -133.955 -344.833 curveto -130.864 -337.106 lineto -130.864 -337.106 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 281.254 moveto -241.425 262.981 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 284.89 moveto -238.335 277.163 lineto -239.668 276.799 -240.699 276.618 -241.425 276.618 curveto -242.152 276.618 -243.182 276.799 -244.516 277.163 curveto -241.426 284.89 lineto -241.426 284.89 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 214.253 moveto -241.426 202.998 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 217.889 moveto -238.335 210.162 lineto -239.669 209.799 -240.699 209.617 -241.426 209.617 curveto -242.152 209.617 -243.182 209.799 -244.516 210.162 curveto -241.426 217.889 lineto -241.426 217.889 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 154.269 moveto -241.426 134.99 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 157.905 moveto -238.335 150.178 lineto -239.669 149.815 -240.699 149.633 -241.426 149.633 curveto -242.152 149.633 -243.182 149.815 -244.516 150.178 curveto -241.426 157.905 lineto -241.426 157.905 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.568 104.301 moveto -241.207 86.9941 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.643 107.898 moveto -238.392 100.237 lineto -239.718 99.8463 -240.744 99.6431 -241.471 99.628 curveto -242.197 99.6128 -243.231 99.7731 -244.572 100.109 curveto -241.643 107.898 lineto -241.643 107.898 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 9.75002 moveto -241.425 -3.01331 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 13.386 moveto -238.335 5.65927 lineto -239.669 5.2957 -240.699 5.11388 -241.426 5.11382 curveto -242.152 5.11375 -243.183 5.29538 -244.516 5.65869 curveto -241.426 13.386 lineto -241.426 13.386 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.425 -51.741 moveto -241.427 -63.2238 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.424 -48.1052 moveto -238.335 -55.8326 lineto -239.669 -56.1959 -240.699 -56.3774 -241.426 -56.3773 curveto -242.152 -56.3772 -243.183 -56.1954 -244.516 -55.8317 curveto -241.424 -48.1052 lineto -241.424 -48.1052 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -81.5197 305.004 moveto -41.5185 344.005 lineto -3.51733 305.004 lineto -81.5197 305.004 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 20.2152 16.9956 moveto 60.2164 55.9968 lineto 98.2176 16.9956 lineto 20.2152 16.9956 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -114.018 -136.009 moveto -74.0164 -97.008 lineto -36.0153 -136.009 lineto -114.018 -136.009 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 289.995 -144.009 moveto 289.995 -99.0081 lineto 209.992 -99.0081 lineto 209.992 -128.009 lineto 224.993 -144.009 lineto 289.995 -144.009 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -266.539 -190.017 moveto -215.312 -190.017 lineto -215.312 -171.438 lineto -266.539 -171.438 lineto -266.539 -190.017 lineto closepath grestore gsave gsave %IncludeFont: Times-Bold userdict begin BeachHead end begin [1 0 0 -1 49.1919 568.319] concat /Times-Bold findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Begin-Seq) [6.66 0 4.43 0 4.99 0 2.77 0 5.55 0 3.32 0 5.55 0 4.43 0 5.55 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -240.926 -167.227 moveto -229.466 -167.227 -219.684 -168.545 -211.58 -171.181 curveto -203.477 -173.817 -199.425 -176.999 -199.425 -180.727 curveto -199.425 -184.455 -203.477 -187.637 -211.58 -190.273 curveto -219.684 -192.909 -229.466 -194.227 -240.926 -194.227 curveto -252.386 -194.227 -262.167 -192.909 -270.271 -190.273 curveto -278.374 -187.637 -282.426 -184.455 -282.426 -180.727 curveto -282.426 -176.999 -278.374 -173.817 -270.271 -171.181 curveto -262.167 -168.545 -252.386 -167.227 -240.926 -167.227 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 2 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -279.427 47.9929 moveto -241.426 86.9941 lineto -202.425 47.9929 lineto -240.426 9.99176 lineto -279.427 47.9929 lineto closepath userdict begin BeachHead end begin 0 0 0 0 bhsetcmykcolor end gsave eofill grestore userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -269.104 34.2235 moveto -212.748 34.2235 lineto -212.748 62.7624 lineto -269.104 62.7624 lineto -269.104 34.2235 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 46.6268 344.078] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 4.98225 8.13782 moveto [1 0 0 -1 0 0] concat (Last expr) [6.10 0 4.43 0 3.88 0 2.77 0 3.50 0 4.43 0 4.99 0 4.99 0 3.32 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 46.6268 344.078] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 18.0976 moveto [1 0 0 -1 0 0] concat (or tailform?) [4.99 0 3.32 0 3.50 0 2.77 0 4.43 0 2.77 0 2.77 0 3.32 0 4.99 0 3.32 0 7.77 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -281.005 -24.5234 moveto -293.005 -24.5234 lineto -293.005 351.477 lineto -241.005 351.477 lineto -241.005 329.477 lineto newpath -284.731 -24.5234 moveto -293.005 -24.5234 lineto -293.005 351.477 lineto -241.005 351.477 lineto -241.005 329.477 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -281.095 -24.5234 moveto -288.822 -27.6138 lineto -289.186 -26.2804 -289.368 -25.2503 -289.368 -24.5234 curveto -289.368 -23.7966 -289.186 -22.7665 -288.822 -21.4331 curveto -281.095 -24.5234 lineto -281.095 -24.5234 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -238.425 80.4929 moveto -223.219 80.4929 lineto -223.219 99.072 lineto -238.425 99.072 lineto -238.425 80.4929 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 77.3052 297.809] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (N) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -173.078 -374.811 moveto -88.6505 -374.811 lineto -88.6505 -356.232 lineto -173.078 -356.232 lineto -173.078 -374.811 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 142.652 753.113] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Tail-Eval-Dispatch) [6.10 0 4.43 0 2.77 0 2.77 0 3.32 0 6.10 0 4.99 0 4.43 0 2.77 0 3.32 0 7.21 0 2.77 0 3.88 0 4.99 0 4.43 0 2.77 0 4.43 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -174.653 -379.022 moveto -87.0764 -379.022 lineto -87.0764 -352.021 lineto -174.653 -352.021 lineto -174.653 -379.022 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.865 -352.021 moveto -119.405 -352.021 -109.623 -353.34 -101.519 -355.976 curveto -93.4156 -358.611 -89.3639 -361.794 -89.3639 -365.522 curveto -89.3639 -369.25 -93.4156 -372.432 -101.519 -375.068 curveto -109.623 -377.704 -119.405 -379.022 -130.865 -379.022 curveto -142.324 -379.022 -152.106 -377.704 -160.21 -375.068 curveto -168.313 -372.432 -172.365 -369.25 -172.365 -365.522 curveto -172.365 -361.794 -168.313 -358.611 -160.21 -355.976 curveto -152.106 -353.34 -142.324 -352.021 -130.865 -352.021 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -170.865 -337.015 moveto -90.864 -337.015 lineto -90.864 -308.015 lineto -170.865 -308.015 lineto -170.865 -337.015 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -170.865 -337.015 moveto -90.864 -337.015 lineto -90.864 -308.015 lineto -170.865 -308.015 lineto -170.865 -337.015 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -161.012 -331.805 moveto -100.717 -331.805 lineto -100.717 -313.226 lineto -161.012 -313.226 lineto -161.012 -331.805 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 154.719 710.106] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Tailcall) [6.10 0 4.43 0 2.77 0 2.77 0 4.43 0 4.43 0 2.77 0 2.77 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 154.719 710.106] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 30.4533 8.13782 moveto [1 0 0 -1 0 0] concat ( ) [3.50 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Symbol userdict begin BeachHead end begin [1 0 0 -1 154.719 710.106] concat /Symbol findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 33.9532 8.13782 moveto [1 0 0 -1 0 0] concat (\254) [9.85 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 154.719 710.106] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 43.8078 8.13782 moveto [1 0 0 -1 0 0] concat ( ) [3.50 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 154.719 710.106] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 47.3077 8.13782 moveto [1 0 0 -1 0 0] concat (1) [4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.865 -254.47 moveto -119.405 -254.47 -109.623 -255.788 -101.519 -258.424 curveto -93.4156 -261.06 -89.3639 -264.242 -89.3639 -267.97 curveto -89.3639 -271.698 -93.4156 -274.88 -101.519 -277.516 curveto -109.623 -280.152 -119.405 -281.47 -130.865 -281.47 curveto -142.324 -281.47 -152.106 -280.152 -160.21 -277.516 curveto -168.313 -274.88 -172.365 -271.698 -172.365 -267.97 curveto -172.365 -264.242 -168.313 -261.06 -160.21 -258.424 curveto -152.106 -255.788 -142.324 -254.47 -130.865 -254.47 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 2 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -165.063 -277.26 moveto -96.666 -277.26 lineto -96.666 -258.681 lineto -165.063 -258.681 lineto -165.063 -277.26 lineto closepath grestore gsave gsave %IncludeFont: Times-Bold userdict begin BeachHead end begin [1 0 0 -1 150.668 655.562] concat /Times-Bold findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Eval-Dispatch) [6.66 0 4.99 0 4.99 0 2.77 0 3.32 0 7.21 0 2.77 0 3.88 0 5.55 0 4.99 0 3.32 0 4.43 0 5.55 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -172.365 -281.47 moveto -89.3637 -281.47 lineto -89.3637 -254.47 lineto -172.365 -254.47 lineto -172.365 -281.47 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -151.48 -220.761 moveto -110.249 -220.761 lineto -110.249 -182.262 lineto -151.48 -182.262 lineto -151.48 -220.761 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 164.25 599.063] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 3.32817 8.13782 moveto [1 0 0 -1 0 0] concat (Literal) [6.10 0 2.77 0 2.77 0 4.43 0 3.32 0 4.43 0 2.77 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 164.25 599.063] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 18.0976 moveto [1 0 0 -1 0 0] concat (constant) [4.43 0 4.99 0 4.99 0 3.88 0 2.77 0 4.43 0 4.99 0 2.77 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 164.25 599.063] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 2.1329 28.0574 moveto [1 0 0 -1 0 0] concat (or var?) [4.99 0 3.32 0 3.50 0 4.99 0 4.43 0 3.32 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -169.366 -240.013 moveto -92.3632 -240.013 lineto -92.3632 -163.01 lineto -169.366 -163.01 lineto -169.366 -240.013 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -169.366 -202.012 moveto -131.364 -163.01 lineto -92.3632 -202.012 lineto -130.364 -240.013 lineto -169.366 -202.012 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -165.608 -99.7554 moveto -96.1218 -99.7554 lineto -96.1218 -81.1763 lineto -165.608 -81.1763 lineto -165.608 -99.7554 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 150.122 478.057] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Ev-Application) [6.10 0 4.99 0 3.32 0 7.21 0 4.99 0 4.99 0 2.77 0 2.77 0 4.43 0 4.43 0 2.77 0 2.77 0 4.99 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -172.366 -103.966 moveto -89.3643 -103.966 lineto -89.3643 -76.9656 lineto -172.366 -76.9656 lineto -172.366 -103.966 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -130.865 -76.9656 moveto -119.405 -76.9656 -109.623 -78.2838 -101.52 -80.9197 curveto -93.4162 -83.5555 -89.3645 -86.7378 -89.3645 -90.4657 curveto -89.3645 -94.1936 -93.4162 -97.3759 -101.52 -100.012 curveto -109.623 -102.648 -119.405 -103.966 -130.865 -103.966 curveto -142.325 -103.966 -152.107 -102.648 -160.21 -100.012 curveto -168.314 -97.3759 -172.366 -94.1936 -172.366 -90.4657 curveto -172.366 -86.7378 -168.314 -83.5555 -160.21 -80.9197 curveto -152.107 -78.2838 -142.325 -76.9656 -130.865 -76.9656 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -100.865 -20.0162 moveto -89.4046 -20.0162 -79.6227 -21.3344 -71.5191 -23.9703 curveto -63.4156 -26.6062 -59.3639 -29.7884 -59.3639 -33.5163 curveto -59.3639 -37.2442 -63.4156 -40.4265 -71.5191 -43.0624 curveto -79.6227 -45.6983 -89.4046 -47.0165 -100.865 -47.0165 curveto -112.324 -47.0165 -122.106 -45.6983 -130.21 -43.0624 curveto -138.313 -40.4265 -142.365 -37.2442 -142.365 -33.5163 curveto -142.365 -29.7884 -138.313 -26.6062 -130.21 -23.9703 curveto -122.106 -21.3344 -112.324 -20.0162 -100.865 -20.0162 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -135.523 -42.8061 moveto -66.2063 -42.8061 lineto -66.2063 -24.227 lineto -135.523 -24.227 lineto -135.523 -42.8061 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 180.208 421.108] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Eval-Arg-Loop) [6.10 0 4.99 0 4.43 0 2.77 0 3.32 0 7.21 0 3.15 0 4.99 0 3.32 0 6.10 0 4.99 0 4.99 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -60.8632 -4.00801 moveto -60.8632 40.9934 lineto -140.866 40.9934 lineto -140.866 11.9925 lineto -125.865 -4.00801 lineto -60.8632 -4.00801 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -133.389 9.20314 moveto -68.3403 9.20314 lineto -68.3403 27.7822 lineto -133.389 27.7822 lineto -133.389 9.20314 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 182.342 369.099] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Eval-Dispatch) [6.10 0 4.99 0 4.43 0 2.77 0 3.32 0 7.21 0 2.77 0 3.88 0 4.99 0 4.43 0 2.77 0 4.43 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -139.366 95.9951 moveto -101.364 134.996 lineto -62.3632 95.9951 lineto -100.364 57.994 lineto -139.366 95.9951 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -115.668 82.2257 moveto -86.0603 82.2257 lineto -86.0603 110.765 lineto -115.668 110.765 lineto -115.668 82.2257 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 200.062 296.076] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (More) [8.88 0 4.99 0 3.32 0 4.43 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 200.062 296.076] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.369797 18.0976 moveto [1 0 0 -1 0 0] concat (args?) [4.43 0 3.15 0 4.99 0 3.88 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -207.856 48.5023 moveto -192.65 48.5023 lineto -192.65 67.0814 lineto -207.856 67.0814 lineto -207.856 48.5023 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 107.875 329.8] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Y) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -140.855 -35.5017 moveto -158.855 -35.5017 lineto -158.855 95.5023 lineto -138.855 95.5023 lineto newpath -144.582 -35.5017 moveto -158.855 -35.5017 lineto -158.855 95.5023 lineto -138.855 95.5023 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -140.945 -35.5017 moveto -148.672 -38.592 lineto -149.036 -37.2587 -149.218 -36.2286 -149.218 -35.5017 curveto -149.218 -34.7748 -149.036 -33.7447 -148.672 -32.4113 curveto -140.945 -35.5017 lineto -140.945 -35.5017 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -146.855 76.5017 moveto -131.649 76.5017 lineto -131.649 95.0808 lineto -146.855 95.0808 lineto -146.855 76.5017 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 168.876 301.8] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Y) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -150.854 -167.501 moveto -135.648 -167.501 lineto -135.648 -148.922 lineto -150.854 -148.922 lineto -150.854 -167.501 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 164.877 545.803] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (N) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -90.4452 -130.798 moveto -60.847 -130.798 lineto -60.847 -112.219 lineto -90.4452 -112.219 lineto -90.4452 -130.798 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 225.285 509.1] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (value) [4.99 0 4.43 0 2.77 0 4.99 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -114.018 -136.009 moveto -36.0153 -136.009 lineto -36.0153 -97.008 lineto -114.018 -97.008 lineto -114.018 -136.009 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -75.8547 -136.5 moveto -75.8547 -202.502 lineto -92.8552 -202.502 lineto newpath -75.8547 -140.227 moveto -75.8547 -202.502 lineto -92.8552 -202.502 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -75.8547 -136.591 moveto -72.7643 -144.318 lineto -74.0977 -144.682 -75.1278 -144.863 -75.8547 -144.863 curveto -76.5816 -144.863 -77.6116 -144.682 -78.945 -144.318 curveto -75.8547 -136.591 lineto -75.8547 -136.591 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -93.8552 -219.503 moveto -78.6492 -219.503 lineto -78.6492 -200.924 lineto -93.8552 -200.924 lineto -93.8552 -219.503 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 221.875 597.805] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Y) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 21.6898 -369.707 moveto 96.743 -369.707 lineto 96.743 -351.128 lineto 21.6898 -351.128 lineto 21.6898 -369.707 lineto closepath grestore gsave gsave %IncludeFont: Times-Bold userdict begin BeachHead end begin [1 0 0 -1 337.42 748.009] concat /Times-Bold findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Apply-Dispatch) [7.21 0 5.55 0 5.55 0 2.77 0 4.99 0 3.32 0 7.21 0 2.77 0 3.88 0 5.55 0 4.99 0 3.32 0 4.43 0 5.55 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 11.567 -373.918 moveto 106.866 -373.918 lineto 106.866 -346.917 lineto 11.567 -346.917 lineto 11.567 -373.918 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2169 -346.917 moveto 70.6769 -346.917 80.4588 -348.235 88.5623 -350.871 curveto 96.6658 -353.507 100.718 -356.689 100.718 -360.417 curveto 100.718 -364.145 96.6658 -367.327 88.5623 -369.963 curveto 80.4588 -372.599 70.6769 -373.917 59.2169 -373.917 curveto 47.757 -373.917 37.9751 -372.599 29.8716 -369.963 curveto 21.7681 -367.327 17.7164 -364.145 17.7164 -360.417 curveto 17.7164 -356.689 21.7681 -353.507 29.8716 -350.871 curveto 37.9751 -348.235 47.757 -346.917 59.2169 -346.917 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 2 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 20.7152 -295.014 moveto 58.7164 -256.013 lineto 97.7176 -295.014 lineto 59.7164 -333.015 lineto 20.7152 -295.014 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 39.9848 -303.804 moveto 78.448 -303.804 lineto 78.448 -285.224 lineto 39.9848 -285.224 lineto 39.9848 -303.804 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 355.715 682.105] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Macro?) [8.88 0 4.43 0 4.43 0 3.32 0 4.99 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 17.7157 -242.018 moveto 100.717 -242.018 lineto 100.717 -215.017 lineto 17.7157 -215.017 lineto 17.7157 -242.018 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2163 -215.017 moveto 70.6763 -215.017 80.4582 -216.335 88.5617 -218.971 curveto 96.6652 -221.607 100.717 -224.79 100.717 -228.517 curveto 100.717 -232.245 96.6652 -235.428 88.5617 -238.063 curveto 80.4582 -240.699 70.6763 -242.018 59.2163 -242.018 curveto 47.7564 -242.018 37.9744 -240.699 29.8709 -238.063 curveto 21.7674 -235.428 17.7157 -232.245 17.7157 -228.517 curveto 17.7157 -224.79 21.7674 -221.607 29.8709 -218.971 curveto 37.9744 -216.335 47.7564 -215.017 59.2163 -215.017 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 24.5734 -241.674 moveto 93.8594 -241.674 lineto 93.8594 -215.361 lineto 24.5734 -215.361 lineto 24.5734 -241.674 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 340.304 619.976] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 10.9888 8.13782 moveto [1 0 0 -1 0 0] concat (\(ap-dis-1\)) [3.32 0 4.43 0 4.99 0 3.32 0 4.99 0 2.77 0 3.88 0 3.32 0 4.99 0 3.32 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 340.304 619.976] concat /Times-Roman findbeachheadfont 7.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 16.6037 moveto [1 0 0 -1 0 0] concat (\(no such label really\)) [2.33 0 3.49 0 3.49 0 2.45 0 2.72 0 3.49 0 3.10 0 3.49 0 2.45 0 1.94 0 3.10 0 3.49 0 3.10 0 1.94 0 2.45 0 2.33 0 3.10 0 3.10 0 1.94 0 1.94 0 3.49 0 2.33 0 ] 7.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -57.9884 -267.334 moveto 8.41164 -267.334 lineto 8.41164 -245.734 lineto -57.9884 -245.734 lineto -57.9884 -267.334 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -24.7886 -245.734 moveto -15.6208 -245.734 -7.79543 -246.788 -1.31277 -248.897 curveto 5.16992 -251.005 8.41121 -253.551 8.41121 -256.534 curveto 8.41121 -259.516 5.16988 -262.062 -1.31277 -264.17 curveto -7.79547 -266.279 -15.6208 -267.333 -24.7886 -267.333 curveto -33.9564 -267.333 -41.7818 -266.279 -48.2645 -264.17 curveto -54.7471 -262.062 -57.9884 -259.516 -57.9884 -256.534 curveto -57.9884 -253.551 -54.7472 -251.005 -48.2645 -248.897 curveto -41.7818 -246.788 -33.9564 -245.734 -24.7886 -245.734 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -49.2523 -263.965 moveto -0.324463 -263.965 lineto -0.324463 -249.102 lineto -49.2523 -249.102 lineto -49.2523 -263.965 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [0.799988 0 0 -0.799988 265.678 643.067] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Macro-return) [8.88 0 4.43 0 4.43 0 3.32 0 4.99 0 3.32 0 3.32 0 4.43 0 2.77 0 4.99 0 3.32 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 19.2154 -201.015 moveto 99.2175 -201.015 lineto 99.2175 -156.014 lineto 19.2154 -156.014 lineto 19.2154 -201.015 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 27.0701 -192.784 moveto 91.3628 -192.784 lineto 91.3628 -164.245 lineto 27.0701 -164.245 lineto 27.0701 -192.784 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 342.801 571.086] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (get proc from) [4.99 0 4.43 0 2.77 0 3.50 0 4.99 0 3.32 0 4.99 0 4.43 0 3.50 0 3.32 0 3.32 0 4.99 0 7.77 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 342.801 571.086] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 7.2919 18.0976 moveto [1 0 0 -1 0 0] concat (name, etc.) [4.99 0 4.43 0 7.77 0 4.43 0 2.49 0 3.50 0 4.43 0 2.77 0 4.43 0 2.49 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 19.2154 -201.015 moveto 99.2175 -201.015 lineto 99.2175 -156.014 lineto 19.2154 -156.014 lineto 19.2154 -201.015 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 20.7152 -102.008 moveto 58.7164 -63.0069 lineto 97.7176 -102.008 lineto 59.7164 -140.009 lineto 20.7152 -102.008 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 34.6327 -110.798 moveto 83.8001 -110.798 lineto 83.8001 -92.2185 lineto 34.6327 -92.2185 lineto 34.6327 -110.798 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 350.363 489.099] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Primitive?) [5.55 0 3.32 0 2.77 0 7.77 0 2.77 0 2.77 0 2.53 0 4.85 0 4.43 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 19.2154 -46.0108 moveto 99.2175 -46.0108 lineto 99.2175 -1.0098 lineto 19.2154 -1.0098 lineto 19.2154 -46.0108 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 42.3876 -32.7999 moveto 76.0453 -32.7999 lineto 76.0453 -14.2208 lineto 42.3876 -14.2208 lineto 42.3876 -32.7999 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 358.118 411.102] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Call it) [6.66 0 4.43 0 2.77 0 2.77 0 3.50 0 2.77 0 2.77 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2163 109.035 moveto 70.6763 109.035 80.4582 107.717 88.5617 105.081 curveto 96.6652 102.445 100.717 99.2625 100.717 95.5346 curveto 100.717 91.8067 96.6652 88.6244 88.5617 85.9886 curveto 80.4582 83.3527 70.6763 82.0345 59.2163 82.0345 curveto 47.7564 82.0345 37.9744 83.3527 29.8709 85.9886 curveto 21.7674 88.6244 17.7157 91.8067 17.7157 95.5346 curveto 17.7157 99.2625 21.7674 102.445 29.8709 105.081 curveto 37.9744 107.717 47.7564 109.035 59.2163 109.035 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 2 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 24.1932 86.2449 moveto 94.2391 86.2449 lineto 94.2391 104.824 lineto 24.1932 104.824 lineto 24.1932 86.2449 lineto closepath grestore gsave gsave %IncludeFont: Times-Bold userdict begin BeachHead end begin [1 0 0 -1 339.924 292.057] concat /Times-Bold findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Macro-Return) [9.42 0 4.99 0 4.43 0 4.43 0 4.99 0 3.32 0 7.21 0 4.43 0 3.32 0 5.55 0 4.43 0 5.55 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 20.7152 166.992 moveto 58.7164 205.993 lineto 97.7176 166.992 lineto 59.7164 128.991 lineto 20.7152 166.992 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 24.7582 158.202 moveto 93.6747 158.202 lineto 93.6747 176.781 lineto 24.7582 176.781 lineto 24.7582 158.202 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 340.489 220.1] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (\324continuation\325?) [3.32 0 4.43 0 4.99 0 4.99 0 2.77 0 2.77 0 4.99 0 4.99 0 4.43 0 2.77 0 2.77 0 4.99 0 4.99 0 3.32 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 20.7152 258.991 moveto 58.7164 297.993 lineto 97.7176 258.991 lineto 59.7164 220.99 lineto 20.7152 258.991 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 37.6901 250.202 moveto 80.7427 250.202 lineto 80.7427 268.781 lineto 37.6901 268.781 lineto 37.6901 250.202 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 353.421 128.1] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (tail call?) [2.77 0 4.43 0 2.77 0 2.77 0 3.50 0 4.43 0 4.43 0 2.77 0 2.77 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 34.163 315.74 moveto 84.2699 315.74 lineto 84.2699 334.319 lineto 34.163 334.319 lineto 34.163 315.74 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 349.894 62.5621] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Begin-Seq) [6.66 0 4.43 0 4.99 0 2.77 0 4.99 0 3.32 0 5.55 0 4.43 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 17.7157 311.529 moveto 100.717 311.529 lineto 100.717 338.529 lineto 17.7157 338.529 lineto 17.7157 311.529 lineto closepath grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.2163 338.529 moveto 70.6763 338.529 80.4582 337.211 88.5617 334.575 curveto 96.6652 331.939 100.717 328.757 100.717 325.029 curveto 100.717 321.301 96.6652 318.119 88.5617 315.483 curveto 80.4582 312.847 70.6763 311.529 59.2163 311.529 curveto 47.7564 311.529 37.9744 312.847 29.8709 315.483 curveto 21.7674 318.119 17.7157 321.301 17.7157 325.029 curveto 17.7157 328.757 21.7674 331.939 29.8709 334.575 curveto 37.9744 337.211 47.7564 338.529 59.2163 338.529 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -82.5192 151.993 moveto -2.51729 151.993 lineto -2.51729 180.994 lineto -82.5192 180.994 lineto -82.5192 151.993 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -68.1164 157.204 moveto -16.9201 157.204 lineto -16.9201 175.783 lineto -68.1164 175.783 lineto -68.1164 157.204 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 247.614 221.098] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Preprocess) [5.55 0 3.32 0 4.43 0 4.99 0 3.32 0 4.99 0 4.43 0 4.43 0 3.88 0 3.88 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -2.51704 195.996 moveto -2.51704 240.997 lineto -82.5195 240.997 lineto -82.5195 211.996 lineto -67.519 195.996 lineto -2.51704 195.996 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -67.5717 209.207 moveto -17.4648 209.207 lineto -17.4648 227.786 lineto -67.5717 227.786 lineto -67.5717 209.207 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 248.159 169.095] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Begin-Seq) [6.66 0 4.43 0 4.99 0 2.77 0 4.99 0 3.32 0 5.55 0 4.43 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 7.48187 -307.819 moveto 7.48187 -282.219 lineto -56.5185 -282.219 lineto -56.5185 -298.717 lineto -44.5184 -307.819 lineto 7.48187 -307.819 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -43.4414 -302.45 moveto -5.59526 -302.45 lineto -5.59526 -287.587 lineto -43.4414 -287.587 lineto -43.4414 -302.45 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [0.799988 0 0 -0.799988 271.489 681.552] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (\(ap-dis-1\)) [3.32 0 4.43 0 4.99 0 3.32 0 4.99 0 2.77 0 3.88 0 3.32 0 4.99 0 3.32 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 14.2207 147.598 moveto 29.4267 147.598 lineto 29.4267 166.177 lineto 14.2207 166.177 lineto 14.2207 147.598 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 329.951 230.704] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Y) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 42.2216 198.6 moveto 57.4276 198.6 lineto 57.4276 217.179 lineto 42.2216 217.179 lineto 42.2216 198.6 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 357.952 179.702] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (N) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 58.222 292.602 moveto 73.4281 292.602 lineto 73.4281 311.181 lineto 58.222 311.181 lineto 58.222 292.602 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 373.953 85.6994] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Y) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 98.9889 287.994 moveto 138.99 326.995 lineto 176.991 287.994 lineto 98.9889 287.994 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 116.079 285.604 moveto 159.902 285.604 lineto 159.902 314.953 lineto 116.079 314.953 lineto 116.079 285.604 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 431.809 92.6979] concat /Times-Roman findbeachheadfont 7.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 5.69647 moveto [1 0 0 -1 0 0] concat (returned exp) [2.33 0 3.10 0 1.94 0 3.49 0 2.33 0 3.49 0 3.10 0 3.49 0 2.45 0 3.10 0 3.49 0 3.49 0 ] 7.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 431.809 92.6979] concat /Times-Roman findbeachheadfont 7.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 7.95279 12.6683 moveto [1 0 0 -1 0 0] concat (will be) [5.05 0 1.94 0 1.94 0 1.94 0 2.45 0 3.49 0 3.10 0 ] 7.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 431.809 92.6979] concat /Times-Roman findbeachheadfont 7.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 4.07269 19.6402 moveto [1 0 0 -1 0 0] concat (spliced in) [2.72 0 3.49 0 1.94 0 1.94 0 3.10 0 3.10 0 3.49 0 2.45 0 1.94 0 3.49 0 ] 7.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 94.2231 242.603 moveto 109.429 242.603 lineto 109.429 261.182 lineto 94.2231 261.182 lineto 94.2231 242.603 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 409.954 135.699] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (N) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 -340.982 moveto 211.172 -340.982 220.954 -342.3 229.058 -344.936 curveto 237.161 -347.572 241.213 -350.754 241.213 -354.482 curveto 241.213 -358.21 237.161 -361.392 229.058 -364.028 curveto 220.954 -366.664 211.172 -367.982 199.712 -367.982 curveto 188.252 -367.982 178.47 -366.664 170.367 -364.028 curveto 162.263 -361.392 158.212 -358.21 158.212 -354.482 curveto 158.212 -350.754 162.263 -347.572 170.367 -344.936 curveto 178.47 -342.3 188.252 -340.982 199.712 -340.982 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 2 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 157.183 -363.772 moveto 242.241 -363.772 lineto 242.241 -345.193 lineto 157.183 -345.193 lineto 157.183 -363.772 lineto closepath grestore gsave gsave %IncludeFont: Times-Bold userdict begin BeachHead end begin [1 0 0 -1 472.914 742.074] concat /Times-Bold findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Compound-Apply) [7.21 0 4.99 0 8.32 0 5.55 0 4.99 0 5.55 0 5.55 0 5.55 0 3.32 0 7.21 0 5.55 0 5.55 0 2.77 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 159.711 -320.502 moveto 239.713 -320.502 lineto 239.713 -275.501 lineto 159.711 -275.501 lineto 159.711 -320.502 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 166.267 -312.27 moveto 233.157 -312.27 lineto 233.157 -283.732 lineto 166.267 -283.732 lineto 166.267 -312.27 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 481.998 690.572] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 13.8424 8.13782 moveto [1 0 0 -1 0 0] concat (loop on) [2.77 0 4.99 0 4.99 0 4.99 0 3.50 0 4.99 0 4.99 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 481.998 690.572] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 18.0976 moveto [1 0 0 -1 0 0] concat (formal params) [3.32 0 4.99 0 3.32 0 7.77 0 4.43 0 2.77 0 3.50 0 4.99 0 4.43 0 3.32 0 4.43 0 7.77 0 3.88 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 161.211 -209.011 moveto 199.212 -170.01 lineto 238.213 -209.011 lineto 200.212 -247.013 lineto 161.211 -209.011 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 179.371 -227.761 moveto 220.053 -227.761 lineto 220.053 -189.262 lineto 179.371 -189.262 lineto 179.371 -227.761 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 495.102 606.063] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.824539 8.13782 moveto [1 0 0 -1 0 0] concat (missing) [7.77 0 2.77 0 3.88 0 3.88 0 2.77 0 4.99 0 4.99 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 495.102 606.063] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 18.0976 moveto [1 0 0 -1 0 0] concat (optional) [4.99 0 4.99 0 2.77 0 2.77 0 4.99 0 4.99 0 4.43 0 2.77 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 495.102 606.063] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 7.84569 28.0574 moveto [1 0 0 -1 0 0] concat (arg?) [4.43 0 3.15 0 4.99 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 212.423 -135.407 moveto 287.563 -135.407 lineto 287.563 -107.61 lineto 212.423 -107.61 lineto 212.423 -135.407 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 528.154 513.709] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 5.04567 8.13782 moveto [1 0 0 -1 0 0] concat (Eval-Dispatch) [6.10 0 4.99 0 4.43 0 2.77 0 3.32 0 7.21 0 2.77 0 3.88 0 4.99 0 4.43 0 2.77 0 4.43 0 4.99 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 528.154 513.709] concat /Times-Roman findbeachheadfont 9.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 17.5996 moveto [1 0 0 -1 0 0] concat (\(for default value\)) [2.99 0 2.99 0 4.49 0 2.99 0 3.15 0 4.49 0 3.99 0 2.99 0 3.99 0 4.49 0 2.49 0 2.49 0 3.15 0 4.49 0 3.99 0 2.49 0 4.49 0 3.99 0 2.99 0 ] 9.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 159.711 -65.0114 moveto 239.713 -65.0114 lineto 239.713 -20.0103 lineto 159.711 -20.0103 lineto 159.711 -65.0114 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 171.254 -56.7803 moveto 228.17 -56.7803 lineto 228.17 -28.2414 lineto 171.254 -28.2414 lineto 171.254 -56.7803 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 486.984 435.082] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.545609 8.13782 moveto [1 0 0 -1 0 0] concat (Bind param) [6.66 0 2.77 0 4.99 0 4.99 0 3.50 0 4.99 0 4.43 0 3.32 0 4.43 0 7.77 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 486.984 435.082] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 18.0976 moveto [1 0 0 -1 0 0] concat (to arg value) [2.77 0 4.99 0 3.50 0 4.43 0 3.15 0 4.99 0 3.50 0 4.99 0 4.43 0 2.77 0 4.99 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 161.211 40.9962 moveto 199.212 79.9974 lineto 238.213 40.9962 lineto 200.212 2.99503 lineto 161.211 40.9962 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 182.694 32.2067 moveto 216.73 32.2067 lineto 216.73 50.7857 lineto 182.694 50.7857 lineto 182.694 32.2067 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 498.425 346.095] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Done?) [7.21 0 4.99 0 4.99 0 4.43 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 159.711 106.994 moveto 239.713 106.994 lineto 239.713 151.995 lineto 159.711 151.995 lineto 159.711 106.994 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 166.176 120.205 moveto 233.248 120.205 lineto 233.248 138.784 lineto 166.176 138.784 lineto 166.176 120.205 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 481.907 258.097] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Get proc body) [7.21 0 4.43 0 2.77 0 3.50 0 4.99 0 3.32 0 4.99 0 4.43 0 3.50 0 4.99 0 4.99 0 4.99 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 199.712 213.027 moveto 211.172 213.027 220.954 211.708 229.057 209.072 curveto 237.161 206.437 241.213 203.254 241.213 199.526 curveto 241.213 195.798 237.161 192.616 229.057 189.98 curveto 220.954 187.344 211.172 186.026 199.712 186.026 curveto 188.252 186.026 178.47 187.344 170.367 189.98 curveto 162.263 192.616 158.211 195.798 158.211 199.526 curveto 158.211 203.254 162.263 206.437 170.367 209.072 curveto 178.47 211.708 188.252 213.027 199.712 213.027 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 165.804 190.237 moveto 233.621 190.237 lineto 233.621 208.816 lineto 165.804 208.816 lineto 165.804 190.237 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 481.534 188.065] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Eval-Sequence) [6.10 0 4.99 0 4.43 0 2.77 0 3.32 0 5.55 0 4.43 0 4.99 0 4.99 0 4.43 0 4.99 0 4.43 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 234.714 -223.469 moveto 249.92 -223.469 lineto 249.92 -204.89 lineto 234.714 -204.89 lineto 234.714 -223.469 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 550.445 601.771] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Y) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 185.713 -173.467 moveto 200.919 -173.467 lineto 200.919 -154.888 lineto 185.713 -154.888 lineto 185.713 -173.467 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 501.443 551.769] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (N) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 59.709 -68.4641 moveto 74.9151 -68.4641 lineto 74.9151 -49.885 lineto 59.709 -49.885 lineto 59.709 -68.4641 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 375.44 446.766] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Y) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 157.712 -356.47 moveto 122.712 -356.47 lineto 122.712 -102.462 lineto 99.7102 -102.462 lineto newpath 153.985 -356.47 moveto 122.712 -356.47 lineto 122.712 -102.462 lineto 99.7102 -102.462 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 157.621 -356.47 moveto 149.895 -359.56 lineto 149.531 -358.227 149.349 -357.197 149.349 -356.47 curveto 149.349 -355.743 149.531 -354.713 149.895 -353.38 curveto 157.621 -356.47 lineto 157.621 -356.47 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 94.7101 -117.463 moveto 109.916 -117.463 lineto 109.916 -98.8835 lineto 94.7101 -98.8835 lineto 94.7101 -117.463 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 410.441 495.764] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (N) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 41.7085 -262.467 moveto 56.9145 -262.467 lineto 56.9145 -243.888 lineto 41.7085 -243.888 lineto 41.7085 -262.467 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 357.439 640.769] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (N) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 17.7121 -362.022 moveto -70.7881 -362.272 lineto -70.7881 -230.272 lineto -12.7881 -230.272 lineto -12.7881 95.7275 lineto -62.7881 95.7275 lineto newpath 13.9904 -362.033 moveto -70.7881 -362.272 lineto -70.7881 -230.272 lineto -12.7881 -230.272 lineto -12.7881 95.7275 lineto -62.7881 95.7275 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 17.6213 -362.023 moveto 9.90306 -365.135 lineto 9.53586 -363.803 9.3512 -362.773 9.34915 -362.046 curveto 9.34711 -361.319 9.52591 -360.289 9.8856 -358.954 curveto 17.6213 -362.023 lineto 17.6213 -362.023 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 14.2205 -311.398 moveto 29.4265 -311.398 lineto 29.4265 -292.819 lineto 14.2205 -292.819 lineto 14.2205 -311.398 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 329.951 689.7] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Y) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -80.7822 255.103 moveto -0.780243 255.103 lineto -0.780243 284.104 lineto -80.7822 284.104 lineto -80.7822 255.103 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -80.7822 255.103 moveto -0.780243 255.103 lineto -0.780243 284.104 lineto -80.7822 284.104 lineto -80.7822 255.103 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -68.3233 260.314 moveto -13.2392 260.314 lineto -13.2392 278.893 lineto -68.3233 278.893 lineto -68.3233 260.314 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 247.407 117.988] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Postprocess) [5.55 0 4.99 0 3.88 0 2.77 0 4.99 0 3.32 0 4.99 0 4.43 0 4.43 0 3.88 0 3.88 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -65.5182 77.2455 moveto -50.3122 77.2455 lineto -50.3122 95.8245 lineto -65.5182 95.8245 lineto -65.5182 77.2455 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 250.212 301.056] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (N) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 200.216 75.5852 moveto 215.422 75.5852 lineto 215.422 94.1643 lineto 200.216 94.1643 lineto 200.216 75.5852 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 515.946 302.717] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Y) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 159.712 -300.482 moveto 145.712 -300.482 lineto 145.712 40.5178 lineto 160.712 40.5178 lineto newpath 155.985 -300.482 moveto 145.712 -300.482 lineto 145.712 40.5178 lineto 160.712 40.5178 lineto userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 159.621 -300.482 moveto 151.894 -303.573 lineto 151.531 -302.239 151.349 -301.209 151.349 -300.482 curveto 151.349 -299.755 151.531 -298.725 151.894 -297.392 curveto 159.621 -300.482 lineto 159.621 -300.482 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end gsave eofill grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat 149.712 41.5178 moveto 164.918 41.5178 lineto 164.918 60.0969 lineto 149.712 60.0969 lineto 149.712 41.5178 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 465.443 336.784] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (N) [7.21 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -267.1 293.212 moveto -215.752 293.212 lineto -215.752 321.751 lineto -267.1 321.751 lineto -267.1 293.212 lineto closepath userdict begin BeachHead end begin 0 0 0 0 bhsetcmykcolor end gsave eofill grestore grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 48.631 85.0902] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 1.36925 8.13782 moveto [1 0 0 -1 0 0] concat (Check for) [6.66 0 4.99 0 4.43 0 4.43 0 4.99 0 3.50 0 3.32 0 4.99 0 3.32 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 48.631 85.0902] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 18.0976 moveto [1 0 0 -1 0 0] concat (errors, etc.) [4.43 0 3.32 0 3.32 0 4.99 0 3.32 0 3.88 0 2.49 0 3.50 0 4.43 0 2.77 0 4.43 0 2.49 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -281.427 284.981 moveto -201.424 284.981 lineto -201.424 329.982 lineto -281.427 329.982 lineto -281.427 284.981 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -272.656 221.231 moveto -210.195 221.231 lineto -210.195 259.73 lineto -272.656 259.73 lineto -272.656 221.231 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 43.0741 157.07] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Maybe splice) [8.88 0 4.43 0 4.99 0 4.99 0 4.43 0 3.50 0 3.88 0 4.99 0 2.77 0 2.77 0 4.43 0 4.43 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 43.0741 157.07] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 1.11438 18.0976 moveto [1 0 0 -1 0 0] concat (macro return) [7.77 0 4.43 0 4.43 0 3.32 0 4.99 0 3.50 0 3.32 0 4.43 0 2.77 0 4.99 0 3.32 0 4.99 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 43.0741 157.07] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 6.92119 28.0574 moveto [1 0 0 -1 0 0] concat (into Unev) [2.77 0 4.99 0 2.77 0 4.99 0 3.50 0 7.21 0 4.99 0 4.43 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -281.427 217.98 moveto -201.424 217.98 lineto -201.424 262.981 lineto -281.427 262.981 lineto -281.427 217.98 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -281.427 217.98 moveto -201.424 217.98 lineto -201.424 262.981 lineto -281.427 262.981 lineto -281.427 217.98 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.5 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -201.424 157.996 moveto -201.424 202.998 lineto -281.427 202.998 lineto -281.427 173.997 lineto -266.426 157.996 lineto -201.424 157.996 lineto closepath userdict begin BeachHead end begin 0 0 0 0 bhsetcmykcolor end gsave eofill grestore userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -275.344 171.207 moveto -210.295 171.207 lineto -210.295 189.786 lineto -275.344 189.786 lineto -275.344 171.207 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 40.3865 207.094] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Eval-Dispatch) [6.10 0 4.99 0 4.43 0 2.77 0 3.32 0 7.21 0 2.77 0 3.88 0 4.99 0 4.43 0 2.77 0 4.43 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -241.426 134.99 moveto -229.966 134.99 -220.184 133.672 -212.081 131.036 curveto -203.977 128.4 -199.926 125.218 -199.926 121.49 curveto -199.926 117.762 -203.977 114.58 -212.081 111.944 curveto -220.184 109.308 -229.966 107.99 -241.426 107.99 curveto -252.886 107.99 -262.668 109.308 -270.772 111.944 curveto -278.875 114.58 -282.927 117.762 -282.927 121.49 curveto -282.927 125.218 -278.875 128.4 -270.772 131.036 curveto -262.668 133.672 -252.886 134.99 -241.426 134.99 curveto closepath userdict begin BeachHead end begin 0 0 0 0 bhsetcmykcolor end gsave eofill grestore userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -274.505 112.2 moveto -208.347 112.2 lineto -208.347 130.779 lineto -274.505 130.779 lineto -274.505 112.2 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 41.2254 266.102] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Non-Tail-Eval) [7.21 0 4.99 0 4.99 0 3.32 0 6.10 0 4.43 0 2.77 0 2.77 0 3.32 0 6.10 0 4.99 0 4.43 0 2.77 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -272.247 -39.7833 moveto -209.604 -39.7833 lineto -209.604 -11.2444 lineto -272.247 -11.2444 lineto -272.247 -39.7833 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 43.4832 418.085] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Pop one expr) [5.55 0 4.99 0 4.99 0 3.50 0 4.99 0 4.99 0 4.43 0 3.50 0 4.43 0 4.99 0 4.99 0 3.32 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 43.4832 418.085] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 5.07312 18.0976 moveto [1 0 0 -1 0 0] concat (from Unev) [3.32 0 3.32 0 4.99 0 7.77 0 3.50 0 7.21 0 4.99 0 4.43 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -280.927 -48.0143 moveto -200.924 -48.0143 lineto -200.924 -3.01331 lineto -280.927 -3.01331 lineto -280.927 -48.0143 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -276.233 -86.0135 moveto -205.618 -86.0135 lineto -205.618 -67.4345 lineto -276.233 -67.4345 lineto -276.233 -86.0135 lineto closepath grestore gsave gsave %IncludeFont: Times-Bold userdict begin BeachHead end begin [1 0 0 -1 39.4972 464.315] concat /Times-Bold findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Eval-Sequence) [6.66 0 4.99 0 4.99 0 2.77 0 3.32 0 5.55 0 4.43 0 5.55 0 5.55 0 4.43 0 5.55 0 4.43 0 4.43 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -240.926 -63.2238 moveto -229.466 -63.2238 -219.684 -64.542 -211.58 -67.1779 curveto -203.477 -69.8138 -199.425 -72.996 -199.425 -76.7239 curveto -199.425 -80.4518 -203.477 -83.6341 -211.58 -86.27 curveto -219.684 -88.9059 -229.466 -90.2241 -240.926 -90.2241 curveto -252.386 -90.2241 -262.167 -88.9059 -270.271 -86.27 curveto -278.374 -83.6341 -282.426 -80.4518 -282.426 -76.7239 curveto -282.426 -72.996 -278.374 -69.8138 -270.271 -67.1779 curveto -262.167 -64.542 -252.386 -63.2238 -240.926 -63.2238 curveto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 2 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -267.934 -145.786 moveto -213.917 -145.786 lineto -213.917 -117.248 lineto -267.934 -117.248 lineto -267.934 -145.786 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 47.7968 524.088] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 8.13782 moveto [1 0 0 -1 0 0] concat (Parse Logo) [5.41 0 4.43 0 3.32 0 3.88 0 4.43 0 3.50 0 6.10 0 4.99 0 4.99 0 4.99 0 ] 10.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 47.7968 524.088] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 4.63745 18.0976 moveto [1 0 0 -1 0 0] concat (into Lisp) [2.77 0 4.99 0 2.77 0 4.99 0 3.50 0 6.10 0 2.77 0 3.88 0 4.99 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -280.927 -154.018 moveto -200.924 -154.018 lineto -200.924 -109.017 lineto -280.927 -109.017 lineto -280.927 -154.018 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -56.0199 368.996 moveto -56.0199 377.996 lineto -72.0201 377.996 lineto -72.0201 372.196 lineto -69.0201 368.996 lineto -56.0199 368.996 lineto closepath userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0.25 setlinewidth 0 setlinecap 0 setlinejoin stroke grestore gsave newpath [1 0 0 -1 311.731 382.302] concat -167.851 348.516 moveto 165.999 348.516 lineto 165.999 382.302 lineto -167.851 382.302 lineto -167.851 348.516 lineto closepath grestore gsave gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 147.879 29.786] concat /Times-Roman findbeachheadfont 14.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 46.0851 11.3929 moveto [1 0 0 -1 0 0] concat (UCBLogo evaluator simpli\336ed \337owchart) [10.10 0 9.33 0 9.33 0 8.54 0 6.99 0 6.99 0 6.99 0 4.90 0 6.21 0 6.99 0 6.21 0 3.88 0 6.99 0 6.21 0 3.88 0 6.99 0 4.65 0 4.90 0 5.43 0 3.88 0 10.88 0 6.99 0 3.88 0 3.88 0 7.77 0 6.21 0 6.99 0 4.90 0 7.77 0 6.99 0 10.10 0 6.21 0 6.99 0 6.21 0 4.65 0 3.88 0 ] 14.00 krnshow end grestore gsave %IncludeFont: Times-Roman userdict begin BeachHead end begin [1 0 0 -1 147.879 29.786] concat /Times-Roman findbeachheadfont 10.00 scalefont setfont userdict begin BeachHead end begin 0 0 0 1 bhsetcmykcolor end 0 23.3447 moveto [1 0 0 -1 0 0] concat (\(Procedure-call boxes imply data stack allocation as well as control \337ow.\)) [3.32 0 5.55 0 3.32 0 4.99 0 4.43 0 4.43 0 4.99 0 4.99 0 3.32 0 4.43 0 3.32 0 4.43 0 4.43 0 2.77 0 2.77 0 3.50 0 4.99 0 4.99 0 4.85 0 4.43 0 3.88 0 3.50 0 3.50 0 3.50 0 3.50 0 3.50 0 3.50 0 3.50 0 2.77 0 7.77 0 4.99 0 2.77 0 4.99 0 3.50 0 4.99 0 4.43 0 2.77 0 4.43 0 3.50 0 3.88 0 2.77 0 4.43 0 4.43 0 4.99 0 3.50 0 4.43 0 2.77 0 2.77 0 4.99 0 4.43 0 4.43 0 2.77 0 2.77 0 4.99 0 4.99 0 3.50 0 4.43 0 3.88 0 3.50 0 7.21 0 4.43 0 2.77 0 2.77 0 3.50 0 4.43 0 3.88 0 3.50 0 4.43 0 4.99 0 4.99 0 2.77 0 3.32 0 4.99 0 2.77 0 3.50 0 5.55 0 4.99 0 7.21 0 2.49 0 3.32 0 ] 10.00 krnshow end grestore grestore gsave newpath [1 0 0 -1 311.731 382.302] concat grestore %%EndDocument @endspecial 1299 5449 a Fa()p eop %%Trailer end userdict /end-hook known{end-hook}if %%EOF ucblogo-6.1/diffscript.pl0000664000175000017500000000012413557147341013613 0ustar jjcjjc# /usr/bin/ # args are directories foreach $file (glob(@ARGV)) { if (diff } ucblogo-6.1/configure.in0000664000175000017500000000452013575571772013447 0ustar jjcjjcdnl Process this file with autoconf to produce a configure script. AC_INIT(ucblogo, 6.1) AC_CONFIG_HEADER(config.h) dnl Checks for programs. AC_PROG_CC AC_PROG_CXX WXCONFIG=wx-config AC_ARG_WITH(wx-config, [[ --with-wx-config=FILE Use the given path to wx-config when determining wxWidgets configuration; defaults to "wx-config"]], [ if test "$withval" != "yes" -a "$withval" != ""; then WXCONFIG=$withval fi ]) TERMOFILE="term.o" TERMFILE="term.c" GRAPHICSOFILE=" xgraphics.o " GRAPHICSFILE=" xgraphics.c " AC_MSG_CHECKING([wxWidgets version]) if wxversion=`$WXCONFIG --version`; then AC_MSG_RESULT([$wxversion]) AC_DEFINE(HAVE_WX) WXOFILES="wxMain.o wxTerminal.o wxTurtleGraphics.o TextEditor.o" WXSRCFILES="wxMain.cpp wxTerminal.cpp wxTurtleGraphics.cpp TextEditor.cpp" LIBS="$LIBS "`$WXCONFIG --libs`; CC="`$WXCONFIG --cc`" CXX="`$WXCONFIG --cxx`" CXXFLAGS="$CXXFLAGS -DHAVE_WX `$WXCONFIG --cxxflags`"; CFLAGS="$CFLAGS -DHAVE_WX " TERMOFILE="wxterm.o" TERMFILE="wxterm.c" GRAPHICSOFILE="" GRAPHICSFILE="" LINKER="`$WXCONFIG --ld`" else AC_MSG_RESULT([not found]) LINKER='$(CC)' fi dnl Checks for libraries. AC_PATH_XTRA AC_CHECK_LIB(m, atan) AC_CHECK_LIB(BSD, signal) AC_CHECK_LIB(bsd, signal) tcap=no AC_CHECK_LIB(termcap, tgetstr, AC_DEFINE(HAVE_LIBTERMCAP) LIBS="$LIBS -ltermcap" tcap=yes) if test $tcap = no; then AC_CHECK_LIB(termlib, tgetstr, AC_DEFINE(HAVE_LIBTERMLIB) LIBS="$LIBS -ltermlib" tcap=yes) fi if test $tcap = no; then AC_CHECK_LIB(curses, tgetstr, AC_DEFINE(HAVE_LIBCURSES) LIBS="$LIBS -lcurses" tcap=yes) fi if test $tcap = no; then AC_CHECK_LIB(ncurses, tgetstr, AC_DEFINE(HAVE_LIBCURSES) LIBS="$LIBS -lncurses" tcap=yes) fi dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS(sgtty.h termio.h unistd.h string.h termcap.h termlib.h curses.h) dnl Checks for typedefs, structures, and compiler characteristics. AC_TYPE_SIZE_T AC_TYPE_SIGNAL dnl Checks for library functions. AC_CHECK_FUNCS(usleep srandom sigvec sigsetmask drem irint memcpy) AC_PROG_GCC_TRADITIONAL dnl AC_TYPE_SIGNAL if test "$no_x" != yes; then LIBS="$LIBS -lX11" fi AC_SUBST(WXOFILES) AC_SUBST(WXSRCFILES) AC_SUBST(TERMOFILE) AC_SUBST(TERMFILE) AC_SUBST(LINKER) AC_SUBST(GRAPHICSOFILE) AC_SUBST(GRAPHICSFILE) AC_OUTPUT(makefile) ucblogo-6.1/configure0000775000175000017500000052427213575571772013060 0ustar jjcjjc#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for ucblogo 6.1. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME='ucblogo' PACKAGE_TARNAME='ucblogo' PACKAGE_VERSION='6.1' PACKAGE_STRING='ucblogo 6.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS GRAPHICSFILE GRAPHICSOFILE LINKER TERMFILE TERMOFILE WXSRCFILES WXOFILES EGREP GREP X_EXTRA_LIBS X_LIBS X_PRE_LIBS X_CFLAGS CPP XMKMF ac_ct_CXX CXXFLAGS CXX OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_wx_config with_x ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CXX CXXFLAGS CCC XMKMF CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures ucblogo 6.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/ucblogo] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF X features: --x-includes=DIR X include files are in DIR --x-libraries=DIR X library files are in DIR _ACEOF fi if test -n "$ac_init_help"; then case $ac_init_help in short | recursive ) echo "Configuration of ucblogo 6.1:";; esac cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-wx-config=FILE Use the given path to wx-config when determining wxWidgets configuration; defaults to "wx-config" --with-x use the X Window System Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CXX C++ compiler command CXXFLAGS C++ compiler flags XMKMF Path to xmkmf, Makefile generator for X Window System CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF ucblogo configure 6.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_cxx_try_compile LINENO # ---------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_cxx_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_cxx_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_cxx_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by ucblogo $as_me 6.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config.h" ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=cpp ac_cpp='$CXXCPP $CPPFLAGS' ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_cxx_compiler_gnu if test -z "$CXX"; then if test -n "$CCC"; then CXX=$CCC else if test -n "$ac_tool_prefix"; then for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CXX"; then ac_cv_prog_CXX="$CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CXX=$ac_cv_prog_CXX if test -n "$CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 $as_echo "$CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CXX" && break done fi if test -z "$CXX"; then ac_ct_CXX=$CXX for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CXX+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CXX"; then ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CXX="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CXX=$ac_cv_prog_ac_ct_CXX if test -n "$ac_ct_CXX"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 $as_echo "$ac_ct_CXX" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CXX" && break done if test "x$ac_ct_CXX" = x; then CXX="g++" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CXX=$ac_ct_CXX fi fi fi fi # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 $as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } if ${ac_cv_cxx_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_cxx_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 $as_echo "$ac_cv_cxx_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GXX=yes else GXX= fi ac_test_CXXFLAGS=${CXXFLAGS+set} ac_save_CXXFLAGS=$CXXFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 $as_echo_n "checking whether $CXX accepts -g... " >&6; } if ${ac_cv_prog_cxx_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_cxx_werror_flag=$ac_cxx_werror_flag ac_cxx_werror_flag=yes ac_cv_prog_cxx_g=no CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes else CXXFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : else ac_cxx_werror_flag=$ac_save_cxx_werror_flag CXXFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_cxx_try_compile "$LINENO"; then : ac_cv_prog_cxx_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cxx_werror_flag=$ac_save_cxx_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 $as_echo "$ac_cv_prog_cxx_g" >&6; } if test "$ac_test_CXXFLAGS" = set; then CXXFLAGS=$ac_save_CXXFLAGS elif test $ac_cv_prog_cxx_g = yes; then if test "$GXX" = yes; then CXXFLAGS="-g -O2" else CXXFLAGS="-g" fi else if test "$GXX" = yes; then CXXFLAGS="-O2" else CXXFLAGS= fi fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu WXCONFIG=wx-config # Check whether --with-wx-config was given. if test "${with_wx_config+set}" = set; then : withval=$with_wx_config; if test "$withval" != "yes" -a "$withval" != ""; then WXCONFIG=$withval fi fi TERMOFILE="term.o" TERMFILE="term.c" GRAPHICSOFILE=" xgraphics.o " GRAPHICSFILE=" xgraphics.c " { $as_echo "$as_me:${as_lineno-$LINENO}: checking wxWidgets version" >&5 $as_echo_n "checking wxWidgets version... " >&6; } if wxversion=`$WXCONFIG --version`; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $wxversion" >&5 $as_echo "$wxversion" >&6; } $as_echo "#define HAVE_WX 1" >>confdefs.h WXOFILES="wxMain.o wxTerminal.o wxTurtleGraphics.o TextEditor.o" WXSRCFILES="wxMain.cpp wxTerminal.cpp wxTurtleGraphics.cpp TextEditor.cpp" LIBS="$LIBS "`$WXCONFIG --libs`; CC="`$WXCONFIG --cc`" CXX="`$WXCONFIG --cxx`" CXXFLAGS="$CXXFLAGS -DHAVE_WX `$WXCONFIG --cxxflags`"; CFLAGS="$CFLAGS -DHAVE_WX " TERMOFILE="wxterm.o" TERMFILE="wxterm.c" GRAPHICSOFILE="" GRAPHICSFILE="" LINKER="`$WXCONFIG --ld`" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: not found" >&5 $as_echo "not found" >&6; } LINKER='$(CC)' fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for X" >&5 $as_echo_n "checking for X... " >&6; } # Check whether --with-x was given. if test "${with_x+set}" = set; then : withval=$with_x; fi # $have_x is `yes', `no', `disabled', or empty when we do not yet know. if test "x$with_x" = xno; then # The user explicitly disabled X. have_x=disabled else case $x_includes,$x_libraries in #( *\'*) as_fn_error $? "cannot use X directory names containing '" "$LINENO" 5;; #( *,NONE | NONE,*) if ${ac_cv_have_x+:} false; then : $as_echo_n "(cached) " >&6 else # One or both of the vars are not set, and there is no cached value. ac_x_includes=no ac_x_libraries=no rm -f -r conftest.dir if mkdir conftest.dir; then cd conftest.dir cat >Imakefile <<'_ACEOF' incroot: @echo incroot='${INCROOT}' usrlibdir: @echo usrlibdir='${USRLIBDIR}' libdir: @echo libdir='${LIBDIR}' _ACEOF if (export CC; ${XMKMF-xmkmf}) >/dev/null 2>/dev/null && test -f Makefile; then # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. for ac_var in incroot usrlibdir libdir; do eval "ac_im_$ac_var=\`\${MAKE-make} $ac_var 2>/dev/null | sed -n 's/^$ac_var=//p'\`" done # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR. for ac_extension in a so sl dylib la dll; do if test ! -f "$ac_im_usrlibdir/libX11.$ac_extension" && test -f "$ac_im_libdir/libX11.$ac_extension"; then ac_im_usrlibdir=$ac_im_libdir; break fi done # Screen out bogus values from the imake configuration. They are # bogus both because they are the default anyway, and because # using them would break gcc on systems where it needs fixed includes. case $ac_im_incroot in /usr/include) ac_x_includes= ;; *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;; esac case $ac_im_usrlibdir in /usr/lib | /usr/lib64 | /lib | /lib64) ;; *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;; esac fi cd .. rm -f -r conftest.dir fi # Standard set of common directories for X headers. # Check X11 before X11Rn because it is often a symlink to the current release. ac_x_header_dirs=' /usr/X11/include /usr/X11R7/include /usr/X11R6/include /usr/X11R5/include /usr/X11R4/include /usr/include/X11 /usr/include/X11R7 /usr/include/X11R6 /usr/include/X11R5 /usr/include/X11R4 /usr/local/X11/include /usr/local/X11R7/include /usr/local/X11R6/include /usr/local/X11R5/include /usr/local/X11R4/include /usr/local/include/X11 /usr/local/include/X11R7 /usr/local/include/X11R6 /usr/local/include/X11R5 /usr/local/include/X11R4 /usr/X386/include /usr/x386/include /usr/XFree86/include/X11 /usr/include /usr/local/include /usr/unsupported/include /usr/athena/include /usr/local/x11r5/include /usr/lpp/Xamples/include /usr/openwin/include /usr/openwin/share/include' if test "$ac_x_includes" = no; then # Guess where to find include files, by looking for Xlib.h. # First, try using that file with no special directory specified. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # We can compile using X headers with no special include directory. ac_x_includes= else for ac_dir in $ac_x_header_dirs; do if test -r "$ac_dir/X11/Xlib.h"; then ac_x_includes=$ac_dir break fi done fi rm -f conftest.err conftest.i conftest.$ac_ext fi # $ac_x_includes = no if test "$ac_x_libraries" = no; then # Check for the libraries. # See if we find them without any special options. # Don't add to $LIBS permanently. ac_save_LIBS=$LIBS LIBS="-lX11 $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { XrmInitialize () ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : LIBS=$ac_save_LIBS # We can link X programs with no special library path. ac_x_libraries= else LIBS=$ac_save_LIBS for ac_dir in `$as_echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g` do # Don't even attempt the hair of trying to link an X program! for ac_extension in a so sl dylib la dll; do if test -r "$ac_dir/libX11.$ac_extension"; then ac_x_libraries=$ac_dir break 2 fi done done fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi # $ac_x_libraries = no case $ac_x_includes,$ac_x_libraries in #( no,* | *,no | *\'*) # Didn't find X, or a directory has "'" in its name. ac_cv_have_x="have_x=no";; #( *) # Record where we found X for the cache. ac_cv_have_x="have_x=yes\ ac_x_includes='$ac_x_includes'\ ac_x_libraries='$ac_x_libraries'" esac fi ;; #( *) have_x=yes;; esac eval "$ac_cv_have_x" fi # $with_x != no if test "$have_x" != yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $have_x" >&5 $as_echo "$have_x" >&6; } no_x=yes else # If each of the values was on the command line, it overrides each guess. test "x$x_includes" = xNONE && x_includes=$ac_x_includes test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries # Update the cache value to reflect the command line values. ac_cv_have_x="have_x=yes\ ac_x_includes='$x_includes'\ ac_x_libraries='$x_libraries'" { $as_echo "$as_me:${as_lineno-$LINENO}: result: libraries $x_libraries, headers $x_includes" >&5 $as_echo "libraries $x_libraries, headers $x_includes" >&6; } fi if test "$no_x" = yes; then # Not all programs may use this symbol, but it does not hurt to define it. $as_echo "#define X_DISPLAY_MISSING 1" >>confdefs.h X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS= else if test -n "$x_includes"; then X_CFLAGS="$X_CFLAGS -I$x_includes" fi # It would also be nice to do this for all -L options, not just this one. if test -n "$x_libraries"; then X_LIBS="$X_LIBS -L$x_libraries" # For Solaris; some versions of Sun CC require a space after -R and # others require no space. Words are not sufficient . . . . { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether -R must be followed by a space" >&5 $as_echo_n "checking whether -R must be followed by a space... " >&6; } ac_xsave_LIBS=$LIBS; LIBS="$LIBS -R$x_libraries" ac_xsave_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } X_LIBS="$X_LIBS -R$x_libraries" else LIBS="$ac_xsave_LIBS -R $x_libraries" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } X_LIBS="$X_LIBS -R $x_libraries" else { $as_echo "$as_me:${as_lineno-$LINENO}: result: neither works" >&5 $as_echo "neither works" >&6; } fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext ac_c_werror_flag=$ac_xsave_c_werror_flag LIBS=$ac_xsave_LIBS fi # Check for system-dependent libraries X programs must link with. # Do this before checking for the system-independent R6 libraries # (-lICE), since we may need -lsocket or whatever for X linking. if test "$ISC" = yes; then X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet" else # Martyn Johnson says this is needed for Ultrix, if the X # libraries were built with DECnet support. And Karl Berry says # the Alpha needs dnet_stub (dnet does not exist). ac_xsave_LIBS="$LIBS"; LIBS="$LIBS $X_LIBS -lX11" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char XOpenDisplay (); int main () { return XOpenDisplay (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet... " >&6; } if ${ac_cv_lib_dnet_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_dnet_ntoa=yes else ac_cv_lib_dnet_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet" fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for dnet_ntoa in -ldnet_stub" >&5 $as_echo_n "checking for dnet_ntoa in -ldnet_stub... " >&6; } if ${ac_cv_lib_dnet_stub_dnet_ntoa+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ldnet_stub $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char dnet_ntoa (); int main () { return dnet_ntoa (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_dnet_stub_dnet_ntoa=yes else ac_cv_lib_dnet_stub_dnet_ntoa=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dnet_stub_dnet_ntoa" >&5 $as_echo "$ac_cv_lib_dnet_stub_dnet_ntoa" >&6; } if test "x$ac_cv_lib_dnet_stub_dnet_ntoa" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub" fi fi fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS="$ac_xsave_LIBS" # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT, # to get the SysV transport functions. # Chad R. Larson says the Pyramis MIS-ES running DC/OSx (SVR4) # needs -lnsl. # The nsl library prevents programs from opening the X display # on Irix 5.2, according to T.E. Dickey. # The functions gethostbyname, getservbyname, and inet_addr are # in -lbsd on LynxOS 3.0.1/i386, according to Lars Hecking. ac_fn_c_check_func "$LINENO" "gethostbyname" "ac_cv_func_gethostbyname" if test "x$ac_cv_func_gethostbyname" = xyes; then : fi if test $ac_cv_func_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl" fi if test $ac_cv_lib_nsl_gethostbyname = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lbsd" >&5 $as_echo_n "checking for gethostbyname in -lbsd... " >&6; } if ${ac_cv_lib_bsd_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_gethostbyname=yes else ac_cv_lib_bsd_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_gethostbyname" >&5 $as_echo "$ac_cv_lib_bsd_gethostbyname" >&6; } if test "x$ac_cv_lib_bsd_gethostbyname" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lbsd" fi fi fi # lieder@skyler.mavd.honeywell.com says without -lsocket, # socket/setsockopt and other routines are undefined under SCO ODT # 2.0. But -lsocket is broken on IRIX 5.2 (and is not necessary # on later versions), says Simon Leinen: it contains gethostby* # variants that don't use the name server (or something). -lsocket # must be given before -lnsl if both are needed. We assume that # if connect needs -lnsl, so does gethostbyname. ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" if test "x$ac_cv_func_connect" = xyes; then : fi if test $ac_cv_func_connect = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS" fi fi # Guillermo Gomez says -lposix is necessary on A/UX. ac_fn_c_check_func "$LINENO" "remove" "ac_cv_func_remove" if test "x$ac_cv_func_remove" = xyes; then : fi if test $ac_cv_func_remove = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for remove in -lposix" >&5 $as_echo_n "checking for remove in -lposix... " >&6; } if ${ac_cv_lib_posix_remove+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lposix $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char remove (); int main () { return remove (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_posix_remove=yes else ac_cv_lib_posix_remove=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_posix_remove" >&5 $as_echo "$ac_cv_lib_posix_remove" >&6; } if test "x$ac_cv_lib_posix_remove" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix" fi fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. ac_fn_c_check_func "$LINENO" "shmat" "ac_cv_func_shmat" if test "x$ac_cv_func_shmat" = xyes; then : fi if test $ac_cv_func_shmat = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for shmat in -lipc" >&5 $as_echo_n "checking for shmat in -lipc... " >&6; } if ${ac_cv_lib_ipc_shmat+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lipc $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char shmat (); int main () { return shmat (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ipc_shmat=yes else ac_cv_lib_ipc_shmat=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ipc_shmat" >&5 $as_echo "$ac_cv_lib_ipc_shmat" >&6; } if test "x$ac_cv_lib_ipc_shmat" = xyes; then : X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc" fi fi fi # Check for libraries that X11R6 Xt/Xaw programs need. ac_save_LDFLAGS=$LDFLAGS test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries" # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to # check for ICE first), but we must link in the order -lSM -lICE or # we get undefined symbols. So assume we have SM if we have ICE. # These have to be linked with before -lX11, unlike the other # libraries we check for below, so use a different variable. # John Interrante, Karl Berry { $as_echo "$as_me:${as_lineno-$LINENO}: checking for IceConnectionNumber in -lICE" >&5 $as_echo_n "checking for IceConnectionNumber in -lICE... " >&6; } if ${ac_cv_lib_ICE_IceConnectionNumber+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lICE $X_EXTRA_LIBS $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char IceConnectionNumber (); int main () { return IceConnectionNumber (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ICE_IceConnectionNumber=yes else ac_cv_lib_ICE_IceConnectionNumber=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ICE_IceConnectionNumber" >&5 $as_echo "$ac_cv_lib_ICE_IceConnectionNumber" >&6; } if test "x$ac_cv_lib_ICE_IceConnectionNumber" = xyes; then : X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE" fi LDFLAGS=$ac_save_LDFLAGS fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for atan in -lm" >&5 $as_echo_n "checking for atan in -lm... " >&6; } if ${ac_cv_lib_m_atan+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char atan (); int main () { return atan (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_atan=yes else ac_cv_lib_m_atan=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_atan" >&5 $as_echo "$ac_cv_lib_m_atan" >&6; } if test "x$ac_cv_lib_m_atan" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signal in -lBSD" >&5 $as_echo_n "checking for signal in -lBSD... " >&6; } if ${ac_cv_lib_BSD_signal+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lBSD $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char signal (); int main () { return signal (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_BSD_signal=yes else ac_cv_lib_BSD_signal=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_BSD_signal" >&5 $as_echo "$ac_cv_lib_BSD_signal" >&6; } if test "x$ac_cv_lib_BSD_signal" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBBSD 1 _ACEOF LIBS="-lBSD $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for signal in -lbsd" >&5 $as_echo_n "checking for signal in -lbsd... " >&6; } if ${ac_cv_lib_bsd_signal+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lbsd $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char signal (); int main () { return signal (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_bsd_signal=yes else ac_cv_lib_bsd_signal=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_bsd_signal" >&5 $as_echo "$ac_cv_lib_bsd_signal" >&6; } if test "x$ac_cv_lib_bsd_signal" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBBSD 1 _ACEOF LIBS="-lbsd $LIBS" fi tcap=no { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetstr in -ltermcap" >&5 $as_echo_n "checking for tgetstr in -ltermcap... " >&6; } if ${ac_cv_lib_termcap_tgetstr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltermcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tgetstr (); int main () { return tgetstr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_termcap_tgetstr=yes else ac_cv_lib_termcap_tgetstr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termcap_tgetstr" >&5 $as_echo "$ac_cv_lib_termcap_tgetstr" >&6; } if test "x$ac_cv_lib_termcap_tgetstr" = xyes; then : $as_echo "#define HAVE_LIBTERMCAP 1" >>confdefs.h LIBS="$LIBS -ltermcap" tcap=yes fi if test $tcap = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetstr in -ltermlib" >&5 $as_echo_n "checking for tgetstr in -ltermlib... " >&6; } if ${ac_cv_lib_termlib_tgetstr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-ltermlib $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tgetstr (); int main () { return tgetstr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_termlib_tgetstr=yes else ac_cv_lib_termlib_tgetstr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_termlib_tgetstr" >&5 $as_echo "$ac_cv_lib_termlib_tgetstr" >&6; } if test "x$ac_cv_lib_termlib_tgetstr" = xyes; then : $as_echo "#define HAVE_LIBTERMLIB 1" >>confdefs.h LIBS="$LIBS -ltermlib" tcap=yes fi fi if test $tcap = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetstr in -lcurses" >&5 $as_echo_n "checking for tgetstr in -lcurses... " >&6; } if ${ac_cv_lib_curses_tgetstr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lcurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tgetstr (); int main () { return tgetstr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_curses_tgetstr=yes else ac_cv_lib_curses_tgetstr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_curses_tgetstr" >&5 $as_echo "$ac_cv_lib_curses_tgetstr" >&6; } if test "x$ac_cv_lib_curses_tgetstr" = xyes; then : $as_echo "#define HAVE_LIBCURSES 1" >>confdefs.h LIBS="$LIBS -lcurses" tcap=yes fi fi if test $tcap = no; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for tgetstr in -lncurses" >&5 $as_echo_n "checking for tgetstr in -lncurses... " >&6; } if ${ac_cv_lib_ncurses_tgetstr+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lncurses $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char tgetstr (); int main () { return tgetstr (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_ncurses_tgetstr=yes else ac_cv_lib_ncurses_tgetstr=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ncurses_tgetstr" >&5 $as_echo "$ac_cv_lib_ncurses_tgetstr" >&6; } if test "x$ac_cv_lib_ncurses_tgetstr" = xyes; then : $as_echo "#define HAVE_LIBCURSES 1" >>confdefs.h LIBS="$LIBS -lncurses" tcap=yes fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in sgtty.h termio.h unistd.h string.h termcap.h termlib.h curses.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if ${ac_cv_type_signal+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF for ac_func in usleep srandom sigvec sigsetmask drem irint memcpy do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test $ac_cv_c_compiler_gnu = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 $as_echo_n "checking whether $CC needs -traditional... " >&6; } if ${ac_cv_prog_gcc_traditional+:} false; then : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi if test "$no_x" != yes; then LIBS="$LIBS -lX11" fi ac_config_files="$ac_config_files makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by ucblogo $as_me 6.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ ucblogo config.status 6.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "makefile") CONFIG_FILES="$CONFIG_FILES makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ "$ac_tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined" >&2;} rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ucblogo-6.1/config.h.in0000664000175000017500000000364213575571772013165 0ustar jjcjjc/* config.h.in. Generated automatically from configure.in by autoheader. */ /* Define if you need to in order for stat and other things to work. */ #undef _POSIX_SOURCE /* Define as the return instruction for signal handlers. */ #define SIGRET /* Define as the return type of signal handlers (int or void). */ #undef RETSIGTYPE /* Define if signal handlers take an argument. */ #define SIG_TAKES_ARG /* Define to `unsigned' if doesn't define. */ #undef size_t /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if you have the matherr function. */ #undef HAVE_MATHERR /* Define if you have the sigsetmask function. */ #undef HAVE_SIGSETMASK /* Define if you have the sigvec function. */ #undef HAVE_SIGVEC /* Define if you have the srandom function. */ #undef HAVE_SRANDOM /* Define if you have the usleep function. */ #undef HAVE_USLEEP /* Define if you have the memcpy function. */ #undef HAVE_MEMCPY /* Define if you have the header file. */ #undef HAVE_SGTTY_H /* Define if you have the header file. */ #undef HAVE_TERMIO_H /* Define if you have the header file. */ #undef HAVE_UNISTD_H /* Define if you have the header file. */ #undef HAVE_STRING_H /* Define if you have the header file. */ #undef HAVE_TERMCAP_H /* Define if you have the header file. */ #undef HAVE_TERMLIB_H /* Define if you have the header file. */ #undef HAVE_CURSES_H /* Define if you have the BSD library (-lBSD). */ #undef HAVE_LIBBSD /* Define if you have the curses library (-lcurses). */ #undef HAVE_LIBCURSES /* Define if you have the m library (-lm). */ #undef HAVE_LIBM /* Define if you have the termcap library (-ltermcap). */ #undef HAVE_LIBTERMCAP /* Define if you have the termlib library (-ltermlib). */ #undef HAVE_LIBTERMLIB /* Define if you have the wx library. */ #undef HAVE_WX ucblogo-6.1/changes.txt0000664000175000017500000000532713557147341013304 0ustar jjcjjcThere are two main hooks in the original logo where we put our changes for the wx GUI. One of these was for the graphics. This system which was used was part of the exist logo method for implementing graphics on different platforms. If you look at the top of graphics.c, there are a whole group of #ifdef, #includes, checking for each platform. As can be seen, we included wxGraphics.h if HAVE_WX is defined. This macro is defined during configuration if the --wx option is enabled during configuration. All of the definitions in the header point to function definitions particular to our WX implementation. This right here is sufficient to take care of all of the turtle graphics functionality. All of the corresponding functions defined in this header are defined in wxTurtleGraphics.cpp The other main hook was for our terminal. There are only a few places where anything is done for this. Most of the I/O for the terminal is done through calls to putc and getc, so instead of calling these routines, we have them call getFromWX and printToScreen instead which are defined in wxMain.cpp. The files which call getc where we do this are files.c and parse.c. We define putc to be printToScreen in the header globals.h as they did for other platforms, but it is only used in parse.c. We also defined wx_fgets as a replacement for fgets which is called in coms.c and wrksp.c, as well as flushFile as a replacement for fflush called in a few files. Both of these are also defined in wxMain.cpp. By defining these basic I/O functions and the graphics functions, the original logo is basically untouched. The main graphics routines as mentioned before are in wxTurtleGraphics.cpp. Here, the class TurtleCanvas is defined. In this file, we have a bunch of extern "C" routines which are called from graphics.c. These post messages to the GUI thread and have operations handled for them in the TurtleCanvas class. Some of these are routines for drawing lines, getting the size of the current GUI screen, and other similar things. The Main terminal routines are defined in both wxMain.cpp and wxTerminal.cpp. Again, there are extern "C" routines defined in wxMain.cpp. The terminal printing function adds a character to printing buffer and signals the GUI to print it. Then the handling routine printText in the class wxTerminal in wxTerminal.cpp handles the actual drawing of the text to the GUI. Similarly, the GUI takes in all of the input entered by way of the onChar handler, and when an enter is pressed, it makes it available to the logo interpreter. When the interpreter calls getc, it retrieves a character from this available buffer. If nothing is available at the time, it is put to sleep and woken up by the GUI when something is made available. ucblogo-6.1/TextEditor.h0000664000175000017500000000141313557147341013367 0ustar jjcjjc#include class TextEditor : public wxTextCtrl{ public: TextEditor(wxWindow* const, int, wxString, const wxPoint&, const wxSize&, int, wxFont font); void OnSave(); void OnFind(); void OnFindNext(); void DoPaste(); void DoCopy(); void DoCut(); void DoPrint(); void OnCloseAccept(); void OnCloseReject(); bool Load(const wxString& filename); void SetFont(wxFont font); void SetThisFont(wxCommandEvent&); int stateFlag; int doSave; private: wxFindReplaceDialog *findDlg; wxFindReplaceData *findData; wxString *prevFind; wxFont font; void OnCloseEvent(wxCloseEvent& event); void OnFindDialog(wxFindDialogEvent& event); void Close(); int Find (const wxString & sSearch, int start); wxString file; DECLARE_EVENT_TABLE() }; ucblogo-6.1/TextEditor.cpp0000664000175000017500000001536613557147341013736 0ustar jjcjjc#include #include "wx/wx.h" //#include "gterm.hpp" #include "LogoFrame.h" #include "wxGlobals.h" #include #include #include #include #include #include #include "TextEditor.h" #include "wxTurtleGraphics.h" #include "wxTerminal.h" /* must come after wxTurtleGraphics.h */ // ---------------------------------------------------------------------------- // TextEditor // ---------------------------------------------------------------------------- BEGIN_EVENT_TABLE (TextEditor, wxTextCtrl) EVT_CHAR(TextEditor::OnChar) EVT_TEXT(wxID_ANY, TextEditor::SetThisFont) EVT_FIND(wxID_ANY, TextEditor::OnFindDialog) EVT_CLOSE(TextEditor::OnCloseEvent) END_EVENT_TABLE() // globals for signalling to logo int editor_active = 0; /* The constructor */ TextEditor::TextEditor(wxWindow* const f, int a, wxString s, const wxPoint& p , const wxSize& sz, int b, wxFont font ) : wxTextCtrl(f, a, s, p, sz, b) { findDlg=0; findData=0; prevFind=0; this->font = font; SetFont(font); } void TextEditor::SetFont(wxFont font){ this->font = font; #ifdef __WXMAC__ SetDefaultStyle(wxTextAttr(wxNullColour,wxNullColour, font)); if(this->IsShown()){ SetStyle(0,GetLastPosition(), wxTextAttr(wxNullColour,wxNullColour,font)); #else SetDefaultStyle(wxTextAttr(TurtleCanvas::colors[wxTerminal::terminal->m_curFG], TurtleCanvas::colors[wxTerminal::terminal->m_curBG], font)); if(this->IsShown()){ SetStyle(0,GetLastPosition(), wxTextAttr(TurtleCanvas::colors[wxTerminal::terminal->m_curFG], TurtleCanvas::colors[wxTerminal::terminal->m_curBG],font)); SetBackgroundColour( TurtleCanvas::colors[wxTerminal::terminal->m_curBG]); #endif Refresh(); Update(); } } void TextEditor::SetThisFont(wxCommandEvent& event) { #ifdef __WXMAC__ SetDefaultStyle(wxTextAttr(wxNullColour,wxNullColour, this->font)); if(this->IsShown()){ SetStyle(GetLastPosition()-1, GetLastPosition(), wxTextAttr(wxNullColour,wxNullColour,this->font)); #else SetDefaultStyle(wxTextAttr(TurtleCanvas::colors[wxTerminal::terminal->m_curFG], TurtleCanvas::colors[wxTerminal::terminal->m_curBG], this->font)); if(this->IsShown()){ SetStyle(GetLastPosition()-1, GetLastPosition(), wxTextAttr(TurtleCanvas::colors[wxTerminal::terminal->m_curFG], TurtleCanvas::colors[wxTerminal::terminal->m_curBG],this->font)); SetBackgroundColour( TurtleCanvas::colors[wxTerminal::terminal->m_curBG]); #endif Refresh(); Update(); Refresh(); Update(); } } /* Loads the given filename into the text editor*/ bool TextEditor::Load(const wxString& filename){ file = filename; LoadFile(file); SetFont(font); return true; } void TextEditor::OnFindNext(){ wxFindDialogEvent event; event.SetFindString(*prevFind); OnFindDialog(event); } void TextEditor::OnFind(){ if(findDlg) return; findData = new wxFindReplaceData(); findDlg = new wxFindReplaceDialog(this, findData, wxString("Find...", wxConvUTF8), wxFR_NOWHOLEWORD | wxFR_NOMATCHCASE | wxFR_NOUPDOWN ); findDlg->Show(TRUE); } /* This is called when someone pressed the Find button inside the finder dialog */ void TextEditor::OnFindDialog(wxFindDialogEvent& event) { long int start, end, dummy, loc; end = GetLastPosition(); wxString textstring(GetRange(0, GetLastPosition())); GetSelection(&dummy,&start); wxString findString(event.GetFindString()); if(prevFind){ delete prevFind; } prevFind = new wxString(findString); loc = Find(findString, start); // if we didn't find anything, try again from the beginning if (loc == -1 && start != 0){ start = 0; loc = Find(findString, start); } if (loc == -1){ wxMessageDialog dlg(this, wxString("Not Found", wxConvUTF8), wxString("Find String Not Found", wxConvUTF8), wxOK | wxICON_INFORMATION); dlg.ShowModal(); dlg.Destroy(); if (findDlg){ if (loc == -1) findDlg->SetFocus(); return; } } else{ if(findDlg){ delete findDlg->GetData(); findDlg->Destroy(); findDlg=0; } ShowPosition(loc); } } /* This finds the next instance of a search string ESEARCH within the entire text of the editor starting from START */ int TextEditor::Find (const wxString & sSearch, int start){ wxString allText = GetValue(); wxString sText = allText.Mid(start); // the replace is for windows compatibility #ifdef __WXMSW__ sText.Replace(wxT( "\n" ), wxT( " \n" ) ) ; #endif int iStart =sText.Find (sSearch); if(iStart == -1) return -1; if(iStart==0){ if(sText.Mid(0,sSearch.length()) != sSearch) return -1; } int iEnd = iStart + sSearch.Length(); SetSelection (iStart+start, iEnd+start); return iStart+start ; } void TextEditor::DoCut(){ this->Cut(); } void TextEditor::DoCopy(){ this->Copy(); } void TextEditor::DoPaste(){ this->Paste(); } void TextEditor::OnCloseEvent(wxCloseEvent& event){ OnCloseReject(); } extern "C" int getTermInfo(int); extern "C" void setTermInfo(int,int); /* Closes the text editor and saves changes */ void TextEditor::OnCloseAccept(){ doSave=1; if(getTermInfo(EDIT_STATE) == NO_INFO){ wxMessageDialog dialog( NULL, _T("Load changes into Logo?"), _T("Load Changes"), wxNO_DEFAULT|wxYES_NO|wxCANCEL|wxICON_INFORMATION); switch ( dialog.ShowModal() ) { case wxID_YES: setTermInfo(EDIT_STATE,DO_LOAD); break; case wxID_NO: setTermInfo(EDIT_STATE,NO_LOAD); break; case wxID_CANCEL: return; default: wxLogError(wxT("Unexpected wxMessageDialog return code!")); } } OnSave(); Close(); } /* Closes the text editor but does not save changes */ void TextEditor::OnCloseReject(){ doSave=0; Close(); } /* Does the actual closing of the editor by hiding it and bringing back the terminal */ void TextEditor::Close(){ if(findDlg){ delete findDlg->GetData(); findDlg->Destroy(); findDlg = 0; } topsizer->Show(wxTerminal::terminal, 1); topsizer->Show((wxWindow *)turtleGraphics, turtleGraphics->getInfo(IN_GRAPHICS_MODE)); topsizer->Show(editWindow, 0); topsizer->Layout(); wxTerminal::terminal->SetFocus(); logoFrame->SetUpMenu(); editor_active = 0; } void TextEditor::OnSave(){ SaveFile(file); } /* Prints out the text in this editor */ void TextEditor::DoPrint(){ if(!wxTerminal::terminal->htmlPrinter) wxTerminal::terminal->htmlPrinter = new wxHtmlEasyPrinting(); int fontsizes[] = { 6, 8, 12, 14, 16, 20, 24 }; wxTerminal::terminal->htmlPrinter->SetFonts(_T("Courier"),_T("Courier"), fontsizes); wxString textString; textString.Clear(); long i; for(i=0;i")); } wxTerminal::terminal->htmlPrinter->PrintText(textString); } ucblogo-6.1/TODO0000664000175000017500000000025613557147341011617 0ustar jjcjjcmac: select font from menu doesn't work stripped libraries (but keep jpeg for snap/stamp?) editor stuff test without -O0 Win: window too far to right, aspect ratio weird ucblogo-6.1/coms.c0000664000175000017500000003024413575571772012245 0ustar jjcjjc/* * coms.c program execution control module dvb * * Copyright (C) 1993 by the Regents of the University of California * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifdef HAVE_WX #define fgets wx_fgets extern int check_wx_stop(int force_yield); #endif #define WANT_EVAL_REGS 1 #include "logo.h" #include "globals.h" #include #ifdef HAVE_UNISTD_H #include #endif #ifdef ibm #include "process.h" #endif #ifdef mac #include #include #endif #ifdef __RZTC__ #include #include #include #include #endif #ifdef HAVE_TERMIO_H #ifdef HAVE_WX #include #else #include #endif #else #ifdef HAVE_SGTTY_H #include #endif #endif NODE *make_cont(enum labels cont, NODE *val) { #ifdef __RZTC__ union { enum labels lll; NODE *ppp;} cast; #endif NODE *retval = cons(NIL, val); #ifdef __RZTC__ cast.lll = cont; retval->n_car = cast.ppp; #else retval->n_car = (NODE *)cont; #endif settype(retval, CONT); return retval; } NODE *loutput(NODE *arg) { if (NOT_THROWING) { if (ufun == NIL) { err_logo(AT_TOPLEVEL, fun); } else if (val_status & OUTPUT_TAIL /* This happens if OP seen when val_status & STOP_OK */ || !(val_status & OUTPUT_OK)) { /* This happens on OP OP 3 */ if (didnt_output_name == NIL) didnt_output_name = fun; if (didnt_get_output == UNBOUND) { didnt_get_output = cons_list(0,theName(Name_output), ufun,this_line,END_OF_LIST); /* Not quite right; could be .maybeoutput */ didnt_output_name = fun; } err_logo(DIDNT_OUTPUT, NIL); } else { stopping_flag = OUTPUT; output_unode = current_unode; output_node = car(arg); } } return(UNBOUND); } NODE *lstop(NODE *args) { if (NOT_THROWING) { if (ufun == NIL) err_logo(AT_TOPLEVEL, theName(Name_stop)); else if (val_status & OUTPUT_TAIL || !(val_status & STOP_OK)) { didnt_output_name = fun; err_logo(DIDNT_OUTPUT, NIL); } else { stopping_flag = STOP; output_unode = current_unode; } } return(UNBOUND); } NODE *lthrow(NODE *arg) { if (NOT_THROWING) { if (isName(car(arg), Name_error)) { if (cdr(arg) != NIL) err_logo(USER_ERR_MESSAGE, cadr(arg)); else err_logo(USER_ERR, UNBOUND); } else { stopping_flag = THROWING; throw_node = car(arg); if (cdr(arg) != NIL) output_node = cadr(arg); else output_node = UNBOUND; } } return(UNBOUND); } NODE *lcatch(NODE *args) { return make_cont(catch_continuation, cons(car(args), lrun(cdr(args)))); } extern NODE *evaluator(NODE *list, enum labels where); int torf_arg(NODE *args) { NODE *arg = car(args); while (NOT_THROWING) { if (is_list(arg)) { /* accept a list and run it */ val_status = VALUE_OK; arg = evaluator(arg, begin_seq); } if (isName(arg, Name_true)) return TRUE; if (isName(arg, Name_false)) return FALSE; if (NOT_THROWING) arg = err_logo(BAD_DATA, arg); } return -1; } NODE *lgoto(NODE *args) { return make_cont(goto_continuation, car(args)); } NODE *ltag(NODE *args) { return UNBOUND; } NODE *lnot(NODE *args) { int arg = torf_arg(args); if (NOT_THROWING) { if (arg) return(FalseName()); else return(TrueName()); } return(UNBOUND); } NODE *land(NODE *args) { int arg; if (args == NIL) return(TrueName()); while (NOT_THROWING) { arg = torf_arg(args); if (arg == FALSE) return(FalseName()); args = cdr(args); if (args == NIL) break; } if (NOT_THROWING) return(TrueName()); else return(UNBOUND); } NODE *lor(NODE *args) { int arg; if (args == NIL) return(FalseName()); while (NOT_THROWING) { arg = torf_arg(args); if (arg == TRUE) return(TrueName()); args = cdr(args); if (args == NIL) break; } if (NOT_THROWING) return(FalseName()); else return(UNBOUND); } NODE *runnable_arg(NODE *args) { NODE *arg = car(args); if (!aggregate(arg)) { setcar(args, parser(arg, TRUE)); arg = car(args); } while (!is_list(arg) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); } return(arg); } NODE *lif(NODE *args) { /* macroized */ NODE *yes; int pred; if (cddr(args) != NIL) return(lifelse(args)); pred = torf_arg(args); yes = runnable_arg(cdr(args)); if (NOT_THROWING) { if (pred) return(yes); return(NIL); } return(UNBOUND); } NODE *lifelse(NODE *args) { /* macroized */ NODE *yes, *no; int pred; pred = torf_arg(args); yes = runnable_arg(cdr(args)); no = runnable_arg(cddr(args)); if (NOT_THROWING) { if (pred) return(yes); return(no); } return(UNBOUND); } NODE *lrun(NODE *args) { /* macroized */ NODE *arg = runnable_arg(args); if (NOT_THROWING) return(arg); return(UNBOUND); } NODE *lrunresult(NODE *args) { return make_cont(runresult_continuation, lrun(args)); } NODE *pos_int_arg(NODE *args) { NODE *arg = car(args), *val; FIXNUM i; FLONUM f; val = cnv_node_to_numnode(arg); while ((nodetype(val) != INT || getint(val) < 0) && NOT_THROWING) { if (nodetype(val) == FLOATT && fmod((f = getfloat(val)), 1.0) == 0.0 && f >= 0.0 && f < (FLONUM)MAXLOGOINT) { #if HAVE_IRINT i = irint(f); #else i = (FIXNUM)f; #endif val = make_intnode(i); break; } setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); val = cnv_node_to_numnode(arg); } setcar(args,val); if (nodetype(val) == INT) return(val); return UNBOUND; } NODE *lrepeat(NODE *args) { NODE *cnt, *torpt, *retval = NIL; cnt = pos_int_arg(args); torpt = lrun(cdr(args)); if (NOT_THROWING) { retval = make_cont(repeat_continuation, cons(cnt,torpt)); } return(retval); } NODE *lrepcount(NODE *args) { return make_intnode(user_repcount); } NODE *lforever(NODE *args) { NODE *torpt = lrun(args); if (NOT_THROWING) return make_cont(repeat_continuation, cons(make_intnode(-1), torpt)); return NIL; } NODE *ltest(NODE *args) { int arg = torf_arg(args); if (ufun != NIL && tailcall != 0) return UNBOUND; if (NOT_THROWING) { dont_fix_ift = arg+1; } return(UNBOUND); } NODE *liftrue(NODE *args) { if (ift_iff_flag < 0) return(err_logo(NO_TEST,NIL)); else if (ift_iff_flag > 0) return(lrun(args)); else return(NIL); } NODE *liffalse(NODE *args) { if (ift_iff_flag < 0) return(err_logo(NO_TEST,NIL)); else if (ift_iff_flag == 0) return(lrun(args)); else return(NIL); } void prepare_to_exit(BOOLEAN okay) { #ifdef HAVE_WX extern void doClose(); doClose(); wxLogoExit (0); #endif #ifdef mac if (okay) { console_options.pause_atexit = 0; exit(0); } #endif #ifndef WIN32 /* sowings */ #ifdef ibm ltextscreen(NIL); ibm_plain_mode(); #ifdef __RZTC__ msm_term(); zflush(); controlc_close(); #endif #endif #endif /* !WIN32 */ #ifdef unix #ifndef HAVE_UNISTD_H extern int getpid(); #endif char ef[30]; charmode_off(); sprintf(ef, "/tmp/logo%d", (int)getpid()); unlink(ef); #endif } NODE *lbye(NODE *args) { prepare_to_exit(TRUE); if (ufun != NIL || loadstream != stdin) exit(0); #ifndef WIN32 if (isatty(0) && isatty(1)) #endif lcleartext(NIL); ndprintf(stdout, "%t\n", message_texts[THANK_YOU]); ndprintf(stdout, "%t\n", message_texts[NICE_DAY]); #ifdef __RZTC__ printf("\n"); #endif #ifdef HAVE_WX wx_leave_mainloop++; return UNBOUND; #else exit(0); return UNBOUND; /* not reached, but makes compiler happy */ #endif } NODE *lwait(NODE *args) { NODE *num; unsigned int n; #if defined(unix) && HAVE_USLEEP unsigned int seconds, microseconds; #endif #ifdef mac long target; extern void ProcessEvent(void); #endif num = pos_int_arg(args); if (NOT_THROWING) { /*#ifdef HAVE_WX n = (unsigned int)getint(num) * 10; // milliseconds wxLogoSleep(n); return(UNBOUND); #endif*/ #ifndef HAVE_WX #ifdef WIN32 win32_update_text(); #else fflush(stdout); /* csls v. 1 p. 7 */ #endif #else //doesn't seem to work in WX. now done in wxLogoSleep //fflush(stdout); /* csls v. 1 p. 7 */ #endif #if defined(__RZTC__) zflush(); #endif fix_turtle_shownness(); #ifdef HAVE_WX n = (unsigned int)getint(num) * 100 / 6; // milliseconds wxLogoSleep(n); //check_throwing; return(UNBOUND); #endif if (getint(num) > 0) { #ifdef unix #ifdef HAVE_USLEEP n = (unsigned int)getint(num); if (seconds = n / 60) sleep(seconds); if (microseconds = (n % 60) * 16667) usleep(microseconds); #else n = (unsigned int)getint(num) / 60; sleep(n); #endif #elif defined(__RZTC__) usleep(getint(num) * 16667L); #elif defined(mac) target = getint(num)+TickCount(); while (TickCount() < target) { if (check_throwing) break; ProcessEvent(); } #elif defined(_MSC_VER) n = (unsigned int)getint(num); while (n > 60) { _sleep(1000); n -= 60; if (check_throwing) n = 0; } if (n > 0) _sleep(n*1000/60); #else /* unreachable, I think */ if (!setjmp(iblk_buf)) { input_blocking++; n = ((unsigned int)getint(num)+30) / 60; if (n > 0) sleep(n); } input_blocking = 0; #endif } } return(UNBOUND); } NODE *lshell(NODE *args) { #if defined(mac) printf("%s\n", message_texts[NOSHELL_MAC]); return(UNBOUND); #else #ifdef ibm NODE *arg; char doscmd[200]; /* union REGS r; */ char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; arg = car(args); while (!is_list(arg) && NOT_THROWING) { setcar(args, err_logo(BAD_DATA, arg)); arg = car(args); } if (arg == NIL) { ndprintf(stdout, "%t\n", message_texts[TYPE_EXIT]); if (spawnlp(P_WAIT, "command", "command", NULL)) err_logo(FILE_ERROR, make_static_strnode ("Could not open shell (probably due to low memory)")); } else { print_stringlen = 199; print_stringptr = doscmd; ndprintf((FILE *)NULL,"%p",arg); *print_stringptr = '\0'; if (system(doscmd) < 0) err_logo(FILE_ERROR, make_static_strnode ("Could not open shell (probably due to low memory)")); print_stringptr = old_stringptr; print_stringlen = old_stringlen; } /* r.h.ah = 0x3; r.h.al = 0; r.h.dh = 0; r.h.dl = 0; int86(0x21, &r, &r); x_coord = x_margin; y_coord = r.h.dh; */ #ifndef WIN32 x_coord = x_margin; y_coord = y_max; ibm_gotoxy(x_coord, y_coord); #else win32_repaint_screen(); #endif return(UNBOUND); #else extern FILE *popen(); char cmdbuf[300]; FILE *strm; NODE *head = NIL, *tail = NIL, *this; BOOLEAN wordmode = FALSE; int len; char *old_stringptr = print_stringptr; int old_stringlen = print_stringlen; if (cdr(args) != NIL) wordmode = TRUE; print_stringptr = cmdbuf; print_stringlen = 300; ndprintf((FILE *)NULL,"%p\n",car(args)); *print_stringptr = '\0'; #ifdef __WXMSW__ strm = _popen(cmdbuf,"r"); #else strm = popen(cmdbuf,"r"); #endif print_stringptr = old_stringptr; print_stringlen = old_stringlen; fgets(cmdbuf,300,strm); while (!feof(strm)) { len = (int)strlen(cmdbuf); if (cmdbuf[len-1] == '\n') cmdbuf[--len] = '\0'; if (wordmode) this = make_strnode(cmdbuf, (struct string_block *)NULL, len, STRING, strnzcpy); else this = parser(make_static_strnode(cmdbuf), FALSE); if (head == NIL) { tail = head = cons(this,NIL); } else { setcdr(tail, cons(this,NIL)); tail = cdr(tail); } fgets(cmdbuf,300,strm); } #ifdef __WXMSW__ _pclose(strm); #else pclose(strm); #endif return(head); #endif #endif } ucblogo-6.1/PkgInfo0000664000175000017500000000001113557147341012374 0ustar jjcjjcAPPLUCBL ucblogo-6.1/Messages.zh_TW0000664000175000017500000000550113601420003013624 0ustar jjcjjc; UCBLogo message file version 6.1 ; Error messages -- position in this file corresponds to error number ; Lines starting with semicolon don't count in the line numbering ; and may be added at will. Logo: 嚴重的內部錯誤。 超出容量 堆疊溢出 海龜超出邊界 %p 不喜歡用 %s 做為輸入 %p 並沒有輸出到 %p 給 %p 的輸入不足 %p 不喜歡用 %s 做為輸入 給 %p 的輸入太多 你沒說要如何做 %s 太多的 '(' %s 沒有任何值 預料之外的 ')' 我不知道要如何 %p 找不到 %p 的抓取標記 %p 已經定義過 停止中… 已經滴落 檔案系統錯誤: %p 假設你的意思是 IFELSE,而不是 IF %p 被本地的程序呼叫所掩蔽 擲出 "Error %p 是一個基本詞 無法在程序之中使用 TO 我不知道如何去 %p %p 而沒有 TEST 預料之外的 ']' 預料之外的 '}' 無法啟始圖形 巨集程式傳回 %s 而不是一個串列 你沒有說用 %s 做什麼 可以在程序之中只使用 %p APPLY 不喜歡用 %s 做為輸入 END 於 %p 中在多列指令之內 Logo: 耗盡記憶體。 %p END 在多列指令之內 不當的可選輸入預設表示式: %s 無法在 RUNRESULT 之內使用 OUTPUT 或 STOP 假設你的意思是 '%p',而不是 %p 我無法開啟檔案 %p 檔案 %p 已經開啟 檔案 %p 沒有開啟 Runlist %s has more than one expression Variable name %s is defined both dynamically and in current object ; Non-error messages (no numeric error code for these) 謝謝你使用 Logo。 祝你今天愉快。 對不起,Mac 上沒有 shell。 輸入 EXIT 來回到 Logo。 位於 %s\n%s 抽出迴圈 暫停中… 停止 輸出 找不到檔案: %t\n 無法 KEYP,在這個系統上沒有 FIONREAD 沒有足夠的記憶體 我無法開啟那個檔案 檔案已經開啟 檔案沒有開啟 Pprop 歡迎使用 Berkeley Logo 版本 %t 你必須在一個程序中使用 OUTPUT 或 STOP。 警告: 記憶體不足以執行垃圾資訊收集器。 GC 已停用 - 儲存重要資料並離開! %s 已定義\n Make %s %s to %p\nend\n\n Plist %s = %s\n 沒有可用的說明。\n 在 %p 上沒有可用的說明。\n --更多-- ; Logo special words, used mostly in Logo-generated messages ; TRUE and FALSE are generated by predicates and accepted by IF etc. 真 假 ; End of a procedure end ; Some names of primitives treated specially in the evaluator ; (You still have to COPYDEF them to match any changes here.) 輸出 停止 跳到 標記 如果 若非 定 .巨集 ; Special CATCH tags 頂層 系統 錯誤 ; How no-value prints in error messages 沒事 ; Outputs from SCREENMODE 文字螢幕 分割螢幕 全螢幕 ; Outputs from PENMODE 繪圖 抹除 反相 ; Outputs from TURTLEMODE 迴轉 圍牆 視窗 ; HELP turns infix operators +-*/=<> into these 和 差 積 商 等於 小於 大於 不大於 不小於 不等於 ; Object stuff 名稱 類別 自身 授權證 起始清單 存在 ucblogo-6.1/Messages.sp0000664000175000017500000000533613601420003013221 0ustar jjcjjc; Spanish version of Berkeley Logo messages file 6.1 ; Error messages -- position in this file corresponds to error number ; Lines starting with semicolon don't count in the line numbering ; and may be added at will. Logo: Error Interno Fatal. no hay espacio desborde de pila tortuga fuera de los lmites a %p no le gust recibir %s %p no entreg nada a %p %p necesita recibir ms cosas a %p no le gust recibir %s demasiadas cosas entre parntesis () No dices qu debo hacer con %s demasiados parntesis '(' %s no tiene un valor todava parntesis ')' inesperado no s cmo realizar %p no puedo encontrar la etiqueta LANZA para %p %p ya est definida Parando... DRIBBLE est activado Error del sistema de archivos: %p Asumo que queras decir SIOTRO, no SI %p cubierta por local en llamada a procedimiento ATRAPA "Error %p es una primitiva No puedes usar PARA dentro de un procedimiento no se cmo realizar %p %p sin PRUEBA corchete ']' inesperado llave '}' inesperada no pude inicializar grficas Macro entreg %s en lugar de una lista No dices qu debo hacer con %s Solo puedes usar %p dentro de un procedimiento a APLICA no le gust recibir %s FIN dentro de una instruccin multi-lnea en %p Logo: Falta de Memoria. %p FIN dentro de una instruccin multi-lnea Mala expresin por defecto para parmetro opcional: %s No puedes usar RESPUESTA o ALTO dentro de ACTIVARESULTADO Asumo que queras decir '%p', no %p No puedo abrir archivo %p Archivo %p ya est abierto Archivo %p no est abierto Runlist %s has more than one expression Variable name %s is defined both dynamically and in current object ; Non-error messages (no numeric error code for these) Gracias por usar Logo. Que tengas un buen da. Lo lamento, no hay 'shell' en la Mac. Escribe EXIT para retornar a Logo. en %s\n%s Lazo ERRACT Pausando... se detuvo responde Archivo no encontrado: %t\n No se puede usar TECLAP, no hay FIONREAD en este sistema No hay suficiente memoria No puedo abrir ese archivo Archivo ya est abierto Archivo no est abierto Pprop Bienvenido a Berkeley Logo versin %t Debes estar dentro de un procedimiento para usar REPUESTA o ALTO. Advertencia: No hay suficiente memoria para ejecutar el recolector de basura. GC deshabilitado - Guarda informacin importante a disco y sal! %s definido\n DA %s %s PARA %p\nFIN\n\n Plista %s = %s\n No hay ayuda disponible.\n No hay ayuda disponible para %p.\n --ms-- cierto falso fin respuesta alto saltoa etiqueta si siotro para .macro toplevel sistema error nada ; Outputs from SCREENMODE textscreen splitscreen fullscreen ; Outputs from PENMODE paint erase reverse ; Outputs from TURTLEMODE wrap fence window ; HELP turns infix operators +-*/=<> into these sum difference product quotient equalp lessp greaterp lessequalp greaterequalp notequalp ucblogo-6.1/Messages.fr0000664000175000017500000000534013575571772013237 0ustar jjcjjc; French version of Berkeley Logo messages file 5.5 ; Error messages -- position in this file corresponds to error number ; Lines starting with semicolon don't count in the line numbering ; and may be added at will. Logo : erreur interne fatale Plus assez de mmoire Dbordement de pile Tortue en dehors des limites %p n'aime pas l'argument %s %p ne donne pas de valeur %p Pas assez d'arguments pour %p %p n'aime pas l'argument %s Trop de choses entre les ( ) Vous ne dites pas ce qu'il faut faire de %s Trop de '(' %s n'a pas de valeur ')' inattendue Je ne connais pas la procdure %p Pas de CATCH correspondant l'tiquette (tag) %p %p est dj dfinie Arrt... Dj en train d'appliquer DRIBBLE Erreur systme de fichiers: %p Supposant que vous voulez dire SINON (IFELSE) et non SI (IF) %p masque dans un appel de procdure Throw "Error %p est une primitive Impossible d'utiliser POUR (TO) dans une procdure Je ne connais pas la procdure %p %p sans TEST ']' inattendu '}' inattendu Impossible d'initialiser le graphisme La macro retourne %s au lieu d'une liste Vous ne dites pas ce qu'il faut faire de %s Ne peux utiliser %p que dans une procdure APPLY n'accepte pas l'argument %s FIN (END) dans une instruction multi-ligne dans %p Plus de mmoire (fatal) %p FIN (END) dans une instruction multi-ligne Expression par dfaut de l'argument optionnel errone: %S Ne peux utiliser RETOURNE (OUTPUT) ou STOPPE (STOP) dans RUNRESULT Supposant que vous voulez dire '%p' et non %p Impossible d'ouvrir fichier %p Fichier %p dj ouvert Fichier %p non ouvert Runlist %s a plus qu'une expression Variable name %s is defined both dynamically and in current object ; Non-error messages (no numeric error code for these) Merci d'utiliser Logo. Bonne journe! Dsol, pas de shell sur le Mac. Tapez EXIT pour revenir Logo dans %s\n%s ERRACT boucle Pause... arrte sort Fichier non trouv: %t\n KEYP impossible, pas de FIONREAD sur ce systme Mmoire insuffisante Impossible d'ouvrir ce fichier Fichier dj ouvert Fichier non ouvert Pprop Bienvenue dans Berkeley Logo version %t Vous devez tre dans une procdure pour utiliser RETOURNE (OUTPUT) ou STOPPE (STOP) Attention: mmoire insuffisante pour lancer le ramasse-miette Ramasse-miette dsactiv - Enregistrez vos donnes et quittez! %s dfinie\n Faire %s %s pour %p\nfin\n\n Plist %s = %s\n Aide indisponible.\n Pas d'aide disponible pour %p.\n --plus-- vrai faux fin retourne stoppe goto tiquette si sinon pour .macro toplevel system error rien ; Outputs from SCREENMODE textscreen splitscreen fullscreen ; Outputs from PENMODE paint erase reverse ; Outputs from TURTLEMODE wrap fence window ; HELP turns infix operators +-*/=<> into these sum difference product quotient equalp lessp greaterp lessequalp greaterequalp notequalp ucblogo-6.1/LogoFrame.h0000664000175000017500000000410313557147341013146 0ustar jjcjjc#ifndef BASIC_H #define BASIC_H #include #include #include "logo.h" // This is the Top level Application Class class LogoApplication : public wxApp { public: virtual bool OnInit(); virtual int OnExit(); virtual int OnRun(); }; // This is the Event Manager for the logo application // allows us to process events while waiting (single-thread wxLogo) class LogoEventManager { public: LogoEventManager(LogoApplication *logoApp); void ProcessEvents(int force_yield = 0); private: LogoApplication *m_logoApp; }; // This is the Top level frame for logo class LogoFrame : public wxFrame { public: LogoFrame( const wxChar *title, int xpos=50, int ypos=50, int width=900, int height=500); void AdjustSize(); void SetUpEditMenu(); void SetUpMenu(); void OnPrintText(wxCommandEvent&); void OnPrintTextPrev(wxCommandEvent&); void OnSelectFont(wxCommandEvent&); void OnIncreaseFont(wxCommandEvent&); void OnDecreaseFont(wxCommandEvent&); private: void OnQuit(wxCommandEvent& WXUNUSED(event)); void OnSave(wxCommandEvent& WXUNUSED(event)); void OnSaveAs(wxCommandEvent& WXUNUSED(event)); void OnLoad(wxCommandEvent& WXUNUSED(event)); void OnTurtlePrintPreview(wxCommandEvent& WXUNUSED(event)); void DoStop(wxCommandEvent& WXUNUSED(event)); void DoPause(wxCommandEvent& WXUNUSED(event)); void DoPaste(wxCommandEvent&); void DoCopy(wxCommandEvent&); void OnPrintTurtle(wxCommandEvent&); void OnEditCloseAccept(wxCommandEvent& WXUNUSED(event)); void OnEditCloseReject(wxCommandEvent& WXUNUSED(event)); void OnEditPrint(wxCommandEvent& WXUNUSED(event)); void OnEditCopy(wxCommandEvent& WXUNUSED(event)); void OnEditCut(wxCommandEvent& WXUNUSED(event)); void OnEditFind(wxCommandEvent& WXUNUSED(event)); void OnEditFindNext(wxCommandEvent& WXUNUSED(event)); void OnEditPaste(wxCommandEvent& WXUNUSED(event)); void OnEditSave(wxCommandEvent& WXUNUSED(event)); void OnEditLoad(wxCommandEvent& WXUNUSED(event)); void OnCloseWindow(wxCloseEvent& event); DECLARE_EVENT_TABLE() }; #endif ucblogo-6.1/Messages0000664000175000017500000000531113601420003012571 0ustar jjcjjc; UCBLogo message file version 6.1 ; Error messages -- position in this file corresponds to error number ; Lines starting with semicolon don't count in the line numbering ; and may be added at will. Logo: Fatal Internal Error. out of space stack overflow turtle out of bounds %p doesn't like %s as input %p didn't output to %p not enough inputs to %p %p doesn't like %s as input too many inputs to %p You don't say what to do with %s too many ('s %s has no value unexpected ')' I don't know how to %p Can't find catch tag for %p %p is already defined Stopping... Already dribbling File system error: %p Assuming you mean IFELSE, not IF %p shadowed by local in procedure call Throw "Error %p is a primitive Can't use TO inside a procedure I don't know how to %p %p without TEST unexpected ']' unexpected '}' couldn't initialize graphics Macro returned %s instead of a list You don't say what to do with %s Can only use %p inside a procedure APPLY doesn't like %s as input END inside multi-line instruction in %p Logo: Out of Memory. %p END inside multi-line instruction Bad default expression for optional input: %s Can't use OUTPUT or STOP inside RUNRESULT Assuming you meant '%p', not %p I can't open file %p File %p already open File %p not open Runlist %s has more than one expression Variable name %s is defined both dynamically and in current object ; Non-error messages (no numeric error code for these) Thank you for using Logo. Have a nice day. Sorry, no shell on the Mac. Type EXIT to return to Logo. in %s\n%s Erract loop Pausing... stops outputs File not found: %t\n Can't KEYP, no FIONREAD on this system Not enough memory I can't open that file File already open File not open Pprop Welcome to Berkeley Logo version %t You must be in a procedure to use OUTPUT or STOP. Warning: Not enough memory to run garbage collector. GC disabled - Save important data and exit! %s defined\n Make %s %s to %p\nend\n\n Plist %s = %s\n No help available.\n No help available on %p.\n --more-- ; Logo special words, used mostly in Logo-generated messages ; TRUE and FALSE are generated by predicates and accepted by IF etc. true false ; End of a procedure end ; Some names of primitives treated specially in the evaluator ; (You still have to COPYDEF them to match any changes here.) output stop goto tag if ifelse to .macro ; Special CATCH tags toplevel system error ; How no-value prints in error messages nothing ; Outputs from SCREENMODE textscreen splitscreen fullscreen ; Outputs from PENMODE paint erase reverse ; Outputs from TURTLEMODE wrap fence window ; HELP turns infix operators +-*/=<> into these sum difference product quotient equalp lessp greaterp lessequalp greaterequalp notequalp ; Object stuff name class self licenseplate initlist exist ucblogo-6.1/Info.plist0000664000175000017500000000104013575571772013100 0ustar jjcjjc CFBundleDevelopmentRegion English CFBundleIconFile logo.icns CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType APPL CFBundleSignature UCBL CFBundleVersion 0.0.1d1 ucblogo-6.1/.gdb_history0000664000175000017500000000073313557147341013445 0ustar jjcjjcbreak wx_clear run step step drawToWindow print drawToWindow print drawToPrinter print drawToWindow step step step print CLEARSCREEN step step step step step step step step step step step stepout help help running show step-mode step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step step bt step continue continue