bkyk8rc3zvpnsf5inmcqq4n3k98cv6hj-my-site-hyper-literate-git.test.suzanne.soy-0.0.1

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 0120d9f0155b2a2143e1af6e431142dfdb7e957c
parent 9e5d391dfb381022b176bc7f42528c8994908a92
Author: Robby Findler <robby@racket-lang.org>
Date:   Tue, 30 May 2000 00:46:33 +0000

...

original commit: 08d0cb3c82a39524ed1949fcf24ca5ef666b9058

Diffstat:
Mcollects/help/help.ss | 6++++--
Acollects/net/cgir.ss | 313+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acollects/net/cgis.ss | 24++++++++++++++++++++++++
Acollects/net/cgiu.ss | 4++++
Acollects/net/dns.ss | 8++++++++
Acollects/net/dnsr.ss | 293+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acollects/net/dnss.ss | 5+++++
Acollects/net/doc.txt | 999+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acollects/net/head.ss | 8++++++++
Acollects/net/headr.ss | 243+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acollects/net/heads.ss | 12++++++++++++
Acollects/net/imap.ss | 8++++++++
Acollects/net/imapr.ss | 379+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acollects/net/imaps.ss | 20++++++++++++++++++++
Mcollects/slatex/slatex-code/defaults.scm | 3+--
Mcollects/srpersist/lib/win32/i386/srpmain.dll | 0
Mcollects/stepper/annotater.ss | 35+++++++++++++++++++++++++----------
Mcollects/stepper/doc.txt | 11+++++------
Mcollects/stepper/marks.ss | 13+++++++++----
Mcollects/stepper/model.ss | 47+++++++++++++++++++++++++++++++++--------------
Mcollects/stepper/reconstructr.ss | 497+++++++++++++++++++++++++++++++++++++++++++++----------------------------------
Mcollects/stepper/sig.ss | 2+-
Mcollects/stepper/utils.ss | 2+-
Mcollects/stepper/view-controller.ss | 5++---
Mcollects/tests/drscheme/language-test.ss | 43+++++++++++++++++++++++++++++++++++++------
Mcollects/tests/drscheme/repl-test.ss | 28++++++++++++++--------------
Mcollects/tests/framework/frame.ss | 47+++++++++++++++++++++++++----------------------
Mcollects/tests/framework/load.ss | 24++++++++++++++++++++++++
Mcollects/tests/framework/main.ss | 20+++++++++++---------
Mcollects/tests/framework/text.ss | 4++--
Mcollects/userspce/init-paramr.ss | 7+++++++
Mcollects/userspce/interface.ss | 87++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Mcollects/userspce/paramr.ss | 1+
Mcollects/userspce/params.ss | 3++-
Mcollects/userspce/ricedefr.ss | 19+++++++++++++++----
Mcollects/userspce/ricedefs.ss | 3++-
Mcollects/userspce/sig.ss | 2++
Mcollects/zodiac/doc.txt | 683++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Mcollects/zodiac/invoke.ss | 28+++++++++++++++++++++-------
Mcollects/zodiac/link.ss | 98++++++++++++++++++++-----------------------------------------------------------
Acollects/zodiac/link2.ss | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcollects/zodiac/quasi.ss | 20++++++++++++--------
Mcollects/zodiac/reader.ss | 14++++++++------
Mcollects/zodiac/scanner.ss | 21++++++++++-----------
Mcollects/zodiac/scanparm.ss | 18+++++++++++++++---
Mcollects/zodiac/scm-core.ss | 193+++++++++++++++++++++++++++++++++++++++++++++++--------------------------------
Mcollects/zodiac/scm-hanc.ss | 431++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
Mcollects/zodiac/scm-main.ss | 546+++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Mcollects/zodiac/scm-obj.ss | 176+++++++++++++++++++++++++++++++++++++++++++++++++++----------------------------
Mcollects/zodiac/scm-ou.ss | 10++++++----
Mcollects/zodiac/scm-spdy.ss | 168++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
Mcollects/zodiac/scm-unit.ss | 311+++++++++++++++++++++++++++++++++++++++++++++++++------------------------------
Mcollects/zodiac/x.ss | 39+++++++++++++++++++++++++--------------
Mnotes/drscheme/HISTORY | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mnotes/mred/HISTORY | 175+------------------------------------------------------------------------------
Mnotes/mzscheme/HISTORY | 320-------------------------------------------------------------------------------
Mnotes/stepper/DESIGN-NOTES | 20++++++++++++++++++++
Areadme-mac | 2++
Msrc/configure | 145++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
Msrc/cw.sit.hqx | 3931+++++++++++++++++++++++++++++++++++++------------------------------------------
Msrc/mred/mred.cxx | 28++++++++++++++++++++++++++++
Msrc/mred/wxme/wx_medio.cxx | 9++-------
Msrc/mred/wxme/wx_snip.cxx | 40+++++++++++++++++++++++++++++++++++++---
Msrc/mred/wxs/wxs_mede.xc | 2+-
Msrc/mred/wxs/wxs_misc.cxx | 59++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
Msrc/mred/wxs/wxs_misc.xc | 2++
Msrc/mysterx/myspage/eventqueue.cxx | 11-----------
Msrc/mysterx/mysterx.cxx | 55+++----------------------------------------------------
Msrc/mzcom/mzcom.cxx | 8++++----
Msrc/mzcom/mzcom.idl | 1+
Msrc/mzcom/mzobj.cxx | 159+++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------
Msrc/mzcom/mzobj.h | 9++++++++-
Dsrc/mzcom/stdafx.cxx | 12------------
Msrc/mzcom/stdafx.h | 1+
Msrc/mzscheme/configure.in | 31+++++++++++++++++++++++++++----
Msrc/mzscheme/sconfig.h | 2+-
Msrc/mzscheme/src/network.c | 4----
Msrc/mzscheme/src/schpriv.h | 4++++
Msrc/mzscheme/src/schvers.h | 2+-
Msrc/srpersist/srpersist.cxx | 91+++++++++++++++++++++++++++++++++++++------------------------------------------
Msrc/srpersist/srpersist.h | 1-
Msrc/worksp/gc/gc.opt | 0
Msrc/worksp/mred/mred.opt | 0
Msrc/worksp/mzcom/mzcom.dsp | 24++++++++++++------------
Msrc/worksp/mzcom/mzcom.dsw | 24++++++++++++++++++++++++
Asrc/worksp/mzcom/mzcom.h | 382+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/worksp/mzcom/mzcom.mak | 66+++++++++++++++++++++++++-----------------------------------------
Msrc/worksp/mzcom/mzcom.rc | 21++++++++++++++++++---
Asrc/worksp/mzcom/mzcom.rgs | 11+++++++++++
Msrc/worksp/mzscheme/mzscheme.opt | 0
Msrc/worksp/sgc/sgc.opt | 0
Dsrc/worksp/wxs/wxs.opt | 2--
Dsrc/worksp/wxutils/wxutils.dsp | 260-------------------------------------------------------------------------------
Dsrc/worksp/wxutils/wxutils.dsw | 29-----------------------------
Dsrc/worksp/wxutils/wxutils.mak | 589-------------------------------------------------------------------------------
Dsrc/worksp/wxutils/wxutils.opt | 2--
Dsrc/worksp/wxwin/wxwin.dsp | 317-------------------------------------------------------------------------------
Dsrc/worksp/wxwin/wxwin.dsw | 29-----------------------------
Dsrc/worksp/wxwin/wxwin.mak | 829-------------------------------------------------------------------------------
Dsrc/worksp/wxwin/wxwin.opt | 2--
Dsrc/wxcommon/FontDirectory.cxx | 731-------------------------------------------------------------------------------
Dsrc/wxcommon/FontDirectory.h | 61-------------------------------------------------------------
Dsrc/wxcommon/PSDC.cxx | 2290-------------------------------------------------------------------------------
Dsrc/wxcommon/PSDC.h | 299-------------------------------------------------------------------------------
Dsrc/wxcommon/Region.cxx | 845-------------------------------------------------------------------------------
Dsrc/wxcommon/Region.h | 124-------------------------------------------------------------------------------
Dsrc/wxcommon/wb_hash.cxx | 343-------------------------------------------------------------------------------
107 files changed, 7790 insertions(+), 10758 deletions(-)

diff --git a/collects/help/help.ss b/collects/help/help.ss @@ -1,4 +1,4 @@ -;(require-library "errortrace.ss" "errortrace") (error-print-width 180) +(require-library "errortrace.ss" "errortrace") (error-print-width 180) #| TODO: * demonstrate setup-plt launcher @@ -22,6 +22,7 @@ (require-library "invoke.ss")) (define frame-mixin values) +(define (user-defined-doc-position x) #f) (define-values/invoke-unit/sig help:help^ (require-relative-library "helpr.ss") @@ -32,7 +33,8 @@ mzlib:url^ mred^ framework^ - (frame-mixin)) + (frame-mixin) + help:doc-position^) (new-help-frame startup-url) diff --git a/collects/net/cgir.ss b/collects/net/cgir.ss @@ -0,0 +1,313 @@ +(unit/sig mzlib:cgi^ + (import) + + ;; type bindings = list ((symbol . string)) + + ;; -------------------------------------------------------------------- + + ;; Exceptions: + + (define-struct cgi-error ()) + + ;; chars : list (char) + ;; -- gives the suffix which is invalid, not including the `%' + + (define-struct (incomplete-%-suffix struct:cgi-error) (chars)) + + ;; char : char + ;; -- an invalid character in a hex string + + (define-struct (invalid-%-suffix struct:cgi-error) (char)) + + ;; -------------------------------------------------------------------- + + ;; query-chars->string : + ;; list (char) -> string + + ;; -- The input is the characters post-processed as per Web specs, which + ;; is as follows: + ;; spaces are turned into "+"es and lots of things are turned into %XX, + ;; where XX are hex digits, eg, %E7 for ~. The output is a regular + ;; Scheme string with all the characters converted back. + + (define query-chars->string + (lambda (chars) + (list->string + (let loop ((chars chars)) + (if (null? chars) null + (let ((first (car chars)) + (rest (cdr chars))) + (let-values (((this rest) + (cond + ((char=? first #\+) + (values #\space rest)) + ((char=? first #\%) + (if (and (pair? rest) + (pair? (cdr rest))) + (values + (integer->char + (or (string->number + (string + (car rest) (cadr rest)) + 16) + (raise (make-invalid-%-suffix + (if (string->number + (string (car rest)) + 16) + (cadr rest) + (car rest)))))) + (cddr rest)) + (raise + (make-incomplete-%-suffix rest)))) + (else + (values first rest))))) + (cons this (loop rest))))))))) + + ;; string->html : + ;; string -> string + ;; -- the input is raw text, the output is HTML appropriately quoted + + (define string->html + (lambda (s) + (apply string-append + (map (lambda (c) + (case c + ((#\<) "&lt;") + ((#\>) "&gt;") + ((#\&) "&amp;") + (else (string c)))) + (string->list s))))) + + (define default-text-color "#000000") + (define default-bg-color "#ffffff") + (define default-link-color "#cc2200") + (define default-vlink-color "#882200") + (define default-alink-color "#444444") + + ;; generate-html-output : + ;; html-string x list (html-string) x ... -> () + + (define generate-html-output + (opt-lambda (title body-lines + (text-color default-text-color) + (bg-color default-bg-color) + (link-color default-link-color) + (vlink-color default-vlink-color) + (alink-color default-alink-color)) + (let ((sa string-append)) + (for-each + (lambda (l) + (display l) (newline)) + `("Content-type: text/html" + "" + "<html>" + "<!-- The form was processed, and this document was generated," + " using the CGI utilities for MzScheme. For more information" + " on MzScheme, see" + " http://www.cs.rice.edu/CS/PLT/packages/mzscheme/" + " and for the CGI utilities, contact Shriram Krishnamurthi" + " (shriram@cs.rice.edu). -->" + + "<head>" + ,(sa "<title>" title "</title>") + "</head>" + "" + ,(sa "<body bgcolor=\"" bg-color "\" text=\"" text-color "\"") + ,(sa " link=\"" link-color "\"") + ,(sa " vlink=\"" vlink-color "\" alink=\"" alink-color "\">") + "" + ,@body-lines + "" + "</body>" + "</html>"))))) + + ;; read-until-char : + ;; iport x char -> list (char) x bool + ;; -- operates on the default input port; the second value indicates + ;; whether reading stopped because an EOF was hit (as opposed to the + ;; delimiter being seen); the delimiter is not part of the result + + (define read-until-char + (lambda (ip delimiter) + (let loop ((chars '())) + (let ((c (read-char ip))) + (cond + ((eof-object? c) + (values (reverse chars) #t)) + ((char=? c delimiter) + (values (reverse chars) #f)) + (else + (loop (cons c chars)))))))) + + ;; read-name+value : + ;; iport -> (symbol + bool) x (string + bool) x bool + + ;; -- If the first value is false, so is the second, and the third is + ;; true, indicating EOF was reached without any input seen. Otherwise, + ;; the first and second values contain strings and the third is either + ;; true or false depending on whether the EOF has been reached. The + ;; strings are processed to remove the CGI spec "escape"s. + + ;; This code is _slightly_ lax: it allows an input to end in `&'. It's + ;; not clear this is legal by the CGI spec, which suggests that the last + ;; value binding must end in an EOF. It doesn't look like this matters. + ;; It would also introduce needless modality and reduce flexibility. + + (define read-name+value + (lambda (ip) + (let-values + (((name eof?) + (read-until-char ip #\=))) + (cond + ((and eof? (null? name)) + (values #f #f #t)) + (eof? + (generate-error-output + (list "Server generated malformed input for POST method:" + (string-append + "No binding for `" (list->string name) "' field.")))) + (else + (let-values (((value eof?) + (read-until-char ip #\&))) + (values (string->symbol (query-chars->string name)) + (query-chars->string value) + eof?))))))) + + ;; get-bindings/post : + ;; () -> bindings + + (define get-bindings/post + (lambda () + (let-values (((name value eof?) + (read-name+value + (current-input-port)))) + (cond + ((and eof? (not name)) + null) + ((and eof? name) + (list (cons name value))) + (else + (cons (cons name value) + (get-bindings/post))))))) + + ;; get-bindings/get : + ;; () -> bindings + + (define get-bindings/get + (lambda () + (let ((p (open-input-string + (getenv "QUERY_STRING")))) + (let loop () + (let-values (((name value eof?) + (read-name+value p))) + (cond + ((and eof? (not name)) + null) + ((and eof? name) + (list (cons name value))) + (else + (cons (cons name value) + (loop))))))))) + + ;; get-bindings : + ;; () -> bindings + + (define get-bindings + (lambda () + (if (string=? (get-cgi-method) "POST") + (get-bindings/post) + (get-bindings/get)))) + + ;; generate-error-output : + ;; list (html-string) -> <exit> + + (define generate-error-output + (lambda (error-message-lines) + (generate-html-output "Internal Error" + error-message-lines) + (exit))) + + ;; bindings-as-html : + ;; bindings -> list (html-string) + ;; -- formats name-value bindings as HTML appropriate for displaying + + (define bindings-as-html + (lambda (bindings) + `("<code>" + ,@(map + (lambda (bind) + (string-append + (symbol->string (car bind)) + "&nbsp;--&gt;&nbsp;" + (cdr bind) + "<br>")) + bindings) + "</code>"))) + + ;; extract-bindings : + ;; (string + symbol) x bindings -> list (string) + + ;; -- Extracts the bindings associated with a given name. The semantics + ;; of forms states that a CHECKBOX may use the same NAME field multiple + ;; times. Hence, a list of strings is returned. Note that the result + ;; may be the empty list. + + (define extract-bindings + (lambda (field-name bindings) + (let ((field-name (if (symbol? field-name) field-name + (string->symbol field-name)))) + (let loop ((found null) (bindings bindings)) + (if (null? bindings) + found + (if (equal? field-name (caar bindings)) + (loop (cons (cdar bindings) found) (cdr bindings)) + (loop found (cdr bindings)))))))) + + ;; extract-binding/single : + ;; (string + symbol) x bindings -> string + ;; -- used in cases where only one binding is supposed to occur + + (define extract-binding/single + (lambda (field-name bindings) + (let ((field-name (if (symbol? field-name) field-name + (string->symbol field-name)))) + (let ((result (extract-bindings field-name bindings))) + (cond + ((null? result) + (generate-error-output + `(,(string-append "No binding for field `" + (if (symbol? field-name) + (symbol->string field-name) + field-name) + "' in <p>") + ,@(bindings-as-html bindings)))) + ((null? (cdr result)) + (car result)) + (else + (generate-error-output + `(,(string-append "Multiple bindings for field `" + (if (symbol? field-name) + (symbol->string field-name) + field-name) + "' where only one was expected in <p>") + ,@(bindings-as-html bindings))))))))) + + ;; get-cgi-method : + ;; () -> string + ;; -- string is either GET or POST (though future extension is possible) + + (define get-cgi-method + (lambda () + (getenv "REQUEST_METHOD"))) + + ;; generate-link-text : + ;; string x html-string -> html-string + + (define generate-link-text + (lambda (url anchor-text) + (string-append "<a href=\"" url "\">" anchor-text "</a>"))) + + ;; ==================================================================== + + + ) diff --git a/collects/net/cgis.ss b/collects/net/cgis.ss @@ -0,0 +1,24 @@ +(require-library "macro.ss") + +(define-signature mzlib:cgi^ + ( + ;; -- exceptions raised -- + (struct cgi-error ()) + (struct incomplete-%-suffix (chars)) + (struct invalid-%-suffix (char)) + + ;; -- cgi methods -- + get-bindings + get-bindings/post + get-bindings/get + generate-html-output + generate-error-output + bindings-as-html + extract-bindings + extract-binding/single + get-cgi-method + + ;; -- general HTML utilities -- + string->html + generate-link-text + )) diff --git a/collects/net/cgiu.ss b/collects/net/cgiu.ss @@ -0,0 +1,4 @@ +(require-library "refer.ss") +(require-library "cgis.ss" "net") + +(define mzlib:cgi@ (require-library-unit/sig "cgir.ss" "net")) diff --git a/collects/net/dns.ss b/collects/net/dns.ss @@ -0,0 +1,8 @@ + +(require-relative-library "dnss.ss") + +(begin-elaboration-time + (require-library "invoke.ss")) + +(define-values/invoke-unit/sig mzlib:dns^ + (require-relative-library "dnsr.ss")) diff --git a/collects/net/dnsr.ss b/collects/net/dnsr.ss @@ -0,0 +1,293 @@ + +(unit/sig mzlib:dns^ + (import) + + (define types + '((a 1) + (ns 2) + (md 3) + (mf 4) + (cname 5) + (soa 6) + (mb 7) + (mg 8) + (mr 9) + (null 10) + (wks 11) + (ptr 12) + (hinfo 13) + (minfo 14) + (mx 15) + (txt 16))) + + (define classes + '((in 1) + (cs 2) + (ch 3) + (hs 4))) + + (define (cossa i l) + (cond + [(null? l) #f] + [(equal? (cadar l) i) + (car l)] + [else (cossa i (cdr l))])) + + + (define (number->octet-pair n) + (list (integer->char (arithmetic-shift n -8)) + (integer->char (modulo n 256)))) + + (define (octet-pair->number a b) + (+ (arithmetic-shift (char->integer a) 8) + (char->integer b))) + + (define (octet-quad->number a b c d) + (+ (arithmetic-shift (char->integer a) 24) + (arithmetic-shift (char->integer b) 16) + (arithmetic-shift (char->integer c) 8) + (char->integer d))) + + (define (name->octets s) + (let ([do-one (lambda (s) + (cons + (integer->char (string-length s)) + (string->list s)))]) + (let loop ([s s]) + (let ([m (regexp-match "^([^.]*)[.](.*)" s)]) + (if m + (append + (do-one (cadr m)) + (loop (caddr m))) + (append + (do-one s) + (list #\nul))))))) + + (define (make-std-query-header id question-count) + (append + (number->octet-pair id) + (list #\001 #\nul) ; Opcode & flags (recusive flag set) + (number->octet-pair question-count) + (number->octet-pair 0) + (number->octet-pair 0) + (number->octet-pair 0))) + + (define (make-query id name type class) + (append + (make-std-query-header id 1) + (name->octets name) + (number->octet-pair (cadr (assoc type types))) + (number->octet-pair (cadr (assoc class classes))))) + + (define (add-size-tag m) + (append (number->octet-pair (length m)) m)) + + (define (rr-data rr) + (cadddr (cdr rr))) + + (define (rr-type rr) + (cadr rr)) + + (define (rr-name rr) + (car rr)) + + (define (parse-name start reply) + (let ([v (char->integer (car start))]) + (cond + [(zero? v) + ; End of name + (values #f (cdr start))] + [(zero? (bitwise-and #xc0 v)) + ; Normal label + (let loop ([len v][start (cdr start)][accum null]) + (cond + [(zero? len) + (let-values ([(s start) (parse-name start reply)]) + (let ([s0 (list->string (reverse! accum))]) + (values (if s + (string-append s0 "." s) + s0) + start)))] + [else (loop (sub1 len) (cdr start) (cons (car start) accum))]))] + [else + ; Compression offset + (let ([offset (+ (arithmetic-shift (bitwise-and #x3f v) 8) + (char->integer (cadr start)))]) + (let-values ([(s ignore-start) (parse-name (list-tail reply offset) reply)]) + (values s (cddr start))))]))) + + (define (parse-rr start reply) + (let-values ([(name start) (parse-name start reply)]) + (let ([type (car (cossa (octet-pair->number (car start) (cadr start)) types))] + [start (cddr start)]) + (let ([class (car (cossa (octet-pair->number (car start) (cadr start)) classes))] + [start (cddr start)]) + (let ([ttl (octet-quad->number (car start) (cadr start) + (caddr start) (cadddr start))] + [start (cddddr start)]) + (let ([len (octet-pair->number (car start) (cadr start))] + [start (cddr start)]) + ; Extract next len bytes for data: + (let loop ([len len][start start][accum null]) + (if (zero? len) + (values (list name type class ttl (reverse! accum)) + start) + (loop (sub1 len) (cdr start) (cons (car start) accum)))))))))) + + (define (parse-ques start reply) + (let-values ([(name start) (parse-name start reply)]) + (let ([type (car (cossa (octet-pair->number (car start) (cadr start)) types))] + [start (cddr start)]) + (let ([class (car (cossa (octet-pair->number (car start) (cadr start)) classes))] + [start (cddr start)]) + (values (list name type class) start))))) + + (define (parse-n parse start reply n) + (let loop ([n n][start start][accum null]) + (if (zero? n) + (values (reverse! accum) start) + (let-values ([(rr start) (parse start reply)]) + (loop (sub1 n) start (cons rr accum)))))) + + (define (dns-query nameserver addr type class) + (unless (assoc type types) + (raise-type-error 'dns-query "DNS query type" type)) + (unless (assoc class classes) + (raise-type-error 'dns-query "DNS query class" class)) + + (let* ([query (make-query (random 256) addr type class)] + [reply + (let-values ([(r w) (tcp-connect nameserver 53)]) + (dynamic-wind + void + + (lambda () + (display (list->string (add-size-tag query)) w) + (flush-output w) + + (let ([a (read-char r)] + [b (read-char r)]) + (let ([len (octet-pair->number a b)]) + (let ([s (read-string len r)]) + (unless (= len (string-length s)) + (error 'dns-query "unexpected EOF from server")) + (string->list s))))) + + (lambda () + (close-input-port r) + (close-output-port w))))]) + + ; First two bytes must match sent message id: + (unless (and (char=? (car reply) (car query)) + (char=? (cadr reply) (cadr query))) + (error 'dns-query "bad reply id from server")) + + (let ([v0 (caddr reply)] + [v1 (cadddr reply)]) + ; Check for error code: + (let ([rcode (bitwise-and #xf (char->integer v1))]) + (unless (zero? rcode) + (error 'dns-query "error from server: ~a" + (case rcode + [(1) "format error"] + [(2) "server failure"] + [(3) "name error"] + [(4) "not implemented"] + [(5) "refused"])))) + + (let ([qd-count (octet-pair->number (list-ref reply 4) (list-ref reply 5))] + [an-count (octet-pair->number (list-ref reply 6) (list-ref reply 7))] + [ns-count (octet-pair->number (list-ref reply 8) (list-ref reply 9))] + [ar-count (octet-pair->number (list-ref reply 10) (list-ref reply 11))]) + + (let ([start (list-tail reply 12)]) + (let*-values ([(qds start) (parse-n parse-ques start reply qd-count)] + [(ans start) (parse-n parse-rr start reply an-count)] + [(nss start) (parse-n parse-rr start reply ns-count)] + [(ars start) (parse-n parse-rr start reply ar-count)]) + (unless (null? start) + (error 'dns-query "error parsing server reply")) + (values (positive? (bitwise-and #x4 (char->integer v0))) + qds ans nss ars reply))))))) + + (define cache (make-hash-table)) + (define (dns-query/cache nameserver addr type class) + (let ([key (string->symbol (format "~a;~a;~a;~a" nameserver addr type class))]) + (let ([v (hash-table-get cache key (lambda () #f))]) + (if v + (apply values v) + (let-values ([(auth? qds ans nss ars reply) (dns-query nameserver addr type class)]) + (hash-table-put! cache key (list auth? qds ans nss ars reply)) + (values auth? qds ans nss ars reply)))))) + + (define (ip->string s) + (format "~a.~a.~a.~a" + (char->integer (list-ref s 0)) + (char->integer (list-ref s 1)) + (char->integer (list-ref s 2)) + (char->integer (list-ref s 3)))) + + (define (try-forwarding k nameserver) + (let loop ([nameserver nameserver][tried (list nameserver)]) + ; Normally the recusion is done for us, but it's technically optional + (let-values ([(v ars auth?) (k nameserver)]) + (or v + (and (not auth?) + (let* ([ns (ormap + (lambda (ar) + (and (eq? (rr-type ar) 'a) + (ip->string (rr-data ar)))) + ars)]) + (and ns + (not (member ns tried)) + (loop ns (cons ns tried))))))))) + + (define (dns-get-address nameserver addr) + (or (try-forwarding + (lambda (nameserver) + (let-values ([(auth? qds ans nss ars reply) (dns-query/cache nameserver addr 'a 'in)]) + (values (and (positive? (length ans)) + (let ([s (rr-data (car ans))]) + (ip->string s))) + ars auth?))) + nameserver) + (error 'dns-get-address "bad address"))) + + (define (dns-get-mail-exchanger nameserver addr) + (or (try-forwarding + (lambda (nameserver) + (let-values ([(auth? qds ans nss ars reply) (dns-query/cache nameserver addr 'mx 'in)]) + (values (let loop ([ans ans][best-pref +inf.0][exchanger #f]) + (cond + [(null? ans) (or exchanger + ;; Does 'soa mean that the input address is fine? + (and (ormap + (lambda (ns) (eq? (rr-type ns) 'soa)) + nss) + addr))] + [else + (let ([d (rr-data (car ans))]) + (let ([pref (octet-pair->number (car d) (cadr d))]) + (if (< pref best-pref) + (let-values ([(name start) (parse-name (cddr d) reply)]) + (loop (cdr ans) pref name)) + (loop (cdr ans) best-pref exchanger))))])) + ars auth?))) + nameserver) + (error 'dns-get-mail-exchanger "bad address"))) + + (define (dns-find-nameserver) + (case (system-type) + [(unix) (with-handlers ([void (lambda (x) #f)]) + (with-input-from-file "/etc/resolv.conf" + (lambda () + (let loop () + (let ([l (read-line)]) + (or (and (string? l) + (let ([m (regexp-match + (format "nameserver[ ~a]+([0-9]+[.][0-9]+[.][0-9]+[.][0-9]+)" #\tab) + l)]) + (and m (cadr m)))) + (and (not (eof-object? l)) + (loop))))))))] + [else #f]))) diff --git a/collects/net/dnss.ss b/collects/net/dnss.ss @@ -0,0 +1,5 @@ + +(define-signature mzlib:dns^ + (dns-get-address + dns-get-mail-exchanger + dns-find-nameserver)) diff --git a/collects/net/doc.txt b/collects/net/doc.txt @@ -0,0 +1,999 @@ +Time-stamp: <99/10/22 12:42:59 shriram> + +The `net' collection contains libraries that provide access to the +following _Internet_ (quasi-)protocols: + + URL parsing + CGI backends + sendmail + SMTP + NNTP + POP-3 + IMAP + Mail header reading and writing + DNS + +Shriram Krishnamurthi +shriram@cs.rice.edu +Matthew Flatt +mflatt@cs.utah.edu + +========================================================================== +_URL_ posting, _web clients_, _WWW_ +========================================================================== + +Collection: net +Files: _url.ss_, _urlr.ss_, _urls.ss_, _urlu.ss_ + +ABSTRACT ------------------------------------------------------------- + +The url package manages features of URLs. + +TYPES ---------------------------------------------------------------- + +> url + struct url (scheme host port path params query fragment) + scheme : string or #f + host : string or #f + port : number or #f + path : string + params : string or #f + query : string or #f + fragment : string or #f + + The basic structure for all URLs. + + http://www.cs.rice.edu:80/cgi-bin/finger;xyz?name=shriram&host=nw#top + 1 2 3 4 5 6 7 + + 1 = scheme, 2 = host, 3 = port, 4 = path, + 5 = params, 6 = query, 7 = fragment + +> pure-port + + A pure port is one from which the MIME headers have been removed, so + that what remains is purely the first content fragment. + +> mime-header + struct mime-header (name value) + name : string + value : string + + MIME header. + +PROCEDURES ----------------------------------------------------------- + +> (unixpath->path string) -> path-string + + Given a path from a URL structure, turns it into a path that + conforms to the local OS path specifications. Useful for file + accesses on the local disk system. + +> (get-pure-port url [list-of-strings]) -> input-port + + Takes a URL and returns a pure port corresponding to it. Writes the + optional strings to the server. + +> (get-impure-port url [list-of-strings]) -> input-port + + Takes a URL and returns an impure port corresponding to it. Writes + the optional strings to the server. + +> (display-pure-port input-port) -> void + + Writes the output of a pure port. For debugging purposes. + +> (purify-port input-port) -> list-of-mime-headers + + Purifies a port, returning the MIME headers. + +> (string->url string) -> url + + Turns a string into a URL. + +> (netscape/string->url string) -> url + + Turns a string into a URL, applying (what appear to be) Netscape's + conventions on automatically specifying the scheme: a string + starting with a slash gets the scheme "file", while all others get + the scheme "http". + +> (url->string url) -> string + + Generates a string corresponding to the contents of the url struct. + +> (call/input-url url url->port-proc port->void-proc [list-of-strings]) -> void + + First argument is the URL to open. Second is a procedure that takes + a URL and turns it into a (pure or impure) port. The third takes + the (pure or impure) port and handles its contents. The optional + fourth argument is a set of strings to send to the server. + +> (combine-url/relative url string) -> url + + Given a base URL and a relative path, combines the two and returns a + new URL. + +EXAMPLE -------------------------------------------------------------- + + (require-library "url.ss" "net") + (define url:cs (string->url "http://www.cs.rice.edu/")) + (define url:me (string->url "http://www.cs.rice.edu/~shriram/")) + (define comb combine-url/relative) + (define (test url) + (call/input-url url get-pure-port display-pure-port)) + (test url:cs) + +========================================================================== +_CGI_ backends, _WWW_ +========================================================================== + +Collection: net +Libraries: _cgi.ss_, _cgic.ss_, _cgir.ss_, _cgis.ss_, _cgiu.ss_ + +ABSTRACT ------------------------------------------------------------- + +The cgi package helps programmers write scripts that follow the Common +Gateway Interface (CGI) protocol of the World-Wide Web. + +TYPES ---------------------------------------------------------------- + +binding: + + A binding is an association of a form item with its value. Some form + items (such as checkboxes) may correspond to multiple bindings. A + binding is a tag-string pair, where a tag is a symbol or a string. + +bindings: + + A list of `binding's. + +html-string: + + A text string that has been escaped according to HTML conventions. + +EXCEPTIONS ----------------------------------------------------------- + +> cgi-error + struct cgi-error () + + cgi-error is a super-structure for all exceptions thrown by this + library. + +> incomplete-%-suffix + struct (incomplete-%-suffix cgi-error) (chars) + chars : list of chars + + Used when a % in a query is followed by an incomplete suffix. The + characters of the suffix -- excluding the "%" -- are provided by the + exception. + +> invalid-%-suffix + struct (invalid-%-suffix cgi-error) (char) + char : char + + Used when the character immediately following a % in a query is + invalid. + +PROCEDURES ----------------------------------------------------------- + +> (get-bindings) -> bindings +> (get-bindings/post) -> bindings +> (get-bindings/get) -> bindings + + Returns the bindings that corresponding to the options specified by + the user. The /post and /get forms work only when POST and GET + forms are used, respectively, while get-bindings determines the kind + of form that was used and invokes the appropriate function. + +> (extract-bindings symbol-or-string bindings) -> list of strings + + Given a key and a set of bindings, extract-bindings determines which + ones correspond to a given key. There may be zero, one, or many + associations for a given key. + +> (extract-binding/single symbol-or-string bindings) -> string + + Given a key and a set of bindings, extract-binding/single ensures + that the key has exactly one association, and returns it. + +> (generate-html-output html-string list-of-html-strings [color color color color color]) -> void + + The first argument is the title. The second is a list of strings + that consist of the body. The last five arguments are each strings + representing a HTML color; in order, they represent the color of the + text, the background, un-visited links, visited links, and a link + being selected. + +> (string->html string) -> html-string + + Converts a string into an html-string by applying the appropriate + HTML quoting conventions. + +> (generate-link-text string html-string) -> html-string + + Takes a string representing a URL, a html-string for the anchor + text, and generates HTML corresponding to an achor. + +> (generate-error-output list-of-html-strings) -> <exit> + + The procedure takes a series of strings representing the body, + prints them with the subject line "Internal error", and forces the + script to exit. + +> (get-cgi-method) -> string + + Returns either "GET" or "POST". Always returns a string when + invoked inside a CGI script. Unpredictable otherwise. + +> (bindings-as-html bindings) -> list of html-strings + + Converts a set of bindings into a list of html-string's. Useful for + debugging. + +========================================================================== +_sending mail_, _sendmail_ +========================================================================== + +Collection: net +Files: _mail.ss_, _mailr.ss_, _mails.ss_, _mailu.ss_ + +ABSTRACT ------------------------------------------------------------- + +The mail package helps programmers write programs that need to send +electronic mail messages. The package assumes the existence of a +conformant sendmail program on the local system; see also the SMTP +package, below. + +TYPES ---------------------------------------------------------------- + + All strings used in mail messages are assumed to conform to their + corresponding SMTP specifications, except as noted otherwise. + +EXCEPTIONS ----------------------------------------------------------- + +> no-mail-recipients + struct (no-mail-recipients exn) () + + Raised when no mail recipients were specified. + +PROCEDURES ----------------------------------------------------------- + +> (send-mail-message/port from-string subject-string to-list-of-strings cc-list-of-strings bcc-list-of-string) -> output-port + + The first argument is the header for the sender, the second is the + subject line, the third a list of To: recipients, the fourth a list + of CC: recipients, and the fifth a list of BCC: recipients. The + optional sixth argument is used for other mail headers, which must + be specified completely formatted. + + The return value is an output port into which the client must write + the message. Clients are urged to use close-output-port on the + return value as soon as the necessary text has been written, so that + the sendmail process can complete. + + The sender can hold any value, though of course spoofing should be + used with care. + +> (send-mail-message from-string subject-string to-list-of-strings cc-list-of-strings bcc-list-of-string body-list-of-strings [extra-headers-list-of-strings]) -> void + + The arguments are the same as that for send-mail-message/port except + that there is one extra input, the list of strings corresponding to + the mail message (followed by the optional additional headers, if + present). There is no interesting return value. + + Lines that contain a single period do not need to be quoted. + +========================================================================== +_sending mail_, _SMTP_ +========================================================================== + +Collection: net +Files: _smtp.ss_, _smtpr.ss_, _smtps.ss_ + +ABSTRACT ------------------------------------------------------------- + +The SMTP package helps programmers write programs that need to send +electronic mail messages using SMTP. The client must provide the +address of an SMTP server; in contrast, the mail package (see above) +uses a pre-configured sendmail on the local system. + +TYPES ---------------------------------------------------------------- + + The head package defines the format of a `header' string, which is + used by `send-smtp-message'. The head package also provides + utilities to verify the formatting of a mail address. The procedures + of the SMTP package assume that the given string arguments are + well-formed. + +EXCEPTIONS ----------------------------------------------------------- + + Communication errors are signalled via exn:user structure instances. + +PROCEDURES ----------------------------------------------------------- + +> (smtp-send-message server-string from-string to-list-of-strings header message-list-of-strings [port]) -> void + + The first argument is the IP address of the SMTP server. The + `from-string' argument specifies the mail address of the sender, and + `to-listof-strings' is a list of recipient addresses (including + "To", "CC", and "BCC" recipients). The `header' argument is the + complete message header, which should already include "From", "To", + and "CC" fields consistent with the given sender and recipients. + the `message-list-of-strings' argument is the body of the message, + where each string in the list corresponds to a single line of + message text; no string in `message-list-of-strings' should contain + a carriage return or newline characters. The optional `port' + argument specifies the IP port to use in contacting the SMTP server; + the default is 25. + + See the head package for utilities that construct a message headers + and validate mail address strings. + +> (smtp-sending-end-of-message [proc]) + + Parameter that detemines a send-done procedure to be called after + `smtp-send-message' has completely sent the message. Before the + send-done procedure is called, breaking the thread that is executing + `smtp-send-message' cancels the send. After the send-done procedure + is called, breaking may or may not cancel the send (and probably + won't). + +========================================================================== +_NNTP_, _newsgroups_ +========================================================================== + +Collection: net +Files: _nntp.ss_, _nntpr.ss_, _nntps.ss_, _nntpu.ss_ + +ABSTRACT ------------------------------------------------------------- + +The nntp package helps programmers access Usenet groups via the NNTP +protocols. + +TYPES ---------------------------------------------------------------- + +> communicator + struct communicator (sender receiver server port) + sender : oport + receiver : iport + server : string + port : number + + Once a connection to a Usenet server has been established, its state + is stored in a communicator, and other procedures take communicators + as an argument. + +> desired + + A regular expression that matches against a Usenet header. + +EXCEPTIONS ----------------------------------------------------------- + +> nntp + struct (nntp exn) () + + The super-struct of all subsequent exceptions. + +> unexpected-response + struct (unexpected-response nntp) (code text) + code : number + text : string + + Thrown whenever an unexpected response code is received. The text + holds the response text sent by the server. + +> bad-status-line + struct (bad-status-line nntp) (line) + line : string + + Mal-formed status lines. + +> premature-close + struct (premature-close nntp) (communicator) + communicator : communicator + + Thrown when a remote server closes its connection unexpectedly. + +> bad-newsgroup-line + struct (bad-newsgroup-line nntp) (line) + line : string + + When the newsgroup line is improperly formatted. + +> non-existent-group + struct (non-existent-group nntp) (group) + group : string + + When the server does not recognize the name of the requested group. + +> article-not-in-group + struct (article-not-in-group nntp) (article) + article : number + + When an article is outside the server's range for that group. + +> no-group-selected + struct (no-group-selected nntp) () + + When an article operation is used before a group has been selected. + +> article-not-found + struct (article-not-found nntp) (article) + article : number + + When the server is unable to locate the article. + +PROCEDURES ----------------------------------------------------------- + +> (connect-to-server server-string [port-number]) -> communicator + + Connects to the name server. The second argument, if provided, must + be a port number; otherwise the default NNTP port is used. + +> (disconnect-from-server communicator) -> void + + Disconnects a communicator. + +> (open-news-group communicator newsgroup-string) -> three values: number number number + + The second argument is the name of a newsgroup. The returned values + are the total number of articles in that group, the first available + article, and the last available article. + +> (head-of-message communicator message-number) -> list of strings + + Given a message number, returns its headers. + +> (body-of-message communicator message-number) -> list of strings + + Given a message number, returns the body of the message. + +> (make-desired-header tag-string) -> desired + + Takes the header's tag and returns a desired regexp for that header. + +> (extract-desired-headers list-of-header-strings list-of-desireds) -> list of strings + + Given a list of headers and of desired's, returns the header lines + that match any of the desired's. + +========================================================================== +_POP-3_, _reading mail_ +========================================================================== + +Collection: net +Files: _pop3.ss_, _pop3r.ss_, _pop3s.ss_, _pop3u.ss_ + +Note: The pop3.ss invoke-opens the pop3r.ss unit with a "pop3:" prefix. + +ABSTRACT ------------------------------------------------------------- + +Implements RFC 1939, Post Office Protocol - Version 3, Myers & Rose. +http://www.cis.ohio-state.edu/htbin/rfc/rfc1939.html + +TYPES ---------------------------------------------------------------- + +> communicator + struct communicator (sender receiver server port state) + sender : oport + receiver : iport + server : string + port : number + state : symbol = (disconnected, authorization, transaction) + + Once a connection to a POP-3 server has been established, its state + is stored in a communicator, and other procedures take communicators + as an argument. + +> desired + + A regular expression that matches against a mail header. + +EXCEPTIONS ----------------------------------------------------------- + +> pop3 + struct (pop3 exn) () + + The super-struct used for all other package exceptions. + +> cannot-connect + struct (cannot-connect pop3) () + + When a connection to a server cannot be established. + +> username-rejected + struct (username-rejected pop3) () + + If the username is rejected. + +> password-rejected + struct (password-rejected pop3) () + + If the password is rejected. + +> not-ready-for-transaction + struct (not-ready-for-transaction pop3) (communicator) + communicator : communicator + + When the communicator is not in transaction mode. + +> not-given-headers + struct (not-given-headers pop3) (communicator message) + communicator : communicator + message : number + + When the server does not respond with headers for a message as + requested. + +> illegal-message-number + struct (illegal-message-number pop3) (communicator message) + communicator : communicator + message : number + + When the user specifies an illegal message number. + +> cannot-delete-message + struct (cannot-delete-message exn) (communicator message) + communicator : communicator + message : number + + When the server is unable to delete a message. + +> disconnect-not-quiet + struct (disconnect-not-quiet pop3) (communicator) + communicator : communicator + + When the server does not gracefully disconnect. + +> malformed-server-response + struct (malformed-server-response pop3) (communicator) + communicator : communicator + + When the server produces a mal-formed response. + +PROCEDURES ----------------------------------------------------------- + +> (connect-to-server server-string [port-number]) -> communicator + + Connects to a server. Uses the default port number if none is + provided. + +> (disconnect-from-server communicator) -> void + + Disconnects from as server. Sets the communicator state to + disconnected. + +> (authenticate/plain-text user-string passwd-string communicator) -> void + + Takes a username and password string and, if successful, changes the + communicator's state to transaction. + +> (get-mailbox-status communicator) -> two values: count-number octet-number + + Returns the number of messages and the number of octets. + +> (get-message/complete communicator message-number) -> two lists of strings + + Given a message number, returns a list of headers and list of + strings for the body. + +> (get-message/headers communicator message-number) -> list of strings + + Given a message number, returns the list of headers. + +> (get-message/body communicator message-number) -> list of strings + + Given a message number, returns the list of strings for the body. + +> (delete-message communicator message-number) -> void + + Deletes the specified message. + +> (get-unique-id/single communicator message-number) -> string + + Gets the server's unique id for a particular message. + +> (get-unique-id/all communicator) -> list of (cons message-number id-string) + + Gets a list of unique id's from the server for all the messages in + the mailbox. + +> (make-desired-header tag-string) -> desired + + Takes the header's tag and returns a desired regexp for that header. + +> (extract-desired-headers list-of-strings list-of-desireds) -> list of strings + + Given a list of headers and of desired's, returns the header lines + that match any of the desired's. + +EXAMPLE -------------------------------------------------------------- + + > (require-library "pop3.ss" "net") + > (define c (pop3:connect-to-server "cs.rice.edu")) + > (pop3:authenticate/plain-text "scheme" "********" c) + > (pop3:get-mailbox-status c) + 196 + 816400 + > (pop3:get-message/headers c 100) + ("Date: Thu, 6 Nov 1997 12:34:18 -0600 (CST)" + "Message-Id: <199711061834.MAA11961@new-world.cs.rice.edu>" + "From: Shriram Krishnamurthi <shriram@cs.rice.edu>" + ... + "Status: RO") + > (pop3:get-message/complete c 100) + ("Date: Thu, 6 Nov 1997 12:34:18 -0600 (CST)" + "Message-Id: <199711061834.MAA11961@new-world.cs.rice.edu>" + "From: Shriram Krishnamurthi <shriram@cs.rice.edu>" + ... + "Status: RO") + ("some body" "text" "goes" "." "here" "." "") + > (pop3:get-unique-id/single c 205) + no message numbered 205 available for unique id + > (list-tail (pop3:get-unique-id/all c) 194) + ((195 . "e24d13c7ef050000") (196 . "3ad2767070050000")) + > (pop3:get-unique-id/single c 196) + "3ad2767070050000" + > (pop3:disconnect-from-server c) + +========================================================================== +_IMAP_, _reading mail_ +========================================================================== + +Collection: net +Files: _imap.ss_, _imapr.ss_, _imaps.ss_ + +ABSTRACT ------------------------------------------------------------- + +Implements portions of client-side RFC 2060, Internet Message Access +Protocol - Version 4rev1, Crispin, http://www.isi.edu/in-notes/rfc2060.txt + +TYPES ---------------------------------------------------------------- + +> imap + + An opaque record reprsenting an IMAP connection. + +> imap-flag + + A symbol, but generally not a convenient one to use within a Scheme + program. The `imap-flag->symbol' and `symbol->imap-flag' procedures + convert IMAP flags to convenient symbols and vice-versa. + +EXCEPTIONS ----------------------------------------------------------- + + Communication errors are signalled via exn:user structure instances. + +PROCEDURES ----------------------------------------------------------- + +> (imap-connect server-string username-string password-string mailbox-string) + -> three values: imap, message count, recent message count + + Establishes an IMAP connection to the given server using the given + username and password, and selects the specified mailbox. The second + and third return values indicate the total number of message in the + mailbox and the number of recent messages (i.e., messages received + since the mailbox was last selected), respectively. + + See also `imap-port-number', below. + + A user's primary mailbox is always called "INBOX". + +> (imap-disconnect imap) -> void + + Closes an IMAP connection. The close may fail due to a communication + error. + +> (imap-force-disconnect imap) -> void + + Closes an IMAP connection forcefully (i.e., without send a close + message to the server). A forced disconnect never fails. + +> (imap-reselect imap mailbox-string) + -> two values: message count and recent message count + + De-selects the mailbox currently selected by the connection and + selects the specified mailbox, returning the total and recent + message counts for the new mailbox. + + This procedure is useful for polling a mailbox to see whether there + are any new messages (by providing the currently selected mailbox as + the new mailbox), but use imap-status with the 'uidnext flag to + determine whether a mailbox has changed at all (e.g., via a copy + instead of a move). + +> (imap-status imap mailbox-string status-symbol-list) + -> list of status values + + Requests information about a mailbox from the server. The + status-symbol-list specifies the request, and the return value + includes one value for each symbol in status-symbol-list. The + allowed status symbols are: + 'messages - number of messages + 'recent - number of recent messages + 'unseen - number of unseen messages + 'uidnext - uid for next received message + 'uidvalidity - id that changes when all uids are changed + +> (imap-get-messages imap msg-num-list field-list) + -> list of field-value lists + + Downloads information for a set of messages. The `msg-num-list' + argument specifies a set of messages by their message positions (not + their uids). The `field-list' argument specifies the type of + information to download for each message. The avilable fields are: + + * 'uid - value is an integer + * 'header - value is a header (string; see the head package) + * 'body - value is a string (with CRLF-separated lines) + * 'flags - value is a list of imap flags + + The return value is a list of entry items in parallel to + `msg-num-list'. Each entry is itself a list containing value items + in parallel to `field-list'. + + Example: + (imap-get-message imap '(1 3 5) '(uid header)) + ; => ((107 "From: larry@stooges.com ...") + (110 "From: moe@stooges.com ...") + (112 "From: curly@stooges.com ...")) + +> (imap-flag->symbol imap-flag) -> symbol +> (symbol->imap-flag symbol) -> imap-flag + + An imap flag is a symbol, but it is generally not a convenient one + to use within a Scheme program, because it usually starts with a + backslash and flag comparisions are case-insensitive. The + `imap-flag->symbol' and `symbol->imap-flag' procedures convert IMAP + flags to convenient symbols and vice-versa: + + symbol imap flag + ------ ---------- + 'seen '|\Seen| \ + 'answered '|\Answered| | + 'flagged '|\Flagged| > message flags + 'deleted '|\Deleted| | + 'draft '|\Draft| | + 'recent '|\Recent| / + + 'noinferiors '|\Noinferiors| \ + 'noselect '|\Noselect| > mailbox flags + 'marked '|\Marked| | + 'unmarked '|\Unmarked| / + + `imap-flag->symbol' and `symbol->imap-flag' act like the identity + function when any other symbol/flag is provided. + +> (imap-store imap mode msg-num-list imap-flags) -> void + + Sets flags for a set of messages. The mode argument specifies how + flags are set: + + * '+ - add the given flags to each message + * '- - remove the given flags from each emssage + * '! - set each message's flags to the given set + + The `msg-num-list' argument specifies a set of messages by their + message positions (not their uids). The `flags' argument specifies + the imap flags to add/remove/install. + + Example: + (imap-store imap '+ '(1 2 3) (list (symbol->imap-flag 'deleted))) + ; marks the first three messages to be deleted + (imap-expunge imap) + ; permanently removes the first three messages (and possibly others) + ; from the currently-selected mailbox + +> (imap-expunge imap) -> void + + Purges every message currently marked with the '|\Deleted| flag from + the mailbox. + +> (imap-copy imap msg-num-list dest-mailbox-string) -> void + + Copies the specified messages from the currently selected mailbox to + the specified mailbox. + +> (imap-mailbox-exists? imap mailbox-string) -> bool + + Returns #t if the specified mailbox exists, #f otherwise. + +> (imap-create-mailbox imap mailbox-string) -> void + + Creates the specified mailbox. (It must not exist already.) + +> (imap-list-child-mailboxes imap mailbox-string [delimiter-string]) + -> list of mailbox-info lists + + Returns information about sub-mailboxes of the given mailbox. If + mailbox-string is #f, information about all top-level mailboxes is + returned. The optional `delimiter-string' is determined + automatically (via `imap-get-hierarchy-delimiter') if it is not + provided. + + The return value is a list of mailbox-information lists. Each + mailbox-information list contains two items: + * a list of imap flags for the mailbox + * the mailbox's name + +> (imap-get-hierarchy-delimiter imap) -> string + + Returns the server-specific string that is used as a separator in + mailbox path names. + +> (imap-port-number [k]) + + A parameter that determines the server port number. The initial + value is 143. + +========================================================================== +_mail headers_ +========================================================================== + +Collection: net +Files: _head.ss_, _headr.ss_, _heads.ss_ + +ABSTRACT ------------------------------------------------------------- + +Implements utlities for RFC 822 headers and mail addresses. + +TYPES ---------------------------------------------------------------- + +> header + + A string that is an RFC-882-compliant header. A header string + contains a series of CRLF-delimitted fields, and ends with two CRLFs + (the first one terminates the last field, and the second terminates + the header). + +PROCEDURES ----------------------------------------------------------- + +> empty-header + + A string correcponding to the empty header, useful for building up + headers with `insert-field' and `append-headers'. + +> (validate-header candidate-header-string) -> void + + If the format of `candidate-header-string' matches RFC 822, void is + returned, otherwise an exception is raised. + +> (extract-field field-string header) -> string or #f + + Returns the header content for the specified field, or #f if the + field is not in the header. `field-string' should not end with ":", + and it is used case-insensitively. The returned string will not + contain the field name, color separator, of CRLF terminator for the + field; however, if the field spans multiple lines, the CRLFs + separating the lines will be intact. + + Example: + (extract-field "TO" (insert-field "to" "me@localhost" empty-header)) + ; => "me@localhost" + +> (remove-field field-string header) -> header + + Creates a new header by removing the specified field from `header' + (or the first instance of the field, if it occurs multiple + times). If the field is not in `header', then the return value is + `header'. + +> (insert-field field-string value-string header) -> header + + Creates a new header by prefixing the given header with the given + field-value pair. `value-string' should not contain a terminating + CRLF, but a multi-line value (perhaps created with + `data-lines->data') may contain seperator CRLFs. + +> (append-headers a-header another-header) -> header + +> (standard-message-header from-string to-list-of-strings cc-list-of-strings bcc-list-of-strings subject-string) -> header + + Creates a standard mail header given the sender, various lists of + recipients, and a subject. (The BCC recipients do not acually appear + in the header, but they're accepted anyway to complete the + abstarction.) + +> (data-lines->data list-of-strings) -> string + + Merges multiple lines for a single field value into one string, + adding CRLF-TAB separators. + +> (extract-addresses string kind) -> list of strings or + list of list of strings + + Parses `string' as a list of comma-delimited mail addresses, raising + an exception if the list is ill-formed. This procedure can be used + for single-address strings, in which case the returned list should + contain only one address. + + The `kind' argument specifies which portion of an address should be + returned: + + * 'name - the free-form name in the address, or the address + itself if no name is available: + "John Doe <doe@localhost>" => "Jon Doe" + "doe@localhost (Johnny Doe)" => "Johnny Doe" + "doe@localhost" => "doe@localhost" + + * 'address - just the mailing address, without any free-form + names: + "Jon Doe <doe@localhost>" => "doe@localhost" + "doe@localhost (Johnny Doe)" => "doe@localhost" + "doe@localhost" => "doe@localhost" + + * 'full - the full address, essentially as it appears in the + input, but normalized: + "Jon Doe < doe@localhost >" => "Jon Doe <doe@localhost>" + " doe@localhost (Johnny Doe)" => "doe@localhost (Johnny Doe)" + "doe@localhost" => "doe@localhost" + + * 'all - a list containing each of the three posibilities: + free-form name, address, and full address (in that + order) + + Example: + (extract-addresses " \"Doe, John\" <doe@localhost>, john" 'address) + ; => ("doe@localhost" "john") + +> (assemble-address-field list-of-address-strings) -> string + + Creates a header field value from a list of addresses. The addresses + are comma-separated, and possibly broken into multiple lines. + +========================================================================== +_DNS_, _domain name service_ +========================================================================== + +Collection: net +Files: _dns.ss_, _dnsr.ss_, _dnss.ss_ + +ABSTRACT ------------------------------------------------------------- + +Implements a DNS client, based on RFC 1035 + +PROCEDURES ----------------------------------------------------------- + +> (dns-get-address nameserver-string address-string) -> address-string + + Consults the specified nameserver (normally a numerical address like + "128.42.1.30") to obtain a numerical address for the given internet + address. + + The query record sent to the DNS server includes the "recursive" + bit, but `dns-get-address' also implements a recursive search itself + in case the server does not provide this optional feature. + +> (dns-get-mail-exchanger nameserver-string address-string) -> address-string + + Consults the specified nameserver to obtain the address for a mail + exchanger the given mail host address. For example, the mail + exchanger for "ollie.cs.rice.edu" is currently "cs.rice.edu". + +> (dns-find-nameserver) -> address-string or #f + + Attempts to find the address of a nameserver on the present system. + Under Unix, this procedure parses /etc/resolv.conf to extract the + first nameserver address. + +========================================================================== +_Base 64 Encoding_, _base64_ +========================================================================== + +Collection: net +Files: _base64.ss_, _base64r.ss_, _base64s.ss_ + +ABSTRACT ------------------------------------------------------------- + +Implements a Base 64 (mime-standard) encoder. (We'll implement a +decoder eventually.) + +PROCEDURES ----------------------------------------------------------- + +> (base64-encode string) -> string + + Consumes a string and returns its base64 encoding as a new string. + The returned string is broken into 72-character lines separated by + CRLF combinations, and it always ends with the "=" base64 + terminator. diff --git a/collects/net/head.ss b/collects/net/head.ss @@ -0,0 +1,8 @@ + +(require-relative-library "heads.ss") + +(begin-elaboration-time + (require-library "invoke.ss")) + +(define-values/invoke-unit/sig mzlib:head^ + (require-relative-library "headr.ss")) diff --git a/collects/net/headr.ss b/collects/net/headr.ss @@ -0,0 +1,243 @@ + +(unit/sig mzlib:head^ + (import) + + (define empty-header (string #\return #\newline)) + + (define (string->ci-regexp s) + (list->string + (apply + append + (map + (lambda (c) + (cond + [(memq c '(#\$ #\| #\\ #\[ #\] #\. #\* #\? #\+ #\( #\) #\^)) + (list #\\ c)] + [(char-alphabetic? c) + (list #\[ (char-upcase c) (char-downcase c) #\])] + [else (list c)])) + (string->list s))))) + + (define re:field-start (regexp + (format "^[^~a~a~a~a~a:~a-~a]*:" + #\space #\tab #\linefeed #\return #\vtab + (integer->char 1) + (integer->char 26)))) + (define re:continue (regexp (format "^[~a~a~a]" #\space #\tab #\vtab))) + + (define (validate-header s) + (let ([len (string-length s)]) + (let loop ([offset 0]) + (cond + [(and (= (+ offset 2) len) + (string=? empty-header (substring s offset len))) + (void)] ; validated + [(= offset len) (error 'validate-header "missing ending CRLF")] + [(or (regexp-match re:field-start s offset) + (regexp-match re:continue s offset)) + (let ([m (regexp-match-positions (string #\return #\linefeed) s offset)]) + (if m + (loop (cdar m)) + (error 'validate-header "missing ending CRLF")))] + [else (error 'validate-header "ill-formed header at ~s" + (substring s offset (string-length s)))])))) + + (define (make-field-start-regexp field) + (format "(^|[~a][~a])(~a: *)" + #\return #\linefeed + (string->ci-regexp field))) + + (define (extract-field field header) + (let ([m (regexp-match-positions + (make-field-start-regexp field) + header)]) + (and m + (let ([s (substring header + (cdaddr m) + (string-length header))]) + (let ([m (regexp-match-positions + (format "[~a][~a][^: ~a~a]*:" + #\return #\linefeed + #\return #\linefeed) + s)]) + (if m + (substring s 0 (caar m)) + ; Rest of header is this field, but strip trailing CRLFCRLF: + (regexp-replace (format "~a~a~a~a$" #\return #\linefeed #\return #\linefeed) + s + ""))))))) + + (define (remove-field field header) + (let ([m (regexp-match-positions + (make-field-start-regexp field) + header)]) + (if m + (let ([pre (substring header + 0 + (caaddr m))] + [s (substring header + (cdaddr m) + (string-length header))]) + (let ([m (regexp-match-positions + (format "[~a][~a][^: ~a~a]*:" + #\return #\linefeed + #\return #\linefeed) + s)]) + (if m + (string-append pre (substring s (+ 2 (caar m)) + (string-length s))) + pre))) + header))) + + (define (insert-field field data header) + (let ([field (format "~a: ~a~a~a" + field + data + #\return #\linefeed)]) + (string-append field header))) + + (define (append-headers a b) + (let ([alen (string-length a)]) + (if (> alen 1) + (string-append (substring a 0 (- alen 2)) b) + (error 'append-headers "first argument is not a header: ~a" a)))) + + (define (standard-message-header from tos ccs bccs subject) + (let ([h (insert-field + "Subject" subject + empty-header)]) + ; NOTE: bccs don't go into the header; that's why + ; they're "blind" + (let ([h (if (null? ccs) + h + (insert-field + "CC" (assemble-address-field ccs) + h))]) + (let ([h (if (null? tos) + h + (insert-field + "To" (assemble-address-field tos) + h))]) + (insert-field + "From" from + h))))) + + (define (splice l sep) + (if (null? l) + "" + (format "~a~a" + (car l) + (apply + string-append + (map + (lambda (n) (format "~a~a" sep n)) + (cdr l)))))) + + (define (data-lines->data datas) + (splice datas (format "~a~a~a" #\return #\linefeed #\tab))) + + ;;; Extracting Addresses ;;; + + (define blank (format "[~a~a~a~a~a]" #\space #\tab #\newline #\return #\vtab)) + (define re:all-blank (regexp (format "^~a*$" blank))) + + (define (extract-addresses s form) + (unless (memq form '(name address full all)) + (raise-type-error 'extract-addresses + "form: 'name, 'address, 'full, or 'all" + form)) + (if (or (not s) (regexp-match re:all-blank s)) + null + (let loop ([prefix ""][s s]) + ; Which comes first - a quote or a comma? + (let ([mq (regexp-match-positions "\"[^\"]*\"" s)] + [mc (regexp-match-positions "," s)]) + (if (and mq mc (< (caar mq) (caar mc) (cdar mq))) + ; Quote contains a comma + (loop (string-append + prefix + (substring s 0 (cdar mq))) + (substring s (cdar mq) (string-length s))) + ; Normal comma parsing: + (let ([m (regexp-match "([^,]*),(.*)" s)]) + (if m + (let ([n (extract-one-name (string-append prefix (cadr m)) form)] + [rest (extract-addresses (caddr m) form)]) + (cons n rest)) + (let ([n (extract-one-name (string-append prefix s) form)]) + (list n))))))))) + + (define (select-result form name addr full) + (case form + [(name) name] + [(address) addr] + [(full) full] + [(all) (list name addr full)])) + + (define (one-result form s) + (select-result form s s s)) + + (define (extract-one-name s form) + (cond + [(regexp-match (format "^~a*(\"[^\"]*\")(.*)" blank) s) + => (lambda (m) + (let ([name (cadr m)] + [addr (extract-angle-addr (caddr m))]) + (select-result form name addr + (format "~a <~a>" name addr))))] + ; ?!?!? Where does the "addr (name)" standard come from ?!?!? + [(regexp-match (format "(.*)[(]([^)]*)[)]~a*$" blank) s) + => (lambda (m) + (let ([name (caddr m)] + [addr (extract-simple-addr (cadr m))]) + (select-result form name addr + (format "~a (~a)" addr name))))] + [(regexp-match (format "^~a*(.*)(<.*>)~a*$" blank blank) s) + => (lambda (m) + (let ([name (regexp-replace (format "~a*$" blank) (cadr m) "")] + [addr (extract-angle-addr (caddr m))]) + (select-result form name addr + (format "~a <~a>" name addr))))] + [(or (regexp-match "<" s) (regexp-match ">" s)) + (one-result form (extract-angle-addr s))] + [else + (one-result form (extract-simple-addr s))])) + + (define (extract-angle-addr s) + (if (or (regexp-match "<.*<" s) (regexp-match ">.*>" s)) + (error 'extract-address "too many angle brackets: ~a" s) + (let ([m (regexp-match (format "~a*<([^>]*)>~a*" blank blank) s)]) + (if m + (extract-simple-addr (cadr m)) + (error 'extract-address "cannot parse address: ~a" s))))) + + (define (extract-simple-addr s) + (cond + [(regexp-match "[,\"()<>]" s) + (error 'extract-address "cannot parse address: ~a" s)] + [else + ; final whitespace strip + (regexp-replace + (format "~a*$" blank) + (regexp-replace (format "~a*" blank) s "") + "")])) + + (define (assemble-address-field addresses) + (if (null? addresses) + "" + (let loop ([addresses (cdr addresses)] + [s (car addresses)] + [len (string-length (car addresses))]) + (if (null? addresses) + s + (let* ([addr (car addresses)] + [alen (string-length addr)]) + (if (<= 72 (+ len alen)) + (loop (cdr addresses) + (format "~a,~a~a~a~a" + s #\return #\linefeed + #\tab addr) + alen) + (loop (cdr addresses) + (format "~a, ~a" s addr) + (+ len alen 2))))))))) diff --git a/collects/net/heads.ss b/collects/net/heads.ss @@ -0,0 +1,12 @@ + +(define-signature mzlib:head^ + (empty-header + validate-header + extract-field + remove-field + insert-field + append-headers + standard-message-header + data-lines->data + extract-addresses + assemble-address-field)) diff --git a/collects/net/imap.ss b/collects/net/imap.ss @@ -0,0 +1,8 @@ + +(require-relative-library "imaps.ss") + +(begin-elaboration-time + (require-library "invoke.ss")) + +(define-values/invoke-unit/sig mzlib:imap^ + (require-relative-library "imapr.ss")) diff --git a/collects/net/imapr.ss b/collects/net/imapr.ss @@ -0,0 +1,379 @@ + +(unit/sig mzlib:imap^ + (import) + + (define debug-via-stdio? #f) + + (define eol (if debug-via-stdio? + 'linefeed + 'return-linefeed)) + + (define crlf (string #\return #\linefeed)) + + (define (tag-eq? a b) + (or (eq? a b) + (and (symbol? a) + (symbol? b) + (string-ci=? (symbol->string a) + (symbol->string b))))) + + (define field-names + (list + (list 'uid (string->symbol "UID")) + (list 'header (string->symbol "RFC822.HEADER")) + (list 'body (string->symbol "RFC822.TEXT")) + (list 'size (string->symbol "RFC822.SIZE")) + (list 'flags (string->symbol "FLAGS")))) + + (define flag-names + (list + (list 'seen (string->symbol "\\Seen")) + (list 'answered (string->symbol "\\Answered")) + (list 'flagged (string->symbol "\\Flagged")) + (list 'deleted (string->symbol "\\Deleted")) + (list 'draft (string->symbol "\\Draft")) + (list 'recent (string->symbol "\\Recent")) + + (list 'noinferiors (string->symbol "\\Noinferiors")) + (list 'noselect (string->symbol "\\Noselect")) + (list 'marked (string->symbol "\\Marked")) + (list 'unmarked (string->symbol "\\Unmarked")))) + + (define (imap-flag->symbol f) + (or (ormap (lambda (a) (and (tag-eq? f (cadr a)) (car a))) + flag-names) + f)) + + (define (symbol->imap-flag s) + (let ([a (assoc s flag-names)]) + (if a + (cadr a) + s))) + + (define (log-warning . args) + ; (apply printf args) + (void)) + (define log log-warning) + + (define make-msg-id + (let ([id 0]) + (lambda () + (begin0 + (format "a~a " id) + (set! id (add1 id)))))) + + (define (starts-with? l n) + (and (>= (string-length l) (string-length n)) + (string=? n (substring l 0 (string-length n))))) + + (define (skip s n) + (substring s + (if (number? n) n (string-length n)) + (string-length s))) + + (define (splice l sep) + (if (null? l) + "" + (format "~a~a" + (car l) + (apply + string-append + (map + (lambda (n) (format "~a~a" sep n)) + (cdr l)))))) + + (define (imap-read s r) + (let loop ([s s] + [r r] + [accum null] + [eol-k (lambda (accum) (reverse! accum))] + [eop-k (lambda (s accum) (error 'imap-read "unxpected close parenthesis"))]) + (cond + [(string=? "" s) (eol-k accum)] + [(char-whitespace? (string-ref s 0)) + (loop (skip s 1) r accum eol-k eop-k)] + [else + (case (string-ref s 0) + [(#\") (let ([m (regexp-match "\"([^\"]*)\"(.*)" s)]) + (if m + (loop (caddr m) r (cons (cadr m) accum) eol-k eop-k) + (error 'imap-read "didn't find end of quoted string in: ~a" s)))] + [(#\)) (eop-k (skip s 1) accum)] + [(#\() (letrec ([next-line + (lambda (accum) + (loop (read-line r eol) r + accum + next-line + finish-parens))] + [finish-parens + (lambda (s laccum) + (loop s r + (cons (reverse! laccum) accum) + eol-k eop-k))]) + (loop (skip s 1) r null next-line finish-parens))] + [(#\{) (let ([m (regexp-match "{([0-9]+)}(.*)" s)]) + (cond + [(not m) (error 'imap-read "couldn't read {} number: ~a" s)] + [(not (string=? (caddr m) "")) (error 'imap-read "{} not at end-of-line: ~a" s)] + [else (loop "" r + (cons (read-string (string->number (cadr m)) r) + accum) + eol-k eop-k)]))] + [else (let ([m (regexp-match "([^ (){}]+)(.*)" s)]) + (if m + (loop (caddr m) r + (cons (let ([v (cadr m)]) + (if (regexp-match "^[0-9]*$" v) + (string->number v) + (string->symbol (cadr m)))) + accum) + eol-k eop-k) + (error 'imap-read "failure reading atom: ~a" s)))])]))) + + (define (imap-send r w cmd info-handler) + (let ([id (make-msg-id)]) + (log "sending ~a~a~n" id cmd) + (fprintf w "~a~a~a" id cmd crlf) + (let loop () + (let ([l (read-line r eol)]) + ; (log "raw-reply: ~s~n" l) + (cond + [(starts-with? l id) + (let ([reply (imap-read (skip l id) r)]) + (log "response: ~a~n" reply) + reply)] + [(starts-with? l "* ") + (let ([info (imap-read (skip l 2) r)]) + (log "info: ~s~n" info) + (info-handler info)) + (loop)] + [(starts-with? l "+ ") + (error 'imap-send "unexpected continuation request: ~a" l)] + [else + (log-warning "warning: unexpected response for ~a: ~a" id l) + (loop)]))))) + + (define (str->arg s) + (if (or (regexp-match " " s) + (string=? s "")) + (format "\"~a\"" s) + s)) + + (define (check-ok reply) + (unless (and (pair? reply) + (tag-eq? (car reply) 'OK)) + (error 'check-ok "server error: ~s" reply))) + + (define-struct imap-connection (r w)) + + (define imap-port-number (make-parameter 143)) + + (define (imap-connect server username password inbox) + ; => imap count-k recent-k + (let-values ([(r w) (if debug-via-stdio? + (begin + (printf "stdin == ~a~n" server) + (values (current-input-port) (current-output-port))) + (tcp-connect server (imap-port-number)))]) + (with-handlers ([void + (lambda (x) + (close-input-port r) + (close-output-port w) + (raise x))]) + + (check-ok (imap-send r w "NOOP" void)) + (let ([reply (imap-send r w (format "LOGIN ~a ~a" + (str->arg username) + (str->arg password)) + void)]) + (if (and (pair? reply) (tag-eq? 'NO (car reply))) + (error "username or password rejected by server") + (check-ok reply))) + + (let ([imap (make-imap-connection r w)]) + (let-values ([(init-count init-recent) + (imap-reselect imap inbox)]) + (values imap + init-count + init-recent)))))) + + (define (imap-reselect imap inbox) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)]) + (let ([init-count 0] + [init-recent 0]) + (check-ok (imap-send r w (format "SELECT ~a" (str->arg inbox)) + (lambda (i) + (when (and (list? i) (= 2 (length i))) + (cond + [(tag-eq? (cadr i) 'EXISTS) + (set! init-count (car i))] + [(tag-eq? (cadr i) 'RECENT) + (set! init-recent (car i))]))))) + (values init-count init-recent)))) + + (define (imap-status imap inbox flags) + (unless (and (list? flags) + (andmap (lambda (s) + (memq s '(messages recent uidnext uidvalidity unseen))) + flags)) + (raise-type-error 'imap-status "list of status flag symbols" flags)) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)]) + (let ([results null]) + (check-ok (imap-send r w (format "STATUS ~a ~a" (str->arg inbox) flags) + (lambda (i) + (when (and (list? i) (= 3 (length i)) + (tag-eq? (car i) 'STATUS)) + (set! results (caddr i)))))) + (map + (lambda (f) + (let loop ([l results]) + (cond + [(or (null? l) (null? (cdr l))) #f] + [(tag-eq? f (car l)) (cadr l)] + [else (loop (cdr l))]))) + flags)))) + + (define (imap-disconnect imap) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)]) + (check-ok (imap-send r w "LOGOUT" void)) + (close-input-port r) + (close-output-port w))) + + (define (imap-force-disconnect imap) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)]) + (close-input-port r) + (close-output-port w))) + + (define (imap-get-messages imap msgs field-list) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)]) + (when (or (not (list? msgs)) + (not (andmap integer? msgs))) + (raise-type-error 'imap-get-messages "non-empty message list" msgs)) + (when (or (null? field-list) + (not (list? field-list)) + (not (andmap (lambda (f) (assoc f field-names)) field-list))) + (raise-type-error 'imap-get-messages "non-empty field list" field-list)) + + (if (null? msgs) + null + (let ([results null]) + (imap-send r w (format "FETCH ~a (~a)" + (splice msgs ",") + (splice (map (lambda (f) (cadr (assoc f field-names))) field-list) " ")) + (lambda (i) + (when (and (list? i) (<= 2 (length i)) + (tag-eq? (cadr i) 'FETCH)) + (set! results (cons i results))))) + (map + (lambda (msg) + (let ([m (assoc msg results)]) + (unless m + (error 'imap-get-messages "no result for message ~a" msg)) + (let ([d (caddr m)]) + (map + (lambda (f) + (let ([fld (cadr (assoc f field-names))]) + (let loop ([d d]) + (cond + [(null? d) #f] + [(null? (cdr d)) #f] + [(tag-eq? (car d) fld) (cadr d)] + [else (loop (cddr d))])))) + field-list)))) + msgs))))) + + (define (imap-store imap mode msgs flags) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)]) + (check-ok + (imap-send r w + (format "STORE ~a ~a ~a" + (splice msgs ",") + (case mode + [(+) "+FLAGS.SILENT"] + [(-) "-FLAGS.SILENT"] + [(!) "FLAGS.SILENT"] + [else (raise-type-error + 'imap-store + "mode: '!, '+, or '-")]) + flags) + void)))) + + (define (imap-copy imap msgs dest-mailbox) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)]) + (check-ok + (imap-send r w + (format "COPY ~a ~a" + (splice msgs ",") + (str->arg dest-mailbox)) + void)))) + + (define (imap-expunge imap) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)]) + (check-ok (imap-send r w "EXPUNGE" void)))) + + + (define (imap-mailbox-exists? imap mailbox) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)] + [exists? #f]) + (check-ok (imap-send r w + (format "LIST \"\" ~s" (str->arg mailbox)) + (lambda (i) + (when (and (pair? i) + (tag-eq? (car i) 'LIST)) + (set! exists? #t))))) + exists?)) + + (define (imap-create-mailbox imap mailbox) + (let ([r (imap-connection-r imap)] + [w (imap-connection-w imap)]) + (check-ok + (imap-send r w + (format "CREATE ~a" (str->arg mailbox)) + void)))) + + (define (imap-get-hierarchy-delimiter imap) + (let* ([r (imap-connection-r imap)] + [w (imap-connection-w imap)] + [result #f]) + (check-ok + (imap-send r w "LIST \"\" \"\"" + (lambda (x) + (set! result (caddr x))))) + result)) + + (define imap-list-child-mailboxes + (case-lambda + [(imap mailbox) + (imap-list-child-mailboxes imap mailbox (imap-get-hierarchy-delimiter imap))] + [(imap mailbox delimiter) + (let* ([r (imap-connection-r imap)] + [w (imap-connection-w imap)] + [mailbox-name (and mailbox (format "~a~a" mailbox delimiter))] + [pattern (if mailbox + (format "~a%" mailbox-name) + "%")] + [sub-folders null]) + (check-ok + (imap-send r w (format "LIST \"\" ~a" (str->arg pattern)) + (lambda (x) + (let ([flags (cadr x)] + [name (let ([s (cadddr x)]) + (if (symbol? s) + (symbol->string s) + s))]) + (unless (and mailbox-name + (string=? name mailbox-name)) + (set! sub-folders + (cons + (list flags name) + sub-folders))))))) + (reverse sub-folders))]))) diff --git a/collects/net/imaps.ss b/collects/net/imaps.ss @@ -0,0 +1,20 @@ + +(define-signature mzlib:imap^ + (imap-port-number + + imap-connect + imap-disconnect + imap-force-disconnect + imap-reselect + imap-status + + imap-get-messages + imap-copy + imap-store imap-flag->symbol symbol->imap-flag + imap-expunge + + imap-mailbox-exists? + imap-create-mailbox + + imap-list-child-mailboxes + imap-get-hierarchy-delimiter)) diff --git a/collects/slatex/slatex-code/defaults.scm b/collects/slatex/slatex-code/defaults.scm @@ -136,4 +136,4 @@ (defvar slatex::*latex?* #t) (defvar slatex::*slatex-separate-includes?* #f) (defvar slatex::*tex-calling-directory* "") - ) -\ No newline at end of file + ) diff --git a/collects/srpersist/lib/win32/i386/srpmain.dll b/collects/srpersist/lib/win32/i386/srpmain.dll Binary files differ. diff --git a/collects/stepper/annotater.ss b/collects/stepper/annotater.ss @@ -188,9 +188,13 @@ (define (break-wrap expr) (if break - `(#%begin (,(make-break 'normal)) ,expr) + `(#%begin (,(make-break 'normal-break)) ,expr) expr)) + (define (double-break-wrap expr) + (if break + `(#%begin (,(make-break 'double-break)) ,expr))) + (define (simple-wcm-break-wrap debug-info expr) (simple-wcm-wrap debug-info (break-wrap expr))) @@ -275,7 +279,9 @@ [define-values-recur (lambda (expr) (annotate/inner expr tail-bound #f #f))] [non-tail-recur (lambda (expr) (annotate/inner expr null #f #f))] [lambda-body-recur (lambda (expr) (annotate/inner expr 'all #t #f))] - [let-body-recur (lambda (expr vars) (annotate/inner expr (var-set-union tail-bound vars) #t #f))] + ; note: no pre-break for the body of a let; it's handled by the break for the + ; let itself. + [let-body-recur (lambda (expr vars) (annotate/inner expr (var-set-union tail-bound vars) #f #f))] [cheap-wrap-recur (lambda (expr) (let-values ([(ann _) (non-tail-recur expr)]) ann))] [make-debug-info-normal (lambda (free-vars) (make-debug-info expr tail-bound free-vars 'none))] @@ -438,7 +444,7 @@ (let+ ([val bodies (z:begin-form-bodies expr)] [val (values annotated-bodies free-vars) (dual-map (lambda (expr) - (annotate/inner expr 'all #f #t)) + (annotate/inner expr 'all #f #t)) bodies)]) (values `(#%begin ,@annotated-bodies) (apply var-set-union free-vars))) @@ -477,7 +483,7 @@ ;turns into ; ;(let-values ([(dummy1 dummy2 dummy3 dummy4 dummy5) - ; (values *undefined* *undefined* *undefined* *undefined* *undefined*)]) + ; (values *unevaluated* *unevaluated* *unevaluated* *unevaluated* *unevaluated*)]) ; (with-continuation-mark ; key huge-value ; (begin @@ -487,6 +493,15 @@ ; e3)))) ; ; let me know if you can do it in less. + + ; another irritating point: the mark and the break that must go immediately + ; around the body. Irritating because they will be instantly replaced by + ; the mark and the break produced by the annotated body itself. However, + ; they're necessary, because the body may not contain free references to + ; all of the variables defined in the let, and thus their values are not + ; known otherwise. + ; whoops! hold the phone. I think I can get away with a break before, and + ; a mark after, so only one of each. groovy, eh? [(z:let-values-form? expr) (let+ ([val var-sets (z:let-values-form-vars expr)] @@ -521,7 +536,7 @@ [val outer-dummy-initialization `([,(map z:varref-var dummy-var-list) (#%values ,@(build-list (length dummy-var-list) - (lambda (_) '(#%quote *undefined*))))])] + (lambda (_) `(#%quote ,*unevaluated*))))])] [val set!-clauses (map (lambda (dummy-var-set val) `(#%set!-values ,(map z:varref-var dummy-var-set) ,val)) @@ -534,11 +549,11 @@ [val inner-let-values `(#%let-values ,inner-transference ,annotated-body)] [val middle-begin - `(#%begin ,@set!-clauses ,inner-let-values)] + `(#%begin ,@set!-clauses ,(double-break-wrap inner-let-values))] [val wrapped-begin (wcm-wrap (make-debug-info-app (var-set-union tail-bound dummy-var-list) (var-set-union free-vars dummy-var-list) - 'none) + 'let-body) middle-begin)] [val whole-thing `(#%let-values ,outer-dummy-initialization ,wrapped-begin)]) @@ -578,17 +593,17 @@ var-sets annotated-vals)] [val middle-begin - `(#%begin ,@set!-clauses ,annotated-body)] + `(#%begin ,@set!-clauses ,(double-break-wrap annotated-body))] [val wrapped-begin (wcm-wrap (make-debug-info-app (var-set-union tail-bound var-set-list-varrefs) (var-set-union free-vars-inner var-set-list-varrefs) - 'none) + 'let-body) middle-begin)] [val whole-thing `(#%letrec-values ,outer-initialization ,wrapped-begin)]) (values whole-thing free-vars-outer))))] - [(z:define-values-form? expr) + [(z:define-values-form? expr) (let+ ([val vars (z:define-values-form-vars expr)] [val _ (map utils:check-for-keyword vars)] [val var-names (map z:varref-var vars)] diff --git a/collects/stepper/doc.txt b/collects/stepper/doc.txt @@ -1,15 +1,14 @@ -What is the _Foot_? What is the _Stepper_? -The Foot is a "stepper," which means that it proceeds through the +DrScheme includes an "algebraic stepper," a tool which proceeds through the evaluation of a set of definitions and expressions, one step at a time. This evaluation shows the user how DrScheme evaluates expressions and -definitions, and can help in debugging programs. Currently, the Foot is -available only in the "Beginner" language level. +definitions, and can help in debugging programs. Currently, the Stepper is +available in the "Beginner" and "Intermediate" language levels. -How do I use the Foot? +How do I use the Stepper? -The Foot operates on the contents of the frontmost DrScheme window. A click +The Stepper operates on the contents of the frontmost DrScheme window. A click on the "Step" button brings up the stepper window. The stepper window has three boxes; each one is separated by a blue horizontal line. diff --git a/collects/stepper/marks.ss b/collects/stepper/marks.ss @@ -67,18 +67,23 @@ (printf " ~a : ~a~n" (car binding-pair) (cadr binding-pair))) (caddr exposed)))) - (define (find-var-binding mark-list var) + (define (lookup-var-binding mark-list var) + (printf "entering lookup-var-binding~n") (if (null? mark-list) ; must be a primitive - (error 'find-var-binding "variable not found in environment: ~a" var) + (begin + (printf "going into error~n") + (error 'lookup-var-binding "variable not found in environment: ~a" var)) ; (error var "no binding found for variable.") (let* ([bindings (mark-bindings (car mark-list))] + [_ (printf "bindings: ~a~n" bindings)] [matches (filter (lambda (mark-var) (eq? var (z:varref-var (mark-binding-varref mark-var)))) bindings)]) + (printf "matches length: ~a~n" (length matches)) (cond [(null? matches) - (find-var-binding (cdr mark-list) var)] + (lookup-var-binding (cdr mark-list) var)] [(> (length matches) 1) - (error 'find-var-binding "more than one variable binding found for var: ~a" var)] + (error 'lookup-var-binding "more than one variable binding found for var: ~a" var)] [else ; (length matches) = 1 (car matches)]))))) diff --git a/collects/stepper/model.ss b/collects/stepper/model.ss @@ -170,6 +170,7 @@ (z:scheme-expand new-expr 'previous user-vocabulary))))]) (let*-values ([(annotated-list envs) (a:annotate (list new-expr) (list new-parsed) packaged-envs break #f)] [(annotated) (car annotated-list)]) + (printf "annotated:~n~a~n" annotated) (set! packaged-envs envs) (set! current-expr new-parsed) (check-for-repeated-names new-parsed exception-handler) @@ -205,27 +206,26 @@ (send-to-drscheme-eventspace (lambda () (let* ([reconstruct-pair - (r:reconstruct-current current-expr - mark-list - break-kind - returned-value-list)] + (r:reconstruct-current current-expr mark-list break-kind returned-value-list)] [reconstructed (car reconstruct-pair)] [redex (cadr reconstruct-pair)]) (finish-thunk reconstructed redex)))))]) (case break-kind - [(normal) + [(normal-break) + (printf "entering normal-break~n") (when (not (r:skip-redex-step? mark-list)) + (printf "not skipping step~n") (reconstruct-helper (lambda (reconstructed redex) (set! held-expr reconstructed) (set! held-redex redex) (continue-user-computation))) - (suspend-user-computation))] + (suspend-user-computation)) + (printf "finished normal-break~n")] [(result-break) - (when (if (not (null? returned-value-list)) - (not (r:skip-redex-step? mark-list)) - (and (not (eq? held-expr no-sexp)) - (not (r:skip-result-step? mark-list)))) + (when (not (or (r:skip-redex-step? mark-list) + (and (null? returned-value-list) + (eq? held-expr no-sexp)))) (reconstruct-helper (lambda (reconstructed reduct) ; ; this invariant (contexts should be the same) @@ -246,12 +246,31 @@ (set! held-expr no-sexp) (set! held-redex no-sexp) (i:receive-result result)))) - (suspend-user-computation))]))) + (suspend-user-computation))] + [(double-break) + ; a double-break occurs at the beginning of a let's body. + (send-to-drscheme-eventspace + (lambda () + (let* ([reconstruct-quintuple + (r:reconstruct-current current-expr mark-list break-kind returned-value-list)]) + (set! finished-exprs (append finished-exprs (car reconstruct-quintuple))) + (when (not (eq? held-expr no-sexp)) + (e:internal-error 'break-reconstruction + "held-expr not empty when a double-break occurred")) + (i:receive-result (apply make-before-after-result + finished-exprs + (cdr reconstruct-quintuple)))))) + (suspend-user-computation)] + [else (e:internal-error 'break "unknown label on break")]))) (define (handle-exception exn) - (if held-expr - (i:receive-result (make-before-error-result finished-exprs held-expr held-redex (exn-message exn))) - (i:receive-result (make-error-result finished-exprs (exn-message exn))))) + (if (not (eq? held-expr no-sexp)) + (begin + (printf "held-expr: ~a~n" held-expr) + (i:receive-result (make-before-error-result finished-exprs held-expr held-redex (exn-message exn)))) + (begin + (printf "no held sexp~n") + (i:receive-result (make-error-result finished-exprs (exn-message exn)))))) (define (make-exception-handler k) (lambda (exn) diff --git a/collects/stepper/reconstructr.ss b/collects/stepper/reconstructr.ss @@ -62,6 +62,32 @@ (define comes-from-or? (make-check-raw-first-symbol 'or)) + ; the lifted-names table maps bindings to numbers. the number, + ; essentially, is how we avoid clashes. So, if a binding with + ; the original name "foo" is associated with the number "2", + ; the lifted name will be "~foo~2". Note that you _need_ + ; that second tilde; otherwise there could be an overlap, + ; e.g. (foo 12) => ~foo12, (foo1 2) => ~foo12. + + (define lifted-names-table (make-hash-table-weak)) + + (define (insert-lifted-name binding) + (let* ([binding-name (z:binding-orig-name binding)] + [matching (filter + (lambda (key&val) (eq? (car key&val) binding-name)) + (hash-table-map lifted-names-table (lambda (key val) (list (z:binding-orig-name key) val))))] + [matching-nums (map cadr matching)] + [free-num (let loop ([try-index 0]) + (if (memq try-index matching-nums) + (loop (+ try-index 1)) + try-index))]) + (hash-table-put! lifted-names-table binding free-num) + (string->symbol (string-append "~" (symbol->string binding-name) "~" (number->string free-num))))) + + (define (lookup-lifted-name binding) + (string->symbol (string-append "~" (symbol->string (z:binding-orig-name binding)) "~" + (number->string (hash-table-get lifted-names-table binding))))) + (define (rectify-value val) (let ([closure-record (closure-table-lookup val (lambda () #f))]) (cond @@ -103,16 +129,24 @@ (and (pair? mark-list) (let ([expr (mark-source (car mark-list))]) (or (and (z:varref? expr) - (or (z:bound-varref? expr) + (or (z:lambda-varref? expr) (let ([var (z:varref-var expr)]) (with-handlers - ([exn:variable? (lambda args #f)]) - (or (and (s:check-pre-defined-var var) + ();[exn:variable? (lambda args (printf "c~n") #f)]) + (printf "a~n") + (or (and (printf "a.5~n") + (s:check-pre-defined-var var) + (printf "result: ~a~n" (s:check-pre-defined-var var)) + (printf "b~n") (or (procedure? (s:global-lookup var)) (eq? var 'empty))) (let ([val (if (z:top-level-varref? expr) (s:global-lookup var) - (find-var-binding mark-list var))]) + (begin + (printf "fkjd~n") + (printf "~a~n" (lookup-var-binding mark-list var)) + (lookup-var-binding mark-list var)))]) + (printf "past lookup-var-binding~n") (and (procedure? val) (not (continuation? val)) (eq? var @@ -120,7 +154,7 @@ (closure-table-lookup val (lambda () #f))))))))))) (and (z:app? expr) (let ([fun-val (mark-binding-value - (find-var-binding mark-list + (lookup-var-binding mark-list (z:varref-var (get-arg-varref 0))))]) (and (procedure? fun-val) (procedure-arity-includes? @@ -142,7 +176,7 @@ (in-inserted-else-clause mark-list))))) (define (second-arg-is-list? mark-list) - (let ([arg-val (mark-binding-value (find-var-binding mark-list (z:varref-var (get-arg-varref 2))))]) + (let ([arg-val (mark-binding-value (lookup-var-binding mark-list (z:varref-var (get-arg-varref 2))))]) (list? arg-val))) (define (in-inserted-else-clause mark-list) @@ -152,17 +186,22 @@ (not (z:if-form? expr)) (comes-from-cond? expr)) (in-inserted-else-clause (cdr mark-list)))))) - - (define (rectify-source-expr expr mark-list lexically-bound-vars) - (let ([recur (lambda (expr) (rectify-source-expr expr mark-list lexically-bound-vars))]) + + ; rectify-source-expr (z:parsed (ListOf Mark) (ListOf z:binding) -> sexp) + + (define (rectify-source-expr expr mark-list lexically-bound-bindings) + (let ([recur (lambda (expr) (rectify-source-expr expr mark-list lexically-bound-bindings))] + [let-recur (lambda (expr bindings) (rectify-source-expr expr mark-list (append bindings lexically-bound-bindings)))]) (cond [(z:varref? expr) - (cond [(memq (z:varref-var expr) lexically-bound-vars) - (z:binding-orig-name (z:bound-varref-binding expr))] + (cond [(z:bound-varref? expr) + (let ([binding (z:bound-varref-binding expr)]) + (if (memq binding lexically-bound-bindings) + (z:binding-orig-name binding) + (if (z:lambda-binding? binding) + (rectify-value (mark-binding-value (lookup-var-binding mark-list (z:varref-var expr)))) + (lookup-lifted-name binding))))] [(z:top-level-varref? expr) - (z:varref-var expr)] - [else - (rectify-value (mark-binding-value (find-var-binding mark-list - (z:varref-var expr))))])] + (z:varref-var expr)])] [(z:app? expr) (map recur (cons (z:app-fun expr) (z:app-args expr)))] @@ -181,11 +220,11 @@ [(z:if-form? expr) (cond [(comes-from-cond? expr) - `(cond ,@(rectify-cond-clauses (z:zodiac-start expr) expr mark-list lexically-bound-vars))] + `(cond ,@(rectify-cond-clauses (z:zodiac-start expr) expr mark-list lexically-bound-bindings))] [(comes-from-and? expr) - `(and ,@(rectify-and-clauses (z:zodiac-start expr) expr mark-list lexically-bound-vars))] + `(and ,@(rectify-and-clauses (z:zodiac-start expr) expr mark-list lexically-bound-bindings))] [(comes-from-or? expr) - `(or ,@(rectify-or-clauses (z:zodiac-start expr) expr mark-list lexically-bound-vars))] + `(or ,@(rectify-or-clauses (z:zodiac-start expr) expr mark-list lexically-bound-bindings))] [else `(if ,(recur (z:if-form-test expr)) ,(recur (z:if-form-then expr)) @@ -203,6 +242,27 @@ ; `(quote ,raw)]) )] + [(z:let-values-form? expr) + (let* ([bindings (z:let-values-form-vars expr)] + [binding-names (map (lambda (b-list) (map z:binding-orig-name b-list)) bindings)] + [right-sides (map recur (z:let-values-form-vals expr))] + [must-be-values? (ormap (lambda (n-list) (not (= (length n-list) 1))) binding-names)] + [rectified-body (let-recur (z:let-values-form-body expr) bindings)]) + (if must-be-values? + `(let-values ,(map list binding-names right-sides) ,rectified-body) + `(let ,(map list (map car binding-names) right-sides) ,rectified-body)))] + + [(z:letrec-values-form? expr) + (let* ([bindings (z:letrec-values-form-vars expr)] + [binding-names (map (lambda (b-list) (map z:binding-orig-name b-list)) bindings)] + [right-sides (map (lambda (expr) (let-recur expr bindings)) + (z:letrec-values-form-vals expr))] + [must-be-values? (ormap (lambda (n-list) (not (= (length n-list) 1))) binding-names)] + [rectified-body (let-recur (z:letrec-values-form-body expr) bindings)]) + (if must-be-values? + `(letrec-values ,(map list binding-names right-sides) ,rectified-body) + `(letrec ,(map list (map car binding-names) right-sides) ,rectified-body)))] + [(z:case-lambda-form? expr) (let* ([arglists (z:case-lambda-form-args expr)] [bodies (z:case-lambda-form-bodies expr)] @@ -211,18 +271,11 @@ (utils:improper-map z:binding-orig-name (utils:arglist->ilist arglist))) arglists)] - [var-form-arglists - (map (lambda (arglist) - (map z:binding-var (z:arglist-vars arglist))) - arglists)] + [binding-form-arglists (map z:arglist-vars arglists)] [o-form-bodies - (map (lambda (body var-form-arglist) - (rectify-source-expr body - mark-list - (append var-form-arglist - lexically-bound-vars))) + (map (lambda (body binding-form-arglist) (let-recur body binding-form-arglist)) bodies - var-form-arglists)]) + binding-form-arglists)]) (cond [(or (comes-from-lambda? expr) (comes-from-define? expr)) `(lambda ,(car o-form-arglists) ,(car o-form-bodies))] [(comes-from-case-lambda? expr) @@ -240,27 +293,27 @@ ; these macro unwinders (and, or) are specific to beginner level - (define (rectify-and-clauses and-source expr mark-list lexically-bound-vars) - (let ([rectify-source (lambda (expr) (rectify-source-expr expr mark-list lexically-bound-vars))]) + (define (rectify-and-clauses and-source expr mark-list lexically-bound-bindings) + (let ([rectify-source (lambda (expr) (rectify-source-expr expr mark-list lexically-bound-bindings))]) (if (and (z:if-form? expr) (equal? and-source (z:zodiac-start expr))) (cons (rectify-source (z:if-form-test expr)) - (rectify-and-clauses and-source (z:if-form-then expr) mark-list lexically-bound-vars)) + (rectify-and-clauses and-source (z:if-form-then expr) mark-list lexically-bound-bindings)) null))) - (define (rectify-or-clauses or-source expr mark-list lexically-bound-vars) - (let ([rectify-source (lambda (expr) (rectify-source-expr expr mark-list lexically-bound-vars))]) + (define (rectify-or-clauses or-source expr mark-list lexically-bound-bindings) + (let ([rectify-source (lambda (expr) (rectify-source-expr expr mark-list lexically-bound-bindings))]) (if (and (z:if-form? expr) (equal? or-source (z:zodiac-start expr))) (cons (rectify-source (z:if-form-test expr)) - (rectify-or-clauses or-source (z:if-form-else expr) mark-list lexically-bound-vars)) + (rectify-or-clauses or-source (z:if-form-else expr) mark-list lexically-bound-bindings)) null))) - (define (rectify-cond-clauses cond-source expr mark-list lexically-bound-vars) - (let ([rectify-source (lambda (expr) (rectify-source-expr expr mark-list lexically-bound-vars))]) + (define (rectify-cond-clauses cond-source expr mark-list lexically-bound-bindings) + (let ([rectify-source (lambda (expr) (rectify-source-expr expr mark-list lexically-bound-bindings))]) (if (equal? cond-source (z:zodiac-start expr)) (if (z:if-form? expr) (cons (list (rectify-source (z:if-form-test expr)) (rectify-source (z:if-form-then expr))) - (rectify-cond-clauses cond-source (z:if-form-else expr) mark-list lexically-bound-vars)) + (rectify-cond-clauses cond-source (z:if-form-else expr) mark-list lexically-bound-bindings)) null) `((else ,(rectify-source expr)))))) @@ -348,175 +401,157 @@ ,(rectify-source-top-marks val))])) so-far)) - (define (reconstruct-inner mark-list so-far) - (let ([rectify-source-current-marks - (lambda (expr) - (rectify-source-expr expr mark-list null))]) - (let* ([top-mark (car mark-list)] - [expr (mark-source top-mark)]) - (cond - ; variable references - [(z:varref? expr) - (if (eq? so-far nothing-so-far) - (rectify-source-current-marks expr) - (e:internal-error expr - "variable reference given as context"))] - - ; applications - - [(z:app? expr) - (let* ([sub-exprs (cons (z:app-fun expr) (z:app-args expr))] - [arg-temps (build-list (length sub-exprs) get-arg-varref)] - [arg-temp-syms (map z:varref-var arg-temps)] - [arg-vals (map (lambda (arg-sym) - (mark-binding-value (find-var-binding mark-list arg-sym))) - arg-temp-syms)]) - (case (mark-label (car mark-list)) - ((not-yet-called) - ; (printf "length of mark-list: ~s~n" (length mark-list)) - ; (printf "mark has binding for third arg: ~s~n" - ; (find-var-binding (list (car mark-list)) (z:varref:var - (letrec - ([split-lists - (lambda (exprs vals) - (if (or (null? vals) - (eq? (car vals) *unevaluated*)) - (values null exprs) - (let-values ([(small-vals small-exprs) - (split-lists (cdr exprs) (cdr vals))]) - (values (cons (car vals) small-vals) small-exprs))))]) - (let-values ([(evaluated unevaluated) (split-lists sub-exprs arg-vals)]) - (let* ([rectified-evaluated (map rectify-value evaluated)]) - (if (null? unevaluated) - rectified-evaluated - (append rectified-evaluated - (cons so-far - (map rectify-source-current-marks (cdr unevaluated))))))))) - ((called) - (if (eq? so-far nothing-so-far) - `(...) ; in unannotated code - `(... ,so-far ...))) - (else - (e:static-error "bad label in application mark: ~s" expr))))] - - ; define-struct - - [(z:struct-form? expr) - (if (comes-from-define-struct? expr) - so-far - (let ([super-expr (z:struct-form-super expr)] - [raw-type (utils:read->raw (z:struct-form-type expr))] - [raw-fields (map utils:read->raw (z:struct-form-fields expr))]) - (if super-expr - `(struct (,raw-type ,so-far) - ,raw-fields) - `(struct ,raw-type ,raw-fields))))] - - ; if - - [(z:if-form? expr) - (let ([test-exp (if (eq? so-far nothing-so-far) - (rectify-source-current-marks - (create-bogus-bound-varref if-temp #f)) - so-far)]) - (cond [(comes-from-cond? expr) - (let* ([clause (list test-exp (rectify-source-current-marks (z:if-form-then expr)))] - [cond-source (z:zodiac-start expr)] - [rest-clauses (rectify-cond-clauses cond-source (z:if-form-else expr) mark-list null)]) - `(cond ,clause ,@rest-clauses))] - [(comes-from-and? expr) - `(and ,test-exp ,@(rectify-and-clauses (z:zodiac-start expr) - (z:if-form-then expr) - mark-list - null))] - [(comes-from-or? expr) - `(or ,test-exp ,@(rectify-or-clauses (z:zodiac-start expr) - (z:if-form-else expr) + (define (rectify-inner mark-list so-far) + (let* ([rectify-source-current-marks + (lambda (expr) + (rectify-source-expr expr mark-list null))] + [rectify-let + (lambda (binding-sets letrec? vals body) + (let+ ([val binding-list (apply append binding-sets)] + [val binding-names (map (lambda (set) (map z:binding-orig-name set)) binding-sets)] + [val must-be-values? (ormap (lambda (n-list) (not (= (length n-list) 1))) binding-sets)] + [val dummy-var-list (build-list (length binding-list) + (lambda (x) (z:varref-var (get-arg-varref x))))] + [val rhs-vals (map (lambda (arg-sym) + (mark-binding-value (lookup-var-binding mark-list arg-sym))) + dummy-var-list)] + [val rhs-list + (let loop ([binding-sets binding-sets] [rhs-vals rhs-vals] [rhs-sources vals]) + (cond [(null? binding-sets) null] + [(eq? (car rhs-vals) *unevaluated*) + (cons so-far + (map (lambda (expr) + (rectify-source-expr expr mark-list (if letrec? + binding-sets + null))) + (cdr rhs-sources)))] + [else + (let*-values ([(first-set) (car binding-sets)] + [(set-vals remaining) (list-partition rhs-vals (length first-set))]) + (cons + (case (length first-set) + ((0) `(values)) + ((1) (car set-vals)) + (else `(values ,@set-vals))) + (loop (cdr binding-sets) remaining (cdr rhs-sources))))]))] + [val rectified-body (rectify-source-expr body mark-list binding-list)]) + (if must-be-values? + `(let-values ,(map list binding-names rhs-list) ,rectified-body) + `(let ,(map list (map car binding-names) rhs-list) ,rectified-body))))] + [top-mark (car mark-list)] + [expr (mark-source top-mark)]) + (cond + ; variable references + [(z:varref? expr) + (if (eq? so-far nothing-so-far) + (rectify-source-current-marks expr) + (e:internal-error expr + "variable reference given as context"))] + + ; applications + + [(z:app? expr) + (let* ([sub-exprs (cons (z:app-fun expr) (z:app-args expr))] + [arg-temps (build-list (length sub-exprs) get-arg-varref)] + [arg-temp-syms (map z:varref-var arg-temps)] + [arg-vals (map (lambda (arg-sym) + (mark-binding-value (lookup-var-binding mark-list arg-sym))) + arg-temp-syms)]) + (case (mark-label (car mark-list)) + ((not-yet-called) + ; (printf "length of mark-list: ~s~n" (length mark-list)) + ; (printf "mark has binding for third arg: ~s~n" + ; (lookup-var-binding (list (car mark-list)) (z:varref:var + (letrec + ([split-lists + (lambda (exprs vals) + (if (or (null? vals) + (eq? (car vals) *unevaluated*)) + (values null exprs) + (let-values ([(small-vals small-exprs) + (split-lists (cdr exprs) (cdr vals))]) + (values (cons (car vals) small-vals) small-exprs))))]) + (let-values ([(evaluated unevaluated) (split-lists sub-exprs arg-vals)]) + (let* ([rectified-evaluated (map rectify-value evaluated)]) + (if (null? unevaluated) + rectified-evaluated + (append rectified-evaluated + (cons so-far + (map rectify-source-current-marks (cdr unevaluated))))))))) + ((called) + (if (eq? so-far nothing-so-far) + `(...) ; in unannotated code + `(... ,so-far ...))) + (else + (e:static-error "bad label in application mark: ~s" expr))))] + + ; define-struct + + [(z:struct-form? expr) + (if (comes-from-define-struct? expr) + so-far + (let ([super-expr (z:struct-form-super expr)] + [raw-type (utils:read->raw (z:struct-form-type expr))] + [raw-fields (map utils:read->raw (z:struct-form-fields expr))]) + (if super-expr + `(struct (,raw-type ,so-far) + ,raw-fields) + `(struct ,raw-type ,raw-fields))))] + + ; if + + [(z:if-form? expr) + (let ([test-exp (if (eq? so-far nothing-so-far) + (rectify-source-current-marks + (create-bogus-bound-varref if-temp #f)) + so-far)]) + (cond [(comes-from-cond? expr) + (let* ([clause (list test-exp (rectify-source-current-marks (z:if-form-then expr)))] + [cond-source (z:zodiac-start expr)] + [rest-clauses (rectify-cond-clauses cond-source (z:if-form-else expr) mark-list null)]) + `(cond ,clause ,@rest-clauses))] + [(comes-from-and? expr) + `(and ,test-exp ,@(rectify-and-clauses (z:zodiac-start expr) + (z:if-form-then expr) mark-list null))] - [else - `(if ,test-exp - ,(rectify-source-current-marks (z:if-form-then expr)) - ,(rectify-source-current-marks (z:if-form-else expr)))]))] - - ; quote : there is no mark or break on a quote. - - ; begin, begin0 : may not occur directly (or indirectly?) except in advanced - - ; let-values - -; [(z:let-values-form? expr) -; (let+ ([val var-sets (z:let-values-form-vars expr)] -; [val var-set-list (apply append var-sets)] -; [val vals (z:let-values-form-vals expr)] -; [val dummy-var-list (build-list (length var-set-list) (lambda (x) (get-arg-varref x)))] -; [val rhs-vals (map (lambda (arg-sym) -; (mark-binding-value (find-var-binding mark-list arg-sym))) -; arg-temp-syms)] -; [val rhs-list -; (let loop ([var-sets var-sets] [rhs-vals rhs-vals] [rhs-sources vals]) -; (if (eq? (car rhs-vals) *undefined*) -; (map rectify-source-current-marks rhs-sources) -; (let*-values ([first-set (car var-sets)] -; [(set-vals remaining) (list-partition rhs-vals (length first-set))]) -; (cons -; (case (length first-set) -; ((0) `(values)) -; ((1) (car set-vals)) -; (else `(values ,@set-vals))) -; (loop (cdr var-sets) remaining (cdr rhs-sources))))))] -; -; [val (values annotated-vals free-vars-vals) -; (dual-map non-tail-recur vals)] -; [val (values annotated-body free-vars-body) -; (let-body-recur (z:let-values-form-body expr) -; (bindings->varrefs var-set-list))] -; [val free-vars (apply var-set-union (varref-remove* (bindings->varrefs var-set-list) free-vars-body) -; free-vars-vals)]) -; (if cheap-wrap? -; (let ([bindings -; (map (lambda (vars val) -; `(,(map utils:get-binding-name vars) ,val)) -; var-sets -; annotated-vals)]) -; (values (expr-cheap-wrap `(#%let-values ,bindings ,annotated-body)) free-vars)) -; (let+ ( -; [val dummy-var-list (apply append dummy-var-sets)] -; [val outer-dummy-initialization -; `([,(map z:varref-var dummy-var-list) -; (#%values ,@(build-list (length dummy-var-list) -; (lambda (_) '(#%quote *undefined*))))])] -; [val set!-clauses -; (map (lambda (dummy-var-set val) -; `(#%set!-values ,(map z:varref-var dummy-var-set) ,val)) -; dummy-var-sets -; annotated-vals)] -; [val inner-transference -; `([,(map utils:get-binding-name var-set-list) -; (values ,@(map z:varref-var dummy-var-list))])] -; ; time to work from the inside out again -; [val inner-let-values -; `(#%let-values ,inner-transference ,annotated-body)] -; [val middle-begin -; `(#%begin ,@set!-clauses ,inner-let-values)] -; [val wrapped-begin -; (wcm-wrap (make-debug-info-app (var-set-union tail-bound dummy-var-list) -; (var-set-union free-vars dummy-var-list) -; 'none) -; middle-begin)] -; [val whole-thing -; `(#%let-values ,outer-dummy-initialization ,wrapped-begin)]) -; (values whole-thing free-vars))))] - - ; define-values : define's don't get marks, so they can't occur here - - ; lambda : there is no mark or break on a quote - - [else - (print-struct #t) - (e:internal-error - expr - (format "stepper:reconstruct: unknown object to reconstruct, ~a~n" expr))])))) + [(comes-from-or? expr) + `(or ,test-exp ,@(rectify-or-clauses (z:zodiac-start expr) + (z:if-form-else expr) + mark-list + null))] + [else + `(if ,test-exp + ,(rectify-source-current-marks (z:if-form-then expr)) + ,(rectify-source-current-marks (z:if-form-else expr)))]))] + + ; quote : there is no mark or break on a quote. + + ; begin, begin0 : may not occur directly (or indirectly?) except in advanced + + ; let-values + + [(z:let-values-form? expr) + (rectify-let #f + (z:let-values-form-vars expr) + (z:let-values-form-vals expr) + (z:let-values-form-body expr))] + + [(z:letrec-values-form? expr) + (rectify-let #t + (z:letrec-values-form-vars expr) + (z:letrec-values-form-vals expr) + (z:letrec-values-form-body expr))] + + ; define-values : define's don't get marks, so they can't occur here + + ; lambda : there is no mark or break on a quote + + [else + (print-struct #t) + (e:internal-error + expr + (format "stepper:reconstruct: unknown object to reconstruct, ~a~n" expr))]))) (define redex #f) @@ -524,7 +559,7 @@ (define (current-def-rectifier so-far mark-list first) (if (null? mark-list) (rectify-top-level expr so-far) - (let ([reconstructed (reconstruct-inner mark-list so-far)]) + (let ([reconstructed (rectify-inner mark-list so-far)]) (current-def-rectifier (if first (begin @@ -534,7 +569,34 @@ (cdr mark-list) #f)))) - + (define (let-style-abstraction binding-sets body) + (let* ([redex (rectify-inner mark-list #f)] + [binding-list (apply append binding-sets)] + [new-names (map insert-lifted-name binding-list)] + [dummy-var-list (build-list (length binding-list) (lambda (x) + (z:varref-var (get-arg-varref x))))] + [rhs-vals (map (lambda (arg-sym) + (mark-binding-value (lookup-var-binding mark-list arg-sym))) + dummy-var-list)] + [before-step (current-def-rectifier redex (cdr mark-list) #f)] + [reduct (rectify-source-expr body mark-list null)] + [after-step (current-def-rectifier reduct (cdr mark-list) #f)] + [new-defines (map (lambda (name val) `(define ,name ,val)) new-names rhs-vals)]) + (list new-defines before-step redex after-step reduct))) + + + (define (rectify-let-values-step) + (let* ([source-expr (mark-source (car mark-list))]) + (apply let-style-abstraction + (map (lambda (accessor) (accessor source-expr)) + (cond [(z:let-values-form? source-expr) + (list z:let-values-form-vars + z:let-values-form-body)] + [(z:letrec-values-form? source-expr) + (list z:letrec-values-form-vars + z:let-values-form-body)]))))) + + ; (define (confusable-value? val) ; (not (or (number? val) ; (boolean? val) @@ -542,15 +604,20 @@ ; (symbol? val)))) (define answer - (if (eq? break-kind 'result-break) - (let* ([innermost (if (null? returned-value-list) - (rectify-source-expr (mark-source (car mark-list)) mark-list null) - (rectify-value (car returned-value-list)))] - [current-def (current-def-rectifier highlight-placeholder (cdr mark-list) #f)]) - (list current-def innermost)) - (begin - (let ([current-def (current-def-rectifier nothing-so-far mark-list #t)]) - (list current-def redex))))) + (case break-kind + ((result-break) + (let* ([innermost (if (null? returned-value-list) + (rectify-source-expr (mark-source (car mark-list)) mark-list null) + (rectify-value (car returned-value-list)))] + [current-def (current-def-rectifier highlight-placeholder (cdr mark-list) #f)]) + (list current-def innermost))) + ((normal-break) + (let ([current-def (current-def-rectifier nothing-so-far mark-list #t)]) + (list current-def redex))) + ((double-break) + (rectify-let-values-step)) + (else + (e:internal-error 'reconstruct-current-def "unknown break kind: " break-kind)))) ) diff --git a/collects/stepper/sig.ss b/collects/stepper/sig.ss @@ -46,7 +46,7 @@ mark-binding-varref expose-mark display-mark - find-var-binding)) + lookup-var-binding)) (define-signature stepper:client-procs^ (read-getter diff --git a/collects/stepper/utils.ss b/collects/stepper/utils.ss @@ -45,7 +45,7 @@ (let ([gdv (global-defined-value real-id)]) (or (syntax? gdv) (macro? gdv))))) - (e:static-error id "Invalid use of keyword ~s" real-id)))))) + (e:static-error id "keyword: invalid use of keyword ~s" real-id)))))) (define check-for-keyword (check-for-keyword/both #t)) (define check-for-syntax-or-macro-keyword (check-for-keyword/both #f)) diff --git a/collects/stepper/view-controller.ss b/collects/stepper/view-controller.ss @@ -382,7 +382,7 @@ (define beginner-level-name "Beginning Student") (define (stepper-go frame) - (let ([settings (f:preferences:get 'drscheme:settings)]) + (let ([settings (f:preferences:get d:language:settings-preferences-symbol)]) (if #f ; (not (string=? (d:basis:setting-name settings) beginner-level-name)) (message-box "Stepper" (format (string-append "Language level is set to \"~a\".~n" @@ -391,4 +391,4 @@ beginner-level-name) #f '(ok)) - (stepper-wrapper frame settings))))) -\ No newline at end of file + (stepper-wrapper frame settings))))) diff --git a/collects/tests/drscheme/language-test.ss b/collects/tests/drscheme/language-test.ss @@ -48,6 +48,9 @@ (set-language #t) (do-execute drs)) + (test-expression "(error 'a \"~a\" 1)" "a: 1") + (test-expression "(error \"a\" \"a\")" "a \"a\"") + (test-expression "(time 1)" (format "[cpu time: 0 real time: 0 gc time: 0]~n1")) (test-expression "(list make-posn posn-x posn-y posn?)" "reference to undefined identifier: make-posn") @@ -87,6 +90,9 @@ (set-language #t) (do-execute drs)) + (test-expression "(error 'a \"~a\" 1)" "a: 1") + (test-expression "(error \"a\" \"a\")" "a \"a\"") + (test-expression "(time 1)" (format "[cpu time: 0 real time: 0 gc time: 0]~n1")) (test-expression "(list make-posn posn-x posn-y posn?)" "reference to undefined identifier: make-posn") @@ -131,6 +137,9 @@ (set-language #t) (do-execute drs)) + (test-expression "(error 'a \"~a\" 1)" "a: 1") + (test-expression "(error \"a\" \"a\")" "a \"a\"") + (test-expression "(time 1)" (format "[cpu time: 0 real time: 0 gc time: 0]~n1")) (test-expression "(list make-posn posn-x posn-y posn?)" "reference to undefined identifier: make-posn") @@ -138,7 +147,7 @@ (test-expression "set-posn-y!" "reference to undefined identifier: set-posn-y!") (test-expression "true" "reference to undefined identifier: true") - (test-expression "mred^" "Invalid use of signature name mred^") + (test-expression "mred^" "signature: invalid use of signature name mred^") (test-expression "(eq? 'a 'A)" "#t") (test-expression "(set! x 1)" "set!: cannot set undefined identifier: x") (test-expression "(cond [(= 1 2) 3])" "") @@ -146,7 +155,8 @@ (test-expression "'(1)" "(1)") (test-expression "(define shrd (box 1)) (list shrd shrd)" "(#&1 #&1)") - (test-expression "(local ((define x x)) 1)" "Invalid position for internal definition") + (test-expression "(local ((define x x)) 1)" + "definition: invalid position for internal definition") (test-expression "(letrec ([x x]) 1)" "1") (test-expression "(if 1 1 1)" "1") (test-expression "(+ 1)" "1") @@ -176,6 +186,9 @@ (set-language #t) (do-execute drs)) + (test-expression "(error 'a \"~a\" 1)" "a: 1") + (test-expression "(error \"a\" \"a\")" "a \"a\"") + (test-expression "(time 1)" (format "[cpu time: 0 real time: 0 gc time: 0]~n1")) (test-expression "(list make-posn posn-x posn-y posn?)" "reference to undefined identifier: make-posn") @@ -191,7 +204,8 @@ (test-expression "'(1)" "(1)") (test-expression "(define shrd (box 1)) (list shrd shrd)" "(#&1 #&1)") - (test-expression "(local ((define x x)) 1)" "Invalid position for internal definition") + (test-expression "(local ((define x x)) 1)" + "definition: invalid position for internal definition") (test-expression "(letrec ([x x]) 1)" "1") (test-expression "(if 1 1 1)" "1") (test-expression "(+ 1)" "1") @@ -214,6 +228,11 @@ (set-language #t) (do-execute drs)) + (test-expression "(error 'a \"~a\" 1)" + "procedure error: expects 2 arguments, given 3: 'a \"~a\" 1") + (test-expression "(error \"a\" \"a\")" + "error: expected a symbol and a string, got \"a\" and \"a\"") + (test-expression "(time 1)" "reference to undefined identifier: time") (test-expression "(list make-posn posn-x posn-y posn?)" "(cons make-posn (cons posn-x (cons posn-y (cons posn? empty))))") @@ -226,11 +245,13 @@ (test-expression "(set! x 1)" "reference to undefined identifier: set!") (test-expression "(cond [(= 1 2) 3])" "no matching cond clause") (test-expression "(cons 1 2)" "cons: second argument must be of type <list>, given 1 and 2") - (test-expression "'(1)" "Misuse of quote: '(1) is not a symbol") + (test-expression "'(1)" "quote: misused: '(1) is not a symbol") (test-expression "(define shrd (box 1)) (list shrd shrd)" "(cons (box 1) (cons (box 1) empty))") - (test-expression "(local ((define x x)) 1)" "Invalid definition: must be at the top level") - (test-expression "(letrec ([x x]) 1)" "First term after parenthesis is illegal in an application") + (test-expression "(local ((define x x)) 1)" + "definition: must be at the top level") + (test-expression "(letrec ([x x]) 1)" + "illegal application: first term in application must be a function name") (test-expression "(if 1 1 1)" "Condition value is neither true nor false: 1") (test-expression "(+ 1)" "+: expects at least 2 arguments, given 1: 1") (test-expression "1.0" "1") @@ -257,6 +278,11 @@ (set-language #t) (do-execute drs)) + (test-expression "(error 'a \"~a\" 1)" + "procedure error: expects 2 arguments, given 3: 'a \"~a\" 1") + (test-expression "(error \"a\" \"a\")" + "error: expected a symbol and a string, got \"a\" and \"a\"") + (test-expression "(time 1)" (format "[cpu time: 0 real time: 0 gc time: 0]~n1")) (test-expression "(list make-posn posn-x posn-y posn?)" "(list make-posn posn-x posn-y posn?)") @@ -300,6 +326,11 @@ (set-language #t) (do-execute drs)) + (test-expression "(error 'a \"~a\" 1)" + "procedure error: expects 2 arguments, given 3: 'a \"~a\" 1") + (test-expression "(error \"a\" \"a\")" + "error: expected a symbol and a string, got \"a\" and \"a\"") + (test-expression "(time 1)" (format "[cpu time: 0 real time: 0 gc time: 0]~n1")) (test-expression "(list make-posn posn-x posn-y posn?)" "(list make-posn posn-x posn-y posn?)") diff --git a/collects/tests/drscheme/repl-test.ss b/collects/tests/drscheme/repl-test.ss @@ -7,27 +7,27 @@ ;; basic tests (make-test "(" - "1.1-1.2: missing close paren" + "1.1-1.2: syntax error: missing close paren" #t - "missing close paren" + "syntax error: missing close paren" (vector 0 1) "read: expected a ')'; started at position 1 in " "read: expected a ')'; started at position 1, line 1 in " #t #f) (make-test "." - "1.1-1.2: can't use `.' outside list" + "1.1-1.2: syntax error: can't use `.' outside list" #t - "can't use `.' outside list" + "syntax error: can't use `.' outside list" (vector 0 1) "read: illegal use of \".\" at position 1 in " "read: illegal use of \".\" at position 1, line 1 in " #t #f) (make-test "(lambda ())" - "1.1-1.12: Malformed lambda" + "1.1-1.12: lambda: malformed expression" #t - "Malformed lambda" + "lambda: malformed expression" (vector 0 11) "lambda: bad syntax in: (lambda ())" "lambda: bad syntax in: (lambda ())" @@ -99,9 +99,9 @@ #f #f) (make-test " (eval '(lambda ()))" - "1.5-1.24: Malformed lambda" + "1.5-1.24: lambda: malformed expression" #t - "Malformed lambda" + "lambda: malformed expression" (vector 4 23) "lambda: bad syntax in: (lambda ())" "lambda: bad syntax in: (lambda ())" @@ -131,18 +131,18 @@ ;; error in the middle (make-test "1 2 ( 3 4" - "1.5-1.6: missing close paren" + "1.5-1.6: syntax error: missing close paren" #t - (format "1~n2~nmissing close paren") + (format "1~n2~nsyntax error: missing close paren") (vector 4 5) (format "1~n2~nread: expected a ')'; started at position 5 in ") (format "read: expected a ')'; started at position 5, line 1 in ") #t #f) (make-test "1 2 . 3 4" - "1.5-1.6: can't use `.' outside list" + "1.5-1.6: syntax error: can't use `.' outside list" #t - (format "1~n2~ncan't use `.' outside list") + (format "1~n2~nsyntax error: can't use `.' outside list") (vector 4 5) (format "1~n2~nread: illegal use of \".\" at position 5 in ") (format "read: illegal use of \".\" at position 5, line 1 in ") @@ -251,9 +251,9 @@ #f) (make-test "(define-macro m 1)" - "1.1-1.19: Expander is not a procedure" + "1.1-1.19: define-macro: expander is not a procedure" #t - "Expander is not a procedure" + "define-macro: expander is not a procedure" (vector 0 18) "define-macro: not a procedure" "define-macro: not a procedure" diff --git a/collects/tests/framework/frame.ss b/collects/tests/framework/frame.ss @@ -19,6 +19,27 @@ '(frame:basic-mixin frame%)) (test-creation + 'info-mixin-creation + '(frame:info-mixin frame:basic%)) +(test-creation + 'info%-creation + 'frame:info%) + +(test-creation + 'text-info-mixin-creation + '(frame:text-info-mixin frame:info%)) +(test-creation + 'text-info%-creation + 'frame:text-info%) + +(test-creation + 'pasteboard-info-mixin-creation + '(frame:pasteboard-info-mixin frame:info%)) +(test-creation + 'pasteboard-info%-creation + 'frame:pasteboard-info%) + +(test-creation 'standard-menus%-creation 'frame:standard-menus%) (test-creation @@ -33,7 +54,7 @@ '(frame:text-mixin frame:editor%)) (test-creation 'text-mixin-creation - '(frame:text-mixin (frame:editor-mixin frame:standard-menus%))) + '(frame:text-mixin frame:editor%)) (test-creation 'searchable%-creation @@ -43,21 +64,11 @@ '(frame:searchable-mixin frame:text%)) (test-creation - 'info-mixin-creation - '(frame:info-mixin frame:searchable%)) -(test-creation - 'text-info-mixin-creation - '(frame:text-info-mixin (frame:info-mixin frame:searchable%))) -(test-creation - 'text-info%-creation - 'frame:text-info%) - -(test-creation 'text-info-file%-creation 'frame:text-info-file%) (test-creation 'text-info-file-mixin-creation - '(frame:file-mixin frame:text-info%)) + '(frame:file-mixin frame:text%)) (test-creation 'pasteboard-mixin-creation @@ -70,15 +81,8 @@ 'frame:pasteboard%) (test-creation - 'pasteboard-info-mixin-creation - '(frame:info-mixin frame:searchable%)) -(test-creation - 'pasteboard-info%-creation - 'frame:pasteboard-info%) - -(test-creation 'pasteboard-info-file-mixin-creation - '(frame:file-mixin frame:pasteboard-info%)) + '(frame:file-mixin frame:pasteboard%)) (test-creation 'pasteboard-info-file%-creation 'frame:pasteboard-info-file%) @@ -130,5 +134,4 @@ (test-open "frame:editor open" 'frame:text%) (test-open "frame:searchable open" 'frame:searchable%) -(test-open "frame:text-info open" 'frame:text-info%) -(test-open "frame:text-info-file open" 'frame:text-info-file%) +(test-open "frame:text-info open" 'frame:text-info-file%) diff --git a/collects/tests/framework/load.ss b/collects/tests/framework/load.ss @@ -72,6 +72,30 @@ (global-defined-value 'test:run-one) (global-defined-value 'test:button-push) (void))) + + (test + 'frameworkp.ss + pred + '(parameterize ([current-namespace (make-namespace 'mred)]) + (require-library "frameworks.ss" "framework") + (require-library "file.ss") + (eval + '(define-values/invoke-unit/sig + framework^ + (compound-unit/sig + (import) + (link [mred : mred^ (mred@)] + [core : mzlib:core^ ((require-library "corer.ss"))] + [pf : framework:prefs-file^ + ((let ([tf (make-temporary-file)]) + (unit/sig framework:prefs-file^ (import) + (define preferences-filename tf))))] + [framework : framework^ ((require-library "frameworkp.ss" "framework") + core mred pf)]) + (export (open framework))))) + (global-defined-value 'preferences:get) + (void))) + (test 'frameworkr.ss pred diff --git a/collects/tests/framework/main.ss b/collects/tests/framework/main.ss @@ -158,15 +158,17 @@ (string-append (exn-message x) "; rest of string: " - (apply - string - (let loop () - (if (char-ready? in-port) - (let ([char (read-char in-port)]) - (if (eof-object? char) - null - (cons char (loop)))) - null))))))]) + (format + "~s" + (apply + string + (let loop () + (if (char-ready? in-port) + (let ([char (read-char in-port)]) + (if (eof-object? char) + null + (cons char (loop)))) + null)))))))]) (read in-port))]) (unless (or (eof-object? answer) (and (list? answer) diff --git a/collects/tests/framework/text.ss b/collects/tests/framework/text.ss @@ -62,9 +62,9 @@ (test-creation 'frame:text% 'text:searching% 'text:searching-creation) -(test-creation 'frame:text-info% +(test-creation '(frame:searchable-mixin frame:text%) '(text:info-mixin (editor:info-mixin text:searching%)) 'text:info-mixin-creation) -(test-creation 'frame:text-info% +(test-creation '(frame:searchable-mixin frame:text%) 'text:info% 'text:info-creation) \ No newline at end of file diff --git a/collects/userspce/init-paramr.ss b/collects/userspce/init-paramr.ss @@ -43,6 +43,7 @@ signal-not-boolean eq?-only-compares-symbols? <=-at-least-two-args + error-sym/string-only disallow-untagged-inexact-numbers print-tagged-inexact-numbers whole/fractional-exact-numbers @@ -71,6 +72,7 @@ (signal-not-boolean #t) (eq?-only-compares-symbols? #t) (<=-at-least-two-args #t) + (error-sym/string-only #t) (disallow-untagged-inexact-numbers #f) (print-tagged-inexact-numbers #t) (whole/fractional-exact-numbers #f) @@ -96,6 +98,7 @@ (signal-not-boolean #t) (eq?-only-compares-symbols? #t) (<=-at-least-two-args #t) + (error-sym/string-only #t) (disallow-untagged-inexact-numbers #f) (print-tagged-inexact-numbers #t) (whole/fractional-exact-numbers #f) @@ -121,6 +124,7 @@ (signal-not-boolean #f) (eq?-only-compares-symbols? #f) (<=-at-least-two-args #t) + (error-sym/string-only #t) (disallow-untagged-inexact-numbers #f) (print-tagged-inexact-numbers #t) (whole/fractional-exact-numbers #f) @@ -146,6 +150,7 @@ (signal-not-boolean #f) (eq?-only-compares-symbols? #f) (<=-at-least-two-args #f) + (error-sym/string-only #f) (disallow-untagged-inexact-numbers #f) (print-tagged-inexact-numbers #f) (whole/fractional-exact-numbers #f) @@ -171,6 +176,7 @@ (signal-not-boolean #f) (eq?-only-compares-symbols? #f) (<=-at-least-two-args #f) + (error-sym/string-only #f) (disallow-untagged-inexact-numbers #f) (print-tagged-inexact-numbers #f) (whole/fractional-exact-numbers #f) @@ -664,6 +670,7 @@ (params:allow-improper-lists improper-lists?)) (params:eq?-only-compares-symbols (setting-eq?-only-compares-symbols? setting)) (params:<=-at-least-two-args (setting-<=-at-least-two-args setting)) + (params:error-sym/string-only (setting-error-sym/string-only setting)) (when (teaching-level? setting) (global-define-values/invoke-unit/sig ricedefs^ ricedefs@ #f (params : plt:userspace:params^))) ;; end ricedefs diff --git a/collects/userspce/interface.ss b/collects/userspce/interface.ss @@ -9,47 +9,80 @@ (error 'set-zodiac-phase "unknown phase: ~a~n" sym)) (set! zodiac-phase sym)) + (define-struct (exn:zodiac-syntax struct:exn:syntax) (link-tag)) + (define-struct (exn:zodiac-read struct:exn:read) (link-tag)) + + ;; init-substring? : string string -> boolean + ;; calculates if sub is an initial substring of str + (define (init-substring? sub str) + (and (>= (string-length str) + (string-length sub)) + (string=? (substring str 0 (string-length sub)) + sub))) + ;; dispatch-report : string zodiac:zodiac -> ALPHA ;; escapes - (define dispatch-report - (lambda (string object) - (raise - (with-continuation-mark - aries:w-c-m-key - (aries:make-zodiac-mark object) - (case zodiac-phase - [(expander) (make-exn:syntax string (current-continuation-marks) #f)] - [(reader) (make-exn:read string (current-continuation-marks) #f)] - [else (make-exn:user string (current-continuation-marks))]))))) + (define (dispatch-report string object link-tag) + (raise + (with-continuation-mark + aries:w-c-m-key + (aries:make-zodiac-mark object) + (let ([kwd? (init-substring? "kwd:" (symbol->string link-tag))]) + (case zodiac-phase + [(expander) + (if kwd? + (make-exn:zodiac-syntax string + (current-continuation-marks) + #f + link-tag) + (make-exn:syntax string + (current-continuation-marks) + #f))] + [(reader) + (if kwd? + (make-exn:zodiac-read + string (current-continuation-marks) #f link-tag) + (make-exn:read + string (current-continuation-marks) #f))] + [else (make-exn:user string (current-continuation-marks))]))))) ;; report-error : symbol -> (+ zodiac:zodiac zodiac:eof zodiac:period) string (listof TST) ->* ALPHA ;; escapes (define report-error (lambda (type) - (lambda (z s . args) - (let ([string (apply format (if (eq? type 'internal) - (string-append "report error.Internal error: " - s) - s) + (lambda (link-text link-tag z s . args) + (let ([string (apply format + (if (eq? type 'internal) + (string-append "Internal error: " + link-text + ": " + s) + (string-append link-text ": " s)) args)]) (cond - [(zodiac:zodiac? z) (dispatch-report string z)] - [(zodiac:eof? z) (dispatch-report string (zodiac:make-zodiac 'origin - (zodiac:eof-location z) - (zodiac:eof-location z)))] - [(zodiac:period? z) (dispatch-report string (zodiac:make-zodiac 'origin - (zodiac:period-location z) - (zodiac:period-location z)))] - [else ((error-display-handler) (format "internal-error.report-error: ~a: ~a" z string))]))))) + [(zodiac:zodiac? z) + (dispatch-report string z link-tag)] + [(zodiac:eof? z) + (dispatch-report + string + (zodiac:make-zodiac 'origin + (zodiac:eof-location z) + (zodiac:eof-location z)) + link-tag)] + [(zodiac:period? z) + (dispatch-report + string + (zodiac:make-zodiac 'origin + (zodiac:period-location z) + (zodiac:period-location z)) + link-tag)] + [else ((error-display-handler) + (format "internal-error.report-error: ~a: ~a" z string))]))))) ;; static-error : (+ zodiac:zodiac zodiac:eof zodiac:period) string (listof TST) ->* ALPHA ;; escapes (define static-error (report-error 'static)) - ;; dynamic-error : (+ zodiac:zodiac zodiac:eof zodiac:period) string (listof TST) ->* ALPHA - ;; escapes - (define dynamic-error (report-error 'dynamic)) - ;; internal-error : (+ zodiac:zodiac zodiac:eof zodiac:period) string (listof TST) ->* ALPHA ;; escapes (define internal-error (report-error 'internal))) diff --git a/collects/userspce/paramr.ss b/collects/userspce/paramr.ss @@ -1,5 +1,6 @@ (unit/sig plt:userspace:params^ (import) + (define error-sym/string-only (make-parameter #f)) (define <=-at-least-two-args (make-parameter #t)) (define allow-improper-lists (make-parameter #t)) (define eq?-only-compares-symbols (make-parameter #f))) diff --git a/collects/userspce/params.ss b/collects/userspce/params.ss @@ -1,4 +1,5 @@ (define-signature plt:userspace:params^ - (<=-at-least-two-args + (error-sym/string-only + <=-at-least-two-args allow-improper-lists eq?-only-compares-symbols)) \ No newline at end of file diff --git a/collects/userspce/ricedefr.ss b/collects/userspce/ricedefr.ss @@ -4,7 +4,7 @@ (define check-second (lambda (prim-name a b) (unless (list? b) - (error prim-name + (#%error prim-name "second argument must be of type <list>, given ~e and ~e" a b)))) @@ -16,7 +16,7 @@ [(null? (cdr l)) (let ([last (car l)]) (unless (list? last) - (error prim-name + (#%error prim-name "last argument must be of type <list>, given ~e; all args: ~a" last (map (lambda (x) (format "~e" x)) args))))] @@ -25,7 +25,7 @@ (define (check-arity prim len lst) (let ([lst-len (length lst)]) (unless (#%>= lst-len len) - (error prim + (#%error prim "expects at least ~a arguments, given ~a" len (if (#%= 0 lst-len) @@ -126,4 +126,15 @@ #%append! (lambda x (check-last 'append! x) - (apply #%append! x))))) + (apply #%append! x)))) + + (define error (if (params:error-sym/string-only) + (lambda (sym str) + (unless (and (symbol? sym) + (string? str)) + (#%error 'error + "expected a symbol and a string, got ~e and ~e" + sym str)) + (#%error sym str)) + #%error)) + ) diff --git a/collects/userspce/ricedefs.ss b/collects/userspce/ricedefs.ss @@ -5,4 +5,5 @@ set-cdr! list* append - append!)) + append! + error)) diff --git a/collects/userspce/sig.ss b/collects/userspce/sig.ss @@ -151,6 +151,8 @@ (define-signature drscheme:interface^ ((open zodiac:interface^) + (struct exn:zodiac-syntax (link-tag)) + (struct exn:zodiac-read (link-tag)) set-zodiac-phase)) (define-signature plt:basis-import^ diff --git a/collects/zodiac/doc.txt b/collects/zodiac/doc.txt @@ -1,6 +1,8 @@ +_Zodiac_ +-------- Using _Zodiac_ --------------- +============== The top-level way: @@ -17,6 +19,7 @@ The unit/sig way: Link time: (require-library-unit/sig "link.ss" "zodiac") + (require-library-unit/sig "link2.ss" "zodiac") ; see "Error Handlers" below Imports: zodiac:interface^ ; see "Error Handlers" below mzlib:pretty-print^ @@ -80,19 +83,75 @@ Handler Parameters Error Handlers -------------- +There are two interfaces to the error handler procedures. Programmers +choose the one they want by using link.ss or link2.ss, as appropriate. + Zodiac relies on two error handlers that are provided by its > zodiac:interface^ import: > internal-error - for when things go wrong in zodiac that should never go wrong -> static-error - for input errors during read or expand. +> static-error - for input errors during read or expand + +Implementors of these procedures are expected to ensure that the +procedures never return. internal-error has the same interface in +both link.ss and link2.ss: + +internal-error: where fmt-spec . args + where -- a zodiac AST + fmt-spec -- a format-style string + args -- arguments for the format string + + Sample implementation: + + (define (internal-error where fmt-spec . args) + (printf "Internal error at: ~s~n" where) ; or, pull location out of `where' + (apply error 'internal-error fmt-spec args)) -A zodiac error handler takes a zodiac AST followed by format-style - arguments. For example: +static-error has two different interfaces. In link.ss: + +static-error: where fmt-spec . args + where -- a zodiac AST + fmt-spec -- a format-style string + args -- arguments for the format string + + Sample implementation: (define (static-error where fmt-spec . args) + (printf "Static error at: ~s~n" where) ; or, pull location out of `where' + (apply error 'static-error fmt-spec args)) + +In link2.ss: + +static-error: link-text link-tag source-term fmt-spec . args + link-text -- a string reporting the major information about the + error; typically, this will be turned into a hyperlink + by a user interface + link-tag -- a tag specifying the nature of the error; typically, + this will be used by the user interface to look up a + database and generate a URL for the hyperlink + fmt-spec -- a format-style string for information not in link-text + args -- arguments for the format string + + Producers of error messages assume that the information in these + arguments will be used in the following manner: + + <link-text>: <fmt-spec-with-args-replaced> + + Implementors may use them in any way they wish, so long as they keep + in mind that the error producer has made the above presumption. + Producers of errors *cannot* assume that the link-tag will be used + (since the implementor may not have access to a hypertext medium), + and must therefore provide enough useful information in the + link-text and fmt-spec arguments. + + Sample implementation: + + (define (static-error link-text link-tag where fmt-spec . args) (printf "Error at: ~s~n" where) ; or, pull location out of `where' - (apply error 'syntax-error fmt-spec args)) + (apply error 'syntax-error + (string-append link-text ": " fmt-spec) + args)) Example ------- @@ -193,3 +252,617 @@ source-who value 'non-source. Of course, the location field of "non-source" syntax still matches the syntax to a particular source expression. Similarly, the nested `if' in the expansion of `cons' contains a manufactured `if' expression. + +Error Tags +========== + +These are the tags generated by Zodiac to report static-error's. + +kwd Tags +-------- + +The following tags are prefixed with "kwd:", as in, + + kwd:lambda + +They correspond exclusively to forms built into the language. + + case-lambda lambda define-internal begin-internal begin begin0 if + with-continuation-mark quote set!-values local define local-define + define-values struct define-struct define-structure let-struct let + let* delay time let-values let*-values letrec-values letrec or nor + and nand recur rec cond case evcase when unless let/cc let/ec do + fluid-let parameterize with-handlers define-macro let-macro unquote + unquote-splicing quasiquote unit compound-unit invoke-unit + signature-struct signature->symbols define-signature let-signature + unit-include unit/sig compound-unit compound-unit/sig + invoke-unit/sig unit->unit/sig define-values global-define-values + polymorphic mrspidey:control : type: define-type define-constructor + reference-file require-library require-relative-library + require-library-unit require-unit require-unit/sig + require-library-unit/sig require-relative-library-unit + require-relative-library-unit/sig interface class-private + class-inherit class-rename class-sequence class class* class*/names + ivar send send* make-generic set! define-values require-unit + require-unit/sig require-library-unit require-library-unit/sig + require-relative-library-unit require-relative-library-unit/sig + +Pre-Parsing Tags +---------------- + +> read:syntax-error + + Any syntax error during the reading phase. + +> scan:syntax-error + + Any syntax error during the scanning phase. + +term Tags +--------- + +The following tags are used to denote syntactic errors while parsing +programs. + +> term:internal-def-not-foll-by-expr + + Internal definition must be followed by an expression. A sequence + of nothing but internal definitions is invalid (since this must + translate into the letrec family, which needs a body). + +> term:duplicate-interal-def + + Each name can be defined only once internally. + +> term:case/lambda-only-in-def + + At lower language levels, procedures may only be declared + immediately within a definition. + +> term:define-internal-invalid-posn + + Not at a legal internal define position. + +> term:define-illegal-implicit-begin + + A definition body has multiple body terms. This is illegal at lower + language levels. + +> term:if-must-have-else + + At lower language levels, if's must be two-armed. + +> term:quote-not-on-symbol + + At lower language levels, quote can only be used on symbols. + +> term:struct-not-id + + The field names in a structure must be valid identifiers. + +> term:super-struct-invalid + + Invalid super-structure declaration syntax. + +> term:super-struct-not-id + + Structure name declaration not an identifier when declaring a + super-structure. + +> term:cond-else-only-in-last + + The `else' clause in a cond must be the last such clause. + +> term:cond-clause-not-in-q/a-fmt + + The cond clause is not of the proper shape. + +> term:cond-=>-not-foll-by-1-rcvr + + The => clause of a cond must be followed by one expression, which + evaluates to a receiver function. + +> term:signature-out-of-context + + A name, bound to a signature, is used a context where it isn't + legal. + +> term:keyword-out-of-context + + A name, bound to a keyword, is used in a context where it isn't + legal. + +> term:empty-combination + + Use of the empty combination. Illegal at lower language levels. + +> term:app-first-term-not-var + + First term after parenthesis is a complex expression, not a variable + reference. Illegal at lower language levels. + +> term:app-first-term-lambda-bound + + First term after parenthesis is a lambda-bound identifier. Illegal + at lower language levels. + +> term:expected-an-identifier + + Attempt to use a syntactic non-identifier in a context that expected + one. + +> term:repeated-identifier + + Attempt to use the same identifier twice in a context that allows + only unique uses. + +> term:invalid-identifier + + Attempt to use a non-identifier in an identifier context. + +> term:arglist-after-init-value-spec + + Attempt to provide arguments without initial values following + arguments that have initial values in an argument list + specification. + +> term:arglist-after-catch-all-arg + + Attempt to provide arguments after a catch-all argument. + +> term:arglist-invalid-init-value + + Attempt to provide an initial value specification in an illegal + position. + +> term:arglist-invalid-init-var-decl + + Invalid initial value specification syntax. + +> term:arglist-last-arg-no-init + + Attempt to provide an initial value in the last position of an + argument list with a catch-all argument. + +> term:arglist-invalid-syntax + + Invalid argument list syntax. + +> term:proc-arity->=-1 + + Attempt to define a procedure with arity < 1. Illegal at lower + language levels. + +> term:unit-double-export + + Attempt to export the same name twice from a signed unit. + +> term:duplicate-signature + + Attempt to duplicately define a signature's name. + +> term:unbound-sig-name + + Attempt to refer to an signature name that hasn't been bound. + +> term:signature-no-sub-unit + + Attempt to refer to a sub-unit not contained in a signature. + +> term:signature-no-var + + Attempt to refer to a name not contained in a signature. + +> term:unit-link-unbound-tag + + Attempt to use an unbound tag in a unit linkage specification. + +> term:unit-link-duplicate-tag + + Attempt to define the same link name twice. + +> term:unit-link-self-import-tag + + Attempt to create a self-import in unit linkage. + +> term:unit-link-path-malformed + + Invalid linkage path syntax. + +> term:unit-duplicate-import + + Attempt to import the same name twice. + +> term:unit-duplicate-export + + Attempt to export the same name twice. + +> term:unit-import-exported + + Attempt to export a name that has been imported. + +> term:unit-defined-imported + + Attempt to define an imported name. + +> term:unit-redefined-import + + Attempt to re-define an imported name within a unit. + +> term:unit-export-not-defined + + Attempt to export a name that has not been defined from a unit. + +> term:unit-duplicate-definition + + Attempt to define the same name twice within a unit. + +> term:signature-not-matching + + Attempt to match non-matching signatures. + +> term:signature-struct-illegal-omit-name + + Attempt to omit an invalid name from a signature. + +> term:unit-export + + Invalid unit export syntax. + +> term:c-unit-linkage + + Invalid linkage clause syntax. + +> term:c-unit-export + + Invalid export clause syntax. + +> term:c-unit-not-import + + Use of a non-imported identifier in a compound-unit linkage. + +> term:c-unit-invalid-tag + + The use of a tag in a compound-unit linkage that is not + syntactically correct. + +> term:signature-invalid-struct-omit + + An invalid structure omission specification in a signature. + +> term:signature-malformed-omit-clause + + An invalid omission specification in a signature. + +> term:signature-malformed-open-clause + + An invalid open clause in a signature. + +> term:signature-malformed-unit-clause + + An invalid unit clause in a signature. + +> term:signature-ambiguous-: + + Use of : in signature ambiguous. + +> term:no-unit-exports + + Attempt to specify sub-signatures in a signed unit's export. + +> term:invalid-pos-symbol + + Invalid symbol expression syntax. + +> term:invalid-pos-literal + + Invalid literal expression syntax. + +> term:invalid-pos-list + + Invalid list expression syntax. + +> term:invalid-pos-ilist + + Invalid improper list expression syntax. + +> term:macro-error + + Any error during the evaluation of a macro application. + +> term:invalid-ivar-decl + + Invalid instance variable declaration syntax. + +> term:invalid-ivar-clause + + Invalid instance variable declaration syntax. + +> term:set!-no-mutate-lambda-bound + + Attempt to mutate a lambda-bound variable. Illegal at lower + language levels. + +> term:no-set!-inherited/renamed + + Attempt to mutate an inherited or renamed identifier in a class. + +> term:unit-unbound-id + + Unbound identifier in a unit. + +> term:def-not-at-top-level + + Attempted internal definition. Illegal at lower language levels. + +> term:invalid-intl-defn-posn + + Internal definition in an invalid position. + +> term:cannot-bind-kwd + + Attempt to re-define a keyword, in a unit or at the top-level. + +> term:no-set!-imported + + Attempt to mutate an imported identifier in a unit. + +Tags and Language Levels +======================== + +This documents the language level at which each tag can appear. + +kwd: Tags +--------- + +If these are inserted at some language level, they are automatically +present at all subsequent language levels. + +common: + + define-macro + let-macro + +beginner: + + case-lambda + lambda + if + quote + define + define-values + struct + define-struct + or + nor + and + nand + cond + require-library + require-relative-library + reference-file + polymorphic + mrspidey:control + : + type: + define-type + define-constructor + +intermediate: + + local + define-structure + let-struct + let + let* + time + let-values + let*-values + letrec-values + letrec + unquote + unquote-splicing + quasiquote + +advanced: + + begin + begin0 + set! + set!-values + delay + recur + rec + case + evcase + when + unless + let/cc + let/ec + do + fluid-let + parameterize + with-handlers + +scheme: + + with-continuation-mark + unit + compound-unit + invoke-unit + signature-struct + signature->symbols + define-signature + let-signature + unit-include + unit/sig + compound-unit + compound-unit/sig + invoke-unit/sig + unit->unit/sig + global-define-values + require-library-unit + require-unit + require-unit/sig + require-library-unit + require-library-unit/sig + require-relative-library-unit + require-relative-library-unit/sig + interface + class-private + class-inherit + class-rename + class-sequence + class + class* + class*/names + ivar + send + send* + make-generic + +term: Tags +--------- + +term tags are not automatically inherited by advanced levels, since +they sometimes designate an error corresponding to a restriction at a +certainl language level. Thus, the tags are explicitly listed for +each level at which they occur. Paradoxically, a tag can appear in a +more advanced level but not in a less advanced one. This is typically +because the advanced level has introduced or activated a feature not +allowed in a lower level (where an attempt to use it might merely +result in a syntax error), and its misuse is flagged by this tag. + +do not occur (fallbacks that are never fallen back to): + + invalid-pos-symbol + invalid-pos-literal + invalid-pos-list + invalid-pos-ilist + +beginner: + + internal-def-not-foll-by-expr + duplicate-interal-def + case/lambda-only-in-def + define-internal-invalid-posn + define-illegal-implicit-begin + if-must-have-else + quote-not-on-symbol + cond-else-only-in-last + cond-clause-not-in-q/a-fmt + cond-=>-not-foll-by-1-rcvr + keyword-out-of-context + empty-combination + app-first-term-not-var + app-first-term-lambda-bound + expected-an-identifier + repeated-identifier + invalid-identifier + proc-arity->=-1 + set!-no-mutate-lambda-bound + def-not-at-top-level + cannot-bind-kwd + macro-error + +intermediate: + + internal-def-not-foll-by-expr + duplicate-interal-def + define-internal-invalid-posn + define-illegal-implicit-begin + if-must-have-else + cond-else-only-in-last + cond-clause-not-in-q/a-fmt + cond-=>-not-foll-by-1-rcvr + keyword-out-of-context + empty-combination + app-first-term-not-var + app-first-term-lambda-bound + expected-an-identifier + repeated-identifier + invalid-identifier + proc-arity->=-1 + set!-no-mutate-lambda-bound + def-not-at-top-level + cannot-bind-kwd + macro-error + +advanced: + + internal-def-not-foll-by-expr + duplicate-interal-def + define-internal-invalid-posn + struct-not-id + super-struct-invalid + super-struct-not-id + cond-else-only-in-last + cond-clause-not-in-q/a-fmt + cond-=>-not-foll-by-1-rcvr + keyword-out-of-context + empty-combination + expected-an-identifier + repeated-identifier + invalid-identifier + def-not-at-top-level + cannot-bind-kwd + macro-error + +scheme: + + internal-def-not-foll-by-expr + duplicate-interal-def + define-internal-invalid-posn + struct-not-id + super-struct-invalid + super-struct-not-id + cond-else-only-in-last + cond-=>-not-foll-by-1-rcvr + keyword-out-of-context + expected-an-identifier + repeated-identifier + invalid-identifier + signature-out-of-context + unit-double-export + duplicate-signature + unbound-sig-name + signature-no-sub-unit + signature-no-var + unit-link-unbound-tag + unit-link-duplicate-tag + unit-link-self-import-tag + unit-link-path-malformed + unit-duplicate-import + unit-duplicate-export + unit-import-exported + unit-defined-imported + unit-redefined-import + unit-export-not-defined + unit-duplicate-definition + signature-not-matching + signature-struct-illegal-omit-name + unit-export + c-unit-linkage + c-unit-export + c-unit-not-import + c-unit-invalid-tag + signature-invalid-struct-omit + signature-malformed-omit-clause + signature-malformed-open-clause + signature-malformed-unit-clause + signature-ambiguous-: + no-unit-exports + no-set!-inherited/renamed + no-set!-imported + unit-unbound-id + arglist-after-init-value-spec + arglist-after-catch-all-arg + arglist-invalid-init-value + arglist-invalid-init-var-decl + arglist-last-arg-no-init + arglist-invalid-syntax + invalid-ivar-decl + invalid-ivar-clause + invalid-intl-defn-posn + cannot-bind-kwd + macro-error diff --git a/collects/zodiac/invoke.ss b/collects/zodiac/invoke.ss @@ -1,4 +1,4 @@ -; $Id: invoke.ss,v 1.40 1999/05/27 15:48:55 mflatt Exp $ +; $Id: invoke.ss,v 1.41 1999/06/01 16:55:18 mflatt Exp $ (begin-elaboration-time (require-library "cores.ss")) @@ -63,13 +63,27 @@ e)))]) (read-eval-print-loop)))) -(define zodiac:see (zodiac:make-see - (lambda (in) - (zodiac:scheme-expand-program (list in))))) +(define zodiac:see + (zodiac:make-see + (lambda (in) + (zodiac:scheme-expand-program (list in))))) -(define zodiac:see-parsed (zodiac:make-see - (lambda (in) - (zodiac:scheme-expand-program (list in))))) +(define zodiac:see-parsed + (lambda () + ((zodiac:make-see + (lambda (in) + (zodiac:scheme-expand-program (list in)))) + #f))) + +(define zodiac:see + (opt-lambda ((print-as-sexp? #t) (vocab zodiac:scheme-vocabulary)) + ((zodiac:make-see + (lambda (in) + (zodiac:scheme-expand-program + (list in) + (zodiac:make-attributes) + vocab))) + print-as-sexp?))) (define zodiac:spidey-see (zodiac:make-see (lambda (in) diff --git a/collects/zodiac/link.ss b/collects/zodiac/link.ss @@ -1,80 +1,30 @@ -; $Id: link.ss,v 1.16 1999/02/02 19:33:14 mflatt Exp $ +; $Id: link.ss,v 1.17 2000/01/02 23:28:25 robby Exp $ -(compound-unit/sig +(compound-unit/sig (import (INTERFACE : zodiac:interface^) (PRETTY : mzlib:pretty-print^) (MZLIB-FILE : mzlib:file^)) (link - [MISC : zodiac:misc^ - ((require-relative-library-unit/sig "misc.ss") PRETTY)] - [TOP-STRUCTS : zodiac:structures^ - ((require-relative-library-unit/sig "basestr.ss"))] - [SCAN-STRUCTS : zodiac:scanner-structs^ - ((require-relative-library-unit/sig "scanstr.ss") - TOP-STRUCTS)] - [READ-STRUCTS : zodiac:reader-structs^ - ((require-relative-library-unit/sig "readstr.ss") - TOP-STRUCTS)] - [SCAN-PARMS : zodiac:scanner-parameters^ - ((require-relative-library-unit/sig "scanparm.ss") - TOP-STRUCTS)] - [SCAN-CODE : zodiac:scanner-code^ - ((require-relative-library-unit/sig "scanner.ss") - TOP-STRUCTS SCAN-STRUCTS READ-STRUCTS - SCAN-PARMS INTERFACE)] - [READ-CODE : zodiac:reader-code^ - ((require-relative-library-unit/sig "reader.ss") - TOP-STRUCTS SCAN-STRUCTS READ-STRUCTS - SCAN-PARMS INTERFACE SCAN-CODE)] - [SEXP : zodiac:sexp^ - ((require-relative-library-unit/sig "sexp.ss") - MISC TOP-STRUCTS READ-STRUCTS INTERFACE - SCHEME-MAIN)] - [PATTERN : zodiac:pattern^ - ((require-relative-library-unit/sig "pattern.ss") - MISC SEXP READ-STRUCTS SCHEME-CORE)] - [EXPANDER : zodiac:expander^ - ((require-relative-library-unit/sig "x.ss") - MISC SEXP TOP-STRUCTS READ-STRUCTS - SCHEME-CORE INTERFACE)] - [CORRELATE : zodiac:correlate^ - ((require-relative-library-unit/sig "corelate.ss") - TOP-STRUCTS)] - [BACK-PROTOCOL : zodiac:back-protocol^ - ((require-relative-library-unit/sig "back.ss") - MISC INTERFACE)] - [SCHEME-CORE : zodiac:scheme-core^ - ((require-relative-library-unit/sig "scm-core.ss") - TOP-STRUCTS MISC SEXP READ-STRUCTS - BACK-PROTOCOL EXPANDER INTERFACE PATTERN)] - [SCHEME-MAIN : zodiac:scheme-main^ - ((require-relative-library-unit/sig "scm-main.ss") - MISC TOP-STRUCTS SCAN-PARMS - READ-STRUCTS READ-CODE SEXP - PATTERN SCHEME-CORE BACK-PROTOCOL EXPANDER INTERFACE)] - [SCHEME-SPIDEY : zodiac:scheme-mrspidey^ - ((require-relative-library-unit/sig "scm-spdy.ss") - MISC TOP-STRUCTS SCAN-PARMS READ-STRUCTS READ-CODE SEXP PATTERN - SCHEME-CORE SCHEME-MAIN BACK-PROTOCOL EXPANDER INTERFACE - MZLIB-FILE)] - [SCHEME-OBJ : zodiac:scheme-objects^ - ((require-relative-library-unit/sig "scm-obj.ss") - MISC TOP-STRUCTS READ-STRUCTS SEXP - PATTERN SCHEME-CORE SCHEME-MAIN BACK-PROTOCOL EXPANDER INTERFACE)] - [SCHEME-UNIT : zodiac:scheme-units^ - ((require-relative-library-unit/sig "scm-unit.ss") - MISC TOP-STRUCTS SCAN-PARMS READ-STRUCTS READ-CODE SEXP - PATTERN SCHEME-CORE SCHEME-MAIN SCHEME-OBJ BACK-PROTOCOL EXPANDER INTERFACE)] - [SCHEME-OBJ+UNIT : zodiac:scheme-objects+units^ - ((require-relative-library-unit/sig "scm-ou.ss") - MISC TOP-STRUCTS READ-STRUCTS SEXP PATTERN EXPANDER INTERFACE - SCHEME-CORE SCHEME-MAIN SCHEME-OBJ SCHEME-UNIT)]) - (export (open TOP-STRUCTS) (open SCAN-PARMS) - (open READ-STRUCTS) (open READ-CODE) - (open SEXP) (open PATTERN) (open CORRELATE) (open BACK-PROTOCOL) - (open EXPANDER) - (open SCHEME-CORE) (open SCHEME-MAIN) - (open SCHEME-OBJ) (open SCHEME-UNIT) - (open SCHEME-OBJ+UNIT) - (open SCHEME-SPIDEY))) + [NEW-INTERFACE : zodiac:interface^ + ((unit/sig zodiac:interface^ + (import (real : zodiac:interface^)) + (define static-error + (case-lambda + [(link-text link-tag source-term fmt-spec . args) + (apply real:static-error + source-term + (string-append link-text ": " fmt-spec) + args)] + [(where fmt-spec . args) + (real:internal-error where + "static-error interface has changed: called with ~s, ~s" + fmt-spec args)])) + (define internal-error real:internal-error)) + INTERFACE)] + [REAL-LINKER : zodiac:system^ + ((require-relative-library-unit/sig "link2.ss") + NEW-INTERFACE + PRETTY + MZLIB-FILE)]) + (export (open REAL-LINKER))) diff --git a/collects/zodiac/link2.ss b/collects/zodiac/link2.ss @@ -0,0 +1,80 @@ +; $Id: link.ss,v 1.17 2000/01/02 23:28:25 robby Exp $ + +(compound-unit/sig + (import + (INTERFACE : zodiac:interface^) + (PRETTY : mzlib:pretty-print^) + (MZLIB-FILE : mzlib:file^)) + (link + [MISC : zodiac:misc^ + ((require-relative-library-unit/sig "misc.ss") PRETTY)] + [TOP-STRUCTS : zodiac:structures^ + ((require-relative-library-unit/sig "basestr.ss"))] + [SCAN-STRUCTS : zodiac:scanner-structs^ + ((require-relative-library-unit/sig "scanstr.ss") + TOP-STRUCTS)] + [READ-STRUCTS : zodiac:reader-structs^ + ((require-relative-library-unit/sig "readstr.ss") + TOP-STRUCTS)] + [SCAN-PARMS : zodiac:scanner-parameters^ + ((require-relative-library-unit/sig "scanparm.ss") + TOP-STRUCTS)] + [SCAN-CODE : zodiac:scanner-code^ + ((require-relative-library-unit/sig "scanner.ss") + TOP-STRUCTS SCAN-STRUCTS READ-STRUCTS + SCAN-PARMS INTERFACE)] + [READ-CODE : zodiac:reader-code^ + ((require-relative-library-unit/sig "reader.ss") + TOP-STRUCTS SCAN-STRUCTS READ-STRUCTS + SCAN-PARMS INTERFACE SCAN-CODE)] + [SEXP : zodiac:sexp^ + ((require-relative-library-unit/sig "sexp.ss") + MISC TOP-STRUCTS READ-STRUCTS INTERFACE + SCHEME-MAIN)] + [PATTERN : zodiac:pattern^ + ((require-relative-library-unit/sig "pattern.ss") + MISC SEXP READ-STRUCTS SCHEME-CORE)] + [EXPANDER : zodiac:expander^ + ((require-relative-library-unit/sig "x.ss") + MISC SEXP TOP-STRUCTS READ-STRUCTS + SCHEME-CORE INTERFACE)] + [CORRELATE : zodiac:correlate^ + ((require-relative-library-unit/sig "corelate.ss") + TOP-STRUCTS)] + [BACK-PROTOCOL : zodiac:back-protocol^ + ((require-relative-library-unit/sig "back.ss") + MISC INTERFACE)] + [SCHEME-CORE : zodiac:scheme-core^ + ((require-relative-library-unit/sig "scm-core.ss") + TOP-STRUCTS MISC SEXP READ-STRUCTS + BACK-PROTOCOL EXPANDER INTERFACE PATTERN)] + [SCHEME-MAIN : zodiac:scheme-main^ + ((require-relative-library-unit/sig "scm-main.ss") + MISC TOP-STRUCTS SCAN-PARMS + READ-STRUCTS READ-CODE SEXP + PATTERN SCHEME-CORE BACK-PROTOCOL EXPANDER INTERFACE)] + [SCHEME-SPIDEY : zodiac:scheme-mrspidey^ + ((require-relative-library-unit/sig "scm-spdy.ss") + MISC TOP-STRUCTS SCAN-PARMS READ-STRUCTS READ-CODE SEXP PATTERN + SCHEME-CORE SCHEME-MAIN BACK-PROTOCOL EXPANDER INTERFACE + MZLIB-FILE)] + [SCHEME-OBJ : zodiac:scheme-objects^ + ((require-relative-library-unit/sig "scm-obj.ss") + MISC TOP-STRUCTS READ-STRUCTS SEXP + PATTERN SCHEME-CORE SCHEME-MAIN BACK-PROTOCOL EXPANDER INTERFACE)] + [SCHEME-UNIT : zodiac:scheme-units^ + ((require-relative-library-unit/sig "scm-unit.ss") + MISC TOP-STRUCTS SCAN-PARMS READ-STRUCTS READ-CODE SEXP + PATTERN SCHEME-CORE SCHEME-MAIN SCHEME-OBJ BACK-PROTOCOL EXPANDER INTERFACE)] + [SCHEME-OBJ+UNIT : zodiac:scheme-objects+units^ + ((require-relative-library-unit/sig "scm-ou.ss") + MISC TOP-STRUCTS READ-STRUCTS SEXP PATTERN EXPANDER INTERFACE + SCHEME-CORE SCHEME-MAIN SCHEME-OBJ SCHEME-UNIT)]) + (export (open TOP-STRUCTS) (open SCAN-PARMS) + (open READ-STRUCTS) (open READ-CODE) + (open SEXP) (open PATTERN) (open CORRELATE) (open BACK-PROTOCOL) + (open EXPANDER) + (open SCHEME-CORE) (open SCHEME-MAIN) + (open SCHEME-OBJ) (open SCHEME-UNIT) + (open SCHEME-OBJ+UNIT) + (open SCHEME-SPIDEY))) diff --git a/collects/zodiac/quasi.ss b/collects/zodiac/quasi.ss @@ -1,4 +1,4 @@ -; $Id: quasi.ss,v 1.9 1999/02/04 14:32:53 mflatt Exp $ +; $Id: quasi.ss,v 1.10 1999/06/13 21:41:25 mflatt Exp $ ; Fix the null? in qq-normalize. @@ -65,13 +65,15 @@ body (qq-list x (sub1 level)))))) ((pat:match-against qq-m&e-2 x env) - (static-error x - "unquote takes exactly one expression")) + (static-error + "unquote" 'kwd:unquote x + "takes exactly one expression")) ((pat:match-against qq-m&e-3 x env) (qq-list x (add1 level))) ((pat:match-against qq-m&e-4 x env) - (static-error x - "invalid context for unquote-splicing inside quasiquote")) + (static-error + "unquote-splicing" 'kwd:unquote-splicing x + "invalid context inside quasiquote")) ((pat:match-against qq-m&e-5 x env) => (lambda (p-env) @@ -93,8 +95,9 @@ '())) (qq-normalize q-rest rest)))))))) ((pat:match-against qq-m&e-6 x env) - (static-error x - "unquote-splicing takes exactly one expression")) + (static-error + "unquote-splicing" 'kwd:unquote-splicing x + "takes exactly one expression")) (else (qq-list x level)))) ((z:vector? x) @@ -114,7 +117,8 @@ template) expr env attributes vocab)))) (else - (static-error expr "Malformed quasiquote")))))) + (static-error + "quasiquote" 'kwd:quasiquote expr "malformed expression")))))) (add-primitivized-micro-form 'quasiquote intermediate-vocabulary quasiquote-micro) (add-primitivized-micro-form 'quasiquote scheme-vocabulary quasiquote-micro) diff --git a/collects/zodiac/reader.ss b/collects/zodiac/reader.ss @@ -1,6 +1,6 @@ ;; ;; zodiac:reader-code@ -;; $Id: reader.ss,v 1.6 1999/02/04 14:32:54 mflatt Exp $ +;; $Id: reader.ss,v 1.7 1999/03/12 17:22:30 mflatt Exp $ ;; ;; Zodiac Reader July 96 ;; mwk, plt group, Rice university. @@ -10,10 +10,6 @@ ;; scalar (symbol, number, string, boolean, char) ;; sequence (list, vector, improper-list) ;; eof -;; -;; In case of error, we invoke static-error (or internal-error) -;; with args: zodiac-obj fmt-string . args -;; (unit/sig zodiac:reader-code^ @@ -66,7 +62,13 @@ (lambda (how) (make-origin 'reader how))) - (define z:r-s-e (lambda x (apply report:static-error x))) + (define z:r-s-e + (lambda args + (apply report:static-error + "syntax error" + 'read:syntax-error + args))) + (define z:int-error (lambda x (apply report:internal-error x))) ;; pack-quote into zodiac structure. diff --git a/collects/zodiac/scanner.ss b/collects/zodiac/scanner.ss @@ -1,6 +1,6 @@ ;; ;; zodiac:scanner-code@ -;; $Id: scanner.ss,v 1.13 1999/10/26 18:47:02 shriram Exp $ +;; $Id: scanner.ss,v 1.14 2000/03/24 14:50:29 clements Exp $ ;; ;; Zodiac Scanner July 96. ;; mwk, plt group, Rice university. @@ -10,10 +10,6 @@ ;; scalar (symbol, number, string, boolean, char) ;; token (anything else) ;; eof -;; -;; In case of error, we invoke static-error (or internal-error) -;; with args: token (type 'error) message (string). -;; ;; ;; Imports: make- constructors and parameters. @@ -348,18 +344,21 @@ (case-lambda [(str) (report:static-error - (z:token error-tag z:void start-loc (prev-loc)) - str)] + "syntax error" 'scan:syntax-error + (z:token error-tag z:void start-loc (prev-loc)) + str)] [(str text) (report:static-error - (z:token error-tag z:void start-loc (prev-loc)) - (format str (text->string text)))])] + "syntax error" 'scan:syntax-error + (z:token error-tag z:void start-loc (prev-loc)) + (format str (text->string text)))])] [z:eof-error (lambda (str) (report:static-error - (z:token error-tag z:void start-loc (prev-loc)) - (format "unexpected end of file inside ~a" str)))] + "syntax error" 'scan:syntax-error + (z:token error-tag z:void start-loc (prev-loc)) + (format "unexpected end of file inside ~a" str)))] ;; ;; States in the scanner. diff --git a/collects/zodiac/scanparm.ss b/collects/zodiac/scanparm.ss @@ -1,6 +1,6 @@ ;; ;; zodiac:scanner-parameters@ -;; $Id: scanparm.ss,v 1.5 1997/12/03 19:20:21 robby Exp $ +;; $Id: scanparm.ss,v 1.7 2000/05/26 15:47:33 clements Exp $ ;; ;; Scanner/Reader Parameters. ;; @@ -51,8 +51,20 @@ (define scan:newline-list (list newline return)) (define scan:tab-list (list tab)) - (define scan:whitespace-list - (list space tab newline vtab page return)) + + (define scan:whitespace-list + (let loop ((n 0)) + (if (> n 255) '() + (if (char-whitespace? (integer->char n)) + (cons n (loop (+ n 1))) + (loop (+ n 1)))))) + + ;; Old definition: + ; (define scan:whitespace-list + ; (list space tab newline vtab page return)) + ;; removed because this list depends on platform (eg, + ;; char 202 is the non-breakable whitespace on the Mac); + ;; char-whitespace? helps us stay platform-independent (define scan:delim-list (append scan:whitespace-list diff --git a/collects/zodiac/scm-core.ss b/collects/zodiac/scm-core.ss @@ -1,4 +1,4 @@ -; $Id: scm-core.ss,v 1.57 2000/03/24 14:50:29 clements Exp $ +; $Id: scm-core.ss,v 1.59 2000/04/30 22:37:34 clements Exp $ (unit/sig zodiac:scheme-core^ (import zodiac:structures^ zodiac:misc^ zodiac:sexp^ @@ -170,17 +170,17 @@ (when sig-space (unless (get-attribute attributes 'delay-sig-name-check?) (when (hash-table-get sig-space (z:symbol-orig-name expr) (lambda () #f)) - (static-error - expr - "Invalid use of signature name ~s" (z:symbol-orig-name expr))))))) + (static-error + "signature" 'term:signature-out-of-context expr + "invalid use of signature name ~s" (z:symbol-orig-name expr))))))) (define ensure-not-macro/micro (lambda (expr env vocab attributes) (let ((r (resolve expr env vocab))) (if (or (macro-resolution? r) (micro-resolution? r)) - (static-error - expr - "Invalid use of keyword ~s" (z:symbol-orig-name expr)) + (static-error + "keyword" 'term:keyword-out-of-context expr + "invalid use of keyword ~s" (z:symbol-orig-name expr)) r)))) (define process-top-level-resolution @@ -216,32 +216,39 @@ (else (internal-error expr "Invalid resolution in core: ~s" r)))))) - (define (make-list-micro null-ok? lexvar-ok? expr-ok?) + (define (make-list-micro null-ok? lambda-bound-ok? expr-ok?) (lambda (expr env attributes vocab) (let ((contents (expose-list expr))) (if (null? contents) (if null-ok? (expand-expr (structurize-syntax `(quote ,expr) expr) env attributes vocab) - (static-error expr "Empty combination is a syntax error")) + (static-error + "illegal term" 'term:empty-combination expr + "empty combination is not valid syntax")) (as-nested attributes (lambda () (let ((bodies - (map - (lambda (e) - (expand-expr e env attributes vocab)) - contents))) - (when (or (and (not lexvar-ok?) - (not (top-level-varref? (car bodies)))) - (and (not expr-ok?) - (not (varref? (car bodies))))) - (static-error expr - "First term after parenthesis is illegal in an application")) - (create-app (car bodies) (cdr bodies) expr)))))))) + (map + (lambda (e) + (expand-expr e env attributes vocab)) + contents))) + (when (and (not lambda-bound-ok?) + (lambda-varref? (car bodies))) + (static-error + "illegal application" 'term:app-first-term-lambda-bound + expr + "first term in application is a function-bound identifier")) + (when (and (not expr-ok?) + (not (varref? (car bodies)))) + (static-error + "illegal application" 'term:app-first-term-not-var + expr + "first term in application must be a function name")) + (create-app (car bodies) (cdr bodies) expr)))))))) (add-list-micro beginner-vocabulary (make-list-micro #f #f #f)) - (add-list-micro intermediate-vocabulary (make-list-micro #f #t #f)) (add-list-micro advanced-vocabulary (make-list-micro #f #t #t)) (add-list-micro scheme-vocabulary (make-list-micro #t #t #t)) @@ -378,7 +385,9 @@ (define valid-syntactic-id? (lambda (id) (or (z:symbol? id) - (static-error id "~s is not an identifier" (sexp->raw id))))) + (static-error + "not an identifier" 'term:expected-an-identifier id + "~s" (sexp->raw id))))) (define valid-syntactic-id/s? (lambda (ids) @@ -388,8 +397,9 @@ (let ((first (car ids)) (rest (cdr ids))) (if (valid-syntactic-id? first) (cons (z:read-object first) (valid-syntactic-id/s? rest)) - (static-error first "~e is not an identifier" - (sexp->raw first))))) + (static-error + "not an identifier" 'term:expected-an-identifier first + "~e" (sexp->raw first))))) (else (internal-error ids "Illegal to check validity of id/s"))))) (define distinct-valid-syntactic-id/s? @@ -399,12 +409,15 @@ (or (null? ids) (if (symbol? (car ids)) (if (memq (car ids) (cdr ids)) - (static-error (list-ref input-ids index) - "Identifier ~s repeated" (car ids)) + (static-error + "identifier" 'term:repeated-identifier + (list-ref input-ids index) + "~s repeated" (car ids)) (loop (cdr ids) (add1 index))) (let ((erroneous (list-ref input-ids index))) - (static-error erroneous "~e is not an identifier" - (sexp->raw erroneous))))))))) + (static-error + "not an identifier" 'term:expected-an-identifier + erroneous "~e" (sexp->raw erroneous))))))))) (define syntactic-id/s->ids (lambda (ids) @@ -414,15 +427,17 @@ ((z:symbol? ids) (list ids)) ((pair? ids) ids) ((null? ids) ids) - (else (static-error ids "~e is not an identifier" - (sexp->raw ids)))))) + (else (static-error + "not an identifier" 'term:expected-an-identifier ids + "~e" (sexp->raw ids)))))) ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (define valid-id? (lambda (id) (or (binding? id) - (static-error id "Invalid identifier")))) + (static-error + "identifier" 'term:invalid-identifier id "invalid")))) (define valid-id/s? (lambda (ids) @@ -432,7 +447,8 @@ (let ((first (car ids)) (rest (cdr ids))) (if (valid-id? first) (cons (binding-orig-name first) (valid-id/s? rest)) - (static-error first "Invalid identifier")))) + (static-error + "identifier" 'term:invalid-identifier first "invalid")))) (else (internal-error ids "Illegal to check validity of id/s"))))) (define distinct-valid-id/s? @@ -442,9 +458,9 @@ (or (null? ids) (if (memq (car ids) (cdr ids)) (let ((v (list-ref input-ids index))) - (static-error v - "Repeated identifier ~e" - (car ids))) + (static-error + "identifier" 'term:repeated-identifier v + "~e repeated" (car ids))) (loop (cdr ids) (add1 index)))))))) (define id/s->ids @@ -455,8 +471,8 @@ ((z:symbol? ids) (list ids)) ((pair? ids) ids) ((null? ids) ids) - (else (static-error ids "Invalid identifier"))))) - + (else (static-error + "identifier" 'term:invalid-identifier ids "invalid"))))) ; ---------------------------------------------------------------------- @@ -475,10 +491,10 @@ (define optarglist-decl-entry-parser-vocab (create-vocabulary 'optarglist-decl-entry-parser-vocab #f - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry")) + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry")) (add-sym-micro optarglist-decl-entry-parser-vocab (lambda (expr env attributes vocab) @@ -486,13 +502,15 @@ (case (unbox status-holder) ((proper improper) (void)) ((proper/defaults) - (static-error expr - "Appears after initial value specifications")) + (static-error + "argument list" 'term:arglist-after-init-value-spec expr + "appears after initial value specifications")) ((improper/defaults) (set-box! status-holder 'improper/done)) ((improper/done) - (static-error expr - "Appears past catch-all argument")) + (static-error + "argument list" 'term:arglist-after-catch-all-arg expr + "appears past catch-all argument")) (else (internal-error (unbox status-holder) "Invalid in optarglist-decl-entry-parser-vocab sym")))) (make-optarglist-entry @@ -508,8 +526,9 @@ ((proper) (set-box! status-holder 'proper/defaults)) ((improper) (set-box! status-holder 'improper/defaults)) ((proper/defaults improper/defaults) (void)) - ((improper/done) (static-error expr - "Invalid default value specification")) + ((improper/done) (static-error + "argument list" 'term:arglist-invalid-init-value + expr "invalid default value specification")) (else (internal-error (unbox status-holder) "Invalid in optarglist-decl-entry-parser-vocab list")))) (cond @@ -523,14 +542,16 @@ (create-lexical-binding+marks var) val)))) (else - (static-error expr "Invalid init-var declaration")))))) + (static-error + "argument list" 'term:arglist-invalid-init-var-decl + expr "invalid init-var declaration")))))) (define optarglist-decls-vocab (create-vocabulary 'optarglist-decls-vocab #f - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry")) + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry")) (add-sym-micro optarglist-decls-vocab (lambda (expr env attributes vocab) @@ -563,8 +584,10 @@ (let loop ((result result) (exprs expr-list)) (if (null? (cdr result)) (when (initialized-optarglist-entry? (car result)) - (static-error (car exprs) - "Last argument must not have an initial value")) + (static-error + "argument list" 'term:arglist-last-arg-no-init + (car exprs) + "last argument must not have an initial value")) (loop (cdr result) (cdr exprs)))) (make-ilist-optarglist result))))) @@ -635,10 +658,10 @@ (define paroptarglist-decl-entry-parser-vocab (create-vocabulary 'paroptarglist-decl-entry-parser-vocab #f - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry")) + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry")) (add-sym-micro paroptarglist-decl-entry-parser-vocab (lambda (expr env attributes vocab) @@ -646,13 +669,15 @@ (case (unbox status-holder) ((proper improper) (void)) ((proper/defaults) - (static-error expr - "Appears after initial value specifications")) + (static-error + "argument list" 'term:arglist-after-init-value-spec expr + "appears after initial value specifications")) ((improper/defaults) (set-box! status-holder 'improper/done)) ((improper/done) - (static-error expr - "Appears past catch-all argument")) + (static-error + "argument list" 'term:arglist-after-catch-all-arg expr + "appears past catch-all argument")) (else (internal-error (unbox status-holder) "Invalid in paroptarglist-decl-entry-parser-vocab sym")))) (make-paroptarglist-entry @@ -668,8 +693,10 @@ ((proper) (set-box! status-holder 'proper/defaults)) ((improper) (set-box! status-holder 'improper/defaults)) ((proper/defaults improper/defaults) (void)) - ((improper/done) (static-error expr - "Invalid default value specification")) + ((improper/done) (static-error + "argument list" 'term:arglist-invalid-init-value + expr + "invalid default value specification")) (else (internal-error (unbox status-holder) "Invalid in paroptarglist-decl-entry-parser-vocab list")))) (cond @@ -683,14 +710,16 @@ (create-lexical-binding+marks var) val)))) (else - (static-error expr "Invalid init-var declaration")))))) + (static-error + "argument list" 'term:arglist-invalid-init-var-decl + expr "invalid init-var declaration")))))) (define paroptarglist-decls-vocab (create-vocabulary 'paroptarglist-decls-vocab #f - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry")) + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry")) (add-sym-micro paroptarglist-decls-vocab (lambda (expr env attributes vocab) @@ -723,8 +752,10 @@ (let loop ((result result) (exprs expr-list)) (if (null? (cdr result)) (when (initialized-paroptarglist-entry? (car result)) - (static-error (car exprs) - "Last argument must not have an initial value")) + (static-error + "argument list" 'term:arglist-last-arg-no-init + (car exprs) + "last argument must not have an initial value")) (loop (cdr result) (cdr exprs)))) (make-ilist-paroptarglist result))))) @@ -794,10 +825,10 @@ (define (make-arglist-decls-vocab) (create-vocabulary 'arglist-decls-vocab #f - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry" - "Invalid argument list entry")) + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry" + "malformed argument list entry")) ; note: the only difference between the lambda-<> vocabs and the <> vocabs ; is that the lambda-<> vocabs use create-lambda-binding+marks instead @@ -821,7 +852,9 @@ (binding-constructor expr))))) (let ([m (lambda (expr env attributes vocab) - (static-error expr "Invalid argument list syntax"))]) + (static-error + "argument list" 'term:arglist-invalid-syntax expr + "invalid syntax"))]) (add-sym-micro proper-vocab m) (add-sym-micro nonempty-vocab m)) @@ -831,7 +864,9 @@ (let ((contents (expose-list expr))) (when (and (not null-ok?) (null? contents)) - (static-error expr "All procedures must take at least one argument")) + (static-error + "application" 'term:proc-arity->=-1 expr + "all procedures must take at least one argument")) (make-list-arglist (map binding-constructor contents)))))]) (add-list-micro nonempty-vocab (make-arg-list-micro #f)) @@ -839,7 +874,9 @@ (add-list-micro full-vocab (make-arg-list-micro #t))) (let ([m (lambda (expr env attributes vocab) - (static-error expr "Invalid argument list syntax"))]) + (static-error + "argument list" 'term:arglist-invalid-syntax expr + "invalid syntax"))]) (add-ilist-micro proper-vocab m) (add-ilist-micro nonempty-vocab m)) diff --git a/collects/zodiac/scm-hanc.ss b/collects/zodiac/scm-hanc.ss @@ -1,4 +1,4 @@ -; $Id: scm-hanc.ss,v 1.63 1999/05/21 12:53:26 mflatt Exp $ +; $Id: scm-hanc.ss,v 1.64 1999/05/23 17:31:24 mflatt Exp $ (define-struct signature-element (source)) (define-struct (name-element struct:signature-element) (name)) @@ -29,17 +29,16 @@ (signs (map car sign:rest))) (unless (null? in) (if (memq (car signs) (cdr signs)) - (static-error (car in) - "Name \"~s\" is exported twice" - (car signs)) + (static-error + "unit" 'term:unit-double-export (car in) + "name \"~s\" is exported twice" (car signs)) (loop (cdr in) (cdr signs))))) (let loop ((in in:names) (signs sign:names)) (unless (null? in) (if (memq (car signs) (cdr signs)) - (static-error (car in) - "Name \"~s\" is exported twice" - (car signs)) + (static-error 'term:unit-double-export (car in) + "name \"~s\" is exported twice" (car signs)) (loop (cdr in) (cdr signs)))))) (let ((in (car in:all)) (sign (car sign:all))) (if (or (symbol? sign) (z:symbol? sign)) @@ -72,8 +71,10 @@ (else (internal-error first "Invalid unit element"))))) (when (memq first-name seen) - (static-error (signature-element-source first) - "Duplicate signature entry: ~s" first-name)) + (static-error + "signature" 'term:duplicate-signature + (signature-element-source first) + "duplicate entry: ~s" first-name)) (loop (cons first-name seen) (cdr rest)))))) (letrec ((split @@ -190,11 +191,13 @@ (let ((entry (hash-table-get sig-space (z:read-object name) (lambda () - (static-error name "Unbound signature name: ~s" - (z:read-object name)))))) + (static-error + "signature" 'term:unbound-sig-name name + "unbound name: ~s" (z:read-object name)))))) entry) - (static-error name "Unbound signature name: ~s" - (z:read-object name)))))) + (static-error + "signature" 'term:unbound-sig-name name + "unbound name: ~s" (z:read-object name)))))) (define extract-sub-unit-signature (lambda (signature indices) @@ -204,7 +207,9 @@ (raw-first (z:read-object first))) (let loop ((elements (signature-elements signature))) (if (null? elements) - (static-error first "No such sub-unit in signature") + (static-error + "signature" 'term:signature-no-sub-unit first + "no such sub-unit") (if (unit-element? (car elements)) (if (eq? raw-first (unit-element-id (car elements))) (extract-sub-unit-signature @@ -249,7 +254,9 @@ (lambda (table tag) (cu/s-tag-table-lookup table tag (lambda () - (static-error tag "Unbound tag"))))) + (static-error + "unit linkage" 'term:unit-link-unbound-tag tag + "unbound tag"))))) (define cu/s-tag-table-lookup/internal-error (lambda (table tag) @@ -261,10 +268,10 @@ (define sig-vocab (create-vocabulary 'sig-vocab #f - "Invalid signature expression" - "Invalid signature expression" - "Invalid signature expression" - "Invalid signature expression")) + "malformed signature expression" + "malformed signature expression" + "malformed signature expression" + "malformed signature expression")) (add-sym-micro sig-vocab (lambda (expr env attributes vocab) @@ -283,10 +290,10 @@ (define sig-element-vocab (create-vocabulary 'sig-element-vocab #f - "Invalid signature element" - "Invalid signature element" - "Invalid signature element" - "Invalid signature element")) + "malformed signature element" + "malformed signature element" + "malformed signature element" + "malformed signature element")) (add-sym-micro sig-element-vocab (lambda (expr env attributes vocab) @@ -321,8 +328,11 @@ (let ((first (car omits))) (when (z:symbol? first) (unless (memq (z:read-object first) generated-names) - (static-error first - "Name not generated; illegal to omit"))) + (static-error + "structs in signature" + 'term:signature-struct-illegal-omit-name + first + "name not generated; illegal to omit"))) (loop (cdr omits))))) (let ((real-omits (let loop ((omits omit-names)) @@ -338,20 +348,24 @@ (cons (make-name-element expr (car names)) (loop (cdr names)))))))))))) (else - (static-error expr "Malformed struct clause")))))) + (static-error + "struct" 'kwd:signature-struct expr + "malformed clause")))))) (define signature-struct-omission-checker-vocab (create-vocabulary 'signature-struct-omission-checker-vocab #f - "Invalid signature structure omission declaration" - "Invalid signature structure omission declaration" - "Invalid signature structure omission declaration" - "Invalid signature structure omission declaration")) + "malformed signature structure omission declaration" + "malformed signature structure omission declaration" + "malformed signature structure omission declaration" + "malformed signature structure omission declaration")) (add-sym-micro signature-struct-omission-checker-vocab (lambda (expr env attributes vocab) (let ((raw-expr (z:read-object expr))) (unless (memq raw-expr '(-selectors -setters)) - (static-error expr "Invalid omission specifier")) + (static-error + "structs in signature" 'term:signature-invalid-struct-omit + expr "invalid omission specifier")) raw-expr))) (add-micro-form '- signature-struct-omission-checker-vocab @@ -367,7 +381,9 @@ (valid-syntactic-id? var) (structurize-syntax (z:read-object var) expr)))) (else - (static-error expr "Malformed omission specifier")))))) + (static-error + "structs in signature" 'term:signature-malformed-omit-clause + expr "malformed omission specifier")))))) (add-micro-form 'open sig-element-vocab (let* ((kwd '(open)) @@ -383,7 +399,9 @@ (signature-elements (expand-expr sig env attributes sig-vocab))))) (else - (static-error expr "Malformed open clause")))))) + (static-error + "structs in signature" 'term:signature-malformed-open-clause + expr "malformed open clause")))))) (add-micro-form 'unit sig-element-vocab (let* ((kwd '(unit :)) @@ -400,16 +418,18 @@ (list (make-unit-element expr (z:read-object id) (expand-expr sig env attributes sig-vocab)))))) (else - (static-error expr "Malformed unit clause")))))) + (static-error + "structs in signature" 'term:signature-malformed-unit-clause + expr "Malformed unit clause")))))) ; -------------------------------------------------------------------- (define u/s-prim-imports-vocab (create-vocabulary 'u/s-prim-imports-vocab #f - "Invalid imports declaration" - "Invalid imports declaration" - "Invalid imports declaration" - "Invalid imports declaration")) + "malformed imports declaration" + "malformed imports declaration" + "malformed imports declaration" + "malformed imports declaration")) (add-sym-micro u/s-prim-imports-vocab (lambda (expr env attributes vocab) @@ -436,7 +456,9 @@ (expand-expr sig env attributes sig-vocab)) (z:read-object id))))) ((pat:match-against m&e-2 expr env) - (static-error expr "Ambiguous : in signature")) + (static-error + "signature" 'term:signature-ambiguous-: + expr "ambiguous : in signature")) (else (convert-to-prim-format (signature-elements @@ -483,10 +505,10 @@ (define u/s-sign-imports-vocab (create-vocabulary 'u/s-sign-imports-vocab #f - "Invalid signature imports declaration" - "Invalid signature imports declaration" - "Invalid signature imports declaration" - "Invalid signature imports declaration")) + "malformed signature imports declaration" + "malformed signature imports declaration" + "malformed signature imports declaration" + "malformed signature imports declaration")) (add-sym-micro u/s-sign-imports-vocab (lambda (expr env attributes vocab) @@ -512,7 +534,9 @@ (signature-exploded (expand-expr sig env attributes sig-vocab)))))) ((pat:match-against m&e-2 expr env) - (static-error expr "Ambiguous : in signature")) + (static-error + "signature" 'term:signature-ambiguous-: + expr "ambiguous : in signature")) (else (cons immediate-signature-name (explode-signature-elements @@ -537,7 +561,9 @@ '() (let ((first (car sig-names))) (when (unit-element? first) - (static-error source "Unit exports not allowed")) + (static-error + "unit" 'term:no-unit-exports source + "unit exports not allowed")) (let ((name (name-element-name first))) (cons (let ((entry (hash-table-get table name (lambda () #f)))) @@ -550,10 +576,10 @@ (define u/s-sign-exports-vocab (create-vocabulary 'u/s-sign-exports-vocab #f - "Invalid signature exports declaration" - "Invalid signature exports declaration" - "Invalid signature exports declaration" - "Invalid signature exports declaration")) + "malformed signature exports declaration" + "malformed signature exports declaration" + "malformed signature exports declaration" + "malformed signature exports declaration")) (add-sym-micro u/s-sign-exports-vocab (lambda (expr env attributes vocab) @@ -577,7 +603,9 @@ (signature-exploded (expand-expr sig env attributes sig-vocab))))) ((pat:match-against m&e-2 expr env) - (static-error expr "Ambiguous : in signature")) + (static-error + "signature" 'term:signature-ambiguous-: expr + "ambiguous : in signature")) (else (explode-signature-elements (signature-elements @@ -604,7 +632,9 @@ (structurize-syntax `(,'quote ,elements) expr '(-1)) env attributes vocab))))) (else - (static-error expr "Malformed signature->symbols")))))) + (static-error + "signature->symbols" 'kwd:signature->symbols + expr "malformed expression")))))) (add-primitivized-micro-form 'signature->symbols full-vocabulary signature->symbols-micro) (add-on-demand-form 'micro 'signature->symbols common-vocabulary signature->symbols-micro) @@ -622,7 +652,9 @@ (sig (pat:pexpand 'sig p-env kwd))) (valid-syntactic-id? name) (unless (get-top-level-status attributes) - (static-error expr "Only supported at top-level")) + (static-error + "define-signature" 'kwd:define-signature + expr "only supported at top-level")) (let ((elements (signature-elements (expand-expr sig env attributes sig-vocab)))) @@ -632,7 +664,9 @@ #f (z:make-origin 'micro expr)) env attributes vocab)))) (else - (static-error expr "Malformed define-signature")))))) + (static-error + "define-signature" 'kwd:define-signature + expr "malformed definition")))))) (add-primitivized-micro-form 'define-signature full-vocabulary define-signature-micro) (add-primitivized-micro-form 'define-signature scheme-vocabulary define-signature-micro) @@ -678,7 +712,9 @@ (lambda () (pop-signature name attributes old-value))))))) (else - (static-error expr "Malformed let-signature")))))) + (static-error + "let-signature" 'kwd:let-signature + expr "malformed expression")))))) (add-primitivized-micro-form 'let-signature full-vocabulary let-signature-micro) (add-primitivized-micro-form 'let-signature scheme-vocabulary let-signature-micro) @@ -697,17 +733,22 @@ (lambda (p-env) (let ((filename (pat:pexpand 'filename p-env kwd))) (unless (z:string? filename) - (static-error filename "File name must be a string")) + (static-error + "include" 'kwd:unit-include + filename "file name must be a string")) (let ((raw-filename (z:read-object filename))) (let-values (((base name dir?) (split-path raw-filename))) (when dir? - (static-error filename "Cannot include a directory")) + (static-error + "include" 'kwd:unit-include + filename "cannot include a directory")) (let* ((original-directory (current-load-relative-directory)) (p (with-handlers ((exn:i/o:filesystem? (lambda (exn) - (static-error filename - "Unable to open file ~s: ~a" raw-filename exn)))) + (static-error + "include" 'kwd:unit-include filename + "unable to open file ~s: ~a" raw-filename exn)))) (open-input-file (if (and original-directory (not (complete-path? raw-filename))) @@ -754,7 +795,9 @@ (lambda () (close-input-port p)))))))))) (else - (static-error expr "Malformed include")))))) + (static-error + "include" 'kwd:unit-include + expr "malformed expression")))))) (define unit/sig-micro (let* ((kwd-1 '(import rename)) @@ -834,7 +877,9 @@ (z:make-origin 'micro expr)) env attributes vocab))) (else - (static-error expr "Malformed unit/sig")))))) + (static-error + "unit/sig" 'kwd:unit/sig + expr "malformed expression")))))) (add-primitivized-micro-form 'unit/sig full-vocabulary unit/sig-micro) @@ -844,10 +889,10 @@ (define cu/s-imports-record-tag-sigs-vocab (create-vocabulary 'cu/s-imports-record-tag-sigs-vocab #f - "Invalid import clause" - "Invalid import clause" - "Invalid import clause" - "Invalid import clause")) + "malformed import clause" + "malformed import clause" + "malformed import clause" + "malformed import clause")) (add-list-micro cu/s-imports-record-tag-sigs-vocab (let* ((kwd '(:)) @@ -863,18 +908,21 @@ (valid-syntactic-id? tag) (let ((table (extract-cu/s-tag-table attributes))) (when (cu/s-tag-table-lookup table tag) - (static-error tag - "Duplicate tag definition")) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig tag + "duplicate link tag definition")) (cu/s-tag-table-put/import table tag sig env attributes))))) (else - (static-error expr "Malformed compound-unit/sig import clause")))))) + (static-error + "compound unit/sig" 'kwd:compound-unit/sig expr + "malformed import clause")))))) (define cu/s-sign-imports-vocab (create-vocabulary 'cu/s-sign-imports-vocab #f - "Invalid import clause" - "Invalid import clause" - "Invalid import clause" - "Invalid import clause")) + "malformed import clause" + "malformed import clause" + "malformed import clause" + "malformed import clause")) (add-list-micro cu/s-sign-imports-vocab (let* ((kwd '(:)) @@ -892,14 +940,16 @@ (tag-table-entry-signature (cu/s-tag-table-lookup/internal-error table tag)))))))) (else - (static-error expr "Malformed compound-unit/sig import clause")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig expr + "malformed import clause")))))) (define cu/s-link-imports-vocab (create-vocabulary 'cu/s-link-imports-vocab #f - "Invalid link imports declaration" - "Invalid link imports declaration" - "Invalid link imports declaration" - "Invalid link imports declaration")) + "malformed link imports declaration" + "malformed link imports declaration" + "malformed link imports declaration" + "malformed link imports declaration")) (add-list-micro cu/s-link-imports-vocab (let* ((kwd '(:)) @@ -918,16 +968,18 @@ (cu/s-tag-table-lookup/internal-error table tag))) (z:read-object tag)))))) (else - (static-error expr "Malformed compound-unit/sig import clause")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig expr + "malformed import clause")))))) ; -------------------------------------------------------------------- (define cu/s-link-record-tag-sigs-vocab (create-vocabulary 'cu/s-link-record-tag-sigs-vocab #f - "Invalid link clause" - "Invalid link clause" - "Invalid link clause" - "Invalid link clause")) + "malformed link clause" + "malformed link clause" + "malformed link clause" + "malformed link clause")) (add-list-micro cu/s-link-record-tag-sigs-vocab (let* ((kwd '(:)) @@ -943,18 +995,22 @@ (valid-syntactic-id? tag) (let ((table (extract-cu/s-tag-table attributes))) (when (cu/s-tag-table-lookup table tag) - (static-error tag - "Duplicate tag definition")) + (static-error + "unit linkage" 'term:unit-link-duplicate-tag + tag + "duplicate link tag name")) (cu/s-tag-table-put/link table tag sig env attributes))))) (else - (static-error expr "Malformed compound-unit/sig link clause")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed link clause")))))) (define cu/s-link-exports-vocab (create-vocabulary 'cu/s-link-exports-vocab #f - "Invalid link export declaration" - "Invalid link export declaration" - "Invalid link export declaration" - "Invalid link export declaration")) + "malformed link export declaration" + "malformed link export declaration" + "malformed link export declaration" + "malformed link export declaration")) (add-list-micro cu/s-link-exports-vocab (let* ((kwd '(:)) @@ -971,14 +1027,16 @@ (tag-table-entry-signature (cu/s-tag-table-lookup/internal-error table tag))))))) (else - (static-error expr "Malformed compound-unit/sig link clause")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed link clause")))))) (define cu/s-link-tags-vocab (create-vocabulary 'cu/s-link-tags-vocab #f - "Invalid link tag declaration" - "Invalid link tag declaration" - "Invalid link tag declaration" - "Invalid link tag declaration")) + "malformed link tag declaration" + "malformed link tag declaration" + "malformed link tag declaration" + "malformed link tag declaration")) (add-list-micro cu/s-link-tags-vocab (let* ((kwd '(:)) @@ -992,14 +1050,16 @@ (let ((tag (pat:pexpand 'tag p-env kwd))) tag))) (else - (static-error expr "Malformed compound-unit/sig link clause")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed link clause")))))) (define cu/s-link-exprs-vocab (create-vocabulary 'cu/s-link-exprs-vocab #f - "Invalid link expression" - "Invalid link expression" - "Invalid link expression" - "Invalid link expression")) + "malformed link expression" + "malformed link expression" + "malformed link expression" + "malformed link expression")) (add-list-micro cu/s-link-exprs-vocab (let* ((kwd '(:)) @@ -1013,14 +1073,16 @@ (let ((expr (pat:pexpand 'expr p-env kwd))) expr))) (else - (static-error expr "Malformed compound-unit/sig link clause")))))) + (static-error + "compound-unit/sig" 'kwd:compount-unit/sig + expr "malformed link clause")))))) (define cu/s-link-linking-sigs-vocab (create-vocabulary 'cu/s-link-linking-sigs-vocab #f - "Invalid link clause" - "Invalid link clause" - "Invalid link clause" - "Invalid link clause")) + "malformed link clause" + "malformed link clause" + "malformed link clause" + "malformed link clause")) (add-list-micro cu/s-link-linking-sigs-vocab (let* ((kwd '(:)) @@ -1040,7 +1102,9 @@ cu/s-unit-path-linkage-vocab)) path-elts)))) (else - (static-error expr "Malformed compound-unit/sig link clause")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed link clause")))))) (define cu/s-check-self-import (lambda (tag attributes) @@ -1048,14 +1112,16 @@ (when (eq? (z:read-object tag) (get-attribute attributes cu/s-this-link-attr (lambda () (internal-error tag "No this-link attribute")))) - (static-error tag "Self import of tag ~s" (z:read-object tag)))))) + (static-error + "unit linkage" 'term:unit-link-self-import-tag tag + "self import of tag ~s" (z:read-object tag)))))) (define cu/s-link-prim-unit-names-vocab (create-vocabulary 'cu/s-link-prim-unit-names-vocab #f - "Invalid link clause" - "Invalid link clause" - "Invalid link clause" - "Invalid link clause")) + "malformed link clause" + "malformed link clause" + "malformed link clause" + "malformed link clause")) (add-list-micro cu/s-link-prim-unit-names-vocab (let* ((kwd '(:)) @@ -1074,7 +1140,9 @@ cu/s-unit-path-prim-links-vocab)) path-elts))))) (else - (static-error expr "Malformed compound-unit/sig link clause")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed link clause")))))) ; -------------------------------------------------------------------- @@ -1119,8 +1187,9 @@ (with-handlers ((exn:unit? (lambda (exn) - (static-error expr - (exn-message exn))))) + (static-error + "signature matching" 'term:signature-not-matching + expr (exn-message exn))))) (verify-signature-match 'compound-unit/sig #f (format "signature ~s" (signature-name small-sig)) @@ -1143,8 +1212,9 @@ (with-handlers ((exn:unit? (lambda (exn) - (static-error expr - (exn-message exn))))) + (static-error + "signature matching" 'term:signature-not-matching + expr (exn-message exn))))) (verify-signature-match 'compound-unit/sig #f (format "signature ~s" (signature-name small-sig)) @@ -1167,14 +1237,16 @@ (extract-sub-unit-signature initial-sig ids))) final-sig))))) (else - (static-error expr "Malformed unit path element")))))) + (static-error + "unit linkage" 'kwd:unit-link-path-malformed + expr "malformed unit path element")))))) (define cu/s-unit-path-linkage-vocab (create-vocabulary 'cu/s-unit-path-linkage-vocab #f - "Invalid linkage" - "Invalid linkage" - "Invalid linkage" - "Invalid linkage")) + "malformed linkage" + "malformed linkage" + "malformed linkage" + "malformed linkage")) (add-sym-micro cu/s-unit-path-linkage-vocab (lambda (expr env attributes vocab) @@ -1217,8 +1289,9 @@ (with-handlers ((exn:unit? (lambda (exn) - (static-error expr - (exn-message exn))))) + (static-error + "signature matching" 'term:signature-not-matching + expr (exn-message exn))))) (verify-signature-match 'compound-unit/sig #f (format "signature ~s" (signature-name small-sig)) @@ -1243,8 +1316,9 @@ (with-handlers ((exn:unit? (lambda (exn) - (static-error expr - (exn-message exn))))) + (static-error + "signature matching" 'term:signature-not-matching + expr (exn-message exn))))) (verify-signature-match 'compound-unit/sig #f (format "signature ~s" (signature-name small-sig)) @@ -1270,14 +1344,16 @@ (cons (z:read-object tag) (signature-exploded final-sig))))))) (else - (static-error expr "Malformed unit path element")))))) + (static-error + "unit linkage" 'kwd:unit-link-path-malformed + expr "malformed unit path element")))))) (define cu/s-unit-path-prim-links-vocab (create-vocabulary 'cu/s-unit-path-prim-links-vocab #f - "Invalid linkage" - "Invalid linkage" - "Invalid linkage" - "Invalid linkage")) + "malformed linkage" + "malformed linkage" + "malformed linkage" + "malformed linkage")) (add-sym-micro cu/s-unit-path-prim-links-vocab (lambda (expr env attributes vocab) @@ -1388,7 +1464,9 @@ (internal-error tag-table-entry "Illegal tag-table entry"))))))))) (else - (static-error expr "Malformed unit path element")))))) + (static-error + "unit linkage" 'kwd:unit-link-path-malformed + expr "malformed unit path element")))))) (define cu/s-unit-path-tag+build-prefix-vocab (create-vocabulary 'cu/s-unit-path-tag+build-prefix-vocab)) @@ -1448,7 +1526,9 @@ (cons ":" (loop (cdr ids)))))))))))) (else - (static-error expr "Malformed unit path element")))))) + (static-error + "unit linkage" 'kwd:unit-link-path-malformed + expr "malformed unit path element")))))) (define cu/s-unit-path-tag-vocab (create-vocabulary 'cu/s-unit-path-tag-vocab)) @@ -1496,7 +1576,9 @@ (ids (pat:pexpand '(id ...) p-env kwd))) (z:read-object tag)))) (else - (static-error expr "Malformed unit path element")))))) + (static-error + "unit linkage" 'kwd:unit-link-path-malformed + expr "malformed unit path element")))))) (define cu/s-build-link-names (opt-lambda (signature (prefix-string "")) @@ -1542,17 +1624,19 @@ (let ((raw-var (z:read-object variable))) (let loop ((elements (signature-elements sig))) (if (null? elements) - (static-error variable "No such identifier in signature") + (static-error + "signature" 'term:signature-no-var variable + "no such identifier") (or (and (name-element? (car elements)) (eq? raw-var (name-element-name (car elements)))) (loop (cdr elements)))))))) (define cu/s-prim-export-vocab (create-vocabulary 'cu/s-prim-export-vocab #f - "Invalid export declaration" - "Invalid export declaration" - "Invalid export declaration" - "Invalid export declaration")) + "malformed export declaration" + "malformed export declaration" + "malformed export declaration" + "malformed export declaration")) ; Returns a fully-formed export element of the form ; (tag (internal-name external-name)) @@ -1609,7 +1693,9 @@ (z:read-object variable)) external))))))) (else - (static-error expr "Malformed var export")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed var export")))))) (add-micro-form 'open cu/s-prim-export-vocab (let* ((kwd '(open)) @@ -1635,7 +1721,9 @@ (convert-to-prim-format (signature-elements final-sig)))))))) (else - (static-error expr "Malformed open export")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed open export")))))) (add-micro-form 'unit cu/s-prim-export-vocab (let* ((kwd '(unit)) @@ -1680,7 +1768,9 @@ (convert-to-prim-format (signature-elements final-sig) (z:read-object variable)))))))) (else - (static-error expr "Malformed unit export")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed unit export")))))) (define cu/s-export-sign-vocab (create-vocabulary 'cu/s-export-sign-vocab)) @@ -1707,7 +1797,9 @@ (external (pat:pexpand 'external-variable p-env kwd))) (list external)))) (else - (static-error expr "Malformed var export")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed var export")))))) (add-micro-form 'open cu/s-export-sign-vocab (let* ((kwd '(open)) @@ -1724,7 +1816,9 @@ cu/s-unit-path-extract-final-sig-vocab))) (signature-exploded final-sig))))) (else - (static-error expr "Malformed open export")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed open export")))))) (add-micro-form 'unit cu/s-export-sign-vocab (let* ((kwd '(unit)) @@ -1760,7 +1854,9 @@ (list (cons (z:read-object variable) (signature-exploded final-sig))))))) (else - (static-error expr "Malformed unit export")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed unit export")))))) ; -------------------------------------------------------------------- @@ -1869,7 +1965,9 @@ (z:make-origin 'micro expr)) env attributes vocab)))))) (else - (static-error expr "Malformed compound-unit/sig")))))) + (static-error + "compound-unit/sig" 'kwd:compound-unit/sig + expr "malformed expression")))))) (add-primitivized-micro-form 'compound-unit/sig full-vocabulary compound-unit/sig-micro) (add-primitivized-micro-form 'compound-unit/sig scheme-vocabulary compound-unit/sig-micro) @@ -1879,10 +1977,10 @@ (define iu/s-linkage-vocab (create-vocabulary 'iu/s-linkage-vocab #f - "Invalid linkage declaration" - "Invalid linkage declaration" - "Invalid linkage declaration" - "Invalid linkage declaration")) + "malformed linkage declaration" + "malformed linkage declaration" + "malformed linkage declaration" + "malformed linkage declaration")) (add-sym-micro iu/s-linkage-vocab (lambda (expr env attributes vocab) @@ -1907,7 +2005,9 @@ (signature-exploded (expand-expr in:sig env attributes sig-vocab)))))) ((pat:match-against m&e-2 expr env) - (static-error expr "Ambiguous : in signature")) + (static-error + "signature" 'term:signature-ambiguous-: expr + "ambiguous : in signature")) (else (cons immediate-signature-name (signature-exploded @@ -1915,10 +2015,10 @@ (define iu/s-imports-vocab (create-vocabulary 'iu/s-imports-vocab #f - "Invalid import declaration" - "Invalid import declaration" - "Invalid import declaration" - "Invalid import declaration")) + "malformed import declaration" + "malformed import declaration" + "malformed import declaration" + "malformed import declaration")) (add-sym-micro iu/s-imports-vocab (lambda (expr env attributes vocab) @@ -1943,7 +2043,9 @@ (expand-expr in:sig env attributes sig-vocab)) (z:read-object in:id))))) ((pat:match-against m&e-2 expr env) - (static-error expr "Ambiguous : in signature")) + (static-error + "signature" 'term:signature-ambiguous-: expr + "ambiguous : in signature")) (else (convert-to-prim-format (signature-elements @@ -1996,7 +2098,9 @@ in:expr in:linkage expr env attributes vocab)))) (else - (static-error expr "Malformed invoke-unit/sig")))))) + (static-error + "invoke-unit/sig" 'kwd:invoke-unit/sig + expr "malformed expression")))))) (add-primitivized-micro-form 'invoke-unit/sig full-vocabulary invoke-unit/sig-micro) (add-primitivized-micro-form 'invoke-unit/sig scheme-vocabulary invoke-unit/sig-micro) @@ -2036,7 +2140,9 @@ (z:make-origin 'micro expr)) env attributes vocab)))) (else - (static-error expr "Malformed unit->unit/sig")))))) + (static-error + "unit->unit/sig" 'kwd:unit->unit/sig + expr "malformed expression")))))) (add-primitivized-micro-form 'unit->unit/sig full-vocabulary unit->unit/sig-micro) (add-primitivized-micro-form 'unit->unit/sig scheme-vocabulary unit->unit/sig-micro) @@ -2088,10 +2194,17 @@ (m&e (pat:make-match&env in-pattern kwd)) (m&e2 (pat:make-match&env in-pattern2 kwd)) (badsyntax (lambda (expr why) - (static-error expr - (format "Malformed ~adefine-values/invoke-unit/sig~a" - (if global? "global-" "") - why))))) + (static-error + (if global? + "global-define-values" + "define-values") + (if global? + 'kwd:global-define-values + 'kwd:define-values) + expr + (format "Malformed ~adefine-values/invoke-unit/sig~a" + (if global? "global-" "") + why))))) (lambda (expr env attributes vocab) (let ([doit (lambda (p-env prefix?) (let ((in:export (pat:pexpand 'export p-env kwd)) diff --git a/collects/zodiac/scm-main.ss b/collects/zodiac/scm-main.ss @@ -1,4 +1,4 @@ -; $Id: scm-main.ss,v 1.204 2000/03/05 21:15:52 clements Exp $ +; $Id: scm-main.ss,v 1.205 2000/04/30 22:31:01 clements Exp $ (unit/sig zodiac:scheme-main^ (import zodiac:misc^ zodiac:structures^ @@ -190,7 +190,7 @@ '(expr))) (define parse-expr - (lambda (who expr bodies env attributes vocab source) + (lambda (who-str kwd:who expr bodies env attributes vocab source) ;; Do internal definition parsing (let*-values (((internal-define-vocab) @@ -199,12 +199,16 @@ ((definitions parsed-first-term rest-terms bindings) (let loop ((seen null) (rest bodies) (prev #f) (bindings null) (vars-seen null)) (if (null? rest) - (static-error prev - (if (null? seen) - (static-error expr (format "Malformed ~a" who)) - (if (null? (cdr seen)) - "Internal definition not followed by expression" - "Internal definitions not followed by expression"))) + (static-error + "internal definition" 'term:internal-def-not-foll-by-expr + prev + (if (null? seen) + (static-error + who-str kwd:who + expr "malformed expression") + (if (null? (cdr seen)) + "internal definition not followed by expression" + "internal definitions not followed by expression"))) (let ((first (car rest))) (let* ((internal? (get-internal-define-status attributes)) (_ (set-internal-define-status attributes #t)) @@ -222,9 +226,12 @@ (lambda (v) (when (memq (z:read-object v) vars-seen) - (static-error v - "Duplicate internally defined identifier ~a" - (z:read-object v)))) + (static-error + "internal definition" + 'term:duplicate-internal-def + v + "duplicate definition for identifier ~a" + (z:read-object v)))) def-vars) (extend-env new-vars+marks env) (loop (cons e-first seen) @@ -283,7 +290,9 @@ (define (make-lambda-error-micro who) (lambda (expr env attributes vocab) - (static-error expr (format "~a allowed only in a definition" who)))) + (static-error + "lambda" 'term:case/lambda-only-in-def + expr "allowed only in a definition"))) (define (make-case-lambda-micro begin? arglist-decls-vocab) (let* ((kwd `(else)) @@ -315,7 +324,8 @@ (as-nested attributes (lambda () - (parse-expr "case-lambda" expr body env attributes vocab expr)))) + (parse-expr "case-lambda" 'kwd:case-lambda + expr body env attributes vocab expr)))) (retract-env (map car arg-vars+marks) env)))) args bodies))) (create-case-lambda-form @@ -323,7 +333,9 @@ (map cdr arglists+exprs) expr))))) (else - (static-error expr "Malformed case-lambda")))))) + (static-error + "case-lambda" 'kwd:case-lambda + expr "malformed expression")))))) (define beginner+lambda-vocabulary (create-vocabulary 'beginner+lambda-vocabulary @@ -359,7 +371,9 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed lambda"))))) + (static-error + "lambda" 'kwd:lambda + expr "malformed expression"))))) (add-primitivized-macro-form 'lambda @@ -394,7 +408,9 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env attributes vocab) (unless (at-internal-define? attributes) - (static-error expr "Invalid position for internal definition")) + (static-error + "internal definition" 'term:define-internal-invalid-posn + expr "invalid position")) (cond ((pat:match-against m&e expr env) => @@ -406,14 +422,17 @@ (let ((r (resolve var env vocab))) (when (or (micro-resolution? r) (macro-resolution? r)) - (static-error var - "Cannot bind keyword ~s" + (static-error + "keyword" 'term:cannot-bind-kwd + var + "cannot bind keyword ~s" (z:symbol-orig-name var))))) vars) (make-internal-definition vars val)))) (else (static-error expr - "Malformed internal definition")))))) + "internal definition" 'kwd:define + "malformed definition")))))) (add-primitivized-micro-form 'begin internal-define-vocab-delta (let* ((kwd '()) @@ -430,8 +449,9 @@ (let* ((exprs (pat:pexpand '(expr ...) p-env kwd))) (make-internal-begin exprs)))) (else - (static-error expr - "Malformed internal begin"))) + (static-error + "internal begin" 'kwd:begin + expr "malformed expression"))) ;; Chain to regular begin: (begin-micro expr env attributes vocab))))) @@ -455,7 +475,9 @@ (expand-expr (car bodies) env attributes vocab))) (if (and (not top?) (null? bodies)) - (static-error expr "Malformed begin") + (static-error + "begin" 'kwd:begin + expr "malformed expression") (as-nested attributes (lambda () @@ -465,7 +487,9 @@ bodies) expr)))))))) (else - (static-error expr "Malformed begin")))))) + (static-error + "begin" 'kwd:begin + expr "malformed expression")))))) (add-primitivized-micro-form 'begin advanced-vocabulary begin-micro) (add-primitivized-micro-form 'begin scheme-vocabulary begin-micro) @@ -497,7 +521,9 @@ (cons first rest) expr))))))) (else - (static-error expr "Malformed begin0")))))) + (static-error + "begin0" 'kwd:begin0 + expr "malformed expression")))))) (add-primitivized-micro-form 'begin0 advanced-vocabulary begin0-micro) (add-primitivized-micro-form 'begin0 scheme-vocabulary begin0-micro) @@ -514,7 +540,9 @@ => (lambda (p-env) (unless one-arm-ok? - (static-error expr "If must have an else clause")) + (static-error + "if" 'term:if-must-have-else + expr "must have an else clause")) (as-nested attributes (lambda () @@ -544,7 +572,9 @@ env attributes vocab))) (create-if-form test-exp then-exp else-exp expr)))))) (else - (static-error expr "Malformed if")))))) + (static-error + "if" 'kwd:if + expr "malformed expression")))))) (add-primitivized-micro-form 'if beginner-vocabulary (make-if-micro #f)) (add-primitivized-micro-form 'if advanced-vocabulary (make-if-micro #t)) @@ -573,7 +603,9 @@ env attributes vocab))) (create-with-continuation-mark-form key-exp val-exp body-exp expr)))))) (else - (static-error expr "Malformed with-continuation-mark")))))) + (static-error + "with-continuation-mark" 'kwd:with-continuation-mark + expr "malformed expression")))))) (add-primitivized-micro-form 'with-continuation-mark scheme-vocabulary with-continuation-mark-micro) @@ -606,16 +638,21 @@ (null? (cddr v))) (loop (cadr v) (string-append "'" prefix))] [else (values v prefix)]))]) - (static-error expr "Misuse of quote: '~a~s is not a symbol" prefix v))) - (static-error expr "Malformed quote"))) - (static-error expr "Malformed quote")))) + (static-error + "quote" 'term:quote-not-on-symbol + expr "misused: '~a~s is not a symbol" prefix v))) + (static-error + "quote" 'kwd:quote + expr "malformed expression"))) + (static-error + "quote" 'kwd:quote + expr "malformed expression")))) (add-primitivized-micro-form 'quote beginner-vocabulary (make-quote-micro #f)) (add-primitivized-micro-form 'quote intermediate-vocabulary (make-quote-micro #t)) (add-primitivized-micro-form 'quote scheme-vocabulary (make-quote-micro #t)) - ;; This second variable is no longer being used - (define (make-set!-micro dont-mutate-lexical-varrefs?) + (define (make-set!-micro dont-mutate-lambda-varrefs?) (let* ((kwd '()) (in-pattern `(_ var val)) (m&e (pat:make-match&env in-pattern kwd))) @@ -632,8 +669,15 @@ (expand-expr (pat:pexpand 'val p-env kwd) env attributes vocab))))) + (when (and (lambda-varref? id-expr) + dont-mutate-lambda-varrefs?) + (static-error + "set!" 'term:set!-no-mutate-lambda-bound + expr "cannot mutate procedure-bound identifiers")) (create-set!-form id-expr expr-expr expr)) - (static-error expr "Malformed set!")))))) + (static-error + "set!" 'kwd:set! + expr "malformed expression")))))) (add-primitivized-micro-form 'set! advanced-vocabulary @@ -667,17 +711,19 @@ (make-origin 'micro expr)) env attributes vocab))))) (else - (static-error expr "Malformed set!-values")))))) + (static-error + "set!-values" 'kwd:set!-values + expr "malformed expression")))))) (add-primitivized-micro-form 'set!-values advanced-vocabulary set!-values-micro) (add-primitivized-micro-form 'set!-values scheme-vocabulary set!-values-micro) (define (make-local-extract-vocab) (create-vocabulary 'local-extract-vocab #f - "Invalid expression for local clause" - "Invalid expression for local clause" - "Invalid expression for local clause" - "Invalid expression for local clause")) + "invalid expression for local clause" + "invalid expression for local clause" + "invalid expression for local clause" + "invalid expression for local clause")) (define nobegin-local-extract-vocab (make-local-extract-vocab)) (define full-local-extract-vocab (make-local-extract-vocab)) @@ -721,7 +767,9 @@ (syntax-car expr)) (set-top-level-status attributes top-level?) (set-internal-define-status attributes internal?)))) - (static-error expr "Malformed local")))))) + (static-error + "local" 'kwd:local + expr "malformed expression")))))) (add-primitivized-micro-form 'local @@ -755,13 +803,25 @@ (out-pattern-1 `(define-values (fun) (lambda args ,@(get-expr-pattern begin?)))) (in-pattern-2 `(_ var val)) (out-pattern-2 `(define-values (var) val)) + (in-pattern-3 `(_ (fun . args) b0 b1 ...)) ;; for error reporting + (in-pattern-4 `(_ (fun . args))) ;; for error reporting (m&e-1 (pat:make-match&env in-pattern-1 kwd)) - (m&e-2 (pat:make-match&env in-pattern-2 kwd))) + (m&e-2 (pat:make-match&env in-pattern-2 kwd)) + (m&e-3 (pat:make-match&env in-pattern-3 kwd)) + (m&e-4 (pat:make-match&env in-pattern-4 kwd))) (values (lambda (expr env) (or (pat:match-and-rewrite expr m&e-1 out-pattern-1 kwd env) - (pat:match-and-rewrite expr m&e-2 out-pattern-2 kwd env) - (static-error expr "Malformed define"))) + (pat:match-and-rewrite expr m&e-2 out-pattern-2 kwd env) + (or (and (not begin?) + (or (pat:match-against m&e-3 expr env) + (pat:match-against m&e-4 expr env)) + (static-error + "define" 'term:define-illegal-implicit-begin + expr "body must have exactly one expression")) + (static-error + "define" 'kwd:define + expr "malformed definition")))) (lambda (expr env attributes vocab) (cond ((pat:match-against m&e-1 expr env) @@ -780,7 +840,9 @@ (valid-syntactic-id? var) (cons (list var) val)))) (else - (static-error expr "Malformed define in local clause"))))))) + (static-error + "local define" 'kwd:define + expr "malformed definition"))))))) (define-values (nobegin-define-form nobegin-local-define-form) (make-define-forms #f)) @@ -805,10 +867,15 @@ (lambda (internal-ok? handler) (lambda (expr env attributes vocab) (unless (at-top-level? attributes) - (static-error expr + (static-error + "definition" (if internal-ok? - "Invalid position for internal definition" - "Invalid definition: must be at the top level"))) + 'term:invalid-intl-defn-posn + 'term:def-not-at-top-level) + expr + (if internal-ok? + "invalid position for internal definition" + "must be at the top level"))) (cond ((pat:match-against m&e-1 expr env) => @@ -823,8 +890,10 @@ (handler expr env attributes vocab vars val))))) out))) - (else (static-error expr - "Malformed define-values"))))))) + (else (static-error + "define-values" 'kwd:define-values + expr + "malformed definition"))))))) (let ([make-dv-micro (lambda (internal-ok? use-beg-lambda-vocab?) (define-values-helper @@ -876,15 +945,21 @@ (let* ((type (pat:pexpand 'type tsp-env '())) (super (pat:pexpand 'super tsp-env '()))) (and (or (z:symbol? type) - (static-error type "Not an identifier")) + (static-error + "structure definition" 'term:struct-not-id + type "not an identifier")) (values type super))))) ((z:symbol? type-spec) (values type-spec #f)) (else - (static-error type-spec "Invalid specification"))) + (static-error + "super-structure definition" 'term:super-struct-invalid + type-spec "invalid specification"))) (begin (unless (z:symbol? type-spec) - (static-error type-spec "Not an identifier")) + (static-error + "super-structure definition" 'term:super-struct-not-id + type-spec "not an identifier")) (values type-spec #f)))))) (define (make-struct-micro allow-supertype?) @@ -907,7 +982,9 @@ fields expr))))) (else - (static-error expr "Malformed struct")))))) + (static-error + "struct" 'kwd:struct + expr "malformed definition")))))) (add-primitivized-micro-form 'struct beginner-vocabulary (make-struct-micro #f)) (add-primitivized-micro-form 'struct advanced-vocabulary (make-struct-micro #t)) @@ -960,7 +1037,9 @@ (handler expr env attributes vocab names struct-expr))))) (else - (static-error expr "Malformed define-struct"))))))) + (static-error + "define-struct" 'kwd:define-struct + expr "malformed definition"))))))) (let ([top-level-handler (lambda (expr env attributes vocab names struct-expr) (expand-expr @@ -993,10 +1072,14 @@ (add-primitivized-macro-form 'define-structure intermediate-vocabulary (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed define-structure")))) + (static-error + "define-structure" 'kwd:define-structure + expr "malformed definition")))) (let ([int-ds-macro (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed define-structure")))]) + (static-error + "define-structure" 'kwd:define-structure + expr "malformed definition")))]) (add-primitivized-macro-form 'define-structure nobegin-local-extract-vocab int-ds-macro) (add-primitivized-macro-form 'define-structure full-local-extract-vocab int-ds-macro))) @@ -1013,7 +1096,9 @@ (lambda (p-env) (handler expr env attributes vocab p-env))) (else - (static-error expr "Malformed let-struct"))))))) + (static-error + "let-struct" 'kwd:let-struct + expr "malformed expression"))))))) (ls-core (lambda (expr env attributes vocab p-env) (let* ((fields (pat:pexpand '(fields ...) p-env kwd)) @@ -1083,19 +1168,21 @@ (pat:extend-penv 'fun-copy fun-copy p-env) kwd)) (or (pat:match-and-rewrite expr m&e-2 out-pattern-2 kwd env) - (static-error expr "Malformed let"))))))) + (static-error + "let" 'kwd:let + expr "malformed expression"))))))) (add-primitivized-macro-form 'let intermediate-vocabulary (make-let-macro #f #f)) -; (add-primitivized-macro-form 'let -; advanced-vocabulary -; (make-let-macro #t #t)) + (add-primitivized-macro-form 'let + advanced-vocabulary + (make-let-macro #f #t)) (add-primitivized-macro-form 'let scheme-vocabulary (make-let-macro #t #t)) ; Turtle Macros for Robby (let ([add-patterned-macro - (lambda (formname in-pattern out-pattern) + (lambda (formname form-string kwd:form-name in-pattern out-pattern) (add-macro-form formname intermediate-vocabulary @@ -1103,15 +1190,16 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr - (format "Malformed ~a" formname)))))))]) - (add-patterned-macro 'tprompt + (static-error + form-string kwd:form-name + expr "malformed expression"))))))]) + (add-patterned-macro 'tprompt "tprompt" 'kwd:tprompt '(tprompt E ...) '(tpromptfn (lambda () E ...))) - (add-patterned-macro 'split + (add-patterned-macro 'split "split" 'kwd:split '(split E ...) '(splitfn (lambda () E ...))) - (add-patterned-macro 'split* + (add-patterned-macro 'split* "split*" 'kwd:split* '(split* E ...) '(split*fn (list (lambda () E) ...)))) @@ -1126,7 +1214,9 @@ (lambda (expr env) (or (pat:match-and-rewrite expr m&e-1 out-pattern-1 kwd env) (pat:match-and-rewrite expr m&e-2 out-pattern-2 kwd env) - (static-error expr "Malformed let*"))))) + (static-error + "let*" 'kwd:let* + expr "malformed expression"))))) (add-primitivized-macro-form 'let* intermediate-vocabulary @@ -1145,31 +1235,42 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed delay"))))) + (static-error + "delay" 'kwd:delay + expr "malformed expression"))))) (add-primitivized-macro-form 'delay advanced-vocabulary delay-macro) (add-primitivized-macro-form 'delay scheme-vocabulary delay-macro) - (define time-macro - (let* ((kwd '()) - (in-pattern '(_ e0 e1 ...)) - (out-pattern '(let-values (((v cpu user gc) - (#%time-apply (lambda (dont-care) - e0 - e1 ...) - (#%cons (#%quote dont-care) #%null)))) - (#%begin - (#%printf - "cpu time: ~s real time: ~s gc time: ~s~n" - cpu user gc) - (#%apply #%values v)))) - (m&e (pat:make-match&env in-pattern kwd))) - (lambda (expr env) - (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed time"))))) + (define (make-time-macro begin?) + (let* ((kwd '()) + (in-pattern + (if begin? + '(_ e0 e1 ...) + '(_ e0))) + (out-pattern + `(let-values (((v cpu user gc) + (#%time-apply (lambda (dont-care) + ,@(if begin? + '(e0 e1 ...) + '(e0))) + (#%cons (#%quote dont-care) #%null)))) + (#%begin + (#%printf + "cpu time: ~s real time: ~s gc time: ~s~n" + cpu user gc) + (#%apply #%values v)))) + (m&e (pat:make-match&env in-pattern kwd))) + (lambda (expr env) + (or (pat:match-and-rewrite expr m&e out-pattern kwd env) + (static-error + "time" 'kwd:time + expr "malformed expression"))))) - (add-primitivized-macro-form 'time intermediate-vocabulary time-macro) - (add-primitivized-macro-form 'time scheme-vocabulary time-macro) + (add-primitivized-macro-form 'time intermediate-vocabulary + (make-time-macro #f)) + (add-primitivized-macro-form 'time scheme-vocabulary + (make-time-macro #t)) (define break-list (lambda (elements counter) @@ -1218,12 +1319,14 @@ (cons head (loop (cdr var-lists) tail))))) expanded-vals - (parse-expr "let-values" expr body env - attributes vocab expr) + (parse-expr "let-values" 'kwd:let-values + expr body env attributes vocab expr) expr) (retract-env new-vars env)))))))) (else - (static-error expr "Malformed let-values")))))) + (static-error + "let-values" 'kwd:let-values + expr "malformed expression")))))) (add-primitivized-micro-form 'let-values intermediate-vocabulary @@ -1249,7 +1352,9 @@ (lambda (expr env) (or (pat:match-and-rewrite expr m&e-1 out-pattern-1 kwd env) (pat:match-and-rewrite expr m&e-2 out-pattern-2 kwd env) - (static-error expr "Malformed let*-values"))))) + (static-error + "let*-values" 'kwd:let*-values + expr "malformed expression"))))) (add-primitivized-macro-form 'let*-values intermediate-vocabulary @@ -1305,12 +1410,15 @@ (as-nested attributes (lambda () - (parse-expr "letrec-values" expr body env attributes vocab expr))) + (parse-expr "letrec-values" 'kwd:letrec-values + expr body env attributes vocab expr))) expr)) (_ (retract-env new-vars env))) result)))) (else - (static-error expr "Malformed letrec-values")))))) + (static-error + "letrec-values" 'kwd:letrec-values + expr "malformed expression")))))) (add-primitivized-micro-form 'letrec-values intermediate-vocabulary @@ -1329,7 +1437,9 @@ (out-pattern `(letrec-values (((v) e) ...) ,@(get-expr-pattern begin?)))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed letrec"))))) + (static-error + "letrec" 'kwd:letrec + expr "malformed expression"))))) (add-primitivized-macro-form 'letrec intermediate-vocabulary @@ -1371,7 +1481,9 @@ (and (not one-or-zero-ok?) (pat:match-and-rewrite expr m&e-3 out-pattern-3 kwd env)) (pat:match-and-rewrite expr m&e-4 out-pattern-4 kwd env) - (static-error expr "Malformed or"))))))) + (static-error + "or" 'kwd:or + expr "malformed expression"))))))) (add-primitivized-macro-form 'or beginner-vocabulary (make-or-macro #t #f)) (add-primitivized-macro-form 'or advanced-vocabulary (make-or-macro #f #f)) @@ -1386,7 +1498,9 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed nor"))))) + (static-error + "nor" 'kwd:nor + expr "malformed expression"))))) (define (make-and-macro boolean-result? one-or-zero-ok?) (let* ((kwd '()) @@ -1412,7 +1526,9 @@ (and (not one-or-zero-ok?) (pat:match-and-rewrite expr m&e-3 out-pattern-3 kwd env)) (pat:match-and-rewrite expr m&e-4 out-pattern-4 kwd env) - (static-error expr "Malformed and"))))) + (static-error + "and" 'kwd:and + expr "malformed expression"))))) (add-primitivized-macro-form 'and beginner-vocabulary (make-and-macro #t #f)) (add-primitivized-macro-form 'and advanced-vocabulary (make-and-macro #f #f)) @@ -1427,7 +1543,9 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed nand"))))) + (static-error + "nand" 'kwd:nand + expr "malformed expression"))))) (define recur-macro (let* ((kwd '()) @@ -1436,7 +1554,9 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed recur"))))) + (static-error + "recur" 'kwd:recur + expr "malformed expression"))))) (add-primitivized-macro-form 'recur advanced-vocabulary recur-macro) (add-on-demand-form 'macro 'recur common-vocabulary recur-macro) @@ -1457,7 +1577,9 @@ (dup-symbol looper) p-env) kwd)))) - (static-error expr "Malformed rec")))))) + (static-error + "rec" 'kwd:rec + expr "malformed expression")))))) (add-primitivized-macro-form 'rec advanced-vocabulary rec-macro) (add-on-demand-form 'macro 'rec common-vocabulary rec-macro) @@ -1465,7 +1587,7 @@ (define-struct cond-clause (text question answer else? =>? or?)) (define (make-cond-clause-vocab) - (let([qa-error-msg "Clause is not in question-answer format"]) + (let([qa-error-msg "clause is not in question-answer format"]) (create-vocabulary 'cond-clause-vocab #f qa-error-msg ; symbol qa-error-msg ; literal @@ -1515,7 +1637,9 @@ ((pat:match-against m&e-2 expr env) => (lambda (p-env) - (static-error expr "=> not followed by exactly one receiver"))) + (static-error + "cond" 'term:cond-=>-not-foll-by-1-rcvr + expr "=> not followed by exactly one receiver"))) ((pat:match-against m&e-5 expr env) => (lambda (p-env) @@ -1527,7 +1651,9 @@ (let ((question (pat:pexpand 'question p-env kwd)) (answer (pat:pexpand get-pattern-4 p-env kwd))) (make-cond-clause expr question answer #f #f #f)))) - (else (static-error expr "Clause is not in question-answer format")))))) + (else (static-error + "cond" 'term:cond-clause-not-in-q/a-fmt + expr "clause is not in question-answer format")))))) (add-list-micro nobegin-cond-clause-vocab (make-cond-list-micro #f #f)) (add-list-micro full-cond-clause-vocab (make-cond-list-micro #t #t)) @@ -1574,7 +1700,9 @@ ((cond-clause-else? first) (if (null? rest) (cond-clause-answer first) - (static-error (cond-clause-text first) + (static-error + "cond" 'term:cond-else-only-in-last + (cond-clause-text first) "else allowed only in last position"))) ((cond-clause-or? first) `(or ,(cond-clause-question first) @@ -1588,7 +1716,9 @@ (make-origin 'micro expr)) env attributes vocab)))))) (else - (static-error expr "Malformed cond")))))) + (static-error + "cond" 'kwd:cond + expr "malformed expression")))))) (add-primitivized-micro-form 'cond beginner-vocabulary (make-cond-micro nobegin-cond-clause-vocab #f)) (add-primitivized-micro-form 'cond scheme-vocabulary (make-cond-micro full-cond-clause-vocab #t)) @@ -1621,7 +1751,9 @@ (pat:match-and-rewrite expr m&e-2 out-pattern-2-signal-error kwd-2 env)) (pat:match-and-rewrite expr m&e-3 out-pattern-3 kwd-2 env) - (static-error expr "Malformed case"))))) + (static-error + "case" 'kwd:case + expr "malformed expression"))))) (add-primitivized-macro-form 'case advanced-vocabulary case-macro) (add-primitivized-macro-form 'case scheme-vocabulary case-macro) @@ -1659,9 +1791,13 @@ out-pattern-2-signal-error kwd-2 env)) (let ((penv (pat:match-against m&e-3 expr env))) (if penv - (static-error expr "else used before last evcase branch") + (static-error + "evcase" 'kwd:evcase + expr "else used before last branch") (or (pat:match-and-rewrite expr m&e-4 out-pattern-4 kwd-4 env) - (static-error expr "Malformed evcase")))))))) + (static-error + "evcase" 'kwd:evcase + expr "malformed expression")))))))) (add-primitivized-macro-form 'evcase advanced-vocabulary evcase-macro) (add-on-demand-form 'macro 'evcase common-vocabulary evcase-macro) @@ -1673,7 +1809,9 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed when"))))) + (static-error + "when" 'kwd:when + expr "malformed expression"))))) (add-primitivized-macro-form 'when advanced-vocabulary when-macro) @@ -1686,26 +1824,33 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed unless"))))) + (static-error + "unless" 'kwd:unless + expr "malformed expression"))))) (add-primitivized-macro-form 'unless advanced-vocabulary unless-macro) (add-primitivized-macro-form 'unless scheme-vocabulary unless-macro) (let ((rewriter - (lambda (call/cc the-kwd kwd-text) + (lambda (call/cc the-kwd kwd-text kwd:the-kwd) (let* ((kwd '()) (in-pattern `(_ var ,@(get-expr-pattern #t))) (out-pattern `(,call/cc (lambda (var) ,@(get-expr-pattern #t)))) (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr - (string-append "Malformed " kwd-text)))))))) - (add-primitivized-macro-form 'let/cc advanced-vocabulary (rewriter '#%call/cc 'let/cc "let/cc")) - (add-primitivized-macro-form 'let/cc scheme-vocabulary (rewriter '#%call/cc 'let/cc "let/cc")) - - (add-primitivized-macro-form 'let/ec advanced-vocabulary (rewriter '#%call/ec 'let/ec "let/ec")) - (add-primitivized-macro-form 'let/ec scheme-vocabulary (rewriter '#%call/ec 'let/ec "let/ec"))) + (static-error + kwd-text kwd:the-kwd + expr "malformed expression"))))))) + (add-primitivized-macro-form 'let/cc advanced-vocabulary + (rewriter '#%call/cc 'let/cc "let/cc" 'kwd:let/cc)) + (add-primitivized-macro-form 'let/cc scheme-vocabulary + (rewriter '#%call/cc 'let/cc "let/cc" 'kwd:let/cc)) + + (add-primitivized-macro-form 'let/ec advanced-vocabulary + (rewriter '#%call/ec 'let/ec "let/ec" 'kwd:let/ec)) + (add-primitivized-macro-form 'let/ec scheme-vocabulary + (rewriter '#%call/ec 'let/ec "let/ec" 'kwd:let/ec))) (define do-macro (let* ((in-kwd '()) @@ -1754,8 +1899,10 @@ ,(pat:pexpand 'init p-env vis-kwd) ,(pat:pexpand 'var p-env vis-kwd)))) (else - (static-error vis - "Malformed var-init-step")))) + (static-error + "do" 'kwd:do + vis + "malformed var-init-step")))) var-init-steps))) (let ((vars (map car normalized-var-init-steps)) (inits (map cadr normalized-var-init-steps)) @@ -1772,7 +1919,9 @@ #f (make-origin 'macro expr))))))) (else - (static-error expr "Malformed do")))))) + (static-error + "do" 'kwd:do + expr "malformed expression")))))) (add-primitivized-macro-form 'do advanced-vocabulary do-macro) (add-primitivized-macro-form 'do scheme-vocabulary do-macro) @@ -1812,7 +1961,9 @@ (make-origin 'macro expr)) env attributes vocab))))) (else - (static-error expr "Malformed fluid-let")))))) + (static-error + "fluid-let" 'kwd:fluid-let + expr "malformed expression")))))) (add-primitivized-micro-form 'fluid-let advanced-vocabulary fluid-let-macro) (add-primitivized-micro-form 'fluid-let scheme-vocabulary fluid-let-macro) @@ -1842,8 +1993,9 @@ ,@(map (lambda (save pz) `(let ([x ,save]) - (set! ,save (,pz)) - (,pz x))) + (begin + (set! ,save (,pz)) + (,pz x)))) saves pzs)))) (#%dynamic-wind ,swap @@ -1853,7 +2005,9 @@ #f (make-origin 'micro expr)) env attributes vocab)) - (static-error expr "Malformed parameterize")))))) + (static-error + "parameterize" 'kwd:parameterize + expr "malformed expression")))))) (add-primitivized-micro-form 'parameterize advanced-vocabulary parameterize-micro) (add-primitivized-micro-form 'parameterize scheme-vocabulary parameterize-micro) @@ -1862,7 +2016,7 @@ (let* ((kwd '()) (in-pattern-1 `(_ () ,@(get-expr-pattern begin?))) (out-pattern-1 (if (not begin?) - 'b + 'expr `(let-values () ,@(get-expr-pattern begin?)))) (in-pattern-2 `(_ ((pred handler) ...) ,@(get-expr-pattern begin?))) (out-pattern-2 @@ -1893,7 +2047,9 @@ (lambda (expr env) (or (pat:match-and-rewrite expr m&e-1 out-pattern-1 kwd env) (pat:match-and-rewrite expr m&e-2 out-pattern-2 kwd env) - (static-error expr "Malformed with-handlers"))))) + (static-error + "with-handlers" 'kwd:with-handlers + expr "malformed expression"))))) (add-primitivized-macro-form 'with-handlers advanced-vocabulary @@ -1926,7 +2082,9 @@ (macro-handler (pat:pexpand 'macro-handler p-env kwd))) (valid-syntactic-id? macro-name) (unless (get-top-level-status attributes) - (static-error expr "Only supported at top-level")) + (static-error + "define-macro" 'kwd:define-macro + expr "only supported at top-level")) (let* ((real-name (sexp->raw macro-name))) (let ([on-demand (get-on-demand-form real-name vocab)]) (if on-demand @@ -1944,7 +2102,9 @@ 'define-macro)) (cache-table (make-hash-table))) (unless (procedure? real-handler) - (static-error expr "Expander is not a procedure")) + (static-error + "define-macro" 'kwd:define-macro + expr "expander is not a procedure")) (add-user-macro-form real-name vocab (lambda (m-expr m-env) @@ -1957,7 +2117,9 @@ '() #f (make-origin 'micro expr)) env attributes vocab))))) (else - (static-error expr "Malformed define-macro")))))) + (static-error + "define-macro" 'kwd:define-macro + expr "malformed definition")))))) (add-primitivized-micro-form 'let-macro common-vocabulary (let* ((kwd '()) @@ -1984,7 +2146,9 @@ 'let-macro)) (cache-table (make-hash-table))) (unless (procedure? real-handler) - (static-error expr "Expander is not a procedure")) + (static-error + "let-macro" 'kwd:let-macro + expr "expander is not a procedure")) (let ((extended-vocab (create-vocabulary 'user-macro-extended-vocab vocab))) @@ -2001,10 +2165,12 @@ #f (make-origin 'micro expr)) env attributes extended-vocab)))))) (else - (static-error expr "Malformed let-macro")))))) + (static-error + "let-macro" 'kwd:let-macro + expr "malformed expression")))))) (let ((b-e/c-t - (lambda (kwd-symbol kwd-string phase-string on-demand?) + (lambda (kwd-symbol kwd:kwd-symbol kwd-string phase-string on-demand?) (let ([micro (let* ((kwd '()) (in-pattern '(_ e0 e1 ...)) (m&e (pat:make-match&env in-pattern kwd))) @@ -2019,10 +2185,13 @@ (structurize-syntax (with-handlers ((exn? (lambda (exn) - (static-error expr - "Exception at ~a time: ~a" - phase-string - (exn-message exn))))) + (static-error + kwd-string + kwd:kwd-symbol + expr + "exception at ~a time: ~a" + phase-string + (exn-message exn))))) (m3-elaboration-evaluator (let ([top-level? (get-top-level-status attributes)] [internal? (get-internal-define-status attributes)]) @@ -2045,31 +2214,37 @@ '() #f (make-origin 'micro expr)) env attributes vocab)))) (else - (static-error expr - (string-append "Malformed " kwd-string))))))]) + (static-error + kwd-string kwd:kwd-symbol + expr + "malformed expression")))))]) (add-micro-form kwd-symbol full-vocabulary micro) (if on-demand? (add-on-demand-form 'micro kwd-symbol scheme-vocabulary micro) (add-micro-form kwd-symbol scheme-vocabulary micro)))))) - (b-e/c-t 'begin-construction-time "begin-construction-time" "construction" #t) - (b-e/c-t 'begin-elaboration-time "begin-elaboration-time" "elaboration" #f)) + (b-e/c-t 'begin-construction-time 'kwd:begin-construction-time + "begin-construction-time" "construction" #t) + (b-e/c-t 'begin-elaboration-time 'kwd:begin-elaboration-time + "begin-elaboration-time" "elaboration" #f)) (define unquote-micro (lambda (expr env) - (static-error expr "Unquote outside quasiquote"))) + (static-error + "unquote" 'kwd:unquote + expr "outside quasiquote"))) (add-primitivized-macro-form 'unquote intermediate-vocabulary unquote-micro) (add-primitivized-macro-form 'unquote scheme-vocabulary unquote-micro) (define unquote-splicing-micro (lambda (expr env) - (static-error expr "Unquote-splicing outside quasiquote"))) + (static-error + "unquote-splicing" 'kwd:unquote-splicing + expr "outside quasiquote"))) (add-primitivized-macro-form 'unquote-splicing intermediate-vocabulary unquote-splicing-micro) (add-primitivized-macro-form 'unquote-splicing scheme-vocabulary unquote-splicing-micro) (include "quasi.ss") -; (include "shared.ss") - (define reference-file-macro (let* ((kwd '()) (in-pattern '(_ filename)) @@ -2090,9 +2265,13 @@ #f (make-origin 'macro expr)) env attributes vocab) - (static-error filename "Does not yield a filename")))))) + (static-error + "reference-file" 'kwd:reference-file + filename "Does not yield a filename")))))) (else - (static-error expr "Malformed reference-file")))))) + (static-error + "reference-file" 'kwd:reference-file + expr "Malformed reference-file")))))) (add-primitivized-micro-form 'reference-file beginner-vocabulary reference-file-macro) (add-on-demand-form 'micro 'reference-file common-vocabulary reference-file-macro) @@ -2117,19 +2296,25 @@ collections))))) (unless (and (quote-form? f) (z:string? (quote-form-expr f))) - (static-error filename "Does not yield a filename")) + (static-error + "require-library" 'kwd:require-library + filename "Does not yield a filename")) (for-each (lambda (c collection) (unless (and (quote-form? c) (z:string? (quote-form-expr c))) - (static-error collection "Does not yield a string"))) + (static-error + "require-library" 'kwd:require-library + collection "Does not yield a string"))) cs collections) (let ((raw-f (z:read-object (quote-form-expr f))) (raw-cs (map (lambda (c) (z:read-object (quote-form-expr c))) cs))) (unless (relative-path? raw-f) - (static-error f + (static-error + "require-library" 'kwd:require-library + f "Library path ~s must be a relative path" raw-f)) (expand-expr @@ -2141,7 +2326,9 @@ (make-origin 'micro expr)) env attributes vocab)))))) (else - (static-error expr "Malformed require-library")))))) + (static-error + "require-library" 'kwd-require-library + expr "Malformed require-library")))))) (add-primitivized-micro-form 'require-library beginner-vocabulary require-library-micro) (add-primitivized-micro-form 'require-library scheme-vocabulary require-library-micro) @@ -2166,20 +2353,29 @@ collections))))) (unless (and (quote-form? f) (z:string? (quote-form-expr f))) - (static-error filename "Does not yield a filename")) + (static-error + "require-relative-library" + 'kwd:require-relative-library + filename "Does not yield a filename")) (for-each (lambda (c collection) (unless (and (quote-form? c) (z:string? (quote-form-expr c))) - (static-error collection "Does not yield a string"))) + (static-error + "require-relative-library" + 'kwd:require-relative-library + collection "Does not yield a string"))) cs collections) (let ((raw-f (z:read-object (quote-form-expr f))) (raw-cs (map (lambda (c) (z:read-object (quote-form-expr c))) cs))) (unless (relative-path? raw-f) - (static-error f - "Library path ~s must be a relative path" + (static-error + "require-relative-library" + 'kwd:require-relative-library + f + "library path ~s must be a relative path" raw-f)) (expand-expr (structurize-syntax @@ -2190,63 +2386,77 @@ (make-origin 'micro expr)) env attributes vocab)))))) (else - (static-error expr "Malformed require-relative-library")))))) + (static-error + "require-relative-library" 'kwd:require-relative-library + expr "malformed expression")))))) (add-primitivized-micro-form 'require-relative-library beginner-vocabulary require-relative-library-micro) (add-primitivized-micro-form 'require-relative-library scheme-vocabulary require-relative-library-micro) - (add-macro-form 'define-constructor beginner-vocabulary + (add-on-demand-form 'micro 'define-constructor beginner-vocabulary (let* ((kwd '()) (in-pattern '(_ sym modes ...)) (m&e (pat:make-match&env in-pattern kwd)) (out-pattern '(#%void))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed define-constructor"))))) + (static-error + "define-constructor" 'kwd:define-constructor + expr "malformed definition"))))) - (add-macro-form 'define-type beginner-vocabulary + (add-on-demand-form 'macro 'define-type beginner-vocabulary (let* ((kwd '()) (in-pattern '(_ sym type)) (m&e (pat:make-match&env in-pattern kwd)) (out-pattern '(#%void))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed define-type"))))) + (static-error + "define-type" 'kwd:define-type + expr "malformed definition"))))) - (add-macro-form ': beginner-vocabulary + (add-on-demand-form 'macro ': beginner-vocabulary (let* ((kwd '()) (in-pattern '(_ expr type)) (m&e (pat:make-match&env in-pattern kwd)) (out-pattern 'expr)) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed :"))))) + (static-error + ":" 'kwd:: + expr "malformed declaration"))))) - (add-macro-form 'type: beginner-vocabulary + (add-on-demand-form 'macro 'type: beginner-vocabulary (let* ((kwd '()) (in-pattern '(_ type attr ...)) (out-pattern '(#%void)) (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed type:"))))) + (static-error + "type:" 'kwd:type: + expr "malformed declaration"))))) - (add-macro-form 'mrspidey:control beginner-vocabulary + (add-on-demand-form 'macro 'mrspidey:control beginner-vocabulary (let* ((kwd '()) (in-pattern '(_ para val)) (m&e (pat:make-match&env in-pattern kwd)) (out-pattern '(#%void))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed st:control"))))) + (static-error + "mrspidey:control" 'kwd:mrspidey:control + expr "malformed declaration"))))) - (add-macro-form 'polymorphic beginner-vocabulary + (add-on-demand-form 'macro 'polymorphic beginner-vocabulary (let* ((kwd '()) (in-pattern '(_ body)) (m&e (pat:make-match&env in-pattern kwd)) (out-pattern 'body)) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed polymorphic"))))) + (static-error + "polymorphic" 'kwd:polymorpic + expr "malformed declaration"))))) ) diff --git a/collects/zodiac/scm-obj.ss b/collects/zodiac/scm-obj.ss @@ -1,4 +1,4 @@ -; $Id: scm-obj.ss,v 1.43 1999/05/20 22:36:52 mflatt Exp $ +; $Id: scm-obj.ss,v 1.44 1999/05/21 12:53:29 mflatt Exp $ (unit/sig zodiac:scheme-objects^ (import zodiac:misc^ (z : zodiac:structures^) (z : zodiac:reader-structs^) @@ -111,7 +111,9 @@ variables expr))))) (else - (static-error expr "Malformed interface")))))) + (static-error + "interface" 'kwd:interface + expr "malformed declaration")))))) (add-primitivized-micro-form 'interface full-vocabulary interface-micro) (add-primitivized-micro-form 'interface scheme-vocabulary interface-micro) @@ -122,6 +124,8 @@ (lambda (expr env attributes vocab) (let ((r (resolve expr env vocab))) (cond + ((lambda-binding? r) + (create-lambda-varref r expr)) ((lexical-binding? r) (create-lexical-varref r expr)) ((top-level-resolution? r) @@ -142,8 +146,9 @@ ((superinit-binding? r) (create-superinit-varref r expr)) ((or (macro-resolution? r) (micro-resolution? r)) - (static-error expr - "Invalid use of keyword ~s" (z:symbol-orig-name expr))) + (static-error + "keyword" 'term:keyword-out-of-context expr + "invalid use of keyword ~s" (z:symbol-orig-name expr))) (else (internal-error expr "Invalid resolution in obj: ~s" r)))))) @@ -171,24 +176,24 @@ (define ivar-decls-vocab (create-vocabulary 'ivar-decls-vocab #f - "Invalid ivar declaration" - "Invalid ivar declaration" - "Invalid ivar declaration" - "Invalid ivar declaration")) + "malformed ivar declaration" + "malformed ivar declaration" + "malformed ivar declaration" + "malformed ivar declaration")) (define public-ivar-decl-entry-parser-vocab (create-vocabulary 'public-ivar-decl-entry-parser-vocab #f - "Invalid public declaration" - "Invalid public declaration" - "Invalid public declaration" - "Invalid public declaration")) + "malformed public declaration" + "malformed public declaration" + "malformed public declaration" + "malformed public declaration")) (define override-ivar-decl-entry-parser-vocab (create-vocabulary 'override-ivar-decl-entry-parser-vocab #f - "Invalid override declaration" - "Invalid override declaration" - "Invalid override declaration" - "Invalid override declaration")) + "malformed override declaration" + "malformed override declaration" + "malformed override declaration" + "malformed override declaration")) (add-sym-micro public-ivar-decl-entry-parser-vocab (lambda (expr env attributes vocab) @@ -237,7 +242,9 @@ var (make-void-init-expr expr))))) (else - (static-error expr (format "Invalid ~a ivar declaration" kind-str))))))) + (static-error + "ivar" 'term:invalid-ivar-decl + expr (format "malformed ~a declaration" kind-str))))))) (let* ((kwd `(,kind-sym)) (in-pattern `(,kind-sym ivar-decl ...)) @@ -258,7 +265,9 @@ (map cadr decls) (map caddr decls))))) (else - (static-error expr (format "Invalid ~a clause" kind-str)))))))) + (static-error + "ivar" 'term:invalid-ivar-clause + expr (format "malformed ~a clause" kind-str)))))))) (mk-public/override-micro 'public "public" public-ivar-decl-entry-parser-vocab @@ -274,10 +283,10 @@ (define private-ivar-decl-entry-parser-vocab (create-vocabulary 'private-ivar-decl-entry-parser-vocab #f - "Invalid private declaration" - "Invalid private declaration" - "Invalid private declaration" - "Invalid private declaration")) + "malformed private declaration" + "malformed private declaration" + "malformed private declaration" + "malformed private declaration")) (add-sym-micro private-ivar-decl-entry-parser-vocab (lambda (expr env attributes vocab) @@ -307,7 +316,9 @@ (cons (create-private-binding+marks var) (make-void-init-expr expr))))) (else - (static-error expr "Invalid ivar declaration")))))) + (static-error + "ivar" 'term:invalid-ivar-decl + expr "malformed declaration")))))) (let* ((kwd '(private)) (in-pattern '(private ivar-decl ...)) @@ -327,16 +338,18 @@ (map car decls) (map cdr decls))))) (else - (static-error expr "Invalid private clause")))))) + (static-error + "private" 'kwd:class-private + expr "malformed declaration")))))) ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (define inherit-ivar-decl-entry-parser-vocab (create-vocabulary 'inherit-ivar-decl-entry-parser-vocab #f - "Invalid inherit declaration" - "Invalid inherit declaration" - "Invalid inherit declaration" - "Invalid inherit declaration")) + "malformed inherit declaration" + "malformed inherit declaration" + "malformed inherit declaration" + "malformed inherit declaration")) (add-sym-micro inherit-ivar-decl-entry-parser-vocab (lambda (expr env attributes vocab) @@ -361,7 +374,9 @@ (create-inherit-binding+marks internal-var) var)))) (else - (static-error expr "Invalid ivar declaration")))))) + (static-error + "ivar" 'term:invalid-ivar-decl + expr "malformed declaration")))))) (let* ((kwd '(inherit)) (in-pattern '(inherit ivar-decl ...)) @@ -381,16 +396,18 @@ (map car decls) (map cdr decls))))) (else - (static-error expr "Invalid inherit clause")))))) + (static-error + "inherit" 'kwd:class-inherit + expr "malformed declaration")))))) ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (define rename-ivar-decl-entry-parser-vocab (create-vocabulary 'rename-ivar-decl-entry-parser-vocab #f - "Invalid rename declaration" - "Invalid rename declaration" - "Invalid rename declaration" - "Invalid rename declaration")) + "malformed rename declaration" + "malformed rename declaration" + "malformed rename declaration" + "malformed rename declaration")) (add-list-micro rename-ivar-decl-entry-parser-vocab (let* ((kwd '()) @@ -407,7 +424,9 @@ (valid-syntactic-id? inherited-var) (cons (create-rename-binding+marks var) inherited-var)))) (else - (static-error expr "Invalid ivar declaration")))))) + (static-error + "ivar" 'term:invalid-ivar-decl + expr "malformed declaration")))))) (let* ((kwd '(rename)) (in-pattern '(rename ivar-decl ...)) @@ -427,7 +446,9 @@ (map car decls) (map cdr decls))))) (else - (static-error expr "Invalid rename clause")))))) + (static-error + "rename" 'kwd:class-rename + expr "malformed declaration")))))) ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -443,7 +464,9 @@ (make-sequence-entry (pat:pexpand '(expr ...) p-env kwd)))) (else - (static-error expr "Invalid sequence clause")))))) + (static-error + "sequence" 'kwd:class-sequence + expr "malformed declaration")))))) ; ---------------------------------------------------------------------- @@ -477,7 +500,9 @@ (z:make-origin 'micro expr)) env attributes vocab)))) (else - (static-error expr "Malformed class")))))) + (static-error + "class" 'kwd:class + expr "malformed expression")))))) (add-primitivized-micro-form 'class full-vocabulary class-micro) (add-primitivized-micro-form 'class scheme-vocabulary class-micro) @@ -512,18 +537,13 @@ (z:make-origin 'micro expr)) env attributes vocab)))) (else - (static-error expr "Malformed class*")))))) + (static-error + "class*" 'kwd:class* + expr "malformed expression")))))) (add-primitivized-micro-form 'class* full-vocabulary class*-micro) (add-primitivized-micro-form 'class* scheme-vocabulary class*-micro) - (define flag-non-supervar - (lambda (super env) - (unless (supervar-binding? - (resolve-in-env (z:read-object super) - (z:symbol-marks super) env)) - (static-error super "Not a superclass reference")))) - (define class*/names-micro (let* ((kwd '()) (in-pattern `(kwd (this super-init) @@ -669,7 +689,9 @@ env) result)))))))))) (else - (static-error expr "Malformed class*/names")))))) + (static-error + "class*/names" 'kwd:class*/names + expr "malformed expression")))))) (add-primitivized-micro-form 'class*/names full-vocabulary class*/names-micro) @@ -700,7 +722,9 @@ (z:make-origin 'micro expr)) env attributes vocab)))))) (else - (static-error expr "Malformed ivar")))))) + (static-error + "ivar" 'kwd:ivar + expr "malformed expression")))))) (add-primitivized-micro-form 'ivar full-vocabulary ivar-micro) (add-primitivized-micro-form 'ivar scheme-vocabulary ivar-micro) @@ -712,7 +736,9 @@ (m&e (pat:make-match&env in-pattern kwd))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed send"))))) + (static-error + "send" 'kwd:send + expr "malformed expression"))))) (add-primitivized-macro-form 'send full-vocabulary send-macro) (add-primitivized-macro-form 'send scheme-vocabulary send-macro) @@ -726,22 +752,42 @@ ...))) (lambda (expr env) (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed send*"))))) + (static-error + "send*" 'kwd:send* + expr "malformed expression"))))) (add-primitivized-macro-form 'send* full-vocabulary send*-macro) (add-on-demand-form 'macro 'send* common-vocabulary send*-macro) - (define make-generic-macro - (let* ((kwd '()) - (in-pattern '(_ class name)) - (m&e (pat:make-match&env in-pattern kwd)) - (out-pattern '(#%make-generic/proc class (quote name)))) - (lambda (expr env) - (or (pat:match-and-rewrite expr m&e out-pattern kwd env) - (static-error expr "Malformed make-generic"))))) + (define make-generic-micro + (let* ((kwd '()) + (in-pattern '(_ ci name)) + (m&e (pat:make-match&env in-pattern kwd))) + (lambda (expr env attributes vocab) + (cond + ((pat:match-against m&e expr env) + => + (lambda (p-env) + (let ((ci (pat:pexpand 'ci p-env kwd)) + (name (pat:pexpand 'name p-env kwd))) + (valid-syntactic-id? name) + (as-nested + attributes + (lambda () + (expand-expr + (structurize-syntax + `(#%make-generic/proc ,ci (quote ,name)) + expr '(-1) + #f + (z:make-origin 'micro expr)) + env attributes vocab)))))) + (else + (static-error + "make-generic" 'kwd:make-generic + expr "malformed expression")))))) - (add-primitivized-macro-form 'make-generic full-vocabulary make-generic-macro) - (add-primitivized-macro-form 'make-generic scheme-vocabulary make-generic-macro) + (add-primitivized-micro-form 'make-generic full-vocabulary make-generic-micro) + (add-primitivized-micro-form 'make-generic scheme-vocabulary make-generic-micro) ; ---------------------------------------------------------------------- @@ -763,10 +809,14 @@ env attributes vocab))))) (when (or (inherit-varref? id-expr) (rename-varref? id-expr)) - (static-error var-p - "Cannot mutate inherited or renamed variables")) + (static-error + "set!" 'term:no-set!-inherited/renamed + var-p + "cannot mutate inherited or renamed variables")) (create-set!-form id-expr expr-expr expr)) - (static-error expr "Malformed set!")))))) + (static-error + "set!" 'kwd:set! + expr "malformed expression")))))) (add-primitivized-micro-form 'set! full-vocabulary set!-micro) (add-primitivized-micro-form 'set! scheme-vocabulary set!-micro) diff --git a/collects/zodiac/scm-ou.ss b/collects/zodiac/scm-ou.ss @@ -1,4 +1,4 @@ -; $Id: scm-ou.ss,v 1.17 1999/02/02 19:33:15 mflatt Exp $ +; $Id: scm-ou.ss,v 1.18 1999/04/07 22:38:04 mflatt Exp $ (unit/sig zodiac:scheme-objects+units^ (import zodiac:misc^ (z : zodiac:structures^) (z : zodiac:reader-structs^) @@ -12,6 +12,8 @@ (lambda (expr env attributes vocab) (let loop ((r (resolve expr env vocab))) (cond + ((lambda-binding? r) + (create-lambda-varref r expr)) ((lexical-binding? r) (create-lexical-varref r expr)) ((top-level-resolution? r) @@ -35,9 +37,9 @@ (if (and (inside-unit? attributes) (check-export expr attributes)) (loop top-level-resolution) - (static-error - expr - "Invalid use of keyword ~a" (z:symbol-orig-name expr)))) + (static-error + "keyword" 'term:keyword-out-of-context expr + "invalid use of keyword ~s" (z:symbol-orig-name expr)))) (else (internal-error expr "Invalid resolution in ou: ~s" r)))))))) diff --git a/collects/zodiac/scm-spdy.ss b/collects/zodiac/scm-spdy.ss @@ -1,4 +1,4 @@ -; $Id: scm-spdy.ss,v 1.42 1999/01/16 15:47:07 mflatt Exp $ +; $Id: scm-spdy.ss,v 1.43 1999/03/15 14:35:40 mflatt Exp $ (unit/sig zodiac:scheme-mrspidey^ (import zodiac:misc^ (z : zodiac:structures^) @@ -71,7 +71,7 @@ ; -------------------------------------------------------------------- (define mrspidey-vocabulary - (create-vocabulary 'mrspidey-vocabulary full-vocabulary)) + (create-vocabulary 'mrspidey-vocabulary scheme-vocabulary)) ; -------------------------------------------------------------------- @@ -89,7 +89,9 @@ (expand-expr p-expr env attributes vocab) expr)))) (else - (static-error expr "Malformed poly")))))) + (static-error + "polymorphic" 'kwd:polymorphic + expr "malformed definition")))))) (add-primitivized-micro-form ': mrspidey-vocabulary (let* ((kwd '()) @@ -107,7 +109,9 @@ (sexp->raw type) expr)))) (else - (static-error expr "Malformed :")))))) + (static-error + ":" 'kwd:: + expr "malformed declaration")))))) (add-primitivized-micro-form 'type: mrspidey-vocabulary (let* ((kwd '()) @@ -125,7 +129,9 @@ (map sexp->raw attrs) expr)))) (else - (static-error expr "Malformed type:")))))) + (static-error + "type:" 'kwd:type: + expr "malformed declaration")))))) (add-primitivized-micro-form 'mrspidey:control mrspidey-vocabulary (let* ((kwd '()) @@ -143,7 +149,9 @@ (sexp->raw val) expr)))) (else - (static-error expr "Malformed mrspidey:control")))))) + (static-error + "mrspidey:control" 'kwd:mrspidey:control + expr "malformed declaration")))))) (add-primitivized-micro-form 'define-type mrspidey-vocabulary (let* ((kwd '()) @@ -162,7 +170,9 @@ (sexp->raw type) expr)))) (else - (static-error expr "Malformed define-type")))))) + (static-error + "define-type" 'kwd:define-type + expr "malformed definition")))))) (add-primitivized-micro-form 'define-constructor mrspidey-vocabulary (let* ((kwd '()) @@ -181,14 +191,18 @@ ; I have no idea what (assert-syn def ...) does. (map (lambda (mode) (unless (z:boolean? mode) - (static-error mode "Malformed mode"))) + (static-error + "define-constructor" 'kwd:define-constructor + mode "malformed mode"))) modes) (create-define-constructor-form (z:read-object sym) (map sexp->raw modes) expr)))) (else - (static-error expr "Malformed define-constructor")))))) + (static-error + "define-constructor" 'kwd:define-constructor + expr "malformed definition")))))) (add-primitivized-micro-form 'reference-file mrspidey-vocabulary (let* ((kwd '()) @@ -207,15 +221,20 @@ (let-values (((base name dir?) (split-path raw-filename))) (when dir? - (static-error file - "Cannot include a directory")) + (static-error + "reference-file" 'kwd:reference-file + file + "cannot include a directory")) (let* ((original-directory (current-load-relative-directory)) (p (with-handlers ((exn:i/o:filesystem? (lambda (exn) - (static-error file - "Unable to open file ~a" + (static-error + "reference-file" + 'kwd:reference-file + file + "unable to open file ~a" raw-filename)))) (open-input-file (if (complete-path? raw-filename) @@ -254,7 +273,9 @@ (cons input (loop))))))) (if (null? code) - (static-error expr "Empty file") + (static-error + "reference-file" 'kwd:reference-file + expr "empty file") (expand-expr (structurize-syntax `(begin ,@code) @@ -263,12 +284,16 @@ (lambda () (current-load-relative-directory original-directory) (close-input-port p)))))) - (static-error file "Does not yield a filename")))))) + (static-error + "reference-file" 'kwd:reference-file + file "does not yield a filename")))))) (else - (static-error expr "Malformed reference-file")))))) + (static-error + "reference-file" 'kwd:reference-file + expr "malformed expression")))))) (define reference-library/relative-maker - (lambda (form-name make-raw-filename) + (lambda (form-name kwd:form-name make-raw-filename) (let* ((kwd '()) (in-pattern '(_ filename collections ...)) (m&e (pat:make-match&env in-pattern kwd))) @@ -285,12 +310,16 @@ collections))) (unless (and (quote-form? f) (z:string? (quote-form-expr f))) - (static-error filename "Does not yield a filename")) + (static-error + (symbol->string form-name) kwd:form-name + filename "does not yield a filename")) (for-each (lambda (c collection) (unless (and (quote-form? c) (z:string? (quote-form-expr c))) - (static-error collection "Does not yield a string"))) + (static-error + (symbol->string form-name) kwd:form-name + collection "does not yield a string"))) cs collections) (let* ((raw-f (z:read-object (quote-form-expr f))) (raw-cs (map (lambda (c) @@ -299,16 +328,22 @@ (raw-filename (if (relative-path? raw-f) (or (make-raw-filename raw-f raw-cs expr) - (static-error filename - "No such library file found")) - (static-error f - "Library path ~s must be a relative path" + (static-error + (symbol->string form-name) kwd:form-name + filename + "no such library file found")) + (static-error + (symbol->string form-name) kwd:form-name + f + "library path ~s must be a relative path" raw-f)))) (let-values (((base name dir?) (split-path raw-filename))) (when dir? - (static-error filename - "Cannot include a directory")) + (static-error + (symbol->string form-name) kwd:form-name + filename + "cannot include a directory")) (let ((original-directory (current-load-relative-directory)) (original-collections @@ -316,8 +351,11 @@ (p (with-handlers ((exn:i/o:filesystem? (lambda (exn) - (static-error filename - "Unable to open file ~a" + (static-error + (symbol->string form-name) + kwd:form-name + filename + "unable to open file ~a" raw-filename)))) (open-input-file raw-filename)))) (dynamic-wind @@ -347,7 +385,10 @@ (cons input (loop))))))) (if (null? code) - (static-error expr "Empty file") + (static-error + (symbol->string form-name) + kwd:form-name + expr "empty file") (expand-expr (structurize-syntax `(begin ,@code) @@ -360,25 +401,31 @@ original-collections) (close-input-port p)))))))))) (else - (static-error expr (string-append "Malformed " - (symbol->string form-name))))))))) + (static-error + (symbol->string form-name) kwd:form-name + expr + (string-append "malformed expression")))))))) (add-primitivized-micro-form 'require-library mrspidey-vocabulary (reference-library/relative-maker 'require-library + 'kwd:require-library (lambda (raw-f raw-cs expr) (apply mzlib:find-library raw-f raw-cs)))) (add-primitivized-micro-form 'require-relative-library mrspidey-vocabulary (reference-library/relative-maker 'require-relative-library + 'kwd:require-relative-library (lambda (raw-f raw-cs expr) (apply mzlib:find-library raw-f (append (or (current-require-relative-collection) - (static-error expr - "No current collection for library \"~a\"" raw-f)) + (static-error + "require-relative-library" 'kwd:require-relative-library + expr + "no current collection for library \"~a\"" raw-f)) raw-cs))))) (define reference-unit-maker - (lambda (form-name signed?) + (lambda (form-name kwd:form-name signed?) (add-primitivized-micro-form form-name mrspidey-vocabulary (let* ((kwd '()) (in-pattern `(_ file)) @@ -402,15 +449,19 @@ 'exp signed? expr) - (static-error file "Does not yield a filename")))))) + (static-error + (symbol->string form-name) kwd:form-name + file "does not yield a filename")))))) (else - (static-error expr "Malformed ~a" form-name)))))))) + (static-error + (symbol->string form-name) kwd:form-name + expr "malformed expression")))))))) - (reference-unit-maker 'require-unit #f) - (reference-unit-maker 'require-unit/sig #t) + (reference-unit-maker 'require-unit 'kwd:require-unit #f) + (reference-unit-maker 'require-unit/sig 'kwd:require-unit/sig #t) (define reference-library-unit-maker - (lambda (form-name sig? relative?) + (lambda (form-name kwd:form-name sig? relative?) (add-primitivized-micro-form form-name mrspidey-vocabulary (let* ((kwd '()) (in-pattern '(_ filename collections ...)) @@ -429,13 +480,17 @@ collections))) (unless (and (quote-form? f) (z:string? (quote-form-expr f))) - (static-error filename "Does not yield a filename")) + (static-error + (symbol->string form-name) kwd:form-name + filename "does not yield a filename")) (for-each (lambda (c collection) (unless (and (quote-form? c) (z:string? (quote-form-expr c))) - (static-error collection - "Does not yield a string"))) + (static-error + (symbol->string form-name) kwd:form-name + collection + "does not yield a string"))) cs collections) (let ((raw-f (z:read-object (quote-form-expr f))) (raw-cs (map (lambda (c) @@ -443,8 +498,10 @@ (quote-form-expr c))) cs))) (unless (relative-path? raw-f) - (static-error f - "Library path ~s must be a relative path" + (static-error + (symbol->string form-name) kwd:form-name + f + "library path ~s must be a relative path" raw-f)) (create-reference-unit-form (structurize-syntax @@ -455,8 +512,10 @@ null) raw-cs) raw-cs)) - (static-error expr - "Unable to locate library ~a in collection path ~a" + (static-error + (symbol->string form-name) kwd:form-name + expr + "unable to locate library ~a in collection path ~a" raw-f (if (null? raw-cs) "mzlib" raw-cs))) (or (current-load-relative-directory) @@ -466,13 +525,18 @@ sig? expr)))))) (else - (static-error expr - (string-append "Malformed ~a" form-name))))))))) - - (reference-library-unit-maker 'require-library-unit #f #f) - (reference-library-unit-maker 'require-library-unit/sig #t #f) - (reference-library-unit-maker 'require-relative-library-unit #f #t) - (reference-library-unit-maker 'require-relative-library-unit/sig #t #t) + (static-error + (symbol->string form-name) kwd:form-name + expr "malformed expression")))))))) + + (reference-library-unit-maker 'require-library-unit + 'kwd:require-library-unit #f #f) + (reference-library-unit-maker 'require-library-unit/sig + 'kwd:require-library-unit/sig #t #f) + (reference-library-unit-maker 'require-relative-library-unit + 'kwd:require-relative-library-unit #f #t) + (reference-library-unit-maker 'require-relative-library-unit/sig + 'kwd:require-relative-library-unit/sig #t #t) ' (add-primitivized-micro-form 'references-unit-imports mrspidey-vocabulary (let* ((kwd '()) diff --git a/collects/zodiac/scm-unit.ss b/collects/zodiac/scm-unit.ss @@ -1,4 +1,4 @@ -; $Id: scm-unit.ss,v 1.86 1999/05/21 12:53:30 mflatt Exp $ +; $Id: scm-unit.ss,v 1.87 2000/01/10 22:51:12 clements Exp $ (unit/sig zodiac:scheme-units^ (import zodiac:misc^ (z : zodiac:structures^) @@ -118,9 +118,11 @@ (unless (null? unresolveds) (let ([id (unresolved-id (car unresolveds))]) (check-for-signature-name id attributes) - (static-error (unresolved-id (car unresolveds)) - "Unbound unit identifier ~a" - (z:read-object id))))) + (static-error + "unit" 'term:unit-unbound-id + (unresolved-id (car unresolveds)) + "unbound identifier ~a" + (z:read-object id))))) (put-attribute attributes 'unresolved-unit-vars (cons (append unresolveds (car left-unresolveds)) (cdr left-unresolveds))))))) @@ -146,7 +148,9 @@ (hash-table-put! id-table id-name (make-link-id id))) ((link-id? entry) - (static-error id "Duplicate link name")) + (static-error + "unit linkage" 'term:unit-link-duplicate-tag + id "duplicate link tag name")) (else (internal-error entry "Invalid in register-links")))))) ids))) @@ -191,13 +195,17 @@ (hash-table-put! id-table id-name (make-import-id id))) ((import-id? entry) - (static-error id "Duplicate import identifier ~a" id-name)) + (static-error + "unit" 'term:unit-duplicate-import + id "duplicate import identifier ~a" id-name)) ((export-id? entry) - (static-error id "Exported identifier ~a being imported" - id-name)) + (static-error + "unit" 'term:unit-import-exported + id "exported identifier ~a being imported" id-name)) ((internal-id? entry) - (static-error id - "Defined identifier ~a being imported" id-name)) + (static-error + "unit" 'term:unit-defined-imported + id "defined identifier ~a being imported" id-name)) (else (internal-error entry "Invalid in register-import/export"))))))) @@ -215,15 +223,19 @@ (hash-table-put! id-table id-name (make-internal-id id))) ((import-id? entry) - (static-error id "Redefined imported identifier ~a" id-name)) + (static-error + "unit" 'term:unit-redefined-import + id "redefined imported identifier ~a" id-name)) ((export-id? entry) (if (export-id-defined? entry) - (static-error id "Redefining exported identifier ~a" - id-name) + (static-error + "unit" 'term:unit-duplicate-definition + id "redefining exported identifier ~a" id-name) (set-export-id-defined?! entry #t))) ((internal-id? entry) - (static-error id "Duplicate internal definition for ~a" - id-name)) + (static-error + "unit" 'term:unit-duplicate-definition + id "duplicate internal definition for ~a" id-name)) (else (internal-error entry "Invalid entry in register-definitions")))))) @@ -240,10 +252,13 @@ (hash-table-put! id-table id-name (make-export-id id #f))) ((import-id? entry) - (static-error id "Imported identifier ~a being exported" - id-name)) + (static-error + "unit" 'term:unit-import-exported + id "imported identifier ~a being exported" id-name)) ((export-id? entry) - (static-error id "Duplicate export identifier ~a" id-name)) + (static-error + "unit" 'term:unit-duplicate-export + id "duplicate export identifier ~a" id-name)) ((internal-id? entry) (internal-error entry "Should not have had an internal-id in register-export")) @@ -259,15 +274,18 @@ (lambda () #f)))) (cond ((not entry) - (static-error id "Exported identifier ~a not defined" - id-name)) + (static-error + "unit" 'term:unit-export-not-defined + id "Exported identifier ~a not defined" id-name)) ((import-id? entry) - (static-error id "Imported identifier ~a being exported" - id-name)) + (static-error + "unit" 'term:unit-import-exported + id "imported identifier ~a being exported" id-name)) ((export-id? entry) (unless (export-id-defined? entry) - (static-error id "Exported identifier ~a not defined" - id-name))) + (static-error + "unit" 'term:unit-export-not-defined + id "exported identifier ~a not defined" id-name))) ((internal-id? entry) (internal-error entry "Should not have had an internal-id in verify-export")) @@ -318,10 +336,10 @@ (define c/imports-vocab (create-vocabulary 'c/imports-vocab #f - "Invalid import declaration" - "Invalid import declaration" - "Invalid import declaration" - "Invalid import declaration")) + "malformed import declaration" + "malformed import declaration" + "malformed import declaration" + "malformed import declaration")) (add-sym-micro c/imports-vocab (lambda (expr env attributes vocab) @@ -332,10 +350,10 @@ (define unit-register-exports-vocab (create-vocabulary 'unit-register-exports-vocab #f - "Invalid export declaration" - "Invalid export declaration" - "Invalid export declaration" - "Invalid export declaration")) + "malformed export declaration" + "malformed export declaration" + "malformed export declaration" + "malformed export declaration")) (add-sym-micro unit-register-exports-vocab (lambda (expr env attributes vocab) @@ -356,16 +374,18 @@ (valid-syntactic-id? external) (register-export internal attributes)))) (else - (static-error expr "Malformed export declaration")))))) + (static-error + "unit export" 'term:unit-export + expr "malformed declaration")))))) ;; ---------------------------------------------------------------------- (define unit-generate-external-names-vocab (create-vocabulary 'unit-generate-external-names-vocab #f - "Invalid export declaration" - "Invalid export declaration" - "Invalid export declaration" - "Invalid export declaration")) + "malformed export declaration" + "malformed export declaration" + "malformed export declaration" + "malformed export declaration")) (add-sym-micro unit-generate-external-names-vocab (lambda (expr env attributes vocab) @@ -382,16 +402,18 @@ (lambda (p-env) (pat:pexpand 'external-id p-env kwd))) (else - (static-error expr "Malformed export declaration")))))) + (static-error + "unit export" 'term:unit-export + expr "malformed declaration")))))) ;; -------------------------------------------------------------------- (define unit-verify-exports-vocab (create-vocabulary 'unit-verify-exports-vocab #f - "Invalid export declaration" - "Invalid export declaration" - "Invalid export declaration" - "Invalid export declaration")) + "malformed export declaration" + "malformed export declaration" + "malformed export declaration" + "malformed export declaration")) (add-sym-micro unit-verify-exports-vocab (lambda (expr env attributes vocab) @@ -417,7 +439,9 @@ (cons (process-unit-top-level-resolution internal attributes) external))))) (else - (static-error expr "Malformed export declaration")))))) + (static-error + "unit export" 'term:unit-export + expr "malformed declaration")))))) ; ---------------------------------------------------------------------- @@ -604,7 +628,9 @@ expr)))) (lambda () (put-attribute attributes 'top-levels old-top-level)))))) (else - (static-error expr "Malformed unit")))))) + (static-error + "unit" 'kwd:unit + expr "malformed expression")))))) (add-primitivized-micro-form 'unit full-vocabulary unit-micro) (add-primitivized-micro-form 'unit scheme-vocabulary unit-micro) @@ -613,18 +639,19 @@ (define c-unit-link-import-vocab (create-vocabulary 'c-unit-link-import-vocab #f - "Invalid link import declaration" - "Invalid link import declaration" - "Invalid link import declaration" - "Invalid link import declaration")) + "malformed link import declaration" + "malformed link import declaration" + "malformed link import declaration" + "malformed link import declaration")) (add-sym-micro c-unit-link-import-vocab (lambda (expr env attributes vocab) (if (check-import expr attributes) (list (expand-expr expr env attributes (get-c-unit-vocab-attribute attributes))) - (static-error expr "~a: Not an imported identifier" - (z:read-object expr))))) + (static-error + "compound-unit linkage" 'term:c-unit-not-import + expr "~a: not an imported identifier" (z:read-object expr))))) (add-list-micro c-unit-link-import-vocab (let* ((kwd '()) @@ -641,18 +668,21 @@ (when (eq? (z:read-object tag) (get-c-unit-current-link-tag-attribute attributes)) - (static-error expr "Self-import of tag ~a" - (z:read-object tag)))) + (static-error + "compound-unit linkage" 'term:unit-link-self-import-tag + expr "self-import of tag ~a" (z:read-object tag)))) (map (lambda (id) (cons tag id)) ids)))) (else - (static-error expr "Invalid link syntax")))))) + (static-error + "compound-unit linkage" 'term:c-unit-linkage + expr "invalid syntax")))))) (define c-unit-link-body-vocab (create-vocabulary 'c-unit-link-body-vocab #f - "Invalid link body declaration" - "Invalid link body declaration" - "Invalid link body declaration" - "Invalid link body declaration")) + "malformed link body declaration" + "malformed link body declaration" + "malformed link body declaration" + "malformed link body declaration")) (add-list-micro c-unit-link-body-vocab (let* ((kwd '()) @@ -675,14 +705,16 @@ c-unit-link-import-vocab)) imported-vars))))) (else - (static-error expr "Invalid linkage body")))))) + (static-error + "compound-unit linkage" 'term:c-unit-linkage + expr "malformed body")))))) (define c-unit-exports-vocab (create-vocabulary 'c-unit-exports-vocab #f - "Invalid unit export declaration" - "Invalid unit export declaration" - "Invalid unit export declaration" - "Invalid unit export declaration")) + "malformed unit export declaration" + "malformed unit export declaration" + "malformed unit export declaration" + "malformed unit export declaration")) (add-sym-micro c-unit-exports-vocab (lambda (expr env attributes vocab) @@ -703,14 +735,16 @@ (valid-syntactic-id? external-id) (cons internal-id external-id)))) (else - (static-error expr "Invalid export clause")))))) + (static-error + "compound-unit" 'term:c-unit-export + expr "malformed export clause")))))) (define c-unit-export-clause-vocab (create-vocabulary 'c-unit-export-clause-vocab #f - "Invalid export clause declaration" - "Invalid export clause declaration" - "Invalid export clause declaration" - "Invalid export clause declaration")) + "malformed export clause declaration" + "malformed export clause declaration" + "malformed export clause declaration" + "malformed export clause declaration")) (add-list-micro c-unit-export-clause-vocab (let* ((kwd '()) @@ -730,9 +764,13 @@ (expand-expr e env attributes c-unit-exports-vocab))) exports) - (static-error tag "Not a valid tag"))))) + (static-error + "compound-unit" 'term:c-unit-invalid-tag + tag "not a valid tag"))))) (else - (static-error expr "Invalid export clause")))))) + (static-error + "compound-unit" 'term:c-unit-export + expr "malformed export clause")))))) (define compound-unit-micro (let* ((kwd `(import link export)) @@ -792,10 +830,16 @@ (if (z:symbol? arg) (when (not (memq (z:read-object arg) raw-link-clauses)) - (static-error arg - "Not a valid tag")) - (static-error arg - "Tag must be a symbol")))) + (static-error + "compound-unit" + 'term:c-unit-invalid-tag + arg + "not a valid tag")) + (static-error + "compound-unit" + 'term:c-unit-invalid-tag + arg + "tag must be a symbol")))) (loop (cdr args))))))))) in:link-tags in:link-bodies)) (proc:export-clauses @@ -814,7 +858,9 @@ proc:export-clauses expr))))) (else - (static-error expr "Malformed compound-unit")))))) + (static-error + "compound-unit" 'kwd:compound-unit + expr "malformed expression")))))) (add-primitivized-micro-form 'compound-unit full-vocabulary compound-unit-micro) (add-primitivized-micro-form 'compound-unit scheme-vocabulary compound-unit-micro) @@ -848,7 +894,9 @@ var-exprs expr))))) (else - (static-error expr "Malformed invoke-unit")))))) + (static-error + "invoke-unit" 'kwd:invoke-unit + expr "malformed expression")))))) (add-primitivized-micro-form 'invoke-unit full-vocabulary invoke-unit-micro) (add-primitivized-micro-form 'invoke-unit scheme-vocabulary invoke-unit-micro) @@ -905,8 +953,10 @@ (lambda (handler) (lambda (expr env attributes vocab) (unless (at-top-level? attributes) - (static-error expr - "Invalid definition: must be at the top level")) + (static-error + "definition" 'term:def-not-at-top-level + expr + "must be at the top level")) (cond ((pat:match-against m&e-1 expr env) => @@ -924,8 +974,11 @@ (when (or (micro-resolution? r) (macro-resolution? r)) (unless (check-export var attributes) - (static-error var - "Cannot bind keyword ~s" + (static-error + "keyword" + 'term:cannot-bind-kwd + var + "cannot bind keyword ~s" (z:symbol-orig-name var)))))) vars)) (out (handler expr env attributes @@ -933,7 +986,9 @@ (set-top-level-status attributes top-level?) out))) - (else (static-error expr "Malformed define-values"))))))) + (else (static-error + "define-values" 'kwd:define-values + expr "malformed definition"))))))) (add-primitivized-micro-form 'define-values unit-clauses-vocab-delta (define-values-helper @@ -952,10 +1007,10 @@ (define define-values-id-parse-vocab (create-vocabulary 'define-values-id-parse-vocab #f - "Invalid in identifier position" - "Invalid in identifier position" - "Invalid in identifier position" - "Invalid in identifier position")) + "malformed in identifier position" + "malformed in identifier position" + "malformed in identifier position" + "malformed in identifier position")) (add-sym-micro define-values-id-parse-vocab (let ((top-level-resolution (make-top-level-resolution 'dummy #f))) @@ -997,10 +1052,14 @@ (pat:pexpand 'val p-env kwd) env attributes vocab))) (when (check-import var-p attributes) - (static-error var-p "Mutating imported identifier")) + (static-error + "set!" 'term:no-set!-imported + var-p "cannot mutate imported identifier")) (set-top-level-status attributes top-level?) (create-set!-form id-expr expr-expr expr)) - (static-error expr "Malformed set!")))))) + (static-error + "set!" 'kwd:set! + expr "malformed expression")))))) (define process-unit-top-level-resolution (lambda (expr attributes) @@ -1016,19 +1075,22 @@ (lambda (expr env attributes vocab) (let loop ((r (resolve expr env vocab))) (cond - ((or (macro-resolution? r) (micro-resolution? r)) - (if (check-export expr attributes) + ((or (macro-resolution? r) (micro-resolution? r)) + (if (check-export expr attributes) (loop top-level-resolution) - (static-error expr - "Invalid use of keyword ~a" (z:symbol-orig-name expr)))) - ((lexical-binding? r) - (create-lexical-varref r expr)) - ((top-level-resolution? r) - (check-for-signature-name expr attributes) - (process-unit-top-level-resolution expr attributes)) - (else - (internal-error expr "Invalid resolution in unit delta: ~s" - r))))))) + (static-error + "keyword" 'term:keyword-out-of-context expr + "invalid use of keyword ~s" (z:symbol-orig-name expr)))) + ((lambda-binding? r) + (create-lambda-varref r expr)) + ((lexical-binding? r) + (create-lexical-varref r expr)) + ((top-level-resolution? r) + (check-for-signature-name expr attributes) + (process-unit-top-level-resolution expr attributes)) + (else + (internal-error expr "Invalid resolution in unit delta: ~s" + r))))))) ; -------------------------------------------------------------------- @@ -1037,7 +1099,7 @@ ; -------------------------------------------------------------------- (define reference-unit-maker - (lambda (form-name sig?) + (lambda (form-name form-name-str kwd:form-name sig?) (let ([micro (let* ((kwd '()) (in-pattern `(_ filename)) @@ -1072,18 +1134,22 @@ #f (z:make-origin 'micro expr)) env attributes vocab) - (static-error filename - "Does not yield a filename")))))) + (static-error + form-name-str kwd:form-name + filename "does not yield a filename")))))) (else - (static-error expr "Malformed ~a" form-name)))))]) + (static-error + form-name-str kwd:form-name + expr "malformed expression")))))]) (add-primitivized-micro-form form-name full-vocabulary micro) (add-on-demand-form 'micro form-name common-vocabulary micro)))) - (reference-unit-maker 'require-unit #f) - (reference-unit-maker 'require-unit/sig #t) + (reference-unit-maker 'require-unit "require-unit" 'kwd:require-unit #f) + (reference-unit-maker 'require-unit/sig + "require-unit/sig" 'kwd:require-unit/sig #t) (define reference-library-unit-maker - (lambda (form-name sig? relative?) + (lambda (form-name form-name-str kwd:form-name sig? relative?) (let ([micro (let* ((kwd '()) (in-pattern '(_ filename collections ...)) @@ -1102,13 +1168,16 @@ collections))) (unless (and (quote-form? f) (z:string? (quote-form-expr f))) - (static-error filename "Does not yield a filename")) + (static-error + form-name-str kwd:form-name + filename "does not yield a filename")) (for-each (lambda (c collection) (unless (and (quote-form? c) (z:string? (quote-form-expr c))) - (static-error collection - "Does not yield a string"))) + (static-error + form-name-str kwd:form-name + collection "does not yield a string"))) cs collections) (let ((raw-f (z:read-object (quote-form-expr f))) (raw-cs (map (lambda (c) @@ -1116,9 +1185,11 @@ (quote-form-expr c))) cs))) (unless (relative-path? raw-f) - (static-error f - "Library path ~s must be a relative path" - raw-f)) + (static-error + form-name-str kwd:form-name + f + "library path ~s must be a relative path" + raw-f)) (expand-expr (structurize-syntax `(let ((result (,(if relative? @@ -1145,15 +1216,21 @@ (z:make-origin 'micro expr)) env attributes vocab)))))) (else - (static-error expr - (string-append "Malformed ~a" form-name))))))]) + (static-error + form-name-str kwd:form-name + expr "malformed expression")))))]) (add-primitivized-micro-form form-name full-vocabulary micro) (add-on-demand-form 'micro form-name common-vocabulary micro)))) - (reference-library-unit-maker 'require-library-unit #f #f) - (reference-library-unit-maker 'require-library-unit/sig #t #f) - (reference-library-unit-maker 'require-relative-library-unit #f #t) - (reference-library-unit-maker 'require-relative-library-unit/sig #t #t) + (reference-library-unit-maker 'require-library-unit + "require-library-unit" 'kwd:require-library-unit #f #f) + (reference-library-unit-maker 'require-library-unit/sig + "require-library-unit/sig" 'kwd:require-library-unit/sig #t #f) + (reference-library-unit-maker 'require-relative-library-unit + "require-relative-library-unit" 'kwd:require-relative-library-unit #f #t) + (reference-library-unit-maker 'require-relative-library-unit/sig + "require-relative-library-unit/sig" + 'kwd:require-relative-library-unit/sig #t #t) (define (reset-unit-attributes attr) (put-attribute attr 'c-unit-link-import/body-vocab null) diff --git a/collects/zodiac/x.ss b/collects/zodiac/x.ss @@ -1,4 +1,4 @@ -; $Id: x.ss,v 1.52 1999/05/31 11:19:39 mflatt Exp $ +; $Id: x.ss,v 1.53 1999/07/09 18:44:34 mflatt Exp $ (unit/sig zodiac:expander^ (import @@ -34,16 +34,16 @@ (opt-lambda (name (root #f) (symbol-error (if root (vocabulary-record-symbol-error root) - "Symbol invalid in this position")) + "symbol invalid in this position")) (literal-error (if root (vocabulary-record-literal-error root) - "Literal invalid in this position")) + "literal invalid in this position")) (list-error (if root (vocabulary-record-list-error root) - "List invalid in this position")) + "list invalid in this position")) (ilist-error (if root (vocabulary-record-ilist-error root) - "Improper-list syntax invalid in this position"))) + "improper-list syntax invalid in this position"))) (let ((h (make-hash-table))) (self-subexpr-vocab (make-vocabulary-record @@ -159,6 +159,7 @@ ; (pretty-print (sexp->raw expr)) (newline) ; (printf "top-level-status: ~s~n" (get-top-level-status attributes)) ; (printf "Expanding~n") (pretty-print expr) (newline) + ; (printf "Expanding~n") (pretty-print (sexp->raw expr)) (newline) ; (printf "Expanding~n") (display expr) (newline) (newline) ; (printf "in ~s~n" (get-vocabulary-name vocab)) ; (printf "in vocabulary~n") (print-env vocab) @@ -175,7 +176,9 @@ (sym-expander (internal-error expr "Invalid sym expander ~s" sym-expander)) (else - (static-error expr + (static-error + "symbol syntax" 'term:invalid-pos-symbol + expr (vocabulary-record-symbol-error vocab)))))) ((or (z:scalar? expr) ; "literals" = scalars - symbols (z:vector? expr)) @@ -188,7 +191,9 @@ (internal-error expr "Invalid lit expander ~s" lit-expander)) (else - (static-error expr + (static-error + "literal syntax" 'term:invalid-pos-literal + expr (vocabulary-record-literal-error vocab)))))) ((z:list? expr) (let ((invoke-list-expander @@ -202,7 +207,9 @@ (internal-error expr "Invalid list expander ~s" list-expander)) (else - (static-error expr + (static-error + "list syntax" 'term:invalid-pos-list + expr (vocabulary-record-list-error vocab))))))) (contents (expose-list expr))) (if (null? contents) @@ -214,7 +221,10 @@ ((macro-resolution? r) (with-handlers ((exn:user? (lambda (exn) - (static-error expr + (static-error + "macro error" + 'term:macro-error + expr (exn-message exn))))) (let* ((rewriter (macro-resolution-rewriter r)) (m (new-mark)) @@ -223,10 +233,9 @@ rewritten expr (list m) #f (make-origin 'macro - expr))) - (expanded (expand-expr structurized env - attributes vocab))) - expanded))) + expr)))) + (expand-expr structurized env + attributes vocab)))) ((micro-resolution? r) ((micro-resolution-rewriter r) expr env attributes (vocabulary-record-subexpr-vocab vocab))) @@ -243,7 +252,9 @@ (internal-error expr "Invalid ilist expander ~s" ilist-expander)) (else - (static-error expr + (static-error + "improper list syntax" 'term:invalid-pos-ilist + expr (vocabulary-record-ilist-error vocab)))))) (else (internal-error expr diff --git a/notes/drscheme/HISTORY b/notes/drscheme/HISTORY @@ -1,5 +1,88 @@ Version 102: +102 + + PRS: + + FUNCTIONALITY CHANGES + + - the help desk language level specific documentation has been + integrated into drscheme. + + MINOR CHANGES AND BUG FIXES + + - Only the platform-specific dialogs are used in drscheme now, on + all platforms. The preference has been removed from the dialog. + +102d10: + + PRS: + + 1461: Kill menu problems + 1460: Help Desk has empty preferences + 1459: search menu items work on empty search text + 1455: project windows never leave `Windows' menu + 1456: teachpacks don't add + 1428: setup -c deletes files for all platforms + 1424: long (list ...) displays don't display correctly + 1405: memory usage box should be read only + 1398: Downloading doc files requires restart + 1377: replacing by empty string loops + 1330: killing repl, then check-syntax hangs + 1144: match docs not setup right in Help Desk + 737: mred:preferences library too global + 599: mac: can't double click to open files while mred starts up + 406: bad error message for sixlib op + + FUNCTIONALITY CHANGES + + - the framework now imports a definition of the preferences + file location. Use this to have a separate preferences file + for each different application. + + - do not use 'drscheme:settings anymore to get the current + language settings from drscheme. Now, use + + drscheme:language:settings-preferences-symbol + + (which is bound to the right symbol) instead. + + - setup plt's ``clean'' info.ss flag does not recur + into subdirectories anymore. + + MINOR CHANGES AND BUG FIXES + + - Added Replace and Find again to edit menu + + - changed `h' shortcut to find and replace again. show keybindings + has no shortcut anymore. + + * Moved the filename and (define ...) popups to the left, swapping with + the Save button. (The popups in the middle of space look strange.) + + * Merged the Project menu with the File menu. + + * Changed the "Configure Language" menu item in the project window to + "Choose Language", to match the menu item in the file window. + + * Add "..." to "Open Project" menu item. + + * Got rid of "Insert Lambda". It's not nearly useful enough to be + worth all the bugs it creates. (Try inserting a lambda by itself and + hit return --- nothing happens. Try (<lambda>) --- bad selection for + the error message.) + + * Give windows for untitled files/projects unique names: "Untitled 1", + "Untitled 2", etc. + + * Fix multiple adjacent separators in the project window's File and + Edit menus. + + * Dropped the old "platform independent" file dialogs, and use + get-file-list for projects. + + * Disabled "Keybindings" menu item when not applicable. + 102d9: NEW DIRECTORY: plt/collects/defaults diff --git a/notes/mred/HISTORY b/notes/mred/HISTORY @@ -1,176 +1,3 @@ - -Version 102/13: - - * Fixed MrEd2k bugs. - -Version 102/12: - - * X: Fixed list-box scrolling. (PR 1435) - - * Windows/MacOS: Made stdio window accept input for the initial input - port (for `read', etc.). - - * Windows: Fixed many MDI problems. - - * Added an optional string-offset argument to dc<%>'s get-text-extent - and draw-text. - - * Changed code for MrEd2k so that it does not rely on interior - pointers. - -Version 102/11: - - * Added `get-file-list', which gives the user a dialog for selecting - multiple existing files (using the platform-specific dialog, where - possible). - - * Added `on-superwindow-show' and `on-superwindow-enable' to - window<%>. - - * Added `on-message' to top-level-window<%>, and added the procedure - `send-message-to-window', which calls the `on-message' method of a - top-level window at a particular screen location. - - * Fixed `draw-bitmap' in post-script-dc%. - - * Fixed post-script-dc% to use PS `curveto' command for splines. - - * Fixed text editor printing to break up lines that are longer than - a page on scroll boundaries. (This is particularly relevant - for printing editors containing embedded editors.) - - * X: Fixed choice item bug when the user pops up the choice and doesn't - select anything. (PR 1426) - -Version 102/10: - - * X: Changed dialogs to use the icon of the dialog's parent (if any). - -Version 102/9: - - * X: Fixed list-box% to handle arbitrarily many list items. (PR 1342) - - * Added pop-down callback initialization argument to popup-menu%, and - added the 'menu-popdown and 'menu-popdown-none event types to - control-event%. The callback is invoked with a 'menu-popdown event - after the callback for a selected item in a popup menu. If the menu - is dismissed with no item is selected, the callback is incoked with - a 'menu-popdown-none event. - - * Added `on-demand' to menu-item-container<%> and - labelled-menu-item<%> for building menu content on demand. The - `on-demand' method of a menu bar is called when the user clicks on - the menu bar, before the click is handled by the menu bar. The - `on-demand' method of a popup menu is called before the menu is - popped up. The default implementation of `on-demand' in a menu item - container calls the `on-demand' method of all of its labelled menu - items (which includes submenus). - - * Windows: fixed `get-font-from-user' when a parent frame is provided. - (PR 1371) - -Version 102/8: - - * Changed pen% width from integer to real number (still between - 0 and 255). Non-integral widths are used for post-script-dc% - drawing. - -Version 102/7: - - * Added `{get,set}-align-top-line' methods to editor-snip%. - - * Added `get-top-line-base' method to text%. - - * Fixed button disabling so that it pops the button back up if the - user is in the middle of a click (PR 1333). Also fixed event - dispatching in the case that `on-subwindow-{event,char}' disables - the target (in which case the event shouldn't be dispatched). - -Version 102/6: - - * Fixed pasting and file-loading with objects that use a style other - than the default one. - -Version 102/5: - - [No notable changes] - -Version 102/4: - - * Fixed page scrolling in editors, I think. (Rewrote it, actually.) - Please report any scrolling behavior that doesn't seem right. (PR - 1174 et al.) - - * Fixed copying for editor-snip%s, incorporating and extending - Robby's fixes. (PRs 1304 and 1305) - - * Hijacked `on-change' method of editor<%>, which wasn't doing anything - useful, to serve a new purpose. - - The new `on-change' is called whenever any change occurs to an - editor that affects the way it is drawn or the values reported for - the location/size of any snip. The `on-change' method is called - just before the editor calls its administrator's `needs-update' - method to refresh the editor's display. The editor is locked for - writing and reflowing during the call to `on-change'. - - (Enables a fix for PR 1171) - - * Added an initializer to string-snip% that accepts a string. - - * Added `call-clickback' method to text%. - - * Editor reading/writing/cuting/pasting used to rely on global - state. Consequently, only one editor could be read/written/etc. at - a time, and exceptions raised during the read/write/etc. (e.g., by - a mischevious snip object) could kill reading/writing/etc. for all - editors in the system. This is fixed; all state resides in the - stream, now. (PR 1201 et al.) - - * Removed `read-done' and `write-done' from snip-class%. - - * Moved `reading-version' from snip-class-list% to snip-class%. - - * Fixed `get-file' and `put-file' interpretation of directory - argument: filename is internally normalized (changing '/' to `\', - etc.). (PR 1238) - - * X: Fixed input of keypad characters and dead characters, such as - accent marks. (comp.lang.scheme and PR 1263) - -Version 102/3: - - * MrEd2k works. - -Version 102/2: - - * Changed the interaction of face and familiy settings in a font for - drawing text. Only one [little-used] method changed its interface - (`get-font-id' in font-name-directory<%>), but the meaning of the - `family' settings in font% and style-delta% objects - changed. Essentially, the family is orthogonal to the face setting, - and it's used whenever an appopriate font can't be found for the - face name. - - the main consquence of the change is that PS printing can be fixed - DrScheme. The style Scheme text just needs to have the 'modern - family in addition to the user-selected face string. - - * Removed `get-afm-name' and `set-afm-name' from - font-name-directory<%>, and changed post-script-dc% to use the - PostScript font name as the AFM file name (prefixed with the AFM - directory and suffixed with ".afm"). - - * Fixed PRs 1286 and 1287 (list-box% problems). - -Version 102/1: - - * Fixed some PS problems (roundoff error with regions), and made - `get-text-extent' return a useful value for the vertical space above - a font. - ----------------------------------------------------------------------- - Version 102: ??, 2000 Changed the interaction of face and familiy settings in a font for @@ -178,6 +5,8 @@ Changed the interaction of face and familiy settings in a font for Removed get-afm-name and set-afm-name from font-name-directory<%>, and changed post-script-dc% to use the PostScript font name as the AFM file name +Added get-margin and set-margin to ps-setup%; post-script-dc% uses + the margins to shrink its paper size and offset its output Changed pen%'s width from integer to real number (used for PS) Added on-superwindow-show and on-superwindow-enable to window<%> Added get-file-list procedure diff --git a/notes/mzscheme/HISTORY b/notes/mzscheme/HISTORY @@ -1,323 +1,3 @@ - -Version 102/13: - - * Added `provide-library', which lets the programmer install a - library-loading procedure for an arbitrary library (if it is not - already loaded). - - * Changed `find-executable-path' to accept #f as its second argument, - and fixed the documentation. - - * Unix: Fixed 'truncate/replace flag to `open-output-file' et al. - (Bug introduced in 102/10.) - - * Windows: `normal-case-path' removes trailing spaces from a filename - (because the Windows API does). - - * Windows: MzScheme recognizes special filenames like "LPT1" as - "files" that might block on I/O (except "NUL", which never - blocks). The `file-exists?' primitive reports #t for all of these - "files", which can be prefixed with any path - even a non-existent - one - and/or postfixed with any file extension or with a single - colon!!! - - * Inside MzScheme: scheme_basic_env(), if called more than once, - resets all threads, parameters, ports, namespaces, and - finalizations. (Useful to MzCOM.) - - * Code maintenance: split some source files, adding builtin.c, - network.c, numarith.c, numcomp.c, numstr.c, objclass.c, portfun.c, - and unitsig.c. - -Version 102/12: - - * Fixed return vaue of `random-seed' (bug introduced in 102/9 or - so). (PR 1434) - - * Fixed handling of file output ports on exit: file is flushed and - closed. (Bug introduced in 102/10.) - - * Changed code for MzScheme2k so that it does not rely on interior - pointers. - -Version 102/11: - - * Added `interface->ivar-names', which takes an interface and returns - a list of symbols for the interface's ivar names. - - * Added 'update to the set of flags for `open-output-file' et al. - 'update mode opens an existing file without truncating it, and - allows overwriting of the file's existing data, especially in - combination with `file-position'. - - * Fixed a bug in interface checking. In an `interface' expression, an - ivar declaration for some name was allowed when a superinterface - already contained the ivar name through a derivation - requirement. It now raises an exception. - - * Added -k <n> <m> flag to MzScheme, which loads code embedded in the - executable from file position <n> to <m>. This flag will be useful - for creating stand-alone executables by appending code to the - normal MzScheme/MrEd executable. Details in a forthcoming mzc - update. (This is something of a hack, but I think it will be - useful.) - - * Fixed `arithmetic-shift' for a -32 shift argument. (PR 1421) - - * Inside MzScheme: - - - Not all import ports keep line counts anymore (it's wasteful for - programs using block I/O on binary data, and it's mostly useful - only with `load'). -1 returned from scheme_tell_line() indicates - that line counts are not ketp. scheme_count_lines() enables - line-counting for an input port. Note that there's no MzScheme - primitive that provides line information. - -Version 102/10: - - * Switched to `configure'-based Makefiles (autoconf). See - plt/src/README, and use plt/src/configure. - - * Added `process[*]/ports', which is like `process[*]', but it takes - three file-stream ports to use for the subprocess's stdio streams: - an input port for the process's stdin, and output ports for the - process's stdout and stderr. - - If #f is provided for one of the streams, then `process[*]/ports' - makes a pipe and return the other end for the corresponding stream, - as for `process[*]'. But when a port is provided for a particular - stream, `process[*]/ports' does not create the corresponding pipe, - and instead use the given port, returning #f for that stream. - - If a provided port is not a file-stream port (created by - `open-input-file' or `process[*][/file-ports]', or one of the - original stdio ports), then an exception would be raised. - - * Added `file-stream-port?', useful with `process[*]/ports' and - `file-position' (which requires a file-stream port for changing the - position). - - * Changed `read-string!' to `read-string-avail!', which reads only as - many characters as are immediately ready, blocking only if no chars - are available. (The old `read-string!' can be efficiently - implemented with the new one.) - - In the current `read-string!' (and `read-string'), characters can - be lost if the read gets a few and then encounters a read - error. The `read-string-avail!' procedure does not have this - problem, because an error after reading at least one character is - treated like blocking. (The error will be ignored, to be triggered - on the next read.) - - * Added `read-string-avail!/enable-break', to be used in a context - where breaks are disabled. The guarantee is that either the read - gets all the characters it can and returns, or it raises an - exception (possibly a break exception) without reading any - characters. - - * Added `write-string-avail' and `write-string-avail/enable-break', - which are analogous to `read-string-avail!' and - `read-string-avail!/enable-break'. - - The return value in the non-exception case is the number of chars - that could be written (and flushed) immediately. If no characters - can be written, it blocks until at least one can be. - - As with `read-string-avail!', an error after writing at least one - character is treated like blocking. (Output mechanisms like `write' - and `display' can still fumble characters.) - - The `write-string-avail' procedure works on all output port types, - but it is not especially effective for FILE*-based ports (like most - ports in Windows and MacOS); to guarantee succesful flushing, only - one character can be writte. The procedure is especially effective - for TCP and fd-based ports (like most ports in Unix, now). - - * Unix: changed MzScheme's `open-input-file' and `open-output-file' - (etc.) to use fd-based ports instead of FILE*-based ports. This - change gives MzScheme finer control over input and output; it makes - sense now that fd-based ports have been tested for a few months. - - * Fixed regexp to work with `-' as the last character in a `[...]' - pattern. (The bug was introduced in 102/8.) (PR 1381) - - * Fixed a bug in `open-output-file' that could cause a file-exists - failure even when the 'truncate or 'replace flag is spcified. (PR - 1309) - - * Fixed the error-handling subsystem to properly handle error - messages containing a non-terminating nul character (e.g., due to - including in an error message a string argument that contained a - nul). - - * Inside MzScheme: - - - Added scheme_register_static(), which is like - scheme_register_extension_global(), but it only registers the - given location if the collector does not know how to find static - variables anyway. (This is true for precise GC, Senora GC on - many platforms, and the regular GC under Windows when a flag is - set as described below). - - - Provided a way to fix the GC--thread problems under Windows. If - an embedding application is willing to explicitly register its - static variables with scheme_register_static(), then set the - GC_use_registered_statics variable to 1 before calling a - MzScheme or GC function. Then, then collector will not try to - scan all active pages to find globals (which can crash if a - separate Windows thread unmaps a page while the collector is - running), and instead only collect from the registered static - variable locations. - - The standalone versions of MzScheme and MrEd for Windows both - use this new GC mechanism. - - - Changed scheme_get_chars to include a new last argument: an - offset into the string. - - - Added embedding-settable function scheme_console_output, which - is used to report errors that were not handled correctly by the - normal mechanisms. - - - Restricted the format string accepted by scheme_signal_error, - scheme_raise_exn, and scheme_warning, but also added format - directives to handle non-terminating nul characters in strings. - - * Added `mergesort' to MzLib's function.ss. - -Version 102/9: - - * Added immutable strings and pairs, with `string->immutable-string' - and `pair->immutable-pair'. A string generated by `read' is now - immutable, but pairs from `read' are still mutable. - - The strings and lists available from parameters like - `current-directory' and `current-library-collection-paths' are now - immutable, which motivated the change. Otherwise, a thread might - change the current directory of a different thread by mutating the - string returned by `current-directory'. Similar problems could - occur via mutations to strings returned by GUI objects in MrEd. - - * Changed `time-apply' to return four values --- including the gc - time --- and changed its arguments to be like `apply', where the - new second argument to `time-apply' is a list of arguments to - supply to the function that is the first argument to - `time-apply'. (The generalization that allows a number of non-list - argument followed by a list is not supported by `time-apply'.) - - The `time' syntactic form is unchanged (but its expansion is - different). - - * Added 'exec-file flag to `find-system-path', which returns the path - of the current executable as started by the OS. (The same path is - initially bound to `program' in MzScheme and MrEd.) - - * Fixed .zo writing to use indices for built-in primitives (as in - 53), instead of names (as, due to a bug, in 101). This fix shrinks - the size of a .zo file by 20% on average. - - * Fixed missing `volatile' annotations, which were needed to make - MzScheme work with gcc 2.95.2 on Sparc. - -Version 102/8: - - * (angle 0.0) is 0, and (angle -0.0) is pi. This is consistent with - the distinction between 0.0+0i and 0.0+0.0i, and with the notion of - 0.0 as "infinitesimally small". Also, fixed (angle +nan.0). - - * (expt 0 x) raises divide-by-zero if x is negative (instead of - returning 0), and returns +nan.0 if x is +nan.0. - - * Fixed `regexp' and friends to work on strings (patterns and - targets) that contain null characters. (PR 1350) - - * Added `tcp-addresses', which takes a TCP port and returns two - strings: the connection's local address and the connection's peer's - address. - -Version 102/7: - - * Fixed interaction of `peek-char' and `file-position' (PR 1318). - - * Fixed `close-output-port' so that it flushes stream ports (stdout, - stderr, and process ports). - - * Fixed `custodian-shutdown-all' to force-close a blocking output - stream (unflushed data is lost). - - * Replaced 'generic-failure as a `detail' in `exn:i/o:filesystem' - with #f. Could change to a list later, if there is still strong - interest. - -Version 102/6: - - [No changes] - -Version 102/5: - - * `with-input-from-file' and `with-output-to-file' close the port - when control leaves the dynamic extent of the call (either - normally, through an exception, or through a general continuation - jump). - - * Added a `detail' field to `exn:i/o:filesystem'. This is a - compromise between the version 53 exn system, which was too - detailed, and the version 101 system, which doesn't provide enough - information (e.g., to implement `make-temporary-file'). - - The value of the `detail' field is currently either - 'ill-formed-path, 'already-exists, 'wrong-version, or - 'generic-failure. This set may be expanded in the future, such that - some generic failures turn into specific failures. - - * Changed output to stdout, stderr, and process ports to use - non-blocking mode while actively writing only. This avoids clashes - among Unix programs that use the same output device, because - setting a descriptor to non-blocking sometimes means making the - entire asscoaited device non-blocking (for all programs, for both - input and output!). - - * Added `square' to functio.ss. - -Version 102/4: - - * Fixed number reader to allow +inf.0, -inf.0, and +nan.0 in complex - constants. For example, +inf.0-inf.0i is now a legal constant. To - some degree, this fix was necessary to ensure that all printable - numbers are readable, and has been on my queue for a long time. - - * To simplify (in a way) MzScheme's number syntax, fixed bugs in - number reader for hexadecimal numbers containing `.' and/or - `s'/`l'-based exponents. Prompted by PR 823. - - This change supports some interesting number representations, to - say the least. One of my favorites is `#e#x+e.s+e@-e.l-e'. - - * Found and fixed some subtle bugs in detecting exact-zero cases - (such as 0@7.0) and in reporting divide-by-zero cases (such as - 1/0@0). - -Version 102/3: - - * Precise GC fixes - -Version 102/2: - - * Fixed `kill-thread' on a thread that hasn't performed any work, - yet. - - * Fixed scheme_make_integer_value() on the boundary case (2^31). - - * MzScheme2k: fixed numerous bugs. - -Version 102/1: - - * Added `read-decimal-as-inexact' parameter, which controls how - numbers containg a decimal or exponent are interpreted by `read' and - `string->number' when an explicit exactness tag is not present. The - default is #t, which means parse as inexact (normal behavior). #f - means parse as exact. - Version 102, ??, 2000 Switched to configure-based makefiles (autoconf) with-input-from-file and with-output-to-file close the port when diff --git a/notes/stepper/DESIGN-NOTES b/notes/stepper/DESIGN-NOTES @@ -482,5 +482,25 @@ Okay, time to do units. Compound units are dead easy. Just wrap them in a wcm (define c c) ...) +************ + +Well, I still haven't written the code to annotate units, so it's a damn good thing +I wrote down the transformation. I'm here today (thank you very much) to talk about +annotation schemes. + +I just (okay, a month ago --- it's now 2000-05-23) folded aries into the stepper. the +upshot of this is that aries now supports two different annotation modes: "cheap-wrap," +which is what aries used to do, and the regular annotation, used for the algebraic +stepper. + +However, I'm beginning to see a need for a third annotation, to be used for (non- +algebraic) debugging. In particular, much of the bulk involved in annotating the +program source is due to the strict algebraic nature of the stepper. For instance, +I'm now annotating lets. The actual step taken by the let is after the evaluation +of all bindings. So we need a break there. However, the body expression is +_also_ going to have a mark and a break around it, for the "result-break" of the +let. I thought I could leave out the outer break, but it doesn't work. Actually, +maybe I could leave out the inner one. Gee whiz. This stuff is really complicated. + diff --git a/readme-mac b/readme-mac @@ -0,0 +1 @@ +This is the PLT software package folder for MacOS.IMPORTANT: After unpacking this distribution, run the Setup PLT application in the plt folder.Applications------------The following are the applications: DrScheme -- the Scheme development environment DrScheme Jr -- a text-only version of DrScheme MzScheme -- a text-only Scheme interpreter MrEd -- a graphical Scheme interpreter mzc -- a Scheme compiler Help Desk --- for Help (also built into DrScheme)DrScheme relies on MrEd (i.e., the DrScheme application launchesMrEd with special startup instructions), and DrScheme Jr and mzc relyon MzScheme. You may not have some of these applications, dependingon which distribution you downloaded.Compiling---------If you downloaded the source code distribution instead of the standarddistribution, you must compile MzScheme and MrEd before using the PLTsoftware (including DrScheme). For compilation instructions, unpack the Compactor archiveplt:src:cw.sit.hqx, producing plt:src:cw. Read the README file inplt:src:cw.If there is no plt:src:mzscheme folder, you did not downloadthe source code distribution. In that case, you should be ready torun.License-------PLT SoftwareCopyright (c) 1995-99 PLTPLT software is distributed under the GNU Library General PublicLicense (LGPL). This means you can link PLT software (such asMzScheme or MrEd) into proprietary applications, provided you followthe specific rules stated in the LGPL. You can also modify PLTsoftware; if you distribute a modified version, you must distribute itunder the terms of the LGPL, which in particular means that you mustrelease the source code for the modified software. Seenotes/COPYING.LIB for more information.More Information----------------For further information, select `Help Desk' from DrScheme's `Help'menu, or run Help Desk. +\ No newline at end of file diff --git a/src/configure b/src/configure @@ -1039,11 +1039,14 @@ fi if test "$AS" = '' ; then AS=as + as_was_set=no +else + as_was_set=yes fi # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1047: checking for $ac_word" >&5 +echo "configure:1050: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1084,7 +1087,7 @@ fi # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1088: checking for $ac_word" >&5 +echo "configure:1091: checking for $ac_word" >&5 if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else @@ -1119,7 +1122,7 @@ if test "${enable_mred}" = "yes" ; then # 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 -echo "configure:1123: checking for X" >&5 +echo "configure:1126: checking for X" >&5 # Check whether --with-x or --without-x was given. if test "${with_x+set}" = set; then @@ -1181,12 +1184,12 @@ if test "$ac_x_includes" = NO; then # First, try using that file with no special directory specified. cat > conftest.$ac_ext <<EOF -#line 1185 "configure" +#line 1188 "configure" #include "confdefs.h" #include <$x_direct_test_include> EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1190: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1193: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out` if test -z "$ac_err"; then rm -rf conftest* @@ -1255,14 +1258,14 @@ if test "$ac_x_libraries" = NO; then ac_save_LIBS="$LIBS" LIBS="-l$x_direct_test_library $LIBS" cat > conftest.$ac_ext <<EOF -#line 1259 "configure" +#line 1262 "configure" #include "confdefs.h" int main() { ${x_direct_test_function}() ; return 0; } EOF -if { (eval echo configure:1266: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1269: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* LIBS="$ac_save_LIBS" # We can link X programs with no special library path. @@ -1368,17 +1371,17 @@ else case "`(uname -sr) 2>/dev/null`" in "SunOS 5"*) echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6 -echo "configure:1372: checking whether -R must be followed by a space" >&5 +echo "configure:1375: checking whether -R must be followed by a space" >&5 ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries" cat > conftest.$ac_ext <<EOF -#line 1375 "configure" +#line 1378 "configure" #include "confdefs.h" int main() { ; return 0; } EOF -if { (eval echo configure:1382: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1385: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_R_nospace=yes else @@ -1394,14 +1397,14 @@ rm -f conftest* else LIBS="$ac_xsave_LIBS -R $x_libraries" cat > conftest.$ac_ext <<EOF -#line 1398 "configure" +#line 1401 "configure" #include "confdefs.h" int main() { ; return 0; } EOF -if { (eval echo configure:1405: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1408: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* ac_R_space=yes else @@ -1433,7 +1436,7 @@ rm -f conftest* # 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 dnet_ntoa in -ldnet""... $ac_c" 1>&6 -echo "configure:1437: checking for dnet_ntoa in -ldnet" >&5 +echo "configure:1440: checking for dnet_ntoa in -ldnet" >&5 ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1441,7 +1444,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet $LIBS" cat > conftest.$ac_ext <<EOF -#line 1445 "configure" +#line 1448 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -1452,7 +1455,7 @@ int main() { dnet_ntoa() ; return 0; } EOF -if { (eval echo configure:1456: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1459: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1474,7 +1477,7 @@ fi if test $ac_cv_lib_dnet_dnet_ntoa = no; then echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6 -echo "configure:1478: checking for dnet_ntoa in -ldnet_stub" >&5 +echo "configure:1481: checking for dnet_ntoa in -ldnet_stub" >&5 ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1482,7 +1485,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldnet_stub $LIBS" cat > conftest.$ac_ext <<EOF -#line 1486 "configure" +#line 1489 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -1493,7 +1496,7 @@ int main() { dnet_ntoa() ; return 0; } EOF -if { (eval echo configure:1497: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1500: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1522,12 +1525,12 @@ fi # The nsl library prevents programs from opening the X display # on Irix 5.2, according to dickey@clark.net. echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6 -echo "configure:1526: checking for gethostbyname" >&5 +echo "configure:1529: checking for gethostbyname" >&5 if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1531 "configure" +#line 1534 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char gethostbyname(); below. */ @@ -1550,7 +1553,7 @@ gethostbyname(); ; return 0; } EOF -if { (eval echo configure:1554: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1557: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_gethostbyname=yes" else @@ -1571,7 +1574,7 @@ fi if test $ac_cv_func_gethostbyname = no; then echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6 -echo "configure:1575: checking for gethostbyname in -lnsl" >&5 +echo "configure:1578: checking for gethostbyname in -lnsl" >&5 ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1579,7 +1582,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lnsl $LIBS" cat > conftest.$ac_ext <<EOF -#line 1583 "configure" +#line 1586 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -1590,7 +1593,7 @@ int main() { gethostbyname() ; return 0; } EOF -if { (eval echo configure:1594: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1597: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1620,12 +1623,12 @@ fi # -lsocket must be given before -lnsl if both are needed. # We assume that if connect needs -lnsl, so does gethostbyname. echo $ac_n "checking for connect""... $ac_c" 1>&6 -echo "configure:1624: checking for connect" >&5 +echo "configure:1627: checking for connect" >&5 if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1629 "configure" +#line 1632 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char connect(); below. */ @@ -1648,7 +1651,7 @@ connect(); ; return 0; } EOF -if { (eval echo configure:1652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1655: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_connect=yes" else @@ -1669,7 +1672,7 @@ fi if test $ac_cv_func_connect = no; then echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6 -echo "configure:1673: checking for connect in -lsocket" >&5 +echo "configure:1676: checking for connect in -lsocket" >&5 ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1677,7 +1680,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lsocket $X_EXTRA_LIBS $LIBS" cat > conftest.$ac_ext <<EOF -#line 1681 "configure" +#line 1684 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -1688,7 +1691,7 @@ int main() { connect() ; return 0; } EOF -if { (eval echo configure:1692: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1695: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1712,12 +1715,12 @@ fi # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX. echo $ac_n "checking for remove""... $ac_c" 1>&6 -echo "configure:1716: checking for remove" >&5 +echo "configure:1719: checking for remove" >&5 if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1721 "configure" +#line 1724 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char remove(); below. */ @@ -1740,7 +1743,7 @@ remove(); ; return 0; } EOF -if { (eval echo configure:1744: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1747: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_remove=yes" else @@ -1761,7 +1764,7 @@ fi if test $ac_cv_func_remove = no; then echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6 -echo "configure:1765: checking for remove in -lposix" >&5 +echo "configure:1768: checking for remove in -lposix" >&5 ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1769,7 +1772,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lposix $LIBS" cat > conftest.$ac_ext <<EOF -#line 1773 "configure" +#line 1776 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -1780,7 +1783,7 @@ int main() { remove() ; return 0; } EOF -if { (eval echo configure:1784: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1787: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1804,12 +1807,12 @@ fi # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay. echo $ac_n "checking for shmat""... $ac_c" 1>&6 -echo "configure:1808: checking for shmat" >&5 +echo "configure:1811: checking for shmat" >&5 if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 else cat > conftest.$ac_ext <<EOF -#line 1813 "configure" +#line 1816 "configure" #include "confdefs.h" /* System header to define __stub macros and hopefully few prototypes, which can conflict with char shmat(); below. */ @@ -1832,7 +1835,7 @@ shmat(); ; return 0; } EOF -if { (eval echo configure:1836: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1839: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_func_shmat=yes" else @@ -1853,7 +1856,7 @@ fi if test $ac_cv_func_shmat = no; then echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6 -echo "configure:1857: checking for shmat in -lipc" >&5 +echo "configure:1860: checking for shmat in -lipc" >&5 ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1861,7 +1864,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lipc $LIBS" cat > conftest.$ac_ext <<EOF -#line 1865 "configure" +#line 1868 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -1872,7 +1875,7 @@ int main() { shmat() ; return 0; } EOF -if { (eval echo configure:1876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1879: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1905,7 +1908,7 @@ fi # libraries we check for below, so use a different variable. # --interran@uluru.Stanford.EDU, kb@cs.umb.edu. echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6 -echo "configure:1909: checking for IceConnectionNumber in -lICE" >&5 +echo "configure:1912: checking for IceConnectionNumber in -lICE" >&5 ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1913,7 +1916,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lICE $LIBS" cat > conftest.$ac_ext <<EOF -#line 1917 "configure" +#line 1920 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -1924,7 +1927,7 @@ int main() { IceConnectionNumber() ; return 0; } EOF -if { (eval echo configure:1928: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1931: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -1959,7 +1962,7 @@ else fi echo $ac_n "checking for cos in -lm""... $ac_c" 1>&6 -echo "configure:1963: checking for cos in -lm" >&5 +echo "configure:1966: checking for cos in -lm" >&5 ac_lib_var=`echo m'_'cos | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -1967,7 +1970,7 @@ else ac_save_LIBS="$LIBS" LIBS="-lm $LIBS" cat > conftest.$ac_ext <<EOF -#line 1971 "configure" +#line 1974 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -1978,7 +1981,7 @@ int main() { cos() ; return 0; } EOF -if { (eval echo configure:1982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:1985: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2006,7 +2009,7 @@ else fi echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6 -echo "configure:2010: checking for dlopen in -ldl" >&5 +echo "configure:2013: checking for dlopen in -ldl" >&5 ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'` if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then echo $ac_n "(cached) $ac_c" 1>&6 @@ -2014,7 +2017,7 @@ else ac_save_LIBS="$LIBS" LIBS="-ldl $LIBS" cat > conftest.$ac_ext <<EOF -#line 2018 "configure" +#line 2021 "configure" #include "confdefs.h" /* Override any gcc2 internal prototype to avoid an error. */ /* We use char because int might match the return type of a gcc2 @@ -2025,7 +2028,7 @@ int main() { dlopen() ; return 0; } EOF -if { (eval echo configure:2029: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then +if { (eval echo configure:2032: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then rm -rf conftest* eval "ac_cv_lib_$ac_lib_var=yes" else @@ -2075,13 +2078,22 @@ fi ############## platform tests ################ +if test -x "/bin/uname" ; then + UNAME=/bin/uname +elif test -x "/usr/bin/uname" ; then + UNAME=/usr/bin/uname +else + echo configure: cannot find uname + exit 1 +fi + # for flags we don't want to use in config tests: EXTRALIBS= -OS=`uname -s` +OS=`$UNAME -s` case $OS in SunOS) - case `uname -r` in + case `$UNAME -r` in 5.*) if test "${enable_osthreads}" = "yes" ; then OPTIONS="${OPTIONS} -DSOLARIS_THREADS" @@ -2147,7 +2159,19 @@ case $OS in fi ;; *) - echo "Warning: Unknown OS" + ;; +esac + +MACH=`$UNAME -m` +case "$MACH" in + alpha) + if test "$CC" = "gcc" ; then + if test "$as_was_set" = "no" ; then + AS="gcc -c -x assembler-with-cpp" + fi + fi + ;; + *) ;; esac @@ -2163,7 +2187,6 @@ if test "${enable_sgcdebug}" = "yes" ; then OPTIONS="$OPTIONS -DSGC_STD_DEBUGGING=1" fi - ############## C++ grunge ################ MROPTIONS= @@ -2180,12 +2203,12 @@ cross_compiling=$ac_cv_prog_cxx_cross msg="whether new and new[] are different" echo $ac_n "checking $msg""... $ac_c" 1>&6 -echo "configure:2184: checking $msg" >&5 +echo "configure:2207: checking $msg" >&5 if test "$cross_compiling" = yes; then { echo "configure: error: can not run test program while cross compiling" 1>&2; exit 1; } else cat > conftest.$ac_ext <<EOF -#line 2189 "configure" +#line 2212 "configure" #include "confdefs.h" #ifdef __cplusplus extern "C" void exit(int); @@ -2198,7 +2221,7 @@ extern "C" void exit(int); return (new C) == (new C[10]); } EOF -if { (eval echo configure:2202: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null +if { (eval echo configure:2225: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null then different=yes else @@ -2219,16 +2242,16 @@ fi # then try adding -fpermissive if test "$CC" = "gcc" ; then echo $ac_n "checking whether need to use -fpermissive""... $ac_c" 1>&6 -echo "configure:2223: checking whether need to use -fpermissive" >&5 +echo "configure:2246: checking whether need to use -fpermissive" >&5 cat > conftest.$ac_ext <<EOF -#line 2225 "configure" +#line 2248 "configure" #include "confdefs.h" #include "X11/Intrinsic.h" int main() { ; return 0; } EOF -if { (eval echo configure:2232: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:2255: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* addperm=no else diff --git a/src/cw.sit.hqx b/src/cw.sit.hqx @@ -1,2085 +1,1848 @@ (This file must be converted with BinHex 4.0) -:"Q0h,R0TG!"6593e8dP8)3%!!!'(#J#3"5C6G(9QCNPd)#KM+6%j16FY-6Nj1#" -"E'&NC'PZ)&0jFh4PEA-X)%PZBbiX)'KdG(!k,bphN!-ZB@aKC'4TER0jFbjMEfd -[8h4eCQC*G#m0#KS!"4!!!BF+!*!$FJ!"!*!$FNSV$D@P8Q9cCA*fC@5PT3#PN!3 -"!!!b!%#e6(NLY8aj*3#3$3*qP!#3!mJ!#rje!!''3J!EBhF!!#Ga!#3!%!-3""! -$i!'9!6N""rrirr$$3!!!J!#3"k@3"!%!!$S!%+e,T$'e4EH[!*!$FJ!!"L`!N!0 -b!!V8RJ!!#-m!!!23!*!%$`""3Np99#"08N9%!!&BZ94&@&4$9dP&!3lrN!3!N!U -!!*!*!CS!!!%S!*!%$`"#`G5[2mDK(4,b26V45VZH1MX*G3KCZMY0kQHkTQZRrP$ -H*AZZdcf,0!)MKlaYE(E'IEU@e$5bi#TieT8IEli(83V16,4l*r!AQajYcM00q-p --`XEYL9l[IlJM2T3DKImATN)bRp,eF[CL$f9G,P`8MQcDrcV&-c'2@r0UhSK9kp[ -NPMl-"c(ddIANEpD"SDI,BqYqcqP2R#&T)4,dY,0Y11Nd`*!!9HDQQI89"I(r$Am -qUPpc&3[YN!!X(Uq4XNq!-FhXa%19"A6!UN2a45NS(mLiS-b'cI$KIp#e69Q6fAm -q4@`1jZ0N8Ydme,RL@X@D21fH3(aTjhrJCiT5Q4G'&r4%h(+d)%f##"L*pDdekC% -TdGDNFX@1FkJ13a!(bC'ASUb,T'0RT(HJ3X(8lbX$RliL58*c0C&$Q,hhXka"H', -[M%Ie)9G9Q!@"rfpcJ!)'SJ,@")Md$CXEX8+UBhhSEij4m(1*`F'4*R46j*ZhHN# --@2iifYhlABJpqa5###53!%`)21$[rbipI6'p2b6lQQ)r%`Y,0DjPk,jiDK$YjFE -FDLI8id&p6+Geh@lE"%*@QV(,M29p2p!%dD1)"F%,JHq"XDk'i0&K$pA)T#MPZPZ -VFTjb`&6pr+RGMf!eU%TZ6&%YFl5)"%0mKaimHa8cd@%[29D2*kN)$GRY3%CfT[3 -83#A[IMR-akirQm8dM9HEK'SJPN2b2Z"IXjd,#1J32NNKT#kAi,lSX'&%j[,3VJ` -l9Q"Tbjc,*PYhQG'I82r'q*2)1rECLF$)EHq61a3B!0c&aATbC,RV!b)#1"hhZI$ -&LSYkbMH"c2ALFD"F2EjTj9%$8RATQFL4+Z*V6YF,1jdFYLdI25fVj'aiK(ET#'P --+Ea%e+VHb#lTVr9c3N8,`Y)jl""c#Nk)0mTr)$D106"qQS(4+,FS[i6Z+YXEI2m -kU3FfjRej9EbfjB"b6*PaD$9D,c9dUEZARl2Xk!Cr6dh!LHd0rrJD&bLkhJI`,c! -U!VPaqH%f(LUr&KK[mCjeC)Ud56MqEci8JkGH&212h-BF'`GhZ9B#@E'0biXe[b- -#kQ8raMX[V"KkADRVGmCfj2G-TifFr@P,PLZ$K!@N%p`E&UA"0H0Uac80-NDS@'p -r*$$d2m3KY8c6Y&$T$,eV)Pi#q*+GZ+YK6[5CcI'6%+f[Q3-XkFZ5-EqI4NYhed5 -"%AK%jfk0fY(bmEj9kiJ-d&+rTTaFSUkZqG)'&(qM@U!rN!"raUj+e+RiCj21jRN -U55'U`LB5"6pdN!$0+F6!#lk)9eXG4'R$lm'3!2a&DYl38YjcQ8JjYHd*cI3S`8r -lbR,R)1Z`,Ni1K*3$hCLSi$SlYiM6(E5idTT$EC!!#BR53!N'm3V'9l$l@&qVF4G -3hSX`jf-(BfdVchFDKSL%Bi2#CDq)mV(r,Tjc)0cfX$96BBaeQJEkSB(1m#FE4)c -+Df`8`N"dAbFM`SrpmIdmEe-AqQjm34*X"e'"fjJ)mTKB,m#jT*-"eC+pSb-TDr# -@cIaZSRK6m4Ja4b*'hF(GF*TN%RUTGEB0cfGQYJ)0"8*`34Uq,4IG*i'AYchR+fF -L9N#iF3NUMPib0$K&IGCSqjb+6*H144&!V5B($YcEM'pkkmi8jS*Nq`@c[TBLZ1@ -CP*f5P-1eF[EpDP)'GYMII8U"d(hH2@iep+Q8&##jDmI*J3qHb,R$kS['UVJ!TC! -%!3!!2J!3Vb#m0,9&YqB!N!2)!!!22`#3!h)!$REE!!!9b3!!"k-!N!32!%&#6e9 -8)%eD8d0)48e&!!&D%94&@&4$9dP&!3lrN!3!N!U!!*!*!CS!!!%!N!82!%,"e01 -,imq2'(ZEN!"d-TR9kMYr8(4hK[De(pPhB2DFh1&L(%(!PQkj,d1@U4bULE)pK)Z -m#aTEQ`eE,3*(VMJGl[k1$Y&[+S6F9Z)%JAlMqmXPZRkC*a8Sa3BdmqC3l``L3#' -$"B2,a9dGKF*Bi6J9j(Cb5p[6&e2RrMJQM!H#mbMDB9RM2Ccb*NMj#,fF6kNq2Dc -3I%&DeZH'$KlXV*Z9UKNLTJcBjLP+j*KbHV9bmiR$$KH2AQBTpNrAk+!*HP%*ZA0 -1H&UDYGI(N!"AiA``rDCV5TmD@FBrZX-,(q[[%%S4pN*4U4X1%XYpN!#re2Ar4-E -dF"YjDbp-XNEem2[HGI"#`G5!iNPIj#K@3%$Z4!X(L-0,6NmRRBJqMR19J0NHC+Y -[lTT`N43H$`Lrf&i!h(k1V64mi!F!Jl4382jM`EBTB4qP*lI3$N8"mNUQb81dF-' -la)9-+0!2MUmEB9,CkQYAGNjSUj`KJFJ@M5X#@@-lFS'&ZGh9DB%!@"Z&*L$"5+! -X$XRc0Pl6XrDUpp,"dQM"81q9aAheEINcm2A`++qFc%SV83cb+dqB(-IpZqad6J& -IKl+rkJcpKab''48&CUjP6#meDk2Gd&9bkI8J"f#Lq8lqA1d[LZkE`)&D3-rAAHA -kJ2H8XJdU!Z'-Yk8E4&S`l2PI`)iIehKQMEkRNUC)RqK)IlUJ@GH!$qdSL@EUNhK -RrJ[jh'e1mLeTF&b1TKB#6&bRqc5HHF[a02SCjV+#J9b(ic4H`[#c"T&1+T!!9[C -LD(6NYc8fDkr92iUNq@+i*6qH2#*LK@j(@fb#MbbZ*[jSUCDa*N`r[pikU,5ape* -QrI1R"VJB9LVhbc45i*@)PU1UAD"S28TQ9l#'+a!Z`&Y5j&rEP'205TG$bPBIbf, -qfC-"E4C'LXRL&NF+N@*@C(p)UR*$8a(3#mkP'aXeHZb%Q+KdNYY-i)fV[jj2r+F -CHckYhrMPD@Tk&8I,0(Y4[BmAGRIcM6l)3'&aFqh20cd"DMENY6A&$3fMRiVPBlr -`QfrGEB)aaJS-LR9C5&VFXFfN4m"Ti6PYFm5N&U'#!Na5kC2jlI3dT!R$q%#-h@$ -aT[J%M+cE3N-lFBLA(jREhd@['*Bb0Xkj2EL3!%,R9K'PP*,cF4d51PU8([RVB&i -P&l`JTmYKpQ"bP3"NE-VJE450AY`Xi+MRENKhJTJd#mBA,c'dAXBNQ,D@TMX6+r( -(#+`S2X04`i#cmE$+2-hU`p8@(S&c*'U,Q@P&Pa6+r(,AAPFCE&+ZaRTjjiCrmZ` -U%,N9Jk3+eZT0A%!'qESM(pTM2e@N,A[Q,+CU9h&4!M308J&Z0iCB1S[JCflI%E% -a"K@Le[CN!q45G59(E5P*hBkH#pM&[lN((Hjjm%jJJYbQpFb1!hB`i#`dLK5(TEF -BV-35dqI"mEY6)['8iq*$UeA3YEC%MA4PM&ZefJ-VIG1F@#JcAlj@9bdLiTGiR%@ -d6im&)Fl&``N6p[qe*d)c!efqbDpY5QDTYX"5eNCBjB3CAGD9jL(q4LYpJ$l1D$8 --lAAXm8`1E-,re3Z,1ICZkPjc%Dp,Nq-G1'a4AS6)88TlTJk-Dj26PKmMk`2F&!B -DRD14r!VNkQG2kGVLY5JdP!5NBH&4UN3mkqBaEM0Gq2#a*p`H4K2#aSS%mFGMMUB -[IGjb+4[m2B)rjlQVGRN)IrcGi#9-GD@PfmUPfB[4`Q"8K"Fb[4iQ(rYKCX(FD`# -er"$,&`DaGbCF)'Ya)b'reLlT62IP''Xl*"G@8jq8U*4VkA8h(-c0G1LTZ"&![qP -i[@BECY@l1$req+*2I1aJ4)XfFP1@4-DUZ-IlY%d5k%Zb#%JY93)%!i+L8'5Zlki -L2"Lk43dracUKi-&$hmSJ6+2*934AKZ9QUYaL+1j-"!N(P'MU`,"Km)JB3KjC8S2 -l`Nl1K@5(MAHC@T!!0`qV6l&SA[5GGSM[X49!m$M1kYNd,B@$mBj[mfF%0B6`eac -0J--Cb$'2ddq@'8!!,4EY20CccCU)I6&h6A$mjA*TTSD1-3mpe5-#l(laC9B+*Yf -+XV6LVDS[P4PXVDhadm($#Yil-+cP[I0ri24I3h(Ph@U!+I"rL1E05ARQNGMVC%` -c(Y5'!@mX*0&N!5%ANVp4R"[(q)#JV'cSdfA+VSd3Aj[eBXG(4L+qGq`VYN1'mNG -D*4RbP$ja[$@LLS1#IJVVCbJS)I[i6S&RLm*BY+6qUMPCY0R&!6F$bQ1dqmU4#@i -R)+mf&R8@h,V@N!#c(JC98@p8IH3q!PSGHb`05H5jIacI"YE-p*Q4AZaCcLaaj-C -e$L6p)M4Xh60`ab4'Z@r#ZB,$LYANXUP4(5SQhK*6GdpSj@mpf%fpcl(5ZfF,3c* -h('-1prG8C@(GFJp0ibBUaXPY9VqhIIbf"`Z+ZG)c&h+Mj5f0+JK,F$Rb"Dc5iR@ -('A#m'Rc!r2L,6PLpIV!@Y+c0J,V4BCQQe!K"[X,(@VkkHQP,++,i)"VE4AHRje) -c'llh`&iVJBbcp(r1ZmTLk,UdASHlV%`9mLrDU(X*EUia3S*6rNJ66c3[aH)i#)C -E4H#pNhq0EM9h[(,%*+RraA!C#5pjIX!UC[p,R9`c*qc2L8%,8ma)a&friSY5)ca -"@08pYJH[)4'0&1qD$KcFkP)Y4RebeF9H$!c,hP-I6AKTa2&jr-S@jY2Y4`q2Y!6 -@AlqCU+PRGc6B%AH#BIF(L3CPrS2USP2T,XGpIT+URm6H4J["S-'f3iDQ6SaE%K( -8[G4rUdIZIB@(dUBf3U)!j,lG@NS#D@NIB5'(PmRq!A,*[c1P8eGQKZc`ZKmqff" -a#Jd&-Le8"EQlZ!1RU#GN"@bD*-S#2l*p-9`6(I#lik'XdqMcN!!-3RFFGl1iJIh -B#&E+Pl"e`6%"F@`$R3#+#01A9i(L+QXBFqLXKRXp',1@2bE'5a+d$1%B[cfr"ma -N!A-dFEXiTC!%!3!!4!!!XCQq(,*Z'NB!!!BX!!!GT`#3!h)!&&Pl!!"jIJ!!$J# -3"3m!C(PZCAKYF'`S)(0dC'9iG#NZ`V8!!#'N68e3FN0A588"#2q3"!#3#S!!N!G -#`G68l$c$H&@Frp!B4'q#*m4H--FG@@+*d9cdhHJKG[hXDG#H9%dD)JJI3kH(Gqd -&9EHI"Km!UQ1pH@-)#K!Rr1iUh*25l*cQfG8#Y1YD`S&Q)Z(@8'P,MMfi'SRr668 -"$3D4dcFqQp6AX[EK'qU4Llh9ii9@khS8Lrada'hTGYBrcF!B**9@EYUZeY2d,C) -$+3GV2[Ni3DLYQ[BAhN*5!Ye22')-NX3!F*C6RG*hR1L99NpAQ3ijhM41T"e`9IM -LC36pC3YJ((E4$ThjFG*(Na!1m0[Gc2YCT$hDd#d1p)bZL`dIS8Y4j'jC*ae1qMQ -c`$YXLmkFT+'fH'90AI1TS"-)85!8q4d$XSd$2KY@``UD#&'R5(kMI'5MSc9'LJY -f9#`URAYTJi0Jc-8S#G8HPBr(q"(a$e`G6F'FfjM@EJCja0IX-a3XPfc`TZX`lSj -3[V@GY"CJYK(kCSH-q8e2qcI0a"K*pl@#IrQFj&&F9)k3!#3P0k@SXk-'TT*br6b -c@EkUa1Yf+3P'qUP,k',l[B'U4#+Tj83k5C)N8UUU&chECS$YX'ScLXP#+3+EJ[D -S#!BTq,V,M-+rHeiS9b1fA#U5TGjHcqQhm#@qN!$BfhUl9@MH")1!@0S+A,cL5YV -kScA02NeT&S*[aejGMUSR+a[,%($*$F1Cm3bN!3&P`UrqKpBKUJj!iMb!jQ&KQ%R -#dE%&LDZD%m"KfZcJZKKJeBiF56`GT%GBq#AYDfkEccA4Qpe)6djR+2&qZdC0i@E -4eY+$'`e&m,3&#h)`c'@i1q#am,hcL)LS9&HJEUl8QRR%*53cEiLH94@2YZ(E5h` --eKFiY3K,$I'&@Gb'Q2ViZKd*VV6E31@bjCIiMel55G,XFX"S'McIUNM'+V(a)%G -h*G6@D*-p0jYHfXY&ZSrl[-M+i!P%%)Ae6RYNSk9ZUP'qL'UZ#6D',%mZ246L9P" -FSMHam%AfpN4iNk@*`pc-fEH[P,Zij5fIZdIX5G))5AbEBVEhd2Ck$lMhdE(H4D! -Fba9'clX3fML99-Ud!af9ii4UPVpAD9[1@63dF&`iHab3!,CH*&TAUmF+m63,41, -L"cRfTjSBSh#0Hj(NB)VTm(`lU9SDFc2aT)$Xd9Ha+DSjLSJ-0ZYh2A#0Mi2k8'@ -bq!p6"3%A4hYUPN5clalELDk-(TJ)`2IB0E!Lq'eI$#q1d1NMQ2K9!j-0*Fd8A4r -3-PZHaLI*Z(JC*PHEfb,krmYpRmGrIql!&CT@L[FM+`Ip@Mj3*QlGFf+ehS'E!T4 -#GZIE!L`aY-frEm3d00IcFF`Lb[$5,[UPRRIq$hN"3LGCjfA$EN4F8ETl4A$!-D1 -(`)9a,6[5UpeJdVaE3&-K32Caj&6c*KTM[#mEJ%lCb&K&&!&,0(8$D#@6"Gr*cC, -N,EqXl6[4l,-6&LIU!ke5Lm$`kaYk'Sc`pKFle"(&IH1kqVmhG'(rq-1`aXJ%,eJ -D`UYdIj)'*cjSE)h44jEd&&&q!h$'1!Z2PaEKbm)ZDFqmCJe3e%'+dUMD6Ulq&8d -ACPl#Pmm#Jek-(QBB)Bf*kHmlQa1+K")CS4Z3!1daFpJL&502cRHhrq3UlCMM@AY -lq03ZdF@NdDiTf1%1e([!#2mJ(bMTZb#eKLIEdGJ-*r!S`iq'V%m`-XXTL@%C@-h -*@Hq3!0'C+2E0i+9R9XK!hCdYLrQ`Fi"SNe$+&-dD3SVLK`G6hJkR*%Rc-FYMUbr -%B@MrR,pG2"Y%2Q(b!Up9(Q2m`5I`6%d9kk[9$4Pk!j!!S(-DG1&,"*f*2U-U-a4 -'k+DaHFDp)S)Lb$"PLrF-'U)hNIp!#ZA!4+G2dUc8K3q1PiXJd%,I-&@`9BlJN!$ -G!*Ac9qPU2J[2%3Q,A"r9%@4i)S,b*N[T84K+1b",+D6FH26BD*IcM2XA2V)0"r0 -c3iE+(TH0M1C2JG'6d&%b[dKhQci*+Fj'PMki8aAKia0P4BC6@m)kdXc"(pFM(IM -5A41+CA4$V4HXC[LUB)QEiKRBBfr%cL3Z5p5p#)PH0kQClDT(!m5rSf1&Q0@c4IT -+jR0YfPSBLVF"E[E,+NQ(CmZb%Ej,f2,e11Cr"TI$%(AAj[j','h4j!6+69YZ$F) -HHk2`51ajaC1H5UKPa"(8J#qRE&#pEJD`h-Ul3GU2$Xbk18VX!HKREaeB24bB5%q -**C8JCPJe((mai'jRBR(aKlhjHCPQ31!Y33U@Yr5,I8pVh)50ZXmL1i#!CD%Tp6E -)GSCAA+qaqildF2MD63b3!,CdBA3HejL6!k"#PRM(@B4+h4GFA"2ArK(KC&F5qrR -1!NmlEI5(9TFGL3'BKFPq-$pqZi4J(kQE2LA5pL3HpGpa6i`9YY4fhalc0H&-,Jp -kY+RV9F#`ENpi6!A,YK,#,,'`!['#9"f56E-aG22kUZ*K&Lik4U3prpQeq6l(Q&r -jU+IhTPK`%D4*pb49@S+NB+*!@VQ4I5Bm"bJ5+ilQpVmJ#Zi9*PFG2AhI5X2U#$R -8Cr9SaIAY-h*N!86[H&JR$@BAmb$cI6+i2'4k%acLrqkCSR*N1H(S"SbcV#&H%`Y -CaUT3*NBqAAPjAU6C5D[CqDd9ZdR(19VjT,Z59NfYi6(83)cl"rFK!$Vm*!S[LY# -dbl#(LmN6X`*KFKSfaG&fF@pX3TdiDXQ1T'8qL@,PLN-pXl'Zj0U%pHk8G1ddAFp -rb8JqU[Cqf*Ip4H$6qK"4$8N'lGY!$!Cm+I*0Hl@Lebefdj!!J@cfU[#@m'i,0&8 -A8!&LqK`apfkTaC5b%K!b[eH4&N0#hLSG$q,#KX`ed-1F#M8m(&rLXQdQkHC9$k( -9,H2dcQahaT-qiI!59(SLD'lMfC`4D3*KI%&)q(,(M@c`cb&5kVk(hbT@8Zdp'e0 -eD*N()hckald,#Xpmc`BAp+%+Nb-HM-X6e8D$d-aV"iILI+#Q+1MChKVPf##TP6" -iLD4K$q1berC"61A8A+h*Iqb&CkT3l8&P2k0iM1&Mf6X1N3'3!,)V*!E$A&UC4@4 -m59bR`iXS+(TDr&Rr`)c"'*N-cdlUZdIAL--P9@-&b#UA,)0HG4KKG`SCTY"##0D -Z5ZhCH*eTV*B@FPLY-j8h*P9@)6c96*D*i6GFXG(Tb6kc!M'-XE,TGY!KPcXi0rZ -mERUfj&q+9[i`0Z1L!i@URR#bPAk'PI9KmAdFC3Rcme5ZNX%eEXlCM31IY&KBGMJ -JMGcJlr3"+GL`))+SRPid@@JSR1DX[AJ!1bAS%Ge-,hQ1qD4G5j!!I6$X91J,G9L -NZDbCaI14R5G`!C`+iM5e6J6l`-'UTD1DCMj5Y@6##6KKjq8'YMkdahSK$2dDBDT -38FiEr&9*TXeJ1!S"XffQ1KBiGSe+9L-GYpSaf,!p'L,d[dX#QJ9G96m(1m[Vl09 -Am3*dR24*$V#T63ij4&@RYEkCr*5T9$bcf$6fB@X"-8T#3"QTQ+'NE!@eKFN#[Q+ -B)[&p(2Q3!*BXD'P&SPL6dciYRTX"3IF@$M!Bj'1DD&-ARSNpkc4N%MALUDX)5&) -fZLI[)-m`SbXD9&ZMIR%TQ,6CU+H1Q*AhVc@KCh%"f`NlD6ak34##rahU2bG*ATK -KTkEj1C+D4edPfZ)4(5'5dYq*lN,"L85D)+l3bT,-r3U*`Bi@d&cd'"fQljJ)l!e -`qXrTm")2p4P4cQ,#KTPLTQdMhcGFh#h,l+i#pCJ[elYGhSKR$9bk'F`QkUh`3`D -HUD#+UJAArP,5&ebSA`(kDU#r"'UcjMc!lM'lP"5N0&KRfX$ZmBd[6#PKJ&%SMH% -U53ME(+4SUD#K&Ffl48"P"Re$Fr*p3Grf42$(3Hr,e-C##'JqYCmlr8@c6@!iRcj -"-Le8S08+1!p)*2c[QJN5,aY%8FPU[pp$5b`&EG3`5M2mdBkkeF5P2d4'qdC"P$, -QR'6h1%q0!qGcqT!!RliK"q!brcQrA@eNKcG!Y'`add4jYB#dk3pMUGC1"e'PmNa -5KUEK&)qqY6rFG4ED$-VjD")biZjP0EbQAJ,GXKG6R4XEr[R1PS&Ni'E2FE9pq&3 -9"qUC%YG3Z@aLVNmI@jN#hmI+0+Ec@m#c(fYfc`fGBJ9KZDaX'Ca5$MAHUC9CiHM -KN!###Ia%Vd"2$r+P@FMH#6J"PQ$-kiHKLecC1VIKKJc`V6,lH61QliKTVK9@KCZ -ccHeL%riP1S2BA[l&06%m4E9+[6&![ijM)Y+Ql"C196[GHIl-,GIIKBrqE$3l,X% -NQSJZY*I5pYZbS6@4VHN#mcV*`-Ql)C!!8jMK"NDM"9Y8,#062qMmcS!6AIHf'@C -r3qZ,ADN"X6*E3$kVV@)E)VGZ@BE"Z+%DmM"+IfR88MfbfD5V$bqIKA$Alr%S+5k -)ShXV0b4,q9pc4H5Pc'*Fr#+[2[3Z#LVq"4G2K1E4Gc003X3q5Sc0"'fJUA'h*Va -V(TA(+&T$B1-Eq+r9&26SL2XDMTF4E#F&i6aQrbJ)QM5H)V`J6)@cj6dK$0(Ki[G -XUN1`q%a6YaS*"j'8TUXY@C[D+21#phAX&1eq`84Ic"J'aQe%,jU+iH,jYVHZ8GV -KTbrm-l1*VVGJ3E3Ei5VjG4PVF`%NYpVh,U3SaX)C4-(aQMXNeI@C+picR[*Ee#R -A-i91N`#NiAR2Hah&iFUfX)@%F3aSGlSU+Vle!bCb%qAhAV9m@e@3!%C&YEZDNZF -RF6kap@XRpMQC3h2U[r)X!MDeF1k#A9FG)q%Aed)4l'-(@&)k1ji'3G*0D9(8%'K -TbCV6DN8k)H#rlETFh2D`p,86i!3"($Y(q#hV+EGh(-6EMDKVI%IK@A0ci1hKIX# -PN!3"!!"%!!#aQEi"XQiD4J!!$cm!!#[m!*!$FJ!8`,S!!(R@!!!0l3#3"!m!C(P -ZCAKYF'`SBfCY+f9iG#NZ`V8!!#'N68e3FN0A588"#2q3"!#3#S!!N!G#`G6cdqa -T!baM6EpQTcKG)fRBl6NRE51LBplqFM"1Ab"ZJSJ%268!hP5QLNRC!p)$6hGYk(m -!Vf&3IYX[dcT6VadK0-Q0Y,P+M3899m1`3[FH6Bij$4l3TZI,LGI(m&TNRYpGVH+ -4KL%IZ`mSL0348H&6l6&&j-!$H3$,I&YFcF)[0Kj![G&1DG$fpHfbhdkHA2dK@,) -p#4R95jM*I*J0U[kE@UG@8r5,1H0i4h)QLj!!NG`SPH8XMdEd2!5@ZYZ'2E`8'h& -ff@"a@F8*#XaIK%94`V*P'IF)Sc%5T0r*rH!1pbi'LR[4eN'Y"'"Fb)j4RUmGFm+ -lBSUZi1MYJfr%8+L1N4i[B*''@[(RN!$%1Q+Gi9ckiIR,a1[L(hmXah3Bm#f8'q- -cBaYA)&qqq,I%hq8b3h5$&5D#!&,qLC)FEG8'6c8d[Pj3@P*3X,SqZiJi&%D#5E0 -!C4-18(K2R`ApC1@e3G+,,IId+H6-IVZ&QeGb)0-&ScPT3M[4eMDCH$YLd*K5RE% -,X0[E'fY4$P9FYd9&lqNMpN45`p[QIDD"SSbd3B(2@[4p+FZae'RCNelZJHG0)IJ -6*Q$bhKkrX+'V&''CqG-)FZA)Af&d)6J00!1[pAYXk&%2Ck'rq"mTS[Z-5dIq3H) -N+2b%Y@YhQlV6!QfXpk$AcKqAB!-CS9&`Cc2(G5m9SIQB&T'G+&+e$XT-0A#*f'Q -1F+hD-+eR,CmEPYLXF0XDGiF'C54PDj9!@K)SGI2J5GELBD26LQ#!0FA,k4,`#k5 --`T9-BSil(@0T[''&&BE@+d8k#l1G2[j"VCl2GAEhahZCcB-QHZm"'H51R1R`QH( -#h8aSJ"L$E4#[$0jH[2Z6B)Xh(ANHH*3f1(+fiI!q*"0-BqNE)jMH,,-JqU4mr46 -L(Fqq9'6qAHJ8#ELH-d$pf&HIjH6b1`dQS5M#'[2AkK@Z&H!bDPqbU[pi1RV`j*8 -,ESD&cAcPdP3&(+Z&P!fG8FhI)GC$lb-@SC[(@hDd0r#!20ii3HRe0EfBF"(,,p) -G,0ZZQ`5e%F5d$@8*epX[CpbdZ-8R6DG,K50-33#i#kaJI5e[1F9ZA#b@kkqUc,) -IYZVf459#ZX,@B)`&aGMYR)+@FI)HZdi6rFY8#R&Y""61Y!*%c'81LYKl@qEhmTA -mr&VJfdChVS2qcY4'jl,CSGcF9ZH%QLFNmM0-JS%U1F`56Bf!'H8c'd&4CQha@XU -3!,bRbLbeq',,CGAYL21lPcE+%$fRJ9#pFQjZ"ZppGRC)*GP+A5qYXrb1NRidbMY -lKm@&ePhUcVRh-'PB0DhZGD1$S@RBHG8,0Kp3#X,%)F[+jdNTj*0AM8e[m@cp$LV -1hhZ#NE+rT&[,VXUbaZ@!h#pFPRk#BK#VEbjFEC'2Kh5I9(95B#c'Z,M'I5'$U2- -'M55UCRpB,3*b%XlhZekD-p,DpDDU)M21mq3K@#iCAmTG[8J)qqJ$C2[Kj8a5CRI -4T%G,a"JrHh"LDe[B%&Hl![NGcBQ,L#"H"6eaXDN[Q$00Z&QVX$3ajJV+"(AZZ@$ -p[h,V5dUF&@4840"BMdSNkEHJ4jYj!N9K2P9#[,!-6DKdR(ED9rK%T40r&aPTiP* -[G`9"k8H3!+d,rN9UVTAM21a`d![3#ZCj(JMLdMSp1,Kd[aj,p9J+JAUcYES3pf1 -"-S)Fl5d-J,FPQ,h*HePA)PTp3`i&N5*@qh1HSD)(+NeE,ZmIqlcUNfV6dU*$FQG -rj8bS'qdbV+-mk*+TAMDJF+Zc@@VY(!Kfj"N)JcedjkE(M`+S[`lbUNArLp[,!YB -'kE+3!-"H6CX'k&i&b)GXLc56FPlpb!qBi6#K+P(U(QK!4R1SFT@ip[e(XhF!53` -'1p0KqK+634YZ4V!D@leT@C%4%02[Xa'+%T5HrKG3GjB+EHRZV2-V'BddFHCbCpS -6TEmjb0c@8F'$8e(H8iHDcZU10Z"BH!@"13PRrVd`'(H(r"0Ab1kh8)rbHD"f8CX -k"mZK#MK&JJX&-8#!$S&@cM5f$[qjmCN$T$INV`&U5Hq,'D19`0p,%b%9akRM8*c -"I$&m!Eed-)iF!+#+VVRP-5fp4+0e#%Y4eNaMYFIeGd*JJ$IciX%*R`fXK6p&jAf -14(6$[$(%("Hl&faKDhBp`l3QScD(,qS("6cqZIM2@qIGLPfaY[e93cf0rJA(*TE -@8D$UU$rLp0$UJDAaXhGkAff$Kk6c!rd2(4M40K04ra+TTDHEC`c!G2SJ%`ciIP& -YU9DaD0659D0NMJ6b[#Gq6crN1'[Pm)$f+R1Zrqkh&C&j!A18#DaVfGK&$UZ%8lP -mIqii#Y8f5S@#YE!"8)qAQVX`!eHdH1ZkPL6B([`0BCGU3Y)aZ6ImR,X95&#B1LP --3!`pL1kj$`IRNXi9%FQYEiZCk(Ym'p-&$96QSI,1[V4ahcKC+eJ,A#qf-AaZPB1 -h@Rh@5C'Eb"[pJ+R2-22pI&FJmUZe[&hS4*@rQ[J,[$YiM(8#ALe6,0)RH2R8$H( -F@YI$*5d5RL+[B8(4FpBZBkF-9r-*6Jriai-+#b"jMR@N$h@i5N#[U3l5iD%*)LU -ApjmaU#k!)RrNQhX)AUif+rSaiVKj$iPA!CdZA4iGGeJ1RI,26'EEBYl'#FDjTqi -5bIk2A-3@Xd3p4b)JHeN3ZS0fL3Gh`dQJm(E"HF-QmMA$fQ&BX&MXXkMj5,Nb[cP -[bXl)P9*N,Q,AXC,UR)KTH(ed+Bc!Z*+X,"K5j9f1fEjbTLpr`La'YEeF!DfUm3N -,#aK*CG0dl+,3h6fb0dD'I88Y8CcrBTM@$`I,JD5r8!T&,$#RKAm30NQFM5-5Z&# -L8QaY58qUMBF)1rGbJ[IiAD4`0hCY-VI(S-2C9eJYm'ZYl12j39T&bNC#N8fX#49 -iSF$Q-Y*9FHmUm%UfflYi6"Z!2&K!1'"6YHRl8XhV*b4hXUS'c"ql8qQhPDEErG6 -*0N$cr@YT8I(N[6DXGJ%,ql*(h$2mD(4phmM(3d+3!"%2P"M"d4VY'iFq4G[#*UQ -3!+V$J-(VYPGkcN0(Q@KfKq*B4#c!KD'XN!#M1E1K$5[L5#c'U@Qk1H+'Se&-DSP -dh3c)Y8kTd'L*%h,K%IJDZ92)IYMMS5XmMl6P(p55JL@1`26$'MJDA1SAGI2bMXG -,RSNi(Fjb`6!ES)["kp,Z@b1qZrD0Ff*TCTk$d5hG8QlEXReJB2lb@-@%%Z[%H9` -8G**1kF"02EpKfjZrH1bUbKZQ(1DAJ"m1A!@&0'S()Fi*FbS5A*26ai4pjE3Em1B -#DGZZGilL$J-KS`!ALI%pZ10hLdQCYa5&1r@Eir8BhXE$9A&4TPjmPN06T4GSE#B -GH#i,5!d,FphX2hKF-%#3!$e%)jA1SAD*VQf5cK6@'@$,G!GVj[BV%XkDm8Qr%[X -!MqB9,M[5jV')"Hq(TcXIGiKN2eDZbe5HLcP3UC')GE$j@)Y8Jj8#)dp"NkJeH#) -$d1-53"#I)G9XDehT8laHPe2eR5c-!I6Jp+T[E0hb[Jamde*GR[mQ"Y3-I5#Ad9M -m9P2aQdS,fZ@U69B5"fDTF1cVMeR3%9-[J%A'hCj+rLG0mNN1"-#0E`N&pKJ9q5i -Kia"C0@J1fh)HUB+)3(kDiYVrGiNX8G0XRMdDV[(ZqCZ3!,J1*F!T"Idc8)jaalC -LI",&a$BYfETb%SR1-X%PD3UReV)cbbh"9mAeH'P%m!r[E-9Llb[jd6k,p90)1'@ -)CKf0Hdb44,J2E+*lkRAS"HSJVDk[E3Di42JZ@K1+UD[j($C891-3aPlCTJrcTYJ -I&qcZUdf*50@'F8N)+d(K+(K*,!%QVlB40ceeFm*RZ[c13L1S8bmK9ef+6([SKr` -bG$!'%a4%FVQ#`fK#ZHlIajiK-H*Xl&Af2c(S15Pmk6@QB%FphD1&V[S*j$9FJ39 -!`-)X,j!!iR82%Q3YMfU4)6chQI@1a+4*YlAi8fJa2jaFJFMT*$Va+PL$$4d)*0r -i`l)eA9PY16Yk8P$Hklp"34d@+KY'Bqh3&rX8Ub5UU1EMJU@(ZrSJ@ce5*jjX24" -Fh11clJb'!hUHDPq[YmCUTDXa(MrF9LFS9MF3CQTUhDJb(SPKUe6NQrY!cEMhja! -Jlri8hpZe)%3clGPYNmSZ1*@THILr-6(Fk!KSicYQB`8MphSH6)dVI4$rS"b*HN& -jkm5ci'J0lCRj["$TKa&DAUMQ-bF2FKAKrk%*PC4IQ!0QBM%`"Rd1Am0X@epaF%% -bM0-TiCS0`pPd)rZX+NV#pLK#J9Q$2QS+jY@l&0cML3[-M*%9MaheT![PEYHZ%fU -4)P5X%q[*p-`L4`qDjSU*Ar,8M[HUCdml98X)9l(!@'4Ia)66Mhck8JQ6-D`12P[ -cqGVj4cD2GQ-Ghe%`SCVEj!91K&qm,Vddi)emRY5GXDiJ5!%8X!h#L22dp9QILLq -+9)I#Xj(rXYVR,k!qb$elhU2BFj6IbFDBdpDVT-L0aEG()f8pQ1)q"#Iq##Nd$P8 -f[qI2Rkp%Eq6f@8)"2T80+"*D-+(01QHVCq&"rcAE[$"U0a-5'qT9p1ND9D86Feb -P4bL@akXDY[dM(8,8%29N!S$2X+M`0lcp`MSY85e'2bRrbJ!dpUFQ3N3ZI[%jqU8 -pZ[di'ZaTEN&*3e9CG0"J-"4MIc1Njr*eJ-r1!0II-QXfV@I$'H$phTf'AD!LrCJ -+!$Ah2!cC5TY2#b4cLLj)%DiX#I`j`+TqAkc4`)RY8%@6cV$jViG`cCP6XlcY%AU -b53!3p!jZ@pIjqD("DM'@qJ#PN!3"!!!l!!#aP*&kY&h0c`!!(DF!!$f"!*!$FJ! -,10d!!*c4!!!4*J#3"!m!6A*&C#if1'XZ`V8!!+X268e3FN0A588"$[q3"!#3#S! -!N!G#`G8-bJ)#(KbR%j!!)B&N51r*1aQb&SJ,H4L'arH8Gel09hf3!'K5Dr8j3!T -cMqAhThe"*P8+4Q#FJ*Iq0(JeGYi0"D)[H#FCXa(MpfP1pb`D&&qhlPDe6X11%3U -ed8`!iCr!kK*C!#kabh"BIS1"l(mq)Te,cJG,$D04ZI*@F-J)fN+kfjI)Xac9CU" -&C#e)ApfPX-RT)MDI10NpaFF[Me9iH(N%CNpZPT0h`AK"i4IQmm@$Vri+H&qkjXL -1UqTkSS*CbT1jkG%#DlA5bSPMR`&LTkFQhZl",,AEe&@qdTFcLmf5e[p1-q(HcX9 -GPiS-+elUXK$Z,kVpFQk!%Z*fD!2NM-G[@!Gjc$G#kH@B$Ai*DL5jk$fC(H)4-6B -Yl*m9(cXK+J&'44')VC46GPQ4@h)PhaMEjPDZ-8e`MS8iNkC8hk8AmmGfkdCpqcE -"0hiN*A2P2!S!KbjCk%qBl-Km)IfXCKCMi4RYJm%rI1$1XGBq9E*Q1e&`CGF$Pq5 -'eaPELBTUHSF1M%A(*'3,5HEe6)P'30XGTTKG!&FBYPT4$8KZ&0jr$ESY&mLZ8*B -P1Re1&4Y`&S-8@5TLH5VBk$[dpQ8V-N2q[N"cXQ-jk1[X%X!+0-d81Dm@8M23hcI -pQ@2a$NX*F+8l*HTi*'$Ep2IKQb!dXXL(BRT9+2f@d#DpMp#AUG)&,prb9qMmVKL -P'PNi"E)V!mj)&qH@Z)2)&N!T0LA@,MjI%`k95*0q*64fZ-V,4PlU3bB!1j[8E66 -(2b2V"L*Qf*G2bkl%5lU5Y06i[cE"VradmpRYpXG50FUc!1-+Z@ESXBQPf)eq6TA -EZF',e5LBhp2JJB%pk)ChSSA`6MEU*(X"iij@N3I"9$4kHSDTe&Bh(AFSHYK#S%E -R'61Jl2[D#-D,L1Hi308X*@6@@B'#F#68RKf1NXSq-5SHABq2$ZF-fMN1+K*4dML -AM1'mT2NJhjdiXfd)#%B4KZ4+[@!pb6FPU"a&8`hfk9D8*cCiEJCQIDc10NM8ic" -LPJRZJ6%KDZqT`+bJ5&hSbH@lBGRHNl81VrVM&'kmFK#@SSNI-4qU+TX!e'l26rl --U42"Eac(0j!!2GZd$r"p"q%kmqd['QibQ#h6`TDZ(Dp3p09ZR562YrpFMNH)'[5 -&i-$f&SECJ&LAH-@JJ$la9h,&UM!L-%k4UcL(jG,RY$A@5YVqESDSPYEfDBM!CY( -a#m1-')0R#*e-2fX4Ab[b+(,pQ)G!,,6ZZq(6Q,%R8jFLkPJf,!G(i%V8C$8S9M5 -F8VHqE)brUI&&(FBMLB'EKLXYESk-lHM0YN#Y0I,PDrA(b[CSfP![mi+)&lhjf*[ -FD"6KRN,T28*`!ajdU([dhBdU$#rKF9*pVcTqe,rE9FXJbed1*h2XrXZ'(16FfIb -HPe*MYH4`9IFS@ba)@LZHNE@F$))U5f60c**$)'Zmc"IfAcZ%dP1b-fh`Xp6P65k -,e(L6F[Kmr8Md&(2"%VJ))e'eNjDq6SI,!R)(TdB&E1SdVi,PM8a5Tc8*VHUVLXE -1+GFm[lB$"%2,aDi6-Qac`+85RR0SA$Qi-`63MLcX&eYjKKef%F"8(jq#iGjSSX* --43IMVV5CNN4GjY1EYj88`GGlpEP*jBE*+1X,(IFA,PLL8Mi!!A!q*eBrVULhZH6 -#,A2L-c*4dp0EA8PbD,#ZHjF)[)2-"e,D*UH,#H@cEaPc0N0(T+*Q+S1Ramp@irM -5G9L8U$1h+XK6Rp(C(ESBVqp`khIf1hRCQQ9NKTE623'6qh3EfkV&-rZd,c!'bZa -LGFdqV&fCplFabGQNbH-U$R'r@lIV6rJ0JfBK$MQj@Sfb39VpPm$%5!U$LhhXjZZ -'de%+D1Re''XbL%pp50%8F+ZDP%(,V&bVI#Y'$hYE%&Rb+kiC"Ap,3,B"MHP%9,* -G$1l8AC@IGk0ac$aAeb9S#I42T8`1"TJaqCAU6&,UEZbk'hNE)NIJVMRXRdj2GmN -LmZQ03*iphjbI5PGVm@KA0NrBJ@IlD8kXi'bpI9,4M[0[h4KYTKkBbE"D[meX-lb -mrchVBC*mF$,b+rf(Y$i0Qd!B04Ld!,$fl,a(6A%q["IZcp0"8C,&4"jk5F54RHI -cBE)'3[rDN!$`'2U9Q*mCMb(!Za)5Sjj9i(+6qdb#h,MPfqhMAjaEfmXBSqS%fVI -e45hK&T)5Mq[&URNcZ%ESib`YB[IGM&bRX5[[bfL!T&'T!+Yrh@[4%EhE@Lb!1Bk -3!2hBU*%(HM!)K#fdZq%UL"*6LY2CXRRa+S)0d'Sa+fqEi!Y6MTGhUTLmTbac!C! -!4Kp$BBlf$e["+)9+#Bp6d,MEBZB@b4*(#6T'1("HY6Sc#c,MT-KZhTb$b6,Q08& -E52h86JQh0L"XXm#fIqV5RS9Cb'!%CeC4%T5kBi&D6VI1!(XR(3AZY2L,N!$AR-X -j)92[XH10p)Ar&md9Q*cLVir[X8p#NXmk,b!VJM98L`S`BGd1Y6,E1mGdNe"CKMP -YVVH#+R"@mN3*L1-QL`"1-ep*8Zp2C2mhCNS9+i-9rSq6&pi8#MJ%f!pABPKrGl9 -,pSZ0)SdL&TK"rkpDRjCGPM4#r'E,GM6"(NabR"[PFXMRVFNFA,#'2%S[qSXED-b -iF++FbAeGl@LcHk3Q12*BTC`eaI'$CeEB!p8HLFli,@)KC1pl*iG2lcr"[8lkZPP -qm)ca5)RN*!$UZ%T0baI6JK1'X61XN!#4i0LE!%R+)eY2c"m2#G[9IPZNB"&d5%` -jeRNE`PRXXM&mUX*FAM*@DZ3M`eH00f0FRA"-&IYlUKR51UVRpqEfjRa*0Gh3&9V -ZPeq&E`S#,@qU#AP'31eX'+P,4+VkX+*4R[(QY80LldZ--pr1'l*1d*Aqi8p8$r1 -UXXD8cVT3BUMVL%$GX$1qq[TQY#93Pq$3B`SNfcr8jB`@I&DAJAYH!pX`qUXZ+T! -!+H6CJ#L'@d!q,BM`60l4)mp-K#[G5`h&C%!9NDiLJ`F-C2IG$'k'0@Y@QlJLR)p -3Z5PE1NqX5R,rH&2@LL4p$a#k'P',j*32)L3pGKjkPENc&E`NA`)Hk8@4k2cKBNr ---6GY3TE@3B0RVc-pP)r!!6@S$)[`9CA)XmZbBUBq&iik&ZU#b*TMb,ir8m*6$)2 -RHc5A&@1Z-TYjE4bflENF3&rU$H(e1SJqh8JrG+I6,XC#U((SHfPU`heL!ZrS1CM -fRdJl!F,JFJBbDeR9eGd3B8J[+@-FR,5E1pjfGk#(8if[iL0aYj,V56!AqL,ALB% -B)0,6TarI1IiM[iiXkCf@68UB`T!!UTi,pkTGAZl)1"#9Ni5q@#fk[M2qU64PHCS -B6'L3!!Md""qVfkM)j%1V2L1&82L6VJ+#LPKNm+SV!1%FZbI+-ZUFA4Q&)&I$+Q( -Q*@appDH-2CGe(CEli+4I-bP"MXARZlFprA86F8Ae'Hc*5#@QVP6+'*6CMX11B#j -FSTJE%j%CY`U1!2iRlD4rBB3L%pSV6`+c6S%`iDEb4Mp4'VFRm%8Uj&Ske4TD(d` -c",McIH@-qdN64L@8V,43N!!5Yk3!RF@TK3e2P$+h$e&HSdi14Df8jU&pENmlIE* -V+j[@PG1#P',3@Ya*P8%pCmj8m#3qb8SNCZmUSe$*M*6A%Jb1X'l5R&L`04$2AZ4 -#N!"$DKUG!C-($SR1'MQ6AY[e,fh,)b+XHrH(K`Y45h'NGAi*3Sp*',pS*hIQqN, -cI-qClC%l+da(L3c)Z!e05HpN*!fN)rKj9%ppjmcd68r2)$%k,CSkiqDLKp)6T(C -lK(EGqHMFmH#U[03FR(4eLkcli@2+JS@RG8mLP,$LZiXDV5GK"SS[l,chNqkJP&f -PMUPK*dTq*N!)kS2i[B)aI'HZT)65U$T@eTPZ`BG1CPA#Uq2XQ9pbYN9bjH@riZI -Z(`qNk05E+Xac)HUa8E3#lDihSALC'3jkFhD!D`IXSfp&"%r"DSr18&eB0Zb(PE2 -l4cbJ6#0L,fq`(61S0kI'ie8Zpq-b9FbLBi[`T1YkN!"Z9jKN1MX)+AB3Pe'5JP1 -qL9L(2-ZLjSjlr[h%K$(2`T!!EFqZHTJ,+,!lN!$jTPqNDrJbTT*q1(b$`lIrC9M -Y[i`ec9A2pC5d+bZMk9bFjQda[f4YP2J+eARUk6qFI4Ep[N!"ceYFY0e(CSddpkb -ZqHc[rLLC59#f@V,eUkjH3S(%+hqTl6R"bc-QhrU5$AfHUj`H@LB9hjU0CecD+S$ -d2(,TmPEc`fQ+,!edYQ14F*rkjTm`+@VK"SXrhbILl&r%ai%44YS+J3*9r!@RG%c -(6iU!)Y-iMTf+`q&A++M'4f4%h-j%c"3b#*rVT'bR"i#EfH)6CHP,F2MjRAEb9&C -),e(0G"fPJDC64eZ[ZHTZ1)VQ5Ki@NhM4,Aci)'aZ$I#J1PPDbjrJLSU(C&rdF)L -qUUH@8)ja43J(h$ESDNqF4Qpif!DpTVjX@Z*Br4i''Y0#%C!!Za20VDldq&XKC8% -E@'Fb2KbeRN5-fNmDmRbJ3$$aJZ%VjZ'J'+m+rTj8)h)#Yd)A,JPLbDC-k(kA92M -"ISNj`(5[UVGPRp,cX+BhN!!(p$#Uj&3r)&ke*XAI"`NI`MUk!aa!`Nf[h`eYiNK -K51BfeX11"qHDDIfF$'5IC!'9mB"I3rR0F+!00m@[0(0RDKYD"b,JP,@GZSDQfeF -rrf&A4U4D%3!3A+Pfc"Kr6q')k*AB`MmK38JkY[a''VhFeAHV*Nj2rSp-V`dLJ@R -$8NdK3b'+BD')Lb%'CMa5[15c)+)pb0m*GC9Kl(Mp(*!!EY5T1Vd&ekV3l8CN,IS -e#Yq#Jfp8bYT#mB-i"P9Ll#eGSk59+P")#fNI4rKikfFd+QrkHciTm%mPXa@**Z& -QZD[UiPH"TbK4'3"@&hhS9aS#fBjLJSr24)mbI!C5Qa(F*-i'AYYUGeX48PU"p-l -`+RM2V!Sc8k03-flF0aFZC+*ki5DDdmR*IM29kK9&BSKQX-@&DN8KQV[$J(3K"YI -6jh!Jb!Y)9R!eTBhP3495LhI34Ai8bd[,0`[6-qE9mcDl18&DJTA%Pb!GLj!!(ZV -b8k0kZ#S,[G1(CG2FRPkAAfG8bjKPQ4BkRIm*6Lf0+dXNrap4G'NQVDV9DR+aa"d -TUCrEdfZQIaQ4Vce)51iBYk$b6I-a8&il,Zd-8m+rlCR-$r*V29"qY`CHD&dJ0Iq -p3Q#,%%`NiE`"58+Gl(G,`4D"4+1h[TeJ-1'VKNpPYpmPIp38QYQ5T*cDM%!CVb+ -U2T3!R49m[i0bBh2Tj&@Ha`rX,Z0ED81%LQ-UjQULm0h(#G5&l4)U1&k5G`SA,Jf -L8F$lcX`HMX8%Mj6ERJBaT*llBd$'aLEjmeJ)%f88DBr*lHT+5DUZGI,bX3J`Y-! -V(jQ!PJC)aY!A5,U-89P!hCSdRXrP-"qdrFCVf+X5E@e%J'jDJhM0,VI!-FiX`5@ -3!+F5NHX9KclE+Q56`YY+(Q+'UV[DckKP*EiFGV[B"DG3l0QrRd"TTEU6NbBK,5D -m,P1aUAVpDQI0[@i*L9GSm%kaFGje'c[KRrhYR%QDE)Ci#`I(@2Q%rX-VQl(PHlD -f"HSNHl9`Gmkim!+-*8'YAE59L09F3mP[YE"E0D)d1i&f('hcb86hUXf&*!jCJ"J -I$1BS,$N3S!HZ$9BqPbKaJ5[T&c0`"4K86e*pNE[JQ[CGjSF1kG`j1'a-P'iZ&$Y -QrE)$8E(CI3[F%(6YmGVNLBRTD*m&QS9!*q&FNV"mld2`[blmpeE0RJ''#&[HNN8 -!SpkfKKRSckKC6FRd3f"--TSHE*iUQHeV#2ce-ecE$@`c'q*p0`T2HFZ$6k%r5Bi -qT*hBThp)rNX#C@*r,hkmZa(%0Kb2E,6HVX&X6(U2$B43HDd!)(6hh+N)rD3!TC! -%!3!!1`!!XC5+UV9-GfX!!#[m!!"3J`#3!h)!#ej1!!#I'!!!%U-!N!32!%eb4@3 -ZF("M,X+e!!#V$de08(*$9dP&!3lrN!3!N!U!!*!(3X(8aQK3d8,R+9INcJZdY9U -aV-Mh)+-%V!#QI"jD0E&3GT-N8Ih1@kBZr1-M-GN!ArJ0b&&@j!`,fI#8jD9#%I5 -j+Mf4AUbf+V4"YJ'Nb#Z(49DHPDpCHIZp-!NLLlKij6#54IVlN4Mlm1EG'hf)Tj3 -N104BC)jfV([lmAr8@@NQbrc2!5Y66m"h"22%)cHI9bkD@$epMYT2Y@FK6K48eI- -c+FTdaR-6r%XKlMDI2NAf2RhrZPH86GL'(C2Xa)8aVhJLE''#h%H)p1Ji*Fc)aGC -djeVMFHM,ZV89hE)92lCq8G!Q*I)UQA$bHd(ZHrS[$5LV2VVd8d3,B"kdS1"E+F2 -HkQ%jPI5T'PrD-IpI-Y(',ai"qRK#@K+)b5Zp'kFB'$1`V)GIk4AJc)pj((fI-SC -H+LSNP'1mUbU6IIc9dHMH8khcN[F*-#c$lE28kM3kkRMjSEhH#-(FPZ*a,-Dd'#H -2TF8RCVQ&51lIc#lG9"+0!AeA4NQTT6H6m*G0$`PZ'e-rRA&U)4K48*5`p-HMUJG -ql4Lm``E&hp6UGH(P#dmM3@9-jdp04*)[eI,4[ZUiTa-Ed%"RTZVAlaaF3"H4Rh$ -'[*+-HN03V#A2bEp06#I1%130A#J`r`0!8H6P6e3Q,ZCF*16dPP[TaYMFKd&j9%h -Ue-ql5BGb8aa9r`-PM!Q8C$QS%LV)Sf6mP0bPUQ"TDq3+'%dV&e1-+r58DlaIC6q -Fq*!!I5"cJCamNAAh@meV8dZakm2S"2f+!UlRUN,P`UXREFiGT5$J[#NLB'"hLal -HFK*A(A-TKlbh1HCd&H'FYVXZBF8Zjd#R&3qH$lU[&05HA9DYkB6GSkR`Rmhp"`1 -SLcH[EQ1kB+)d`qR,BMc+9GSCZ+AhL%E1l('F6X`pHX0Vqp56FfD@bqX2[%&Cb8' -H!J*KM4LrbK-46k*Kk+*LrcAR("Kmm,+YcXNTb@[Y`"NK'#459r,+bmd)a1,4)Xa -8Ri9GC%LEkrEiA-%5HcSQEpc#5+rPPlaC0i[De9S5DA6,%A3lAhEC*,pYd#%@-6` -IdCHp!,5cj2ek6djVe1('d+AkrPkMqFf&FjCpDEHK#P[8M#MUVRF4Ka(SSmVfPAX -'K["&c1C%6NYhm0d'qEJ(0arMCa(X3K5$94X4PB52&pL$F5@9r64LC9V[C&*INbM -jSBZl9hU#(98@HF-5rX*cY$S69b-*PQhba!F$R*krl4Ibp5VN`*NQl5I!*9!0EEJ -*bL@lZ,D8K+bZ)L)'aLqJh4(6IqL3!#JK4eYkB,`2"aPNqqDq9kAU5J4fUG*aL'3 -03p29KTk[`V1fBA92X3C)K[qX[5dD3B1U3Be9C@,PBC0A1Ef#6e*p*kJc(E#kl19 -IES")cj5N&%bXQHb`A'pCa5i*DQH3!%P$YB-CAN0SbcCb36EV33YFr%()D&bJHe* -rcMdSKV$8!aCJ59'1kAEKjPb6B2'$kK(QB+SqFp0Bb#YhYQf)P3&$9m5BU$((pcE -`EKq6*$N9j,K6030NY'h)l#b3!+Jhmj(!(S[NZfdSMUp6iQMU"'J+[4YL4BT+R'4 -`I0CA8raV[c9fp#QBFKKJlddJ43%GRNb$Y8mBH,9-q[Kp!$KC0aS3@m%@k&PEF"P -fpr($DV`+89(A1!X(2JI%*G36qcY8(d9qVZ@)"9drIrfZ5qic`)&AI@C5bh#k9*i -&i-[dr$TfK'8h5i%I-5BlYrhY[")"bp@9JUmBU(5GJV2mMZdHYA4*3Mm,+B*3LZ1 -dl-IpZdb0QS0IIZLUfia%(1eV0JVh$rUIPmEeZ8hj1ajMeI[CR[)C6adHGcAqC&J -b-U9aUmr0JK!iYDUPB[4N4DmF'$QaVcJLV&+#*lUPHDQ#kkfXK"6-5*ecM-Prk$) -)XBIQJac*1h8HQ[!I$G@6259"hUlBffIKQJ-UF6l9+lIZZ*[5'9Vi0hZ"-S+M"61 -Y5MBDb@*MN!!epL@hMBpVL#aEIJY[bb")E2QTNr+KXb3`@LVaM-$lp-SMe0SG1k, -%"A),aDAXEI$I`NV`Cf(KB+Tedb553HI*cLB'N5rc%e&Eid5DRm0ZAl-f%BDQahU -a0ILb1qTT6d@eCXYMdkQkm1TTN!"XeE-Y5&ZQf-54VMkRGFMU1+HM46bM@-95h5Z -EZqD@+[L3!$'[$N%9bCUjk`*qQ0BC%*j,9r$6+rL"L#I+IUdia@MTY@V*[Nc#H+r -MfTffUHCP+e8T6HrL!Gel!XId'@T-4,RR&CDaCel$!A)!JADj[#H[FfF3pHKp8h4 -i5raiKE5*DT1)r)JhCp#I%!,mG#[XI)[Qe@C0Cem6HZ,H-C@&ZhNX3UYaf#"aEZb -Zf5k[ZYL6,I[%e!UHmYSSBcHKDFcUIPIrHSS*F&LR6TLC(%JN@6c386KN(TpbUlb -dp&r9UK4`2VChNif%D*hfF#SGDq8VrRXK!cp6PJQ$LpmE)H#bM+V!(NpPbZj-Sif -'dleZV%$`,PrINlkc%L#Z(jQ[["hB*KbE'HU9XmSdp6F2U)m5h[mb8FFIN!#pLi[ -KMpZ6lq$)C`H3!&kTLKbQAak&#P[9R1"Vkca#ijPk`F2`f+IX#1,(EF+Ham(*RPj -E-a6!9dXM!ZkKE9EUf$(EZ"Ji%bc!V`Sd#Y5+Xa'ifjdQ@AY1rqMF%8Kcd%Ldlk[ -Fl2FDSd!K$KZ$J434mAimMRBHL"!NJ@k6F#(krF'&9[*rfamJp#FTG2HTP[4B"@q -mZpF(6f'Y)jfDk23rV8k5cJr12Z*d8@-68,ij3%5fJMiH,1mBYj8f!PmFqmTdB%B -!j'Ih'$G+Z2p*0YUVBS)(Z`r%fqXS#kP@*(q4G#6$dG&R,EV4HCF6H*6mASBDQl8 -q1[Qe"IdA)eaDIZLl5&kQmqBj%QmcKHN6DTjTNCZG9K3k%qH6SV[qRI%)B$SCi+A -[#c`cRYM3#d1Gb&RP25%-ri3I9hAF[m8`PGq4fUlS`qk)!B#DpK'Vm"31#!GErIV -DTEYJ@#2hQ"JC)F$E%rlif2'FQ3AdMEELjHZjb3Q+I(i@!lRAMqU#X1R04mmGL)' -B-#H(l$cX2EiDcHmd$'d,ZY22-8iKcke2!4H!2V)%U3DT&qVq(q#6eEENc6LCA-h -3ilJT@GerBMR'9VEpCB92AV4Ld(Jcf@Jdh(*Yqk')91-TI($rYZAKc`a'iiG`hK# -HSSD'D`T%SUf0L+XR%`LY,B1J`TB#p(,%j8+VFi3GB,-B(clRhF3lda8jQ%5R%Q" -kH`Il*8qD1l$SMq5M&Ca0%Z8VC(HBDAj""'SQk$[4bAT4G0QX0F@VaU9DCj@&%!m -%ih6Cc0JihFYf5TiI(,@J0[JlMU2ibfKIh)$ff0)#rYrcQ6Vq06'pS#A6B90N2hk -q1,k5dM5ffrl0mbRapK@D#+AB0UK('9)%af+NCV3j3`,"!YFf@$[LUQ9FreZ1eC! -!2b,VMG&8T&Lk1`,)@q,Np2fYCccpl!k`0MP##2B$cNm59ZEb4C)G2JX!1Fl`5SR -DH50pj)k[Bc!&kQ*1cfreZE'4'p,A)r`NFHl,QJVKm0)p0F4P-MaZbCPG+GT0VL# -'NfBYeb!4,RXJ86b!&mq2I%FQ%MJrXL0DQ90HaRPP35GTHqpkFZ$UI-RBC!SBedT -R-"I4TclmjTQjADq2N9h*Gpr'b[`#IXkbaPNH-G6ZVRU2qla*Jbq5hHaefY`BJZ9 -YTMYSY0PNKMHl@3A0PXHCf38fQ$G,pf'#)1A*FI%XqJ@18H`AHJjmAURXY%HKAji -CJUDbjU3,"R1Maq!fDJ5EM#D$Tf[dbIi$)#JZiU'GNLkfKY,lG[`NqUP1%SLhGB9 -K(ANk-dP+QHi8F9qk)H-lVMSbeNG65j1`p'cb',BD#cdjTMZdB91)J'rrYhVqV5F -1'm+-VfhifC!!68MQ$0ja,QYSRMSIHZ%@E0mSpKpc8hk#,1VIjUS$-+bH[Q1eP,9 -jN!"X$)pFa"&rl!4EmI&3[4i&*-NRqK3+1S`c0'PA*K+ND8IMXJ!QNH)eR-"*&2" -L9@''Z-cQD22UG@bPpJKAQBDSjB6GK4#eU1(I(6fbTL'ja949VHE,L,+P4hXD"VV -3p82$k"MQ96Q$lPF)US[qa6(G8!HT%SEI1dM[(ld3jR$6CY4%FFj1H`5)6QAha3! --QZEej,9@f8+lK(&Ed$l(Jf&mRVHahJjpdm"@K#806HdM!ZGXq[r)GcdMr61+p'K -%YiaY,abT36Q6ZQ!50eReD%1b5[H`C`bp1IU0'4Q2,Ejr4TjH"M`Mr"Z4NZ,VKk& -8RF0p4(be6j,TV*Ubj3(r5@EV+#d-#1MN!9%2ER0'!Xh$5&N@Kk5J`BIQb+9k-"R -il9kVMYIRXq!1SCIAqSHpFErK[JqmMSGhkk$!C6a3'DIH!e4Qp-`I22IEXNfq`a' -0"01%A)`Ji85[r!1A2pdlSNpD9$fZDD"%%TAle'2!EakLUZQkJC&LSF[DVd6VCdA -f((hkmPXVF*6hir)b5Tq"KBeX8M+bR+PC4P0RZTIB9#Xi#qXPa[leal2JF2d2Tdp -U9i8!e3#i%'D"*LL4k#eH$BXCqbp[U1+Bj*q,l"[Q0i"6bNFSX,EH!UNQ'GiLd[P -+fZr4'IAP[-&E,E3XNjeLACJk8fjC,X"3VMek*3PSVqqP81kK0D+(h6CAaaM4ZCA -0C%("e*,@,T@$(0Iq1-hHA[QX2hrpiAjb5a'3!%0flEeS1X@ci)bI&q#)EEq2PI0 -V992,SK%mf#hAR6jJU6"C#$ZdDJ6JXFP$,B#BMS#'[0"+B`Xl#D1k%9p$5eNPH8% -K!5DJAMHPJidMkMK5jD,`q0EYr'G1Y3`(&H5q#*Y46l-0C[bZMNRe1he2)&,R$VI -SR!$,H8H6ZNeHe(+AUbCUpk*+"XT@S!N5l'AP2[C&iQP##ci(lD$+3IH'1$Q-&U( -i+3MdS$qhGYm0jj)IMfb$reIk'%A,Gb+*!2f&1GY4J2k*TVk0YqaV"a"qP-(-REI -3$Nqf*2Nckc)-[IM3hbJ35h[mr&,ZP(-"e1KkS-qPC!0Z1C!!ArLQBXA#9%bFD)q -%TqIVb",dK4bN6e89QHc28FK[(aMJ1E%3F6['`9`8CepBEN4,a@d&c4'M"$0QT2% -(J2hGJT4b)Hpj3E+#U*D)cEQX9LbHid8)4NcM&aA"qi*TBk)l6'VF(9eE*qMp2A, -Li)XT3"e%I"@CEk3YYS9SpXd$q(LIJT*[3cC*QSlCDE`l!J2+#'He)"V0TT16+K@ -emlLkpV[A65FS3F9$h6HkHR,3l9k+Jd6K9MmV%-0d3F)MQLVXcYH$%Abb+BG,LNG -j#28bkbj@F[RK2c'Q*,-dGRF*(&H+%X'2RH-*ERq*qeG4q3%`&hP#+3'-(%""b6" -F9EJrr9`#64BqS(HaH)T%YKd,#`a4Yj&SS((KF`PH,$ZR-e'Ci*6R!2'1XGiARTC -@*5KRpYc2q8q`4I&64PrH"Ql*mCfA@K9k)`cK9f2+6&h"McRYjF)ASV0hqfaA-*, -3rJ4fX'4I9)0BXk[!9MEBFp+d1cN8GJU8Fe@3!&#-B1k00TX[CNprT!M*K'VrU,T -%B05%IUB2+Qd)U93`SD)#'0INrrZTlk4+T0)%U%pbG29'KA(VkJ5bRK[dafKCJ,3 -3f34`'VX@ZRb'j,dTr'H+T"dP#9D)A6LSJlVX-1mSR2H8cc8K5pRH#4*F8R(J!,( -P[iJHHK6p+(2)Y1p0H3Z)8&898[kXXFkika5Llj8l9Z-QQ5F#ejH&0Y98[ZBjFGd -LKNcr6ZbFNk@lm9F0i3d(aP-%a6'Y'R)A!qAF-SLb![MlbY9p8FrXLffF9ZMU099 -38qdA!3HYqd9GN!!4flf!rCV-1qlD9U(Z&l,2Re$b,2&Qe"HPj4LC4r&J9k4MD'( -0dP&(ZIA2*l&M80$[fiB'YH1$,Qq-[(5EJ-0kb%d$DqS-HUl5EH+D5SdQQ1IG[#, --pD5CG3V4Ki)+VHCmaMEUbmdhhVcRhdTKBBXbeU#9KK+IkXP*@D2kq65MKrXSba[ -LfVPJa3jeUS54,&"lN3NmHXd!+,+mbrFU'ILcS[&*6N5T6rf(#,kPF9!dr-mlR@G -50QKhjCb6RFm')SU"X+Yh9`0M[Jc5)3,FYLFN`'(Q@MXfkL-ClFKqd'&5dfrlBU0 -6UaB%dAS3EM55[6kY*"p`-(J)%cR)R*YqLhSZZaRa9kr9ki@lrV(4cXDa$3HkB3T -H[ITE5h8%Y&eqJ"H0qZM*lMd'`qDfVk0ZK0)"FRF5m*Y[jJ&rPYSB$H(aSc40VE` --fQm38eR&KlF9lp$E3@HJmK3!b*!!2VbQX%lV-d'S)UZUY0Piq04jTl)dV,LJSd& -"M!@@69keX6"abj1lkC-V*'b$QB&KYc6r5Rk[*%R2j024A&ibRC2X[&D1YB&a'!M -i(MIqS-@aJBN["UG9"aLmHf)!TC!%!3!!13!!V4,!Hl0%Mqm!!$f"!!"TGJ#3!h) -!#A43!*!16A*&C#jbFh*M!!(N`A*cFQ058d9%!3ErN!3!N!U!!*!*3VN!!"L)!*! -%$`"#`G5+mli5Ze&%c1GJJLFSL"$F25h0R5LIEPJ(4$1k0h0(kdVY8)bfJMr'LB# -Z5'#l0*2YH!2CAEbh&[++hJ)Ae112edc9PPSX$UQh58AJZmPjq"'6FmQUEC)Nr%" -6qH@4NLUfEfRi%&*0AVSTkd4,M+BlBE"KkP-LR%fYV[5cY%@0DBH)lUbT4h5%LLY -fk"eDKB'-XdrCUU0A2,9D`bm8dS-G[`D3!%RK-G8XrAV"F4J9mmXNkbC$3PSG#jG -GUB0rE9TDJG-+fZGSJC'C%L0UDKQZe`fBFIMcr2LBCT*Idq@M0bZT2D"4'mh3*HE -F1A%D$Q,@5EXL#p0'fZJB(HfXU2!U02+I`iU!kDhFqLYGBdfjhKqbaPaAX9mB(hc -L-*pAJS3bSlBS)1JbGi4Q[am[%X'!m@#6S+P6Ie+$KV-8Z"(-PXV2fFAkkfRU[dE -h'JZb)m+-,SHra,GHq6p9Ahj`D$%Sk,C8C*(P)UT!3FUSMRED`Zm)jZSUZQfb8Id -G-BaHiMQ*rGiVXGpMF$*Z0YBi*@i*Pi2eQpDib!i3f(qKe)p#D6V"L3T2a38@1Qd -FQ`2%m&%'31*@@G#"*h'8#J(Pr*%EpTk3!'-f)LiCm6J!)HXlfZE"Gph)fPA4ZZE -!GQFcCI-VQIVhGF6XfSYf$iXa[IR@hPiXGM$2![3aqc!iD*JZF31"2ZR`8,J!MjM -G-lKb@5kX#RBb3VkGMYeVd(j6(FN$V"&IRZ4EcAZMPlQP!!6hCaIGBY0qZ9G"'e# -YI[5DM`"(NCrkABmlb*6-f(@"BiHj*1Cf4J#bc4,,L)ih-R"D1aChVQZYrXm0rMT -R2iS[m2)ba6STChUE`V`aNEi6FA,KEZ,&*Acrk4&'lH"$`JjQ%EA3dQ,iY@j4A00 -Y(DHT1!%()1$8TpPE$X2-2G&N3eG!$CbET3dlV&l4b+YB(k0-Y[((1rA-+'-#FNl -&2jpb3,DVZ#9f#G"R4BhPM$afPHPf-kA-"#[B3GFpfXNRie3#jcXqB98F[Y+p9%T -5p#&IpLH%+e-F1Y'r4fk8-Ub3!0`(f-ZBP62!$5,"ZMk1k%d8XVJE[8haF2'CJS8 -p@'iCibQ4e2D6V"NMb'Bb$"AcTQCYC1+@LrNh)Fr9jrD$ReA"%fZS`(,6NJp(51( -d0$K-C($X8DQBabUdK(YE0FkrHcUr5@8[Icq[G)8G4$ja!8`CmTBAda&9Cjd`%IS -()S1P[,f)$B)[D2PTa*0NUpD,"Aa2$+,K[$*fapJiK"@N2-*Rr%M[@p-aL*MSIPP -J,+,i%,4lkXFG)NSaND-k44'Vi-(r**q4XYA*Qp&Ykl[d)SbJ`[qka#&BL)-NQq8 -I#LGSSrakT#X#cjIPErJLIq4rdXjYkiCXXp,L`HNN-`9r3N2)afeB8V+`hQdM3ZM -)*HFQh1(R9$hf,B93%lk"2ZdFdrSeEc0k"rF2@MZVZq[(L850N!$-3-h`!$%ApY, -R3m8(mSZ,9PcCUI`Lf#kQQ*[&9`'T"0BU-K-XM$Z3!&eAV62U(@`Q"d[eLX($J8F -VS6FkJR@r%KI2,eXdTR"V"FFQrj!!cQBMP2bJ8iJ-@[mH9,Z6XF$XG(+#i[k28Ip -(ia,B[BUX[[IY`ek"HRD!&LX+fXPNNp[!96lGkhY5KNPSRNJIEiMG$&VlV5(GRT' -T%E"9)`c[hY`d52@1X*XF$"Ta%i"q4(lR1M9!cp2[U$Q#Z&Y@GD$rrH(qjKTd!T& -hRYH185,`,)f4+q5GK&a@&X6)4FY8Pr[FIRIpb2LQ1H!+[38qAql1Z,hCNp3%d%l -VEa(p)ak'k4b@C83k93dN`d,FbjDIj*XdS)-@#d2+H'cE'$VmY&MpG4GjIN`cB%, -#dM-1e9k'GKpd5pK+bHDb(D*Ij+Ya)Cc$hG&I65+F$r)P6&K#T`b0HdpLPc*XS+( -h6)!SR8+DrMqJq@A"D,,Z0QLRMjfKTeVm1D4*Jr-'@I[3U`M(80!*$YAYP'10Y'& -%1IEdem6-E,bdiaaJMBP&j(h$HTiF%$L2F`A+r0#B!C,HpB)9q`SBf"ic%,-T%X9 -`+%H'NX(I$#9jj9A55d'mP6DKl06#cHiFQJRf4Mk5r*dPbKp(V`Pp)rcjN9FCVm3 -5,'PIpRlA133"XFS[QEcV-@hIc%SUlp2MCB`Z1-jdYe`QD31AVd6'SdY#Cq@f`r+ -YSX9"l21Sf2P1G00'ZT8SMp%P9ZVbeMUZqklT6CJ$*`hNd0K0bKF"Ve,18BLbb$- -FiLhk&RN(rL-9eUlh1HUeRQ,Re#Xkq-V-jYZ!H"%pKD[NmBi%b%%mDPp2$S*S'm0 -BYX$JpcbPY9+rAQ+VZ+pHI"kTGFV%#%Ph5*ab@a13!*IpJSiC48$HXj!!c`h)HI* -r9#"J&)(emZI45AUb0-+1mdN1-J,+8C9,mV(b%D2@#FV%)bk98l$rMc(1D5$2a&H -Qm`e`0L8Aa[Mm'JkcT8)52+c!@3qaqE93HDUddaemXGdi5BN)ChJ`44hc4+*Bf+4 -MD(0V['2%d#Sb1jP*mkf#J9aa'(FH8l-KI"rL"aF"cZjQH9!Ej%'-GaK*6K+0KZ& -KANRhXH#!5Pc3"9+BG$US'2TI5e$XKQ#,#4R9+A240CZ#)EPpf)M1BSRcFj*a+HF -d8cF9FHG*!f#eqqAh,qZCl!)lPS-!b[j5'[!LAr0YGdqG"'5AP5HkGj9D[U&Z-m[ -1P9d&QcH9UY[E6l-QC`TaM&3e#[D&PMD04er@3'aE@mp@V'3f#P2YeMddXmD5bC+ -k"Z0Dmr,0h'Ce!C8,P&A3Q`H(UKJK8q#r41[[1H-pZDh%cY&'rJ2)2fNM'9Vq8Ej -6MCAp+a3!ddd6m`'51!FFUp3Ijla08k5*fLd69%-XIEJ-#j'BRG6*G%8YJQGZrpa -3IhTKpT9%[2HC43)$%Y`DMqRXrp)@D(2Ti$B$p8JS4Ec6DGBcQKk*-JLhRXX*c0% -pU@AJ%DbYGA,hNGU%ILSXqRMl(`f1fJd9r$Zf11*3$TJ!+A!cKYl[rR$&'m-KdXh -11#PC&58Jf66DAk24SR#2Im3f5+)$S*afX'2c9cZcq4Q*#E8'k'IT5`l@-k)0NB# -`@T!!k`QKHI!'&)`@-9%%aSk0c9)EG8VpQi+iam&U3e"D3qR$l%De"IjJd!)@ZZ@ -N#UlEc62a-"Qq'%*jST'YPZ)2!lSmBpcljNMAa6,bF%kFD0U[e6%8%#ClMi-%3lE -N))HFf-ZVjE(SQbJB8`I1jL-[ea#E6J@q5QXd$eLlDCP!41G`k))frN*L!ID%3dG -8&"lLq0kp2b!@pl$Tf8A!fHAr,6(MR$!9`k)-9jiAhJ(ZNApCk@Z%9MkERD-pdpq -%NK@EB3Ulh'02d5B#BeCqQRSZ@)!Sm4kS#UFZ1rCcISDJYTSmF9J&($Um0Bh5F2M -H2YmT)KPP@QVMRD,5dQYNem6qdkfcRdMmLBI&%VjF%fd#qMYYRS4NYNFcdLq245` -hFJ-dC-*LT-l!jrFe862Z"a1Blk#(8(5aHI$kCk!f$%S!YrB`-4aNaM4hG,[K2X1 -,qMHccYdZDbYFpJ,a39c9I85TNd&@0F&AUDhfXhe**!LpAHd#H*beGbZA#b)I[iB -FT'3X[X&eN!#Z2Qc"IJJJZ`ZIQpA-kkUUFlkYB*,A"'C9)b#3!2+$V`2rqNl!03f -d5*F1Aii-&(Hi8)$b,6jI'Pmc$5ma6Z02YiHQfZD$1Yq#eI%XI`83lQ4%0VeRkXp -LFZiM&Tj(&FUENJi"p3F5LbYlQT@UDSV%b)MhPqaADe$30rcFb4TX'EHZ[5#q5X` -L`MqV,mDjf&'JikG,aVLAD9@'**hr,9eA00hd"i%EkkRUVb(aG+L@jC!!"%J5X,M -926ZIqjf[GjF6)6KiL2+[fYU[SkSPl+(hf[rZR`0Xci`#d0F9rhJ%aPA2k9k@ARh -a6"T*NMEp`#TQ01a%jFlhiZL+qN$"ERpclVR"%jBAF(qrPH*1A&SZ`jQirS`V!Y5 -U6E@Ebr`QQ(+[fepqjrV9FX1L@''f5EXQMqE!pb4E@*)!A8S(kkckmMZ#@GUNekE -XXNhYSVA'fGpmEf-@D*l!j'8*K0E`aJVHJRc6UAk-H!'MQ,8N[9'KqKaPkQG0RN8 -klINKM`JfTcHeLIZM1hKJ`9SP'+%HBUq6m'1C(!'[$cMfMq"Nh"mFS"HiZUl1Vk! -j@3-bcrpDiXZ9@Y!aiA$Tp9Y$#`@2!bk,*T,$b`2$fT@S)d$lU2X0qqJLVrS'0B, -64@cJ$5Vab'a&NdH#Lj*J1*ed3ISN'mEIaP!rFDCGpaAbLIAXImF+hq52r,#lB6C -!hX[l13"bd@TN"DLZ'[PpXZ-kP-*pkBZ0bcPCd@9RVhCTVUTD`kV(3%U3!15Ukqk -f9PJD*#TRZIbi"#bh@!mVXk!"V3Br4Iq+dBkaSAUP`reb@dQQVcT'JMG-9mCUk9V -8Y`+&"6D3!!cVmG+#EIl[#9rB+iS!JA5ZJClH(9F`PU3,-d3hPYdS6ClVGe1mlrG -M*`YfF9lSSeQ,VS6*CU+f-fXEi8CKRB(pKFQ(IjeC"Kd9cK4M`*RKYEY40S6(pE# -BC88EGjT#36&&G3#fUeZGM5MRFG1eh!K6f"ULUPGFKSTaSIX,f1eJl4p8-1a,HaU --QbAK$c!Bh019c-AijF"@4XmU"#I@k9`hLD9SSIeM`f"qM6(j3KF#&6(pVH6!'V5 -qFNmXBik*B9rDBE#)TBK)J6E*%QCl85`G(fi*aLEV&ea`9BL"[LpZY()B6YcYaa" -&rHAc5D6l@5fQ#f'%qN!JTekHacf2KZ(*5FA"NPmFc"@rc8(06[[(j!hLEDf+'JY -&!bh9dHJCSDXd!(Cq+TC#B5i"lcV*k)LLFh)LL6$U&f[ejR*0ATH)#c*TG`I(I`* -FlT`+LYC+%UUVip6$X$X'1CAXf8[L-5pTYi5!`T-@BTep)l`TcKLZ@eY5h,SVMb` -4(B@DHX2c+$%fTXTrNXXTKF)eHGm08Y5&dc%A6iU[kQ%ca'`G'jCJ!*5GhH#@)Hr -j&HE,'c28F`jG6Jb*E83Se$LI3$+4kCaPRd`ZiTF@GNapI5p1BcN-NDF&Q%F(ql6 -Uf04F"8&j*BU%,c`3A-EL8He)-pdU"PUN&HA)F8[FjR6)(F!"596`i%p,#cJjM0b -1RPITMNTZ8+18XpaC-SUUCP86jSI4)@V5fUB@fEMA$BYZ)()a[Q"EA'U*h"@$lCk -99!*hH%9h28iam+Q(FL+XiB9F3D''KQJ2*9[FlR*"aDT*J#0qFc[21kI#2r4TIMd -!1LCGX`Rm(iUEG(mVfY1Vb0Dp#m5kd$aVeb'(+DNc-!Z())rmaJCrjMh2Z9K02JX -kKLL)IYAD6ERrqj%ImflX,%2*&aLkB*GFVUPi"LQN&%eAK6BY1m4jmJfM&Mj5$fT -IlJM[2YKR2$S,k"N8rQJaA`qT(!(STqV$q!NZKZ#p`Q9'2RHZ2Y4K*D#ZHB0#N52 -kDM2*T)4NRF9`ep(pm5"5X$Y4-lB1[UGpT!l1mNS+$hUN(p0L+JMb[0*hL`Tj-%+ -8"I2#fMDkbi@09C4GSpq)$,b08iC@FZe0'Apah5AkkS#MkU(SRL'(Rl5KCjRMrf$ -KYUf,KrTXXCP45cE82I')5JlD4X%mE@3@BGNfFd-q5err3E!qAFMJPib(,k)KZA6 -PA$pLj,4N%+iq&$%1FF$%2XRm*2,C`c(`4#0(c#meJjS$)VpLIH4bU6U,k[3mBUp -Nk%qDb*+b44*,ILIb"S84dEZa!66i"0*LI$jR1H#Rq)!H0A()M99jUZ+&LIITYX2 -*a%+ZV#Sl@kb"A(&YY%$@+m+Y4SMX'!mmh('(@E4QfaP#iDdJU6jm4EC4dKMeZ8` -9XL0fe-&JD@(cM`K(+5f,EcX)1qfRfE(GplT`&R*jp9)**9mcQ09pI+mb8-D!KQ8 -*AUkf0-V43hRC+keHX&IT1GjZ"c0d$UH"+8V+H3d&hB$`RBiU"1j8,9qek6-3&A$ -0`j'QK)#!j$l#LF`(EKS+fdTQ`#Te+qIfUCcrCU#2i9D@UM"pQ!KBK#',93hD&[# -&cA2%T8,0eieaK5QV0Z+SQ,Sj4Ge0,ThN3Bfmaeq,Qdp-2BP1T4'Y2,24B42@$bh -L,LpGh&SV6f#F-qZ*d118$(c2EMpkG[%'RSqB&e!9r3C$J-p'p&Gfaib%i81S!-Q -L9-Jj[(JJhHE0FP114B#1pA+6$MAmV&QjPL))iJ6A5eKlrDhV%+BKKqcTHZ$"2,f -QriXBI+j$05S)r9ZTXl`MmGBPam6L#!qAJ"ANqEqAcJr5j)Uk(ZZc46SKfNK3BaP -X[iSr33,M*6+V!*@0'[Ja8,3%DG82HqQ6ECTK8G%BZ"J8AXKL9PeIEcBDAHPi"I) -Glr[5iP$DfiEErAXrI5[dM"4aPfE(0LZ1d,irkf`A[GdiD[p(h@f#Y'Y44AJr0pB -!cSmc*aG4"r)jcaf,'BqMEiRGla`TX64$LM0U,Si23ALCT!0,KESVAq2[*Y3$h!l -UZHaLXlfVBjrM+AUZFmaJKTq"1Z(#VmapSM+9LY9%9Vrl-4cKITm`Fbb,@#%11N* -@22"0-H!CVJRcGmRmSmpkka"hfVH!9%DV4r8196Jq($fA$DmE[i,&3Zl5eAX+d34 -KX[$0VQH1paf+VXD2P3RD28BDqd3$2KCfQe#1eUq-00a)PUaFF0ZI"#$J0H"c2*3 -aYT!!RJj8GhLA(i'me-'TY9BB+N*J0l#k`$#A`f6Uf0)GmEFT)%J+rVr#9Rqi0+E -i$*%h@[4,QEcMS63R+*RRVh!D8CG,$Q5cR8erLp08`q0e'8C4q`'hPMcUkrCc51Y -T0HkQbRMc9ND1DVqBCm"PSF5DaQJ$FrFrYr8DiTbRKQqk2Ej'de&-9cqHd&,AMb4 -cH6N3cBrdEYX('LjZYmMZic!,4d!U5%hMBUl1pG`&S9#!2%Ud*hU$Ck!V')"adkh -'V0*%b"j#QAj1hA`B1QaTGH'Y4i@G[)3jlqLpL[j2SUkfZA[%lhL%AMA@(h2#,&l -1Vm(N(Fl%`*81$$qLJelpB$Bh5l5JNB@PbCcf`qLQ&r*[#C))[@!9cF%G*f8jTJk -#Nrm"9ULQMN%lbT'FAmX6ja"Q'[l-2&Ukfp3QN!$FL","[[+`+U3'Lm2FFDQ3!1% -Z)%@BTl3Q4XI)Hd@eqd&X*5Q*rA'-MA6`1A$2PR[LiK@d`MA@Td908b+L4%4LG&C -D$m#8EmDccH-6,*e2*3&NF%3Kd)+6MR59TUe"eIiUAVQl39M8UUd+T-pj$L+rKYj -K8hc2AU$BHG6#C&4[m5%e'd9V8lk6P,dB'[h$4-DED'9%R4hqhN&N-hUd[0ekS2N -8`r9j"UeA2a)$20'ZVY1I@)-Xh%4r)5TUBdZVh`c2R0FiMI6f&)15N8je`X(Tp#D -+*3*p&ET6!!HM0"VC`elhrADl`AJ1j+pCG3eSIT+T5*YRQ)V6Mfqkep5e9ZDjJ,- -L0TB0+X%0cr5%EQe53SfrT02LYICXep*H&NI0XNRm*8#j'5FbeVfmYp4`r'!hU3h -h$fUq0!R`8'LFI[YhND)lTr-hD%fh9A2A@N4qGYb)3"prTHk'8LZ%2L-$KLNhr'1 -'4K0[NJ3%'"PbpFR8F1fLDB"fAH,H)ce&G'TfNZQVH&i$d4@Ni3XpDrZ0Ui[*e2! -d3+rkRD1lq#$VB,i&*p!qJYa,*4mC,q!`XE1aphihDTe*QFL63Ql8r2)Z@5Xjh3i -C9edC$rkY"6H)IBG8"Nf")Q4PG"H&4$m+P01#bHE5h-f(Kj*@5$14GHYeXMdaU!l -++S9+ZGm'PU[Pc,[K&c`*jHM1fd9YVH'q@f8$kNXAYr2+F%a0*cea*bFkZeBbhUQ -A0KXI%dK$qHL6J'21F&mF2TSU`FPmUVMUQ$5!ZVc[%"KBPH5c'#pS+$H%TBRl6Y1 -aiZZ[rh45Yd8jVGXhPlRAqC(pT0)-rD'2$AI#,Fc-3h$&VHD6l*!!pN-!DNe+@0A -HUQ0rL3)E6Mjlr"E9*EJM$2Qp!4E[LdprVXR1"#m5l'SJFNmShG%A)'NDB3IYN!$ -9TXRD4L$GB[RKMRhNmq34)*!!SefU1M)M1R[D($G$p+Kj+*J*G`jI+[eS-!)QIjd -38-5S65aFLXh9&"+hKQGkc"HDe&,%SP@IqB(ipm*)1)C,-&,9T,K'2"+b9LqATh& -rNe6-%8fI*,jB-*pm1)&3rdc@V-6e'Tr2JP4MX,%#a-pA$m(X,Zpcbb&DRQbE'ld -0Cb@)bEKh8rf&PYjeS-+b(XiRU,6",QB@mT,+RMQlTZ4TTj*(PD94$GYb!XX$dJa -%8l"aVHk-c[&q3YEX98%i-0#)dIBj8hSCB&b+Dcp2KHMPX+UhDLY[UC`6(4,GQ3E -bah2`(4CVai4D[9MZ3Z"i3*PE`9FV61i0NAI&bU2-#),i1`r,[aKp*hcL5k#C+-Y -cNYUf*Gf@`19KlGHYai#PN!3"!!"!!!#aQGdZY8ahF!!!8)-!!(CL!*!$FJ!39D3 -!!)#1!!!-L!#3"!m!6A*6G'&bG'9b,MBiDbl#Y3!!G2&069"b3eG*43%%rj!%!*! -+J!#3"d,"e,9kLdaNZ$Vm"f)C-S(!eIP0I1E)2cNP2AV@klV1CM8)AYNK'3RQ!#T -r,$)[V64,AUHmqFcM[D4+B#"Q-!(IY4pMNFGKb*R-)&4R9mam&H*Qh`)M0rhNfU4 -h334RT+l)E"KPY-(@2+9"Q*NHKH15dffM[AR-5+rEFKYm(cl+FK%9T`fAj$[*156 -jGrBUf)D1h%M,6U1D8L[hj@j`X%KDm)L0rQDLQLleIK"S2kJe#G(effN8lm0B3AJ -lp$IpL[N)J`J*`cADk1DTPaP(P#5G`djcB2J)UhI'M9f9e3Z+5T5*AUP9KXXmhS* -ZJK5ppdA$`GS&3S-0jTJ#dc`4pF!UM#T-Xb-a4Zfh5@Iii6lURZ!N'"$cIIYA1G% -#RFeFMkc8M!mGSDlP0+AAS#q5bp%R#j,qT,$5$0PcAq"SrS11YlpQ9[0bXD$0h9b -"$NEeQ''kh[caJQD9MPr*'$-"$mh1HeJZT3@$D'(+(j+q*pqh8DBhY451KPX$`*Q -0'S*F!d--6-8`'Dii4)$pUAd`FKG!+q9`@2[*E+DCb1`crk`%RMLSL,qVT4GZ(#) -4l69`214&LeU"B6A-L4U`#4kMG2eXp59-+D6122HCf#Um$(-1aYPmX6(h`rm+#6` -ZU*a125%SZBr'9e*C!FN8"l)NXlI(JjKe#KQ+r$,iB$5Y$N*lKiX$+J6BY8&-9TF -28dL2pM*(V'!q-3m-IEHPQMAYF#*a!eN%-4dq10ZHicNQ"TlEETLr+Ap#Pe+(M@* -rFYK"AjBZKl9,"91R%qp89$N&TSCQAE`hqqmL,L)`T6PR[CS![J!%dGZ0ZhXm["E -&"EY#ZiM1MXJ-)FMmX,&LR*@[449,)Ace6mr#Vp@Ie8l(F&!"J,RM0Nm@bahZ,EA -VGED8%6dMH#8,Cj8flFkipYGkH'(BhB!Km5X%[HMphSFa$!XAR#TMahqf'H8Urkm -B'j%&*4j@l42YCcY`',LFUCc(*Z@ENXmfqGJ'LNa#B!'PZMQ9ZC,V0('VSA4-I*P -XNSl4iD5e[e*6d!HL0)[C*Lf[fF)S)Q&[qTGB183E"YdT490,EUPSXMT3bbMp4-0 -[@Pp[)"[aCZmXDeLClh"CXH[YVTDGcGbP$P6VGpP6r2VK&[5+r%B2X%8cEla#N4L -@TqTR%AMU`QU%2PQ5FCbrIc,fX+LG'XF0@A,m-Y'!,Jh+LCPGMN'-Bc@3!%ABkj& -1%,T410'cFXacZ[jJ$($lMq!'H,Gb6Ib)*12K*hL(Ga`2j$9DLKr&e`'%HkUEq0` -fBajf(Mq&%3TKJVlTeC!!@1#EV2H&2$P!9U1f'0qZQGr!ff,6!TTACNPB%k40L35 --Y+r'p*3-d!#`HC1@eVX'qrKI$%hFmAGIa[TU!-94Pj`1bm+XRJ"3J4#i5Gb&Blb -$)-i(pNUk88[@rVHMh&@ZqCBAl`2k"#%EZe&rf61AIFpBKPj(eaJ6G-Vl!@`p2#r -1"2Ek1a4FMaE1"lDXQU&pq*V3T[8,ACrXLq+VTU2Ip)#RRdX0l,$6kPhZE&C133V -Ep%MajakbEdLmfc&EP%B1BiSNLeN21fl1cpDr64pM(YJYGqK)2(hKXHH"d#6%a4d -2h0KiBBIla##qL2b5"l36cXScNj3Tf3d32XX)fp3rd-jDeMCP-kA9-GCdd%,`Zhr -e"hJ,EN`&V3b#hVpk#G-FE)R+&r-r$Ik*H8QP22[bC-kiALmK'6ZQ6@%1m&3ijH! -b53`BU#-1pq"M3CHQaq#)pUJTij2lFY56lY5-GUiAV2CMJcF43Xjh*dcM61pd$kP -N[SGDjcIVl8,00a2@QY5KEKXBXMe%bjJNR3TY(Ej`IrMSQ*SKS15FIpQc3kTA$D" -CL$-(k6PqB5F"Fl+aHCk8!cH)qDIqDL%00qSc+dM3ITXkCh1-pLm9%PN&3K&2h+S -GiiHj4TmR)!Ep"-f+YAhjeB#MpaQc+03$,21PXmQ[9+B0i%J3'P+&MIT9T`C'ViR -l&ke9kK$2&1S&L1f(%*!!MV4JdZK$r2mTXrbR0!dSh!6mp+TL-Dj8CjRGGAc5SD" -hV&DZXVdRk)(8KdiCGRSmf4G*'5SiXVK6@J85hYhi[RSMbTd@mq%)j5CmphiD,dQ -l$5qR8ieVmaA)m8L&0hBqkm6dD)*[UahlXA5i`ZJhR,(F116NBI-M`2%8@lJFm%[ -hJbD+4Njjf(mjl29kDIiCc'Z,"2M&ki*6JG"p2T)P6K85[Ef6A&K2*#Ec@Dri((k -1"9SlYCDph((K8hT3#9fVJCq#!YLG*MAI!jVX,!lM,#NV-GiSU-F8518@mp!JSbp -fVTZTeM%cIEAC2A*TiR&X"+2hT'VVi5%b-pR(Z"rBqZ6I"f1flCl1C5-La%BCr"Y -m2jDVaj!!KqS$SD+4M+TEE59(3%$E)b2AMe58hR($j9bihK&dD&qjp'PNaG9dc%d -4@@`-'H2PfPk,f",e(ab+Dq8%k`YY@H,1hL"@l'hCTl5%@"(Y(+jB'&NEm[-QN6" -9TDrQ+G$e+BIB5f"&N5@Y8e2VHKc-PJPibE#eV(rSUhIaj5Adc1pV(!,YK"ZRm2f -hc!Xd#R%hXmIM#eCfDDc#4bA+TF4%8pSYRDFJC4)#NH)caQ0K5jh93J'CNfK$hZb -FT5,[&&IklK@P&U[jM8f4i(!6Eq*8cec!qAUG`Z%b)h-`C55P1-%IU2+iFRCkBVL -K'*Uj--PJpL9[Ca4KE0(m,L`TiEqCYS$R`e#S6+UmaE$Q2c$H&aUfa,Re1#K%#i" -i'-lj28DG(J&pR%b-XBlQ`dN-AiiJAUCe`iNV%3rSq"eV)C166P&DAB&D(DD!j4, -&fa!D&JK()G,@Z,IpbV,fXed(PDpcfH5VAqe'Tc4mPSC*LEc*RV(QMME2'L)HKBK -,Ieh0`"d%['ENS9`H@E'Z"BkiCc*Z%UATTHlh$+CUSKHYk%*!+LC(2h03J*-(YD% -YFrcXCh*"r*R-hZi'iRP$(8)kfF"1,VRYibf0DNS,B`ZCN!!&lRIiq`m'Umb[J8+ -f6GNl5rT&-V'h+`fV%SeiqVCc%*p&L4MmF1*km*TV2Nd@#4Zr@ThbXjZ4J0f`H3m -[D!p%ZG2j+AYF`&%%2Q$U)"aBJr&qTT%c+$PNf%VjQZK92,#P(S`8p!E@!e0GV0% -e-F'bdKH(ZKjjk3JpZc3#)#+HZ,SF,@lY1E2c'5GlqMBcq(S*DPAKNa#CQjAJTbV -G@G#`NEr!0HD%+"ZS,Z8cSKE[!RY6YI!%S[$JBBAhZSDhM"$mS2T3D689e#d"j2" -$rBYK'&k$6Pb'd04ASCYA@(qbF-T2YPC'HpaX$pffh2,eU!q!FlELN!!"fI&SPB) -@e5l2#d9-0m'-N!#%l&HQ%LUE6BR--+BIMTJ$3003h'i%Hq+D0IP@G6XdAr0,!ap -jETk)%dJ&#E)(,b5M,CJ4CeENDRXjk,%[mPL(%mh!L@A98HebbHUlL)hrCEefef6 --re5Q'erBKdIA"M!$!fBPd3ZcI-FmZ6",$906)elr+m6*Tl#*I-"H6ISZ@PRhLjA -2Rl$MaVZ43#BR8%6N3Qd[T)h)JX`!C[h@$'C)mDl6Z9&VE91pQj3NmD[@fGqED9" -9Df2r-4lU&MaGpKjc`NJd#U9kQaL24+&+1bqh5'(AR2`9kG0D@(dV'2SIqiSIaUq -4aE*$-*T`*j54pLF2c*&ja)DDSfLIZiMVFM3l62VlBRf92Yl(!EDXG3@9H+VVmC[ -2f[IP15@YAXC&!6AcNQa#QZ("2IB'"&KK*NIQQX0CVXPpXPUCR0V*,3"fHCmpX@X -'AV,L&3dUA52c`1*`F[TVJ1eeXeElK(PXe4h2e`-DQ&,Nf&QP'p9,8EGY1mFTh94 -m4F'HSHfFNP@,&pcUamJ6QS9F4Q#me*!!#%Eb4P#3!%Xb0TbJDTEIA6!-3p+fa96 -6lmdpLc0[lkBN[KMRZrkd4[)df3jEaJH0k@PAe+LR"AF+(EVBF'2lMQ)JD8GY3#C -1ri'21BbE-ZJ3`i4*Lc,)l&I*0+P3NFfb08@%3fV2@5'!IpG)QLY+lYfQKC,lIEB -ZbM#lePA(r9$-36G,Jm1I&@bd3kNU1[B0H0@H93(kaCj(09TICqhq,Q&E,E%L*M9 -1-C4BD04JGlG'IE6cBkS50*Ze5fARq#H'Yj9MLiZTGjBb+pa9cllGA!"DfJV3iBD -HkaX++8fr-#[Lm+[EXmRF(L53!22'0H(("FiI`"5)SZcMVfU$Y,UVL'dUHh%VpAC -q,5#`"f+HN!#mA"[NE)dZVIRQ8MfNKRf0I$[b@-MeDI04'8dRmGIFA`*em)[6fe4 -q@-*L(QaFJ+@3"!%!!$i!!,"!53LaN!""E!!!DAB!!(cA!*!$FJ!1ZR3!N!j0FP0 -dBA*dCA)ZFR0bB`!"P`*bFh*M8P0&4!%#rj!%!*!+J!#3#3ZM!!!'"3#3"!m!3X( -8d#XR9'CaXfM@j$1FI#cXke$GYD@SrNCR3#qVHm*pL9j%Teb[GE[[hH6Qkj`Z4Z% -(X1k(BKC0DFABq3[I(1T#GFaZG`Pfd3%8V36%F-[J19E&(6cdk6pl@$@'Cr1jQj- -qN3kaK0kMHdQeA`Kercc(-2F$`jH4E6,iA5!+i('-UqaH(BjqBB@[l1B4SQc#PbG -6k#cRV)Hh1hj15,f)Sl',VZNa*$5Dr$caJ8d161[jq1JEG'G89C3,$#p8BMXj+`I -pV5bD1k0fX(f#6i+(4U#MbrNGF`dRU8pr2[U-UZbSH3je0lIRD1eYDP8HDTJUKKd -rT*qY9!AQ)P3#Up*J4eR'I9pP&f8MF[)K(jHpCiR9Y04X0c`FHpUlM[bb*X`4QG` -rPk24mYUXV#*ka+(iBF1JF$j-UMqfljYlf+lSh!0@1R#8YEaP6A-)B"6$X`jA1bE -4I-6j&iLL`!Jf9!rb@hcr9cEb(5ZjAE!qN!"3E(@)rf!K1Gjrlb9&CDE2qpe+&c, -Mq-F5m8$6Q)m8)L)rL5I%N!#QS(#N3EM9&-j-e'q,`5Ha8`,DMQAqhULDP8p"B!# -QVZCZ*$brRCqT+@P,MTRUHpXK@'Z'jBA1*@dXZ14N1)KV&--cB4'&bY&[jQ(m*CC -e[`kclmiRk5ZYLdjjE01Aki8$PNF6!HEX3aaBIfG&ULeMMmJ81ldkF2cffEKjj9B -dphcllKS14Tpk"iX*-5bN!J"+1GH-Q9"01bP13C-L64N!p%2R3,SAAIUCNI4p-V) -S9H*$K@[)1E9e*@Xp3[IbcC!!-UcMqhKb$4B3GI-"DrL*ZF-5cV3$88,AJ`CG(F[ -2G&&MYfej`$*6([6&#Zl(kV9UCqF[D[[XplU",1P+Nc!6AGZhHrcZlXIRZH8"1&B -P`UV0*hk$Y3%#`U%I2ZJZPGLGGI$Y*HNrccEPZTl-66NJQqQGP8hSfNGkSIP8"X- -CD9hp#a1GMrlk&AGIq@&mT-JYa(&I(+,S%3cc@KB-&Nq'F2#!XU!l0*!!cT2[iGh -rMbiMJrfT`hN4J88bV`$Dr'L3!1N+kCNXC,9Yjpld-QmK@L3kjS3h((F$H")S'M% -bS6E!'$3hKTGBD%G24DRQN!!CAN*hMAc`CA&N6rH0jmIfdkf1ZKG!%)N1k*!!U@@ -X8aP,"B6Bi`l3@S8(CGfPETPS,C0k3G'('E`kIHVSElTml3XRI64L2b!)YrT"[FH -feND1PThH+5"CT6#0(JS2rNh`UDl0q#eN(%P4Jqk`QFH&A6!SHhIRQ(Ek6p$bcdT -4DCfr`JMmXNb,kK"[kbXMjYi(H()rck91`qrB!@Y`fcFK5FCf5d*ceQ4Shkp@YRR -1r$lrC,pm!S8fIi!K['f4MAhM!RXGekVh9D"pB0h1A2Cdr5j`,rrQ'BCr29c8j$% -lf@6)d#XlNi%)KCcT+P-!T0a*NP9#CfQX3SaJ5EDUq3ClFih)U88hHpfe@q9QQ'K -PfFh'CJFEKP[DT'-mm+`@LTr#NVGQkD"alL-bqADS8AZh$8p(h%f%*djK0HQ58jZ -1eY2iCNVY#de4lR,k!iel2&cbMA3-KA2kC(a%dChf3(r[8(L[MV"Q(+D+,CGIeZl -H)+*XC$-Q!kj#6l1$8%NT*h8C&1d)(3hMqXiPmS-U@FXI#dJKD)qJaI4(4[aHU[m -e8FU,P20FmLQc,J#4$AqC5'#(bTa!'l0E&FTFD33GXB5R)[+JB2iCF'HVbUaU[b9 -jj+Zq2&&3V&d#Id+"02-A(kEb(bA@iMiEMEbkV!4HMQl-3)*P$%%`[-Q'X9Sj8*' -YeHp#q-NMhK&C*reX$150lJR$[2Kfac%EYhmS&88l6QR*6F[e6pR(me4Vr,UpYTj -jPTXlr-p$H2+X0K[Z1b@d3)dJThaPh'kBr`36R-'dpDS98mI`e"jI@Yp9JV,PC3N -SUV01'a@Br%Vm99Ah*lqGCYK8B`TDS*!!BAGi)%[9%8S"lL"RST,`U"3-+kTZZLS -Yj(hSYbYJE@8(Q)D%F4$#@NU(Q4(%6h8BepGSVh2TBLl4EE-$K`m3'Hq&9!CbDYD -#qf+Y+@0kPJ2aJ+@3"!%!!%3!!,'8MfLdAFh(!!"fBJ!!M2i!N!0b!"3T,`!!R,N -!!!qr!*!%$`"0HP0MD'9YC5KKF(!T,MBiDbl#Y3!!@$e069"b3eG*43%+rj!%!*! -+J!#3"d,"e*hS5XEJ,4EJa,3L@i,QIUqqk&VPBM,MhZ`Td+EDkkr'2ND$kKEkFBB -P@e+hl&8XqTDN`'-`[a@RQ0Nj0'"TTaZp5-Ke4mk&Ip)hCAkk9GBlH1"KbLGH-@$ -'$`bDamh!jH+8GF48@mA3Bm!bB@*EIkCElfqI5ckkrQSZlcX,#,jYi69iKV@!HEU -1pNY(TVCIaK+acT46AV$%+XIlcX6BFXbK!M#p%HNQCkrdX8r!&4&Nd-h8l!iAAi0 -r1@3D8*el@BL`S8#&83`3)X9J4"G'5D-K1`Ie8pld60kk*M3!AX(rU#q2B[2ZLh, -fH#Fd83"N6k&4VI@lh-)h)8k1kL[!kbQURZfHf4*GNY5Pj0TJaP098)@TK9*caQY --Lq9M!SISF[Z&Vc@YHA,C$$"IPKYV-i`'@IPIm-Tc,d0PXXfB!P,p3F9,dQpH"9@ -kf'4XJ,+f'R9GN@d&l-Lq2jHrX&e)2aFLK"MNaiY!T!@9,9-8d`&b8KqF9lcr)&1 -&l$M+1I2Njq'FNZAMBSB9pk3C!AZ%VrX04)),Vl[Gk3DAMq`C3f8m,f20V4916T! -!Ne4j$P!lPREVUfZ@q(c%%(QD!A4L#YiNBBDjZRI4XG"JRjPH'%[*("+X)'TkT*L -&lX3+VpVXD@J8mdGX(J#e9Z@pRFTH-a`X$Q9"KBR6"H*$SPZ`"qDBK3Vb9XA,10' -e9F#S++M56`TJH))b5$[5Pm'EPacD0C2,G(`5Ur0eRDAXLqV9!XmZjAM$"i3N5`P -G!Z!hQQmU!(*GIDpS%$#Gd(QEkPmHL*X&S,2-++H4ZMDJXd$U#m#-U2k*4+&qlCN -fa*M6k635bKEH"$e$6Qic+4e54H%%ZY1+p",X#pP2'&#%+JrTPc*2#B&"fBi,QTC -XJ20$Ebb0MJAeeLZ#CHB%PZEb&S0#LTI60HeN[4P2G0JDI#")0AK6lPR5E$ARBHk -'[ZPclQ'`&mG#'fHFL-XVNX'p(m)%*&r*EdKi1m9'BaT$$fp#f9D595D$mXAHc(c -A`p6(+@rC#0ED5l#mKUj6BM1CHL8N"qY,cHG&fd3'HG0&b(1,ZB6bGVZdSNqf5V+ -"@idMXXp+5pF-Fm!U,K@bbraDS2b&FEPA2eTil#$R*A%H93QTSJ+MSFPqZNUkjG0 -kaMkJ$NIPB`8I1Y2%FKKL+1HL-3h4%@Qf``3Ijjm[E"f+Q0Q#VTGTE4FIA&`hY'1 -)$1N4,Gh-K$b"`qG5VJ9PT![CcNVUJ#Ql8qTk86S$LbZkX1H2`K`9FT*9bZ'rT'p -"1Y+3!,p)6Zp,[RDNkT)qi4ip[dK1@YY5$aUekBI"XKX-NVh[4"1@SBIe#YkacQP -YmCAP2SqM&1j)ZAm)"P9c0I%3)*lLHBrTMP!*!GiX1l4`[c0ml2kYp2JU"fG"APF -`VYAkA04Gr2LqU"1cZk'fd,5KRV0i9CdEjlaICj6Jp)Dmhf1(fU#Akj3F8@K1q4L -$49[QrUVBY[qYi+rVml5Gl3NK[L`Lec")r3E%iM9V0RG!Ylj$1R,`elMm((I,3LF -PL"ZeC$JmU6TQi20ba9PSUhb,R((SX1(6l[aM)EF5RGAFA-9)c@dlY$Z,C1,c0fZ -Y[D+UNV&b,2NUMD1X'@0#%k1D`TfXPD0+J[-+Y1d%$)mbU@A+190,F-J&J-#UK[d -q15AKZSfN3`R5CM*RRL*mM@!K`jl1"$Y)+"fT8K9BCp13!#(A1h"8SJ[K9q9+[E9 -'8Ph2C1AIpK!KU@B+i`SF2M)ZSrN5Vi&@rGPM'(fGXGa0&)fXPc[h9%aSFKV2H`R -NN8d5K1qk`'$HXJGikdlYah+64i&$G4QNT&`E@*kC)$J$r6b#F5D`m*LfN4DG4Ea -"2cHD[YrRb[R01LPdCNRVKA98X,hr5YMGUfl"SRSQF64JSIJJ,C&(h*S[H#YY%2H -B$'4QTrG+BhQ8eR$a4k%%CVB'#*A6dqR$XB4m`-f`*DK%8Pc$eU2ikZmN$8V*YJZ -)k++,NrAD'%4$9)4jm2E+N!!hYQF4Y1hc2'%N(c6fS"aMDV(&mN[+hFmd@%'p[K# -AU3MVRZ&8[pe9aG3694,m4@!2-UHB+aRbDX"AipKK&GpC-(AZ93LpmApE'MldGhc -jAq0p64CY,&9G15GJ##N*eVBm"*f%[KSMac#!8QG&MkDRkCS$0brQ$fRIj`8U1lQ -6fDN!R0Y+'j1X0c`i45FQZRL2Eame%"S*4*hTK*!!-e&IYhXk)ka$pqiGqSP+ppA -8[NL6l-5q4[*#59PPRA@Nq)YcZ#*dr`,2aEA)DQ"9qEbTJ,fGH&e4MpbYZDcZ$0E -*TK"e,2-,1qYbINmVdrGh!"H3!+,[6M"G-0!e&G'Q6Za0h1-!p`m)iBQ'hN@HCd5 -Zl+e&aaa4I8k6pEB&Y24GQiVfr@Mq+$-9CUK"SJJ8%#b%l)8B*IPeAN4,[cX96+N -"0p0XPHG8mVCD3!bBEVpa+)Ze6YJ%cq#abRa0CBkU%Vh#APIhH(VEZKhc`AHE9V@ -hC[3YXBPS4pG"[)@5i%eJR-+M)`,MIfJKT,NjplJl!Z9bqM00XjELTBBKdfcVIqS -HhAfq4rq$I'p@69Re9q9E&!0[fcJjRHTVkEeQQ)Z6T`Mjb"li%ZRTmF$QY`b59e, -C*-c09Gb)!fC510J!YA@"cNeVZ`)%HaS%U"*m#m#ETI$FB+4"G6B)HqU'Hkb[%X& -13P685IKe[MLD,BR#&30pVNCI-VEDbNSla6e10%@U'*k)C1(apDd,1b5L3V)(UG' -J!0rU)1`U$2(Z'N+0qb)#)K!98T'6%jd,QR2X#%3B$h`NAk6kCZLJV+JpL)!GrrJ -(jDq2MYmVi4F5M65P$Bh"N!$$!kVjTHirY&XpNTrA(DIS$F-VXYZP@MA&lJ3)pEp -Nfm%%1$R-A&1Ybq&MKKM@-BZfj8j&FZ@K5ik8jA*IAQ[de5l["l&a`%`CD@c$*(* -Ra[1UEDe-#RIZ*k*,0-,5SfI,e*!!X,2CCNjmp2VJ,R&IfA'"9!IiMGRq`KlHc$` -K6@V,lME3dp$Z`d[@)j*LBMkeE&&"mF[B5#YHDa5Y,R"!$c(B&$qeHe4U0-Ml`H2 -LTV$liX48P#aCK'J'(*2a#4UY[)M"D"jliblMeCJG-`TEhh[@e`3P)N1Z3S"VM!D -1caka32HKdQRhcR'#E@ad"QDrCR2RmRKjea0iXQG%B6$%r4eP+[jCANL*Q)DfME1 -CXMe24MBIlCAPf5HDjjrLK@*jha8Z9'bm@0INN!#eMVZ+3[6IIApPrTE4!1[2`#R -3LB,b'FFB)[9c4Ir"3R1l[6fkHY#HI2-B*B4@0P#VqU&+0"6hC@1PY39aQ58V2#r -JaIliT*,cH1DJijE9&%F`G'be[$ZK9c3EATGj#eqq,Nl`c5K%0i`4SRN@a[i[F3m -YNkp0I66,4-8VR43-FDTr$iBVe9H0T2lI`4FNm#VJ&m`f@V`ebi#$'Zhf)`pXe6d -*[Vf3!#Kp8iHS(L20KUb00)`2NN,0*B[,Ye%j2FiHpek2-5dBUjJ265-TSIk)c(, -h`aFldB$q(5emhPT[2e*LJZGeSJJ`Bp48LkKJB8MJk$+TD6'DCS`iaR+[TT8L8jk -ARHR'QaaY3T`8Gr@BAVcLa(Qq@c0!iU#hrNGR5*bQ(IJjV)YTaX%UJDXPrXZPTbU -I,%!YT0ei1J)0NS(#G"%V[T)GFGTCc+hVM$"h@mM03kj9,q[U+DipfQ8ZAP4RLSE -'AYFBkHfT1E9kT3V@6H4Hl`6e'q1F#4i3R(pC+Q#(VH2UX([Q1jm&rK6EeV+HVVE -j2d"d%aeZ8k%m0[0ArK9DFY5e6e'%'5`(HS+hqUYj@S2mM'5#M%f*!EIrFEB94id -3f1#pk"J,X!2(GcXZ0'E"-Mfr%qXb8hQ@!ai-eD[h[m5Q)$9)eQ+6m'*(Xe8GrB& --rj(IKceY1HAfVr[IM#*SppbcZI0k$6l1d#a1BEBK(T9LUG12j0,@U34X[Mj*b5` -lj5T@F5LBpLq4pXqUVAP9m"04'8,GmL!)6pS2HJ1U'(afrKZ%Q59ShZMb`rh'!i% -X9&lIXq#N%2Z)@b6NMQM)b4eb!$V`2RrJ,ArcJ26Q8b+&@3iLK1RbHqkRJbU2m!9 -1*V@cr)JTpj&%SS`)YFUV"eeGDH-GJ31Aq'@L*J5T`X0#"Vh&#M@XJbMhV2(GLA, -8"UBrCmjS@k*r4CFeP54&*"6LHc,#rQC(l,UICSh3@bE9I6-b[LV!hK4fEXVkA@l -GmQ$@hbX0!Ub0&PSjcLR$mpVfZSmjjX8Yqr4l33(!",(2+fDhf,dR+6AkUcLZ'$h -Y-bRN#9')(SNIBc5'&K4(9F5QF%qNhe@5a[fkMCk8Tmc@dZkYd&Eaq0T$NQXiXZH -FPGVCT28,Z[0C4'0D@@A*"JHAQTV&[X%N'[CFh3i'2AVRI,"p4Y[3HEeJ#5fDSTD -*a6%c$CYCGT!!FI+M,Z6+klK,U5$G2VIFD$e0L5UD)0[jTa4V6BaTE'TM),$-,qa -,B`,V563JS#[bT5+VGpeAe%,`+Ma98+AD$+qS9Xi2)@XFRrbfM1JqZ[``NUqK3rm -R5fAX6reLfJB9&jDYBkfMmRCc2YVS%(*"5Dr&[Vpj3p#2C$[aDTR&Ri6PEp[['(5 -KF+Rl9GF#h1KXNjbAa!`5Z$a9!mf@H5#AZ)Mi#RM9AG%%%3,1Z[dYNKc`@S)H"+q -1RPeZ+MN+aQ+i9Tr"@%5Q%$4!haE5VEc*HD0EV6V)DI$%$kMh3@X'!Mj#$R'A6T0 -i$0"ArCFC$3c@rP5CG'8``Z*1phB@I%XPjpqV@9b5NX'9mR2"qhbUd9b6dpAX2C& -hJ5-!Ba4IVEiSMPZ!(#pe&l1+kUGN9dHEmHEUHqIV-,m#X6jc[9YM#Hc%qRLL[2* -EZfl5c4I#'ADLH[f+'+EKi1Tp'T*$TBVH(c*+2A#3!*CIcM&H"'2%(JP0*UKN&5h -#Q&2!YXAMG)N#)9q4!&hK!E0[1DhDC2m%12pcFqL#X5-e@%lceNpNh("kPD6(h%K -iI`(QKr6`+mqZGVNKZfN6aJ*TKa9JKL66YK'PqQPQ6cF+6AakPUZ(5c5MYBFD)Ql -2m2YIM,J2)d(Mem(!KA1$0'S'%`BQ!EQ#2,-T#E%"mQGS@)pdX[F8m&-F`%L$9LU -A[MZeZKTNmRdQJ!X@`Se`U`H$rNLT`S%LGN9JCrMX+DL@",2@3"GLQ$2*A0BEbV) -e)@`"C+cb+)kJ+j5J&j[abNYh)AE%%kclRlLeE!E)305U85[mS$NM5D0"Z2FVADU -#(HD5elNfP#eSBYV8HLe0YaKGYZIeJk-1`G8URMZe$IpT9JFIhKKcfIP1e43""`N -C'E@ce6Vqp2N(b`XpKe06Cd@J%hfCG#%pdYhNF6c[*&FkAAamHa+2"2)i%a+$Nc% -aL(YSjqr+UrM6)JCLh`[3TC!%!3!!4!!!XC5!Kl9-G[i!!(cA!!#Dr`#3!h)!&'& -0!!#'I3!!$CN!N!32!%ek8f0SC@eP+'&`F#NZF("M,X+e!!"B28e08(*$9dP&!3V -rN!3!N!U!!*!(3X(8pRb29,)"$6K3Baq*#V`2+Ae&*&-h%Y2dd[8dkp`kdpGebA3 -bGN5jH#*M"URa63VcmRA#Zmk3!%8j"%+P#P#EcMP[bfBk6TUXE!Cr,5NS[*F+T"j -B3M5Ue6pl[N+I3-6Iqm0Q3'l+K8`Y9YJKAT!!'Idl-Lh,,-@+&j0HJEZL0i%IlG5 -$1H-dMYUeXF+R$p2F#$D(rr)TZS'`U,6h0ee@lXGU"c-(D"$JNhqmBfmfVQ8[$DR -GbFCN8jZIb#8`XbSC5TNdS44Brj'KK['@63"#mpG3!X$%LCmh8-Xq2[!GNhV'Ae# -(pPK4#*%MCKl8CB'IrG$ec%f2m1bf`M*Y1R#(IPQSQ4fIF&5k$G[&p#'L'%q[@L4 -&qc,VZ0U3!)bP`A(F`CJp-d$$),%%G")i,IV9lSpIL6r&F,j32KVD$1!B[BbE[$N -5*E#0fRN')if@43hZS!(bIYER0cM%rrFYIPjKfDdr#$90(3SRZU96Y9!-ClrSk8J -M[BHPJp&0Gk$A1CcaHc228Jhc-0M0-QDQ5NDql""mA4e0-%r5KKXj#jT&2eN[F5C -$5!($ZB5LE0d5!)8m#l4XBI,`bA6M,FZklIbBC!6BS4RA8%LpJC!![5jArNjfU+A -2"K`jFPJ`@*1,AN'L%*+9IBIqDQm[1A!LME%,GB-%E(Ir&%$[JS)m&%$h!"JF8l, -5LSc2lCjZEHETh8KQ)N@Ji*J"%6'``cYNhBIM,dL8IB%*-h%,Q2bl2plLZL66`Ue -0li"Uq1`B2G%F-(r6R9Xmr%**DQ`YD!8+VC!!+S',bDNl`-VKK-mr3$-a`JF0C'V -@'Q+*T%cd2fpFS9['YbJbrMbP`#!L2M@-KDXGEc`,1&1K`c(eLCc8-a4aL5Hc#rD -lI[[mV')$UJMKSrYe$QG3-j+MA9&kREH,ER3mJSHYNCh"Z41D#4)PjNJDSKX'pLM -4hJEkI$!VLa-Rj,RG*LZR`2,+EY*4UMpr8LFTAGb4[P@aa-Pqdm+0Q,f[!(%&)hm -J4`Kb,#rKlD8UUAD%LJ"8i3Rr3#EYkcb+3-bERG82bP*Af*LF33*PUiq2LDbP1!Q -BS+LJb(N6'j%1dJQY!M#hBIeJ6RYD+"eaFZ[kqIe3kL%pP@-6Ha3"52m$1[r2'$J -RMMEJ!lUDheTf-F-T,[MH6IL-ElBS%kalTZ5C!4'rB3Tii,l$(++K86Q*1['!eB6 -MqIZYSNaG%&A$E8Q"VjTDJ%m1J%*4da&,ZC+JRE`TEk@iJAp&&+be$ZjMX#3(PD" -B*R*P'QTSr8lj`%80d$LpFPHafBPZeNhKGe#,THB29mrRE+rY,&i8ZHa8mc(rQc4 -jKeEaeT4eAlAjj`5H%3'FTYSRLmFK8kEG,LFl5,rR9S'AA62[aQYN,5!Gq89F8hm -H$PSCrCRGFZ38qIY(SlbE#kGpL12#!#r,0p"J@@0rfkjI-#!hi42Ya)3'Gc-GLXj -")rKR'V*-45)fpR)'@F-FB(KaUcMkY3U%JD!DV+(E%9GHmk8SD%q#mU)GiV!2chk -2`NR3B)eK)+eDpK6Sa@YDB*B0FmIXK!R"$4`j0QbVV[&@3cp[,pAiAMX%F'U6Sf, -EhmGcFl$'FJU`q,S6i`jR5JNLEMFqa8QK#k$"MQk8d@`bkjXhN!!0l6jk!RJY9FQ -8p6iqPm4J!)[AP`'XJ3GL[B$i5QPfLF@5E1Tbka&R-*`D3C!!l%LM6mVFdfV(V$G -(j8h5R$k-$aGZK"&3i'mSXc*+LJZZ+%ZRAbZ5ThG4qiDGFRAMFZFG+8Dl+50R#0K -MZ*d@h6JQ4&%qmDl`h&FcrPT#3[i-MP&6X4`V#UcASqKVG!ijYr!*%%1kRA2@BT( -kN!"-,&59(3e&NK-AV#NKceFP&PqQcdc1[d)+2iPM3U[DQpX$%JBX@,kmdj(M@)L -UV"JFNY0qPVLG,c@))@LPH2BkAbV"pCP,B$`b)l%9Zp*cmlAAkcqeR2MfYVhL2Xd -CA*&&ld1NrdaXTS`L)+Q@5`K%*YkCV9%$mrMjM9&qb8*+%(f0hC8h%[q-j0'`qap -ZfB"[YRJ0Fd$N@81phHpk02B(V*MpG+RhmK"pM2ElX!Y9#`-S%YqS)Se-GT!!%L) -k3XU%m&3U$'d@q0)Ma9DS*B-X%TZ',8$V!`N)p+HjqRYCM$)(L'K,Fl#MiqKfR5! -H8dDBIN"K!lQ(LqG4b0-JGNPBR11ThFNAmAj2R,aBZ5qSZ,V,reXJU53kKMIEK*, -*F%"IhLD'0pPGa4h")1S0Z[J['U*c8Bqq3EYei)U@jZC*2B6aA16r8LV!%B94aBE -`*XYUBi,NLpIcBeJTD2q63D&TYC3pX6Am+G#PU&$2XX%5%C1r4S'd2FHmjVNVKkM -&'$`iY$LYD'UZdJ+k*`9B-SU5'mX%C%"JCMXL`8)Pj3kV(&LZ&[$BeRe)89Bi#M[ -LK&IM93#L1$R3)A@a(("FF8K[)`JljVGd1KZrAD+&phKbJDVUVM&&q$2qF%"-6Zm -4!B1)Xk$8SYM4EC!!r0DlaX*M-'S0,H)rFHH,5eI-V&YBc9p5RjZiLAedmEqQFX" -A0S9DcZGHhVlV3Id0SJJXT1hNfbQDd$dFrcI9PbEYkDYEE#*G'3!#0P[!Z6dXC)I -IUZ!2LUI,@UQU[eblK3Np3Y(ppeH&2ED@QT-*PGJ2T,k*SK"*--H"qaTNM#m2N!! -JdZ0q%qBaDe'N4rZ&i8!mN8f3!$#4hI&4cGPCJNkD$Jq"AkRJ[1XqVE+cMV[60Y% -df1jRe%EK90!SHj&5cI5+dA-rSi3#62rVh$fVHT8rF+"e*jZD$bE&Rk"D!F4&!UL -p29le@p3m9MQ%0)Zj*"8Xl(C%L+3'8G%c4CfVF(SBZ!$YiL1$m,3AbD")mF1ZC3d -P9b5U"j%JZlLV)bYq%me'TCmaBDl@P'552r`!iAEjV3IH``YE`P$UppcHdrk8'4$ -E6fp!"X-PJ'!HC)CQ1m!#1cprIIk%JK0)*!Q"ZG3&hG(3dLEkrd4UG-$8KB*VUIV -9K9Z`hHNKjR0)H`3aD'K%$E(ANDUNjCJCMI+"bR2RLrJbcjcUNMI*6QEHUYe)qr6 -Gq6&3!X6d0i$'feCd228%E[b+bc0[bCMFi3*-$lmd5&[bDSLibDrE4k3,`YGX-Fb -cJ,"fl`rS!dN*IpfSXh4,R9K(*k0)N5%apMC`DZ5'JFe"bFk$,P-F(TM+@UhmEek -8ErV&SK-L*5Uc8T%$LhQhe$U(@K'Q4r($q0cD8&2QJeIj3S(h+Vp5VBK49%iChfc -X%i0C5&d3G"YBNl33DY&lPCFKTM)!GJ#K3lR(YR"fZYr@jmFJr"pK%k-`8G@T[AX -NXQ9$pHM9&(NrVXifK#pNUF,Gi1rZbCB`,'d-Ffiqh[0emq*KHGb6!qJrirpq[6R -4fp1N$1k5H)c$4pAi0G*F2l'-Y(AYm(69!$&&'Z)$d80#Jb@"cjSr+cBULbV%9`8 -[+$LQLK-Np%l)iHY5heBLk"lD8m0N1lbVAMQXmUN6N!$FhQQI0"9VL1`Pm9IdUIM -@I3NSPF%(08r)iD*K0lpA&&[)dZDQUam3Je)L-dM4#6f9&$#%BmY4Cb)43#5[8DR -I6IcQfI3f"XGD2958[J4IR9k%SIdpQ3FQC"KF[CbX3-e1E8!Z&q"#6J@dpfm@cL+ -p2)ch4d"R4iDVNH*$94$cf"eIkL,EUAZ19%1R`JejK2)(9M$-kc-HMlC#4ZF88Tq -P@CU88AN"Q`Ck&f%8q3eUcC2PNMAceeNQjAEqc-I#rq4E4@!KFmJih5d#&`4,#KX -p)V,D3H3KR3*Z&0N1[-P4qcK)3AbaVEeadT,k"Xk3!02hM*ZT4dFI6D%,h[E38RE -`9HFA&!b)j!29M(6XCD(1DJaQfdiUf60$02&QPIMb6i9i96"22feC!*GpJl#A@FU -8-G4UmjjBF'BZ2THUeTGP4jGjT5,IU&15!5qFA6Z5REf55[!l`R)[d#eN`P+F5Ck -#fXT-SPrYh9"X#VcS2Bir,Pmk(*hS3YrTr`3kF+Ci5j55f3a5pcJl!HbES'bQ9'p -4*mcfCdX#bdRH@a6df(2#h!e9GmHf'-&$2e'b5N"l&A+)j(5@Im2dkPKQ$&0YpfT -K$9"$'IEM'b2C0%,2A8Ai8LIY%GqC[1(HYLXTm0!*")%cr'lFdG"&ZUDPdZ&$4l* -pDS"-[pK"4+F&rq#fDT!!!EL)G0'eL*F!b"lc%YDZ&!fe$JfT*YQ669I&CTGKh6a -KrE'`4Z'99i+*ETVY#raL00f*J`MUaPh*J%@Sr3-C-jc`N!!ca2jVURSfaHYNEbm -V#GAVFIY21KNLM$l3kR#*CL[-46$pIbd)F5Aj3Ep,lR(,H&ETeEfU*UpqUe)26Zl -0&#KDm#@2ZSba'U25V9$)%98-1F`BM&j`8fXR0@Y!M&dA0M8NNQk$6r#&H@GM"`! -Q`jZ-Qq0L8SJ10#Z1iAGDJbY#@1$HVe1`1Ycb@)$32hAj[%3!5*Tb%dJGh*Q'125 -SaNUSbST1Raf1BC'4G'fRAAU6q,3F930eEUh+qcA`a1fCdDDPJpYIchR&C*5pX(K -#ZBDVXpbpqd*+2fh1Dh`P[*5Qpp93d4@6S$%R+5KYHL*dJ9IfkYGr120VlqH@U"N -D$)KSN!$!3J"HBfe8pCM2UU%GYDI"iBTiN6%[J`*a#H&m5#C!"m3K"e+X4)bqX%4 -$pCJ!TC!%!3!!53!!XCS4,,2-[N`!!)cq!!#TUJ#3!h)!'6fj!!"lPJ!!$Mi!N!3 -2!%ek8f0SC@eP+'&`F'`JGQPK)'0QE5NZ`V8!!&Jp68e3FN0A588"#[q3"!#3#S! -!N!G#`G6'r1AQ9X-N#FMSNl)U5UX$e$2"3e"deQY*[fkeK@*Sf$Q&J%F%VNq,)$) -)r5dA$lP*6+j462551IV@hmH(HZ82(68V8b-F+HM-r5rIJmhSM4!pmQ[-TrYKhmr -hM+2@4jlESr0cqAebYTrhbEmQJ0F$)XF8I'hX$1CVRC`CR`T#PM9mM%XGGi4P6AF -pQVpdXij4Lad4qP3DZGN4kk3F(0LCd[UAmIX#c9Z5c&G#0qiPdjN&)"9A,`QC"N` -K9C!!HMa'8#kaA1(92Q95aJJXV+hrJ0eQdS-Lc8BdGfr3cVKN2HRPTiL*LkAUVJl -T2h8m5#9**8`6Rd0Nea+R9Qq*A#rL6#1U8p4@6$ZI$cErJfYV5lAPe0`AHrL`R*k -miLab29kCrDr&f'++"&E(p#eH,E[T0hL8`j[5,RjBc*QQCSBj5[l#08YEei1))ST -JLJSkfE@#Q[aBmjkZaaBJ6*hUcjMfj[Mc#m)F3V,Jc!NZH8,SV,D6MhlIZGp-'38 -mB#+DXr&6LQeKErN0i5UL(X#",0QSrd[R5ebc,h&1Y4e"j22L@8ReZ6$U*6"[Fh2 -$K,D'eAN"qDm4IEfjGSY2ahqGLHfI#1A,hr&QTTIAY[m-!mp(!rL"JPae-KK[*rr -m'5K%ZPqDX0F"Gc#45qX113U`#4#j1$DH0PD)HN%kmLq-h8-@fkJS*-q5#(Kd3Dc -ZHD$JXRN9A9frDXVCj42hCM,r[24h[,TFrXVD2a*[4$ZL-h#N45b!'p&bN85B[+Y -Z`8mm5&bLYr8``bFC1IZTCRM'Ef)2FEP0I9(drY%-)3TZaUrCDj,&AUj#5#fKlY( -phAhP5ekd*@-%,[YKLK!ZFj*j'pq8DCi)rh#m83beC95PHPlh%j(24K59&$-1KET -Lm0KK!@-%j$deK4&iI4a"65j%V("pQcdki`'XJUK`GjAHJ5(e%1i+,'89VK!*d,H -6QbKhG#er!XMK1&"RSL"CP0%%JhJAd*FlbrQiJH,fT)'"HQ-a)EY'[4JkSYd&jC3 -Tee`!pbQaI"R0T-c`9fTIphM4mj*hN!!#pCXTFT`FIfpZ*K#6RmL,cajB35Fm1#1 -X`qcdQCDq[+EUQY-012pi4iPB,mh4ejKb[Ph-[rc,3!l+LSf64iYKI"lrhGp-lq* -%QULMB4h(Pme[S%l&9[@iJ-*0a`l@!1HCFZ&caVD3!$HAK!SBE4[c9!`j*mRiX"' -cUR"%(C'q#'8ZP+ZX'[H&(2`!dZY9"RPBHj9JeS@3!$Ih'LdqEd*3#rp!d)5',ir -)p*@N,m()1(qFZY#4*mKYqBk[+%33l[R`Bq-i![-M1cN`GeNC`3lfepd[)8a(3P3 -c1hIKY(dQ94!bpSQB%lVSY0drcbAeUBL(I6`rI)Hk6arefbkq!Ff&MJmfK&T8D%, -EpMar*!V!F6CdpQ1[RZ)JXKmBF3E3C[+8RQjEh6#*#%QEma0(11flpeE4%jj1ShM -Te(@Z2YKCj8r#12!80rjTZ69@5(N2IRAfBX6E8-H,4EIG`IckCVN+qT[Nej!!65' -2Si)kj'X-B$$cNGGaBR[0C8D(jai"UkEpr0@b)%QRN6(2$Dj%%C0h,(jY,iJ2-LZ -#$Tb0YS1-P!iV2l+GY4Kkl*IDQck6KYbpqPeGfL&QZEAc!AU%8l+Vl`Il4pJ,iS5 -H*fL8UiY+q[$FS'rjKfb5k4P$P'T-'Xij2lERl*0&E%9(XN&DEr@ldh)@eK6aSmY -'[&j-`qmCCJ`MqZ6m0`3X%UfbHJh4!p"lkr@`E"VrNIU!6,2aj'G"R@pD9p4[5fL -9DpS"EFaRlSQJ'-kJYkM`2jh9,'[DX*D@D1"h%D-&3HXBiqR,M,,fYUV4*lQ"mGC -cp-Fd&A'h"bKRS`kEJ5,J6GJ`VHh#$ZD'b#&,6dR@VkbA5AGA1B@kJT!!Me`e6-U -'ea9!&`20dLDQ)eIaZ)@V)09JCdN30,l*q*3#riSjj,Q+f+5,[GH@h`HcdHB-UNq -NEbq`Jaa8*)'`TbC0aUmIb*-IX6LK'fR%qfhU1#i9NeRMjBiLFhTaiBR4dEM0MIc -jmZp'f)NDrATU+QL#X,5Tk-Fici[)1MTb2p+++Dlir5(r@GC'kLlbJbja"9S0MdQ -k+DdapXBS3VKh$qlARpUQ29QIdF[*1TfPX)$3jPi3)4#b[N!2`!GGCjEjmY,q9`C -TZ`B#34B!%dN)m+A(XBJR[MPIKbE09K1XK9)KA!b%XLEMkGLB5Kp`Z$#G)j30akR -RY!9rpphHQkpQEm",-G,THKDFF@B8AFc@p'1R80jMe"30@S`reRi9ZVrA9M,i"%m -Y0YVeSLjFch+ipBN@2be,#([UhP2@BTF&9rlaJ513!",YaN2#VMbD"q30LmXJ"hE -3Cf,r)bX189!#3EB0IBTq4b-X2ILI1MjpfcA)b8lqA*M[H#DLXQ!+0a&P1IDXLmL -9KFdGJZ&RR[r1dI2$$IGCV$R`XBlY!-"m[kjdqPq"DJR69#E`YkYB+'R'm*F+F#T -B0R[!jp[[D5!$V4qd##&,E!em[JZ2#h[P&Sm(,NVBj1`dV-A51FlF,qj0`LGdqJ0 -38p6Vji-'SK-%+5YU$6"@0P`dGEI13eb3!2[cV-X-h2TAmSEcCif%EV')2-!qVcJ -VC&*+QUK#BNP+1'N2p#bb"h&aJJ455jZBEi0-DSi2@UT-0Dm`B+EI&pVB*Tk$8m@ -%hV'QG0`EhIU0pNCr5!a`2*ZIBiaNJZ3)DG[UT&Z&mFHcPUc+&LLI2-CVQG(pVjG -aGPURK-Yk5CJ(-`6jF'!!@qhNQCmLjU,!"Q$a9L%MpF&mrGde#P-9-8-T[32#Sf! -QlrCcQ*0pajpS0`YM&CUKk0hb+%#86h2iM3*`i*!!Ah6Hb`0ip,*TCLjqQBr4'G% -q*$T"Vq6mGl`)6U-#GBiKCYJ(1D,'NG)AY'mCaFH`U*&i&A8RLVRV&l+PGp66&,B -,8dNi'Uj6,fmpa&F'4Er@(6$l2iAQSjm)GC+eA[FkaRk-,6,TMR2"DE()X'lpHlL -`a+[5brc&CcDjICipDR,56rG0M!M2&Pr1qr3Mr+L0JfHl`6Eapc#NE`a-2I2HeFi -XpHi4Vl9crm(#N!"FM[S#EJI`H+IM2b0K6-HkCIH9dR8kDdEl@*YhX&dNq#fe(ec -VQ6@83I5q#Tj4)d$-REqhqqUlhf(C!ZrXq4q#FrEj+f9IM[(5U"GBFZBe#('j4ib -BY&[HJY[q%K[[Rc@`5,GAqXQb)A3F3[i8mQQ8p,*$PbI8L'TRXpl'(iZ2K29Z,aL -ej['3!#LpjYm+lKlY5BAB4b!kX58M3Z1`T[F0P1[dI),qD)C#STMp4(F1(bM30+m -l3[XaXY2XQmBh3p)1A%MUfE2M+0q(b1H,m"kcQb@8BhrX9U*21%TH@dbMbZY4DYl -EXc3b4+GkMX+q8eL4`Bi"H,[$*Z!D`'DpVVR4(i4pAp,GcE[k!+a3%Xjr498`BEB -A')0#,VPD*k'SmP'hBXh9&J-@4I(k5S(kBMePGa6!68mf-ER,*epfDq5b!Tc"Ia+ -L46SUXY*IJRHGJT*HGq9q4!1aVmT&+EIRCE[MUbr1m"JUj`T[aqNc4cYK!+p(5Mr -"Q*9$J$jTkjAP6iIQdm@NejTj$SJbTph*S4EFIc)"@UL@X@18f[$ZKN(-C"jS1[- -q96TJfi2!pk8Gqd86+`CY-%Z2TbfAE-BM#b0p5e2A&TPTZ[MiH#8dd$#pbc0!!*f -RrAZ(@)flI4LEXe3IA@K@--Kp'!F(JQIHcCLLe$h8S9rQ'YJJRE"&rFB()SZiPlR -Jl-C%D8A4)N&MJkF*SaB(`8+B(r`[MAc0"rkelEZ*!&1Hq'G,lfRLDPqXL1R8UFb -Ik0e4bh45RJBA0eq1iAfS`@Mm0#E`UGLfDG%jf'dG2eb&B,fpK$FlC'M#a3PIL0H -U6rhSZJ`IG,YjqGSdY$Q"QAkUNQ[Y&Gl)+SB8RZEX5U0hBL0YeXmF&&"KBa!q`lc -Iqhp"$ZjrEAXeG@`,M,VDaCY@*5dDMNb*NT&TN!!p**lSP6UUNkfMd5IDHEBZ-1, -'iDFJ8&b0D"6CYLQGc1%LDDa0M+)$m-dC6lra'S1!'U0M`KR)'6ihhjU0lCT@-$` -U2@)@J(TRBGHBYRfPdR-+%6NeX[Cf6KSeYMLi2V*`qd0T`#UR6SKT[r$DMD$"hlQ -de[9A*81*2@0c$CTM#%q8$aYF&*5Ti")jGi6rcq(QMrd+TM69DPPZXDUMY*cTHr% -#DY%mNEj9kK*[1(EBbJ`V[f[PIqFF`S1-S5QB+HLq"QC"lmkYN!!Bb93V12PFC8h -6*dYRmh%IAP#!cI*)5m`@@LS4d`0-l'XdEL2f1E93[X6+)'`ZlhShEpre%kHpG[D -cpjXNBUaM8rfCIBRJ3j*XJThc*9ep%S%l(TqXN@aNmY9EQj)jdY+6QIc)Dam&@3B -VhXV(6VEFa@-hajSa4#+eR3,G%8"B`,T,&T*TP@NMM+GH%%3rjJ2TENlaBH)e*c[ -V(2jEKqa3)Gae&QVCJbjQZdr1"dr,Nd-SNjPj8h-REc35qS+1M9jpj@dmfE&a3M4 -A9bK$Zei8A3SP+*0YZ`9KR%C[M+fp@TH!H-S-MDHG)80ETqR1`KSD'kcXBI$-e,@ -ca4)A%&!61$158*e'$+`CN!!6!kG6cL[dZ%Xb0RK[DG3E`h*AdXNN*G)c2I9d(pq -C&14#(m'3!&"@ip&P%C)1p#%i[[riAekRBJ6TmjXU`69C(+d6+#pP)arJ8hrFq2m -HAbANK'jNfJEK%$8QSP+Pcm[-XH+4Lff$'iQhCP+MCG`F+0QMcdZj,mmTXNN6UiY -)9kb45',LTLSLKbN1CST#XcGSH5q[,FRYpS-LV5Um4)@qEMADrp!9HX4jI(ECc$M -c8lmZH8*6A'cN!rfU6$L!TC!%!3!!4!!!XCS3a,0'+L-!!*Vr!!#hN`#3!h)!&-b -'!!"fNJ!!$B%!N!32!%ek8f0SC@eP+'0QE5NZF("M,X+e!!"B28e08(*$9dP&!3V -rN!3!N!U!!*!(3X(8ka-JMh$iNT&)*%%)IDjr8@l*T0SM3@S!QX[$4mp5iNk(4D8 -`+IRC`GYGE$X!QSX""$mDiEQdM"RpGM#ik4hX4Sc*Ld)BD39+(CV%5SpiB`"HELj -ZM5HXMM[F[QP!,,BT1[,34ZZklS%lAQe##cQJb260iT!!XhamLLh%J(rV04!kAD4 --elfla[XAA9JhGLf(',!$2!,,8Ae9Sa%k9TQG6TdEEXX,&rKeeY-Lr*E1d[*1-eG -'j`T)5f%Eqq@YC@$#mq4+"rHTHD$YkFBLqpPKh92Ab(qB1Ff+iV!S)MmBYk#YL$E -*KSe40lllU!&0#GSNcAd036LLQ2C+*8%JmNY$2(j+Z"f'MJD&edN[*$U2`UK2NYD -+ZR2FI)l$e#Jp[%,QZ2Y8),R9',eDN!$i8EPk+p`!Zjd%Hc![TUL+P4(LAcf"ZeT -%!kBC8r&,cPrGq4)68K@eeF2d4J"U`1944N@b,V5)J-r6c&c&3338kH+0NC!!&S4 -$&QF54$bY!c-SJ-(SHIk,&k)TKLq`"5U-E`Yd)-"-HA0L[TmGRe@H9(DLqX##i'U -f+El%GRD"rf@TKc)&e`E83jp44MhNmcXUH+rF%Vc8dhd*j"C86$5Xpe)*eQV)5'6 -R8d66AXJi!6baV8bM@d+kD)A!'3X$SA0+k%JZfTReN!$Lf[2re+%HTC,S*ZHihTD -f"jDpcce%0IGeQV2K6m-S'9kUER(43FUJ"b0NmIC6K*Z62GHd%ZdJmCFKY!R8JKe -[58BCbqPI-ifXk+dm2'1pBmDb!*i(Ua80eJ'f30PJ)Zj-GPpNL'ANd+2lhZS6PKh --a!rTr(RF9-9L@`'0k`XkL24Y+ZCDq5al81BJZ"6J"prK#ldeH*i+EmebjU5pQMp -Uk%k,PHI"ZF[q*Sc84arLTcd`RX!Q9dLKie&K$r,0)!0Aih%hfCkIEi4Z4IpRQi3 -kANaAEU1lbeECb8hN!!RpD8Rh+H[-Thb``+kbrY`$(0K8XV'(4!K&5d@QK(0jk#& -26P3Xf*fp1%)HBe&JZcT03U,`a$P3NZRmHHD("08ei8c#6BEE8F4FdIX2Y@lRMBY -9AiFjNc%C01bH,NFp)l1G*Yf0%mV!2ieSSdbPNqk``1S&l3T(8D1Z)m*ZPbNRmf, -U(D,RbLpS22BMk2#H9SeBF"eP%NS3f0d(q@0m9U,U`R4CBSk$l*9M6#U46PY$R#Z -rY1pT&SG66aFI4!"eRqa4FA-rMJeef(HR`+J%L,ec8hC!@LefXZ`R0b@`"DFSLJ* -ZfA@-p32Cm$Na13AqEcMNTkYNS*!!FQi4AdCX0DecNS3N0DANEpVMYELh`!GeS4# -KPIJTdJK!DCbPJKQqe&T6%'&c([VER%Mee4ehHmTE"-Y'ejGJChm5B[#N4chZQ1` -F"#mqEMFGG!3f4AQ8hBGEQ6r@50rkae5dI-ZY,dG6X!V8K@dkh)N!f6$kX@JTiE% -RBj8(V+ieSY)R[pb1*T`dI1YHi@-)aV-iPK3$eGq-r61F*mN)@L((RAa"Hj8r3@2 -$%e,Il&[Afe9MBeCeKj!!5fIC!R6rkkL4D(VTf'HkjCC*P[QP+9J-H&,A$MY"IEH -m0drc*m6Ap-q(AJqMK""Q4f)[-FidP21H-r"+Ua[(I'P&I6#HaA62QlpcfA'G1ii -hTQN26K"HhFNl3U+8&5QFU9YUG2k6%R5p9PTp+',Sh9LQ)Be*EHa(J8l'c5EeS!1 -XMBTPd[&0lMS4bZ9pBHBfMY[p9Jr2rH#@X0a&8`hNpCT[j&+UceTC%Sh-@Pj",&` -8T[AF4N*-0GAe80!J-Aq'jZqaUpJNmA4rPG$GQTTZTC[r@(@6(Pi28N2cjDkId5M -M6qErJQqR+UaVV*C4H*bjrDIYh@DNAHKfjhN6*54VT(BiJ8#0TIK2C+X+h*!!`Jk -$aQ90"3C%9i$`2&B"PfMblYfkfdZNU-a98i,L)0p-*K3c4l[f8Pa)c43--Kk$X$k -,IdeI&6V9,pRQKI@fG0h2`&#A'qD!8X)Lpb+4pF($EaNF)hdUE*!![-5!'YK2miG -&M$qE-qqApECU@cf[!cPrj1aCq&MTQX#!8TPKLP14j+#8`l24XMApcb3&TK0GY`# -4PP1!JrhQUPB2l`D@5erU@3b6kHk#01S1'@8'XXjpk4DU[TE,mMhqKl-jG50!a$C -5"c(2VV4-Np#r%F[KKF,MK"*&Cq4046*q,DDf-EGC#,H`QM2ZR-4SP@KpB0%U["S -c-MA$@SK`NQ(-T6@TpRRCGTQfZKP!c%2T@KS([G6T[Q-Y['+SF#ARRCJMj4L)Sl9 -@8+*JUAp[r!j`Ge%,f4DHKRE+UcfH85JmrUp1F(YANR9RIE+j$60&AimeVFUPVmK -A3(SP'#hL(QkJ%aFTJiAQ$ZDC$2E(++G1pK)ZH6ITF6%cj5[BN!!P-BVM-5Q6bbA -hl9V3[[ZmJ[BN*,kZd*U855PKN!"0,5NJ$YhLiYq6VSH`aN9f$8lYH4jb&UT`j&J -Yc[db)3E0AAS*@dD8%,@&hr-RLmCrl"[`HE#GrQbT&"j4SccDAXdMB1fPL19R2IZ -N6k3Z5HJ+D%$#5Q')b)+[lHrEMI3L6*KhU!iXJ!@15S"b%)6[e9p-Pm9+r3X'2YI -4ZR6$#lK[JAN29ZNGeMfic`&bBFK2)XApRH$2JH3-D[qHe(DlJ6cjE",r#eZrITJ -*X4PXlSc56))hcRXF9TbBqGZlBb!LaI-,MH@$(F9pLUm@D&8G$LfHCe62ZX395Cp -[QN5"D%MpIFi&3ANK!*4RCS0I2f'"C2YUMk')'Q0qCGhF0RA0kq"Q&6`+`rYBMS+ -$0AcTpmiNYT'`D'BFim5Tr3hDlq89SSaAXY`mb0X0*QG6iPB2XF`P"8ce&Zq2c-C -f`8hTcZ3aH,j,,UkIZLqc$QYYUDq'AF94$r+#KRV3ldR2cED+@DKXeJ6fFU*04+j -HL$SFB(JU3XaY45*mN4&NFaj#9T'X"G&Vi5V5aI[E-4&!1aQ%clCXD0hI22#U0Jr -JY(Yf'X(K,THMMQ"#ej,ND(NEl#)F)VaGFF&@Z[*"'`MXJNA&"l6dhQ,'QChp'TP -RQHK-0cS90Xba2ZKrrcV4pGB%X"9m!a+[)l5aZeF'P4%'"LYba-,)@he1ep2J+h9 -3,DdGXJciNXU!rXGP+jQU)[k9I$dTmNr`XXXARU6rPp-HT&PUGi+%[l+pcJRmE+b -P%Jk(j'&VSNp%rCab"a[c8e&!0V1iiGN$-HrXSQphKFUG,F'G%,+[*0biH!YH4(d -aZCRmm-j2i48"rNm`l(Vk+q"2IMccXkiY-jcpZVlbl3MFZUdLQk)N0"SThqEQBEp -GDM1[UDc,"j%Mhm1kk9+DkPCGlVA+(+$CCb'2$"MUc%&-2PD5*RmZK@FXVh3Gf,J -djhNc8heG)h2rMKI%VTmDhm`AD)A!@PDEHX[lfbA9(QDaAYL6IE@@,B,*S3[M%!B -V9Y+ZJe[c"GJP"fI(3[Ub`A*RL[IS!`PMmFb9GC%!jY)4e#6D!eKkS[@UA`Y1A`[ -P-2RmqBZCeILA)NGH5qCR@[!ISTkpNR[hLIP@J)JSeGj#3qP&6VN3QQYc(E-e"T! -!&paNc58NM+5CE9d[jKE+bLL(LJdUVX`$Dd`E6+MHKkrJd`GCQidpIA(&TqP3#ZG -q(p*I1E(V*ZDL,PUhb31#i805T%3'NDVZrlp@`UXbldk6SV9SKM11"EXVZMfc*2K -q)&l8D)S40YTP3kK*US'`BS6PYKE58+mS!pBjTU(CB$'q"E9U$b*NQbc3*Ur-3-% -'(c2LaX%AcZ`E,&63M1e1"10DBm-,#RTpjRLah"Ye"kE6[SiTlkV8h6JV@2hU#)T -('UBprQSIpVL[@UQR5@4!i55)JN`DU'hl,Skh44d($cY[%&E[8JBBPm9UXe4k3*A -IkLKH*0MlE'eYT%[[RAC&33%0#%pHi[l9!&GV)eM-m)ELRf0"'KaP1L2erhYA++X -cMCldHPm1"S3eX9pB6Na5(jecT&Ec*)bbKAIHF4#k#IJ-425+cTXYF"YDUbepUZU -f*d6aRlBTI(QX%&BicmBD$L1AkFXGIR*[kA9A'fT(pK%184,!CQPG[N41*1p[8H# -iB-(0LbU*%R4mH"jcckr&9XcVpi&M6bNpe5MC1)!c+`Z($I&MLbVB3mGSLS%&)-P -5S9"`)MPa,DAT`"03VT!!0)R+r",JVi6LB#TiV80&bFX`Je`(2FhNZML%Id0bcij -'"lZR+m!*c3$3HQi'A5%A1*R!qQ#P5jHV3G+QS*Ra2"(q%r)4X#Zidl)eGp,ENHf -#rRH'd89J(*m[FaqIU5,q8$'Qh$cp2@-"bBbL68d+Ec+q2SG!2B20imU-R*bL*qh -K[)Ekp)c"RaXllhe'UdXL9S$U-%1!fK-Z*hY&Y!ZaZ@*+Vk2Z"Qm(`J3lPMM[)Le -Xk*bYCm'r2k6i!CT!1mXM6mpqbK%XR'Y!Bb)IMMF9dAQRia5GkYBU2$')1i`Hi#J -hfBm-!aGSPBU&HD+VA$%a0pPS9X@hTlXdR5DaBdE"5i+$TbBLCHXJc4*(lX)hZMF -8pMF$YXPGdiHG4e(SQCie9!-XIkF0@TaKirqYCT-G+!NPZ8*`@cq[3DmPrGRid)B -de3K0@VB3JK!"pkK[G)RAZY1!3RV)!+@3"!%!!%8!!,'D%%fc4*0I!!#TUJ!!aF) -!N!0b!"9AF3!!HIB!!!h'!*!%$`"0HP0MD'9YC5KMCQdV+5j`F'-Z`V8!!&Jp68e -3FN0A588"#[q3"!#3#S!!N!G#`G8EY@83EG+G1K[!&ArUB3S(I&N"U(%)Nd'2!B3 -D@*+V4pZK9Ai5A!8qb@cfVCSFaDJ$q@p[9+bi4LKBZC'mm$Qa4ljUmRZ)jHd9cH1 -"`*L[)YlTlJ*1)P#0Vfp,'m3$riTiGRZ8!Ga,mH9J,KEm,R)if&&'ph)"48acTYI -YSG)imJN"*Ldp)r#hNhNdFI"3J@8C!lIfH+UjIRFdPj4UZF+R"+qmK8,3S&3'abH -T5Z2XF0'+SYRN28EaQHYHY@4&!E`Ld6-Se6f"jhQKKa4C6cq4dbSEVG,q8(DdMVY -JXa'L2fK6f4(6AP!41ic+6+Uc2*jYZYjH5*ULY))GM'0J#eRU9[ic$DD!9XTi4I5 -1rhIL,&k*YZV@YMcHi%EV6!fK3UahBCNl`IQ))(h'"Ek'[cKpmK6Cd#e9(0Z68Sh -68iiI`2q+09%p6EVf5$02dQiNAHB&TaQ3!+[YBr05KbGD+)0ELZcHIahFlmfRqJ) -(-DJd029KLi$*LP&BFEKP1!DT+F6HUG%dhZZPqhfhQQ9Ipb3dUS`*iRNX9,0SI+[ -R-P`M-Lc(JDFjQ'Mqlqf0#id$a"`rA34*lCHJ@pUDXSKpGe`0ZjBY&RmD%&4@h0A -TA"b5G2$BBcJlp"Faa!B@M$6JZMTkXFVCY6HdDm3fH,C2BPRb`$j1YQA)XipP4C1 -dldX+aa5)9dXjNRbK-6@QqfP9#i*r8`5FQR,&`lbcrq1+f(2Rka1Q('jm'9Q5cCV -S+GAr9F-"D(2kq#b'Q-5E%!cMlBki([!YkE"H[[*i0@)``iPpFUm$VX&l(`HG4VM -SD!pDVj!!&5UB,HhpSA(eD1aDA#i-%'9I$-Q',UF1N!$DkIBCY3Fi(IXBL9Ni-mi -m[R2[4Z-3(`jI55,U"'ZXAa-pfIT'%eNeEj38)c9Dm,`TLb'URV3qQ9p&5DR%)m[ -Z%AFq9&YF*%-[(kd*!@3pSr&j[SHF9#1Xr$,6%L5NJmDNmL!N@)!1GJ85MFSD(E" -#pR!"-Ji4!ETJZ[[mQk05i*K-++TN"TE0e1Z,#pI+'r2D0cIjk%'efSm0"!rM9fX -c3`DMKmVeI6Y+qZHFh#Z*mh6-dbmFNYijA'6K*CF1)Pf8Ebk'%8rqAI*`C3,FJKG -PED6H-e06Nj!!FG`e""INQpS!@U"Z9kKeLcGq#*5XI4fU`mba(f8mUfRIZf[!&(m -8Y&jk!'TY[(b,eDVJ!"FT%E$Af`3+FA*,b9KAMT1&[m+BhSBiriA&6DFB'9FiK[V -K2CqIhMEeBcr*KVCS0$$`#NABQKHe-aCrU$YRkiVF5S1,Sk4Y6dIT5j`6S!(Tkhh -d)lMPb$[H$4f9"mi"qfcUIC&'qafVV'FV8Y+G-LL6KNH2[6BHa%#@mY,[*MmehmT -fSm0bV#2rkUNH&l5,L4rq(FF"Kb*L)6KA$ABQVZ!!VcIf6Pl6eqE,6dpPf"HR(fF -I+J8A05aF-FkM31%XYKB*!Y-Y)aj6A9Q[DA2k-bCM`04bVHJdqRMjG&8EVe`[XiL -2jh"!TD3fLK'3!"Lic#T8KpQc'IG[48D*#0G!9!TCKh#55$K#c[fGj2V,32)!aLj -Ib99d@!CSJJCiT-jrCcaF9DQ5kMF6SKeheI$pV3qe-NjT4TE2K384E&iHCX#!Ah( -UlJ&iXhXSZEE[*#c)MXYQ!$(b%8iaIC!!-qr%1X!-B[Dr@hLRK3GikL"fH$Y9R1Q -0'@Y10!JkGD5B0hZl`b2M-rGmjBdS-(*mp"'%U%cG[dcq[6K@URG$kf[`XqR"(-V -!AfTVQY+PEf3qZcc8Ie"l2XpEa1`T&F$j+Q4#&dHY#MKdC)'0YfN%KC+(dVqSl#3 -!LST%4#[SrP#+@#I&qPf4CKKC,XhI'cpDRVY)II&IRbD&+'A@E)YK@l9K@q5A+'E -dRSII[G"q!@JDB[lC$K`A[3Q8L+#(-iZca8H"+'CTG*0"+HLl6d[jaeG'Z$U8*M1 -81BBG1XRM))@m[6iKe*lRA0X)5cNqDTLAiJbZ8U[hH3(4ajPeVIqD8i0BhHN8K83 -6"['UQIahY!i2$RHY2Z6"b*RJT#3PfG!*'53i4D,F9SX5"-r@HG60CV$SBL6R%c( -J5S+C[AT4JArbm9CLF"V*CbImdB&hB*HimM[3`NkRT09h`fQD2jj"4[QTHUJG6RH -3!"L*20"!*8(mC)YqZ-P"bG9&lGK!K)(X'rmDSHLcDae5j@6cGM9Vik,V'5'K@TV -8qkP*d$r!K9r[RaRiIZVdd1kaA0&%Kr-I`lk`MY#B8ISKqN1Yi4F8c%F)B6TqQRK -Q*c4jT["%SeKk02c-#[DhDZBLjf*[+jUC#j4"qD0a-(-)ek2%F*!!6G2m0)C!kT@ -Z(N%$kST@&*)bX2G[Sd99PcqP`q-3H[Hk#JYi0Rh9,"1X*`6SNd@pNNcS4H@(bU! -U-rVm6f'L-`UPK%TUTlNblYc-$3[DCkqE,6IU$r9VVI[$Tm9I@'jC!EG$lM0e[K* -8JSbVMqS*UKH$!Gc)kYmE(EK5jb4cN!!$H#mPZSp68I,%,8(YZULBNJbSL#pB@b[ -6QRhdA50G-@ip2[5*K!hZ,AcRMD,4R14eAM$@V%FC!QbEl%YX019SIp*"a(Pb(a' -0HYDU,r!&64Yd(+502MSH`qjmp@"H6dDdfclQrIVmZ!p(`*EL(#j,AMB+F&&k)GS -Qr+9L%Pf-'"G[p(,d"D!klHPJGS[6#T`la*1PKPr-@9Rbpmqcrl'[,JV0f*1b5K2 -q8([AlBQ-eK2,,%lUDkT))Y&ljVa8JTVd5`T5-L*H`4m!4c4pcKCAp+b!#$PjjJG -YK1YHT&,P2QK"eCXhrDci6J+D!0mS$`5UUI%-%(!*l9f`RHIlSdp&mNFpfR&VF(F -m%X3'FfIbRKRIpYehUFcNULMq8VBh*i4e[Yk4Li'McB'S)2eU%RqS)QL9m,br),G -N28h3bG30Kf-8,SF0+*5HS,Y*QGYG'@0jSD-m3bE&i*E5&Afc+XH((c4)B43"&i@ -DNISNGB3Clrl#pX)YQpb@mX@5-+AhKaTG1mT%"IYE,(%d``kR#SSq@iRJj4J4r'i -ASDjdRaBP9QqR-0dc,i@BbQG0EdY4eE3J6VKj0R"9QCJCPQR$48-+rY)Xq@5e6U` -[GXL%8bmBYH%b02!R9R3e3VRRr(rHkK)KCE*EjR5[*(EbLMqjcT'6+mYGJPSrZBe -)hD#r!6*(pDUN("&&CK-[bl$T`2cJ5(IGaH#1'#Z)&@RLXiEe!#E,Y@FFbkK!r4Q -538%-X&UIVRB$Sa-)m-91bMS81Vh4iY`+L#)H)`eNZH$ba3Z$94NBEYHkRkkB[[$ -0&hpi9El"6A-a'4'8DJqA"c0AQA5Sa(XVm9YqLY2)fb9%EZielfIGfl"Rl9fGCZP -fQEZ1,%DH)bYE8EH)(+eB33STp*4T-fa!`l'0`K(QY@cYUlcNT&e%mk,`!q`PV$& -DfQ`TjUS!Uc"kI#I@`SPNjYKm`@jN&rG(@9$aG3$rDbmHVebkmja3jb'e@+9NGhp -GN!#Ef%%d8@#[PFph*(dUB1f0Y+dKllA8A+mG@MfKN!24j-e"r!h9$KSVd$40@S& -8G2f%NAeZHT%`VK%&MTHr[1jJf95kK0%kQ4)D2AlD"9pKPr-FN!"Y11Lf4fe0T[K -ll+m(`V$cNCh"L$6*h,BC[!2fj99PNkXLXI+E)cX`HZ%S,!*8-V(YI"#q8l&61LH -"j6@,#FF`0GXk!im,)@3cPkem@M5XGAY1Y@FZF-Khe2'TNLeX!-meT5$e9'pR8-H -b)"dEEZIbLeH"'",12J%bB)Ee"UMJCqP5QN)IP"'k4Z'5$[eBm0668ZM0Lli00Nq -%&b4PRYbMA(9-PXN[`IZ$krFTGDAh8dde*&CjhpKP2hcY8GY,9IeVlqDY4A"M,&d -"$f8PS0NY@qFSbaYQ-hBXL'#2[p8X9iD6M0TrTQ5U+("L,Y2N*-8jL6-q!AX'B82 -fVbECAUZN-XfkU5pV!"9PB)"Yc"@J(6`K-*h5K)ce,Zf4DHG"6qV-9+)JQX-+X2B -1E@4M`Ji[SmcZdNfcKeE5"MHFQ(5I(Ykm1H`('E8prCD@0V0fN!$PLd'NU(NBKI* -IECalRCJZbqGq5XfCQ9R@3*p,T1XaIf(a1"`PK3,BrR+*IkPh[@,"mN)5YRll*d) -b,9bbYj9HP0r$,Nl`Y)20`RIIAJ@YTAGp%8U`,hJ3qN+GF$32J3!G6dmdfp$V&P` -)"M4Dhf[ER8%m")1,akHAf4dhr*-8bhE'c&r$EGpNLDP4LM#))8i$p&qh-RlRTki -&F3X01VGIqF4!$92Y*&cM3#LNf+APS3rmQKFPRB(j+d8Fri2!S#Q9-!SHNPRC4P5 -i3e'MUmFHF+4r4S1iZrI%fkVTBTfEqEJ&(mZUZ6F%N!#)3rS%G9lE`r+'q9eQA*3 -,H9r&BrDfe5"QdZ$Z%VU8E$GK-6cHQA95MK(K#!0LEP0a`CpKYD"8Pa2(fTHPKJJ -A56caVlmMZG+Zd!Vp'MFi,d4E&qdb)bLmqbKmKaL6bIfbJD`r,SJC8"X[+jNZ5$8 -&#j*[D,fje4B`E0AbAJqG,AST#SZ)9%f-m+4+lCG@5d+FV&0l'eE0E"THM0Yr149 -jNTQ9G*URZq5ZDXV(aQiYeF0&dek4LV#hZcQShhMMa1S1p%Ci'QUT1a#lUELXJdp -d+PPF(!NGF[JRSPF,``@1IhY1Q['Tq9b(VB&M(j8&#2!N'LDYcK,5FTkjj-H!#le -L'b9'!+@3"!%!!%3!!,'8M[fdAFh&!!#hN`!!eK!!N!0b!"3"[J!!L"F!!!rQ!*! -%$`"0HP0MD'9YC5KXD@)T,MBiDbl#Y3!!@$e069"b3eG*43%+rj!%!*!+J!#3"d, -"e(4N5G3RhTb`h)kb+-5r)UD*-8fRqmT%N`G9frJ*Q504Eie46Zf43j&['f8liX4 -2p&9DY5Fec!J8N!$GG$PA2RjrpJrFE3lf+CajS,0m%9#q0+ZmNGk&995F',P&l"p -AaqR5DVc8CV(()Zq#6'9YPdf6j4#2-lBc96erSHKp()1hpkrMcK)S-dK&`lrYmZd -K5E1"@(-Da-Q`J9,8'P(1ETQM%$9VD2DcE@#NI$#hh8rbIE8DPpdfa-a+3prAM!) -F#pd4[DkYT,Jc3`'j*i`Z%a8A(K4TPNUF4U%1mKp!K([rKTYq&F1p$D$j,dH-CLY -CT[0-S1bP8l9#FqD'&lP5ZXNcCU$q-[5Kq-I##)#[LPQ"C5I3mpP-')9,S'5q,*1 -N+P,2l3bl3KY%4)ZQ"P4G!Sb)DD'rA`09ERFkk$9p,3U#VkF"Z3!CX)'&`YD#Q%$ -S&raK%5pXUm*c&9(BPCrLp`!LimIiDl@l'k)b4-C9GCeNh%E*6dUj#46-E6CJFA@ -blHl`&h1FCQK0ND3cd8e$R"),)rQBQB@[LjkY2PI(*BDh2iLeZ9TbQ4Z+T$')YbB -45V)cQF*r@PGF2fkaZHaV44BUmjk%SECkLADd%XGp8(EkF'Z&a4'YJIk8GcUM)bD -`iQea&9l[K4LA!Z[eUBbK@kXa85*Zhf!Cld`PX%!)A8!L'a3PqBcjkiac*@(Xafe -IJG'kjUk6rVpljYGLf,GheQ'kCqh5Ybic*iNpl"khhEd2VK(iZ@#89T!!(RUq@#a -8!N3#,*4rA1+I#fIHVNA*bG21!8r%fhY-33%&V*PI"'6X'V(aJ6SrL#VD0mP#!#H -[TG1+Lph&5*LB$b8[U@lI6Gbf'''h%Ka5SqZl"!b*ZF'pX'DKI+dG0*YSVSCe,6Q -ap+LQYFJ0YMrQ09q8a%&T-8!3pe#j+Je2[9e6b,K8$C'6PV-AhU4ec!NABZMaba- -#!'JldN9kB$'q[JB!hY)`camJFP3f4pJ@C2'5@a3f52%`4KJhJ0NSfr`rX4VKr"% -26P,6$HK[qEfaL`LIiMh(FiV4MIDKmaeIG@G*Xj2hHXTM*61L1@-3aT!!6'[KTUj -FKYredPIHf9r)dK(%R(3fbdaRH0XZpPlb[GbUre!QGSL5#HBAB2rBN!"MV)j,@TZ -88UV5EQ92JPX$-X3qN!"`!`'MS)qeGa3i&MK%!4c!hX!FZe@ip8c"I-&L9YS!&C% -kU%cRST)b2VCA9Z"65I8JlS441GI'C416ERFZVTG14`F'Z,CcJp()paZ*"MXQCCZ -KpUDm6VPIXLJ+X[(GUMkq39+"15A3iRhL#6ZD(p8%)+TH4"Ihj#kHpVA#FrE2K(D -IIVb`4UG5k"S)'qRXMrV4-m1M)9#DkA+!E@6Fkm9iT)$@d2kI-SKT+1SZ%,%dGN6 -H1$#kK1D59#+E[JU$4SGm#`IMUcE3',CCGGT&PllGdCXP%SH-)S(k&HdlGJ"SQh" -$aJkZQR"q-JJDdM6L!Tc-JZa0F@$dG%J#BeG$jpZS0K#,Th8&1Mq,`XiQc&'3!#M -Qj+B1#-DdKkj6%Y"C8pp1j0m-584'NC,k[IG*BEr+"#(j1caK,5%!YYhX31%T[8I -'C%9T8bh60C!!H2L8%A403pjA2"Q-A@3M)9(I%`jbc)MAkSdTYGN-bl,GkJT[PFQ -3!!BB4Jm"P!EfYhaC-9pD3U$m`fb'!UN%Dh4jA0YiLF"H[Hjm$k-)fCKQl4`+k-N -Xhaa@SdLa#iXck%kBDprIJ-EK2YSdKj&8[)NJF8EEDH9Lp4le)KEMhk3(f'%Cq8@ -EmFl-8[2Ih)SZQGCUfHSZ#P[VQFE'hk2'"(E"QTIPVd6,FEC([hFPralIq`*J8rf -mCZIai8@RYNX&Yba,IAV$C)f(+KN'q(BV1)1X+[!BBIcbJ`U&bF"p&pAU&jdfabU -XMML9caB%b(rPT95c2K'kc8IkB)B,1MM+YSG!@5SfDjj433-a#V"!HTV24R"SXiE -04QZ`iU$,YrG2RZJR0Fe3@U`+@-4eNMGEDLRBP9S[XqGj3aBK!1E-Te4!QKE4Aq* -,B`1e*XejdK5&@d0VpaETXRp+G34bAA&1*$XrF4!G'IJ"A3VH#r0`d2[$T2G1NSq -B4Vpdm()PR8JNk$'$MZR0b`lRhFppD+j+aNr#F2AH365'8F[c5"TS9I!)"-!P[MC -lm[BULqFc$"Lk*E25YJ$5UVeeA1FbFRYV6BT&ab@NcH)([QjGe0d[hh+YNl8JpZ0 -a!dL@!La$eV[GUP#NlK9ZdQ+BCm5C"Aal,$F9E9#I[lX[AfQ!$#A),dhF9d(L*#f -3!,c[@4hV'1DY@p)RHS4AQ$8L@3QA,hrkIC3QG-'!Y(@3!,iY-KR8)cIST0FI81Z -H(BbFN!!4Lp)ce"hcCrEAS5)Q!"*6iI*qE9MeEDmH1#S0T*!!P3E+jBkUS(`jRV* -C"h(5lET1miEEJ-T5rP&HNcjh$E0955k''+F5#iiPYd@*J8F9j`28Ti0Q$LqZJ"V -[[9Ffl8T'L3k+S$pY8Me,5X9L30dkm+(,66L9$![k@4%Th-YiVJ#fDrTfM[(pGUK -+KHSkj-(`)%PVaLX8BYmZkGXdDm16#'8IDK'#*hc5&mUjeZU4%lXijH`TFhV(")k -eb"cr9E+-PheHaR48EHiI1-*S0qJN%),rrH8*&C!!5",$MN6p2JLaNlMPS8H6qN) -mDXkVm$GY*)CeKNrN5ZCHR4i+%b"aFI9dUNrQ35Ck&6$pMbAVH4lKU2HDiHM[@&@ -#ZV&p8aK0UICU25bljZ8q3'5lRe3VQ&e9QJ9%K1YM%hHTRBVPU!8f*CF)'K!RSpZ -cf+bLAaM%aXJNfQ%)98pXr6h'1fV+,0j(-FLldH8reec2AHZCMFqLDMDp-c2%%N- -5DepeD1$Mbie#a23Cj@&)EI4cV+&-VR8#"e[*k+GVZAQJj91"C6$I&C-VEFUpQq! -a*YZqTe4KFM)UXNX5Lh0$e*H5JBSr8m,3pT8rT2f`F$c@Gb["`"LBeF0Q`fCjVkZ -qG"A*(TP"9S*"-U9dYhFZ)8aXhR-Gfr8J4FV'khm`A3RpcYdZ"*cY6X@Q(Jq`T`1 -*P'f2!9"Q,a6[!LF0kcCiPX8IB9R3hf!R'-cG8C*Dmh+ij$H3!1XXCZj54HJd8Br -4RP5hp&JSaq&"C1k)L-!6S1BXZ3A-hD&qiGZ,D`a1Lh*9fXJV9[djr5)@b2ZNqZ1 -!4Aqr,BPll)FKq"H([NA51Q&MemU[YCp%Yk%EF)I'pAEN#P5EM[NJZS[cGPaTaP` -jUQ%dEhf5I4U%kmKeYXmFBAI!T3!1d5m*%lp4`j[f8kB-1Nd5EXDFN!$3JrNDA-@ -HLVMV,TD55BBVAYK*6Ih%ZNhEdT8H@HNNB(R4'E,AiGM"AV&Qc(md(1rr5rHX26@ -P,(N!JE0X"kiF023)f1Xl"im"%SM0dF4Bq-K`095MFJb'8)ZJ0A5GQk!c6I'f2N" -*c(VaRY*&5TAXSH6iZ3'UHPdLN4[3C3L3!#X2EAUbR9Ta5iBfMHUCBE`leVC,5#6 -$35I+4#Cr'a*'"MZf@qB%-QN@D9*l,PQ2[q`m9()DJ9)0H1plr2a!*(3ZKr++*&q -JSI*(@"%,0B@N,6ZHa-qN45#%9[--l1*NND@J42DTHTl!2dK1Me&NYACC1D0U,H4 -NF+p#F'@2(kkIi1%QiCV+,1jA*14[SBP`65S1Ml,pIChFBRDU1kA8"PTSjpK0+[` -dqj&PP%lb`frD@[Vp)8BH--YcD[M"$C&$YiZ$eMK&M'0qdhPAC)rTElNk%!E-$DM -`CXjee8lUXJHCE0J*PeiarZ4#d8[X4RlD8CNY&)9%8KE#E,qJU)#,hqrbRe%(Y'` -#@md3IGI3ff5m$[[cAU(VS14-h49hJ@i5G%q40m#A[!A63UB-"K,jq*k5DTKBULr -HLFZ)TrEU3+iK*fDdi!`ZJ(MMMr!c6FNR%"Z2UE%,FGeC[$CYlX+AKFb-!9*jUT` -6ZfEQ5I,bCY1Je#c11SpR8c@16pH,+Am8ZZ,m8kI'(N![6&m9JJDKM(+k!UU5RAf -i'3dp(F##I&G!#+QFJerD,LHShMqYRc[h46%#&Fca92q,#%T'Ac8Zd5c9@m@m+`5 -,'dqZcj@mJ3C(Np`TZ*JHX,N6aDDM%q,c-K0kjPeMClHE`IT@4KKmTGLiCaNrfE( -bk#E["C5a`CZK5!iE2aYc23pj*Kc"$bfcrBeNL"6AV6M*RPe8X[Kka5rb"@QC!*K -2a4Y#YD1[R0p%YBilNM2h*TdhM6XLDep#ICM4$'5B%1%`daK1B[L1+M`2$B!`)V1 -Gap`)a+IZ'HUb(YM)lQ((iqq8Y[N!!AdEm4)r`&[fR*1CT"60c`aX+d)S9Dc3hbN -b[c9dA0#2(,Xcqd"EkI-Jk@fB)&)b#cjQB96)j#5fpcDdAfQITMX&C!8MpMpDD*8 -N"X##J8#%FK,f42e5,$i0*aafp-&QSBIlD$19D@B-YNeAGd#6D1J,j0'G!UD9Edp -C332TjPG$S#'ZY,5P`69bYUbQG9M4rqR53L1iq&,LATMZKb9+adUeqY'`QbFK5MV -+N!#GNX@,RUN+-TmM6)LiC*a,&M9#2+plh-E1lhj"9Q-&jJ2Gei!S-YP0`-YB"$P -9A-S$XU!Z`M31(Pk'0KKI-PeIZ*Rc$%qSVGDZ36c8&X+ZMbTjYh++KqqP8`f'q4& -KV)Lh)K,$Jl2'rND+KA52+pl+2EJUZ2YmM%%5f5[LaMQX-5XMGQjlSZjKh)m,(a8 -ABEM(A09#JU6",TaiSM*Q,@jbU-h(T"LlC-9[pNEmj996r*!!lQA'irD0maMYYi% -dPdYF@DYSGp"2il-2qiMB&DU4d[!M1P((I"lNpr8"%1SFS1@*PS)p86ql5*f5A[j -qhB*-4D+&b1,)1%,KQ#l4$'G,'bkApdqS'-94rE%Zib&qaSNGrcAcpD[242pqjaA -`H-ePB5U41je2R+XEi(*r2#)&,Il)44P`f)8!BHaTjR24a)c4a"aB"af'5jL641+ -k&VGh,ZP+mYBD4*!!#G,2$4d$8a@a!SbeBAXp,8d-MEYGX$(C[*QU9HT26e%T)r@ -M-ch5,H`+p58FQjGf1-Rk"GQGlbGDFjAp#C8cYECHbR0!HGS1e4SK4YMlBGZ+@pH -cDcB(3bB)r1c[J)Pi15D1m&k6*rmkSSd0GjRP'YVr-m5$G5H+6AM&8pU0ETfq"Ia -4L9+Z#8mi-Z,f&C8Cm3Im'Z8"B)4!#5rZZ[KI@r&NJQ`Z#qLh`Creaf@+am$`@$Y -,L""8)Jk%hjX@M+I-Edh#[*8$U0qRBhA&I+JKcbJY-qZSlSGjkq*,8['eG)TD8SX -hT%5SmBVjd[0("r&,[SL5dTNYPee#+[Ahm[J@UYG(+3*53q1j&90+)hDQcaFK"k8 -`G2GAp'jpbdBi!lU@HcFf0Y[UFIJ)&NfSGAcmSqGV5U9i&[+S1ZbCSeX3jL8"'[M -GT3C4-JMJ3+@3"!%!!%3!!,'8IQke6(El!!$&`J!!jj)!N!0b!"6D2J!!Nd8!!"% -D!*!%$`"0HP0MD'9YC5KXD@)T,R"`Bbl#Y3!!@$e069"b3eG*43%+rj!%!*!+J!# -3"d,"e,-PfkQSh-c1FHqM6ppZfMSZQXiF+eaKCBc1jahl'PE2,@G0C4#m&C!!3KV -T4Eq#ij3V*2lRI(TIV"FLd#UqGrpbH,!VlMUK+-4hB3`C694MU&`'ShFE3*PUUE9 -2JVHNY5*LIa"kGA+G#J[E(GV2Km1R16eiD6X*eFdqr1R'b6()4DZ4PBYk(Fdi@2k -ZhV@MH4MLUiLD0qRH$(,@&""I6f$il$Yqpekhk0-'E@-jX[J*E[C+6k53!"VeCB# -$I-3![(SSG#R1ZE)1U`pHcSA*mAK@4M`iY%,SbNd-eJ4%$CHUE5SFc*ec)iXeBHf -9i%FDP3@ZNc!ZTMFdjlCN'ScB5*I'3Gb&&mA+'45k`+"4qQlKa(MCiimUNmN`L3P -$KHmkJP@'c+,a!b+mFEkMkdL(e1%5[kbVD@8),p0!J0-PbE*NrA8QF,hklNC-m4c -`D#,FlPb@-(d@1`qN+eHU+f@%$mS9!fTc42Qd4$L6%J5PKS@#mbhE(+TFAF)I"YQ -jql%%A[PQS#24QGl`kYd-I+bEqM)(P0hpm%L(LjYPCPD*m+lYYc5"BJ#[Vk[FB(q -SUYc&9-h1L[-4)I!cjIPI-8iZ)3Y5JG)-8T,$-F'bcFf#`cUm)f[jA62qqJ%4Ik, -NdU0+f$kRqlm0B8j#Jfi-CSK$bid&XF8&HQ2E+hm8*GR)!3IE)h*X4CbVHp9DF-h -a@B3r)('e%l"lLPGD-li1$l'9)$N8VJ(QMF1hqhch4"J4l(@91F*#Kk350e+ZMJc -%ESRL$k0J"36cmp`(TRq)iX,jDPF"-HLDJkRYBcifq*pR'bZ5CEI8)'ZF36PPXXj -qDd[%GF1dC0I&)LG*P-cKkQ#S)jF[-@p4*8S-&cBq`%"!&'[UVF(%Cp+G-b@p,d% -h$dR0VZ8JCC2!1S!BjPjUIM8a#KDc+p-4f3LH%[FYiH!RN!$NHi2T"lZ`"r$#8dT -bjThR`5iC(pPMEV*eZUNf)Eq$1f@)CTC6r3AGG$#MD06X0,N@i0Fkk"9("PIhZdZ -4hP3L&U3GcS"6#06+*DSF`piX[G-VZ0$cHJ%&CjLEGHb0@PkMT(eNZIk8,P(TMF8 -C,ZSD%$kU#GbX3@9-mY#k[ir,,$aZ45j0fj0NM8BSLMH'D3d&A6JhA!rT*&4(cbP -JN30E"&8X0!K3e`a&QRHJVeAK2"#rS5Y@(%pTQ%$1YLX),aTX2S3N6X%,84Mem83 -XT8jjNM@,h)rd63ikim$S1L#beBN6'e)(kLQBH`)lfTPZE19jbXqRN!$i43j,L'F -T1-Qj@QM0Ff[Ka%km3"&2m4h6%&'SSKS3++FkK,Vfh,QNCP%"4&2@5b`D",P"6@0 -*el9C"KMCLGcA8HKR$Db"!J0iUrP$$L!KK4lQBr`-dd3E"18eVqAcBD-Xk2i8VKJ -GArG9cI'h5LK8i@fXM$Eh#U098+UMF`UP[E$aF8Mrh$1HY30N5`(00-a0)$TM*1r -AM82@GC!!L9MQ5ElYN3f($UKDR$YSQFIV+!5@E0q6h1#jlET-XKH`q2RTYT&K9KM -f%`jmL@IKmPV[6@C"$6hBCd,*p`6Gd$#%3Uc-pY3b9)r8"9S,IJ0p(9K3ck2k[*4 -U-kMk@&JHQ9ljb9"VTakH2$X'MVa`6'HiGbF2lC8b-Lh@aMFZ8Bb%JZj)0APR6Ya -'l2F60@pB6BhVc001`$,aGAbILm"DHJfB,haSP##,0@+[r%0-J`9IIVX(qFb4&3, -TQ)(UNME,ci9,raa!BikqR9Ra$2S-ddRK4Skb[Fa+b,S-2+`VZVm0A&9"0YBCfDb -[M3'8bDe`TGQpS6U4k6r0+*jJdk`4IZfQ5PCkXSBr4eMLYIGl-S(!IS6$'CEEij0 -J4Gm#pb)@AC98)YVe&eG#p"-KRJ$*dj[h"AMY2V'1X,K"GYcGV*LhhUcE0N(0+#i -aY9`3DE(V[!GS'J&Yf,`jf&bq'M)k#6Tq`LpGlMbrC3LA!e)XJB+*&GBiLX[0A!e -i1M6#"bB$&9ZVEC,mf*!!S*)ZjZARG8kkE*IKiD&l)FVH`ad5PrRLUB8XNQj0)E! -DG9%QpApR85TBLj-*M`N69fZQSb*[QFQN+F1%LIIhK-jh"GM6ADLIYP"!Fq99k,B -VQ0!ekQCHK9qaPfbpQilm)Q5018Rp*TiaGeFCSj!![4QS4d(,-%01d*ei,#q&M0Y -)h!r@r)jNA4j#mLEGUrS!j%JJ!rTf*@P!-Z,jY&,[`-D&3leNaQ#1$&*U$pQG`P@ -C9fS'q!6phrf5k2ZRJmhIG1Qm#i3aZc$+B0`m)U5SZAVBl6E4+6'l+NSC4jaG224 -J0Q+KPA['@I%i9Z9c#)ElLP#b&IS)D+qm&i(E63HKT&)Z*(#J*`RMMlbjCE2&qCN -hFf'BfB(-+HMq5+&CXa-86UQ#i!"LF5iXGm'$I$4QTfK"G&(jhPc&3$dUX8((qFT -I)AbY(SSX(LF[8XN(rd8ZdQrk'++LSqQk%[,f)&q[4SKU3,)M3Sam0)2lLhH0"Te -L0e81&eA`c-1SA+#S$c2TG1)`pc)qL!2ANLe@0N)pEhm)Y#8*FFd5I0GLjfeEAjA -bSZRI00ABTC8e1''hFkTEQU9Aq4*N'C6mErE`rTqFSSkBrHD!@B&@di@EdCeb9e@ -DTN+Xb!4dS('Umf9HC[@Vqp"'lkIQem4EYmL[FCJ8S$5fTd`AaZ$84N[PSPBT+Ea -[iXpr6Mmm6N5*)%SbAaFU$NcZj[jP@TS"SF&'6IK[k$)XBCX&8"+X%HD5!FE-)6b -[f`pP(e,U28Nl4c`D,8a1#kKL4T8PjU+SJXl6(Xep"V3+$RTI'BT#S5QK4J`jBU6 -L!Z"afiicZkQeS8#Ceq2U4eAQU6PIdX4Mh%&&0abb[,b[XhUq5p&iV[%QAZrS2'* -3l9J3U+QGb,F'05BTa"-Vl)laMPLi[49bXF2%'eQSKZ&mFP@46"X"A6p(CP3h85' -eD(Uh9ACd&+i'STENaL9-a$B%#9T*rUrmTd-G5T%LY+,3!Emj"dV%%"ISkQbFrUY -$EYN-1@LQGTa'HES0i-R*5DJA0IYaJf"A1C@Hb"ImlM(*54-(b5SMm`ih8Z6mV3) -"f%(I$2Y1FY,Q!"5#S@I)(e)amAd$*a&ci-CP`iiQV[Q+2Y1L*+T#0@8NZiVZKRq -Npr1dSS$hV*F,h))$N8E)`8qr+Yr(Cb1B+ame-IJDV&DB-FcUmQD!!C0r"hq569N -,96hci36*X[0(38FXl#2ZcV+2&8iAB3CCGV`f0qV,110LIq-D,(`XJm3ID&fiY*A -r36-K!$pAXb,8ENNBEi(rc62*QXGHYF5aa9CCa(!%(JSI"KP@Y5NHUQ"ZCU6Z*dB -PJ1-plYli1Q"ND@UB!!CL"rA0k!hI)$XLeaS6+pZ#1ccFQULS2d6S5),MqP&TUiC -appFd#MD3!,E*[,4+T$K`Y`FCXQ!B(rV,&d2RdJf-&mhHTZIIGVmNN9#e"C9NBJQ -Ei1MM'1B4(D0r4r&eU[2GFT6c)jGr[#*AC%9!&S!`2EReMC*T1rbrldYS6R4qkAU -N`8h!A&ED',eB&IZRIp!mc(3U+i*r)2JhMm*)cRUXD44R[[RF)AKB[4#IiEeGdT4 -cMr#j*P50950cXBXLcVNKQ&2a25VRdmreC5b0-2Y'IIp5c&AJVFR2S80PCm*44#- -"ZBPflb)Th@%81HBUTl0TQiem!c(PS)XHI5$Fe+[I)pTS(#J[IS*1`i!!8$2#KVD -MUR@$Nh#&D1[2)8qcS'II'C!!D1Yaq@Yf'!GMKZb%@IjIXmG![EX3AMJ#ULCLAif -6BEQ0[0NR(Q+pHQBp-1EBRh@+K6&BkF%Q)B'm[%Nm$S&)cTJ*KH%*8[6-m9K04'P -Tdaeq2,-Q8)HU[UYFAaAX03k+rmD-Zd`SqKlJF[F!rrID[jdCL9H40k+,&Q&N""% -cAk2Sdiph"'*$53eV,%bSq0V!C&Dq1`#bi0'kCF#mH",F,QUH#-9rmULU,J%VlrL -@0TYhd$"BBiHLErkXa!@9Pj5a[*K,N!""-U%`kh-S@U"Hdc4X-k`X"'@b[`0e`ka -,11d1VM&JLRIMdZ2D(ZY#4P4JCmi'SpR"P&kH5QM#DEQ4q&&!FXrdk,mP%Ik9eI+ -cLm,D@iaJ'VMJIRZ0f4fh@65iF#'Bi0kV1%-USp)Q[lM",kTFm,+V5dpeFL'hST` -Sl(G)GTAALp1+SP0M%bTK"b"`D-BlTD9mqm58NhKc!(!Z%@M2+[+,&5'kj#)S[L' -1(l5`!aXE0NFBIG,$jr1Jf`%jmk5R@iZjQ`0(K5BNK&Q'K[9V2%GbpmJ-1@lSa!d -h,a&lQYFHCQjIAqE@69Km!V)q%"I1SLA#-P"'-UT+jfq`UU4)&SCQZ6G0mG%b$5B -6RPQk*Ul4!X`)pFXF#+p!f``YV4Uh@QeXkDD$9ZAbC9eJF,6A`&c6'Qhm6QLMfKX -Pb'S`+fJSQ0ch,Udh8*VHe&QG[b-C&BU1%LD+fV4-#[*bbceZEqhJpGHEqSaArV" -2KN0(iSf5F,hPNp+2cCIYLLm$d"l"aD"1a[rG%L!4i)VG[ji0i3A(,QpF(Q5k(r2 -!2Qk86EYGRj!!KJNjCQX1!Q28`),Hde-#ULNH`Lmq&5kNHk'BLEB4-V4RN!#I6TX -QqD#0`TPK#q"+T)`XZBF#)-&J(5"XHEG%RGGQ4PM&[P,'bT6KVemCKHbCSD$lBca -f!1"raF1,82VK#D*F9CE2-!9N,$jjrrPXUECVA6'VqI8@8'N0R6ie3A,kaI)UA4` -@YCSQ(-F[3RV&IK9YbpX@YCJ*Qa4YfMi@,@9)B3#%a4)+Q1Rb+T%m`YMNc@RqcHI -Rqj!!-@iX6828I`MAl"4-1,([L2+hKqpcrk,dBEbcep@8aCLa98V"Rd(,H"+!3cr -qm'(lNG5a#kH49KCSd5IV-,mcFKBP3SL9R@#(YCI1NRcN-[",HSYRpj8l+#5MQUG -*5+9p3,9QG[`5)Ve+"GTG0r0"9K&cFR%M@cKkH32QrhhF##'GFr$A4f)U94EFlH) -+X*LCk(dRX(S6(3b3!!+Hp9N(#LLq5FA8YeUXECC$[)Ep!*Slp3*JJ50S-MDQ-&C -8"[`@'PQj8"DkHeN"&"Gq6NA("f*'9[RUB3aimjTG[+-VB6c#MGL,M%-Y46'Jhka -%KQpX*BiX*KZCAN5qeccEhHK$G2@M$[V$*(jIEfGlU0fRIU,fmj0M6BRbdi`)F,X -&iN`'%e0249JGAZ0G9)iI!H&la+)p2E12ZR89E5lk8Kr-S%LCEEd"iQIXGF3b3T, -[0G,ALUfaC00[RbKBdp,@+9'8C,p9((E9Ml@42d2'3QeK0I@$ZR!A0r6Kh,d13Td -f*@f!@)BaqclTH-h+iF&,8*2-T8-4Qkh'q8"h@6"%!rR@)He3+4e+MPKpE8cL6&R -3[9V&i[5PBQ&@'ETfTRma1@HB[@dNB%*8YY"eLT&+&!pT3l8fi9mZqTdUQCqi&'& -qb$Bj,B-f`Rqa#&KhNajeMGUiX,$5b&@6mASR*&4lAbIU#*2%iR&A,fMqmS)HT@N -C+J"c)%EYP`j$Z3#ekBif"UHRSdU`)B`)TiM5f[dqA%d5DYqb(SIfBMfB%("8YaP -'&P9F*NU`TUKBJTjQJe&S9D2b65A0jZppK+caVTXkK#5qj-a"Z3m8dU#!aI`DVTf -T%I,Qbd6k*)IG@kdV9(`,HkLK5f-*rDq'i#0`V0dGA*MI"p3D,bmDYj,l8@ii+ae -4i2jZ-40U4J'Q"kI9)P&kr0Ef(KR6Y!U!L(MFkq*VhGDf%d+GrF"Hjk,$RK6,M'r -VpU%mhbQ)+D%ReQfR*Dk@B@1e)8fc0XqqPaZ8@dM2S+MCZ0JKd1UV@8PmmEA55I4 -E+h[4622EHM5eq49d+-q+p6c,04ck$0[i!+@3"!%!!$d!!+d5`(Zc5G8f!!$@%!! -!lV%!N!0b!!fIQ!#3$Nek8f0SC@eP,R*cFQ-!!ADlFR0bBe*6483""[q3"!#3#S! -!N!N8``!!"V!!N!32!%,"e*XT6*1``ka*d)"j8"k(,-j3[NCRmb!QRXCRUTheAE+ -C$'68qJ4#qq#i$TlGKZ*[%BA`Se2DNFA!dDG!Qp6ZPXr+4N-(V(AXMIb%(XpUI)j -0pEUP$cHc@@qG2BJNXk9b*Vp6TJpe$EECG9BA[#"%l38CLq2,5(GRLp29bZf4kDR -Da9Y,%V((#h1aU,aVS$0Ya9ABkMBEE8cR6A"m-H[KLVj2(I&0'%`pS#1HZ(fB&RA -0NarfYAd6XMe4m5'9HH,,SS'fqHbS-pP,H-m(a3%N3RmTCTbM3N1r4ecC,91`$VZ -f2ZJkS$8RPqCqT9rED58*ZpNcT2'8*XV9f!B&kl85Lm8B5[eR(5&BG1VcZ3cY*eL -Mfb0-Ud42+Md-ZUYh32K5aL01C%QipeML+k1kS9aQ5FZTF"M8BC!!ABqKa9NHkh4 -r!pBI3GArN4$eQjp8S"behpG(&'(R'iXFJ9l0'I%&Vdlfk2[9%%a6-Q+(mba"HGm -I(MqHBIJ@r"G"8qc+[$bGh,PeIS1kLBNr4aG14)%8iYH5j*5aDLLr'%Pa-M'SF2& -`pd``T'IGScfEGI)pe@N5r-E*I9eZ[ID'dd'la$`Yl-+#phYNl6Km[XS#3qP+q)5 -SFV)PcD9ha0Ul-Q$l%*VF0[LelHrS5%@X2Xp&!VY!)CVcpVDPX6ZXD#NkCZ'Yb%U -$`U*C5L,$m4))ebEr-dM)$5UMR"kRAAlG%q$`',$+3b*#"KAA1@'#AY)i[5@GZQl -K`5Xh+qXE9e`dpL4jj,'(ql35KbMkLpUAr6aJ5baG[id8M65FNGX*cF[Y$*kph@+ -D0'T&QCCrhlJNqG`8QPMF41#6f-8-jeYCZ4BZHR#0[a#kN!"`M-1$RR3c6'MHP%G -cXGci%8FL9KK&P[p-BSc,9dj44Xhe,hR[5P,ecQKI[XpPD#202DPKeR$1K+#PGSh -Tb1KN5Mdk2frhhj`'@6&H%Mq"`2GBR'YLf*4pA3Z*1pRakS*U(IQ``Pc!1FQ'lM$ -#4&,0IL[2rl[EibDYjA8jl-!r#)3pkr"$Yp8HZr`DMjRNJF*m&(D(#GEa6jTEdap -,5D4A!*kZCf%UHHP'kR4DL#8Gh!J#Rd#k`,ZR[2JcD$XCT8K&jI2Zp*DN"emiQ19 -SSP8cAGF0$rFEC@6a44EcG"LG!%YLQ[+T($(2-2bJ'T+0J!fpa`*!VJT+qkeXCdh -MSUH1(rE`PBbmVjP16H5I!dFk(T&d6!5+Tr@8ZQ5F*"Tm'&peMA%LV@5TQPBELiE -aXpMfKLlPCAk1(e-65c#'VI'iirA%E@q8N89l-6i%BIm6EH-8ppHNXDY)TDP1eE0 -D$AS$fELhBYqj0Tq%dI&"088k9SkiCS%Q$`V5Acci9%,iSGD05S`GAFP&#UXH5l1 -[!qqSVh+,GIqYhXRie)rDihmbr2#,PYlI3`&bb+#&bD9-%Dd(q%+c-fHp@JR655f -r#GGBqJGXiQb-Qh$l'$9AYL9FUhR2C,!Vf2EmQBUSm+m!RNr$FIb956-ef3,ZrM0 -Dr'D8rT3B,Z!i&bTL!)XRi,XT5jqD09!4h)5[Q6CMpj(3-*Y&Ke410bNA,N&FT)h -bL0Rmq1m),!j`4S$G30[%r04hF`!+9m@3!!MIEE6M2&ArR+G%#D!P-XjU"$R$(6@ -qSmXBKh4lMe&m4EMX8(!%`(lkB0kPT5PTkD3")2[C(r4UCcZlAaY,TYp1flXYaA% -Nha"R"69FirF3rNY59e+TTr[q(m5EjKrff#2@Nj%f6[!diEjUXM)59pbU`ESCU+Z -Y`+U*p[@,-058[(UeR)4Q&dI%ZX-hF+d@#&MM'H1qAVR6`VF5YY3+jZ`CarH$EY& --p1bdF(Q5p)ZX+Gif+pX4ZLq(N!"Y1#b3!&Fr)%*C$)3Z'ACp`!LhQMf6k`C-fJY -Z#iI)'XJ`pjb#Eq2K4e+4d4hVRm'1lM0S1`J$Tc2UKl&50j-['LcEqLMX"1cQG33 -KZeaDUp%9b,$Jm2m`i'JRJ%4RSePhbKq#,hedi*!!'SKT@BCMB5hUp0+D`N+(J!( -Xi#k&,+!hHPNcHiHITKpJZ&I8aTjVSeQ(lJD[cqClA`q93hcqXNdPdLi3%c@8GXa -6cSRjQ94Uj(MqhE1[L@#ZaQ4U)dFb)IqilLVpLK4KB9LX4&FK%*Jmiq*%#(#B!ZZ -6Q&chbIEa(RQB34Nq#`+rNkiB6NQ[1eiJ)Y'XF0RG"V1HQrYjYPQ3!%F5pXGLc8F -#qaB#cF&%D0ZYqYB2hqeI-2G+"Q1-ckG3rHSBlCXD"aM&*2mXK#QAE4-Yl*erHl` -D(-$!!+@3"!%!!%!!!,'Ch5Le6(GY!!$RNJ!!qjS!N!0b!"#,H`!!I(i!!!b&!*! -%$`"0HP0dBA*dCA)Z0MKV,X+e!!"dm8e08(*$9dP&!36rN!3!N!U!!*!(3X(8SKI -B#DLqjII%aGKD@rhYP[H8CeS$MkI+NVr-km3'6HSf6k"4NL+dTFNr%aB)Z6UiNLm -erLHEa"6FEZImC0@TLTS$MkV(+c"L3&bqTrFkE$pb-QriaVd%MiEFdUY0L096-&, -KkkrJR2J2A*MSLcSJE-@aE,hFe!qTXZV5#RpH"d1ZZ!")QYY89ZLCbkHfdHm*6,M -Q'YclTK90p5K*8I3!#)l11$MCC841MBF82)P[q9RIKV"*8J-NpMBZV8"Y8N`mPR+ -lV(lfYP*LD!&[&@E-Qi$"`6U,c$("RZB'd(Xe`E)),VCDp`&6APkeQX,LjSIMZN8 -qEa$qqAAF1AK*L8XHM(4i40+J+"*%B%j19G@ar5EDG0@)KVD2P0%MQ$&NTpkJUIL -+r!S[3GA`l!f[CbR`5`[bUf%mAVD9-bGCR''mMR*L-dRLD`'K*eNm`CHa'HU#!kc -HA-)BZe(rVC!!M`#TX+J'8i+4ERB-!BK(JP8$Pi%E*U%R`QQA9RXr9ifABCDPY'K -FQ`ckm49EPM[QF'-N6q*%U5L1hNJAV%"4d(83FNeMY1AahL!C4SSlT`f(QV01J5S -()#42a!)e2cihb[RU1$Hb"2,jh4aJL,LdV@k%93Z8DL)15@3+aF(HSS@AH9rJYpH -@adP[E!RQSY3Xp+R6JXG-HaEc"N'baj6Y)`)HqQ4CM'RCT2e[,EBr1P!KK1`"3,9 -APi&q3`''bT3dK!m-c503KfCQ3ej)YbF`VXTY$JL(6AKM"SLT"ha$pGrbp&cXhV, -D"HBAfhLd!FH`K*0cj0qqKqTAT2S0ml+0QDJ9#QJ+U%XI-%aJIH6BbH4LAJS+cLD -F%[k"Yc$-'GAAejY)iS`GJ4Ar@(!Ph+p%2(6U5ib@P5*L4F-elRNeAQKEVGY9i$c -U-Bi&,p8E00j6dC6S`SLHPkhc(IVN3cpU$M(,E@EfNa%KA'GG*1028""KqJBf81) -8fM(2B%&d[Y,*kM6mMSLdJf+RD$9`kM-IY9$`%mFC'AD%mI3$qM16'&1kHG)Q[Ga -$Zh!1Vr-NPQF!FlFQ2`ld+%lkC+CV[CPmc+l9CZ@b&p"*R[Xa5+KPhZl)j3'a@(` -Ydja2#qX'-VqC3&+%2mcp*1[)88,LYilV*ScPif&rI'bd`DDmpTG96I)p))6!SVm -dRVr&TjU#q8h04@ke5R6UG3Ddl8AdNeEMdRD9kjpbGLR+$20!8)%(*CVDc8`*pCc -1PrY6ph'*pmZ'8MDQ8#jKcmJiG1-d%(Zcb-D'LGHq6&QXRhlNHjlI[*(i`QAaSce -9M-)@"XXLVZ)dp)$lj`qEAlGH'!"eAR`'X5@*I"9I,IMD[UTkH&E#9H#k0hAKkBC -QkR3KQhHY,LF$4b-K-mX[iGbYN!#N(!ilV`AZ[,A-*QAe+UNqE3PCQGYb![H*cYa -eQE&qV%jE#"i&d&)Z-J1VaeHC5V`6J+$bpj%,emDFkKBp$J&@@JiPb0b0h'1[0lU -j$+J$KU'B&YLD%Zi1EaUSme,l9G1aSkVBqD1R+2ZqFZJrd#E)Yb(A3mi$SlRkBKh -h&1%UKj%hAkJS%2NF9eD@,%T3h-J@*bqDimFC8LDmfK#HUjcG42[FXKb2QPqTdR% -LP@)p-6#iJ'Cm3UE9$XeIi),KEE!*)'krX05+UP4bAZq(KXD+2'MQ6&8Z8cQQ$2l -3a[)Tb,H@'4C3J9#6@"[M4BljA`Q+!)iml!C!0U)rUITPqEk"FqCqa(2TCaALbCe -Z(l'pQ[ML[bHq%Kp9pRRUI3GhhFUbXiTBdi8Z4X!jSY##iLH@RUaQpS+4%qp0k*e -Zpb(8EMN8YH*Kj8h2*!`NJH"*(!GkYTR[KH"QQAei'I4"[A!Ak1chkL5J53[A-(2 -FDX+$kf[f2dKe"!PGqmM+F'VD(XV52(*G99`4R))#i5,"Z-N'jSI30Uf@A9+IY+E -'kB['ak+$DGiU%9$Hp-BQZVaP%2hIU@bEL8("C1"BIX'rDmK+Q(mD%qb0TqFUXQI -KPGT4`-X!-6ri*9fi[L*[#PqH9NM6T2DAT8l&%qXeD$A(2LQ-J8L2VGHc%TL[&Ff -HPGG-22d[fYa9E"lr0fjFbeN,CY"DB+F!)0`80NS[K-@3!)[09N%+@6Hql'!"fh9 -C)GPMDiBc&2GG-#',3"C[!aBIp5bM0hP0ZhmRcD@Y$P4FS-ZqR!6)HV6KTCcPNik -RC8+6lXK*rr#(RT0@0ba'"864X!L3!)q$Y(94d`8!qm60N`PhG))pia,`X6ik+ET --&dFK4qId*AH["hBJ1qJ+D1q,Z3XBFET*`BD3!#q!ISD(Pf&V3V9fb%rB"q3%#fe -m(+[`Qbp4Fm$lj3d,+I$QZ1JapXF+Zhf-XFI5dGQ@e!U5-XG'%MlVlh)Gij,JZK` -pRZr`'PcUEhe('!XfIbm+6KeX!bN$jKB9MmflXAX'*IG#c)GXqmS4$-J2HalSTB6 -$IeU*I1cGV)ejF16Y(')'5,Z2jESRb0IcjNZ-!*A-4V**(NJ5C%ahfd5kmqcl8Y# -LcJB#-'['N!$YPE(cD9@UXIk&9qacc$)*,35,M&*0BJ0U3Y#qh6fK0,!l''4e$ij -XVj-G+[4MCmaaPQ@ap`)RH5jFdlLF3V!'l)9bmG&S2l*hYiQNiIq[Rd'[,1MSKF- -YC8TYHTX5-q-#hYH1BE#"4dik*8aU@5!6e0p#R3,`plE'U!"Y$8caS)aJdS'2X&1 -2abmMN!$Q-1Mf6HQ&(ZjS'0c48hb@!pZXFUL4BTEB111JKVN!3A5D8QTY2(MPD36 -&'JR#(MmkCpHIPS(*DE5l2AHA&)pQjUKD9BR&UQ*P3jSSM0J`!9(QM*Sh+BJ%G4l -%6!%-l'HL8#QaZGl%-fcCJHXG*&Y&b!8aDa`*QPUjqEI2&Er'eN$`DB"UX@#X(q- -kp@X8N!$83Fa9**%1qcdYk3MEZ6jRdF8lEm``k2T-2()M!YmI-[-QLB2&*kNrUU% -PkJ#jABXKKjSNK310H%D#Sbq4!RfC-GD2D)$FBA#aUkU%m3@hN5B4eR,&qb3Q*S[ -(d*5QY#j@ZZRUURMEcf%2fG5rX8*Y@EY5*DMTk(IP[Gj&p39,lCq&3Dh29cNH5'X -FZq"*9G*4LYXXHEp-3f#eUYjI&2q0hiY)!i4R[RNR2&c)&'TFpph&C'1N3)S3rfH -PIKKE4a@LHDcI4$D$rJf%R50`+pk*l*&5[j+`)&G'KB*6X&1dQC3mdj*,bT!!iTB -3D#reLM5PEB*TI%1ICD)9f%`@0TUQ4MfEm$IkQi*@h5XHZqDLU)NT[Fj!BNdD%Qb -BFQqj`S'1m#a+KS!peDJIh26H!GV6LLVa8"A+IU%iX*0IF(pEq)bY8lP@Z0U$-jF -e(qIH&f)C[%&VL113!"i,'P@(LG`1#AZqC(j![MB%A5YMbU$,8L5`4ANa+B44Idl -'DlBJp+Pae))'%ehF[h0Uq"0XUd+5iYSKkpe3kH(p$IRl#bk'b@3keBZ5eQ-5Pf& -(9YPK5[(kdH"Ll9rcYHcS50l(qj&#PR[k,5FM3l`'haQJa),RP#+M5DQV+HRqGUD -1*'BfG$3808plY2`E))0)ZSmTHZ)bb'cS$$V*2"S[(&UaMN-D*fc&0j0IFPDD8+( -+F9iHZjqAXiAVZF[$E'(QEa8lFH!@P$p)FV8ifd`@iIEL+a*E2X4"F,BDbX%mAiI -#55&pTi1CEQGjpSfU+0IKFiPp&MB5(c`afh6Yp"RGaP#Xl,6f5McK244JiTE9m3K -T&E,I$50eDmVB*NkEccS5GhrZ"&1K[&1(XXFXMbM&D"r#f"+J-M9d6AjP-L12m!h -kmd$dKGq*-G2R#K9k`'DZDq!jGFi$[NH%SrC)kZU1NkV#K(2`MphH(dfLYC&dEeH -j2m&!iYarUL`h$EHic0YZVR4'6GLRZ5%&B!*9M`I`D,UCZN[BEmeh`JMNiY`2[XS -Tph*#h-!LF5PDImYV,r@BfPa`DRT,E"C#qGa'3I-'[H$pYbeEa9pl@6dXGJAZVNr -N3U2A`dQ+eC(J#"UI+CVT6!+8H6'8U(KM2*13!!MEpdI+X4$a%UFq1i59%6F)FbV -Se%8hkIZIB-V&r$,eb[ZRQU!mJVkqXlfaKEhhMSBdB6kVeC(Zm,)JdGJ['QS&V0Z -5r*l0F&YU&Vi#l2hq+XR[#DVFJ5E*&TV'##TSY8eGBhdV#48`me84$Ekr@Alr60F -Dq-p#(VBm*&92IXj&c`eKNB6YEGJ+pD%rZGm(AA)H!Mf#mMjTVm-a"XIK1%TVA9* -V&D3$AK'*RTH9clAF!)))N!"6e@6!fd3[hEk!prpAHVLIYSpNfmddZ!Mki+@3"!% -!!$i!!,"!53L`iB!X!!$ZX3!"!-m!N!0b!!j-q`#3$Nek8h4KFR4PFLjbFh*M!!& -#3h*cFQ058d9%!3,rN!3!N!U!!*!*#k-!!!6&!*!%$`"#`G5M19)XkBGEejkFF4c -N[q"k(3j81*L3!1+"[$!#kp8R!`kD(pVKYHap0K+6P#FP6F@[KJ%&jN9RpIeA9Qb -#h5NJMlBRjVLHT[*Z(,5bZcZ'ATCG`QHP@Z2pC5BMN!$-1eV(hT-PQLPL0PRjZ+D -LiN[T3S''TmU&"8Lc0["FPYV[B!a2[RN#[&VMceJHq!pU"fm5j1"i@m"(Cl#khcH -MSL6hahlD0iZ#-)+M0%6l%FD8L&5XVbYeRQ$Db+4CbB3QkM$-%%)'D!!!SPpV@HF -&B2`jGNBlS4YXTja&+fI8(0@c2#hS2TKbp2m34%`j8YGk2e[,Pi5pijTrE1!#pAT -YpZ[,ZZ%ULH6["H-9'elU*b`L'!HZQXE*QdcLe30-[4rA54Q`NYH3!*+29MZD`lc -#&l&%V64*PaL2pRp29HfEk`&X`SlmP4b1HCBjLZ'$L54`U$U!Z(iqFED"RUERi1# -',[QDpS#"DTC%1q``Pm6FrE#&`1kUN!$QpiI9NpBfc"irLm584k#N)H$pAG@Yi[E -&H6V"ZXfN""NVL&'NiP'c-+J+6TZf1"+lfjfQFSTmQlHP%BF92jP&Uf8f,CU3!!- -hMCF0T9Pj%,4&'+KZLC6XX*d'"L$!je`0r4CND*p-S+b"RQqMa,U6#r1!)GQ[8m& -PR$,!i1d&[*Qa'!rPhL@56baN5+'bl#c$q%$h2@rB%ZhfAdVQA4HTrVEjmS@"Uf) -#!eHR9NkrCDlHJ09h@@2UTqRCJDla3AL,RLapH`E8mSaG08"2cpQN*mG8f5bC,64 -ladXqVC!!Sme-Sc-ihCi04+'K3XaN$iD`ZVr"13md@JVee),JGLb+rb,@GMAmG&0 -Pi"4+SjB5%DGEk0[Sj$M&4GJr,11T0F`E&0-420BUbXVBR8Sd!TBpiPD1f599MM6 -ZdC(E1SqEK"cfCi2!ie'%8be2k#rZfFDkUUi%efeT5'%%6@1V!4daHP@UQPhT(GX -)-emSqj4*X!Y)1,i@a"ArL+rk--E))MSRJlYDBD-82T`eSV8SFUJ2XrEQXmQ%BK[ -+J%#-$4*B4-CmCMRehL,KT*M0Eqi*jXh4a*ee9Tc5,NcLT!ffQZ(2+$2,crqT#)B -mJ&-rX1hfj'FPmU8ABleRcRN1h%(Q"(3El!e0$Amf`N4h3DNA%6YRc3U0a`I'2#* -3k`L@TqE['lIE+liYZH&[BiljY##T&SZK83,XA@V[ic*%[Pedd5lM"c5(GjHf%Cq -dCSF*GTFEia,R0Ui,50He2RUrPqI$iK&ZdY`IRf(+`E"3eGL"9-5L&@adKhSlqL) -$f*hm3+#RrIE,+!+S)2+JT$maPP@X)-)M[!qTq$Q21#CP8mHmm'$4[TTA,,Q[[j! -!epU'j5RK@clr`b$6ZBH!Pl5E)S,l$JRNfqPk'EZQT"lEqMJi*qMijHeB[rd-5U8 -d6*hePHIb)9-(I"YU9+$1XlJ'$YDAZ#0dZ(MVTAc!j`IIMQ@ecem8%%-+aHhLmVl -,Cq+V$ciheG8r#CkIE539CJY&rBePiS,a2HflM"6p35,KI8TS$#AJQ!b*45P8+&+ -+VIFRJ#F%")@HPPhFd$)GMUKR,kmr!8p4X2'Lf2alFQISbfP$+U-Jq"RY$+qJCLq -(,(2"0B(+`B,QM*8!TC!%!3!!3J!!XCQq-V*Z'NF!!2ZD!!%1P!#3!h)!%J)U!!" -jS`!!$9m!N!32!'pP+#"cG'4PH(3T,R"`Bbl#Y3!!)D4069"b3eG*43%)rj!%!*! -+J!#3"d,"e2YILrJbhEAcBd3[*(hPm&b3!,,-P)"Z!)I3)TS*l[cMqc6GJi4IrGb -rpUfiU'TCHrq#3q2efVXk#C%MV$fZX2MF5T!!1RjI!IPqbH1fkA85,%LNQ#p*A[@ --0+JTbcJpkmCAK1GX,ql3ai36+eq4rA8bCR@6Brk`HJ-1SX4QI-bX5FDYVNBl+i- -'&E2c($-@U,QkH&8a2"HrFh60)p#%3F!"Ha'GV82ab@-JHmkXGH,C$H@GhHVUFCI -i6&jJi[Qq!E4!9'kq4QU*`CBbei(f@0@U0@4MCSYZ'hT'%MMD*a"EpNZP6$a*NeT -r88M1ZVaIDDXS)&`RPZbHK#)Cp!+TVJBi,IA+XHC(2q39JL4-e'4QMf9qe`IqE+H -r0I%E2FP@qYc%f28TF42ZF6maP08MhcqKMMBK!kMqKAA'p8E$'T(aK26K(Gc6!U8 -BGY"[eCKL2&fe,F[hZU*Kkqp[5e!-Y+DGQ`%-dP8l#"LFqIejhG$D*EPpHDHMKh0 -b[r&jJ8l%,B1caHT&iMH)8@JAh8hkhiQ)U9P@H+&Ui#QUUYGY5P5ZN[5HGIKXB*m -kk0rhe`mX80mfHXc&QHRDKX,LHTKP8kBYqR-X8Bbb%(!X1J!i`4[2)%"!6)k4q-@ -im!$-dCblJ12iGXGN20q1@qB,18#$`ACYcf+BQ$B'PP[JVj%j0YSIM09e5m@0(6M -4&0F8DV3XH'k)a8jC(l)ZM"Pi6TpS[BFm0Y+NpBDjCkQaTM8L2mh3KQQDM[cP'&A -Ge$&+p1bhXB1cbpKKGpaq#-G%,8VkVl3k(JNXh@S9AiAFT(E3Z%4cJid1QJ%``FY -%ZbGTpi6`q0mlNk['ah8'$iBCNii`dbYZ-APF8hlMHMpS256$p[Z23Z'iVQN,ED2 -er&*%'+FqmT'E!P$m[f6Tp4GYe,2qYFB,[%['UcaRXUNGjKK')eX0l2iV$AC5V-( -k0l53!+DUaN-b@fQ3!*M[e@d6N!!cb6`Q*r$+f1la2%25-Ep#9mN01LNk*fLe6PK -DJ#i*PA3MV$`dHB8NlRLS-PlCiZm8,0MeIZLJC%GN685M9P`SQB[VfiTh1(&Z,ND -VpCr33H,`4j,e#"4S`V#AEr!l5&4&(RZ2#@R+J&[95bK39M%6ZfM,j5`qlIiNaeC -R4b@pmH!J9*9aHZ'+8Qr&L8c4&0*GZ2TAC6"DR,jp%+&RaQ[1e1m4IU0KCAHQ1+R -%V!@*8Y&E%LP!JVb*FlX0[q84300,KCU#XEaBk1Q$U#[JfU*q9GiQYZ25(&ArM41 -A!TlMrd`(D45f5iE-Ga2CHcFdhVX(44!@8j6NY`LZ)Pqa@%H%ZPeHVb`#V%HXNB4 -,h[Z0j9E$#N3!Pe098HKmdQV'@f1X,3M!$6lMa-lQ+A$*R4@B&lY0cMBDe[)U+-9 -Bm`$hQj!!Q1(8R8)miqVfi(+q2hdbC1q'5ee+*-Z6Yl8YE5[jrC*9rFd0$`L!HCi -'d0SDDPl$(8kF,blKC`F4[NF"&4-T4Kph2*GF0X@c1ITNLk`ClM'"dh91Y(GJIqX -Q5Rmrai-l`TG!eJhNF`R0)-K(%[0NCjBAC(dCcq#eI+aZ4MN33EjR(+LB3db@H), -b6iR"1mhehM3hG9A@94r'L3JK6r%aXapY%*!!%l&*dVmSi2pXc(`PVZVdT+qlVSP -HY(0,!qM2h*%iNZVA@b"kT#hiVDF*P5ZeQ#"FNVI@m16YX!6)m*@ifh06"`HpA6Z -ah82Udq*1k0q8F[b+jB8GVp9q-)eq@HHX%[UaQ0S(5k6TVNl&RN+IrVDC46qHURq -!K&HZbh9CR0hKYl6eYXcIG@*!e1p,$YT0SPmZGc$Lj6EpQd3QFCXa4SQ`QTC3Y+Z -PHc'9&j@S-H0-2&rAH1Rh,cQS'8Tlc5%5ckY2N!"Xrm`RhCHME8rFrpFA3Y@2QSA -CJ9`12KXpRQ)4AZ1*LLZ*Sa4VlDU8Z10SM+0Ya64R9TE35be&c9reENJ0h3)DdFI -l2K$M6jZB8&PA@SIe!d(i#ZC,UjGV!jr#L9KVhJIShKD9Pp%HNijhRPJU(&5D!Ne -[0$Xaj4T*QLL0I+P$D@pMf-4e,1e-QC)0)**Jp-0c)q6c,VA1eE@&fHZ5ibBA@b1 -qHGLqLjmk04V!RbIqkfNM9%i4cA'YM%Qmb3+[%`ef66*e*R5DJ9Jfld&2LaK6k6d -"M#(cH$8)Nam8hISJKNVqFjpMbIJA&iKrRL%3pLf0Jkla@kq*Df[55!j)L+4FkbI -(Q'9(0'V*khkhNh+3!!,QZaHJJ3C[kaMq*REf`Nb$MUfRl@ZXE)(BQ1h'N!!C$YU -&*pe5RQ%)&VKrdHS`B1kp)'f@eRTpq&%j,VR1f`i[(HY%8#I6KPYrmJ-*%BLSD3S -Jp(q'R9YQXfj-!45)3`95&K4"Yf9b+9Qi$`3U5SP-SA@E2h-%(UA804DSZNDXjX* -(')+AYb*#hY4&kjF!@A3XibK6pNZ$F3Ijk$dl"4p&eF)m&q3jDSmPeQ2pfZ4md(U -N8V#hd4jUTFkqi,KlLK0M1RZUG`E`pHNrEB9AUSeA,e9Up1')NIQ#))5[lP65!PL -PMrNpdC!!@MA1EkS`TpiNDmJSG9d4XN!hrJ#mF0kQE0"#IFSYAA!K9bhDMPUe+)H -X2C&8@%KpQ2T6T@`3(PfiTh-JYQjZ%%Q*@4Lf6D[2U&0N462B8NBq2R*V#G$i9G( -qDk[C2q'+9P1TiVr&Y1K%[0RrXIk,-GX[%8D6FKVSlVIR`e,#USQ@+pK,C+0H$0S -TE)+hhmNCrIZa&eB0Rd%iPTJ#LerF'`cq2CN68hq-jrrR-qTcMRK3GbA,3b""RcG -8YK[#-I`!*H3AGfrD2'#[rKC2&"BP!`Q9KGr)E*!!p(3e4(*R5+kme,-Fc,h#G0r -5I`Xmf(8k&MD["rRc$J1SGLTDAd'QBd(+,VB3dfNZ)6GBa!j,IFL9GPp%Y2YkXl3 -DSId,03BC"5[%DMV*`kd[Z8"fqV"YPUNcl@[P9-48+k9DZ,49I'Ej"cji6i!+N!# -L*abk9p%)3ABall2qh&e(#m`&&J`G9lq@@&6GQRQAX`2pQMPqJRSMEkILjiTm0cJ -pK)Xi8,lFHa8Ge!'(M!3X&J%8@IICj"[5fJB,kI3[MCEh*B8jP-aDCqa2DCVaXdi -Ld9TPTfUMFEZ8mQ0[N!"$,)b#9fRK!(fLiEUKaKYE)T5bNS`94UbYGMM+LhJ`ibh -CmY9flrKH65&9)D(PH4#A$Ufp+r`j!J3fj9lGe34XI@DX)T2q)NJ+#cpeE')b4aY -DI6U`[AlTbDdRV(BrE(jJl@hU!eQ-iT,ACQ+J9XXbh'5BZKe8f2'iA3GZ2$R@b%G -&)8Up5PSLZ,`0KUPUX223p",YpcA!CXeG*F5@BR848rdT#0hrq99HX5ZDjBK,iP( -8mp`e!XQFUKXl[#Zl5$i%(TGVlAfCa3crGD[,LPL&%JB3&0f0e#I[X$ILjNI5X[S -Tb%GpI8#ZB9e6cYM'#r"[XJe1jSP[L2#Ij)858bpY%(%06$l'iNLl0VjCQbA,Q9, -Z-FHN9![HfBi[Zf'rb0,Df1MdmaA@&,BACP-,M9lAA0QMHZmI9C9UpJ``d%(-bBl -SI)p+D%%hp0%r4-EmGFXR9ZSqP2pedfMiNAh4%*NRmUF2rQUVLH@1B8bXE+*F)qj -@@1DGKDcp"Ybp4CFa*)8BR%pM@QYrGJfA4'm'2Mqe,ka[0bm`XXaF%%keK)CF-+` -Y&![&#I)Y,+T#13R4*iD6E,3Hq%AJh6VcfXMk1Zc6Y3Nm0FI&D!dIIH&N@!'r0ZY -[X-lYS,al1@&TdVUT`@`YeIllEYj)jB#c89#YIr'D-UNbc6K@dq)(&QFTJEqqBcp -HQ#j-lTS5m9qha9cbLY*IENGNQY(AmU'BhYr[YbG)fqNl+kS#IlDABD@b,q3XXTZ -CMrZNK!%Aphc@(AXqG9-D,lj@l++01I*c3[dH#-AH'+3-lG0jDj[XN!!UL#L(9TE -K"JJHmY1bK`UEG&N`9$@e"*4m)T-%G,k4GD#eTY9Z[%BmPprHk$'%(U(Ar+&jBr& -PNChP*%k[9M)K*L%Rk-DL%94&,q'F+kHj+,+bXB'(Ma0&YTDPk1[YpbXEbjVk3h) -mC,5[*8EccVKeJF%M4bb499YG$X!3ZMAkeRV4ThJ-'D$&0YLbE'DX*Yp-Aqb)S6) -efmelm(Q`2N#[-()QjII$B1k#NrY8D4lc*d`rXU9ELl$`*I')Bd$i5d@4@e),5&l -a@NrPPrV3TA0@`',X$R8lGJR'#A`riJji0S-mX2,fUbJ5mE(J%R1"QDp`5jCBfIU -1VkRGQjFp(cEe-fU,3RG[QNTQ%#HZ&-#"2EKMbhjXZT&HY8-$C-2jIH#FCcBhd#Y -eQ1)ipV`Xc`THR1&KG"Qlc9,YiV9`aKieqCXd0KLJ4cUaR%KN"LP@hpJEAK@C9T( -cX+Fk!K!N(`i1VMi[ZKKk"%`5P(QijAddQDSE`h5BSGHp0R('B,lk(YM0jEG*bH- -U,LK-)U(Si(b4Y85J*ccl%1QY2jqX(M+lP$9TMGRPqcZR)BTr#"@DD6"DGI!j*Q* -jqT8ReE+MDYINc)$V!`-35c$Yp'X[(+fU[QB""-A%fS,$!+@3"!%!!%)!!,'C[LH -c4*0'!!%!c`!"((!!N!0b!",`lJ!!H1-!!!ef!*!%$`"[C5KMCQdVCAKd+5j`F'- -Z`V8!!#'N68e3FN0A588"#2q3"!#3#S!!N!G#`G53!)jX&8c-dLN4pif1CZ%eQIp -[cRqi+Qp[qD@LpDVPU"))$1,(CLa'!"ddrU`'HNhG-)i9AblX(4)kN!#hqr"@KVE -#I`$X@2GF!#NC)10JDJ4M,`a%EhYVAIL0&#(6r,JB!AI2Be6k3PN%P5FTV2UPV1a -B$@QjU#bZajRmA'X8b!jLUH4(!!)p*-m(*%"@9jZ2Rk-8PcQF4FD)lb,)0aQ-F*i -J$efd6Q)-`@[#8hl+(E5*Z*,PI0`0BKipS0KD@2YLT#Slb3N3c,QNFa%E&f,dBh" -b'P,hXXk02CeD6HiP0+4RG4qeBTeCZmkZ53fKE5(4U0S*DaAqc)BLDf&i-0ed),F -1CaV11iF'6E"YlRi@hLRYG5$iLPUNrV+ei0lmfTIjZ#jJ9QRFcSS@-RI6iN8*UjY -ce`q!S@YkR2JLQ3JdZmM'NL)L*%I@jp'2Q4)B10QSBfY"-B86,"p0cAGJEUQ@ee* -$5$MYX#L#TU&XGC[B6m!de"(q3'[*m&RkqehDk'XlH*8)"L$AH9L$`4b4Mbi)@YA -NHD%3(4FT[qM5G4p-bQ0M%XZ+Rqqm1(EY`Gd&eSL`XQEbce5ld2$G2+rAaUhUFZ[ -,Mlmh#9e'QMJCf'2GUj0!F%fSNZ,el#%%Bp8jMe*lN`mQr$i6AF2qpS6Tj0,qJHB -ApGd#bKJH!YErJX*3@S42DZ,284I3RPf[VVV`6db$LfV(,4mP1Dd,&+m`[&6jVbE -5i2"+Kp2Z)GIH1[lUjpf8X"hB""Lq98(S[GHf1!c5'X4LbN(aTN@%$3B%AcD10Cm -fVEYhG9F)R8RN6lNHNT(NIC``q-PPLMbc8+*-(YX#XjJ(`II!VTb9&!Tkc-lbR11 -PrH!@jiQ29jb[jM,l'm906#heSdRp$i!+$Se1&ar5T%JqplaC*9h`3Ja8XUpb"AS -QV"BEIX*F0&[Li"0ZX*X-@JdS*!e25KIZDZkN'&YN#R8c2F3pL+$ZV2V[A4$'AkV -q+GVP-D&$94"C2#b-(hp2e&`9F#[RC3jS9IPI5&bI9fKq5`CDp8XUrf`8*[Z'Q)L -&#!ZAE@DCc1!YN!!16Xm9AclRHRBjaEYr5a,!K)XP0,&KLFA$DpFdLpIIB,Ep'J@ -Y6#'!c)GHb0m#FH0GC4Qmi6Df2IbC9Re@K&#bX5RP!cB8)ABCj8bM"H%KC#-l-XK -8ZMbCiRMh+('hQA4&H5YFl@H4aBMTQbCNrr%h'j+qDarTqf2(0C(rV6+NhbK@,"` -AL([1C'3*F0lAI@a1Qr`1bR9h9,GQBLqCKPH5CREjFdf`8@q%KHjJ8@%hQ'hcF6k -b3h,'RJ`AH906,LUTY&PjqJ#J+L%GFG,-(-$L2dUiSI1b+eLb(N"+jV8K%[XJHR` -Vfl6FPq2NkS"M1EL(9K@bM0N*IdhAY[pP"M#*+4pCcPNaXB@+l"AGkbkC(QP#h&1 -+Kd@(0h[%H[k6hMaZ%@GSPRU+CYCA9'p*(%49ADcPX+r[LIFNRK+TRF$cXTUHTfK -3IUp"m*-,&8`BmGcU0l[6d1V$QdSRXm8ZA#c*8fD0jcjB"EiYcp'#)LqH(CIP'@U -P%JXrYA9qMc1c0XRaEPDq`I@k@'&%UR0)[JXUf6%DURYc&69R2r033E3201"p)KC -F6,+"fjHZY%r![H*Z"c)cG,lea-6@phCKI6Z'5Zh"Z+@T*IZ6R!+4d$@dJK-4)40 -C$#(VN!"lMH2"PGLl`Vlhi#SDHFC%*'P`H`T-A2J'r#5#bFU#(*i9%PM0D4RY(q% -)VekapX#,M1U`0GXaNedAljRh4(Pa#4@U`"kZdM[bEHp%$b2lRV!6kaZPPFe$%kc -lA"4,#[Pc3MYiDMkDV*XbPV5bJ@AVSFN[@fK[3S*EI0H-9r@j6RjhHd9!%cm3T&1 -&jVR&@*)")TTb,Ba3MUP6)1L&6I2T5N0If@mdS%SMhB,pkbP-Cc6LV5NE)+N56'4 -1DZmpf,EDdIR552G'`+'C"5N0Md"%qc#H$Z(e%S,p(J+Y58pX3eS&SVj`'6Z)r(R -HMjqEB1fMVl6QpNGrc6Hi(ZGH5F[r%1ANNKKYMAJ[8e#j@qTQma2aR!(&f)Dm5LV -[DF,D,r&RJSp,U36fami1J-hSCZ88U,3#[,j+Dh#e8BGe650*NiR,NV+1`6eY!0` -LU`kl5AUhJ6hd5hHZpNfB8mVE$9f8d&ZdURU8hI'lfe01%@BSYP'FpMep+%+l0(@ -PSU2c90M*#T8Rc#%FL+%VJh))N!!&XXBYLdPFj'i3ljB@XaecUqZGA,Pr1ZrViBQ -kU3,Z309U,'RlC6V,I2m%"qdRP`B&Ih["-%5GU*5&+@RF8(,Sk,H`K4l,("Q4@e[ -R',KYjZj"&X1[',3f1+l)$m'mb@dqJVBcp&hfQ$Ih1h3lm@)mhV1fcImJXdQVpMX -AJQGrI'4)bQ1Fl8#jSQJri("E#4i%*U9EAGH(UE%h"HHqUT6ZAY,2,f8c$d,5D++ -1d`Z`66ijM`[#%FrU`d[AE2@j1l5i0aG1L0M9h,-`Q#Ed#-YIp1UF@15kA+h&pRR -0fXI'&%P*0P&*XH'L,DVmqdeH1*qe1UddqDNZqGLL)UkJ4l'`hT9C1%+,"mjq9*k -ZB+JE-+R`apbhlL'F(HE@)qRKi)E0j)r323b$)Q@8)1L##BYbfHkTDRGYbX-C*(F -@*q(cD+QX('(N$'Z8h!H","-*E)FQXNYkj'c5i"3VQG&Q,Up9qf2D&eI1@[BN`dc -XCS#&,HEH"aaB+m1JVZ3B@C+`R!D8SIZL-eIJ`E(eIMPl*QkcGV9R*VfPXAfkU&r -[K4#5dEe%Zfq(90iGSqdq%XbPIG#Eh43bJd-FUZ4`bNRh4C!!,HX%m#(8&NjmAap -rI%EaJrLm*,RB!6+3!!G'#*5$86!Xj$QT0T!!5r(M3&NhLfcZZNJ@hPc1cDl4FU2 -Q1C95PXBMY12aQ'r901Ul3J9d!c)E9Z65#+E'''V9F$8[U2-Id4cKi89Z%AE&XTP -M0Y[C(r4aVS-M'cPQLq5jb'i$+0Uiep1A2L@XP+Z9HL`F+@&@E8FGkkKVEAR4Rp' -`d-2URN)GrTPZc*aXI-P5B[Q`&mC5NGGc[N@PBZZ"9#EDF9X,e4%dN!#"IZAPV0H -Pj&#H`I03f1'Pd($bUCIEpS%A4+T*qbSH1KN9@Il"(9"IPC!!aI(*jf$CC+KrSJ& -YRL34fDhm(SV8Ddjj@a2ffkESJQjN5pTe"Y8KR4'JpKpHe$Q"`I[NSkjTCb+iK$& -aqMJMKkkeZ$M"MRLfF2`F""JS'hM-HPBZ#!&p"dRr[#9S3V!iP3K0QJK1'NJKC)f -E1(ARJSKqAf$()5,YBAYMU-FQ1JFRRXT(+fh8'+83d18G3NVi`JIAl3Fj4#,Q(CP -Q[h6mET3q)H2i9plSjmQTbZ5#1PmFHc!Cq2GLeRSi"UP0p2l6qNa)!YVm$60U`Ql -h-Gq+f5,h#Y@9KbH#K9@2C9+k[jEcHV"'3R(iFm-*)06RdI'+TFbI&GYB&d1--H" -Y-,!RlTbX#`!hNT`GhMhqh%K6U'r5)F6+Lpc00#$KjT2U+`IJK@d)2hp`AN65[J2 -TJ3(cA$RqYFC4!65PX#hAP"f4-Cf@ZKZl28k#2$E8JVdAbUhh&*)XLPjV+K!Tm`S -`6rr6&5U4FEEeeN5B6l-&ea90*!%EMYicN!$%m33%+[+)eZA#&A*"G(YN)CM*-Ml -l%MI#2a)`ULRb+$a[+6!&N6$(1SCX-hlB)JN@rHRq#a9)'@61R8f!eJYmilYPUP0 -2`N)&MfV`c`eIpZU3!,H`TMhXNHj9*(9fRkrrH!X1P69DLrU2[R(bMKFG!NqUm*j -5,iMfck4MH-1'I$!H+%Jd&IBK*@(VZ@1fc1J4Y'fP8lK!q*!!*hS6"FJRQ5V53Vf -JhGpD5+@L5@ir$&9ifNpA[2[`hRjXi+%!V'"Mlq"mh1@GQF)RZ3MXG%-HD%L-$Im -*Pq(XJf9(UB9,YJZHh2,8BlTeK8#[d1'fV%'pm-`PQkI6&$5%4ENch,@9k)df,pP -H4N#2G$SiRLTiM$)rm&9SC$L5QBE&@P6-Td,9U65e'&8j9U0('$G,C-b0!c@4P"" -bIpc%'NEG9F-+Zpq5lHi,,2jT*f@GE`'cm0"CpJ6Kb@MQjNBSZI034C!!q#bHPI, -'arR21[TT-UHjLRj`#EA@ebc"Ti5VDL0Z`q4,'PJ4Z5#BDCaTlj*Q)FGVc2PB"I- -q*PTJQX8LF4KJ9,YpEUkk2,i#pKX,cq#0)T6B8dN3ikMVV6TPHNF$D1qZHLD*YS[ -XaMmik1Br2`8kI1l3[NSNeEYEq,%F%q$NSAI6)CDMKD16Te3AM9'%@02Y[6FZ[HE -&2f4G'"#58c2&8m++%"T$aq-P[E#FI"Be*PK2-&8j`&hr*"M&eK(A(eNFdq0K+iZ -relbf3lNmDGfS!"(&1PA[BrY2HC!!KfdZHS@+HMB1GeV$$eM,FaAYX1aNDhaB3,J -m&,a-K,G#!bDLcQB&UIm"00HGaCKaGi$,P`"1,c5j!R&f3#jP8LIeLZc(ZmS-V%- -j&Er*q3k*[c*aVB4hB2)Ve4@S9m5JN!#ZF35C8@!arY&l`N-K%qrd-p!p-j[JdSP -q8#lJI6*N1,Qhe8LeYSDPdQbL4VrhNi"LAc'5U#iKf!#PN!3"!!!p!!#aP)jVY&h -0`J!"$T3!!5X9!*!$FJ!0&Jm!!(hr!!!14!#3"!m!G'KP)'GM,MBiDbl#Y3!!@$e -069"b3eG*43%+rj!%!*!+J!#3"d,"e,Jp,2G%cD1-Yp`9hRP[QU-Fkh)BA(4kF-V -YH0ddL*!!,Pe&0`i,0(9r6S,SkE6S%3#JV2dR*qY)%6RS3Vb+l0L4kHLqJkS9C89 -UQCSdC`*m'P(I8cQY5YJk,GbUq#(G-U,m15T%EAT0H8,jF*RJ[B)P-6H0d@aV2p3 -S%aRqA18VXQK[95`VbGGalUErRmQ04@"Bi#l-U-`Iq+9p51b@%G(IS9G#5L(ALqL -!Y-pYQ@A+#Dl0MMVlHY2!i['"NC04h!p!"LFR6E&2)fSQpQ1lDh[iZk2eGCY$hVT -%5mA2"3mc,jaB+4*qU*&!9Q@r20hcZ4L-+MJTImaR2a642ZUlD0(5Y8@GcPY#DM9 -3P-')FhFCG6d@PMF8Q5"LL,U8pRK[MpPRZ'iVDSUJ4cXrf6)a+A2UGTS)[@UX59a -Mb6a,AqjKRr)d+V`@UPZZr3VHjS9+keZciKG%'acEE)dETJqB[$G*#llK,RTd0L% -eB15ZZQ-R0QmFb1!q0#FcFT3P,1X"jla)++&KB5L-#rceUC!!hQFk-0b*4Xk+5V@ -qUJApS@-q6Z!R5ABp9kAhKGXPddPX-X4Q52H-C0eb3!J[V%LJ,!L80k(-&A16A@N -X"e(Q-rY!0`2`Yjp#Yc&E5&hHl`YU[3P1f8#MlCkSJ0"R(b8-I4c,3fM#GPMKk1q -,AEY#ITeA[Y5)m1m$qll5L*b1&S!hi6X)R&9%Y%Sh3Z0&6U2XDA0GjX&Tf`3NU+, -ir$AaA9d@&Q"e&cl)B9XD89Z8LFN8UTK!i)-m#N"eJi3+)XYHLE&icPbkRf[liq% -1ZJTZ%L@CP4p6l-jj1%P!Y[D-q!!Vqj0lcB5EjIj-eQJm[2FXS)a@e$+jR*NA,)a -S9i9306E3A)GdLN!&+G&1UM1q6I5J&-PV&LhF%REDLarBE!1mEaMp(+$p`B4CEqX -U6BP*l(KbD0eT-*4HVHKI9qJd38[9&H"&I6UrN@)`8032U&ffmZ%bYlDj[HB,k9+ -%dClTIqFj+YrbK8I&Fp'2cf1M2U#4[Jh#*qC5aK[GNRN`EZIS93%#'CeFKTqi"$X -bR-`aP+X%p95pHXGH*9ekH`dK"QHcNQQ4NcmkafTej,&,2fET[4FkB0Gbb!+%iNm -M-8C@Q#%'K*hlrc2DiP6$fHk&"e1#dS[TX%Lq1dM'`F9,qTAN1MVaQ`CX*jhfd5S -IU43j4j(qfi+IMqCk"qIiC0*4d,E*dEr"8-cdqH"r9fmTV$R3EEGFV2PdK0$2S#, -[R-IF!DfkL!ap103DRYQrE*kMY5%pYG'mC+(ciXb-@2QerHl5mG,Dei@&,RJ1h6K -V'MNPd!Kh)H&-AJ8$5%Ac8l`AQ-9EL1,qZHQ68[AKSYQ@[H1CSf0RJ+K-c5`l(hk -%*5XK8E6TeG$#rL%Vhh"c3%$SF[Dr@rFBjcQiG9Rd*$I[keKf"B5SdTZc(KrPUE3 -Cr-Dh@iQ`jAMf*9h&T#A!k96S(R3YLFd@`jZ02J&EeqHU+X&HZ"bcCVGad!3+[I8 -48QqmL!p)!V61l2a)%4(mPX9RYmmeb5J0a8@Dakc%hNI##`l$S49l3fR%BT5@fDk -LbL3V*J@#'%-kqaA"[!'UdFDQeZM*Lk*`0h1Xk14r4hK9qL%cSH&ck$HA%&8%ii5 -M*cUfLd[',m"!)V#C-#38KP*EaDrkiST2KkPG&PP-0M6F5U91a`TSmTmR80`iXd! -905NU%%b+daI5E!CE(Ha@GhiAK-Kq')3CKDkr4-40HKZiE[#EfYeX`!C-00fRV&* -'K$RE+G(3HSP@`1PmlD@hY%+2I*1NX#F-6qC"NNhRU6F#K"8CaR)N"C3I*8cfaP# -RB(3f#m*h%12-`9K"f6'&hK8[0Lh-Kr&"5)PYfK2)I!4`T`NYMGhDBl,b61bEb)Y -EKNH$-G`)Gr5mMcU5kVLeHX$,e1E)$!(p6X3a,i$`J,')Me8bAFPl5@-c[#FFqBT -H-0Y@)mr)@VLT--&b2d3+kp[5#)PmeJl`jUI4%12+MPVm+V8AAK9Vf'059dT!-H( -iN!#HTb'GT9$8D51iD0'#f!SFU@dZUH#T%)V#"i,dAbJZS1J9#A4iPG$'hB3eVNq -C+E3J5M2pEQ6N'[5)dHpS)Hh`80&I!TQq3Qd0F%-12f565H-P1R&'DD+B&cHYH#0 -E-pd1YIrcph")B1DhLKq'GH2M`%JJXXf[aRke5-V!q4eT[d&KZ+R[@,+H`Y&FPUl -haCLID2Rb8HXLM"K5iY(b#IT22-N2p'+,bSYQTAP5JYj%(fDclf"4*A)M`*UEUTe -mNI2e,,5m3"`VIaHbY*5ih'p8BqAek9mS(0CIe'ZRCPRPE-f9qFG'i$550)m-A'e -kH4C!1%X3VP@f"bAXGaSJ,X)3DpmP&b%RZf9XYU!M'$fGp'hIi8$Nl$AZ+D+%R%' -U+Q#rr%9fCCqV1$)hh!PS$cKMDKNqT8TZrb"D!'I$46Pj"p%AZ($plm8Sr`a'rB4 -HJ-rqArk*Hf@q6EDaL,&EdeJ20Q%`Mjlm4PX!dRb(932RVClA@k-0e-0V!+hr2)F -41IVSC&'RQ,0ee1c"PdRr#6#RC0`[,ij1[%*J*f)&q,!L[`mh)%aH['m'c"S1p8a -C(kN)"AYTL,EeGZrBc#qUpQTTYNEfe'32f$!MT$kmfRFMmH9ecNA!jX0lE69-42c -H+PNQ3J5(ZE,)(ZRBq&kA@lF(lc0MT'GNkY5d6+Zp9S1%)[3dcCflFmqc1!l(I1P -cpAbS$1)VV9(`ISR-p4l2-0,6'(6QN!$65KY'XQ!%CKK1$F'"$f-*Y`d5UrBYMCR -[9Fff+@"aVJ[H#@Cq"4CcJ,S#mD8`5pQCh-rp@bC2T2[i&hX5$@!`5rSc+lmHVjY -iqT!!"QZ!FS,1Fh(EaK1A46ckL&C[L*ZNJd`$A(I*``-bEBe2&aSiUd2NcD3JXXp -(Ll!ZULpK@cif`Ve[VT2Td'"aZD94A&aR!hI[p4!C&5kN0LkeM8X1$mCeaIp"YDq -l*cr$+R8fK$$R&34E6GmX"DLdCKT!,kVqLSYd8TN*KDQF5+HN8Fl38+"d4hm3'a4 -#Be5imC1`%CSi1k5p@FGPpk*3`fB83mX*C8YVVS!l!R*aU+reQ*L#kRGq3$(2iEM -Ip4qVQADqK9V$a*0@'-@D1M0,ZkE`Zq-D(,'V)`h2r%YTB+1$YpXj%JhmB$@'Q50 -KJ4Z!1"D%05J6&*A0Y9#[GMR[-bEalrjiI9B+9QG49U4(SF#6(faSVDII5-qp)a1 -05VTSj%*EJ5R*(L#T$Ib2X4UcP&N-SD%dhirLF'k[B&k6ml*D2E,G[fD"0iTp9DC -d"%MC``FJXQJ0mCSSZhE@))rkN[5(PEbJ[1#H-Qrj6!j**Ca)TdMhQR&4Fkre,#9 -R9#ke2$-q9JR9mXmPm6LX(dSlf6*fc)3`aC`MrA$F"Zm)GEDi$KhdZIJ@3JZi@eC -$I`l$06Jc(939MlXk)`UKkHE2Nf@V2b2A0+rlhFUi8K)L9PHm-lkCIVAJXMeQAMi -Z(GV'4U'MP14'8F$rh3frRAP%F8jb3`hp8NeHV6FaPKNX+))1YQhPpQSEpPIH["m -2(E1$EdPKY@)k#AD*X0REfA&'YqLHC9C*qrIDmR)+@*!!C-Np,+`V$IJ4R0pT$E@ -IfMD8($K&2U`%#9[ED1BF02&)kZ&UQUjZ6!lBVe@KL3&-SdmJR43ekLhG'iJ`#P@ -1!FH[fdVb*4Vhj[51-IGlABr![)lD!BHm6Si+2c$rrNeFGF9rlM-JV80c8'NTFDA -iRqA-$2$J0iLmI[m,mfE1kCc&85*jVMF2di&eaIR*k*'Gp'f8!S4M"&bCZ$P!N!! -@!&ESD2DXqRUL2q-X[XLmAGGIBmVYPKQb0QDpjUP[VS[TAAF`FEp-RlAecUpj1'B -1HI&CBdCLFJH9Qb)KG,#Q0Rpr,M!3JTMZ2952Z9I`Ec+[!ppJf"ehT(@X(E@VSPS -c8e`-0,0a)I`*@Ul-1(8&fj@fE,('XYN2Q)`4k'm'mBl[NB-ZK@*RCME"SP5CmQc -hr`LLIlKAE(HKSC'T09pQXkGG%rba(!5X)f0b"-i!#ZQ3!&l0m1c5Z*YrU`4DUC5 -'r2B,I1'CkfU+(-mB%hBR#[T[%YJFlQlY[0ARZa@HjS-dm+m6!SU8SU#LPearlTF -C1'4*3je&)aSd!43aD4#MTmL6XY*IH'A4VRX4CM'N,5&qQhNcVBM1[#Ikq8IbGHS -c#U64e#%rDJESa8lXfRl&M#JiUSjp,V#Q%qZ49Y[,#&6-cp*9J5Ff6+R!K@2@bT' -G%YHN5#*+fDlA91A,S'BUC!qe2JrZb2JPF!`"cDd"`rRJ2D*,6-Gi3e+4*K[43Il -dFVZIE6$i!Ee"6Lh!`X$(eZ[,S)+LU+FFU@SdF(lLX5QICPe9*'Z2fK-TBD*bQP( -)IU1$*P42A`!m`I&#-,3qLS4!'!@P[MVb2)b*Fff092VH"MH+6(JhP-#BEGrAL"B -3D81B9AER#4DHfr$rb(2`R!@(aUiGe%!k(NkMS6Y[TpPqd2MGSaZ0G+rc9CK0lXm -NeA`V3mTX[Mi@qH%DNGBE$XbSN9hmEcml,eY(-L!S*1+AhcK"YE#@")ES9XhH`"& -4#35@2*'VVrS"(!HQEQdY$CYI#"GKkr#jBES#2cZrk6mBd6*VGCl8,&)A*Ne!"kb -B!Zj)c%JHGfQL$fUie,)rLhEMHQ9U!4LIL!T[CDec&b)0K+YC`(8)B5SHr@"09#+ -YIUL,YGHK`e-VSVH1fHT2IhCF@D")9Jl`j6Uec[pKK3&C+'@IrHi$"k#%pQJ11pG -R+M5NlPPRK9j"(I,rEFq+)YS6&eIX1HJ''X@eR@3LNSRMHQ5$,bqZ8`G*ZejqX,Q -Cf%mk%RqY@'X2T9*9JNXJ@Uc1,Z()6RBHbM5@$Xqk!+@3"!%!!$d!!,'8IH1e6(E -k!!%FF!!"1E3!N!0b!!d#SJ!!Ia3!!!iq!*!%$`"dD'8JCf-ZF("M,X+e!!"B28e -08(*$9dP&!3VrN!3!N!U!!*!(3X(9"MK%)8cp$-MI)JN$&-G48FM'+6h1VK0aM#8 -*@Rc[9A*Nb95IjML4F`#AbU6dU,@0iRAD#-K&UrG"4DZ@4c9*S)RX@IHh6d"QTN, -ReZ6!6!aN*0'k)Pl#[eM88SbKDaHePSZ&(DNKr9`ml+24J#f5jhpGFp,3b``KcB9 -8Z(248iT1JeP0m)Qq2#Nl0$6[V)9f4l@k35$C+dJRIY--bV,b@TLcAm8-baVm@RJ -l9aj8$C`Ad1!2NBKrNE)AD8T!cL1ETJUk**Rl4"#QCHe@+Pk5LdX!0"idM08`$%L -2`Z"9l`-Zk"UZ4C+r5$hNr-'HZQRGSF2C%!KL10bTHRe4ScLCjqZS%iSf#[I%D8G --CNEp1l%Y,YS#kq8pM%JdrA9,0lY*qVU1'#!SXAie&S1*5IdLRZqNr%"LG!ACR+j -A-62+mCM1K24bT[l#hJA,R#"Ta"8ASAc2#-bdC00C*TabB2Te5pcf$Cb6R+6$edB -#kSDfi9)GXJa(-JTmTq)@&TP*XM$%fh"rIV(%Y,rI$KpYE$VbBjq+L&iJbhe%I8S -5[GaCC@ISSAe9`"Y`-!i2#IDB9"8[@dK5"$F8KB"Qph@56Q"m85ih*NThVS)I#(X -4hd!FF-pK&HAGG@HTP5lREl"MJKXpp2kBmi[mTFfB)k1&!PVeG00-0J)E,k2VA,2 -B[PrSVGk1[1a2a@BfEDd*#1A58J6AM$[Fj-1,+$RBje0Mde*S*j5k&0m`-lMdrcA -(cD$dMSV,SNSQD6B$jc!mHiGAU*&b"daepd%ep`6MNU!D@FYhDd5m+%ZQ[)NfQ,+ -N-+i*"SDe`IQb#RE(VkJ%3cjB,f5*Q,#f3!95`%B2e)h+-FBSK`rijJEBFeF"TT- -&R'9ppf!`ITL26V[R6F(mImPb"d+T#Gql1Q4k+'#TcJ3cGRKUVT*N4A1Ll6ZD8ER -pVc9bT%j2(3kqN@cE-)1ViGck(4ajX9-MA`'MRNqcU)b`Bph5AKYX5ml9GCPa(er -Hke)A8"l9dT+6$pj9'3Nk(eU`6PpVqIIQH#[ZiYPhHrRD+2#d$ZJbf[b*Ca5@@aH -Xk,V'eEpM'dFk9@mIaV@AX-'2d-qk8a1A4TT%,UEZY(F*CZd!Hm!j[!M)%THeCQK -IrMNhRlBBU%SHXM1Q%LJ0%KCF[haFA4m@C$6(eD-f#a0,j`352VBJB"'#rmX&EBZ -AQe)m&0`TaG&mRHFr5ViJG&D$!#MhCM&*fQFM6UfUVA9M+q&e4B"`"e3r*@X%6-( -DQN3JDHC)TMj4%+bP9)8ee&TYI"P2bLc8DUYm&D1$f![8ED&&jV"qlU@M#`)a)2` -fd0d`EfI'kShC-eCUA$,VlQb9U"bA0A+3!$&9k`3IA83mGrLEDl+,UZBd`Ti`%EU -'15A9%R!1JD!@`$`LI8fEBAaDNZU%+d,QdiIFZ-&*'X'cNaSldL"Rc%NNchTU&T2 -l8R9Am[JE-YdZ3jc650f59fdb"1@00%BIKj)F9"3Jfk#i+`[pfFikI5+)3&k!f,e -hIhL!Z[TGcPYCb5d8eFSa)[PHSVpQ@[aKZZ@T"Zr%(lV`$PJN6T)VV8m3jZ"p82" -pph`B#1`H*XUP)q*+R*+mUC--rmXX@8%#8M9q9mG56&Y@+IaBZ8#hBcpJaYDS'[X -'I`RUch4`Xm$#dHPa'H#[C#$#bm1&S9YZL3AUMSN"*AcQ$1Ad@EYj1"B2bKD8N5F -k5*YH(6)0HPldVi8Ni6d0bjaMHXm+$HHV'[JECfcA2'fl&N('F'V@'l-%%k3c8l9 -l5TD6'(lGeM+6615r#&FV#ePBjUlBD-m+6fV-X1f`YBp10BBa3$,Vpbhq[`bUmGl -mdU#SkhhRLLPAp)ECL2RpcFl*6DCM5UplLKp-5a#kPeeH'',r6N)V,3B`CpGRq6@ -24#B)@R#%`8"[i)R%mLi0A2T'l'28#1[j00UN6GG31BPJV69H1-PEeID`39&PdCV -U4H812(cIBdf'a[mpAeNfH[2j*eTQCDS&4E88JGaDa-!NUDG,Kd4DX-YqVK(rp#U -C-la&Z1l$5cG[bC8B8RplBe6[+SDi05aQICLK[iA6i3Th!8#RdGSUYFZiZ&`Gc'H -XQL,!Ai0d[--+$Da&$Jr%q`R*)0I3A,$hDk9'8&V'QTk@1Aj&iAi&G4LQ0cU!VcC -8+k02XMd3%3hQE#9%rYMp!CHJJd8!!mqq"0IqPV22diR[Gp4IcThrQlHEB2C9mAq -4GeclaRQpC0"GiiQ'Pa'HSTNqa)UB2&8GFqcM'T*&FdJc"(!9e8Hh"JdFUJD3!+4 -G$Cmj*[(G@&kV`&T@LG!#(fYdhFdGIrMh'3'eMUdehPi+2Z&#Fr$4pYqVVe+"E(H -X*bi*I0PS)(peF&hH*b'5kfXT$TlhU,NE"N-d@Z,6CR++'33C!m&1(EBS9$N`(1k -HIB!#F0A@dSpZ!bJPaq!Z`TLd1(,M1LQN`E8%r[LhhVjBhq@e)S(Q"fjNAFKDj4[ -@TE)4G%kL5lTT4%)CT@'1DhdZfmjKrU$@ijQT-'0mjpK-D"l2jXr1jfIX"HGV*LQ -0c18Y)`-'%q+S&$K`RYC$`Dd4(PJ,94M%$RT,1i6@T[Vkqa9Pl86"JG#[EM3QQ6m -pD[!`d1Zhe--`,+X(@E*kA9K+BJ!EH,S2`D(CLq6Sd,JVjDaEcQV9&HkBR[Ie`!J -'HdBKkQ35(*'C)qkf%[ZFV"CHjE6)VGT0p5$!63LbdPUhHd5TYfGL#6U,"amRh1( -0VM)'kpSe)"VCf-d*q*VfU*JTZ*@1[AY$b`3UZYSC!fCeArZ,hFY#S@N$JDh&DkU -JcF%&Rr$LH$IG2a&i19kUhkj($59pcqAi+'YAM)3kB$rKk#lEM[MLPCm%JDIqiRB -Cj'qrF2PXD5rIP+cG"5A(*b*!C+IAHrX,#jhm9,E[,S!Zj5Jm`ZXCDP!455'A)@0 -+%d(5J6ZR-Iaa0+eikrU`8YF3,46kbYCM5[fppl4"@%V'8*1Pl5bP%K#(!c1@0#p -FMJB'KrI'Mc'"Y2BkeM-F1SI$EqM&G*&aGPpU[(6df%XTY+92@1h-d"H8TJh(jMY -NmhU1[RNd`@`LCINXPL16-jqCH('JPkR!QqJI!alC)F+D`-(kcG%NPGY[SYfU(`( -MbR,-FIj6(Ii0,"UVB00DZCSk`f3NNGPAMEcAbAjbE6f-KI&"RHTiN!$l'a5`5`` -lEj3`F+U$MD*`,6qK!)T@MRrph-&N86)I2A!VI*S$`'&)YIF%"&ALMbrqINlmHJ` -l`GX015JNJ!r8p(hU#Vr8EDRTmMZKUmFJ8R$UU9$j9DfVZ*'mEN!Dr[JCpqH2Al+ -Q#MKi5Jck+[pJ*SaiXp!Ml,9AXmjh@5NS0,T6aq#P![[k2%`5,)VKa8r-J,d3&UH -a6,Dh#*aJZf8"NT@"B*V@S*!!&NqJE#AR68acbVR1`"@Y"C5$NYqpUHQGb!+&dMT -kNX1Ai2pPrB[lDNG@L4YCRZDB+iPJRqBE*lcf(#BCRfkpc"+3!%1V'q6SQ48-8(q -a#56)eG(0SEN4INq(C#B)f934J0!fAdhPeNp4f`J36$PZckMqjdlApR#9lGmMhq9 -)k#X[Db*'[LCKhp#f*Q$IlR%+6"FP4DIe9C!!2%@X+#e'AAr'[ih%30cbN[J8P8V -fKeNZI%R(SJm4h(YCbqhP%"@A88YZdK`G1eYA%R0VB`!a1SJi0"'f$32Cl+(Jhb" -f$lV8Zq9*lcYP,pM5XcTQ1S&5KkHb0j!!%+kLDY9U5V!r`DLc`iC)2*'UfZ1EhFl -5UElb%S$$NH"JKmJ#*JHJ#SZ@iL@QMfPYH3XZ98pdp#V-4MP0+rAZ+-pSqAZc3Cc -KjrfCRE"cVSqYam"JklceAhXe58r12iSQ[40GA+DSFAFEELh(f09Ll"@+r$2C9+f -kq#jETb#E,&RXmM51YUBD)pUf6#AiR(r-,LhT,0#mk('DGB29-0,je4IbUV2SS(3 -1S0'CAMeNf3'3!!1U,Ch4j'dSK`r(MB8R@SKE'8U5GS`d$M#,rlM#NB$2`6L$1rS -kjrLP#!Er9%86YJI4CYZiJID)S$+!Tcm65`4j+5KG@4&())VLa&PA!Re$'`BT4%0 -fSZBl%YCJ9KMK*mIqlV(M4krHl(rM!)k23M!%JBQEeUTih%8b[U24TCq'VmDXe*' -ai)[3r,XQB$1kV[`03NaIaZ3rrMFqBhC"DpGZI4(cIDmX0[-$PY%`3L13!(iUm52 -(eYI9abE!US)!QK+'3H[1C6b`C9(XUQpjD3("$r#ZE-ePTl9UM+N,HQ&4LV2A6QD -'#H!mdD5[%C`Rh-GIUFY5"ZXPCeHlEUQI)TPNQDP`3HqR`8lmH8!mZ@qJJ%2&&30 -ES6AG$"lCfSKTfrXNJr@d3N0,&JBR1Y2i%dBT3!erD585S-5`Tq1F3j!!Ca4PNV, -jR9+b#G)rlCk0d3YT1UaF4,)Q!0dk!mf(iG[-pIN6[RDmM2(9`piFYJ+S&,Z1jSE -`5NZf$1XUEkFNeG+i(Xlj5r[)'H"3L'NiT)KU*rICBldr%`c#,0-Qf2kLGedrjpm -qc),+9LklJK1qPrb"A&hhD&pL#KVFX%M8RD6[bV'MCrFUGbGHecE635NhZIMe0DN -f4'Fa&r5#+d-ah*I#LL1&mbN(li*pcc34&f'U-L,9C1[Z@P%Q"2jIH2M@Mkmh`Hc -Zk-M*m$UK1ZcD5&Q3!)*C4FA+H"31B`B5JI,KUELSRX"KUbj9@XN(BZV$P03Ci`l -4FE!TZRE+@Aq`RUi-@ML6qZc(mqGiKDfh'aHZ@8ZXAQNXVU+Hb28I,Jbp`fc%#D) -df3cSX``XqL0S$d`ADZ@CbV`XS-KBS5EUq)CRcpDeU%B5RKI'`iFhFQk"+VFVlST -$@#pBi#qHmb$YMkPJUIDaG#b@l@E-q@@LaHP!TC!%!3!!2!!!XC53!2'dAFh-!!% -V&3!"6p-!N!0b!!aJ&`!!XjN!!"@r!*!%$`"hH%eKBbif1'XZ`V8!!0+@68e3FN0 -A588"$2q3"!#3#S!!N!G#`G64@8)BhXHqe,c-YBi0"`D[Q9YKID)YU@P*hBZeEkr -3SFLTIJ#,2bq`F32KKLL5Z,6$8C1+$"@!%m4J[MSE``@AG#kA-ZA[E,JX6'DUDFR -p1-Y,b&fY-rBJAVH[4G'+dq6-mH`XI[q5*HiZ%BTSSpR)mc2(Zi`XVbaQBjPV1Zh -YX06p!QpTH`T2Q`qN5'XqZDP&NMD%8b+JM%Pdl@JU6H"j9(cqCkVj`6T)Ar*"kSL -b5eIiD"*T5C[iHYM&0#ilGi)TMHH'CXlV'$ZFUT0&[&PmC-q4HKjR!0"j800(KZZ -Eeclq,1V9)a&Xp(6TI%@f*-6FQi4G!0bB+fi(SCj0[J6'mIT(0,C5395G)(4AP+d -3-VkKD'fUB8V`I2S"aj2HpmAjKSI12RP+qN$EK$@r-aL&2#KJ6J359YaLmj`Mr)9 -((%4a9HjGj5RPPHZ6GA8Pb4BNH#[M-$Eq#6rC6McIL`C6l@@h9Zlpd1XL(BG@F+X -J8fHKXE$B`X`EXch`5ke(GqKmDc%k&4L$R#&*b0`CDM2&1j0q#EE5CYGXl3kPD(X -i%fb(RT)%c'JEA-!FHE$H`#8K-@JBZA0'2%!RT[r`HML@@L2,M)H(L2`JkLm[SfD -ZDl&@S4j6r8T$IB%0SP5+BIc@YP%iem#Dl`AXJQN#BMcU-)kfLmR(lf"TkLKbD`m -G2,Lj346jJ#RDjVhB+X"#)&6,%XCYJ`($5[hYh85$0ZK1hJrPSA#6EY980')&bFN -R4a$-H%Hke!9pLH6##A$[&Hm2RZ#l9ZjKG92mh*dq(2N$29,U$Fr"4rC)ZaFS8KE -&0J@Nq&5,I4(LkMU22FL0-I`AKC21`P(JI"pIS`3Qb1Vd+SlPbC(!+Ma3!#QjjQZ -c@J+D5Y2!*aUhBiprK+le9*MQUqJ3*rCR-cC8Y)iCN!$88T,@F(+5-HELm)!@m'c -8m'I4M$'FZiUE5+QX5fb'B*QRZH,0N!#mBk9bH5G)SfpjAq6lm,Ti!2Y5`UCk+@& -CS!#ci+GT![+LG9Fc'9XpV2J)5)I9EJh+96kF2&%HfpI`i88+p`DNck5p!FHX&XC -B*REG&`2fe&RD1'-3qdEr3Ua9ddPEX"YTM4VY,%9TI@P&@ld'@r232@mI(HBrUNI -Sf+[dQQKZ)BL+&G$*c-38Ah8MJCS!N!!M%1k#KkMX-h1A9cehiV408E*0a&UcMNc -he93VZUm5a&Ubr(6Yj9&,P'Q+-&&Tp3L0aM-E(K86rYX5C9IKR1qhj)JR1+iTb!2 -6U(XPQb$+-A"NH+2!"ihf$E829`M[Ur!pR$H,UD)YSKQk5)mprXpQHrUT[I-*SEG -HemrC6A9aA)1eKf$%@jq#,LZFYj2((VEb'IF,qT9eUFeChr6@rqQ5jXcDE1Lp5J$ -3Y326`ZbB-L+M5d`,54lG%6,1#GPHA60fh+Ljq8G[KXBjjU3c[UQ*&cFXRer,9RQ -bdaale#LiL&5RYkDeL!9@cJAB3S5$cNSpTd#$PeNmp,"c,&XEJB-XC,6[J0F4AN& -3[N54PJ*M(i,bmbI,18"qpjq@jHqBrEH-89U2,$1-4m@hh$-j*R#UKk"[cM`P"IF -Fmhm&A9%kU%r*6Cci"L6Rc!K"PQe)%928$92mm5l[K,@iQ1"TX!EMQDFeEQRBI0a -ZG)3RjYjd@I5JT2+X(Udk`$lQl-3b)qZSGiJ'BA8jP`G(1Re)d5BcALb#rT+BE@3 -[lEqUF(dBG4%DUqYAJ4YXcrjRJEi)M-q,(`VSiRHpXbS0jQh9#0CqYa1PSpD0'0E -T)r(-@M,[mUGF+bjT$j&d[&8eU!TJSa&0[Pl9e4"[6BiTETS4G,mF(kIM6E9k$Hp -(AANm'G,5YRP6LKqk4pNVrPSHrPM[CJjCGZ9+PH-K90NQd31$pIaZ$q`A&VEp!P% -``j`Y$k9[4`ERJ3P+335$Cb&LB$kHAK%@0Upd!9HPF2ckc9XkqeGd"I,((qQAdAQ -eMf02M8TU*JB)dA'ePNK[rd*,0ha#C`cGFcVE@JC"6'LK@,@&3ZGM8Cc-55LYC#* -dH+E"'AehKm$"$XhG$VZ9c-5Y!kNf$@@0YrLqRq3"R5V2hC@18XVpHbEq-Q+2C+D -@N!!hMLX`c,Tpf(peLm1R0[mK0j,KL(r9pSB0LV@&`PQ#VH0PibAaQf`4c[33Z23 -Dj&EV"cSTPGY,[e!%3$8(TS%90BTrTkCfeL$raYQeKKbp!FcJFqI@p+3cUNqllAQ -H43[6)F`(p0eVd&hQib[EfH$mk!"DR(Ne9YSri1`pS3DFSmVT[NFE'98ql"TCh5& -Y33!URH,*)iKrbprJ$*23&NDEC#j"Qpl"URP$8G25Q000K6c)p1b"a+!3Ad-SL$R -Q""DX1Z1Ik[F!iXN`+KBf*3GP!V`''#LcL0KHSRd'21kHT3MK#'('"CFrGV1#m,1 -V3*!!Dq@MlBVD0+*"Q`S-VU[Q`99TR'iB#bPUc2J`%$TiM(ha@94NT&%PR+Xj1)$ -,,aXrjN36)VZrTIB)N!"UFFameIa)9B+"3%V*Pb,)lh'br3&!0[R&i5ZMB$NZ-4! -5Md33-ifb3dZ`D,rKAe#if3NZ2[1IXrb1H`D*Q2c[2I3p'*33bG1UU$[mIR9jD2q -MHXHBXXZEbY#hM(@l0qXYkF*6(*U!dEX*eG(5bBJ5&9[0&2'"Ijk0Ndc6*+NKj%J -`XqH8[G,KKQr`FTAT`Pa5&"J%C84"91felk@ciaiGGZ(@&%6(KJ$6N4a*6%FpXS" -KA!55"SUq)FHRi*HJ45hCr-`Uj'9j*"dEXDperrf*B#ApPcTVbAB6cZZ*6*2YM&8 -pC9C4RT*RIrY'iGD(UBP9%[HlY)GKk"0!QDFAIJ#"QRRQ@$5kXL@3!#j%+21%H+F -L,)33RY*dbh8Uem1EkLKehVEF&(rLXQbE(ilEHmLc3Gp'"ljC5MN9cFcMclLhHr8 -"GqKY8NV&UkfV!IRX*$2FALd3JhC$L0-i'"$$P&*'0qS$J(`!,Li60),)0XTjKYT -LCCj()BP"6l)K"apL[)S`@X,r81L(Q30jK*lU89,@q"bPqU28m`ENJHR0Qc5fK`N -3kH6McULCihV2f+V-6b*jTVU@`EDe69R#jJjIC'XEF(e%pJ*J6Ej3Ir0R[j)f3XG -UIY0Xke3e5ERcLdN0,-Ea90V'a!-Y-8mhfd1jREVIrf1FA8b[!E)KCjM-,C(MSVr -E&6kfViDQ4)'mbYkXZQqFG@MLNr@-q'MNr+)06GQh2E[9QAF50IVEGj!!6Zj0$dk -eKbadlHmZV#DA8b&I90),DUf&,aY6ArQKR&jeplmE&CHjH*!!Xm1#'FNF[L!XN!! -*!-,H)eTjAZC5K9DfNk0#)ieCfRV#q%HL@8h95j841fN8-lrrae#M0`5UAm`Hpr! -im6FV+2HlIaFM-5**)hhddTeY#-L-jR2`8YSCCG3Fa*DH(SVmBM&b%+Q$ZU'hA8" -qr$#Ap-NT!@prbUMHYS%#apZUI&qS&&LF(Tp$F@!HL+JXdL2[q"VSfE4)E%2'Ad" -TkM!3R#6UN5&c1#E85hJ*IJ9591Sei"NR%&mYdEk9hZ-[`63@2UYY-ThSTRYJCFG -hD%[IiY$bDk%f%!%jrrVNaPdRpqB8Cb5"ri3iE--dZY'r%,1ffA'I`pjlYjVYG32 -kFM#$rcK"@rm6E,C-rEdf)4RVRjR!U4kf5+RcVp69ki-r*YifQ*2JS*MYbbJiA&Z -P)P&l,ZqJVkD$-IHUU!92"IPq9SeR`4&NY!X!C-J%6j,i5)+k$'8Yfl!6q1UZ[5Z -CL!'Ap,GZ#`QHp1pX34AdB[deS%*UP$@G'X9T@[`+d@8ddaV%6qrVSEY9k6qJdSH -[U3E3dL419T*k2IIE)4m4L,6@#8R[$@iL"SRUfR4brG5A(ED$lmd'"r,"NNEb2`8 -%E6F9fVr5Q`j#HjPj4Nf-24'3!%rN&Hl'E'R4j@PRiHE@U5rc+&G9rPQlemTFIr8 -ci)Vra5bLB$lJr2N6fT'2&%%c)C9Pi4m["S*YIHC3Tr,+1'jGfjFM&5Z&S0CiH2! -bBMi#ECX!Fq+3!$(F&pk)L09(0ZkQ[IF)NPbDJXlQk$9*MiYbIKTEV9"e*&aRG%q -1&,8FN!"6(U%XMLfCdK295R*4-#SlK%h[Q4A9E0-FL"Sd25i[i6pN@4NhC4cPkiJ -(LBA!T4Z"Q)cXBp!MaR*&#HV%aRChcP40KIipCF6,fXGMXQ`DVPie)X'$d@faBDC -fkJ$,GGZpV%11D5RYG@m0Y@V(QQ$)))%LD(,efGA`9Q*JH@0TDK%UV0P13`-%q[C -V9D+-!bMH5Ej(YYMb'JR01JZHDd[mC#5!cT4&Sj9-fFK5mYrEQ$"pA`be$IU4aCk -)$aM[+"%!3dM(DMQE0XX9Y[pHjf"A"N!AE@rjJhD+1GE(PR4RTP,+1BkB58A[G,l -HIPLkBC-lFQLp!fjCIlXE5BX2Z[&A9)GRCjp'C6PSSfhYCS[cmBBRbG5G-lU,jC0 -JDEPK@-4QTMC[AbR*F)VjCII`FIZA2&YURRL1U`1SdRDKE#ba6mBBfS-4(@$4GDD -0`dr2GcN+k6GLc1&BE@%pikl6B[c#'MSPIHPr-m1P'*!!MZ,K$,rLI4Zf3N5qS0+ -QI9('@&K!lIEp*MMDQM1Akc*2rpc!F1$a,rMQ4#U0)L[04pLkCj5L8ACr3ML5,FS -M`jjI("mmaV34r*Xl[YJAK9$4rJ&-YFF5jPPVe`J%4rfHffcVpL3)8,0P(l@b8pY -(cK,&+28#YPmHkT!!Nqd&hM[5#Lh2bdH*P(5N'ai#Ck9)JPVqE$!`b-ikel9`J#j -M4abI[X1KH3pr9rFMY$D(j#CHkBhd0ml908k[-ikKa[q1rBHGUBZ"eJpb+-[MQm2 -6,ENMTD(kDS6[QJC&fP&lDabbVkA5Dm0QeS2AQNI$H#ci!"aVeq4!P50SkpSVF$2 -4RCdAGjY*KAeDc(jXR5kS-&CE4lr,4prd"F3#qY,i@'QB1[eQ@3V0R)l(c1FUE(q -QHkbf#k1J"2GI#9Q'bKd(XNjEP3p'#JYEcNHc-phTkN`RA#M4lJqTfBbc[h6C[Nq -RK38f9ADpFmld1ZDS+A`Zl%4fA@'Pm[(&IYR&()5N!6p*5VkUed2Rc4lqGqaBH*a -8e)2%NAlL%Xr*Hk)LXi!dTM4dP**LX!QY(ZFZ3F*RT8q(9Mf[Z8%`HHC$rbKVmF* -8H2ESY,TDAJTN%fppB(RAJeM[eifiRTZ50q+5`VPp&m'$i,%mQI$+-`SIS%lIZk3 -ifD0R0P!LCjcScTN,HK$kcMQjcS$2@rppNJmkE-62cb)3BELiJUZM,Re+9SJF@6I -dK@M-0+ibM[QQrc)1kQdVFC`Z1r(fhVbJFB-#$T5++C-DJ5FiU91cha!"$"U3!'1 -+N!$'@i+`lZBm&LcB(Mf8D3fNEfRBi%T6`BCh!XEr-B0$4MX4XD%ME['"#UXi93k -l3BVTf(kR6h1hF8X,LpdSiQ8*[4Ca(NpPC["@ANKke'S#!1#GQ"%#3A'+%&*RT$m -)4pUN+K!*r2'0&XTTZ)m8Y6RMhheCp@hBbf-kM53L3mG+9pYq+kd)bfbVllaS'2Q -$)+0r1$-$VaG`@m+91YrkXrfJ&+0CLSFadr8Z1fr#&QANaY-jVa8qJle@84rc%MF -lP"6R,PLh!`0Urb9a!GQDV4iaP5mkM1lE%3'@&q(332&056FG+ML"5JR%2K'eMf# -kkAIAJddLhb%K)eGipHdD%4*`f+jf2rU(,CmfR&p4cHZdY&'Bi@V$I$U##pm'6J$ -TCPPr6)"X(-LVGHURmQKV&2U2BbTSqNX%YAI&G*2r+SH[%Q@5e$J+Jl0(5$Vr@MT -dPdZ$rr"hU4Z1H*b#hJ2NU(5U2ECESLdjS@a'$##aMf4,Q-P[2AJBdc)3NdaEeaJ -3*R1[T-JC*I4&J&98BB+2p`1Cc5#,FdAm(Na((f%[CcM[qdNae'Mfa0XPZN6mMQ6 -6DBA`,,cr(r'5'9(6dKN-,*ePS0kT[8k+K2q8-eS#M&1"2jd+V+aQ0T+)K1NU'P9 -0j9,!GRi[')b,-6J0fdBmir`+1m+`dXd"XiD5Dh8cRSF%V9+dJRdBm'e'@qjKMiX -*h$f+$ZMNe2,HTH0@M'KF6Y-#Z!Kq1q#eQ#X$`mGBUdh`r(9Jk25PZ4T2pqT1GHb -DZQ'0Y9em-!i+`kFbKqZpmjAdSp+ljR#9@!EVmUF4eQrKhFL-09FI5#NE,PrH,p# -9E,1PXUIKl[9H(UkCYb(9#MKALee%S+Qe+)2l#J+i2N6bC)RE!$L*MBr!l2%*+%1 -8KK"Cd+AEPY!N+@1-E&E,HlqLYM1EcC'4KGRSH0"X$U00kFA'%#0YK609D6KfUfJ -PA!&4jJ!E'dHRD-&X(11#f*!!N[9Ra+RQm5kE6DcE$q2!XeT!IC!!QBp)Nhpjk(! -J60PeF2mK8*CQ463ZTY%GS6ekpAqjASdAj2"$%-(f'-ZimI*eMCS95EVR3p%"JK1 -qEQA*"YT"4EAE4b[0E`U+c3%5d@lbH@DA'#$ZMIYdPBj1"ZPJMQl@JrE$rT+RAIi -lam"1UZJp%CiYldq&CfdGQN!j9fr0D!b'286@L$h"+e4T881dbGN%'FIJX'%(Xc- -K8qXU3TqLB1H-b$VZTj0$%ZV0PfbqG!N5T%Ya*L$09q3``-EpmdZ-K%TQB9'kRi3 -YiMpHpEXU9K@hXhIFCZfb&bPCFhLqL'Bf2TX+aM'SD!bH(PBfYmicV@qF6DNJ4)0 -#32'bQU3l'5GjBi@eQYH5CD666QQeSZ14B2Gq#'6'+m[&P'd,8P(SbLdX@M#SdHi -3mK"pV%!S*D%JpY9NJT*i5f'L(kP,+PF%3&HrS3+%[8)+qVZARRkG"Jm&3r$ceP5 -'HMGI&pRJKRp-TQie8CCDM[*+[UbLqaE!h)kkrH9[(Jdp&ef-R[A,Zh@6XVi[Lj! -!N3Np@J33eR[LVmPJBHVN29*I1Y5-qE&1dF+lBp&T5ZSX-T!!DG*N&qbV-%*r%-d -mirq@D0FINYCDDEJV(d,JibNjHpAjq#T0kqBV@5pmLA`#*))fh%+'84i42RCZ2be -4%0%DXr+YYQrH(%3jhVQJRQfiG9CHl!RRSBcm*iPYZbCd0-5U98-"j(9em-0rJj5 -6i&$qI-51'4lJC&!)4Bm+!16)BdIQj[Amj9"4,lp&q)2l`XRR!qf(ec@aGBlKaX4 -R@b9%DSjFa@+Kc1259kamC%eN`EhIj)dX[96@T9QSV8mP6+jmYYQN9bE4kK#PQb5 -,m9d5FY'dq'kB4SUjFK!8C%am246,Z$M!XNApM@4lH-(a%UeeJd$!RAiTh!lblB$ -e)b['H-f$$,f#-`#Td"f)R)KI$S2-$6Bc`P&4HBQh&,"FA&i3rJ64VhG)C"i)),) -6VIf"aBRqqf3SkLjEYJ$qT%QJMifbpUe#S[k(+C&#T@"bM$r4k%9P-f#ShAA5#dp -Im',)Ke)@qaULf,LS)D0&Md6)$!,a-3rjq2[[c!a%!b2qB+@3"!%!!$`!!,'8K-Q -e6(G%!!%jY!!"CL)!N!0b!!`3G3!!YcX!!"A[!*!%$`"hH%eKBbj`F'-Z`V8!!0+ -@68e3FN0A588"$2q3"!#3#S!!N!G#`G8-Ga[M2$1M8Qmp5YRQTFNj9'I0QPJi)41 -i,1`XI4Kf(%8,,q,fX*E)%"ZaIFTkk-RfqmY96@@G&@)ajdQ%A*rZMT!!441LaD6 -0JVeKQT!!FLPe(Gipd,VB0iaG8CB#QX"b45&k+DeKakaaT,E50V2L'kQ&QSf%Zq( -4d(ADc1Te,6S`Ir*B2Tc%4`q%rfEr@R0L5b4S5ef66E88(Ri5edk"A!cN9[VmGe0 -DI2q)hP%AP%JpX5bq%lf!4K))A)LeMTMU2Y&jjD%3l2+hPFHETUa4(6@TL#JE$'a -bkSVqaMpC$d6m[bLN"QV5jkrqjLmkLI1(d)r'`$@c&qkpkGBdD+$NVQ%*Z6C#kNd -[HF'biD(9CX35SR8l3&&rZ1SiUlT0(1YZcU$CiKM9&f%@",CVJ8BfSaU&m'MPD"C --@diUAY,)#`449"iX&hl4UKNDPbJVBK`Y$0e2r*XF-JD'9G)bKEmNP*bKbJ)kBr0 -a'#Rc3PXN3ld5cQ3L-E'F0[CRS2c@ACfHZ)TC`%@i)Er'`)T"PRYJd[Z$NTYcYqj -Q30DBcZihX6,1@K80SMcA5!daNZK!bf3*-YUJ0*Re%10N#cD--LT5CeT@J$JC+L- -)NDcU++T`(M9ZJI(Gq5#P*#%&+Hl6qUPa)dkfqDaQ$#N+FmBFE@P3fY4T0`JNV"$ -8-iVVmSV'8J1C1R5`f'e2!'hJMmJ98`3+c6L$fl!'FJJe!315i+NeH5i'leQ5SbC -I"T-JHaTYfJH@NQZr#SH%@`j3rYQch1"`kYG)VfUVjcDSmfIX'lZSh2a-#Ld&VP6 -'S1HMUP3*5M6G(i'P*a#2LX&a3*G8(e2ad-4m"cQCKE5c-p&X$'E5F'c6RQe!AlA -*4%1G0ILbNX")8,hZMBQjI3282H&!@J%(2+a"TM,PhX'HYdc-99%PMUk2Uf*ZhM@ -NGfQ"SE)V"S2T'3S&l)dY3+'j#6)FQMRXP,KihPBb"9[-M$i2"-+U$eq@D)9R)q` -Sb2"IJ1,QZDda$XfX!HK"L'!(a`Gb)A@C*B99A3"cjCpI*r"H'!#e$K&R+R0f+$c -bEi4d$h3lTX5I0`0XL(jN$U!qcqX9-Zb5kZ@8RU6MKh+Qj"pUVJf$i$1)jMcDk@$ -hadk[FLa2Vfe*8Z&#XXP1%YDp#9QQJ8%e,SUJp2K*!ZGr'@ZJ(Llh*FSZ4@khIF* -0Va4&%4l"%H9UAiUkB#JJ!-*$l-l66"PZ*)A@k2mM`G),DXe*T`5e,@cX5ap$GY' -1&!BZF`![q[q%ZJi%Bcc2Dbf"l6[HPIBBhJcS4UNTHJ,ZM,0E)hD!8,%["(JI'8b -2X3E64!VRS&*aGBM!$jchifi@VmhQ-jXbai+kV#6(!ikR!b6FH,c+m*Cck,0i8%% -deTlZ-"#PCb"pE"M0dN#0CHEJB'D6d`+E@(a4FLArCeC3&A#'`N5`@9,A3H3UE#f -'2C8+AiiMDiaU#G8Le3([fFBL5-BPLmYH11d*8J#P2PTpV'XXAB#94MJJAYk`%!E -Mrr-L$`%TrDXiYrJrc+d0YZQ0D6m$l`qS6YdlC6FQE[hiF"MhHNd1jCZiiFN'mV2 -$Gbb6"E$V$Ha8K(bfrCdS[R`jppU-R#lZ630B"DJV8+6Ge0Lh9L@kUkmh0p"iPLQ -,r!L*pK0Fh#EMASe(,P*K3Q4VUYJDJTVP8N#BicF,apZaY3Y6DF[5LlVEDLUAC'% -H$pQZ"L%9`KqU!DJ`if38EVEM@-'JUN5"-(+@q3k@YTI9AbXLd4#@SPJ3C'$D25` -9QAiUIk,+*(CQH0DS&H1+DjHAN!!Sa2H(DjkiNLaSrfbN*@Z&([Q$CT,rZDP-5`q -cd`U@[#+fCpmJ,Jp#kKdP!,jI`+Q,b-i@PEX`bfh[4GBZ[ak3!%kHBR6p#Y,VBfU -iV2F"R,0PmPk@%9MR*4!RHCZB6[hKZL#4q1qJNd'ID0E(4BA+ISI'aif&kUka"0b -h5jm9a@+V4TEe@9di3f5ZXQ[,jb3p3fc'5cqlBcZNH1I8edUEfbGa8X9*Q6Qr53' -AVj9Y-1Q0`m6)!hG%PFT#9'q%#A-(hmp26&5SD@c4VD5Q(hI59j9c03N6%'HU*!D -LQ6a41)5)8T-T0Qkqcl3+I-a0CQL)b1@'3RUNfPf$TfFKkQi%I#acNPRm8UL-l9Z -6D121qp3#CQ`cpXr@+hF%%pKJ!VQc8&dlhRN$5j!!fqEa-"j39-@r2[0,I@h4U4C -0lp`dp!@KK"&r8meV#dN+Udh&NfXa-2lMlc&+HEpbpL*DJqjljZprYC1Jc-1ZhqN -KNFD[HV"I&ALhGC49d'8dU9U'a*m#M[mee!(TQ2MVEV"%%Df5K(EKpX8d*(S1beq -*eRZC)RDj2h88m#2UhkLE0HJ5m9)&E$3c$QCmlZ!30l%dGl0%,r&*pGBHR+*X5h2 -pc#h!!A4-UN%(F9[)(aprU%k4lTAZ*h8Z0bV1m-aYd@SA@EPde9fE[@&2CErUTQ3 -QP+@9dFaqF!HqSYUA09,)H3e[0*Jd5#a6iU)3'q0ET1%2$b*"q)`pQ5F)X"BV+AD -JDFC-hCdibSH*%E%f+'Z6jhB!,'D-(`YaY)e()$jHH-e+m6aT5N,0-TFFYMeP0JQ -"l+8TF%24db)q[2P,@,e0GYUjeEJL'Ve,-e)PX"&TN[mARSp`P(dA`Y@9KD0dZE3 -l3BHl)piJ26hX6-kH9qr@1l%m8#9a2-Q5,kANMjchRp1rB#8-,(2XX8rJUC1+eEQ -jNm!q5165F,8HTEU(`9RTIJmc)Hpr%q9ABD`E[YQ)5l'QaXHY,8cib8RZi48mLcS -9r,,AIRcZc@@lXX*CAVLm9@TGakE!rm#f0,*2KAAMN8'rl'Z5%@3qhKk-r)cCVIB -dJ1c2qUTp&A2L%lliFRGB@&Y8E4m(DbYTk,f`jdDj`KhIk!jRU%Ue%j6B2[afG,j -L3[l!2S4qcFBKANT#Y4Z+[Lb5ENBL[U3M&Cm5(%mGEe0iM6e%'BZUA"S'dL,a2l3 -T2e`MAPZLk##,fTI-F5S!p0-FVS5$Q,be[N6rPlDfRhDCjQk22A!bPIJAG8BE39C -b&Mrc9L[hCE3ckb-%)E@aR541XTQp0Gp24&E`*V`*3pk"TR0FT"N,%TMA&'ZM'"N -X5mGI'p3pp&VKFmUm&M`)LVDQmB5Ie3Xr#[,lc18A[Id9T4$'M&lfK3mX!A4AfNM -*ZNH)RQk[plPREh#D6U+V[34'#(44GT(i'5Nkp@I[QGqY2GieHie"KBjfZ%HEV,G -$aR5p(+c`ql@i6iG3%X1&pc6C`!b0QqaGPr$HQb1J46"bj8mUDh5Yl`8BSZ&V*'K -Z5AGk#$(mFb#-%XBd$9-(pUdZaI(F#NNdAdjL99)GT2T38Cc*A(*8IJ8`AfQcL[6 -ecUY)`(@@XZCllNIe!1-3Elp49h390QJL[4)QE'[5KrFcePKipVdea3HmYVDr9L* -0cX#4%J@X30hA&I*&%'6RBr4(aj*Q4YAHHRIAGlerVU6$0Z,Z3V8Z1*ZF'@1b39p -4h8Ga,YH-pR5L+@QE&'K,hlQe6)Dk0M9XE&(Y%0heXQMb*G2"(JB8Lq'E-&XF8GX -mM1CHS8)hcGTrVlQeljpEb0#!haJM[*Z,S4Sm01H4$MhD@#j-(93kJJ2I,V0F451 -cSda%JBGq6F+Rkc)0h"LU9FpRYHmhbab&VDVRjq)FiUM&M*HHqp)R-"[GQZYPbEk -4a&`D,[i!aVp[f634qmcfSRC'`F(16)Y43'fR2IU[3pE'A2Hfh3RPMjYJfREmJ([ -ka3!4QZ9J5Nq8-#6#QaqdaAk"@V&)-2P8i@T4*9!8dmYM3*JVX"p*Nh`&,PdiJP0 -ISR1UVC[p2maf6HTj`A'iM[P8@!CSC(b-G&&hQiQk#rFJQ%DBiiIj$K1Rk@)mE2` -+F-Y,XDJXK'T)H*+DMPjJUrXDa[iJAY*R[T!!X)(c#QBeerqkaZ!,m3mJi!hD&)5 -891$JB[ZP0eiG(+JqP!JVHZ6hVE34Fal*-N'SQDKFa%SB#$BA&#8XI(8p@aDT,8' -8X[*aQD-M$5A2-Hlb2V(K,(NDQ-,CQaq`Krj*#jc+amDpmK-6R%ie#-EXKUB[M4b -`Q38Pq(l+r0($ZYF65YZH)B%b[fP!%YC!rk@b4mmG5&jLSUm4AZHb8B%[aTM"+#9 -0rFb&q)KDjF1m,'Ga2i-)*"Z)&9Uc',Y4!XhAV0J#ZFjpP((LND%)pKY@!UVQYSA -Lb'*i"BqS&+*$L(FV((#'4Mm%fZ4eCMNLdXL%`Y!NXd3&'fYEVC("YRX5+'9)qMR -H"jm9[L[kKTqf9!R2T3c3[J(ia$bM,(cp0XS$pTaTfM`V&rPrq0CQFZ%e5TK[q*6 -HE#(rFH,9`*HGCG!+3U&l6%JL!0Ze+q)p[qje$3mf"*BcPXU#iaaGZ`rQV#QC(9q -qj#R[SjNSbE85hASZ+KSZ[(XA)kNXi'HBGKY)hC,d%4bHIRY,-8%1JY3(*9RDfY` -A!kh5RKm,-aISqT["qAPQK"FMeCQZNi4!9qQIT1@VL`h$k5h#N!#"el*"I[T!&bC -@h5F1`)9Qa`Ga2L(lhN,@Y5*[f$)JT6-8hDhB'C,AT*%L9dPd'8eP0DbMXi1*0'5 -IpdV"b&5VZ$c2r(5-qqjZbT(1aN(iK'PYqhUV+NNh(kb6rS0c*'2HG,A6[9SSb4# -ec3P+K+I93N0pplT+-cJQ)bTj'Nhj[Afrc!XU&UD&H#(ec-*6ffp1V3)9af0XbK9 -kS2"q6&dGR1[*amkh1bD'@[$N$+E4QQAmK%k"CqDUkT8&QN$j5['Y6X[-UfUF!P" -"VqXcVG6d@ZD"9qii`V`ccMS1S"Q)i(1IKHd"XFKd0l[KaKc8cc9kG-@!C@9h#EP -8EQ-Rj*pRTNK!0G8D(C%SbI++NJh`d*amS8iKbqVUlJp#D35KVYJAe$)TeNV9BR& -VI,A6-IBiVLC2r+AQZLfMEGP4M"%6pd@i&$*H)A'CjDc%T89mjFqTI99$chQ)DL2 -5&)-%(GTm@*!!SQiPZYk3!1qP"[aMlABkQ$0')Cq"f%qKNd,(99aYBSXVRfjjFED -f$*(VfkiTjUI`TJ,jKRMa!+4UjjdAi``!b6E8m4ALK2rqHI9-1#@qURGlFfNa039 -Zhd0mBKNi[q%j$N#(S*UXNH!)kP8F6E+ij6%1$"9+%e`ZmR5VT5JVkT)U090b+fB -mNA@pLh"e+%XBi9Re,#"*pcXlT,0Ihfm6R4#NV#+ka44X9&fVM[F1#6PU"MlKU*! -!0ll6I-#lR@Sh)r[jcMIPZ9U1+bb#J#I56J1T2J3h5TRSK'&f`JJrf5JZF1'fZhe -3%$5(ab'HlGh5HZ&VC*Dpc,"1S!YFGU%YLA8p2*[0hiJEd*EY`Bq'$G%6U5Kd5UJ -Zj8[#&!Y,j!mNjLmH'8p!f(62ThJA94P+,@dP!LYZ6SlCr#1Zl3+pV'kLIQMjk)Y -!f*JA&6VeC*ccKdGV0A#BC*e(V@IECAh,Gl%r'GBT+2@kB68"*MLZ3#J369hfNa9 -mi86kliAY(Ni3Sp%+CQ2)lQbQGfT@86qc9$RM!%ZD+TLjG&j%5*i*j(+9fUPKXf6 -l883jcaeCqB%Xr4+2,k@JRr'P)UQ(1I3F@bjYEjkjleNM%Dd11#qHhQ6)8HHK#Pr -C%LXEfH*ZaeqcP9#+SSE,3q`d4rlYS9ZKLjaUF"3hUFP`(SCI,ETI2FrpeKBC3`* -rm,[6a9fB8qL#P6i'FmiK`Ch$*ScS`pBf-h&!NMc4$IT"@+qVD%dVb1BAEAeP8H, -a`9q1M9XrQ9K[(K2d%iD)864irE(1q%kb6a'iKIR-3-LL)aVjHJk%2-+NkD!9Prf -cr6CKaMKB##XeKifAUVVpIb3+HU-hA,pE"V$#PF(fBai'!LD1hZ`UM)0'Pb!VXTi -mLl,9r6AD8IR'f`A[V&ll,-'"RkTla"2i!hb,8MBaA"U!dHfXNMae!(dJ#6k`GbA -9kiim$maF5*aLNYdD0`&8J24RI,3,(25k*ijBBL-K54U@%id5E0ic)F,5+DBN!V9 -aREf9cBTEFr(9'11flY%SJZVXj2KQ3pj[L&Jl)5e58M%Qm6e$HKX#6H1bA@(4hiR -"M#l[E#UfM9F(Be$"[,('hLi8GCm)iT2(Rpl'SdUQM&4AXZNI1B(jB-U3!%'GN!# -q&Ih2EQK+"cV'+kLY9VECP6Dif`H6"'-B#R(YBZ6l#Nb+V2QS!IV-`H[1kHXT,fi -e#p0P0NGF*Bk5V#LL2C%rUilr6l1#4KK3$'aKp-rhIRV(dh0mmB,%fBhC5"99Y9b -K"a4e%4ah*ST`&hU54P$+A%ZX%M*deF`-ej0YKT3)hLPrpCbFY3BrRZj(Zmdf!4# -pbMmRf1Y)ZF1d*C)T(GSR@Q39jIqa2@',!!V4i"qGJAb#+QdmVqHa9!kdhmL0&-X -d[9T'&QI4PpYA`E[3ICA2f+2TRGVmh"2-42ma$faFqie%rD*!5MSjPY@D(XkipS[ -BhcP2M*lfaX"lrbq9[&e&-MHcCT[Rb@MSk&mIGRBHH%BF#eZBd1LU-8"45h1I-k! -CS0$@jhDl'UE6QTp!Z"J3H0IMGeG`V6al9fS@I#QXbfS#(#mbKTF@((h5K20M!Ta -NGfVSpE0k'*G,E@H@U%G,CqNj&SEYq0Z&I,+T%H+bGDIQAb620YU"iX@3!*Pk)*9 -b!aMHm("H*VdHcDJ#(6blJ3PHYfp*@%h)'(lH02RGe&a542B5ip2UNmqpdK8EC), --SbBPp4&54"PZqM1b9d1"S)biHr-+3K4&6-2h#2LSA30Y'DdJ)H)IRS8T+D[kAMd -(JcA1%i!E)a3`J-l2%HM`J,+,L&l,P$6S[GMlb+3K(d`Ik`+cm'EH8@YQdIaH9[, -e6AiJCRV1DF%rlMJ`1pVh#d,P0I9M4+LRTeSJ4F!+*NcDJ`aGbLqIXabDX&iLqf) -&BDXFi0,BB"QZU!`!61$6rrik6ZN&pR"D4VMpBhhqMdb&h#ZN`icpKHCDDj0UeTT -4`(+c,&*jMfK%(3+a88ZD!fNSiA8HAFe10GXlJ$3PPc-%bS#eq+@Qq-Q!M4IM0&' -qVi`BRJATI'HZ`1[)d2ir#AA4JG`(eHmS0YS32e4bBfqfB#VKIE'0II#2DD5ERc( -9(laI$4e98h5iXJG6aK()Yp-ik-ir"9rK"+'NVfYqR[qr&mMJm4DkS5GDVkV*44G -"+JZjrU)r##B%)@%!'8@ZT[mVfRZ)$S!i)VbrLE0U59Ra0i3f2U&#XkHLNA"*0m! -**Ai+Vc6!bF2-YMAXH8kqKCrEl-j$&5eZI690EV%$9d(f*p!F6'q@qm+k0%0bpPe -rUhAJM36KpYFcHh6UE'E+e'+a!Pa+V4FpeN6!UYKaL!,S)+PrV8(N(!*46$q@0Ze -P6lC@cECU$Km+Xc&q1RaZb5G%CB!VE!S3$128$Y09hVa`%"Sh'fD"U1MhYaV0pa) -8#3(D*j!!T,H3!1)$5BeP[1qC5h@Ml863rF&Q1&!($m'GjY%!@ll+CX1Mj1KAeZ8 -Q#JBCI1&*fmNR)&*'+"UXV0,T#pdfbCSMB!AL9%qPZbR+!+@3"!%!!$S!!,'8N!" -VY&h0b3!"6p-!!ACb!*!$FJ!+HhF!!*d3!!!2mJ#3"!m!GhKc,MBiDbl#Y3!!dTC -069"b3eG*43%-rj!%!*!+J!#3"d,"e3K3q+K[+*Y8DCa[V3bk'UpLSZVH`K#Z,SS -)SRBSQX%BK)!hYNj)6eM6XG9l'',Rq&5P)N@ab[kEUJE#29iY"h"NC%,'`8!H@TG -XLB!R,pkme@3&%ri4B0aE)U`GQP+#10HRa)@DmD'kY@U3!!kI2aHF%pZY60!136X -[eq)FXS*UjqL[68FKR"kQXddRXHEfi(8ZejDCZjjCe@K)mUCj9FrpE6Jb,mqTEHE -B--1VIk'ZJTei$RZhV0#CSU5H04P`D"T,VEM4#G)VemUF)T)MKiE'f-N4-#q9p61 -J&Z*d23ZMUHM4SrP%3M31S'IM8Hp@6YQqbUdhHXR!1IkY+(H5EA&DI&rccI6IN!" -bC3+ZFAqBGa0ZVlVU)eif5h4N2q$l*X-FCQZ5`4JNm,'p,)&3T1"fYQHrZBm2j6p -qe64FTMBMQVj!m[[l*$T,9Cad[#2L(E&8XHARh$6Ii@(',ZdKS-0IKmRV%ehb@Y- -9UR(+Jk4DBJqfM8k`)'d-"5XJi$Pj#GeAcHMTe`PD'Mc!QNf3!"EKD@)*$1Z4B"N -JGM%6q3Nm+-(EM2AamDriqcJ[BIUbidE$RD2B83p3'+mei#!AN!#N1Rka-YIZ[Ba -#DeMT48Ih$eZA6p`b'EZ65JL-hhbNj3K"k*8fYRJj[4RIcbD%KTAY0i4BqD)G[BA -H0P2r9HT,qpF%95ZbR0A6*YL2NdiUBcVpVPYB`bbNR25lc#j9`jR!IeU(DhVpF") -Bf65HK8jQpNFBM9'QT'dkE#0Z`RFraMYL(i*rQa#E+I2S(fCQ8D0a$`,j82qD1pB -B(JYr#q6E4E-Eh1If)@k'lj'jJiB+m-K(K%F"1Lea$HEDd'HIT`AJG[I#"a%IkmV -lX"4%[)!'1)Mc91SNpSVVMQ'eZ+NFrY"rB%6+F$[b03!RDLAH*Ghaelq!2*hhDfC -lr[jYYpa+3'I"U[!NLVVG'3QLVFe#""$r`GpX-Hr`$ki%P9McSI%&"ChpXkiA#CS -9K5V!K"J2ijP*$U-&%%Vl)&k))mjN&2D6GiH-TRAT*HrqcE2ChMVkJ4Q'+3,mpAb -T)MMcGI&3NT!!pKML`SC#BfLI(&8P[)r#a,+R&frJ,HblXeQSFL-H"0ciI`T`aYL -9lG'5%4jFa4[U$iR6p[)U"$(X'T2hpNj36-8FA39aIe*UB-A1NZU%PE20'9fX9[Y -qZE+)X1FF%YplZ4SF,*P&SU00%Gaf3#X![C,lZ**0c6aq9CLZP[UQCmNTIQfl9#' -2T-ij(lYNL[XA$,R&Mk''P,3#Z&+eAekMUr19rCd),Sb3!%lF@PC4dB&6LH9j3PC -Kdf2$+0UF1ZR`)Hm5["j`CKic*BA&b(E'+a(3h'DDLHKeBCITZZ@J1fiRSChIb*I -5U'i2,S%hml"R4P1D&`'M5b[P,-j8iZ[m8+4'4aGfZ$12(f!5rrE48ERGFHFC-PE -*%G#Jd(19iRS'Aj!!dd8pcm-aE5FM*KR9K,G(3P4MD0&a+bjm($N20&cQNh&C0'( -`D$MRrDBD4im#GZZ%8VkNEpPXA9q'`[iMV8'l+T!!DFji%P2X1ch9ec$"m-86P%! -Y('IA)jl3SNj(&k#(5%K3KA9"iq-pF90rkpJJR0#kclShZX9)*DZ0`C(-aq1%1jM -[Z,T$aJ+H-3N#dhaKVcDD$*GDc[0f-dmipqLLpc#LjCHl`a0$90pl%QM5*dcc92+ -p"U"jH9XADS)HbQ!RQK-V,BbDk6UErZiBP([Y``C&Z+8ERHJI9%$%cBPXYXXlJq` -U)+bhJ%e*HNhE3HITN!"q5@qLfX9lFSeJq5,#[94mV`d!LiFea`AkFS0c%Ak`c#l -C#kpYS%[EU)N1CK")iQc1rAq)#(VMim$d,KV@KVmUI*GH8RQ1`83hciS-0Z`dC`d -3EI0T`I&I"qqEA)rSaL1XDieQ38-kee3b&C@98[hVA5F[0ca#`m+06eM[c+-B@%k -B%URENZ%-EC(j)kmBm%0IMR[[Ei%dP(*NY2,-Pb$brL+(pE6D@qJ@HfADCeVJeCY -3$lDpLSLME!)fG6D#SD#mkDQcAc%kPQI0[3H*E3'RLJ*[p2)dJ,8KBDH#bX6!8Dq -[IEkEHY'HSXj-X"er%J2dapZ)fJldZbf01A0AqFHq0K-lb9H8Qa0,(X(aV,f3!-G -B+6BLEB9h[D'p$6C8b4Fj(8-@AS4ZF`U&1+QY6mB'iLl$5BLU"J1f3V[N6%*h,ml -[D0-c+b36)C5ma-Fka3R5X8%Q9T''KmL9qq1ihSQ"R9+&Ip2&+Pc-CHqUj-%++"m -qK`eH!ihFLj0`[UhfRU(fPlJiIl'!IG9lEGmP#qUM9VUH'Z"E)p"[JK@45P0J*$a -"fE@bQ9)fa[c0M)SlrB'4pTf`UL%T'PFfY'N8l[h#*`lCd`,5FP9X"a5N)#'PPZf -RjNb`M+Nkp#-VPILUHciG6V`alS-k*G5SR@(4E+*SRA,bE2+2kTUD+$k#%)k&qCP -)DZC+)GhmGkYmY`9+Npj+6VA9mq%NUTK)E6ePUZGm@#AGE"4AbL@dYE#1*TMK8Mm -*)6`PQ#Q1XaXAK++aeThSjFFkHQjVRi(&i2!S-F5(LID!9%1EXQ'Y!INa"'a)c$S --HL*'4#!%!6hdY@*e@HAmdiBZ@PDh,&KS*D)M+hcESLd,KG@Lki'iabJL[!JLkV5 -$pEbScK31GTm%))r!H@bi)XFi`qTHPD&adL+I0590P@Tm'GYPQ63dG["1rI[Vrpl -BD0ki6@16R8LG%Fqq2plNK3P&"64UH!V1M3%lZi"R+RYUR4c+%ZJ[c4X%Lli-!4Y -6l[Il`iN"f[6*HiYmQSrA8VaJl,2[cNJeh8(mi&fq@90((2e5K02M@+T[rq+CXa1 -&VJrc6fl!edl1)e9bE1e'b1m"%#-FV%41qU6D)U-R@F-4)[#6kY1HC[&'C+-r#28 -BP&!AGdEAUirrLl1-XIQDfl-a5ebCY!5cYR&RTN@TXRB+@M+lI"4)!QC0h0IBLA* -)&qF'`j!!%aIUU0ia2e(8$RVrB'B"f22BpHDEmjArUirq#RTJSHY6%e")6hk(JQE -PYlSUZ%k5#1XDK3,+L3Q,DL5f8`G#L-XL'PjL9I`h%mhi*EEqRR%dN!#Ap,c#i#e -l&(I%i#V,e(d)$iXF%1p,0V6ck*+44aJ`jeY,A$1TQU3,4YG+@T5J)R!eecTK20S -K&QU43j,'#9i[(NH)BDllRjMeJDL6(,qG*#b9ULGVr)0S4D-5a,KhS!KAEFr4`!( -*2mhpYX40KQT(q[Bcq2[(f&$FCGIID4S6+FkY2hae+@SLMAd)Iki3*hIBlIdpq0# -)jpLpQY+LZ",8dDKMqX&rZdhRG%9#LTjmAVCFI&4,LU41DTaFUShB)hMr$ib#rFG -m",TPl#Vd$RT0c@ZSX!h6jRLc62bkPV[S-U&98-&ANS`Le8pc,%5XG8h,c%L(dC8 -1DYbYAK2**+F22Q`#0Ekd%,GkHqlr!HBV0l&f9cU(M0HiP"l,`C)('UVGF8[YPr$ -S@UjRe!aSjE`Adk,"pH&KkXd'Ne)S0ilB$HUc0dH*(bCMhU9Vdp'1d*,14Xk%1Uf -0B(bJQX%2*KUE-cR!LG6'V8hb!$S'(F66qC0VB35lULD`3dN5jpQ$jp&'M6*kc,) -i02$1q!XZfH'lD2&`X$pZ0be+Xli)ke08H6QHfABl-CD4k)Ka3FaP&PmLQKfJrEY -0*c%TTF[T5*TbR3lL$T2M+hb#dLr"0)(XF$(TZAAH%%$ZYDF2B"(e$F6T"0%ZGej -d-Cm41h9m8,lh[!CT5d8HX!KbXX)`CbEq0H[#`h"!)l,C0KYSEL`A#@GdYQ(D&fT -4lpkJ@E#N@Rj++(R,6-aabeY`@L$&k!mCfPZS!@lS`C0X28LL4iMbL4dNJ@KA1*m -h*+[6`KEN(QS&ZJQcEi!B6hHFr$C&8[dM'`P4lr*haM*qMAC,PE!`YA+QE!%2P8M -NYUiNr0"Xc$+i)aEEVE$h9*fhJaaYrJCYk#MU`4XPIPVK&Tp%8Pl9qFM2Yp$AMHb -$)`US&ckQCUGCSPpR')'NF4T#SIJFb&)KbV,!3Sqp)8!"G#6GbhEFmERk$IY6M5, -UpI8+HJbAE4-0%%K`SVLU"Mb`9f)@!5HkGXF+CK4*m&U(FXLUIfhE3,k6[mXDQMG -$iN$4*-1Le%)-!dEG#M6M6DBcTbpB2b+UA)6%(b!6#iMIf"TL5TP"!SYGB)8-"9b -RHqKZ`irXrVaY`5C&@KbAFp[CNP,SNQS1Q"F0iKZKRFVNMY04`[ILMSBZE&&Y&kL -SpJJjGkCGr!K0d+@&3Zp-SF8[H#pT22'$8Ge8a-$b"q[N6SBXTr5Z6YG(%PfM'*Z -rkr*q8Y&C``rReVY'HQKlbD3`88MepEr3'GG`'62ZhJU4Q4&4PRke&MBI6`64@1D -@Kq!,Ch"-S0ek&'mFEPaCpKHlA1b4U!05k5YpcdebTSZ4k86B*`(94ie4-AIh9NN -)H$,aPYm*DE4+e%dTGCj!IT!!CL0ET`4ZCb6XkpU$jLmSLLB0JPB5[6!5+0&K4(I -$fZA6$Z[fCP+pSR3a)I#qaE+ATZbd([RHq(qY!MY(NeAkA490J[fR6m)`*l%KAdH -B,#H*E+r@3$q*XeYJ[jVdZ0*911+#j&Q4LpJ6TDqiZ%f0r[e2@'TIDTLbqYECI0m -UZ4H+"pRpK26i[UZhirDS2T28meM66Nm6MF4+qL@"B`6e1DLNhC+CmN@r0-jpD)2 -KJ2MM8l&R'*!!GGTQ+Q2DqLcfc`Ri!iPTk"!83[3jm)0*IME#"hpK%I4eqbi&3(5 -H8QQU*5!j-,1""01bTZk4NY)UehSa%ipQ6"Ki6aJ""2mRFSI-ceG'(K8kl!!0h)9 -,e`A0QlB#Q&P"dPcLkPV8Ge(m8D`f@!2*Z#P#DKh`+R)Iik%JS@0ia(5!KfR58Vr -'rh9[k3L#9pr'I9$ceED&(ULcf(RRcVcc#@X)JTBlQ-CAFG-&6C0#D1d4PV3-h0Y -a%haX!$%AHD@9PM")6L-fqR8bhA(&6+9KX[$S['P4p-4R#E&aqbV1PrmHrHXCbUe -B'"9Bf934&hC&rQ*ll"YJ18&Bh@mC#8-B["[bJj0)Hhc@*3QiBScmYID0rXMrlU- -FGb&QbS@NPljZiM[C--Jc8aAdhSa*E0HY1eY%4#h4P9%2f6JRFqKaYfE+8aYmUC6 -"*42F`Pdl6PiMdD,!!$dlQJmlhim*$0#!Fm8l+`E!Z$&VY@iipQ"$5GXQ'i2-'Kf -5&!*cEaQUZ,,6,!+8MGA(K[Gqa92%eMmYm6%8FX+crGp8-BP,ZS@I1#Q#QPSZRRp -,cm2!rPcThj0ec'ccN!#A(q9l"CA"$ITcIj0Ea2LjjH[!J3#Tb4ebI1eH0Qe-rB0 -X0LRV,"3!DNdPlYJ,Ym)e&r1V+NNUUaE(jRHcT9r(iPEB@T12kGHBZ4`*QLKc2c` -dQ-,K#1,@,+Vj*Y,NN!#%b5lb("80HlFa59#'+GE45,qi13IVJ+@3"!%!!$S!!,' -8LL5e6(G!!!&Q)J!"KYS!N!0b!!UlK`!!Rh%!!"!+!*!%$`"hH(-ZF("M,X+e!!$ -5PNe08(*$9dP&!3crN!3!N!U!!*!(3X(8JN`03BA18Ur*R"-H2M"ESb,h#Q$ci1D --I`@*)+HT$0K[hJaKDb8Xfkp,d[cKmFR6X8EH8NT%8JXPVX3`#c1kZK0p2LVmBI- -VdZ64I6#bT%DjjliRRBJHM(#62Jki0I(PIlIkZZP)iUJL-YCaECqZNAI')Vb"BdP -8(L$%LlNrmpHM$3@c$K*jlIBcYADDrk[`hFiZ04b9VN3G"40Kdp&qYGLmP"CFe(+ -@pj88L(X@S*%j8+iSeDd5aTp8r,93h"Z&"qf"8`)C-l-J%B)HPALh*ea98UbfCpk -eabI0%ll)TZ+mAQUAXDF&Va$,'PprVZ$`Z''GE"PFDbPq$[I#-Yc%P-E-Ujl@#[D -aQSAH`)H"b&La`AkQA2qV(dYj@fImj+HJ-UTeNmI64pB`bDlrQ$k'DS$8Y,ak''E -rqV258*4411!if#e&4"HZ`dAHX3*i@cbeIL+CT(CPR4lee!G)EPbCb558kFMH0JR -2FDdTR%GD0kbp8GPK4,MdGD!4AGPaSP$Dl2)m(cbZLI6`G+cpTKEV%JDXX(JaB%! -ILhI59A#6Zq)VNGN)q)Xl"%mP(Lr"k4bjTd[eH9[KY1H+ElHEDP)8[G!-9eB+8HJ -$3TN1!"[3d$H,RH26#D%)85%FKLD`P"6LcKp'e-B`rf#2f'M@CqlS6"D9D2b2P,G -D'l18jAXQ,4Qfr65cQS!lMNVQ[c1m0CYja"B+VL*`"D'GfKNblV4GZ(2Y$9K0Kc4 -"Dm0C1329LpDK0!2'PpjQiEMaBi4[3X0L'&(D@i3NQ*DeFI9[j&3A`dp&N!$"ER9 -8qI(XR[jL-!1[&m`fili8EQ@kECf[Hr6I,*1(Pf1AbjG0$hE-#'#42qDY2lecM!' -1#l5%h4pTj@ki`+)jHm3b@1UXheSpSGDH3)9GijmCY8$*d-J)M(3mPrT+mYBb&X) -XYhcH"GN(fD-kKA(-'k9)&Ea'I"(XI4@0a#(kpil4BYq"4i8dD&p,,icNp8LQ#Ir -3b"M'4%ml0JYkU[R%L9Eb5$8G60fHF5G(!f(H@hG5"Yid,h!kj6,pKS5KikbQ!VX -+mkBSlV$IMK#1hK)8XD`c6EiU#jATkiMY0hRKmeJUYj4JGqpB'9e3Pd3,3fjCAB0 -rp@R8%a4B(be`Q6aGXKh+aH'I%&N`L*hrhhD#fXK"6%8Xhd`1(ZG'GP3i#*qGb(E -4h[J6YHZkE2&mq-aIUlF)L8r**bkj+B@YrkcZLJYCCqR2m15!eb`9,i#m[Cqj2Ue -J-D$3B-bA2Z`3bAiI&6)DJ,(2cUXIeAKqHB-q@6de$CNdcJ0@#aLF(AlF)K$Em!b -lB,a19kc42cj0R6jHhVNll#+T@5@r4%)Zh,4kh6#c@#3S+rU'9Ck%%5m#REqFDT! -!SGA243hPc#9!FPV0YFXZ&+)8cUBA+FNDq*5UH$S8jPH,cmceeI$Dcc2ZGR+214U -l68Z&#Uq1!)8%h8!9)KPDDdA$Ii6"&f5F#PJHUp9!Z@HH332'G5Z*0Ke%k"&#q[C -8&1`,J8U)p*Jk`[!iFq,b%*A*RI4XNFl'`%fiT*ZD108PBAMH@Qb2p@qmYcQ8'lG -!b'M$%SKe$*c2jbNYU+RYM,mR%d31BP+L-dkJ163'!GpP"XBX@C'@M1e3MU%rR,& -U6eUH"LY9eH+QMBRJNm[+mB3H$Zjb(bh4V!B,E41+Z0bL$@rh$J02f,Prc3113pA -E@1``hU85ELJ+2-j-#8fqQFI2%`NJ3@3#$UNh6Q!5HP[$+PH&)q!$r0brbB#B%5e -UHp+(hp2!NdXP8Ud"R-kE&6&4e%ljGYqD-N6D*"#8a'RK4BchN4,[raFEV[)Te`I -#!D+SeRiXcR9&e!P,i@3BaH!N'kq'fCfa23rh$`mp&4AR6RR8GTk@CR+L)4dKIKc -X$4e&#j)%5'-&ZCYPDPPf%'(EFC0)ir-0%*!!P#6J@q[@eiKAS![)0'&#BhK8H2V -iKd+@p`b6aXErCKCGPGV*9,LDk2SR!c4l*a[E9ldj,$p0$#a4"Ie'hGN+0K$6-## -b9MVH#Yqam&+BeYB6&q0"%,YjG*Lef(j@Mp)X"f+*FdkX0fVBfk+qm9Bhi(03GmD -CNMfkXl@[Z3V`9d,rJ+3br`$F03bjSl(4SGpTU9kLM3'i)'JRBjpIITCVQX5@dVI -5E*Uh2'"S)T*N)6Jkie"#D0qBeqG9N!#SJkGHQ6!jN!"$Lc4V1HTRZ3I04i-pU6V -peFZ0C$"HGh`-"5($Kr%a,mE9dNrZe%'d,")Lf2#3!"VCFfMC$f$-&D&@jJP`U6Y -Tqa2)rH298['`BNImff8%mDrMaBiF(e#h'PG`03me&PEXb,D4JG(SIH42DJB@k+p -#PEHF%hL#)iBdbeC0FA!(jJ1Y2d%JJRjT3M+dh15(@Ab)#X-M8dSjUh+F[8S8*j8 -p@,jS+-`JZ0*qQkCSceHHfl0b(&(CHBk-9l)QXV@1CqFe-hRh`I!iZ53fE"!)GL4 -[,U8JDCQ`#kj$D,+Q,dh493PCLZ4i'e(jXP@5rFViRbIRS%KQDTUl5rhA#Z*$Yf5 -3!21XJSJTL"5p`S8BQ-(NH%$6lkYeUGBccC!!*Q`$)JS%R-+mS39Li69Aq4J2bdk --cZZ9&`rGAXR"[LS`pTH#5YHS0N*jlbqjl1SVh!LE+C)jKQ"X!8Ur!'+HdTZk([V --&r)&BAZKI0&kSfcUT"I*HY%IEMdepeqM054N3iRGJb5c20i[imV+e@klcRN9Sa- -XLjA@Crr1L0AXqShm4rk(#e')LFrM)G%32r0kIYia-PTM@*c#E!aXc2DhkUq&[84 -(GaT04IKcYJL2`0(KcL"cIq&qdZ95%iQCZm36JXYc4XM0la1FlMeAkR+r&0q(k`5 -B&@CD!5X'Yp@fY*N+aICUbDNEGHLh@3aL!SG"`ii!CTl$ibGi1NR4+MBRCpDAqp6 -AU5'1E6P1p"Vlp,`*V[bLaRfT-me[iEbba2dENA2h5k@,ZQJ4iLU+pmJmZq)1!me -Jb&*@r%(UMFHacri`Faf-Q8EaHX3mj,hbfdiF,6DM*4KJ0Y,&9CM'M"dK9Z0h-d9 -apYp3%cbrB9r5(6IbkB[Rj*%+K)5XiGpGi0BeBZZ*0,DSV8YJ%'Kl,F5N-UQiV1d -Yd2T-PVqEJ[QakQN+3Q3C@Y$8IRA+5q#KR"j-#14f-eIjY0V-*M0K8J$i[k1*m0N -jRiQIP+MCSTkmFJaX6imke!V5NDNbN!#+eSN'#(PZpeGRIE2)Zc[$h(c9X62qVHa -3Vf-R,fKS`RB)Y#IE$&K+2q-q5L"RXPMJ[fJD[Tp[*N'4,pmXVeRIB[DXaqY"'Bj -CZb*&jG(N6(RI5N2#-S!kN!#djq1DGLS1rEhIU4UZL8jQd4BJV*c2+"DY)PK0&!T -EKkab10Nc0dqY2NLSJ%&p*L3Ke(-*,frIfBEL*Eq"Eq5%cf#5TP@Nj4,3k5Af1m[ -[&P'5jmaMePem2AkFXQLr(qmL'Yj$Zm-#BNPlrI,e[EImrY0IiVKB`1"2Ib'*Umj -8pABp2a-&TVieR+JG@h*(F0$TpNG'5T%LHf8MD[EH%[XAr[`cf+c(mHjK53CE&%$ -c$Ea&j$mfGke1bS%@r,$5k6F'r,b5fe9UbI95bbR4C@&mQrDj%8HXjV+C!54a[B2 -aU'U8q35!+NEBaLacJ9[Fd"KL6-Y5bM25%+C[%2&N)c&ha&kLLVSQ'I2rr'ke933 -l1q0$)5'kKmAV1r9N"hSh2qrcmAj3M(+fM6P*0YS#[K-AKQPTB"MUIeZS6(*5)(K -CeP@'+[@"TU&Y6CZGR$Je8Qf*84Ip-k*b!lhpMfaCQ,@pf#dUi3P1S!6heb3N)%# -$C1,jB5$K02LJc2NH6ejQl5Q24`MehZY1VkLTjLKh@6NA58jE`V5*IR5k!MrK(LV -5*I*#UE+6NfXcm[1!8![e-bHNe&+fC)ZeJRq@#Hd6Qqe49S#jbaAMEhLB4J"54a4 -hID1ckePlJqJreHAhBqqmrHLrKDblajQI9'Cr8@[bVr3SZ02*!h,#`[kbL#2JK(S -hY(")4Ee,#*01BT-,4aqAC1'0ZmHfd3kUKU6+3C'5mFpdNaZ-"MYm#DqUrC,d#hj -D&GL*+8K1@&N`)6LbA"Pm&%"#Y3jZ@Sf082-@#cmH0kr3`1l3(Q@efd9+A`hdQBM -[REi1Vf@kJkLmC2X+R-9pThT4&lVpP2'Cj3)k`S8-,U%1+*!!fPer"5$T48K&#pJ -69C+3!([ZH"`d2YP""NJB)!MZFff59UD*4-`Sjq#jhII1%rVS`U0mpjXfV@&A"pJ -d01eYXkG0B`1m#"K#`2XR@D##N!$A6*MPpBpFbXbCCZMeL8j)#[fH[p'C*jmSY`i -l9Sq++'m')Ga!0ZA4+0$kNcTG&R*@[H*CV-[0Vd@4#Y,[%`iQD*mY-#`U&m'FQ`+ -TaqaPAET89ZKYeQFKQYlcKN4YXK1FRp$ZT**r#!F1f"biY4paZ"mK"rjCF2@25fN -pp!@[0A$Z5C-kG$RkJ6)!BC1r&BfSB`K!)Ji2jj2BNCHUN8GeA!BGG6KFm'H[F"r -iqNmf&A&)f,[rpH4Y$[JqKCE2Q*cLe8'FS3`3GMQFbK3f#CCqrA"%F4M$TrSNI#1 -Flr9ZK0J9&!1!`%Lr+YDc!#X[SZ!r!jPV6lediK%Il8rB3C`YGid2B259Pkl(+l' -`L39h1Tea9GjI[RlE[bRBjpDFFK!4hc5[6!%Mie0blKK2$c,Vhff(FmTKBlQmBBQ -dQjH0eBRi#a9NeG!)e`i`@6KFTj4I-RSF&m*FC0j+Pr[XX(3N4`-K6QNH2(-d"*G -+9QJ#BCc8dX0M6!eUBqCNH8N!3kUQSXC4J%deUrEVb3H9VqZhePU,Q1LCE),hEQd -K4E[HBa#BMaji-4GLEd53!0jUja+5,XjF"lYHPl'NEQeJDmVmYj3I*i[c3RlBCD8 -d3U1[+1@Mp9H*(rR"Ki19iae)-`I5cKSPHeV-kZ@@d!'22P$dG',h*5V*rAD&KZP -EbLiX2*!!TL&#jPNI8k%8'MS6HC'54IKqC#$r&2-f*aVaLBdiK0aI2RZG+I3"*1& -E4LSC)D#,1(V(S,X,KJ0(9bj,S6d*k"&09Q)d[bKC$f[9b,2lKmQIEVD3!(CB%b) --!6iS!*H$'N6kEPV!l))mi98Y%)T`%35J5$TZ(YGl#*[!B`hp!CH'j&(5eTY`8BQ -mPp@L(0QZq$ihaEJD&,8'f9E"NMGJ%V3Nb622)I`mAFqSj1h,aX8T-b2EhR(3b,M -Yca`r,h6pKZ&(DFdGXT(0T6V!*J)ha1d'kPN[&jHmj*-[V+0Lq`UV-3J9qEDAfCI -$hMSQLCZHMAbZUk9J5IPG1rl!f6Y3UNAe1Zef$FKcHZ9+[k1CMmhX)!6I9a3alJ5 -h4e-j"Eq50QBFP!SDEek(C3L%@[GFC(14)YqR4jD4Yl#1Q5j6)$!L0Z&($5cqdL! -0JPSVXXB5L("E`CSL1GA-5K15rL8Rp9bT2abb#[MbdBLV!#)HY2E0"kAm-I91F&+ -Yd1#Pm3@Rl'3Qbr4Ge&%3TC!%!3!!-!"!!*!*!ACb!*!(FJ!!m42rN!3!N!U@eJ!!: +:"Q0h,R0TG!"6593e8dP8)3#3!`&DH!#3"0b48h4eCQC*G#!SBbNa16Nh,6%j16J +J3@aKC'4TEL"6HA0dC@ec,#"*EQ-Z,#"SG(4`1Lm[Gj!$,Q&XB@4ND@jcHA-ZBfp +Y,e0dG@CQ5A3[$3SD!!83!!&DH!#3!h)!!3#3!h+"fJfPT9*PFf9bGQ9NTD8!TC! +%!3!!-J"!Y9,FPV95h*S!N!d#Dki!N!2)!![Md!!"@E!!&f0h!!$qf`!N!"!$%!3 +3!q!"(!(!!3Irq2r``d!!!)!!N!HPN!3"!!!k!!#e8BdhY9,AJ`#3!h)!!"!E!*! +$FJ!+&B3!!+'Z!!!1p3#3"!m!35e-DA0d,QeMF!!!Km0069"b3eG*43%!rj!%!*! ++J!#3"d,"e03Vf@+M2$i)[eQ#l2R5Ab1d,43%q1F%,L4%1@DXY0$1k"%2@d'L&q) +V"FRMUPQ8iqm6[U"'G'ZplaGc0IGF*[MRX-I*UalHV5S8(0r+j+,SHKp4)4f$E88 +CDM@qZlHbUqNAYKCJK+MRAJrKf5rl!dEjRT`%jDG@94c'a+K1GLQHa00haH6i)d[ +14GJ()9Uq!eqJ8"NbT5*@Y!1dFQ+3!#!$Z**GR6%S*)TcU1YfaH$!FD0jYV,GqG1 +erIKd"d52irhNF*kE!CS4rS+l&9M2@fekMKNJA-m(`%Q(q[fLcrNd"Y$dj'jCi'! +jFL8,*j0UPi#9,G$F&H%[MIiM&k$B"BL!GQDA)ZQV-icbQSSkH(,eCI4*C0mIT#5 +1p['l!qK2$%&Pl,cD[5RG!qKaC#bB#iQ4h*8d$+k4TA,Xk*2b`M@#b+biK1m(2Y' +@N!!1dac6N!"R+EL0h9'N3PCiBT&,d$-1a[q&K(Dq65TephK0icQ#bX$N%[5!H1X +jjhT"GqkRJCQ4e86L(H-6h"%LN!$"5k%-%KK)JT1b(GSq*S8!0A&(d4-hAH1f6Il +fR",VbHUI))h+#U2`@6R(idYiBNk0%a"FCRVmaS3&mlH$"KAfJJXTr!*liRP)cM( +lX$4`"ba$YQ)MfpQH'+ZU19HX9p5Vc5jT*ZIK4IXNe(61MdSe'*fFDbrBGV0CB5( +'bEk5p)30+jBRBVVM&SL8rfc"GHcFU4@T`fYK5mCQQYRCckPYZ%jU'rFBXRbb3!X +*aaRI6mG*&$!Yf*d8pAaJm2DL-U1a`!&T3aUjb*eq9Tr6Icf&1j%F6lSBiRMXV0F +lld%"H1&[Bb9UL)GLbCJ@qrfb[PIcc"Vl#r#BH+59bqkHS1"Q*5P3VmZ+"(P3dqb +cMf!!SV*UU6'H!3)6)qKI"KJ[$NaE"i950c"X@1ELGS[[SC(JdjjMMM*&Z5F61`H +RQ-mU91lHkeSP"4G($GKV-,'B!dbf%3a1rE065e,DB0kaQ6cRAU['T[QTR9B-!E3 +KTT-&"!Tf$`5+Qp5m3rXhVY0lX8Ae28-"DXF5J,46%NNK8K80JZ1)G9RZhI&H"BB +ZF(dRACXQ[j!!E`K&p9Y!V-Ee&"K,`NLUYDDbmSAJ2Rq%0Q1S8`ZYlr%eJTA#KY) +T-A9CN!$4i@X5&3IMI1MZ29YZ6Emm2ULq2+&CGiU+*bU@`b-L23@EQ04X+Cf[0U0 +*`*S&5!`RUXRQemG9!T!!5MJ-PCJ,VEeF%i5*(rG(5$)!HFSKIC%[dG'ZM%6`c9l +c,p$GMrkbZK(UjDEDpq!hLqaQE!jIQSr*0Ij+DZpj%mVhHMVi,#KI!XiJLTKpY8K +)f-%kNYE9ePC@PRl90PbU`i$RL"'')f1"A%J+ADNVd%dX#XlCqL)3242#RF'%P2e +Y@5SF,amp2$KpkS&CmQY@S[61Dfq)1F2@E"Dfa2J1k2e4h'DdUbPjCjZe'Yfhh`e +IKlATf+--lLhQA&Y8AY""Y[*,8UL%(1&bc8`k)2*ADd9`K'fB!Me'6rfMfi4Iaf" +KIQ",Zl'&11!VXJ1#[A6GJVKA)+#*5MS1DCB'EBHF`V*mrPe3S#2X(ANZ@RP%jUU +k,PUjFB@RMC(erb-+8+JSiq)4[+*@`cF2P,VL'Y0r"0eI'H,+9M)9fSc#*G0GGfT +Me0)9d0[LKV[ZP#G*X'qh@j1m!4dY[+Yc6d+(3Fh*c(fHpk,-mV6JcP-b0Yb5Apb +qrT18e4D,"UEfHH'Bi&HPl[pZ,miNB6B-#Zl0f0p,6b-L[J*c1fBr$"bNHU36eU3 +bF(b[ikq)hj9aALU)!BbBecMV@PRf8Ml*41L#aejcAEehr9j!Y9-UE"4SXr9'X"& +LcVe%&IC9b'Q%A,jLdp(lfYPN!FfQ6F00!BKaE-aD$!q3!(Zl`D-,VI,M#U0-`,p +6qbB"dG'l&H&-NP+r-Q5$b,Y+8a%TZq(PlU"+QJDfAr54a%KB(Pr9h2i!!S4[cCE +5`3"I9"cLdaHrQl,Z@#!I[6kJD(-#NTrdSdFiaYja2)[T!K&'5#d36NZSS#Z-JeG +FAAJM'f#9UApXrc&NK!kKAAfU8AFap-1SM2j6&YlN1`iTUH#'S0LZ,LbEaB6J9l) +kIbfq'`khL6'5Ilq%ip5I@UVee*!!3,rL$(Y#PKb*TQULm@`ihJ)GIAe!&%(3If* +16V&@p)NrlmfQ-"c5e9DB-0Tal"ilA&hIc1JL2"E(P!IaJr@@J9p,UZ[&*Q55H(X +Q5!j-0Ql*`mr4NS%PH0ke3IC,`3L&APlkA&ZJ&(k4m6UAAAV,NM6`(&ahqY4mG56 +cBMRUdlJK061LNpPm6MLf8J2-Y&pKehC*[AP$'6M%I)l!)2HPBql6Q-$K1M'p,U` +pZiCPVE"'"6X!E1ClefZh++(3)X)A2Hp2aEIpTc#c@D$!ale9B8%L$l$pDD8%XPf +Tp8E81bb5k5b2)2k&&TKp)-['pL,MNI#+*,%$IXU"ekKmp)mBGN$DTZBBhL6ZjGI +T!X*,UK))'6S6XAYB`Ii89ND&YjA5GAh9VC%+,VSMAEh"lim#Ib2F,hDf8[A0mpZ +PV-N@*"UJ43EQPePkIX0lB*S0-VFrC&VU+cKHc)YD9PD[A,cFfH49h0"CiGCd(DB +h0,85@E6&4bYCAr-VAa(RUaC8$!HjBF%"XKbTpreeJY*4`i#C`Fai8#ke8j6%!Fj +!)VVaN@hKdUF3bFJ43"4mVY2F!c$3j#$AU&i@SqS4`"fZ0B[R@rNL!p!F3k51S-H +drh2U`9U[A-18%e*,B"qr@MbE(8CkDal%1b%RBlRX&2QQ'N"6B((VE"BDQbTIj$5 +S4JId[8KkdTE4a5e[[5l-iQ$)TXp"4%FqY)cbS[)!aAB[)l#PEqflL-EBcp"0B!5 +2``SUEGh!YHDNJ53q,IL"b%LRDTe9E()@'GG(Mk`2pp56#JHQ11@IXZcHY0S@0Qb +hKUEZ6"#,aXX8V%aH"qUeGDlZ4K,$3MZIhk(9BDF,"#XfSFM'eMG2FX)r"M-ar2K +&MSKIQ[rmUh3GNd5ejKIBf-RjQChR+FQqHll16*FiV`hf"i'(iR`D1$-TN!#F%hi +3cK3L!pEQ,ePFDm`5(X`U`19p#)[Ld'QIXqSNFk`"el3YPN1A((!3)[hhTC31YpA +EBmDcPGTr8,5NMQ-r)ddcS,jcMF(Ijb8%N@QpPVlPa[S4S2UjYe8[50Bp6EbId$q +`YZ9$63C"pe8EXPFAR-Q$#EGZA2qNKcHkMi3crK`'4CBklCIZLP(*8lqNp88`'-m +kY'lV5LL`3!E-YGKU(8HZN!!jJ[i3kS+EhVrQY1A%U0J+(eX-H,(U3C`@HKi%Dfp +eRTEMbfV)"2@908ZTZ@8q15@'R')!0jr(LQ,$Z`e"bUL(2rT@RUc[mHYhl1RBU#P +M6PI$CA-%'V&rdpK["qXp+R!U$,5-aT)9Z5a5S8c4a*MrmNB3c8$4[VV*(,CD$MJ +bQ!*FBjE&I!#j!B#TMGNI+1Q%N!$-DYX(b5F4$M,GR5r`5N"%@-CXp5U-ZXe1#ZZ +%HhJ`8ihbbU@LPXdU@`1*F-@'QpmUB$@0)(bDiqT&mN[9`bA9BVL2G2`kd`(rYK` +18GfMk!M`F#+Q'+,%qT3T4")GYEi"'hrir"*'&HSIL-hM'G!-GR&C8RqJq5LhpRK +1b1`D9[VAFi8emS8&q0-8K8aLLEdHimU@*m9d"-LhkX2fKJep#80maUAdiS+CP5B +9TKNM%aBH`UDmNiBG5q$JN!!+Z@N%)Y&Xm,I-&8Jp@5hU-F5$0*i3Ipb(Z&"d1S0 +Gr$5Cr&5@)$#X1a&*5CM&`A4`HlCJr*!!mId1jXliB1&QAf#@Jb&UHI`Xj0dG1P! +dekEXIIUTQFFQN94X"'SH+RGQUae"C8bG'%8IYNmLjBCh9k`mM25'GIQq&Q,ZQ)- +-8A5b!0mlqjpU"2Ra5Z@`Z'S%hKKe2d+Q#0el[Ak6SfmB1UkY(*!!1Dh%2H'bNVT +l9%LA6$k-RVD2dbH[l4N21@YCP)MkkS&)Mi19dldJK1VTB@K2q(4,b3AX*`pmF&2 +j#imKmZT!i[Kr2RqlH-B0qa")*UhR90AUZ2b"b)14L&+RE*6AH--,EG#jXq'm3pX +Zh`mpYY%K#JTLI)m-E`Y!EBpar55cMG!'GfN$SMQA`&qKeQTdIJ+JaibY''eLG"k +mcZ1Qm90!bl@)PEbjlji@RNE"-PV'eDIfTbk[5G9-hY,'CBZ*-(kLV9NaZdi64E` +hCfC!Sp3J0Y)Y%*+U!Ja3Q&GHK,q*`4@*fXQQ"+p1EVhAeKC2(dbeJACS&hceN31 +QeAqLZFHpRDDFkSrHN!#bP!hi[H*,Zl%*ja&i'qDf*@JLiBR5['5Q$Qfe98"Vd5% +Le!4RK9Ujahl$VDLQ6(%Djrl(ZAhRkeNA3S3)D(ra*EeNdZi6CKBX[9ir4m)3ABJ +B%@6*,+bMc2rPR+)5Td8m9#JVfXhr0'dACNSNYP$-&@e5L&STZc"HpADh#1T&fdR +*Ua`S-R1m`F!jD--lA*Ub%J*L@l!Qc'c0)rIJJ6RD`QkLjBNYrI5E++0KAI@p%,I +LYUY0b0jZ60hX6i%eGZEcUE`C4bGk8'KhZ*'0p*kQ9k8f+mL4pZ*P5c6&6Ba*Jml +,[&c(fYI4I%Jm0VK%Vb@(Fq'E@6ar16@1$faQ[B"rl-H01H&L"69IqF3ljIa1fjA +0AikmDYL2NjCL,VEYfM,b$%fF,Dq3!1$9rb(qEeDP#Ha2Z)qiG[DYme-)T'Pd%)m +[MG0!lX+p,+mS(0aSFpDMph(,)ZN*e"6qdck$HeDTMKDZK53B%[CqAV'l@"qhma@ +Ahl&"%Q6Lk$4,l5*Vm)`LJ)Q(dh*53$*lUeKV64-i8,qpU13XJGbTTKX+MQ&Td*d +9m5'PdkK2SN")b,X-j'NJdNXXVR%PG&LPS6(F23N$LB@6[&F(YqF)2!c#K5ppYmf +6D2b4S"fB,+QC&ES64R659M"mNUKBP6ArUHp)(Q*a)lV&i!BkTI*Ebjq9G5[Hmbr +Q)S1JKj6mZa9Idl9))f%Qc*!!B9ZVrQ%+fSRQl0piF""aDSbXAA'Bl&'mHM4X8[[ +Ei01E$[H+Gm2R)PXP(CKU8&qjEQ3a60V56kfli2rhrVC6$LAZT[XK9!VYU[SL`F6 ++lNfeh`Dq*!F`[U#PN!3"!!!k!"#Y5k3aY9,#'!#3!mJ!!"9C!*!$FJ!+)ZX!!!K +-!!!$V3#3"!m!38*2993J69*&4!!"Q'9849K83eG*43%1rj!%!*!+J!#3#3'D!!! +"*3#3"!m!3X(8mKbQ"j*NdlL%[))`&KfF3%pV"9)K3B+CjH)ZfHJqd%I#8)$eMMc +Y"GSc)aZF98YXm3[1+I6`Qqc42i11mF&E!#%fTh&K*QGi!5Q2INSSTJFGL`h(5ca +5N5FU%&bep#SJe4QM[1`PLb)@KEbc6)DJ&C54JrRhmihfP8%q$#HYMlhq$Y&Z4K) +,-[$863)cXHedLGe(6mS5KrihiRIlc`XI0N-9GDjXHBQfD6LICU#lSrLXM*LV'*q +GXDZPXa8AkN'(,f&-K2+RKbQk#qZbE$%RfSG+S6dUXdGJ[(Y,*6[Cj#X!CLd@klC +X8I[&l,80#0'%$I-qUYkfcTD*KhjC,f%BVBk4k#@QpU,(C*L`q1E&kH*0B&$(G`T +G[GbP2M2[2E,-c6K#`G6d8DjE"&B@6Ze#2`EX*H6aUZ)G4H0*JIj[8Ur[V6j4VUi +R!!J@$DKi2[ljHZj`4LCXU`R(diHaBNN'i30aK@kJE*K6(r"-`2)-j'%#Q$"(9jh +Z[2qCdXX%RiL`4+5amP'A[`ckVAHV(%bMbTjZ!djmj3[NXkVqKbH8c*[*0((AjF$ +M)i&YPHD0f%AB&DeXB3(YaFh)k((Bd!(-,N+Tk2Y+$!+TT[p-hMh%!1HfNk&Y[HA +i"!(Vm&kEq@a3GpN3Ci)XrEJ$h+kSS#-pDEm[mmT8fZ@J%'8r2Ar%VA3&I!BaaBB +(K%%9GPl0M%SI+eel8-UN+5FlDZH&K(k"k1B("Fam%Bj5Bl""*3#cmiV%8)Yq2a2 +'hD1@NbP-2K%mhT0T&k,X`Kf!22ZR52NMGK`fE+"JFR5S`2-ElI0`!K,))*l@"q[ +!VapXlY#Fd)N4QYdF3YdJKBD#eU[m6af'!fKD$dPqYH#c8qCP!#+eIq&Yffpf(2D +dRJXJCk(hEHX5&[-Zkj'SR$92(Vl4C*adP$`[8([0c3Eq,)$N2bpQ&j!!IYS1Gpa +)KCSLPKP0V3#f%6kRbpPEf8LR"*N8H8BAI,Cp1b4SE-M2XjK(0YJR`)`KPIe8c4H +lNL-QLZl(*-`0VA!ha5DP1@+i%ZUqViC8![JZme,Lq8iqLB-+@B$aEJ0C2%YdE41 +4P-)Yfr"RDeK&5J0KS`5B1Zk@G*%j!6X(2q#%L(km3`Vk&CVE+$6CIYfR&Nl2SU$ +V1$9+EkT,q$218@+B(3HbZ62$XF(da2)X'1k-J$"N8*B`FM#U)c'AThVCq(5hM4' +e-c%HXNC[Z!9K['904HpehjUF"EKk-DfP*SBCpB'2XF"&hMUf$fKSeq3pc"lZ[AL +h@!kSY#Y8aA`YNBeU*QPKhPb1SMA1+k8%4lCTFL2&EMkVjX4QaSCrT6&8#$f,"jM +QQ,S'NI)lCK5ICf(pa&BVq0F*!#M`1BIa*C2*TIcDibaQSBAaXqPk)TqibRM["FM +C+d('QGJbDM[[*Udi4(R4#[AclH`A0)JDYq"(aJT0AhQGBbJ$M+3rmDE'GXY`0"c +Y[ZFP#Ua1AATRQlCA@l6#[aDL+l6)h8,P$Deiqlqlj#Z1&`&J(Ud3+N02h*8'm*U +NU85)l%(h',-,5QSm#DL[8-6d`Dd)SJ(6@+`KYY%H&*V6a(R1CM)(AfjRIJ$#0if +l&@ZpAC+pflc0)RMYJb!1qriaTFRK%U(8L9TCmbJZUMRde9`#KF*JV3#PN!3"!!! +q!"#[),`dY9,"J`!!%"X!!"jP!*!$FJ!1MN8!!"@+!!!(Q3#3"!m!38*2993J69T +63dK&688!!9SL9%9B9%0A588"$[q3"!#3#S!!N!N"QJ!!!3-!N!32!%,"e2pB,+" +l0qm",qaah9[2QEcIpUpC-JSMMS#9lZ"*,Nd#ba2kXXTVK(HcAdchi@G0l0bEVh( +"8a@LU+TbrC!!`98fl*BVGifYD3"bSUQQ0*&UkH#M8PE#&0&rlk5Bpb9mCQ-"crR +X5Pb4(aS1A!JKa86b-9[I6Dr9hG#c!(25@9""S*HjIVJRj"`K5+38kHFZQh1j5i3 +f*(%L"MaA9(Se@()b$STkT+"H[+RmFQqFC+jak&lS2hlSM@rY@aMjAkM'd$!3h+0 +@a3X2%`&0kd(`"h%ZJ3%hr0[,AakZ+jVmUj9bGbC,AfSC!i6PSXR9YcP%1UT%l#Q +f1l*kS"fbG3!U3TN!3X(9%AcXHHdKMei4!5FBpp,$c9iphmM1i%*S#cHG!T(3l*Q +lK&GBVqD)f(pC'L,Hc0P@XZEP4`'L3Y`[01F"2"SFSX!M9S,#F'T"VFHRFfD8e)K +CR%L"Z*TjMXB&rZj(ADD*6YK*)VjfQj(hjU,31J5`p[2)6,UGMKhL%LfVrD&N%4T +1E#+!4@-dmU%V"k*Ybkjb[U4k56LjR%Bd*,4TTDEQ4Nh,'1$1rJ)$$MBTZJ5M&D9 +H[aN`!"(4R-8N)!R"1I(+2BF+HA$qV&,aLBe58HaF8T*P18PZ3B09eZGmEE1199C +!dIA5-PR0GdA$,#cPNJLHpeqS@TNPHA&cfc64mmGH!XX@)d-I'$!lCjP,am&aaKV +I)GZi-0V1E%TV6&R@%Zk4Mhqm*YUN5A+RD%,qVRG5cEk0NmhQG3I5B$-Fc2B"rHe +9SR(&ZT5$&9Z2(1RX9caqPD8j0Y(56bDaJPi9CIeC8dQPrmISN!"hN9#c,e6&Jk( +3qNqi4&&SfI,h#QQ2&XHk-+m9[`Clq$eAhaIi''[F'TeGf$9FB,iF(4I1[p&ZGR0 +aqDpdB1Z!BPjI!KNNq!P!`+FAJmTamidY%5V`JbTSZY6RL(5b6PddETe(*X4RqJ+ +&dbc!Sr%+k[I1m3D`SiE#T%U)+f"9TdYGP(HAlcr1+H'Ei"E4V`I9#[rijE'-Z9Y +l9hQ3!2RB@,pmHh5I&0H&5Q4I@TSLf6Q()UZ*9EB#@2mMdXci8IXjeYb@@+3+RME +pNrkA8ad%8YZ9,rDFC@4E2@fjj6TR%dq4U&fIpY`T&DkU1V8MeRp`F%H0#mV%#6, +00VULkcT,X6dS&`3Z,P9Aq#UkQje6S"kQFe2F'U3D&6B'6m(P+8a8RIX$1(Eq+La +cHD'IiLlcDBe,1je3!cPar6XSqqeP)-3!Y$l'6Hc3"rA2QKZlH(Y1!J9iP`f[ARF +"@kpmKH%Jjk%hhp)94Q&h1ZEd'IDS)im`(c6S0Q*"V,p'mdhB)iB$kX2*Xml+)qP ++V`1CM2`MCkeL6elTFXlMXVfh+ZcNF"Kq)MrYXU#"Zpp#l$i&VCYZ9f`BRrbS1)8 +#U69kD(r9VR2E(Q0`F0&R`[,N5-,qZMT+mEd*0kX[2hbi4%T+DSY5$&Y[-iaT3!N +5j[1@@2LhkD&U*rq4EMPhbkAR#qrH1`J$%2'8-jS@5I'D$p6,9DERAHaJbLlaPmD +eQBcR8@%DV+@&8([H01R"iS%B$!THH5%jCPV6iaKd(cN,P[GqQ%Yq[PiIkk'XL@0 +Mk+),QXq,p5pYH'4ZGNMTl&lH[G3Vl[@0p"T-aZS2c(l86L4l(Fra6+Elm`B`U)* +9J'JQ@@A"d4&@PT4j#rfR*YKI$VeBYYM"2eIZHjM+fP!YKJ&QB5'`!BP"Xe*-35p +j1eHhNb,3DV4f9'Xm9QKf6'#5M3$388qTTPH9cHc&@!S8q2Var2HF0MfbPRUFB1` +'9Mce*Xr8JL3far8[QkC3[p"'QakQXKGb&53ek83$+6m,I(HTI&S1PNURc-Jl0@H +)IbYYDPNj8m%TJ@I3+mUZN!"&49Ah$@kYITA5EGQh,2E00j'YK`cUr9*p""@'"Vm +($fEbDM8l)F9AkA3*'q)Yc,[mN!!F+3%bhHI$&!dK&L$VfQ0I4Rba2T1%!dS&[SE +CI)U`!UJ'3I2fKU6`c2SiC5a-[SfJFL"!URYei#h$1RXpT,VX)hdkKR$0,FeCB'k +-N!#N#l'a*UEKQeKd[aH48e!1VJjJlE)0RVNp-r0"V26Vl[m'c$L,,EdPb&)Zi1U +V)FUSR&dAb6a6mESSQ!!mkN*-Ef8(6,h3XGp*C6*lZ$)4Liajem-*5)lN'La%H8D +KL@B2R93XViKj9lACE9[5c)bcY&G3HbEPDp2KeF94Ee2TMGf94KN`amD[iYpETF' +a#[%h0TaR2YFQEES3N!$23pY$VREd'k+KT'$L#Sj&+D5D*E!$KSQeq@bm2Tk*)S1 +L*5["Mj(22ZQcHq**!j3VrTI*Sbrl!'TE8iPFI5m'p1miGkL'98N*1&$995BY)6" +E`HImVCF"6m'$V9hE1"2lJaNZ3R+iT`',Y-ea@k*$%c!hU!GFj-8Q5DmfpZrM"3f +*VBQZ5r$,549SbaEqUP&ACc3b6A2#N6K!c!5Ff92N64(PNbX'J48mLb%A[M49$kq +`bYDdjPc,kp(8'F4bPRCK$'$8!(8iD)qSmdSd296$Z(cr+-b%RHerdG,eaG1HlCj +dAI9[e*+8B[2"lAL$8i%(XS*'*UfT`S59@VjG)"be8#+XqCK(RbRPlUb@`,Q#,'4 +$P&#Hlr&bF2N1PKUP+EFemeiM@bk'K,QUkCGBqm)RlYAE%32+(kDFlVCE#*4I#jr +DDHkpfpGXCbkC1pAP3!MfX1MB"ADYX1+jEE%5V+bRU9R0&iC*#JX)T[dR@E@a-r, +0j-jM3SL,`&3N-%kUU0h9PEJ36Xq+Y3G29Bl*8)p#!3,%1K+"+"0C&5"K8d#0RTJ +qlh%I+4[#dhr,2Q&fE@rXp$'I'"&I,jhMN3Fbd0Kk3Bq-ZDXP0"GTqRJCSPJHPGV +-D@`ZF@E3SLLIPF4U[0JCE!+VkpIGlap6F8am5QT8Z$,[*L(C6#)E5QHRi+@3"!% +!!$F!!,94VC1e8Y`Z!!!9@3!!,BX!N!0b!!H(83!!kkJ!!!l,!*!%$`""E'`ZE@0 +`!!#(`de08(*$9dP&!3$rN!3!N!U!!*!(3X(9)+cAF,DpSk*qT"1lpY0%BQ'heQf +#9[)UpkBj["j@i[V)`%rX)Qi@c)4E""+qI"A3TCjpX`(k$k1[95rpVA#@`M5kSd[ +6NH@qqX!FL!lYCmLYD@8SLjbXafUV36&j&pKi(p'Br8Sh3kE(AHK)q"P,RfHRhd5 +($,LH%bR[@$"PMCNI4&T$fal5&LAa)&qZcES)kkN9)B'i#6TR@jR1$ih9d4cU@+h +U(C*5M)0b891NTjN96SRQ#eZkpX,9R0M*$di5Q-Z0U"JD1)lpK#8BTZdEiS,F2Z0 +A63Xe)Y@4cG'Jr,e`R9p8$EhG9kkjfi)3a%d6LN8hdF$82I,0&03E("SB6MUHbdh +*pUa$4Mf!0VThhT+GeCG1LH0KD2KKipd[!C1KGlHJr)AUGdMGr%FD#jKl6q'E+f3 +9J`#iTUfS0EG@qQIM2*0E4!ajUad!V4BXqK#aCr#rS`NCBSF9l&1Q4L"F[e*meI3 +Yi"&-r5*B4KS)M"0-&kXAZ"dpJ)jq*36159*KLG+k[mPrX(+DFqle!`'#NXQP'B* +eXLmA'E'9`VSTR#Z"`3U",9q@6l3k)lBi2cbCEh)c'ADYCl5J[!e0aMU*D%2-`-* +1r%`BPK,L,%FT)qej[GrRX,4FN!$VX`"5m!iJa,V5E!REc8Kr6-1#eH(6&Q"m&jN +P#Yc)*F%*U)jB!8ZMKP`43@V@B9rLQXhcA1JGfcQh6I2k,lj1ejiEDdRq%H"dS3R +cM2RfNe14GJ-B4V0@TNA+B2RdHIE%1R('QXPp3`'R*D$dIj6Q8aReejIk&1J+9#L +Ki2UIc[4+9Serf,XK+pjA2+ZZq4aV%9[8YcKi%6ITdAHcEjPjmVIPpXkjCIa[8'H +SAF0*P5R4r"aIeX)E+N86RLp@m0i")jme2@J6`X(RVdeRX+6$)[d$(XIdG8M&e8B +8G68Q0SQ60`H0,m"m,@N,b,ZA$P46a86YUeHe(4Xm,N8V5PlRKMi8#0@d)cSjjpm +$Fq6ie'kIrFb4Fc#-jH%%)RNLlT52KJ1h%kflMhlf&C)hcarVA(Aq&Th#VUI+lV& +HdYY8erUep)lV3i4Y%B3rlrmeZD22k3*cp9eI)0T'q+0&UBZ9&"iB!*r-&28'emX +h!F9lVB"Ze3%S-jVBIm6',$Y,B&4k"aABel&3MfBZ9EqY'(66&NZC4EM)24@+Hh6 +PLke-hB#FX)mHiAMm&-VlpD%@fah-JVbfdcp43d(!MVDd`"%aKC0+i&RdR+e2%-f +aBM[eQX%BELri&+%clrMZ5SXPjlE$J,fj[*paUTDP@kQK13hNc3[QcR[E1pj00RP +j,0c022&2U#CDIEBQfJhB-VcmZIYK+"*!fQQMCkbkT$($4L"r*@PP+5X+#G-BYYe +%UkcmAHilleAk!**Db'MMR*9d)YVJd#8"%m5%q,6&Af3S,-+R-UQTSIVh!R()4UT +NGE$*ZKHHac0f"IC9)r4`j%6r!Qk&"-30M,MN82f@H9Y6IVhm*K41QKk"KF)H!9m +p()2X[93-la%$P&,ArK)BH!Q[GP$)D`Q,+&L&j"@[M&1T2hXGbK"1m6CPBdiFa4Z +lMZ&T`)#*,"38Tl(5,k-h8c5FjTKSqpbHCGY3BZcJ'bD(&8@9@CA[f+[l`Aij+FV +ma!H)@G,$kp36,YqMT1bdkdCL2-cGZl1!UjBY8fj532QD&KY9`#TT1$rl$!P4eBR +D"I40J(8,Z"DE21K'jMfpFZhBkpVQ1I@cKqrJJiFpEHTKZT'e!"`&!JRPbd$q$FZ +&h0LN9TS$"NIG@L@8YH3LVp#I[LZfR%S2$$$MppCfrV-9em)HN!#&R4&8R`Cd1DV +YHYDL4AhjAVITUJ+dM*kS3PX4"peK&$V(@i$Nd&Q!qmp4rbiL8TrT!)j`4Hf`P4T +0K0pkAM51lSbK[fBCmiC3GiI`eQc4%Y$N%hiS[MlCT&ddcYVla26&kqEJHp,dV*! +!'3B"Z9Ml5C&1,fl8@6#D'6N(ISSPlFPdlq1KPla5D'AB4-%`k2S-Z!9(l!EU5&` +jcb+Bd%aidBMRDB6YQmND!C0D-2DeKFmNP&L3!)fB'E'!FC!!C3&e!EU`m0CD9pl +6ZSQEQCdA-##6I69[d9m4($ZD1b%LGH%GMZ6XT-`SmEa!HUSSq(5K@eC2rr-VS5b +&iYk&VCY[cAI"Ac#IMdeHiY&cG*6pKK2("eX4iKR6a13[9rX#SDR'-!dF#I)dcZF +)99X@P!TMK+br3ld2#Z'IG2Xp%jr5EGFmKYlk@0@6##SV!f'&[fXV6b(lYr9fVAp +hFbCI$GpFRCiKM0,R@,M!%'Ml4i,XX4@eBm33"4$K+PN[cE#eN6EDp3%@(6Q8Sh` +H+9'26EFMb!B5"Cir!hXQjG@LZTiF+!eC4-NKcE1mqUVAhcCm!aBdH)cE1K(3k6[ +XP-B(Z)0p5m'jm%S@dRj$q!8G5PD-jNq1lU1(U!4VF8`rjXh-N!"KR0((qj!!Jhr +B9E0fqYNa,d[1ElilqR,qpmCTbLTPRrad19QZ,l%M'3bJR5`1aU9HH'-ecHRMeaB +I`Gj[-&ZH4cE-`B(`lVhTFF59Q-A0-8Jm8eb9P,iPaZAeXTBPYSqFX9b%KQ98M@4 +ARZMh(G80H5,p"FMk+QK*2((`%jrDa(,YqRR&39aV3Ae('V1LcjVcRXj0eU4(H-R +B-k13!'VJbkcFEAr6BC3IJEYNV5+"6RH*+MK4bM4*AY-VR0&#1b*ZV`E2&,+XcRU +!feI!aD3f,NlCPdLB9jQYhQ,3RPDmB(b5hhEN4I-Pi9GVcT98KY#ChDdN-VK*"em +iS&!34`rm)akcN!#`ji4HLZ2qk&4HXFk-jq6`0ZFfV9ri(kZP-K'C)*ahSk1bEjS +V#!YN3'k#c!c,l-4p#XJm5N9-bGiRmpG5RI!,ij&Xa-"p3lq!0$YQa*`q`AcEeI` +rPE)rBV&%2V(Q2[J'Rra3FE%305JSQ$$Y&QQbr'(QAVG0j8Ck*5TbLd+iE[52XbA +9+`+CTbD4$&VB1KVqUA5mYZ!cMfGKdhNK9"6Pmc)GYKXmffS'+"iJ%4SeJ2iPf)r +RqkQ(3V-%60qeLS)K*m@hiaZN&!UXr6@P('Ji+@[X%,BBp@SfYZh,ND1hK1*",qS +FMVbB*Jp@`SE#%HQ0Lf[5RPdCrkDj,V90lf+--hpm!S$PJY#ZM5Arm9Cf2D3@*NT +1M@6,EkrNU89+5l2BTlkqKY2Sa-UTjSc,X",C!mMh22GicC%2a$hEE+jJrBL&qph +@CfpSbLVkG"C5j06qZ-dBX,Cqa6iXL3"064cV(h,G3HMFU@2P(I`P,XHm9HqNbih +!rKjB"da45j'lh(p![[Rc(d86L(FKA`R9lqr&8EXl5Kcp"0904IYMQUBli49m8eX +2VHHlI#eXl"0FV,)r,$a&b8#0bM6ES!Qq&$N%@S8MeH(1)5b'Y+kB'eK,V%TLeR1 +j*P21icbTfHM6a%YkrLN"rcVa1(06+5lk6Ca%GqbFQ[-J9)JY'S[VBKI"6ji(KXF +#(aB5MdT)Dq80[LENU#JfCNYLqlI*FC8dp1&H#@NN*[$q4,c!`TQ!hD!h)eIF0Ah +DQIjL5`@SQ0H3!)SG$3fEF`0+#MDQmZJ-6&$p2fc-lP(L'"$AjUl0iN[jTX1&NPT +Eb5diHQ%qHp,-[,@%AZV#l5dH%'&mh%"j[8VD33K06'dX%S-I!pXGIB%+BCSKRA+ +*LB4a2DB-LHP,a%M'+[5XY5qr5LCr4dF[-,$-2Jh6l2CVK0B6R"c+*JJd6"VQ!34 +N52qBqE`LiLZF'$q-55$NN['X"0+KTaJfV%M)B9DX5HG5@-'0XIp'%@HM5$(FB*j ++pV`Q(l"$9[&Qr$lmQqMY&&hHHJ,*jpDdhJBE6f45QkfD-CaI'3NJTq+IX0RfDfP +SeD"I8i@4UdXER&Md9HITr!f+)*JqAKeS9")4'68+KLFGIk%TJ1dmUje4lfNX@"J +C#0HEpAS6p*F&P*F,qG6#N!#)`'d3a!C9F!Hcb29,AL1NpcTf%*HR@pl9cX`Mr$B +i2l5k!C01[+Q!e`fXkkhe)ejaTT[(N!1)X*qAb,4UiNCILGHSFH'[PX&K!raBQ#3 +p#`QMG"%,1S!kG4V*3P1U4B!m"mIJAcLKmi@0CcdKMqF5$BaU33jq6$!HPG(q'L% +A5eU-QRMR*q![$UQCl+Nl9"6r#9Gj"*@8d#X#H)Y46jFN-k"erKbTKMSRP32EKB8 +c'-f"pP%+SJ)!bXlXHlD21`bN)m+CULi%K"Ff+d!%6MF[k6iJ11LCQ`+4cCKKVSH +5"kJK(A!*2J0kP)lK3*@-[TT(NrA%8ZjD491%TL6a5[U(SBpkZa-9@*G++&M@'3+ +(mh0pma$ji,0QkVq#MS2G$bkfTcIG3XaDmS&HB6KmJ4)'YqZe2iGI1ZI"+jhr*KN +(maS0pm[idY%9,4H8chQEQiLpF5*RRP2UlAaREiF2Z6HaHJK5D2l1C'FpLM%QN4+ +@dq1%md0k`fCDZ,(@6cXM9Cmh#9e5-C-Ya6J*E-)(+Z[%kR3I(UYb$%G'5P%d00q +Y-rNX1dke4U1abm65VrFP$Kdb5!4hbTN36ijPEq5J6iY"fHkYb8BVVNlTE$#-D#E +k"'&cXj!!G"j$83&&h3bq,2QBQ%455`4K(")qREGCC$YGQCqkr`R2E36)c%T$m'% +,a-APKfdqrIS2bYV*eVp1l`(6Rr!a8)UmGld$kULIJ!`Q2,P#UM-$fXBRbF*d`rV +aKZXMZrUj0fQhe,(R,YH$*9ca&%)4JKCCEJQ(c9JPD[CV'X*FKJ5-#iIHQdcFI#p +RVTU$9GDFqPh0m1LbPl[VP8-f@0LX4H(53&9JG43ML*Qkr'"i#9Qc-!iaRhU"LXf +j'F'63(Dka9[*+l0CKf&kTdZ`-aUCDUL99Z2M2HGZZIeT#$DN@@TdZ38iC*MY""1 +rf*rr4-1QbaGb-jh3)#!!UIZe[LN"iM$(82#QrL@3!)G[pH@Y@0@SL9P#P[K%Njm +G**eCkj0'846cH5*5K-fHS+8KikH+Ej2)Vk'T`-3TUkZ##4Q$ZmjZacXCMd#Xla+ +3!%!fD)'eCKLeS$1Y6,QkH4"j9,l'q)mCrF$R49T+JhB!TC!%!3!!4!!!XCQq(,* +Z'NB!!"jP!!!lm`#3!h)!&%I9!!"jIJ!!$J#3"3m!C(PZCAKYF'`S)(0dC'9iG#N +Z`V8!!#'N68e3FN0A588"#2q3"!#3#S!!N!G#`G68l$c$H&@Frp!B4'q#*m4H--F +G@@+*d9cdhHJKG[hXDG#H9%dD)JJI3kH(Gqd&9EHI"Km!UQ1pH@-)#K!Rr1iUh*2 +5l*cQfG8#Y1YD`S&Q)Z(@8'P,MMfi'SRr668"$3D4dcFqQp6AX[EK'qU4Llh9ii9 +@khS8Lrada'hTGYBrcF!B**9@EYUZeY2d,C)$+3GV2[Ni3DLYQ[BAhN*5!Ye22') +-NX3!F*C6RG*hR1L99NpAQ3ijhM41T"e`9IMLC36pC3YJ((E4$ThjFG*(Na!1m0[ +Gc2YCT$hDd#d1p)bZL`dIS8Y4j'jC*ae1qMQc`$YXLmkFT+'fH'90AI1TS"-)85! +8q4d$XSd$2KY@``UD#&'R5(kMI'5MSc9'LJYf9#`URAYTJi0Jc-8S#G8HPBr(q"( +a$e`G6F'FfjM@EJCja0IX-a3XPfc`TZX`lSj3[V@GY"CJYK(kCSH-q8e2qcI0a"K +*pl@#IrQFj&&F9)k3!#3P0k@SXk-'TT*br6bc@EkUa1Yf+3P'qUP,k',l[B'U4#+ +Tj83k5C)N8UUU&chECS$YX'ScLXP#+3+EJ[DS#!BTq,V,M-+rHeiS9b1fA#U5TGj +HcqQhm#@qN!$BfhUl9@MH")1!@0S+A,cL5YVkScA02NeT&S*[aejGMUSR+a[,%($ +*$F1Cm3bN!3&P`UrqKpBKUJj!iMb!jQ&KQ%R#dE%&LDZD%m"KfZcJZKKJeBiF56` +GT%GBq#AYDfkEccA4Qpe)6djR+2&qZdC0i@E4eY+$'`e&m,3&#h)`c'@i1q#am,h +cL)LS9&HJEUl8QRR%*53cEiLH94@2YZ(E5h`-eKFiY3K,$I'&@Gb'Q2ViZKd*VV6 +E31@bjCIiMel55G,XFX"S'McIUNM'+V(a)%Gh*G6@D*-p0jYHfXY&ZSrl[-M+i!P +%%)Ae6RYNSk9ZUP'qL'UZ#6D',%mZ246L9P"FSMHam%AfpN4iNk@*`pc-fEH[P,Z +ij5fIZdIX5G))5AbEBVEhd2Ck$lMhdE(H4D!Fba9'clX3fML99-Ud!af9ii4UPVp +AD9[1@63dF&`iHab3!,CH*&TAUmF+m63,41,L"cRfTjSBSh#0Hj(NB)VTm(`lU9S +DFc2aT)$Xd9Ha+DSjLSJ-0ZYh2A#0Mi2k8'@bq!p6"3%A4hYUPN5clalELDk-(TJ +)`2IB0E!Lq'eI$#q1d1NMQ2K9!j-0*Fd8A4r3-PZHaLI*Z(JC*PHEfb,krmYpRmG +rIql!&CT@L[FM+`Ip@Mj3*QlGFf+ehS'E!T4#GZIE!L`aY-frEm3d00IcFF`Lb[$ +5,[UPRRIq$hN"3LGCjfA$EN4F8ETl4A$!-D1(`)9a,6[5UpeJdVaE3&-K32Caj&6 +c*KTM[#mEJ%lCb&K&&!&,0(8$D#@6"Gr*cC,N,EqXl6[4l,-6&LIU!ke5Lm$`kaY +k'Sc`pKFle"(&IH1kqVmhG'(rq-1`aXJ%,eJD`UYdIj)'*cjSE)h44jEd&&&q!h$ +'1!Z2PaEKbm)ZDFqmCJe3e%'+dUMD6Ulq&8dACPl#Pmm#Jek-(QBB)Bf*kHmlQa1 ++K")CS4Z3!1daFpJL&502cRHhrq3UlCMM@AYlq03ZdF@NdDiTf1%1e([!#2mJ(bM +TZb#eKLIEdGJ-*r!S`iq'V%m`-XXTL@%C@-h*@Hq3!0'C+2E0i+9R9XK!hCdYLrQ +`Fi"SNe$+&-dD3SVLK`G6hJkR*%Rc-FYMUbr%B@MrR,pG2"Y%2Q(b!Up9(Q2m`5I +`6%d9kk[9$4Pk!j!!S(-DG1&,"*f*2U-U-a4'k+DaHFDp)S)Lb$"PLrF-'U)hNIp +!#ZA!4+G2dUc8K3q1PiXJd%,I-&@`9BlJN!$G!*Ac9qPU2J[2%3Q,A"r9%@4i)S, +b*N[T84K+1b",+D6FH26BD*IcM2XA2V)0"r0c3iE+(TH0M1C2JG'6d&%b[dKhQci +*+Fj'PMki8aAKia0P4BC6@m)kdXc"(pFM(IM5A41+CA4$V4HXC[LUB)QEiKRBBfr +%cL3Z5p5p#)PH0kQClDT(!m5rSf1&Q0@c4IT+jR0YfPSBLVF"E[E,+NQ(CmZb%Ej +,f2,e11Cr"TI$%(AAj[j','h4j!6+69YZ$F)HHk2`51ajaC1H5UKPa"(8J#qRE&# +pEJD`h-Ul3GU2$Xbk18VX!HKREaeB24bB5%q**C8JCPJe((mai'jRBR(aKlhjHCP +Q31!Y33U@Yr5,I8pVh)50ZXmL1i#!CD%Tp6E)GSCAA+qaqildF2MD63b3!,CdBA3 +HejL6!k"#PRM(@B4+h4GFA"2ArK(KC&F5qrR1!NmlEI5(9TFGL3'BKFPq-$pqZi4 +J(kQE2LA5pL3HpGpa6i`9YY4fhalc0H&-,JpkY+RV9F#`ENpi6!A,YK,#,,'`![' +#9"f56E-aG22kUZ*K&Lik4U3prpQeq6l(Q&rjU+IhTPK`%D4*pb49@S+NB+*!@VQ +4I5Bm"bJ5+ilQpVmJ#Zi9*PFG2AhI5X2U#$R8Cr9SaIAY-h*N!86[H&JR$@BAmb$ +cI6+i2'4k%acLrqkCSR*N1H(S"SbcV#&H%`YCaUT3*NBqAAPjAU6C5D[CqDd9ZdR +(19VjT,Z59NfYi6(83)cl"rFK!$Vm*!S[LY#dbl#(LmN6X`*KFKSfaG&fF@pX3Td +iDXQ1T'8qL@,PLN-pXl'Zj0U%pHk8G1ddAFprb8JqU[Cqf*Ip4H$6qK"4$8N'lGY +!$!Cm+I*0Hl@Lebefdj!!J@cfU[#@m'i,0&8A8!&LqK`apfkTaC5b%K!b[eH4&N0 +#hLSG$q,#KX`ed-1F#M8m(&rLXQdQkHC9$k(9,H2dcQahaT-qiI!59(SLD'lMfC` +4D3*KI%&)q(,(M@c`cb&5kVk(hbT@8Zdp'e0eD*N()hckald,#Xpmc`BAp+%+Nb- +HM-X6e8D$d-aV"iILI+#Q+1MChKVPf##TP6"iLD4K$q1berC"61A8A+h*Iqb&CkT +3l8&P2k0iM1&Mf6X1N3'3!,)V*!E$A&UC4@4m59bR`iXS+(TDr&Rr`)c"'*N-cdl +UZdIAL--P9@-&b#UA,)0HG4KKG`SCTY"##0DZ5ZhCH*eTV*B@FPLY-j8h*P9@)6c +96*D*i6GFXG(Tb6kc!M'-XE,TGY!KPcXi0rZmERUfj&q+9[i`0Z1L!i@URR#bPAk +'PI9KmAdFC3Rcme5ZNX%eEXlCM31IY&KBGMJJMGcJlr3"+GL`))+SRPid@@JSR1D +X[AJ!1bAS%Ge-,hQ1qD4G5j!!I6$X91J,G9LNZDbCaI14R5G`!C`+iM5e6J6l`-' +UTD1DCMj5Y@6##6KKjq8'YMkdahSK$2dDBDT38FiEr&9*TXeJ1!S"XffQ1KBiGSe ++9L-GYpSaf,!p'L,d[dX#QJ9G96m(1m[Vl09Am3*dR24*$V#T63ij4&@RYEkCr*5 +T9$bcf$6fB@X"-8T#3"QTQ+'NE!@eKFN#[Q+B)[&p(2Q3!*BXD'P&SPL6dciYRTX +"3IF@$M!Bj'1DD&-ARSNpkc4N%MALUDX)5&)fZLI[)-m`SbXD9&ZMIR%TQ,6CU+H +1Q*AhVc@KCh%"f`NlD6ak34##rahU2bG*ATKKTkEj1C+D4edPfZ)4(5'5dYq*lN, +"L85D)+l3bT,-r3U*`Bi@d&cd'"fQljJ)l!e`qXrTm")2p4P4cQ,#KTPLTQdMhcG +Fh#h,l+i#pCJ[elYGhSKR$9bk'F`QkUh`3`DHUD#+UJAArP,5&ebSA`(kDU#r"'U +cjMc!lM'lP"5N0&KRfX$ZmBd[6#PKJ&%SMH%U53ME(+4SUD#K&Ffl48"P"Re$Fr* +p3Grf42$(3Hr,e-C##'JqYCmlr8@c6@!iRcj"-Le8S08+1!p)*2c[QJN5,aY%8FP +U[pp$5b`&EG3`5M2mdBkkeF5P2d4'qdC"P$,QR'6h1%q0!qGcqT!!RliK"q!brcQ +rA@eNKcG!Y'`add4jYB#dk3pMUGC1"e'PmNa5KUEK&)qqY6rFG4ED$-VjD")biZj +P0EbQAJ,GXKG6R4XEr[R1PS&Ni'E2FE9pq&39"qUC%YG3Z@aLVNmI@jN#hmI+0+E +c@m#c(fYfc`fGBJ9KZDaX'Ca5$MAHUC9CiHMKN!###Ia%Vd"2$r+P@FMH#6J"PQ$ +-kiHKLecC1VIKKJc`V6,lH61QliKTVK9@KCZccHeL%riP1S2BA[l&06%m4E9+[6& +![ijM)Y+Ql"C196[GHIl-,GIIKBrqE$3l,X%NQSJZY*I5pYZbS6@4VHN#mcV*`-Q +l)C!!8jMK"NDM"9Y8,#062qMmcS!6AIHf'@Cr3qZ,ADN"X6*E3$kVV@)E)VGZ@BE +"Z+%DmM"+IfR88MfbfD5V$bqIKA$Alr%S+5k)ShXV0b4,q9pc4H5Pc'*Fr#+[2[3 +Z#LVq"4G2K1E4Gc003X3q5Sc0"'fJUA'h*VaV(TA(+&T$B1-Eq+r9&26SL2XDMTF +4E#F&i6aQrbJ)QM5H)V`J6)@cj6dK$0(Ki[GXUN1`q%a6YaS*"j'8TUXY@C[D+21 +#phAX&1eq`84Ic"J'aQe%,jU+iH,jYVHZ8GVKTbrm-l1*VVGJ3E3Ei5VjG4PVF`% +NYpVh,U3SaX)C4-(aQMXNeI@C+picR[*Ee#RA-i91N`#NiAR2Hah&iFUfX)@%F3a +SGlSU+Vle!bCb%qAhAV9m@e@3!%C&YEZDNZFRF6kap@XRpMQC3h2U[r)X!MDeF1k +#A9FG)q%Aed)4l'-(@&)k1ji'3G*0D9(8%'KTbCV6DN8k)H#rlETFh2D`p,86i!3 +"($Y(q#hV+EGh(-6EMDKVI%IK@A0ci1hKIX#PN!3"!!"%!!#aQEi"XQiD4J!!,BX +!!%T)!*!$FJ!8i-)!!(R@!!!0l3#3"!m!C(PZCAKYF'`SBfCY+f9iG#NZ`V8!!#' +N68e3FN0A588"#2q3"!#3#S!!N!G#`G6cdqaT!baM6EpQTcKG)fRBl6NRE51LBpl +qFM"1Ab"ZJSJ%268!hP5QLNRC!p)$6hGYk(m!Vf&3IYX[dcT6VadK0-Q0Y,P+M38 +99m1`3[FH6Bij$4l3TZI,LGI(m&TNRYpGVH+4KL%IZ`mSL0348H&6l6&&j-!$H3$ +,I&YFcF)[0Kj![G&1DG$fpHfbhdkHA2dK@,)p#4R95jM*I*J0U[kE@UG@8r5,1H0 +i4h)QLj!!NG`SPH8XMdEd2!5@ZYZ'2E`8'h&ff@"a@F8*#XaIK%94`V*P'IF)Sc% +5T0r*rH!1pbi'LR[4eN'Y"'"Fb)j4RUmGFm+lBSUZi1MYJfr%8+L1N4i[B*''@[( +RN!$%1Q+Gi9ckiIR,a1[L(hmXah3Bm#f8'q-cBaYA)&qqq,I%hq8b3h5$&5D#!&, +qLC)FEG8'6c8d[Pj3@P*3X,SqZiJi&%D#5E0!C4-18(K2R`ApC1@e3G+,,IId+H6 +-IVZ&QeGb)0-&ScPT3M[4eMDCH$YLd*K5RE%,X0[E'fY4$P9FYd9&lqNMpN45`p[ +QIDD"SSbd3B(2@[4p+FZae'RCNelZJHG0)IJ6*Q$bhKkrX+'V&''CqG-)FZA)Af& +d)6J00!1[pAYXk&%2Ck'rq"mTS[Z-5dIq3H)N+2b%Y@YhQlV6!QfXpk$AcKqAB!- +CS9&`Cc2(G5m9SIQB&T'G+&+e$XT-0A#*f'Q1F+hD-+eR,CmEPYLXF0XDGiF'C54 +PDj9!@K)SGI2J5GELBD26LQ#!0FA,k4,`#k5-`T9-BSil(@0T[''&&BE@+d8k#l1 +G2[j"VCl2GAEhahZCcB-QHZm"'H51R1R`QH(#h8aSJ"L$E4#[$0jH[2Z6B)Xh(AN +HH*3f1(+fiI!q*"0-BqNE)jMH,,-JqU4mr46L(Fqq9'6qAHJ8#ELH-d$pf&HIjH6 +b1`dQS5M#'[2AkK@Z&H!bDPqbU[pi1RV`j*8,ESD&cAcPdP3&(+Z&P!fG8FhI)GC +$lb-@SC[(@hDd0r#!20ii3HRe0EfBF"(,,p)G,0ZZQ`5e%F5d$@8*epX[CpbdZ-8 +R6DG,K50-33#i#kaJI5e[1F9ZA#b@kkqUc,)IYZVf459#ZX,@B)`&aGMYR)+@FI) +HZdi6rFY8#R&Y""61Y!*%c'81LYKl@qEhmTAmr&VJfdChVS2qcY4'jl,CSGcF9ZH +%QLFNmM0-JS%U1F`56Bf!'H8c'd&4CQha@XU3!,bRbLbeq',,CGAYL21lPcE+%$f +RJ9#pFQjZ"ZppGRC)*GP+A5qYXrb1NRidbMYlKm@&ePhUcVRh-'PB0DhZGD1$S@R +BHG8,0Kp3#X,%)F[+jdNTj*0AM8e[m@cp$LV1hhZ#NE+rT&[,VXUbaZ@!h#pFPRk +#BK#VEbjFEC'2Kh5I9(95B#c'Z,M'I5'$U2-'M55UCRpB,3*b%XlhZekD-p,DpDD +U)M21mq3K@#iCAmTG[8J)qqJ$C2[Kj8a5CRI4T%G,a"JrHh"LDe[B%&Hl![NGcBQ +,L#"H"6eaXDN[Q$00Z&QVX$3ajJV+"(AZZ@$p[h,V5dUF&@4840"BMdSNkEHJ4jY +j!N9K2P9#[,!-6DKdR(ED9rK%T40r&aPTiP*[G`9"k8H3!+d,rN9UVTAM21a`d![ +3#ZCj(JMLdMSp1,Kd[aj,p9J+JAUcYES3pf1"-S)Fl5d-J,FPQ,h*HePA)PTp3`i +&N5*@qh1HSD)(+NeE,ZmIqlcUNfV6dU*$FQGrj8bS'qdbV+-mk*+TAMDJF+Zc@@V +Y(!Kfj"N)JcedjkE(M`+S[`lbUNArLp[,!YB'kE+3!-"H6CX'k&i&b)GXLc56FPl +pb!qBi6#K+P(U(QK!4R1SFT@ip[e(XhF!53`'1p0KqK+634YZ4V!D@leT@C%4%02 +[Xa'+%T5HrKG3GjB+EHRZV2-V'BddFHCbCpS6TEmjb0c@8F'$8e(H8iHDcZU10Z" +BH!@"13PRrVd`'(H(r"0Ab1kh8)rbHD"f8CXk"mZK#MK&JJX&-8#!$S&@cM5f$[q +jmCN$T$INV`&U5Hq,'D19`0p,%b%9akRM8*c"I$&m!Eed-)iF!+#+VVRP-5fp4+0 +e#%Y4eNaMYFIeGd*JJ$IciX%*R`fXK6p&jAf14(6$[$(%("Hl&faKDhBp`l3QScD +(,qS("6cqZIM2@qIGLPfaY[e93cf0rJA(*TE@8D$UU$rLp0$UJDAaXhGkAff$Kk6 +c!rd2(4M40K04ra+TTDHEC`c!G2SJ%`ciIP&YU9DaD0659D0NMJ6b[#Gq6crN1'[ +Pm)$f+R1Zrqkh&C&j!A18#DaVfGK&$UZ%8lPmIqii#Y8f5S@#YE!"8)qAQVX`!eH +dH1ZkPL6B([`0BCGU3Y)aZ6ImR,X95&#B1LP-3!`pL1kj$`IRNXi9%FQYEiZCk(Y +m'p-&$96QSI,1[V4ahcKC+eJ,A#qf-AaZPB1h@Rh@5C'Eb"[pJ+R2-22pI&FJmUZ +e[&hS4*@rQ[J,[$YiM(8#ALe6,0)RH2R8$H(F@YI$*5d5RL+[B8(4FpBZBkF-9r- +*6Jriai-+#b"jMR@N$h@i5N#[U3l5iD%*)LUApjmaU#k!)RrNQhX)AUif+rSaiVK +j$iPA!CdZA4iGGeJ1RI,26'EEBYl'#FDjTqi5bIk2A-3@Xd3p4b)JHeN3ZS0fL3G +h`dQJm(E"HF-QmMA$fQ&BX&MXXkMj5,Nb[cP[bXl)P9*N,Q,AXC,UR)KTH(ed+Bc +!Z*+X,"K5j9f1fEjbTLpr`La'YEeF!DfUm3N,#aK*CG0dl+,3h6fb0dD'I88Y8Cc +rBTM@$`I,JD5r8!T&,$#RKAm30NQFM5-5Z&#L8QaY58qUMBF)1rGbJ[IiAD4`0hC +Y-VI(S-2C9eJYm'ZYl12j39T&bNC#N8fX#49iSF$Q-Y*9FHmUm%UfflYi6"Z!2&K +!1'"6YHRl8XhV*b4hXUS'c"ql8qQhPDEErG6*0N$cr@YT8I(N[6DXGJ%,ql*(h$2 +mD(4phmM(3d+3!"%2P"M"d4VY'iFq4G[#*UQ3!+V$J-(VYPGkcN0(Q@KfKq*B4#c +!KD'XN!#M1E1K$5[L5#c'U@Qk1H+'Se&-DSPdh3c)Y8kTd'L*%h,K%IJDZ92)IYM +MS5XmMl6P(p55JL@1`26$'MJDA1SAGI2bMXG,RSNi(Fjb`6!ES)["kp,Z@b1qZrD +0Ff*TCTk$d5hG8QlEXReJB2lb@-@%%Z[%H9`8G**1kF"02EpKfjZrH1bUbKZQ(1D +AJ"m1A!@&0'S()Fi*FbS5A*26ai4pjE3Em1B#DGZZGilL$J-KS`!ALI%pZ10hLdQ +CYa5&1r@Eir8BhXE$9A&4TPjmPN06T4GSE#BGH#i,5!d,FphX2hKF-%#3!$e%)jA +1SAD*VQf5cK6@'@$,G!GVj[BV%XkDm8Qr%[X!MqB9,M[5jV')"Hq(TcXIGiKN2eD +Zbe5HLcP3UC')GE$j@)Y8Jj8#)dp"NkJeH#)$d1-53"#I)G9XDehT8laHPe2eR5c +-!I6Jp+T[E0hb[Jamde*GR[mQ"Y3-I5#Ad9Mm9P2aQdS,fZ@U69B5"fDTF1cVMeR +3%9-[J%A'hCj+rLG0mNN1"-#0E`N&pKJ9q5iKia"C0@J1fh)HUB+)3(kDiYVrGiN +X8G0XRMdDV[(ZqCZ3!,J1*F!T"Idc8)jaalCLI",&a$BYfETb%SR1-X%PD3UReV) +cbbh"9mAeH'P%m!r[E-9Llb[jd6k,p90)1'@)CKf0Hdb44,J2E+*lkRAS"HSJVDk +[E3Di42JZ@K1+UD[j($C891-3aPlCTJrcTYJI&qcZUdf*50@'F8N)+d(K+(K*,!% +QVlB40ceeFm*RZ[c13L1S8bmK9ef+6([SKr`bG$!'%a4%FVQ#`fK#ZHlIajiK-H* +Xl&Af2c(S15Pmk6@QB%FphD1&V[S*j$9FJ39!`-)X,j!!iR82%Q3YMfU4)6chQI@ +1a+4*YlAi8fJa2jaFJFMT*$Va+PL$$4d)*0ri`l)eA9PY16Yk8P$Hklp"34d@+KY +'Bqh3&rX8Ub5UU1EMJU@(ZrSJ@ce5*jjX24"Fh11clJb'!hUHDPq[YmCUTDXa(Mr +F9LFS9MF3CQTUhDJb(SPKUe6NQrY!cEMhja!Jlri8hpZe)%3clGPYNmSZ1*@THIL +r-6(Fk!KSicYQB`8MphSH6)dVI4$rS"b*HN&jkm5ci'J0lCRj["$TKa&DAUMQ-bF +2FKAKrk%*PC4IQ!0QBM%`"Rd1Am0X@epaF%%bM0-TiCS0`pPd)rZX+NV#pLK#J9Q +$2QS+jY@l&0cML3[-M*%9MaheT![PEYHZ%fU4)P5X%q[*p-`L4`qDjSU*Ar,8M[H +UCdml98X)9l(!@'4Ia)66Mhck8JQ6-D`12P[cqGVj4cD2GQ-Ghe%`SCVEj!91K&q +m,Vddi)emRY5GXDiJ5!%8X!h#L22dp9QILLq+9)I#Xj(rXYVR,k!qb$elhU2BFj6 +IbFDBdpDVT-L0aEG()f8pQ1)q"#Iq##Nd$P8f[qI2Rkp%Eq6f@8)"2T80+"*D-+( +01QHVCq&"rcAE[$"U0a-5'qT9p1ND9D86FebP4bL@akXDY[dM(8,8%29N!S$2X+M +`0lcp`MSY85e'2bRrbJ!dpUFQ3N3ZI[%jqU8pZ[di'ZaTEN&*3e9CG0"J-"4MIc1 +Njr*eJ-r1!0II-QXfV@I$'H$phTf'AD!LrCJ+!$Ah2!cC5TY2#b4cLLj)%DiX#I` +j`+TqAkc4`)RY8%@6cV$jViG`cCP6XlcY%AUb53!3p!jZ@pIjqD("DM'@qJ#PN!3 +"!!!i!!#aP)UUY9,AJ`!!1r-!!'B"!*!$FJ!)c!8!!4cp!!!EA3#3"!m!6A*&C#j +YBh!!!+X268e3FN0A588"$[q3"!#3#S!!N!G#`G8KZX+e$r"2-ciHpUbEjh&%@ba +S2(Ypf2FNZ+VcQ-+NY3B+#TZ-CPP-TYUh(bpM8r(iM9Ye($6,qMNeV(SchN&3-Dp +Q43Z*Z`(VVM5i*j0%V*36ZZF8RNmBRJr9pcJQrXdlk#YF"bZ3!0h@qrrVF3@eHlk +D%r1p3,6ENG0'Q2Y-SYpCZ!capZf(4're`mi,!h6Qq0H$PqNC+*R!2FkZqS%pU"m +r2Qd-eD"hiG(1HI9AF9hE6)%VDl4)$1Mh+-V380iamfE,aa`+d3aP5P(kr8MU1UI +')S#3!*V,l8kRAB+YkjP-%D28M1,m+3k-5"XSVI@m"I!2ifpHc-@Rl+`,+-Y$YEF +[i&UD5RI$m4'20NQ#8ac6J',E29aCdG!Zk*C@KieG6U2L9+X(8Q5&NH,HFUd'J3( +UjhCE`,MI'9L2E5MPTQVB9DEZA%-T(q[9G,f)Eb#T9TPppdYj8hNLcMB'1+)3*kE +hh#XJk9@Tk6mjG-ibcCLcb"ZF!LAaK1++9rL"4TEdNcJhlF3mR0")2$dBdhfh'X" +pbVU3!#K55+*5Ur!b))XYrNAi!(j6&4@%Vq$B9Rq+,2r+Gf%Aa4)P86F"0`-#YjS +"HU26qQ8P1&Ef*6mK+!$'X@fY!6dRVMC,I8S!G$32@R#8$HmP9E&r#AE3K2VQTdb +UNTp3)4jf1-`2a@&Kc*kA9&SFcbh4IJMZAC4(p3LEpAFq)0V1I!(&!6Xq#-jZ-Ep +rYFaqAC`IKDlj@`FdH@GKV`E-KIBbR+`Ne'K+`lAckhldVHN4&PkQEdH*c&+8324 +kkaU9dUfch`pA,Ak3!(NIYV(8Bj,ajPdLT&0XES@kfbCm,!H,@!lCJ4*99BBRVdZ +M5K3f["DN&5`-jCa(qiZRH8JHVme3Rh#k#2flVScrTip1%!B9HJB*dKT6KNBJm,4 +j(d63hl!b)+[eTEUF4kXp"MPAH9V"32N!aTQVX,b@eiV2h"HP+l%c+TKic30NMRb +2Q'4rhU,@e(6jcK`@(`!ELE+fkFT!E"Bq(JrG[V#8e#5SKCA(BFmhUU'ARcQGaME +[!0-`!lML!Sb"5r2JYC@*j*hUm2aAJr"+aGGePJ#2QceEYd(Y%l@XJjAjeee-iJ0 +*8GEPUUiJRU8&*AQfP6+m)If8S9Z-98&hU50Xec'PM85(JIT)+fTJ&d5d0Z`a1iM +9jfXI&R'YbDRa([1NMjb-,*c"J(L$kLP#Pid+$0$"JkPj"qfRL!`2KbmGN!$(ICb +!iHQH-qG6b4)`Ub'T8C2ZQ6A!e5T6&S35T`eI6(1Ra"j$CI!*QLibLQPGYB*dKX& +h!HX(Aa%dSXXl'XX*+#3Ud5IT'f9IajVH&aNrqH&(Mbl"84P"J@2XlC9ASVS)b9i +&RZdqf,+5'K4mFNXZC(0I2p[,AN-Pm2!3@D2N5+TRSDLRLQEFMG1*hG44il$1Ap2 +mkfZ&0c[@@2GQ`p3*Kj-Y(MU4M(m26e!##a,L)aE)&-BE8Xq(d&k5FMCp@Y9`X`@ +'b5)FLRh4"h#+Zm*5$P'0JpN@Y8cCp,eB9kMp&8SRZR!16D6L0aq,Z,6q1*C-C46 +1DTD0f$`FV11(r2f+ceH(hFr&*Kb'9FP!TY!3DYZmHF!Nf5%XUL#M*)br3SHl-S2 +#f14[Zj@8Y&)dQh0GM)%k3`Kj54!#``CrU4k(F!*-FG"eFlp+*V,QQJ3&G-X@+rF +bRLBDe-S&XJ6r'kpFZ!INhYKQaLJ0VBQ(lp3AIhCab1JR&CUiA)b-eFG'l4$KCej +m$+PYSTj(T(5P-R6SANTk[1afmUJ!j"b+1IGR'E@9"DJ(4'X+3P)h$X&AA19YDBB +8$YL#eC3,Mj!!c,0UFIcU`$l$2)9SfNb2[VUfTK&6RjeJ##E$-Fa@%BEUN5Bcr#V +9ZdIME*M(3pQPP16G@fi@XbU1AiZHcDeKG%DfT*5jKTi0E5IJbhT1R5CcAR5DalZ +ca4`#`Y60Vf`TbqChR0bH9ND[3@Lb6pkc!mZi[LEG+[3%X"F*4$hFL(aKUDdV8Zq +lQb#P30#EA[5HV48$6B,ALkFH#EZGCEXXV+f#bClf4VAER'k[q2a00Za-SfUaUcU +'Y%2[jRAcq5S%Fcp+L!A,VE88!@M(i,Z2[$C()&Pm-c0X$Ah#F0)bmDPLc!*[@U& +JfUC,ERM(bR@fh"i6bH)&ljV-Z6H-GZj'&P,0A"&ArH'V8bd$))"C`hA"XJXPHLj +mk+RQ3km3q-hH2Qc,ELeFIK`cL%,!cMLCANPQ"BVSjKTQD9!hM2-,lN,iHEh&j95 +H8LfCN!$hrZdEUq9C-M+GFP)M%)P#,5b@XE@!rN9hrCApdKDZGjc6hF,(B'ceUd" +[[%c!'Dhf,c3+DXc'a9Ee3H-(KfDhrc-J9C@el82Y+L[e28i1I!N,aSSJS9iKTY+ +1YiNiG(m-cAr!YhIRmDF8I54NeVVj#h+`68I9(XAP48J)E!j*Jli-9RYSmSdH`9& +LLUT,&*Z18hid0H$@iVS&!QQTi1q8!CQ,bECYM1l3U5J$b3!3S@XPRZ`,h2b,`6T +Hc!JU(*0SE$R20MSlfqj`Bh+pMc#`U+Fa*eljD"dHBl261@r&!3m@ZQ+ARe4C+5A +epJE"E'-%cL2X6r4CLK1-Ur28d,4Fb!56RfR9fl&$b*'cmLP[`ZAU-SP3I9(ja*V +Q*6['8k8,,6GlbE9!*196d9mHA8R-9E*K-5`1)P&be[c86VNEQV)6hJCSh+$kdf$ +fZJM)Xb()6fe9*k*XQdC3%&6e%*YD%JRjC,R$ZdLU%#L[+ah9TU$rTp-@F#NQ5Xf +XJj0m!eFJR+J1lV`R'lZF08ID@,j!*[eP3CV2aUlf!3RTqb"UZle!G+(J1lm$-Fm +Q#Da2L5LJ3LfM(Hb[2BTh%e6-G!XVD8F"@3aT!--lY02a)q!CVDbl00f8Q38mfNi +!E$UM)hk4Nd1RhiSf`6P1`dV"`qY`Q9ZDF$Z@kYb1$rXqAMe-G3J8-*!!pMGEFc5 +6kd*q5ARKAQ&Khi8&V6T&Y0+Q&rMI2b"`HR#%4Gr8lANZMYZ`r3U&kGka-K1$25G +,SRl'$p86)hJ#Aic1bN6f6`cITC'8Frq1Emi(DPEdD)KB$NfY[h)%9eVBVZK$GkN +%4mpPA(AdjR(kfd@l#KdJ29Cl!S'G@[Y86TQVS2UdYNF%lD),4Sr!#NPX&am1J$* +80lXc!NIbSCZ'-[dk9'bl3$[FHk(Z"&T,U"H&IZlLKjjF5MhfEff+2@UJUS*U@VG +#c8B$l1B+VdT3Lb*IhKYHjP8eD68&a16GqN)cq6)YYeBX2H2)'SJIibi8f,i,erm +@0p2F4-m**d@)$35'IGf9@CM6U46TBNiAJPNTm,0'((GVdPS)(-f`VTp%A!13!2J +ZL6!IpieXFL[Lq&%LVQZ[-pRF%N4Q!Q[D@8YP-hl9iAbBk&2-N6A)lYeMi!JSTem +fRrD0qEAHl-aJiNiHpCI6*rH9r1'SVqDJd0QL2YF4HjB`iFBh1B5Rqhfq8KE4B!& +`Ad39Mq%0HZFi+LlK4d[$B@2dGCS0Y5)ZhXjfjP*M)-!5F*Mm,A*fXc90)@`%`X! +,(3mjblYT#`&meaeGJ*NZ0k`MGVjF#p)4RaFKi*,rIZB9IU42#hd2%k3'VMkAi[2 +jUZ@-AhDX`d$``)KET1%"V(Q*[$kA'aJrqRSdUVk`c6`T!,a%ENMV!Q'cYMPF1Ck +(E$!9QpPH6H9'XP53!'D6KF,M-M5V5`EkF65Rep$"UKI,h0V!JE`Y365YX`'i##T +AmaGV3&MdNPPi1%(NTil,b`#%H)i3h4XZiCM'i5pp8""NP)m1dq[PN66jqmV[AX2 +59IB$@HN,,'4KE6U0qc53!+P-kfG3TFqa`MjT&+LNb'Er$pbr$43DbV,c2dj02@i +aFq+8pD80ZjGID2'NPmVZYi&Uf5UVmh0LN[f)"R#CI,,dCLq)a-dcLN(Cdf!4i4C +Kc&@Z[d$@lkal)Khh09Br)3p&T1@3!0'VA&5SBB-2BZ[)3UpqcB)I[K&Z,`BaN!# +4""*`B+B5aP0lKK'X2raqJF0hq%Khh0+1rFElVMa0VC++NEE*MqTK'NFpNLJ4-mp +0qfDFLE1G,hEibXfrX'S4eIeLdN&5pr1YH,iG+peMbd53!'!$k-Yp()EYq!R6KNb +lVk58KGlcN!##,1G5)lKA!d'$[d9X8*E3&Qp&,"F$VV&e5'KUKVKNGklNE-QDNqh +[iBGTSDE[$`0DrG@9B1-1!&f`I[5N!8&+#RLDX5@$R@XLYGGM`e[2PX5V2aTNEPL +6Ta9CQJ6k)#2,f&SNj*GlZ4hVJP,dqCGr%R,(8`1`R%ElR@q5e&@X(k0i)i1rem) +$9#m[)pCiNbjrr2)%&mT4pA"2YC4p5h$ShdGbC-dXPk@"A3+D)jTN+V%13RXqmHJ +j-S6UL`-4X#,(IUecfYBRPSNA-'ZY`HmkqEDUjl5,(NGb(I0"!jFc,Kcp0Fj#QBC +GYdG@95Ec86XEkQ#$j'(*ILe-&P',b`lPUe-bCdV2T"(%#E(G+ZE2bVK"bI11ik! +8N4(A"kH,`4qA$INU6(F%1pFT#B8)#@)c8Ha"LVr4FBabfPQq@2T`RUG9#AS$fd0 +cX@%m(38)fdZ`L+SK*`[NAI[VKQ)liJ(!fbVR'*arlLG`"N)UIV#b5Pq8Phr#JkD +4L%iL-T!!fZPGdPL[[d60QQP61`Kl20[E5(S99Pk(%%q"r8a,H$A-a)cH'TDE3d+ +kIDG$Ri#A4*ZYYh,1*C`*X!j@F`J`3iU0TeB-*f$meSRa+4hc5eH(aYS'&3UpN!! +JpHQNq@Xei$mAC!k2f%(X"IFhU#(YVQYYBikiC*ci3`3LCdJ,[jXjdqPL&R0%ecH +3!,rqRcQ%ipH((AB+[dhe3$[2VKrV%3#T1i26A2lf*MS$iI3#$K41r!FU9h#fa31 +&H$SErFm0[lGL88AhCR`C9j8MH9a[Y)8j5D9QU1J1*k#1EA4q&2YrkHc-2IFQAKK +Ybl0bEGee'T5Dd`Y(Q2$3RARjPfa1-TjFB-$C#E)Y1(8`mfl+-R5P(P0[PJJ(qPd +#PDVa)APSR[Ek*,E104lR,&fc9GXjMLkUVm!H6NGR2P"!NS+6,hcTIBbP*%EUkEL +VI!a50PVjq5%K2-refAZk1IDKLAR[QMMFZ'Z8!)PMP&@UJ3*@$pD'&@Qfj*aV[eE +N+TmZIpY3l3$X!qV&MMhRb)P-bk[&Vb89UUeMcVMf9*b&MN+jH((L`URGm[P9$3( +`C"ZqKY"4YeQf6,TeSSL"9CfpbYD5TqE`qh-d#M*JVBGF(N@A9Iqkq4[1EPjS(if +4U0j+!#Y5d0[9hYhXFHRLeTYa48#AfQBEF(V9CAXYe3G)@()9irSGX#q58QZUq5L +)maKK"VIjfhm8d%JPBD@Z9)[K-5IC()QGbdA(30lC[er,Y!NmihCkKS8ADSeX-RR +3GAPA@ME&(Tl5FEk8T4k8DU-UC5QJ*I"bHMk0[U%b6Y5b&pfjR"Nb$rda"(,GGIP +r)MpI#@ME36EEdaY4CrFK3G%mRr[`MqZhFMVkZp-c1"Pb[)ZeUlVE4*pA2-5p5b! +"l3i%@FUA"kXIUV[ci(MlpUH-*PS#NUlGE(TPG-[#QZce&)ULD@d13f1i6()(',' +mK`I82%Cc!'2V+qQJY6*eKK63EkecKk9BCj!!kFJ2m+`#V3!pKmVFFN+MSRcS8d' +0,!XrMMjZI"`b#X6MIhfmLR1ZGUH2MC0p*PcN`a5jG,MeSXRiB@3IXl&0EFRqPSk +kZ,%aBI0LbJVQqUVSfU%PfUMQ2HhlHJ2cdDA%qYI(K5&6&V1TKk2-Y"5V$Ed()c% +4mN!aN!",j$9%FEECU5#XKj64F&9'4)cV,-hBaD43#k"B`F3,c+-U3&*#@lID1[5 +`68LL%H"#D[T4b9A,Np)Q%ELhTlFMmRf&dFNA5l2LC"Rk3FEYCN5Q-VJB,MP+#k" +R&4iUb3DrTh8`FQfZV3V+Zc9l#Q9HKeQ1FarK*8mBJYDHHE%pf9F,)j!!V08N)BE +)SJC9+[p[Q2TrYSm3I%iXSq3e[A"D#+Y"DfNU@#rV2PY&DDSD`XZV5Vi&($Xb&*0 +V-mF'E`MCbqqcT5-**l&dh#B8SZe"r+c(U-@!S*VLh6-C5q5E*Q4VfbhP+dkSQCT ++DZNfZY4AZ4hiP%FJK88S)QXV'5,`FaieJLVi21b$GHZ2D+ND!f4NeKhrLGRYQ#f +#CaXSVQmPZ1LJD3R$P+M$&P+I15F`Ee#8,!0bSC5$bCV!**T6XFLHF%'L#G[jL[b +F0k6ZeT,Dd4+Hl#1*Uf!Gd$#V&-[U&UF4`p6jAL05U8)PkN'1fZlmFelZ)0F)H(T +E%aYR'M8669krT$XNbZG18#e#6Nj0rrmk0)'Z*b8Z*49CV$hX3-1d0BdNFMd14lT +3fq52)3(@UQceI90a8a"q+5iUm!br9,XA2(NA+GFGBQj'"#Qp*Yp'j(e(9H8V2aK +`MaSmM()G4L!$-)e[T3h"eM23JQD%UICr,!hrU0I#CAqdCI2qXL`4Ne&-V81(EMc +a"&JB2ZL+i`BfBY1@X-+K,qMpN8SbqajcjAR+[DM5*941-C-@RRLX)hhHA!X#2+R +6cSQb,!$Y-TQ5%Y!,#QUDl#-jHP)Y'$qIi#mD4Fq!kZq+kiPa!REFLc6EprE81X- +04l31I&Ime3N#QYpkQ-Q4"qA-m)PEbQLC9K1AR928%,,pi--#Vi#BB)%6-&Ccp4G +6ZdH"V1cUfp-1jIiG5P1XLR!!GDT"-%lV*Xf$F`)jR%'aD1Y*C*q(*dS-[MK(ImL +lhT!!qaC[@mhQA3%!Yb@9ZLUVLHCB3[68dE('A0dkr4Sm$EeYDV2q[2F`)+Im1KK +&Z'ZbcQ*G-)hG!4S8h[3E[aeB[X)1FJ`(pMeXcEh1$3@1XG*!)m63aUkFDpXTUqL +5h4ZHk#J3'3qU1aP+i83NXIh*6%Ckp$E9jc[D-VU0HccBpArQHH(EV&,U@QC)p"a +)c8['jH@pjVprA-3l[c+eX+(#Y&kE8@jQPBFJ6"mGijFASmLa#-4,aRH*jl(K*XS +,Le86ff24[Ca'V9Z$MCT6IhhN#MNimR(*X-eN$Nch+f@%HGF`+)@'U5EK@c'jNRj +fm3FpPSDCfm4Q2VNRAFSZJJl[@+2*Xic,+#c@eVFe+@P2ZF5%BYI6+2micX#RdAP +DpAla!EZc#!Il-(N+"R1-BI-5c45+PP8rB#TS9!STfba(BjjGk+6`+pTF#DQXL$3 +U3eL6hC@I#'9h,6(qLH!b,Npp#i*#$*!!LNl5@h%9'KA+qUm),MlURYlqHbh@0cF +-V'd2E1[mBbLH&hJ+jT1ph&292NF!6HG)"*EB50e8q#2+30VGaj4LSU2B"V`d0cD +HUE1ZHi8i'%GJEf%U8IPJi4P[*!1jpMZ@ZHPJNNT3bj'Tq8LF'-R%dd*1cKJhA1( +hi`M0fUa0eFQfX1ffArPYE($km-aT!N5['%QSJ-j6*Kl[141M3RlJC)3+qKeBjrP +9(e6A5hT4aaA3m(MQUb!G*ch9a,IcQH'[FNrf#SS00+Ma[0HdlLR#84J[A,jJ3-( +5'a15cQ4Mad5qBP5%rBM-fV'bmjEcPhB[UfV50E2d,K(aki)&0GDciIYjp&r+VRS +QRQ9d6`UfJNb5c'LSV"rF[-iCaRA!qF850XD'8k6J`S4X6c(YXSAf2j8imT2B#1Y +B3lN4XBY,eTP,'J+"DZ("Pj!!D@H,%,T6U5q3!'B`lGULA%lQijU3!,fqd$5AB#' +m@rD-i8[VQe[BJd39!VPSIf-$KT@arf40FY+@M25aD*KP03B+JQYJ$&Sem5`SYVR +MD*cpE#k'eCfp-@0j'f0+k%FdMP+$c2A2bekAa%d5Vd-*GrC4L9i6F6CEcYH`HhH +Qr)0r%BeiY[4Xr[RiAFhP6RjReH&ccq#(52RILja9GlTd`3A@RPCEGHdQ&k1d'U" ++"NLCL[TKi+d1V"q8%'4Ib9m)N!!1a0*bkPSM66cq)PhR`d%-`c%lEH)P,keb4K$ +h3NQ$EBRbRVrdU-NSZAVb1U,EDmZhJ9l&5'MHbGFY%#ciEf6V9[&2SQcce1AQ'*M +S4@@YSqPCINj#(IE!1C!!k[8X$AcS8!Nl6l[pjP"M%'dHcZCQVNdHCIl)(VjBQ4G +,TUj8q%pSRR8pSG&51NfT6+FXbl81BfR4EH8Nqc&HK%(LG8ajNqXNj-ILV0Hd'3q +P0)2`Y)6l`rPY9p'3!%p')a!Cl!jHMMSU"aM2R3Mr,c*6BDA@e$(`'VGV46c),jY +FaJLeJ#3PCD"Cb+dBTNF$I'm*[piFXU5CXFkU&q0d6f#bac"B'"(ld(69N!!,pU0 +!H8+'059l4QZ3!$8[A[&hqh2#`E9Yp5Y3PY1)TP)BTqjALc#,`QqAp3JbLrJiJ%i +3a&,HiMK0[cjEQd8[8'-jB'J0MJ-UUN%2Q6fZHN5MSmQ"H)F#D1d$#6C5YeCH[CV +mHY&%FMrGHC-+[jYI*T+pQZb*k39a$q"LGPjQB5Y60BEL55E$ABBpHUH-ihfDY%Y +#Mq#`4T9mqr"IIHrU9&p)90VL(#[Rp'40BVRjfjVSD3"&j8V2fY(fFMif"U4meN, +KNGEQa2)N'j-q(k02jN$5E'rSF4lkm%dpYEJ!f9"B+Pde3hfQ-Eq)G"[$Bh%I%Fm +LNeK"0%)IjJZS8'aD8UlQJ"2@#F[6h&2Sfb"N@AA54[RkGH&,bb,S@8'6i@QrS$J +(KPfQCEUrK!JZ@4@SM-mq90[)m262kcV9X0V@bk'p6Y2ELR%Feq@GHa(dfk"l2[I +4b&d!"!q(6UKq@RQl%i)QT$6MhLN2P6*TNApk6jNdQL('5A(`R@!)XMH[(HRHI94 +HQ@r+EprNYL"K4+ifDjpS&LEX@pE+$p$F0[eYXSm'5[k5D[-SU&Nh))C6aamN"T5 +42GkI`1d*jeEFA'CJ`*c[(3ZXfm!MCJ,"E3b2(Klj8F4PBKbeaf*`kX&4&R-,9-H +p['lk[[r6-5%DTE#$R9%()hm'haMe0hMACC!!Gi5Dj+&9a`*5H5e1Z4$&5k98DNb +`ILrKZ)&Hb!XdBdG@INB)d-YmqNeZfjCRE1'UIpHKA5ZNbJMZ)i5HKHT%B5S,Sij +K1HBF-FTTl5&B''Llc(%ERSp)a58cRi%0@3+8&4I)&%$G+T,YBl(bKqcQ*0PqH5( +3rE+6X"pl,cP@c$)hVXP+)rVSc-*(D*bd2TcC+C+l91j6&FD`l(FP#ffpQ60AH02 +Idc1M*)iX,'NmfeRN*`Lrh9R8%-b%feVX+F0d2Z10iQChU,l9m*eAU'1cR*9D0li +jbUkS1#F#8RrkKJ31)AI00k2RhFaNLZq&T+L+ZkJlPZA+ckS$j$#Tm!,2rI`LrJ& +2`'KiDp98VkJA!e-di*(q',S,T8L@&TN!qYbiCqET12JJQ)0F4`@hI#(h"(iHZjA +#)'F3iUBGS+@3"!%!!$N!!+d5`(Zc4)r[!!"+5!!!I[3!N!0b!!Rp43#3$Neb4@3 +ZFR0bB`!"j-&bFh*M8P0&4!%'rj!%!*!+J!#3#8+j!!!BL!#3"!m!3X(8L[1q%VY +44-cRB))R+)J3h$dYcCdSRfjB"d3cZMGc4qY+l9#-YS)raSQ!VNKJZc56lAJ$f9f +mYaEbLYi#&p6MMpG-eCCD,!kTYdP&i,[*HIJ4Nh2*UQf5*2a!8rRPNC)UYQpTq"" +569kk+HY%5ibQ1f'`BHT6)Ta0VDldXl4&M@Q(L1kXU8GdK)SVGZJG@S@"M,02fDU +M9cbe@X-[&0+$(Em'N!"*i6(9,2ek`A%B&I2,*1XQ3d*D(3ZAADQ$IfeD@S(6#YV +RD)'4Q4)MDQSCVYF0Q((imrciQ'D5Ap2PScFVU6fJ84[0d#AQh$Pa'JjLeNQl)J[ +64YVS'"hYV+M`+M6bRm1+J1QYh2SVA@00ZGiIXXCF9l&I'"pmiM#I9i+%-U1f+#$ +S-RH%CVmI,a,"J2&JNk#T8hp5JiDc&,J4c*E+cpR&qZYTkVp'paS,XL2#M#k([m5 +hA[Nr99pqF'Ja+1Lf9'54j5+U3%(+U)jffX,[#1EU+VTYXP(p(6'-AZ)jLIhH+l( +IBh!bEME@1#9Z#CH$pC[@Z-J1%0KrSG523QNk`BN+6m8&&MTY(*X$a2"4"N$L9PR +3J5GaP!S"jIb4'rDHN!"M0L)Z'I%i!#(V1pVQ`AIGb0T9dEVQ`(CR-fAc+jRkphA +%l0U,GJq,-EhjeYjH,(B`c`,d-IX`1'LB,R%$J6lTm&#i!)qBh61iFPNZV!Tf-N+ +qRBlGDp"q8ah*!k`4AjlN@melSjHjT3!%pfFAh@,6IVPA34Y3VAldQSm!4j'IqPf +21mL8c0KeJ@1(Z56QGNB!XXd5biL10c*`@MX@GkjVVIl2$IikCcq+,r$b-X8k+@G +kQm+m-C'q%h&bi@lLa59mrqN44ZhJ3m)1CK'ed0*Lq,9Z89c6E4fRU6J""b$Je+I +C@`l$c$h4C%0A3!fFQk801kaHdFLV@"qM6,Eaac[ec#KM!R*1a6qIFN#fUlJPGJR +3Cd@0jB`mGTATGM1Pc!3Vf%(A2GV**q08!ZFl2Q&9(,l5[94+8[3KArBRK#Y6($V +4[dGZP$+XN!$F"pM,Q*8c`!dL`ESqMZK0&,+i'le0mA$aQB+&29KZ'H-TNG6fNk` +C)mKQ-J`9mkCQE@6LPS[j0b(2eHIfJjp9`40VU-"bdj)24dMKp$3i6'4`l&'TQ-F +UY)4l@cA1[hXk[dPP,hmrVh5&(83qF3&-'I+@&p-49@HG-"(k"b+$TEbpL!f#,fM +jDF56C+[@L`9m6`bLiE`bGXIB1)39T$c#Cra)le[6-BLBk(jCB#bLq"#dHqV((5* ++-C'M1N84Uq$"rb5INE,9bC[4EHZlp#+-S-,rZX3K@)L$**[P(`SRD+2mHU3V!Xq +Aj@ri)RrNIp,1EHZ'E,25iX(T*$-&Id*$b-GY@&+bX0jY)d,Sb#AR*YcKje3ppLf +&8"1qJ6lY(02k0@mcHJIh$eSlUl[VaiP%MC!!c%$0m!!a&rE5jd2&"r+,LeCFfDR +m)YJZTTLEa9F"U36@+M)6,)`lN!"G9kdckKeX*JG,pBV"`i&(+k%h1S*e[a)Acbp +E0+C`D`A(*[q3!-jQ)j6mS&1)$&Vr(P5lNl(!l(4bJZ,qMe(r4q-5f,f+V,lhlF0 +HJATfJ"BV#YV*C*2E`&8qhHYl8SC*D*j)(fq)h3aDqkdKhCk4U4'`95--lplF0%M +eMV#E(!`DF41!IN4qjcSe3-r6lkJjJVKE9R@JrrhKrZBDG!+4GjlAMP%Lm#b0N5[ +NRB4F9KE%b%A,9*Ilh(jhrFMiTMRJ#Vd&2PrZcVLpfC28"0"1kfm4r5-HKZNFPQ9 +%1P80*-0#h-Z@Rq5E0+#$&JY$bRKXfaJkr,4BrA8AHAj--f"#`Y)c$Y9HKRBIG%[ +B5XRQXKfLAq5VF5'F`ph4AddLR!rb*8aB3UF-MAY2BTFbE+#Kpdb!+*e#Q[irS2P +P`@LblMCSTiqGSDGDr$QN5B2c"PRld+X)ae$3#3l9lC4MME4K4$Rfp0I%c'bmY1- +FB)f*4H4p`hUH("!iMh-&b[c3Q!'5h[@#&IX+'0JH-a#c+4,&F#K(KT,"h``PHH9 +9dNY"[*8fSHc8`XhZ(*S*pNBqN[bG*FSI4km*I52mqC&A'Dr%%LaTArCqecN%!E( ++,jQmkc&Yhma++Zr6if@-,MM1G,GF*QN$Pkp%aU0,3QIPYX2bVD,&3HccU0Mj6R6 +64VU9+)r4*9EUmYBkV[ZZk8fB!bF0j0$B6FSA!Dp5cP')XXJc(1)YqKCj"riM&GD +ZpcRUYCjLjp3V1[M+c1EEJ(J42B@Vj2'1"-K"2'TI6`k#D"[$@,E!i2FmTE95[ej +LUlL[AR`HUAA+a!K*GdLFFPX6N!#ArB+1'89!hV13!-m0b(RbIe3JB"5"pI,Rd8P +kXM6#M[0*$M)#bP'95r+amK'MeJR+a#-ZP91`rimacQNJcm4AT[-0F$BP&mEir"S +1Xk9#%MbX`&N2XIQe8(QUY0-GI,(G1%Q*#'Gi-%8Gmd5L@0LNBfKcDlaMa0!U-MZ +C5I1YJS&FF4Kh(P1c)A`IiJFA!FlZCRP3'q4"M(FB58i5MBEKB9j*pl(JJ%TFd!9 +5Q(3kU"MkAdY3l)CJL`NCe5Pcd6@EJL'jIGL)cQ+*mh15F5RR0&-h&A(R530JYI[ +PpbrVQH`#1jD$!-Vq8KV`)PrcEAG2R34NPj8RZRH9@VkKEM2,cT9G"CXhPDVEfdq +c*QF+FBa803VfKCBfM8GIeN"X@e[29UaN0JT6lGBp0,2'NXQ5ZJEM@[2bcGaQG3' +9#j49d*X(KkSB)92J[d6VlcRM2EQYa-l44[i$b$pT)aPDrP'q8if9r5X8!000%r- +"NMJ((+[8(qHm691NLGSY%e4$,(fi$!Z4Q*h8bA4&,B*RE[rF8(pkBID94,chQ88 +#!a,F'SrTl2r5&QKckH!f!r9)+%@mdfR@-jSHL6))Yjl,#Fc42DPPi"'XVA9bpj( +DK(iU,2Tiqam0MYS0&I`lYMML8!kB!#P`-iEHlrj`a4[$)G,0cMJT@48P)0NdfPq +MdD*`Mhr%0NLL!k#FGV"MmeFlXrNCL3Qe"ZKRk8X1eM1L$C'!X&U3!1X*SAR`"K5 +-&M&4"-D1MFe5'h9+rCZ#Z-I"DN03@N2T`qa'Y3AqB0!#&VVPT!UZfmdcm6!C[KK +#HD+4VCEL$`1k2'2FqqC)em8bmR"1R'MDVp8a&"!QHiq$"%1fj##(R0M,Uq@ak*X +S'&-(cZBM,pF3Qdi&[NTV0!pBZfQC3%6RF1L#0[j#BJ(fK%0(9"3Hi[MH[6mJ&[H +`kGP&`0RPrbdaij``&F1L$&HH&pi"lT&r@HPVK&BqQjfM2G2IK*)9Qf%+ZpaM6p% +Q!Q0@ITTk,PL!+2%HU!UR,M[fFhk'S,DD2(&B"4`k[$@0dR$ihMlI+5)CC9TUijf +LdY*VC0I%rY1YXjp)r)Q(a4+qA"0Y![SlECk%C,C(-p)[Md8X0h)$0'6#BU61`1I +h09%clJF6Q1qJKe"dXAR`qQHJ0Ja+!,If-$%FC-BdGh5li6l$LrShXmlG,QXVA2B +#m8&FeAe%UC0"9MA"9kQYpV0p553)[9hY!RLFYAFVP`XL(lq'(+4N,,l"GC!!VMj +X`Ai)),X,Rj[9c1ZUUR1qV@#5e`4Q95-JN!$bJkm$rrT1`$80Y%LA$Pq1$"4hZ&# +!mLdqAaTI-`d[-8lM6lH(TYVQJcVIJYAa,(m&%1jN4$DpCqV2BR,Z)aDH4aA+Qj) +1!I8(%SXVHjU9UQU+a-L)pjIX9fY3d$Imh-NDE"QhVVdJ[NV-)X)rUbr'ZGK4S11 +R5mDiPfP9KL5GrbeG9c6Gp!H"'qZTkUmKmA5SPZ@3!!4)%V#ie6dlRrZGVhHA%b% +iH)MbVpVDVk1U*HbKppVrlTm$E-q-!Y$A&Ipi"-C9cqPHPPjpm8`D5C)frF!UCM6 +X41A1pq,SL[T!`@jrFqkj`41@&h"r[jAL6PaD,X1CZ2k-+`,8UNfeQm[m*TKbVpY +IIZIkeA,$SPKKYNQl*SrQ`2FN@eL5!&e+"qZXq[)lJPRDT0HQl,*0lD+eaYRII'p +M&QLH`14P#B6@m-B+hS*mdkPqM(J"SjLe*,e4SISFCHTR6Cj&1Zhj)Bm)0UFhYBR +lScYiB-&D*4LK(Q+[Nr"MQ4`"V`mipSrJC0`I(+!AZ,UZcUqJ19N$-Xrr@Z,,P9V +3-H&`kI9E3`X&M`-ZLbD5`mX$`pU9U#0!qkMl$I[S)Urk"M@#dd9Xi!dUmFKX4C0 +(JSZ5B$LGG%(k*"['hmC32h'QAIF9mSRel(r(#YrNMrb`Zf%f30l,qcN!FY&UC!@ +SVKVjIE,M1T6#IHQ,MFXj@G&PCkpfDDkU@X1Uad"+N!$NUZ[ZYPCB'L3UClRmZ!3 +XYeJ2+l1J!Dd'2dArLY'1XD&kTF2pFPY*TUmk4S)h6&I'DZPDe,F#K38fN!!-kr( +5JQhql`PIf#Z+!)&dVS'HhKeA-*DN#c0%0jEG+%fHkhG6[1rhBbF,GR&Hk+0CLkk +%b@DLYM0V'q&'BCf"rBA*KhqG@3BG&Fi8Bm#CiE@l86D%ar@`Q'9&'hHD3N%a4A8 +!YUYERBdSjh(6YG`)8pJDSUTAA)D+FD(l#pMYB1dI9$$X5hXDM*XPi3m`'0c6PFc +&q1A!9NE2+J3ReZPF0iQPD+(pBm0JISdaq8)A!K8arDhN`"Ud[R*2,'11L@&IfQ' +`L+@)5)%fb4*QHe%X(4pZ#FBQkaGFF&@)JEi[EV4b'%lFlFF34IhPmdQNqeNYTJY +KK2T!)+GHRXFpMiEKb8R&`C*I(-`9[me"c8llaq30iQfYLKS,43-YeG(S'D'V0!" +fILU@3Q%Z!HmkbHL)SR0b)SN`kKGVpHCb69kAL!XbDAF(ahm#A1kF#SV@5K+UUq2 +8`l!l"MQ9l0P,iM%[DEH%J-+6&Q+GI51m+FiBVPYE8Ybk+imX%4f&QRV$mbJa0UE ++Ij,,+BA#0ARI$9,8KG-a&dq+VqTK-m4X(4Z@B!#8RGhJPL([q4AQbaXce(-1A8i +-L@e%+03iRd!bNHQFCCp-,Z+A&RC-IAd[6Q-j$*'R"CK("rZdkYM8A!9"H5@+K#m +m%&c'iP(Y5$2G+JCDT"APb(&,h1Cdb"h!!8P8m1"25`Xi1BcFMTjAkBj+EP#MP,2 +F@6++UQC9%qD(d5&UdYUQ&YQie`f,EL"b-EjJ@eaULG`9JqfHP93#GhK&Gce1-I# +TKh)LV1'&A%'KKSCS$b9Eh1jb3F@U5B!MIR-lccZR`MrdDAip!$SQAE-*r"q+Qh4 +r+pV6UmM@[3[%ZY!mDpFKKbQT-c!,Kb#2r-B'IqBpclPB66i,1SBSL(l9fNfjrrZ +4(r0Zl#a$b4FBZQ#AA+kTH!BTT"409i8f,6[%HI)0SaBq8JpUAqi)lclBCc`k#qJ +C&2jS-9m2U4`"k+IU`rJ*,SEJ[F*P4MjhVMl8B5@JVRQ$3T%MqQScbD5%C*h&F0I +4rI%J8V!l861f$VkRID31c[*+#JpkT"r6BLS)mVc5GiX+H6"#P!Ac`YSfZXZ&M9@ +8AD2IL!bmM91'9R,Y64PrFGdPqZU!SqUKk*iKKjqdS@HCirpJiEDYLiIkE,'C88X +fe$haL%S1fNE"2'eN&Q(C0R0$2NYIrd'`2Ph)i*H-KbqL)EPdj9`rBZ5dC"#Z2K3 +a$R(!a$l*r#6bfF-am%3M4m`[0B1D!b+rBRhNFUNkLqVd2'+[C1K2QXL5XN855hi +RmJD&%G'lX3%dq!65BR`qCcRJTrL!(M9ab)e9HDVLKBRhkEE$bF4#VU`U1eZXJ9a +aEE4!eL[#V8D)l"J220aaKeQdCYXC3Z'Y)+NqI%@f8G)BpEP-&E)MGY6"B'PKmim +)4bNYLfml#$[YTpQahIHkF"CbHI95#59I-jM9IAb[-P$'J)CP#9kZYM6+d80jf5Z +YAV"Ak6RHEJFcG!kRJ5P+bRN0"Gf!m*f1+J6Z9#eIYHNc%"9`cF14TS5!J13q`SR +-"fiD#YY+CX!UG5[RpUQFrfDJMq&@PUS`ICJ)@)3KLe80fKE`KFeca+9#cGH0FB8 +TUcELU*Lk18AG65kGj%'0[-GILjY26$f*6U84V6bcd@%6eJmYiLi[AGaD+dpJR$2 +VLG$MP!amcfirHREa"Tk2Q"G3&Id'3i$24[4AGXH-K1&$U!$*SP6)1Eai)0hQcA* +6MN@!M[9bN`ier+aCZCBL#1)%edYBHrfYka#Q)BIXkAVJ`6bpT[q,'(bZ3c8U#2e +EUE1m)r(@*FI%iJJ2Pi!9j2QrPmi2dZ5+ZKlVXd8k)GT)8'-CE,q+2d%#ib8bU`# +9M4Vi-9#d"'R9$h[TNffDB9(4',JB&&l)BPCGAfmf'PhTH!Ab(HrldZ*3fYZ'fre +l2hdVp)`8FCGQacBVMY#q2qYX&lhG1'Vr4peYJV4V889i2cI@!-k2-bFA83Ib1Fm +GLaQ2Sfq*hHmF+E%d3iScDLk1$d&iQD3$5i@k+erMlbE8!p`1kVRXBV1pUf1IibP +kVR2-B)DIJ6VK`Ur-ID)bPBV94&Drqc%FiAkI-(-XLeJK$MT#9Mc`66(J'Di*mhI +*r+22HZX3GpUhJ&4'UdIe$P8i2K`pP`f['lq#a8,ZdY9l#Y%%BE,`cDjRM[FGLUl +'Mj8*fMe''[Y%!ci@GTY3MYD[M$6F5*DXA($ER`3Ji$AJFcb8-ED3!*i19(GiPaq +"[06"UE9@'#T#B$H`ZX!`Pm0NkYM5(I'h+5")#[kr`PCrZ$5Qq!b40eVd5jQmik% +d*bLCjkp`'P'A5`jNXje0Ii[69-2MG4P'8IX"YjBmkZ[fFdMVD6AZTXTimeC'MQU +rQ'I!CD(%QXCS!h2h2lIe'Z+FTiC[ZMfq4Y046&FrRY"5eimNFhNj%-f2p'lE"aS +ZEVI)lZ-`#dG!+NK0if+Zc[AF"D&3J$a+Y#GkJfHJ+aL!FG1YaUc54-JH3TPq6Ye +m'$TXDAAKV8H&REb%1HrS[BVq6k+ZYVPla1piK&ieeKpc`LaHcUr"j"h1a-#9$J` +rSS0Hr@!f0dZdS*'&TFQFpX2STKIbE`Q5#,eJ&Fh"(5GP1DB1JT2r!9DSTSj"1mU +4R&r,%qF3CKVqc$aDZY[8*T!!h)J5`ElbX#UN"S[$h('TN!$K,L"&Q+Hd*NE(b(Y +&YIY"E#8TLIeaM)edm$P`cjCliZ)9Y-)eeUG&69-LSN4%BR4@@Jr!P'r'XmhM%bb +G6b8"C("%)G##NijdPDDY3GAq+PkjZd&Be+UY#U62H3iL[iEHB90mcekJf(R8`Q4 +8Er%K04Y&De1qNj5p'"Vp`d6'QfKP4*dGrYj"C$0kY,cGHU$j&-2eH3DY9cm5!cc +4VUl6ReL$,0a%Ib%UDQ0,Upm-cjcA1)hdpK5$NT&1GF,"kI3QLL8#I4@k8`!(Sc3 +DfF0HprefZm&i$Z5[@A80D(k5U8LECjL+dip[ZYI8Y9EQZB#c)MD@$5V"$FrdK'j +Y8N+0[k66iVAfE0I5AKC(cE**r#9!Z4NR-YDp[,I8F2aJ0kN0p`pU[M3*m&"SR(l +lGj'L1kIc0fK0Ye9ceeT%IREFL%!IIkAZKP)VK$iM!iBT0raMKNB6Ej)%""JCF[A +*e($YSQQ!GPhLhL-p4A4UGT,TUhKH!p%9T1%,2@[lMDZ,bG6`0%#[qTfMZrJJkf# +q"5I32S,F5b8I'5rJ-,'cXIGq0fUG5CR)Nd*Ze2cb,PNV1Gd1'9GG'3rqV38hL(f +(9!C0J5*NCA3AK83r#T66JXRQdYc0KiH59NJcNAAVGE)p-DJ1bLU&5VRI"TDVjFb +li4Fm#HAScYY&EDhK[PYP!qT,&lIcbR"-65FpF5FR1VY@-YkTPcBE(a0)3rRSNi" +McR"I($kD+X(*I+UikTJdJ,Umla!B@*ANXaJ[D#JhK+@*qdl6XH,VVrpd8VG&1Dh +E0jHjerQ4rD65$2fKM`eh`Lh-c%0`aDhQNqb3!2C$!'T05PM9hUTMIiN#'diqHr` +@e5@i)`cj[3%@liY2Ikl*cJ3[%ZaU)(*2+0h4&b"T'Q%(lC!!eDE*fNBJh@,jiBj +pj22N%5#3!+0GUMSb)cTlfK`h3r5SH5LB#AF1AbVpD$!#*RqG%&$%U%dXA)V0e43 +5YiCRHX`AQY45a+*9RrQ"q2I#5$L'5c"5eD5i4M`5XPB[PkGaIj08c"&0Rb5q@$# +II$L"82p-eUc%p4UIci*8Bl#a!X629`r"l#l[FmXK@TjXQaZp$@FPL-QiGe2pKCE +HGD$#XKl1*kLd`5jQ&[+5bTijZkENDDH54j@P83hEFJ,,!p)-4&1`FDhZM-laIN, +@l&9"1$$3L0(f190k'@"FLQXr6iASjE#UYfSVEkQF%ad5hCN'mXGcm"d@DmH%@Ve +BlN,JH%#C@m&A+dcZ$C&haFUMc!L#q$X2blmBI5GmiNZJQ5M,Fj,DYLAGPX$PBHh +AVFH!TC!%!3!!2J!!X%"*#,'3!%&X!!"Q!3!!K@N!N!0b!!i09J#3$Neb8h4KFR4 +PFLjbFh*M!!'A!R*cFQ058d9%!3,rN!3!N!U!!*!*#k-!!!B&!*!%$`"#`G63+bG +8CR'cD0EN-jam,1cV80feTDMq4QG!,kYl`Rf*AN5RA+peZqrGj1EVR#j'i3H`lSG +L&NeTaGMj#pmFkN*ec'jh#AE4!45Y"-4`bq!j9X8G226T2hYB0BCRmlQENck4$V' +%hU0l5E9I#(Ar2-F`p`2$Pj&Y-[KG)!VJFBbVl&iGMRjKKDrXjK'LE-+A*e2S,1H +XKlFlINj)[BLMXBZZk6%N0*Vm22'"63j-krRik"YdCe49P!X-,e4L1cNV"rfY,*S +lShD`IB*2JSG'S+2,q4ec$5HT6hmqqSbUl+Kj$R8hYqGSl@eU94jUQ#U'(6qNRke +8"HBL9!+VdQ"(@FCpAf8AC50bmL%IPleRLG@de'`h2"alfVZ1r,)Qc"'Ch$qASp( +bfUbX)RV%SIKK`k"`2NbU2lE[Qh[BVZMF!eBkF*5e['90F`KJ&-1c$PFl*Y&ma2N +AL+,!#$C8$r*EI2pA0[)G+lPGX$k3!&"XGBMrB#%jhRr[*89PTXrlh8SA-Z2iaa, +a301BMa3L)Mq**m53!+DJF+4"Z088cNc8Ei["*l&6!YU1CIlHU*U96d&J!+DZjQi +N2,qGRkNTD8Z1QHTlfb&BDiEPKFiPE5bij'3iL'X8`c0K%BA+d@rQBI`PPR@r$V2 +[cLIT+kf,6RPXdjIVK31@4a-"jZa$(&KrCd@U,@12b"3l[6T`r2ECZ(RP9M6hI2[ +Z'Jj'RhS(L`Na,+3#!%SjeibC8%dl+8j"Nb*0'3$d3qG!ZKGGqTQ4p(dbXLK9iN1 +&DmJjYA8PDce#pr,0N!!bV12lH()0&K"em`&Vq)Qj`a,1Y!043YH$"PdGbmpd8@1 +hEAR!-P-Hp-8+lXIUY@TRjbpUqqchZS%Xk8U6-"0GflGlr1lZaqHjj3%i9LA#UXd +RIS1e!3,#S4mqk#k9f*eem1dPk6r20Z@kRXa015#EkCf96HMD4hUKq93'`aPTAId +,%jf2r[S9GerjBAbNb#h%F9mFSZJ4$20D&J`@6iC`m)#bS$XdN!$1NqrKhIq2,L1 +$rDR$H4'"46+[!0VmD*!!k3VTQ5aNY@hRh[3bEb&D*$VQK$FFG`0i%LJD-6+K0X! +B0$H'PeKS4dp&UHD3!"PH3RH0I2"PF@42pihRarE6VBkk&d!3L3lSN!#TCDa6'8X +&K0MM$Y"DK3GPhD9ZQ@JYNhT"dBFC[$TpkZK[ZRcY#bGp0')r)!LhqN'palE@4Sk +@RGiT)&QP-)dH#Jrq6I#TVXhi,@3F59'$lV#Cai9G-#KlGqHBG[T2d2,25P&TREr +##2bb6)[U%'rV+b2QhJGiFMr2T8l$lpJ"Dh$E0b&*aRC,3R2@C'MIVeDfHFlm2[p +N[h`#K6CrJ#'mEC'0IH-#HahAU[G9S(eJhFjFpR6p,R![rqBCKRmpA06N-6[CC-M +3+cZ6J3L&R1NU8`#Nh%Q598*RDDa#M'"*YUVj"RYcMFLT46GlhE9Ej@DBD'ACcFC +Q"aZ'@pUNBcc`V"D+Rm+5YfETS((Z)c,jGUK4HlF06dIF6B3R6Q%ekC*6Qil@drK +Q5Zd,69(ZF[S$MAXmA2+0G!b&FrTNI%64RIC!Iqp3H+q1X'BFTSSYPer@lYiJSQa +N-bB$VN*2Xi0355NRG4N8l3JG$H2kcLAbJbTCbam,5#&SMk$&p%G'r&kUrc94bSZ +8mecb+E-Z!*%0IjP)B)I+R%!EXeX9bPaT""faK+FLmU"JrKP`Ck[+V'Ur*ARNUli +m89#XA3*r3S%dmaFIT[)I*GEL2KZ0[,UX"&k1EXa!JQ8-36#mbBDa@MP3NDh9ld, +ib52H%9NRr@`-j)hZ#F1mq(E(-4ZhIbJ946Y1DFP0br92fFIc9'[mZVffRRQ@Qc[ +mcd0imU`f'qil*E4!M5#RI'AFETMr""1F`E6eUK96ar$8(PpDhe@#XZ9P#5LUXdi +E&CMm5[a99IFR[jeQf&4M#PUJN!"KGhJJ5p845J(Z)'HLN[#S&!`VUQkk+LhNIHL +h+f"YC3HBKS4a%-*D5SHC%F42G4MAefL[FqPL,Y&YX`1($a!Cli98"R*UeS,lBUd +TBhU@!r'!TC!%!3!!33!!XC5!Kl95[2`!!(ld!!#CF3#3!h)!%DB*!!$IN`!!%k- +!N!32!%ek8f0SC@eP+'&`F#NZE@0`!!$5PNe08(*$9dP&!3crN!3!N!U!!*!(3X( +8TK@Pd$j@!lBKkqjPaV&1mUJQE$fbAQI12iLUqR0kk#eD"H8*)%F-*M"'`qZK32b +LNRLk`&`,j@Z,S#%Bq"p$F(JXfe&K8i-ePA#D,L&C[!c2A%KKlBd#JV5,l!N5bU1 +k!lXN2S@12LJjPm8hi)[c9"R22QDdH6XrIA`qi@mGSiL8#T6FXPjm6ii@#f6IP!F +8#)b(PNli3(+deMhT$8Jd,i`RBq3ZR2XCAi!k"PBYAKZ-Qp%UM$N*QX4D&%MFkb& +$q*!!*f+3!)DL2fdG,H@Kp-A(($-11`5jS8CK+"+F[a&MQaY'0NY9%TMQNQZEYN$ +`(MYS'-Ai[N+&jlJR5eC!'bEDC8,CcTj1qBXATAf84EE4@BcKT+iY#Z+M3hAirKC +c5U&ZQ1Qc8Y1#U@aqZ&&#QUfjLEX-I9QLQaJ-L,RJDS`i5f%T@T!!%dSS!F,V0F3 +@8q84cIKI,I@U)B*a0C,-dJmI9)D1-fchJrdcC`8fXiE0Bi$(Z)cDK@PfG,m!N!$ +I')`[ZLS-NK[q@0(i&8!UE`FUl3AUijIaG%8[PrFQ!LI"[XT!#`#'4#)A2[ZIe[X +Hd4BJ@d@ABpI4YD001jQKV%jTFYZHGf38*cY`04a"L*CqIpfUR35K![,k,[)&hN, +l1#h`CUmpEI@8TQQ#!8Dd#XPiU&3M0Aj2MQB3Q)mTRE1iq#1(B$I!P0A8Klc8b8H +69-(X)F5Mf,aqfX&9'LGED2S9J"4TDeM-EZ9@P3H+RV+1J3LLPA@(i,Z$@4ICXi` +H6J@pl'XHD0Vjc`QA%*!!0KAf1P*Nq1`JiC'Ve(+RPj!!1Eac!ME#TD)k*6&(9## +($)0,9AMlJPF*YAP%M,b*mp*SfbeeTJ)*hd9GVHN(&Lb2k#`a8Ah%&1mKqrH(h!D +!`Ap%ZmRXbe'PkMbQ8iP+$ANc-m'I(Ri!*%IY'Vq1DLD@cL3krTBLARXK[$kkEF+ +4Ni,E2)(SIE4Z&HCFPL,Yd3T(fceLNkqIEBX8+K)Ir(Ia(#E'QX"dmr8&`![2e(d +P5*m1S6IhGbJ'ImZYNh)T,IP[dAN'rPq03mXL($maX4*ULC-FU#&83NPPA6Fdc%S +M55GHMA&CLFj2"-2k4'(Q!,YqE--dBKG"+bf')6NFdVH5r0%YiR#*`6'M*N2m6aY +hcRA@H$VrS8,%d[XFMDFNaP)D+"5IZ"XE+%b`h+5CZE2*HfQcGU1*b&#"#AJe0Uc +X6*qZ*"iBV9hMQXkI%J6U9fS,J05+P`YiicA1-6!``3GSfBeSp)q+hmTAEBIGH([ +%&UH2-Y-Gb4$,9&@,0rebSN5@kKVC1RIRG'Yle[R"1a0h6['fR*2T5G`ikFDh-j[ +8YLi4IK&QIBN9fGFSP%QINlkpN!"QUAhZJaYP8d*`mV0f6X0ZX81-S&Ljkd-3B*2 +%'hZq#J"A*LFQPQ"aeXp`Njk!YKkj"%Ub3(fmY3q3!*!!j![DMfI3+9EP41ReYIJ +"LGjZXd0m5-J8kP-(+GY9T%peame%ri)`R46'd$YZLaU)ELqA%l5,UrNdFNRGY9j +A[[UkU5)QBEZ3!$2T-#D@qTBM)b,IIN9I9k!qU4bm03Ue@kB4kKJ0*jFdTm[4CE' +YH!$`(!TbDb*CRhqB31Y"##m8R(m*G!c1Q64S@3+GFa,`-cfJPpICLA09SR`h212 +@MQD2Gp8Ahb`L&fqi(MV((8q#Z(Y#Z9%,6H5[C%j&KIGG"1&T9L-b'`h4`RjcmEV +0X0e43a$3b)c$cFB`JU#@'@F2)2k!3HpAqD*BCSH&6D%)rN1163%[!4$lX!YcNe( +4!cK!Ga)["C'fq`)K68l(fVVG6L[%U[([j2N@qaYG`BIKC"0Kc-Jf*h[-i)l9R1+ +QiYlMa`'@9fk$R4pX(@TkKF$HdQT)RS*E*p@(IVq5LX#1j`J&JLLNJfQRUi3pr11 +9fN@9C!Nlqbr&rde6dG!FP1U,+Yfa6P0&dI9Uf$&"6*3aIHh6Dh#6RXbX%N&LYX@ +1U,p58X$M[E,'Q(QK4H&JqGa4ANH`1VX)0r0h&NaX@qMFS%j%UpD8E2R)'(4!+SU +6jXrQD0(R5'lGZ9P(fVrL&1qp#3)SB[QhiA+r9+[+SKD(D0q`NpL`r@YR%5'*98p +RerAK(d1X2@8"ijRSdVCmKV%3$8&39$6j3e3RZR$r$%M%54`EaK`3+%%`G2"'dR$ +Ria[D(,6Y`[NjYSlk-A+Id2kD0F&i*"IrA##3!"@,B9%l+@hRS!EJ'Y5qHVQK(HB +Rl(rP$AUq-Nh*K@Fq#$9$h8'mrf"SfqZ)F"e`'PICS1SF6EqDlqPT#bVL"kGGF@- +D0QL-`2FJ2CLe2GlNa!$84rPNNmi--jGeY#Qf-)Kea+Hm2[HV2J4H%0SXQf@Za1G +5r+(14!)@K(FRGVGD2HrZ[b*8JF`fiLdl9X4BT2)rLFeq()S,F%p[(9pEI1&88Mp +bX&iS8-jVDC00mL-0YJpT,DpYC)qaA(mkIAYPd(0SN6l'9%#A(P(E`ca2iUeZrCC +M"&YlEc4$-,%HU+SBkeiM`5b5kd`,R(D8pej9,HmN)[CfVFX%hTAD@`b3!+Y#8GX +CM,(hAI+"`-MB9BYL$ef*f-G3'+HJ@1E')a([2JFAL!ZlCUj&MVIP0YdhIaA3lfa +D+X#`cNkCG5N3j3CIpDLTfcI`bYX"2JU%&b#BXBq62i5XVVcAQShbI`kdlhd#DlZ +@9G3$(B#ID%C$KQrU!Npa"K0PYBH-&iYT'CbZG`[Q$*ffl8UY#XS`(H[-e%cNGfA +TM`AMcK5+jS0-GeBB)U'pdD6m0I$q8Mk5(QV@[Rj4(*HV3r2"0D(%pY%kGb[C$Z' +q!+ENL(4*1MBLSLAF[Y423,PjE2S'he0HE4Sq`"hEG&ZH&2BTk5MPKTi#QJAqmIT +Mbhk$!&V**jTi6SDiX@c[E-&B'CVIHESM(`I"%KemSe23EYMT6h&5V2Ci-I'GKC2 +qSkXRkN#YP3mQ%cdbV&cT*6c#c2BN@k-PmLDa8Q!khqB13%dm1CrG[@$rcdbdVN2 +V[*ZQTjKf,F@91`qpZaLbjFNR(Xf5!rY!e(P[RK8Ed4dh1bieL%62Lk9KTf5I"MA +dTZi(3LFe3,r%kLY(GE6DR-(lJEa5+HdRkh[P&k06%r&*"D1bN!#)Z0CeiURFe!) +236FClhL%!()PYKlpKa0-6Q[1Ekj`fHA!39r1(YhiVPPQF[p(`'*EF2J(TlME5SC +4RT39di8193(jd81%)k%meiFaMimdb2mIBe5KJ`caH#[pV1XX[8Z2lD3T!JT&Q!5 +rDL5dYPd95BPP-!*Fj[Id[X2)UEjlM5[F1K5)pIF*8&TDh'jG*[CLr8jc8fPKUch +*5jFr[1BSaZ",1TA6MHf0%&5SVN@eGhYeSk-`eYS9r4C&f*%I)*b@KfK%GH'[lDI +GANJN[&bVS4"!C$UPHCM-PPm,YMNlAC%62jI()ZB9Y9@A$D)h6+*lC&Y-H&%c*V% +BrZ3SYQfr@3BJS)QP-Y`Sa#4kj2ZP#[r(KSU)`MGd&kZfQ89f1LNq`MJ5YqEaJS+ +Nl,SYc**eq$AlD4dr&mIK,(09`qa292Z$@fJ@IC0AAP6CI80Gp(3KHF8Xp@k'q6( +a$L1#qiPl)A[4e)VMGKDGf&2K8X$N-pJ[jUEHR-,2Yd4Gpaqq0eXrA30c-H#"Kl! +8Pm3-FjYRqQ,&b8*q!IHPV`4-8!M-9QkQYH3D,5`1-RD+ab&IfrF&@UfNrQhA-rJ +42cqG9cC80a+ib6R8S&S#5CZ2f1!V+qY2N!"-,5YkQ[!F-fJd0D&mKehCF+hblpQ +!+H8IAm[m)#BPTa086XAPUL(b0US$d"d*EF1j-j`C6Gq0bI,l'%Li(086[J6J6"M +RMhLCmK#U0qp("TiPYQPVQ@)bc`H6Q&EkQ@$RD)!m9rPDRVNj(iMPm3PD@qeD%IG +XZN3dT6@ITcZJM'%MNmXrM3hCIIN,dB(d-QIGee9Rh-53!2Ua&6A5r3q(i,0@(&U +[3iLbBq$V8%Nd9ppAJ'X)-El+Lr21iZk2p`BC'82)pr`P,UJaT%9[mYX,Xb9N%i0 +''D*9El,$`Ijdb'k51[L#'Ekp9hU'3rf1Tar,CmhMI5[9'cM,"!AB0EMc5ACkZhY +)h1UB+l3D+BqGKmP$4aDZE[lk3L'5!lBSY&J#9,ZGIejr2CP5Akem!$E`Z@iA'N5 +EV,hhU$pleE!S[D0bl33h!PcB%cYQ%[b&j[L25,6[j6rU(BqqTBYQ!0-%S$elD+B +lm*h*0XRhK1HU1P[YC[2Z3I)q!dq9lTel80"l%UMU65&Uii)dYYNPfSMKjBSVc5E ++c80A8fC`rPj%0Z%DfU!NKX[-!M%V@9e9j3ii1Hm+I1bCj"qMjQTdi-$rC#b4BAp +BqN!Mac$@'rPA,kP[m9f+V"hcET'5rTSLC`*Zd2+ab9dX1*()0NmE`(6UfbfiQ*Q +90E4hr[i(8D13!(M%j$9+aXUrrCI'1PpX&#`@f62PMhkrc&h1F[TR4S)&R[XHPS* +lmZR6lYZUi3T1F-UC9"MV)lad[-('Y!dFI59lQ+d*lCr2'E58Dkj@`mFYm$qH#TH +HEJmVDf)8-frB996!dqqXqFmp&DVCGAA)h(GLF'rfRY$aI"Cec+lLKjK""cX$4bG +d`#5503!))BT(PiYPp5NGqJeRJ(TBp#PYp&%K+k3[$IdqKQ*fGh`-+1D%KNji,b4 +$`+#8!M#N+ebmbTE+(ci*NfUKPZr&4hLd9Bm0pNXIGEG[#Q1!DfGI!%Z@R9e6`aY +Qemb,pirbD&3V'jr``SY6BZc'mMbCdVbKX'E%e#'[pfrkFA`)(6Jerj3TpadeNXD +Y(ld$drmcpfN04X6Pk`CN[X0%b@f-!$3H(GQPlq3im*XeICdr2a+q,$($rA'lLZH +Zjhj+q6Ci'"B*(ZF,e'bl#m(&TZTX%6C#d-!Nfh)Fhl@H@MY&4E-rMj!!cfU@PaL +mU6jP6qGDX6VShilLeAN0G42BRIR3kkjlLKp$pqE5Kq'2`C%D9CLG[$bG#"SLrcT +qk3YcLN%6Gr`[AV`l44HPT2A#Hd`@1i@ErC*EKc@JArU!i!2(h#6b@k'3!!MS3i! +e1%h,dXJBe"j!GQZAZ$MRYYGY4+jY++[pEGqPJX%HUf`kF$d&1Ak+f0Smck#&1lb +Fq6B0bZVY9bVDD-4G"*LY%!ZAkqEV8G*5%QYb*(m9f1aj$UU%b3c84+6T4K(43$T +@UK`dIKmd4%36pS4QZl%2%8Q6[6V2JbbS+9AN&(m$Yj[ChVG&Qa3%FIhqj%r*B8B +-l'8[Hk1,$#i9X,h*P+d,i'D4S$mrd-(X-59f3"f9Ic2i4mAI,2Q0Fm*@YlbXkd& +[(VbfYYl[a0K9q2k@Yl@Aki-Hd66FF`)dK%,K48UR23`LRC*$k"1L4D#j0E4&)UN +lr%ehSS,k2cL@b%M`M@0`'ripQ1IDC59FY+"F"V$V@r*TQAFb%D@UArqRU"1IG&0 +)i4(98r3r'GhZR[NT'h(C$$#N9h!31@b#RQI2aZ"[FX5RRFD*)UR4M1$HNMiHe6e +!P!LZ+X2dHqmXdY5dkGR0(V6[F&Ik'm#+P3jlM!"8V"!Z)(p8%-@L0!K'TB6M[)i ++V+)119JPBee%Jp5L3NK*5lIrH`&$(@iGQj5j1IM!ZaiALZCZ8Dd2aJI`h@"lEB, +9kB+b@KekQ@$`CJUbjZF$9LpLpr#ca)*SD)&`)lV&YZ8XDm4#D0EZfCPV##CE%cE +V+1iV3M6-*[m"JR8EIeXeF4MSU8l5l`5U23qI!4dYU+MhNH)2'fS2UHJFV49$YBI +U)Yb'XEK4X%lE#!#YY8UGP6I*q!aT4Q#ZmCXD'2Z@3RCTe9R%a%HX&c-*b"5+`Pj +*TRV(2j'Ch-d$555YlpYQKKcNVBJY&jLQX`E(e@f(+"b4pD8-e'"9L%2S@iV%S%8 +S40qF*,h@!ZIDjMV"rJd-`H[d&j!!D)@AIX@GJbe%XUe'!3Rrb(D%ipipBkk@dFQ +fIe2a,(f,H*(Z08Pl9bLY5UQ`c"iSYh+(9Ib`G+Vf'5fY&[bAI9FhGX"VLF93c2F +RN@"3URPTc"JbR9i!1ISLA"06qLkES+EhEVjCa3'fE6EUMJL$%4[3Tm#PI5p59cA +GSmF%bBRj*fca%X`PBN"af`p&mbXDUjFDc@0S5[r%PYU)V1@"rNU`1a$6rcC`fr[ +-eY6Y(Tec`ABThqJ1!CL$c9ZT**Aj%K,m`Nl4AdZa%R"qr)"'dNC62*)XA+qq(9A +f+Lfk"k"a6SCeIHj%Kl%KrQ*m-c2Iff#+k3YGaq,YN!!-LD9)X#X4Ti"QkrdX[qT +!P*i)KYLfEl0iceTaIC'RmFc@CriiF4j[6K(N@VB%+bR9e2[TbTLqiBh5JGBkl@R +$Q[G"aVYN*%BhV&*CajHcDf%lFIPdV$H-E)llk1AUKA-fXHlF3DL3!*!!fPrL&`M +XL#%ZFTh06Lp,Y'@aeDJM394`Ni%"Vd(c#e$T,VM`FkZ*f)fm+jrI"Faa`E,,#E$ +V3!lEp8D0-JLCc9@F`r6+f1-3eDF59hQ$hGaA1)l"CjldcV(Fib-[cQi)Y!aVa`L +3!+UF46d5HM,c8X%l#rE*Y+HJpX4fX45j!lN*eUGLNTFcmAMbaj!!d@2Le'ke-*h +9r6HhJ&S[@CDD5N[-IRcM839eMePj"eVD[Yb9"0f$900R)q9C*+01*ccc--M5ZK` +`dDk5G8Hi@-jchJB`jIm0E(2Gj10YNSNj*XFi6h(m!jCkLSj4@q#qEL)dEidi[ME +aC$@QrMP23J#PN!3"!!"*!!#aQK%XXmbq6!!!K@N!!+JF!*!$FJ!CU8B!!(Z@!!! +12J#3"!m!6AT6BfKPE@8SBA"`E#"fD@%JBfCY+5l#Y3!!dTC069"b3eG*43%-rj! +%!*!+J!#3"d,"e-EmjHC@`b3*b1L6XLT+U`28-m&$8(6@DdQrEV@&BQMB1B@!4`5 +Z6iXJ-JMp,4F2Z8P-VP&-p*)jqYEIaiGkj3mG05Y6)a`Tk-cp,pq$cHL0%$hbDmb +Rqf(IcrH-SpC(RYZMmh2jIA+fRrI*[bD!e`-Laa4mEH`-jQZGR"QI#N+@0Ab-5ae +hK'90GcfD[h5cMP',(4(k9"Ujf4(VT"`Ff*R5qTIaq`,0@j,-9d)hlLA6Q38J&9F +[#CN'6#&9N!"k2%C3,V&FiG8qC9,'##bXVIq!h@E5Jb,04M4hEp$1Z'3pkH@RL)Q +,THUZ$ZNrG6a)*8NP6"1I3f6A%UG@EiPF,q*-)kT6e&C-1jm20[q$DfY,YHA8h"G +lq,#FRVcL,()pATRpVmABBSS%9XId,9iYZqNhH*6$Qp)ZIPM-QDCQKMP+rX)e5e[ +AJiJLLQ#+#MVCYB+Dr&McRUl(&L"-RHV2Q2EQq2-,`Ka#XZ$-#5jj3ZLXYT12IYq +jhd`C"6aJ)TUcm91+E@&[q3hK+U)H`)%XfDMr5qG,A,-[F8ke(8(Nmq*C5I@j-1S +P-'pcFm1%YSE9H3(jVa&p[EPfLdr(Ijf*lCm)jF[Im@DQPpHfr``$cdF$q)'#A(8 +b''mRrr`C+%5kAjU`e`&h-*&,k`ij#V!*%,Ni0Tif9SKk36Vb,icG3aEEU#JNcj) +)H(4"V1jjS1#bH49GAEpUbYRP%rGQ-[qmp(HmZPcqbYSr%Qp%1k)cF+4&,)!EdA+ +44*LmUfl"6ca)A++hp6$$*aNjqkPQH-C[BJpaZ8ep8I6qd3`K#Ql'VpPVNX9HVN* +),D(ZdIhGIH9,AV3PB`3Zqf'+%#jcNRNEhj4TRJMrF,a4$,9P9+9kA[F6NFp'&*8 +8-`k&ZQ,`f'%"B`6N26@&%AKp(%&0,N5XF(fE26VM!Db#U("hPGk")I83lJSXC4@ +Z%!R3Yj1E+(Gd,Am#b1%i8'HL)&Q8d35$H"I3Pc[,qEL"i[DNJB&kBc%KZdDp'$U +Lh3APP#RAA!$h+E&m'FfNc2"ADPrhH0(cNRH3!!,eQbPbR"arEfiQ%*1Ib)[2(PK +"*c`i)kc$l25CPVkmTZUDd`dirhK(L9J[cG(AQ(+qAFbrr-Y!$XU+MC0(Lf&m([r +Ghdc[iN5DU+0K(FHAc@qJ6X9@pEL!`Nh($YB!jjPbiA2'YT!!0jH%#KKY'r08$$N +RbIL`%E1UF%3GNEi)C5k8Uk`Dpi8Fr!$5ke8'H9KlP@$@KC!!0rFD,6j[3P!,rd$ +3K)B[MmMdPD3[`FJiIjbkd*%Rb'hjMUmS4"$ZqI"MicJ#mb-l16"h@4R"$[EAh5m +K6%G#9$-lGq'dI5C9%$,fLCJ6ZZLdh6r2*I@TL)Gp2$pmKlT2(rAE,Vi"cB@1$cD +%@P4S3Y[f2(mN#X"a0R6fBkqHiL#b(aKa"Y"QmT5HEP[G-)N)5C[c%dFilE[h9Y% +6RNkMH1R8GDiqf&RP6m)im"3hrQQj09C)H3pqGICLa0Y3aiY&Yph"r2TQZ3VkQq6 +AN!"0)BqMJMVND`aJ-214eh&LHmeP4SIR(J'VT[hmeE)J5DH4-Fm0VN34NhFXIQd +[L!mb+i)1R)ffJib8$LXrXTfe'(VXPpUE2T1'h,hkA9hD)@DjYI-"HS46XU[["rY +(f![LK*iRD*5VLdVkm0bJErQ(E*,T'818DN`DcMNrYZIXNd9X48Hb39T[pE[6FKE +@&2'MbdDmANc$laPQ$#2kj2`h"#`5VE*k$G%$d([VpE"X'[q4qS"-Xr(NCd'GEeT +Ae'p,D*9VfJ&Yc'IZLD!BcU#hU2!rRG8XDpU`PTCSi(F4S`9"kaMMkFZ-X[DfUY% +RZB(aeR2dac39FEF(+'HM$TZ")Z"0f$#YlF)1jSE))8Y25GD[V*G*GeFjKEU#N!# +2A$9-bSEA&8!A!mh5*UBM9r'iKDXJe@"R54!d[XRiP!,rLMRNZBVBT)ZpejEI"l2 +4jJbU6k4[,l#$(&3NJE#R*Nh'Var)Naqa1+%EDF6lEHSi,K@6@H2PML*cHR(KLG( +4Z-f0r2RbldEBL4VpHQSUD)+`Y+RSacM2LmJk1R)rdSSTV[Mp)IpCeNEU,[+$,R% +&@Jf25ESTV6(faLK#Z(F2lYHIfUBp@Cr4bmNkRD@`J0$QAK!K%,+q3!r!"eeRP[R +bd[jA"QQl"J*"&J!653M`TFHaL#Hq19q(*Xe@%kb&8L&F$)5b*Z2Tf*K+(h#i-*d +MP!h(UHHd"ArhhGkEVfC[`%XadZPk&TaaCK4Gc0EdBkG3hQ28&!eDM$r@IK@k[pG +@-[J%6bdff[@L,Pc2FVMeL4Br,8X)HqVH8pCLP`9Ar['")j!!%Zh'3m+Z2*S(j!f +,bb!(GY"RB[mM+`j48!*"YJepLRj()b`pq*mk2RhE0FM*6[jFQ1pi*U+bB!Sh%@8 +jpUb,b*@&c4f#i@HHrml4mm-0peQX1I#aMZd!`(brVR6kAi&U#G08*[#hUeJSDFE +`P`T`+PJfHm$RfqpT)!1Y(l3))8YX$Abq#im,Hq8@M`FZ5YMNl$5XaG)jcY`[lNh +#*h6k!e"6e1[RJ`DL%`3T+fS0-&BfA$4eYmj$A*!!qr1Xb`cFqPIbK[0RMB4ZXBJ +m`$k[1#YN8NUDU%*L58SiD3rd,,)(FA'#"&*,QjK[JdaUMJpDUN`eVc"JTYmAfYJ +QRS06aB6HXDCdh"[GqShf4Rp)$(!mQjpMM'5#j!KTfqUN@iAaal1@V-S@+*mmaQZ +CdIf[Ph&f@UH%bhT*Q!Fc"2P`B!"ElH5CRb,QSX!'B2&@)52e`Acph68+8a8a3bQ +p!m+MB#E[pR1BNhh(RfJh#f-9QU(ShI)S3*42FrL0!R$JN!"IG0l,!hMdXQPQ,Rk +CMp%Cd6iN1N'[j2ah[!K1S`*eML&Qf!FjSXD4dKHdEaR&al#SNAJ9G5H+ZHXAXU9 +he0-8YJY656JDVP-[Ech%9`C&[pBG-2XrKHDMR`KeNV9HpcV'IS`Y-ZQ1Fm&TXFL +`E[elZ,$%Up,,r-9R0VPpRMeUFY*2pdf-#-m@Amllp#2mU)f$Cl["0[(h-+4[$%` +pmpl9cLcelK'[YA2r`F+3!&b1qJ*Z"r"iTq-r)f&-alTPpjA5G6TV4[YBQhH`A56 +i,E8IA1ZC0C4"p,i+RP%M3-bG[lIlkV[IBGN#lqcj(i*cp[NVC9q1mG+S&eKbjM8 +)FEP(M*Ld@pk#fri5'qqI0E")YeIkbE)KG"a#rK6bDC6dXN1A*p5)DQHchXBILiq +%p@i[',AQmC!!+,hQh`VZ(Ze*KGK()$Ua*50#il#Qp`f8kr4mJ[jSKN+LQ2e%G`i +I+0!dVcY#qc'bdqbEaMG$dJjF51VCXq-ShiI)ji[`(V1E*C4MIqa@SNmi5PjE6+2 ++ke&UhYZc0$*%ThU1`Vj6@*("MJ&iZm-Qi"V!CVfZZG%IK(eIdYh0ZrS!V&!5cRp +&96"KYKFBJd)ZZ9SRSDMb8EGLcG8@!aC&mIT+JITL2@9h&-"06cBaZFXRAhCVj,) +#R-&r%U*&1LUbdPq#Gjf#NPjhjAj%!l'[bN8TYqGPZq1V,ml`'#VR#Qr(k60(1f% +!VdG+2m'BP81!2QRVPH92KqE6aD6AQRN1L$+RhFQK&Yar-J&DU*DaBj6Dm1k'3Fa +N(QJkmcj91Q$EJm$hT4hl44-V"Qd`5iqR,CGXaL-,)he,8pF@Q@Qkq2Ki*663-,h +,-d!!RDIpHiGBMEYp'*Zc9"pGD&B`b(dB"`H#Cpl0Q+,82G5KAqBDf##GX%ApaJF +LLlLAZH$XaN4T4G%L3@1$T`QM&JI"3TJIr#q0I-d(rVAYZiN!8jliCd[[DH*UAkb +)kG5Tc*rSh9(,G&+H"KFhAilKIDM"D2`d*[#Tf,CTd6RBE4drA)9J[Ef%0cYND-, +&#9q)ekT2rHLk$"pdZhRjfM5d1B'CIUU5Dqd9hXJUKK5HjZa+ShGL)fh@ca`88'& +M%$l$[0rlId%1lRpYHc9eE!Z-ZYV&QeBP,4U16)Q5N@Q3!$dNRZL91UU6VD24*pT +jYLi`iXEKTb"3A)eS&0Qf+Ch-i5*TV%f-SJ2`c4P2[r%DJi!DSf2#'FJC2MIIQSh +YQPB`2#SpBKD!HQGKejLfIDA5F`S416@bpRC1'M@f1,JqXR$l3fR!+UG1L'Qrm0U +0S-(IZE6@p9FP3iNpBh-0QQ-)6j32'e`8P+RJ%MPhK2r2iHD2r3UQ009U@@kaUU1 +dR1Plm3*Ud6b4[PAU%QmiGYM+$#ZrDq9rjac#JibK+CJTk,i'CN([cUf3!"M*9#X +iq9aP6G-R5fIcF4pH8)$0mNK,c"CD+K(6!dcXDc4Z)rBjY9#qa-SJE#l[HMG[hr8 +6TlefpV2hQb4LV'06rCPpLH"$NQb#RI-PAAd5J6XHRkb4E'6be9ZENMR5dT1Cr-K +V(`9C"L[HbXG1YYc&BcI(QM&%)V@G!Yd43&M!ZNX@NQQ9D51-Tei34$rQ!qPZ6[& +KiM8R1qXFrPZ(l&!Kh(8@DYQ$,QDl6mi(6mZ63bL6QAP6FbG[0",kJSk0ARhPE6c +CXA&#0&GA+%1lAK4G#L8SNffl"@'F4Qq-VEeDPi"ibJb0TjdK3eZRkFl#'KSEV1a +Km-c8YE2&%KF38"-i-j*3R8B-V"Q3!"-$Te21+r5i5c)fH'pTe"[$FPI5b53PdM- +ppA3IhjN8j%)I`C!!8&EMd@84NJld)6LqrrKIAUGL"1RcQbV"09NFV4-S,f8M(q" +6IpcirajI*H5%EQ6D"Z%305DL8UA2bmbaiT',EB-ELEGQ8U0Ph"`SfD225lN[cbQ +b541VLdKAV*&)BZ+Q+L+(+3jQLN+c0fKj,kmYbHhfJb+Y+Va%KEjZ0GVrd"9ka(P +mGYR-1206[bjj3P0FE13$rDT-1)#PN!3"!!"%!!#aQK$%XdBU)`!!QA%!!,B&!*! +$FJ!8EfS!!(D5!!!0J3#3"!m!6AT6BfKPE@8SBfCY+5j`F'-Z`V8!!0+@68e3FN0 +A588"$2q3"!#3#S!!N!G#`G6V%b#2F2L5N8JN33KpVRp4EXQNfL0"DJ#Dbm0(ce, +L6SG&T6!TqGR"feeX1`#DL`%%2aVKZE5-'Ief-,MT(Ha'M-Q,3KKT"8SGQX4+MhK +M!&jZ,Qk0*kb11pbqD8!XYLNkmY"'klVZJ6YHE8),1D$)p-hLN!#cI(b+,F5!IqX +e%$TGT%cA[E['qaGG@$Gf,BFBX!-m!XY4I9@M%6T@QCe1R4YZb`XAq(A@db,mPXl +5mNic9dER#NK,B4[ljDePB-,cj%S(pkPjS1hTaL,lf@(G8pI)IjJjcBVLX#JL2aL +hS+f)0XQ'M9%h[[ZS!8d*fL60I3e"1++BpNSP35$b5d-mINUi(BD1"SAA55mN1Sr +#U%q5eSUkFpamMX28+$fm3ZDiqe3JZG8B[9U3!2K4ZASVh!#lR34l-#qQU)U9%H* +I2B'l@N3$TKP6m8[1Aphj%K05&EA9`r4'!'V!j9&'4E)ZY)L!cp2-A-9"""6TiSf +4N!!@K%-@Ca*%2+d$-bL!`HKjrSXASLQ',l!&+Sa[#h3J`%ajFf+qRafI9Cj8GU, +k`),JDVBT[X4fGS(rCDQ(-JAA"Y4$Re&'2H6c1bTiVp`5[066I3RN&P4-0+ch8JR +@DXK)C1G6400Hb$J"2,'Y6+0E3VTSKF!C#`1KFdVS5#lDQI@3!1,Dmrr8S4kPNZJ +QjlMHPVB(PVh2283eph@DXq&2`bJCAUTZFG&"bU!()f6apP1%Qj-pel35l5$aPb' +d#G5#(@p*4KR,k9mcMDcSV6`mBleMaV)!RJHV&3h@!EC!f@!LlNafAf5)CH63Sr[ +HkK1@(Fc%$qRmHGa8a@*E!BhV#cU)p'dUjPVj,(Y3jL#i&1!(hq%,[69iRJT[cA, +QT,fD2fVS6SZ9jm'jbriQM04((q+R26#H`#CA5+(M8@%2mXdJ!eIMF6ICRTp[K'j +&rfHEK$TH6&GZSl[,9YR*6H3!#IeT5IFTkmbRI,$!VV,qh!-Ff&5bXBG%#%9,4DD +%FhRS)8p19#cBREdi3KjM8@#l1Ne#S[$%19#5kIajjSF%e6AK6-*0KYY4a&c4q`q +eEZH0Le9IKcQ6-4Ndl*iZ4cdMXjdQhBd6bX!rM@LM6+@6lV$!kJAY#NG4SkiM`Qk +A+5IcBZSGSZI+,fJmpL2Sm*j@M9K`(@855K$Bh3IjBha@SZV#G&PLMS2XP@0-+T& +1@d1F+lqdlfN@Ke02&ap%!(@Il&&aFcq1$AABGkI!U!5)[A06GN"D,ADbl#Fh*E! +&TbL+!QlCGBce!pR`16%j"Ij[115RUf5JN!"bEK&I4Q`eVA15K#3eTH4[fZ1eZ,I +!"h@K%+'9q#R5#%"TR+@#'El8@P-3BA-HqYZF52A9(AGlbPX%bdEAPf"RIa*Lm+4 +(2HkBl"`%,cjZ0aed"$C&HC6GKeZC2pC)hrV(9,4mbkd[4e1`#Y5&E6VFL3$C-2U +aD#RKX5GMP3HXVM@LdLHrh)iQR$4mkelKB`M'XcL@&!29hicp-j`Rb3KD)FHGI%& +lP6p"Bm-68YrX@pIE9@0M9R@(N!",CpN#G2rVU*&SHZRBClVPPNQ@qD8T@!ai8YF +11d&pYl`h6r-Ra0IdciGH$k1%%'C(BLmacM58mjicm%UV'mGmD89p-*l&G-qE[h2 +CFCdlMMHQD3p1%&lGb6Y#ST39+CbT@fTdrT-5G,e@@RdSBZMG@+BKM8PYl%H"6XE +0*[@J!kb0LQA5m8hZ1K(+jAeKjMD1fre@$mrpi*D`h%96$H6eQQrN8UV2@PN5MFa +DAN%XA"5QpGa'3N`eeI93d#!aIiEQll'Vf#6aG(q9d0fDQQkPQrpBGC-HAJp53r2 +PVTr4+102j[q#EkFUV'ZXPP&iR,RpTqhGCU4Gk(ERH4-P*'ZNGML"3)fPq%pNU`V +FN!$#$S2'C8d&"N4AJ2!m9J'AD2,ZhEVE5k5Sc&96JZ)Jhd`Q&$0(ZrC5A%M0&!` +b(S1`2SYr69m91Y8[fHD&pECdhFr!8*FEjS"5`L,h)T(e`F0['4`MI5TXN!#ma)! +Df%rcKd@-2jXcljIeYQTE2Dm$1ArNl&Ri@1QD`)"5Q@'+8j(NS*6$Xp'b0Ih2*!@ +Q%efh!*'@8i#$rHDU9Jr["TC,AqTC$*2TlS)dkJiCC3DbcRhT&UUqPX[b2Ik(XcP +e)d$%0P)(-FqZY%b6d,m4bq'&`Z1%%N9Rj%e&-RiYTVBaYeN)Yl#D-qkFa'L9D(e +Jd5Um'M-b0F0DL(#5BFbP0DRfHGPfQEDk'8$-3qPD'JHpe1QqBbfmBUK`*HHGQ#2 +P')LMY9C3SQ#TIfrm$R"h83[C&Tk'GXUV2Cj4+$cqVdj`HeH5G@GpXVN0-d9IMc@ +YbU@[b&G!HL8B,H)HEU!6&bQ$KHB1jTN-pXFSTdlf%Ljj0qPa-62P+pL3!#8aLZ- +a+C2,*IIY@Y#qqlb#pL3N[Ul3QT4*+@'3!%dY+5!1hH,Lhj1ZKl$'4AB06Zej(R) +@UR$N@#h1r6)K"XeGHJPE4T33YBAImbH,aRrX'r"jX*hqE+N8(P'M20THc50JlD@ +)j@Fpqk42T#j*k!TS3-*+BBM)JUrYlpZ0p#*-Q(HS$Lb!"Bj+J()3K1r9AdbAa8V +p#`Bqep'kG--,Z'q"H3p@k4h@2EM2!A*Kb%mLaIfGi-q"j!aUrjl8GVZ"22PX%[m +,@lpqQ!Qa'@cZM0*-JMI1Haa@R*MjflYM)#,&m`Z0jB-GaAf+VaCS94d1,CjR9-q +ka"9*RfqD4)&S52epcJ9"H5%!P'GQJemrBB&NqfU2SBJDBhjPhG`fGFhVi'B92!V +$qeL1JS-eI1RhcL5fNE"SCKcMa+Rp$GV[j4@LM&Hbh$c)f`dQCe2L9Jqac#8&628 +@lir-aRE"6HR1j$&i[NXZVTqk,l-1DffTViCGa9%2mS+'HY$[5Fr0YSTCU'c@"2C +bSNe%VPk)1KaJH#T#c'e&)Rb4%@4c(N*@ND`&d@[K+Y,&qpXa%8!l'B62YQaShGm +mm+Sf$q#dHhBD`H%ZPk11B%,ANZ4SH4[X)K`L[&ea`9DkmN%E#1b#4F8(Y26HBXD +CRIdDQ@HCk%`h1K8fc,%qk(rr1Y(eeJ5`&A`$%UmMY,'l9`D9%3B'+h,%`XKEI8l +Adq!VG9!YV4fb$2L5bS$qaf8VQDSLrT9m25Rb6r#bbaHHT2qAdakN@@ThJS5rXVh +1#IaXV+85$SINB@ZL6d6pR()('r0688!fXlMKf3-alqbLEhH&bTdY`Cd3XUmNh,K +i#ej%I6'jQIc`cNrK&3(q6c$XH[SVi%pq221cVLdcR2fk[[,Y#0bkV5+ESL3d'LR +IjZCK[eeU-kqTV-X(N52I`lVT8TVU9PhZYFSFS0PR)Bm-'1V-38`q9T)QIbk&Cbb +[G"hBZ$6RH606I9dMFrq1&m5ZRaVIc"GSKF"D9TYkbr[E*G8HCV&Hf*0pYCBYJXQ +K#q-3"LY@dUk$@r-&f#8(CmG#qV,"FQH+pqJ$#@2ac*9eN3$QdK(8*0S$@(ULpDT +I#djI#q8`qIcjLjR9q*FL4ej,jQGDm"qLRVf5HrH*q9D!L#M9hN*$k891Z4#DDh- +GXc8'N!!Ah'60*55-T*PYA5rQ&XV++)H+$5UZc!0V6"Y-U0k(Vq$6"eQEM6epFF@ +Rk9!+jhiIdPmjXHXQjU)Z@VI*!i,K3e+N4!D4UZlr[eE#Uc,[6T1LY@L'-ii&ZbZ +k2E-Nq(iJAY4SLK%ffQ9$U%QUJE"LK1@f&Y*3VbJ$eMQQSGPJ-Ei&Y@S2)Q5E,0! +QVma!`3BI-q,'`4I1l"XX90#-l8i%ieTM``X+HRhQH,(F'h8(TY1qMLR[UY6G1#Y +BrHS)LNFDTMhqDKrfZ+pDUDG*C%$K*)L#6"USEIXZMVG&(3F21fm39Zp5"KLAa@U +c9(T!PGrU+&iNf2YXE@fN5qqGGN9"!3d)6elLrY8!9fXM@-c`KZ+IBd%D('8k)rA +rHeFSUc10R[4kA`i'K$@aAeK16&)IRA1N9[-NM,+&Gpja%,S*q!a%p)V1Qbe`'eU +V,AfUkVBR42'IYLPmHD`39MM2aKS1)jITbaeqFQrTG9FEDNIf%3j4%X"QD9fq4%i +Nlfp4i,KJ`Ff,+SN5G(ai(R22Vm9@c1[hJ@02+6h9+0NiJ$-V#iF0m@1,+YK$afL ++J38Jb9+K8(!L1A%YTHR!%e#ZN!!dLFVm%Z#[K1*J+RLY3dA*bc#$A!FpcH5k1)4 +r3h,2MNB(ZkFV`!R0!0"kEJCG)4FiQF$kB+9,PkY"dUDJQI%m%Ii6mK'`+lM6XM9 +hdYZ4lB,qGiE44@!FRbpc(jqT)[j3-DEF22dpB`(*M+*063T[-ViqKd!pJmhMbSb +FR+)RlH'mK[VdM-'I'c[[I8DV5b*@J1S`3i$D%biRHd@d#l'jBNU[Sqi'E`I#"$Z +@11mL,@cSR+eR`EmrT2J"QN!lbb02chl+%5bFDd"M)Kq10aA4HDIM&*hUeLSm-BJ +lM"lJ+$ICM``$&fL9LS9jSUYF-6%hf@K@aEHRZc5G*V&M4X&,JS1R*L*Pkb$0%NI +Z`MHk0a6f0`1fb9h6Kje(8HLCRM98!barT`eDR'(MrkeQNadS#5@j3R"E2kp"VbA +pfIM3KM69#%eDYK##%!(hU'pdLGHkdi"#HXJ!TC!%!3!!43!!XCS36E0%Nem!!+J +F!!$%0!#3!h)!&4MS!!"jpJ!!$FB!N!32!%ek8f0SC@eP+'0QE5XT,R"`Bbl#Y3! +!dTC069"b3eG*43%-rj!%!*!+J!#3"d,"e4ZeC4"YdTdk'm!9IqTK#JGm@3'SF3L +63Bm"K"TBNUY(fk&9IK*F"6l*E2DYQKc&U!2jEfp8V,K'+&LjNEc`1E&([QVbHiM +Pl4A0ii(!Q+mLhZRZ!NiL8)f[EdXEa!2rLRKfHj3"h%[aj@!Z&[`ZFMMB88EhFJ& +&6(1QeqfKdMMb#3%Q,6dMm,H6H64am&#"C4N$YrCiUVPqGc5AP'Uj`UF%Vlb&3Y# +J9!E(*kP+iqa`dBULfH3p4['CkekeC%8"[#,4-bM92B(RHD'(&&P22j(6+KZYd[j +3GV51Zf#c%D)rD&2C%G0H8"%lM-T-UV-mRQfkhPj)QU+dJKf-Bf!,@HT@rM-0TS" +@bRK&p)lrGq)XASQfkYDf20lJ4ZY-$D&#V(GKQ6["qBJJIFB&[SDr1(hb&0R3,98 +Ffj05MG06MKr!riSe86e0Z[C)-dr5EL4GjJ@R'C!!UqeMme+(*eSSJeZ+l0jr(Gc +[cDIk!JFaU$3dp@',J-Q+89KaZ'8i"UNTa0kTd66HkkAlIEHDC9rh*$5UM!RLH5a +8XfKmUqFbA#-b,-H"TcQBD2l[lBd,M32%($pG"%RYPk"EfTUbL(ehA!flPLd@IaS +39&EFeHPF(**dm0KM1$[d&c(%"KD-01#k1RUabYQe0l4Va$CiYNpL@I,!2NkfCFL +cMf9&Nl6[5`V(&)KA5cQ5I+%a0DElD98,JRp6"*bDFXA$[,2riiVBFqIV%kBFER` +C@C,0QZJTeIp9``&SFrVi,)DBa*X3$12YMVJHm#hTX&kqmRJeBM$$LAebV`1Z`AX +I"je'Z1KS$eU[N!!9+TJYlIfKFI9Sl&TF,J`3C9m-bBBZT`k3!0VTpKQe"cJGqaL +*@6JccMbqFqp'ia!I$Pp*)ZS%DkaI%chCqNB6@69[P"3M09V`[#Q,)DUHY$kCAd9 +*UF3Mbqi4Gcj8@e`N3bmIV3N"C$fMmAQqKja8)kcm-Y-5*+5$aU6b)#4BJ!jf"4+ +0bKSGX%,fF!%b$K%"ZQ#kqrbESe,JQ%`SUQ3'PXh8kiX,emSEmpSh0rRS3EADM`d +%$q0ADc0$"U1(b[9p1dVkjjcF+iRcG-c6,ab5hMPFC1%PP`iLAC4[,SB46rjGmR" +P!Yb#&f9YT0ic8e16N!"ah$8%&q5EfJ"DS'jAU(@,0hi)P+ap(DV$c,%IC6bVDGq +lDm!8Ia5dARS!DQfmI)[9UZ!!&bN4X0IE"!TaFN[*@&H1Ni@r`TMHKMMrKF90TaJ +C9cL'qZ%pRjrH0[9M2mQ'YQJd-2!+4GLD&l8c&RqS1fIVLYa+JiZMT'e24qP,R"1 +J!HRVII3MZ1A)1pi0(C8(cJ(lE1TpN8El(DZXCbY5dTdb+*1'4iqp0Kl%3*EbdZm +Q2cAIbRDM`h+X)rrUU4iAY)Z*(riGa`'()Q)K1&F0GLDZi!#[0rC1AY2AjXY26fA +B&kFICamU"4Fe,&`acU0!i5bf&JN#dbdM(P0G@DpTFrSc*Q2!e(+Yk$6kH2Pd94Z +[A#qcL)rRF%#PT$D+%C!!',M-+P5(fE-Cpfp&4SN)ed"8#PQ(F**)1%,1rChNqXY +!mJ$',Pr*9A4B"QL#"RLNcRpR2&a9UC,U0a1L(AI9m2fY$l8b6QP'PXq&"4&XAKj +Q`)"IFHVZ!ALcHbLjYZmN,-L1bfB!-I)46M&pN!!clm3k`!aLpVpEH+H&"hMU)(C +i1e@FkBdCDdid#$TeT*JhHl[$)q-cphcPM5J`FRcd%B5S60fr62kp1&DUGd2VDr# +ckF%FbX"IDQZDdU9[C$kl204r8(Xqce[%l#N9`2NUC%)A4kd+1(4NJBfhD35&NSI +5[kMX*!#+LN4%+qMq8)TB*mAkAC&Q'&NZcGmE2eUHZdKpm9qI*S8SCGCXLf&EY@& +Ej*FSC[5HKpqpd(i"D"TLrYN1("Hp#C5)S)FcLl2&4i%SCQPdNd%Tk,Y25rR(9dD +i1T3Q-j3jKKdkbH-JKEbp2L(8RZGFf`K,16jUQ*IL$+j5UrGj!G((QA@YrjT6JeM +Gk45&4"-'mDUCr(Hd$Jm1Gkdqj-()QH#N*#ACd!NC*$K&SYa@La)%cpCje-eQX1K +L*1F6-H"+JTQpHP'"Ir,a9Q*`'XPR*rc4JAGJPlMb1p$#6UHNeAI$DCSrRN&'qDP +kU"e1Gj!!')Nmd%!P3IaNLhkib8(*e8AYf%#%JH`EraUKk,0V(9,PC20f0@[MSZX +C)D&DQY6lU8R32m#&AqqI'IKqk[63lV&Fd85(mar$[V#1d*K4qL(k3khK&a6-4`K +K1RkDH'BR0(QQm%5M@(Sdr-`+pVGUjL,RBQmVQTN,P%(jSh%`F`MASm4`N!"0dr` +dKN$UPDiH332ULPB8NM+`pfqM49@A2kA$ia"kplS+#hJfIG8X%k`R"1L64Ef561K +&jBI+S#Scq[a2BD)c#U@%5QURZ6,Zh-`0#pTRVjXY0qS2p@ZYqm1Ra9pBEPN"Yd2 +Z-h@q%P5#M+Z2kJQU&i-"h-MUhaXGZ&,R*(13!!0i,b@kMe04mX3Y3HfkU*L5$+L +),eKE+p1DII4G)edaEMdqp)Q%$HiYI1H0SY'Fj(9H-0DX4aN#E*[X5f`dj@KrdN( +%HA)I%BekeUS[m!90'h3FT)dq1Kl$lRceB&j24V6E2ZEpq[bi$dI!PZ)F,NYH0JT +`8ASKfLEmT@)5AB`B&frdF[3&S$VYk@"fLp-+R$[%Nk@'AmaC@I,hcl2rXDmZ#Xh +BNl*+%rj3HpIYLBc@%mXX6ZTVUNJLdA[Q[&5#Q[4,#P)b)Pl"(`"(0(h1&PIdV)! +)1ARQ"ff%kekN8Z8qD%(9QcIpV2K1!TS!hbJ2"+UTm3`3F!RYAE#GjrZM6dAb4ch +DF@Y`Gc`5a!CcCr+H'GrfhAHTc15U+2j5YMFRK(@qhT',JD20JDJJr@S5IkJLD*A +`[,mJYf3p6G$*e!f(Ba3ZK`dSP*kJZdQCfedCBhQKSca$*XAJPY)9IE-UaiFI0%K +K&!%AKCU4qL4eK"R[rX,f`LfEh*EbaC)`TIH('PdlbN3&qeXXF66$$UF+LMjELH$ +P'"(mEKHKVR5I&L9@EkF`h6-[KCM+Cde[5e(9Y#"1Z(NfF&@CQ"Q@DF0&3`VqdLc +jC,91V#pfb)46,aLei6)dm#G@G$9#ZHImIplU%L&PXP[QG+mNG[++2lR1NC-Vbef +#@MqjM8MGS,m"-NIeUU3F%89Q%br,X1R!r1")Gph&i)iB+iJ9DH+cK[8!*XZeCac +,U%$p'C*"33b`@TqZGJ1M%`M`a8l+1K3k[G(Lh!U))KiM$@5ji2,&#i09'4KZelU +IVTLqm-dAIhK9[X&0Fc%C%C4U$jF(-eHCG+M%Hb[a@hk+dmME*84ZlMA[CphEX'I +YACeQkADCZiiX4TiM+eY4YiJFV9K"#LRdP'NcE%$$XBh#%HDeE1fV[15NA86cS[! +$l#@X-9VDE#RQUJ#V-(Tm*pE#L@6Qf(c"EQ3ApdGC82&e!2pV,ak[A,VcR&$R)E9 +BT@4hIef3!*[B3644B+q9chFNI5TJlBfdV5([YG4FVaeD2D'3!p(Nc8(m$G81'L[ +30%eDJ94drB54I@jkN6#Z%3@1PlqmlQ$C9,U%d6UC%KSpIYS&Af'Amab3!'dik,C +(E8fQq([XV`I#X214RF')0-RFYKQm!rEP9@@6Ub+amTXM1c"ki5JX!P3bXHem%,j +6X9-k*i(P0BX*ac!efcS$M`XKC$1AVAaD0+aeHdkeCbj`b(I8mDQ5,@`!cc@P)29 +8EfG3al)J(4YZjr+,9i%B%Xiq!6*JK[8'U1"Rk9+D3Kq8%ET'iC)1r9M`e005k-f +,[Jdf6i3A*'@Hh+0FG8b@b5r"qi2VpbPeTIG6668N9RRIf'8rI1e4fdY9r@[[jUe +&F'-XA3%2C5@Jf5eEjbM,'fBcGLb)B)qre5aAKT1-fRqQC+SSF')Zdq3Na6Q*-ci +"H`CK3rD[*YPHUk3bcEUT,fX!&@9JJ'h-&D!G2#%`RG+%M28ZlC&Tjd&2kXa8SL# +D``U`pJjYC'2#$LqMc1l56E1(9Y)'0jbBG*mHhV`jl!FCY6hpPTBfXhD3!1@,3D5 +SH4L&mPpYR(ZGQ#l,jhj+cCQC@GC!RdZNkc&rBI%i(#@&!YMqFSPrUAHpBX(b3K+ +fI[XR3M)YA,+hP9k8hm-Z6[#dJmh#GppH"DfPGhd45V![H"$k3Te`0!q"!"e26c6 +Ed1X@A!J'0&VIDpZG36`%Ji[(TjIC(6ImNa6,GXE-Am0Yhf5*U9'+-)JK6J2dAlF +bIZHRVJ9a#`dkYerja%!08qdNA10!++6BTH@K$rbD&b@GJINV44crJm#J+C8`#Kk +5@GP'9,K$8D1Vaaj`T(p'JlLlpm6EUZPLRC[jZ!8IbkUj0`53!)K$qJ4eAY[$mSE +jA@CFP!YjAm9MpVE9)'E5i1i5ZT4X0f%a20kCG9+1%H%)!f*Z8h("Rf'eS&5A%mI +DPk@'#"G*22'[[b1jdUl3#[dD0cJ[4&XAl6)M+,cl+(b('*2*rE+"V$mZL"P3'bm +VQ5j)038,NQpS[ER9&M"XeI*H$jdYHLN+LiK86Bc`T%VYPeC,3TbX8hXE9XeX'Pk +-fhmj&AQ5QC9dQUHlj+jUbXI'ELh9`dA6AT'+X,Hl1DMIH12%kJld4RJDDUNl%,Z +TZ+b$6h3U@9`F#4ebq#HL9`[$"BjrHdkDmDRjA)HYJ@-IP38)m#3D*Uh1%Y*bRVR +Nai!,[@)E*8B!TC!%!3!!33!!XC4qEV94Rfi!!,B&!!$ChJ#3!h)!%8QU!!$Rm`! +!&88!N!32!%ek8f0SC@eP+'aTBLNZE@0`!!$5PNe08(*$9dP&!3crN!3!N!U!!*! +(3X(9(92mcJ%51%'XbhrEM'pBP3SD9!'k8YVX##k&EjF8'JDRh[,#"%h5#Rrpa4i +8q%%0U1ZdAV8IrQPiLrUMRL*h,U'QQ(#!!8%I5V!N$heP3Gk[L$f9PaFKpJ0GZ#J +piCq++!,qFdZ3!*!!,Ga0)4f(NY4NL51cArJ#),IX[hkhI@6Pq8P!Y#jR5SI8B3S +9p!4$'*QGeR+B)LPRAe#D[P`XQCIVd[6$Y%IrkF+RSad[Y)#$VM`RB3U#V2[@YCr +Tb#K"D3dm2I#K"j!!ADl,#IUNV)ffp$6)"A'i$fl(*8Nk&3iZ9rc%hI-A4PaKBZ8 +D&,RI1`,QY'T0)T,`)b$NbL-pSiX#--K4CQ'3!k!@$Y"jb6EK)%4aMq"FLU5h1@Q +Jr,#M0D"BX!i#JUm%H['"jjfcib""-&9Fdp0m(cjZEJi6i[T+ZiQI'ZUM&EbBD+L +ICC'Nrp4h3,'P$,b03PHX$Qmj1m[0VN#e+dHJehEA8*qG%29+@D1j5LKM(peflSb +(YmDSDYjIZ*hbUkMF%aBNbfqG&XN`d9el#6%P(A#DeCaG0*`NYpCkU2CpUDj8[M@ +[Id50'#XD`Dk%$9G()(2H5XaRX6VikaXVERSFFTcJY4U6jAVmRhX'kM4e%X69U9X +aeF2#Yq[kH3`Eb5-lI'F(54K##,,%"ce,SV'b*Z,H+r9TL#(%RmErb-Z(qJNJ[I9 +XdqFriB9QcrcVSKi-p4'PSajlX&-JHIDq""3#d"dNe'cS"*VPH43MM9Mal[aUEhQ +jMrTPA$%D8lra+1K(!JEG66,dYbqAE-%e$0EkC8AH9aHHiK%-NCbG@)M-HMjrqGS +IRQJk$,B4$NC$j$kaGX(!RQK%KJGiLeNU8*VUed5chT!!b35*ePXXIX)XMq8kmD9 +)SfL2-q(iNCIh+@X-CEcLiBBIhTe'kUm)B59[Jb0B('[S12I2IC'(3f39,Y'KlS5 +SXd%c0V-EP46KqH$J5e&4qZLeNb@!%@beI`)#I(3$(Z3)1jL8RE(VCRXdI+f$d`6 +eAYS4S4hPPrTh#SS$8!hm#lb4Q(1*XV#LapARi'SVScV2Bj4(IXp@F'epM`"aVDX +m8VAQqp"(23&D0F+`N6VVqaTYXK)#pZ$BZ"RX6,HDrGPadK%hIlcdbJ)M''TPiB- +6FE*'NPLb$2I-MBGSYYMXNjdbGJT[B@P6r6*0pN"9C-209lJEfLU)eUae4dceYki +YeK0d016@C(@TRT!!p1aDU#cehX9TI[q'N!$Ja-hdp3%X'-R68Kc@fJN9CGD(e1E +Y,"NR[`(aM1aPSmE[XcAIZPerR,K40r-bdZrC0GkjH9ap$%qRfmlTaklFf9q4K*R +`jJ0DeL25)"NJ)lqM9bAMri*fX[pmr,L"BkXb2l@"Y2XrZb5lGKB'Pb0FZC&4ZVc +b3K1NG9+icSRT-emi&KrV&0,3dlkThMcC+)Amj3'fqCSXPerV,D)ie8Mh9BNU6!8 +9r8ecB3@Z'm)"c4Da")*ci@he-5G4KQAQE%5V"'i8+"YK*KMUV*d9a6*NYTeC3qH +)L9(lm2R8YXFe$G'*L[*Y&YTj$2b0@4M1N!"SG&TIF9@fGNR+am!Jr4K,$KRVI4G +RN!$!h)M3hTah!QqYak'N@i%Vi'R$,Yd02N[0Tk(S`D+(2V"@["l2A2'L03'l*X" +-2jX[k')PAX2$b+J5'V@mZ@%i+DPXp[Z@G+N!%AjIhDfJqekH8eTBhbpY0cS+R6E ++LqMr8@0ah%cdL-E#E-'!QFii&jJI8Uc$!@NBCiImD`cq1ED'D(EBQLXp,MDBi0+ +N48P)$$CbCMPC((C"mH3@'!I+bhJI'Mil$G2rRlm1RrNYLNMPZkiTb,%+%V5fe$V +@8L@[#cjNrrHE@BV32(5K+q82RkkRYCYee'D3!-cQ0`-pMZ05Q30khceKK0PXrT@ +#bT8PQ+r8fP%LT)VR6#CK9Ccjmhh'SE#'RY%d$`VdSr1c*F1!LJ9P6F#LE)1FHK% +A64jqZf(q!HTKFq0c)A8d3A"433G5rqJl+DH59C&FC1`3FCM)r)'af2#U3@8cT$l +2pKrjKd"HJ-b,["$,0`(0Ye-!16pEE`)db5*DJ'NS4QBB!qAIl!cVPqY[X4h+Z*Q +4(25q#r-i'Yq!B"$P`U-(CF$9Ai@c@lZFp6k+89-()-VY[em+8U#)f9'9aM2IZ4e +ah`(aSLNJ(LJp-BMCdr&fd'L#PP,bMdA%YXU'815264braFbr1G2l@h2bE!64*4` +2c'NTES932`MXCpG*"qZU$m+HhFRNk&Kp'lk@-f,9RiI$6Bq0c)fQk(3*l`I9l+* +D##dV2R-Bh3IpkCjUAD$(B-JEBN+MUQZM$&khP#ik-Yh&6XH$QiMX&-BbU@cUf6f +!d0"5lQ,rIql1RLRR#"01P4S%hSik+9`@AT0(CddNL'GTUp$iE@4)S,S'A-4qbi5 +#p9TJldIa5A[YVCVF*'-41%DB-%&L`D1[)m'PVS'&0,,Ghc1#-N%-)Kb*%M2d2N6 +Bp)!qF&eV*MD'eD(,pkD3!*LZi5@I#XiZ9dKlTL68V2dbJXNNMYUd%b5!3AV3X9m +j6GJREk4AEcG2drppNh0rLGPNY-YQES!#"Dq+I050El@BC50*SaB1E`Y$"%LeY$" +0rF&aY4DB"FQqkN8)ki[JZA`j*1"TNeH&eJeDIFR6QC`rFI-(,XQPVd$,R0P,HPq +Ae`6'Ah[N5H1d"62cp0iaFeHAH(CB2L+&TPNSr(k*ip)r(1aJXB(a0F9NfqmlmCe +dpKA6c(q+QN[V,)Pb1!!6-KU#%b)B1Ahj4U!V6bAPm!p[Z-5[,dHaqSdFl@1Lq,L +6aDX9`VI5e2Xm+9dNKADVNTK(be+'FB(EK06lJHGdaqeq++'V$IX0UN0S"YmS58f +#HZM)q3qkNXD8Q&0VVDDNB!I8a(N5[U!A%'P58T[8&2TB,jUF3r(q5,N2[eZ`Sq@ +LHpUfVLd*ja59M,TJXJfd8B`p*jAPY2MYm!FQV6!!d&pS&`PVr(EB0bVYH@RlA6L +Pf[Za6MbjeQ$K3Ecf'+SDEhV3QjE-&GGPhhX5j+fZ`Bf!P#Xma13@RK23LQVi2DT +M1ZriP`H19[jXaB@RZiDG0[GdrN8'JD0CBJlM-jQd,b`2Kh"N@RB6I+r#0MfVeNl +rA6$Li$NQ'j9#9r@45AC`$ac@"+`0HQHQ`6(2[I2ej@U-mR!NE6crT"RV%Vbd!8S +m#+CRqaa-fQ(lHUm$BET034F!MVBN*B6G-6if)4(B"j9pP&CJA[,NS@4A$Z[J)40 +[+YXC-+b`kU$+)&*3,-aE+[6Md&m9dR-ilMb[Se*jGl(dlVp@ieea'A(@Y5IE"(4 +b+#c&@k-Z-0AUpr96BBe3UdJ"Y"qpj,j[rNS&B&rB"T`0S@@0b!*@fpi[5D%l(&Q +*q`'A4R[p0MSb5I#CLdM@J,VPN!#$p[L9Q2l5'hQ+3-3cmD8,$ri(T@15N8['L3X +"F!!@A!dRJ3)*'+UdK6QmlNL!KkmIrZQ%fHT!Q%V4MDl[(-j[%,$idJ!h&N(HkF" +Ga9EIXlr[h4X!0qK'qj[NKT1Sm6ZKE`MqVHE2Ajp43+3*kQG1`PLHL2X$PbiQ*rh +cqpRkEL1dj**8JIIa)jl")H%Pm200BRR(V9#L[4![f1S!NfkZe[26D!'HN!"eSk6 +VkJ!CN[q9!0jCM+1,4#5Hd(lpELI@5JGMp2mE6&F(Vq2PVGI4-a4"T+eLBZqe-FY +Y"(9!+G,!lrDlMR5ahTKQacNe5eZGj,BZK`%Al'3"$IdICameeL#Fi0[h9FJ&QFC +jEkJh9)e9,KlTNG5QZf54#QY+%e&(U@8Qq`6*1rHG!MB1`U0[&qDMZ%NPLlXQaPL +9LYFR(BA[[[h%%N'HPS"C1i5qAeq94cG6j""KId#1'B0bh$@`"ZFc5q!FFd+&C%F +JSkrAR2lj#iJ3JaGf9MPrD`R"$lAF-VC1B6*FhR)h*BC*GX-mcER%(9(,i[9UrF1 +025l-N!$&[)PUL6P6(PaQ2T+X'(f(qcF@'dH0T&m@3#K18l+%S$Hmp*6C*9HNk"i +SI1E!Vp5b+eSLTedp`GhS)q*8q3I[eHYBMT6+X@H(8CL(dk!FpXA645MA0r2fFch +f!695Ib!iUi9,!`[qAGI"%q%6#G0Q*PR#(Y%EK(HmJhS!BPf3!"jP8k(@k&,B8,b +r8$$`#UE`f[eMcK#"XFCY5EVbM`4Z3VJ-#F,,!Mc`e1[m&JGrLJi+$RfcC`m"lZ1 +BUC,VH('ck%rUNm)mLV'H*M'DX$D9KY5[L,bQFh!0qFHBU4Dc!6CA'h"1+X1h6*) +Rq)5ZFMX"QS48,Y8k"jB2HE,'p(RNF@S2ja#CbVed$1iGc5Uc'P&0P'rlfB&Yc9$ +mQ0V4$iRAY5fFIri$'(HeVM1'$Y(RNQE@@X!3JL'[rD@C8D3(8R$$E,8U",X5A'0 +`D(4j9kNdZ)rBlA&2c3%TVpBbqbJaBYRFHa8-dqNC[@Zpj")3`G(hkYL'HB63%1K +c2'TEG%#McJBM&DlYFVJkV`SkZ64)ma5lHY-Ka*3)E&`@3+$EeF+2,dV+X6#@**& +)##hkEhH-A2'GTRUT&QV*$U15Q2p9EEN8[bLl3%e$-V5cR2R3Pd(frUC8per%6,a +bc%@T'FANA&"c+LVfIR!X-p(FUfGLf)2lm#ia*r)$KPFX5$'TbP$2Z&jE0ad$`a[ +j)@(32)q3!*PZlA4))NBB3F``8Z)jZ#)j*fe&ETY)!q)[pd6[F+UBTPXiQEX*9IA +*%M8BTfI"49XHSSaSRIhH-D!*l6(*80Ri1YHIk6**Qp9S8$6#mX+kB@Ll59qj5#" +6r$T$SA%GIm"hYhI@I4GI-e2%[)d[pc9bam#"D(YNNT41[l`l)CqI$0#84CBEFU@ +)p`hpZ5PmM0N"RBD,,"TLi#0T6K4`+KLaY,qAq)Gj9eA#FIcf#DGp-CkmA8e@-RT +20@Aa!Pla$I41`f'`)P*Gr+D8eXQLd,ZI$,j'!PMKpQ%46fCK*fBbKK'6VhdDbL, +D$cb@%!`&&@)+%#A2rYcB,@JJ"Xd2QpqP%*!!eV[,V'h8$-ER[1L"%R"l-J$[(Ua +erH`klqTH$XQ14[eSaeK26cNrcI3S06&cYSZQm(eh%#'QhT&2@,*K"Hi,'eS6T9r +S!S6A%qNTHMSe`dQ5eMB2L,4,Za*@5Y9AC'm49V1YTmmk6+0XQ29%#VET24*4"a9 +SRjF!0#*X"p1NHEKD##HUfFR$ilJhB2R)FDRrA!C1,2$k1`S$NA&r,Apd'iAmeKJ +4e2Y-+HR3!@32Fj9YrKXNRJTCV)E)f@Ce[`m,Yq%L)dU9raXpSI9ICY@h6PS$+"" +Sr`PK*!QGLpB*C6QJ$D%Q``",f[fji$c&Tb1IQ'-V[mHjFFRl`c9)F6QC,R"H(rh +i*XN(3G)2F[SJDqR1H`'Uk,KF"4VNG$ja*#0KX6Ti@d)R+)rf(rH%VT(Afc(Zi1Q +!6LVD'(#XRMYX48cXTMR,r*G2)jMr6U*mF9hFQ[rre!LSGX#TqA-A!9(kdhh'AEd +-",1a3X`djLjPA%L%X(c3BB9FE"fM9f*MI2LcXaYNh-EclaYbB994d3l5JPJCNrI +KAIFr[Ipq(SV`di4Ik62-k4djI!TBfFNK)&BRLYk(,@i1%Z4)+qjG8RM'AT3aHIZ +qdN(iXQNM5YB6TF$@`9)larpl$+YZ**P5f8*JNhC2Yb#"IefK2S%HS`kqAq"SF"L +(NQQPT*48[ShHMNr`8r)Ph$TJmKVfaUA,M04,F,ZAD*Q@4iA*4$bNaMhQM&@qcJQ +CLS4+rN$aN!!bc"dK-aaJdLiPl(M3ecf$phc)(d5i8R2L+b2)1-i#qSfYXK5L[Bh +a+$B,9!Mrl6X6FmdK8`I"pkR8XK,2)l[KfDkV,U@j0#HTDN&4DMClPP*+IP'l5A* +8KJa+Lm8mDXK9j!V'3hi3,bNC`NLm0kik`2le8JDrVh@D%%(4Zki$hmCV&-DRL@P +++-j6kJ)jH15UZ"ZQX*5lbX88)lVQki6aCrBMaMVPqE3QRBq$e(rjpqS,,@VCUcF +[(i-(mHC,51Rj#JYi!`8"8YKqMmXcKJCRBIi3TjJfrTp1kIi$STV-"Bjfp9C`BC1 +$r3&H4+"k&'UN6(16#4([fD3Z5hMENKTLNhZMpU%U9"BMi26KrdUfaQIhX6'r0Lf +bmSZe%GTbdAKFUapH9YFQEP54,pY0bT3$0akp,3A["P9di&Q0q9Fl@$FDZZ3EiaI +5IZ&G$lPYi$P#mVX(-j46c115+lFNK9LcFV"X@'$jkPI(H1H-!qY[1EMa(J@45Jk +'!*!!&1[TGL@ibjpr%GU8Gpf3!+4I1b0K1%1fEVdG*c5iq8GQ@2QULkTSE3BX&@p +AlmNH9Nb"d$E5QZejTTqdG0r!r0-"6Dq#kLE0Sm63hjBZ2#6*drUpDh-HS3!3m*9 +1dJV+YSAaYiSBJ3Fq*QEI$Jbrmq+m#*)2[Dh[S[3pTpR'4F3iA#4kjpE!Jf"i(j* +(MB4jTh,a(KdCUrZq3IUhV&1LL0h`QT8d0@BX'Jl4$c20*X4El&Y*(GAFmlC5(I& +6E`l,Z!H-Yh40XfmXpq$rTG[MUkrD&TaQkERm(m8")G@!h"B8lJdS29cb6CAc$cb +i9FH5$(FjcpAXcS`k+XL"clCD[qNLlZ!8mQG0CGpk$'3hpBrC0!,flS"GAJ3ClN- +fRI4MJXPEj$aa`IYhSSe4$U(6-A04Z8K#CXB(23aF9qQR*bVJ3cjBBNkYSShMILD +CG0-hfdh0$6#63`E$%p)M*0CB1c5Sq#k%c!SN'eQ)-Q"&6Zrq3Y$,!YEUj&9(RZ1 +Ak05rQ(q6+KP$ReSXR3!YRDS5q19)+#aAE0DRFQ6r22Pbma,KK%G39j`,HYdGbY) +!QdDK`UA!mIMFG%Afm"P8@lMG0G,eh*P6A%pr@MCBqU-Ar1%5i&CiaR0Xai&53,Z +*NeJ!-hqQFD"8c##eVL%B)Q)"HUi5iGqHq$[l`raX$cd--CBr!(HCYV-0XJQ9aJ- +jb-h"Cq#IJb$S5jIGEjU6a)@'IcZp!qEC(,`2eX-'M`!+ZB4hIqZAlqi(Ur`A9,b +8R5bTKDIX`BE9k&!2K8YpD0lJETYG$lF3dJ0V!`"*4mC"e+6pQZVF0lNp3Vr(U#- +5[(TVhe+%4L"KMbIPK'aN'JFHJQEprLAffG0INiVM$0-9RL9H#C5Qj-YaT5eeDl0 +deG8,$VAaadfdVl+0BU8iJaVl&fRY#CZ&#mNBbJZ6D-d5ZVj5A45K'1[0RJp$Pd8 +&(YL1XSIA6rd'eQ*(iME5Jh*&Q-aJ%mdBFV&-8C%bIYTHCD3I$TC%3+@3"!%!!$d +!!+d5`(Zc5G8f!!$%0!!!i2d!N!0b!!dcC`#3$Nek8f0SC@eP,R*cFQ-!!ADlFR0 +bBe*6483""[q3"!#3#S!!N!N8``!!"V!!N!32!%,"e*XT6*1``ka*d)"j8"k(,-j +3[NCRmb!QRXCRUTheAE+C$'68qJ4#qq#i$TlGKZ*[%BA`Se2DNFA!dDG!Qp6ZPXr ++4N-(V(AXMIb%(XpUI)j0pEUP$cHc@@qG2BJNXk9b*Vp6TJpe$EECG9BA[#"%l38 +CLq2,5(GRLp29bZf4kDRDa9Y,%V((#h1aU,aVS$0Ya9ABkMBEE8cR6A"m-H[KLVj +2(I&0'%`pS#1HZ(fB&RA0NarfYAd6XMe4m5'9HH,,SS'fqHbS-pP,H-m(a3%N3Rm +TCTbM3N1r4ecC,91`$VZf2ZJkS$8RPqCqT9rED58*ZpNcT2'8*XV9f!B&kl85Lm8 +B5[eR(5&BG1VcZ3cY*eLMfb0-Ud42+Md-ZUYh32K5aL01C%QipeML+k1kS9aQ5FZ +TF"M8BC!!ABqKa9NHkh4r!pBI3GArN4$eQjp8S"behpG(&'(R'iXFJ9l0'I%&Vdl +fk2[9%%a6-Q+(mba"HGmI(MqHBIJ@r"G"8qc+[$bGh,PeIS1kLBNr4aG14)%8iYH +5j*5aDLLr'%Pa-M'SF2&`pd``T'IGScfEGI)pe@N5r-E*I9eZ[ID'dd'la$`Yl-+ +#phYNl6Km[XS#3qP+q)5SFV)PcD9ha0Ul-Q$l%*VF0[LelHrS5%@X2Xp&!VY!)CV +cpVDPX6ZXD#NkCZ'Yb%U$`U*C5L,$m4))ebEr-dM)$5UMR"kRAAlG%q$`',$+3b* +#"KAA1@'#AY)i[5@GZQlK`5Xh+qXE9e`dpL4jj,'(ql35KbMkLpUAr6aJ5baG[id +8M65FNGX*cF[Y$*kph@+D0'T&QCCrhlJNqG`8QPMF41#6f-8-jeYCZ4BZHR#0[a# +kN!"`M-1$RR3c6'MHP%GcXGci%8FL9KK&P[p-BSc,9dj44Xhe,hR[5P,ecQKI[Xp +PD#202DPKeR$1K+#PGShTb1KN5Mdk2frhhj`'@6&H%Mq"`2GBR'YLf*4pA3Z*1pR +akS*U(IQ``Pc!1FQ'lM$#4&,0IL[2rl[EibDYjA8jl-!r#)3pkr"$Yp8HZr`DMjR +NJF*m&(D(#GEa6jTEdap,5D4A!*kZCf%UHHP'kR4DL#8Gh!J#Rd#k`,ZR[2JcD$X +CT8K&jI2Zp*DN"emiQ19SSP8cAGF0$rFEC@6a44EcG"LG!%YLQ[+T($(2-2bJ'T+ +0J!fpa`*!VJT+qkeXCdhMSUH1(rE`PBbmVjP16H5I!dFk(T&d6!5+Tr@8ZQ5F*"T +m'&peMA%LV@5TQPBELiEaXpMfKLlPCAk1(e-65c#'VI'iirA%E@q8N89l-6i%BIm +6EH-8ppHNXDY)TDP1eE0D$AS$fELhBYqj0Tq%dI&"088k9SkiCS%Q$`V5Acci9%, +iSGD05S`GAFP&#UXH5l1[!qqSVh+,GIqYhXRie)rDihmbr2#,PYlI3`&bb+#&bD9 +-%Dd(q%+c-fHp@JR655fr#GGBqJGXiQb-Qh$l'$9AYL9FUhR2C,!Vf2EmQBUSm+m +!RNr$FIb956-ef3,ZrM0Dr'D8rT3B,Z!i&bTL!)XRi,XT5jqD09!4h)5[Q6CMpj( +3-*Y&Ke410bNA,N&FT)hbL0Rmq1m),!j`4S$G30[%r04hF`!+9m@3!!MIEE6M2&A +rR+G%#D!P-XjU"$R$(6@qSmXBKh4lMe&m4EMX8(!%`(lkB0kPT5PTkD3")2[C(r4 +UCcZlAaY,TYp1flXYaA%Nha"R"69FirF3rNY59e+TTr[q(m5EjKrff#2@Nj%f6[! +diEjUXM)59pbU`ESCU+ZY`+U*p[@,-058[(UeR)4Q&dI%ZX-hF+d@#&MM'H1qAVR +6`VF5YY3+jZ`CarH$EY&-p1bdF(Q5p)ZX+Gif+pX4ZLq(N!"Y1#b3!&Fr)%*C$)3 +Z'ACp`!LhQMf6k`C-fJYZ#iI)'XJ`pjb#Eq2K4e+4d4hVRm'1lM0S1`J$Tc2UKl& +50j-['LcEqLMX"1cQG33KZeaDUp%9b,$Jm2m`i'JRJ%4RSePhbKq#,hedi*!!'SK +T@BCMB5hUp0+D`N+(J!(Xi#k&,+!hHPNcHiHITKpJZ&I8aTjVSeQ(lJD[cqClA`q +93hcqXNdPdLi3%c@8GXa6cSRjQ94Uj(MqhE1[L@#ZaQ4U)dFb)IqilLVpLK4KB9L +X4&FK%*Jmiq*%#(#B!ZZ6Q&chbIEa(RQB34Nq#`+rNkiB6NQ[1eiJ)Y'XF0RG"V1 +HQrYjYPQ3!%F5pXGLc8F#qaB#cF&%D0ZYqYB2hqeI-2G+"Q1-ckG3rHSBlCXD"aM +&*2mXK#QAE4-Yl*erHl`D(-$!!+@3"!%!!$i!!,"!53L`iB!X!!$ChJ!!jM)!N!0 +b!!k@-!#3$Nek8h4KFR4PFLjbFh*M!!&#3h*cFQ058d9%!3,rN!3!N!U!!*!*#k- +!!!6&!*!%$`"#`G5M19)XkBGEejkFF4cN[q"k(3j81*L3!1+"[$!#kp8R!`kD(pV +KYHap0K+6P#FP6F@[KJ%&jN9RpIeA9Qb#h5NJMlBRjVLHT[*Z(,5bZcZ'ATCG`QH +P@Z2pC5BMN!$-1eV(hT-PQLPL0PRjZ+DLiN[T3S''TmU&"8Lc0["FPYV[B!a2[RN +#[&VMceJHq!pU"fm5j1"i@m"(Cl#khcHMSL6hahlD0iZ#-)+M0%6l%FD8L&5XVbY +eRQ$Db+4CbB3QkM$-%%)'D!!!SPpV@HF&B2`jGNBlS4YXTja&+fI8(0@c2#hS2TK +bp2m34%`j8YGk2e[,Pi5pijTrE1!#pATYpZ[,ZZ%ULH6["H-9'elU*b`L'!HZQXE +*QdcLe30-[4rA54Q`NYH3!*+29MZD`lc#&l&%V64*PaL2pRp29HfEk`&X`SlmP4b +1HCBjLZ'$L54`U$U!Z(iqFED"RUERi1#',[QDpS#"DTC%1q``Pm6FrE#&`1kUN!$ +QpiI9NpBfc"irLm584k#N)H$pAG@Yi[E&H6V"ZXfN""NVL&'NiP'c-+J+6TZf1"+ +lfjfQFSTmQlHP%BF92jP&Uf8f,CU3!!-hMCF0T9Pj%,4&'+KZLC6XX*d'"L$!je` +0r4CND*p-S+b"RQqMa,U6#r1!)GQ[8m&PR$,!i1d&[*Qa'!rPhL@56baN5+'bl#c +$q%$h2@rB%ZhfAdVQA4HTrVEjmS@"Uf)#!eHR9NkrCDlHJ09h@@2UTqRCJDla3AL +,RLapH`E8mSaG08"2cpQN*mG8f5bC,64ladXqVC!!Sme-Sc-ihCi04+'K3XaN$iD +`ZVr"13md@JVee),JGLb+rb,@GMAmG&0Pi"4+SjB5%DGEk0[Sj$M&4GJr,11T0F` +E&0-420BUbXVBR8Sd!TBpiPD1f599MM6ZdC(E1SqEK"cfCi2!ie'%8be2k#rZfFD +kUUi%efeT5'%%6@1V!4daHP@UQPhT(GX)-emSqj4*X!Y)1,i@a"ArL+rk--E))MS +RJlYDBD-82T`eSV8SFUJ2XrEQXmQ%BK[+J%#-$4*B4-CmCMRehL,KT*M0Eqi*jXh +4a*ee9Tc5,NcLT!ffQZ(2+$2,crqT#)BmJ&-rX1hfj'FPmU8ABleRcRN1h%(Q"(3 +El!e0$Amf`N4h3DNA%6YRc3U0a`I'2#*3k`L@TqE['lIE+liYZH&[BiljY##T&SZ +K83,XA@V[ic*%[Pedd5lM"c5(GjHf%CqdCSF*GTFEia,R0Ui,50He2RUrPqI$iK& +ZdY`IRf(+`E"3eGL"9-5L&@adKhSlqL)$f*hm3+#RrIE,+!+S)2+JT$maPP@X)-) +M[!qTq$Q21#CP8mHmm'$4[TTA,,Q[[j!!epU'j5RK@clr`b$6ZBH!Pl5E)S,l$JR +NfqPk'EZQT"lEqMJi*qMijHeB[rd-5U8d6*hePHIb)9-(I"YU9+$1XlJ'$YDAZ#0 +dZ(MVTAc!j`IIMQ@ecem8%%-+aHhLmVl,Cq+V$ciheG8r#CkIE539CJY&rBePiS, +a2HflM"6p35,KI8TS$#AJQ!b*45P8+&++VIFRJ#F%")@HPPhFd$)GMUKR,kmr!8p +4X2'Lf2alFQISbfP$+U-Jq"RY$+qJCLq(,(2"0B(+`B,QM*8!TC!%!3!!3J!!XCQ +q-V*Z'NF!!1$p!!$cp`#3!h)!%TG1!!"jS`!!$9m!N!32!'pP+#"cG'4PH(3T,R" +`Bbl#Y3!!)D4069"b3eG*43%)rj!%!*!+J!#3"d,"e2YILrJbhEAcBd3[*(hPm&b +3!,,-P)"Z!)I3)TS*l[cMqc6GJi4IrGbrpUfiU'TCHrq#3q2efVXk#C%MV$fZX2M +F5T!!1RjI!IPqbH1fkA85,%LNQ#p*A[@-0+JTbcJpkmCAK1GX,ql3ai36+eq4rA8 +bCR@6Brk`HJ-1SX4QI-bX5FDYVNBl+i-'&E2c($-@U,QkH&8a2"HrFh60)p#%3F! +"Ha'GV82ab@-JHmkXGH,C$H@GhHVUFCIi6&jJi[Qq!E4!9'kq4QU*`CBbei(f@0@ +U0@4MCSYZ'hT'%MMD*a"EpNZP6$a*NeTr88M1ZVaIDDXS)&`RPZbHK#)Cp!+TVJB +i,IA+XHC(2q39JL4-e'4QMf9qe`IqE+Hr0I%E2FP@qYc%f28TF42ZF6maP08Mhcq +KMMBK!kMqKAA'p8E$'T(aK26K(Gc6!U8BGY"[eCKL2&fe,F[hZU*Kkqp[5e!-Y+D +GQ`%-dP8l#"LFqIejhG$D*EPpHDHMKh0b[r&jJ8l%,B1caHT&iMH)8@JAh8hkhiQ +)U9P@H+&Ui#QUUYGY5P5ZN[5HGIKXB*mkk0rhe`mX80mfHXc&QHRDKX,LHTKP8kB +YqR-X8Bbb%(!X1J!i`4[2)%"!6)k4q-@im!$-dCblJ12iGXGN20q1@qB,18#$`AC +Ycf+BQ$B'PP[JVj%j0YSIM09e5m@0(6M4&0F8DV3XH'k)a8jC(l)ZM"Pi6TpS[BF +m0Y+NpBDjCkQaTM8L2mh3KQQDM[cP'&AGe$&+p1bhXB1cbpKKGpaq#-G%,8VkVl3 +k(JNXh@S9AiAFT(E3Z%4cJid1QJ%``FY%ZbGTpi6`q0mlNk['ah8'$iBCNii`dbY +Z-APF8hlMHMpS256$p[Z23Z'iVQN,ED2er&*%'+FqmT'E!P$m[f6Tp4GYe,2qYFB +,[%['UcaRXUNGjKK')eX0l2iV$AC5V-(k0l53!+DUaN-b@fQ3!*M[e@d6N!!cb6` +Q*r$+f1la2%25-Ep#9mN01LNk*fLe6PKDJ#i*PA3MV$`dHB8NlRLS-PlCiZm8,0M +eIZLJC%GN685M9P`SQB[VfiTh1(&Z,NDVpCr33H,`4j,e#"4S`V#AEr!l5&4&(RZ +2#@R+J&[95bK39M%6ZfM,j5`qlIiNaeCR4b@pmH!J9*9aHZ'+8Qr&L8c4&0*GZ2T +AC6"DR,jp%+&RaQ[1e1m4IU0KCAHQ1+R%V!@*8Y&E%LP!JVb*FlX0[q84300,KCU +#XEaBk1Q$U#[JfU*q9GiQYZ25(&ArM41A!TlMrd`(D45f5iE-Ga2CHcFdhVX(44! +@8j6NY`LZ)Pqa@%H%ZPeHVb`#V%HXNB4,h[Z0j9E$#N3!Pe098HKmdQV'@f1X,3M +!$6lMa-lQ+A$*R4@B&lY0cMBDe[)U+-9Bm`$hQj!!Q1(8R8)miqVfi(+q2hdbC1q +'5ee+*-Z6Yl8YE5[jrC*9rFd0$`L!HCi'd0SDDPl$(8kF,blKC`F4[NF"&4-T4Kp +h2*GF0X@c1ITNLk`ClM'"dh91Y(GJIqXQ5Rmrai-l`TG!eJhNF`R0)-K(%[0NCjB +AC(dCcq#eI+aZ4MN33EjR(+LB3db@H),b6iR"1mhehM3hG9A@94r'L3JK6r%aXap +Y%*!!%l&*dVmSi2pXc(`PVZVdT+qlVSPHY(0,!qM2h*%iNZVA@b"kT#hiVDF*P5Z +eQ#"FNVI@m16YX!6)m*@ifh06"`HpA6Zah82Udq*1k0q8F[b+jB8GVp9q-)eq@HH +X%[UaQ0S(5k6TVNl&RN+IrVDC46qHURq!K&HZbh9CR0hKYl6eYXcIG@*!e1p,$YT +0SPmZGc$Lj6EpQd3QFCXa4SQ`QTC3Y+ZPHc'9&j@S-H0-2&rAH1Rh,cQS'8Tlc5% +5ckY2N!"Xrm`RhCHME8rFrpFA3Y@2QSACJ9`12KXpRQ)4AZ1*LLZ*Sa4VlDU8Z10 +SM+0Ya64R9TE35be&c9reENJ0h3)DdFIl2K$M6jZB8&PA@SIe!d(i#ZC,UjGV!jr +#L9KVhJIShKD9Pp%HNijhRPJU(&5D!Ne[0$Xaj4T*QLL0I+P$D@pMf-4e,1e-QC) +0)**Jp-0c)q6c,VA1eE@&fHZ5ibBA@b1qHGLqLjmk04V!RbIqkfNM9%i4cA'YM%Q +mb3+[%`ef66*e*R5DJ9Jfld&2LaK6k6d"M#(cH$8)Nam8hISJKNVqFjpMbIJA&iK +rRL%3pLf0Jkla@kq*Df[55!j)L+4FkbI(Q'9(0'V*khkhNh+3!!,QZaHJJ3C[kaM +q*REf`Nb$MUfRl@ZXE)(BQ1h'N!!C$YU&*pe5RQ%)&VKrdHS`B1kp)'f@eRTpq&% +j,VR1f`i[(HY%8#I6KPYrmJ-*%BLSD3SJp(q'R9YQXfj-!45)3`95&K4"Yf9b+9Q +i$`3U5SP-SA@E2h-%(UA804DSZNDXjX*(')+AYb*#hY4&kjF!@A3XibK6pNZ$F3I +jk$dl"4p&eF)m&q3jDSmPeQ2pfZ4md(UN8V#hd4jUTFkqi,KlLK0M1RZUG`E`pHN +rEB9AUSeA,e9Up1')NIQ#))5[lP65!PLPMrNpdC!!@MA1EkS`TpiNDmJSG9d4XN! +hrJ#mF0kQE0"#IFSYAA!K9bhDMPUe+)HX2C&8@%KpQ2T6T@`3(PfiTh-JYQjZ%%Q +*@4Lf6D[2U&0N462B8NBq2R*V#G$i9G(qDk[C2q'+9P1TiVr&Y1K%[0RrXIk,-GX +[%8D6FKVSlVIR`e,#USQ@+pK,C+0H$0STE)+hhmNCrIZa&eB0Rd%iPTJ#LerF'`c +q2CN68hq-jrrR-qTcMRK3GbA,3b""RcG8YK[#-I`!*H3AGfrD2'#[rKC2&"BP!`Q +9KGr)E*!!p(3e4(*R5+kme,-Fc,h#G0r5I`Xmf(8k&MD["rRc$J1SGLTDAd'QBd( ++,VB3dfNZ)6GBa!j,IFL9GPp%Y2YkXl3DSId,03BC"5[%DMV*`kd[Z8"fqV"YPUN +cl@[P9-48+k9DZ,49I'Ej"cji6i!+N!#L*abk9p%)3ABall2qh&e(#m`&&J`G9lq +@@&6GQRQAX`2pQMPqJRSMEkILjiTm0cJpK)Xi8,lFHa8Ge!'(M!3X&J%8@IICj"[ +5fJB,kI3[MCEh*B8jP-aDCqa2DCVaXdiLd9TPTfUMFEZ8mQ0[N!"$,)b#9fRK!(f +LiEUKaKYE)T5bNS`94UbYGMM+LhJ`ibhCmY9flrKH65&9)D(PH4#A$Ufp+r`j!J3 +fj9lGe34XI@DX)T2q)NJ+#cpeE')b4aYDI6U`[AlTbDdRV(BrE(jJl@hU!eQ-iT, +ACQ+J9XXbh'5BZKe8f2'iA3GZ2$R@b%G&)8Up5PSLZ,`0KUPUX223p",YpcA!CXe +G*F5@BR848rdT#0hrq99HX5ZDjBK,iP(8mp`e!XQFUKXl[#Zl5$i%(TGVlAfCa3c +rGD[,LPL&%JB3&0f0e#I[X$ILjNI5X[STb%GpI8#ZB9e6cYM'#r"[XJe1jSP[L2# +Ij)858bpY%(%06$l'iNLl0VjCQbA,Q9,Z-FHN9![HfBi[Zf'rb0,Df1MdmaA@&,B +ACP-,M9lAA0QMHZmI9C9UpJ``d%(-bBlSI)p+D%%hp0%r4-EmGFXR9ZSqP2pedfM +iNAh4%*NRmUF2rQUVLH@1B8bXE+*F)qj@@1DGKDcp"Ybp4CFa*)8BR%pM@QYrGJf +A4'm'2Mqe,ka[0bm`XXaF%%keK)CF-+`Y&![&#I)Y,+T#13R4*iD6E,3Hq%AJh6V +cfXMk1Zc6Y3Nm0FI&D!dIIH&N@!'r0ZY[X-lYS,al1@&TdVUT`@`YeIllEYj)jB# +c89#YIr'D-UNbc6K@dq)(&QFTJEqqBcpHQ#j-lTS5m9qha9cbLY*IENGNQY(AmU' +BhYr[YbG)fqNl+kS#IlDABD@b,q3XXTZCMrZNK!%Aphc@(AXqG9-D,lj@l++01I* +c3[dH#-AH'+3-lG0jDj[XN!!UL#L(9TEK"JJHmY1bK`UEG&N`9$@e"*4m)T-%G,k +4GD#eTY9Z[%BmPprHk$'%(U(Ar+&jBr&PNChP*%k[9M)K*L%Rk-DL%94&,q'F+kH +j+,+bXB'(Ma0&YTDPk1[YpbXEbjVk3h)mC,5[*8EccVKeJF%M4bb499YG$X!3ZMA +keRV4ThJ-'D$&0YLbE'DX*Yp-Aqb)S6)efmelm(Q`2N#[-()QjII$B1k#NrY8D4l +c*d`rXU9ELl$`*I')Bd$i5d@4@e),5&la@NrPPrV3TA0@`',X$R8lGJR'#A`riJj +i0S-mX2,fUbJ5mE(J%R1"QDp`5jCBfIU1VkRGQjFp(cEe-fU,3RG[QNTQ%#HZ&-# +"2EKMbhjXZT&HY8-$C-2jIH#FCcBhd#YeQ1)ipV`Xc`THR1&KG"Qlc9,YiV9`aKi +eqCXd0KLJ4cUaR%KN"LP@hpJEAK@C9T(cX+Fk!K!N(`i1VMi[ZKKk"%`5P(QijAd +dQDSE`h5BSGHp0R('B,lk(YM0jEG*bH-U,LK-)U(Si(b4Y85J*ccl%1QY2jqX(M+ +lP$9TMGRPqcZR)BTr#"@DD6"DGI!j*Q*jqT8ReE+MDYINc)$V!`-35c$Yp'X[(+f +U[QB""-A%fS,$!+@3"!%!!%)!!,'C[LHc4*0'!!$Q-J!"!G-!N!0b!",pbJ!!H1- +!!!ef!*!%$`"[C5KMCQdVCAKd+5j`F'-Z`V8!!#'N68e3FN0A588"#2q3"!#3#S! +!N!G#`G53!)jX&8c-dLN4pif1CZ%eQIp[cRqi+Qp[qD@LpDVPU"))$1,(CLa'!"d +drU`'HNhG-)i9AblX(4)kN!#hqr"@KVE#I`$X@2GF!#NC)10JDJ4M,`a%EhYVAIL +0&#(6r,JB!AI2Be6k3PN%P5FTV2UPV1aB$@QjU#bZajRmA'X8b!jLUH4(!!)p*-m +(*%"@9jZ2Rk-8PcQF4FD)lb,)0aQ-F*iJ$efd6Q)-`@[#8hl+(E5*Z*,PI0`0BKi +pS0KD@2YLT#Slb3N3c,QNFa%E&f,dBh"b'P,hXXk02CeD6HiP0+4RG4qeBTeCZmk +Z53fKE5(4U0S*DaAqc)BLDf&i-0ed),F1CaV11iF'6E"YlRi@hLRYG5$iLPUNrV+ +ei0lmfTIjZ#jJ9QRFcSS@-RI6iN8*UjYce`q!S@YkR2JLQ3JdZmM'NL)L*%I@jp' +2Q4)B10QSBfY"-B86,"p0cAGJEUQ@ee*$5$MYX#L#TU&XGC[B6m!de"(q3'[*m&R +kqehDk'XlH*8)"L$AH9L$`4b4Mbi)@YANHD%3(4FT[qM5G4p-bQ0M%XZ+Rqqm1(E +Y`Gd&eSL`XQEbce5ld2$G2+rAaUhUFZ[,Mlmh#9e'QMJCf'2GUj0!F%fSNZ,el#% +%Bp8jMe*lN`mQr$i6AF2qpS6Tj0,qJHBApGd#bKJH!YErJX*3@S42DZ,284I3RPf +[VVV`6db$LfV(,4mP1Dd,&+m`[&6jVbE5i2"+Kp2Z)GIH1[lUjpf8X"hB""Lq98( +S[GHf1!c5'X4LbN(aTN@%$3B%AcD10CmfVEYhG9F)R8RN6lNHNT(NIC``q-PPLMb +c8+*-(YX#XjJ(`II!VTb9&!Tkc-lbR11PrH!@jiQ29jb[jM,l'm906#heSdRp$i! ++$Se1&ar5T%JqplaC*9h`3Ja8XUpb"ASQV"BEIX*F0&[Li"0ZX*X-@JdS*!e25KI +ZDZkN'&YN#R8c2F3pL+$ZV2V[A4$'AkVq+GVP-D&$94"C2#b-(hp2e&`9F#[RC3j +S9IPI5&bI9fKq5`CDp8XUrf`8*[Z'Q)L&#!ZAE@DCc1!YN!!16Xm9AclRHRBjaEY +r5a,!K)XP0,&KLFA$DpFdLpIIB,Ep'J@Y6#'!c)GHb0m#FH0GC4Qmi6Df2IbC9Re +@K&#bX5RP!cB8)ABCj8bM"H%KC#-l-XK8ZMbCiRMh+('hQA4&H5YFl@H4aBMTQbC +Nrr%h'j+qDarTqf2(0C(rV6+NhbK@,"`AL([1C'3*F0lAI@a1Qr`1bR9h9,GQBLq +CKPH5CREjFdf`8@q%KHjJ8@%hQ'hcF6kb3h,'RJ`AH906,LUTY&PjqJ#J+L%GFG, +-(-$L2dUiSI1b+eLb(N"+jV8K%[XJHR`Vfl6FPq2NkS"M1EL(9K@bM0N*IdhAY[p +P"M#*+4pCcPNaXB@+l"AGkbkC(QP#h&1+Kd@(0h[%H[k6hMaZ%@GSPRU+CYCA9'p +*(%49ADcPX+r[LIFNRK+TRF$cXTUHTfK3IUp"m*-,&8`BmGcU0l[6d1V$QdSRXm8 +ZA#c*8fD0jcjB"EiYcp'#)LqH(CIP'@UP%JXrYA9qMc1c0XRaEPDq`I@k@'&%UR0 +)[JXUf6%DURYc&69R2r033E3201"p)KCF6,+"fjHZY%r![H*Z"c)cG,lea-6@phC +KI6Z'5Zh"Z+@T*IZ6R!+4d$@dJK-4)40C$#(VN!"lMH2"PGLl`Vlhi#SDHFC%*'P +`H`T-A2J'r#5#bFU#(*i9%PM0D4RY(q%)VekapX#,M1U`0GXaNedAljRh4(Pa#4@ +U`"kZdM[bEHp%$b2lRV!6kaZPPFe$%kclA"4,#[Pc3MYiDMkDV*XbPV5bJ@AVSFN +[@fK[3S*EI0H-9r@j6RjhHd9!%cm3T&1&jVR&@*)")TTb,Ba3MUP6)1L&6I2T5N0 +If@mdS%SMhB,pkbP-Cc6LV5NE)+N56'41DZmpf,EDdIR552G'`+'C"5N0Md"%qc# +H$Z(e%S,p(J+Y58pX3eS&SVj`'6Z)r(RHMjqEB1fMVl6QpNGrc6Hi(ZGH5F[r%1A +NNKKYMAJ[8e#j@qTQma2aR!(&f)Dm5LV[DF,D,r&RJSp,U36fami1J-hSCZ88U,3 +#[,j+Dh#e8BGe650*NiR,NV+1`6eY!0`LU`kl5AUhJ6hd5hHZpNfB8mVE$9f8d&Z +dURU8hI'lfe01%@BSYP'FpMep+%+l0(@PSU2c90M*#T8Rc#%FL+%VJh))N!!&XXB +YLdPFj'i3ljB@XaecUqZGA,Pr1ZrViBQkU3,Z309U,'RlC6V,I2m%"qdRP`B&Ih[ +"-%5GU*5&+@RF8(,Sk,H`K4l,("Q4@e[R',KYjZj"&X1[',3f1+l)$m'mb@dqJVB +cp&hfQ$Ih1h3lm@)mhV1fcImJXdQVpMXAJQGrI'4)bQ1Fl8#jSQJri("E#4i%*U9 +EAGH(UE%h"HHqUT6ZAY,2,f8c$d,5D++1d`Z`66ijM`[#%FrU`d[AE2@j1l5i0aG +1L0M9h,-`Q#Ed#-YIp1UF@15kA+h&pRR0fXI'&%P*0P&*XH'L,DVmqdeH1*qe1Ud +dqDNZqGLL)UkJ4l'`hT9C1%+,"mjq9*kZB+JE-+R`apbhlL'F(HE@)qRKi)E0j)r +323b$)Q@8)1L##BYbfHkTDRGYbX-C*(F@*q(cD+QX('(N$'Z8h!H","-*E)FQXNY +kj'c5i"3VQG&Q,Up9qf2D&eI1@[BN`dcXCS#&,HEH"aaB+m1JVZ3B@C+`R!D8SIZ +L-eIJ`E(eIMPl*QkcGV9R*VfPXAfkU&r[K4#5dEe%Zfq(90iGSqdq%XbPIG#Eh43 +bJd-FUZ4`bNRh4C!!,HX%m#(8&NjmAaprI%EaJrLm*,RB!6+3!!G'#*5$86!Xj$Q +T0T!!5r(M3&NhLfcZZNJ@hPc1cDl4FU2Q1C95PXBMY12aQ'r901Ul3J9d!c)E9Z6 +5#+E'''V9F$8[U2-Id4cKi89Z%AE&XTPM0Y[C(r4aVS-M'cPQLq5jb'i$+0Uiep1 +A2L@XP+Z9HL`F+@&@E8FGkkKVEAR4Rp'`d-2URN)GrTPZc*aXI-P5B[Q`&mC5NGG +c[N@PBZZ"9#EDF9X,e4%dN!#"IZAPV0HPj&#H`I03f1'Pd($bUCIEpS%A4+T*qbS +H1KN9@Il"(9"IPC!!aI(*jf$CC+KrSJ&YRL34fDhm(SV8Ddjj@a2ffkESJQjN5pT +e"Y8KR4'JpKpHe$Q"`I[NSkjTCb+iK$&aqMJMKkkeZ$M"MRLfF2`F""JS'hM-HPB +Z#!&p"dRr[#9S3V!iP3K0QJK1'NJKC)fE1(ARJSKqAf$()5,YBAYMU-FQ1JFRRXT +(+fh8'+83d18G3NVi`JIAl3Fj4#,Q(CPQ[h6mET3q)H2i9plSjmQTbZ5#1PmFHc! +Cq2GLeRSi"UP0p2l6qNa)!YVm$60U`Qlh-Gq+f5,h#Y@9KbH#K9@2C9+k[jEcHV" +'3R(iFm-*)06RdI'+TFbI&GYB&d1--H"Y-,!RlTbX#`!hNT`GhMhqh%K6U'r5)F6 ++Lpc00#$KjT2U+`IJK@d)2hp`AN65[J2TJ3(cA$RqYFC4!65PX#hAP"f4-Cf@ZKZ +l28k#2$E8JVdAbUhh&*)XLPjV+K!Tm`S`6rr6&5U4FEEeeN5B6l-&ea90*!%EMYi +cN!$%m33%+[+)eZA#&A*"G(YN)CM*-Mll%MI#2a)`ULRb+$a[+6!&N6$(1SCX-hl +B)JN@rHRq#a9)'@61R8f!eJYmilYPUP02`N)&MfV`c`eIpZU3!,H`TMhXNHj9*(9 +fRkrrH!X1P69DLrU2[R(bMKFG!NqUm*j5,iMfck4MH-1'I$!H+%Jd&IBK*@(VZ@1 +fc1J4Y'fP8lK!q*!!*hS6"FJRQ5V53VfJhGpD5+@L5@ir$&9ifNpA[2[`hRjXi+% +!V'"Mlq"mh1@GQF)RZ3MXG%-HD%L-$Im*Pq(XJf9(UB9,YJZHh2,8BlTeK8#[d1' +fV%'pm-`PQkI6&$5%4ENch,@9k)df,pPH4N#2G$SiRLTiM$)rm&9SC$L5QBE&@P6 +-Td,9U65e'&8j9U0('$G,C-b0!c@4P""bIpc%'NEG9F-+Zpq5lHi,,2jT*f@GE`' +cm0"CpJ6Kb@MQjNBSZI034C!!q#bHPI,'arR21[TT-UHjLRj`#EA@ebc"Ti5VDL0 +Z`q4,'PJ4Z5#BDCaTlj*Q)FGVc2PB"I-q*PTJQX8LF4KJ9,YpEUkk2,i#pKX,cq# +0)T6B8dN3ikMVV6TPHNF$D1qZHLD*YS[XaMmik1Br2`8kI1l3[NSNeEYEq,%F%q$ +NSAI6)CDMKD16Te3AM9'%@02Y[6FZ[HE&2f4G'"#58c2&8m++%"T$aq-P[E#FI"B +e*PK2-&8j`&hr*"M&eK(A(eNFdq0K+iZrelbf3lNmDGfS!"(&1PA[BrY2HC!!Kfd +ZHS@+HMB1GeV$$eM,FaAYX1aNDhaB3,Jm&,a-K,G#!bDLcQB&UIm"00HGaCKaGi$ +,P`"1,c5j!R&f3#jP8LIeLZc(ZmS-V%-j&Er*q3k*[c*aVB4hB2)Ve4@S9m5JN!# +ZF35C8@!arY&l`N-K%qrd-p!p-j[JdSPq8#lJI6*N1,Qhe8LeYSDPdQbL4VrhNi" +LAc'5U#iKf!#PN!3"!!!f!"#e8X!DY9,#Y3!!mrF!!3H)!*!$FJ!'cQ`!!!RV!!! +%BJ#3"!m!8N9"4%e&!!%UbP4&@&45+Q0S!3$rN!3!N!U!!*!*"Di!N!2V!*!%$`" +#`G8*JK,mfeVIQ,6!R[)KYl@eVYpha6(ilBm&rB3`X4YCVF[*8d!(bDSkFSGUk', +a(YT[p'G`j!6h'VEL*05,kU##ArdX$Ld9mbdGf!jX&mV6)*A8RL'qSS@G6"cAAP" +lHD2CACl-)l9K)DJZr6JTK(h4%'K!j"1kM3dBfr1$1TCK+f2KX2TQIB1`N!$6[bI +C'!1h"U9%KP-)JFM%(F36T,NYD!DR4`%E5kpMB@VF8mN548c%,)pL(5UMe4!F%BS +jQMG4Hb!3Z5M0!rG6X9M[SbQ8R5d8c+Xe#'[1MAEV,V[D@`8U+l(VR3VS!%,"e0) +)#k3U@ZJF!PNrG&$"A5&HS5S,*f(C'QbU+j*f,rV9(USrSH-bXahML0el8K6a8qK +CIYmdDFBU8U-44+)010ajcrRr)0Be9[&P#r8pb"l"U*3r&V'KCYVRS2$Qj8--I'& +TpL8ED#8!Ncb"Ab$+a&06hdEic24Tk+q%&3NlB"KBk3Zf3YR8X$VljB`6FkDGEM! +60pAD&Xr,%Vhpal+)0$JMLqNq1UG0`erAmj'SJ(2J4R'YUC8Ci0`Nc+'UCm+Iq@` +$5`YM05G1lSNP&`Fk"&QQB3!50KDKI3#%,Iiem4pVrGLE#LK[fl`PY1+L%F5mN!" +dL%I'bS*Eq,l(-HSMFf"j8qTT)BGEmd`aIG1,mYhSpLR5!lSFlB)5c#lFSLXD'99 +SM5HRr)P3)K-XU"pcK+@(MAj"b!EU1[NA&-[Lm61h!$@Sq(!JEqZY%)YbD+H3!)I +c*Hc-)eL-6JQqArX,EYDT32Q@8F6!Y`DGA"251Fec6rZC"0Ke'rPbI@QRJkDmUi! +C3)1fF,rdc@L,Z[%c!-kCYG-4RpMVR,GG'Bp'm5D%i6iMrJe`lVH+5GNYUi&$R8J ++,5'1ZV-2UeDd5`Y`PM!)K"XBQ23(,"YjNqU[KI6'#Apcpc*%H+KFfX1#i+0[PNa +U3#CjQ6CM+e4-K8ebcS&9'fHZ*GLVUNGZ,)AE43,`r1@A3rX$l2@+Ch@(iAeZ`R& +j1N#YUfjf@XeS(iFJdr''5q5-)KH,IKF5(I0PhkQpqNhB9X#-#9,fTaE3PBF'HUV +f2i-bYE(DCS@*ccDU1'[rYUiKbj!!Z6*6PqJU93K@[!XPRQfCm'TF3ImCd4(e,N4 +#[a8GcRRL,YSp$imdYTS$9+(43HbhUi+%eCl9aG@#,`T$0k2KeESd,P&0(Djr4R5 +m2!CERGE`4YG)Km!9TaeM&DK3(*[pp`IAk6T%[dSSKf[C8k*+JVb@!QaRd'ASPqb +(Mp!GlcQD+UdA,GZHI4p5KU!VPEX%40m&eZj,'r+ba&(,TF)l,@Jj)V2)4#39hf) +!aFiKiq*C!S+hmrq#5*YT[292+fBAb2i63CaMlKC"hb#kTTXBqh$)@L4mDQh@Mj8 +LcE-`+M#e)+*TPVa`V$#bIQXV'Kjad@(S$qffZk4M8)``2BfYjQcHh'9C'`,FLr` +"2mIGArGmmdUL@DR2`6433LT[!4Z9VEZL%(fhp3"b3Z$[i#"$!#ZlKGpi&KS1b65 +c399N[)iKG-23$950#FD(N3jFK9BKhT1ff0aC#mqcIDRQTIMN)eXK0I,[Y""FpY[ +D5Z2[rGDRJKTb+9'qP6(VFHc5!`N8DCJY,(dhZ3"PSfm04#K2%M"+McT[rTrpaP3 +9ER"'QEaE6A62-,9$ql8aq9jBT5Ke-@YCCi&3`6XM@'(#6feS'Z9AQKicm82k"rk +e3,6(pT4eRmMm5YD9,5KQS9-&hDmBM-e3GNP'-4YaSKi24p8((D5%%b"Kc00j#N6 +GHj,AKT2q[#Fp"ZMV4(,if+@3"!%!!$`!!,'Ch5ke8Dap!!%"d`!"'#!!N!0b!!c +M)3!!e1B!!"!i!*!%$`"6G'&bG'9bFbjYBh!!!(6a68e3FN0A588""2q3"!#3#S! +!N!G#`G6-@G40#di@#b,$MU-NM14c*GJ')FTJq$Mkj(B[@JF+I,"P,JLl`$B#jT6 +$akeMeP6RkeKb0@-X@P4f0[aM-96NG`e[Hp"R$LEdQjGcGTIa%Z2KjrcE2&pGiTm +6ckBN3"d%ljUGbHrf+iYlN6S("05S9`[@i))q!SRY+4!DM58N6,f3!-q4,rX[h(1 +'k5b4!`PF0`m8INA*4FVKYk'diH!iR)@98qUFB"1cq#@SJH4CccS'k'eV5NA0%!p +!16Afbj9B1f+MUSBE0!&fDfZ-l2cJ'IFJq,43ll&Ia9h@Irp%FfJ!SRH%BA--3l+ +)@KT#!2cm$4pUf!a-5f)$baR6[$PXlq&*$B3lA9(T!8Z#[k4V+!d+Q&IH'8AL0UG +J4H+rif1Fq%$)DL`Sia"aN8G(i19@5H!9qDZF20#E"1rH"PrkHmM51[#dGee8XLD +[XXlm+j%*B0F8mR,*Fi+jX&#)&d#9-$,2G'SEik+lY5*[I[9T[49A[9,UcrVCTa0 +i(("LF*bR"ie&G5%eBeU46E`K2)%93$e0'lHRITL1($hrkCd4G3#3!!kSTHrKaVc +UPMN8m3DLYQlBLTX3BRipbac+XS+4B$#[jR(F)!eFQ+&9ZQZN$NN6FBhA8hL&R(' +E`qj@YY+"UC[$-+CH+maXkSFrKFarU'&Vid9l'@9bA+CT8J*LaDiE+r-98TE'[VM +,YRcbBbjpB24mQlQSkE+eQdkSEq-,14U6M9%aTA'!2lMCfdqe5#S$5YKJk[4!"1' ++h)Z4l'KP,A(@PZRb5LL`e-&+JIV2I,ZhLY5-eX9k2X+l`MdfUq4`iS3H#K9[HJf +G8,-lMHG-"@HjPZ#a4SDS!qMTbLDLS,kR#@E1JKQmJ[3"f)bC#P1aRihTpaIk%[h +RaPNbDEHrG+%k&#V,#pr8fpD*9QP#1L[@9I*Df3YY6VU%0TriQP6i5BG4k"GR4ke +K'E&L-CB+'ISjZXfTA60LXNGVq'C*%@H6EH+"BaaClE1IA[-G@BKefqSajYIMN!" +"$#!lR@'kX2Mhb)FDdqipR``BMSB9VAXYiQTGIJa!P(e"*D8P-iNrAAf[N!#hRIf +b'DcXIMf4VVY"*aL9kellU[1J&6)"ZKNfl0bTDQk3!'YcLR8%FD5FLl#PqSE6cQ[ +k,Mf6BdaeRa!h*-[*qmde-U)Z0AqNKGfYKrA6FmT&qbfR$1B`h,dUlFl-8B'G%,3 +*3Z!*!h(#9qJr"a&MAZ#'MI1RR0N-k!IXL3ff0Q6*8@'Z419KQGl)hUhqEFBdfXq +a3`4d3L%36Y9V#N4bTIi6R5'*952)+Ee"jk"Q@lkLr,92lCIBp+mEEf(kQY#AEh+ +bpiqP9i2I[1(X@*N6VrAcq#m$'f)HJ$J95PdRMP[TApMIBp1dBiM5)XlP@4@EZ4, +Hp+aGU0DIG9K!*)Z&m@j@Map+Ia%,#eT-b`dr$IeLc'jJqLShZ9AFhbql1R$%52r +-EH0*IQ9MR9E!F$HfC-8C*Iph8G#*BMY0hSNecEYbcTVLMF8PM3&rM#*KINrUHd4 +QlJ`FHlid'mSE0JI,&J@rQ#T2%$bMMi28jq3ZBHHC5'*9#9,P8Nd#,Gk4'MLP,[` +#Dh#lRr*Q8FLkb'Vmm8Zme-+8jrAC$AGB#M4PDkbU8iM[4kFBm["hD6PmL5`KKRJ +F[VrR,5%SNf5hpK9%'Eh5pf5e6$#r`[#Bi`jm(3iEK+UA5JId,GSLP-'+hLFE*'6 +S)A(hFhKFU-AdmM0(89eXX["8$d8dSMhp!6e`D$c"RTJ6A'K3D`F1QCiTV,-Dja1 +fIH93KBk!UCZp"J"1AL6`41mh0DVSAZD"iVEPX(jqekflpeN,SqP)e#!kD2`!k,m +bTAX"Nd#A(RZ"efLBrq!c(`[-MekMNE30bCN#VY0K&`IfE`MCd1DTlhG@c93"h'Y ++VII+!h%b4c9U$IZ"Xj2&Ukrl5BAAU@`r!&Z0pCC1X5B[Q!3qdhjEA9QfG`@cI8a +#L-*!(,-)#AVjcmG@hrY$'D[rhHfb8T($k&A+QSQdESckMP"5c8f)e)-0PJ@JKdl +R#8[*-MeirJ9[Yjh0h[)THi+%dQJaDl@KG`$-DR9Lh1p42'QbdjZ@Y"jMHiEL1M) +r3K")!4[Q*T[*6b$ZJZ!(M4M-2pc99c@bZT("m1bdhThr8fa-'IC&k&im'0R!!-B +T[@98D'q#TL*GBqQ9!!N@qY#2rHGiE&[A(iKj`Z95*3#r-&YCeEG2K",-$&#R6&m +ZEr*3&,@0F+m+krqT,jP[fjD2G&')63`%5FCG,KNl`iZf*LP&[kiRa"%9G6qm+6S +)Veh6$`r)S*m,*")LjcY+EFYj3,p!"CX92(h'Mm`dEMP@(&aZhNLU$bXFmN4QU[a +*+"KV*R%c3R5k0c4%"a5*[MD!4)[&+dVV2ilUS#p#)+5MIhE9,R6&Cml9bJV$!!p +j9b"hMc8EI9QJ(EK'[#1Q)8+8B8)j$iI[6jl2A0qDNX*E'L''A[YN5QqT2KNm!4V +P,5k$22PcUMHY)X6e08cCH2F8!lrH@kc!LDr+U((%cQULlF#U3E3lcX@Q6G(!6fJ +r1NZjL%pYFDCPX%+H$r(4Vk23`!f!UYpMMFL`%(VL8G#C58M#hj!!G9+EDA,`'J# +)T"-+L@Q%8b`!UlAVIiA1iRk%#q[h&hbKK`II$f&)-Sa8A'U[q%lFQRMFFR(QB@3 +V1P@A9dV,F+XD$D(d&aS*+ep*Ch$C4Y6,,f'`mUYC&pIAH5NkUlSp6,c3C!FUf94 +B1c*54D$2M'03QXJkQ5a"R5h5$2Y4Z8Z5JC%'a'fc*L-ILcYP9A0i($2hjeX!*Qd +5fN*[%*KTGD0L1Sl+X8EUUaU%DCFe#H1r*PAD84)$9[Kp$m$PSfS#!k@IlTL-8QQ +B5l34a15$"33Xar$TXYq8,!He-ar9Z!#&K(*V5`R9cNfX%8bk%bN)Y@Ji"6AB-hc +XT'fcrC5&U3!,`kqBeh&l16C#96TNI-R*[)U,FCrc9cAE3VY&%eFhkFMdkK9Z#B6 +8amh([*!!ZK'KF&FK9+FJ!9em$haYcV,Zd"LR*AbeS'XPKlm+pf%6TN-0`9J2ERb +j*&@TYb"hciD`Vql2lLh9*QfhVC@9lT!!+e,qAqIairIc#Tc)1!!-fLRTlV9SX(P +p*N#%Y"!(KD[!e)R&B@h(2qH,d$H6K#hDChC+UMK3(`'(SDhbqFEfpm8e*"4fKaA +0*EG`phNRj50%lcJE`r-!drqM6TDdl'XHDhiFD#,!ZllVC*lAB4"0bQ!e#FG'"*, +)2IJ!2!)KEDYPk`GI#3em#$kAjJ6$'X9ifq%!L@@aX$J&r[GaHa@i"lFRMEFD)9U +j"C2jh(3q3ijPpU,1h`UZ@Ib"2&3Y1Db@QeQfhaIqA-PQH6CZ[e3$D0U8aYcXM2T +9M5F`rLLRSZ,rX'(T`0BTS[(h&kHiE*pF,)jLBVN@k*4V8rQ,qYdcXE5k32bU3Sr +AeY%2@3(%VVCJi4AcKV,%H*+Blm)PJjR$@*V4)UfUCX#EMl40(RM'K)1I'`,LK&h +-9)SJ-AqTpJ,`i9)9%mkT)I@*racND8[[S6[G&i$HfAGk#E0VE,FJcLQ-Ek($KV3 +E'Rr%G![fCM`phQqSR,ei[Y%2rF@16PEBV(@5%&jm'Yr5K6%K2#Q[m[,(!9,U)Nf +S(k4-6@"*!V8#RD6l`,mf`l'YKJEP83'E-jBdc4AAYFIAP)'SD2'h,!8iU0&1)q@ +a"'%)(UJ1+"@9i"88e2S24k)I%+)[)EFYV!E59HiNKVJa3I$FMpFLR(q8f6rT*3b +RBHH&N!$qmf9fSjI9j1cahU-(F)0G+(rVkD0Y1cVVki,Q(pB4)@3'"0pGL+5MYdJ +iP0QGME!iAk9`IqjKN6&ER%bM,DY[M,pd-4YVEDjC#MN!6&fQMP'GMRdlHr2HDL6 +TdUUkK&(GfK1icFrY)4j8eKm'@N)1#APJAX%I1Q&KMF0B&d#4X"XCm[X1@P*@X*A +KZhqjha4Y`K!%XEcUN!!ElZ)-&eik&ZZFS`h('(SVX0#AXU1!#@VRZD25iq0b@XB +jdcNCC-"([AQ(j9&IR0GkXdPI8S9VlhDe,j'8*m+9+pb3!086#[-MjhfL,F[6m+0 +9Sdl3`5Z,k#&[Ib9P9AGJ6P[qDX6FX9%0&(ALdl49d@m5YA[TSBUM6aTfDX1GdR# +-%[khmlcji6U%GJ1A5ZSHP$(TU'pamVSKj5h`a+*6J),NQEI-IF`pZ9)jhF5kRQ$ +[CBIC!6K8Aq0MR)%@)EpVQGIpBV-rAB6!&0Z*H%[I+@8)`$m6Lq8EYHr-BEpI0XH +B`jDPGJQ[P6S3j2K[cAdG2Uk#[G8phV@!5@3fU*INhiKZaiNG2i!AGMC41"j30-Q +$jJ&@GD9diqXI%!)@Zje!"*,RDQ22D46*T0k+3db-"V-M(FpI@Ib!&*&5M'FU'[C +E2XaEVX0#'fSFr@'LfDGSb)K5h[c-EYjRh$CZ),4fqMbk0XcMeKVU!ENb$-dp3'# +--dAR,fiAXDULNeM)jpJf#G4VSdNbL)eqEd6%FjYKU6FT(9Ij1$,3TC@&)(p%&c6 +V'8S,J9"bQYGSbTLAb4ePPGUek+Tk%"ILK-V[R+S6#X!e"-'(p,A'PG`PIXX2e%J +`Nh5jl-Y0cpVGZK4SJIa*J`bF#)XckpaRYDe3i[S`QN)14'rq1ca0l!ckrU-BRbZ +f#KY2Kl+D*l!bUNcPj$CaJEM$C*mh6bDk`YXZ'@#jT-m@Q*Mj4166Bplp3hRP5a5 +b"`'T%Ve638dJS61J-KS+KQJ3SQ*E2liY05r"LGc0FiAIGfEJq9Qlebk`3E@EL2J +ZHmrK&`i!6Y)(c&AR``a33ebl#@KY(I"h26FU!hY6ZH@9#2UDa([bSb%p%+"#6XE +abVZa[-m$Y@@-"!'QhB8%MhR"NUlb%j8*cJjR@VlG@C9bU"QP3%4m2Y'rD,@,dbf +TIbKXl1b#[R[@Lk*2rNL*QmHRm1QQ8@VbBVMNFI"DMDZCkl5b!!6!Cr*KGj!!JD! +ZZD)G$*LNI'``,DC$3$)[%l`2rYq+T@BM-lDce3@!mq(d2`,3Yd3Ic#005Ja#qaI +N$N+(0-L4*eJG4i4BrZ3DqL4DjN434*FZf(e15DjGU$*Jp34`9kR&-IjFJU)f,j' +f!#3"!DmIb6H#hN0`YY%&fG2N#QdbNV"`L2#,G*T+qlKCZUScN32c2Z3iMY[f[Fq +6jDS%'APQYp"Bf$m290BNaSaL"*8qQdM'Xm`G,%8KKjA&diF[3BDTNaEF,ECH5QK +ScfRp,JJ8qCEIANH2EZSN4*HSIbk9dBS2+L%&F[IaphI-!aMT2@4C`YqNjHB[AA5 +5(Nl8eaq+4[H[Si62bi"ZYZ&l*9`KP3[!P'qI1qHPb")*hbHjP5RXEQ*G%ML@4p6 +-ApirA)$!,EY9E!)K(64&f(1kUfEJ00D9UQ,mAHaq[fc(@kmMYU0hDb$,FNAKbB" +PRYHkSE'UTNq6$"@!Z`bGdVk9E(rlF@rjC`fAFGM$EFMSY`1kI9bPbSS"0VDq@H5 +Fd+$beN361BE3dm+MU9q!()B'f`F$DV!EfMh'R4%0h'R9jr)3(!#PN!3"!!!k!!# +aP(hMY9'IEJ!""iJ!!5V1!*!$FJ!+LX3!!-,i!!!58!#3"!m!G'KP)'GM,QeMF!! +!dTC069"b3eG*43%-rj!%!*!+J!#3"d,"e3SRTM5cLe02-T@d"653!*CME81p%d' +9Aef98B)D3#U2A)GpK[Nf%b3YP$rS[eJDXiQUA#8DS&S5Pl@"DY%,UR@Rb"-PjNi +(fVfVcm0daS0+XhfpJp5aj2kh9Lr$ZKhDRj*ajU-PI))MKZ`(&(28b`r8Zc$%dlN ++2Mm5PKiha6N+(Y68#@2L,dQc"#Z'2m3dMBZ*NpKeYA+ISP,lpbQq9`VAU'&r4Mq +Gah[P`G)qV`%3m9#jqa5D(P)*Y4fY'mNSJb`TbRj6G2-$hrTj9SieL-*+ieJTfPI +lG'0j4&ECM*G3jUHPNP0[Vk9226m8!(4rQ-i@R6j(9b50[J$Hhi$ck4f0!i6Qe&' +26V4dS'+9Gq!Z8ijeFS2Bb"1fZFJ'5Cc@F"1L!kK4E(GUQ%rk#ZVYHI[[!U,5,-S +l"re%Nf9*,*lIcB"krCC(9P4bjAlD2TXMbmfM#"#F1AaTbQmX"c"HR)bQepdhJKJ +9M"+RKmMm5$T8F$pk10PE5TD%a'$-6r6!UDhL(TLqR`"Y9NB9'TEPpR)T"LZRlU4 +j4(bDZ'"+YpY3QM"%K9iY$YmTdqLc$-4Fp9#R,%UTF,&I"%DJKiD$-S%kN!"@qi9 +Udf9N$hZcb(beae14f9#c3H9jd*0*XS&kmH8hhB0@Em&XpQR[63MD--3ATCA+brQ +&hPXr#CM+0PJ[D6+efUCF*D8T(I5BIb)FQ#QZk[a4H@DRBf@eG"`!MH2J2-RP&q[ +E'PeqlU`aFJVRKCB[f++LamPi)bCp%YYe,a3Q`Q3hjeFi-'Jh,8C&K'FR@Ql!#VL +lprJHRJ)Uj(r%4'BZX`k(fGm2B99&F*R&3i,4L0j"eAGB"P&KYCpRpeG#V6338J- +L1Z[&qY3(Sb%!3P``aQi@qrMECZ2QNC8GCS%@M8H1i"$K3NBQ'ac8EhVp4f0RqQ@ +5keJKDmP3iIHF911aekhI,5V)r8Q*lr1iFU!HGGD%PlTb4[YpX1&QT`FL#lK,`D$ +JYeSEUPUYQAH+m++E%*Q#N9Cid%3%3#SRD-mTma@9&l!b%Np%SZfk#[$$DN(AR)0 +4`NdGRL&@qdeK+J0p!hNe@R'(5%(+%Bq(S$1rVPe",-fT#q8eSke1qmG3MC'cm`H +q888U9Nk9jf!1JjMGXm"`&N4r$jJVQ6A'qKj"`@RMVjRNHUM2K)&9!U*GE0T(AhA +I")AY)!f,DRTIGB*%HM$Y#UGH83Qp1+2-mB1fPkd'VSbDkAS9%2iAq39J*8YXVdj +qHrQ0`D-+!r&mV#GkVBKT-[4!NDYm)TNfL@S'@FQ`"ll)T`NaTrMLXDp8"B`Hr%P +JFd-L',L51i)#fA)%TMq91q&D``f[Nha0RB0TNbjGhe,+j'5Gaa(kp@CB`SdKU#$ +EPdL8q2Y%c(UZV5*9-4AGm2YZ2aZ5Njd&lp$rUr9jCQdc'@R`b9MZCDJM"ehBSR( +0dafc*KNpme(h,+*T[iM!#&V1!c#[-M%A''3"mJS+,@d+iE4JZ(8R90p5ViSG,!J +$DKD$'J`E"((!r"&"C2%HEVZ88A&Z5di2@iNjc'a@0G8qT"fd&!q5L!1c5QY!Y6H +Fi&Y,J+McAT*b@Sb[H6b,lfbAlM`[rMY9a!%Gf-2Ce6@J*EpE)[Ijbp1Vr,q(rae +"Z6%d[`1*JS,VQS$(6m!m%(#X[Gr*iE&@-&NJZafN"D3hbCLHi[C1$VP`lljL`$r +LFCV&C#UZBFaFMT4afPQjdmKPpl'd8ZbE"rh6iKb4H$GC(X9RJj%I@[S+J$AN#)B +3d*dY+`RXGcmc@r0%'-4YfQCH5a#DHUQ1(JKS+c*&J!,kUHZaU0Mjd0K,3EA59Nj +*!!R%cQ$(CaY9ql2qp[DEm9Hef@rVLYR(XNY1ER`EAS!MG@li&*!!J%Q&@4A68E& +TqB`I(PMGaBIDLVA1*Vje0p9&9-BZ'9-0a6,Kbd[ABi#NC1e1+-52C)N[3F'aS@U +B",5d6&H(9Z98(lCAe"qr5Rb`JT2Nh(QNLGPYi+HTUUK3U9VUf"V-p)[Kj[`TIS& +92B$6KBVM!E-'QIiPeF1'r3eDUj8G6$0pJA+Qm'Tb6Dp!IqU[%3`LmEDAXJTF6&m +'e1HcKIE(X)E##El6"Gb3!&L(2XY",5SXY+"[!Q8%95iED#bi8CNBe9m#"A*Bbkk +FG+DQci$J@8#!(D(GbLS)mIQVUXIFfPh@J3bTCk-'bj!!X@,,45Y-Cfpa+f(pG") +BSR'HddXl5fF8P@"$caJ-R6BL9f-p5X3V&4+FK0Ni#5aT+FTmpR#c2Vk@MNU[30& +M1@V,b$6hN!"Fc!ZLPeBK%[PbK!X@P2"YSh5XVC(ZX,(`*K)LmMJqe'9i$#jQ6rM +#C3X-caGp0#efRiImBKNJAEQf9h&I[iVka6,0@,32Lh!&VU*L#e1Llr&K9C'cAaJ +F+bNLh"QTp(+FE[PVQ[6bD#eKr-TXf)NHSP63"9,JB+[jcUX#5#A6SJ+Urq,lhiC +pc2&VaC2dL*Cl(Q@MRArFl$p(9VqmKV*3+AVQL!kbi+mA"bL(1DeeiJHlaGriM", +D*@JN8J"'D3`KRHXN!RJ+cJaLQPJ29B2F"$B'LCl5Q)XK8Y!h$KAUEqVai0VCF(m +MEcRN`c!0ZQ%)mRXBYG%kSf-BSH(`j!L1`9KT@jqQrE3+'P44Bf5DXUD9fb3BU@E +2"3fML(DM#i69H2Vbc"*0ESD5(S@ka0h,CJUS0)9Tq*@B5J)iYK(m*m+aD8fAD%j +5&-2"m3hLI9&'a,'d0Q-!ED[aK64!*ac"%aXc@bhABm5m"$X)G)AT,RP4GbfUkT@ +HjT0LPKB@bl'BbEBlSc3h06Zj(L!al&crA`@h[E$"K9D0*Z1r4bU+4q-RjJc'BQr +,MkB'j[Y8eHTQD2YNjlacL,e3LGLLiS%"1fRKVF*1#M&,hMe&0SZbF+clf[H8klM +#3+`[N446Am*1BZc6*GebHdBlEa3%+c2(UNP8qh*C+3@JH+`YFe(pV-4XCLj*C*P +Zah`N0K(l"bLJ`C`V(*EmG`,ZfKMSNXcCl$2%E[$CT00mhSe(XL05aGUU4$Y*$Kr +M@NimDN-f&&,Q#lFHX&kLb+rX!LX#SIAM,dK!Z2V1e6b!ZmH'KCi[cj5pGHNdkal +16Z##"Ye98GGk,jcqATqXU1)[%$qDf'`@6eT#53%Q@9V@HfimhrQKkQE4)1'eiY, +APGN33rA'A#GKGQ8V1Qaq39dkQa0!aF3IrYeb(GFH'5k)lfN-K3P(Iq0EGPVXX'A +#R0ZB"iF(Xk`-,@rM8*YN5S(DdNP6A1ZY!h9@J%Vk[2Yi+&2`+360@'36mCLacUf +*(P0(5FA*`4ceii4+*L@(9(eZ)A#S23"G'4HY$rr$km,hVB+5"hmMTCTd1R@638H +JCFdV@8N"fL(LpeY@!RCdVc+"jC)2,#CJX'Ak&NTJp,b,!V&XqQZ2+c#'XijRNNZ +HH[p9UFSY(QQ)B)kTZ`J#[bU%kHeaKbe8AU%m`c%pY4#M"(`4G@,hmLq9,1Keh'q +&V-9YS%b3!*I8eGllSPb-ph@YM"`)J+QI34+!cUL+Ne)iak[VREU!Q[+M$L%L+Ml +4ZViB*N6F`l`2$j5D$%UCE'pRqlJe'4eEY2Fb%Kc"-K&e-GB%4YfEBHUUPr6Z6B[ +"jr3MS'3**J#[K`4RU#`k!$85CIc#,$dqTPPQ#ec`,Bmc'8l2DR[c2$Eh1VQLrYb +Z0'aj$kS+cBJR2(l*[3Z$jH,BQ"J!ND*J`XFF-3AD5'c1F3I&5Hc+BhL%8KUHa(Q +5C9(+'kFP"UDkT(UZ#$3ib6c3'UH9rU5hRVqA'HcIY`BL2*32+NN'meS@S03)!Em +e60bN6d(JRHqJGphGN5-*PLH5["Q(+CXc`"bU"1FRq!lhpRirBdb6cHDR&qG%ajV +TBCA&)rhXZ2pj6U9Bh4)X1l(NCep6&%##P1jmbA`'J8@4!6rRr[H4-Z+21*SBh$h +N&JNJeZa8%"kQlpi`M!`"4-1H4"!Xe`(a`m,4*eqeHEF[!r('[&YV[e8UE(LD2VB +02KQk@XKqI9X@M$A,@)A-YbiJ&4Xc##9`i@(bl,UQ(%fXdk6(1pIG&0S8Hffb+q' +HAp(#PFZ(96*JpqPKqCl21-%bET)L(('&"SbqKF6dEBQQEfIf@G`'Z[RX`-,L%Jd +G!B[A$q0)r(Y8(LUKZ0a&Y%-,d%BKI'!+,R1CPBfS0+HQYP12&p&9Pm)ETM'q1X' +KKdFcCNdJ!#bY4i-pb3el'b[SI`jFHIUkR%GGe4r0GpKqV)cJZ3ajZYbbBEM0X%* +TS)%CpI5'kRX`1aT#I8HSh9Ic9`6[`Q3ffZJiNiNHq&Xm'#c)aDPEa3*dqZA&3G9 +pchdJK#+8lE,"`PM@F3%ASB+&d81CIMfF#%l"&V+[[99QTJL`*F'Ek2a$EeEL)2) +"@Q,qa,(F!V`LH4F%18TCSP,R(j3fJP3V5SFpfd@!Id8V!F8-P"%(CX+#DD9Y&5c +IC3A(P3EYQ'j*e2KmkXe5+Tq4d5X"laYG3EJc0e8kFd"Nk1#"J)6Fp6,d,pj(,Hr +EUC!!-!X4c2M+IlH5rKFJNIlT[amZ@9l,a@hF&6Hj)!E3kZmR)@bfNr"UJ)(GRMm +$e)1'1UEPSXlqRe1m*mH*l(`)4U$M(VJ[64rREl#r8GbE1+)*2Zk"&"[,J&I$%-D +,#MC*dHJmRFIYi3BV99Sc`hNh&V6jFSTfVQh3%d0"FZjSIApHi2$qiUe&1A0mq`Q +BQ*ShjZ4fX0#kf3Bk$&D9d"5lp5p[DphhNbUkjUMFQUL$PfC`lGEk!,,DpV@'2l0 +Tj'D#$4@b-SJD(9P@J$%!F2m1XVdM")Y13181MVl@Q"QG#Ddrf`%('E5rMkVfchA +Aba2Mm#amh!$%P&5I9(p%c8r!SjNRS[JaKiP61DCIRJR%ki1mQZUpkj!!66bq#TR +8P*81q,BF"8J'JDhRL[i#D@qAPTE&6Zr-K#&HQ2Mbk1hC46lkf4PPp-P)2!S)Uj- +Td4J1T"R"0QRcU63F!(H("LRK#[U$A32FIiLjV"C8l3I,Q@+DIGXJahTi9BcqC1# +ET*'q4&Ja,A5#IN"JDXQRXI))@+M6-)ZGA2dEVa1m5&2f2+F6hSll"IJ`9@)*0Xi +26@%G$F$5ZpYI2r`*JXLA[VLUX`Ik,!@lZ"rc"ID#TqUb8$3arIPKT5"TSeClpQD +Db&ejCl1ij@55LU[(HXF!2pAkpUQN9KB)q9&@4CA2!L6X,E$JG2D6-G`[I+&rEp& +hb`-8ZBC`e1&@+4S!Q@(cP+fmUP53!$P(RkQB!b&@APQ#JP3!!GGB5HL%1[C0,DL +jHaR(#Ci5C+JXZaMFR5(,d$ZMTUPqZrPUkIN'62(%VcKHk*Z"-#A(R,4R0f"QHDG +(*)[`Mq(Zcl)3,[1@6eIfmN6X0F'AIAXQmj!!U)1*l6i,*TIpape!*a@9piU5F%T +PPClp)me[&&Q@a,1-0"`9DX[KpX$Y1LXS0YZ4KJV+BaINqGVh)H`Jf4bG-$mCLBK +b,M'LX(hRK[-J5[i5M",bX[f&EJ(2[dZjJ%c[1(98k!&f2Q*INHX&+lZ(Tqch0Zr +c82ip5TXKfpQ+'b#Xr`96$%%IZU6'4P3"DaJU(iEj0[-D`dE(m`F,q'0(SM@r8j3 +Bj(rVa+'q)8LmC31r8@3,qD@mCUF6MY[HRMidC9r!)R&2MVe3ThihbrrjT-&!eN* +-U*%dTKUXc($S5J3B(hKPDhPFp`!%)Z31fQ2H)IXdD``8d3RT#CqDJkXk4e,R%'I +mXedAC1m3"'dK'MA++TaN5'!qZI8J0!5T#cd1madH2-K5pXC[RB3I,*E+6P@(BA6 +b@#P8'$'EJb+FNh&)00e5pEpUKhH&EhU['N@8J&YVikEJ#Ref9J0lH!%),YINB@V +f9J0p)+*BURG&)hT(lC0AcQUQ+eaAi#V&#UDi(LTG0B!&NNq+!pmBJ$9-2@GL(6$ +ZL,)k*Y3dB+Z4l%QdR2(a5(0ESKY0TND-Eh-LL"Q)6CPG`Xp1Kc[pr-B23Q8B)Lb +b!XDE9%`aMi3VLrQXJT4eJY4Z+&hmr$MH16eKP5(8VRrIF1!!R9$ahB(1hD(a&MA +)CUJCcMXUk2NbkVa$9-RYi6bJ4p#Ya0al20+p%+LP'SJ*#U`d*CSHBaPL6JM&dMH +'pE#`%P%,`Z@L'6@[p"1bddNlZ"H(Nrj#QQ2Nm2MC&LiYJp0hF5DjiZCrR#J1"U( +CjqpBr03LjJqBfTmDjX&Q1-lG58EB)@U9Y8[*A6p#8#+hIj'mm!Uij8%21DRE!&& +"ldlk+XYhieE%QD1HiGHhLS#PN!3"!!!j!!#aP)6*Y9+e53!"'#!!!8Ah!*!$FJ! +*S1!!!38"!!!Dc!#3"!m!GhK0B@-ZE@0`!!$5PNe08(*$9dP&!3crN!3!N!U!!*! +(3X(8`CFN&i&p@4T,A#d)h&250+%G,S9(0eBY04F54HC9)SfipF0(G&BjRh,@q,F +Im)hk49NB3R##Q94H(!Nf(D6+4%L[!$N-MAh6K-ikKUidL9ZA4lcJQ,UF)a**@5P +9-3AhHV[+XLi[$mN&j4JBV$'b`MC(JR'%E"1'A@IU*N"4NJeblF%$0H+k6($[bUf +X@)H-+i`U[[,A-SV"NkicRc4%Ti[#EBSRJ"(60DQ,DNq51hV+ZBVJ#E9ZL*TFVSH +l+#!fY'Gf+&M#dq`-KU'["bLcrAqi*&d*PaF0D`m,ZEBQTVj2P!a42ll)5GQ-IEN +m)1$,TN%5'TRUCCkS1ZJ$C1Nj3[#`T1iN"``m'iE%%45I98*YrlfZDmSP%CHC1Z@ +94(M51K(cm8T-'CPLSJ,Zqq@C$EG*m%TH5#,biUa`3L%iT$+V`p)Y*6(SHG+"JMB +b,EK%a1Z%kTiA-!)2"%b@k-[+M$jbeL&"i(!Hcaq3!)BN1M$-jG#hj!(rQkL2#@2 +Mr)h08riMZNeZSf1S&PDeBaeD")Vb[[N5VeE-6Z*VEQ0!K&2Y#%1Y0XX03NB-pNl +f(C(33KMNVQc2$D5mUeR*c!4F#pVaK[e(X1HPa#kTPG0-IBIRUkYXq5#)2M4@3A8 +0!E#!J4hE+HmHGej5RZ6L)Q(DEVJBE5I[`Ea)lIHG%`NMi)+#l6Q(MDKH91ISTG4 +qC1Z+'kmQLFRMULBkf)ml(N19Ma9IjS%kD##[+Y1ad3VSG9hqp`8G)AjH+6a[4Hj +L0N&0V'3hD4h9r)4fYPU49BhKNE-@V$GH1J`UA+#!r2XVhFeq(-%8M3GD[G[6MZN +Fidf!Jp80aHc+5N&K-d19raY,4+Jmd`VF+F[4(Qq0l1R&mi2jZeAfKC1iPLrT(*c +Q$36-l(*Li3LQ6S%Ib'bdqU%aVk#KD1Vq-RIB2LV5DV+#N!!(iXC41P!,Ld,'a$9 +p+MZeVA84EK)NJ#H0,J2MK@jNc90hmNNXarFR"#a4BNkX`d6,PIl0fh'X'1[`LGM +aVKGh)VR'ZJV[+9J1Rb$+kPDdr!UdJYRXdM!16Rc+Me-K$ZeMAbJ-IS&bF%ZU0Hm +%q+TPE4$0iae"(CaA5JKSPPPrBRC(m$6CX!H9@Zl6(8`dr"bkc'-r,6IVB,rKl!e +l`KcFG&VL,PYmJR1jVf3)k[44hl8#JD#Bh$TZQ)FB8U&9e,D+XG'lVQJC`DkD`8' +9Mlb#DP6$3RE%C0cr8Hb',Y9!M29Tj$jP!$QdT(LbIV*-M-dV,2@jkf2SUIE$`D' +mDQ30bDraVK[2EepYfD@MX6p3ZaG6HJ4lEpX5br)KL5Jd-4QJ"&+"aTrbP5rY0i, +a+@q%k[X3f(q+8"b+C*Dc3ir'6ZBIJ[djZqMd,h8Q-mdrLe#D&!)0-*9dhNF%&VQ +TllrXX0GUA@8&8Ff&f*2c%IRUZ+@Y3S2@'X[je6XHL[@,&#-P0ei8l42A[Q`1k@D +[*HUIQaG[92CPVqcM#j!!Y0[LB!8T("+)N!!aL2rP&d#9dML3!#)9J!GZGBDSj3@ +)#4@845@DZAGbjA)+[ImK$HbU2$RI2MM'2&Q((%jAAr'rK!rSD`(Mkq4&*Nilq$( +4PNYbqHCU[C3am&9+&`GK[6`!)@6e,)LjmFR"KVPN#IeHliAi(0k2+lI35"+$%e* +1j!"f@)pieJceYZ!DQc)L&L@%rNSe*8KDaU6qfPV82HR-2K*P9K2S[*d"J'8(1$m +YVhQH1db!EIL!3R*`[3S+-2b-Lqh5dbqXai0e'J)bIrLAbB5fA`f0c$kd,`YA4C! +!A##a*B#4KiCTL)J99PYY2Q"rpkhH9SElq`YPA[""9A"1EZ[Tkm[T"lA42"KPk$# +ld18hlXG*ZEVG,qlXHC(1(MR$3(`j4UeV["L8T[LF%@l'8$!&%95aGV*5FEASAZP +"$3NG+Z2L$XIQJI`DCG[4R+D2iEF4jV&"lKap99'h100[*bah!N2Md&*F5aV4[j% +%i`d)MLbi3SQm'B&m[$b)Pr0KY@V@#Q(f+ELH3D6X55Bh33(9TQkjLU4DQS19"hZ +&3j)6cZh,Bq%"1hK6NemifXC,b`BCMJ),ZcNLbE"pH3dNL*q'kjkC`Cd-kCQ9GGl +"ECJY0I"P+$mr+Aj9pEGYS9R5D%G4Sf6dK-dXZakpM)RAQ-d-fk,lp5ciG'#%`U- +VB%90)jG`5lRCdUM0j%rlVbc3(k4@#,U%8d+3!!"!aia8@`mAP6[S&r8GN6NTp(L ++FXQVj9T`6kYi`IVTVSP)CLTk&ShAP6U3!&f0`CJQ2,(*1@J2'X9QLa53!!Na9Q@ +e4VEGb+jNLBhA&LJl@Xc1e2+GC$"C(DM,M%cQJc*Z%QYEBN9Y5kp%d1m,Qrd4ZhD +beQ!XFJYpip9@rDF(eG2K04Ee4J@,d-r$bBr,&ah"U@*KLGM9[RkhMj+p2R'bkT* +ERY-Q%YK`8c!%eV,KX92eBpda$NDY[VA)0(3$SQYK6X&LpkhHD29`Q[AfBG(NrGk +kSP[`VJdM*0&1hq"Gb9B'aeeYpYk*S%lPR%XURYU%l&`PK2r&PCcrA0TH'C(Z`8R +DrB8Nj+N35p-h6H+Yf44rAL0"AY+QTAH-3Z&D1mNVA04Z`jCXfc%IRe@%LRfLI#D +G4e@*E-Y&HJm"R5M8b*S"-,%h[bD!h36,'U!NUmdhXTR5ml#6KSYH(f"#0e`IT$q +YA(CBdq6#jPTSS@$F2T6IKBr-EQ0k@LhC#@E3j8!)SqdrmE,PC3eKRVPLkA&!ZB, +PqQcY$XS3fSAX#5chlU1AjZYrG%9cC**[K4H6KjND8VE*46D25N5fYN5a"NqKr$N +[dJLpd$H,EZL*r4D1(G`GbT(*RH6$+'C`V8lCDX4T+9D!ESI*2J%I16B8J#4hEV# +3!$9aImS#Xr6-lLqHk"%!!`e-)CNfe&EBiUF)(1Xjl)YJ$U+,8bi`hG@ik"FRbHM +B))'ED5!$6X$c'BJJQ&)21V8m[3E0-b(aEAB03R3m,id)CNbjC6+Cqi+#FbSHd`2 +Di)V3BQ8jd4e1`Xr2e4rk"3Xm0(-'S49$XmC$G+fMB%6SSf%E1@a2"T[44966D## +[eY"C8D-FB)9#Y'FG&C*[CLP(['(NKb,E9UHbKZ@E'eCbp5ai6EC(8Db%$l)e&RE +S1MekQ'ji6`eG1R[AfpfQ6aXIjZe*i6JP*@rC,JCX29!iCBVMdT[&qL5Td25f%32 +1E")-hK9@U2h8G(Y&QjJrbZ2Y5q4(aYBMkGhXHNHVY[HH9k$rMp5&A2b[1(T0Z5& +q+jY35F%K)5IT@FAkkK8Yf&0*VqH2PR"[Kpr[i,Jk@)6lI3,C*@-k!9JF!cJ*fRd +#eQ[)Bl6[@K!p#FRN0+b(TS!6V&I-L-,mr1G2iS(@EbRT1p)#pf%rmc%B$@1a,!N +@MBB@UGfl0h'TD*D#mb(JT%@!IdC*LdC%(0K$*rCVFV1@6BE[8%Z4)"FE`9%L(Rq +[!kLT9EENU[FZHG*8R"3V8Vie(ANLEM2P#LLq*(QbfkZjMVJrL3K3X1iQFTEcF)L +pK&kqD'[6EijM"YL09AJaVaX4[i(NJpe+ld2YJk1Rr+8XB)Uk6TZY2KfAE1V&%pq +*l@Ec#!%L$pYPiSTZJ2@pGkd4$8A[rKU!drmCq1eC50ASi'U4Z`FZr!$@Ffj"2I" +&jl4GhZD%$6"'kLhkq[cVVRAlP8fF@FBLDIFJ5bQQd,$*L5@e!8Q!'TC[eZI99,F +N@jAjbbjP6%llqKpMich+"8BKaPA#3#CjPS1dc'*Z-6[lqab3!!N[YHP!Z4(&TC@ +fHK1j$9$,+*G[%r#C,,8JU2$N#KPmi*F[*lIq*8(EMq04S@paRXAXqX2IK`$cLQh +feEZK8@)*&D'q9Fd+TCZ)S3b"R1iR)b(+Rp-3cX-d%c#QJRk&E5Q5S1h"5JSI1Bq +CH!Ih,Cq-[R'Yf2jfHkDp%FkIQ9YINkm,kCka5c)8!Vl#ER"l&6'!Q"!NfLJLP*k +S[3JYJ`FqQJ9`U2VFB%r-P8&q%b!D8+XDULm4b%fr*QUYkF&9LTYDrj,jcc[Yj`K +9!#1DKNBqVbBmaAm8I)JN$-#ar@5F!5#0[*jI[q-V[9qL@BiHYJS#@0SZ9UF%[IM +QB"GZK3SX8!!K&,DKQ5lF'6EH,hb#CKX8l$eKX,UhP09%jZ9!A,Z5*c"Z6UV$Y`C +IA!e1$VqR!Q0ha`$#+bl,-J03Ehc48[%K[qRPefTBHdI&N5Y%H"XJMDVbrKS&3K8 +J)`JDRFB'8ZL&0(`kVpV"12qpaV1p3Gc3M(HN6NYbk%AMl1UL,0XQarFV-39Xc,c +VImY5[$ZqYi$X+[,0kPhQD!TS@FkQ&RY$4SCqIMT8l!J(pk"rcmVL+SNQ0([35'9 +dJ`bA#a"+T"D@X0N!5"PJM#3TrJf490Dq(9+3!,-aS`h1G689ACcJ'V@P)d1hPjH +5X@1eE-@hmmfM%R)c,j'p)`d$!BmIK$'S58ALPJjfqI5XMJ3+,$*LVZM9AP)+#q8 +LRGfAp96BeQjc*!8G6X1lT3SY,0MGU*afBp3PajH!B4i3X@"`Qqr9FAFkj6UY&e` +[CK-fZ%pP*[i4ARCT'ar$pXR6@ddJC2jqGF6Kk)R"PF`PM)QJY3R,N!!r@!f-ab- +VmB&ULY)JQTfhBkl%$C4A@QFJa&PEe2e4SRAlC*f$"HCiVjkS%ZcIq-aD+l4r"!* +[4q!#0[aqqjZFK-YNj8[BIa'SGdC"Ye*)"mU-Y@q0N!!UdI2HmckjB(+aV#6lY)P +Y+YNPBVP2SJ#0m@e,qfb5Bj(%$(5YTXq&I+V$H#CFc[a`jZ-p#a9aj'!"#5k"#Ir +6Xj[&Z"YfelZADN1ih6K5%IhT4SN%%"'&+G6%J5I)K2bC,mJ2+-r(qjj4)[ArA() +4[)&Mh[f@biem-f,$(!Jm*%SI!,d(SIX$[QS!R,`*qbL,`"QH@SPQ("`j')HhC,E +R"&L)X+3Cl@L1BB2+-rGUd'aXqTU4RkI'P`dcaNa3qN0!irrhiTAe$D(i4SS#Q%V +5*aE8"j8Ja&&JYkN05NS!0!jElq#Cm"Fkp0UEf3)T2J0'j"GIFCEZl&Z4USSNbPB +")PX4Lij1[!DlGlCCmI(Td@*$Hfe@`G%%q2-S$cPX`mBm'b)F!cJb@AbC%@FZBeJ +iVbd6LL[Ra9dUiK`,90$BME*0XXIj%h%E(e*PHjrR"m#h(*c,[3jGj52Q5%P6aQ# +,ribRl*j,"*V!i(LeZeUjq3K@d-*l*G1k'fG#I5@+0jR+4-42m(#Dj!JYK3i0cBV +"ie"B[8&#iD$FDJZ5@H%0C)TNG&"(Lq,'Dk(@4LN#&KBDT)e`P(5ic4`ql0[GI3T +0rLpbAf3VF95[pAa,Pj!!@U$Z(@XS&dN-jJS-)mKBEN*`,J#0cL39[!`D*d'`b9M +q4$Z[J4d,FhA90b*5GljV33B$EHMLiD5$erC#ah)#$`LhUNV%c9&a9p"V!CkffEF +Se+ceK`BLAShA`FS66`EJSQMS589UJ43[m22[EF,5m+F)0bDpTf25!$9@'iE@!`d +K"D(2VJ&B)M1-XX`!2$6kFPH&Zq2T493r5f$Z@3dr6EMRNbV3m#R-AXY%"9*Ad`B +ETmS'Z,,"[Y$'S&$%KXpVqLI%ihZ)m5(mJQjE6M0f[q`6ClbVRqbQU`a%1PJ4,-k +"j185m-*ie5#f+25@0B$cG'K@V&"UUlN8XqN-%JHr"I'IX,$NFJH2R4)kDb4ifXD +$iH"k80@p5H$V#$`fd8V8aemIL#)#[C,IP-ddkm6)i5qC-jjX*(NQFklr4c5Y!V@ +8XqGc3dq91FDp9YUip#+TFUE14ifq`AH%8&5rK2hQ,JX-b!*9ihd(rXje4+6@pKT +R8CTS$$cXf%2qLjMEYaBYf(@[6RSAeLq[U`iLG#'IH*50kTJaafIME$(r2a([aal +D6M(,*$#iUk2'E-qLGa9NGEpfrU'r-mKM+JjSe$4L(1*6D)ASUeVF8Q*F1i(H4[B +-36I93hL8Ai"%bpQ&DlA[HYqT`a-#0kiBhIR4p+I%S"d%5P&1S-4SQ$TL9Rf5H2Y +N0f-0FPM!CBQR+GAZIp69i35X$meYieNY(rS8D[p$LaCc,"$bPRIE5!NXA`L$REJ +Xa6YTUA*eSkJdCLSM-9#-9SU[bV["l`T[CeGG,`pT29r$3D'-eC5)ZcF#TQI[PQ' +*R*!!L",jhZk1I"rT[JU$LP+%825!Lh*&m6l0S8JeGSUd,Ni3e`-NS6D$!`)3'cG +Efrl2b!+1j`U)8UR`C$bRQ*5d8fD3!2[E%#@jST6h4`FcmdP26`'!V0rN[!$Y9&k +ef'j&1-F*[(#50CNEYqM0lQ49JK%SDfTNcB'KaJ-r[#rSj032XNp[)F$&-65m4a8 +5J5KCd!VG8`,e%j3#NNfmh&0TPM#ICr4H0KHE,)2['Q)`DC4mDD(ppq[V%lj-q$1 +E18"[EKLbcV!F9AbMm$KGpaQ#r+HjQQ&5dlS#bVHBV(52qMMGCceNqL+Z$[jR)K! +NGBJ*5l,UdEGdNF$lQpdLS`0kVY%Hp3CeMX%eealZm6c,,4L6ckbAXZ#YL[(46*K +X3Q90,p3GfL4+!Uae2V0dPjLLHQ38-`QkfC&&IG92EP@Rcb1QMqPY"&r-NbL+KFD +S9cXCN!!Sk`G+jkJ!PLbT'KSZMS`5lDZ!aPDTFjNKJSEA3&m'I)T`eI,ZEl!%iF) +d0B$rM$e`hLX(1&ZeNkq@[3p(i!VGQTMMh38)i1qcradUQMeQ*6`F0R+SPefX`If +IA0iNji($B1('`+8&3p!Pj#XfEkVpRe+8+!VrMi2#,e8,G%#B06Xrc(mH"Xdpq5D +(C2a1Rkr`IaSrb8@#$N#)*R4S6$H)GlBK)jA!5%&kXaqil!JAKKaG'SE,IamANC4 +crYS9ZCfi-3%-2cX[K9&-6,TMrdq"PM$fk#G-4Q@r,TiC!`JBm`TDQPJe-b)Va'+ +#Z,Sm&m5beKhdqI)lT6!cQdSMY!JN2hXTiqS0a,V1KLi!aq,2qTK-K#*Pb$fG#JV +,l!Z3!-!9T#Q)AX2fB$-TTcF`Lb-de!#-[k[$m5),[9c*S"MJdBRG$jmPQXMS['+ +0(QQ-Fa-*Va,idS6KARcK"&R(EV+Pl#a4+bX!YPKhjq$I0DM,ECmj($(r`A4XfhF +)VJV9B``l)e4kU"##"iBldqS6pMi$!1Rl@VT6XG8C+DFE!B3Ad%TjM5J532@@5K- +'C8,eELHh*hV1E"`r3NZ$8Db2kaXTLRM`aIeRa3KAq3e#U9ea@cJ*[[DBlb'$4$Z +f*4lIZ&APc9+,"'GZ6cP[$4&I%K6RFKLDS"+[MBGTAbhQHjfTjmb#F[ADK#JH6Vl +TCVDkJ+ZFPNec4-RNGSKJ@'hH%`Z9[0!qZ+4mZYUbiJTJGE3I,(MKh)GVRbiqReC +)jR3J4fj$mZMPSI6@#p$h@iakFbYKNBad!CN4DkY1I#pTP6FE@5a%f+@k[cjJQNS +bci"fj1pU581jCcc%V-@Gq$BZ8lcb'%KpNc1IG%e#,epE-h-VG8bb0PaDr%ej3#L +9lfDk`9*fNCdph&D@Z%D9Ap`TfGeK#3%-C[EKJQE[Jc5TKI(E!DRaA0GZDfhB,-V +ZC551[KLRFRf`[Q-CE0HPm[M3j9EiS(M6mA9E5HmMqKJXpTH2cmckfI8J"a3bKQ0 +&Gp0GCmRdV6&LY*@#mh$Xj*2IC-89@%d%VmTie,V#q2m$jRF2VZjS*V9Y,39m6L" +B"U-NmF*Rf)Raq$@K3*2C21GjRekK$#8TrqRfYDP#jB6IB&GJ4RXaJbHJX-dA'Nl +,HQS)6#aj,"J#hrZ`N!!#bS!XX[Hm,ZADdfkGq#i@QqVbb!Sh4C!!bLXfENB)0,I +P!RN6L(+@@&,QL`A&P!JdlSY9+i*)k@KqJMef9SJh8Y+CcaNQVTC(RfEkhQ9HYfY +F@CGX!cUICE2rT9ZGUVhBHCKBXe%*p(b5Ppp6cU'i@FDB8TNeZSbMECPh$VrN3dP +e,0(E-`*)fa1l!@mKp#GX3aE2TNd&I6McMHIq[2b@Qm!SV+&a`)Sk9`3jTJk*K-T +pThf,(F-)F4X9r8-aZCB`PII%F1SA[QQ*EhmCHLB-ii@B$MB#Q'jGp&hRl0ZNR(r +A5!6SLkfjGL29T,P!hY53!2'RZ4YcHk"[r3-m4T!!R%1b`bNB9iX'cI9VUXC2N!! +fLHR1(amX5(*!92R-kJ+VD8eDFE$CYh1K3d8f"MZkr#I+U+'BcZCS3,ZXaU#3!29 +jpER-f"KMF4qGHM#dE`pMrTLdmi%q9jBh+C!!Yk53!#"XRkH$6h-Q$NlKd`"I6'P +XKr9SNiRS$L,JGUG34!dHFR1KKNNTZAKm2FLk-DAFRe$I`1ZAIYl+#Xp'A46-+qK +bp+U-2$B$@Lh@&d"GHr(Nc4bKbdRJ*Y5Mp[a00Zd(Pbj`(p&!)qVBB[5jfLGJlIk +laK)FYXq3!22XY,N*BU&qcNSIpdpBb)hmV)BTJ84bQcJhbB)cUINfLEQN9kapE&D +L($M#XlAP,@E[N!#fRc"#RpVbJ3"H,`[`)D#AU9fc+-f@`1-PN!#3!+b"BB)mDd` +MQkI$PKIkc!$S&I,#KUb[Ye+HqUcP!XhfN!$f6@h8kha1ccMQ!)cPl)V$TIp9YI( +D#Vr@$Dj3(MZUCF1fcY[fr4R6R!jSfSel!qc%`6I4&a5jS9lZ"@3N8(@3!!$ajkJ +XKl0Fl`34lp'X1ZKET&Tj63TKS!BQd`'9f,f`qc`YAcTCKI5!p6a5VLk`)"aEJ0! +h)8P2ZZ@hTQcSH0k83@81hm!h`ppJR)hZ%eEB-Mcbm!mCAA9c@pKS4r#,SlC8h5* +4!K`45K4e@2@+V@fZ1[a`9$5#kU`EQVZr*IH!Z#J(4FrSVf'-(PC@cEcS5S852[i +hr9$k#l`lX5N%#K*TDq8m'lTp``Cr%)'9FE(*q51EUpmCJkKNrSYS9mZH3(X+XaC +@*Y,3dhH`#b5QG%4fF23E2@4$jcKH+G4dc@@X)0eId-h5AaAN@)62RrjqI14p5QD +b#P1'6PKa9`9XPdT`N!"NhQ*c6jrR&cj&jYUfFm,m6,!Z`6-5[8b-9'b8SMm*50' +R8!$mH8[c(SSqPqh2U!4(Q6$,,Ip20JGXD85%JLE@1R0(%r+@fEe62X0PBL'JaIY +,[E,SFK[if5h4,T,5q2A"DJ1iRUN*dD#*K-C)BGBT@p(m5%"6RQ,*,mYmZ1pYA$( +-Uc(XPEqV!Hd$kYIX$j!!Ybfk9MMNYerG9(F-GHl6)+@3"!%!!$F!!,'8LL5e8V6 +R!!%UcJ!"@NJ!N!0b!!GI,J!!ilX!!"2f!*!%$`"hH(-ZE@0`!!$5PNe08(*$9dP +&!3crN!3!N!U!!*!(3X(8a1b%RS)r1mQ%L6ZmZ5mq$Srd"!432-L[R1U%D6aY4P` +iSMRca!bC(Y6lGT!!VUY)Ih9mDmQ"+qDR2)0M+VUMJ8(@GYCNj3iC39k%)fDTL,Z +pUG9i2$LHXCR#rLF&I#NER5[Z#M-jR*9+90b`#@13!!QdT`&F)%F'5E[64++BVM, +`Ip3%6Mjp[eP"dM9&GYQjC5SMEFlD%lb`@fiRFd1X$6lk`PcSUQ-JQ@'*qYaPla@ ++cU$qfcZahGaDLK2SmrC%TC!!S2)jM*mbm92kH*rN%fQ#k)3CaX,)I4*e%qK`ZD6 +i(IlSB@1)2dk)be6R,H+KTAXZYr`[j)dT)Z!$L6qf4,m+Rjd5,R%I1l$1RR5GQf+ +R4ApkZT!!mmmIUH#IDNbP#8cU02Z-acUL!R[-Ib96UTM,D$`IA@a([F+I6FpGNd, +93hq!$r@ZRB'mpUX`TI!K1L!"YBJEY1i8XqXPi1fjD!!dLK96ejjN`l(23NP+m9, +62IAB14bBaHNNSYCEB-lXdPF)jFQSi6#0`NjK3QdaV(-qlTXM'%feI4m-1!AFrQH +TU$'1G[VJQR"Vb2k3!"1+Xik1mr$63j!!QIYVf9EJkl46k%I05'@+)IG&-'V@84Q +ec'BGZC*Y4eS5j%JF8bkapXH0V`H'1K62"h42@m1La1,&6YFp%mh4e0HP#FDk0)` +%4C`@U6TYa(5T%+f&2$TXU#)TE,Nf8r2I)PqS6KFTq)@Gh1deEJr-YcGK[a*NG6A +$h9'#jM44,B9K5$2$HpHi5Gi(JXJVE`AGP*C%"(U1qGRJCTS98p#T*ID[B$*3(p% +2+YRV%f)iMjSkeHB#U'bfl0Uk0%[0X19cdN[2KT9!a#JN+l)9f0fd5`IY#qdX(D# +k",mcDG9`lrhq*(I%ej6cmfbiDKVfGcUI0p&j(MXeMi1"H--l(mhdH[dKp,k1,G3 +Q4,C$X0B+La@AU00[(XcYX+m)$U()@X1dY#bDcV@Dhfik'd9FRZp-DC4-3K5(S+q +,NK*IibY2B'Z5cJ,+P1'C`J#ad3E6cl@%3UEa*$K2(Ym4ZK*hFKCQVl@q,YYkJNe +QaZYf+F$$4*lSi!Q'"QQj,2pkU-MMMZHZ-Kcp&rBlq$ph,+ZpFX%@IXb,*)K*0Iq +U6dF*jK[NU,[Lrk`D[([P(0(G,1IFrQXlA4M$X%XJqff5fVQ5K"92QAMA#Bh*r&N +-&)"JSM[h(3bbbJqZi(J&F"58[hJQDD3JCp0LAFR[R(2*@ilDiqqBkrEL(CLP,hi +q`1rcK"YDYH%bfMV3",Jd9`8m+mdHPp1UB63M#6I61flTa`'`L,6HejF4q5h#HMY +FS3H2Xj!!pkkNHB6',U'$S8)l9[&)FDS'"qhElCCS`BC'J%(-)@2b0Eddp-#%)K' +Cd,ZaEP,*2+rGI#L[p#-q@I&2,(e*e'BcVK"3$TFh!4p6m!6"6L#`X6dP',kNB%9 +2PibG3[h58SZQPMMjJ,8i8@a[3KGbQZ+p"&!c5i!KKrfDZ)e6[$MKUd'ZNP`b#$l +MlaRl-2f0imiVBdT*6XIRB@c@I-J)(DkJ2RI!'#2QRd&LAfjk8$+8,RfC%@XCA`c +@hZ5!alpHV20RrF"B2*k&Qq02ejh#krE2qH6P6535A4Fd!A*pGhjaIMrch%*q*&, +9qra4r5XPp&@E+JF60SaX)04+@BPXlM0kRp-YNB"9*S$DQ$cheN%G8[CRCb8!QLl +SQ"lG@PhJM(@,AHZq4acJmdIj'Lp$X5NQZN,JRDqdYiT#dE4fAb0j9Kl,3C3jbp! +A1@0Z[NI-HTBd#mN0"ma`REF0lTIN@UV*GaEi,bam"Ka#9+N&`5ap[SXaHY)LLL2 +HbTILfkRYEN)"d,53!*eck4Vh%,JX(TA1$m,Fkh82I9SpkE@9G&mBDU&V@D1i!@3 +hPM%h!9Vr6KjMk3IF(*,BEGblAkpAMDYCccCX"qmJA(DFSfX[T5#eQl$Iq'2,9GB +m'1iCh8bpJ8eRMG0GNJl2YhbKV59Rb88rh@,"abdSTNT"@#cM91+D3bJ'KZQ0me- +$l&E!Er`'e$*e[$k"DFa@Eb5P!MdG8Pa@p5!Tc`GUK`[cBkU6CcY5)L)[('c[)0* +)U6QMXhS3akalm6MHBXRdMR(,QbX#CCGjVJ"*&,V+M+'Tk3hNcJAJ23&'+mJ*e9` +B2eD%@db`MJU0YGE+%c94Ic32GeKjlR08IGHJmC&RM6m1bVU*P`AUqf+'C$@X8GU +eSlfZpVcVFDH5A)b"DF&qSVF&ZHB%TeZ,GYVjelc`ZfC45U$"l33XQCU0N!!8&rd +#ZP*6dA(3YpNN,bm4(ba3Rm[cdBFl36+jNZ*@8cqXDH$X6qK@VZ&plFpkR60!hZ& +AffkmLiKV$5D`JmA!0aVa#V+*0YU,0GNQ-EN3&p4JF@'Jf`5!SMFeeLTkZradA0m +ikb@XXLLEX"jFdpU2#KKY@Ej&aGY!m*!!H)+DVhBIc&JQ5PiUJ(0,TXP@BK8XrJc +)iDVY3A$e,+J+*LQEQ20ZXG)cmTP+6a,R5'p3)h"8P%GJj9FdR%Y8b`hX%jMP'`D +b0lbFiM#idf0jUr[F4l[36[EXCR1@ehbGb8NY5qrc&%X`Rmb8B,e&r4fdNHRKZ,V +!@8iZZ5!d49bq)X*e6ZkB-NYPpmZRKfJ'4Ud'l2,h-ECQ,S"VTa%+T#aPjH,mbS" +&Jjq@dU,Lp""dQGI$#mDNF5G"`5Pp4fJQq1!fl"*&Q%eM4f4Ic&Q2ZfK+BHMX3Zq +TSL2f1rGYkaA1CG6rJSlq*&NrPQj@H'SJf2qml6!i@f&#QZSTif*#ZhF*`JmeDXC +22CiXB98*D)8#UXajhhla8ZQ"r-lDh%3`GAd0TR1Y[Q9@SC%3%d[fEVXBEU,@Gq+ +VFBd!GK8%1%$lc94HmILP',R[HJ'5EqG#pJ4D4JD$mj+%B)&XrG@8N!"j0i5G-Xc +PcJPc%9B+d&dZal$flZ'GI&F,j%8-,8MJ$8d58fNGl2EZb$[)M$FdARCA-qCR,K* +[5JPclMb`lYCR*T[+RYX!EmfqcG0JM1AdTA1jNPI*Ffl&qk'9i,'4HX3GirKRL`` +fk2V$3f)L3FS`$D+YJaf#NT9'PdG0@#1lI6fa%AAC*JDGM[!V'8%ZrY`RAGpk"iD +ZbdS*QQF6k(*G%@2J9,22lRJCd3[2,dmINm0Ak5Xjj3BJJhml$1XNhQYUSq%N,1+ +!j&pZaC!!&Q)8P`Qi5X@+TIc)9C*GL1%EiU'Hp8PU4(2IiFZ0PpmfEeEM*K(UU'Q +QHDX@Ni&1!BHF'CNT$h$kR88`@5prRNTa1SNYra%R@!@ee'IYd&b(4dFMa5SY3HS +582J4Ph0XRKR$RHRrr6I)!bIe"GR6De0pXTq@cI#A(`QHXLB%2a'rT#E-a!$QZ3k +Gqe["Yq-bIT`()P!%+EYRmN(Alp+Kr()i5"dKha-iRIhXG"JKk#Ujdj6m#0*m$bP +,N4`"&e#$CB4b!J8Q5C6bmZr+e)kmiD2Uh1PQ*!9(hmGF4G"ASa'Zk&-@$@QlL+M +U$1A-Le99r&HFB#lY&%23[MJ'F(EZ&q1dlM`1Ne6E0hIF"GAc$i8XKYNc81Xj,3e +a(r#-%fS'jd5Q49P'DE"YAqK0"9&H[&AlmNB!VZDJ*DKVjVIMKE`f83!*rCXZ#N4 +86G&)h`+Ki%(U58d4NN&TQa@`1LUlRlBBfb+*-@,(J*fp+0qf&,E(rkp8XrkNU-I +U9'6"R*-*&jPUiIqD!B2Y'5J'E$M%MpeC`f29kV(FqX9q%dh-DRVhM(hqdd1[9IA +(NGQf6fM8PXmcBr5l-,dBJ3D@L&XAhlqdj6E"Sk(H8ec@q+&dX%P846#r@(h(6!8 +m`#3S$K+51Mf9N@&G*MJ#BT1'0VU4cqHa*Z1[%%M$'NY@BNV`HP%NEFG#caJ(G6M +`LHPU&KNqh+Dj`XqA*MLeeheT(*CC4``G1U6%$-&ri!4BIC)jT+"@24S!r61DkqA +fAK3)c82%fU5'`Q0Cf%LR)RDXh%3aE9URmJ@8IB&d*DUGlR+l+#IPiR1@6@FeS@a +X2BL$MfH5ldJim#[XC*Qa3Nbc9dj#K"p23rGU+k4!G[&iH-!'bIdd+K%`U"Eq$mV +")@TTj'HcHh0)NdhH'hA*6jC$&,MYi(")r*Ee#LdGc9APf-(*1B4q,E+&GC14YHI +cliK*US',,&e4CF[Th,e2kkR[5F[(*Bmjd@X19$IL3h2ilU%`d6XC[pJENc&M1R3 +ek52Jl#1YD,3Ae2rfr#V%Qm'FPbaK2HVYMM-&T&KjR%4P!"JaPYk$RGfZJB#+Qfi +diq0N,(*2%)I6)aNT&+$8XE[)bJ-iXlXa4CljrU9`5'LGq%85$N4GE0JC-M"IUZ$ +"S6HlpGi[bfIV0p[[F*daJ9c[)3&!-HNK`#IhCl-hr335IN)B2,F-!6Z3!'RDR3D +)5B40UiI(j4"Ek*J)h(N,"m`Q(Y[B%Lj5UIbXF"#*c"6Bf56MTERbZQHl8IH')-% +f#UDj0+L@+5Kf1j(G5YcMG0q3!"ji3Sp8@N,5'MD94NNe9da9N!"R[GDN,D*b&RG +!"$r`,I@3!&[a`*RrPh+lXSjrD$dV,hm*r(kM$rSP%d#2X%Fq"Hb4'80URJ1X!+b +I@4'K@kPkR8Nb#qCK008dcXq4EA@dBl1V[H&K2&f5hU-1'8%I3r!@ifa5&ZcZUme +3D5DAm!JEk,M!a58T+fZ*JlD3!1&Il`HLAGjYa(0B(JJ)SGeUD50!Qqd`,lLRmZ" +B95&3Cr"CP,Q16ERaHi4hrY'rQUdM,`H"la"HFM([p8*#a8TKc"ddR4[K)X2GL2* +2!@L%ElkhKD$im2,aBZ$CqYhZ+V)4*DrV%52,-1Mekk*!%lLV!Rkm+#5N@hR**R3 +aj[aF2F$p)ef3!(mZTCffAq[%LM90AAlbq@`b$#9NkV!k@)(kSfA19#GXf50lVU8 +3KE"b8ETeJ-UA[VcGSU#4hk3XrFSD,0)Lf!iQlBKciqKr+-Y0bIm*M&U@Z+-bl!X +"(0'b,D6+,%"9MUI*eIZbiA$3!YjDI+mB#XJ35I$F'H1k0jk#ZalfP#,!J(KCSf6 +%"EE`9*HA$E2iDU`Y$PS`&G2q9RED9@`(c0Dr2Mh!(e(#Lf-Z&12EFkqiA@G#8,e +555V+r@'PG2"aMaZS)9$6+Qh#'EHmM$j9SCV-+-ND09a83IBjaCI8%GkEfGar5VU +AaIAd)1NS2d,pd6SLk&ACN3pC4-!!3PZj(+RYmLRIJ@NC44$@%"!b#k0&4#P4GHZ +M&2'H`XLBiAXZfLiDU08$XGjIq94Mi"hJQL'CN!"DZ'$)H,fKDNN-(1S*R-hmi1l +Rp#e![IR+!pZJSaI0(p(bVRM,`!,Y4&$EBkPpqL24%GEq8"b8#V5m[c%Tkk894)( +BjYT1P,LjBaPakK-&EBhCqk*5qRq3!*kh8,FXNAQI8AGKJKEUmPEp,S(HP+520bk +BTB9hP(QEAVYe#`AhAXfiCr%5f'C(@cI6j+HQ5QY`cRH$e&TeG(YbmQccik26paS +T'%(,D-'fqQG#5M'iSiX4Y2CPV'i0+G0M$UF,pX`#Q(8[6IN,V--Xmbpi6Xb1#&' +FTPNB[U,AN!!1!F@Y3`dVjk!1ALdcr@h9)h&pF`kl`T!!MS(JIaMf)bmhb(J9&b0 +14@$H-4#+1J#4pl-I6i#JmMqR@$(4A-,6XBXRqPj91"F[%-(bLR3[$&VLN[&5[-[ +B[1iCAQ)NMR$4LRpTMLm3CEKNZ12A+ELELK#q(0iJRGrA!%3B&-04ZSGP*CbUFCE +De5$58F83eidEY8YFM[(AmjmL9+LS0TkIPU*,%$Z`prhBH*Lq350JQ,1B'Sm9LZ6 +[-mr29Qidar-%q88P&aQkXmAHl1lT#pCM#k`QUj-`hc(`-8#$-R%*U"!k)XUe3LK +d`h(q&"fbmfZ+6-@qkEN%&fTY&`0fLUQl&HY4+hM5C-B"fY$1e0L'40!+01P4f@` +a@$UL%ePEJ$%-+J$pP*)5iSAcY0-*4d1m!h)TUp#80fpqS!S9-kpF%BC-FZ%A8Pp +,aD"*3@CZ+d[-X$&ZH"$d*!rdr+XZe5*kq"X[4'hXjBPRl$[fp5[-b-LVm0a-alp +5$TB6kpX(j-qDHK%rjP`64911Ta3PcKCDZab)8im#3VE!2*%5Y+D@!YpkK9(cTCV +F+DN%dR&M,1V''YR4!ViHI5memP8L#*2pX$UK1eN)1p"lFIdh,K1J8pNmL2Leqri +m3H4`VjMp1X$GF5GN*CBr4!rNh2F-(pc(`d$h(CPMCGkf6Z&TC,r0E)X`KVDKRr+ +%1Eb-k4Zml+!A`#@AJ$NNNIN&@%KTIF3'B`-[44V!AafV4h9fTC!!NJNDS"YkIQC +Phlm3RihH41H,rRDGVCZ-d&9ETBJL*UMc-r`*0+MR"&#6@--pZ&-p+c-L+@mC3"i +S&1RmHDqZJDIYj&Vk$)9Z5*lZAl1REJYHGkd&M1"*rM5iBkmS9Zj-rG12`MRXAqb +dl+emcS"d#V3Y+AYFP)UpH0ca1$cCY+18c%[9dU!piA+h#!'[l$MAM4LEJJY8bRQ +j!&mj#2V%5#,V4*!![Q(Z`8d#&eaJ8LL,,(AT0"9+SK,dNPPlfdDDV@GjdV3Gj%* +qG`F@cYp8p"2GZCQ3!,#HCQEXqMkk!bB1&&,Ad6%!3$S,0f`p5iQ6AFie-Pc1B)I +l1aPkpdEYDpBT$NrH"(!@al&DKMJ48!bQjbBAH-X*'ZhFa855%[$KI)KHeG(IbR+ +iL@VCS,aMARSIj4"pZ#0Z,+Eh+1!"@I#J6'-5e9FSHXmZpXBDl"jSAYPb$@Ufd,h +`T6[p-Z$")(ehH35241i0-[16*R-DSA)Z%JN)4'r!jCP@8Z6Y*l!R-a"Dlce"E"9 +jJV0L@pdQkX#UQ`#PN!3"!!!`!%!!N!N"4IF!N!Gb!!#(Q2q3"!#3#JG-!!!: diff --git a/src/mred/mred.cxx b/src/mred/mred.cxx @@ -2313,6 +2313,34 @@ void *wxOutOfMemory() { MrEdOutOfMemory(); return NULL; +} + + +static void (*mr_save_oom)(void); +static mz_jmp_buf oom_buf; + +static void not_so_much_memory(void) +{ + scheme_longjmp(oom_buf, 1); +} + +void *wxMallocAtomicIfPossible(size_t s) +{ + void *v; + + if (s < 5000) + return scheme_malloc_atomic(s); + + mr_save_oom = GC_out_of_memory; + if (!scheme_setjmp(oom_buf)) { + GC_out_of_memory = not_so_much_memory; + v = scheme_malloc_atomic(s); + } else { + v = NULL; + } + GC_out_of_memory = mr_save_oom; + + return v; } static const char *CallSchemeExpand(const char *filename) diff --git a/src/mred/wxme/wx_medio.cxx b/src/mred/wxme/wx_medio.cxx @@ -393,8 +393,7 @@ wxMediaStreamIn *wxMediaStreamIn::GetFixed(long *v) return this; } -extern "C" void *scheme_malloc_fail_ok(void *(*f)(size_t), size_t); -extern "C" void *GC_malloc_atomic(size_t); +extern void *wxMallocAtomicIfPossible(size_t s); char *wxMediaStreamIn::GetString(long *n) { @@ -411,8 +410,7 @@ char *wxMediaStreamIn::GetString(long *n) Typecheck(st_STRING); -#if 1 - r = (char *)scheme_malloc_fail_ok(GC_malloc_atomic, m); + r = (char *)wxMallocAtomicIfPossible(m); if (!r) { wxmeError("String too large (out of memory) reading stream."); bad = 1; @@ -420,9 +418,6 @@ char *wxMediaStreamIn::GetString(long *n) *n = 0; return NULL; } -#else - r = new char[m]; -#endif if (f->Read(r, m) != m) { bad = 1; diff --git a/src/mred/wxme/wx_snip.cxx b/src/mred/wxme/wx_snip.cxx @@ -70,7 +70,10 @@ static void memmove(char *dest, char *src, long size) #define ALWAYSZERO(x) if (x) *x = 0; +extern void *wxMallocAtomicIfPossible(size_t s); + #define STRALLOC(n) new WXGC_ATOMIC char[n] +#define TRY_STRALLOC(n) (char *)wxMallocAtomicIfPossible(n) #define STRFREE(s) /* empty */ /***************************************************************/ @@ -478,6 +481,9 @@ wxSnip *TextSnipClass::Read(wxTextSnip *snip, wxMediaStreamIn *f) f->Get(&count); f->JumpTo(pos); + if (count < 0) + count = 10; /* This is a failure. We make up something. */ + snip->Read(count, f); snip->flags = flags; @@ -915,9 +921,25 @@ void wxTextSnip::Read(long len, wxMediaStreamIn *f) return; if (allocated < len) { - allocated = 2 * len; + long l = 2 * len; + if (l < 0) { + Read(100, f); + return; + } STRFREE(buffer); - buffer = STRALLOC(allocated + 1); + if (l > 500) { + buffer = TRY_STRALLOC(l + 1); + if (!buffer) { + Read(100, f); + return; + } + } else + buffer = STRALLOC(l + 1); + + allocated = l; + + if (!buffer) + Read(10, f); } dtext = 0; @@ -1113,7 +1135,7 @@ wxSnip *ImageSnipClass::Read(wxMediaStreamIn *f) long len; f->GetFixed(&len); - if (len) { + if ((len > 0) && f->Ok()) { char *fname; FILE *fi; char buffer[IMG_MOVE_BUF_SIZE + 1]; @@ -1127,6 +1149,9 @@ wxSnip *ImageSnipClass::Read(wxMediaStreamIn *f) while (len--) { c = IMG_MOVE_BUF_SIZE + 1; f->Get(&c, buffer); + + if (!f->Ok()) + break; c = fwrite(buffer, 1, c, fi); } @@ -1603,6 +1628,15 @@ wxSnip *MediaSnipClass::Read(wxMediaStreamIn *f) else media = wxsMakeMediaPasteboard(); + if (lm < 0) lm = 0; + if (tm < 0) tm = 0; + if (rm < 0) rm = 0; + if (bm < 0) bm = 0; + if (li < 0) li = 0; + if (ti < 0) ti = 0; + if (ri < 0) ri = 0; + if (bi < 0) bi = 0; + snip = wxsMakeMediaSnip(media, border, lm, tm, rm, bm, li, ti, ri, bi, w, W, h, H); if (tightFit) diff --git a/src/mred/wxs/wxs_mede.xc b/src/mred/wxs/wxs_mede.xc @@ -205,7 +205,7 @@ @MACRO checkNull = if (!x0) x0 = &_x0; -@ "get-tabs" : float[]/bReturnList[float.0] GetTabs(nnint?=NULL,float?=NULL,bool?=NULL); : : /checkNull/ +@ "get-tabs" : float[]/bReturnList[float.0]///push GetTabs(nnint?=NULL,float?=NULL,bool?=NULL); : : /checkNull/ @ "set-tabs" : void SetTabs(float[]/bList/ubList/cList///push,-int,float=wxTAB_WIDTH,bool=TRUE); : : /glueListSet[float.0.0.1.METHODNAME("text%","set-tabs")]// @ v "can-insert?" : bool CanInsert(nnlong,nnlong); diff --git a/src/mred/wxs/wxs_misc.cxx b/src/mred/wxs/wxs_misc.cxx @@ -1031,6 +1031,30 @@ static Scheme_Object *os_wxPrintSetupDatacopy(Scheme_Object *obj, int n, Scheme return scheme_void; } +static Scheme_Object *os_wxPrintSetupDataSetMargin(Scheme_Object *obj, int n, Scheme_Object *p[]) +{ + WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p) + REMEMBER_VAR_STACK(); + objscheme_check_valid(obj); + nnfloat x0; + nnfloat x1; + + SETUP_VAR_STACK_REMEMBERED(2); + VAR_STACK_PUSH(0, p); + VAR_STACK_PUSH(1, obj); + + + x0 = WITH_VAR_STACK(objscheme_unbundle_nonnegative_float(p[0], "set-margin in ps-setup%")); + x1 = WITH_VAR_STACK(objscheme_unbundle_nonnegative_float(p[1], "set-margin in ps-setup%")); + + + WITH_VAR_STACK(((wxPrintSetupData *)((Scheme_Class_Object *)obj)->primdata)->SetMargin(x0, x1)); + + + + return scheme_void; +} + static Scheme_Object *os_wxPrintSetupDataSetEditorMargin(Scheme_Object *obj, int n, Scheme_Object *p[]) { WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p) @@ -1307,6 +1331,37 @@ static Scheme_Object *os_wxPrintSetupDataSetPrinterCommand(Scheme_Object *obj, i return scheme_void; } +static Scheme_Object *os_wxPrintSetupDataGetMargin(Scheme_Object *obj, int n, Scheme_Object *p[]) +{ + WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p) + REMEMBER_VAR_STACK(); + objscheme_check_valid(obj); + nnfloat _x0; + nnfloat* x0 = &_x0; + nnfloat _x1; + nnfloat* x1 = &_x1; + Scheme_Object *sbox_tmp; + + SETUP_VAR_STACK_REMEMBERED(2); + VAR_STACK_PUSH(0, p); + VAR_STACK_PUSH(1, obj); + + + *x0 = (sbox_tmp = WITH_VAR_STACK(objscheme_unbox(p[0], "get-margin in ps-setup%")), WITH_VAR_STACK(objscheme_unbundle_nonnegative_float(sbox_tmp, "get-margin in ps-setup%"", extracting boxed argument"))); + *x1 = (sbox_tmp = WITH_VAR_STACK(objscheme_unbox(p[1], "get-margin in ps-setup%")), WITH_VAR_STACK(objscheme_unbundle_nonnegative_float(sbox_tmp, "get-margin in ps-setup%"", extracting boxed argument"))); + + + WITH_VAR_STACK(((wxPrintSetupData *)((Scheme_Class_Object *)obj)->primdata)->GetMargin(x0, x1)); + + + if (n > 0) + WITH_VAR_STACK(objscheme_set_box(p[0], WITH_VAR_STACK(scheme_make_double(_x0)))); + if (n > 1) + WITH_VAR_STACK(objscheme_set_box(p[1], WITH_VAR_STACK(scheme_make_double(_x1)))); + + return scheme_void; +} + static Scheme_Object *os_wxPrintSetupDataGetEditorMargin(Scheme_Object *obj, int n, Scheme_Object *p[]) { WXS_USE_ARGUMENT(n) WXS_USE_ARGUMENT(p) @@ -1627,9 +1682,10 @@ void objscheme_setup_wxPrintSetupData(void *env) wxREGGLOB(os_wxPrintSetupData_class); - os_wxPrintSetupData_class = WITH_VAR_STACK(objscheme_def_prim_class(env, "ps-setup%", "object%", os_wxPrintSetupData_ConstructScheme, 25)); + os_wxPrintSetupData_class = WITH_VAR_STACK(objscheme_def_prim_class(env, "ps-setup%", "object%", os_wxPrintSetupData_ConstructScheme, 27)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "copy-from", os_wxPrintSetupDatacopy, 1, 1)); + WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "set-margin", os_wxPrintSetupDataSetMargin, 2, 2)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "set-editor-margin", os_wxPrintSetupDataSetEditorMargin, 2, 2)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "set-level-2", os_wxPrintSetupDataSetLevel2, 1, 1)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "set-afm-path", os_wxPrintSetupDataSetAFMPath, 1, 1)); @@ -1642,6 +1698,7 @@ void objscheme_setup_wxPrintSetupData(void *env) WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "set-preview-command", os_wxPrintSetupDataSetPrintPreviewCommand, 1, 1)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "set-file", os_wxPrintSetupDataSetPrinterFile, 1, 1)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "set-command", os_wxPrintSetupDataSetPrinterCommand, 1, 1)); + WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "get-margin", os_wxPrintSetupDataGetMargin, 2, 2)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "get-editor-margin", os_wxPrintSetupDataGetEditorMargin, 2, 2)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "get-level-2", os_wxPrintSetupDataGetLevel2, 0, 0)); WITH_VAR_STACK(scheme_add_method_w_arity(os_wxPrintSetupData_class, "get-afm-path", os_wxPrintSetupDataGetAFMPath, 0, 0)); diff --git a/src/mred/wxs/wxs_misc.xc b/src/mred/wxs/wxs_misc.xc @@ -143,6 +143,7 @@ void check_ps_mode(int v, Scheme_Object *p) @ "get-afm-path" : nstring GetAFMPath(); @ "get-level-2" : bool GetLevel2(); @ "get-editor-margin" : void GetEditorMargin(nnlong*,nnlong*); +@ "get-margin" : void GetMargin(nnfloat*,nnfloat*); @ "set-command" : void SetPrinterCommand(string); @ "set-file" : void SetPrinterFile(npathname); @@ -156,6 +157,7 @@ void check_ps_mode(int v, Scheme_Object *p) @ "set-afm-path" : void SetAFMPath(nstring); @ "set-level-2" : void SetLevel2(bool); @ "set-editor-margin" : void SetEditorMargin(nnlong,nnlong); +@ "set-margin" : void SetMargin(nnfloat,nnfloat); @ "copy-from" : void copy(wxPrintSetupData!); diff --git a/src/mysterx/myspage/eventqueue.cxx b/src/mysterx/myspage/eventqueue.cxx @@ -102,17 +102,6 @@ STDMETHODIMP CEventQueue::GetReaderSemaphore(int *pReadSem) { STDMETHODIMP CEventQueue::set_extension_table(int p) { scheme_extension_table = (Scheme_Extension_Table *)p; - scheme_register_extension_global(&_Module,sizeof(_Module)); - scheme_register_extension_global(&eventMap,sizeof(eventMap)); - scheme_register_extension_global((void *)&IID_IDHTMLPage,sizeof(IID_IDHTMLPage)); - scheme_register_extension_global((void *)&IID_IDHTMLPageUI,sizeof(IID_IDHTMLPageUI)); - scheme_register_extension_global((void *)&IID_IEvent,sizeof(IID_IEvent)); - scheme_register_extension_global((void *)&IID_IEventQueue,sizeof(IID_IEventQueue)); - scheme_register_extension_global((void *)&LIBID_MYSPAGELib,sizeof(LIBID_MYSPAGELib)); - scheme_register_extension_global((void *)&CLSID_DHTMLPage,sizeof(CLSID_DHTMLPage)); - scheme_register_extension_global((void *)&CLSID_Event,sizeof(CLSID_Event)); - scheme_register_extension_global((void *)&CLSID_EventQueue,sizeof(CLSID_EventQueue)); - return S_OK; } diff --git a/src/mysterx/mysterx.cxx b/src/mysterx/mysterx.cxx @@ -644,7 +644,7 @@ Scheme_Object *mx_unit_init(Scheme_Object **boxes,Scheme_Object **anchors, anchors[i] = boxes[i]; } - mx_omit_obj = (Scheme_Object *)scheme_malloc_uncollectable(sizeof(MX_OMIT)); + mx_omit_obj = (Scheme_Object *)scheme_malloc(sizeof(MX_OMIT)); mx_omit_obj->type = mx_com_omit_type; SCHEME_ENVBOX_VAL(boxes[sizeray(mxPrims)]) = mx_omit_obj; @@ -2029,14 +2029,6 @@ VARTYPE getVarTypeFromElemDesc(ELEMDESC *pElemDesc) { } -Scheme_Object *newTypeSymbol(char *s) { - Scheme_Object *retval; - retval = scheme_intern_symbol(s); - scheme_register_extension_global(retval,sizeof(Scheme_Object)); - - return retval; -} - Scheme_Object *elemDescToSchemeType(ELEMDESC *pElemDesc,BOOL ignoreByRef,BOOL isOpt) { static char buff[256]; char *s; @@ -4200,62 +4192,25 @@ Scheme_Object *scheme_initialize(Scheme_Env *env) { // globals in mysterx.cxx - scheme_register_extension_global(&AtlWndProc,sizeof(AtlWndProc)); - scheme_register_extension_global(&hIcon,sizeof(hIcon)); - scheme_register_extension_global(&browserHwndMutex,sizeof(browserHwndMutex)); - scheme_register_extension_global(&createHwndSem,sizeof(createHwndSem)); - scheme_register_extension_global(&eventSinkMutex,sizeof(eventSinkMutex)); - scheme_register_extension_global((void *)&emptyClsId,sizeof(emptyClsId)); scheme_register_extension_global(&mx_unit,sizeof(mx_unit)); - scheme_register_extension_global(&typeTable,sizeof(typeTable)); - scheme_register_extension_global(&myssink_table,sizeof(myssink_table)); - scheme_register_extension_global(&objectAttributes,sizeof(objectAttributes)); - scheme_register_extension_global(&controlAttributes,sizeof(controlAttributes)); - scheme_register_extension_global(&mxPrims,sizeof(mxPrims)); - - // globals in browser.cxx - - scheme_register_extension_global(&browserHwnd,sizeof(browserHwnd)); - scheme_register_extension_global(&styleOptions,sizeof(styleOptions)); - - // globals in comtypes.cxx + scheme_register_extension_global(&mx_omit_obj,sizeof(mx_omit_obj)); mx_com_object_type = scheme_make_type("<com-object>"); - scheme_register_extension_global(&mx_com_object_type,sizeof(mx_com_object_type)); mx_com_type_type = scheme_make_type("<com-type>"); - scheme_register_extension_global(&mx_com_type_type,sizeof(mx_com_type_type)); mx_browser_type = scheme_make_type("<mx-browser>"); - scheme_register_extension_global(&mx_browser_type,sizeof(mx_browser_type)); mx_document_type = scheme_make_type("<mx-document>"); - scheme_register_extension_global(&mx_document_type,sizeof(mx_document_type)); mx_element_type = scheme_make_type("<mx-element>"); - scheme_register_extension_global(&mx_element_type,sizeof(mx_element_type)); mx_event_type = scheme_make_type("<mx-event>"); - scheme_register_extension_global(&mx_event_type,sizeof(mx_event_type)); mx_com_cy_type = scheme_make_type("<com-currency>"); - scheme_register_extension_global(&mx_com_cy_type,sizeof(mx_com_cy_type)); mx_com_date_type = scheme_make_type("<com-date>"); - scheme_register_extension_global(&mx_com_date_type,sizeof(mx_com_date_type)); mx_com_boolean_type = scheme_make_type("<com-bool>"); - scheme_register_extension_global(&mx_com_boolean_type,sizeof(mx_com_boolean_type)); mx_com_scode_type = scheme_make_type("<com-scode>"); - scheme_register_extension_global(&mx_com_scode_type,sizeof(mx_com_scode_type)); mx_com_variant_type = scheme_make_type("<com-variant>"); - scheme_register_extension_global(&mx_com_variant_type,sizeof(mx_com_variant_type)); mx_com_iunknown_type = scheme_make_type("<com-iunknown>"); - scheme_register_extension_global(&mx_com_iunknown_type,sizeof(mx_com_iunknown_type)); mx_com_pointer_type = scheme_make_type("<com-pointer>"); - scheme_register_extension_global(&mx_com_pointer_type,sizeof(mx_com_pointer_type)); mx_com_array_type = scheme_make_type("<com-array>"); - scheme_register_extension_global(&mx_com_array_type,sizeof(mx_com_array_type)); mx_com_omit_type = scheme_make_type("<com-omit>"); - scheme_register_extension_global(&mx_com_omit_type,sizeof(mx_com_omit_type)); mx_com_typedesc_type = scheme_make_type("<com-typedesc>"); - scheme_register_extension_global(&mx_com_typedesc_type,sizeof(mx_com_typedesc_type)); - - // globals in htmlevent.cxx - - scheme_register_extension_global(&eventNames,sizeof(eventNames)); hr = CoInitialize(NULL); @@ -4265,13 +4220,9 @@ Scheme_Object *scheme_initialize(Scheme_Env *env) { return scheme_false; } - // make type hash table uncollectable - - scheme_register_extension_global(typeTable,TYPE_TBL_SIZE * sizeof(MX_TYPE_TBL_ENTRY *)); - // export prims + omit value - mx_unit = (Scheme_Unit *)scheme_malloc_uncollectable(sizeof(Scheme_Unit)); + mx_unit = (Scheme_Unit *)scheme_malloc(sizeof(Scheme_Unit)); mx_unit->type = scheme_unit_type; mx_unit->num_imports = 0; mx_unit->num_exports = sizeray(mxPrims) + 1; diff --git a/src/mzcom/mzcom.cxx b/src/mzcom/mzcom.cxx @@ -13,9 +13,10 @@ #include "MzCOM_i.c" #include "mzobj.h" - -const DWORD dwTimeOut = 5000; // time for EXE to be idle before shutting down -const DWORD dwPause = 1000; // time to wait for threads to finish up +// time for EXE to be idle before shutting down +#define dwTimeOut (5000) +// time to wait for threads to finish up +#define dwPause (1000) HINSTANCE globHinst; @@ -80,7 +81,6 @@ BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_MzObj, CMzObj) END_OBJECT_MAP() - LPCTSTR FindOneOf(LPCTSTR p1, LPCTSTR p2) { while (p1 != NULL && *p1 != NULL) diff --git a/src/mzcom/mzcom.idl b/src/mzcom/mzcom.idl @@ -17,6 +17,7 @@ import "ocidl.idl"; { [id(1), helpstring("method Eval")] HRESULT Eval(BSTR input,[out,retval]BSTR *output); [id(2), helpstring("method About")] HRESULT About(); + [id(3), helpstring("method Reset")] HRESULT Reset(); }; [ diff --git a/src/mzcom/mzobj.cxx b/src/mzcom/mzobj.cxx @@ -1,22 +1,34 @@ // mzobj.cxx : Implementation of CMzObj +#include "stdafx.h" #include "resource.h" +#ifdef _ATL_STATIC_REGISTRY +#include <statreg.h> +#include <statreg.cpp> +#endif +#include <atlimpl.cpp> -#include "stdafx.h" #include "mzcom.h" #include "mzobj.h" +static THREAD_GLOBALS tg; + static Scheme_Env *env; static BOOL *pErrorState; static OLECHAR *wideError; +static HANDLE evalLoopSems[2]; static HANDLE exitSem; static Scheme_Object *exn_catching_apply; static Scheme_Object *exn_p; static Scheme_Object *exn_message; +static void ErrorBox(char *s) { + ::MessageBox(NULL,s,"MzCOM",MB_OK); +} + static Scheme_Object *_apply_thunk_catch_exceptions(Scheme_Object *f, Scheme_Object **exn) { Scheme_Object *v; @@ -76,7 +88,7 @@ OLECHAR *wideStringFromSchemeObj(Scheme_Object *obj,char *fmt,int fmtlen) { len = strlen(s); wideString = (OLECHAR *)scheme_malloc((len + 1) * sizeof(OLECHAR)); MultiByteToWideChar(CP_ACP,(DWORD)0,s,len,wideString,len + 1); - wideString[len] = '\0'; + wideString[len] = L'\0'; return wideString; } @@ -85,44 +97,21 @@ void exitHandler(int) { ExitThread(0); } -DWORD WINAPI evalLoop(LPVOID args) { - UINT len; - char *narrowInput; - Scheme_Object *outputObj; - OLECHAR *outputBuffer; - mz_jmp_buf saveBuff; - THREAD_GLOBALS *pTg; - HANDLE readSem; - HANDLE writeSem; - BSTR **ppInput; - BSTR *pOutput; - HRESULT *pHr; +void setupSchemeEnv(void) { char *wrapper; char exeBuff[260]; - // make sure all MzScheme calls in this thread - - GC_use_registered_statics = 1; - - scheme_exit = exitHandler; - - pTg = (THREAD_GLOBALS *)args; - - ppInput = pTg->ppInput; - pOutput = pTg->pOutput; - pHr = pTg->pHr; - readSem = pTg->readSem; - writeSem = pTg->writeSem; - pErrorState = pTg->pErrorState; - env = scheme_basic_env(); if (env == NULL) { - ::MessageBox(NULL,"Can't create Scheme environment","MzCOM",MB_OK); + ErrorBox("Can't create Scheme environment"); ExitThread(0); - } + } - scheme_dont_gc_ptr(env); + scheme_register_static(&env,sizeof(env)); + scheme_register_static(&exn_catching_apply,sizeof(exn_catching_apply)); + scheme_register_static(&exn_p,sizeof(exn_p)); + scheme_register_static(&exn_message,sizeof(exn_message)); // set up exception trapping @@ -154,11 +143,51 @@ DWORD WINAPI evalLoop(LPVOID args) { "(#%lambda () (#%find-executable-path mzcom-exe \"..\")) " "(#%lambda () \"c:\\plt\\collects\") " ")) #%null)))", - env); + env); +} + +DWORD WINAPI evalLoop(LPVOID args) { + UINT len; + char *narrowInput; + Scheme_Object *outputObj; + OLECHAR *outputBuffer; + THREAD_GLOBALS *pTg; + HANDLE readSem; + HANDLE writeSem; + HANDLE resetSem; + HANDLE resetDoneSem; + BSTR **ppInput; + BSTR *pOutput; + HRESULT *pHr; + + // make sure all MzScheme calls in this thread + + GC_use_registered_statics = 1; + + setupSchemeEnv(); + + scheme_exit = exitHandler; + + pTg = (THREAD_GLOBALS *)args; + + ppInput = pTg->ppInput; + pOutput = pTg->pOutput; + pHr = pTg->pHr; + readSem = pTg->readSem; + writeSem = pTg->writeSem; + resetSem = pTg->resetSem; + resetDoneSem = pTg->resetDoneSem; + pErrorState = pTg->pErrorState; while (1) { - WaitForSingleObject(readSem,INFINITE); + if (WaitForMultipleObjects(2,evalLoopSems,FALSE,INFINITE) == + WAIT_OBJECT_0 + 1) { + // reset semaphore signalled + setupSchemeEnv(); + ReleaseSemaphore(resetDoneSem,1,NULL); + continue; + } len = SysStringLen(**ppInput); @@ -188,8 +217,6 @@ DWORD WINAPI evalLoop(LPVOID args) { *pHr = S_OK; } - memcpy(&scheme_error_buf,&saveBuff,sizeof(mz_jmp_buf)); - ReleaseSemaphore(writeSem,1,NULL); } @@ -198,13 +225,13 @@ DWORD WINAPI evalLoop(LPVOID args) { } void CMzObj::startMzThread(void) { - static THREAD_GLOBALS tg; - tg.pHr = &hr; tg.ppInput = &globInput; tg.pOutput = &globOutput; tg.readSem = readSem; tg.writeSem = writeSem; + tg.resetSem = resetSem; + tg.resetDoneSem = resetDoneSem; tg.pErrorState = &errorState; threadHandle = CreateThread(NULL,0,evalLoop,(LPVOID)&tg,0,&threadId); @@ -212,7 +239,7 @@ void CMzObj::startMzThread(void) { CMzObj::CMzObj(void) { - + lastOutput = NULL; inputMutex = NULL; readSem = NULL; threadId = NULL; @@ -220,33 +247,49 @@ CMzObj::CMzObj(void) { inputMutex = CreateSemaphore(NULL,1,1,NULL); if (inputMutex == NULL) { - MessageBox(NULL,"Can't create input mutex","MzCOM",MB_OK); + ErrorBox("Can't create input mutex"); return; } readSem = CreateSemaphore(NULL,0,1,NULL); if (readSem == NULL) { - MessageBox(NULL,"Can't create read semaphore","MzCOM",MB_OK); + ErrorBox("Can't create read semaphore"); return; } writeSem = CreateSemaphore(NULL,0,1,NULL); if (writeSem == NULL) { - MessageBox(NULL,"Can't create write semaphore","MzCOM",MB_OK); + ErrorBox("Can't create write semaphore"); return; } exitSem = CreateSemaphore(NULL,0,1,NULL); if (exitSem == NULL) { - MessageBox(NULL,"Can't create exit semaphore","MzCOM",MB_OK); + ErrorBox("Can't create exit semaphore"); return; } - evalSems[0] = writeSem; - evalSems[1] = exitSem; + resetSem = CreateSemaphore(NULL,0,1,NULL); + + if (resetSem == NULL) { + ErrorBox("Can't create reset semaphore"); + return; + } + + resetDoneSem = CreateSemaphore(NULL,0,1,NULL); + + if (resetSem == NULL) { + ErrorBox("Can't create reset-done semaphore"); + return; + } + + evalLoopSems[0] = readSem; + evalLoopSems[1] = resetSem; + evalDoneSems[0] = writeSem; + evalDoneSems[1] = exitSem; startMzThread(); } @@ -269,6 +312,10 @@ void CMzObj::killMzThread(void) { CMzObj::~CMzObj(void) { + if (lastOutput) { + SysFreeString(lastOutput); + } + killMzThread(); if (readSem) { @@ -318,23 +365,30 @@ BOOL CMzObj::testThread(void) { ///////////////////////////////////////////////////////////////////////////// // CMzObj - STDMETHODIMP CMzObj::Eval(BSTR input, BSTR *output) { + if (!testThread()) { return E_ABORT; } WaitForSingleObject(inputMutex,INFINITE); + if (lastOutput) { + SysFreeString(lastOutput); + lastOutput = NULL; + } + globInput = &input; // allow evaluator to read ReleaseSemaphore(readSem,1,NULL); + // wait until evaluator done or eval thread terminated - if (WaitForMultipleObjects(2,evalSems,FALSE,INFINITE) == + if (WaitForMultipleObjects(2,evalDoneSems,FALSE,INFINITE) == WAIT_OBJECT_0 + 1) { RaiseError(L"Scheme terminated evaluator"); return E_FAIL; } - *output = globOutput; + + lastOutput = *output = globOutput; ReleaseSemaphore(inputMutex,1,NULL); if (errorState) { @@ -367,3 +421,12 @@ STDMETHODIMP CMzObj::About() { return S_OK; } +STDMETHODIMP CMzObj::Reset() { + if (!testThread()) { + return E_ABORT; + } + + ReleaseSemaphore(resetSem,1,NULL); + WaitForSingleObject(resetDoneSem,INFINITE); + return S_OK; +} diff --git a/src/mzcom/mzobj.h b/src/mzcom/mzobj.h @@ -13,6 +13,8 @@ typedef struct { HRESULT *pHr; HANDLE readSem; HANDLE writeSem; + HANDLE resetSem; + HANDLE resetDoneSem; BOOL *pErrorState; BOOL *pResetFlag; } THREAD_GLOBALS; @@ -36,9 +38,12 @@ class ATL_NO_VTABLE CMzObj : HANDLE inputMutex; HANDLE readSem; HANDLE writeSem; - HANDLE evalSems[2]; + HANDLE resetSem; + HANDLE resetDoneSem; + HANDLE evalDoneSems[2]; BSTR *globInput; BSTR globOutput; + BSTR lastOutput; DWORD threadId; HANDLE threadHandle; BOOL errorState; @@ -70,8 +75,10 @@ END_CONNECTION_POINT_MAP() // IMzObj public: + STDMETHOD(Reset)(void); STDMETHOD(About)(void); STDMETHOD(Eval)(BSTR input,/*[out,retval]*/BSTR *output); }; #endif //__MZOBJ_H_ + diff --git a/src/mzcom/stdafx.cxx b/src/mzcom/stdafx.cxx @@ -1,12 +0,0 @@ -// stdafx.cpp : source file that includes just the standard includes -// stdafx.pch will be the pre-compiled header -// stdafx.obj will contain the pre-compiled type information - -#include "stdafx.h" - -#ifdef _ATL_STATIC_REGISTRY -#include <statreg.h> -#include <statreg.cpp> -#endif - -#include <atlimpl.cpp> diff --git a/src/mzcom/stdafx.h b/src/mzcom/stdafx.h @@ -29,6 +29,7 @@ public: bool bActivity; }; extern CExeModule _Module; + #include <atlcom.h> //{{AFX_INSERT_LOCATION}} diff --git a/src/mzscheme/configure.in b/src/mzscheme/configure.in @@ -99,6 +99,9 @@ AC_PROG_CPP AC_PROG_CXX if test "$AS" = '' ; then AS=as + as_was_set=no +else + as_was_set=yes fi AC_PROG_RANLIB if test "$AR" = '' ; then @@ -152,13 +155,22 @@ fi ############## platform tests ################ +if test -x "/bin/uname" ; then + UNAME=/bin/uname +elif test -x "/usr/bin/uname" ; then + UNAME=/usr/bin/uname +else + echo configure: cannot find uname + exit 1 +fi + # for flags we don't want to use in config tests: EXTRALIBS= -OS=`uname -s` +OS=`$UNAME -s` case $OS in SunOS) - case `uname -r` in + case `$UNAME -r` in 5.*) if test "${enable_osthreads}" = "yes" ; then OPTIONS="${OPTIONS} -DSOLARIS_THREADS" @@ -224,7 +236,19 @@ case $OS in fi ;; *) - echo "Warning: Unknown OS" + ;; +esac + +MACH=`$UNAME -m` +case "$MACH" in + alpha) + if test "$CC" = "gcc" ; then + if test "$as_was_set" = "no" ; then + AS="gcc -c -x assembler-with-cpp" + fi + fi + ;; + *) ;; esac @@ -240,7 +264,6 @@ if test "${enable_sgcdebug}" = "yes" ; then OPTIONS="$OPTIONS -DSGC_STD_DEBUGGING=1" fi - ############## C++ grunge ################ MROPTIONS= diff --git a/src/mzscheme/sconfig.h b/src/mzscheme/sconfig.h @@ -233,7 +233,7 @@ int scheme_solaris_semaphore_try_down(void *); # if defined(__mc68000__) # define SCHEME_PLATFORM_LIBRARY_SUBPATH "m68k-linux" # endif -# if defined(__alpha) +# if defined(__alpha__) # define SCHEME_PLATFORM_LIBRARY_SUBPATH "alpha-linux" # endif # ifndef SCHEME_PLATFORM_LIBRARY_SUBPATH diff --git a/src/mzscheme/src/network.c b/src/mzscheme/src/network.c @@ -58,10 +58,6 @@ static int mzerrno = 0; #endif #include "schfd.h" -#if defined(USE_UNIX_SOCKETS_TCP) || defined(USE_WINSOCK_TCP) -# define USE_SOCKETS_TCP -#endif - #ifdef USE_MAC_TCP # include <MacTCP.h> # include <dnr.c> diff --git a/src/mzscheme/src/schpriv.h b/src/mzscheme/src/schpriv.h @@ -1373,6 +1373,10 @@ Scheme_Object *scheme_default_load_extension(int argc, Scheme_Object **argv); # define USE_TCP #endif +#if defined(USE_UNIX_SOCKETS_TCP) || defined(USE_WINSOCK_TCP) +# define USE_SOCKETS_TCP +#endif + extern int scheme_active_but_sleeping; extern int scheme_internal_checking_char; extern int scheme_file_open_count; diff --git a/src/mzscheme/src/schvers.h b/src/mzscheme/src/schvers.h @@ -5,4 +5,4 @@ # define SPECIAL_TAG "" #endif -#define VERSION "102/13" SPECIAL_TAG +#define VERSION "102/14" SPECIAL_TAG diff --git a/src/srpersist/srpersist.cxx b/src/srpersist/srpersist.cxx @@ -6726,29 +6726,6 @@ void initTypes(void) { sql_op_parms_type = scheme_make_type("<sql-op-parms>"); sql_guid_type = scheme_make_type("<sql-guid>"); sql_paramlength_type = scheme_make_type("<sql-paramlength>"); - - register_global(sql_date_type); - register_global(sql_decimal_type); - register_global(sql_pointer_type); - register_global(sql_time_type); - register_global(sql_timestamp_type); - register_global(sql_return_type); - register_global(sql_henv_type); - register_global(sql_hdbc_type); - register_global(sql_hstmt_type); - register_global(sql_hdesc_type); - register_global(sql_boxed_uint_type); - register_global(sql_buffer_type); - register_global(sql_length_type); - register_global(sql_indicator_type); - register_global(sql_row_status_type); - register_global(sql_array_status_type); - register_global(sql_binding_offset_type); - register_global(sql_rows_processed_type); - register_global(sql_octet_length_type); - register_global(sql_op_parms_type); - register_global(sql_guid_type); - register_global(sql_paramlength_type); } void initExns(Scheme_Env *env) { @@ -6780,12 +6757,12 @@ void initExns(Scheme_Env *env) { exnNameCount += name_count; } - register_global(withInfoFuns); - register_global(noDataFuns); - register_global(invalidHandleFuns); - register_global(errorFuns); - register_global(needDataFuns); - register_global(stillExecutingFuns); + scheme_register_extension_global(&withInfoFuns,sizeof(withInfoFuns)); + scheme_register_extension_global(&noDataFuns,sizeof(noDataFuns)); + scheme_register_extension_global(&invalidHandleFuns,sizeof(invalidHandleFuns)); + scheme_register_extension_global(&errorFuns,sizeof(errorFuns)); + scheme_register_extension_global(&needDataFuns,sizeof(needDataFuns)); + scheme_register_extension_global(&stillExecutingFuns,sizeof(stillExecutingFuns)); } void initStructs(void) { @@ -6808,24 +6785,42 @@ void initStructs(void) { structNameCount += name_count; } - register_global(numericStructFuns); - register_global(dateStructFuns); - register_global(timeStructFuns); - register_global(timeStampStructFuns); - register_global(guidStructFuns); - register_global(yearIntervalStructFuns); - register_global(monthIntervalStructFuns); - register_global(dayIntervalStructFuns); - register_global(hourIntervalStructFuns); - register_global(minuteIntervalStructFuns); - register_global(secondIntervalStructFuns); - register_global(yearToMonthIntervalStructFuns); - register_global(dayToHourIntervalStructFuns); - register_global(dayToMinuteIntervalStructFuns); - register_global(dayToSecondIntervalStructFuns); - register_global(hourToMinuteIntervalStructFuns); - register_global(hourToSecondIntervalStructFuns); - register_global(minuteToSecondIntervalStructFuns); + scheme_register_extension_global(&numericStructFuns, + sizeof(numericStructFuns)); + scheme_register_extension_global(&dateStructFuns, + sizeof(dateStructFuns)); + scheme_register_extension_global(&timeStructFuns, + sizeof(timeStructFuns)); + scheme_register_extension_global(&timeStampStructFuns, + sizeof(timeStampStructFuns)); + scheme_register_extension_global(&guidStructFuns, + sizeof(guidStructFuns)); + scheme_register_extension_global(&yearIntervalStructFuns, + sizeof(yearIntervalStructFuns)); + scheme_register_extension_global(&monthIntervalStructFuns, + sizeof(monthIntervalStructFuns)); + scheme_register_extension_global(&dayIntervalStructFuns, + sizeof(dayIntervalStructFuns)); + scheme_register_extension_global(&hourIntervalStructFuns, + sizeof(hourIntervalStructFuns)); + scheme_register_extension_global(&minuteIntervalStructFuns, + sizeof(minuteIntervalStructFuns)); + scheme_register_extension_global(&secondIntervalStructFuns, + sizeof(secondIntervalStructFuns)); + scheme_register_extension_global(&yearToMonthIntervalStructFuns, + sizeof(yearToMonthIntervalStructFuns)); + scheme_register_extension_global(&dayToHourIntervalStructFuns, + sizeof(dayToHourIntervalStructFuns)); + scheme_register_extension_global(&dayToMinuteIntervalStructFuns, + sizeof(dayToMinuteIntervalStructFuns)); + scheme_register_extension_global(&dayToSecondIntervalStructFuns, + sizeof(dayToSecondIntervalStructFuns)); + scheme_register_extension_global(&hourToMinuteIntervalStructFuns, + sizeof(hourToMinuteIntervalStructFuns)); + scheme_register_extension_global(&hourToSecondIntervalStructFuns, + sizeof(hourToSecondIntervalStructFuns)); + scheme_register_extension_global(&minuteToSecondIntervalStructFuns, + sizeof(minuteToSecondIntervalStructFuns)); } Scheme_Object *schemeObjectFromString(char *s,Scheme_Env *env) { @@ -6834,7 +6829,7 @@ Scheme_Object *schemeObjectFromString(char *s,Scheme_Env *env) { void initGlobals(Scheme_Env *env) { scheme_raise = schemeObjectFromString("raise",env); - register_global(scheme_raise); + scheme_register_extension_global(&scheme_raise,sizeof(scheme_raise)); } void sortConsts(void) { diff --git a/src/srpersist/srpersist.h b/src/srpersist/srpersist.h @@ -1,7 +1,6 @@ /* srpersist.h */ #define sizeray(x) (sizeof(x)/sizeof(*x)) -#define register_global(x) scheme_register_extension_global(&x,sizeof(x)) #define sql_return(v,retcode,f) if (retcode == success) \ { return v; } \ diff --git a/src/worksp/gc/gc.opt b/src/worksp/gc/gc.opt Binary files differ. diff --git a/src/worksp/mred/mred.opt b/src/worksp/mred/mred.opt Binary files differ. diff --git a/src/worksp/mzcom/mzcom.dsp b/src/worksp/mzcom/mzcom.dsp @@ -43,7 +43,7 @@ RSC=rc.exe # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /Gm /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c -# ADD CPP /nologo /MT /W3 /Gm /ZI /Od /I "..\..\..\collects\mzscheme\include" /I "..\..\mzcom" /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /YX /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /ZI /Od /I "..\..\..\collects\mzscheme\include" /I "..\..\mzcom" /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /YX /FD /GZ /c # ADD BASE RSC /l 0x409 /d "_DEBUG" # ADD RSC /l 0x409 /i ".\..\mzcom" /d "_DEBUG" BSC32=bscmake.exe @@ -51,12 +51,12 @@ BSC32=bscmake.exe # 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 libcmtd.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 wsock32.lib mzsrc.lib gc.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcmt.lib" /pdbtype:sept /libpath:"..\mzsrc\Release" /libpath:"..\gc\Release" +# ADD LINK32 libcmtd.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 wsock32.lib mzsrc.lib gc.lib /nologo /subsystem:windows /debug /machine:I386 /nodefaultlib:"libcmt.lib" /out:"../../../collects/mzcom/mzcom.exe" /pdbtype:sept /libpath:"..\mzsrc\Debug" /libpath:"..\gc\Debug" # SUBTRACT LINK32 /pdb:none # Begin Custom Build - Performing registration OutDir=.\Debug -TargetPath=.\Debug\MzCOM.exe -InputPath=.\Debug\MzCOM.exe +TargetPath=\plt\collects\mzcom\mzcom.exe +InputPath=\plt\collects\mzcom\mzcom.exe SOURCE="$(InputPath)" "$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -80,7 +80,7 @@ SOURCE="$(InputPath)" # PROP Ignore_Export_Lib 0 # PROP Target_Dir "" # ADD BASE CPP /nologo /W3 /O1 /I "../../mzscheme/include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /D "_ATL_MIN_CRT" /Yu"stdafx.h" /FD /c -# ADD CPP /nologo /MT /W3 /O1 /I "..\..\..\collects\mzscheme\include" /I "..\..\mzcom" /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /YX /FD /c +# ADD CPP /nologo /MT /W3 /O1 /I "..\..\mzcom" /I "." /I "..\..\..\collects\mzscheme\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /YX /FD /c # ADD BASE RSC /l 0x409 /d "NDEBUG" # ADD RSC /l 0x409 /i "..\..\mzcom" /d "NDEBUG" BSC32=bscmake.exe @@ -88,12 +88,12 @@ BSC32=bscmake.exe # 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 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib mzsrc.lib gc.lib /nologo /subsystem:windows /machine:I386 /libpath:"..\mzsrc\Release" /libpath:"..\gc\Release" +# ADD 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 wsock32.lib mzsrc.lib gc.lib /nologo /subsystem:windows /machine:I386 /out:"../../../collects/mzcom/mzcom.exe" /libpath:"..\mzsrc\Release" /libpath:"..\gc\Release" # SUBTRACT LINK32 /pdb:none # Begin Custom Build - Performing registration OutDir=.\Release -TargetPath=.\Release\MzCOM.exe -InputPath=.\Release\MzCOM.exe +TargetPath=\plt\collects\mzcom\mzcom.exe +InputPath=\plt\collects\mzcom\mzcom.exe SOURCE="$(InputPath)" "$(OutDir)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -131,9 +131,13 @@ SOURCE=..\..\mzcom\mzcom.idl !IF "$(CFG)" == "MzCOM - Win32 Debug" +# ADD MTL /tlb "./mzcom.tlb" +# SUBTRACT MTL /Oicf + !ELSEIF "$(CFG)" == "MzCOM - Win32 Release" # PROP Intermediate_Dir "Release" +# ADD MTL /tlb "./mzcom.tlb" !ENDIF @@ -153,10 +157,6 @@ SOURCE=..\..\mzcom\mzobj.cxx # End Source File # Begin Source File -SOURCE=..\..\mzcom\stdafx.cxx -# End Source File -# Begin Source File - SOURCE=..\..\mzcom\stdafx.h # End Source File # End Group diff --git a/src/worksp/mzcom/mzcom.dsw b/src/worksp/mzcom/mzcom.dsw @@ -15,6 +15,30 @@ Package=<4> ############################################################################### +Project: "gc"=..\gc\gc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "mzsrc"=..\mzsrc\mzsrc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + Global: Package=<5> diff --git a/src/worksp/mzcom/mzcom.h b/src/worksp/mzcom/mzcom.h @@ -0,0 +1,382 @@ +/* this ALWAYS GENERATED file contains the definitions for the interfaces */ + + +/* File created by MIDL compiler version 5.01.0164 */ +/* at Thu May 25 13:43:33 2000 + */ +/* Compiler settings for D:\plt\src\mzcom\mzcom.idl: + Os (OptLev=s), W1, Zp8, env=Win32, ms_ext, c_ext + error checks: allocation ref bounds_check enum stub_data +*/ +//@@MIDL_FILE_HEADING( ) + + +/* verify that the <rpcndr.h> version is high enough to compile this file*/ +#ifndef __REQUIRED_RPCNDR_H_VERSION__ +#define __REQUIRED_RPCNDR_H_VERSION__ 440 +#endif + +#include "rpc.h" +#include "rpcndr.h" + +#ifndef __RPCNDR_H_VERSION__ +#error this stub requires an updated version of <rpcndr.h> +#endif // __RPCNDR_H_VERSION__ + +#ifndef COM_NO_WINDOWS_H +#include "windows.h" +#include "ole2.h" +#endif /*COM_NO_WINDOWS_H*/ + +#ifndef __mzcom_h__ +#define __mzcom_h__ + +#ifdef __cplusplus +extern "C"{ +#endif + +/* Forward Declarations */ + +#ifndef __IMzObj_FWD_DEFINED__ +#define __IMzObj_FWD_DEFINED__ +typedef interface IMzObj IMzObj; +#endif /* __IMzObj_FWD_DEFINED__ */ + + +#ifndef ___IMzObjEvents_FWD_DEFINED__ +#define ___IMzObjEvents_FWD_DEFINED__ +typedef interface _IMzObjEvents _IMzObjEvents; +#endif /* ___IMzObjEvents_FWD_DEFINED__ */ + + +#ifndef __MzObj_FWD_DEFINED__ +#define __MzObj_FWD_DEFINED__ + +#ifdef __cplusplus +typedef class MzObj MzObj; +#else +typedef struct MzObj MzObj; +#endif /* __cplusplus */ + +#endif /* __MzObj_FWD_DEFINED__ */ + + +/* header files for imported files */ +#include "oaidl.h" +#include "ocidl.h" + +void __RPC_FAR * __RPC_USER MIDL_user_allocate(size_t); +void __RPC_USER MIDL_user_free( void __RPC_FAR * ); + +#ifndef __IMzObj_INTERFACE_DEFINED__ +#define __IMzObj_INTERFACE_DEFINED__ + +/* interface IMzObj */ +/* [unique][helpstring][dual][uuid][object] */ + + +EXTERN_C const IID IID_IMzObj; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A604CBA8-2AB5-11D4-B6D3-0060089002FE") + IMzObj : public IDispatch + { + public: + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Eval( + BSTR input, + /* [retval][out] */ BSTR __RPC_FAR *output) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE About( void) = 0; + + virtual /* [helpstring][id] */ HRESULT STDMETHODCALLTYPE Reset( void) = 0; + + }; + +#else /* C style interface */ + + typedef struct IMzObjVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + IMzObj __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + IMzObj __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + IMzObj __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + IMzObj __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + IMzObj __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + IMzObj __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + IMzObj __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Eval )( + IMzObj __RPC_FAR * This, + BSTR input, + /* [retval][out] */ BSTR __RPC_FAR *output); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *About )( + IMzObj __RPC_FAR * This); + + /* [helpstring][id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Reset )( + IMzObj __RPC_FAR * This); + + END_INTERFACE + } IMzObjVtbl; + + interface IMzObj + { + CONST_VTBL struct IMzObjVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define IMzObj_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define IMzObj_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define IMzObj_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define IMzObj_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define IMzObj_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define IMzObj_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define IMzObj_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + + +#define IMzObj_Eval(This,input,output) \ + (This)->lpVtbl -> Eval(This,input,output) + +#define IMzObj_About(This) \ + (This)->lpVtbl -> About(This) + +#define IMzObj_Reset(This) \ + (This)->lpVtbl -> Reset(This) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMzObj_Eval_Proxy( + IMzObj __RPC_FAR * This, + BSTR input, + /* [retval][out] */ BSTR __RPC_FAR *output); + + +void __RPC_STUB IMzObj_Eval_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMzObj_About_Proxy( + IMzObj __RPC_FAR * This); + + +void __RPC_STUB IMzObj_About_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + +/* [helpstring][id] */ HRESULT STDMETHODCALLTYPE IMzObj_Reset_Proxy( + IMzObj __RPC_FAR * This); + + +void __RPC_STUB IMzObj_Reset_Stub( + IRpcStubBuffer *This, + IRpcChannelBuffer *_pRpcChannelBuffer, + PRPC_MESSAGE _pRpcMessage, + DWORD *_pdwStubPhase); + + + +#endif /* __IMzObj_INTERFACE_DEFINED__ */ + + + +#ifndef __MZCOMLib_LIBRARY_DEFINED__ +#define __MZCOMLib_LIBRARY_DEFINED__ + +/* library MZCOMLib */ +/* [helpstring][version][uuid] */ + + +EXTERN_C const IID LIBID_MZCOMLib; + +#ifndef ___IMzObjEvents_DISPINTERFACE_DEFINED__ +#define ___IMzObjEvents_DISPINTERFACE_DEFINED__ + +/* dispinterface _IMzObjEvents */ +/* [helpstring][uuid] */ + + +EXTERN_C const IID DIID__IMzObjEvents; + +#if defined(__cplusplus) && !defined(CINTERFACE) + + MIDL_INTERFACE("A604CBA9-2AB5-11D4-B6D3-0060089002FE") + _IMzObjEvents : public IDispatch + { + }; + +#else /* C style interface */ + + typedef struct _IMzObjEventsVtbl + { + BEGIN_INTERFACE + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( + _IMzObjEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( + _IMzObjEvents __RPC_FAR * This); + + ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( + _IMzObjEvents __RPC_FAR * This); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( + _IMzObjEvents __RPC_FAR * This, + /* [out] */ UINT __RPC_FAR *pctinfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( + _IMzObjEvents __RPC_FAR * This, + /* [in] */ UINT iTInfo, + /* [in] */ LCID lcid, + /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo); + + HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( + _IMzObjEvents __RPC_FAR * This, + /* [in] */ REFIID riid, + /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames, + /* [in] */ UINT cNames, + /* [in] */ LCID lcid, + /* [size_is][out] */ DISPID __RPC_FAR *rgDispId); + + /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( + _IMzObjEvents __RPC_FAR * This, + /* [in] */ DISPID dispIdMember, + /* [in] */ REFIID riid, + /* [in] */ LCID lcid, + /* [in] */ WORD wFlags, + /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams, + /* [out] */ VARIANT __RPC_FAR *pVarResult, + /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo, + /* [out] */ UINT __RPC_FAR *puArgErr); + + END_INTERFACE + } _IMzObjEventsVtbl; + + interface _IMzObjEvents + { + CONST_VTBL struct _IMzObjEventsVtbl __RPC_FAR *lpVtbl; + }; + + + +#ifdef COBJMACROS + + +#define _IMzObjEvents_QueryInterface(This,riid,ppvObject) \ + (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) + +#define _IMzObjEvents_AddRef(This) \ + (This)->lpVtbl -> AddRef(This) + +#define _IMzObjEvents_Release(This) \ + (This)->lpVtbl -> Release(This) + + +#define _IMzObjEvents_GetTypeInfoCount(This,pctinfo) \ + (This)->lpVtbl -> GetTypeInfoCount(This,pctinfo) + +#define _IMzObjEvents_GetTypeInfo(This,iTInfo,lcid,ppTInfo) \ + (This)->lpVtbl -> GetTypeInfo(This,iTInfo,lcid,ppTInfo) + +#define _IMzObjEvents_GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) \ + (This)->lpVtbl -> GetIDsOfNames(This,riid,rgszNames,cNames,lcid,rgDispId) + +#define _IMzObjEvents_Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) \ + (This)->lpVtbl -> Invoke(This,dispIdMember,riid,lcid,wFlags,pDispParams,pVarResult,pExcepInfo,puArgErr) + +#endif /* COBJMACROS */ + + +#endif /* C style interface */ + + +#endif /* ___IMzObjEvents_DISPINTERFACE_DEFINED__ */ + + +EXTERN_C const CLSID CLSID_MzObj; + +#ifdef __cplusplus + +class DECLSPEC_UUID("A3B0AF9E-2AB0-11D4-B6D2-0060089002FE") +MzObj; +#endif +#endif /* __MZCOMLib_LIBRARY_DEFINED__ */ + +/* Additional Prototypes for ALL interfaces */ + +unsigned long __RPC_USER BSTR_UserSize( unsigned long __RPC_FAR *, unsigned long , BSTR __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER BSTR_UserMarshal( unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); +unsigned char __RPC_FAR * __RPC_USER BSTR_UserUnmarshal(unsigned long __RPC_FAR *, unsigned char __RPC_FAR *, BSTR __RPC_FAR * ); +void __RPC_USER BSTR_UserFree( unsigned long __RPC_FAR *, BSTR __RPC_FAR * ); + +/* end of Additional Prototypes */ + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/worksp/mzcom/mzcom.mak b/src/worksp/mzcom/mzcom.mak @@ -33,51 +33,46 @@ RSC=rc.exe OUTDIR=.\Debug INTDIR=.\Debug -# Begin Custom Macros -OutDir=.\Debug -# End Custom Macros -ALL : "$(OUTDIR)\MzCOM.exe" ".\Debug\regsvr32.trg" +ALL : "..\..\..\collects\mzcom\mzcom.exe" ".\Debug\regsvr32.trg" CLEAN : -@erase "$(INTDIR)\mzcom.obj" -@erase "$(INTDIR)\mzcom.res" - -@erase "$(INTDIR)\mzcom.tlb" -@erase "$(INTDIR)\mzobj.obj" - -@erase "$(INTDIR)\stdafx.obj" -@erase "$(INTDIR)\vc60.idb" -@erase "$(INTDIR)\vc60.pdb" - -@erase "$(OUTDIR)\MzCOM.exe" - -@erase "$(OUTDIR)\MzCOM.ilk" - -@erase "$(OUTDIR)\MzCOM.pdb" + -@erase "$(OUTDIR)\mzcom.pdb" + -@erase "..\..\..\collects\mzcom\mzcom.exe" + -@erase "..\..\..\collects\mzcom\mzcom.ilk" + -@erase ".\mzcom.tlb" -@erase ".\Debug\regsvr32.trg" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" -CPP_PROJ=/nologo /MT /W3 /Gm /ZI /Od /I "..\..\..\collects\mzscheme\include" /I "..\..\mzcom" /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /Fp"$(INTDIR)\MzCOM.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c +CPP_PROJ=/nologo /MTd /W3 /Gm /ZI /Od /I "..\..\..\collects\mzscheme\include" /I "..\..\mzcom" /I "." /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /Fp"$(INTDIR)\MzCOM.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c RSC_PROJ=/l 0x409 /fo"$(INTDIR)\mzcom.res" /i ".\..\mzcom" /d "_DEBUG" BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\MzCOM.bsc" BSC32_SBRS= \ LINK32=link.exe -LINK32_FLAGS=libcmtd.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 wsock32.lib mzsrc.lib gc.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\MzCOM.pdb" /debug /machine:I386 /nodefaultlib:"libcmt.lib" /out:"$(OUTDIR)\MzCOM.exe" /pdbtype:sept /libpath:"..\mzsrc\Release" /libpath:"..\gc\Release" +LINK32_FLAGS=libcmtd.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 wsock32.lib mzsrc.lib gc.lib /nologo /subsystem:windows /incremental:yes /pdb:"$(OUTDIR)\mzcom.pdb" /debug /machine:I386 /nodefaultlib:"libcmt.lib" /out:"../../../collects/mzcom/mzcom.exe" /pdbtype:sept /libpath:"..\mzsrc\Debug" /libpath:"..\gc\Debug" LINK32_OBJS= \ "$(INTDIR)\mzcom.obj" \ "$(INTDIR)\mzobj.obj" \ - "$(INTDIR)\stdafx.obj" \ "$(INTDIR)\mzcom.res" -"$(OUTDIR)\MzCOM.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) +"..\..\..\collects\mzcom\mzcom.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << OutDir=.\Debug -TargetPath=.\Debug\MzCOM.exe -InputPath=.\Debug\MzCOM.exe +TargetPath=\plt\collects\mzcom\mzcom.exe +InputPath=\plt\collects\mzcom\mzcom.exe SOURCE="$(InputPath)" "$(OUTDIR)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -93,48 +88,43 @@ SOURCE="$(InputPath)" OUTDIR=.\Release INTDIR=.\Release -# Begin Custom Macros -OutDir=.\Release -# End Custom Macros -ALL : "$(OUTDIR)\MzCOM.exe" "$(OUTDIR)\mzcom.tlb" ".\Release\regsvr32.trg" +ALL : "..\..\..\collects\mzcom\mzcom.exe" ".\Release\regsvr32.trg" CLEAN : -@erase "$(INTDIR)\mzcom.obj" -@erase "$(INTDIR)\mzcom.res" - -@erase "$(INTDIR)\stdafx.obj" -@erase "$(INTDIR)\vc60.idb" - -@erase "$(OUTDIR)\MzCOM.exe" - -@erase ".\Release\mzcom.tlb" + -@erase "..\..\..\collects\mzcom\mzcom.exe" + -@erase ".\mzcom.tlb" -@erase ".\Release\mzobj.obj" -@erase ".\Release\regsvr32.trg" "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" -CPP_PROJ=/nologo /MT /W3 /O1 /I "..\..\..\collects\mzscheme\include" /I "..\..\mzcom" /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /Fp"$(INTDIR)\MzCOM.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c +CPP_PROJ=/nologo /MT /W3 /O1 /I "..\..\mzcom" /I "." /I "..\..\..\collects\mzscheme\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /Fp"$(INTDIR)\MzCOM.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c RSC_PROJ=/l 0x409 /fo"$(INTDIR)\mzcom.res" /i "..\..\mzcom" /d "NDEBUG" BSC32=bscmake.exe BSC32_FLAGS=/nologo /o"$(OUTDIR)\MzCOM.bsc" BSC32_SBRS= \ LINK32=link.exe -LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib mzsrc.lib gc.lib /nologo /subsystem:windows /incremental:no /pdb:"$(OUTDIR)\MzCOM.pdb" /machine:I386 /out:"$(OUTDIR)\MzCOM.exe" /libpath:"..\mzsrc\Release" /libpath:"..\gc\Release" +LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib mzsrc.lib gc.lib /nologo /subsystem:windows /incremental:no /pdb:"$(OUTDIR)\mzcom.pdb" /machine:I386 /out:"../../../collects/mzcom/mzcom.exe" /libpath:"..\mzsrc\Release" /libpath:"..\gc\Release" LINK32_OBJS= \ "$(INTDIR)\mzcom.obj" \ ".\Release\mzobj.obj" \ - "$(INTDIR)\stdafx.obj" \ "$(INTDIR)\mzcom.res" -"$(OUTDIR)\MzCOM.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) +"..\..\..\collects\mzcom\mzcom.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS) $(LINK32) @<< $(LINK32_FLAGS) $(LINK32_OBJS) << OutDir=.\Release -TargetPath=.\Release\MzCOM.exe -InputPath=.\Release\MzCOM.exe +TargetPath=\plt\collects\mzcom\mzcom.exe +InputPath=\plt\collects\mzcom\mzcom.exe SOURCE="$(InputPath)" "$(OUTDIR)\regsvr32.trg" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)" @@ -194,7 +184,7 @@ SOURCE=..\..\mzcom\mzcom.cxx !IF "$(CFG)" == "MzCOM - Win32 Debug" -CPP_SWITCHES=/nologo /MT /W3 /Gm /ZI /Od /I "..\..\..\collects\mzscheme\include" /I "..\..\mzcom" /I "." /I "../../mzscheme/include ../worksp/mzcom" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /Fp"$(INTDIR)\MzCOM.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c +CPP_SWITCHES=/nologo /MTd /W3 /Gm /ZI /Od /I "..\..\..\collects\mzscheme\include" /I "..\..\mzcom" /I "." /I "../../mzscheme/include ../worksp/mzcom" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /Fp"$(INTDIR)\MzCOM.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c "$(INTDIR)\mzcom.obj" : $(SOURCE) "$(INTDIR)" $(CPP) @<< @@ -204,7 +194,7 @@ CPP_SWITCHES=/nologo /MT /W3 /Gm /ZI /Od /I "..\..\..\collects\mzscheme\include" !ELSEIF "$(CFG)" == "MzCOM - Win32 Release" -CPP_SWITCHES=/nologo /MT /W3 /O1 /I "..\..\..\collects\mzscheme\include" /I "..\..\mzcom" /I "." /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /Fp"$(INTDIR)\MzCOM.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c +CPP_SWITCHES=/nologo /MT /W3 /O1 /I "..\..\mzcom" /I "." /I "..\..\..\collects\mzscheme\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_ATL_STATIC_REGISTRY" /Fp"$(INTDIR)\MzCOM.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c "$(INTDIR)\mzcom.obj" : $(SOURCE) "$(INTDIR)" $(CPP) @<< @@ -218,9 +208,9 @@ SOURCE=..\..\mzcom\mzcom.idl !IF "$(CFG)" == "MzCOM - Win32 Debug" -MTL_SWITCHES=/tlb "$(OUTDIR)\mzcom.tlb" +MTL_SWITCHES=/tlb "./mzcom.tlb" -"$(INTDIR)\mzcom.tlb" : $(SOURCE) "$(INTDIR)" +".\mzcom.tlb" : $(SOURCE) "$(INTDIR)" $(MTL) @<< $(MTL_SWITCHES) $(SOURCE) << @@ -228,9 +218,9 @@ MTL_SWITCHES=/tlb "$(OUTDIR)\mzcom.tlb" !ELSEIF "$(CFG)" == "MzCOM - Win32 Release" -MTL_SWITCHES=/tlb "$(OUTDIR)\mzcom.tlb" +MTL_SWITCHES=/tlb "./mzcom.tlb" -"$(INTDIR)\mzcom.tlb" : $(SOURCE) +".\mzcom.tlb" : $(SOURCE) $(MTL) @<< $(MTL_SWITCHES) $(SOURCE) << @@ -256,15 +246,9 @@ SOURCE=..\..\mzcom\mzobj.cxx !ENDIF -SOURCE=..\..\mzcom\stdafx.cxx - -"$(INTDIR)\stdafx.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - SOURCE=.\mzcom.rc -"$(INTDIR)\mzcom.res" : $(SOURCE) "$(INTDIR)" "$(INTDIR)\mzcom.tlb" +"$(INTDIR)\mzcom.res" : $(SOURCE) "$(INTDIR)" ".\mzcom.tlb" $(RSC) $(RSC_PROJ) $(SOURCE) diff --git a/src/worksp/mzcom/mzcom.rc b/src/worksp/mzcom/mzcom.rc @@ -68,17 +68,21 @@ VS_VERSION_INFO VERSIONINFO BEGIN BLOCK "StringFileInfo" BEGIN - BLOCK "040904B0" + BLOCK "040904b0" BEGIN + VALUE "Comments", "\0" VALUE "CompanyName", "\0" VALUE "FileDescription", "MzCOM Module\0" VALUE "FileVersion", "1, 0, 0, 1\0" VALUE "InternalName", "MzCOM\0" VALUE "LegalCopyright", "Copyright 2000 PLT (Paul Steckler)\0" + VALUE "LegalTrademarks", "\0" + VALUE "OLESelfRegister", "\0" VALUE "OriginalFilename", "MzCOM.EXE\0" + VALUE "PrivateBuild", "\0" VALUE "ProductName", "MzCOM Module\0" VALUE "ProductVersion", "102, 0, 0, 1\0" - VALUE "OLESelfRegister", "\0" + VALUE "SpecialBuild", "\0" END END BLOCK "VarFileInfo" @@ -95,7 +99,7 @@ END // REGISTRY // -IDR_MzCOM REGISTRY MOVEABLE PURE "MzCOM.rgs" +IDR_MZCOM REGISTRY MOVEABLE PURE "MzCOM.rgs" IDR_MZOBJ REGISTRY DISCARDABLE "MzObj.rgs" ///////////////////////////////////////////////////////////////////////////// @@ -163,3 +167,14 @@ END ///////////////////////////////////////////////////////////////////////////// + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// +1 TYPELIB "MzCOM.tlb" + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/src/worksp/mzcom/mzcom.rgs b/src/worksp/mzcom/mzcom.rgs @@ -0,0 +1,11 @@ +HKCR +{ + NoRemove AppID + { + {A604CB9D-2AB5-11D4-B6D3-0060089002FE} = s 'MzCOM' + 'MzCOM.EXE' + { + val AppID = s {A604CB9D-2AB5-11D4-B6D3-0060089002FE} + } + } +} diff --git a/src/worksp/mzscheme/mzscheme.opt b/src/worksp/mzscheme/mzscheme.opt Binary files differ. diff --git a/src/worksp/sgc/sgc.opt b/src/worksp/sgc/sgc.opt Binary files differ. diff --git a/src/worksp/wxs/wxs.opt b/src/worksp/wxs/wxs.opt @@ -1 +0,0 @@ -ÐÏࡱ -\ No newline at end of file diff --git a/src/worksp/wxutils/wxutils.dsp b/src/worksp/wxutils/wxutils.dsp @@ -1,260 +0,0 @@ -# Microsoft Developer Studio Project File - Name="wxutils" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=wxutils - Win32 Release -!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 "wxutils.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 "wxutils.mak" CFG="wxutils - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "wxutils - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "wxutils - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "wxutils - Win32 SGC" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "wxutils - 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 Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MT /W3 /Zi /O2 /I "..\..\mzscheme\gc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I ":..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 -# ADD RSC /l 0x409 -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "wxutils - 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 Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MTd /W3 /Z7 /Od /I "..\..\mzscheme\gc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I ":..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 -# ADD RSC /l 0x409 -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "wxutils - Win32 SGC" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir ".\SGC" -# PROP BASE Intermediate_Dir ".\SGC" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir ".\SGC" -# PROP Intermediate_Dir ".\SGC" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Z7 /Od /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I "..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\mred\mzscheme\gc" /I "..\..\wxWindow\contrib\fafa" /I "..\..\mzscheme\gc" /D "_DEBUG" /D "WINNT" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "FOR_MSW" /D WX_NORMALIZED_PS_FONTS=1 /YX"wx.h" /c -# ADD CPP /nologo /MTd /W3 /ZI /Od /I "..\..\mzscheme\sgc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I ":..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "USE_SENORA_GC" /D "USE_WXOBJECT_TRACE_COUNT" /FD /c -# SUBTRACT CPP /YX -# ADD BASE RSC /l 0x409 -# ADD RSC /l 0x409 -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "wxutils - Win32 Release" -# Name "wxutils - Win32 Debug" -# Name "wxutils - Win32 SGC" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Button.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Check.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Cont.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Crbuffri.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Crdatfri.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Create.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Crifrbuf.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Crifrdat.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Data.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Dialog.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Utils\Dib\DIB.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Draw.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Dumfafa.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Fafa.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Hashtab.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Misc.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Parse.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Rdftodat.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Rdftoi.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Rgb.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Scan.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Simx.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Static.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Wrffrdat.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Wrffri.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Wrffrp.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\wximgxbm.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Gauge\Zyz3d.c -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Gauge\Zyzgauge.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" -# Begin Source File - -SOURCE=..\..\wxwindow\utils\dib\dib.h -# End Source File -# Begin Source File - -SOURCE=..\..\wxWindow\contrib\fafa\fafa.h -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\simx.h -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Contrib\Gauge\zyz3d.h -# End Source File -# Begin Source File - -SOURCE=..\..\wxwindow\contrib\gauge\zyzgauge.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/src/worksp/wxutils/wxutils.dsw b/src/worksp/wxutils/wxutils.dsw @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "wxwin"=.\wxutils.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/src/worksp/wxutils/wxutils.mak b/src/worksp/wxutils/wxutils.mak @@ -1,589 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Based on wxutils.dsp -!IF "$(CFG)" == "" -CFG=wxutils - Win32 Release -!MESSAGE No configuration specified. Defaulting to wxutils - Win32 Release. -!ENDIF - -!IF "$(CFG)" != "wxutils - Win32 Release" && "$(CFG)" != "wxutils - Win32 Debug" && "$(CFG)" != "wxutils - Win32 SGC" -!MESSAGE Invalid configuration "$(CFG)" specified. -!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 "wxutils.mak" CFG="wxutils - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "wxutils - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "wxutils - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "wxutils - Win32 SGC" (based on "Win32 (x86) Static Library") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "$(CFG)" == "wxutils - Win32 Release" - -OUTDIR=.\Release -INTDIR=.\Release -# Begin Custom Macros -OutDir=.\Release -# End Custom Macros - -ALL : "$(OUTDIR)\wxutils.lib" - - -CLEAN : - -@erase "$(INTDIR)\Button.obj" - -@erase "$(INTDIR)\Check.obj" - -@erase "$(INTDIR)\Cont.obj" - -@erase "$(INTDIR)\Crbuffri.obj" - -@erase "$(INTDIR)\Crdatfri.obj" - -@erase "$(INTDIR)\Create.obj" - -@erase "$(INTDIR)\Crifrbuf.obj" - -@erase "$(INTDIR)\Crifrdat.obj" - -@erase "$(INTDIR)\Data.obj" - -@erase "$(INTDIR)\Dialog.obj" - -@erase "$(INTDIR)\DIB.obj" - -@erase "$(INTDIR)\Draw.obj" - -@erase "$(INTDIR)\Dumfafa.obj" - -@erase "$(INTDIR)\Fafa.obj" - -@erase "$(INTDIR)\Hashtab.obj" - -@erase "$(INTDIR)\Misc.obj" - -@erase "$(INTDIR)\Parse.obj" - -@erase "$(INTDIR)\Rdftodat.obj" - -@erase "$(INTDIR)\Rdftoi.obj" - -@erase "$(INTDIR)\Rgb.obj" - -@erase "$(INTDIR)\Scan.obj" - -@erase "$(INTDIR)\Simx.obj" - -@erase "$(INTDIR)\Static.obj" - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(INTDIR)\vc60.pdb" - -@erase "$(INTDIR)\Wrffrdat.obj" - -@erase "$(INTDIR)\Wrffri.obj" - -@erase "$(INTDIR)\Wrffrp.obj" - -@erase "$(INTDIR)\wximgxbm.obj" - -@erase "$(INTDIR)\Zyz3d.obj" - -@erase "$(INTDIR)\Zyzgauge.obj" - -@erase "$(OUTDIR)\wxutils.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -CPP_PROJ=/nologo /MT /W3 /Zi /O2 /I "..\..\mzscheme\gc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I ":..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c - -.c{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -RSC=rc.exe -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\wxutils.bsc" -BSC32_SBRS= \ - -LIB32=link.exe -lib -LIB32_FLAGS=/nologo /out:"$(OUTDIR)\wxutils.lib" -LIB32_OBJS= \ - "$(INTDIR)\Button.obj" \ - "$(INTDIR)\Check.obj" \ - "$(INTDIR)\Cont.obj" \ - "$(INTDIR)\Crbuffri.obj" \ - "$(INTDIR)\Crdatfri.obj" \ - "$(INTDIR)\Create.obj" \ - "$(INTDIR)\Crifrbuf.obj" \ - "$(INTDIR)\Crifrdat.obj" \ - "$(INTDIR)\Data.obj" \ - "$(INTDIR)\Dialog.obj" \ - "$(INTDIR)\DIB.obj" \ - "$(INTDIR)\Draw.obj" \ - "$(INTDIR)\Dumfafa.obj" \ - "$(INTDIR)\Fafa.obj" \ - "$(INTDIR)\Hashtab.obj" \ - "$(INTDIR)\Misc.obj" \ - "$(INTDIR)\Parse.obj" \ - "$(INTDIR)\Rdftodat.obj" \ - "$(INTDIR)\Rdftoi.obj" \ - "$(INTDIR)\Rgb.obj" \ - "$(INTDIR)\Scan.obj" \ - "$(INTDIR)\Simx.obj" \ - "$(INTDIR)\Static.obj" \ - "$(INTDIR)\Wrffrdat.obj" \ - "$(INTDIR)\Wrffri.obj" \ - "$(INTDIR)\Wrffrp.obj" \ - "$(INTDIR)\wximgxbm.obj" \ - "$(INTDIR)\Zyz3d.obj" \ - "$(INTDIR)\Zyzgauge.obj" - -"$(OUTDIR)\wxutils.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ELSEIF "$(CFG)" == "wxutils - Win32 Debug" - -OUTDIR=.\Debug -INTDIR=.\Debug -# Begin Custom Macros -OutDir=.\Debug -# End Custom Macros - -ALL : "$(OUTDIR)\wxutils.lib" - - -CLEAN : - -@erase "$(INTDIR)\Button.obj" - -@erase "$(INTDIR)\Check.obj" - -@erase "$(INTDIR)\Cont.obj" - -@erase "$(INTDIR)\Crbuffri.obj" - -@erase "$(INTDIR)\Crdatfri.obj" - -@erase "$(INTDIR)\Create.obj" - -@erase "$(INTDIR)\Crifrbuf.obj" - -@erase "$(INTDIR)\Crifrdat.obj" - -@erase "$(INTDIR)\Data.obj" - -@erase "$(INTDIR)\Dialog.obj" - -@erase "$(INTDIR)\DIB.obj" - -@erase "$(INTDIR)\Draw.obj" - -@erase "$(INTDIR)\Dumfafa.obj" - -@erase "$(INTDIR)\Fafa.obj" - -@erase "$(INTDIR)\Hashtab.obj" - -@erase "$(INTDIR)\Misc.obj" - -@erase "$(INTDIR)\Parse.obj" - -@erase "$(INTDIR)\Rdftodat.obj" - -@erase "$(INTDIR)\Rdftoi.obj" - -@erase "$(INTDIR)\Rgb.obj" - -@erase "$(INTDIR)\Scan.obj" - -@erase "$(INTDIR)\Simx.obj" - -@erase "$(INTDIR)\Static.obj" - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(INTDIR)\Wrffrdat.obj" - -@erase "$(INTDIR)\Wrffri.obj" - -@erase "$(INTDIR)\Wrffrp.obj" - -@erase "$(INTDIR)\wximgxbm.obj" - -@erase "$(INTDIR)\Zyz3d.obj" - -@erase "$(INTDIR)\Zyzgauge.obj" - -@erase "$(OUTDIR)\wxutils.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -CPP_PROJ=/nologo /MTd /W3 /Z7 /Od /I "..\..\mzscheme\gc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I ":..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c - -.c{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -RSC=rc.exe -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\wxutils.bsc" -BSC32_SBRS= \ - -LIB32=link.exe -lib -LIB32_FLAGS=/nologo /out:"$(OUTDIR)\wxutils.lib" -LIB32_OBJS= \ - "$(INTDIR)\Button.obj" \ - "$(INTDIR)\Check.obj" \ - "$(INTDIR)\Cont.obj" \ - "$(INTDIR)\Crbuffri.obj" \ - "$(INTDIR)\Crdatfri.obj" \ - "$(INTDIR)\Create.obj" \ - "$(INTDIR)\Crifrbuf.obj" \ - "$(INTDIR)\Crifrdat.obj" \ - "$(INTDIR)\Data.obj" \ - "$(INTDIR)\Dialog.obj" \ - "$(INTDIR)\DIB.obj" \ - "$(INTDIR)\Draw.obj" \ - "$(INTDIR)\Dumfafa.obj" \ - "$(INTDIR)\Fafa.obj" \ - "$(INTDIR)\Hashtab.obj" \ - "$(INTDIR)\Misc.obj" \ - "$(INTDIR)\Parse.obj" \ - "$(INTDIR)\Rdftodat.obj" \ - "$(INTDIR)\Rdftoi.obj" \ - "$(INTDIR)\Rgb.obj" \ - "$(INTDIR)\Scan.obj" \ - "$(INTDIR)\Simx.obj" \ - "$(INTDIR)\Static.obj" \ - "$(INTDIR)\Wrffrdat.obj" \ - "$(INTDIR)\Wrffri.obj" \ - "$(INTDIR)\Wrffrp.obj" \ - "$(INTDIR)\wximgxbm.obj" \ - "$(INTDIR)\Zyz3d.obj" \ - "$(INTDIR)\Zyzgauge.obj" - -"$(OUTDIR)\wxutils.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ELSEIF "$(CFG)" == "wxutils - Win32 SGC" - -OUTDIR=.\SGC -INTDIR=.\SGC -# Begin Custom Macros -OutDir=.\SGC -# End Custom Macros - -ALL : "$(OUTDIR)\wxutils.lib" - - -CLEAN : - -@erase "$(INTDIR)\Button.obj" - -@erase "$(INTDIR)\Check.obj" - -@erase "$(INTDIR)\Cont.obj" - -@erase "$(INTDIR)\Crbuffri.obj" - -@erase "$(INTDIR)\Crdatfri.obj" - -@erase "$(INTDIR)\Create.obj" - -@erase "$(INTDIR)\Crifrbuf.obj" - -@erase "$(INTDIR)\Crifrdat.obj" - -@erase "$(INTDIR)\Data.obj" - -@erase "$(INTDIR)\Dialog.obj" - -@erase "$(INTDIR)\DIB.obj" - -@erase "$(INTDIR)\Draw.obj" - -@erase "$(INTDIR)\Dumfafa.obj" - -@erase "$(INTDIR)\Fafa.obj" - -@erase "$(INTDIR)\Hashtab.obj" - -@erase "$(INTDIR)\Misc.obj" - -@erase "$(INTDIR)\Parse.obj" - -@erase "$(INTDIR)\Rdftodat.obj" - -@erase "$(INTDIR)\Rdftoi.obj" - -@erase "$(INTDIR)\Rgb.obj" - -@erase "$(INTDIR)\Scan.obj" - -@erase "$(INTDIR)\Simx.obj" - -@erase "$(INTDIR)\Static.obj" - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(INTDIR)\vc60.pdb" - -@erase "$(INTDIR)\Wrffrdat.obj" - -@erase "$(INTDIR)\Wrffri.obj" - -@erase "$(INTDIR)\Wrffrp.obj" - -@erase "$(INTDIR)\wximgxbm.obj" - -@erase "$(INTDIR)\Zyz3d.obj" - -@erase "$(INTDIR)\Zyzgauge.obj" - -@erase "$(OUTDIR)\wxutils.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -CPP_PROJ=/nologo /MTd /W3 /ZI /Od /I "..\..\mzscheme\sgc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I ":..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "USE_SENORA_GC" /D "USE_WXOBJECT_TRACE_COUNT" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c - -.c{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -RSC=rc.exe -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\wxutils.bsc" -BSC32_SBRS= \ - -LIB32=link.exe -lib -LIB32_FLAGS=/nologo /out:"$(OUTDIR)\wxutils.lib" -LIB32_OBJS= \ - "$(INTDIR)\Button.obj" \ - "$(INTDIR)\Check.obj" \ - "$(INTDIR)\Cont.obj" \ - "$(INTDIR)\Crbuffri.obj" \ - "$(INTDIR)\Crdatfri.obj" \ - "$(INTDIR)\Create.obj" \ - "$(INTDIR)\Crifrbuf.obj" \ - "$(INTDIR)\Crifrdat.obj" \ - "$(INTDIR)\Data.obj" \ - "$(INTDIR)\Dialog.obj" \ - "$(INTDIR)\DIB.obj" \ - "$(INTDIR)\Draw.obj" \ - "$(INTDIR)\Dumfafa.obj" \ - "$(INTDIR)\Fafa.obj" \ - "$(INTDIR)\Hashtab.obj" \ - "$(INTDIR)\Misc.obj" \ - "$(INTDIR)\Parse.obj" \ - "$(INTDIR)\Rdftodat.obj" \ - "$(INTDIR)\Rdftoi.obj" \ - "$(INTDIR)\Rgb.obj" \ - "$(INTDIR)\Scan.obj" \ - "$(INTDIR)\Simx.obj" \ - "$(INTDIR)\Static.obj" \ - "$(INTDIR)\Wrffrdat.obj" \ - "$(INTDIR)\Wrffri.obj" \ - "$(INTDIR)\Wrffrp.obj" \ - "$(INTDIR)\wximgxbm.obj" \ - "$(INTDIR)\Zyz3d.obj" \ - "$(INTDIR)\Zyzgauge.obj" - -"$(OUTDIR)\wxutils.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ENDIF - - -!IF "$(NO_EXTERNAL_DEPS)" != "1" -!IF EXISTS("wxutils.dep") -!INCLUDE "wxutils.dep" -!ELSE -!MESSAGE Warning: cannot find "wxutils.dep" -!ENDIF -!ENDIF - - -!IF "$(CFG)" == "wxutils - Win32 Release" || "$(CFG)" == "wxutils - Win32 Debug" || "$(CFG)" == "wxutils - Win32 SGC" -SOURCE=..\..\Wxwindow\Contrib\Fafa\Button.c - -"$(INTDIR)\Button.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Check.c - -"$(INTDIR)\Check.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Cont.c - -"$(INTDIR)\Cont.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Crbuffri.c - -"$(INTDIR)\Crbuffri.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Crdatfri.c - -"$(INTDIR)\Crdatfri.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Create.c - -"$(INTDIR)\Create.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Crifrbuf.c - -"$(INTDIR)\Crifrbuf.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Crifrdat.c - -"$(INTDIR)\Crifrdat.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Data.c - -"$(INTDIR)\Data.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Dialog.c - -"$(INTDIR)\Dialog.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Utils\Dib\DIB.cxx - -"$(INTDIR)\DIB.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Draw.c - -"$(INTDIR)\Draw.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Dumfafa.c - -"$(INTDIR)\Dumfafa.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Fafa.c - -"$(INTDIR)\Fafa.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Hashtab.c - -"$(INTDIR)\Hashtab.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Misc.c - -"$(INTDIR)\Misc.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Parse.c - -"$(INTDIR)\Parse.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Rdftodat.c - -"$(INTDIR)\Rdftodat.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Rdftoi.c - -"$(INTDIR)\Rdftoi.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Rgb.c - -"$(INTDIR)\Rgb.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Scan.c - -"$(INTDIR)\Scan.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Simx.c - -"$(INTDIR)\Simx.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Fafa\Static.c - -"$(INTDIR)\Static.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Wrffrdat.c - -"$(INTDIR)\Wrffrdat.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Wrffri.c - -"$(INTDIR)\Wrffri.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Wxxpm\Libxpm.34b\Lib\Wrffrp.c - -"$(INTDIR)\Wrffrp.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\wximgxbm.cxx - -"$(INTDIR)\wximgxbm.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Gauge\Zyz3d.c - -"$(INTDIR)\Zyz3d.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Contrib\Gauge\Zyzgauge.c - -"$(INTDIR)\Zyzgauge.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - - -!ENDIF - diff --git a/src/worksp/wxutils/wxutils.opt b/src/worksp/wxutils/wxutils.opt @@ -1 +0,0 @@ -ÐÏࡱ -\ No newline at end of file diff --git a/src/worksp/wxwin/wxwin.dsp b/src/worksp/wxwin/wxwin.dsp @@ -1,317 +0,0 @@ -# Microsoft Developer Studio Project File - Name="wxwin" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Static Library" 0x0104 - -CFG=wxwin - Win32 Release -!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 "wxwin.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 "wxwin.mak" CFG="wxwin - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "wxwin - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "wxwin - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "wxwin - Win32 SGC" (based on "Win32 (x86) Static Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -RSC=rc.exe - -!IF "$(CFG)" == "wxwin - 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 Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MT /W3 /Zi /O2 /I "..\..\mzscheme\gc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I "..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /YX"wx.h" /FD /c -# ADD BASE RSC /l 0x409 -# ADD RSC /l 0x409 -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "wxwin - 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 Target_Dir "" -# ADD BASE CPP /nologo /W3 /GX /Z7 /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /c -# ADD CPP /nologo /MTd /W3 /Z7 /Od /I "..\..\mzscheme\gc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I "..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /YX"wx.h" /FD /c -# ADD BASE RSC /l 0x409 -# ADD RSC /l 0x409 -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ELSEIF "$(CFG)" == "wxwin - Win32 SGC" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir ".\wxwin___" -# PROP BASE Intermediate_Dir ".\wxwin___" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir ".\SGC" -# PROP Intermediate_Dir ".\SGC" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /W3 /Z7 /Od /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I "..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\mzscheme\gc" /I "..\..\wxWindow\contrib\fafa" /D "_DEBUG" /D "WINNT" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "FOR_MSW" /D WX_NORMALIZED_PS_FONTS=1 /YX"wx.h" /c -# ADD CPP /nologo /MTd /W3 /ZI /Od /I "..\..\mzscheme\sgc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I "..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "USE_SENORA_GC" /D "USE_WXOBJECT_TRACE_COUNT" /YX"wx.h" /FD /c -# ADD BASE RSC /l 0x409 -# ADD RSC /l 0x409 -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LIB32=link.exe -lib -# ADD BASE LIB32 /nologo -# ADD LIB32 /nologo - -!ENDIF - -# Begin Target - -# Name "wxwin - Win32 Release" -# Name "wxwin - Win32 Debug" -# Name "wxwin - Win32 SGC" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat;for;f90" -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_CANVS.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_CMDLG.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_DATA.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_DC.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_DIALG.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_FRAME.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_GDI.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_HASH.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_ITEM.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_LIST.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_MAIN.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_MF.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_MGSTR.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_OBJ.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_PANEL.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_PRINT.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_PS.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_RES.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_STDEV.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_SYSEV.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_TIMER.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_TYPES.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_UTILS.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Base\WB_WIN.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_BUTTN.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CANVS.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CHECK.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CHOIC.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CLIPB.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CMDLG.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_DC.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_DIALG.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_FRAME.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_GAUGE.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_GDI.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_ITEM.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_LBOX.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_MAIN.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_MENU.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_MESSG.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_MF.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_PANEL.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\wx_pdf.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_RBOX.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_SLIDR.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_TIMER.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_UTILS.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\Wxwindow\Src\Msw\WX_WIN.cxx -# End Source File -# Begin Source File - -SOURCE=..\..\WXWINDOW\SRC\MSW\wximgfil.cxx -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl;fi;fd" -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/src/worksp/wxwin/wxwin.dsw b/src/worksp/wxwin/wxwin.dsw @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "wxwin"=.\wxwin.dsp - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/src/worksp/wxwin/wxwin.mak b/src/worksp/wxwin/wxwin.mak @@ -1,829 +0,0 @@ -# Microsoft Developer Studio Generated NMAKE File, Based on wxwin.dsp -!IF "$(CFG)" == "" -CFG=wxwin - Win32 Release -!MESSAGE No configuration specified. Defaulting to wxwin - Win32 Release. -!ENDIF - -!IF "$(CFG)" != "wxwin - Win32 Release" && "$(CFG)" != "wxwin - Win32 Debug" && "$(CFG)" != "wxwin - Win32 SGC" -!MESSAGE Invalid configuration "$(CFG)" specified. -!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 "wxwin.mak" CFG="wxwin - Win32 Release" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "wxwin - Win32 Release" (based on "Win32 (x86) Static Library") -!MESSAGE "wxwin - Win32 Debug" (based on "Win32 (x86) Static Library") -!MESSAGE "wxwin - Win32 SGC" (based on "Win32 (x86) Static Library") -!MESSAGE -!ERROR An invalid configuration is specified. -!ENDIF - -!IF "$(OS)" == "Windows_NT" -NULL= -!ELSE -NULL=nul -!ENDIF - -!IF "$(CFG)" == "wxwin - Win32 Release" - -OUTDIR=.\Release -INTDIR=.\Release -# Begin Custom Macros -OutDir=.\Release -# End Custom Macros - -ALL : "$(OUTDIR)\wxwin.lib" - - -CLEAN : - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(INTDIR)\vc60.pdb" - -@erase "$(INTDIR)\WB_CANVS.obj" - -@erase "$(INTDIR)\WB_CMDLG.obj" - -@erase "$(INTDIR)\WB_DATA.obj" - -@erase "$(INTDIR)\WB_DC.obj" - -@erase "$(INTDIR)\WB_DIALG.obj" - -@erase "$(INTDIR)\WB_FRAME.obj" - -@erase "$(INTDIR)\WB_GDI.obj" - -@erase "$(INTDIR)\WB_HASH.obj" - -@erase "$(INTDIR)\WB_ITEM.obj" - -@erase "$(INTDIR)\WB_LIST.obj" - -@erase "$(INTDIR)\WB_MAIN.obj" - -@erase "$(INTDIR)\WB_MF.obj" - -@erase "$(INTDIR)\WB_MGSTR.obj" - -@erase "$(INTDIR)\WB_OBJ.obj" - -@erase "$(INTDIR)\WB_PANEL.obj" - -@erase "$(INTDIR)\WB_PRINT.obj" - -@erase "$(INTDIR)\WB_PS.obj" - -@erase "$(INTDIR)\WB_RES.obj" - -@erase "$(INTDIR)\WB_STDEV.obj" - -@erase "$(INTDIR)\WB_SYSEV.obj" - -@erase "$(INTDIR)\WB_TIMER.obj" - -@erase "$(INTDIR)\WB_TYPES.obj" - -@erase "$(INTDIR)\WB_UTILS.obj" - -@erase "$(INTDIR)\WB_WIN.obj" - -@erase "$(INTDIR)\WX_BUTTN.obj" - -@erase "$(INTDIR)\WX_CANVS.obj" - -@erase "$(INTDIR)\WX_CHECK.obj" - -@erase "$(INTDIR)\WX_CHOIC.obj" - -@erase "$(INTDIR)\WX_CLIPB.obj" - -@erase "$(INTDIR)\WX_CMDLG.obj" - -@erase "$(INTDIR)\WX_DC.obj" - -@erase "$(INTDIR)\WX_DIALG.obj" - -@erase "$(INTDIR)\WX_FRAME.obj" - -@erase "$(INTDIR)\WX_GAUGE.obj" - -@erase "$(INTDIR)\WX_GDI.obj" - -@erase "$(INTDIR)\WX_ITEM.obj" - -@erase "$(INTDIR)\WX_LBOX.obj" - -@erase "$(INTDIR)\WX_MAIN.obj" - -@erase "$(INTDIR)\WX_MENU.obj" - -@erase "$(INTDIR)\WX_MESSG.obj" - -@erase "$(INTDIR)\WX_MF.obj" - -@erase "$(INTDIR)\WX_PANEL.obj" - -@erase "$(INTDIR)\wx_pdf.obj" - -@erase "$(INTDIR)\WX_RBOX.obj" - -@erase "$(INTDIR)\WX_SLIDR.obj" - -@erase "$(INTDIR)\WX_TIMER.obj" - -@erase "$(INTDIR)\WX_UTILS.obj" - -@erase "$(INTDIR)\WX_WIN.obj" - -@erase "$(INTDIR)\wximgfil.obj" - -@erase "$(OUTDIR)\wxwin.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -CPP_PROJ=/nologo /MT /W3 /Zi /O2 /I "..\..\mzscheme\gc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I "..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /Fp"$(INTDIR)\wxwin.pch" /YX"wx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c - -.c{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -RSC=rc.exe -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\wxwin.bsc" -BSC32_SBRS= \ - -LIB32=link.exe -lib -LIB32_FLAGS=/nologo /out:"$(OUTDIR)\wxwin.lib" -LIB32_OBJS= \ - "$(INTDIR)\WB_CANVS.obj" \ - "$(INTDIR)\WB_CMDLG.obj" \ - "$(INTDIR)\WB_DATA.obj" \ - "$(INTDIR)\WB_DC.obj" \ - "$(INTDIR)\WB_DIALG.obj" \ - "$(INTDIR)\WB_FRAME.obj" \ - "$(INTDIR)\WB_GDI.obj" \ - "$(INTDIR)\WB_HASH.obj" \ - "$(INTDIR)\WB_ITEM.obj" \ - "$(INTDIR)\WB_LIST.obj" \ - "$(INTDIR)\WB_MAIN.obj" \ - "$(INTDIR)\WB_MF.obj" \ - "$(INTDIR)\WB_MGSTR.obj" \ - "$(INTDIR)\WB_OBJ.obj" \ - "$(INTDIR)\WB_PANEL.obj" \ - "$(INTDIR)\WB_PRINT.obj" \ - "$(INTDIR)\WB_PS.obj" \ - "$(INTDIR)\WB_RES.obj" \ - "$(INTDIR)\WB_STDEV.obj" \ - "$(INTDIR)\WB_SYSEV.obj" \ - "$(INTDIR)\WB_TIMER.obj" \ - "$(INTDIR)\WB_TYPES.obj" \ - "$(INTDIR)\WB_UTILS.obj" \ - "$(INTDIR)\WB_WIN.obj" \ - "$(INTDIR)\WX_BUTTN.obj" \ - "$(INTDIR)\WX_CANVS.obj" \ - "$(INTDIR)\WX_CHECK.obj" \ - "$(INTDIR)\WX_CHOIC.obj" \ - "$(INTDIR)\WX_CLIPB.obj" \ - "$(INTDIR)\WX_CMDLG.obj" \ - "$(INTDIR)\WX_DC.obj" \ - "$(INTDIR)\WX_DIALG.obj" \ - "$(INTDIR)\WX_FRAME.obj" \ - "$(INTDIR)\WX_GAUGE.obj" \ - "$(INTDIR)\WX_GDI.obj" \ - "$(INTDIR)\WX_ITEM.obj" \ - "$(INTDIR)\WX_LBOX.obj" \ - "$(INTDIR)\WX_MAIN.obj" \ - "$(INTDIR)\WX_MENU.obj" \ - "$(INTDIR)\WX_MESSG.obj" \ - "$(INTDIR)\WX_MF.obj" \ - "$(INTDIR)\WX_PANEL.obj" \ - "$(INTDIR)\wx_pdf.obj" \ - "$(INTDIR)\WX_RBOX.obj" \ - "$(INTDIR)\WX_SLIDR.obj" \ - "$(INTDIR)\WX_TIMER.obj" \ - "$(INTDIR)\WX_UTILS.obj" \ - "$(INTDIR)\WX_WIN.obj" \ - "$(INTDIR)\wximgfil.obj" - -"$(OUTDIR)\wxwin.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ELSEIF "$(CFG)" == "wxwin - Win32 Debug" - -OUTDIR=.\Debug -INTDIR=.\Debug -# Begin Custom Macros -OutDir=.\Debug -# End Custom Macros - -ALL : "$(OUTDIR)\wxwin.lib" - - -CLEAN : - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(INTDIR)\WB_CANVS.obj" - -@erase "$(INTDIR)\WB_CMDLG.obj" - -@erase "$(INTDIR)\WB_DATA.obj" - -@erase "$(INTDIR)\WB_DC.obj" - -@erase "$(INTDIR)\WB_DIALG.obj" - -@erase "$(INTDIR)\WB_FRAME.obj" - -@erase "$(INTDIR)\WB_GDI.obj" - -@erase "$(INTDIR)\WB_HASH.obj" - -@erase "$(INTDIR)\WB_ITEM.obj" - -@erase "$(INTDIR)\WB_LIST.obj" - -@erase "$(INTDIR)\WB_MAIN.obj" - -@erase "$(INTDIR)\WB_MF.obj" - -@erase "$(INTDIR)\WB_MGSTR.obj" - -@erase "$(INTDIR)\WB_OBJ.obj" - -@erase "$(INTDIR)\WB_PANEL.obj" - -@erase "$(INTDIR)\WB_PRINT.obj" - -@erase "$(INTDIR)\WB_PS.obj" - -@erase "$(INTDIR)\WB_RES.obj" - -@erase "$(INTDIR)\WB_STDEV.obj" - -@erase "$(INTDIR)\WB_SYSEV.obj" - -@erase "$(INTDIR)\WB_TIMER.obj" - -@erase "$(INTDIR)\WB_TYPES.obj" - -@erase "$(INTDIR)\WB_UTILS.obj" - -@erase "$(INTDIR)\WB_WIN.obj" - -@erase "$(INTDIR)\WX_BUTTN.obj" - -@erase "$(INTDIR)\WX_CANVS.obj" - -@erase "$(INTDIR)\WX_CHECK.obj" - -@erase "$(INTDIR)\WX_CHOIC.obj" - -@erase "$(INTDIR)\WX_CLIPB.obj" - -@erase "$(INTDIR)\WX_CMDLG.obj" - -@erase "$(INTDIR)\WX_DC.obj" - -@erase "$(INTDIR)\WX_DIALG.obj" - -@erase "$(INTDIR)\WX_FRAME.obj" - -@erase "$(INTDIR)\WX_GAUGE.obj" - -@erase "$(INTDIR)\WX_GDI.obj" - -@erase "$(INTDIR)\WX_ITEM.obj" - -@erase "$(INTDIR)\WX_LBOX.obj" - -@erase "$(INTDIR)\WX_MAIN.obj" - -@erase "$(INTDIR)\WX_MENU.obj" - -@erase "$(INTDIR)\WX_MESSG.obj" - -@erase "$(INTDIR)\WX_MF.obj" - -@erase "$(INTDIR)\WX_PANEL.obj" - -@erase "$(INTDIR)\wx_pdf.obj" - -@erase "$(INTDIR)\WX_RBOX.obj" - -@erase "$(INTDIR)\WX_SLIDR.obj" - -@erase "$(INTDIR)\WX_TIMER.obj" - -@erase "$(INTDIR)\WX_UTILS.obj" - -@erase "$(INTDIR)\WX_WIN.obj" - -@erase "$(INTDIR)\wximgfil.obj" - -@erase "$(OUTDIR)\wxwin.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -CPP_PROJ=/nologo /MTd /W3 /Z7 /Od /I "..\..\mzscheme\gc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I "..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /Fp"$(INTDIR)\wxwin.pch" /YX"wx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c - -.c{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -RSC=rc.exe -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\wxwin.bsc" -BSC32_SBRS= \ - -LIB32=link.exe -lib -LIB32_FLAGS=/nologo /out:"$(OUTDIR)\wxwin.lib" -LIB32_OBJS= \ - "$(INTDIR)\WB_CANVS.obj" \ - "$(INTDIR)\WB_CMDLG.obj" \ - "$(INTDIR)\WB_DATA.obj" \ - "$(INTDIR)\WB_DC.obj" \ - "$(INTDIR)\WB_DIALG.obj" \ - "$(INTDIR)\WB_FRAME.obj" \ - "$(INTDIR)\WB_GDI.obj" \ - "$(INTDIR)\WB_HASH.obj" \ - "$(INTDIR)\WB_ITEM.obj" \ - "$(INTDIR)\WB_LIST.obj" \ - "$(INTDIR)\WB_MAIN.obj" \ - "$(INTDIR)\WB_MF.obj" \ - "$(INTDIR)\WB_MGSTR.obj" \ - "$(INTDIR)\WB_OBJ.obj" \ - "$(INTDIR)\WB_PANEL.obj" \ - "$(INTDIR)\WB_PRINT.obj" \ - "$(INTDIR)\WB_PS.obj" \ - "$(INTDIR)\WB_RES.obj" \ - "$(INTDIR)\WB_STDEV.obj" \ - "$(INTDIR)\WB_SYSEV.obj" \ - "$(INTDIR)\WB_TIMER.obj" \ - "$(INTDIR)\WB_TYPES.obj" \ - "$(INTDIR)\WB_UTILS.obj" \ - "$(INTDIR)\WB_WIN.obj" \ - "$(INTDIR)\WX_BUTTN.obj" \ - "$(INTDIR)\WX_CANVS.obj" \ - "$(INTDIR)\WX_CHECK.obj" \ - "$(INTDIR)\WX_CHOIC.obj" \ - "$(INTDIR)\WX_CLIPB.obj" \ - "$(INTDIR)\WX_CMDLG.obj" \ - "$(INTDIR)\WX_DC.obj" \ - "$(INTDIR)\WX_DIALG.obj" \ - "$(INTDIR)\WX_FRAME.obj" \ - "$(INTDIR)\WX_GAUGE.obj" \ - "$(INTDIR)\WX_GDI.obj" \ - "$(INTDIR)\WX_ITEM.obj" \ - "$(INTDIR)\WX_LBOX.obj" \ - "$(INTDIR)\WX_MAIN.obj" \ - "$(INTDIR)\WX_MENU.obj" \ - "$(INTDIR)\WX_MESSG.obj" \ - "$(INTDIR)\WX_MF.obj" \ - "$(INTDIR)\WX_PANEL.obj" \ - "$(INTDIR)\wx_pdf.obj" \ - "$(INTDIR)\WX_RBOX.obj" \ - "$(INTDIR)\WX_SLIDR.obj" \ - "$(INTDIR)\WX_TIMER.obj" \ - "$(INTDIR)\WX_UTILS.obj" \ - "$(INTDIR)\WX_WIN.obj" \ - "$(INTDIR)\wximgfil.obj" - -"$(OUTDIR)\wxwin.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ELSEIF "$(CFG)" == "wxwin - Win32 SGC" - -OUTDIR=.\SGC -INTDIR=.\SGC -# Begin Custom Macros -OutDir=.\SGC -# End Custom Macros - -ALL : "$(OUTDIR)\wxwin.lib" - - -CLEAN : - -@erase "$(INTDIR)\vc60.idb" - -@erase "$(INTDIR)\vc60.pdb" - -@erase "$(INTDIR)\WB_CANVS.obj" - -@erase "$(INTDIR)\WB_CMDLG.obj" - -@erase "$(INTDIR)\WB_DATA.obj" - -@erase "$(INTDIR)\WB_DC.obj" - -@erase "$(INTDIR)\WB_DIALG.obj" - -@erase "$(INTDIR)\WB_FRAME.obj" - -@erase "$(INTDIR)\WB_GDI.obj" - -@erase "$(INTDIR)\WB_HASH.obj" - -@erase "$(INTDIR)\WB_ITEM.obj" - -@erase "$(INTDIR)\WB_LIST.obj" - -@erase "$(INTDIR)\WB_MAIN.obj" - -@erase "$(INTDIR)\WB_MF.obj" - -@erase "$(INTDIR)\WB_MGSTR.obj" - -@erase "$(INTDIR)\WB_OBJ.obj" - -@erase "$(INTDIR)\WB_PANEL.obj" - -@erase "$(INTDIR)\WB_PRINT.obj" - -@erase "$(INTDIR)\WB_PS.obj" - -@erase "$(INTDIR)\WB_RES.obj" - -@erase "$(INTDIR)\WB_STDEV.obj" - -@erase "$(INTDIR)\WB_SYSEV.obj" - -@erase "$(INTDIR)\WB_TIMER.obj" - -@erase "$(INTDIR)\WB_TYPES.obj" - -@erase "$(INTDIR)\WB_UTILS.obj" - -@erase "$(INTDIR)\WB_WIN.obj" - -@erase "$(INTDIR)\WX_BUTTN.obj" - -@erase "$(INTDIR)\WX_CANVS.obj" - -@erase "$(INTDIR)\WX_CHECK.obj" - -@erase "$(INTDIR)\WX_CHOIC.obj" - -@erase "$(INTDIR)\WX_CLIPB.obj" - -@erase "$(INTDIR)\WX_CMDLG.obj" - -@erase "$(INTDIR)\WX_DC.obj" - -@erase "$(INTDIR)\WX_DIALG.obj" - -@erase "$(INTDIR)\WX_FRAME.obj" - -@erase "$(INTDIR)\WX_GAUGE.obj" - -@erase "$(INTDIR)\WX_GDI.obj" - -@erase "$(INTDIR)\WX_ITEM.obj" - -@erase "$(INTDIR)\WX_LBOX.obj" - -@erase "$(INTDIR)\WX_MAIN.obj" - -@erase "$(INTDIR)\WX_MENU.obj" - -@erase "$(INTDIR)\WX_MESSG.obj" - -@erase "$(INTDIR)\WX_MF.obj" - -@erase "$(INTDIR)\WX_PANEL.obj" - -@erase "$(INTDIR)\wx_pdf.obj" - -@erase "$(INTDIR)\WX_RBOX.obj" - -@erase "$(INTDIR)\WX_SLIDR.obj" - -@erase "$(INTDIR)\WX_TIMER.obj" - -@erase "$(INTDIR)\WX_UTILS.obj" - -@erase "$(INTDIR)\WX_WIN.obj" - -@erase "$(INTDIR)\wximgfil.obj" - -@erase "$(OUTDIR)\wxwin.lib" - -"$(OUTDIR)" : - if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" - -CPP=cl.exe -CPP_PROJ=/nologo /MTd /W3 /ZI /Od /I "..\..\mzscheme\sgc" /I "..\..\wxwindow\include\base" /I "..\..\wxwindow\include\msw" /I "..\..\wxwindow\src\base" /I "..\..\wxwindow\src\msw" /I "..\..\wxwindow\contrib\wxxpm\libxpm.34b\lib" /I "..\..\wxWindow\contrib\fafa" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D "__WINDOWS__" /D "USE_SENORA_GC" /D "USE_WXOBJECT_TRACE_COUNT" /Fp"$(INTDIR)\wxwin.pch" /YX"wx.h" /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c - -.c{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.obj:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.c{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cpp{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -.cxx{$(INTDIR)}.sbr:: - $(CPP) @<< - $(CPP_PROJ) $< -<< - -RSC=rc.exe -BSC32=bscmake.exe -BSC32_FLAGS=/nologo /o"$(OUTDIR)\wxwin.bsc" -BSC32_SBRS= \ - -LIB32=link.exe -lib -LIB32_FLAGS=/nologo /out:"$(OUTDIR)\wxwin.lib" -LIB32_OBJS= \ - "$(INTDIR)\WB_CANVS.obj" \ - "$(INTDIR)\WB_CMDLG.obj" \ - "$(INTDIR)\WB_DATA.obj" \ - "$(INTDIR)\WB_DC.obj" \ - "$(INTDIR)\WB_DIALG.obj" \ - "$(INTDIR)\WB_FRAME.obj" \ - "$(INTDIR)\WB_GDI.obj" \ - "$(INTDIR)\WB_HASH.obj" \ - "$(INTDIR)\WB_ITEM.obj" \ - "$(INTDIR)\WB_LIST.obj" \ - "$(INTDIR)\WB_MAIN.obj" \ - "$(INTDIR)\WB_MF.obj" \ - "$(INTDIR)\WB_MGSTR.obj" \ - "$(INTDIR)\WB_OBJ.obj" \ - "$(INTDIR)\WB_PANEL.obj" \ - "$(INTDIR)\WB_PRINT.obj" \ - "$(INTDIR)\WB_PS.obj" \ - "$(INTDIR)\WB_RES.obj" \ - "$(INTDIR)\WB_STDEV.obj" \ - "$(INTDIR)\WB_SYSEV.obj" \ - "$(INTDIR)\WB_TIMER.obj" \ - "$(INTDIR)\WB_TYPES.obj" \ - "$(INTDIR)\WB_UTILS.obj" \ - "$(INTDIR)\WB_WIN.obj" \ - "$(INTDIR)\WX_BUTTN.obj" \ - "$(INTDIR)\WX_CANVS.obj" \ - "$(INTDIR)\WX_CHECK.obj" \ - "$(INTDIR)\WX_CHOIC.obj" \ - "$(INTDIR)\WX_CLIPB.obj" \ - "$(INTDIR)\WX_CMDLG.obj" \ - "$(INTDIR)\WX_DC.obj" \ - "$(INTDIR)\WX_DIALG.obj" \ - "$(INTDIR)\WX_FRAME.obj" \ - "$(INTDIR)\WX_GAUGE.obj" \ - "$(INTDIR)\WX_GDI.obj" \ - "$(INTDIR)\WX_ITEM.obj" \ - "$(INTDIR)\WX_LBOX.obj" \ - "$(INTDIR)\WX_MAIN.obj" \ - "$(INTDIR)\WX_MENU.obj" \ - "$(INTDIR)\WX_MESSG.obj" \ - "$(INTDIR)\WX_MF.obj" \ - "$(INTDIR)\WX_PANEL.obj" \ - "$(INTDIR)\wx_pdf.obj" \ - "$(INTDIR)\WX_RBOX.obj" \ - "$(INTDIR)\WX_SLIDR.obj" \ - "$(INTDIR)\WX_TIMER.obj" \ - "$(INTDIR)\WX_UTILS.obj" \ - "$(INTDIR)\WX_WIN.obj" \ - "$(INTDIR)\wximgfil.obj" - -"$(OUTDIR)\wxwin.lib" : "$(OUTDIR)" $(DEF_FILE) $(LIB32_OBJS) - $(LIB32) @<< - $(LIB32_FLAGS) $(DEF_FLAGS) $(LIB32_OBJS) -<< - -!ENDIF - - -!IF "$(NO_EXTERNAL_DEPS)" != "1" -!IF EXISTS("wxwin.dep") -!INCLUDE "wxwin.dep" -!ELSE -!MESSAGE Warning: cannot find "wxwin.dep" -!ENDIF -!ENDIF - - -!IF "$(CFG)" == "wxwin - Win32 Release" || "$(CFG)" == "wxwin - Win32 Debug" || "$(CFG)" == "wxwin - Win32 SGC" -SOURCE=..\..\Wxwindow\Src\Base\WB_CANVS.cxx - -"$(INTDIR)\WB_CANVS.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_CMDLG.cxx - -"$(INTDIR)\WB_CMDLG.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_DATA.cxx - -"$(INTDIR)\WB_DATA.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_DC.cxx - -"$(INTDIR)\WB_DC.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_DIALG.cxx - -"$(INTDIR)\WB_DIALG.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_FRAME.cxx - -"$(INTDIR)\WB_FRAME.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_GDI.cxx - -"$(INTDIR)\WB_GDI.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_HASH.cxx - -"$(INTDIR)\WB_HASH.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_ITEM.cxx - -"$(INTDIR)\WB_ITEM.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_LIST.cxx - -"$(INTDIR)\WB_LIST.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_MAIN.cxx - -"$(INTDIR)\WB_MAIN.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_MF.cxx - -"$(INTDIR)\WB_MF.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_MGSTR.cxx - -"$(INTDIR)\WB_MGSTR.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_OBJ.cxx - -"$(INTDIR)\WB_OBJ.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_PANEL.cxx - -"$(INTDIR)\WB_PANEL.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_PRINT.cxx - -"$(INTDIR)\WB_PRINT.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_PS.cxx - -"$(INTDIR)\WB_PS.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_RES.cxx - -"$(INTDIR)\WB_RES.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_STDEV.cxx - -"$(INTDIR)\WB_STDEV.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_SYSEV.cxx - -"$(INTDIR)\WB_SYSEV.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_TIMER.cxx - -"$(INTDIR)\WB_TIMER.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_TYPES.cxx - -"$(INTDIR)\WB_TYPES.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_UTILS.cxx - -"$(INTDIR)\WB_UTILS.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Base\WB_WIN.cxx - -"$(INTDIR)\WB_WIN.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_BUTTN.cxx - -"$(INTDIR)\WX_BUTTN.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CANVS.cxx - -"$(INTDIR)\WX_CANVS.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CHECK.cxx - -"$(INTDIR)\WX_CHECK.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CHOIC.cxx - -"$(INTDIR)\WX_CHOIC.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CLIPB.cxx - -"$(INTDIR)\WX_CLIPB.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_CMDLG.cxx - -"$(INTDIR)\WX_CMDLG.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_DC.cxx - -"$(INTDIR)\WX_DC.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_DIALG.cxx - -"$(INTDIR)\WX_DIALG.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_FRAME.cxx - -"$(INTDIR)\WX_FRAME.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_GAUGE.cxx - -"$(INTDIR)\WX_GAUGE.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_GDI.cxx - -"$(INTDIR)\WX_GDI.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_ITEM.cxx - -"$(INTDIR)\WX_ITEM.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_LBOX.cxx - -"$(INTDIR)\WX_LBOX.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_MAIN.cxx - -"$(INTDIR)\WX_MAIN.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_MENU.cxx - -"$(INTDIR)\WX_MENU.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_MESSG.cxx - -"$(INTDIR)\WX_MESSG.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_MF.cxx - -"$(INTDIR)\WX_MF.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_PANEL.cxx - -"$(INTDIR)\WX_PANEL.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\wx_pdf.cxx - -"$(INTDIR)\wx_pdf.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_RBOX.cxx - -"$(INTDIR)\WX_RBOX.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_SLIDR.cxx - -"$(INTDIR)\WX_SLIDR.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_TIMER.cxx - -"$(INTDIR)\WX_TIMER.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_UTILS.cxx - -"$(INTDIR)\WX_UTILS.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\Wxwindow\Src\Msw\WX_WIN.cxx - -"$(INTDIR)\WX_WIN.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - -SOURCE=..\..\WXWINDOW\SRC\MSW\wximgfil.cxx - -"$(INTDIR)\wximgfil.obj" : $(SOURCE) "$(INTDIR)" - $(CPP) $(CPP_PROJ) $(SOURCE) - - - -!ENDIF - diff --git a/src/worksp/wxwin/wxwin.opt b/src/worksp/wxwin/wxwin.opt @@ -1 +0,0 @@ -ÐÏࡱ -\ No newline at end of file diff --git a/src/wxcommon/FontDirectory.cxx b/src/wxcommon/FontDirectory.cxx @@ -1,731 +0,0 @@ -/* -*- C++ -*- - * - * Purpose: wxWindows font name handling - * - * Authors: Markus Holzem, Julian Smart, and Matthew Flatt - * - * Copyright: (C) 1995, AIAI, University of Edinburgh (Julian) - * Copyright: (C) 1995, GNU (Markus) - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifdef wx_xt -# define Uses_wxApp -# define Uses_wxFontNameDirectory -# include "wx.h" -# include <string.h> -#endif - -char *font_defaults[] = { - "PostScriptMediumStraight", "", - "PostScriptMediumItalic", "-Oblique", - "PostScriptMediumSlant", "-Oblique", - "PostScriptLightStraight", "", - "PostScriptLightItalic", "-Oblique", - "PostScriptLightSlant", "-Oblique", - "PostScriptBoldStraight", "-Bold", - "PostScriptBoldItalic", "-BoldOblique", - "PostScriptBoldSlant", "-BoldOblique", - - "PostScript___", "${PostScript$[family],$[weight],$[style]}", - - "PostScriptSystem__", "${PostScriptTimes,$[weight],$[style]}", - "PostScriptDefault__", "${PostScriptTimes,$[weight],$[style]}", - "PostScriptRoman__", "${PostScriptTimes,$[weight],$[style]}", - "PostScriptDecorative__", "${PostScriptTimes,$[weight],$[style]}", - "PostScriptScript__", "${PostScriptTimes,$[weight],$[style]}", - - "PostScriptTimesMedium", "", - "PostScriptTimesLight", "", - "PostScriptTimesBold", "Bold", - - "PostScriptTimes__", "Times${PostScript$[weight]$[style]}", - "PostScriptTimesMediumStraight", "Times-Roman", - "PostScriptTimesLightStraight", "Times-Roman", - "PostScriptTimes_Slant", "Times-${PostScriptTimes$[weight]}Italic", - "PostScriptTimes_Italic", "Times-${PostScriptTimes$[weight]}Italic", - - "PostScriptSwiss__", "Helvetica${PostScript$[weight]$[style]}", - "PostScriptModern__", "Courier${PostScript$[weight]$[style]}", - "PostScriptSymbol__", "Symbol", - - "PostScriptTeletype__", "${PostScriptModern,$[weight],$[style]}", - -#ifdef wx_x - "ScreenMedium", "medium", - "ScreenBold", "bold", - "ScreenLight", "light", - "ScreenStraight", "r", - "ScreenItalic", "i", - "ScreenSlant", "o", - - "ScreenSystemBase", "*-lucida", - "ScreenDefaultBase", "*-lucida", - "ScreenRomanBase", "*-times", - "ScreenDecorativeBase", "*-helvetica", - "ScreenModernBase", "*-courier", - "ScreenTeletypeBase", "*-lucidatypewriter", - "ScreenSwissBase", "*-lucida", - "ScreenScriptBase", "*-zapfchancery", - "ScreenSymbolBase", "*-symbol", - - "ScreenStdSuffix", "-${Screen$[weight]}-${Screen$[style]}" - "-normal-*-*-%d-*-*-*-*-*-*", - - "ScreenSystem__", - "+-${ScreenSystemBase}${ScreenStdSuffix}", - "ScreenDefault__", - "+-${ScreenDefaultBase}${ScreenStdSuffix}", - "ScreenRoman__", - "+-${ScreenRomanBase}${ScreenStdSuffix}", - "ScreenDecorative__", - "+-${ScreenDecorativeBase}${ScreenStdSuffix}", - "ScreenModern__", - "+-${ScreenModernBase}${ScreenStdSuffix}", - "ScreenTeletype__", - "+-${ScreenTeletypeBase}${ScreenStdSuffix}", - "ScreenSwiss__", - "+-${ScreenSwissBase}${ScreenStdSuffix}", - "ScreenScript__", - "+-${ScreenScriptBase}${ScreenStdSuffix}", - "ScreenSymbol__", - "+-${ScreenSymbolBase}-medium-r-normal-*-*-%d-*-*-*-*-*-*", -#endif - -#ifdef wx_msw - "ScreenSystem__", "MS Sans Serif", - "ScreenDefault__", "MS Sans Serif", - "ScreenRoman__", "Times New Roman", - "ScreenDecorative__", "Arial", - "ScreenModern__", "Courier New", - "ScreenTeletype__", "${ScreenModern$[weight];$[style]}", - "ScreenSwiss__", "Arial", - "ScreenScript__", "Arial", - "ScreenSymbol__", "Symbol", -#endif - -#ifdef wx_mac - "ScreenDefault__", "applicationfont", - "ScreenSystem__", "systemfont", - "ScreenRoman__", "times", - "ScreenDecorative__", "geneva", - "ScreenModern__", "monaco", /* "courier" is also good */ - "ScreenTeletype__", "${ScreenModern,$[weight],$[style]}", - "ScreenSwiss__", "helvetica", - "ScreenScript__", "geneva", - "ScreenSymbol__", "symbol", -#endif - - NULL -}; - -wxFontNameDirectory *wxTheFontNameDirectory; - -enum { - wxWEIGHT_NORMAL, - wxWEIGHT_BOLD, - wxWEIGHT_LIGHT, - wxNUM_WEIGHTS - }; - -enum { - wxSTYLE_NORMAL, - wxSTYLE_ITALIC, - wxSTYLE_SLANT, - wxNUM_STYLES - }; - -class wxSuffixMap { - public: - char *map[wxNUM_WEIGHTS][wxNUM_STYLES]; - void Initialize(const char *, const char *, int weight, int style, int fam); - - wxSuffixMap(); - -#ifdef MZ_PRECISE_GC - void gcMark(); - void gcFixup(); -#endif -}; - -#ifdef MZ_PRECISE_GC -START_XFORM_SKIP; -void wxSuffixMap::gcMark() { - int i, j; - for (i = 0; i < wxNUM_WEIGHTS; i++) - for (j = 0; j < wxNUM_STYLES; j++) { - gcMARK_TYPED(char *, map[i][j]); - } -} -void wxSuffixMap::gcFixup() { - int i, j; - for (i = 0; i < wxNUM_WEIGHTS; i++) - for (j = 0; j < wxNUM_STYLES; j++) { - gcFIXUP_TYPED(char *, map[i][j]); - } -} -END_XFORM_SKIP; -#endif - -wxSuffixMap::wxSuffixMap() { - int i, j; - for (i = 0; i < wxNUM_WEIGHTS; i++) { - for (j = 0; j < wxNUM_STYLES; j++) { - map[i][j] = NULL; - } - } -} - -class wxFontNameItem : public wxObject -{ - public: - int id; - int family; - char *name; - wxSuffixMap *screen, *printing; - Bool isfamily; - wxFontNameItem(); -}; - -wxFontNameItem::wxFontNameItem() -{ - screen = new wxSuffixMap; - printing = new wxSuffixMap; -} - -static int WCoordinate(int w) -{ - switch (w) { - case wxBOLD: - return wxWEIGHT_BOLD; - case wxLIGHT: - return wxWEIGHT_LIGHT; - case wxNORMAL: - default: - return wxWEIGHT_NORMAL; - } -} - -static int SCoordinate(int s) -{ - switch (s) { - case wxITALIC: - return wxSTYLE_ITALIC; - case wxSLANT: - return wxSTYLE_SLANT; - case wxNORMAL: - default: - return wxSTYLE_NORMAL; - } -} - -wxFontNameDirectory::wxFontNameDirectory(void) -{ - wxHashTable *ht; - ht = new wxHashTable(wxKEY_INTEGER, 20); - table = ht; - nextFontId = 100; /* Larger than all family ids */ -} - -wxFontNameDirectory::~wxFontNameDirectory() -{ - delete table; -} - -int wxFontNameDirectory::GetNewFontId(void) -{ - return (nextFontId++); -} - -#ifdef wx_x -# define GET_CLASS_NAME wxTheApp->GetClassName() -#else -# define GET_CLASS_NAME wxTheApp->wx_class -#endif - -static void SearchResource(const char *prefix, const char **names, int count, char **v) -{ - int k, i, j; - char resource[1024], **defaults, *internal, *cn; - - k = 1 << count; - - *v = NULL; - internal = NULL; - - for (i = 0; i < k; i++) { - strcpy(resource, prefix); - for (j = 0; j < count; j++) { - if (!(i & (1 << j))) - strcat(resource, names[j]); - else - strcat(resource, "_"); - } - - cn = GET_CLASS_NAME; - if (wxGetResource(cn, (char *)resource, v) && **v) - return; - - if (!internal) { - defaults = font_defaults; - while (*defaults) { - if (!strcmp(*defaults, resource)) { - internal = defaults[1]; - break; - } - defaults += 2; - } - } - } - - if (internal) { - char *s; - s = copystring(internal); - *v = s; - } -} - -void wxInitializeFontNameDirectory(void) -{ - wxREGGLOB(wxTheFontNameDirectory); - wxTheFontNameDirectory = new wxFontNameDirectory; - wxTheFontNameDirectory->Initialize(wxSYSTEM, wxSYSTEM, "System"); - wxTheFontNameDirectory->Initialize(wxDEFAULT, wxDEFAULT, "Default"); - wxTheFontNameDirectory->Initialize(wxDECORATIVE, wxDECORATIVE, "Decorative"); - wxTheFontNameDirectory->Initialize(wxROMAN, wxROMAN, "Roman"); - wxTheFontNameDirectory->Initialize(wxMODERN, wxMODERN, "Modern"); - wxTheFontNameDirectory->Initialize(wxTELETYPE, wxTELETYPE, "Teletype"); - wxTheFontNameDirectory->Initialize(wxSWISS, wxSWISS, "Swiss"); - wxTheFontNameDirectory->Initialize(wxSCRIPT, wxSCRIPT, "Script"); - wxTheFontNameDirectory->Initialize(wxSYMBOL, wxSYMBOL, "Symbol"); -} - -void wxSuffixMap::Initialize(const char *resname, const char *devresname, - int wt, int st, int fam) -{ - const char *weight, *style; - char *v = NULL; - int i, drn; - - { - switch (wt) { - case wxWEIGHT_NORMAL: - weight = "Medium"; - break; - case wxWEIGHT_LIGHT: - weight = "Light"; - break; - case wxWEIGHT_BOLD: - default: - weight = "Bold"; - } - { - int len, closer = 0, startpos = 0; - const char *rnames[3]; - - switch (st) { - case wxSTYLE_NORMAL: - style = "Straight"; - break; - case wxSTYLE_ITALIC: - style = "Italic"; - break; - case wxSTYLE_SLANT: - default: - style = "Slant"; - } - - rnames[0] = resname; - rnames[1] = weight; - rnames[2] = style; - - SearchResource(devresname, rnames, 3, &v); - - /* Expand macros in the found string: */ - found: - len = (v ? strlen(v) : 0); - for (i = 0; i < len; i++) { - if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{'))) { - startpos = i; - if (v[i+1] == '[') - closer = ']'; - else - closer = '}'; - i++; - } else if (v[i] == closer) { - int newstrlen, noff; - const char *r = NULL; - char *naya, *name; - - noff = startpos + 2; - name = v; - v[i] = 0; - - if (closer == '}') { - int i, count, len; - char **names; - - for (i = 0, count = 1; name[i + noff]; i++) { - if (name[i + noff] == ',') { - count++; - name[i + noff] = 0; - } - } - - len = i; - - names = new char*[count]; - - { - char *cs; - cs = COPYSTRING_TO_ALIGNED(name, noff); - names[0] = cs; - } - for (i = 0, count = 1; i < len; i++) { - if (!name[i + noff]) { - { - char *cs; - cs = COPYSTRING_TO_ALIGNED(name, i + 1 + noff); - names[count++] = cs; - } - } - } - - SearchResource("", (const char **)names, count, (char **)&r); - delete[] names; - - if (!r) { - for (i = 0; i < len; i++) { - if (!name[i + noff]) - name[i + noff] = ','; - } - r = ""; - printf("Bad resource name \"%s\" in font lookup\n", name + noff); - } - } else if (!strcmp(name + noff, "weight")) { - r = weight; - } else if (!strcmp(name + noff, "style")) { - r = style; - } else if (!strcmp(name + noff, "family")) { - switch (fam) { - case wxSYSTEM: - r = "System"; - break; - case wxDECORATIVE: - r = "Decorative"; - break; - case wxROMAN: - r = "Roman"; - break; - case wxMODERN: - r = "Modern"; - break; - case wxTELETYPE: - r = "Teletype"; - break; - case wxSWISS: - r = "Swiss"; - break; - case wxSCRIPT: - r = "Script"; - break; - case wxSYMBOL: - r = "Symbol"; - break; - default: - r = "Default"; - } - } else { - r = ""; - printf("Bad font macro name \"%s\"\n", name + noff); - } - newstrlen = strlen(r); - - naya = new char[len + newstrlen + 1]; - memcpy(naya, v, startpos); - memcpy(naya + startpos, r, newstrlen); - memcpy(naya + startpos + newstrlen, v + i + 1, len - i + 1); - - delete[] v; - v = naya; - - goto found; - } - } - - drn = ((resname[0] == '@') ? 1 : 0); - -#if defined(wx_msw) || defined(wx_mac) - if (!v) - v = copystring(resname + drn); -#endif -#ifdef wx_x - if (!strcmp(devresname, "Screen")) { - if (v && (v[0] == '+')) { - memmove(v, v + 1, strlen(v)); - } else { - int len, ds; - char *src; - char *normalcy; - /* Build name using special heuristics: - -([^-]*) => -*-\1-<weight>-<style>-normal-*-*-%d-*-*-*-*-*-* - -([^-]*)-(.*) => -\1-\2-<weight>-<style>-normal-*-*-%d-*-*-*-*-*-* - ([^-].*[^-]) => \1 - */ - - if (v) { - src = (char *)v; - ds = 0; - } else { - src = (char *)resname; - ds = drn; - } - - len = strlen(src + ds); - if (src[ds] == '-') { - char *prefix; - int c = 0; - for (i = 0; i < len; i++) { - if (src[ds + i] == '-') - c++; - } - - v = new char[len + 40]; - if (c < 2) - prefix = "-*"; - else - prefix = ""; - - if (c < 3) { - switch (wt) { - case wxWEIGHT_NORMAL: - weight = "-medium"; - break; - case wxWEIGHT_LIGHT: - weight = "-light"; - break; - case wxWEIGHT_BOLD: - default: - weight = "-bold"; - } - } else - weight = ""; - - if (c < 4) { - switch (st) { - case wxSTYLE_NORMAL: - style = "-r"; - break; - case wxSTYLE_ITALIC: - style = "-i"; - break; - case wxSTYLE_SLANT: - default: - style = "-o"; - } - } else - style = ""; - - if (c < 5) - normalcy = "-normal"; - else - normalcy = ""; - - sprintf(v, "%s%s%s%s%s-*-*-%%d-*-*-*-*-*-*", - prefix, src + ds, weight, style, normalcy); - } else - v = copystring(src); - } - } -#endif - - /* We have a final value: */ - map[wt][st] = v; - } - } -} - -void wxFontNameDirectory::Initialize(int fontid, int family, const char *resname) -{ - wxFontNameItem *item; - - item = new wxFontNameItem; - - item->id = fontid; - item->family = family; - item->isfamily = (resname[0] != '@'); - item->name = copystring(resname); - - table->Put(fontid, item); -} - -int wxFontNameDirectory::FindOrCreateFontId(const char *name, int family) -{ - int id; - char *s; - - if ((id = GetFontId(name, family))) - return id; - - id = GetNewFontId(); - s = new char[strlen(name) + 2]; - strcpy(s + 1, name); - s[0] = '@'; - Initialize(id, family, s); - - return id; -} - -char *wxFontNameDirectory::GetScreenName(int fontid, int weight, int style) -{ - int wt, st; - wxFontNameItem *item; - - item = (wxFontNameItem *)table->Get(fontid); - - if (!item) - return NULL; - - wt = WCoordinate(weight); - st = SCoordinate(style); - - /* Check for init */ - if (!item->screen->map[wt][st]) - item->screen->Initialize(item->name, "Screen", wt, st, item->family); - - return item->screen->map[wt][st]; -} - -void wxFontNameDirectory::SetScreenName(int fontid, int weight, int style, char *s) -{ - int wt, st; - wxFontNameItem *item; - - item = (wxFontNameItem *)table->Get(fontid); - - if (!item) - return; - - wt = WCoordinate(weight); - st = SCoordinate(style); - -#ifdef wx_x - { - /* Safety: name must be less than 500 chars, and must not contain % - except maybe one instance of %d. */ - int i, found_d = 0; - for (i = 0; s[i]; i++) { - if (i > 500) { - s = NULL; - break; - } - if (s[i] == '%') { - if (found_d || (s[i+1] != 'd')) { - s = NULL; - break; - } else - found_d = 1; - } - } - } - - if (!s) - return; -#endif - - item->screen->map[wt][st] = s; -} - -char *wxFontNameDirectory::GetPostScriptName(int fontid, int weight, int style) -{ - int wt, st; - wxFontNameItem *item; - - item = (wxFontNameItem *)table->Get(fontid); - - if (!item) - return NULL; - - wt = WCoordinate(weight); - st = SCoordinate(style); - - /* Check for init */ - if (!item->printing->map[wt][st]) - item->printing->Initialize(item->name, "PostScript", wt, st, item->family); - - return item->printing->map[wt][st]; -} - -void wxFontNameDirectory::SetPostScriptName(int fontid, int weight, int style, char *s) -{ - int wt, st; - wxFontNameItem *item; - - item = (wxFontNameItem *)table->Get(fontid); - - if (!item) - return; - - wt = WCoordinate(weight); - st = SCoordinate(style); - - item->printing->map[wt][st] = s; -} - -char *wxFontNameDirectory::GetFontName(int fontid) -{ - wxFontNameItem *item; - item = (wxFontNameItem *)table->Get(fontid); - - if (!item) - return NULL; - - if (item->isfamily) - return NULL; - - return item->name + 1; -} - -int wxFontNameDirectory::GetFontId(const char *name, int family) -{ - wxNode *node; - - table->BeginFind(); - - while ((node = table->Next())) { - wxFontNameItem *item; - item = (wxFontNameItem *)node->Data(); - if (!item->isfamily - && !strcmp(name, item->name+1) - && item->family == family) - return item->id; - } - - return 0; -} - -int wxFontNameDirectory::GetFamily(int fontid) -{ - wxFontNameItem *item; - item = (wxFontNameItem *)table->Get(fontid); - - if (!item) - return wxDEFAULT; - - return item->family; -} - - diff --git a/src/wxcommon/FontDirectory.h b/src/wxcommon/FontDirectory.h @@ -1,61 +0,0 @@ - /* -*- C++ -*- - * $Id: FontDirectory.h,v 1.3 1999/11/27 17:11:40 mflatt Exp $ - * - * Purpose: wxWindows font name handling - * - * Authors: Markus Holzem, Julian Smart, and Matthew Flatt - * - * Copyright: (C) 1995, AIAI, University of Edinburgh (Julian) - * Copyright: (C) 1995, GNU (Markus) - * - * 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 2 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, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - */ - -#ifndef FontDirectory_h -#define FontDirectory_h - -#ifdef __GNUG__ -#pragma interface -#endif - -class wxHashTable; - -class wxFontNameDirectory : public wxObject -{ - wxHashTable *table; - int nextFontId; - public: - wxFontNameDirectory(void); - ~wxFontNameDirectory(); - char *GetScreenName(int fontid, int weight, int style); - char *GetPostScriptName(int fontid, int weight, int style); - void SetScreenName(int fontid, int weight, int style, char *s); - void SetPostScriptName(int fontid, int weight, int style, char *s); - - void Initialize(int fontid, int family, const char *name); - int GetNewFontId(void); - - int FindOrCreateFontId(const char *name, int family); - - int GetFontId(const char *name, int family); - char *GetFontName(int fontid); - int GetFamily(int fontid); -}; - -extern wxFontNameDirectory *wxTheFontNameDirectory; - -void wxInitializeFontNameDirectory(void); - -#endif /* FontDirectory_h */ diff --git a/src/wxcommon/PSDC.cxx b/src/wxcommon/PSDC.cxx @@ -1,2290 +0,0 @@ -/* - * File: wb_ps.cc - * Purpose: Device context implementation (PostScript) - * Author: Julian Smart - * Created: 1993 - * Updated: August 1994 - * Copyright: (c) 1993, AIAI, University of Edinburgh - */ - -/* This file is the same for all three version of wxWindows from - PLT. */ - -#if defined(_MSC_VER) -# include "wx.h" -#else - -#ifdef wx_xt -# define Uses_XLib -# define Uses_wxList -# define Uses_wxWindowDC -# define Uses_wxMemoryDC -# define Uses_wxPostScriptDC -# define Uses_wxPrintSetup -# define Uses_wxFontNameDirectory -# define Uses_wxDialogBox -# define Uses_wxButton -# define Uses_wxRadioBox -# define Uses_wxText -# define Uses_wxChoice -# define Uses_wxCheckBox -# include "wx.h" - -# include <math.h> -# include <string.h> - -#else - -# ifdef __GNUG__ -# pragma implementation "wx_dcps.h" -# pragma implementation -# pragma interface -#endif - -# include "common.h" -# include "wx_frame.h" -# include "wx_dcps.h" -# include "wx_dcmem.h" -# include "wx_utils.h" -# include "wx_dialg.h" -# include "wx_cmdlg.h" -# include "wx_main.h" -# include "wx_lbox.h" -# include "wx_rbox.h" -# include "wx_buttn.h" -# include "wx_choic.h" -# include "wx_check.h" -# include "wx_messg.h" -# include "wx_txt.h" -# include "wx_mtxt.h" - -#endif -#endif - -#include "wx_rgn.h" - -# define YSCALE(y) ((paper_h) - ((y) * user_scale_y + device_origin_y)) -# define XSCALE(x) ((x) * user_scale_x + device_origin_x) -# define YOFFSET(y) ((paper_h) - ((y) + device_origin_y)) -# define XOFFSET(x) ((x) + device_origin_x) -# define YSCALEREL(dy) ((dy) * user_scale_y) -# define XSCALEREL(dx) ((dx) * user_scale_x) -# define XSCALEBND(dx) (XSCALEREL(dx) + device_origin_x) -# define YSCALEBND(dy) (YSCALEREL(dy) + device_origin_y) - -# define ASCALEREL(a) ((a) * ascale) - -# define PIE pie - -#define RESET_FONT 0x1 -#define RESET_COLOR 0x2 - -static double pie = 0.0; -static int complained_afm = 0; - -#ifndef WXUNUSED -# define WXUNUSED(x) x -#endif - -#ifdef wx_xt -# define WXXTUNUSED(c) /* empty */ -#else -# define WXXTUNUSED(x) x -#endif - -#define DEFAULT_PAPER "Letter 8 1/2 x 11 in" - -class wxCanvas; - -#ifndef wx_xt -#include "wx_privt.h" -#endif - -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <limits.h> -#include <assert.h> - -static char *default_afm_path = NULL; - -Bool XPrinterDialog(wxWindow *parent); - -#ifdef wx_mac -wxPrintPaperDatabase *wxThePrintPaperDatabase; -#endif - -#ifndef wx_xt -# define current_font font -#else -# define current_bk_mode current_text_bgmode -# define current_text_foreground current_text_fg -# define current_text_background current_text_bg -#endif - -class PSStream : public wxObject { - FILE *f; - int int_width; - - public: - - PSStream(char *file) { - f = fopen(file, "w"); - int_width = 0; - } - ~PSStream(void) { - if (f) fclose(f); - } - - int good(void) { - return !!f; - } - - void Out(char s) { - fprintf(f, "%c", s); - } - void Out(const char *s) { - fwrite(s, strlen(s), 1, f); - } - void Out(float n); - void Out(double d) { - Out((float)d); - } - void Out(long l); - void Out(int i) { - Out((long)i); - } - - long tellp(void) { - return ftell(f); - } - void seekp(long pos) { - fseek(f, pos, 0); - } - - void width(int w) { - int_width = w; - } -}; - -void PSStream::Out(float n) -{ - if (int_width > 0) { - if ((float)(long)n == n) { - Out((long)n); - return; - } - } - fprintf(f, "%f", n); -} - -void PSStream::Out(long l) -{ - if (int_width > 0) { - char buffer[50]; - sprintf(buffer, "%%+%d.%dld", int_width, int_width); - fprintf(f, buffer, l); - int_width = 0; - } else - fprintf(f, "%ld", l); -} - -wxPostScriptDC::wxPostScriptDC (void) -{ - Create(TRUE); -} - -wxPostScriptDC::wxPostScriptDC (Bool interactive) -{ - Create(interactive); -} - -Bool wxPostScriptDC::Create(Bool interactive) -{ - wxPrintSetupData *wxThePrintSetupData; - char *paperType; - wxPrintPaperType *paper; - - if (!pie) - pie = 2 * asin((double)1.0); - - __type = wxTYPE_DC_POSTSCRIPT; -#ifndef wx_xt - wx_interactive = interactive; -#endif - current_font = wxNORMAL_FONT; - device = wxDEVICE_EPS; - clipping = NULL; - -#ifndef wx_xt - logical_origin_x = 0; - logical_origin_y = 0; - - device_origin_x = 0; - device_origin_y = 0; - - logical_scale_x = 1.0; - logical_scale_y = 1.0; - - user_scale_x = 1.0; - user_scale_y = 1.0; - - min_x = 10000.0; - min_y = 10000.0; - max_x = -10000.0; - max_y = -10000.0; - - current_pen = NULL; - current_brush = NULL; - current_background_color = new wxColour(wxWHITE); - - current_text_foreground = new wxColour(wxBLACK); - - mapping_mode = MM_TEXT; -#else - current_pen = wxBLACK_PEN; - current_pen->Lock(1); - current_brush = wxWHITE_BRUSH; - current_brush->Lock(1); - current_background_color->CopyFrom(wxWHITE); -#endif - - title = NULL; - - filename = NULL; - - pstream = NULL; - - clipx = 0; - clipy = 0; - clipw = -1; - cliph = -1; - - ok = PrinterDialog(interactive); - if (!ok) - return FALSE; - - currentRed = 0; - currentGreen = 0; - currentBlue = 0; - - Colour = TRUE; - - wxThePrintSetupData = wxGetThePrintSetupData(); - - level2ok = wxThePrintSetupData->GetLevel2(); - afm_path = wxThePrintSetupData->GetAFMPath(); - - paperType = wxThePrintSetupData->GetPaperName(); - if (!paperType) - paperType = DEFAULT_PAPER; - - paper = wxThePrintPaperDatabase->FindPaperType(paperType); - if (!paper) - paper = wxThePrintPaperDatabase->FindPaperType(DEFAULT_PAPER); - if (paper) { - paper_w = (float)paper->widthPixels; - paper_h = (float)paper->heightPixels; - } else { - paper_w = 1000; - paper_h = 1000; - } - - if (wxThePrintSetupData) { - wxThePrintSetupData->GetPrinterTranslation(&paper_x, &paper_y); - wxThePrintSetupData->GetPrinterScaling(&paper_x_scale, &paper_y_scale); - if (wxThePrintSetupData->GetPrinterOrientation() == PS_LANDSCAPE) - landscape = 1; - else - landscape = 0; - } else { - paper_x = paper_y = 0; - paper_x_scale = paper_y_scale = 1; - landscape = 0; - } - - if (landscape) { - float tmp; - - tmp = paper_w; - paper_w = paper_h; - paper_h = tmp; - } - - paper_w /= paper_x_scale; - if (!paper_w) - paper_w = 1; - paper_h /= paper_y_scale; - if (!paper_h) - paper_h = 1; - - return ok; -} - -wxPostScriptDC::~wxPostScriptDC (void) -{ - if (current_brush) current_brush->Lock(-1); - if (current_pen) current_pen->Lock(-1); - - if (pstream) - DELETE_OBJ pstream; -} - -Bool wxPostScriptDC::PrinterDialog(Bool interactive) -{ - wxPrintSetupData *wxThePrintSetupData; - char *s; - - if (interactive) { - ok = XPrinterDialog(NULL); - if (!ok) - return FALSE; - } else - ok = TRUE; - - wxThePrintSetupData = wxGetThePrintSetupData(); - - mode = wxThePrintSetupData->GetPrinterMode(); - s = wxThePrintSetupData->GetPrintPreviewCommand(); - preview_cmd = copystring(s); - s = wxThePrintSetupData->GetPrinterCommand(); - print_cmd = copystring(s); - s = wxThePrintSetupData->GetPrinterOptions(); - print_opts = copystring(s); - - if ((mode == PS_PREVIEW) || (mode == PS_PRINTER)) { - // For PS_PRINTER action this depends on a Unix-style print spooler - // since the wx_printer_file can be destroyed during a session - // @@@ TODO: a Windows-style answer for non-Unix - char userId[256]; - char tmp[256]; - wxGetUserId (userId, sizeof (userId) / sizeof (char)); - strcpy (tmp, "/tmp/preview_"); - strcat (tmp, userId); - strcat (tmp, ".ps"); - filename = copystring(tmp); - } else if (mode == PS_FILE) { - char *file; - file = interactive ? (char *)NULL : wxThePrintSetupData->GetPrinterFile(); - if (!file) - file = wxSaveFileSelector("PostScript", "ps"); - if (!file) { - ok = FALSE; - return FALSE; - } - filename = copystring(file); - ok = TRUE; - } - - return ok; -} - -void wxPostScriptDC::SetClippingRect(float cx, float cy, float cw, float ch) -{ - wxRegion *r; - - if (!pstream) - return; - - r = new wxRegion(this); - r->SetRectangle(cx, cy, cw, ch); - - SetClippingRegion(r); -} - -wxRegion *wxPostScriptDC::GetClippingRegion() -{ - if (clipping) - return new wxRegion(this, clipping); - else - return NULL; -} - -void wxPostScriptDC::SetClippingRegion(wxRegion *r) -{ - if (!pstream) - return; - if (r && (r->GetDC() != this)) - return; - - if (clipping) { - clipping = NULL; - pstream->Out("initclip\n"); - } - - if (r) { - pstream->Out("newpath\n"); - if (r->ps) { /* => non-empty region */ - wxPSRgn *rl; - char *s; - rl = r->ps->Lift(); - s = rl->GetString(); - pstream->Out(s); - } - pstream->Out("clip\n"); - - clipping = r; - } -} - -void wxPostScriptDC::Clear(void) -{ - unsigned char red, blue, green; - - if (!pstream) - return; - - red = current_background_color->Red(); - blue = current_background_color->Blue(); - green = current_background_color->Green(); - - { - float redPS = (float) (((int) red) / 255.0); - float bluePS = (float) (((int) blue) / 255.0); - float greenPS = (float) (((int) green) / 255.0); - - /* Fill with current background */ - pstream->Out("gsave newpath\n"); - pstream->Out(redPS); pstream->Out(" "); pstream->Out(greenPS); pstream->Out(" "); pstream->Out(bluePS); pstream->Out(" setrgbcolor\n"); - pstream->Out(0); pstream->Out(" "); pstream->Out(0); pstream->Out(" moveto\n"); - pstream->Out(0); pstream->Out(" "); pstream->Out(paper_h); pstream->Out(" lineto\n"); - pstream->Out(paper_w); pstream->Out(" "); pstream->Out(paper_h); pstream->Out(" lineto\n"); - pstream->Out(paper_w); pstream->Out(" "); pstream->Out(0); pstream->Out(" lineto\n"); - pstream->Out("closepath\n"); - pstream->Out("fill grestore\n"); - } -} - -void wxPostScriptDC::FloodFill(float WXUNUSED(x), float WXUNUSED(y), wxColour * WXUNUSED(col), int WXUNUSED(style)) -{ -} - -Bool wxPostScriptDC::GetPixel(float WXUNUSED(x), float WXUNUSED(y), wxColour * WXUNUSED(col)) -{ - return FALSE; -} - -void wxPostScriptDC::IntDrawLine (int x1, int y1, int x2, int y2) -{ - DrawLine ((float) x1, (float) y1, (float) x2, (float) y2); -} - -void wxPostScriptDC::CrossHair (float x, float y) -{ - DrawLine(0, y, paper_w, y); - DrawLine(x, 0, x, paper_h); -} - -void wxPostScriptDC::DrawLine (float x1, float y1, float x2, float y2) -{ - if (!pstream) - return; - if (current_pen) - SetPen (current_pen); - pstream->Out("newpath\n"); - pstream->Out(XSCALE(x1)); pstream->Out(" "); pstream->Out(YSCALE (y1)); pstream->Out(" moveto\n"); - pstream->Out(XSCALE(x2)); pstream->Out(" "); pstream->Out(YSCALE (y2)); pstream->Out(" lineto\n"); - pstream->Out("stroke\n"); - CalcBoundingBox(XSCALEBND(x1), YSCALEBND(y1)); - CalcBoundingBox(XSCALEBND(x2), YSCALEBND(y2)); -} - -void wxPostScriptDC::DrawArc (float x, float y, float w, float h, float start, float end) -{ - if (!pstream) - return; - - if (start != end) { - float a1, a2, radius, xscale; - - /* Before we scale: */ - CalcBoundingBox(XSCALEBND(x), YSCALEBND(y)); - CalcBoundingBox(XSCALEBND(x + w), YSCALEBND(y + h)); - - x = XSCALE(x); - y = XSCALE(y); - w = XSCALEREL(w); - h = YSCALEREL(h); - - radius = (h / 2); - xscale = (w / h); - - a1 = start * (180 / pie); - a2 = end * (180 / pie); - - pstream->Out("gsave\n"); - pstream->Out((x + w/2)); pstream->Out(" "); pstream->Out((paper_h - (y + h/2))); pstream->Out(" translate\n"); - pstream->Out(xscale); pstream->Out(" "); pstream->Out(1); pstream->Out(" scale\n"); - - if (current_brush && current_brush->GetStyle () != wxTRANSPARENT) { - SetBrush(current_brush); - - pstream->Out("newpath\n"); - pstream->Out(cos(start)*radius); pstream->Out(" "); - pstream->Out(sin(start)*radius); pstream->Out(" moveto\n"); - pstream->Out("0 0 "); pstream->Out(radius); pstream->Out(" "); pstream->Out(a1); - pstream->Out(" "); pstream->Out(a2); pstream->Out(" arc\n"); - - pstream->Out("0 0 lineto\n"); - - pstream->Out("closepath\n"); - - pstream->Out("fill\n"); - } - if (current_pen && current_pen->GetStyle () != wxTRANSPARENT) { - SetPen(current_pen); - - pstream->Out("newpath\n"); - pstream->Out(cos(start)*radius); pstream->Out(" "); pstream->Out(sin(start)*radius); pstream->Out(" moveto\n"); - pstream->Out("0 0 "); pstream->Out(radius); pstream->Out(" "); - pstream->Out(a1); pstream->Out(" "); pstream->Out(a2); pstream->Out(" arc\n"); - pstream->Out("stroke\n"); - } - - pstream->Out("grestore\n"); - } -} - -void wxPostScriptDC::DrawPoint (float x, float y) -{ - if (!pstream) - return; - if (current_pen) - SetPen (current_pen); - pstream->Out("newpath\n"); - pstream->Out(XSCALE(x)); pstream->Out(" "); pstream->Out(YSCALE (y)); pstream->Out(" moveto\n"); - pstream->Out(XSCALE(x+1)); pstream->Out(" "); pstream->Out(YSCALE (y)); pstream->Out(" lineto\n"); - pstream->Out("stroke\n"); - CalcBoundingBox(XSCALEBND(x), YSCALEBND(y)); -} - -void wxPostScriptDC::DrawSpline(float x1, float y1, float x2, float y2, float x3, float y3) -{ - float x21, y21, x22, y22; - float xm1, ym1, xm2, ym2; - - if (!pstream) - return; - - pstream->Out("newpath\n"); - - pstream->Out(XSCALE(x1)); pstream->Out(" "); pstream->Out(YSCALE(y1)); pstream->Out(" moveto "); - - x21 = (x1 + x2) / 2; - y21 = (y1 + y2) / 2; - - pstream->Out(XSCALE(x21)); pstream->Out(" "); pstream->Out(YSCALE(y21)); pstream->Out(" lineto\n"); - - x22 = (x2 + x3) / 2; - y22 = (y2 + y3) / 2; - - xm1 = (x21 + x2) / 2; - ym1 = (y21 + y2) / 2; - - xm2 = (x2 + x22) / 2; - ym2 = (y2 + y22) / 2; - - pstream->Out(XSCALE(xm1)); pstream->Out(" "); pstream->Out(YSCALE(ym1)); pstream->Out(" "); - - pstream->Out(XSCALE(xm2)); pstream->Out(" "); pstream->Out(YSCALE(ym2)); pstream->Out(" "); - - pstream->Out(XSCALE(x22)); pstream->Out(" "); pstream->Out(YSCALE(y22)); pstream->Out(" curveto\n"); - - pstream->Out(XSCALE(x3)); pstream->Out(" "); pstream->Out(YSCALE(y3)); pstream->Out(" lineto\n"); - - pstream->Out("stroke\n"); - - CalcBoundingBox(XSCALEBND(x1), YSCALEBND(y1)); - CalcBoundingBox(XSCALEBND(x2), YSCALEBND(y2)); - CalcBoundingBox(XSCALEBND(x3), YSCALEBND(y3)); -} - -void wxPostScriptDC::DrawPolygon (int n, wxPoint points[], float xoffset, float yoffset, int fillStyle) -{ - if (!pstream) - return; - if (n > 0) - { - if (current_brush && current_brush->GetStyle () != wxTRANSPARENT) - { - int i; - float xx, yy; - - SetBrush (current_brush); - pstream->Out("newpath\n"); - - xx = points[0].x + xoffset; - yy = (points[0].y + yoffset); - pstream->Out(XSCALE(xx)); pstream->Out(" "); pstream->Out(YSCALE(yy)); pstream->Out(" moveto\n"); - CalcBoundingBox(XSCALEBND(xx), YSCALEBND(yy)); - - for (i = 1; i < n; i++) - { - xx = points[i].x + xoffset; - yy = (points[i].y + yoffset); - pstream->Out(XSCALE(xx)); pstream->Out(" "); pstream->Out(YSCALE(yy)); pstream->Out(" lineto\n"); - CalcBoundingBox(XSCALEBND(xx), YSCALEBND(yy)); - } - pstream->Out(((fillStyle == wxODDEVEN_RULE) ? "eofill\n" : "fill\n")); - } - - if (current_pen && current_pen->GetStyle () != wxTRANSPARENT) - { - int i; - float xx, yy; - - SetPen (current_pen); - pstream->Out("newpath\n"); - - xx = points[0].x + xoffset; - yy = (points[0].y + yoffset); - pstream->Out(XSCALE(xx)); pstream->Out(" "); pstream->Out(YSCALE(yy)); pstream->Out(" moveto\n"); - CalcBoundingBox(XSCALEBND(xx), YSCALEBND(yy)); - - for (i = 1; i < n; i++) - { - xx = points[i].x + xoffset; - yy = (points[i].y + yoffset); - pstream->Out(XSCALE(xx)); pstream->Out(" "); pstream->Out(YSCALE(yy)); pstream->Out(" lineto\n"); - CalcBoundingBox(XSCALEBND(xx), YSCALEBND(yy)); - } - - // Close the polygon - xx = points[0].x + xoffset; - yy = (points[0].y + yoffset); - pstream->Out(XSCALE(xx)); pstream->Out(" "); pstream->Out(YSCALE(yy)); pstream->Out(" lineto\n"); - - // Output the line - pstream->Out("stroke\n"); - } - } -} - -void wxPostScriptDC::DrawLines (int n, wxIntPoint points[], int xoffset, int yoffset) -{ - if (!pstream) - return; - if (n > 0) { - int i; - float xx, yy; - - if (current_pen) - SetPen (current_pen); - - pstream->Out("newpath\n"); - - xx = (float) (points[0].x + xoffset); - yy = (float) (points[0].y + yoffset); - pstream->Out(XSCALE(xx)); pstream->Out(" "); pstream->Out(YSCALE(yy)); pstream->Out(" moveto\n"); - CalcBoundingBox(XSCALEBND(xx), YSCALEBND(yy)); - - for (i = 1; i < n; i++) - { - xx = (float) (points[i].x + xoffset); - yy = (float) (points[i].y + yoffset); - pstream->Out(XSCALE(xx)); pstream->Out(" "); pstream->Out(YSCALE(yy)); pstream->Out(" lineto\n"); - CalcBoundingBox(XSCALEBND(xx), YSCALEBND(yy)); - } - pstream->Out("stroke\n"); - } -} - -void wxPostScriptDC::DrawLines (int n, wxPoint points[], float xoffset, float yoffset) -{ - if (!pstream) - return; - if (n > 0) { - int i; - float xx, yy; - - if (current_pen) - SetPen (current_pen); - - pstream->Out("newpath\n"); - - xx = points[0].x + xoffset; - yy = (points[0].y + yoffset); - pstream->Out(XSCALE(xx)); pstream->Out(" "); pstream->Out(YSCALE(yy)); pstream->Out(" moveto\n"); - CalcBoundingBox(XSCALEBND(xx), YSCALEBND(yy)); - - for (i = 1; i < n; i++) - { - xx = points[i].x + xoffset; - yy = (points[i].y + yoffset); - pstream->Out(XSCALE(xx)); pstream->Out(" "); pstream->Out(YSCALE(yy)); pstream->Out(" lineto\n"); - CalcBoundingBox(XSCALEBND(xx), YSCALEBND(yy)); - } - pstream->Out("stroke\n"); - } -} - -#ifdef wx_xt - -void wxPostScriptDC::DrawLines(wxList *list, float xoffset, float yoffset) -{ - int n, i; - wxPoint *points; - wxNode *node; - - n = list->Number(); -#ifdef MZ_PRECISE_GC - points = (wxPoint *)GC_malloc_atomic(sizeof(wxPoint) * n); -#else - points = new wxPoint[n]; -#endif - - i = 0; - for (node = list->First(); node; node = node->Next()) { - wxPoint *point; - point = (wxPoint *)node->Data(); - points[i].x = point->x; - points[i++].y = point->y; - } - DrawLines(n, points, xoffset, yoffset); -} - -void wxPostScriptDC::DrawPolygon(wxList *list, float xoffset, float yoffset,int fillStyle) -{ - int n, i; - wxPoint *points; - wxNode *node; - - n = list->Number(); -#ifdef MZ_PRECISE_GC - points = (wxPoint *)GC_malloc_atomic(sizeof(wxPoint) * n); -#else - points = new wxPoint[n]; -#endif - - i = 0; - for(node = list->First(); node; node = node->Next()) { - wxPoint *point; - point = (wxPoint *)node->Data(); - points[i].x = point->x; - points[i++].y = point->y; - } - DrawPolygon(n, points, xoffset, yoffset, fillStyle); -} - -#endif - -void wxPostScriptDC::DrawRectangle (float x, float y, float width, float height) -{ - if (!pstream) - return; - if (current_brush && current_brush->GetStyle () != wxTRANSPARENT) - { - SetBrush (current_brush); - - pstream->Out("newpath\n"); - pstream->Out(XSCALE(x)); pstream->Out(" "); pstream->Out(YSCALE (y)); pstream->Out(" moveto\n"); - pstream->Out(XSCALE(x + width)); pstream->Out(" "); pstream->Out(YSCALE (y)); pstream->Out(" lineto\n"); - pstream->Out(XSCALE(x + width)); pstream->Out(" "); pstream->Out(YSCALE (y + height)); pstream->Out(" lineto\n"); - pstream->Out(XSCALE(x)); pstream->Out(" "); pstream->Out(YSCALE (y + height)); pstream->Out(" lineto\n"); - pstream->Out("closepath\n"); - pstream->Out("fill\n"); - - CalcBoundingBox(XSCALEBND(x), YSCALEBND(y)); - CalcBoundingBox(XSCALEBND(x + width), YSCALEBND(y + height)); - } - if (current_pen && current_pen->GetStyle () != wxTRANSPARENT) - { - SetPen (current_pen); - - pstream->Out("newpath\n"); - pstream->Out(XSCALE(x)); pstream->Out(" "); pstream->Out(YSCALE (y)); pstream->Out(" moveto\n"); - pstream->Out(XSCALE(x + width)); pstream->Out(" "); pstream->Out(YSCALE (y)); pstream->Out(" lineto\n"); - pstream->Out(XSCALE(x + width)); pstream->Out(" "); pstream->Out(YSCALE (y + height)); pstream->Out(" lineto\n"); - pstream->Out(XSCALE(x)); pstream->Out(" "); pstream->Out(YSCALE (y + height)); pstream->Out(" lineto\n"); - pstream->Out("closepath\n"); - pstream->Out("stroke\n"); - - CalcBoundingBox(XSCALEBND(x), YSCALEBND(y)); - CalcBoundingBox(XSCALEBND(x + width), YSCALEBND(y + height)); - } -} - -void wxPostScriptDC::DrawRoundedRectangle (float x, float y, float width, float height, float radius) -{ - float ascale; - - if (!pstream) - return; - - if (radius < 0.0) - { - // Now, a negative radius is interpreted to mean - // 'the proportion of the smallest X or Y dimension' - float smallest = 0.0; - if (width < height) - smallest = width; - else - smallest = height; - radius = (float) (-radius * smallest); - } - - ascale = (user_scale_x < user_scale_y) ? user_scale_x : user_scale_y; - - if (current_brush && current_brush->GetStyle () != wxTRANSPARENT) - { - SetBrush (current_brush); - // Draw rectangle anticlockwise - pstream->Out("newpath\n"); - - pstream->Out(XSCALE(x) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y)); pstream->Out(" moveto\n"); - - pstream->Out(XSCALE(x) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y) - ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(ASCALEREL(radius)); pstream->Out(" 90 180 arc\n"); - - pstream->Out(XSCALE(x) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y + height) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(ASCALEREL(radius)); pstream->Out(" 180 270 arc\n"); - - pstream->Out(XSCALE(x + width) - ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y + height) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(ASCALEREL(radius)); pstream->Out(" 270 0 arc\n"); - - pstream->Out(XSCALE(x + width) - ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y) - ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(ASCALEREL(radius)); pstream->Out(" 0 90 arc\n"); - - pstream->Out("closepath\n"); - - pstream->Out("fill\n"); - - CalcBoundingBox(XSCALEBND(x), YSCALEBND(y)); - CalcBoundingBox(XSCALEBND(x + width), YSCALEBND(y + height)); - } - if (current_pen && current_pen->GetStyle () != wxTRANSPARENT) - { - SetPen (current_pen); - // Draw rectangle anticlockwise - pstream->Out("newpath\n"); - - pstream->Out(XSCALE(x) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y)); pstream->Out(" moveto\n"); - - pstream->Out(XSCALE(x) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y) - ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(ASCALEREL(radius)); pstream->Out(" 90 180 arc\n"); - - pstream->Out(XSCALE(x) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y + height) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(ASCALEREL(radius)); pstream->Out(" 180 270 arc\n"); - - pstream->Out(XSCALE(x + width) - ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y + height) + ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(ASCALEREL(radius)); pstream->Out(" 270 0 arc\n"); - - pstream->Out(XSCALE(x + width) - ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(YSCALE(y) - ASCALEREL(radius)); pstream->Out(" "); - pstream->Out(ASCALEREL(radius)); pstream->Out(" 0 90 arc\n"); - - pstream->Out("closepath\n"); - - pstream->Out("stroke\n"); - - CalcBoundingBox(XSCALEBND(x), YSCALEBND(y)); - CalcBoundingBox(XSCALEBND(x + width), YSCALEBND(y + height)); - } -} - -void wxPostScriptDC::DrawEllipse (float x, float y, float width, float height) -{ - if (!pstream) - return; - if (current_brush && current_brush->GetStyle () != wxTRANSPARENT) - { - SetBrush (current_brush); - - pstream->Out("newpath\n"); - pstream->Out(XSCALE(x + width / 2)); pstream->Out(" "); pstream->Out(YSCALE(y + height / 2)); pstream->Out(" "); - pstream->Out(XSCALEREL(width / 2)); pstream->Out(" "); pstream->Out(YSCALEREL(height / 2)); pstream->Out(" 0 360 ellipse\n"); - pstream->Out("fill\n"); - - CalcBoundingBox(XSCALEBND(x - width), YSCALEBND(y - height)); - CalcBoundingBox(XSCALEBND(x + width), YSCALEBND(y + height)); - } - if (current_pen && current_pen->GetStyle () != wxTRANSPARENT) - { - SetPen (current_pen); - - pstream->Out("newpath\n"); - pstream->Out(XSCALE(x + width / 2)); pstream->Out(" "); pstream->Out(YSCALE(y + height / 2)); pstream->Out(" "); - pstream->Out(XSCALEREL(width / 2)); pstream->Out(" "); pstream->Out(YSCALEREL(height / 2)); pstream->Out(" 0 360 ellipse\n"); - pstream->Out("stroke\n"); - - CalcBoundingBox (XSCALEBND(x - width), YSCALEBND(y - height)); - CalcBoundingBox (XSCALEBND(x + width), YSCALEBND(y + height)); - } -} - -void wxPostScriptDC::SetFont (wxFont * the_font) -{ - char *name; - int Family, Style, Weight, size; - - if (!pstream) - return; - if ((current_font == the_font) && !(resetFont & RESET_FONT)) - return; - - resetFont -= (resetFont & RESET_FONT); - - current_font = the_font; - Family = current_font->GetFontId(); - Style = current_font->GetStyle(); - Weight = current_font->GetWeight(); - - name = wxTheFontNameDirectory->GetPostScriptName(Family, Weight, Style); - if (!name) - name = "Times-Roman"; - - pstream->Out("/"); pstream->Out(name); pstream->Out(" findfont\n"); - size = current_font->GetPointSize(); - pstream->Out(YSCALEREL(size)); pstream->Out(" scalefont setfont\n"); -} - -static void set_pattern(wxPostScriptDC *dc, PSStream *pstream, wxBitmap *bm, int rop, wxColour *col) -{ - int width, height; - - width = bm->GetWidth(); - height = bm->GetHeight(); - - pstream->Out("8 dict\n"); - pstream->Out("dup\n"); - pstream->Out("begin\n"); - pstream->Out(" /PatternType 1 def\n"); - pstream->Out(" /PaintType 1 def\n"); - pstream->Out(" /TilingType 1 def\n"); - pstream->Out(" /BBox [ 0 0 "); pstream->Out(width); pstream->Out(" "); pstream->Out(height); pstream->Out(" ] def\n"); - pstream->Out(" /XStep "); pstream->Out(width); pstream->Out(" def\n"); - pstream->Out(" /YStep "); pstream->Out(height); pstream->Out(" def\n"); - - dc->Blit(0, 0, width, height, bm, 0, 0, -rop - 1, col); - - pstream->Out("end\n"); - pstream->Out(" matrix makepattern setpattern\n"); -} - -static char *dotted = "[2 5] 2"; -static char *short_dashed = "[4 4] 2"; -static char *long_dashed = "[4 8] 2"; -static char *dotted_dashed = "[6 6 2 6] 4"; - -void wxPostScriptDC::SetPen (wxPen * pen) -{ - wxPen *oldPen = current_pen; - char *psdash = NULL; - unsigned char red, blue, green; - float width; - - if (!pstream) - return; - - if (current_pen) current_pen->Lock(-1); - if (pen) pen->Lock(1); - - if ((current_pen = pen) == NULL) - return; /* NIL */ - - // Line width - width = pen->GetWidthF(); - pstream->Out(width); - pstream->Out(" setlinewidth\n"); - - if (level2ok) { - wxBitmap *stipple; - stipple = pen->GetStipple(); - if (stipple && stipple->Ok()) { - int ps; - wxColour *pc; - ps = pen->GetStyle(); - pc = pen->GetColour(); - set_pattern(this, pstream, stipple, ps, pc); - resetFont |= RESET_COLOR; - return; - } - } - - switch (pen->GetStyle ()) - { - case wxDOT: - psdash = dotted; - break; - case wxSHORT_DASH: - psdash = short_dashed; - break; - case wxLONG_DASH: - psdash = long_dashed; - break; - case wxDOT_DASH: - psdash = dotted_dashed; - break; - case wxSOLID: - case wxTRANSPARENT: - default: - psdash = "[] 0"; - break; - } - if (oldPen != pen) { - pstream->Out(psdash); pstream->Out(" setdash\n"); - } - - // Line colour - { - wxColour *pc; - pc = pen->GetColour(); - red = pc->Red(); - blue = pc->Blue(); - green = pc->Green(); - } - - if (!Colour) - { - // Anything not white is black - if (!(red == (unsigned char) 255 && blue == (unsigned char) 255 - && green == (unsigned char) 255)) - { - red = (unsigned char) 0; - green = (unsigned char) 0; - blue = (unsigned char) 0; - } - } - - if (!(red == currentRed && green == currentGreen && blue == currentBlue) - || (resetFont & RESET_COLOR)) { - float redPS = (float) (((int) red) / 255.0); - float bluePS = (float) (((int) blue) / 255.0); - float greenPS = (float) (((int) green) / 255.0); - - pstream->Out(redPS); pstream->Out(" "); pstream->Out(greenPS); - pstream->Out(" "); pstream->Out(bluePS); pstream->Out(" setrgbcolor\n"); - - currentRed = red; - currentBlue = blue; - currentGreen = green; - resetFont -= (resetFont & RESET_COLOR); - } -} - -static char *ps_brush_hatch[] = { " 0 0 moveto 8 8", - " 0 0 moveto 8 8 lineto closepath stroke 8 0 moveto 0 8", - " 8 0 moveto 0 8", - " 0 4 moveto 8 4 lineto closepath stroke 4 0 moveto 4 8", - " 0 4 moveto 8 4", - " 4 0 moveto 4 8" }; - -void wxPostScriptDC::SetBrush(wxBrush * brush) -{ - unsigned char red, blue, green; - int hatch_id; - float redPS, bluePS, greenPS; - - if (!pstream) - return; - - if (current_brush) current_brush->Lock(-1); - if (brush) brush->Lock(1); - - if ((current_brush = brush) == NULL) - return; - - if (level2ok) { - wxBitmap *stipple; - stipple = brush->GetStipple(); - if (stipple && stipple->Ok()) { - int bs; - wxColour *bc; - bs = brush->GetStyle(); - bc = brush->GetColour(); - set_pattern(this, pstream, stipple, bs, bc); - resetFont |= RESET_COLOR; - return; - } - } - - // Brush colour - { - wxColour *bc; - bc = brush->GetColour(); - red = bc->Red(); - blue = bc->Blue(); - green = bc->Green(); - } - - if (!Colour) { - // Anything not black is white - if (!(red == (unsigned char) 0 && blue == (unsigned char) 0 - && green == (unsigned char) 0)) { - red = (unsigned char) 255; - green = (unsigned char) 255; - blue = (unsigned char) 255; - } - } - - hatch_id = -1; - switch (brush->GetStyle()) { - case wxBDIAGONAL_HATCH: - hatch_id = 0; - break; - case wxCROSSDIAG_HATCH: - hatch_id = 1; - break; - case wxFDIAGONAL_HATCH: - hatch_id = 2; - break; - case wxCROSS_HATCH: - hatch_id = 3; - break; - case wxHORIZONTAL_HATCH: - hatch_id = 4; - break; - case wxVERTICAL_HATCH: - hatch_id = 5; - break; - } - - redPS = (float) (((int) red) / 255.0); - bluePS = (float) (((int) blue) / 255.0); - greenPS = (float) (((int) green) / 255.0); - - if (hatch_id > -1) { - pstream->Out("7 dict\n"); - pstream->Out("dup\n"); - pstream->Out("begin\n"); - pstream->Out(" /PatternType 1 def\n"); - pstream->Out(" /PaintType 1 def\n"); - pstream->Out(" /TilingType 1 def\n"); - pstream->Out(" /BBox [ 0 0 8 8 ] def\n"); - pstream->Out(" /XStep 8 def\n"); - pstream->Out(" /YStep 8 def\n"); - pstream->Out(" /PaintProc { begin gsave \n"); - - pstream->Out(" 0 setlinewidth\n"); - pstream->Out(" [] 0 setdash\n"); - pstream->Out(" "); pstream->Out(redPS); pstream->Out(" "); pstream->Out(greenPS); - pstream->Out(" "); pstream->Out(bluePS); pstream->Out(" setrgbcolor\n"); - - pstream->Out(" "); pstream->Out(ps_brush_hatch[hatch_id]); pstream->Out(" lineto closepath stroke \n"); - - pstream->Out("grestore\n } def \n"); - - pstream->Out("end\n"); pstream->Out(" matrix makepattern setpattern\n"); - - resetFont |= RESET_COLOR; - - return; - } - - if (!(red == currentRed && green == currentGreen && blue == currentBlue) - || (resetFont & RESET_COLOR)) { - pstream->Out(redPS); pstream->Out(" "); pstream->Out(greenPS); pstream->Out(" "); - pstream->Out(bluePS); pstream->Out(" setrgbcolor\n"); - currentRed = red; - currentBlue = blue; - currentGreen = green; - resetFont -= (resetFont & RESET_COLOR); - } -} - -void wxPostScriptDC::DrawText(DRAW_TEXT_CONST char *text, float x, float y, - Bool use16, int dt) -{ - float tw, th; - int i, len, size; - - if (!pstream) - return; - if (current_font) - SetFont (current_font); - - GetTextExtent(text, &tw, &th, NULL, NULL, NULL, use16, dt); - - if (current_bk_mode == wxSOLID) { - unsigned char red, blue, green; - - red = current_text_background->Red(); - blue = current_text_background->Blue(); - green = current_text_background->Green(); - - { - float redPS = (float) (((int) red) / 255.0); - float bluePS = (float) (((int) blue) / 255.0); - float greenPS = (float) (((int) green) / 255.0); - - pstream->Out("gsave newpath\n"); - pstream->Out(redPS); pstream->Out(" "); pstream->Out(greenPS); pstream->Out(" "); - pstream->Out(bluePS); pstream->Out(" setrgbcolor\n"); - pstream->Out(XSCALE(x)); pstream->Out(" "); pstream->Out(YSCALE (y)); pstream->Out(" moveto\n"); - pstream->Out(XSCALE(x + tw)); pstream->Out(" "); pstream->Out(YSCALE (y)); pstream->Out(" lineto\n"); - pstream->Out(XSCALE(x + tw)); pstream->Out(" "); pstream->Out(YSCALE (y + th)); pstream->Out(" lineto\n"); - pstream->Out(XSCALE(x)); pstream->Out(" "); pstream->Out(YSCALE (y + th)); pstream->Out(" lineto\n"); - pstream->Out("closepath\n"); - pstream->Out("fill grestore\n"); - } - } - - if (current_text_foreground->Ok()) { - unsigned char red, blue, green; - - red = current_text_foreground->Red(); - blue = current_text_foreground->Blue(); - green = current_text_foreground->Green(); - - if (!Colour) { - // Anything not white is black - if (!(red == (unsigned char) 255 && blue == (unsigned char) 255 - && green == (unsigned char) 255)) - { - red = (unsigned char) 0; - green = (unsigned char) 0; - blue = (unsigned char) 0; - } - } - if (!(red == currentRed && green == currentGreen && blue == currentBlue) - || (resetFont & RESET_COLOR)) { - float redPS = (float) (((int) red) / 255.0); - float bluePS = (float) (((int) blue) / 255.0); - float greenPS = (float) (((int) green) / 255.0); - pstream->Out(redPS); pstream->Out(" "); pstream->Out(greenPS); pstream->Out(" "); - pstream->Out(bluePS); pstream->Out(" setrgbcolor\n"); - - currentRed = red; - currentBlue = blue; - currentGreen = green; - resetFont -= (resetFont & RESET_COLOR); - } - } - - size = 10; - if (current_font) - size = current_font->GetPointSize(); - - pstream->Out(XSCALE(x)); pstream->Out(" "); pstream->Out(YSCALE (y + size)); pstream->Out(" moveto\n"); - - pstream->Out("("); - len = strlen(text + dt); - for (i = 0; i < len; i++) - { - char ch = text[i + dt]; - if (ch == ')' || ch == '(' || ch == '\\') - pstream->Out("\\"); - pstream->Out(ch); - } - - pstream->Out(")"); pstream->Out(" show\n"); - - CalcBoundingBox(XSCALEBND(x), YSCALEBND(y)); - CalcBoundingBox(XSCALEBND(x + tw), YSCALEBND(y + th)); -} - - -void wxPostScriptDC::SetBackground (wxColour * c) -{ - current_background_color->CopyFrom(c); -} - -void wxPostScriptDC::SetBackgroundMode(int mode) -{ - current_bk_mode = mode; -} - -void wxPostScriptDC::SetTextBackground(wxColour *col) -{ - current_text_background->CopyFrom(col); -} - -void wxPostScriptDC::SetTextForeground(wxColour *col) -{ - current_text_foreground->CopyFrom(col); -} - -void wxPostScriptDC::TryColour(wxColour *src, wxColour *dest) -{ - if (!Colour) { - if ((src->Red() == 255) - && (src->Green() == 255) - && (src->Blue() == 255)) - dest->Set(255, 255, 255); - else - dest->Set(0, 0, 0); - } else - *dest = *src; -} - -static const char *wxPostScriptHeaderEllipse = "\ -/ellipsedict 8 dict def\n\ -ellipsedict /mtrx matrix put\n\ -/ellipse\n\ -{ ellipsedict begin\n\ - /endangle exch def\n\ - /startangle exch def\n\ - /yrad exch def\n\ - /xrad exch def\n\ - /y exch def\n\ - /x exch def\n\ - /savematrix mtrx currentmatrix def\n\ - x y translate\n\ - xrad yrad scale\n\ - 0 0 1 endangle startangle arcn\n\ - savematrix setmatrix\n\ - end\n\ - } def\n\ -"; - -Bool wxPostScriptDC::StartDoc (char *message) -{ - char userID[256]; - - if (device == wxDEVICE_EPS) { - PSStream *pss; - pss = new PSStream(filename); - pstream = pss; - - if (!pstream || !pstream->good()) { - ok = FALSE; - pstream = NULL; - return FALSE; - } - ok = TRUE; - } - - pstream->Out("%!PS-Adobe-2.0 EPSF-2.0\n"); /* PostScript magic strings */ - if (title) { - pstream->Out("%%Title: "); pstream->Out(title); pstream->Out("\n"); - } - pstream->Out("%%Creator: "); pstream->Out("MrEd"); pstream->Out("\n"); - pstream->Out("%%CreationDate: "); pstream->Out(wxNow()); pstream->Out("\n"); - - // User Id information - if (wxGetEmailAddress(userID, sizeof(userID))) { - char userName[245]; - pstream->Out("%%For: "); pstream->Out((char *)userID); - if (wxGetUserName(userName, sizeof(userName))) { - pstream->Out(" ("); pstream->Out((char *)userName); pstream->Out(")"); - } - pstream->Out("\n"); - } else if ( wxGetUserName(userID, sizeof(userID))) { - pstream->Out("%%For: "); pstream->Out((char *)userID); pstream->Out("\n"); - } - - boundingboxpos = pstream->tellp(); - - pstream->Out("%%BoundingBox: -00000 -00000 -00000 -00000\n"); - pstream->Out("%%Pages: -00000\n"); - pstream->Out("%%EndComments\n\n"); - - pstream->Out(wxPostScriptHeaderEllipse); - - SetBrush(wxWHITE_BRUSH); - SetPen(wxBLACK_PEN); - - page_number = 1; - if (message) { - title = copystring (message); - } - - return TRUE; -} - -#ifdef wx_x -extern void wxsExecute(char **); -#endif - -void wxPostScriptDC::EndDoc (void) -{ - float llx; - float lly; - float urx; - float ury; - - if (!pstream) - return; - if (clipping) { - clipping = FALSE; - pstream->Out("grestore\n"); - } - - // Compute the bounding box. Note that it is in the default user - // coordinate system, thus we have to convert the values. - // If we're landscape, our sense of "x" and "y" is reversed. - if (landscape) { - llx = min_y * paper_y_scale + paper_y; - lly = min_x * paper_x_scale + paper_x; - urx = max_y * paper_y_scale + paper_y; - ury = max_x * paper_x_scale + paper_x; - } else { - llx = min_x * paper_x_scale + paper_x; - lly = paper_h * paper_y_scale - (max_y * paper_y_scale) + paper_y; - urx = max_x * paper_x_scale + paper_x; - ury = paper_h * paper_y_scale - (min_y * paper_y_scale) + paper_y; - } - - // The Adobe specifications call for integers; we round as to make - // the bounding larger. - pstream->seekp(boundingboxpos); - pstream->Out("%%BoundingBox: "); - pstream->width(5); - pstream->Out(floor(llx)); pstream->Out(" "); - pstream->width(5); - pstream->Out(floor(lly)); pstream->Out(" "); - pstream->width(5); - pstream->Out(ceil(urx) ); pstream->Out(" "); - pstream->width(5); - pstream->Out(ceil(ury)); pstream->Out("\n"); - pstream->Out("%%Pages: "); - pstream->width(5); - pstream->Out((page_number - 1)); pstream->Out("\n"); - - DELETE_OBJ pstream; - pstream = NULL; - -#ifdef wx_x - if (ok /* && wx_interactive */) - { - switch (mode) { - case PS_PREVIEW: - { - char *argv[3]; - argv[0] = preview_cmd; - argv[1] = filename; - argv[2] = NULL; - wxsExecute (argv); - } - break; - - case PS_PRINTER: - { - char *argv[4]; - char *opts; - int i; - argv[0] = print_cmd; - i = 1; - opts = print_opts; - if (opts && *opts) - argv[i++] = opts; - argv[i++] = filename; - argv[i] = NULL; - wxsExecute(argv); - } - break; - - case PS_FILE: - break; - } - } -#endif -} - -void wxPostScriptDC::StartPage (void) -{ - if (!pstream) - return; - pstream->Out("%%Page: "); pstream->Out(page_number++); pstream->Out("\n"); - - pstream->Out((paper_x + (landscape ? (paper_h * paper_y_scale) : 0))); - pstream->Out(" "); pstream->Out(paper_y); pstream->Out(" translate\n"); - if (landscape) { - pstream->Out(paper_y_scale); pstream->Out(" "); pstream->Out(paper_x_scale); pstream->Out(" scale\n"); - pstream->Out("90 rotate\n"); - } else { - pstream->Out(paper_x_scale); pstream->Out(" "); pstream->Out(paper_y_scale); pstream->Out(" scale\n"); - } - pstream->Out("2 setlinecap\n"); - - resetFont = RESET_FONT | RESET_COLOR; - - if (clipping) - SetClippingRegion(clipping); -} - -void wxPostScriptDC::EndPage (void) -{ - if (!pstream) - return; - pstream->Out("showpage\n"); -} - - -static void printhex(PSStream *pstream, int v) -{ - int h, l; - char s[3]; - - s[2] = 0; - - h = (v >> 4) & 0xF; - l = v & 0xF; - - if (h <= 9) - s[0] = '0' + h; - else - s[0] = 'a' + (h - 10); - if (l <= 9) - s[1] = '0' + l; - else - s[1] = 'a' + (l - 10); - - pstream->Out(s); -} - - -Bool wxPostScriptDC:: -Blit (float xdest, float ydest, float fwidth, float fheight, - wxMemoryDC *src, float xsrc, float ysrc, int rop, wxColour *dcolor) -{ - int mono; - long j, i; - wxColour *c; - int pixel; - int pr, pg, pb; - - wxCanvasDC *source = (wxCanvasDC *)src; - long width, height, x, y; - Bool asColour = level2ok; - - if (!pstream) - return FALSE; - - width = (long)floor(fwidth); - height = (long)floor(fheight); - x = (long)floor(xsrc); - y = (long)floor(ysrc); - - /* Since we want a definition, may need to start a dictionary: */ - if (rop >= 0) { - pstream->Out("1 dict begin\n"); - } - - /* Allocate space. */ - pstream->Out("/DataString "); - pstream->Out((width * (asColour ? 3 : 1) * ((rop < 0) ? height : 1))); - pstream->Out(" string def\n"); - - if (rop < 0) { - pstream->Out(" /PaintProc { begin \n"); - } - - /* PostScript setup: */ - pstream->Out("gsave\n"); - if (rop >= 0) { - pstream->Out(XSCALE(xdest)); pstream->Out(" "); pstream->Out(YSCALE(ydest) - fheight); pstream->Out(" translate\n"); - } - pstream->Out(fwidth); pstream->Out(" "); pstream->Out(fheight); pstream->Out(" scale\n"); - pstream->Out(width); pstream->Out(" "); pstream->Out(height); pstream->Out(" 8 [ "); - pstream->Out(width); pstream->Out(" 0 0 "); pstream->Out((-height)); pstream->Out(" 0 "); pstream->Out(height); - pstream->Out(" ]\n"); - if (rop >= 0) { - pstream->Out("{\n"); - pstream->Out(" currentfile DataString readhexstring pop\n"); - pstream->Out("} bind"); - } else { - pstream->Out(" { DataString } "); - } - if (asColour) { - pstream->Out(" false 3 colorimage\n"); - } else { - pstream->Out(" image\n"); - } - - if (rop < 0) { - pstream->Out("grestore\n } def \n"); - pstream->Out(" { currentfile DataString readhexstring pop pop } exec\n"); - } - - /* Output data as hex digits: */ - { - wxBitmap *sbm; - sbm = src->GetObject(); - mono = (sbm->GetDepth() == 1); - } - - if (mono && dcolor) { - pr = dcolor->Red(); - pg = dcolor->Green(); - pb = dcolor->Blue(); - } else - pr = pg = pb = 0; - - c = new wxColour; - for (j = 0; j < height; j++) { - for (i = 0; i < width; i++) { - int red, green, blue; - - source->GetPixel(i, j, c); - - red = c->Red(); - green = c->Green(); - blue = c->Blue(); - - if (mono && !red && !green && !blue) { - red = pr; - green = pg; - blue = pb; - } else if (mono) { - if ((rop != wxSOLID) && (rop != (-wxSOLID - 1))) { - red = current_background_color->Red(); - green = current_background_color->Green(); - blue = current_background_color->Blue(); - } - } - - if (asColour) { - printhex(pstream, red); - printhex(pstream, green); - printhex(pstream, blue); - } else { - float r, g, b; - - r = ((float)(red) / 255); - g = ((float)(green) / 255); - b = ((float)(blue) / 255); - - pixel = (int)(255 * sqrt(((r * r) + (g * g) + (b * b)) / 3)); - - printhex(pstream, pixel); - } - } - pstream->Out("\n"); - } - - if (rop >= 0) { - pstream->Out("grestore\n"); - /* End dictionary: */ - pstream->Out("end\n"); - } - - if (rop >= 0) { - CalcBoundingBox(XSCALEBND(xdest), YSCALEBND(ydest)); - /* Bitmap isn't scaled: */ - CalcBoundingBox(XSCALEBND(xdest) + fwidth, YSCALEBND(ydest) + fheight); - } - - return TRUE; -} - -static wxMemoryDC *temp_mdc; - -Bool wxPostScriptDC::Blit (float xdest, float ydest, float fwidth, float fheight, - wxBitmap *bm, float xsrc, float ysrc, int rop, wxColour *c) -{ - Bool v; - - if (!temp_mdc) { - wxREGGLOB(temp_mdc); - temp_mdc = new wxMemoryDC(1); - } - - temp_mdc->SelectObject(bm); - /* Might fail, so we double-check: */ - if (temp_mdc->GetObject()) { - v = Blit(xdest, ydest, fwidth, fheight, - temp_mdc, xsrc, ysrc, rop, c); - temp_mdc->SelectObject(NULL); - } else - v = FALSE; - - return v; -} - -float wxPostScriptDC::GetCharHeight (void) -{ - if (current_font) - return (float) current_font->GetPointSize (); - else - return 12.0; -} - - -float wxPostScriptDC::GetCharWidth (void) -{ - return 0; -} - -// these static vars are for storing the state between calls -static int lastFamily= INT_MIN; -static int lastSize= INT_MIN; -static int lastStyle= INT_MIN; -static int lastWeight= INT_MIN; -static int lastDescender = INT_MIN; -static int capHeight = -1; -static int lastWidths[256]; // widths of the characters - -void wxPostScriptDC::GetTextExtent (const char *string, float *x, float *y, - float *descent, float *topSpace, wxFont *theFont, - Bool WXUNUSED(use16), int dt) -{ - wxFont *fontToUse = theFont; - int Family; - int Size; - int Style; - int Weight; - - float widthSum = 0.0; - float height; - int dp; - - if (!fontToUse) - fontToUse = current_font; - - if (!pstream) { - *x = *y = 0; - if (descent) *descent = 0.0; - if (topSpace) *topSpace = 0.0; - return; - } - - // ************************************************************ - // method for calculating string widths in postscript: - // read in the AFM (adobe font metrics) file for the - // actual font, parse it and extract the character widths - // and also the descender. this may be improved, but for now - // it works well. the AFM file is only read in if the - // font is changed. this may be chached in the future. - // calls to GetTextExtent with the font unchanged are rather - // efficient! - // - // for each font and style used there is an AFM file necessary. - // currently i have only files for the roman font family. - // i try to get files for the other ones! - - // get actual parameters - Family = fontToUse->GetFontId(); - Size = fontToUse->GetPointSize(); - Style = fontToUse->GetStyle(); - Weight = fontToUse->GetWeight(); - - // if we have a new font, read the font-metrics - if (Family != lastFamily - || Size != lastSize - || Style != lastStyle - || Weight != lastWeight) { - char *name; - char *afmName; - FILE *afmFile; - - // store cached values - lastFamily = Family; - lastSize = Size; - lastStyle = Style; - lastWeight = Weight; - - // read in new font metrics ************************************** - - // 1. construct filename ****************************************** - name = wxTheFontNameDirectory->GetPostScriptName(Family, Weight, Style); - if (name && afm_path) { - int len = strlen(afm_path); - // get the directory of the AFM files - afmName = new char[strlen(name) + len + 256]; - strcpy(afmName, afm_path); -#ifdef wx_mac - if (len && (afm_path[len - 1] != ':')) - strcat(afmName, ":"); -#endif -#ifdef wx_x - if (len && (afm_path[len - 1] != '/')) - strcat(afmName, "/"); -#endif -#ifdef wx_msw - if (len && (afm_path[len - 1] != '/') && (afm_path[len - 1] != '\\')) - strcat(afmName, "/"); -#endif - strcat(afmName, name); - strcat(afmName,".afm"); - } else - afmName = NULL; - - // 2. open and process the file ********************************** - - // a short explanation of the AFM format: - // we have for each character a line, which gives its size - // e.g.: - // - // C 63 ; WX 444 ; N question ; B 49 -14 395 676 ; - // - // that means, we have a character with ascii code 63, and width - // (444/1000 * fontSize) points. - // the other data is ignored for now! - // - // when the font has changed, we read in the right AFM file and store the - // character widths in an array, which is processed below (see point 3.). - - afmFile = (afmName ? fopen(afmName,"r") : (FILE *)NULL); - - if (afmFile==NULL) { - int i; - if (!complained_afm) { - char bfr[256]; - sprintf(bfr, "Cannot open AFM file for %.150s; guessing font sizes.\n" - "(Silently guessing fonts for future AFM failures.)" - , name); - wxError(bfr, "MrEd Warning"); - complained_afm = 1; - } - for (i = 0; i < 256; i++) { - lastWidths[i] = 500; // an approximate value - } - lastDescender = -150; // dito. - } else { - // some variables for holding parts of a line - char cString[256], semiString[256], WXString[256], descString[256]; - char line[256]; - int ascii, cWidth; - int i; - - // init the widths array - for (i = 0; i < 256; i++) { - lastWidths[i] = INT_MIN; - } - - // read in the file and parse it - while (fgets(line,sizeof(line),afmFile)) { - if (!strncmp(line, "Descender ", 10)) { - // descender - if ((sscanf(line, "%s%d", descString, &lastDescender) != 2) - || strcmp(descString,"Descender")) { - wxDebugMsg("AFM-file '%s': line '%s' has error (bad descender)\n", - afmName, line); - } - } else if (!strncmp(line, "CapHeight ", 10)) { - // descender - if ((sscanf(line, "%s%d", descString, &capHeight) != 2) - || strcmp(descString, "CapHeight")) { - wxDebugMsg("AFM-file '%s': line '%s' has error (bad cap height)\n", - afmName, line); - } - } else if (!strncmp(line, "C ", 2)){ - // char-width - if(sscanf(line, "%s%d%s%s%d", cString, &ascii, - semiString, WXString, &cWidth) != 5) { - wxDebugMsg("AFM-file '%s': line '%s' has an error (bad character width)\n", - afmName, line); - } - if(strcmp(cString,"C") - || strcmp(semiString,";") - || strcmp(WXString,"WX")) { - wxDebugMsg("AFM-file '%s': line '%s' has a format error\n",afmName,line); - } - //printf(" char '%c'=%d has width '%d'\n",ascii,ascii,cWidth); - if (ascii >= 0 && ascii < 256) { - lastWidths[ascii] = cWidth; // store width - } else { - /* This happens a lot; don't print an error */ - // wxDebugMsg("AFM-file '%s': ASCII value %d out of range\n",afmName,ascii); - } - } - } - fclose(afmFile); - } - } - - // 3. now the font metrics are read in, calc size ******************* - // this is done by adding the widths of the characters in the - // string. they are given in 1/1000 of the size! - - height = (float)Size; - for (dp = dt; string[dp]; dp++) { - int ch; - ch = ((unsigned char *)string)[dp]; - if (lastWidths[ch] == INT_MIN) { - wxDebugMsg("GetTextExtent: undefined width for character '%c' (%d)\n", - ch, ch); - widthSum += lastWidths[' ']; // assume space - } else { - widthSum += (lastWidths[ch] / 1000.0F) * Size; - } - } - - // add descender to height (it is usually a negative value) - if (lastDescender != INT_MIN) { - height += ((-lastDescender) / 1000.0F) * Size; - } - - // return size values - *x = widthSum; - *y = height; - - // return other parameters - if (descent){ - if (lastDescender != INT_MIN) - *descent = ((-lastDescender) / 1000.0F) * Size; - else - *descent = 0.0; - } - - if (topSpace) { - if (capHeight > -1) - *topSpace = ((1000 - capHeight) / 1000.0F) * Size; - else - *topSpace = 0.0; - } -} - -void wxPostScriptDC::SetMapMode (int WXXTUNUSED(mode)) -{ -#ifndef wx_xt - mapping_mode = mode; -#endif - return; -} - -void wxPostScriptDC::SetUserScale (float x, float y) -{ - user_scale_x = x; - user_scale_y = y; -} - -float wxPostScriptDC::DeviceToLogicalX(int x) -{ - return (x - device_origin_x) / user_scale_x; -} - -float wxPostScriptDC::DeviceToLogicalXRel(int x) -{ - return x / user_scale_x; -} - -float wxPostScriptDC::DeviceToLogicalY(int y) -{ - float y2 = -(y - paper_h); - return (y2 - device_origin_y) / user_scale_y; -} - -float wxPostScriptDC::DeviceToLogicalYRel(int y) -{ - return y / user_scale_y; -} - -int wxPostScriptDC::LogicalToDeviceX(float x) -{ - return (int)floor(XSCALE(x)); -} - -int wxPostScriptDC::LogicalToDeviceXRel(float x) -{ - return (int)floor(XSCALEREL(x)); -} - -int wxPostScriptDC::LogicalToDeviceY(float y) -{ - return (int)floor(YSCALE(y)); -} - -int wxPostScriptDC::LogicalToDeviceYRel(float y) -{ - return (int)floor(YSCALEREL(y)); -} - -float wxPostScriptDC::FLogicalToDeviceX(float x) -{ - return XSCALE(x); -} - -float wxPostScriptDC::FLogicalToDeviceXRel(float x) -{ - return XSCALEREL(x); -} - -float wxPostScriptDC::FLogicalToDeviceY(float y) -{ - return YSCALE(y); -} - -float wxPostScriptDC::FLogicalToDeviceYRel(float y) -{ - return YSCALEREL(y); -} - -void wxPostScriptDC::GetSize(float *width, float *height) -{ - if (width) - *width = paper_w; - if (height) - *height = paper_h; -} - -void wxPostScriptDC::GetSizeMM(float *WXUNUSED(width), float *WXUNUSED(height)) -{ -} - -extern Bool wxsPrinterDialog(wxWindow *parent); - -Bool XPrinterDialog(wxWindow *parent) -{ - return wxsPrinterDialog(parent); -} - -//----------------------------------------------------------------------------- -// wxPrintSetup implementation -//----------------------------------------------------------------------------- - -#define PS_DEFAULT_PAPER "Letter 8 1/2 x 11 in" - -#if defined(sun) && defined(wx_xview) -# define PS_PREVIEW_COMMAND "pageview" -# define PS_PRINTER_COMMAND "lpr" -# define PS_PRINTER_OPTIONS "" -# define PS_AFM_PATH NULL -#elif defined(VMS) -# define PS_PREVIEW_COMMAND "view/format=ps/select=x_display" -# define PS_PRINTER_COMMAND "print" -# define PS_PRINTER_OPTIONS "/nonotify/queue=psqueue" -# define PS_AFM_PATH "sys$ps_font_metrics:" -#elif defined(__sgi) -# define PS_PREVIEW_COMMAND "dps" -# define PS_PRINTER_COMMAND "lpr" -# define PS_PRINTER_OPTIONS "" -# define PS_AFM_PATH NULL -#elif defined(wx_x) -# define PS_PREVIEW_COMMAND "ghostview" -# define PS_PRINTER_COMMAND "lpr" -# define PS_PRINTER_OPTIONS "" -# define PS_AFM_PATH NULL -#elif defined(wx_msw) || defined(wx_mac) -# define PS_PREVIEW_COMMAND "ghostview" -# define PS_PRINTER_COMMAND "print" -# define PS_PRINTER_OPTIONS "" -# define PS_AFM_PATH NULL -#else -# define PS_PREVIEW_COMMAND NULL -# define PS_PRINTER_COMMAND NULL -# define PS_PRINTER_OPTIONS NULL -# define PS_AFM_PATH NULL -#endif - -wxPrintSetupData::wxPrintSetupData(void) -{ - printer_command = PS_PRINTER_COMMAND; - preview_command = PS_PREVIEW_COMMAND; - printer_flags = PS_PRINTER_OPTIONS; - printer_orient = PS_PORTRAIT; - printer_scale_x = 1.0; - printer_scale_y = 1.0; - printer_translate_x = 0.0; - printer_translate_y = 0.0; -#ifdef wx_x - printer_mode = PS_PRINTER; -#else - printer_mode = PS_FILE; -#endif - afm_path = default_afm_path; - paper_name = DEFAULT_PAPER; - print_colour = TRUE; - print_level_2 = TRUE; - printer_file = NULL; - emargin_v = emargin_h = 36; -} - -wxPrintSetupData::~wxPrintSetupData(void) -{ -} - -void wxPrintSetupData::SetPrinterCommand(char *cmd) -{ - if (cmd == printer_command) - return; - if (cmd) { - printer_command = copystring(cmd); - } else - printer_command = NULL; -} - -void wxPrintSetupData::SetPrintPreviewCommand(char *cmd) -{ - if (cmd == preview_command) - return; - if (cmd) { - preview_command = copystring(cmd); - } else - preview_command = NULL; -} - -void wxPrintSetupData::SetPaperName(char *name) -{ - if (name == paper_name) - return; - if (name) { - paper_name = copystring(name); - } else - paper_name = NULL; -} - -void wxPrintSetupData::SetPrinterOptions(char *flags) -{ - if (printer_flags == flags) - return; - if (flags) { - printer_flags = copystring(flags); - } else - printer_flags = NULL; -} - -void wxPrintSetupData::SetPrinterFile(char *f) -{ - if (f == printer_file) - return; - if (f) { - printer_file = copystring(f); - } else - printer_file = NULL; -} - -void wxPrintSetupData::SetPrinterMode(int mode) -{ - printer_mode = PS_FILE; - - if (mode == PS_PREVIEW && preview_command - || mode == PS_PRINTER && printer_command) - printer_mode = mode; -} - -void wxPrintSetupData::SetAFMPath(char *f) -{ - if (f && !default_afm_path) { - wxREGGLOB(default_afm_path); - default_afm_path = f; - } - - if (f == afm_path) - return; - if (f) { - afm_path = copystring(f); - } else - afm_path = NULL; -} - -void wxPrintSetupData::copy(wxPrintSetupData* data) -{ - float x, y; - char *s; - int i; - - s = data->GetPrinterCommand(); - SetPrinterCommand(s); - s = data->GetPrintPreviewCommand(); - SetPrintPreviewCommand(s); - s = data->GetPrinterOptions(); - SetPrinterOptions(s); - i = data->GetPrinterOrientation(); - SetPrinterOrientation(i); - i = data->GetPrinterMode(); - SetPrinterMode(i); - s = data->GetAFMPath(); - SetAFMPath(s); - s = data->GetPaperName(); - SetPaperName(s); - i = data->GetColour(); - SetColour(i); - - data->GetPrinterTranslation(&x, &y); - SetPrinterTranslation(x, y); - data->GetPrinterScaling(&x, &y); - SetPrinterScaling(x, y); -} - -//----------------------------------------------------------------------------- -// wxInitializePrintSetupData -//----------------------------------------------------------------------------- - -void wxInitializePrintSetupData(Bool /* init */) -{ -#ifdef wx_mac - wxThePrintPaperDatabase = new wxPrintPaperDatabase; - wxThePrintPaperDatabase->CreateDatabase(); -#endif - - wxPrintSetupData *wxThePrintSetupData; - - wxThePrintSetupData = new wxPrintSetupData; - - wxThePrintSetupData->SetPrintPreviewCommand(PS_PREVIEW_COMMAND); - wxThePrintSetupData->SetPrinterOrientation(PS_PORTRAIT); -#ifdef wx_x - wxThePrintSetupData->SetPrinterMode(PS_PREVIEW); -#else - wxThePrintSetupData->SetPrinterMode(PS_FILE); -#endif - wxThePrintSetupData->SetPaperName(PS_DEFAULT_PAPER); - wxThePrintSetupData->SetPrinterCommand(PS_PRINTER_COMMAND); - wxThePrintSetupData->SetPrinterOptions(PS_PRINTER_OPTIONS); - wxThePrintSetupData->SetAFMPath(PS_AFM_PATH); - - wxSetThePrintSetupData(wxThePrintSetupData); -} - -//----------------------------------------------------------------------------- -// wxPrintPaperType implementation -//----------------------------------------------------------------------------- - -wxPrintPaperType::wxPrintPaperType(char *name, int wmm, int hmm, int wp, int hp) -{ - widthMM = wmm; - heightMM = hmm; - widthPixels = wp; - heightPixels = hp; - pageName = copystring(name); -} - -wxPrintPaperType::~wxPrintPaperType(void) -{ -} - - -//----------------------------------------------------------------------------- -// wxPrintPaperDatabase implementation -//----------------------------------------------------------------------------- - -wxPrintPaperDatabase::wxPrintPaperDatabase(void) : wxList(wxKEY_STRING) -{ - DeleteContents(TRUE); -} - -wxPrintPaperDatabase::~wxPrintPaperDatabase(void) -{ -} - -void wxPrintPaperDatabase::CreateDatabase(void) -{ - // Need correct values for page size in pixels. - // Each unit is one 'point' = 1/72 of an inch. - // NOTE: WE NEED ALSO TO MAKE ADJUSTMENTS WHEN TRANSLATING - // in wxPostScriptDC code, so we can start from top left. - // So access this database and translate by appropriate number - // of points for this paper size. OR IS IT OK ALREADY? - // Can't remember where the PostScript origin is by default. - // Heck, someone will know how to make it hunky-dory... - // JACS 25/5/95 - - AddPaperType("A4 210 x 297 mm", 210, 297, 595, 842); - AddPaperType("A3 297 x 420 mm", 297, 420, 842, 1191); - AddPaperType("Letter 8 1/2 x 11 in", 216, 279, 612, 791); - AddPaperType("Legal 8 1/2 x 14 in", 216, 356, 612, 1009); -} - -void wxPrintPaperDatabase::ClearDatabase(void) -{ - Clear(); -} - -void wxPrintPaperDatabase::AddPaperType(char *name, int wmm, int hmm, - int wp, int hp) -{ - wxPrintPaperType *ppt; - ppt = new wxPrintPaperType(name, wmm, hmm, wp, hp); - Append(name, ppt); -} - -wxPrintPaperType *wxPrintPaperDatabase::FindPaperType(char *name) -{ - wxNode *node; - - if ((node = Find(name))) - return (wxPrintPaperType*)node->Data(); - else - return NULL; -} diff --git a/src/wxcommon/PSDC.h b/src/wxcommon/PSDC.h @@ -1,299 +0,0 @@ -/* - * File: wx_dcps.h - * Purpose: PostScript device context - * Author: Julian Smart - * Created: 1993 - * Updated: - * Copyright: (c) 1993, AIAI, University of Edinburgh - */ - -/* sccsid[] = "@(#)wx_dcps.h 1.2 5/9/94" */ - - -#ifndef wx_dcpsh -#define wx_dcpsh - -#ifdef __GNUG__ -#pragma interface -#endif - -#ifdef wx_xt -class wxBitmap; -class wxBrush; -class wxColour; -class wxColourMap; -class wxFont; -class wxList; -class wxPen; -class ofstream; -#else -#include "wx_dc.h" -#endif - -class wxMemoryDC; - -#if USE_POSTSCRIPT - -#ifdef IN_CPROTO -typedef void *wxPostScriptDC ; -#else - -#ifdef wx_xt -# define DRAW_TEXT_CONST /* empty */ -#else -# define DRAW_TEXT_CONST const -#endif - -class PSStream; - -class wxPostScriptDC: public wxDC -{ - public: -#ifdef wx_xt - char *title; -#endif - int page_number; - PSStream *pstream; // PostScript output stream - char *filename; - long boundingboxpos; - unsigned char currentRed; - unsigned char currentGreen; - unsigned char currentBlue; - /* MATTHEW: [8] */ - float clipx, clipy, clipw, cliph; - - float paper_x, paper_y, paper_w, paper_h, paper_x_scale, paper_y_scale; - Bool landscape, resetFont, level2ok; - char *afm_path; - - int mode; - char *preview_cmd, *print_cmd, *print_opts; - - // Create a printer DC - wxPostScriptDC(void); - wxPostScriptDC(Bool interactive); - - ~wxPostScriptDC(void); - - Bool Create(Bool interactive = TRUE); - - Bool PrinterDialog(Bool interactive); - - inline virtual void BeginDrawing(void) {} ; - inline virtual void EndDrawing(void) {} ; - - void FloodFill(float x1, float y1, wxColour *col, int style=wxFLOOD_SURFACE) ; - Bool GetPixel(float x1, float y1, wxColour *col) ; - - void DrawLine(float x1, float y1, float x2, float y2); - void IntDrawLine(int x1, int y1, int x2, int y2); - void CrossHair(float x, float y) ; - void DrawArc(float x1,float y1,float w,float h,float start,float end); - void DrawPoint(float x, float y); - void DrawPoint(wxPoint* point) { DrawPoint(point->x, point->y); } - void DrawLines(int n, wxPoint points[], float xoffset = 0, float yoffset = 0); - void DrawLines(int n, wxIntPoint points[], int xoffset = 0, int yoffset = 0); -#ifdef wx_xt - void IntDrawLines(int n, wxIntPoint points[], int xoffset = 0, int yoffset = 0) - { DrawLines(n, points, xoffset, yoffset); } -#endif - void DrawLines(wxList *lines, float xoffset = 0, float yoffset = 0) -#ifdef wx_xt - ; -#else - { wxbDC::DrawLines(lines, xoffset, yoffset); } -#endif - void DrawPolygon(int n, wxPoint points[], float xoffset = 0, float yoffset = 0, int fillStyle=wxODDEVEN_RULE); - void DrawPolygon(wxList *lines, float xoffset = 0, float yoffset = 0, int fillStyle=wxODDEVEN_RULE) -#ifdef wx_xt - ; -#else - { wxbDC::DrawPolygon(lines, xoffset, yoffset, fillStyle); } -#endif - - void DrawSpline(float x1, float y1, float x2, float y2, float x3, float y3); - - void DrawRectangle(float x, float y, float width, float height); - void DrawRoundedRectangle(float x, float y, float width, float height, float radius = 20); - void DrawEllipse(float x, float y, float width, float height); - void DrawText(DRAW_TEXT_CONST char *text, float x, float y, Bool use16 = FALSE, int dt = 0); - - void Clear(void); - void SetFont(wxFont *font); - void SetPen(wxPen *pen); - void SetBrush(wxBrush *brush); - void SetBackground(wxColour *c); - void SetClippingRect(float x, float y, float width, float height); - wxRegion *GetClippingRegion(); - void SetClippingRegion(wxRegion *r); - void DestroyClippingRegion(void); - - Bool StartDoc(char *message); - void EndDoc(void); - void StartPage(void); - void EndPage(void); - - float GetCharHeight(void); - float GetCharWidth(void); - void GetTextExtent(const char *string, float *x, float *y, - float *descent = NULL, float *externalLeading = NULL, - wxFont *theFont = NULL, Bool use16 = FALSE, int dt = 0); - void SetMapMode(int mode); - void SetUserScale(float x, float y); - float DeviceToLogicalX(int x); - float DeviceToLogicalY(int y); - float DeviceToLogicalXRel(int x); - float DeviceToLogicalYRel(int y); - int LogicalToDeviceX(float x); - int LogicalToDeviceY(float y); - int LogicalToDeviceXRel(float x); - int LogicalToDeviceYRel(float y); - float FLogicalToDeviceX(float x); - float FLogicalToDeviceY(float y); - float FLogicalToDeviceXRel(float x); - float FLogicalToDeviceYRel(float y); - Bool Blit(float xdest, float ydest, float width, float height, - wxBitmap *source, float xsrc, float ysrc, int rop = wxSOLID, wxColour *c = NULL); - Bool Blit(float xdest, float ydest, float width, float height, - wxMemoryDC *source, float xsrc, float ysrc, int rop = wxSOLID, wxColour *c = NULL); - inline Bool CanGetTextExtent(void) { return USE_AFM_FOR_POSTSCRIPT; } - inline Bool CanDrawBitmap(void) { return TRUE; } - - void GetSize(float *width, float *height); - void GetSizeMM(float *width, float *height); - - inline void SetColourMap(wxColourMap *WXUNUSED(cmap)) {} - - void SetBackgroundMode(int mode); - void SetTextBackground(wxColour *col); - void SetTextForeground(wxColour *col); - void TryColour(wxColour *src, wxColour *dest); - - virtual Bool Ok() { return ok; } -}; - -#ifndef wx_xt - -// Print Orientation (Should also add Left, Right) -enum { - PS_PORTRAIT, - PS_LANDSCAPE -};// ps_orientation = PS_PORTRAIT; - -// Print Actions -enum { - PS_PRINTER, - PS_FILE, - PS_PREVIEW -};// ps_action = PS_PREVIEW; - -#endif - -extern void wxInitializePrintSetupData(Bool init = TRUE); - -class wxPrintSetupData : public wxObject { -public: - wxPrintSetupData(void); - ~wxPrintSetupData(void); - - void copy (wxPrintSetupData* data); - - void SetPrinterCommand(char *cmd); - void SetPaperName(char *paper); - void SetPrintPreviewCommand(char *cmd); - void SetPrinterOptions(char *flags); - void SetPrinterFile(char *f); - void SetAFMPath(char *f); - void SetPrinterMode(int mode); - void SetPrinterOrientation(int orient) - { printer_orient = orient; } - void SetPrinterScaling(float x, float y) - { printer_scale_x = x; printer_scale_y = y; } - void SetPrinterTranslation(float x, float y) - { printer_translate_x = x; printer_translate_y = y; } - void SetColour(Bool col) - { print_colour = col; } - void SetLevel2(Bool l2) - { print_level_2 = l2; } - void SetEditorMargin(long x, long y) - { emargin_h = x; emargin_v = y; } - - inline char *GetPrinterCommand(void) - { return printer_command; } - inline char *GetPrintPreviewCommand(void) - { return preview_command; } - inline char *GetPrinterOptions(void) - { return printer_flags; } - inline char *GetPrinterFile(void) - { return printer_file; } - inline char *GetPaperName(void) - { return paper_name; } - inline int GetPrinterOrientation(void) - { return printer_orient; } - inline void GetPrinterScaling(float *x, float *y) - { *x=printer_scale_x; *y=printer_scale_y; } - inline void GetPrinterTranslation(float *x, float *y) - { *x=printer_translate_x; *y=printer_translate_y; } - inline int GetPrinterMode(void) - { return printer_mode; } - inline char *GetAFMPath(void) - { return afm_path; } - inline Bool GetColour(void) - { return print_colour; } - inline Bool GetLevel2() - { return print_level_2; } - void GetEditorMargin(long *x, long *y) - { *x = emargin_h; *y = emargin_v; } - -private: - friend class wxPostScriptDC; - - char *printer_command; - char *preview_command; - char *printer_flags; - char *printer_file; - int printer_orient; - float printer_scale_x; - float printer_scale_y; - float printer_translate_x; - float printer_translate_y; - int printer_mode; - char *afm_path; - char *paper_name; - Bool print_colour; - Bool print_level_2; - long emargin_h, emargin_v; -}; - -extern wxPrintSetupData *wxGetThePrintSetupData(); -extern void wxSetThePrintSetupData(wxPrintSetupData *); - -class wxPrintPaperType : public wxObject { -public: - wxPrintPaperType(char *name=NULL, int wmm=0, int hmm=0, int wp=0, int hp=0); - ~wxPrintPaperType(void); -public: - int widthMM; - int heightMM; - int widthPixels; - int heightPixels; - char *pageName; -}; - -class wxPrintPaperDatabase : public wxList { -public: - wxPrintPaperDatabase(void); - ~wxPrintPaperDatabase(void); - - void CreateDatabase(void); - void ClearDatabase(void); - - void AddPaperType(char *name, int wmm, int hmm, int wp, int hp); - wxPrintPaperType *FindPaperType(char *name); -}; - -extern wxPrintPaperDatabase *wxThePrintPaperDatabase; - -#endif // IN_CPROTO -#endif // USE_POSTSCRIPT -#endif // wx_dcpsh diff --git a/src/wxcommon/Region.cxx b/src/wxcommon/Region.cxx @@ -1,845 +0,0 @@ - -/********************************************************/ -/* Regions */ -/********************************************************/ - -wxRegion::wxRegion(wxDC *_dc, wxRegion *r) -{ - dc = _dc; - is_ps = wxSubType(dc->__type, wxTYPE_DC_POSTSCRIPT); - -#ifdef wx_msw - rgn = NULL; -#endif -#ifdef wx_x - rgn = NULL; -#endif -#ifdef wx_mac - rgn = NULL; -#endif - if (r) Union(r); -} - -wxRegion::~wxRegion() -{ - Cleanup(); -} - -void wxRegion::Cleanup() -{ -#ifdef wx_msw - if (rgn) { - DeleteObject(rgn); - rgn = NULL; - } -#endif -#ifdef wx_x - if (rgn) { - XDestroyRegion(rgn); - rgn = NULL; - } -#endif -#ifdef wx_mac - if (rgn) { - DisposeRgn(rgn); - rgn = NULL; - } -#endif -} - -void wxRegion::SetRectangle(float x, float y, float width, float height) -{ - float xw, yh; - int ix, iy, iw, ih; - - Cleanup(); - - xw = x + width; - yh = y + height; - x = dc->FLogicalToDeviceX(x); - y = dc->FLogicalToDeviceY(y); - width = dc->FLogicalToDeviceX(xw) - x; - height = dc->FLogicalToDeviceY(yh) - y; - - if (is_ps) { - wxPSRgn *ra; - - height = -height; - - ra = new wxPSRgn_Atomic("", "rect"); - ps = ra; - Put(x); Put(" "); Put(y); Put(" moveto\n"); - Put(x + width); Put(" "); Put(y); Put(" lineto\n"); - Put(x + width); Put(" "); Put(y - height); Put(" lineto\n"); - Put(x); Put(" "); Put(y - height); Put(" lineto\n"); - Put("closepath\n"); - - /* So bitmap-based region is right */ - y = -y; - } - - ix = (int)floor(x); - iy = (int)floor(y); - iw = ((int)floor(x + width)) - ix; - ih = ((int)floor(y + height)) - iy; - -#ifdef wx_msw - rgn = CreateRectRgn(ix, iy, ix + iw, iy + ih); -#endif -#ifdef wx_x - { - XRectangle r; - rgn = XCreateRegion(); - r.x = ix; - r.y = iy; - r.width = iw; - r.height = ih; - XUnionRectWithRegion(&r, rgn, rgn); - } -#endif -#ifdef wx_mac - rgn = NewRgn(); - SetRectRgn(rgn, ix, iy, ix + iw, iy + ih); -#endif -} - -void wxRegion::SetRoundedRectangle(float x, float y, float width, float height, float radius) -{ - wxRegion *lt, *rt, *lb, *rb, *w, *h, *r; - int ix, iy, iw, ih; - float xw, yh; - - Cleanup(); - - // A negative radius value is interpreted to mean - // 'the proportion of the smallest X or Y dimension' - if (radius < 0.0) { - float smallest = 0.0; - if (width < height) - smallest = width; - else - smallest = height; - radius = (float)(- radius * smallest); - } else - radius = dc->FLogicalToDeviceXRel(radius); - -#ifndef wx_x - if (is_ps) { -#endif - - lt = new wxRegion(dc); - rt = new wxRegion(dc); - lb = new wxRegion(dc); - rb = new wxRegion(dc); - w = new wxRegion(dc); - h = new wxRegion(dc); - - lt->SetEllipse(x, y, 2 * radius, 2 * radius); - rt->SetEllipse(x + width - 2 * radius, y, 2 * radius, 2 * radius); - rb->SetEllipse(x + width - 2 * radius, y + height - 2 * radius, 2 * radius, 2 * radius); - lb->SetEllipse(x, y + height - 2 * radius, 2 * radius, 2 * radius); - - w->SetRectangle(x, y + radius, width, height - 2 * radius); - h->SetRectangle(x + radius, y, width - 2 * radius, height); - - r = lt; - r->Union(rt); - r->Union(lb); - r->Union(rb); - r->Union(w); - r->Union(h); - - ps = r->ps; -#ifdef wx_x - /* A little hack: steal rgn from r: */ - rgn = r->rgn; - r->rgn = NULL; -#else - } -#endif - - xw = x + width; - yh = y + height; - x = dc->FLogicalToDeviceX(x); - y = dc->FLogicalToDeviceY(y); - width = dc->FLogicalToDeviceX(xw) - x; - height = dc->FLogicalToDeviceY(yh) - y; -#if defined(wx_msw) || defined(wx_mac) - int xradius = dc->FLogicalToDeviceXRel(radius); - int yradius = dc->FLogicalToDeviceYRel(radius); -#endif - - ix = (int)floor(x); - iy = (int)floor(y); - iw = ((int)floor(x + width)) - ix; - ih = ((int)floor(y + height)) - iy; - - if (is_ps) { - height = -height; - - /* So bitmap-based region is right */ - y = -y; - } - -#ifdef wx_msw - rgn = CreateRoundRectRgn(ix, iy, ix + iw, iy + ih, xradius, yradius); -#endif -#ifdef wx_mac - rgn = NewRgn(); - OpenRgn(); - Rect r2; - SetRect(&r2, ix, iy, ix + iw, iy + ih); - FrameRoundRect(&r2, xradius, yradius); - CloseRgn(rgn); -#endif -} - -void wxRegion::SetEllipse(float x, float y, float width, float height) -{ - float xw, yh; - - Cleanup(); - - xw = x + width; - yh = y + height; - x = dc->FLogicalToDeviceX(x); - y = dc->FLogicalToDeviceY(y); - width = dc->FLogicalToDeviceX(xw) - x; - height = dc->FLogicalToDeviceY(yh) - y; - - if (is_ps) { - wxPSRgn *ra; - - height = -height; - - ra = new wxPSRgn_Atomic("", "ellipse"); - ps = ra; - Put(x + width / 2); Put(" "); Put(y - height / 2); Put(" moveto\n"); - Put(x + width / 2); Put(" "); Put(y - height / 2); Put(" "); - Put(width / 2); Put(" "); Put(height / 2); Put(" 0 360 ellipse\n"); - Put("closepath\n"); - - /* So bitmap-based region is right */ - y = -y; - } - -#if defined(wx_msw) || defined(wx_mac) - int ix, iy, iw, ih; - - ix = (int)floor(x); - iy = (int)floor(y); - iw = ((int)floor(x + width)) - ix; - ih = ((int)floor(y + height)) - iy; -#endif - -#ifdef wx_msw - rgn = CreateEllipticRgn(ix, iy, ix + iw, iy + ih); -#endif -#ifdef wx_mac - rgn = NewRgn(); - OpenRgn(); - Rect r; - SetRect(&r, ix, iy, ix + iw, iy + ih); - FrameOval(&r); - CloseRgn(rgn); -#endif - -#ifdef wx_x - { - int iwidth = (int)width + 2; - int is_odd = iwidth & 0x1; - int x_extent = (int)((iwidth + 1) / 2) + is_odd, i; - float w2 = (x_extent - 1) * (x_extent - 1), dx, dy; - XPoint *p; - -#ifdef MZ_PRECISE_GC - p = (XPoint *)GC_malloc_atomic(sizeof(XPoint) * ((4 * x_extent) - (2 * is_odd))); -#else - p = new XPoint[(4 * x_extent) - (2 * is_odd)]; -#endif - - dx = x + width / 2; - dy = y + height / 2; - - for (i = 0; i < x_extent; i++) { - float y = (height / width) * sqrt(w2 - (i * i)); - p[i].x = (int)floor(i + dx); - p[i].y = (int)floor(y + dy); - p[2 * x_extent - i - 1].x = (int)floor(i + dx); - p[2 * x_extent - i - 1].y = (int)floor(-y + dy); - p[2 * x_extent + i - is_odd].x = (int)floor(-i + dx); - p[2 * x_extent + i - is_odd].y = (int)floor(-y + dy); - if (i || !is_odd) { - p[4 * x_extent - i - 1 - 2 * is_odd].x = (int)floor(-i + dx); - p[4 * x_extent - i - 1 - 2 * is_odd].y = (int)floor(y + dy); - } - } - rgn = XPolygonRegion(p, 4 * x_extent, WindingRule); - } -#endif -} - -#ifdef wx_x -# define POINT XPoint -#endif -#ifdef wx_mac -# define POINT MyPoint - typedef struct { int x, y; } MyPoint; -#endif - -typedef struct { float x, y; } FPoint; - -void wxRegion::SetPolygon(int n, wxPoint points[], float xoffset, float yoffset, int fillStyle) -{ - POINT *cpoints; - FPoint *fpoints; - int i, v; - float vf; - - Cleanup(); - - if (n < 2) - return; - - cpoints = new POINT[n]; - fpoints = (is_ps ? new FPoint[n] : (FPoint *)NULL); - for (i = 0; i < n; i++) { - v = dc->LogicalToDeviceX(points[i].x + xoffset); - cpoints[i].x = v; - v = dc->LogicalToDeviceY(points[i].y + yoffset); - cpoints[i].y = v; - if (fpoints) { - vf = dc->FLogicalToDeviceX(points[i].x + xoffset); - fpoints[i].x = vf; - vf = dc->FLogicalToDeviceY(points[i].y + yoffset); - fpoints[i].y = vf; - } - } - - if (is_ps) { - wxPSRgn *ra; - ra = new wxPSRgn_Atomic("", "poly"); - ps = ra; - Put(fpoints[0].x); Put(" "); Put(fpoints[0].y); Put(" moveto\n"); - for (i = 1; i < n; i++) { - Put(fpoints[i].x); Put(" "); Put(fpoints[i].y); Put(" lineto\n"); - } - Put("closepath\n"); - - /* So bitmap-based region is right */ - for (i = 0; i < n; i++) { - cpoints[i].y = -cpoints[i].y; - } - } - -#ifdef wx_msw - rgn = CreatePolygonRgn(cpoints, n, (fillStyle == wxODDEVEN_RULE) ? ALTERNATE : WINDING); -#endif -#ifdef wx_x - rgn = XPolygonRegion(cpoints, n, (fillStyle == wxODDEVEN_RULE) ? EvenOddRule : WindingRule); -#endif -#ifdef wx_mac - rgn = NewRgn(); - OpenRgn(); - MoveTo(cpoints[0].x, cpoints[0].y); - for (i = 0; i < n; i++) - LineTo(cpoints[i].x, cpoints[i].y); - LineTo(cpoints[0].x, cpoints[0].y); - CloseRgn(rgn); -#endif -} - -void wxRegion::SetArc(float x, float y, float w, float h, float start, float end) -{ - wxRegion *r; - static double pi; - int saw_start = 0, saw_end = 0, closed = 0; - float cx, cy; - wxPoint *a; - int n; - -#ifdef MZ_PRECISE_GC - a = (wxPoint *)GC_malloc_atomic(sizeof(wxPoint) * 20); -#else - a = new wxPoint[20]; -#endif - - SetEllipse(x, y, w, h); - - if (start == end) return; - - r = new wxRegion(dc); - - if (!pi) - pi = 2 * asin((double)1.0); - - start = fmod(start, 2*pi); - end = fmod(end, 2*pi); - if (start < 0) - start += 2*pi; - if (end < 0) - end += 2*pi; - - cx = x + w/2; - cy = y + h/2; - - a[0].x = (w / 2) * cos(end) + cx; - a[0].y = (h / 2) * (-sin(end)) + cy; - - a[1].x = cx; - a[1].y = cy; - - a[2].x = (w / 2) * cos(start) + cx; - a[2].y = (h / 2) * (-sin(start)) + cy; - - n = 3; - - if (!saw_start && (start < (pi / 2))) - saw_start = 1; - if (!saw_end && (end > start) && (end < (pi / 2))) - saw_end = 1; - if (saw_start && !closed) { - a[n].x = x + w; - a[n++].y = y; - } - if (saw_start && !saw_end) { - a[n].x = cx; - a[n++].y = y; - } else - closed = saw_start; - - if (!saw_start && (start < pi)) - saw_start = 1; - if (!saw_end && (end > start) && (end < pi)) - saw_end = 1; - if (saw_start && !closed) { - a[n].x = x; - a[n++].y = y; - } - if (saw_start && !saw_end) { - a[n].x = x; - a[n++].y = cy; - } else - closed = saw_start; - - if (!saw_start && (start < (1.5 * pi))) - saw_start = 1; - if (!saw_end && (end > start) && (end < (1.5 * pi))) - saw_end = 1; - if (saw_start && !closed) { - a[n].x = x; - a[n++].y = y + h; - } - if (saw_start && !saw_end) { - a[n].x = cx; - a[n++].y = y + h; - } else - closed = saw_start; - - saw_start = 1; - saw_end = (end > start); - - if (saw_start && !closed) { - a[n].x = x + w; - a[n++].y = y + h; - } - if (saw_start && !saw_end) { - a[n].x = x + w; - a[n++].y = cy; - } else - closed = saw_start; - - if (!saw_end && (end < (pi / 2))) - saw_end = 1; - if (saw_start && !closed) { - a[n].x = x + w; - a[n++].y = y; - } - if (saw_start && !saw_end) { - a[n].x = cx; - a[n++].y = y; - } else - closed = saw_start; - - if (!saw_end && (end < pi)) - saw_end = 1; - if (saw_start && !closed) { - a[n].x = x; - a[n++].y = y; - } - if (saw_start && !saw_end) { - a[n].x = x; - a[n++].y = cy; - } else - closed = saw_start; - - if (!saw_end && (end < (1.5 * pi))) - saw_end = 1; - if (saw_start && !closed) { - a[n].x = x; - a[n++].y = y + h; - } - if (saw_start && !saw_end) { - a[n].x = cx; - a[n++].y = y + h; - } else - closed = saw_start; - - if (!closed) { - a[n].x = x + w; - a[n++].y = y + h; - } - - r->SetPolygon(n, a); - - Intersect(r); -} - -void wxRegion::Union(wxRegion *r) -{ - if (r->dc != dc) return; - if (r->Empty()) return; - - if (is_ps) { - if (!ps) - ps = r->ps; - else { - wxPSRgn *ru; - ru = new wxPSRgn_Union(ps, r->ps); - ps = ru; - } - } - -#ifdef wx_msw - if (!rgn) { - rgn = CreateRectRgn(0, 0, 1, 1); - CombineRgn(rgn, r->rgn, rgn, RGN_COPY); - } else - CombineRgn(rgn, r->rgn, rgn, RGN_OR); -#endif -#ifdef wx_x - if (!rgn) { - rgn = XCreateRegion(); - } - XUnionRegion(rgn, r->rgn, rgn); -#endif -#ifdef wx_mac - if (!rgn) - rgn = NewRgn(); - UnionRgn(rgn, r->rgn, rgn); -#endif -} - -void wxRegion::Intersect(wxRegion *r) -{ - if (r->dc != dc) return; - if (r->Empty()) { - Cleanup(); - ps = NULL; - return; - } - -#ifdef wx_msw - if (!rgn) return; - CombineRgn(rgn, r->rgn, rgn, RGN_AND); -#endif -#ifdef wx_x - if (!rgn) return; - XIntersectRegion(rgn, r->rgn, rgn); -#endif -#ifdef wx_mac - if (!rgn) return; - SectRgn(rgn, r->rgn, rgn); -#endif - - if (Empty()) { - Cleanup(); - ps = NULL; - } else if (is_ps) { - wxPSRgn *ri; - ri = new wxPSRgn_Intersect(ps, r->ps); - ps = ri; - } -} - -void wxRegion::Subtract(wxRegion *r) -{ - if (r->dc != dc) return; - if (r->Empty()) return; - -#ifdef wx_msw - if (!rgn) return; - CombineRgn(rgn, rgn, r->rgn, RGN_DIFF); -#endif -#ifdef wx_x - if (!rgn) return; - XSubtractRegion(rgn, r->rgn, rgn); -#endif -#ifdef wx_mac - if (!rgn) return; - DiffRgn(rgn, r->rgn, rgn); -#endif - - if (Empty()) { - Cleanup(); - ps = NULL; - } else if (is_ps) { - /* wxPSRgn_Diff is only half a subtract; the result must be intersected with the first part */ - wxPSRgn *rd, *ri; - rd = new wxPSRgn_Diff(ps, r->ps); - ri = new wxPSRgn_Intersect(ps, rd); - ps = ri; - } -} - -void wxRegion::BoundingBox(float *x, float *y, float *w, float *h) -{ - if (Empty()) { - *x = *y = *w = *h = 0; - return; - } else { - float v; -#ifdef wx_msw - RECT r; - - GetRgnBox(rgn, &r); - - *x = r.left; - *y = r.top; - *w = r.right - r.left; - *h = r.bottom - r.top; -#endif -#ifdef wx_x - XRectangle r; - - XClipBox(rgn, &r); - - *x = r.x; - *y = r.y; - *w = r.width; - *h = r.height; -#endif -#ifdef wx_mac - *x = (*rgn)->rgnBBox.left; - *y = (*rgn)->rgnBBox.top; - *w = (*rgn)->rgnBBox.right - *x; - *h = (*rgn)->rgnBBox.bottom - *y; -#endif - - if (is_ps) { - /* Bitmap-based region is stored upside-down */ - *y = -(*y); - } - - v = dc->DeviceToLogicalX((int)*x); - *x = v; - v = dc->DeviceToLogicalY((int)*y); - *y = v; - v = dc->DeviceToLogicalXRel((int)*w); - *w = v; - v = dc->DeviceToLogicalYRel((int)*h); - *h = v; - } -} - -Bool wxRegion::Empty() -{ -#ifdef wx_msw - RECT r; - if (!rgn) return TRUE; - - return (GetRgnBox(rgn, &r) == NULLREGION); -#endif -#ifdef wx_x - if (!rgn) return TRUE; - return XEmptyRegion(rgn); -#endif -#ifdef wx_mac - if (!rgn) return TRUE; - return EmptyRgn(rgn); -#endif -} - -void wxRegion::Put(const char *s) -{ - long l, psl; - char *naya; - - l = strlen(s); - psl = strlen(((wxPSRgn_Atomic *)ps)->s); - - naya = new WXGC_ATOMIC char[l + psl + 1]; - memcpy(naya, ((wxPSRgn_Atomic *)ps)->s, psl); - memcpy(naya + psl, s, l); - naya[psl + l] = 0; - - ((wxPSRgn_Atomic *)ps)->s = naya; -} - -void wxRegion::Put(double d) -{ - char s[100]; - sprintf(s, "%f", d); - Put(s); -} - -/***************************************************************************************/ - -char *wxPSRgn_Union::GetString() -{ - return MakeString("", "", ""); -} - -char *wxPSRgn_Composite::MakeString(const char *prefix, const char *infix, const char *suffix) -{ - char *sa, *sb; - int plen, ilen, slen; - int alen, blen; - char *sr; - - sa = a->GetString(); - sb = b->GetString(); - plen = strlen(prefix); - ilen = strlen(infix); - slen = strlen(suffix); - alen = strlen(sa); - blen = strlen(sb); - sr = new WXGC_ATOMIC char[alen + blen + plen + ilen + slen + 1]; - - memcpy(sr, prefix, plen); - memcpy(sr + plen, sa, alen); - memcpy(sr + plen + alen, infix, ilen); - memcpy(sr + plen + alen + ilen, sb, blen); - memcpy(sr + plen + alen + ilen + blen, suffix, slen); - sr[plen + alen + ilen + blen + slen] = 0; - - return sr; -} - -int wxPSRgn_Composite::FlattenIntersects(wxPSRgn **l, wxPSRgn *r, int i) -{ - if (r->is_intersect) - return FlattenIntersects(l, ((wxPSRgn_Composite *)r)->b, - FlattenIntersects(l, ((wxPSRgn_Composite *)r)->a, i)); - - if (l) - l[i] = r; - - return i + 1; -} - - -wxPSRgn *wxPSRgn_Union::Lift() -{ - wxPSRgn *la, *lb; - wxPSRgn *r = NULL, **al, **bl; - int na, nb, i, j; - - la = a->Lift(); - lb = b->Lift(); - - if (!la->is_intersect - && !lb->is_intersect - && (a == la) && (b == lb)) - return this; - - /* (A n B) U (C n D) = (A U C) n (A U D) n (B U C) n (B U D) */ - - /* count: */ - na = FlattenIntersects(NULL, la, 0); - nb = FlattenIntersects(NULL, lb, 0); - - al = new wxPSRgn*[na]; - bl = new wxPSRgn*[nb]; - - /* flatten: */ - FlattenIntersects(al, la, 0); - FlattenIntersects(bl, lb, 0); - - for (i = 0; i < na; i++) { - for (j = 0; j < nb; j++) { - wxPSRgn *c; - c = new wxPSRgn_Union(al[i], bl[j]); - if (r) - r = new wxPSRgn_Intersect(r, c); - else - r = c; - } - } - - return r; -} - - -char *wxPSRgn_Intersect::GetString() -{ - return MakeString("", "clip\nnewpath\n", ""); -} - -wxPSRgn *wxPSRgn_Intersect::Lift() -{ - wxPSRgn *la, *lb; - - la = a->Lift(); - lb = b->Lift(); - - if ((la == a) && (lb == b)) - return this; - else - return new wxPSRgn_Intersect(la, lb); -} - - -char *wxPSRgn_Diff::GetString() -{ - return MakeString("", "reversepath\n", "reversepath\n"); -} - -wxPSRgn *wxPSRgn_Diff::Lift() -{ - wxPSRgn *la, *lb; - wxPSRgn *r = NULL, **al, **bl; - int na, nb, i; - - la = a->Lift(); - lb = b->Lift(); - - if (!la->is_intersect - && !lb->is_intersect - && (a == la) && (b == lb)) - return this; - - if (lb->is_intersect) { - /* A \ (B n C) = (A \ B) u (A \ C) */ - nb = FlattenIntersects(NULL, lb, 0); - bl = new wxPSRgn*[nb]; - FlattenIntersects(bl, lb, 0); - - for (i = 0; i < nb; i++) { - wxPSRgn *s; - s = new wxPSRgn_Diff(la, bl[i]); - if (r) { - r = new wxPSRgn_Union(r, s); - } else - r = s; - } - - return r->Lift(); /* Handles intersections in la */ - } else { - /* (A n B) - C = (A - C) n (B - C) [note: C has no intersections] */ - na = FlattenIntersects(NULL, la, 0); - al = new wxPSRgn*[na]; - FlattenIntersects(al, la, 0); - - for (i = 0; i < na; i++) { - wxPSRgn *s; - s = new wxPSRgn_Diff(al[i], lb); - if (r) { - r = new wxPSRgn_Intersect(r, s); - } else - r = s; - } - - return r; - } -} diff --git a/src/wxcommon/Region.h b/src/wxcommon/Region.h @@ -1,124 +0,0 @@ - -#ifndef wb_rgnh -#define wb_rgnh - -#include "wx_dc.h" - -class wxPSRgn; - -#ifdef UseXtRegions -typedef Region XtRegion; -#else -typedef void *XtRegion; -#endif - -class wxRegion : public wxObject -{ - public: -#ifdef wx_msw - HRGN rgn; -#endif -#ifdef wx_x - XtRegion rgn; -#endif -#ifdef wx_mac - RgnHandle rgn; -#endif - wxDC *dc; - wxPSRgn *ps; - int is_ps; - - wxRegion(wxDC *dc, wxRegion *r = NULL); - ~wxRegion(); - - inline wxDC *GetDC() { return dc; } - - void SetRectangle(float x, float y, float width, float height); - void SetRoundedRectangle(float x, float y, float width, float height, float radius = 20.0); - void SetEllipse(float x, float y, float width, float height); - void SetPolygon(int n, wxPoint points[], float xoffset = 0, float yoffset = 0, - int fillStyle=wxODDEVEN_RULE); - void SetArc(float x, float y, float w, float h, float start, float end); - - void Union(wxRegion *); - void Intersect(wxRegion *); - void Subtract(wxRegion *); - - void BoundingBox(float *x, float *y, float *w, float *h); - - Bool Empty(); - - void Cleanup(); - - /* PS Stuff */ - void Put(const char *s); - void Put(double d); -}; - -class wxPSRgn : public wxObject -{ - public: - int is_intersect; - wxPSRgn() { is_intersect = 0; } - virtual char *GetString() = 0; - virtual wxPSRgn *Lift() = 0; -#ifdef RGN_DEBUGGING_PRINTS - virtual void DebugPrint() = 0; -#endif -}; - -class wxPSRgn_Atomic : public wxPSRgn -{ - public: - char *s, *debug_name; - wxPSRgn_Atomic(char *ps, char *dn) { s = ps; debug_name = dn; } - char *GetString() { return s; } - wxPSRgn *Lift() { return this; } -#ifdef RGN_DEBUGGING_PRINTS - void DebugPrint() { printf("%s%lx", debug_name, (long)this); } -#endif -}; - -class wxPSRgn_Composite : public wxPSRgn -{ - public: - wxPSRgn *a, *b; - char *MakeString(const char *prefix, const char *infix, const char *suffix); - - int FlattenIntersects(wxPSRgn **l, wxPSRgn *r, int i); -}; - -class wxPSRgn_Union : public wxPSRgn_Composite -{ - public: - wxPSRgn_Union(wxPSRgn *ra, wxPSRgn *rb) { a = ra; b = rb; } - char *GetString(); - wxPSRgn *Lift(); -#ifdef RGN_DEBUGGING_PRINTS - void DebugPrint() { printf("("); a->DebugPrint(); printf(" U "); b->DebugPrint(); printf(")"); } -#endif -}; - -class wxPSRgn_Intersect : public wxPSRgn_Composite -{ - public: - wxPSRgn_Intersect(wxPSRgn *ra, wxPSRgn *rb) { a = ra; b = rb; is_intersect = 1; } - char *GetString(); - wxPSRgn *Lift(); -#ifdef RGN_DEBUGGING_PRINTS - void DebugPrint() { printf("("); a->DebugPrint(); printf(" n "); b->DebugPrint(); printf(")"); } -#endif -}; - -class wxPSRgn_Diff : public wxPSRgn_Composite -{ - public: - wxPSRgn_Diff(wxPSRgn *ra, wxPSRgn *rb) { a = ra; b = rb; } - char *GetString(); - wxPSRgn *Lift(); -#ifdef RGN_DEBUGGING_PRINTS - void DebugPrint() { printf("("); a->DebugPrint(); printf(" \\ "); b->DebugPrint(); printf(")"); } -#endif -}; - -#endif diff --git a/src/wxcommon/wb_hash.cxx b/src/wxcommon/wb_hash.cxx @@ -1,343 +0,0 @@ -/* - * File: wb_hash.cc - * Purpose: Hash table implementation - * Author: Julian Smart - * Created: 1993 - * Updated: August 1994 - * Copyright: (c) 1993, AIAI, University of Edinburgh - */ - -#if defined(_MSC_VER) -# include "wx.h" -#else -# ifdef wx_xt -# define Uses_wxHashTable -# include "wx.h" -# else -# include "common.h" -# include "wx_list.h" -# include "wx_hash.h" -# include "wx_types.h" -# endif -#endif - -#include <string.h> -#include <stdarg.h> - -wxHashTable::wxHashTable (int, int size) -{ - int i; - wxList **ll; - - __type = wxTYPE_HASH_TABLE; - n = size; - current_position = -1; - current_node = NULL; - - ll = new wxList *[size]; - hash_table = ll; - for (i = 0; i < size; i++) { - hash_table[i] = NULL; - } -} - -wxHashTable::~wxHashTable (void) -{ - int i; - for (i = 0; i < n; i++) { - if (hash_table[i]) { - wxList *l; - l = hash_table[i]; - DELETE_OBJ l; - } - } -} - -wxList *wxHashTable::GetList(int position, KeyType ktype, Bool makeit) -{ - wxList *l; - - l = hash_table[position]; - - if (!l) { - if (makeit) { - l = new wxList(ktype, FALSE); - hash_table[position] = l; - } - } - - return l; -} - -void wxHashTable::Put(long key, wxObject * object) -{ - wxList *l; - - l = GetList(MakeKey(key)); - - l->Append(key, object); -} - -void wxHashTable::Put(const char *key, wxObject * object) -{ - wxList *l; - - l = GetList(MakeKey(key), wxKEY_STRING); - - l->Append(key, object); -} - -wxObject *wxHashTable::Get(long key) -{ - wxList *l; - - l = GetList(MakeKey(key), wxKEY_INTEGER, FALSE); - - if (l) { - wxNode *node; - node = l->Find(key); - if (node) - return node->Data(); - } - - return NULL; -} - -wxObject *wxHashTable::Get(const char *key) -{ - wxList *l; - - l = GetList(MakeKey(key), wxKEY_STRING, FALSE); - - if (l) { - wxNode *node; - node = l->Find (key); - if (node) - return node->Data(); - } - - return NULL; -} - -wxObject *wxHashTable::Delete(long key) -{ - wxList *l; - - l = GetList(MakeKey(key), wxKEY_INTEGER, FALSE); - - if (l) { - wxNode *node; - node = l->Find(key); - if (node) { - wxObject *data; - data = node->Data(); - l->DeleteNode(node); - return data; - } - } - return NULL; -} - -wxObject *wxHashTable::Delete(const char *key) -{ - wxList *l; - - l = GetList(MakeKey(key), wxKEY_STRING, FALSE); - - if (l) { - wxNode *node; - node = l->Find(key); - if (node) { - wxObject *data; - data = node->Data(); - l->DeleteNode(node); - return data; - } - } - - return NULL; -} - -int wxHashTable::MakeKey(const char *string) -{ - long int_key = 0; - - while (*string) { - int_key += (unsigned char) *string++; - } - - if (int_key < 0) - int_key = -int_key; - - return int_key % n; -} - -int wxHashTable::MakeKey(long int_key) -{ - if (int_key < 0) - int_key = -int_key; - - return int_key % n; -} - -void wxHashTable::BeginFind (void) -{ - current_position = -1; - current_node = NULL; -} - -wxNode *wxHashTable::Next (void) -{ - wxNode *found = NULL; - Bool end = FALSE; - while (!end && !found) { - if (!current_node) { - current_position++; - if (current_position >= n) { - current_position = -1; - current_node = NULL; - end = TRUE; - } else { - wxList *l; - l = hash_table[current_position]; - if (l) { - current_node = l->First(); - found = current_node; - } - } - } else { - current_node = current_node->Next (); - found = current_node; - } - } - return found; -} - -void wxHashTable::DeleteContents (Bool flag) -{ - int i; - for (i = 0; i < n; i++) { - if (hash_table[i]) { - wxList *l; - l = hash_table[i]; - l->DeleteContents(flag); - } - } -} - -void wxHashTable::Clear (void) -{ - int i; - for (i = 0; i < n; i++) { - if (hash_table[i]) { - wxList *l; - l = hash_table[i]; - l->Clear(); - } - } -} - - - -/* This is a hash table implementation which does not lock the objects - from garbage collection. */ -/* FIXME: doesn't work for precise GC */ - -typedef struct Bucket { - long widget; - wxObject *object; -} Bucket; - -/* because widgets are likely to be word-aligned */ -#define HASH(w) ((((unsigned long)w) >> 2) % numbuckets) - -#define FILL_FACTOR 2 /* inverted max fraction of hash table implying reash */ - -wxNonlockingHashTable::wxNonlockingHashTable() -{ - long i; - - numbuckets = 1001; - buckets = (Bucket *)GC_malloc_atomic(sizeof(Bucket) * numbuckets); - for (i = 0; i < numbuckets; i++) { - buckets[i].widget = 0; - } - numwidgets = 0; -} - -wxNonlockingHashTable::~wxNonlockingHashTable() -{ -} - -void wxNonlockingHashTable::Put(long widget, wxObject *object) -{ - long i; - - if (FILL_FACTOR * numwidgets >= numbuckets) { - /* Rehash */ - Bucket *oldbuckets = buckets; - long oldnumbuckets = numbuckets; - - numbuckets = (numbuckets * FILL_FACTOR) + 1; - buckets = (Bucket *)GC_malloc_atomic(sizeof(Bucket) * numbuckets); - - numwidgets = 0; - for (i = 0; i < oldnumbuckets; i++) { - if (oldbuckets[i].widget && oldbuckets[i].object) - Put(oldbuckets[i].widget, oldbuckets[i].object); - } - } - - i = HASH(widget); - /* MATTHEW: [10] Added equality check (shouldn't happen, though). */ - while (buckets[i].widget && buckets[i].object - && (buckets[i].widget != widget)) { - i = (i + 1) % numbuckets; - } - buckets[i].widget = widget; - buckets[i].object = object; - numwidgets++; /* Fix counter */ -} - -wxObject *wxNonlockingHashTable::Get(long widget) -{ - long i; - - i = HASH(widget); - while ((buckets[i].widget != widget) && buckets[i].widget) { - i = (i + 1) % numbuckets; - } - - if (buckets[i].widget == widget) - return buckets[i].object; - - return NULL; -} - -void wxNonlockingHashTable::Delete(long widget) -{ - long i; - - i = HASH(widget); - while ((buckets[i].widget != widget) && buckets[i].widget) { - i = (i + 1) % numbuckets; - } - - if (buckets[i].widget == widget) - { - buckets[i].object = NULL; - --numwidgets; /* Fix counter */ - } -} - -/* new method (not very fast) */ -void wxNonlockingHashTable::DeleteObject(wxObject *o) -{ - long i; - - for (i = 0; i < numbuckets; i++) { - if (buckets[i].widget && buckets[i].object == o) - Delete(buckets[i].widget); - } -} -