elephant-cvs
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
April 2007
- 2 participants
- 99 discussions
Update of /project/elephant/cvsroot/elephant/src/elephant
In directory clnet:/tmp/cvs-serv15141/src/elephant
Modified Files:
classes.lisp controller.lisp package.lisp serializer2.lisp
Log Message:
Provide simple restarts for some potentially annoying error conditions. Especially storing an instance of one store in another database
--- /project/elephant/cvsroot/elephant/src/elephant/classes.lisp 2007/04/21 17:22:50 1.28
+++ /project/elephant/cvsroot/elephant/src/elephant/classes.lisp 2007/04/22 03:35:09 1.29
@@ -260,16 +260,16 @@
"Ensures that object can be written as a reference into store sc"
(eq (dbcn-spc-pst object) (controller-spec sc)))
-(define-condition cross-store-reference ()
- ((object :accessor cross-store-reference-object :initarg :object)
- (home-controller :accessor cross-store-reference-home-controller :initarg :home-ctrl)
- (foreign-controller :accessor cross-store-reference-foreign-controller :initarg :foreign-ctrl))
+(define-condition cross-reference-error ()
+ ((object :accessor cross-reference-error-object :initarg :object)
+ (home-controller :accessor cross-reference-error-home-controller :initarg :home-ctrl)
+ (foreign-controller :accessor cross-reference-error-foreign-controller :initarg :foreign-ctrl))
(:documentation "An error condition raised when an object is being written into a data store other
than its home store"))
-(defun raise-cross-store-condition (object sc)
- (cerror "Proceed and patch later"
- 'cross-store-reference
+(defun signal-cross-reference-error (object sc)
+ (cerror "Proceed to write incorrect reference"
+ 'cross-reference-error
:format-control "Attempted to write object ~A with home store ~A into store ~A"
:format-arguments (list object (get-con object) sc)
:object object
--- /project/elephant/cvsroot/elephant/src/elephant/controller.lisp 2007/04/21 17:22:50 1.47
+++ /project/elephant/cvsroot/elephant/src/elephant/controller.lisp 2007/04/22 03:35:09 1.48
@@ -32,8 +32,8 @@
)
"Tells the main elephant code the tag used in a store spec to
refer to a given data store. The second argument is an asdf
- dependency list. Entries have the form of (data store type
- asdf-depends-list")
+ dependency list. Entries have the form of
+ (data-store-type-tag asdf-depends-list")
(defvar *elephant-controller-init* (make-hash-table))
@@ -57,17 +57,29 @@
we re-open the controller from the spec if it's not
cached? That might be dangerous so for now we error"))
+(define-condition controller-lost-error ()
+ ((object :initarg :object :accessor store-controller-closed-error-object)
+ (spec :initarg :spec :accessor store-controller-closed-error-spec)))
+
+(defun signal-controller-lost-error (object)
+ (cerror "Open a new instance and continue?"
+ 'controller-lost-error
+ :format-string "Store controller for specification ~A for object ~A cannot be found."
+ :format-arguments (list object (dbcn-spc-pst object))
+ :object object
+ :spec (dbcn-spc-pst object)))
+
(defmethod get-con ((instance persistent) &optional (sc *store-controller*))
(declare (ignore sc))
(let ((con (gethash (dbcn-spc-pst instance) *dbconnection-spec*)))
(cond ((not con)
- ;; ISE NOTE: Create a new one here & warn instead?
- ;; (get-controller spec)
- (error "Object's store controller was lost"))
+ (progn (signal-controller-lost-error instance)
+ (open-controller
+ (get-controller (dbcn-spc-pst instance)))))
;; If it's valid and open
((and con (connection-is-indeed-open con))
con)
- ;; If the object exists but is closed, reopen
+ ;; If the controller object exists but is closed, reopen
(t (open-controller con)))
con))
--- /project/elephant/cvsroot/elephant/src/elephant/package.lisp 2007/04/21 17:22:50 1.31
+++ /project/elephant/cvsroot/elephant/src/elephant/package.lisp 2007/04/22 03:35:09 1.32
@@ -266,7 +266,8 @@
#:struct-constructor
;; Various error conditions
- #:cross-store-reference
+ #:cross-reference-error
+ #:controller-lost-error
#:map-class-query
#:get-query-instances
--- /project/elephant/cvsroot/elephant/src/elephant/serializer2.lisp 2007/04/21 17:22:51 1.39
+++ /project/elephant/cvsroot/elephant/src/elephant/serializer2.lisp 2007/04/22 03:35:09 1.40
@@ -42,7 +42,7 @@
database-version
translate-and-intern-symbol
valid-persistent-reference-p
- raise-cross-store-condition))
+ signal-cross-reference-error))
(in-package :elephant-serializer2)
1
0
Update of /project/elephant/cvsroot/elephant/doc
In directory clnet:/tmp/cvs-serv15141/doc
Modified Files:
user-guide.texinfo
Log Message:
Provide simple restarts for some potentially annoying error conditions. Especially storing an instance of one store in another database
--- /project/elephant/cvsroot/elephant/doc/user-guide.texinfo 2007/04/21 17:22:35 1.12
+++ /project/elephant/cvsroot/elephant/doc/user-guide.texinfo 2007/04/22 03:35:09 1.13
@@ -433,14 +433,16 @@
@subsection Instance Creation
-To the user, persistent objects are created as usual with a call to
+To the user, persistent objects are created normally with a call to
@code{make-instance} with the desired slot initargs as illustrated in
the last section. However, this call will fail unless there is a
default @code{store-controller} instance in the variable
@code{*store-controller*} or the @code{:sc} keyword argument is
-provided with a valid store controller object. This tells the
-metaobject protocol implementing persistent slot creation where to
-allocate storage for this instance's slots and
+provided with a valid store controller object.
+
+An instance of the class is created and any initforms and initarg
+values are written to transient or persistent slots as one would
+expect.
* Default store controller & instance creation
* What happens to persistent objects when store-controller is closed?
1
0
Update of /project/elephant/cvsroot/elephant/tests
In directory clnet:/tmp/cvs-serv10154
Modified Files:
testconditions.lisp
Log Message:
Fixed bug when two stores not set in new test
--- /project/elephant/cvsroot/elephant/tests/testconditions.lisp 2007/04/21 17:26:37 1.1
+++ /project/elephant/cvsroot/elephant/tests/testconditions.lisp 2007/04/22 03:02:35 1.2
@@ -18,19 +18,18 @@
(null *test-spec-secondary*))
(progn
(format t "~%Second store spec missing: ignoring")
- t)
+ (values t t t t))
(let (*store-controller*
(sc1 (open-store *test-spec-primary* :recover t :deadlock-detect nil))
(sc2 (open-store *test-spec-secondary* :recover t :deadlock-detect nil)))
(unwind-protect
- (progn
- (let ((inst1 (make-instance 'pfoo :slot1 100 :sc sc1))
- (inst2 (make-instance 'pfoo :slot1 200 :sc sc2)))
- (values
- (is-not-null (add-to-root 'inst1 inst1 :sc sc1))
- (is-not-null (add-to-root 'inst2 inst2 :sc sc2))
- (signals-condition (add-to-root 'inst1 inst1 :sc2))
- (signals-condition (add-to-root 'inst2 inst2 :sc1)))))
+ (let ((inst1 (make-instance 'pfoo :slot1 100 :sc sc1))
+ (inst2 (make-instance 'pfoo :slot1 200 :sc sc2)))
+ (values
+ (is-not-null (add-to-root 'inst1 inst1 :sc sc1))
+ (is-not-null (add-to-root 'inst2 inst2 :sc sc2))
+ (signals-condition (add-to-root 'inst1 inst1 :sc2))
+ (signals-condition (add-to-root 'inst2 inst2 :sc1))))
(close-store sc1)
(close-store sc2))))
t t t t)
\ No newline at end of file
1
0
Update of /project/elephant/cvsroot/elephant/doc
In directory clnet:/tmp/cvs-serv18678
Added Files:
ArchDiagram.png ArchDiagram1.ppt
Log Message:
Added some architecture diagrams
--- /project/elephant/cvsroot/elephant/doc/ArchDiagram.png 2007/04/21 18:48:29 NONE
+++ /project/elephant/cvsroot/elephant/doc/ArchDiagram.png 2007/04/21 18:48:29 1.1
PNG
IHDRÐPgAMAÙÜ²Ú cHRMz&úèu0ê`:pºQ< pHYsIDATx^íŒÅõþ"M@AADA)Òìœ"6P€£Ø±#öhbFcLH4þÓI-&ÑÄ5Öh¢±Ä{Ä^òÿî=×eÙ·ììŸûög>÷£œS9sæÙ3gÎzÿSB@! @ðÊ\¿ªB@! ÀÿD8$B@! @Ùá(;Äj@! á! eG@£ì«! B@C2 B@²C¬B@ÉB@!PvD8ʱB@! D8$B@! @Ùá(;Äj@! á! eG@£ì«! B@C2 B@²C¬B@ÉB@!PvD8ʱB@! D8$B@! @Ùá(;Äj@! á* ðé§þ%}üñÇ
ê©§ÈðÖ[oU¡
üÏþc=ÿâ/òæúäO,C8=öØcÏ<óÌ;È?ÿùO2¿öÚk55RuFláÈOÕ&x饌«(T`àÀdøîw¿ëTc¥2íºë®Öóßüæ7yÛXXŒi
6žôÒK?úè£pÙÍ6Û̧rJ¥¡vš"U]M
:%¯ŒòJ»víV\qEøÌ£8á4hк_¥!C¬¹æ;v4²ß~ûphfC@£Ùf\ã êp|ãß.,^Œx¥VjÛ¶í/Œf`áxþùç#]ºté9ss-7²pÔPªB Ìp`U/ò!P§C\áþûï1c¿|òÉe?~<e'OáÐ*ÍG3̲ÆXs€#øiÞtÓMGyä{ìqðÁã9!ïØn¹åSO=u¯œö:ì°Ã®ºêªÿþ÷¿l]vÅyxã7N6íŒóÎûÇ?þQŠ{ЫW¯/¿üò·¿ý-¿¯Ÿúêx¿FJ±pXÎ3Ï<²ýúõáš9¹TýÇ!ôIDAT@9á('ºª[@ áøðÃÍN;wŸüòËÃpd÷Ýwd[kµîœ÷Þp6ÎDpÅøÖ·Ÿä5kVñé9s&9ä²}öÙgœ{÷æðtcœõÖáÐúM
GSM·[+€ Çwüرczè!!|ðÁã?'mÚŽyöÙgm`ØÆÇÃÑ£Gßyç\Cå>ê¡Ê.]ºŒøâÁø!íÛ·s1âNØfm0`Açý÷ß7_Ñûî»Ï²-\žnµÕVfGIÁ}öÙG£VÄQýA@£"0«!°<)ÇšQ£Ø§÷»ß
kÚb-8ãžækìáµ×^Kìðp¶¹sçFî@8x!rCµÐDq.Cþ¡C}ôQ³DnöG*Ð Ï¿JŒ0ä[oœS«.<ð
h*D8jº5ØZA áØvÛmÙª§OþÁÃDß0ayðÏóî»ï6[H@/p\pÁL8üç{n8ÿ1cxOIøañ8äïСÃùç."§QÇYP6!P×pÔõô©óõ@@8|òÉBc pÛsp}ôºë®3#ÄÀU')A
«®º*>úhþNøj¬°Â
üéñÇ·ÌF8~ùË_º
ÌÜå÷B þÁó=zà_ÔpÀuúöíkÁS$×ÑUÃeGÔ;"õ>ê]"w
±ðÉBd$]»v%Ãõ×_<_²d¹j _
îX ÎpÈïAf#<ò|æ,R$]}õÕ¹åÁJ¡8èVJÃeGÔ;"õ>ê]"w'¶p\;ó'Ûà¹àÎÀõÛo¿ÍáÃ[0ÈßyråWþŒ@ú÷¿ÿmµáxâ'bá£E®¿ÎP"©O>üiã7Î%¹¿
µ%Â;Ê D
¡. ò7[uÄ! ÁµO )á¡>÷ÜsÜ.!OàË9`À\wÂÁ±urÌñµ~ŠØ8¹ýášK V§
@BD8ŠìB #ìæHÿþý_~ùåÜ*÷ßþßý ËİaÃ8d
®A6ŸQlãTøÇ?þ²ÔðꫯÚÜ Ç€IšsêÔ©yÇÍY C ÃìÙ³-GF¢j@£! ÂÑh3ªñÔ?ü0·CÙªñÃøë_ÿì|÷ÝoôIDATw:ê(;p¹äKá<'ÄÛ98âîžã
«ó?øAPÓ³Šcf8>OžâVŸòj&z.ÂQ/â§~
Ê# ÂQyÌÕ¢hE[©æuA"fènHÀïà TÅé2ÏÁYmµÕžëAÌr£ ݺu»ë®»l¶ýœXŽhñµºwïÎ?ñÃÀ3ÈæH8yn-{?Nv¬Ï+]É·yá`j"(6IèÜxlÐËoŸ?ÙhAàܵø±DåÐȧR ¢ÔÅ¥8F[oœ5Ù8²ášŠ0©m!PÛpÔöüšwÍ7Zÿö·¿qc_ÑW^y¥ø ñà Ÿ8Î ^$'ùË_8ž!pFs šQ
!PÓpÔôôšsB@! ÆGB! @M# ÂQÓӣΠ! hD8c5
! 5GMO:'B 1áhyÔ(B@Ô4"5==êB@Æ@@£1æQ£B@!PÓpÔôôšsB@! *ÓO?=ÑY¿! ±°{Ö©2áš;ŒÔa! B ")@S! B "ÉðRn! B ")@S! B "ÉðRn! B ")@S! B "ÉðRn! B ")@S! B "ÉðRn! š:þù]wÝuââEo»éªûvX±×&6VVmghã1köaD'|£cUÇ9Ûpd§jB@2"ðÖ[ovÖé=úöê>vP»·ðn;Àû×Þû'yÿ;œîÅóG1¢v·XiÜ ÆÈHoѬlÕ"Å[ ! @*ŸøâK/»Žkï;ÏØÈ{ú°º§±ééÃ)ãeÔ=fµUšúãöÛoµ`ÞÀëvèÚ¹îmbµm±ï6œ®fä;îÈPTz
jŒäU*G9çbÁ¹#GîÚµSz·í< &Yi÷Þ{oó¶éºÉÚÞ6>Õs'eÔ3>äwÞÉP'W¥ªjÛn»møžÑÝFhsáÞCóœ¥KbémU20ÍgFºÀìÜzëGÄôIDAT%Ê¥fÙj¡ZaÎÛhæbÜžQ£G÷»ðÂñ=4yéÒÿûß<ýhÉšQ}Á§DMòáÂÚOî}yZ3n_ÖážÍ%*äê¯á8vÑ +ìå-ÜÒS;Ê·xOLf©Ô2ªYÎ#ÞBµvä¿ä¹XŽèø{.Y²FÀÀ*&áÍœ¶ÝQ|³ðð<,=é`¬
RÕ!sêídÒšÍ[š'Ku3`=wM!¬åúQšÖä0â«14,: 4fL=÷Ü%©&Áwaó·îtáÎMÎ6løØx8[©_*ÞzÙÃŒOKêfÊóÚ94Ë1+Tks€Þ×ÙA?ùd¶l$©Ã÷Åo£9ORr×ȧ$åm5¿Ò}ÿ$E¶ÚѶ.=YºYs?
Õ,;QI¡ê"{É|.8#mÃjÙ@ÜÜ5 7B¹£Ñt^¢ÅeÒÞ+×é]ÙJüå·áŽUFϺ·²d2sçH5Ë®S,TÝ%°Ü9Ì^òÛHÊ6,?ž£&!
¶ÜS_oõ È8bXSÙ*J8žÉIO"ÀœnåDó+TÁUÖÌîsÁtÛJ÷V\4 q6|Õñ62§zCZQÂAtÿlRp¿6`îÁXŸ¬YN$áB5\eÍì8Äà¶§šCj@c5 ±œ%ZÖ¯ßÊC
>±ÖZ£ÖõWêãáõ·£?â=sž÷Î ¥Vnkëx¿?×MWŒ^J=4`±Í,×&¥÷³6Qýèdﮌk&yìèýr¿üoÿ9Îûn±wQ£<øàäÔÛ
`±ï€øËK_bX±ÏùÞJ,µ¡¢Ã%Zº»(Ä¢HÚ`uïÒ<Ôe%
ì;»ú=ÚuHâF_àýšÌH>;Å»`{ï¿Y|h`é"f0V³åJN_uÛª5TaÏõzt.²my³»gÚÄb_]ÀŽî6Äлh)Ž ôÀ0Vð
3ÿ;)5+-ÕíØmO,µ¡¢Ã\^ú$cÐÊÞº=[ôôÖ\ÉëØ®UKî·~
¹w5áøá^û¶ÞãÊØUØÆð^>&ogdûi/0Ù̲;ø
³vPœ®¿H,ÕmÖòÇâÍœ©#Œnü+Žõn¶L\p KsAÜîR¶[cÒªkõõkt³qjõ"ôIDATõüQ|W6Âû{ü¬gØe_g¥Æ7(Ÿª©
óÉ
[9ÇwwË -ÇÞŸr÷ÇÇ:ù-Ûú]=²ãc?²:lbãR6³ÉzÏ\#šŸ~¬×{EúàñO,XN1{ìŽÿ§ÎíÝQlHÂá6"
%"àoqÉ·fbwý·ÿïÄ·ìã ¬¹¿ÇÏz]Îf+*B8lbƯá74yh²í¿òB)ÂQyÌk³EåÍÚ)>ü=×ó[ÁLøÈÁyÖÎŒÁ«øfný«CÍ7æF-îB8d+Ù¬DnßTÕãÌ|µØ¯[t¶°º
·×Pï°±ÞU»G¹3Þ¬nïaRÆ nÑfÞì
Œ÷÷° £¿8Õ»i?ß±ÇzÞÁù>"°îÆu²¿Øw¹ÿ^è³wàHoÊ0ïÍœîã×c¥p1!ÿÖkùýÜlÿ;~yá
wWìâ}sG¿ÈKG{è4Ê9ÚûÖNo¢A=8ýÙ@úÚÖ~+xùžãÖÈÖXâ(jx- ž¶mùÈ)RT+wõVïê°$"žz\Œ7¿^ï}{ïÍXZå±kÊ1OæSé6Ê*6.'ÂágjýäEÀAV3a VÒžcœU)íîë¶nœÁÿÖêáÝ;kYT$ fÀsKš_Nm><ÙçaùòPlÿ\ïëxGÒŠZ]úÑ¿j6ré*ÙzuñëÚe¹¬äwתWERÞ7×DÙAÄý6թ̵*|Ô¡ßO¡Î%ÀçJÿæ€æ÷-«ÖeM¹ä)äžÍEÅ6æFmH#%é «r
Lªj8ÂÁ¥Ù«ù*oá3×Ï2zuïÎéŸ7Înì?é²Â²K}F8VêèRc8d£V÷ûã&úÏÇöó7r|D0¿I+yöÖ&">A%$^9ç?â
kqÞÄüüT¿6LÓ€ý×÷·ª»j>+ßækz¿æýý0ïº=œ>]ý
·ØÚ+ñ?^à§?Ìð[Aš£D\#1ȵªI#.ÆîK8ã"êßßÝ·>ušwþvÔßV_P³ËrÉãÞU÷nsÑš< bãB"b70iÅèa,ÈÎ?ëv(
|8؀ٹíçÓSüÃ
[ð¶XÓo¥]ï¯~\»ÿ»ÅûË_
Ûâ^Üg1ÂA"ö@X=j¡/¿ŸÜCZaËrFg+$ì"áz8ààõqÃ>ËÞÖÙôIDAT s}8»jöðû(/`9ÖŽFÝw*ætPÙ¬"cÜ~m¿œ¥'ïèuíàó`èož!-œŒ°õ¹ËrÉS)smÌÚ⻳]æË!?¬ÓÃX+!~Ö3ìP6T<m°¯ó^LüÒËrŸn|÷Lÿ9úÑvá@cF$ð€é£<æ?Þö$B8þ4Ë/B$×)K8»<9ÂõcÀ°ÜášäúOÝâÈfíé¡É=÷QD,ÛÿÍõ~35ZϹþMzú+"Ⲋ\òžwÕ=§Û\4*šØžD8,ŽBÒë «nßTÕ(Þз7±¿7kšG§y9=ÞçáÎ;ÌÍè[á nXdv9ª°Äù¡œš!8I rFV3#ža·)ŠÜXd¹Ã±«áÈÓ³³ßhàÆ!ÂáŸÓT1§â(;áÔâäǹ Qä
ÖDLöý¯q]²ôä¡ËeM¹äqédÒ<nsQ±¹QááÈÁ«$¥X8þ:R-ÇFlâJ@8çͰBoZ| q m¥òZ8xÈm]ûæ a;áæË»'.+!î]
G@,X?E8n3ÕÍï¶Ée ¡ÓŒw(r 66ÂÚr{6,ù«ØúÏpÐDìrÌãÞ[ÇnsÑš< bãáH°ÐdáHÇM2&¹¿r'
hº}ÜÉûÃ
Àp:ÃÆhqûÞÂ ;©j
"Ÿp'wGØ%tq+B8Ü»¿º"ÂážÔf6·M.
Udø?Û§UDß(|wúµcýk±\,·Ãá`ì<دª1}ü(¥žÂ}q±²#0á xñ5e]uÉíºÍEÅ6æFmH#åì «évêòªç#Â2âŠ()9¯2Œ#rh»D}&
ýêæm^Â.
O+ßL1êsãVQË=RqìªG¶{LÕksPÙõ"#åV§«UPäBÙlp7Êü¯#ã'{·þOp
¬Kvvi?±kÊ1Oæsç6Ê*6.òÑÖ³Q±F#:È"p02:Á#ÇðÀŸW)háÀøA²EÈ
<HÄdŽK"ÂAx1LÓ$ôd»ÿSâÙs·I²l]u'KE^[©l7u~-ò)`@à®Ë~É%d.dòb;4æ+÷SùOžpAY@sÉL?XnT§øVaôIDATûÞ\ÊûÝãÞúE7bßY
ÂA/'æKÆeM¹äqTÒlnsùÆüÉ'³ÿö·œÂ?>:åïßçßÿöÅ|É}^ìÏGͺë®]¯¹fK.øË_nÿôÓûä-òÜsûY+üR€Î7ßnÙ~ÿØŠSdáH¯$vÕ²oê hj/é{,c^Ñøö)ð+dáÂ9ßÉøâiÇuZ+$<R·|D;ö|rèáJÈãØUwÂAN³fGŸóT'q¿¹Ôõ§û0Š~æ1ì7@
Â4EÂXñÕÄÑC «cz4ágt"ø8(PuEÿî~Cx]pÂfl¿Úo`Žóçî=£köCÜbÛX"*=tYS.yÇ(Û\€Øbyæ»ôùR§NíæÎ]ïÙgò·Þ~øáÃ{ôøêÜö«J¶Ý¶ß_ÿºG€Ýwl¹±ìÕéóÏçêÕÌC,Û^{ù`©ÐWq)ÌcšË}I@G,j&{£H$î0ÞÒõ{FrÑOjá âZb[®@L0Ô"i<OBk~ò-ÌB*İLh
+!Ø,8)Dý6õ?|Å%6@ô9[±D KWÎ}H+®à
#«ºu8§4Ë)>Ìm.(ØØø®|À@)Æ?ø%lÝ gð©áÜ_ð×aÔ0ÔÈ2r(ò<Ì,S[nTÝ»Äñ78rØä`ÕöýXÆLGAmKÉ| òX;Ÿ±ïÒàñO#÷¹XY5åÇ}\î9Ýæ"ó=8 u[wÝø2d¥þýWìÚµEä<¯}û6]4>·ÝûïßsÍ5ý|umúÂ</Þ`êÔuºuóÎ
+ŽœåÃ¥ÂÁ_ïŒsŒÁÜÐ:#ì 7¡~ñ+:cËåGÅÞ(ÜÅ/QNYÍpû΀ªæ Ì">&EáЬÄÁñáà£*#z/aâ|Ž ìëÃÁ-·4¬$ä£0Ñæf
÷V,&iøv@lWûæxl®Ï;
ºû
9ÖMú°làzQøÅñšµðháïñ#ìOàÞ[VÚr/â³Üšºô!Èóö ÞÙ[{kŽ:A©ïX?÷
<žNYJÁ¶ñæ÷$êÄ®)rºäI44ÌnsQ>Â9Âøò˹kK=<ðÅlð8ôIDATÀáŠ_ýÀÞœ;ñ'ÊOìþfvêÏ:wn÷äËþdUŒ²O
çÍ[/ï@8á¯:øÆÑz%h{{+àìv[âËVÁhÅÞ(\/EYÍ%dXIAcb×e+lN.uâêÁæ×=~.ùɪ%ê"Î"ìs
`óÇâtŒ®æ¶Å[>ðŒvEDZX6/á°D>Ì<rt
1#¯Ùà[ÁE8§QA౟îFyÑ,dÇwÀeM¹äqK67 ¯á° {ì1Y:ŽŸAë{îé?ìØ±í#ìÛ¥>5x°OgÌüÕ:UÙ?ììî»ûQëpØw7Ô,avðåÎBPŠ7
ÁKÇAV3ä
TÕd#Å€ªH//á|
ç GW|ã7wŠpJà3:
n"çâžIx
Ía±X ìßþöŠÖ:þ€m[ŽŸõ
úsåŸzgNXÏS#_ÿúØ
6èÉ/wܱs€,4eÅÛŸòÉ'oÐ8Ã&ÃVRÞ`KA#ZQž.EÀM»ZruÐ1Â|
7ouÆáåI#v<WpÐâ>ûø§<ÔZ¿ðBÿZ}VÐ÷ÓH^§QÇ7ŸáiwÔHoÜçgµŸ F88S&ñA«tÂL_º_ÓéŽÞyÛ-w(ÏÕ*êçr"õ8Pÿù+éܶ84çxx6xbnáz]ºEç «eæ«ááHÑÂû)`*8©Å]Å·G¡,ÂNµ5O)7 ¯
á8ÿ|ÿrÜæ¯nsPÂ?1E$êL`áàZ,ÅW]µS¯Ø1Í?ÿ¹_#pà4ñÄ5«êœZ/â[róÿ9ο7I\HçÎï «Ap$ÙnGí©gC8?lýŒ|çÖ϶ñêà«:§m±Ü
ËîõëÿϧÓG©Å£ÜšŠîXtD{ŒKæàJž×]ç÷ VáöÛû#{ï=È¥þÛn¿}Ù©Ê{ïÍààfã{ñ×"ª;Ñ׌7sÅ»ø
(pîŽð÷Ž|UŠvÐ9Tþæñ_H¶æØ0V0ÇrÂKâËwN÷CNóMû€hò
_²Zfþžz$8x6¹ÄôIDAT#úðÕ¿#$
«Ü|Gãàw¿³ãS§GR
²'Úã]2»þt[ºÇõ×O?õÏP&Lð¯ÎrÈ0úó; ªüà[òÄîßÖ7áàö_ðcq
HDq$RÙ%TÂynØnA!Ÿ7LôäÚ
â®ÝÃÏ=Ãõ?ŒáÈîKÏAV32áH²ÝºB£ætñì GOçâÌuâ=
Ósžwí=6ïfOFàØq¹Ix¢=Þ%³á°#>}ºX
&ù·H¶Úª¯Kýy Ç/N
ŸOUžI#êË/O«{Â÷
׳¶ò éž
°ãóáâh7ðsormÝòn[~c38DZ·Ø!h¹€dµÌü!qõ""Ipñl˧o¬^ÌörcŒÂG*ûõ6g7 OŽÇ»dv!ž"Ël²Uxè¡Ãø'q8\êÏK8xHmþúh9U!9áŶܲe®o·©9³°Þ+8ûÀ÷Â'¹aÂà-ó3+ÎqIxi@ H9ø%òcîDþ°ü«¶:z|4ã8T)9ÈjbFPæ"I¶ÛæTÁáQ;x6ÃñË|šÜÅyE(45Ü%±¿ä4*.'Úã]2»M7]Y>è Ö ?ûÙvŸlæé
xíµžK,àÓ*Óš¹ôÒÔ0gW
;ŽüÎpDâpØ€s ÎÞ@.Ù1¿Æp9R±O?èâ ~CfxOlºiy*»TdµÌü!qõ""Ipñ!КÃ>É|ºO#V5y7 wáòÄfØÄ#_ºt&YáI#·Å/@¿ÿþLûkpŒòÊ¡ôìÙ»*[oÝ`ŠØ9p Û9°Ãáx"ôÑc*4
ÃG3øSÞ;ZÌ«ØTÌäÊ]æäbm¢Õç «Ap$ÙnICCfvñ»Km¢ÇæÎçÇû~øþ÷cu€Òù Ü$<pÉ\p@žþ oŽÑªáÚN8a ú¯åùŠë?þ±¯}%ÝK8xÂ
y~ô£a;ïÜ?š¿ŸTòZ8®fNoá«'ùíÏŽ|{ûY ¬?$®^cyÂáòs
ù a[LYÉYëqñöi1<ÒºÃÁm»Ù€¿ÿ'>³|ÙzôIDAT$°p¢Tè§[Y Uü`Ô Êjébóú±~
D:/œªÜ/*/tž^óÖé6."Qppöññdzí祊Þ{ïî_ŸIߟþñ.íÿô§ÝÃÕBDøÀZmµÎ°¿þúë_ïžÖZÝøÓÀ]9X)äÃÁó+®ðßÑí,ÜŒmdÂèÚG4¿·[fMB #ü]CDRŸ}ëúé_yKG`m
Äo_ðÕCnÐÕÀ;ÈjbFPæ"_÷Oç~³ÊE8,nA|ŒÞ=åtñða4baonÔ×'øJøÛñ.×b)
çG^äëpØyßÎJìôuͪÂp=|ÝôÀŒ²TîÞa7 OD&\2ù<œ òJ+uøýïwÍø]öÁ_öûtÙn»~Ø÷cI?zjp©È
úÏlGÏŒ'/uï4ÊW×ù{9áAíË8oÚÚS© Z\€'qX.
$Í¢àöçýÏPÙž"kßRæPÆ]J-§¬?$®^£eæ}â<5áøáþµlÂÏ%¬ÚÉï âþâIÝáØÐæykæÖ+R°j'H,ãG.§(+Âzj((ÂÑ¢`[œïáO^ÂÁ·éù,ÇÈñßÿÎ(ÔÜÛotöÙ¯±FKÿ¯R÷î+,Z4úÝw£¥r ÕBS(!VßG*a,¿s3öwÓ*štã
£Z¿®ÌåXè8ºh÷ÇOD¯8Ø¿%è_&:ÇÁ$Øvpd
Ö¬6NÌÊ\@£
p$úÄyjÂaîEᯥ¢ý«RÖAÄK"%
3&Àx¥xëøô€§Ä>€(^&TëËÂÁ·'žHL€`XÄm.2€YUÅgS^}õûïßóسܯšdÕP&õžŒ§Ñ$Ó" Œ}=ŸÈ»tÚæÝ iïÓæJ#>WY[3ÐF_9ÈjùCâêE8N÷?Uèç"EÅ,(qš÷â#
ªõE8jdÝæ"M·+)áš®ÔêéáV8Àqn¯ (í»º³û€î³¬&fe. ÂqºÆOrÿÄy^ÂÁ»5.èí¹wxË7GEä TnïYà9¶~¢Ç \¿ÆìÁGÉ×9VH-å.è âi¶Ærw»Æë/ª¹W®o¶D À{î;»ú×q×'îP^ NágÃÉ:R)þõKN¬š°U0ôIDAT©'×uéæýýçÁy6ýá+ÞüóŸ9~o;ÍQÏI9ošyíáôí¢|w<zKÞb©â,É€Sï6ÍÌ2{c€ÂVb~Y-3H\œG;q¢Oçü7îµãaR\ò9H^ møäÛ®NØåøY²XŠâ".ÂxîÊj.áàcKô0H\ØÃÙ>,3\Ââûváý>F]Ÿ~IpKøëß0ïÓ(KtÆ{¡w·I[¿A¢*û€'?éBpL6Ýf®Éݬ€Ib€×ÃX+!~Ö3ìPí
P¢OGŸÐìaÃ>þëÜO{ÞŽHšT»"A@úÑþÃý×÷ÇÕçXDHx;òª?8Ï;~ÿ ŸÌ¡Ö~DŒvg¹ÖÀúS&TóD+<¯é
þ~wÝþœRØIÁ#í6ÄL|ïñð8JðIn÷¯_RÄ9º¹hðßµ[<óÃÔy .uÜ<gßÃÿO³ücrKç?}?þŠ·Ë`ùð%_ìëØGŠ2$&'vg&ábjZÜ?q!|4tUÿVxKÃXMâÆfðQ\§QsfX·XÓÿÐ5jm0:©r°2¡p0
ðãÏB߯úýAÛsp©ÏDºð94A2,Tb@8Ü¿~0ûZ·1oBxÉä%d»~¯e¥Žå@¿ì!µ>ä%þt·:µžïçªaË*ÈòJÖ&MzwÐ%mØe(O33lŽŠ zÐñçÂÕ ÝR¶'§ÖÆ"pØíé£<n;Yqo£rlxîu:xϲû`+³Lš"çyk±Æñc9
À9`p$úú%.ržIáòf~%Ø->l¹úóFúÀCþö+€;s.:rì"ÂQìHC#Cj¿ªºÙâ<L8IiúËû±1èIJÍ%Ž-ÿn×!þWkó$¥ÜÆÿmíµÙP
GØÂéÙÙÂÀßùÜQøõm#I¿~yÚÒÎÿIŒNÉfÎmä9«¯£ÿ1<N¯ø¢ppÔæzϪWz£ìzÂdá(ê'÷çaÂÁ[÷6Œ4rÅÈÌ¿šHûSÞ8K&G]Þøº`ÒÏf%Á±õ8xÝÐÊØÁV,CP-dáø2LsºŽçGX"ZãÇv€âëTž€ÞöôIDAT²?Û[«GKy ðpŽçÄí%Á9rgcJ-áª4ä 7ò²gá8Ý÷Oôó0á"WæœNmîl|ݧáàOšseáVçSpXЪr¡FD\#±±ŽLš"¹ºíÞ¹weÍiÃG¯_×ú9u¿~w±pL*J8žÜk)7\bE8D8jJyfÞœQv°¯N¬Ý?qñáà4K]®<ÙûÜoŠ#ag7jÀmß3Ä5$s-œBáH<qeB5á@HžKâÒGD`ÎÜjáàOŸ~É5>Be8Ïð;OÂõçµp'¬ûW€*ªýƶ"µìÊìÄnUÒ$1ÄÃX+!~Ö3ìP
PÒOG}9ìèñQáàz {o`ü léÐ[sâUf¯Dü?îÕZ0| t®I
"^£³ÉðËTIPMM8ðbÎivw³Ø·TÜ¿~ÉÑ€]?ªepW
ÄŠ 2̯jÞåVŸåü VËf©[*%! Âøµ$Wù8è·ïLªáh9NôóáøÃV~pk(®_âY§%`~8HjÔêsK0lç 8A$[ö¹Õ:žGbUR&TS"^` ² ;-Ãýë&Ò¬»Å©
n€Ø8Å-TõÄßjÂu0®«TNšKº[«ÄH#±áHJyjw+JôóÜH£6öâ#Pßä#¥æçÏbø+Ñ,¡m÷[ß8N[쌚èqÞüé®2È¢x2m÷³Ÿ*,ª© è»ùŸÃý°âvÌgVpÍåë\AÆó{f.isêäype&
>Ýnq×à{Dà ÛfwÜnPâEä6²pGbÉáHL8Ð/5»žâ<ï·T~<Å#¹%t+ÆçS·ºâC>m_ÄMÏ à#z·äŒYrðÉCkš6ñ&1©ÙY®Í ÕR@á¶DÅUÚA°R8Ž9ÙýÀ»}»ù¥r?<ÿ¿zRÊxOnrBwìÊÌnÏràtÆæ¢§€oÁ0&ù3tú*¿9ÞÒõ{Ô¡kgßàYã2QÊ'Î àÆÛ'#ÿ:Òwòãðê1þwªž{±vàZºúe¡ê@97!T¬;Q&_¿técÔ§XÝôIDAT³Zü[ùøc~Ëæ&á]»vZºtŠHCj@c5Fc
€X£ÖÍãúH#(sxhþÀëÆJf9Ù&'TKiÜ5°ò]p%8ÚG8mIT¹Û\5äÁ'§ÞnUð¡&98VppÄ
I±³ÌksáÉT@"}¡ÌåD¹cc%@³HÂ
j"ž¢-Ò9wÈœØà?äD//LT¹ã\,X0÷ÂÇ7€FôÀ0VppÄ
I±·ß~{·Ñ©e®;f0V4ËŠLš&+za×ÁH|Ü6€yCãeäîs1zt¿ÔÛ
&ááÝnb27Ú#w9_ÄUyYX2¹s~ͲëÕÒUS8Ž®ÛÓ¿BT®Âð&
Ûu¹7nÔ%[:€@Ü@ÏEppžÈI±<·ÝvÛ{Õëhéz°jXºYcî§_³ìD8j¶kwïÔ_ZN>öëhRÂbàæšID8D8wbÙ]t/Iµ|#[=Xïµ}²žóÌZ¢¹×,Ç(¡Z;ë"Õ\,ZtŒ¯Æ>tÓmÚü`5fLpsÔ$""¢mûI;w8Hv§÷àêêe®1.uñ±)&^³\p~
ju¥:Üz s1iÒN'öÃ
BdñâcÜ5»ŽÄää
Ø?[?GíhÞÜ,Ì%µm'^³GeÕÚùç÷uÎäÏQs(¹Û6LppdF8š<Œñ÷ïÊòiÊÚ V;²|=aôo/3/Ìãik±Ð,ûZCšObÖ\¹ÀÜö$>F>À4ÀdÀ'
&ááÈpX]Ü"rÑ¢ü-7Úª@Y`.{kîÒÐÔ³,T«&Ð9
s.-AL0bh·»ÉhIjM"Â!ÂáŸÅ(§B@pp€B@!໎(§B@pp€B@!໎(§B@pp€B@!໎(§B@pp€B@!໎(§B@pp€B@!໎(§B@pp€ŒÅþù3Ï:{èèqÝ{®ÞŠm»&ùú#eŒ±@ú§wZôIDAT}ÖÐq£»¯Þ³M»¶M¡)@S ôË|MßóJÜ>*_Œ:=þøã5¯S·U:L<Ây·ðeïŽ/œÓÿ×?ñÎŒ±À9çóÃ?L1ñ>ófuZ¥[#&z÷Ìô^^è}yZ#nªÕšÁ
! ó>w\ogïž7a!RÇœÑeüŒõFè<îŒ÷Æq"B@!ÐtpÄîŒÍ³¿¶pd³SñÑð<,±èYÃ1#Ú9¡éX¿¬hhB@DpÄnÓgÎí¶ÛEb°÷p¶e>wf·vÛB@æE@£ø#^:IÉ÷{d\|H}WéŠæÕ2ÞYFE@£8áà^ï%Ú$Ρ 2àkäàNï%ÚšKHãB@Ú¶Ý/j-CEo©pÔ¿p'nü3ïXùà¬'ÅEG! nb÷ZËPQÂAü ÿFšG^Ÿ>±òAŒ
ÿl£.!K! b`èÜ>v¿šµ%~t¯æ·Wö%øÄÊÝKñ6bW£2! v6ÝŸc÷&í±/é6ÜTùîWÖ! `/pÙãk*OE{,Â÷HCF! D8bžÔB@dÃjM7è,µô
#
ÚÀ'»MÃ~!ÂQK|98B@èHEG*¥Ñ)&y5Ñ0
%"à°_ÈÂQÚ\k6lûã @²pèÍF! dá(¿
cÑÞÁkýá÷"ûý'Z³üQþl'ý×u¯·Ë·œ]®ðŠý¶Ø^~qY£Öú!z>éñüϲŒè+ÂQ"åWq! @ à°_ÈÂQ
cÎ_ýW|K;^Rp³?êyš(y,
®°Æe,[»ÞšéÞáÿÈSç©ËüÖ¡«·Á,oÞÙÐ
Co6B@! Gù-aÂ1`ÓÛü¶ç.#aÂAÓ.öÚwòÿÚq%oжÞcŒ œµwðÚŽõvêáM»%ZÝœë.ûYym¯K¯ÖVVèâÍ{0Î!ÂÑ$¯&ŠB DöY8²°pŽmïuèæ(þ;ÿ6¿ú^»y,®n}8òïø7+{Ä?œ^Ãü¿RùÜûûÑ3òŽ5ý²ôIDATw^·~þ_»÷÷Ný¢TÎá @²pèÍF! dáš
ãÓü7ï©ÊaOûZw÷(á8áoÅÞþÃMNÈÏüWkUz?Y§áÀä[¿jèQi! š/š²pdaápì÷Kï¿I=~Ë3ü?íuCp;ÂAbÑÒÌ`ö_Œ6íülûüÌp,þØãH
ŽÛ÷D8*±ÌJŽCªžB á(Χü]¹Ä{€æÃáÀFÞSìžp ÅRàÃÑc-ÿÛ_ÓÕFúÙMq%\T±ã)?.utä7ÔKECB@RpØ/dáÈÈÂqu¿ûîøÍå¶yî¬pÑ8õóåvsÍõ p «CHðŒø
<Ã_J€S$Â!Ÿ%þ»gœ¥öØß,KÜõ@Hý'.WçŠ'ù§þ&J8<þ-x*Šø
p
@ppiüø®G[ÕâŸËÈ€RÆHCF! \öZ#$õL8NùÔ댪rôKË6{ÎM:÷ôøSıÿÍ£xž0vý©¿nͩѣ"q8,+§0á>€&U"¥UV!Ð<8ì"Ù©°¯o8Çßï a{üûüïÿ!3þØJ#|.ÆAàQn"í(B8VXÑ¿F»ÎN~ RÚJM2ÂHœÙ! ,Œkûôw,wª2þhÿ3þppåÕ·XB°D|8"G*0H%"Íóv¢
! JAÀa¿
#SŠ?ŽFË©
.xzòcŸOVYÇg[C8üšç°ÜÑi4Cæá @²pèÍF! dášž
Í~£CZOUfÞíÿBrc¹cÓüøxóJAαïÏ[
!Ý%¡%-5ê,Z8 ø®ÊØÃü_æþ_AÂqÂÛ^×>~õöðž%k PúÊükn±Ì#pÍÚ<Cón©b]TY! @S! ÂQ¹À_ÁNÏ
4]VõM=_>=纬í=Âÿp(óÞ>?m¹óÒòý¶£^XÃ!çp ©ÔèÛFSi:
Vª#à°_ȵ
ýÞb6_C8È|Àm>¥°Äç^×ÞÞÿT=WN,¥tÁQãGÕ: aD8ª`áC̺·.¹B®G`ÀÚbôIDATï·=#H«®çG=?éý<G-"ZçB@!PSppdx~ÁYG'Äç z鱯eH£Äî9Tt€"ìµvbÛöØß,KÜ»žpHÑ! Gù¯ÅpøRvº~B ©pxA59T8,¥9±fKHŠV1âB@CÀa¿š0mNCCö! š7D8êÉi4[ãD&µ9,²p! ,òá(Í^"Â!c©B@ž à°_ÄqT8TJ£6JHœÙ! ,²pF_D8\xœò! Ã~QaFls²pFdáвB@Ê# ÂQàŽiÛn¹¯°f»[×{m§} >±±M»¶Þ§É(ÍÀ§±Ä¢î=W÷Ÿ¬`£ùXø2øÄÊG÷Õ{z//lÞeVù×µ(š5^^È^»_ÔZ¡£Çy3ïáÈÀÌ{À'V>íÝ3SC! {f²Ä¢ã̳Îî0ñŒøÄÊÇgÕáÍ»Ìjí=CýB@TvöØý¢Ö2Tp<ÿüóºâ÷8GãÞðÃUºyo'Î!ÍÀDZžì±J
3Tp0¶é3çvºG.ãç4kãÜO;³ã.CqUü5B ! j
.óÆ4oã~QSÙ*M8>þøcÂŽp€8G@»ñG¬7r£?üÐQ2Z1<rB-õG! Ê@»#Ư·ÑH÷ýÂq[©L¶JFõÁ¬7bLñóu¶+nŸ&æÛÇpÌ.óÇël¥¬k[! j7[qáæ)öDKY3Wp0Øg+x-ø>€Ü[á®ìi_6Í2Þ÷0v,)æØÇpîLNò|RîpWVñ9tæ"h$Ðêèö{f¢çÑöèütûE-ŠEªC8l$øŒp/» Äðc5Gb€Q3öÒœ~|Ï>ûQÜÉöc) ! @£ VG·£áÑó¥ïåàê¬&áHÔQeB@! êú;õ\! @Ý ÂQ7S¥
! š_D8êwîÔs! uGÝL:*B ~ášß¹SÏ
R»·|ôIDATB@Ô
"u3UêšB@úE@£~çN=B@!P7pÔÍT©£B@! êú;õ\! @Ý ÂQ7S¥
! š_ªC8zê©iÍ^¹÷mÛµo÷h"X¹+÷îÇ*f-§PÒM$+jžâR,Òr©áøù/~ þí¶=Ç;êyïÔ/å#±§ÿO#+÷šçYÅ»¯úœï}?nh1Z«%¬žD˳¬+M8ÐMׯ;ò_ZrB@4=ÍC8ê)iFôí²j(+ÎqaV&[E vÔ.+õòû»ïçr¶"
Ð8.*PEW\eh{+%Ìã€TqÔŽe@u?G¬Þö àžâbd
3TpàeæûmAß©N! ªÀQϳºc4@5çH·p[q±K²Â*J8ü;)òm$¡×X!pê¬îXå%
Â!²AÀmÅÅ.É
gš(áð/IA!ÐxñÊD@
Pdë0m.^GÄVáAê&3Q+Ÿcô_oÖŒ]ŸíMù±wèSÞ©gßîñoyÿ-Ím£ãþã<úÅÖ.¥®§!÷ìºú«{
°è_zíßÌ×'Z³üQö«¯r»yÌÂâOÒôp¶9Çö[¿ìÑ/ùõõBÁzNxÛÏpèË2öå2À#¿óJkþc^ÏXÖø§ùØ×Òª°R§Ãsß+S£±Âc°nå_<§öœqGx§|åÛõ;~CvM\ç¶çúGLk-ºRªÊõW÷cÎ_-¬/)(üxªkm»h^çÇœÉ?ZÖ·ÜÞ þ4ýú¿ìnßõËn0Ûÿ}øŸëÙãZ?C·ŸË2,þ8>VÖø£[óozb|æßkÍ<`3?óæ§€Tég[ëpoE£ÇÜûýEKêž7t²7öpoÃ9Þ[Žê>~9îÌYj¢ ÂÒ©ÚÔ_C\M&äjpìùC¯m{ÿ=$l ÊdÌRG÷þ^Ïuóÿ`A±ÎáX¡KÁÔpÒû"îŽ |9E8pÚÖ_xëíátÞäüœ.œü?;23Â=sÆÓ(ÓáH]OílŽê!Ð<ºC7Ç/üwþµú^»5M8l+ÜX
cÁ^¯a÷6 ôIDATàB8fÞ¯²l,km)
£|l¡fF!¶+øJ0¯cÊþì1ÐiMu²¶¥Ê+@óvý3ARÞS?€ç»{\QIM8xÖ{pä!ÂQŠeè°â8@E³p4
á8äQ·i·Ì3,åXûóÖÙ1·ÔŽ[Œ-Nõîå=ÌÛý*ÓpÁyzÛ_èqXut³EŸutÿ=NXqŒâùŸ¿2¹wžØ3ß7Ž?Êw\=þÍåòDG€~ïW[èçÀÛ«÷Kê3ÏŸ·õ׌ÙvŠPçËŽþŒZõçh]£d>ýüByý7É3-ÏðÿŽ×
ù G¬ÐüHËû??ksâqÞ©Þ.W,sº$R3íímŒÀÃU"'ë?Q*2Ýæù·úÏqbåwì$^÷ù±ð<wE纎ßMŸ]ÕœÑÁÞNz?V%éÛdá(¯Ž;¬ž² ÆD8
pàלboà ˹0ŒµjG¬ ky³î]¶N`$|¬xÞÚøÑÛrO|a*ìý¹^A#
XÜR$áÔBïÔcùŒmü3éð¥B¯ë=¯f;ï þp°ÄðÊ{ª²êPÿÀ
å`)ìÃá"Ž;_îÚêLFë²hßi¹çŒZ\Ásè8iô?'/{ày¬ÇɶGCJèpD&Ñ*<V¢,eZ³+ÎT4G£dzë³[UVŒ
--H±!(Ø<H«öŠßéð¯7>ÔûUpmÕölt+däÞFŽ^0ÉUOHHÜîþ}ÿœëžÛïº^ks4 ÿÌŒÇ7œ:tõxù³zÌ#€-Nóžçå-QÈŽUšóeZÿM^úkÂÁ\:ÈÎß\na' <À¿n) BkiDzÍ×=¬t¬µ×öBexÈþÅcu |s¡óÊ0á cóòÉiýýýß9q!ØZHýÆúEP,tlã[FØŠµšÇ,2iWQ6áÐGÄmÅ©JØûOôwe¶ÿÐÛU4ìÿ¶eØpn&Ú¯5¿íÙ€I×,WCpàAAõDŸÌggÒÂ['œ¥rà>±hÓÖÛÿW5ò©×s_çÎ-×%HÙпÜ÷³±ê|ÖWë þüY«k#F¡'±ŸÂ#Úô$ÿ!Ü"B8Ü
Ö âÔŒÇFêôôIDATZBpÝqßç_\y-ö0×i4Ö±Ú(¿é¿[nŒÜ}Ã!=¬ºËÏÆÒËpàvÆ;LîOØhÚzKeÅü9MY®Ãru åË"ÂÑXEÎûÊæœ>cÆÑÆ+¿Æ<{6Åq÷SVšíÙÈ>QOxupê9Qö_w>ö Ó
Õpðvر»_<ìÇÙ0 5&Ò+;Fé GnçëzÏ«ÙÎ7áCt^Å_)¶
&й§Ç"Ã]hp¬°âr²ÝòuP?±`ÐvËGjÂaàFM_.âYî§*69ÁÏ~Ã)ÅÂÑ:ìÿáIàP<G
E8ÊG Ö,ÂÑp#X\WÙû'Ÿoç ³Ó2÷.«úOð$ÇNþÙé[-·]ŒV;®ù'á¿b2ÁÞ;yïdJ¬KAAwÂQÄNI8è ×OoI9"=çæŒÓê|ÍîÙuݱf#LNE€àm~Î}þ?ñæOÂá.ŽF8z¯¿ÌÃ`,E>~%ÒïÀE°pìy]k8r%â#²³ÈÖ\îa+áØ§ q )oà/ÜØ9ÁÉý9ñÝ(áè»qþã®,I9BŠùE8pï-^;8n ÙE<6bîèäŽ=ÛÜÊÂ?¹X|ʶ¿Àãþ}8Î髵þ3)áµà\B$EB³ãR<Q0láÈí|]ïë5Ûù&$÷Sè;iÆòw¡5Â1xçüGï°pÂR1ÂA»ŒEgzXkŠ(ì`$ÇÃŽ±JÞ ñ
"*Gõî°â2eT&ÂÑ(ËxÄ(²>qã"YšÈÑ]¯ôóþXP##ÜÁ+N8$áAÂiq9朮`G*µYo{^Ó¥fA%{¡³
GnçkvÏ®ë9š?âêza3cøpË©
Ýúù?vʱpžu'@8ŠFA6Ï»¥b?)|8¬ k œ^ÿbm<Ì¢öW³U>%öÐî Ì:á?îš"VÃË#dZ
G£3âž^HdMÅà?oVàÿ3÷Ê~€ž#áàìÄm@<9Â5ù\«V
9]Tìzm×ÕóðiÒÕQõThÈ
:hU+³#ê¯ÑÈpo€ó;±Á!îB[
á š)â&IgàÜ׫{mü¹>c£æH€cšpÆÊuø°Rwñ3nDÃq³ZôIDATY6)[È 2F!v'UM ó\©EýÙ ßµ¿»CÀ?",ÇË·pŸÁÈCGÂañ3PŠiÎRp£5pðçÄîÔá£Iätm'Á[.G êÏžD*µÖ2G,t¯ïvy;ÚápÚRfEÒãmÞn§ßFð¯"
œ£ßRÁÞN@3DHÙCâ².Â7Ȭáei«³òÌ>«ØN{íKoö£#ÉwXqpL«áhÂ[ŸZ$féÏèýpAHDÀÙ
`h¹qäÄsbåAþC,ì¡#á°þÐðË
7õýàH-iö_Z+,N8öºÞ7Pó\Í»ðjõØ×uÞâàLÅ;ï²')êÏ€ÕÖTþ\ÂÁ.Ûµ¿eâ
œÊ:ËFÃQhK!ÁÇlÃ8Hj)L8lÁ£eÄ^õݳZÎeÂvBíõXëÔ;e6vîÁ
y²qúÉÕHÝ×X.hØ;¬žLÙBp4
á@@Ù}XXBöÝšå+S-í?Ë1ñC-A/xã!²¡ÝAå,hZùý8ÏW°vlû
ߥ«}üÓg.VaÂ+>¯J$®ŒÜÒ?ÓÅã}µË~nGœàk(Ë<.±$4ñØecÔÚÊ*úó'(«æªRO.á ¶éžyô*p8
m)Ö¹¬A²³`ÜóaÈ$
}\Ä=^ºK8žônŠ<Á7å[t aì².EÒŒòL1΀fe åúÁR§=âû
'TÃEŒV\!Ó*D8p £ùc÷e«3ë- ¡ac@ ÍøpÖ°Bvþø=;W=¡tÂ:î«Þ©haR°šáŽÌ²-ÿj4è9ŠŽ}îÁºONªÚÊ*úó§)«æªRO^ÂaÇ
€O#tØEhK$X:ñØ0OmVÏ}~êGë"
F1ÌÀÔmùà÷êB8Èá?î ñE\Âùþàü7:ÍÖS^x
':0zær
Ç2pž·ÃË-dPGc@L1{rKÃ
ãßWñèA<pþx{¹}8ZExÏñßÜš\IksÉOÐ#Zäh¹KK=ÊS:ê¯î Gé(QCð >PPšÛ8^°Ty+H4.k©¯È7ø8¬xUœEãýšÄINÔÏ€ôIDATÏì°â2àV!ÂÑ £áXk8š?d[{M±úSS8¬žLÙBpp!êOCCdÃË#dZ
Gª¶Šh¯:#ªúáÈl³©Ê«ÑBÀaÅeÊ2𬢣m»ö:hÆ
À©_°ºc4@N}MíÁÍÓ·»$+¡¢cåÞý¢qcG>4R!ÐÀõüÊœ×U^Ò"B ÜV\ì¬pfÌi·í9ÙÀÝÀº[CõëzÚA³c4ŽÈÇ»$+¡¢ã©§òqÀ_oúTB =ݹûª¬îXå%
) àŒâbd
3Tp0¶ÿâ~ìjn`s!Ðøßçkóœï}ßQsIHõ Hžâfe²Up0*tïCþÙ55À~£!4'Dp:êy{"¶(i¿iNyÓšKXqgY3Wp0¿ÿýïæâAæ{+ !Po°rY¿¬b\&
Po®þVW\Yi{åÕ!îýSN! B áhIÔB@Ô:"µ>CêB@@@£&QCB@!PëpÔú©B@! D
A! @# ÂQë3€þ ! hD8`5! µGÏú'B áhIÔB@Ô:"µ>CêB@@ ÊãôÓO¯rz5/B Þ`÷¬;
ReÂQwx©ÃB@! @
D8RŠ"B@! @2D8á¥ÜB@! @
D8RŠ"B@! @2D8á¥ÜB@! @
D8RŠ"B@! @2D8á¥ÜB@! @
D8RŠ"B@! @2D8á¥ÜB@! @
D8RŠ"B@! @2D8áÕ¹?ùä¿-}ôÑ¿ÿýïÿþ÷¿¿øâEà¿ÿýïþô§oûÛ?þñzê©Ï?ÿŒf»îØ?ÿùOÀ~íµ×j§·Àœ÷Þ{é¥þà? {µÓ±Êôäõ×_gF^zé¥"Í}úé§¶D>þøãBÙB2ŒõÖ[Eêá¯äù׿þeyþóÿðÏ_|1(òäOòäÃ?,RKÊ@§@»ÞôIDATV@qD8$!QyæB_èÔ©Óܹs}öÙRP{üñÇô£RC€,»õV[mÕŠMp·;wî|ÄG|öÙgÌ<¹à`'v ª6Ûl3º}Ê)§€š€cyõÕWûõë çHѱº.òµ¯}áÏ=»È( #¬¢P¶á»ßýn!wŸŸóïg×]wµ<ç{.ÿ6mZPdõÕWçÉ<P€Ü<u¿:ßÀp4ðäŠZ@8
ŽnK2dHÿþý»víjJ¶}ûö]tQºÚøÃR*®xn©ûï¿¿oߟôj¥V<yòá>gÎ-¶ØÂø¿ŒñÆae=|øp¿ýöÛYu ÄzRv¯re}ö^œzÍ?ñâÅ%ËÁ©Jñ2ŒópäD£*r¢FS ÂŽ/ç><Ô/¿üëî;îÈŽÂ
+ߺÜ9ñÄ)~äGº)sÛm·¥Â=öØãœ÷Þç|øáÙ5#ma7ÎôÎ;ïdÕëIM8Ê4õ×_|.»ì²ÇU¿ÅËD8òÎ×+¯ŒòÇ?þñ±Ç3žr-þóÉðþûï[ŒDòÔ/òêyÃ# ÂÑðSx
Uí`wgO:tèG}Žöl $ê1#lƺtã7ÒO,ÛÁ2mÒIAç¯5ÂÑ»wo@ÃnTÊ êºl% Gš\ÂÉP\×sÎW
^Í'O·;²-á¡Ûÿu×]wòÉ'O2eúôéguÖwÞd\xá
[oœ5Ùeùý¿üeð×âe¡7+µµk×.ìgdæœpÜžqdÌ%ó®»î2
NbS¡øè!R?ùÉO;îž=÷Üs«®ºêÝwß
·ûàR¶-ZÄÿÍ7ßöŒå[N=õÔœöÚë°Ã£ž£H.áxäGhèŸûî£õßþö·kP'-þîw¿úS|,d+ÞŒcáŽvíàìcá÷Ûo¿=é#¶%NÜÜ}®žâŒ¬4VtÆENhôßü&ñŽàÌâ 9sæ·ŸõŒþÌ2#:u*ÙŸ÷œïñÏrBó
ÉÖñ_ιþ¡žó%Öd<ÁÏ9ç<ùÂè§?ýi-;×öT" Â!"K8(`'ý|pPø;î0`mçáŽïŸû
{óÍ7#ÂRbÅcË$¶7{#gûçnEñ¹D:ÀÖnEpýÛxã#Åm%Œ[éôIDATã^|ñÅd@)¯µÖZË:A\vß}÷Hq²q×#VŒr Çå_NUgqÎ(:aBVa±žt&ïX6ÜpÃHst ÑA¿pT²Ækp"ÀÁ¥{
@sÒ°{A
W]uÕpgÏz(\9ÜqµÕVç6lÁÓh¡ùJäÃQš\GþóTdŸ6ÝtÓŒô=VAÄ" ÂQÓep!ç>zjóÍ77t86ÍuôÑG³+ ï°^û¥œÀqOu?cƲí¿ÿþün.eÌÁÙgm~kouK.Í÷Ý¿üå/ùø°Ûlæ}Éb{
¯Œ<Á¿#Õf4®©ÜáðC±Ûì(üiôèÑXtðáHþÐCåI.]buw!ÂÑœ{w
Œ}žî;kÖ,ë9'ú4Zh,É;§~LV^yeZáj1¿¿ðÂîä-²#GFÌ ¿ùÍož=ÄŒÍäØœŒÓç.'ž`·nÝOLDÜèÆðÖ§OzBÊ1œ3»í¶å6,gpGð"RôJ¡ùJD8
U! #çH2ÃÇöÃØù'ßâ ÆŠÓzpEášÌuÕá@£ÐÎ62FDºÁðÓzð<×Ül!1 pªŒšA}&NxÚi§å^YÌ{~ÒI'QHLìð<ßdMÐàáàÉ5×\îɵ×^ËCìgýQó|¿ýö+>ù
e¯¿þú ,}ØrË-yѱyÇâØ#¹c¡Z³aêv +¯Œ\©ýà²ìdlü<ÇVÏCÇîåE̱5gaHdøRôïÿ{2]²úmÞ'L>D`àv¿)[ÂQhŸBD#ÈŒ0LÄ/6G?:tyçÞ'/.Æú«pA@Ã¥æÊãB8Ø?ÐVšf" ¯Â·ÞzkîJü"D$pž-2
4M[Œ°£qð;ÃÛIÞMªA'ožáHýocáàO6.Û€±:D²±cñ<÷ZÇÝwßmw-D8ØE"
p T?GÂáØBcÉK8'ÈlW¹÷¥±uAÑ,c÷òNŽc7Â'Gž¬YF8+!<Ç
æÌ'º~ #ÈÍf=Ô0òáh.u_ÙÑpTïzhÍ
pØ
fêÈx'l"vìK.¹ä°×e>lEn©Äuë*ø~â\bÁ9H;íŽSàÞK8 Lv¹JŠ£ôIDATlmqÀ8Š 6H7ÌÏY#°T[Í:+ÒóBm#R
©
g"ñ3F8rÇpÝ(>A(Q'"uì^ñ³pÜvÛmzzöìÉóÀÓ1þùÜsÏE²}ýë_w'a÷H=k®¹&õ¿òÝrX8AƱÞzëÙ!ÖÇŒ3€žwæ²*G"(.=ÅqCP=ânÁÁø+Çñl¢©BubhÛ¶-= |?s>d [ÞPèvÁNÀÑÕ:Ç©ì"éŠnJA8båNPqÂáÞ#±XC¹G*< v/cWÿøÇ?
֜{
jí4Âñ
fϱØåúÛqaqG0"Ñhl-çb!@ÆÏf]v é3Þ²ûYÖ2"pH<Ò\ÙQŠsïµvQímWÇ_ÿúמ¡yæ<,náp/;U\åÀs3bg³0eA±\¥+¢m<žaVù \}õÕáØ{ïœÃõcš7}ÆùŒ£cÒ€IR±Ãœ3F8"c)D8\&«y rìÞœŒp¹t#L8ž©Çž<æÞ5âñZñðÅïps8ô\yTÂdž¢
Œo®ÈxRÐG#Íf6cµppÅi míg(_3¢qðËAÏrTÜËæÏÎ#8Õ[st¬Ò7=v²+ܶ(D8xn}%é:RIA8Ü;p8N
(ýÕ¯~ApvÔR
VÝ ³p'd³$tØXrqÂA;nchygcVS% GRÍ!ÚÇ|äÈ4vJ²òXD8b!jºÅ ¯nŠú7Úh#!SRðRXΰéV<áÖh²¹3awb¹A»»9è÷ýjÛ@82)C<Á #R¿¹ñc¹1ãG¡MÚ"p&šû«Pv5>VDR¶Ü±8vÆpžO®]$Æu42X;}ùñܱ{¹p¹w²ÃØpdÞÙͬK8ì±_~ùåÜsc¿âHÞÎsç+©GÞIÜRq[?|æÍéüvÛmG?a]M§ø4àò# ÂQ~ë
pàߨ1cÅTsÆ$Â^î62¬|E§~z0V·)tÒ;ì<·0t€(w2×<ìù
Ã[;Þ|Æ$ž>¶ô³çôIDAT'ýë_ÚÉaħ¹à!·*ÖYg±¶
mÒ"Ø¥ÜðU¡eöüWRjËcgÜ ûä8ý!
£¥ñåôÁ¡c÷rrï;á@¹ä Aõ4¡%ÈæoYÄÉ®k¶£:Ê\p%wŸŒ! cÌ xÞ°ÌNBl-Hœ)0õ·vášÝ¹©VÏ|Þt1îýËöúÞyçQÙÄÀ³2ÇÎÅŸoB"p
Åšp/Â*±°ÄÅL/ûÄTÈ]VÜ.Á®žâüD]°`Ù$E,QâzÙ8SpK°È&Mkz .üÀ®I¥Œcqé;áH4AÖ40 àÒœŒp¹Ë£
VÌ]@<\nPo³Í6&®ü7pPü.<.!.¯ Iðñx"çÎW
Â[In€QaH&{Ð&\²JÂ}.^$x$|ÔR-E€vÆÓRGpp:ÀÝ942FܯàªFÜe{#¡sÙlëI(s&
ޢؿq7C,ºôÕœl¡qÑ)cÇ
FXHà
A§ ,ß(
Xð·`8vÁ<nÏÙ2±«csÇ$(²IS9>žÚSŽ£È ?¥BcíL"Âh8
Gž'p8.·Ý+¶{y'ÚœîžDe»
v
y,Ú<è!æŸWlö 1Û°¹{vî|¥ ¹äý<œÈ8ÌBµÍ€aª{±RušÊ@@C¢ø:p
X(žxÐrÂuXdqKîetEI.'ò~Š+\>«XyÙãí·ßN
æthÆöŒw^ÒÕ[ªÐX²íL¢ "¶ý=÷ÜÃ\"®{ºeàÄc[S×Äŧc|šqcâÞSñvÍco-c%. ³þΪíy¢*³ÈE@CR!B@²C¬B@ÉB@!PvD8ʱB@! D8$B@! @Ùá(;Äj@! á! eG@£ì«! B@C2 B@²C¬B@ÉB@!PvD8ʱB@! ªL8N?ýôðWõ»B@ÓyoaôIDAT!»gÝ1*ºÃKB@! R Â4B@! ! Â/åB@! R Â4B@! ! Â/åB@! R Â4B@! ! Â/åB@! R Â4B@! ! Â/åB@! R Â4B@! ! Â/åB@! R P}Âqûí·Ï·`àº#;tîêymbÈ+Cmñ;îH!E0;Ì9rp×®Úhr$| @fä)ÊV8¥7N
cör)_Ì;rðà®:IÄNpZ¶'Û
"imÕ$·ÝvÛðÑãº
Ýfœùyz§ÿO?iºùc·£ôÖ[oM*¹ùqãFÝïÂÇ?ôÐä¥Kgþïóô#"ä ?HÑšQ}šÒ
Sz#pWY+_5º_¿Çhòä¥3gþoÞ<ýÄ"PÀh£úöÀÒNéBé5Tp{¢{
ô&/)ïâq_f
sòÞRcÑ¢ãì¹dÉVIwåE@¢+€+µpJoTTa¬LüÀ=lµUìþªE@`ÌÔ§F
VpÌ=t¡oSI£L,gÑÒÎÆì°ëéláÂC4DÊr5fL=÷Ü%
pJoTmv*A,<€EÈ€
EÇôé³ç.iNµVŠ"U Œ£°z?©Ââ)Ó_կ祰sðöÉ~ðÉ'³Ë±ÙšN!HÿºÐÎ!œQ5
Jð:ÎùÉìÙ2]d
`ú§í&çù')²mT£,Z
ÔNþ,Þ²mdIsN骱¯ì¯Izöm#+ªÔ€ëŸpÊdšH]m¥ .òÛšîŒÀÝ
>ùm{¯UýŒ9
§ôFåF¡w¡$Ê'GùmdÎ6¬B^Ç
SkÙ*J8žÅê¯
XjŠ î8Þªbvž¢íPTîž§ôFèLGeâk~ýʎݪZàÞË©5¶A*J8áßÍžzàÀî"yDJàîbÅ65$7€.V8¥7jDS9*BGpSÌ |/ Ç.ÌPQÂ1pÝQÞŒkdñ4K7æ?DL0É5jÈNÖ.(*äËôIDATñ9 +Òµ¢¬ÜÉš!C<¹|Ûj&>1ÁbN
fš(áðcÊ]ŽÂEKÝEò)wÑíµj7€.V8¥7j
pž)BdÊ]ެ¬x9váÔ`?ry
·[5^É#
µvA!PaZ€.&IoÔÚtP&å.ëv«ÊAÀ¹SE;íûš<n¢ÉäTx³QsB Eêb ôFÍ|óÁmŸÄ ÊËÂ[XUø{üjϰS"Õá[:Â÷áÐÇb*ÞÞšÞÈûjä Lü9Í"¶Š*)ËÂÉpïΪ*yu(åÃAGpÈØP\ôŠÈG
KȰVq
£*;n7ê¢7E8D8D8D8ó)ê(Y8*~RÐä4Â}ø"ÕÑ ©í©ÊDG* G.'ñ]þ²pÈÂ!i[?UAÀEoêE¥HGmž§ž,òóÄ-pppmT
œ)Â!ÂQA}5á²pÓòááášÚv[£BM5ê¢7E8D8ê
T ·.§üü!q""""UCÀEoppT`¯¯&\Nb:Pþ"""UÛnkÊØPΞèMúbèËÂ)?HÜGÕpÑ""ØÂë«
¿@c_÷þwôKõø7ýõ|úu»à ¿?JYCæýIt«ÍÁ±Œb¿^ýÀ¿ým¯^jïÓoŸ9>ÿüþUyœnF#Ö× \ôf
GUé!ùeñ')K=pÜZtà×ì L*s-öõüÛ^{œ4uª
7§OçÏï¿jÞðØ)ÔðÉìÙVÃ[-þ«
S÷Ä¥ ËÂ)?HÜB¿æ+©
f·.¶.õÿ9trúµ×y¿CMYCæý©[Âñµ¯m³g¯kûâ¥Nä'¬¯mò³Ïæ\pÁøÿþwF-t;i-tÉœ.z³B£*Ž}gtÿ#¥b)¢¶=ׯyÄŽk®ÂñµZ4ɺëÚö|éÄM2p Ën7OçvíšáûîkýΊòÏ]H]aYº,Ät üD8ÜTD82TѶ1|øÊ,ø·ß>È}g-_NlöT×Åá(ppTÔ£ÇÇÏöß=ïwD8JuþpyQ
#
£
#!3X8^9à?î¶ç,e5T€®Üeá@ÊUTCCX)§ôIDAT#Ù®)¡µÆEoppänÌå>RIM*SÐeá5PoCßõ¶¿Ð1Õu·Û÷<þYÈ:zêçÞ×ycæ{#ðpìpw#
T}ÊÛê,oØoŒýoöNû2.š@\A+hFß}wÆ
:uòœïmÎ?Y8>ÿ|Îu×m5þÐXÇw7Ò+®Ø&Ø{lÊ׿>v¯œÖ;wœoÜ
s÷Å/¿ûl{Üq#÷Üsàá¿ê*¿Kl_|1÷ж?òÈõ÷ØcàÁ¥3Ï<³oç®»v=÷ܱfá`,4ýÿÈ_yd/~ÿ¿ÿÛâ·Ü²#M0júöÂî±ÿû>dØ{ïAûÍovL×7JÅBÔüïOûö·77oœ}öDWÿüçIF|p2]ºÿþ=_|qê¢E£q¬¹ùæ S6ûîÛü¿ýíNoªdøÝïvÉjXU.z³,£bôø·Œ}î=ŒUiÌx9ëÃqêÞ~7yãôÖÛÃÛè`_MþL%û·yãnQzßõhm<àÖÖÌeáxwÆÇºÎ:
òœÍ7ç
Ççsæ\·ÕVó=`upìpw#X8ð¥Å_l¿}@ Ÿ;÷Ší·?rýõ÷8ðà¡C©ü¯>,Ï#-Eþ<i§K¶ÚêaʬµÖâ
6pï;YqY8%rÂö«ÙÐz
ó6ãÿq]koËÙq%oß_8œ=áØòto
«aÝÝœÞY®Êô§ÛØj«µøÄ}
ë1gÎzü+â4ºÍ6}wÜqpÎVêð_lﲜõêÕ¿üåö:ù>_+¬ÐÖêÙn»~ÎñÔSûlŒq¯åŠÏóú÷_ñöÛwúðÃYm¶z$OçÎí.¿|ËsØaÃ#e{æ9x~æ±»3ôîÝ
bÝûwxt.}#¿€Ví
7lÝ£GpmÚxG±þGÍ
Úœøâ d8å
×Z«å$TÏÆrÆcl²Â æ2)îyš<V·ùH$ð±+¶H÷ÿ×¶ýò¶ñYBÐÃá8ùCoÀfÌ=òì|ùr,ü·×ok6«ÕõŒÝ¿ïÿ2zFã§N]óò€G9ëµhåF·éÛwÇ5×$:ICœžÓè³fm¶zfh×îòM6 êäwºtÌÈÛõëÇ/íÛ°üŽBÛ¶wî²;pÉé²pbWVå3įöûœâæ÷ãW;ÝFãôIDATd7oþCÛŠÜèuYµu)n0k¹[*<m»·ÃEÞÂ}·pÞ9Zt¬_0VCá 1Þýï·œ©¿ñº÷÷¬;iYñõ'¶Ãá:=sÛ1þDì¶ÛÌÕM¬«®êÒ¬YËÝRñ×ä
m/ºhüË/OûÇ?öeWó'ŠGÁØËGûöm
lÛ03¬·^{ìÈ 8/îæé¹á«òŠÎuÜØ#}ôÑ)ËOÆíEÓKÎÄpüñ£¬3Ï>»žÐû¿L²Qüá»
®]ÛwìØC¿óM×^»;ÙíÁC8Ö_ÿºæ=Öh`Åqì#€tAzÚiþóû1XÔŠáÛÁš<pð!6m`,Ý»¯ÀpÎ9gcÕþŽ;Sf£þãw÷T«aüV |ñÌ[€(ºxmÚy[á[)ü·í7Œö-Ku2B8&çÿµßX_)-ZêÍ{ÐÛäøÔa϶YôA«ÒŸ¯wÔþÚi¿õº®îµká
G8>5k̪-dÀ&Oæ6ìÛl³j§¯4ÉòÃû¶m/?þåiÓžorøðMâyÝÅãF¶h^œšjéÌN|üšÍàyÏî·UnÑ¡mÛ+7Ûìý3ß>è ÓÇ!ÎÖÎá²pbWVå3įöû±â`¹nz_ç<ìáö¹/X8rÇ€kÓ\f²kŒ:3ÂÑs·øãe|Îg0€¹÷·>¬Xé_9á8é€Ñ3aBo@°ýrÃ8.ážæ-»œ[ïºëØËÇ:ëtÿäÙAæW_=Mç÷ܳ»=Žþ°÷³»ë9Óßþ7Ùd5N[x>j?ѳ-¶èC+AóúpUôýïoÔÿli÷ßíà!Eáç?ß.Qß!ýôÓ9C¬Dý]Öj±V°ŽmëÇoeWfá EÀÆrýõ[Ý-·ìCfxI쀞g ÂX
ãw1ÀÏ\±EÚÕËÛñËuÞDïõóÕü=Ìþ»å¬¹
×¥è®ÍNöó ôÂÃ\ðž×ŠÅ¶Ç =o#FfXz÷æD#
wñ`Vážf-ÂÜÂ!.·[Q«Žhå
[ôéÓ«S§ E#€«ïÃÑ#FðpÛ~ýbI{
»²*!~µgاÊÌFTÇ€áXeåx E`N|/F£áØãÑlê2aôIDAT£ŠûÏ',l}^±þ$Ò¿:=sÂaÁì@8Føjbyt!ÌKÈüÜsûÙÌŒ÷^L¬#W_œ_¡Ü/x±ÁjðO"{!çìÁüÉÛnëÛB§OüÁË"}+B8V\±}žþýkáç÷ððK&&ê#€·Ý¶3QšðÏÖ[ûvx=4Â#ÍÇê«w<?á;ÄÃOÄæ€ÂX
ã#Hàg®Ì"Å£Q¿¢Ð1N`·;ßãšÅÞ"AÛú¥Ð*1QߊxžÖÖ~}~ÅdØÞ-epØAÆÏ·Û.²ãHÁóáX§{÷0/¡Èsû}¥IfÌ(Ÿ'Ð_3üÁ¬Ya¯pF8uëIøù«éÒŸ}ä¹;œÈÍé²pbWVå3įöû±â`íáA7DTÌ6_÷GÇúûçQ[zø9ç=àÿ C.WáÀtaã°§£5ðúB
l$Ùö'+%ë Ó3'êÞÙr`ŸXp
A~sAàà'DÜzëNáXN#ŠDÂaÓWËûâ9/ýæÛ×uÐ ßÞ9q\õ'íÐ¥=öFDÂ?EÇúë¯ÎI»V[€Ýýö[!%ê#€ôÙÉ!+ñKäg÷Ý×äOSŠŽ2#lÐ3/áÀ:yþoù±š$Fžg ÂX
ã#ÕZšÒÀñq¢xÏ#vKÅ UvŸlÙIJPO'ÿd0.â°Ôpc¥-ä«c`ëýúØM²Œ
cÿµ×ÎÝ{ŽÔðÀ{ò§û÷ÜóÖv
ÿðÄ'8¢¶jöí±\¶É&ÁIJÄcßArû`>(Oîœw)$#\ÖeáÄ®¬Êg_íö)cÅÁù¥¥ÜÀÀ¶n#cfîâïÕâh¯xF/VÄ.]öþÿÜ€÷'+%ë Ó³%\Í0 ÃǶ Ù!øIänQærñÓnËð*Ì/ëaÂaá.\PJxøôÓûð;
y¯®ØI»©_²d+<=ÃÍÝ{+AåEÇÎ;÷ÏK8ì&KðÁ¢~#}sû5Q1^þßÇzbS^ÂK,žóBþú&/ÒBJ¿
Rl ÏÜ[*x+ö^nÆVíß[1mÿ%<<"ú%Fj,ÂñÂÔ¯4ÉWÇM×@pàW»£_¹El»-«4ªIúöu!äáâIï¯|G¬Ñ={ro%B8òöaÃ7Žô!jËpk®ÕÓ0«ôIDATXUíŽ?EYm¢ÔócK®EªÝãZÿyp;"Oë+
ðsÎŒÇÿþV8{Õk_ÑHC®ö£tÊѬ°rÍ N¢P~Ü-ÙÝIoœ5=çÚk·ôÕÄònOäV5`@WrÆCð
ÿàz&¹A?øC¿¡í·_l¯Œr)Œ4Œâó§ð¡±D¹º²pá#=$\OFRpLŽÜÛ`á(B8ûæé'ŠÃ[mÕó¬Œ?wÜÑz+Ç7uóÈXÈÓ£bJÿPg»,ùÏŒo÷jíušEœŸÕ¢d>huPyDjòc?ccÜ3íÖ_6ìÓ×nÙ¢I·p±þú¹Ûù®-d÷ÝùÓ!CÖëÑ#üÃ=[GÂA¶ÏæÌ¹}ça$ŠebŒoMh5ØJÞ>pΞ1 Û j«KȰ¡vÚ¬6Q«°$|¹#ÕnuŠÿ<B88ãd;åSßtÌ«13ÂÁ'Ü"5lqªÿÀîO"ÝD³E³!ÔÃ
X*ä²F€N.újby»ç±U·kç»VàþYŒWv€bwSÃ?gå7ø+à©À?ñZÍmå}k#âúÀ©ÙWð±²Ù*tì#€0'zËEØÙlFÂQ1¥aöîÐå.U¢eì~UëkR®
#Úób3¢¬:޵ªî-×>gÝÙŒDp°³ëÑ¢Ir®Ùò-áØ;ç8ãÓ9sÚµxªãHQ|³ýÊ!¯UªâÇì%C{ôK"
áVœºÁÝZéKLUþzHŽSÆf6Íðœv°bWßÀ!8XDžÌÂíÖØpðÖÎI1QIš{^±þÄv8¡¿K9úèámœÜÌ ÂwBäòBžÉ»ká8ùä
Â9qó4/Q;á{(¹ýá9Ñ>xεU8²©³ýG\.îœwwËå"Ýâ7ÙoÌÑ2
ñodsºô_àã¬Ú·oÓOc4)ášÌ"ÅßÄûÌÿ\NiðnÃ[1WXÍQ=L8®ÁT®ÑpR»Ÿå"D$/9ÁJç2-©á~þÊ1"ŒU³÷oгE,oáÀáããå_ÌÒÅcwú"ãßÓŠÁ{º¶o¹Úzïî-¡m[,
£û
+Dì17líûù®¿òʱ}pÏ@
Û¹³k©¢ö×C¢26ó¬?ùKE;ãËjæÂRîµXn®Ã¬ZnÆ[ ì-Ê>ôIDAT=ß+#èîÖ[qhÍŠ'ú{®ÛªxX±þÄ"SmÂAäÚr7` ~¥ÍLîµØ}÷8XÙÓFp,âH8ºu[!p#¥A«üŸþÊï¿?Ój ŸjèØÏÓ NbTpAçA<«Áýr¶spâÃCBíbq5'¥ÇŸ9BJžHB÷ÆïMø v B
i4)ášØ"%ö1iðÎË®džïNŽìËÕÇ*þæêííZhú°¿û·ñÑ{D
9.püi÷Ý1Àþ°ë®Á~L@ÏVMs-Íà2@¡Ÿ&ÙrËØœŒž
cp÷Í0dHØÎÁé¯ÖX#láà $É(Bì<%r_7¶?Å3Pav4 r5UŽÓŸ$Ú)]2p{Í·íì3B8°IâóÑ{7ñXÿOv?eò'4mj4ÊÆfü{ð$É#æ+Ód<n¢Ù"Á©PY)Ø!Ƕ ó¬ø|±
¡ºøÝOÙi§þ¹;s{h¡< ©Ã®ä4bš Šž/)mýXd×$ÔÝûÀr\|å`ÅŒO(NOeúÃW[Í|Â%X~ÁþA¯J!wé#€dÃÃt5|=8ã:«Å!
¡5)á`]TfýRk<Pì wôeÉëÖÏ;öµVM!4¿4¢'££ÆæéÐÍ;è®eÊsë³ýOîåm~·¶o¥kUh
G8ØwÍJA@-ÈÂí ÃŒ("N7oÄ*«;r$²û);õï9
É»'¿ÙqGó&០56|žQn+¬p×WLÈ|80ð_âv°ì²JÇüóÄÑ£KdâÔY9]KíŽ?]vJÇ̰û º(Ú±×
~[ÐæüÙëúÖû&þîê*Üq/Ô¢ÔkÛ4©ïFyŒ:š¡ýqDƲ¹fK¶, µáhDå¢)ŽH4 m§1ŠVYÅ_þíÚ³$úE¡Ÿá øþ¡ÆH0·ûŽÿx³ÈÌùΩ§nië-PÖm¹ úä{«â;#úh$,¥jpé€ÖO>¹a²èg8W
ãh^ÂQ±E?;·ñ-š%(BøN¹>|¡¢ QwCjNŸÉq±Ò#9®5\€QÛhqÌ¢ÐÚaçÐæD »~ëm'±÷è3£ÐÆëÃÜEjÖôIDATqó;@eÁîB8²ðMW#Ö\Žr×±>À<\O"FBÍÙÑÊÕTÑNûð'Ú)Ý3ãqð#~8
;æ,òßOó9RܪøìÓì?ç¹±ÎYÉþÄ¢ä&-1á BûÛ¿9@ùÁñÄ{ÓjXUF8~Ø÷Nå{ñÜj!ÜVñðœÀ,{±%\
gUXþ¹7{lÔóÚkžaÜué;€ Išø»ïÞ
cO"TÝ;\bNœY.œQ±ER:ä1oÎ}ñµ«ù p{ç?ŒÞ¹åK¬ ßyh_¬G¬ZHÁAøsÑåÏp=8gðu4Âi§
Zawbïœ2Åj$ê-Χ÷í±ÎùB[€`@8xNøŽ=œå¢M¢ú3»,Êñç
p€[<MRÊAGd£ÄM(Qñ0áHTPkœY.ÂÑ`Ë¿Ñ ãN\ÅlaÂQînž,gP¹"EÍ!¡D8Ê`¹©
ݺúà¢7E8Ã"e0«$â
"±ÌEC£UHÊt€RîMQr#\ÖúE8ÈËGì_í""õM8vÙe16žI[Ö}Q ÌWoúoâ{rž°ÔyÌ¥eòáHdlšJæm·Ý&«hZwY8ÕfyÚáášoÂQŠPÕVœ©#òrDäC£Úvc3.G£l·TfËì #ê×iŽ2û¢Z).zSC£6újÂeáppTà "Â!§ÑZEÀEoppÔš@o]Gö¡>Êôòj+ÞáášÀ^_Mž,!°œ)Â!ÂQ_l œuY8"""Ún
G5ô@&Ÿkç³M{K¥<#hB#NéM¥:o*:BN£8>P¹žèMéêèŒÅApTyž,ø-¹â9t-¶n_5ÜßWtØ@UpÑ""ØÂë«
Sq:ß âpè£jžèMúbèËÂßÿ+£Â£M
wAœçôÚžÈU6eùZlUÞÕhœ Ð"u1Éó€7jæœÈAŽ)Ï×b+°×Q>Èu*Úé»zsTEKÝE2»víŽtéÌzÙšÔÏ@yCêb
Sz£¢£Èû2éÚ©SŸÉ^G ¬]^@]85¡¢cຣŒyÖÊâ©w»
cÿç?4pÝ.7jÔÜÛP(êôIDAT/<ôÐä#Ç
§ôFèL7e2jÈ'O.ëÛä?4yòÈÁñ'veU>CE ǬyÚìpa,Ç
»Î³8°»Ös/Œp|œìUêg Œ!u±Â)œQ#:ÓQ,;÷ÂñãuøÀȱ§3TpÜ~ûíÝ®ÅÓ$Ýp`w<²Ý¯¶1
¡^@Þ\Sz£F£2ñ5I¿~eÝqŒràuY8.j¿Ây*J8ÛðÑãŒÉKjdý4~7&/pw7nÔ%[ÕËv¥~Ö5Hòæ(ÒÕWVIÉžQ£lµUÓ2
`×qáÔZ¶JÛn»mÅ^å:Z õ±h)Pž»ÌyàÀrëŒ.:!iîÂ)œQ QÔ]42ñ5IÏrÍs)Àº/wå_&êØùëRå%TçÎ1è-þ€ó1@T-:ÉùäÙu±o©õÒ5fL$-pJoTMaŠR&oÑ$³ggŸé6m
9ŠOMŽpj*sãß~çI]M£\»Çwø±ÓÚ€I;MØ_vzÜËk¿ÏÈÿº±øÂ)œQ.QÔ¶ZLÚi§ýûËÎ CFáfá€Xke*RÂavÿlEþZ&/ض°ñöÅ[þµ¿×W(ä*©m#,Òå%+^Ç9?G±®m¶«F8h(|Áð|öïÊC1ÁR ÷ 0&frÂG%øôq»ÄçÁ£Ÿ¶öÚé-ü EÈUºpJosdL|M2j+žÌI|<É@ ŸpÊdŽHTm5 uë=ܳ'¶OÆJhtߢB"%D¡V@fä)ÊV8¥7Msær)_ÌKL0BdJÄNpZ¶'?È<sõ GæC*w
¯ŒòJ>}.Ÿøâr7€úë]wÝõú믯»n7aÿð?ôìÙÿ6äØñ_ôë×MÕ£Ó ê4s÷â/®¿þúvØçŠŒÊ4(W_}õ)Stp3¬Æf6OçsÎFmôá6ÎŽi$õGÊ9|ïœ÷¶Ûn;ÞhßÿýUšXÃ!ðÖ[ouïÞ]ZŸ'¶Øá?uêÔ}÷Ý·çB}k6D8ÒÏøg}6gÎÑ£G¿üòËékQÉÆB`m¶Á ÝXcjÑ4Û`Î>þøãdyðlôIDAT±cÇyæ3I# ÂQê{î¹k¬±Æ#<RjE*ß\~ùåx`C¥ÑÑTlÃ&ïµ×^ëß¿ÿO~òFK§>áÈ`ÞXÏ«®ºê-·ÜA]ª¢ÎÀSoåWþôÓOë|Öý&d6
Œáûà6Új<uG6ö׿þuõÕW¿â+²©NµÔ3'NŒõÖ[ëyÖ÷Še6ºŽÒh]·ãáÈlê{î¹!C,\žð/ŸÈ¬RUT\pÁóæÍ«Ã7fmØ€}öÙ\Zùè£s5ª:A@#Ëzçw¶ÜrË=÷ÜS÷²µÞêzöîÝ[Œ³æMl#
ý÷ß¿ýö«
IQ§ÃûéÓ§ó2»VÆU«ºúA»Kwß}wýô·1{*¶W]ZiL)¯«Qpeºž6`À'x¢,µ«ÒGଳÎ:òÈ#kŸÜA±ÜÙå-+u?ýéOyâ5¶F@£\Ck®®Üyçåj@õÖ0pM®#ÖpŒkb
&K+«¬²ÊC=Ôà áÕ$"e{î¹³ü«®ºªmšêZE`ÝuלÿþûkµwÜ/±â³ûóÿ;ŸŽÒÈk VÇ&ÂQÞyægÖYgN:éË/¿,oKªœÆ`ÒI5Ö©ÆïØËëÒJÊ9"CðÍ7ßÜdMøšî€ëZjààt-õšñû"¶á>ǺŽârf
GVH«ÿp.€ê7ÞšD{j£6ÀqøñǯŸ4~/Ä6Í1Jiã7Æ»9Q)e¥ ÂQ
z Êr€ròÉ'4èé§NPLYë£:JΪÌm€ÀYVRŠ"¥ PeÂqúé§{JB@! @Ø=KÙû«R¶Ê£*c®n£wÝuW¯^œ®»îºêvCW®¶ÚjÏ>ûlÚjÚ&dÛ(q깎ү_¿W_}µÄzT\Ä" ÂQö|òÉÖ#?ÍF¯qþüùç~£²jãÛÈú¯}íkøsÈ«=0UID8ª#¯¿þúرc<ðÀO>ù€:=P«Aà¶Ûn0aBEjºFÄ62rŒÚ¹·a
ªJä" ÂQ5©ào|æmóÍ7ûí·«Ö 5\fø¶_~ùå2·ÓtÕmd;å7xÒ¥lQUmD8ª)\]9îžã¬cþjNCÛæc~]vYi®êÅ6Ê1ß\ZÁã75#ôIDATg?ûY9*WBD8ª/W^y%®
÷Þ{oõ»¢nºië·.CÅMZ¥ØFù&þáîÙ³§ŸŽR>Œf[oœ«+7ÞxcMôFÈÕÝ»w'àlе6iebåx]Z)7ÂÍ\¿GÌþ£>Ê÷EÏ9çZéúSŠL¹úꫳ«¯IkÛšÌÄëÒJepnÂVD8jhÒù~ãn8{öìÏ>û¬º¥®À
7ܰË.»\MSW ¶QÉé×¥J¢Ý<mpÔÖ\/]ºt×]wÝfmÞ}÷ÝpÏœ¶æ)aožüØ®°ô·¿ý-aÍý±Ç-¶Qa àÈ:¬]ÜÛ1ÁVžj®ñáš¹9%<åG1tèÐçÞ:oaÑîknªvèŸûî6mZ®¹æE.;ÒŸÖZkvÚi\l£*Ó3^c5žŽÂþ}öÙg-¶šJ7Ôh#! ÂQ£³ùo}«O>Äožÿþû;wîLýßÿþ÷5ÚWu«(7,YBà; ÊX"ë âÞ#¶2dONnŽÑFLDÇ4sBÚñ_ýêW¬öŸ}û·vûª@à©§8F>Éô¯ýKGväG
®ª ÀÛN ôÎS)h°FE8jwB±dÚ»
¥®]»âáQ»ÝUÏ
ÀÙš,µk×NNÁÅ
9GÚÃ,ÍÎV*@DnÍB%ñoȶD8jtZ9ÃæÜ4òf¬³ÿžn
ß×\sÍžìÍþwä<÷3ÝÚí*)x©ã7¹qTr
²-V|ÂYÞ׌|ÎC·pÇ1{&1- lu+ŽÒöÛoÿ÷¿ÿ=¶¬2d
ï<xÒp¶X䯶M[GMO=^Z¬yÞí|ŽiÓæ¹ç«é«s
0o4ž@*
FL«®ºê'Ð*Ê'\ØPALü«8
Ðt³Ûo¿}þüùÜAíÒ¥K®WOÊ<øßqÇe]Kå²ÎcãU^&ÉVQTÊ4§eU\WyóÛn»°ë¬³ó<ïŒó®»îº(U0yð_{íµ>(ùÓ,WvJ€µÌ%SrXuÉÈ|N3WVÍPaO<Ë~xÕ:`0ÌóáªÓ,KºJG tÉ>ÙÖPúfšŠªªf$H=4²]Ã¥×Æ<x·ÝvËdjKÕ`"i?ôIDATÃÚ¢Ræ4Õ4áàm]íú믯ÍeÐäœb^à¥Û94ËM.H?dJ3+L7§ÍI²usNR±Û˶á¢ÍŒ*f9*ÅC³ù€šB³s$LÉaíMÒ9ÍjßmÚzpà(¿Ú×Ì3zMjkëŽ$SrX³hNS+%4pp';)u±ÔI+«YðGÉu²ÜqNEJG ñž€ª¶2!ÀL1_)ä[³\ŠQµ£dJëH`ç4
:RMD8\xî¹çÖÑ2hæ®`)«f¹ÅŠcwLÉaæ"«&ç4
:Ræ%D»hVKŽÜõ0SÌWåªY.÷Ô4yý)9¬#9qÓêHEppß²ÖºÊ|¥X®eIN¹pLÉa¹g!Ûú]æ4
:RlUµt*@Ÿ\ó¡z¿BÀE2%õ%/.s*öP:i^"Koµ*5H4
Ð,××,×co]6'Éa}ͬËVeÛj°FE8êk]4QoÓ©)ú&*
ÕE2%UͺÌiíýUGJU±r#NHÑ{^T¿dJëKN\æŽ*;t5*ÂQ_ë¢zNHÑ7Tiš.)9¬Òä€lÖeNlï¯ÊpD8R
št*@ŸÜó¢ú]$SrX_râ2§UÙ¡¬QúZMÔÛt*@ŸD€JCuLÉa&'e³.sÚ`{U#ÂR@U¬Ü€SRôåÕï"Ãú9ÊÝ`pÔ׺h¢ÞŠSRôM$"UªdJ«49)uÓÛû«2ªbåF
¢/÷Œš~ÉÖžÌiUvèkT£ŸÖEõ6
¢o"©ÒP]$SrX¥ÉIÙ¬Ë6ØÞ_ápŽ
(ßï¹ ']~ùåÿïÿý¿"\ŽØÕW_MkÔIå^x!µ]ýõÔ®:saùæ7¿ùï|çÆo,ÔÜe])EøÃ&ê^:PyE"Æ{é¥^{íµ\§Y#öc={öé§~Í5מ.\xÐAñ%÷SN9¥x³L+Ñ¥«<.Yy9: guÖ9s:ê(êüãØ1RdñâÅLjgR.ºè¢âKû»ßýnñ:³Õo±ý/=ËVen°FE8ZeõÌ3ÏDærS
ŽÏ>ûd«ïæÎK[nžaéK
è$µ0mŒôIDAT¡ô3©-\ uæ
+¬°Â6Ûl·Èmtýõ×Ï[jÕUW=ztu®*
šŒ¢/8pàÌ3ô£e>5V!ÛÉÌeØC9€sçÎéîÛ·ï7ŸñBy䬩HN:í°Ã¹;Y°0ËÁ§Óáà"CÆòœï}oøðá`Q;íŽS!ÚàÛn»-àGJœöÚ0BK{=ö(]®~«º ï°Ë6ØÞ_ápD Çꫯº$ñKÏ=Û·ooKqüøñnuG8z÷îm°ôéÓX
Õ¶m[^R#ÙG×®]âݺu3$ùr÷©§«ëÓ©Ê+úpJ°«@x6ÙdØñŠÈ_c5²£Q!EE`âÚ~ûímNÙ¶ÜrË]vÙe =zô0>zØaEC ©V€{÷îl°Á€IØ×[o={žÊ*«sÎ9áR"³Ã[yåm};Tzذa,¿|ÿûßTõµ¯}Í&UŒÖZkmµÕV{íµ×fmÆÊµRPÀnž!\ÊvRÂQ]Au0¶©Ê]×pD GäE¥9°ãàv]<uG8ŸýíoÇ
œCÌÀÒ®]»Èël!ÄÒ!C(eE)
TlÍÙfG"Zá8 Ø_±WgÛ.µ!«¶1Tå컜¬ñá¡ÁËÙíllr;uj¡ïç{®m~pÙ0"b3bÄÐÛxãðwÞyp;þøáçlŠ)Þ¬`á?-Y²$)Š2áÀprÆgpjfe«+š.ŠÓ6uœ÷W¥ó"1ÃþlÛÙEv]òÔ;á°1B;ÀdúõëÞ?Œáüa[Îùç_št* Š
pðàÁôNÁH§ºzããÚqÇsûñ£ÿþüuÁÁ_ÙlêþŒÃ¶Úá òdáp HŒèrÍ?úè£ùS¯^œr©lZÛKcÍ~9AGG€Âê
ªéŽMUöìºnTÃpà
DbuÌÝEM2eÜžqh^L ÓtÞÛðÃB^qÅ{î¹çÖ[o} '°üò^ÉÌ ÅUW]nšxä,äÃQ€ zÜÄrGé?wÜqü©Èë»Ä;ÌÌ?@äšì}pì»ïŸÃðxQè¿ûî»õÉɵR°müñŒkÂê¶Ûn;|AÂn:§vÚŽiÓlKØo¿ý²°ØPy|ÓM7¥ oðgŒN2¥MôIDATd:zNÓxäGÚÂ>nÛh£È÷Fwc0±Ñ=«VÃe¿dÍ&%ôLn~Ò:ë¬=°¿bö0°Bõó
a®6cÆq\ÚA¶°).š4JÌ#ÂQ#ÂáD8PÜHdääýn:48ÈÛ'QžüQÙ0fæìÒX§É`°x\ÈK8b¢h«cǹï7öf3cÆÂAËÏ袟õo·±X?Çt*R%ª€Åc9;¹;ÓCDr8f
M`Ö<0KnX=ÜH
Ñ3V$N+fÍÅ?ãA!É€æXá±Ð*€Kì.± áebÄŽÈG%ð0³óï¶ÛnV§G,¶Í8¯4.Þµ0]2ãÑ\ŒrX#ÙžÀIÈÑÂÖoEÕQÒ\(1O:mSMºZá!Œ ûxu`?`³ÄÎK-Z\ y¡äÀ+SÁÁ{©uÜžxžùæãdw¡á ³R°+$m"pžô<Æ?üððZe èœ.ÇîŠä!QÏСCô ,}Ì{bD:PkQ0^AËlÈ<1OOfÌ;&"`Ø!x·m È/£BÞøíd78:ûì³í Fo²ÁQxÎIrRØØ1Va_±Â+.ÂcÁjc,u¶iÓ÷OD÷K.)4\|µQÞÌæçÙá]#áûï¿¿!ŠÂ*Ù ïYYwÝuÉiºšHB®¬ÎÀË;á($šîtc#íë5;&B*"ÁЀ¶ÞØ!®ŒòÊpñC=çìÙ7uóön%á
³©'L8XÕÆ6æÍ¢ DTû¶÷Þ{Ó(Öp£ô·á²PK(A=ŠØ>$û<7ÛIlJ§Ïrl£)2Áp1¶o?zöäO¶í(¿ZÈOðzŒrGçìv{Í5×+zëµñ"ÈRÞ£qø1ÉŸÈÍÃìg\Žª
IŠ£ðX%phIž%.J°q2ñ µjÁ!6,þ€¶²¬ Y8ÜesÁk>Ú,s,jJðç *^9¯VÓg9SJåÔDæBºéŽMÍîë5Û1Vù,ÃÖû%ñð
1»mØ·)ê1
kjÇûÈ2ù9×ÙK:ÈéØù#ñ wFlNv©Ê^}ÌäB8ød(øÃaÙ8v$ôIDAT1§SJ§qR*Ã'|LÕà!±("-BPl·0]:Øb-Ìna)âýWÛ¹{îÅc»9!¹é(<Atèöà.¥Í2ÃWl!ÀbqÆãÔf9E8bg@x8ÀÍ
sÂðð`Ùä°ßU¡VlZËk#©€%Â!iætÚŠf÷õíG«dz6xœ%ÞyÎb³õ¥:ÐþU·18G8ÙÜÅMÛÍ=+5±Új«Y@LÓá}ÅúäØ9#Ü ©Àä`ì
up!v€@°ÈZÀ İÉ8ñıóó' Ê
ÒÑéT@íÞõQ©Ø-Âkâ{áÛ!Æp~7»É4d,7ÆZ.á ~3&qRÁÓ^(##W2Ý
'R?ûVÙ7Ó ²mc!qÄ6Ø`6fá:€»f8?+"gç aËj\NáIl8
.¿XÙÀ»(CÂZÒJ¥PÙtÚŠf÷õíGpäu¹bÏ0ÊëK£ÆŒÉãpäÞ§5ÂAâ¥Ö gÃÁœáHTÐv5Þ¬i;d ß×w!(5JaBê_òCk[×Ó©JC©3º©º=DòÝÎ_·If'âû ?;]æh.5À9r;Í?EGD2 OLÞe7wbcãÌZp&E82dÞ?ŠŸÞ`I¿¢B
1ŠŠ0¿Y¬GV DTNÛÔìŸ^³áp"d²h
æ5ÂÖ!ÇH¶Dpä.l#l¶#h¬)Áúqo"B8$³]
°S^{ÃÆý0èá°Ëÿ
^îÑrX}€SU$y
ýÌÆÎdÙÌÙ`áA)x Ä®»îj~ŠFK80'¹ìÆipD$Ó]x0fp!6*<XÛ«j³µ°í€ÆxÍ¿5°ºéHÅeOåÛžÎH€Ñžà]Â<Lñä(NúMMaßu\ÚA¶S|® ºKËðKÏNÛÔìŸ^³áp%Fí±[óÏ,Æ
$Ÿ8៥b®ŠØ9Ã+MD{߬ÏÖ4ìj>W*Âc%Áí°Ó@ñ× `)ŸC§S5N8ÀÖÑòz±¬žâüé€N²)|Ÿ#ãeÈÕã±óµÜžjŽ£8áp³ò~Lzd{«®¥ûÂ'"§t,@cêÔ©äÁ¿58ápÙMsI€Šcº&ôIDATæF
®¥ÿÉL¶ABlxbV^®Âñ5Pz<ÌÊÂá.i.Ã/=O:mS³ûzÍvL£UVë5^Mïg#÷^ŠcvÞGí3T£µ3È%î)KÔÚåTÅÎS"F)N8x¶7ïàPÆÐ,®Ì{1+We€SµO8Ì-7rÆðqÔå9F/ÈÀF|E{1Åcöp|I>úÃH<.rù*p8
SoôÝ(ï[2*å¯áè#È-"3GNALº
æ äAÃe756€°y2(|ÊI Ú>¡aC£]œfmâ3dÁàá/õ€#yÕQÒ\_ztÚŠf÷õíGp !øx7Ø¢Gàå|ÍW»SŸ]vT빿8§¶ðÁc¹Ãœ
ÞFA
Eç¶Ch
*ÉH»1RÃkÞŽ÷3"ü©âEÖ\IžÍWéT@ímÀÎÊÑRfóã)ìXÂvãjáÌ&áá$ñ<žBE<
öXÂá.<ÁÅZ\Oø8³jxK¶[žá
ÏràºDÀ4ÂéLE"D3pfX®bïÙŸEjpÌ
Ë!Ë¢,Fî?º{ñÅÇ
¿£Ù¢¬LÆ(ÂѰÁÈCì?Sþ Ôwi§Ã°ÊÕo¹ê.iÏ`V¯75»¯×lÇD8¢Ãôrnb\5dË8ÁPvJÍ;A`FvŽpX'Líru%°9»4K8xâXÐÚ
"dóÎY±w>9ß
jÁ¿ËG»OžšõÜuUaEÏ`cOrµ4ÂÖ®AáŒús°bG+ŽV¬¶=°màôÔiŸÜ¬æ Ä-êÞîÂðþJö~Ôœí:#G޲
$3ð$°Â/ø @žè5Ä.Ëu
ac<aiááXœÅï«3"î«W`C
7á"C^l-¡
@2øª3î¹§x ¢Ù2äg:Âl±Áð V|i3õ
G^AM€ŠÊ:Ë.sZ³»xuL£á`òÞ§=|"üÒ>>¶
XbœAÂ× âaØ÷°/^ly ]
Ú@ifïx°ºŽFTïÐy#çÕJzÁižñNÈ«JÒ©Ê+úñbÜ&"d 6lÕ"Û3±(¥FDÖ0\Ø6,)V£=Dí³a@%c¶ôIDAT!
ÚXÂHx0nád¯×`?lcE®=3n6-(Â/ìvŒgãkTµØ9ûF¥3¢Ó±E`ŽËeP'v)Í[9H,p&KRö>žK6&5á($šîjÊ9Ói:Úék€«")3ZC%AŠ9=Í{õ Z.âŠkÂ¥ ÊÂÁ
L¯0d2JҩʱÊÃÊÛ|ø<7'Letê§qöIຩK·]'šêr k»²"lu±Öpâ Æ¥ÏÈã"ÕC$+Hgn8BøX})1XËà¬ødl!AM$iô$RËÖÈ]×Ýá(ôÖY¹+ø\Vô>
𮢝èp×À¹?Åb±Ò}ŸzîËãjõÙE2I-|_µÐ®L».sZ×;}t^£2ò\ðêÌ[)®ŒMbá(t¿±Z]O§IѧCÞ.pdL(ûÀ
F¬È'Ò5Ñä¥\$SrX_Bâ2§5²g×u7D8êk]dÙÛðÕ¬LŠö/
¢^~E8 ãa^øÐž|Â&ÃlÔª\$SrX_³ï2§uœÓ×HçE8êk]dÙ[.§p²ØªY¶ê\W: EÀ3§8ö2¿8r¯ç·©ó<(cÉÖÜžÌiìÙuÝ
úZ÷¶Ð'?2n&UuéT}lkySÉEõ¹HŠä°úó€.sZ×;}t^#T*oH§€è+8EMÚdJëK8\æŽFöìºîG}&êm: EßD"R¥¡ºHŠä°J²Y9ëŸF:/ÂR@U¬Ü€SRôåÕï"Ãú9=»®»!ÂQ_ë¢zNHÑ7Tiš.)9¬Òä€lÖeNëz§¯Îp€P+7éT}¹çEõ»HŠä°ŸäÄeNkdÏ®ënpÔ׺h¢ÞŠSRôM$"UªdJ«49)uÓºÞék€ó")TÅÊ@: E_îyQý.)9¬/9qÓÙ³ëº"õµ.š·éT}Hê"Ã*MNÊf]掮wúéŒGJU±r#NHÑ{^T¿dJëKN\æŽFöìºîF.]º\wÝuõµ¶·ÌóbiiVf*3pGÉVf:2iÅqNSš# ÐDcذaç{n&ªJÊÀyç7tèÐËÊ/àôIDATU³\î©iòú%SrXGrâ8§)Ô4/á?þôéÓëh4sW)æ+ÅrÕ,7³ØT`ì)9¬À\dÕãŠPG*ÒŒãöÛo_gu²QÕSV)æ+ÅrÕ,u^T¹£dJëHTç4
:Ræ%|Ã
7<üðÃëh%4gW#f*õZÕ,7§ØT`Ô$SrX)œDsZ)© !ÐD>ö¶ÛnëÓ§\GK_¥å«Ùa©ÔKT³\ŸÙiæJŠä°ö¥%éŠVJ*Ø1xâܺþúëk14aÁ3G%®OÍr
OYN2%e+O7§%ªŠ&/Þ\ì]vÙrÙ9J\®gFà'pB&kR³ù5m
¥HŠä°6ÅŠ9ÍDA5g%ÍH8ÌÎÝ^þµ£f€tÛFxkkg~ë·'¥KŠä°Öf¿ô9mNºPúšp?^]ø's'ø2xT^)9È?³À\â·Qh%h+?
Ðbæ)9¬ºTd>§¥ïŸMXCóln¯qc"bÏWª$`òàî¬ûrÕ,WrZ 2IŠä°²QŠ9u×BÊÙt·T4åB@! @UhvGU@W£B@!
fqW! @ášèjR! @³! ÂÑl3®ñ
! š"U]M
! h6D8mÆ5^! U@@£
«I! ÍG³ÍžÆ+B
pTt5)B Ùáh¶×x
B@T*®&
B@4"Í6ã¯B@* ÂQÐÕ€B@fC@£Ùf\ãB@!PD8ªºB@!Ðlp4ÛkŒB@!1_~ùeÆ56bu"8«B "x
ÚŽiO?ýô¢.7n\.]6ß|ó¿þõ¯õì·ß~[oœµcæÙþò¿ÜsÏ=)
µHͯM#ÈojñE'Nò?üárçwUFM+÷ßžW^y%<íÛ·_uÕU÷Øcûî»Ï²=öØcdøñ\ÖŸ5Råm^ÂÃÕ±cÇu×]w¯œözõÕW3åýìgŽòæoº×BAÏ;wÃ
7m"EͱuÊðÅ_|ûÛßþè£R׎ 8ÿ€þ£H:pÕ¢¹ôIDATËÙeŽÒJW\q³ŒÿþûC;|òIªÊJ8>ûì3ö k®¹Æ¥'ÌåòuÑWFÿ;œîÒoµŒ5jÔüùós Ç3®oI?üá/žàÕW_œGÏ=÷G
Ð¢ÚæÕûOj6öléç?ÿù¡ºÊ*«8-ÏŒEt
úÚk¯=ýôÓ÷9]Í©qžá¥KŠ®!iÁf&~ø!Êðøã7Ðþûßÿ®žâ_ûÚ×\0,+áÀîÂŒpÄOGU,ÇwÜ1cx7êÞœû|ÌY8.¿üòðÌ=ôÐC<<ÿüóE8â:'G®óß?ýéO)ðÌpOA¯æŒÿÑ~$ÂÂà@ÿç?ÿgØ\ŒðÂØÏ;ï<~ç8c ·ß~{¿~ý¶Øb·ÞzãÓg±þúë÷ïßÿÔSOÝg}ò©yæ'pÂ%\²Î:ë4háÂ
aúø_übM6Yyå!:;íŽÓSO=eMvÚi§r
Ô§W¯^G}47F>}úÙgœÃ;¥åØc=üðóZkê
£<Ö²Y8Þ{ï=ì
«¶2·å[±Rl·Ýv<GRO:é$4]®,d<,%¬Ÿ}û.^Œøµ×^kÛ¶mç%üñ
+¬`¶©$ZodáÈ%¿ÿýïå[n10I2*€pùÓ¯ýk+ÆÝwßêlG*.ÚVÐTõùç_|ñÅCíÚµëÆo&ï,ó.{ÀØ8¿¿í¶Û;ì°5ZÒ1ÇÃ̹ÈèXl6XÙKØŸûÝï²'Yåì1¿üå/Ç¿öÚkJyq ÏZkÅÀ7Ø`dc¯:äCØx8 4i;bRqÍßÌæÞ{ïÝe]ÐÌfúEÛµk·æk2»í¶OÎ;_xá
ÿïÿý¿6ÚÃÄŒcöìÙØèoŸùÆoD:è kè§?ý)h£xùÊB[íOäÙ xS§N=çs®ºê*rRÕ¯~õ«[oœßÿïÿþÏrbAª¯ŒòÊØ-G:#0V2žM@8Z;šê"ÍèÍïÿûh[Ô.+ç{n®¡(HŽ<ÚfmÐnAŒÃìÕ²p€["ÂÁŠžã;²#ÚJI.¢pyäN:±:nºéŠyóæ±.pžh[Ú
+húùæUÿ²
ãšAUäNwØÓ ꡱú¬$·æœº96ôIDAT"£m°)Å:õ`çmØÅ3í
¹óÎ;?üðÃ
pxægØhú;ßùË{p=ùä©sÓM7íÝ»÷Ûo¿NnáôªoÉ uÖYÛoŒÿÀnaÿdß¶Ú*UX§ÛO<ñýé·¿ý-õkÝGU#(æOïŒóO ü<Âv5ÈÔ¶îtèÐK¶bàXG(ó¢Elv_~ùe4ìã?ÎïSŠLdÎbèäÝ+¹1mÚŽ@µÁWÂkcÖ¬Yð¯MZ#ŸppUÉÂážÒl"ݺuÛì«à±Ëb0^¹Hr
»í¶Û²¡ ó6oÃQÛôK/œDÐæAmpw^4að<B88îFrm.3r€RhtøÌ²!a·Ê1@nÿpàÓ ÄþYð
ïÇÀÎÔI=€[<¿øüë_ÿzà<òHöòo|ã<1Âܹ뮻øç/Ÿ9yòäBUsHÄ `ÿñÄÔMìŠäÑ TDêèV.û+Ú³÷ÚD8êpÁÙn© ŠŒÉuÔQ<;ÙqtÇåÞâÈáù^Dd1"ï¿ÿ>j+=÷Ýwy;Ä lÿÜR¡s,>úšeáp_lSwnüùqðÈY¡-ä O®Â¥NÕAó4ã¶
+h¬ÐœÁÌ$ÁëcÐJpp4ü£±cÇòÏê/4:{Å,ÔÀnpä=tÏÅ!L8ðÆåʵ³hR-_#{9¶(áxþùçí¯Øøg³2¡
GÀLŽ0fp@Ö§OªâõÒîþûßÿæO(yÎþD€ 9Ž=ô¥
E8jpp
{ÑÃŒÀ\-ÎÁËOzöìÉIï=ŒñÏÜdYšlÅs ,ÁTP¶6ppúÈk ©Hq€ê[#|€Â;=`W3Kr!
}JØk¹žûî»Âá¢mÃ
úÒK/ÅŠi$š
#bÀøÃÓ!áóÊ9sæ@§"£ÈèpaÝ
_!8Ð sEŽTdã I®NÞtÊm¡üÍL8Ø¿1]N£@dÎCX2p 3
7ûç믿À8sæÌB#B
9ã»îº+.zxXÿíoÜ9L88>+D8x>dȶ8žqd5ûIëáš-ÂÁäpÂ`á.<DÚ+ôIDATÃ^wÝuŠPPUfÑhád€ÂÅHå+pCãÓ>S"äÌëîA#ñkúk±aÂè¢v^0@²ž$RžpnoŠ-Á ëmÃÃöìpì
< a¬ásŒ£ÈèXÎ4v°8øàÃèRÁèl<aÂÁQ)ô°NÈ|³if§Ã'R@05å!̰ÕáÀANo,'Àä"X/«¬
r4óÉ'àWŸÙ?%¢äa®aO.Èàaz`KJª²2Ì/ÂQ[·+åw¿û]xñœÇäÀ\4°EãH-÷ŠÌ9óêA©g}×hÏUpÀÄy3÷Ï !ÙHŒÝ€áÈp±YU²pDFÿñ £1ìQ¡$WžÔ¹ïŸûe4ÄjÛ°Æó)Œ7²æœ07vµášþB£{úé§Yº±!÷òâ8P·wnÎIù=ž@ÿ¡AßbVÝÌ9¥ÂYø;îÀ§
E÷7y!<Au£®)À]!&Ü
þöÍÀq9ãÐL_Œ7"çžû@G,YB[䎟\%ÏÉ8ÜÂx<éÿü'cžxVS¢Ú"h
<8+á
°\CÐDÂlvq ñç?ÿkWã0ÃbÄã9ŸÇÈÓ,D£|6ÖÂJ¢ò°+µB=ÔÌÂáH±šáȜ˰À¶Kr
ËÍ)Þÿ°ÒaŽàaÂá¢mÃ
[3ØÉ
p.ª`ÓûgóëB8È®¹È:Å©
nãÔÉ-\ bao©-Ep°ãWÎIYÔØA±À
khp/H:JžtñnrÂÏ&ÒÌ£A<\ÂÁë"Wdq¡ '46PèZìzëÙ TÜ(áEG
&šÔÛý©\Â+ÂÞT-!6x"g^/
ðpÔá`
!°LqCn8î$.ðW/8|×aè#Ó¶à)fQÄÂwáº@®ÜÞzÐP")GòÆÒå%ËŸŒQ¶$QžâÝp2È-|Ý^îÃÇ"±Ú6¬ y[å: ¥&SÞ9ê/4:È
×OžF0~, +=L8à{ùâ1JQöO
×ÅÌå©¿ÞSêQp¿ÿýï¹÷rÑæH«x
Íû!{UQ<|Œ^dBi+4%(f.*¬9Â!ÛøôIDATñ
æÃ¹B!±žbmšFP«)$ócÚD"¥ÌÅ»HHI.¢p)ŪÉ]öz«m#
æúmžt>ï6^˹£ckáì#ŒcaT'êFæàí¿Èâí§jÒ R.Ã%³K$ÙÃŽæÉœiåRCyjpd86U%@#PSÚ¶È\@0šbÇYž\koòl¶ágN8mö'î=ULªO: @¹š)m[|\wä 7ëÁ6bí1åLõVnÒâFm~óß<øàÙÖ®6tž©õ@íhÛXŒ8©/~/6³2ºC@£îŠLB@!PpÔß©ÇB@! êº2uX! @ý! ÂQsŠ! š;D8ênÊÔa! õGýÍz,B îáš»)S
B@Ô"õ7gê±B@ºC@£îŠLB@!PpÔß©ÇB@! êº2uX! @ý!PsÃóÚØ§íê:ñ!àt²pê©§2pŸ^]Œ8ß\øö·¿ýÑG¥k%Q©nº.éóÖ@+¹äUJÂgÌQh]_pÁO>ùdø¯|Æl W\qEæ%\dàóf|êlÌ1×^{møSìYMêB sjpxÞéÿ«û/%°ãn@ó.]º4sÈP#[žÿÍWï?þ(§¿üå/×V_}õqãÆÿ|ê©§pzè¡<\²d ôbÿý÷ç ¿XSF8Ÿóïá?üá9ç³óÎ;ódÁÉû¢B@T4Z£¬}ôß`D8â,?úÑD8Ê*嫌 GÕ!Cì³Ï>á'F8íð÷Þ3Fpüç?ÿ 2`<úè£1·ÜqÇå2Õ,@&pÇêý
[8Î<óÌE¡GÝ£GwÜñùç'Ï/ù˵ÖZÕŒÁðÇLrÈÀ12O4é
^0ážç{0Jóµë~ýúm±ÅoœõÖæo~Ûm·vØakŽ€c9æÓO?µÌÏ=÷ÜäÉ×\sÍ®]»nžáÞ
#T"ÂaP8HÉØ±csŒØ·oß)SŠd;MªMÌáš]Â1{öl4iÿþýa!^x!GÚoŒ1ðÌ3ÏÌ?ßlË=ö/yãÇŒz/ôIDATj|òÉ?ùÉO6ÝtÓÞœ{¿ýöÛäüõ¯Ý®];8Z{·ÝvãI÷îÝá'NÄdîܹTrþùçóüœ÷Þ[yåyþýïÿÊ+¯€Bþôøãó'lWGqÂñüLzýõ×üãC¿ûÝï!üiêÔ©#FÈvT# ÂQÓºœ°YÇ«œêwÞá÷ðÊ7ÞÈsž
eûàºtéù0ÂÁÎ:ë¬@n š§TÑ·Ýv[þzË-·` 1q
¢áÈvÕp'¯Ò<0Àß|8ÂG*ö§£:ªS§N±®ÖÙΣjB )"5M80N3zóÍ7£míž$L8p²Ãøqß}÷=ðUÚdM¶ÜrËpp°&Ç{lðÏ8 °WÛCnŸ<òÈ#ØNžðÍo~S#éÍ/ÂQpL>bAâHÓr©Ï"sæÌdÇ"¯B@T&»Rï{±Ë.»ä^5Ä\ÀnÁ,ç{n shê6ÚÈþ É>|86:@YpÄ»øâE82_"Å GÄiÔHGEVº¡Cf>SªPláši°"cÚŽiÐüF9L Ò~^z)ÇyçK8p>EãyzçwR Å!]tG¶ëÚD8;Ý»ì²Ë
ÿþ÷¿«¬²Ê~ûíùL©B! ²E@£. qКZ€hüþÿ÷&dc·°ÐæÃáB8žy#-hRùpdŒä8GIÇ[*ræ·¿ým!Âqâ'áî»ïÎvT# ÂQÃü9±øâ/rÙ&\åÌåÍ7ß<íŽÓ8öŸÿþûnÁ¬°Â
ÄeâáÃ?Ìf@ýgq,Ù/9L|8U!q]eñâÅø'
6Ì,vAà/þMîë_ÿúN;í Î5+óiR
B@dG]îªUvF&ðµrB
Œ1LPÜ-\£Ýc=:wîܱcGB@Be¶ß~{ŒCD8²_r"E GàÄÅAa®âÊC#êœzõgsù4©B! 2G æz$ײî€ûÒDÒÙ
v¿"i(ñ'xoÏ_öGù]» €<B@45G8bH! á! eG@£ì«! B@C2 B£<Õ1;IDAT@²C¬B@ÉB@!PvD8ʱB@! þ?!MÑVtÀ3IEND®B`--- /project/elephant/cvsroot/elephant/doc/ArchDiagram1.ppt 2007/04/21 18:48:29 NONE
+++ /project/elephant/cvsroot/elephant/doc/ArchDiagram1.ppt 2007/04/21 18:48:29 1.1
ÐÏࡱá>þÿ :=þÿÿÿ;ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿýÿÿÿ9
þÿÿÿþÿÿÿ8 !"#$%&'()*+,-./01234567þÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿÿÿÿÿÿÿÿdOÏꪹ)èbã#ÇPowerPoint Document(ÿÿÿÿ5SummaryInformation(ÿÿÿÿÿÿÿÿt1DocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿè;é(àà
òb/È0ÒÕ·DArialÃ0¯0°U1pB1pBÿ¿Îÿ¿ÀÊú@Èÿ¿Îÿ¿ÀÊ1
æà·D-ÿ3ÿ 0ÿŽ0·0Ã0¯0°U1pB1pBÿ¿Îÿ¿ÀÊú@Èÿ¿Îÿ¿ÀÊ1
æà€
`¥.©
@£nÿý?" dd@ÿÿïÿÿ @@``ðð -5Sð¿ÀÿPñ«««ÿÿÿfÿÿff@ñÿÿf÷ðóÐgºuìÊ;2NÍÉÊ;úgþý4ddddÐHàÊÿ¿À
Hÿÿÿžýÿÿpûppû@<ý4!d!d@Ëÿ¿°%øgÊ;<ý4dddd@Ëÿ¿°%øgÊ;ÿ(hº___PPT2001D<4X¶à°º___PPTMac11@f èhnamd`
Arial&Monotype Typography èhnamd`
Arial&Monotype Typography èhnamd`
Arial&Monotype Typography èhnamd`
Arial&Monotype Typography èhnamd`
Arial&Monotype Typography èhnamd`
Arial&Monotype Typography ?ÙÚ%ðXóª
ª
êøÄ ï ¬0`ð ÿÿÿ»àã33Ì`ð ÿÿÿûßSÿfÌ3f`ð ÿÿÿÌÿÌÌÿ33̯gÿ`ð ÞöñÿÿÿÆÿfÌš`ð ÿÿÙwwwÿÿ÷3ÌÌÿPPÿ`ð ÿÿÿZXÿÿdbmoÇÿÿÿ`ð ÿÿÿ\ßÒq>9Ÿy`ÿÿÓ¢`ð ÿÿÿ3fÌÿÿ3f̰fÌÿÿç`ð ÿÿÿ3fãëñ3FKfÌÿðå`ð hk]ÿÿÿwwwÑÑËšÿÌféܹ`ð ffÿÿÿ>>\ÿÿÿ`Y{ffÿÌÿÿÿ`ð R>&ÿÿÿ- ßÀ{p_/ÌŽ £>ÿý?" dd@ÿÿïÿÿ,£|ÿý?" ddØ@ÿÿïÿÿ Ô " Ð@ ð`» £nÿý?" dd@ÿÿïÿÿ @@``P£R @ ` `£p£>£>îðæðð~ð( ð
ððÌ
ð
ð0{e¿Àÿ ð°ÐPðÃ\
ðTš Click to edit Master title style¢!ª
!ð
ð
sð*Ð~e¿Àÿ ðà°ÐðÃ\
ðšRClick to edit Master text styles
Second level
Third level
Fourth level
Fifth level¢!
ª
SðÂ
ð
sð*
e¿Àÿ ð`°`ðÃ\
ðP *¡øª
ðÄ
ð
sð*Ðe¿Àÿ ð`°Ððà \
ðR *¡úª
ðÄ
ð
sð*pe¿Àÿ ð` ÐðÃ\
ðR *¡Øª
ðH
ðð0Þœh¿ÿ ?ð ÿÿÿ»àã33Ì80º___PPT10ë.ÑsþU º$Blank PresentationîFï¬P¶ð® ð'4ðFð( ðppa.a.eloiduroC.
ðð"
ð
sð* f
ÿ¿Àÿðà0` ð
ð4šPSET¡ð"
ð
sð*À
f
ÿ¿ÀÿðàÀ
ð
ð>šClassIndexing¡ð"
ð
sð* f
ÿ¿Àÿðà Ðð
ð@šPersistentSlots¡ð"
ð
sð*0f
ÿ¿ÀÿðÈ
ð:¡ª
ð"
ð
sð*pf
ÿ¿ÀÿðP
ð:¡ª
ðL
ð
cð$
ÿ¿Àÿð.§ð¡¢
ð
sð*À f¿¿Àÿð[åw{
ðGšBTree¡ 2ª
ðŠ"
ð
sð* %f
ÿ¿Àÿð` p
ðLš
Serializer¡ª
ð©"
ð
sð**f
ÿ¿Àÿð`Ð
ðOš
Memutils/UFFI¡ª
ð"
ð
sð*Ð.f
ÿ¿ÀÿðP
ð3šMOP¡ð¢
ð
sð*03f¿¿Àÿð`
ð8šUser API¡ 2 ðRB
ð
sð*
D¿ÀÿðP ð¬¢
ð
sð*8f¿¿ÀÿðøH
ðRš"Data Store Interface and Utilities¡# 2#ð¢"
ð
sð*=f
ÿ¿Àÿð
ðHšdb-bdb¡ª
ð"
ð
sð*Af
ÿÿf¿Àÿð p
ð=š
db-postmodern¡ð€"
ð
sð*0Ff
ÿ¿Àÿð `
ðJšdb-clsql¡ ª
ð"
ð
sð*Kf
ÿff¿Àÿð à
ð7šdb-lisp¡ðŠ"
ð
sð*pOf
«««¿ÀÿðÀpðÐ
ðLš
BerkeleyDB¡ª
ðŠ"
ð!
sð*Tf
«««¿ÀÿðÀà
Ð
ðLš
PostgreSQL¡ª
ð¢"
ð"
sð*ÐXf
«««¿ÀÿðÀ@ÀÐ
ðHšSQLite¡ª
ðXB
ð#
ð0
D¿ÀÑÿð 0ÀðXB
ð$
ð0
D¿ÀÑÿð Ð0 ÀðXB
ð%@
ð0
D¿ÀÑÿð 0P
ÀðXB
ð&
ð0
D¿ÀÑÿð ÀðRB
ð'
sð*
D¿ÀÿðàP àðRB
ð(
sð*
D¿Àÿð0P 0ðRB
ð)
sð*
D¿Àÿð0 P 0 ð"
ð*
sð*df
ÿÿf¿Àÿðàà
@ð
ð3šDCM¡ðL
ð+
cð$
ÿ¿ÀÿðgÇð¢
ð,
ð6ðmf
¿¿Àÿð0æZðäÜ8º___PPT10±Fº___PPT9(¬ Fº___PPTMac11 èhnamd`
Arial&Monotype Typography
ðBšUser API¡ ðL
ð-
cð$
ÿ¿ÀÿðC£ð¢
ð.
ð6wf
¿¿ÀÿðæàðäÜ8º___PPT10±Fº___PPT9(¬ Fº___PPTMac11 èhnamd`
Arial&Monotype Typography
ðBšInternal¡ ðL
ð/
cð$
ÿÿf¿Àÿðg0 @Çð¢
ð0
ð6}f
¿¿Àÿð0 ðäÜ8º___PPT10±Fº___PPT9(¬ Fº___PPTMac11 èhnamd`
Arial&Monotype Typography
ðLšReady to integrate¡ðL
ð1
cð$
ÿff¿ÀÿðC0 @£ð¢
ð2
ð6ðf
¿¿Àÿð
àðäÜ8º___PPT10±Fº___PPT9(¬ Fº___PPTMac11 èhnamd`
Arial&Monotype Typography
ð=šTBD¡ðL
ð3
cð$
«««¿Àÿð`°ÀÀð¢
ð4
ð6 f
¿¿Àÿð)ýðäÜ8º___PPT10±Fº___PPT9(¬ Fº___PPTMac11 èhnamd`
Arial&Monotype Typography
ðCš 3rd party¡
ðH
ðð0Þœh¿ÿ ?ð ÿÿÿ»àã33Ì80º___PPT10ë.Ñs¥Vcx»p^ðÁÂRÐ3ÿÿlHbP@ùÿÿAL
ÿGÁøß@;b`BÏù€&V<WqÒã)Ê-ÇÿRG" Ú~¡l?ËÆór0C]4õs È4ÄPþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿ
ÕÍÕ.+,ù®0ØšÀÈÐØ à
èðø
xéýOn-screen ShowMIT Media Lab5ArialïŒïŒ³ ãŽã·ãã¯Blank PresentationPowerPoint PresentationFonts UsedDesign Template
Slide Titlesþÿ
à
òùOh«+'³Ù0D1`h °Œ
Üè
ô'PowerPoint PresentationIan EslickIan Eslick4Microsoft PowerPoint@âµñ@Où6Ç@õEÇ!G40þÿÿÿPICT0,ŽÿÿþHHŽ
ŽÿÐŽHH )l|$ŽŽÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿ>ÿÿÿÿøÿÿýÿÿãÿÿÿøÿÿýÿÿãÿÿÿøÿÿýÿÿDÿÿÿÿù
ÿÿÿÿÿÿÿãÿÿÿù
ÿÿÿÿÿÿÿãÿÿÿù
ÿÿÿÿÿÿÿJÿÿÿÿÿûÿÿÿþÿÿÿãÿÿÿÿûÿÿÿþÿÿÿãÿÿÿÿûÿÿÿþÿÿÿ5ÿÿ÷ÿÿÿýÿÿâÿ÷ÿÿÿýÿÿâÿ÷ÿÿÿýÿÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿ"ÿÂÿèèÿèèÿèóÿÿÿÿÿÿ±ÿ.ÿÿŸÿòÿâÿ"ò#ÿâÿòñÿÂÿÄÿþg âjûþÿù7í ~þÿÿþg ê ~þÿÿþkí þþÿdíGéÿþkâ{ûþÿù@í þÿÿþkê þÿÿþkí þþÿqÑýòÿýÒQéÿþiârûþÿù;í þÿÿþiê þÿÿþhíþþÿjh~ò~iLòÿŽÿÄÿßDþÿkëgÿÿægÿÿ/ÜýíÿýÜ0kÿÿëêÿ/ÜýâÿûHþÿrSûîÿ ýÜ0kÿÿ/Üýêÿ ýÜ0kÿÿ/ÜýíÿýÜ0kÿÿýîÿýêÿn~â} Fþÿn,}î ~niÿÿn~ê ~niÿÿXeífeXhÿÿ~î~óÿÿÄÿÜþÿé ÿÿä ÿÿ!ÜéÿÜÿÿêêÿ!ÜßÿàþÿßëÿÜÿÿ!ÜæÿÜÿÿ!ÜéÿÜÿÿ#ÒìÿÒ#êÿnßpþÿoënÿÿnænÿÿXéfXÿÿiìióÿ©ÿÄÿÝþÿéÿÿäÿÿýéÿýÿÿêêÿýýÿýöÿûÿúÿýþÿýëÿýÿÿýûÿüñÿýÿÿýéÿýÿÿýìÿýêÿ~ýýöûú~þÿ~ë~ÿÿ~ûüñ~ÿÿeéfeÿÿ~ì~óÿÿÄÿÛþÿçÿÿâÿÿçÿÿÿèêÿüÿÿÿíùÿþÿéÿÿÿúÿþÿ÷ùÿÿÿçÿÿÿêÿêÿüíùþÿéÿÿúþ÷ùÿÿçfÿÿêóÿ±ÿÄÿÛþÿçÿÿâÿÿçÿÿÿèêÿüÿþÿýÿþÿúÿùÿþÿéÿÿÿúÿþÿ ÿÿÿùÿÿÿçÿÿÿêÿêÿüþýþúùþÿéÿÿúþ ùÿÿçfÿÿêóÿËÿÄÿÛþÿçÿÿâÿÿûÿ÷ÿÿúÿÿÿèêÿüÿþÿñÿùÿþÿþÿúÿþÿÿûÿÿÿùÿôùÿÿÿûÿ÷ÿÿúÿÿÿþÿþÿÿôÿêÿüþñùþÿþúþûÿÿùôùÿÿûf÷ffúfÿÿþþôóÿÏÿÄÿÛþÿçÿÿâÿÿûÿÿÿþÿÿúÿÿÿèêÿÝÿþÿþÿÿÿÿÿÿýÿúÿÿÿäÿÿÿûÿÿÿþÿÿúÿÿÿþÿÿÿÿÿúûÿêÿÝþÿþýúÿÿäÿÿûfffþffúfÿÿþúûóÿÄÿÄÿÛþÿçÿÿâÿÿûÿÿÿþÿþÿúÿÿÿèêÿÝÿþÿþÿþþÿýþÿúÿÿÿäÿÿÿûÿÿÿþÿþÿúÿÿÿþÿÿÿÿúûÿêÿÝþÿþþþýþúÿÿäÿÿûfffþfþfúfÿÿþúûóÿ¹ÿÄÿÛþÿçÿÿâÿÿûÿþÿÿýÿÿúÿÿÿèêÿÝÿþÿþÿýÿÿýøÿÿÿäÿÿÿûÿþÿÿýÿÿúÿÿÿþÿþýÿúûÿêÿÝþÿþýýøÿÿäÿÿûfþffýffúfÿÿþþýúûóÿÿÄÿÛþÿçÿÿâÿÿçÿÿÿèêÿöÿþÿþÿñÿþÿéÿÿÿýÿýÿîÿÿÿçÿÿÿêÿêÿöþþñþÿéÿÿýýîÿÿçfÿÿêóÿÿÄÿÛþÿçÿÿâÿÿçÿÿÿèêÿõÿÿÿùôÿþÿéÿÿÿýÿöÿúûÿÿÿçÿÿÿêÿêÿõùôþÿéÿÿýöúûÿÿçfÿÿêóÿ§ÿÄÿÛþÿçÿÿâÿÿçÿÿÿèêÿôÿýÿÿôÿþÿéÿÿÿýÿÿÿý ÿÿÿÿûÿÿÿçÿÿÿêÿêÿôýôþÿéÿÿýý ûÿÿçfÿÿêóÿÿÄÿÛþÿçÿÿâÿÿçÿÿÿèêÿõÿÿùôÿþÿéÿÿÿýÿÿùÿþÿÿûÿÿÿçÿÿÿêÿêÿõùôþÿéÿÿýùþûÿÿçfÿÿêóÿ
ÿÄÿÜþÿèÿÿãÿÿûéÿûÿÿèêÿûßÿûþÿûëÿûÿÿûîÿþüÿûÿÿûéÿûÿÿêÿêÿ}ß}þÿ}ë}ÿÿ}îþü}ÿÿdéfdÿÿêóÿšÿÄÿß5þÿë:ÿÿæ:ÿÿQßýíÿýßDÿÿèêÿQßýâÿû8@þÿ8ûîÿ ýßDÿÿQßýêÿ ýßDÿÿQßýíÿýßDÿÿêÿêÿ+o~â}:þÿ}î ~o ?ÿÿ+o~ê ~o ?ÿÿ$YeífeY>ÿÿêóÿ¬ÿÄÿùkàõþÿõ5î Dûÿÿùkê DûÿÿùríHûÿÿèêÿùràõþÿõ?î Hûÿÿùrê HûÿÿùríHûÿÿêÿêÿùnàõþÿõ:î Fûÿÿùnê FûÿÿùmíEûÿÿêóÿÿÿÀÿèÿæÿêÿÿæÿêóÿÿÿÀÿèÿÎÿÿæÿéóÿÿÿÀÿèÿÎÿÿæÿéóÿ;ÿÄÿõì5õÿÿõêÿõì:õÿÿõéÿêÿõì@õÿÿõéóÿBÿÄÿ5ìÿÿ5êÿ:}î}ÿÿ?8û
ÿû7êÿ?8ûîÿû7ÿÿ:}
}óÿ8ÿÄÿéÿÿêÿ}ì}ÿÿûÿûêÿûìÿûÿÿ}}óÿ.ÿÄÿèÿÿêÿêÿÿÿêÿêÿÿÿóÿ@ÿÄÿèÿÿêÿýùúÿÿÿêÿýÿÿÿùúÿÿÿóÿLÿÄÿèÿÿêÿýúÿÿÿêÿýÿÿÿÿÿÿúÿÿÿóÿDÿÄÿèÿÿêÿýþýùÿÿÿêÿýÿþÿÿÿýùÿÿÿóÿ@ÿÄÿèÿÿêÿýü÷ÿÿÿêÿýÿÿÿü÷ÿÿÿóÿ.ÿÄÿèÿÿêÿêÿÿÿêÿêÿÿÿóÿ.ÿÄÿèÿÿêÿêÿÿÿêÿêÿÿÿóÿ.ÿÄÿèÿÿêÿêÿÿÿêÿêÿÿÿóÿ7ÿÄÿéÿÿêÿ}ì}ÿÿûÿûêÿûìÿûÿÿ}}óÿDÿÄÿì5ÿÿ5êÿ}î}:ÿÿ8û
ÿû6@êÿ8ûîÿû8@ÿÿ}
}:óÿ=ÿÄÿõ5ìõÿÿõ5õêÿõ:ìõÿÿõ?õêÿõ?ìõÿÿõ:õóÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿ:ÿÄÿÖ°LþÿfŸ(ÞêÿÖ°OþÿjŸ-ÞêÿÖ°SþÿoŸ2Þóÿ6ÿÄÿ®þÿºêÿk²|þÿ|¿~UêÿÖ²ÿøþÿø¿ÿüªóÿ,ÿÄÿ®þÿºêÿ°þÿŒêÿ°ÿþÿŒÿóÿxÿÄÿ®þÿºêÿæþøØþÿóøþþëêÿæÿþøÿØÿþÿóÿÿÿøÿÿþÿÿÿþÿÿÿëÿóÿtÿÄÿ®þÿºêÿå÷ûàþÿóøøþëêÿåÿÿÿ÷ÿûàÿþÿóÿÿøÿøÿÿÿÿþÿëÿóÿÿÄÿ®þÿºêÿäúýýàþÿóþýýýþëêÿäÿúÿýÿÿýàÿþÿóÿþÿýÿÿÿýÿýÿÿþÿÿÿëÿóÿzÿÄÿ®þÿºêÿåõýàþÿóý÷ýþëêÿåÿÿõÿýàÿþÿóÿÿÿýÿÿ÷ÿýÿÿþÿëÿóÿ4ÿÄÿ¯þÿ»êÿ}±þÿœ}êÿû±ÿþÿœÿûóÿ;ÿÄÿ(¯þÿŒ5êÿ-T²vþÿv¿}:êÿ2©²ÿìþÿì¿ÿû8@óÿ4ÿÄÿÞ°qþÿ`ŒõêÿÞ°uþÿbŒõêÿÞ°yþÿfŒõóÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿ"ÿÂÿèèÿèèÿèóÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿ|ÿ¡ÿýþÿýÿþÿøÿÿÿýÿïÿ
ÿÿÿÿÿÿýþÿýÿþÿøÿÿÿýÿïÿ
ÿÿÿÿÿÿýþÿýÿþÿøÿÿÿýÿïÿ
ÿÿÿÿÿ¹ÿdÿ¡ÿÿÿùÿÿÿÿùÿÿïÿøÿÿÿôÿÿÿùÿÿÿÿùÿÿïÿøÿÿÿôÿÿÿùÿÿÿÿùÿÿïÿøÿÿÿôÀÿµÿ¡ÿÿÿÿþÿþÿýÿüÿÿÿúÿþÿÿþÿÿþÿÿÿÿÿ÷ÿÿÿÿÿþÿþÿýÿüÿÿÿúÿþÿÿþÿÿþÿÿÿÿÿ÷ÿÿÿÿÿþÿþÿýÿüÿÿÿúÿþÿÿþÿÿþÿÿÿÿÿ÷ÿÀÿ|ÿ¡ÿþÿúÿÿÿùÿÿÿûÿøÿýÿýÿÿòÿþÿúÿÿÿùÿÿÿûÿøÿýÿýÿÿòÿþÿúÿÿÿùÿÿÿûÿøÿýÿýÿÿòÀÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿ"ÿÂÿèèÿèèÿèóÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÄÿûDékùþÿõÑ rùÿÿûDç kùÿÿûHêrùêÿûFénùþÿõÑ rùÿÿûFç nùÿÿûEêmùêÿûHérùþÿõÑ mùÿÿûHç rùÿÿûEêmùóÿÿÄÿ:åAþÿ?8ûÓÿýàSKÿÿ:ãAÿÿCàýêÿýàSKêÿ>p~é~p,Fþÿ?8ûÓÿ ýàSKÿÿ>p~ç ~p,Fÿÿ=
YeêfeY%DêÿCàýéÿýàSKþÿ9dÓf eY%DÿÿCàýçÿ ýàSKÿÿ=
YeêfeY%DóÿoÿÄÿâþÿûÐÿûÿÿàÿÿûæÿûêÿ}å}þÿûÐÿûÿÿ}ã}ÿÿdæfdêÿûåÿûþÿdÐfdÿÿûãÿûÿÿdæfdóÿXÿÄÿáþÿÎÿÿÿßÿÿäÿêÿãþÿÎÿÿÿáÿÿäfêÿãÿþÿÎfÿÿáÿÿÿäfóÿXÿÄÿáþÿÎÿÿÿßÿÿäÿêÿãþÿÎÿÿÿáÿÿäfêÿãÿþÿÎfÿÿáÿÿÿäfóÿXÿÄÿáþÿÎÿÿÿßÿÿäÿêÿãþÿÎÿÿÿáÿÿäfêÿãÿþÿÎfÿÿáÿÿÿäfóÿÐÿÄÿáþÿûÿõÿøÿíÿÿÿßÿÿúÿþÿñÿêÿùþý÷þÿûÿõÿøÿíÿÿÿùûûùÿÿúfþfñfêÿùÿþÿýÿ÷ÿþÿûfõføfífÿÿùÿûÿûÿùÿÿÿúfþfñfóÿšÿÄÿáþÿýÿûÿæôÿÿÿßÿÿüÿûÿùøÿêÿûûøùþÿýÿûÿæôÿÿÿûûöùÿÿüfûfùøfêÿûÿûÿøùÿþÿýfûfæôfÿÿûÿûÿöùÿÿÿüfûfùøfóÿ>ÿÄÿáþÿýÿÿÿþÿÿÿýÿÿÿÿûÿôÿÿÿßÿÿüÿÿÿýÿþÿøÿêÿûþùþÿýÿÿÿþÿÿÿýÿÿÿÿûÿôÿÿÿûþþùÿÿüfffýfþføfêÿûÿÿÿþÿÿÿùÿþÿýfffþfffýffffûfôfÿÿûÿÿÿþÿÿÿþÿùÿÿÿüfffýfþføfóÿÚÿÄÿáþÿýÿûÿÿøÿÿöÿôÿÿÿßÿÿüÿûÿûÿøÿêÿûûøùþÿýÿûÿÿøÿÿöÿôÿÿÿûûùùÿÿüfûfûføfêÿûÿûÿøùÿþÿýfûfføfföfôfÿÿûÿûÿùÿùÿÿÿüfûfûføfóÿÿÄÿáþÿöÿÛÿÿÿßÿÿðÿ÷ÿêÿãþÿöÿÛÿÿÿìøÿÿðf÷fêÿãÿþÿöfÛfÿÿìÿøÿÿÿðf÷fóÿXÿÄÿáþÿÎÿÿÿßÿÿäÿêÿãþÿÎÿÿÿáÿÿäfêÿãÿþÿÎfÿÿáÿÿÿäfóÿXÿÄÿáþÿÎÿÿÿßÿÿäÿêÿãþÿÎÿÿÿáÿÿäfêÿãÿþÿÎfÿÿáÿÿÿäfóÿrÿÄÿãþÿýÐÿýÿÿáÿÿýæÿýêÿ~å~þÿýÐÿýÿÿ~ã~ÿÿeæfeêÿýåÿýþÿeÐfeÿÿýãÿýÿÿeæfeóÿrÿÄÿ ãþÿßÐÿÜ!ÿÿ áÿÿÜæÿÜ!êÿnånþÿßÐÿÜ!ÿÿnãnÿÿXæfXêÿÜåÿÜ!þÿYÐfXÿÿÜãÿÜ!ÿÿXæfXóÿÿÄÿhå~þÿHûÓÿýÜ0ÿÿhã~ÿÿl/ÜýêÿýÜ0êÿjn~é~nþÿHûÓÿ ýÜ0ÿÿjn~ç ~nÿÿiXeêfeXêÿl/ÜýéÿýÜ0þÿEdÓf eXÿÿl/Üýçÿ ýÜ0ÿÿiXeêfeXóÿ£ÿÄÿþé hþþÿûCÓ lþÿÿþç hþÿÿþ!êlþêÿþéjþþÿûCÓ lþÿÿþç jþÿÿþêiþêÿþ!élþþÿû=Ó iþÿÿþ!ç lþÿÿþêiþóÿIÿ³ÿå×ÿ<»âÿÀÀïÿ±â³ÿå×ÿ<»âÿÀÀïÿ±â³ÿå×ÿ<»âÿÀÀïÿ±âÍÿIÿ²ÿÜ"Øÿ|{ãÿÀÀíÿ,ò³ÿÜ"Øÿ|{ãÿÀÀíÿ,ò³ÿÜ"Øÿ|{ãÿÀÀíÿ,òÎÿLÿ±ÿê4cûÚÿŒ;äÿÀÀëÿhHü³ÿê4cûÚÿŒ;äÿÀÀëÿhHü³ÿê4cûÚÿŒ;äÿÀÀëÿhHüÏÿOÿ°ÿôHJôÛÿöõæÿÀÀêÿüFj²ÿôHJôÛÿöõæÿÀÀêÿüFj²ÿôHJôÛÿöõæÿÀÀêÿüFjÏÿ"ÿÂÿèèÿèèÿèóÿIÿÿ!ÛÜÿ|{èÿÀÀæÿâ±±ÿ!ÛÜÿ|{èÿÀÀæÿâ±±ÿ!ÛÜÿ|{èÿÀÀæÿâ±ÑÿLÿ¬ÿäßÞÿŒ;éÿ§Àäÿæß±ÿäßÞÿŒ;éÿ§Àäÿæß±ÿäßÞÿŒ;éÿ§ÀäÿæßÒÿFÿ«ÿµDÞÿût¿êÿDoâÿ¿°ÿµDÞÿût¿êÿDoâÿ¿°ÿµDÞÿût¿êÿDoâÿ¿Òÿvÿ¹ÿù<âuûýÿþi
Õ þÿÿþi
äþÐÿù<âuûýÿþi
Õ þÿÿþi
äþÐÿù<âuûýÿþi
Õ þÿÿþi
äþäÿyÿ¹ÿo9šã«šFýÿ!©Õ« ©"iÿÿ!©ä«©"iÐÿo9šã«šFýÿ!©Õ« ©"iÿÿ!©ä«©"iÐÿo9šã«šFýÿ!©Õ« ©"iÿÿ!©ä«©"iäÿ[ÿ¹ÿá«ýÿÑ«ÿÿà«Ðÿá«ýÿÑ«ÿÿà«Ðÿá«ýÿÑ«ÿÿà«äÿ[ÿ¹ÿ©á«©ýÿ©Ñ«©ÿÿ©à«©Ðÿ©á«©ýÿ©Ñ«©ÿÿ©à«©Ðÿ©á«©ýÿ©Ñ«©ÿÿ©à«©äÿIÿ¹ÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«äÿIÿ¹ÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«äÿÁÿ¹ÿýü«ü«û«úû«ýÿø«ýû«ú«þ«üó«ÿÿù«þ«üþ«ó«Ðÿýü«ü«û«úû«ýÿø«ýû«ú«þ«üó«ÿÿù«þ«üþ«ó«Ðÿýü«ü«û«úû«ýÿø«ýû«ú«þ«üó«ÿÿù«þ«üþ«ó«äÿèÿ¹ÿ««û«ù««««û«ýÿø«««ò«««««ó«ÿÿø« ««««««üö«Ðÿ««û«ù««««û«ýÿø«««ò«««««ó«ÿÿø« ««««««üö«Ðÿ««û«ù««««û«ýÿø«««ò«««««ó«ÿÿø« ««««««üö«äÿôÿ¹ÿþ«ú«ø«««þ«ü«ýÿø«þ«««ý«ü««þ««ó«ÿÿ÷«þ««««üö«Ðÿþ«ú«ø«««þ«ü«ýÿø«þ«««ý«ü««þ««ó«ÿÿ÷«þ««««üö«Ðÿþ«ú«ø«««þ«ü«ýÿø«þ«««ý«ü««þ««ó«ÿÿ÷«þ««««üö«äÿÖÿ¹ÿý«ü«ù««þ«þû«ýÿø«þ«ù«ü«««ûõ«ÿÿø«««öö«Ðÿý«ü«ù««þ«þû«ýÿø«þ«ù«ü«««ûõ«ÿÿø«««öö«Ðÿý«ü«ù««þ«þû«ýÿø«þ«ù«ü«««ûõ«ÿÿø«««öö«äÿaÿ¹ÿî«ó«ýÿí«þæ«ÿÿÞ«Ðÿî«ó«ýÿí«þæ«ÿÿÞ«Ðÿî«ó«ýÿí«þæ«ÿÿÞ«äÿIÿ¹ÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«äÿIÿ¹ÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«äÿIÿ¹ÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«Ðÿß«ýÿÏ«ÿÿÞ«äÿ[ÿ¹ÿšá«šýÿšÑ«šÿÿšà«šÐÿšá«šýÿšÑ«šÿÿšà«šÐÿšá«šýÿšÑ«šÿÿšà«šäÿyÿ¹ÿ%šã«š%<ýÿ8©Õ« ©@ÿÿ8©ä«©@Ðÿ%šã«š%<ýÿ8©Õ« ©@ÿÿ8©ä«©@Ðÿ%šã«š%<ýÿ8©Õ« ©@ÿÿ8©ä«©@äÿsÿ¹ÿõ;áõýÿùoÕ FûÿÿùoäFûÐÿõ;áõýÿùoÕ FûÿÿùoäFûÐÿõ;áõýÿùoÕ FûÿÿùoäFûäÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿ²ÿÁÿðþÿÿûÿýåÿòýÿøÿþÿÿúÿôÿñýÿøÿèÿñþÿÿûÿýåÿòýÿøÿþÿÿúÿôÿñýÿøÿèÿðþÿÿûÿýåÿñýÿøÿþÿÿúÿôÿñýÿøÿôÿ«ÿÁÿïþÿÿÿþÿüåÿòÿýÿ÷ÿþÿôöÿò«üÿýÿùêÿñÿþÿÿÿþÿüåÿòÿýÿ÷ÿþÿôöÿò«üÿýÿùêÿñþÿÿÿþÿüåÿòfýÿ÷ÿþÿôöÿò«üÿýÿùöÿ·ÿÁÿïþÿúÿþÿåÿòÿýÿÿúÿÿþÿÿööÿò«ýÿüÿúéÿñÿþÿúÿþÿåÿòÿýÿÿúÿÿþÿÿööÿò«ýÿüÿúéÿñþÿúÿþÿåÿòfýÿÿúÿÿþÿÿööÿò«ýÿüÿúõÿÿÁÿñÕÿòõÿöÿðÿò÷ÿüÿéÿñÕÿòõÿöÿðÿò÷ÿüÿéÿñÕÿòõÿöÿðÿò÷ÿüÿõÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿÿÿÿÿÿ±ÿbÿÁÿðþÿÿÿúÿäÿòýÿÿýŠÿðþÿÿÿúÿäÿñýÿÿýŠÿñþÿÿÿúÿäÿñýÿÿý²ÿZÿÁÿïþÿõäÿòÿýÿÿþÿ§ÿñþÿõäÿòfýÿÿþÿ§ÿñÿþÿõäÿòfýÿÿþÿ³ÿ`ÿÁÿïþÿÿüÿþäÿòÿûÿýŠÿñþÿÿüÿþäÿòfûÿýŠÿñÿþÿÿüÿþäÿòfûÿý²ÿ4ÿÁÿñÕÿòÿñÕÿòÿñÕÿòšÿÿÿÿÿÿ±ÿÿö"_Àãè4
ô Ian EslickIan EslickCurrent Userÿÿÿÿÿÿÿÿÿÿÿÿ >ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿRÿÿÿÿÿÿÿÿdOÏꪹ)èsê#ÇPowerPoint Document(ÿÿÿÿ5SummaryInformation(ÿÿÿÿÿÿÿÿt1DocumentSummaryInformation8ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ
þÿÿÿÿÿÿÿ> !"#$%&'()*+,-./01234567þÿÿÿÿÿÿÿÿÿÿÿ<ýÿÿÿþÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿCurrent Userÿÿÿÿÿÿÿÿÿÿÿÿ >ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿþÿÿÿþÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿö"_Àãè4
ôÈIan EslickIan Eslick
1
0
Update of /project/elephant/cvsroot/elephant/tests
In directory clnet:/tmp/cvs-serv4643
Added Files:
testconditions.lisp
Log Message:
New test file for conditions as we add them
--- /project/elephant/cvsroot/elephant/tests/testconditions.lisp 2007/04/21 17:26:37 NONE
+++ /project/elephant/cvsroot/elephant/tests/testconditions.lisp 2007/04/21 17:26:37 1.1
;;; testconditions.lisp
;;;
;;; part of
;;;
;;; Elephant: an object-oriented database for Common Lisp
;;;
;;; Copyright (c) 2007 by Ian Eslick
;;; <ieslick common-lisp net>
;;;
;;; Elephant users are granted the rights to distribute and use this software
;;; as governed by the terms of the Lisp Lesser GNU Public License
;;; (http://opensource.franz.com/preamble.html) also known as the LLGPL.
(in-package :ele-tests)
(deftest cross-store-reference-condition
(if (or (not (boundp '*test-spec-secondary*))
(null *test-spec-secondary*))
(progn
(format t "~%Second store spec missing: ignoring")
t)
(let (*store-controller*
(sc1 (open-store *test-spec-primary* :recover t :deadlock-detect nil))
(sc2 (open-store *test-spec-secondary* :recover t :deadlock-detect nil)))
(unwind-protect
(progn
(let ((inst1 (make-instance 'pfoo :slot1 100 :sc sc1))
(inst2 (make-instance 'pfoo :slot1 200 :sc sc2)))
(values
(is-not-null (add-to-root 'inst1 inst1 :sc sc1))
(is-not-null (add-to-root 'inst2 inst2 :sc sc2))
(signals-condition (add-to-root 'inst1 inst1 :sc2))
(signals-condition (add-to-root 'inst2 inst2 :sc1)))))
(close-store sc1)
(close-store sc2))))
t t t t)
1
0
Update of /project/elephant/cvsroot/elephant/tests
In directory clnet:/tmp/cvs-serv3920/tests
Modified Files:
testserializer.lisp
Log Message:
Check for cross-store loading errors in multi-store operation; more documentation; backend language to data store language
--- /project/elephant/cvsroot/elephant/tests/testserializer.lisp 2007/04/04 15:28:30 1.20
+++ /project/elephant/cvsroot/elephant/tests/testserializer.lisp 2007/04/21 17:23:02 1.21
@@ -496,5 +496,3 @@
(progn (setf (get-value f2 h) f2)
(eq (get-value f2 h) f2))))
t t t t t t t t)
-
-
1
0
Update of /project/elephant/cvsroot/elephant/src/elephant
In directory clnet:/tmp/cvs-serv3920/src/elephant
Modified Files:
classes.lisp controller.lisp package.lisp serializer2.lisp
Added Files:
data-store-api.lisp
Removed Files:
backend.lisp
Log Message:
Check for cross-store loading errors in multi-store operation; more documentation; backend language to data store language
--- /project/elephant/cvsroot/elephant/src/elephant/classes.lisp 2007/04/12 02:47:31 1.27
+++ /project/elephant/cvsroot/elephant/src/elephant/classes.lisp 2007/04/21 17:22:50 1.28
@@ -252,6 +252,30 @@
(indexed-slot-makunbound class instance slot-def)
(persistent-slot-makunbound (get-con instance) instance (slot-definition-name slot-def))))
+;; ===================================
+;; Multi-store error checking
+;; ===================================
+
+(defun valid-persistent-reference-p (object sc)
+ "Ensures that object can be written as a reference into store sc"
+ (eq (dbcn-spc-pst object) (controller-spec sc)))
+
+(define-condition cross-store-reference ()
+ ((object :accessor cross-store-reference-object :initarg :object)
+ (home-controller :accessor cross-store-reference-home-controller :initarg :home-ctrl)
+ (foreign-controller :accessor cross-store-reference-foreign-controller :initarg :foreign-ctrl))
+ (:documentation "An error condition raised when an object is being written into a data store other
+ than its home store"))
+
+(defun raise-cross-store-condition (object sc)
+ (cerror "Proceed and patch later"
+ 'cross-store-reference
+ :format-control "Attempted to write object ~A with home store ~A into store ~A"
+ :format-arguments (list object (get-con object) sc)
+ :object object
+ :home-ctrl (get-con object)
+ :foreign-ctrl sc))
+
;; ======================================================
;; Handling metaclass overrides of normal slot operation
;; ======================================================
--- /project/elephant/cvsroot/elephant/src/elephant/controller.lisp 2007/04/12 02:47:32 1.46
+++ /project/elephant/cvsroot/elephant/src/elephant/controller.lisp 2007/04/21 17:22:50 1.47
@@ -26,26 +26,26 @@
;; TRACKING OBJECT STORES
;;
-(defvar *elephant-backends*
+(defvar *elephant-data-stores*
'((:bdb (:ele-bdb))
(:clsql (:ele-clsql))
)
"Tells the main elephant code the tag used in a store spec to
- refer to a given backend. The second argument is an asdf
- dependency list. Entries have the form of (backend-type
+ refer to a given data store. The second argument is an asdf
+ dependency list. Entries have the form of (data store type
asdf-depends-list")
(defvar *elephant-controller-init* (make-hash-table))
-(defun register-backend-con-init (name controller-init-fn)
- "Backends must call this function during the
+(defun register-data-store-con-init (name controller-init-fn)
+ "Data stores must call this function during the
loading/compilation process to register their initialization
- function for the tag name in *elephant-backends*. The
+ function for the tag name in *elephant-data-stores*. The
initialization function returns a fresh instance of the
- backends store-controller subclass"
+ data stores store-controller subclass"
(setf (gethash name *elephant-controller-init*) controller-init-fn))
-(defun lookup-backend-con-init (name)
+(defun lookup-data-store-con-init (name)
(gethash name *elephant-controller-init*))
(defvar *dbconnection-spec* (make-hash-table :test 'equal))
@@ -86,19 +86,19 @@
(defun build-controller (spec)
"Actually construct the controller & load dependencies"
(assert (and (consp spec) (symbolp (first spec))))
- (load-backend (first spec))
- (let ((init (lookup-backend-con-init (first spec))))
- (unless init (error "Store controller init function not registered for backend ~A." (car spec)))
+ (load-data-store (first spec))
+ (let ((init (lookup-data-store-con-init (first spec))))
+ (unless init (error "Store controller init function not registered for data store ~A." (car spec)))
(let ((sc (funcall (symbol-function init) spec)))
(ele-with-lock (*dbconnection-lock*)
(setf (gethash spec *dbconnection-spec*) sc))
sc)))
-(defun load-backend (type)
+(defun load-data-store (type)
(assert (find-package :asdf))
- (let ((record (assoc type *elephant-backends*)))
+ (let ((record (assoc type *elephant-data-stores*)))
(when (or (null record) (not (consp record)))
- (error "Unknown backend type ~A, cannot load" type))
+ (error "Unknown data store type ~A, cannot load" type))
(satisfy-asdf-dependencies (second record))))
(defun satisfy-asdf-dependencies (dep-list)
@@ -115,7 +115,7 @@
(defun get-user-configuration-parameter (name)
"This function pulls a value from the key-value pairs stored in
- my-config.sexp so backends can have their own pairs for appropriate
+ my-config.sexp so data stores can have their own pairs for appropriate
customization after loading."
(elephant-system::get-config-option
name
@@ -129,24 +129,24 @@
((spec :type list
:accessor controller-spec
:initarg :spec
- :documentation "Backend initialization functions are
+ :documentation "Data store initialization functions are
expected to initialize :spec on the call to
make-instance")
;; Generic support for the object, indexing and root protocols
(root :reader controller-root
- :documentation "This is an instance of the backend
+ :documentation "This is an instance of the data store
persistent btree. It should have an OID that is fixed in
the code and does not change between sessions. Usually
it this is something like 0, 1 or -1")
(class-root :reader controller-class-root
:documentation
"This is another root for class indexing that is
- also a backend specific persistent btree instance
+ also a data store specific persistent btree instance
with a unique OID that persists between sessions.")
(instance-cache :accessor instance-cache :initform (make-cache-table :test 'eql)
:documentation
"This is an instance cache and part of the
- metaclass protocol. Backends should not
+ metaclass protocol. Data stores should not
override the default behavior.")
(instance-cache-lock :accessor instance-cache-lock :initform (ele-make-lock)
:documentation "Protection for updates to
@@ -157,12 +157,12 @@
:documentation "Governs the default
behavior regarding which serializer
version the current elephant core is
- using. Backends can override by creating
+ using. Data stores can override by creating
a method on initialize-serializer.")
(serialize :accessor controller-serialize :initform nil
:documentation "Accessed by elephant::serialize to
get the entry point to the default serializer or to
- a backend-specific serializer")
+ a data store specific serializer")
(deserialize :accessor controller-deserialize :initform nil
:documentation "Contains the entry point for the
specific serializer to be called by
@@ -175,6 +175,9 @@
the superclass and subclasses. See slot documentation for
details."))
+(defmethod print-object ((sc store-controller) stream)
+ (format stream "#<~A ~A>" (type-of sc) (second (controller-spec sc))))
+
;;
;; Per-controller instance caching
;;
@@ -208,8 +211,8 @@
;;
(defgeneric database-version (sc)
- (:documentation "Backends implement this to store the serializer version.
- The protocol requires that backends report their database
+ (:documentation "Data stores implement this to store the serializer version.
+ The protocol requires that data stores report their database
version. On new database creation, the database is written with the
*elephant-code-version* so that is returned by database-version.
If a legacy database does not have a version according to the method
@@ -280,9 +283,9 @@
;;
(defmethod initialize-serializer ((sc store-controller))
- "Establish serializer version on controller startup. Backends call this before
+ "Establish serializer version on controller startup. Data stores call this before
they need the serializer to be valid and after they enable their database-version
- call. If the backend shadows this, it has to keep track of serializer versions
+ call. If the data store shadows this, it has to keep track of serializer versions
associated with the database version that is opened."
(cond ((prior-version-p (database-version sc) '(0 6 0))
(setf (controller-serializer-version sc) 1)
@@ -367,19 +370,19 @@
;; ================================================================================
;;
-;; BACKEND STORE CONTROLLER PROTOCOL
+;; DATA STORE CONTROLLER PROTOCOL
;;
;; ================================================================================
(defgeneric open-controller (sc &key recover recover-fatal thread &allow-other-keys)
(:documentation
"Opens the underlying environment and all the necessary
-database tables. Different backends may use different keys so
+database tables. Different data stores may use different keys so
all methods should &allow-other-keys. There are three standard
keywords: :recover, :recover-fatal and :thread. Recover means
that recovery should be checked for or performed on startup.
Recover fatal means a full rebuild from log files is requested.
-Thread merely indicates to the backend that it is a threaded
+Thread merely indicates to the data store that it is a threaded
application and any steps that need to be taken (for example
transaction implementation) are taken. :thread is usually
true."))
@@ -407,7 +410,7 @@
(defgeneric optimize-layout (sc &key &allow-other-keys)
(:documentation "If supported, speed up the index and allocation by freeing up
any available storage and return it to the free list. See the
- methods of backends to determine what options are valid. Supported
+ methods of data stores to determine what options are valid. Supported
both on stores (all btrees and persistent slots) and specific btrees"))
;;
@@ -416,19 +419,19 @@
(defgeneric persistent-slot-reader (sc instance name)
(:documentation
- "Backend specific slot reader function"))
+ "Data store specific slot reader function"))
(defgeneric persistent-slot-writer (sc new-value instance name)
(:documentation
- "Backend specific slot writer function"))
+ "Data store specific slot writer function"))
(defgeneric persistent-slot-boundp (sc instance name)
(:documentation
- "Backend specific slot bound test function"))
+ "Data store specific slot bound test function"))
(defgeneric persistent-slot-makunbound (sc instance name)
(:documentation
- "Backend specific slot makunbound handler"))
+ "Data store specific slot makunbound handler"))
;; ================================================================================
@@ -439,7 +442,7 @@
;;
-;; Opening and closing backend stores
+;; Opening and closing data stores
;;
(defun open-store (spec &rest args)
--- /project/elephant/cvsroot/elephant/src/elephant/package.lisp 2007/04/12 02:47:33 1.30
+++ /project/elephant/cvsroot/elephant/src/elephant/package.lisp 2007/04/21 17:22:50 1.31
@@ -265,6 +265,9 @@
#:struct-constructor
+ ;; Various error conditions
+ #:cross-store-reference
+
#:map-class-query
#:get-query-instances
)
--- /project/elephant/cvsroot/elephant/src/elephant/serializer2.lisp 2007/04/12 02:47:33 1.38
+++ /project/elephant/cvsroot/elephant/src/elephant/serializer2.lisp 2007/04/21 17:22:51 1.39
@@ -40,7 +40,9 @@
array-type-from-byte
byte-from-array-type
database-version
- translate-and-intern-symbol))
+ translate-and-intern-symbol
+ valid-persistent-reference-p
+ raise-cross-store-condition))
(in-package :elephant-serializer2)
@@ -198,6 +200,8 @@
(string
(serialize-string frob bs))
(persistent
+ (unless (valid-persistent-reference-p frob sc)
+ (raise-cross-store-condition frob sc))
(buffer-write-byte +persistent+ bs)
(buffer-write-int32 (oid frob) bs)
;; This circumlocution is necessitated by
--- /project/elephant/cvsroot/elephant/src/elephant/data-store-api.lisp 2007/04/21 17:23:02 NONE
+++ /project/elephant/cvsroot/elephant/src/elephant/data-store-api.lisp 2007/04/21 17:23:02 1.1
;;; -*- Mode: Lisp; Syntax: ANSI-Common-Lisp; Base: 10 -*-
;;;
;;; backend.lisp -- Namespace support for data store packages
;;;
;;; By Ian Eslick <ieslick common-lisp net>
;;;
;;; part of
;;;
;;; Elephant: an object-oriented database for Common Lisp
;;;
;;; Copyright (c) 2004 by Andrew Blumberg and Ben Lee
;;; <ablumberg(a)common-lisp.net> <blee(a)common-lisp.net>
;;;
;;; Portions Copyright (c) 2005-2007 by Robert Read and Ian Eslick
;;; <rread common-lisp net> <ieslick common-lisp net>
;;;
;;; Elephant users are granted the rights to distribute and use this software
;;; as governed by the terms of the Lisp Lesser GNU Public License
;;; (http://opensource.franz.com/preamble.html) also known as the LLGPL.
;;;
(in-package :cl-user)
(defmacro defpackage-import-exported (name source-package &rest args)
"Define an export list, a source package and this macro will automatically
import from that package the exported symbol names."
(let* ((exports (find :export args :key #'car))
(imports `(:import-from ,source-package ,@(cdr exports))))
`(defpackage ,name
,@(append args (list imports)))))
(defpackage-import-exported :elephant-data-store :elephant
(:documentation "Data stores should use this to get access to internal symbols
of elephant that importers of elephant shouldn't see. Backends should also
import elephant to get use-api generic function symbols, classes and globals")
(:use #:elephant)
(:export
;; Variables
#:*dbconnection-spec*
#:connection-is-indeed-open
;; Persistent objects
#:oid #:get-con
#:next-oid
#:persistent-slot-writer
#:persistent-slot-reader
#:persistent-slot-boundp
#:persistent-slot-makunbound
;; Controllers
#:*elephant-code-version*
#:open-controller
#:close-controller
#:database-version
#:controller-spec
#:controller-serializer-version
#:controller-serialize
#:controller-deserialize
#:root #:spec #:class-root
;; Collections
#:build-btree
#:build-indexed-btree
;; Serializer tools/api's
#:serialize #:deserialize
#:deserialize-from-base64-string
#:serialize-to-base64-string
#:initialize-serializer
#:serialize-database-version-key
#:serialize-database-version-value
#:deserialize-database-version-value
;; Cursor accessors
#:cursor-btree
#:cursor-oid
#:cursor-initialized-p
;; Transactions
#:*current-transaction*
#:make-transaction-record
#:transaction-store
#:transaction-object
#:execute-transaction
#:controller-start-transaction
#:controller-abort-transaction
#:controller-commit-transaction
;; Registration
#:register-data-store-con-init
#:lookup-data-store-con-init
#:get-user-configuration-parameter
;; Misc
#:slot-definition-name
#:slots-and-values
#:struct-slots-and-values
))
1
0
Update of /project/elephant/cvsroot/elephant/src/db-clsql
In directory clnet:/tmp/cvs-serv3920/src/db-clsql
Modified Files:
package.lisp sql-controller.lisp
Log Message:
Check for cross-store loading errors in multi-store operation; more documentation; backend language to data store language
--- /project/elephant/cvsroot/elephant/src/db-clsql/package.lisp 2007/04/12 02:47:24 1.4
+++ /project/elephant/cvsroot/elephant/src/db-clsql/package.lisp 2007/04/21 17:22:39 1.5
@@ -20,7 +20,7 @@
(defpackage db-clsql
(:use :common-lisp :uffi :cl-base64
- :elephant :elephant-memutil :elephant-backend
+ :elephant :elephant-memutil :elephant-data-store
:elephant-utils
#+sbcl :sb-thread
))
--- /project/elephant/cvsroot/elephant/src/db-clsql/sql-controller.lisp 2007/04/12 02:47:24 1.24
+++ /project/elephant/cvsroot/elephant/src/db-clsql/sql-controller.lisp 2007/04/21 17:22:40 1.25
@@ -88,10 +88,10 @@
(eval-when (:compile-toplevel :load-toplevel)
- (register-backend-con-init :clsql 'sql-test-and-construct))
+ (register-data-store-con-init :clsql 'sql-test-and-construct))
(defun sql-test-and-construct (spec)
- "Entry function for making SQL backend controllers"
+ "Entry function for making SQL data store controllers"
(if (sql-store-spec-p spec)
(make-instance 'sql-store-controller
:spec (if spec spec
@@ -167,7 +167,7 @@
;; ISE NOTE: Much of the index management functionality is common between
;; bdb and sql - we could lift this along with indices and indices-cache
;; up to the main elephant code base and introduce a new update-index
-;; generic function to handle the backend specific method for updating
+;; generic function to handle the data store specific method for updating
(defmethod map-indices (fn (bt sql-indexed-btree))
(maphash fn (indices-cache bt)))
1
0
Update of /project/elephant/cvsroot/elephant/src/db-bdb
In directory clnet:/tmp/cvs-serv3920/src/db-bdb
Modified Files:
bdb-controller.lisp package.lisp
Log Message:
Check for cross-store loading errors in multi-store operation; more documentation; backend language to data store language
--- /project/elephant/cvsroot/elephant/src/db-bdb/bdb-controller.lisp 2007/04/12 02:47:23 1.33
+++ /project/elephant/cvsroot/elephant/src/db-bdb/bdb-controller.lisp 2007/04/21 17:22:36 1.34
@@ -43,7 +43,7 @@
et cetera."))
;;
-;; Backend Registry Support
+;; Data store Registry Support
;;
(defun bdb-test-and-construct (spec)
@@ -52,7 +52,7 @@
(error (format nil "uninterpretable spec specifier: ~A" spec))))
(eval-when (:compile-toplevel :load-toplevel)
- (register-backend-con-init :bdb 'bdb-test-and-construct))
+ (register-data-store-con-init :bdb 'bdb-test-and-construct))
(defun bdb-store-spec-p (spec)
(and (eq (first spec) :bdb)
@@ -192,7 +192,7 @@
;;
;; Store the database version
;;
-;; For BDB this can be in a file; different backends may require a different approach.
+;; For BDB this can be in a file; different data stores may require a different approach.
(defmethod database-version ((sc bdb-store-controller))
"Elephant protocol to provide the version tag or nil if unmarked"
@@ -282,7 +282,7 @@
(defmethod optimize-layout ((ctrl bdb-store-controller) &key start-key stop-key
(freelist-only t) (free-space nil)
&allow-other-keys)
- "Tell the backend to optimize and reclaim storage between key values"
+ "Tell the data store to optimize and reclaim storage between key values"
(with-buffer-streams (start stop end)
(if (null start-key)
(progn
--- /project/elephant/cvsroot/elephant/src/db-bdb/package.lisp 2007/04/12 02:47:23 1.9
+++ /project/elephant/cvsroot/elephant/src/db-bdb/package.lisp 2007/04/21 17:22:37 1.10
@@ -33,7 +33,7 @@
Elephant, but with some magic for Elephant. In general there
is a 1-1 mapping from functions here and functions in
Berkeley DB, so refer to their documentation for details.")
- (:use common-lisp uffi elephant-memutil elephant elephant-backend elephant-utils)
+ (:use common-lisp uffi elephant-memutil elephant elephant-data-store elephant-utils)
#+cmu
(:use alien)
#+sbcl
1
0
Update of /project/elephant/cvsroot/elephant/doc
In directory clnet:/tmp/cvs-serv3920/doc
Modified Files:
elephant-design.texinfo elephant.texinfo installation.texinfo
make-ref.lisp reference.texinfo scenarios.texinfo
tutorial.texinfo user-guide.texinfo
Log Message:
Check for cross-store loading errors in multi-store operation; more documentation; backend language to data store language
--- /project/elephant/cvsroot/elephant/doc/elephant-design.texinfo 2007/04/01 14:33:29 1.3
+++ /project/elephant/cvsroot/elephant/doc/elephant-design.texinfo 2007/04/21 17:22:35 1.4
@@ -1,8 +1,8 @@
@c -*-texinfo-*-
-@node Elephant Design
+@node Elephant Architecture
@comment node-name, next, previous, up
-@chapter Elephant Design
+@chapter Elephant Architecture
@cindex design
Elephant's early architecture was tightly coupled to the Berkeley DB
--- /project/elephant/cvsroot/elephant/doc/elephant.texinfo 2007/04/12 02:47:23 1.8
+++ /project/elephant/cvsroot/elephant/doc/elephant.texinfo 2007/04/21 17:22:35 1.9
@@ -20,8 +20,8 @@
@titlepage
@title Elephant User Manual
-@subtitle Elephant version 0.6.1
-@author Ben Lee and Ian Eslick
+@subtitle Elephant version 0.9
+@author Ian Eslick and Ben Lee
@c The following two commands
@c start the copyright page.
@@ -50,9 +50,9 @@
* Tutorial:: A basic ``getting started'' tutorial.
* Installation:: Installation and test-suite procedures.
* User Guide:: In depth discussion of all Elephant facilities and features.
-* Usage Scenarios:: Design scenarios for Elephant applications.
* User API Reference:: Function and class documentation of the user API.
-* Elephant Design:: An overview of elephant's internal architecture.
+* Design Patterns:: Design scenarios for Elephant applications.
+* Elephant Architecture:: An overview of elephant's internal architecture.
* Data Store API Reference:: Function level documentation for data store implementors.
* Copyright and License:: Your rights and freedoms.
@end menu
@@ -78,8 +78,8 @@
@include tutorial.texinfo
@include installation.texinfo
@include user-guide.texinfo
-@include scenarios.texinfo
@include reference.texinfo
+@include scenarios.texinfo
@include elephant-design.texinfo
@include data-store-reference.texinfo
@include copying.texinfo
--- /project/elephant/cvsroot/elephant/doc/installation.texinfo 2007/04/12 02:47:23 1.9
+++ /project/elephant/cvsroot/elephant/doc/installation.texinfo 2007/04/21 17:22:35 1.10
@@ -9,9 +9,9 @@
* Requirements:: Supported lisps and required libraries.
* Configuring Elephant:: Setting up Elephant and the configuration file.
* Loading Elephant:: Loading Elephant and the data store loading protocol.
-* Berkeley DB Data Store:: Installing support for the Berkeley DB data store
+* Berkeley DB:: Installing support for the Berkeley DB data store
* Berkeley DB Example:: An example of installing and running the Berkeley DB data store.
-* CL-SQL Data Store:: Install and connecting to the CL-SQL data store
+* CL-SQL:: Install and connecting to the CL-SQL data store
* CL-SQL Example:: An example of using the CL-SQL data store.
* Elephant on Windows:: More details about running Elephant on Windows
* Test Suites:: How to run and interpret the output of the regression test suite
@@ -88,8 +88,8 @@
of you with asdf-install on your system)
In addition to these libraries, each data store has their own
-dependencies as discussed in @ref{Berkeley DB Data Store} and
-@ref{CL-SQL Data Store}.
+dependencies as discussed in @ref{Berkeley DB} and
+@ref{CL-SQL}.
@node Configuring Elephant
@comment node-name, next, previous, up
@@ -224,9 +224,9 @@
database and return the @code{store-controller} subclass instance for
that backend.
-@node Berkeley DB Data Store
+@node Berkeley DB
@comment node-name, next, previous, up
-@section Berkeley DB Data Store
+@section Berkeley DB
The Berkeley DB Data Store started out as a very simple data dictionary in the
Berkeley Unix operating system. There are many ``Xdb'' systems that use the
@@ -275,9 +275,9 @@
in your application.
-@node CL-SQL Data Store
+@node CL-SQL
@comment node-name, next, previous, up
-@section CL-SQL Data Store
+@section CL-SQL
Although originally designed as an interface to the BerkeleyDB system,
the original Elephant system has been experimenetally extended to
--- /project/elephant/cvsroot/elephant/doc/make-ref.lisp 2007/04/12 02:47:23 1.8
+++ /project/elephant/cvsroot/elephant/doc/make-ref.lisp 2007/04/21 17:22:35 1.9
@@ -1,5 +1,7 @@
(require 'asdf)
(asdf:operate 'asdf:load-op 'elephant :force t)
+(in-package :elephant)
+
(load (merge-pathnames
#p"src/elephant/query"
(asdf:component-pathname (asdf:find-system 'elephant))))
@@ -19,8 +21,6 @@
(sb-posix:chdir include-dir-path)
(load docstrings-path)
-(in-package :elephant)
-
(defclass simple-store-controller (store-controller)
())
--- /project/elephant/cvsroot/elephant/doc/reference.texinfo 2007/04/12 02:47:23 1.10
+++ /project/elephant/cvsroot/elephant/doc/reference.texinfo 2007/04/21 17:22:35 1.11
@@ -8,8 +8,8 @@
@menu
* Store Controllers:: Connecting to a data store.
-* Persistent Class:: Defining persistent classes and creating and manipulating persistent indices.
-* Class Indexing:: Convenient indexing of persistent classes.
+* Persistent Objects:: Defining persistent classes and creating and manipulating persistent indices.
+* Persistent Object Indexing:: Convenient indexing of persistent classes.
* Persistent Sets:: Maintaining persistent collections the easy way.
@c * Query Interfaces:: Finding instances.
* BTrees:: BTrees and indices, a low level persistent data structure.
--- /project/elephant/cvsroot/elephant/doc/scenarios.texinfo 2007/04/19 22:25:51 1.6
+++ /project/elephant/cvsroot/elephant/doc/scenarios.texinfo 2007/04/21 17:22:35 1.7
@@ -11,7 +11,7 @@
* Persistent System Objects:: Making persistent objects a natural part of your system
* Elephant as Database:: Using Elephant as a database for records and user data instead of using a SQL relational Database
* Multithreaded Web Applications:: Elephant is a natural match for web applications
-* Graph-oriented Applications:: Elephant is good, but not optimized, for graph-oriented applications.
+@c * Graph-oriented Applications:: Elephant is good, but not optimized, for graph-oriented applications.
* Real-World Application Examples:: See some real-world applications Elephant has been used for and a brief discussion of how it was used and any novel uses of Elephant.
@end menu
@@ -32,6 +32,92 @@
that they will be motivated to contribute design patterns of their own.
+@node Persistent System Objects
+@comment node-name, next, previous, up
+@section Persistent System Objects
+
+The simplest design pattern supported by Elephant is the use of
+persistent objects in the place of standard objects. Typically you
+can just modify the old class definition to inherit the
+@code{persistent-metaclass}. Depending on your application, objects
+may need to have transient slots for performance reasons. We'll
+create a dummy class to illustrate:
+
+@lisp
+(defclass system-object ()
+ ((appname :accessor system-appname :initarg :name)
+ (url :accessor system-url :initarg :url)
+ (state :accessor system-state :initarg :state :initform 'idle))
+ (:metaclass persistent-metaclass))
+@end lisp
+
+When starting up your application you need to recover references to
+any persistent objects that were created in a prior session or
+initialize a new one.
+
+If you are storing system objects in parameters, you can just call
+an initialization function on startup:
+
+@lisp
+(defparameter *system* nil)
+
+(defun initialize-system (appname)
+ (let ((system-object (get-from-root '*system*)))
+ (setf *system
+ (if system-object system-object
+ (make-instance 'system-object :name appname)))))
+
+*system*
+=> #<SYSTEM-OBJECT ...>
+@end lisp
+
+And now you can use your parameter as you did before. If you want to
+avoid calling initialization functions, you can just accesss system
+objects through functions instead of parameters.
+
+@lisp
+(defparameter *system* nil)
+
+(defun sys-object ()
+ (unless *system
+ (let ((appname (get-application-name))
+ (url (get-system-url)))
+ (setf *system* (make-instance 'system-object :name appname :url url))))
+ *system*)
+
+(sys-object)
+=> #<SYSTEM-OBJECT ...>
+@end lisp
+
+One constraint to keep in mind is that slot access will be slower as
+it has to synchronize to disk. This is usually not noticable for
+objects that are accessed on the order of seconds instead of
+milliseconds. For objects read constantly, but where you want to save
+any written values it helps to have a transient slot to cache values.
+You can override some methods to ensure that the persistent value is
+always updated, but that reads happen from the cached value and that
+the cached value is restored whenever the object is loaded.
+
+@lisp
+(defclass system-object ()
+ ((appname :accessor system-appname :initarg :name)
+ (url :accessor system-url :initarg :url)
+ (laststate :accessor system-laststate :initarg :state :initform 'idle)
+ (state :accessor system-state :initarg :state :transient t)
+ (:metaclass persistent-metaclass))
+
+(defmethod (setf system-state) :after (state (sys system-state))
+ (setf (system-laststate sys) state))
+
+(defmethod initialize-instance :after ((sys system-state) &rest rest)
+ (declare (ignore rest))
+ (when (slot-boundp sys 'laststate)
+ (setf (system-state sys) (system-laststate sys))))
+@end lisp
+
+And now you have an instant read cache for a slot value. This pattern
+is used several times within the Elephant implementation.
+
@node File System Replacement
@comment node-name, next, previous, up
@section File System Replacement
@@ -43,11 +129,14 @@
Because Elephant's serializer supports most lisp types, Elephant can
greatly simplify ease these concerns and allow you to work directly
with your natural in-memory representations with almost no work to
-encode/decode formats or manage files in the file system.
+encode/decode formats or manage files in the file
+system@footnote{Example provided by Ian Eslick, April 2007}.
The simplest way to accomplish this is to simply open a store
-controller and use the root btree as a key-value store instead of a
-file system directory. You might hide some of the details like this:
+controller and initialize a key-value pair in the root btree as a
+instead of a filename and file data in some system directory. Like
+the initialization process described for standard objects, you can
+hide some of the details like this:
@lisp
(defvar *resources* (make-hash-table))
@@ -97,7 +186,7 @@
conditions that allowed restarts that initialized values or allowed
users to update the hash in the background and continue computation.
-@footnote{Example provided by Ian Eslick, April 2007}
+
@node Checkpointing Conventional Program State
@comment node-name, next, previous, up
@@ -123,29 +212,27 @@
@subsection Assumptions
-To get speed, we want all our objects to be standard lisp objects that
-are in memory and have no special harnesses that would interfere with
-using the full power of lisp. At some point in execution, we want to
-store the current state of a bunch of objects to disk, but make it
-easy to reproduce the exact state at a later point in time. For
-simplicity, we'll assume that we are talking about collections of CLOS
-objects.
-
-An additional complication is that many programs have sets of
-interdependant objects. These could be complex program graphs, the
-state of an active search process or a standard OO system that uses a
-bunch of program objects to function. This means that we need to
-persist not just object state, but also references and any object that
-is referred to.
+To maintain processing speed and convenience we would like all our
+objects to be standard lisp objects without special harnesses that
+would interfere with applying the full power of lisp. At some point
+during execution, we want to store the current state of a set of
+objects to disk and yet make it easy to reproduce the original state
+at a later point in time. For simplicity, we'll limit ourselves
+to collections of CLOS objects.
+
+A complication is that many programs have sets of interdependant
+objects. These could be complex program graphs, the state of an
+ongoing search process or a standard OO system that uses a bunch of
+different program object types to run. This means that we need to
+persist not just object state, but also references to other objects.
Using CLOS reflection we can provide a general solution to capturing
objects, slot values and references. However to reproduce references,
-we'll need to be able to find the object referenced and the only
-general way to do that is to store it as well. Thus a snapshot is a
-closed set of self-referential objects.
+we'll need to be able to find the object referenced and the only way
+to do that is to store it as well. Thus we want to create a snapshot
+of a closed set of self-referential objects.
-The assumptions required to implement the simple checkpointing
-implemented here is:
+The assumptions underlying the snapshot mechanism is:
@itemize
@item @strong{Use standard CLOS objects and references to other CLOS objects.}
@@ -166,7 +253,149 @@
fine.
@end itemize
-@subsection Implementation: The Snapshot Set
+@subsection Snapshot Set
+
+The snapshot implementation is called a @code{snapshot-set}. The next
+section will go into detail, but a walkthrough will help make it
+clearer@footnote{Example provided by Ian Eslick, April 2007}.
+
+A snapshot set is quite easy to use. Load the complete code and play
+with this simple walk through. The code can be located in the
+Elephant source tree under @code{src/conrib/eslick/snapshot-set.lisp}.
+
+The first step is to create a @code{snapshot-set} object,
+
+@lisp
+(setf my-set (make-instance 'snapshot-set))
+@end lisp
+
+and add it to the root so we don't lose track of it.
+
+@lisp
+(add-to-root 'my-set my-set)
+@end lisp
+
+Then we need some objects to play with.
+
+@lisp
+(defclass my-test-class ()
+ ((value :accessor test-value :initarg :value)
+ (reference :accessor test-reference :initarg :reference)))
+
+(setf obj1 (make-instance 'my-test-class :value 1 :reference nil))
+(setf obj2 (make-instance 'my-test-class :value 2 :reference obj1))
+(setf obj3 (make-instance 'my-test-class :value 3 :reference obj2))
+
+(register-object obj3 my-set)
+(snapshot my-set)
+@end lisp
+
+Now your set should have persistent versions of all three classes that
+are reachable from @code{obj3}.
+
+@lisp
+(map-set (lambda (x) (print (test-value x))) my-set)
+=>
+3
+2
+1
+@end lisp
+
+Of course such fully connected objects are not always common, so we'll
+demonstrate using hash tables to create root indexes into our objects
+and sidestep registration calls entirely. We'll create a fresh set to
+work with.
+
+@lisp
+(setf my-set (make-instance 'snapshot-set))
+(add-to-root 'my-set my-set)
+
+(setf obj4 (make-instance 'my-test-class :value 4 :reference obj1))
+(setf obj5 (make-instance 'my-test-class :value 5 :reference nil))
+
+(setf hash (make-hash-table))
+(setf (snapshot-root my-set) hash)
+
+(setf (gethash 'obj3 hash) obj3)
+(setf (gethash 'obj4 hash) obj4)
+(setf (gethash 'obj5 hash) obj5)
+
+(snapshot my-set)
+@end lisp
+
+To properly simulate restoring objects, we need to drop our old hash
+table as well as clear the persistent object cache so the snapshot set
+transient object is reset.
+
+@lisp
+(setf my-set nil)
+(setf hash nil)
+(elephant::flush-instance-cache *store-controller*)
+@end lisp
+
+Now we'll pretend we're startup up a new session.
+
+@lisp
+(setf my-set (get-from-root 'my-set))
+(setf hash (snapshot-root my-set))
+@end lisp
+
+The cache is automatically populated by the implicit @code{restore}
+call during snapshot-set initialization, and our hash table should now
+have all the proper references. We'll pull out a few.
+
+@lisp
+(setf o4 (gethash 'obj4 hash))
+(setf o3 (gethash 'obj3 hash))
+(setf o2 (test-reference o3))
+
+(not (or (eq o4 obj4)
+ (eq o3 obj3)
+ (eq o2 obj2)))
+=> t
+@end lisp
+
+The new objects should not be eq the old ones as we have restored
+fresh copies from the disk.
+
+If you review the setup above, @code{obj3} references @code{obj2}
+which references @code{obj1} and @code{obj4} also references
+@code{obj1}. So if the objects were properly restored, these
+references should be @code{eq}.
+
+@lisp
+(eq (test-reference o2) (test-reference o4))
+=> t
+@end lisp
+
+And finally we can demonstrate the restorative power of snapshot sets.
+
+@lisp
+(remhash 'obj5 hash)
+
+(gethash 'obj5 hash)
+=> nil nil
+
+(restore my-set)
+(setf hash (snapshot-root my-set))
+
+(gethash 'obj5 hash)
+=> #<MY-TEST-CLASS ..> t
+
+(test-value *)
+=> 5
+@end lisp
+
+This means that while our set object was not reset, the restore
+operation properly restored the old reference structure of our root
+hash object. Unfortunately, in this implementation you have to reset
+your lisp pointers to get access to the restored objects.
+
+A future version could traverse the existing object cache, dropping
+new references and restoring old ones so that in-memory lisp pointers
+were still valid.
+
+@subsection Snapshot Set Implementation
In this section we walk through the implementation of the snapshot set
in detail as it provides:
@@ -323,7 +552,7 @@
standard object would get an immediately serialized version rather
than a reference. This of course makes it impossible to restore
multiple references to a single object. The approach taken here is to
-instantiate a @emphasize{proxy} object which is a copy of the original
+instantiate a @emph{proxy} object which is a copy of the original
class and stores references to normal values in its slots. Any
references to hashes or standard classes are replaced with a reference
object that records the unique id of the object so it can be properly
@@ -391,144 +620,6 @@
obj)))
@end lisp
-A full set of source code for @code{snapshot-sets} can be found in the
-Elephant source tree under @code{src/conrib/eslick/snapshot-set.lisp}.
-
-@subsection Using Snapshot Sets
-
-A snapshot set is quite easy to use. Load the complete code and play
-with this simple walk through. First we need to create a set object,
-
-@lisp
-(setf my-set (make-instance 'snapshot-set))
-@end lisp
-
-and add it to the root so we don't lose track of it.
-
-@lisp
-(add-to-root 'my-set my-set)
-@end lisp
-
-Then we need some objects to play with.
-
-@lisp
-(defclass my-test-class ()
- ((value :accessor test-value :initarg :value)
- (reference :accessor test-reference :initarg :reference)))
-
-(setf obj1 (make-instance 'my-test-class :value 1 :reference nil))
-(setf obj2 (make-instance 'my-test-class :value 2 :reference obj1))
-(setf obj3 (make-instance 'my-test-class :value 3 :reference obj2))
-
-(register-object obj3 my-set)
-(snapshot my-set)
-@end lisp
-
-Now your set should have persistent versions of all three classes that
-are reachable from @code{obj3}.
-
-@lisp
-(map-set (lambda (x) (print (test-value x))) my-set)
-=>
-3
-2
-1
-@end lisp
-
-Of course such fully connected objects are not always common, so we'll
-demonstrate using hash tables to create root indexes into our objects
-and sidestep registration calls entirely. We'll create a fresh set to
-work with.
-
-@lisp
-(setf my-set (make-instance 'snapshot-set))
-(add-to-root 'my-set my-set)
-
-(setf obj4 (make-instance 'my-test-class :value 4 :reference obj1))
-(setf obj5 (make-instance 'my-test-class :value 5 :reference nil))
-
-(setf hash (make-hash-table))
-(setf (snapshot-root my-set) hash)
[286 lines skipped]
--- /project/elephant/cvsroot/elephant/doc/tutorial.texinfo 2007/04/12 02:47:23 1.16
+++ /project/elephant/cvsroot/elephant/doc/tutorial.texinfo 2007/04/21 17:22:35 1.17
@@ -1048,7 +1048,7 @@
more than two levels of transactional accesses with the top using
with-transaction and the bottom using ensure-transaction.
-See @ref{Transaction Details} for more details and @ref{Usage Scenarios}
+See @ref{Transaction Details} for more details and @ref{Design Patterns}
for examples of how systems can be designed and tuned using transactions.
@node Advanced Topics
@@ -1114,4 +1114,4 @@
lisps.
@end itemize
-Further, @pxref{Usage Scenarios} for information about Elephant design patterns, solutions to common problems and other scenarios with multiple possible solutions.
+Further, @pxref{Design Patterns} for information about Elephant design patterns, solutions to common problems and other scenarios with multiple possible solutions.
--- /project/elephant/cvsroot/elephant/doc/user-guide.texinfo 2007/04/12 02:47:23 1.11
+++ /project/elephant/cvsroot/elephant/doc/user-guide.texinfo 2007/04/21 17:22:35 1.12
@@ -12,8 +12,8 @@
* Class Indices:: In-depth discussion about indexing persistent indices.
@c * Querying persistent instances:: Retrieving instances of classes.
* Using BTrees:: Using the native btree.
-* Secondary Indices:: Alternative ways to index collections.
* Using Cursors:: Low-level access to BTrees.
+* BTree Indices:: Alternative ways to index collections.
* Transaction Details:: Develop a deeper understanding of transactions and avoid the pitfalls.
* Multi-repository Operation:: Specifying repositories.
* Multi-threaded Applications:: What considerations are required for safe multi-threading
@@ -23,6 +23,8 @@
* Performance Tuning:: How to get the most from Elephant.
* Berkeley DB Data Store:: Commands and concerns specific to the :BDB data store
* CL-SQL Data Store:: Commands and concerns specific to the :CLSQL data store
+* Postmodern Data Store::
+* Native Lisp Data Store::
@end menu
@node The Store Controller
@@ -280,7 +282,7 @@
to other objects can copy every reachable object! This is a direct
and dire consequence of the ``store-by-value'' restriction.
(@pxref{Persistent Classes and Objects} for how to design around the
-store-by-value restriction}).
+store-by-value restriction).
This list describes how aggregates are handled by the serializer.
@@ -332,19 +334,26 @@
@section Persistent Classes and Objects
Persistent classes are instances of the @code{persistent-metaclass}
-metaclass. All instances of this persistent class have a unique ID
-and a pointer to the @code{store-controller} specification they are
-associated with. Accesses to slot values become direct reads and
-writes to the data store and are thus always persisted. When the
-instance itself is writtent to the database, for example as a key or
-value in a @code{btree}, only the unique ID is stored.
-
-Thus serialization of persistent objects is exceedingly cheap compared
-to standard objects, but slot access can be much more expensive.
-Persistent objects are excellent at, for example, storing the link
-structure of a graph. A graph of persistent objects can itself be
-persisted by storing the head node of a fully-connected graph to the
-store controller root.
+metaclass. All persistent classes keep track of which slots are
+@code{:persistent}, @code{:transient} and/or @code{:indexed} and are
+used as specializers in the persistence meta-object protocols
+(initialization of slots, slot-access, etc).
+
+All persistent classes create objects that inherit from the
+@code{persistent} class. The persistent class has two slots that
+contain a unique object identifier (oid) and a reference to the
+@code{store-controller} specification they are associated with.
+Persistent slots do not take up any storage space in memory, instead
+the slot access protocol is changed into calls to the configured data
+store via the store controller. Typically, data stores then perform
+reads and writes to disk.
+
+When a reference to a @code{persistent} instance itself is written to
+the database, for example as a key or value in a @code{btree}, only
+the unique ID and class of the instance is stored. When read, a
+persistent object instance is re-created (see below). This means that
+serialization of persistent objects is exceedingly cheap compared to
+standard objects, but slot access time can be much more expensive.
@subsection Persistent Class Definition
@@ -352,10 +361,12 @@
@code{persistent-metaclass} to the class initarg @code{:metaclass}.
The only differences between standard and persistent class definitions
is the specification of a slot storage policy and an index policy.
+The @code{defpclass} macro is provided as a convenience to hide the
+@code{:metaclass} slot option.
-Storage policies are specified by a boolean argument to the slot
-initargs @code{:persistent} or @code{:transient}. Slots are
-@code{:persistent} by default
+Slot value storage policies are specified by a boolean argument to the
+new slot initargs @code{:persistent}, @code{:transient} and
+@code{indexed}. Slots are @code{:persistent} by default.
@lisp
(defclass my-pclass ()
@@ -365,15 +376,23 @@
(:metaclass persistent-metaclass))
@end lisp
+In the definition above, @code{pslot1} and @code{pslot2} are
+persistent while @code{tslot1} is transient and stored in memory.
+
Slot storage class implications are straightforward. Persistent slot
writes are durably stored to disk. Transient slots are initialized on
-instance creation according to initforms or to initargs. Transient
-slot values are never stored to nor loaded from the database.
+instance creation according to initforms or initargs. Transient slot
+values are never stored to nor loaded from the database.
-During a given lisp session transient values will be cached as long as
-they are not collected by the Lisps GC. After GC, if you retrieve an
-object from the store its transient slots will be reset to the slot
-initforms from the class definition.
+During a given lisp session transient values will be cached regardless
+of how often you retrieve an object from the store as long as there is
+a reference to it stored in memory or tere are zero references but the
+object has not yet been collected by the lisp garbage collector.
+After collection, if you retrieve an object from the store its
+transient slots will be reset to the slot initforms from the class
+definition. You can only use @code{:initargs} to initialize transient
+or persistent slots during the initial call to @code{make-instance} or
+by manually creating the instance from an oid (see below).
@lisp
(setf pobj1 (make-instance 'my-pclass :pslot1 1 :tslot3 3))
@@ -403,27 +422,31 @@
@end lisp
The implications of this behavior is that you need to think carefully
-about using transient values. Primarily you cannot make assumptions
-about the state of transient values in objects loaded from the store
-unless you know that they were loaded and cannot be GC'ed.
-
-Finally, the index policy tells the data store whether to maintain an
-inverted index that maps slot values back to their parent objects.
-The :index options and behaviors of persistent classes are discussed in
-depth in @ref{Class Indices}.
+about how to use transient values. Essentially you cannot make
+assumptions about the state of transient values in objects loaded from
+the store unless you know that they were loaded and cannot be GC'ed.
+
+The @code{:index} option tells Elephant whether to maintain an
+inverted index that maps slot values to their parent objects. The
+behavior of indexed classes and class slots are discussed in depth in
+@ref{Class Indices}.
@subsection Instance Creation
-Persistent objects are instances of the persistent classes defined
-above. All persistent objects inherit from the class
-@code{persistent} and share two properties: a unique ID and a
-reference to the specification of the @code{store-controller} in which
-they reside. This is ensured by the instance creation protocol
-implemented by @code{persistent-metaclass}.
+To the user, persistent objects are created as usual with a call to
+@code{make-instance} with the desired slot initargs as illustrated in
+the last section. However, this call will fail unless there is a
+default @code{store-controller} instance in the variable
+@code{*store-controller*} or the @code{:sc} keyword argument is
+provided with a valid store controller object. This tells the
+metaobject protocol implementing persistent slot creation where to
+allocate storage for this instance's slots and
-Instances are created as normal, with a call to make-instance and
-appropriate initargs.
+* Default store controller & instance creation
+* What happens to persistent objects when store-controller is closed?
+The best policy for initializing transient slots is an @code{:after}
+method on @code{initialize-instance}.
The two properties of @code{persistent} can be specified explicitly
during instance creation:
@@ -440,12 +463,60 @@
precedence over values in the database, which take precedences over
any @code{initforms} defined in the class.
-* Default store controller & instance creation
-* What happens to persistent objects when store-controller is closed?
+A good policy is to initialize transient values using an @code{:after}
+method on @code{initialize-instance} to initialize transient values
+using system defaults or from persistent slot values. That way
+whether the slots are valid when the object is pulled from
+
+Also currently there is a bug where @code{initforms} are always
+evaluated, so beware. (What is the current model here?)
+
+@subsection Class Redefinition
+
+This section discusses the appropriate model a user should employ in
+thinking about the behavior of persistent object when their clases are
+redefined.
+
+- What happens when you redefine a class online?
+- Drop & add slots? Change slot status?
+- What if you connect to an old database with a new class specification?
+ (ref to class indicies behavior)
+
+@subsection Synchronizing Code and Database
+
+
+@subsection Persistent objects and the MOP
+This section provides increased detail on the use of the MOP to create
+and support persistent objects.
+new slot types
+- transient-slot
+- persistent-slot
-:: User-defined persistent objects
+slot instantiation protocols
+- effective-slot-definition
+- direct-slot-definition-class
+- compute-effective-slot-definition
+- compute-effective-slot-definition-initargs
+
+class initialization protocols
+- shared-initialize :around (class)
+- finalize-inheritance :around (class)
+- reinitialize-instance :around (class)
+
+instance initialization protocols
+- initialize-instance :before (instance)
+- shared-initialize :around
+- update-instance-for-redefinied-class
+- update-instance-for-different-class
+
+slot access protocol
+- slot-value-using-class (setf)
+- slot-boundp-using-class
+- slot-makunbound-using-clas
+
+@subsection Overriding methods on persistent objects
* slot types
* caching
@@ -458,20 +529,6 @@
the specification to work properly with persistent slots. However the
proper behavior has been verified on SBCL, Allegro and Lispworks.
-:: Initialization
-
-Also currently there is a bug where @code{initforms} are always
-evaluated, so beware. (What is the current model here?)
-
-:: Class Redefinition and Evolution
-
-* What happens when you redefine a class online?
-* Drop & add slots? Change slot status?
-* What if you connect to an old database with a new class specification?
- (ref to class indicies behavior)
-
-:: Storage and Performance Considerations
-
@node Class Indices
@comment node-name, next, previous, up
@section Class Indices
@@ -642,15 +699,15 @@
blocks of data is relatively inexpensive after a seek and comparisons
on objects that are stored in memory is cheap.
-@node Secondary Indices
+@node Using Cursors
@comment node-name, next, previous, up
-@section Secondary Indices
+@section Using Cursors
Empty.
-@node Using Cursors
+@node BTree Indicies
@comment node-name, next, previous, up
-@section Using Cursors
+@section BTree Indicies
Empty.
@@ -665,7 +722,6 @@
throwing a condition when @code{with-transaction} forms are nested
dynamically.
-
;; Transaction architecture:
;;
;; User and designer considerations:
@@ -847,28 +903,20 @@
@code{*inhibit-slot-writes*} in your user method using
@code{with-inhibited-slot-copy} a convenience macro.
-@node Garbage Collection
-@comment node-name, next, previous, up
-@section Garbage Collection
-
-GC is not implemented, but migration (@pxref{Repository Migration and
-Upgrade}) will consolidate storage and recover OIDs which emulates GC.
-No online solution is currently supported.
-
@node Performance Tuning
@comment node-name, next, previous, up
-@section Performance
+@section Performance Tuning
Performance is usually measured in transactions per second. Database
reads are cheap. To get more transactions throughput, consider
setting
@lisp
-* (db-env-set-flags (controller-environment *store-controller*) 1
- :txn-nosync t)
+(db-env-set-flags (controller-environment *store-controller*)
+ 1 :txn-nosync t)
@end lisp
-or look at other flags in the sleepycat docs. This will greatly
+or look at other flags in the Berkeley DB docs. This will greatly
increase your throughput at the cost of some durability; I get around
a 100x improvement. Durability can be recovered with judicious use of
checkpointing and replication, though this is currently not supported
@@ -906,13 +954,29 @@
mode is not suitable for use in web servers or other typically
multi-threaded applications.
+@node Garbage Collection
+@comment node-name, next, previous, up
+@section Garbage Collection
+
+GC is not implemented, but migration (@pxref{Repository Migration and
+Upgrade}) will consolidate storage and recover OIDs which emulates GC.
+No online solution is currently supported.
+
+
@node Berkeley DB Data Store
@comment node-name, next, previous, up
@section Berkeley DB Data Store
-
@node CL-SQL Data Store
@comment node-name, next, previous, up
@section CL-SQL Data Store
+
+@node Postmodern Data Store
+@comment node-name, next, previous, up
+@section Postmodern Data Store
+
+@node Native Lisp Data Store
+@comment node-name, next, previous, up
+@section Native Lisp Data Store
1
0