summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAntonio Cunei <antonio.cunei@epfl.ch>2011-04-11 09:05:45 +0000
committerAntonio Cunei <antonio.cunei@epfl.ch>2011-04-11 09:05:45 +0000
commit825f3691fae26d3cc54dc04b4a559d197c46f780 (patch)
tree85ec520f743d57148ca2bd9b5c777832e4281e1e /src
parent74a967da857ead23ec5d976c6616ac98fb7c33ef (diff)
downloadscala-825f3691fae26d3cc54dc04b4a559d197c46f780.tar.gz
scala-825f3691fae26d3cc54dc04b4a559d197c46f780.tar.bz2
scala-825f3691fae26d3cc54dc04b4a559d197c46f780.zip
Merged revisions 24573,24583-24584,24592-24604,...
Merged revisions 24573,24583-24584,24592-24604,24607-24612,24614-24646,24648,24651-24667, 24672-24706,24708-24717,24719-24724 via svnmerge from https://lampsvn.epfl.ch/svn-repos/scala/scala/trunk ........ r24573 | dragos | 2011-03-24 18:48:14 +0100 (Thu, 24 Mar 2011) | 1 line Added synchronous version of askStructure, needed by the IDE to avoid deadlocks. review by odersky. ........ r24583 | magarcia | 2011-03-25 15:40:35 +0100 (Fri, 25 Mar 2011) | 3 lines for Scala.NET bootstrapping. Given that flatten does not run in forMSIL mode, there may be several recursive activations of the case clause, and part of that activation state needs to be saved/restored. forJVM behavior remains unchanged. ........ r24584 | extempore | 2011-03-25 15:49:31 +0100 (Fri, 25 Mar 2011) | 5 lines I guess windows can show a < 500x difference and still give us confidence there isn't a 100,000x difference. Testing situation continues to confound and amaze. Trying to make 4279 not fail on windows, one more time and I will delete it and burn the bodies. No review. ........ r24592 | extempore | 2011-03-25 22:13:52 +0100 (Fri, 25 Mar 2011) | 3 lines Figured out why -Ydebug has been such a deathtrap for a while. I'm the culprit. Making -Ydebug less likely to kill a compile, no review. ........ r24593 | extempore | 2011-03-25 22:21:27 +0100 (Fri, 25 Mar 2011) | 2 lines Fixed the "poor resilience to error conditions" crasher mentioned in #3625, no review. ........ r24594 | kzys | 2011-03-25 23:55:19 +0100 (Fri, 25 Mar 2011) | 2 lines [scaladoc] Stop wiki syntax parsing inside HTML. Review by pedrofurla. ........ r24595 | kzys | 2011-03-26 00:08:19 +0100 (Sat, 26 Mar 2011) | 2 lines [scaladoc] Add a test for #4180. No review. ........ r24596 | kzys | 2011-03-26 01:39:35 +0100 (Sat, 26 Mar 2011) | 2 lines [scaladoc] Fix wiki formatting to close #4359. Review by malayeri. ........ r24597 | kzys | 2011-03-26 02:25:13 +0100 (Sat, 26 Mar 2011) | 2 lines [scaladoc] Closes #4371. Review by pedrofurla. ........ r24598 | kzys | 2011-03-26 04:26:40 +0100 (Sat, 26 Mar 2011) | 2 lines [scaladoc] Cleanup tests. No review. ........ r24599 | extempore | 2011-03-26 17:05:14 +0100 (Sat, 26 Mar 2011) | 2 lines Fix for cygwin: jline.UnixTerminal is now scala.tools.jline.UnixTerminal. No review. ........ r24600 | extempore | 2011-03-26 19:22:27 +0100 (Sat, 26 Mar 2011) | 2 lines Added some explanatory output when jline reader fails to create. No review. ........ r24601 | extempore | 2011-03-26 20:42:25 +0100 (Sat, 26 Mar 2011) | 1 line Some accumulated work and polish on classpath and jars. No review. ........ r24602 | extempore | 2011-03-26 20:42:44 +0100 (Sat, 26 Mar 2011) | 1 line Cleaning up util.Tracer and its usage in Erasure. No review. ........ r24603 | extempore | 2011-03-26 20:43:00 +0100 (Sat, 26 Mar 2011) | 3 lines Suppressed unnecessary checkcasts on Throwables which were letting AnyRefs reach the backend. Looks like this was my doing when trying to wake back up the icode checker. Closes #4393, no review. ........ r24604 | cunei | 2011-03-26 21:47:47 +0100 (Sat, 26 Mar 2011) | 4 lines Introducing xz compression in nightly builds. Also removed some obsolete targets related to the old 1.4 version. ........ r24607 | magarcia | 2011-03-27 16:41:46 +0200 (Sun, 27 Mar 2011) | 2 lines needed when compiling the (jdk2ivkm'd) Scala library with Scala.NET, and doesn't hurt in forJVM mode. ........ r24608 | extempore | 2011-03-27 17:37:15 +0200 (Sun, 27 Mar 2011) | 1 line Made :javap less crashy on windows, no review. ........ r24609 | extempore | 2011-03-27 21:46:12 +0200 (Sun, 27 Mar 2011) | 18 lines Fix for linked lists closes #4080 and proves my desire not to ship obviously broken code is even greater than my will to hold out for any help. I threw in a free fix for this which I noticed while in there. scala> scala.collection.mutable.LinkedList[Int]().head res0: Int = 0 Also was reminded how useless tests can be: val ten = DoubleLinkedList(1 to 10: _*) ten.insert(DoubleLinkedList(11)) // Post-insert position test require(ten.last == 11) Fortunately a test confirming buggy behavior still serves a purpose by breaking when you fix the bug which allowed it to pass, thus letting you fix the broken test too. Life's (very) little compensations. Linked list code should still be presumed broken. No review. ........ r24610 | extempore | 2011-03-28 01:27:05 +0200 (Mon, 28 Mar 2011) | 16 lines Trying to get fsc doing the right thing with respect to absolute and relative paths. My knowledge of the problem had heretofore been second hand, and my understanding of it incomplete. The real problem I have determined is that there are a bunch of different things which go wrong if relative paths start being resolved from a different base, each of which needs custom handling. classpath-style options, e.g. fsc -cp ../foo.jar path-style options, e.g. fsc -d ../mydir file arguments, e.g. fsc ../foo.scala So it was more work than I had realized, or I probably wouldn't have even touched it. But now it seems to be working as one would want. I also poured some readability onto the fsc help output. Closes #4395, no review, but community input would be great. ........ r24611 | extempore | 2011-03-28 05:10:44 +0200 (Mon, 28 Mar 2011) | 2 lines A paltry 570 cases failing in -Xcheckinit due to some uninitialized val or other. It is but a trifle! No review. ........ r24612 | extempore | 2011-03-28 09:34:04 +0200 (Mon, 28 Mar 2011) | 4 lines Learned an interesting lesson about having an implicit object with a "def apply(x: Any): List[String]" method imported into power mode. Let's just say this is not advised. This and other rough edges eliminated from power mode, no review. ........ r24614 | magarcia | 2011-03-28 15:59:16 +0200 (Mon, 28 Mar 2011) | 1 line (1) The msil library can now parse modreq and modopt, (2) bug fix in GenMSIL. review by rytz. Updated msil.jar coming soon. ........ r24615 | magarcia | 2011-03-28 18:00:13 +0200 (Mon, 28 Mar 2011) | 1 line msil.jar updated with changeset 24614 ........ r24616 | plocinic | 2011-03-28 18:21:52 +0200 (Mon, 28 Mar 2011) | 1 line Don't analyse symbols with error types. can happen for java symbols that are forced during the analysis. Partial fix for #1000238 in eclipse ide, related issue is in #4402. no review ........ r24617 | kzys | 2011-03-28 18:58:54 +0200 (Mon, 28 Mar 2011) | 2 lines [scaladoc] Remove whitespace around colon and parentheses. Closes #4372. Review by pedrofurla. ........ r24618 | extempore | 2011-03-28 21:20:58 +0200 (Mon, 28 Mar 2011) | 3 lines Added some implicitNotFound annotations to commonly used classes, and some documentation to Manifest. (Said documentation is invisible for the moment due to #4404.) No review. ........ r24619 | extempore | 2011-03-28 22:07:02 +0200 (Mon, 28 Mar 2011) | 2 lines Expanding the test which tries to use the collections from java. No review. ........ r24620 | extempore | 2011-03-28 23:44:33 +0200 (Mon, 28 Mar 2011) | 2 lines Looks like another java5/java6 difference gets me on a test. At least this time I was looking for that. No review. ........ r24621 | extempore | 2011-03-28 23:53:12 +0200 (Mon, 28 Mar 2011) | 3 lines Removed some bitrotted ant directives which were keeping us from getting Manifest docs. Thanks to dmharrah. Also removed RichUnit, fare thee well. Closes #4404, no review. ........ r24622 | extempore | 2011-03-28 23:57:47 +0200 (Mon, 28 Mar 2011) | 4 lines Eliminated option -Xwarninit, which is warning about a change which took place 2.5 years ago and is only likely to add to option confusion at this point. No review. (But let me know if we still need this for some reason: many more of our options should be culled.) ........ r24623 | extempore | 2011-03-29 00:45:53 +0200 (Tue, 29 Mar 2011) | 3 lines Made ScalaRunTime.stringOf more general by separating out the part which formats it for a repl result, and cleaned up some string functions around the repl. No review. ........ r24624 | extempore | 2011-03-29 04:59:31 +0200 (Tue, 29 Mar 2011) | 26 lines Polishing the programmatic interface to the repl and other bits of machinery which we'll have to live with for a while. The repl classloader now works more like you'd expect a classloader to, as seen here: % scala -Dscala.repl.power scala> class Bippus extends Traversable[Int] { def foreach[U](f: Int => U) = () } defined class Bippus scala> intp.classLoader.getResourceAsStream("Bippus").bytes() res0: Array[Byte] = Array(-54, -2, -70, ... scala> res0.size res1: Int = 23954 scala> case class Bippy(x: Int) defined class Bippy // classBytes is shorter way to say the same thing scala> intp.classLoader.classBytes("Bippy").size res2: Int = 2356 scala> intp.classLoader.classBytes("Bippy$").size res3: Int = 1741 Closes #4399, no review. ........ r24625 | extempore | 2011-03-29 05:25:38 +0200 (Tue, 29 Mar 2011) | 1 line And so my attempt to have a performance test draws the final curtain, no review. ........ r24626 | kzys | 2011-03-29 16:55:30 +0200 (Tue, 29 Mar 2011) | 2 lines [scaladoc] Add a test of colon and parentheses (#4372). No review. ........ r24627 | kzys | 2011-03-29 17:40:21 +0200 (Tue, 29 Mar 2011) | 2 lines [scaladoc] Cleanup code. No review. ........ r24628 | kzys | 2011-03-29 18:21:02 +0200 (Tue, 29 Mar 2011) | 2 lines [scaladoc] Don't create broken link to private companion object. Closes #4374. Review by pedrofurla. ........ r24629 | extempore | 2011-03-29 20:41:08 +0200 (Tue, 29 Mar 2011) | 5 lines A bunch of scaladoc cleanups. Tags with the wrong name, tags in the wrong places, tags saying the wrong thing. I sorted types and values so deprecated ones are at the end. I think they should be hidden by default, but this is a big improvement. Leaving #3914 open so they can be made invisible. No review. ........ r24630 | extempore | 2011-03-29 22:22:22 +0200 (Tue, 29 Mar 2011) | 2 lines Disabled all the script tests. They're not run from ant and they're breaking the distribution build. No review. ........ r24631 | extempore | 2011-03-29 22:22:40 +0200 (Tue, 29 Mar 2011) | 2 lines Fixing the scalap test rig to work like other test types so it doesn't break the distribution build. No review. ........ r24632 | extempore | 2011-03-29 22:22:53 +0200 (Tue, 29 Mar 2011) | 2 lines Transcript pastes now work with leading whitespace (such as my commit message in r24624), no review. ........ r24633 | extempore | 2011-03-29 22:44:33 +0200 (Tue, 29 Mar 2011) | 2 lines A change to a test to defend against output change when run with a plugin enabled. No review. ........ r24634 | cunei | 2011-03-29 23:18:34 +0200 (Tue, 29 Mar 2011) | 2 lines include files/specialized/*.txt in the set of files packaged in the test sbp. ........ r24635 | cunei | 2011-03-29 23:39:29 +0200 (Tue, 29 Mar 2011) | 2 lines Excluding presentation test from sbaz-packaged test suite. ........ r24636 | extempore | 2011-03-30 02:55:20 +0200 (Wed, 30 Mar 2011) | 11 lines Wanting to deprecate -make, first I had to write a way to deprecate -make. So there's that, now you can do val s = SomeSetting(...) withDeprecationMessage "don't use this" And it will do the usual deprecation things. And, deprecated -make. And couldn't resist fixing a bug in -make, it would crash if you gave it its own default option (i.e. -make:all.) Let's deprecate more! I also did further cleaning up of our help outputs. Do I smell a pulitzer in the making? No review. ........ r24637 | rytz | 2011-03-30 09:06:08 +0200 (Wed, 30 Mar 2011) | 1 line fix get-scala-revision script for the case when svn prints some warnings. no review ........ r24638 | extempore | 2011-03-30 22:40:46 +0200 (Wed, 30 Mar 2011) | 10 lines Issue warning when doccomments have $variables which go unfulfilled. Started with patch by dmharrah. Noticed expandVariables never incremented its recursion guard and ended up rewriting it. To avoid spurious warnings you can escape $'s, as in this comment: /** The decoded name of the symbol, e.g. `==` instead of `\$eq\$eq`. */ The above will be ignored during expansion and translated to $eq$eq for output. Closes #4412, no review. ........ r24639 | extempore | 2011-03-30 23:00:08 +0200 (Wed, 30 Mar 2011) | 2 lines Addressing most of the warnings revealed by the patch to warn about unknown scaladoc variables. Updated and reran genprod. No review. ........ r24640 | extempore | 2011-03-31 00:47:00 +0200 (Thu, 31 Mar 2011) | 3 lines Warn about unqualified names in scaladoc links because they don't work. I think it would be better to just make them work, but the way things are structured it looks involved. Closes #3696, no review. ........ r24641 | kzys | 2011-03-31 01:38:18 +0200 (Thu, 31 Mar 2011) | 2 lines [scaladoc] Scaladoc should expand macros recursively. Closes #3484. Review by dubochet. ........ r24642 | extempore | 2011-03-31 05:59:42 +0200 (Thu, 31 Mar 2011) | 6 lines Modified some typer logic to allow annotation arguments for constants which don't have the form Literal(_). The current logic seems to be avoided most of the time, but scaladoc breaks when it runs into it. This closes #4301. I can't figure out from the ticket what the deal is with #2764 and what is presently happening, but it seems like this patch could only improve the situation. Review by rytz. ........ r24643 | extempore | 2011-03-31 05:59:57 +0200 (Thu, 31 Mar 2011) | 2 lines Incidental work on scaladoc while trying to figure out what is up with usecases. Did a little rewrite of recent patch. No review. ........ r24644 | extempore | 2011-03-31 06:59:35 +0200 (Thu, 31 Mar 2011) | 2 lines Making the scaladoc command line help look as pretty as all the others ones do now. No review. ........ r24645 | extempore | 2011-03-31 07:58:01 +0200 (Thu, 31 Mar 2011) | 2 lines Some minor sensibility improvements to previous patch, and tearing out some obsolete pieces of scalap. No review. ........ r24646 | extempore | 2011-03-31 08:09:14 +0200 (Thu, 31 Mar 2011) | 2 lines Fix for interpreter issue with missing newlines wreaking havoc. No review. ........ r24648 | kzys | 2011-03-31 14:59:56 +0200 (Thu, 31 Mar 2011) | 2 lines [scaladoc] Don't link to syntetic companion. Closes #4325. Review by dubochet. ........ r24651 | dragos | 2011-03-31 16:36:38 +0200 (Thu, 31 Mar 2011) | 1 line One breakage too many, this test is a pest -> disabled. no review. ........ r24652 | dragos | 2011-03-31 16:39:19 +0200 (Thu, 31 Mar 2011) | 1 line Fixed failing presentation compiler test. no review. ........ r24653 | extempore | 2011-03-31 18:41:51 +0200 (Thu, 31 Mar 2011) | 1 line Emptiness check in swing, closes #1578 no review. ........ r24654 | extempore | 2011-03-31 18:42:05 +0200 (Thu, 31 Mar 2011) | 4 lines Added some null checks in swing. I assumed the behavior when the input verifier is null should be "assume it verifies" not "assume it doesn't" but since I don't actually know anything about swing this guess could be wrong. Closes #3783, review by imaier. ........ r24655 | odersky | 2011-03-31 18:46:48 +0200 (Thu, 31 Mar 2011) | 1 line recommitted 24578: All compiler control methods now do something sensible when called from presentation compiler thread itself. ........ r24656 | extempore | 2011-03-31 21:26:24 +0200 (Thu, 31 Mar 2011) | 3 lines Printing refinement types in scaladoc. Actually only printing one-member refinements, for bigger ones printing the number of members. Should be improved. Closes #484, no review. ........ r24657 | extempore | 2011-03-31 21:26:37 +0200 (Thu, 31 Mar 2011) | 3 lines Fix for a little breakage which crept into power mode. This is why real things with real types are better than generating code and remembering to update your strings. No review. ........ r24658 | extempore | 2011-03-31 22:44:29 +0200 (Thu, 31 Mar 2011) | 7 lines Separated abstract and concrete value members in scaladoc. This looks like such a runaway improvement to me that I'm just checking it in, but if anyone feels differently say the word. I eliminated the abstract/concrete filter entirely as it is extraneous once you can just see which is which. Closes #3831, review by malayeri. ........ r24659 | extempore | 2011-04-01 00:18:43 +0200 (Fri, 01 Apr 2011) | 2 lines A quick fix for the weird string output one gets in the repl when calling .par. No review. ........ r24660 | extempore | 2011-04-01 04:18:53 +0200 (Fri, 01 Apr 2011) | 5 lines Working on the documentation of core classes. Trying to withdraw some of the goodness I banked a while ago with the AnyVal types. Started on what will culminate in the total elimination of SourcelessComments. Cleaned up the docs on ancient classes like Product. More to come. No review. ........ r24661 | extempore | 2011-04-01 07:02:30 +0200 (Fri, 01 Apr 2011) | 2 lines A less ad hoc infrastructure for generating AnyVal sources. A few more comments on said sources. No review. ........ r24662 | extempore | 2011-04-01 08:41:46 +0200 (Fri, 01 Apr 2011) | 1 line Fix for parsing bug in scaladoc closes #4420, no review. ........ r24663 | extempore | 2011-04-01 18:00:50 +0200 (Fri, 01 Apr 2011) | 3 lines Since somewhere before 2.8.0 shipped scalac has disgorged a stack trace for the misdemeanor of specifying a non-existent directory for -d. No more, no review. ........ r24664 | kzys | 2011-04-01 19:09:59 +0200 (Fri, 01 Apr 2011) | 2 lines Put "\n" between superclass's comment and subclass's. Closes #4289. Review by pedrofurla. ........ r24665 | extempore | 2011-04-01 19:18:34 +0200 (Fri, 01 Apr 2011) | 14 lines Finding myself wanting a working -Ystop, I did the following. -Ystop-after:phase works -Ystop-before:phase works -Ystop:phase is a backward compat alias for -Ystop-after Until now -Ystop, although documented to "stop after phase", actually stopped before phase, to the consternation of some. Furthermore the programmatic way to influence the stop phase (protected def stopPhase in Global#Run) involved returning true if you wanted to stop before the phase. So now the command line option works as advertised, and the method has the same semantics. The only potential loser is some script which uses -Ystop: based on the actual behavior rather than the documented behavior. Well, someone had to lose. No review. ........ r24666 | kzys | 2011-04-01 20:57:36 +0200 (Fri, 01 Apr 2011) | 2 lines On Scaladoc, we should escape meta characters before compile regexp. No review. ........ r24667 | extempore | 2011-04-02 01:55:01 +0200 (Sat, 02 Apr 2011) | 2 lines A double completion whammy: crasher for edge condition and method signatures not being cleaned of their $iws. Closes #4434, no review. ........ r24672 | malayeri | 2011-04-04 15:57:56 +0200 (Mon, 04 Apr 2011) | 1 line [scaladoc] Add explicit link to show linear supertypes and known subclasses. Closes #4416. Modifications to style sheets to reduce number of colors and make the documentation more readable (includes contributions from Ruediger Keller). No review. ........ r24673 | malayeri | 2011-04-04 16:34:29 +0200 (Mon, 04 Apr 2011) | 1 line [scaladoc] Add missing files. ........ r24674 | cunei | 2011-04-04 16:52:55 +0200 (Mon, 04 Apr 2011) | 2 lines Fix for windows batch files. Closes #4439. ........ r24675 | malayeri | 2011-04-04 17:22:09 +0200 (Mon, 04 Apr 2011) | 1 line [scaladoc] Minor CSS tweaks. No review. ........ r24676 | kzys | 2011-04-04 18:19:32 +0200 (Mon, 04 Apr 2011) | 2 lines Every tag element (even @define and @usecase) end before the next recognised tag. Closes #4409. Review by extempore. ........ r24677 | odersky | 2011-04-04 18:34:02 +0200 (Mon, 04 Apr 2011) | 1 line Fixed crashes in IDE on default parameters in constructors. ........ r24678 | malayeri | 2011-04-04 18:36:27 +0200 (Mon, 04 Apr 2011) | 1 line [scaladoc] Change div id's of abstract and concrete members so that "order by inheritance" action works properly. Fixes issue introduced in r24658. Review by extempore. ........ r24679 | malayeri | 2011-04-04 18:37:51 +0200 (Mon, 04 Apr 2011) | 1 line [scaladoc] Make object/template name be a link to the companion. Closes #4411. Review by extempore to make sure the design makes sense. ........ r24680 | malayeri | 2011-04-04 18:38:11 +0200 (Mon, 04 Apr 2011) | 1 line [scaladoc] Fix minor CSS issue. No review. ........ r24681 | odersky | 2011-04-04 19:35:19 +0200 (Mon, 04 Apr 2011) | 1 line Some localized code cleanup. ........ r24682 | malayeri | 2011-04-04 20:17:26 +0200 (Mon, 04 Apr 2011) | 1 line [scaladoc] Updated trait, package, class, and object icons. No review. ........ r24683 | extempore | 2011-04-05 03:48:11 +0200 (Tue, 05 Apr 2011) | 12 lines Added a long overdue warning for when people define a class and then an object or vice versa in the repl. scala> object Bippy { implicit val myImplicitsDontWork = 5 } defined module Bippy scala> trait Bippy { val x = "hello" } defined trait Bippy warning: previously defined object Bippy is not a companion to trait Bippy. Companions must be defined together; you may wish to use :paste mode for this. No review. ........ r24684 | extempore | 2011-04-05 03:48:31 +0200 (Tue, 05 Apr 2011) | 6 lines Enhancing the repl-testing code by turning it into a transcript producing machine. "Here's some code." "Here's a transcript!" "Good day to you, sir!" "No, good day to YOU!" These changes are awesome. Look at the checkfile diffs for god's sake, they'll make you weep with joy. No review. ........ r24685 | rytz | 2011-04-05 09:50:41 +0200 (Tue, 05 Apr 2011) | 1 line make natives test run on win64. no review ........ r24686 | rytz | 2011-04-05 09:54:41 +0200 (Tue, 05 Apr 2011) | 1 line svn property: mark the dll as binary. no review. ........ r24687 | malayeri | 2011-04-05 10:36:32 +0200 (Tue, 05 Apr 2011) | 1 line [scaladoc] Fix failing test. No review. ........ r24688 | odersky | 2011-04-05 14:19:10 +0200 (Tue, 05 Apr 2011) | 1 line Fixes #4298, by correcting doc comment ........ r24689 | dragos | 2011-04-05 18:19:45 +0200 (Tue, 05 Apr 2011) | 3 lines Wrapped exceptions coming from calls to 'ask' in a FailedException. This allows to get a stack trace from both the presentation compiler thread and the calling thread. review by odersky. ........ r24690 | odersky | 2011-04-05 18:22:21 +0200 (Tue, 05 Apr 2011) | 1 line better handling of on-same-thread calls. ........ r24691 | dragos | 2011-04-05 19:03:51 +0200 (Tue, 05 Apr 2011) | 1 line Forgot a import in the last commit. no review. ........ r24692 | extempore | 2011-04-06 01:19:26 +0200 (Wed, 06 Apr 2011) | 3 lines Some accumulated cleanups around the interpreter loop commands as I attempt to make my way all the way to the promised land of documenting it. No review. ........ r24693 | extempore | 2011-04-06 06:33:15 +0200 (Wed, 06 Apr 2011) | 1 line Fixed an edge case setting crasher, no review. ........ r24694 | extempore | 2011-04-06 06:33:27 +0200 (Wed, 06 Apr 2011) | 3 lines Fixed a failure output regression I introduced working around a process bug. Unrolled the code I'd put in to work around the now-fixed process bug. No review. ........ r24695 | extempore | 2011-04-06 06:33:46 +0200 (Wed, 06 Apr 2011) | 1 line Misc cleanups and crash avoidance, no review. ........ r24696 | malayeri | 2011-04-06 16:23:25 +0200 (Wed, 06 Apr 2011) | 1 line Set "synthetic" flag for methods $asInstanceOf and $isInstanceOf. Closes #4368. No review. ........ r24697 | malayeri | 2011-04-06 16:24:30 +0200 (Wed, 06 Apr 2011) | 1 line [scaladoc] Reduce horizontal lines in html output, refactor Template.css to improve readability. No review. ........ r24698 | malayeri | 2011-04-06 16:28:41 +0200 (Wed, 06 Apr 2011) | 1 line Update documentation of MutableList. Closes #4397. No review. ........ r24699 | odersky | 2011-04-06 16:32:32 +0200 (Wed, 06 Apr 2011) | 1 line More refinements to avoid deadlocks systematically when asking from presentation compiler thread ........ r24700 | extempore | 2011-04-06 20:48:15 +0200 (Wed, 06 Apr 2011) | 3 lines The beautification of repl pasting had the problem that the new beautiful output was not itself pastable. Now I have achieved "paste idempotence". No review. ........ r24701 | extempore | 2011-04-07 09:30:38 +0200 (Thu, 07 Apr 2011) | 2 lines Clamping down on some more breakage which snuck into power mode. I really need some power tests. No review. ........ r24702 | extempore | 2011-04-07 09:31:02 +0200 (Thu, 07 Apr 2011) | 9 lines Deleted SourcelessComments. Created source files for Any, AnyRef, Nothing and Null with improved documentation of their particulars and convinced scaladoc to parse them without leaving scalac institutionalized. Now rather than seeing our hardcoded documentation strings bitrot in a shadowy flight from classes which do not exist, we are championing the cause of the innocent and powerless. Nothing and Null aren't above the law! So now any responsible party can fire up their text editor and go to town on Nothing.scala. As I'm sure they will. Review by malayeri. ........ r24703 | extempore | 2011-04-07 09:31:14 +0200 (Thu, 07 Apr 2011) | 2 lines Added a comment to Dynamic sharing that if you don't supply mr. -Xexperimental, it won't work. No review. ........ r24704 | malayeri | 2011-04-07 15:34:14 +0200 (Thu, 07 Apr 2011) | 1 line [scaladoc] Make links to classes and traits not be the entire line, but just the template name. Closes #4444. No review. ........ r24705 | malayeri | 2011-04-07 16:03:49 +0200 (Thu, 07 Apr 2011) | 1 line [scaladoc] Don't generate an attributes block if its contents are empty. No review. ........ r24706 | odersky | 2011-04-07 16:30:56 +0200 (Thu, 07 Apr 2011) | 1 line Fixes #2808 without redefining what override means. Review by extempore. ........ r24708 | extempore | 2011-04-07 19:43:41 +0200 (Thu, 07 Apr 2011) | 10 lines Made power mode more configurable. Don't think of this as the long-term configuration answer, but what I have any chance of doing before 2.9 ships. // file to interpret when entering power mode instead of default -Dscala.repl.power.initcode=/path/to/file // file holding banner to display instead of default -Dscala.repl.power.banner=/path/to/file No review. ........ r24709 | magarcia | 2011-04-08 13:38:48 +0200 (Fri, 08 Apr 2011) | 1 line [MSIL] handling of volatile fields. review by rytz. ........ r24710 | malayeri | 2011-04-08 16:26:22 +0200 (Fri, 08 Apr 2011) | 1 line [scaladoc] Separate sections for "linear supertype" and "known subclasses" using patch provided by Ruediger Keller. Closes #4456. Closes #4304. ........ r24711 | malayeri | 2011-04-08 17:10:32 +0200 (Fri, 08 Apr 2011) | 1 line [scaladoc] Don't generate long comments if they are the same as the short comment. Closes #4455. No review. ........ r24712 | odersky | 2011-04-08 18:31:26 +0200 (Fri, 08 Apr 2011) | 1 line Closes #4431. Review by extempore. ........ r24713 | extempore | 2011-04-08 18:42:18 +0200 (Fri, 08 Apr 2011) | 2 lines Factoring the imports related code out of the main Interpreter class, no review. ........ r24714 | extempore | 2011-04-08 18:42:38 +0200 (Fri, 08 Apr 2011) | 1 line Added :imports command, no review. ........ r24715 | extempore | 2011-04-10 04:17:28 +0200 (Sun, 10 Apr 2011) | 1 line Made the reading of y/n a little more robust. No review. ........ r24716 | extempore | 2011-04-10 04:18:08 +0200 (Sun, 10 Apr 2011) | 2 lines More fun with xml and elements not appearing equal. Closes #4387, no review. ........ r24717 | extempore | 2011-04-10 04:18:32 +0200 (Sun, 10 Apr 2011) | 2 lines Changed scala.io.Position into something other than a fixed object which throws exceptions when the position overflows. Closes #4382, no review. ........ r24719 | extempore | 2011-04-11 05:04:47 +0200 (Mon, 11 Apr 2011) | 2 lines Improving the repl help infrastructure, and made the :wrap command more robust. No review. ........ r24720 | extempore | 2011-04-11 07:01:17 +0200 (Mon, 11 Apr 2011) | 4 lines Found there was still all kinds of detritus remaining from the deceased IMPLICITMETHODtpe and ImplicitMethodType. Applied wrecking ball, review by moors. (Can I do the same thing with DEBRUIJNINDEXtpe and DeBruijnIndex?) ........ r24721 | eugenevigdorchik | 2011-04-11 08:42:47 +0200 (Mon, 11 Apr 2011) | 1 line Tighten the visibility of interactive.Global. No review. ........ r24722 | odersky | 2011-04-11 09:01:55 +0200 (Mon, 11 Apr 2011) | 1 line Closes #4396. No review. ........ r24723 | odersky | 2011-04-11 10:53:51 +0200 (Mon, 11 Apr 2011) | 1 line Closes #4380. No review. ........ r24724 | odersky | 2011-04-11 10:56:57 +0200 (Mon, 11 Apr 2011) | 1 line Deleted debug output that made it into previous commit. ........
Diffstat (limited to 'src')
-rw-r--r--src/build/genprod.scala13
-rw-r--r--src/build/pack.xml78
-rw-r--r--src/compiler/scala/tools/ant/Scaladoc.scala9
-rw-r--r--src/compiler/scala/tools/ant/templates/tool-unix.tmpl2
-rw-r--r--src/compiler/scala/tools/ant/templates/tool-windows.tmpl12
-rw-r--r--src/compiler/scala/tools/cmd/gen/AnyVals.scala404
-rw-r--r--src/compiler/scala/tools/cmd/gen/Codegen.scala8
-rw-r--r--src/compiler/scala/tools/nsc/CompileClient.scala26
-rw-r--r--src/compiler/scala/tools/nsc/CompileServer.scala48
-rw-r--r--src/compiler/scala/tools/nsc/CompileSocket.scala2
-rw-r--r--src/compiler/scala/tools/nsc/CompilerCommand.scala57
-rw-r--r--src/compiler/scala/tools/nsc/GenericRunnerCommand.scala10
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala91
-rw-r--r--src/compiler/scala/tools/nsc/MainGenericRunner.scala14
-rw-r--r--src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala30
-rw-r--r--src/compiler/scala/tools/nsc/ScalaDoc.scala116
-rwxr-xr-xsrc/compiler/scala/tools/nsc/ast/DocComments.scala195
-rw-r--r--src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/GenICode.scala2
-rw-r--r--src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala38
-rw-r--r--src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala7
-rw-r--r--src/compiler/scala/tools/nsc/doc/DocFactory.scala112
-rw-r--r--src/compiler/scala/tools/nsc/doc/DocParser.scala74
-rw-r--r--src/compiler/scala/tools/nsc/doc/Settings.scala18
-rw-r--r--src/compiler/scala/tools/nsc/doc/SourcelessComments.scala249
-rw-r--r--src/compiler/scala/tools/nsc/doc/Uncompilable.scala48
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala4
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/Template.scala350
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.pngbin0 -> 6232 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.pngbin0 -> 6220 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/class.pngbin516 -> 3357 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.pngbin3183 -> 7495 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css45
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js25
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object.pngbin518 -> 3356 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.pngbin3318 -> 7619 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/package.pngbin488 -> 3335 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.pngbin3183 -> 7312 bytes
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css8
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css289
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js77
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.pngbin494 -> 3374 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.pngbin3088 -> 7378 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai3220
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/Entity.scala15
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala53
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala70
-rw-r--r--src/compiler/scala/tools/nsc/interactive/CompilerControl.scala27
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Global.scala75
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Picklers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala41
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ByteCode.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/CommandLine.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala3
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Dossiers.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ILoop.scala424
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/IMain.scala280
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Imports.scala194
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala7
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala4
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/JLineReader.scala1
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala82
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala24
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Pasted.scala102
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Phased.scala28
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Power.scala210
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala42
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala45
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplVals.scala20
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala2
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/package.scala41
-rw-r--r--src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala39
-rw-r--r--src/compiler/scala/tools/nsc/io/File.scala4
-rw-r--r--src/compiler/scala/tools/nsc/io/Jar.scala41
-rw-r--r--src/compiler/scala/tools/nsc/io/Sources.scala26
-rw-r--r--src/compiler/scala/tools/nsc/javac/JavaScanners.scala4
-rw-r--r--src/compiler/scala/tools/nsc/plugins/Plugins.scala2
-rw-r--r--src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala20
-rw-r--r--src/compiler/scala/tools/nsc/settings/AbsSettings.scala11
-rw-r--r--src/compiler/scala/tools/nsc/settings/AestheticSettings.scala2
-rw-r--r--src/compiler/scala/tools/nsc/settings/FscSettings.scala37
-rw-r--r--src/compiler/scala/tools/nsc/settings/MutableSettings.scala11
-rw-r--r--src/compiler/scala/tools/nsc/settings/ScalaSettings.scala15
-rw-r--r--src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala1
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Definitions.scala11
-rw-r--r--src/compiler/scala/tools/nsc/symtab/Symbols.scala10
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala2
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala15
-rw-r--r--src/compiler/scala/tools/nsc/transform/CleanUp.scala30
-rw-r--r--src/compiler/scala/tools/nsc/transform/Constructors.scala31
-rw-r--r--src/compiler/scala/tools/nsc/transform/Erasure.scala11
-rw-r--r--src/compiler/scala/tools/nsc/transform/LiftCode.scala3
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala19
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala9
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala28
-rw-r--r--src/compiler/scala/tools/nsc/util/ClassPath.scala12
-rw-r--r--src/compiler/scala/tools/nsc/util/InterruptReq.scala6
-rw-r--r--src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala21
-rw-r--r--src/compiler/scala/tools/nsc/util/ShowPickled.scala2
-rw-r--r--src/compiler/scala/tools/nsc/util/Tracer.scala43
-rw-r--r--src/compiler/scala/tools/util/Javap.scala2
-rw-r--r--src/library-aux/README3
-rw-r--r--src/library-aux/scala/Any.scala105
-rw-r--r--src/library-aux/scala/AnyRef.scala129
-rw-r--r--src/library-aux/scala/Nothing.scala23
-rw-r--r--src/library-aux/scala/Null.scala17
-rwxr-xr-xsrc/library/scala/AnyVal.scala17
-rwxr-xr-xsrc/library/scala/Boolean.scala33
-rw-r--r--src/library/scala/Byte.scala43
-rw-r--r--src/library/scala/Char.scala43
-rw-r--r--src/library/scala/Double.scala48
-rw-r--r--src/library/scala/Dynamic.scala9
-rw-r--r--src/library/scala/Equals.scala8
-rw-r--r--src/library/scala/Float.scala48
-rw-r--r--src/library/scala/Function0.scala2
-rw-r--r--src/library/scala/Function1.scala1
-rw-r--r--src/library/scala/Int.scala43
-rw-r--r--src/library/scala/Long.scala43
-rw-r--r--src/library/scala/Option.scala2
-rw-r--r--src/library/scala/Predef.scala4
-rw-r--r--src/library/scala/Product.scala36
-rw-r--r--src/library/scala/Short.scala43
-rw-r--r--src/library/scala/Tuple2.scala2
-rw-r--r--src/library/scala/Tuple3.scala2
-rwxr-xr-xsrc/library/scala/Unit.scala33
-rw-r--r--src/library/scala/collection/Iterator.scala1
-rw-r--r--src/library/scala/collection/Map.scala2
-rw-r--r--src/library/scala/collection/Parallel.scala10
-rw-r--r--src/library/scala/collection/SetProxyLike.scala4
-rw-r--r--src/library/scala/collection/SortedSet.scala3
-rw-r--r--src/library/scala/collection/TraversableOnce.scala8
-rw-r--r--src/library/scala/collection/TraversableViewLike.scala8
-rw-r--r--src/library/scala/collection/generic/Addable.scala8
-rw-r--r--src/library/scala/collection/generic/ClassManifestTraversableFactory.scala8
-rw-r--r--src/library/scala/collection/generic/GenericClassManifestCompanion.scala8
-rw-r--r--src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala6
-rw-r--r--src/library/scala/collection/generic/GenericCompanion.scala2
-rw-r--r--src/library/scala/collection/generic/GenericParCompanion.scala5
-rw-r--r--src/library/scala/collection/generic/ParFactory.scala4
-rw-r--r--src/library/scala/collection/generic/ParMapFactory.scala9
-rw-r--r--src/library/scala/collection/generic/Subtractable.scala8
-rw-r--r--src/library/scala/collection/immutable/IntMap.scala5
-rw-r--r--src/library/scala/collection/immutable/List.scala2
-rw-r--r--src/library/scala/collection/immutable/LongMap.scala8
-rw-r--r--src/library/scala/collection/immutable/Set.scala7
-rw-r--r--src/library/scala/collection/immutable/StringLike.scala15
-rw-r--r--src/library/scala/collection/mutable/ArrayBuffer.scala2
-rw-r--r--src/library/scala/collection/mutable/ArraySeq.scala2
-rw-r--r--src/library/scala/collection/mutable/BitSet.scala2
-rw-r--r--src/library/scala/collection/mutable/DoubleLinkedList.scala22
-rw-r--r--src/library/scala/collection/mutable/DoubleLinkedListLike.scala13
-rw-r--r--src/library/scala/collection/mutable/FlatHashTable.scala7
-rw-r--r--src/library/scala/collection/mutable/HashMap.scala2
-rw-r--r--src/library/scala/collection/mutable/HashSet.scala5
-rw-r--r--src/library/scala/collection/mutable/IndexedSeqView.scala2
-rw-r--r--src/library/scala/collection/mutable/LinkedHashMap.scala2
-rw-r--r--src/library/scala/collection/mutable/LinkedHashSet.scala2
-rw-r--r--src/library/scala/collection/mutable/LinkedList.scala5
-rw-r--r--src/library/scala/collection/mutable/LinkedListLike.scala15
-rw-r--r--src/library/scala/collection/mutable/ListBuffer.scala2
-rw-r--r--src/library/scala/collection/mutable/ListMap.scala2
-rw-r--r--src/library/scala/collection/mutable/MutableList.scala3
-rw-r--r--src/library/scala/collection/mutable/Set.scala5
-rw-r--r--src/library/scala/collection/mutable/StringBuilder.scala5
-rw-r--r--src/library/scala/collection/mutable/UnrolledBuffer.scala11
-rw-r--r--src/library/scala/collection/mutable/WeakHashMap.scala2
-rw-r--r--src/library/scala/collection/parallel/ParIterable.scala19
-rw-r--r--src/library/scala/collection/parallel/immutable/ParHashMap.scala2
-rw-r--r--src/library/scala/collection/parallel/immutable/ParHashSet.scala2
-rw-r--r--src/library/scala/collection/parallel/immutable/ParIterable.scala2
-rw-r--r--src/library/scala/collection/parallel/mutable/ParArray.scala2
-rw-r--r--src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala11
-rw-r--r--src/library/scala/collection/parallel/mutable/ParHashMap.scala2
-rw-r--r--src/library/scala/collection/parallel/mutable/ParHashSet.scala27
-rw-r--r--src/library/scala/collection/parallel/mutable/ParIterable.scala2
-rw-r--r--src/library/scala/io/Position.scala113
-rw-r--r--src/library/scala/io/Source.scala26
-rw-r--r--src/library/scala/math/Ordering.scala1
-rw-r--r--src/library/scala/reflect/ClassManifest.scala14
-rw-r--r--src/library/scala/reflect/Manifest.scala54
-rwxr-xr-xsrc/library/scala/reflect/NameTransformer.scala15
-rw-r--r--src/library/scala/reflect/Type.scala13
-rwxr-xr-xsrc/library/scala/reflect/generic/PickleFormat.scala2
-rwxr-xr-xsrc/library/scala/reflect/generic/Symbols.scala4
-rw-r--r--src/library/scala/runtime/RichUnit.scala22
-rw-r--r--src/library/scala/runtime/ScalaRunTime.scala30
-rw-r--r--src/library/scala/sys/BooleanProp.scala2
-rw-r--r--src/library/scala/sys/Prop.scala6
-rw-r--r--src/library/scala/sys/PropImpl.scala2
-rw-r--r--src/library/scala/sys/SystemProperties.scala16
-rw-r--r--src/library/scala/util/control/NoStackTrace.scala2
-rw-r--r--src/library/scala/util/logging/Logged.scala33
-rw-r--r--src/library/scala/xml/Attribute.scala10
-rw-r--r--src/library/scala/xml/Elem.scala3
-rw-r--r--src/library/scala/xml/MetaData.scala7
-rw-r--r--src/library/scala/xml/include/sax/EncodingHeuristics.scala18
-rwxr-xr-xsrc/library/scala/xml/pull/XMLEventReader.scala3
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/Attribute.java197
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java45
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java49
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java9
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/PEFile.java32
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/PEType.java16
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java5
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/Type.java12
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala7
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala36
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala22
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java23
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java2
-rw-r--r--src/msil/ch/epfl/lamp/compiler/msil/util/Table.java4
-rw-r--r--src/partest/scala/tools/partest/PartestTask.scala1
-rw-r--r--src/partest/scala/tools/partest/ReplTest.scala4
-rw-r--r--src/partest/scala/tools/partest/nest/ConsoleFileManager.scala1
-rw-r--r--src/partest/scala/tools/partest/nest/PathSettings.scala1
-rw-r--r--src/partest/scala/tools/partest/nest/ReflectiveRunner.scala4
-rw-r--r--src/partest/scala/tools/partest/nest/Worker.scala64
-rw-r--r--src/scalap/scala/tools/scalap/Decode.scala4
-rw-r--r--src/scalap/scala/tools/scalap/Main.scala233
-rw-r--r--src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala6
-rw-r--r--src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala11
-rw-r--r--src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala1
-rw-r--r--src/swing/scala/swing/ComboBox.scala2
-rw-r--r--src/swing/scala/swing/Component.scala2
-rw-r--r--src/swing/scala/swing/TextField.scala8
226 files changed, 5983 insertions, 4213 deletions
diff --git a/src/build/genprod.scala b/src/build/genprod.scala
index d1c610d046..d587d0464d 100644
--- a/src/build/genprod.scala
+++ b/src/build/genprod.scala
@@ -15,7 +15,7 @@
* @author Burak Emir, Stephane Micheloud, Geoffrey Washburn, Paul Phillips
* @version 1.1
*/
-object genprod extends Application {
+object genprod extends App {
val MAX_ARITY = 22
def arities = (1 to MAX_ARITY).toList
@@ -38,6 +38,7 @@ object genprod extends Application {
def to = (1 to i).toList
def s = if (i == 1) "" else "s"
def className = name + i
+ def classAnnotation = ""
def fileName = className + ".scala"
def targs = to map ("T" + _)
def vdefs = to map ("v" + _)
@@ -72,7 +73,6 @@ package %s
""".trim.format(genprodString, packageDef, imports)
}
- def args = arguments
if (args.length != 1) {
println("please give path of output directory")
exit(-1)
@@ -110,8 +110,9 @@ object FunctionZero extends Function(0) {
}
object FunctionOne extends Function(1) {
+ override def classAnnotation = "@annotation.implicitNotFound(msg = \"No implicit view available from ${T1} => ${R}.\")\n"
override def contravariantSpecs = "@specialized(scala.Int, scala.Long, scala.Float, scala.Double) "
- override def covariantSpecs = "@specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) "
+ override def covariantSpecs = "@specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) "
override def descriptiveComment = functionNTemplate.format("succ", "anonfun1",
"""
@@ -183,7 +184,7 @@ class Function(val i: Int) extends Group("Function") with Arity {
/** A function of {i} parameter{s}.
* {descriptiveComment}
*/
-trait {className}{contraCoArgs} extends AnyRef {{ self =>
+{classAnnotation}trait {className}{contraCoArgs} extends AnyRef {{ self =>
/** Apply the body of this function to the argument{s}.
* @return the result of function application.
*/
@@ -298,7 +299,7 @@ object TupleTwo extends Tuple(2)
* }}}
*
* @see Zipped
- * $willNotTerminateInf
+ * Note: will not terminate for infinite-sized collections.
*/
def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2]
= new Zipped[Repr1, El1, Repr2, El2](_1, _2)
@@ -406,7 +407,7 @@ object TupleThree extends Tuple(3) {
* }}}
*
* @see Zipped
- * $willNotTerminateInf
+ * Note: will not terminate for infinite-sized collections.
*/
def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TLike[El1, Repr1],
w2: T2 => ILike[El2, Repr2],
diff --git a/src/build/pack.xml b/src/build/pack.xml
index fa8dc4d935..123fd0b8fe 100644
--- a/src/build/pack.xml
+++ b/src/build/pack.xml
@@ -21,12 +21,21 @@ MAIN DISTRIBUTION PACKAGING
</target>
<target name="pack-archives.tar" depends="pack-archives.start">
- <tar destfile="${dists.dir}/archives/scala-${version.number}.tgz"
- compression="gzip" longfile="gnu">
+ <tar destfile="${dists.dir}/archives/scala-${version.number}"
+ compression="none" longfile="gnu">
<tarfileset dir="${dist.dir}" prefix="scala-${version.number}" includes="bin/**" mode="755"/>
<tarfileset dir="${dist.dir}" prefix="scala-${version.number}" excludes="bin/**"/>
</tar>
- <checksum file="${dists.dir}/archives/scala-${version.number}.tgz" fileext=".md5"/>
+ <gzip src="${dists.dir}/archives/scala-${version.number}" destfile="${dists.dir}/archives/scala-${version.number}.tgz"/>
+ <exec executable="xz" failifexecutionfails="false">
+ <arg line="-k -9e -S .txz ${dists.dir}/archives/scala-${version.number}"/>
+ </exec>
+ <delete file="${dists.dir}/archives/scala-${version.number}" />
+ <checksum fileext=".md5">
+ <fileset dir="${dists.dir}/archives">
+ <include name="scala-${version.number}.t?z"/>
+ </fileset>
+ </checksum>
</target>
<target name="pack-archives.zip" depends="pack-archives.tar">
@@ -37,16 +46,25 @@ MAIN DISTRIBUTION PACKAGING
</target>
<target name="pack-devel-docs.tar" depends="pack-archives.zip">
- <tar destfile="${dists.dir}/archives/scala-${version.number}-devel-docs.tgz"
- compression="gzip" longfile="gnu">
+ <tar destfile="${dists.dir}/archives/scala-${version.number}-devel-docs"
+ compression="none" longfile="gnu">
<tarfileset dir="${dist.dir}/doc/scala-devel-docs" prefix="scala-${version.number}-devel-docs"/>
</tar>
- <checksum file="${dists.dir}/archives/scala-${version.number}-devel-docs.tgz" fileext=".md5"/>
+ <gzip src="${dists.dir}/archives/scala-${version.number}-devel-docs" destfile="${dists.dir}/archives/scala-${version.number}-devel-docs.tgz"/>
+ <exec executable="xz" failifexecutionfails="false">
+ <arg line="-k -9e -S .txz ${dists.dir}/archives/scala-${version.number}-devel-docs"/>
+ </exec>
+ <delete file="${dists.dir}/archives/scala-${version.number}-devel-docs" />
+ <checksum fileext=".md5">
+ <fileset dir="${dists.dir}/archives">
+ <include name="scala-${version.number}-devel-docs.t?z"/>
+ </fileset>
+ </checksum>
</target>
<target name="pack-archives.src" depends="pack-devel-docs.tar">
- <tar destfile="${dists.dir}/archives/scala-${version.number}-sources.tgz"
- compression="gzip" longfile="gnu">
+ <tar destfile="${dists.dir}/archives/scala-${version.number}-sources"
+ compression="none" longfile="gnu">
<tarfileset dir="${basedir}" prefix="scala-${version.number}-sources">
<exclude name="bin/**"/>
<exclude name="build/**"/>
@@ -60,7 +78,16 @@ MAIN DISTRIBUTION PACKAGING
<include name="test/partest"/>
</tarfileset>
</tar>
- <checksum file="${dists.dir}/archives/scala-${version.number}-sources.tgz" fileext=".md5"/>
+ <gzip src="${dists.dir}/archives/scala-${version.number}-sources" destfile="${dists.dir}/archives/scala-${version.number}-sources.tgz"/>
+ <exec executable="xz" failifexecutionfails="false">
+ <arg line="-k -9e -S .txz ${dists.dir}/archives/scala-${version.number}-sources"/>
+ </exec>
+ <delete file="${dists.dir}/archives/scala-${version.number}-sources" />
+ <checksum fileext=".md5">
+ <fileset dir="${dists.dir}/archives">
+ <include name="scala-${version.number}-sources.t?z"/>
+ </fileset>
+ </checksum>
</target>
<target name="pack-archives.done" depends="pack-archives.src"/>
@@ -120,7 +147,8 @@ MAIN DISTRIBUTION SBAZ
<binset dir="${basedir}/test"
includes="clitest,diff/diff.*,diff/lib*.dll,partest,partest.bat"/>
<miscset dir="${basedir}/test"
- includes="files/**/*.args,files/**/*.check,files/**/*.dll,files/**/*.jar,files/**/*.java,files/**/*.scala,files/**/*.flags,files/cli/**/*.check.*,files/jvm/*.so,files/shootout/*.javaopts,files/shootout/*.runner,files/shootout/*.txt,files/**/*.test"/>
+ includes="files/**/*.args,files/**/*.check,files/**/*.dll,files/**/*.jar,files/**/*.java,files/**/*.scala,files/**/*.flags,files/cli/**/*.check.*,files/jvm/*.so,files/shootout/*.javaopts,files/shootout/*.runner,files/shootout/*.txt,files/specialized/*.txt,files/**/*.test"
+ excludes="files/presentation"/>
<!-- <srcset dir="${dist.dir}/src" includes="scala-partest-src.jar"/> -->
<libset dir="${dist.dir}/lib" includes="scala-partest.jar"/>
<libset dir="${lib.dir}" includes="scalacheck.jar"/>
@@ -262,41 +290,11 @@ MAIN DISTRIBUTION SBAZ
<target name="pack-maven.done" depends="pack-maven.scripts"/>
<!-- ===========================================================================
-JAVA FOUR DISTRIBUTION PACKAGING
-============================================================================ -->
-
- <target name="fourpack-archives.start">
- <mkdir dir="${dists.dir}/archives"/>
- </target>
-
- <target name="fourpack-archives.tar" depends="fourpack-archives.start">
- <tar destfile="${dists.dir}/archives/scala-${version.number}-jvm4.tgz"
- compression="gzip" longfile="gnu">
- <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4"
- includes="bin/**" mode="755"/>
- <tarfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4"
- excludes="bin/**"/>
- </tar>
- <checksum file="${dists.dir}/archives/scala-${version.number}-jvm4.tgz" fileext=".md5"/>
- </target>
-
- <target name="fourpack-archives.zip" depends="fourpack-archives.tar">
- <zip destfile="${dists.dir}/archives/scala-${version.number}-jvm4.zip">
- <zipfileset dir="${dists.dir}/scala-jvm4-${version.number}" prefix="scala-${version.number}-jvm4"/>
- </zip>
- <checksum file="${dists.dir}/archives/scala-${version.number}-jvm4.zip" fileext=".md5"/>
- </target>
-
- <target name="fourpack-archives.done" depends="fourpack-archives.zip"/>
-
-<!-- ===========================================================================
MISCELLANEOUS
============================================================================ -->
<target name="pack-all.done" depends="pack-archives.done, pack-sbaz.done, pack-maven.done"/>
- <target name="fourpack-all.done" depends="fourpack-archives.done"/>
-
<!-- ===========================================================================
MISCELLANEOUS
============================================================================ -->
diff --git a/src/compiler/scala/tools/ant/Scaladoc.scala b/src/compiler/scala/tools/ant/Scaladoc.scala
index 727b8db0cc..419f60af21 100644
--- a/src/compiler/scala/tools/ant/Scaladoc.scala
+++ b/src/compiler/scala/tools/ant/Scaladoc.scala
@@ -112,6 +112,9 @@ class Scaladoc extends ScalaMatchingTask {
/** Instruct the compiler to generate links to sources */
private var docsourceurl: Option[String] = None
+ /** Point scaladoc at uncompilable sources. */
+ private var docUncompilable: Option[String] = None
+
/** Instruct the compiler to use additional parameters */
private var addParams: String = ""
@@ -331,6 +334,10 @@ class Scaladoc extends ScalaMatchingTask {
buildError("Unknown unchecked flag '" + input + "'")
}
+ def setDocUncompilable(input: String) {
+ docUncompilable = Some(input)
+ }
+
/*============================================================================*\
** Properties getters **
\*============================================================================*/
@@ -518,6 +525,8 @@ class Scaladoc extends ScalaMatchingTask {
if (!doctitle.isEmpty) docSettings.doctitle.value = decodeEscapes(doctitle.get)
if (!docversion.isEmpty) docSettings.docversion.value = decodeEscapes(docversion.get)
if (!docsourceurl.isEmpty) docSettings.docsourceurl.value =decodeEscapes(docsourceurl.get)
+ if (!docUncompilable.isEmpty) docSettings.docUncompilable.value = decodeEscapes(docUncompilable.get)
+
docSettings.deprecation.value = deprecation
docSettings.unchecked.value = unchecked
if (!docgenerator.isEmpty) docSettings.docgenerator.value = docgenerator.get
diff --git a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl
index 3280796878..1976535333 100644
--- a/src/compiler/scala/tools/ant/templates/tool-unix.tmpl
+++ b/src/compiler/scala/tools/ant/templates/tool-unix.tmpl
@@ -86,7 +86,7 @@ if $cygwin; then
case "$TERM" in
rxvt* | xterm*)
stty -icanon min 1 -echo
- CYGWIN_JLINE_TERMINAL="-Djline.terminal=jline.UnixTerminal"
+ CYGWIN_JLINE_TERMINAL="-Djline.terminal=scala.tools.jline.UnixTerminal"
;;
esac
fi
diff --git a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl
index a5fd17a7a9..21651831df 100644
--- a/src/compiler/scala/tools/ant/templates/tool-windows.tmpl
+++ b/src/compiler/scala/tools/ant/templates/tool-windows.tmpl
@@ -15,14 +15,6 @@ if "%OS%" NEQ "Windows_NT" (
@@setlocal
call :set_home
-set _ARGS=
-:loop
- rem Argument %1 may contain quotes so we use parentheses here
- if (%1)==() goto :looped
- set _ARGS=%_ARGS% %1
- shift
-goto loop
-:looped
rem We use the value of the JAVACMD environment variable if defined
set _JAVACMD=%JAVACMD%
@@ -47,8 +39,8 @@ if "%_TOOL_CLASSPATH%"=="" (
set _PROPS=-Dscala.home="%_SCALA_HOME%" -Denv.emacs="%EMACS%" @properties@
-rem echo "%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %_ARGS%
-"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %_ARGS%
+rem echo "%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %*
+"%_JAVACMD%" %_JAVA_OPTS% %_PROPS% -cp "%_TOOL_CLASSPATH%" @class@ @toolflags@ %*
goto end
rem ##########################################################################
diff --git a/src/compiler/scala/tools/cmd/gen/AnyVals.scala b/src/compiler/scala/tools/cmd/gen/AnyVals.scala
index f6f48359cd..a1280eec8e 100644
--- a/src/compiler/scala/tools/cmd/gen/AnyVals.scala
+++ b/src/compiler/scala/tools/cmd/gen/AnyVals.scala
@@ -6,9 +6,139 @@
package scala.tools.cmd
package gen
+/** Code generation of the AnyVal types and their companions.
+ */
+trait AnyValReps {
+ self: AnyVals =>
+
+ sealed abstract class AnyValNum(name: String) extends AnyValRep(name) {
+ def isCardinal: Boolean = isIntegerType(this)
+ def unaryOps = if (isCardinal) List("+", "-", "~") else List("+", "-")
+ def bitwiseOps = if (isCardinal) List("|", "&", "^") else Nil
+ def shiftOps = if (isCardinal) List("<<", ">>>", ">>") else Nil
+ def comparisonOps = List("==", "!=", "<", "<=", ">", ">=")
+ def otherOps = List("+", "-" ,"*", "/", "%")
+
+ // Given two numeric value types S and T , the operation type of S and T is defined as follows:
+ // If both S and T are subrange types then the operation type of S and T is Int.
+ // Otherwise the operation type of S and T is the larger of the two types wrt ranking.
+ // Given two numeric values v and w the operation type of v and w is the operation type
+ // of their run-time types.
+ def opType(that: AnyValNum): AnyValNum = {
+ val rank = IndexedSeq(I, L, F, D)
+ (rank indexOf this, rank indexOf that) match {
+ case (-1, -1) => I
+ case (r1, r2) => rank apply (r1 max r2)
+ }
+ }
+
+ def mkCoercions = numeric map (x => "def to%s: %s".format(x, x))
+ def mkUnaryOps = unaryOps map (x => "def unary_%s : %s".format(x, this opType I))
+ def mkStringOps = List("def +(x: String): String")
+ def mkShiftOps = (
+ for (op <- shiftOps ; arg <- List(I, L)) yield
+ "def %s(x: %s): %s".format(op, arg, this opType I)
+ )
+
+ def clumps: List[List[String]] = {
+ val xs1 = List(mkCoercions, mkUnaryOps, mkStringOps, mkShiftOps) map (xs => if (xs.isEmpty) xs else xs :+ "")
+ val xs2 = List(
+ mkBinOpsGroup(comparisonOps, numeric, _ => Z),
+ mkBinOpsGroup(bitwiseOps, cardinal, this opType _),
+ mkBinOpsGroup(otherOps, numeric, this opType _)
+ )
+ xs1 ++ xs2
+ }
+ def classLines = clumps.foldLeft(List[String]()) {
+ case (res, Nil) => res
+ case (res, lines) =>
+ val xs = lines map {
+ case "" => ""
+ case s => interpolate(s) + " = " + stub
+ }
+ res ++ xs
+ }
+ def objectLines = {
+ val comp = if (isCardinal) cardinalCompanion else floatingCompanion
+ (comp + allCompanions).trim.lines map interpolate toList
+ }
+
+ /** Makes a set of binary operations based on the given set of ops, args, and resultFn.
+ *
+ * @param ops list of function names e.g. List(">>", "%")
+ * @param args list of types which should appear as arguments
+ * @param resultFn function which calculates return type based on arg type
+ * @return list of function definitions
+ */
+ def mkBinOpsGroup(ops: List[String], args: List[AnyValNum], resultFn: AnyValNum => AnyValRep): List[String] = (
+ ops flatMap (op =>
+ args.map(arg => "def %s(x: %s): %s".format(op, arg, resultFn(arg))) :+ ""
+ )
+ ).toList
+ }
+
+ sealed abstract class AnyValRep(val name: String) {
+ def classLines: List[String]
+ def objectLines: List[String]
+
+ def lcname = name.toLowerCase
+ def boxedName = this match {
+ case U => "scala.runtime.BoxedUnit"
+ case C => "java.lang.Character"
+ case I => "java.lang.Integer"
+ case _ => "java.lang." + name
+ }
+ def zeroRep = this match {
+ case L => "0L"
+ case F => "0.0f"
+ case D => "0.0d"
+ case _ => "0"
+ }
+
+ def indent(s: String) = if (s == "") "" else " " + s
+ def indentN(s: String) = s.lines map indent mkString "\n"
+
+ def boxUnboxImpls = Map(
+ "@boxImpl@" -> "%s.valueOf(x)".format(boxedName),
+ "@unboxImpl@" -> "x.asInstanceOf[%s].%sValue()".format(boxedName, lcname),
+ "@unboxDoc@" -> "the %s resulting from calling %sValue() on `x`".format(name, lcname)
+ )
+ def interpolations = Map(
+ "@name@" -> name,
+ "@boxed@" -> boxedName,
+ "@lcname@" -> lcname,
+ "@zero@" -> zeroRep
+ ) ++ boxUnboxImpls
+
+ def interpolate(s: String): String = interpolations.foldLeft(s) {
+ case (str, (key, value)) => str.replaceAll(key, value)
+ }
+ def classDoc = interpolate(classDocTemplate)
+ def objectDoc = ""
+ def mkImports = ""
+ def mkClass = assemble("final class", "AnyVal", classLines) + "\n"
+ def mkObject = assemble("object", "AnyValCompanion", objectLines) + "\n"
+ def make() = List[String](
+ headerTemplate,
+ mkImports,
+ classDoc,
+ mkClass,
+ objectDoc,
+ mkObject
+ ) mkString ""
+
+ def assemble(what: String, parent: String, lines: List[String]): String = {
+ val decl = "%s %s extends %s ".format(what, name, parent)
+ val body = if (lines.isEmpty) "{ }\n\n" else lines map indent mkString ("{\n", "\n", "\n}\n")
+
+ decl + body
+ }
+ override def toString = name
+ }
+}
+
trait AnyValTemplates {
- def timestampString = ""
- def template = ("""
+ def headerTemplate = ("""
/* __ *\
** ________ ___ / / ___ Scala API **
** / __/ __// _ | / / / _ | (c) 2002-2011, LAMP/EPFL **
@@ -20,60 +150,61 @@ trait AnyValTemplates {
%s
package scala
-import java.{ lang => jl }
- """.trim.format(timestampString) + "\n\n"
- )
-
- def booleanBody = """
-final class Boolean extends AnyVal {
- def unary_! : Boolean = sys.error("stub")
-
- def ==(x: Boolean): Boolean = sys.error("stub")
- def !=(x: Boolean): Boolean = sys.error("stub")
- def ||(x: Boolean): Boolean = sys.error("stub")
- def &&(x: Boolean): Boolean = sys.error("stub")
- // Compiler won't build with these seemingly more accurate signatures
- // def ||(x: => Boolean): Boolean = sys.error("stub")
- // def &&(x: => Boolean): Boolean = sys.error("stub")
- def |(x: Boolean): Boolean = sys.error("stub")
- def &(x: Boolean): Boolean = sys.error("stub")
- def ^(x: Boolean): Boolean = sys.error("stub")
-}
+""".trim.format(timestampString) + "\n\n")
-object Boolean extends AnyValCompanion {
- override def toString = "object scala.Boolean"
- def box(x: Boolean): jl.Boolean = jl.Boolean.valueOf(x)
- def unbox(x: jl.Object): Boolean = x.asInstanceOf[jl.Boolean].booleanValue()
-}
- """.trim
+ def classDocTemplate = ("""
+/** `@name@` is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system.
+ *
+ * There is an implicit conversion from [[scala.@name@]] => [[scala.runtime.Rich@name@]]
+ * which provides useful non-primitive operations.
+ */
+""".trim + "\n")
- def unitBody = """
-import runtime.BoxedUnit
+ def timestampString = "// DO NOT EDIT, CHANGES WILL BE LOST.\n"
+ def stub = """sys.error("stub")"""
-final class Unit extends AnyVal { }
+ def allCompanions = """
+/** Transform a value type into a boxed reference type.
+ *
+ * @param x the @name@ to be boxed
+ * @return a @boxed@ offering `x` as its underlying value.
+ */
+def box(x: @name@): @boxed@ = @boxImpl@
+
+/** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a @boxed@.
+ *
+ * @param x the @boxed@ to be unboxed.
+ * @throws ClassCastException if the argument is not a @boxed@
+ * @return @unboxDoc@
+ */
+def unbox(x: java.lang.Object): @name@ = @unboxImpl@
-object Unit extends AnyValCompanion {
- override def toString = "object scala.Unit"
- def box(x: Unit): BoxedUnit = BoxedUnit.UNIT
- def unbox(x: jl.Object): Unit = ()
-}
- """.trim
+/** The String representation of the scala.@name@ companion object.
+ */
+override def toString = "object scala.@name@"
+"""
def cardinalCompanion = """
-final val MinValue = @type@.MIN_VALUE
-final val MaxValue = @type@.MAX_VALUE
+/** The smallest value representable as a @name@.
+ */
+final val MinValue = @boxed@.MIN_VALUE
-def box(x: @name@): @type@ = @type@.valueOf(x)
-def unbox(x: jl.Object): @name@ = x.asInstanceOf[@type@].@lcname@Value()
-override def toString = "object scala.@name@"
- """.trim.lines
+/** The largest value representable as a @name@.
+ */
+final val MaxValue = @boxed@.MAX_VALUE
+"""
def floatingCompanion = """
-/** The smallest positive value greater than @zero@.*/
-final val MinPositiveValue = @type@.MIN_VALUE
-final val NaN = @type@.NaN
-final val PositiveInfinity = @type@.POSITIVE_INFINITY
-final val NegativeInfinity = @type@.NEGATIVE_INFINITY
+/** The smallest positive value greater than @zero@ which is
+ * representable as a @name@.
+ */
+final val MinPositiveValue = @boxed@.MIN_VALUE
+final val NaN = @boxed@.NaN
+final val PositiveInfinity = @boxed@.POSITIVE_INFINITY
+final val NegativeInfinity = @boxed@.NEGATIVE_INFINITY
@deprecated("use @name@.MinPositiveValue instead")
final val Epsilon = MinPositiveValue
@@ -83,138 +214,67 @@ final val Epsilon = MinPositiveValue
* is the smallest positive value representable by a @name@. In Scala that number
* is called @name@.MinPositiveValue.
*/
-final val MinValue = -@type@.MAX_VALUE
+final val MinValue = -@boxed@.MAX_VALUE
/** The largest finite positive number representable as a @name@. */
-final val MaxValue = @type@.MAX_VALUE
-
-def box(x: @name@): @type@ = @type@.valueOf(x)
-def unbox(x: jl.Object): @name@ = x.asInstanceOf[@type@].@lcname@Value()
-override def toString = "object scala.@name@"
- """.trim.lines
+final val MaxValue = @boxed@.MAX_VALUE
+"""
}
-class AnyVals extends AnyValTemplates {
- val B = "Byte"
- val S = "Short"
- val C = "Char"
- val I = "Int"
- val L = "Long"
- val F = "Float"
- val D = "Double"
-
- lazy val cardinal = List(B, S, C, I, L)
- lazy val floating = List(F, D)
- lazy val numeric = cardinal ++ floating
-
- def javaType(primType: String) = "jl." + (primType match {
- case C => "Character"
- case I => "Integer"
- case t => t
- })
-
- def make() =
- (numeric zip (numeric map (name => new AnyValOps(name).make()))) ++ List(
- ("Boolean", template + booleanBody),
- ("Unit", template + unitBody)
- )
-
- class AnyValOps(name: String) {
- val isCardinal = cardinal contains name
- val restype = if ("LFD" contains name.head) name else I
- val tpe = javaType(name)
- val zero = name.head match {
- case 'L' => "0L"
- case 'F' => "0.0f"
- case 'D' => "0.0d"
- case _ => "0"
- }
- val interpolations = Map(
- "@restype@" -> restype,
- "@name@" -> name,
- "@type@" -> tpe,
- "@lcname@" -> name.toLowerCase,
- "@zero@" -> zero
- )
-
- def mkCoercions = numeric map (x => "def to%s: %s".format(x, x))
- def mkUnaryOps = unaryops map (op => "def unary_%s : @restype@".format(op))
- def mkCommon = List(
- "def +(x: String): String"
- )
- def mkShiftOps = (
- for (op <- shiftops ; tpe <- List(I, L)) yield
- "def %s(x: %s): @restype@".format(op, tpe)
- )
-
- def clumps: List[List[String]] = {
- val xs1 = List(mkCoercions, mkUnaryOps, mkCommon, mkShiftOps) map (xs => if (xs.isEmpty) xs else xs :+ "")
- val xs2 = List(
- mkBinOpsGroup(boolBinops, numeric, _ => "Boolean"),
- mkBinOpsGroup(bitwiseops, cardinal, resultTypeForArg),
- mkBinOpsGroup(otherBinops, numeric, resultTypeForArg)
- )
- xs1 ++ xs2
- }
-
- def defImplementation = "sys.error(\"stub\")"
- def indent(s: String) = if (s == "") "" else " " + s
- def mkClass = {
- val lines = clumps.foldLeft(List[String]()) {
- case (res, Nil) => res
- case (res, lines) =>
- val xs = lines map {
- case "" => ""
- case s => interpolate(s) + " = " + defImplementation
- }
- res ++ xs
- }
- assemble("final class", "AnyVal", lines)
- }
- def mkObject = assemble("object", "AnyValCompanion", companionBody map interpolate toList)
-
- def assemble(what: String, parent: String, lines: List[String]): String = (
- List(what, name, "extends", parent, "{").mkString(" ") +:
- (lines map indent) :+
- "}"
- ).mkString("\n", "\n", "\n")
-
- def make() = template + mkClass + "\n" + mkObject
-
- def interpolate(s: String): String = interpolations.foldLeft(s) {
- case (str, (key, value)) => str.replaceAll(key, value)
- }
-
- /** Makes a set of binary operations based on the given set of ops, args, and resultFn.
- *
- * @param ops list of function names e.g. List(">>", "%")
- * @param args list of types which should appear as arguments
- * @param resultFn function which calculates return type based on arg type
- * @return list of function definitions
- */
- def mkBinOpsGroup(ops: List[String], args: List[String], resultFn: String => String): List[String] = (
- ops flatMap { op =>
- args.map(arg => "def %s(x: %s): ".format(op, arg) + resultFn(arg)) :+ ""
- }
+class AnyVals extends AnyValReps with AnyValTemplates {
+ object B extends AnyValNum("Byte")
+ object S extends AnyValNum("Short")
+ object C extends AnyValNum("Char")
+ object I extends AnyValNum("Int")
+ object L extends AnyValNum("Long")
+ object F extends AnyValNum("Float")
+ object D extends AnyValNum("Double")
+ object Z extends AnyValRep("Boolean") {
+ def classLines = """
+def unary_! : Boolean = sys.error("stub")
+
+def ==(x: Boolean): Boolean = sys.error("stub")
+def !=(x: Boolean): Boolean = sys.error("stub")
+def ||(x: Boolean): Boolean = sys.error("stub")
+def &&(x: Boolean): Boolean = sys.error("stub")
+// Compiler won't build with these seemingly more accurate signatures
+// def ||(x: => Boolean): Boolean = sys.error("stub")
+// def &&(x: => Boolean): Boolean = sys.error("stub")
+def |(x: Boolean): Boolean = sys.error("stub")
+def &(x: Boolean): Boolean = sys.error("stub")
+def ^(x: Boolean): Boolean = sys.error("stub")
+ """.trim.lines.toList
+
+ def objectLines = interpolate(allCompanions).lines.toList
+ }
+ object U extends AnyValRep("Unit") {
+ override def classDoc = """
+/** Unit is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system. There is
+ * only one value of type Unit: `()`.
+ */
+"""
+ def classLines = Nil
+ def objectLines = interpolate(allCompanions).lines.toList
+
+ override def boxUnboxImpls = Map(
+ "@boxImpl@" -> "scala.runtime.BoxedUnit.UNIT",
+ "@unboxImpl@" -> "()",
+ "@unboxDoc@" -> "the Unit value ()"
)
+ }
- def resultTypeForArg(arg: String): String = arg match {
- case L if isCardinal => L
- case F => if (name == D) D else F
- case D => D
- case _ => restype
- }
+ def isSubrangeType = Set(B, S, C)
+ def isIntegerType = Set(B, S, C, I, L)
+ def isFloatingType = Set(F, D)
+ def isWideType = Set(L, D)
- def unaryops = if (isCardinal) List("+", "-", "~") else List("+", "-")
- def bitwiseops = if (isCardinal) List("|", "&", "^") else Nil
- def shiftops = if (isCardinal) List("<<", ">>>", ">>") else Nil
- def boolBinops = List("==", "!=", "<", "<=", ">", ">=")
- def otherBinops = List("+", "-" ,"*", "/", "%")
+ def cardinal = numeric filter isIntegerType
+ def numeric = List(B, S, C, I, L, F, D)
+ def values = List(U, Z) ++ numeric
- def companionBody =
- if (isCardinal) cardinalCompanion
- else floatingCompanion
- }
+ def make() = values map (x => (x.name, x.make()))
}
-object AnyVals extends AnyVals { } \ No newline at end of file
+object AnyVals extends AnyVals { }
+
diff --git a/src/compiler/scala/tools/cmd/gen/Codegen.scala b/src/compiler/scala/tools/cmd/gen/Codegen.scala
index d7801f2c08..1bb820455a 100644
--- a/src/compiler/scala/tools/cmd/gen/Codegen.scala
+++ b/src/compiler/scala/tools/cmd/gen/Codegen.scala
@@ -26,13 +26,7 @@ object Codegen {
echo("Generating sources into " + out)
if (anyvals || all) {
- val av = new AnyVals {
- override def timestampString = (
- "// DO NOT EDIT, CHANGES WILL BE LOST.\n" + (
- if (stamp) "// Generated by tools/codegen on " + new java.util.Date + "\n" else ""
- )
- )
- }
+ val av = new AnyVals { }
av.make() foreach { case (name, code ) =>
val file = out / (name + ".scala") toFile;
diff --git a/src/compiler/scala/tools/nsc/CompileClient.scala b/src/compiler/scala/tools/nsc/CompileClient.scala
index 9987eb0204..fd4f777890 100644
--- a/src/compiler/scala/tools/nsc/CompileClient.scala
+++ b/src/compiler/scala/tools/nsc/CompileClient.scala
@@ -16,18 +16,21 @@ import sys.SystemProperties.preferIPv4Stack
class StandardCompileClient extends HasCompileSocket with CompileOutputCommon {
lazy val compileSocket: CompileSocket = CompileSocket
- val versionMsg = "Fast " + Properties.versionMsg
- var verbose = false
+ val versionMsg = "Fast " + Properties.versionMsg
+ var verbose = false
def process(args: Array[String]): Int = {
- val fscArgs = args.toList
- val settings = new FscSettings
- val command = new CompilerCommand(fscArgs, settings)
- verbose = settings.verbose.value
- val shutdown = settings.shutdown.value
- val vmArgs = settings.jvmargs.unparse ++ settings.defines.unparse ++ (
- if (settings.preferIPv4.value) List("-D%s=true".format(preferIPv4Stack.key)) else Nil
- )
+ // Trying to get out in front of the log messages in case we're
+ // going from verbose to not verbose.
+ verbose = (args contains "-verbose")
+
+ val settings = new FscSettings(Console.println)
+ val command = new OfflineCompilerCommand(args.toList, settings)
+ val shutdown = settings.shutdown.value
+ val extraVmArgs = if (settings.preferIPv4.value) List("-D%s=true".format(preferIPv4Stack.key)) else Nil
+
+ val vmArgs = settings.jvmargs.unparse ++ settings.defines.unparse ++ extraVmArgs
+ val fscArgs = args.toList ++ command.extraFscArgs
if (settings.version.value) {
Console println versionMsg
@@ -35,7 +38,8 @@ class StandardCompileClient extends HasCompileSocket with CompileOutputCommon {
}
info(versionMsg)
- info(fscArgs.mkString("[Given arguments: ", " ", "]"))
+ info(args.mkString("[Given arguments: ", " ", "]"))
+ info(fscArgs.mkString("[Transformed arguments: ", " ", "]"))
info(vmArgs.mkString("[VM arguments: ", " ", "]"))
val socket =
diff --git a/src/compiler/scala/tools/nsc/CompileServer.scala b/src/compiler/scala/tools/nsc/CompileServer.scala
index a34be6226b..866975b414 100644
--- a/src/compiler/scala/tools/nsc/CompileServer.scala
+++ b/src/compiler/scala/tools/nsc/CompileServer.scala
@@ -21,7 +21,9 @@ import settings.FscSettings
*/
class StandardCompileServer extends SocketServer {
lazy val compileSocket: CompileSocket = CompileSocket
+
private var compiler: Global = null
+ private def clearCompiler() = compiler = null
var reporter: ConsoleReporter = _
var shutdown = false
@@ -58,7 +60,7 @@ class StandardCompileServer extends SocketServer {
(totalMemory - freeMemory).toDouble / maxMemory.toDouble > MaxCharge
}
- protected def newOfflineCompilerCommand(arguments: List[String], settings: Settings) =
+ protected def newOfflineCompilerCommand(arguments: List[String], settings: FscSettings): OfflineCompilerCommand =
new OfflineCompilerCommand(arguments, settings)
/** Problematically, Settings are only considered equal if every setting
@@ -69,7 +71,7 @@ class StandardCompileServer extends SocketServer {
* and which do not interestingly influence compilation products.
*/
def unequalSettings(s1: Settings, s2: Settings): Set[Settings#Setting] = {
- val ignoreSettings = Set("-d", "-encoding", "-verbose")
+ val ignoreSettings = Set("-d", "-encoding", "-currentDir")
def trim (s: Settings): Set[Settings#Setting] = (
s.userSetSettings.toSet[Settings#Setting] filterNot (ss => ignoreSettings exists (ss respondsTo _))
)
@@ -80,7 +82,6 @@ class StandardCompileServer extends SocketServer {
}
def session() {
- printMemoryStats()
val password = compileSocket getPassword port
val guessedPassword = in.readLine()
val input = in.readLine()
@@ -92,29 +93,34 @@ class StandardCompileServer extends SocketServer {
if (input == null || password != guessedPassword)
return
- val args = input.split("\0", -1).toList
- val settings = new FscSettings(fscError)
- val command = newOfflineCompilerCommand(args, settings)
+ val args = input.split("\0", -1).toList
+ val newSettings = new FscSettings(fscError)
+ this.verbose = newSettings.verbose.value
+ val command = newOfflineCompilerCommand(args, newSettings)
+
+ info("Settings after normalizing paths: " + newSettings)
+ printMemoryStats()
// Update the idle timeout if given
- if (!settings.idleMins.isDefault) {
- val mins = settings.idleMins.value
+ if (!newSettings.idleMins.isDefault) {
+ val mins = newSettings.idleMins.value
if (mins == 0) echo("Disabling idle timeout on compile server.")
else echo("Setting idle timeout to " + mins + " minutes.")
this.idleMinutes = mins
}
- if (settings.shutdown.value) {
+ if (newSettings.shutdown.value) {
shutdown = true
return out.println("[Compile server exited]")
}
- if (settings.reset.value) {
- compiler = null
- return out.println("[Compile server was reset]")
+ if (newSettings.reset.value) {
+ clearCompiler()
+ out.println("[Compile server was reset]")
+ if (command.files.isEmpty)
+ return
}
- this.verbose = settings.verbose.value
- reporter = new ConsoleReporter(command.settings, in, out) {
+ reporter = new ConsoleReporter(newSettings, in, out) {
// disable prompts, so that compile server cannot block
override def displayPrompt = ()
}
@@ -124,7 +130,7 @@ class StandardCompileServer extends SocketServer {
info("[Compiler version: " + Properties.versionString + ".]")
return false
}
- val unequal = unequalSettings(command.settings, compiler.settings)
+ val unequal = unequalSettings(newSettings, compiler.settings)
if (unequal.nonEmpty) {
info("[Replacing compiler with new instance because settings are unequal.]")
info("[Asymmetric settings: " + unequal.mkString(", ") + "]")
@@ -133,24 +139,26 @@ class StandardCompileServer extends SocketServer {
}
if (command.shouldStopWithInfo)
- reporter.info(null, command.getInfoMessage(newGlobal(command.settings, reporter)), true)
+ reporter.info(null, command.getInfoMessage(newGlobal(newSettings, reporter)), true)
else if (command.files.isEmpty)
reporter.info(null, command.usageMsg, true)
else {
if (isCompilerReusable) {
- compiler.settings = command.settings
+ info("[Reusing existing Global instance.]")
+ compiler.settings = newSettings
compiler.reporter = reporter
}
else {
- compiler = newGlobal(command.settings, reporter)
+ compiler = newGlobal(newSettings, reporter)
}
val c = compiler
try new c.Run() compile command.files
catch {
case ex @ FatalError(msg) =>
reporter.error(null, "fatal error: " + msg)
- compiler = null
+ clearCompiler()
case ex =>
+ warn("Compile server encountered fatal condition: " + ex)
shutdown = true
throw ex
}
@@ -158,7 +166,7 @@ class StandardCompileServer extends SocketServer {
reporter.printSummary()
if (isMemoryFullEnough) {
info("Nulling out compiler due to memory utilization.")
- compiler = null
+ clearCompiler()
}
}
}
diff --git a/src/compiler/scala/tools/nsc/CompileSocket.scala b/src/compiler/scala/tools/nsc/CompileSocket.scala
index 1fd37eb70c..1e2a367176 100644
--- a/src/compiler/scala/tools/nsc/CompileSocket.scala
+++ b/src/compiler/scala/tools/nsc/CompileSocket.scala
@@ -54,7 +54,7 @@ class CompileSocket extends CompileOutputCommon {
* by the port number.
*/
protected lazy val dirName = "scalac-compile-server-port"
- protected lazy val cmdName = Properties.scalaCmd
+ protected def cmdName = Properties.scalaCmd
/** The vm part of the command to start a new scala compile server */
protected val vmCommand = Properties.scalaHome match {
diff --git a/src/compiler/scala/tools/nsc/CompilerCommand.scala b/src/compiler/scala/tools/nsc/CompilerCommand.scala
index 1c0fd8b9de..c9791b929c 100644
--- a/src/compiler/scala/tools/nsc/CompilerCommand.scala
+++ b/src/compiler/scala/tools/nsc/CompilerCommand.scala
@@ -26,13 +26,6 @@ class CompilerCommand(arguments: List[String], val settings: Settings) {
/** The name of the command */
def cmdName = "scalac"
- private def helpSyntaxColumnWidth: Int =
- (settings.visibleSettings map (_.helpSyntax.length)) max
-
- private def format(s: String): String =
- if (s.length >= helpSyntaxColumnWidth) s
- else s + (" " * (helpSyntaxColumnWidth - s.length))
-
private def explainAdvanced = "\n" + """
|-- Notes on option parsing --
|Boolean settings are always false unless set.
@@ -44,23 +37,47 @@ class CompilerCommand(arguments: List[String], val settings: Settings) {
| example: -Xprint:expl,24-26 prints phases explicitouter, closelim, dce, jvm.
| example: -Xprint:-4 prints only the phases up to typer.
|
- """.stripMargin.trim + "\n\n"
+ """.stripMargin.trim + "\n"
- /** Creates a help message for a subset of options based on cond */
- def createUsageMsg(label: String, shouldExplain: Boolean, cond: Setting => Boolean): String = {
- def helpStr(s: Setting) = format(s.helpSyntax) + " " + s.helpDescription
+ def shortUsage = "Usage: %s <options> <source files>" format cmdName
+ def createUsagePreface(shouldExplain: Boolean) =
+ if (shouldExplain) shortUsage + "\n" + explainAdvanced else ""
- val usage = "Usage: %s <options> <source files>\n" format cmdName
- val explain = if (shouldExplain) explainAdvanced else ""
- val prefix = label + " options include:\n "
+ /** Creates a help message for a subset of options based on cond */
+ def createUsageMsg(cond: Setting => Boolean): String = {
+ val baseList = (settings.visibleSettings filter cond).toList sortBy (_.name)
+ val width = baseList map (_.helpSyntax.length) max
+ def format(s: String) = ("%-" + width + "s") format s
+ def helpStr(s: Setting) = {
+ val str = format(s.helpSyntax) + " " + s.helpDescription
+ val suffix = s.deprecationMessage match {
+ case Some(msg) => "\n" + format("") + " deprecated: " + msg
+ case _ => ""
+ }
+ str + suffix
+ }
+ val debugs = baseList filter (_.isForDebug)
+ val deprecateds = baseList filter (_.isDeprecated)
+ val theRest = baseList filterNot (debugs.toSet ++ deprecateds)
+
+ def sstring(msg: String, xs: List[Setting]) =
+ if (xs.isEmpty) None else Some(msg :: xs.map(helpStr) mkString "\n ")
+
+ List(
+ sstring("", theRest),
+ sstring("\nAdditional debug settings:", debugs),
+ sstring("\nDeprecated settings:", deprecateds)
+ ).flatten mkString "\n"
+ }
- // Separating out any debugging options from others for easier reading
- val (debug, rest) = (settings.visibleSettings filter cond).toList sortBy (_.name) partition (_.isForDebug)
+ def createUsageMsg(label: String, shouldExplain: Boolean, cond: Setting => Boolean): String = {
+ val prefix = List(
+ Some(shortUsage),
+ Some(explainAdvanced) filter (_ => shouldExplain),
+ Some(label + " options include:")
+ ).flatten mkString "\n"
- (rest map helpStr).mkString(usage + explain + prefix, "\n ", "\n") + (
- if (debug.isEmpty) ""
- else (debug map helpStr).mkString("\nAdditional debug settings:\n ", "\n ", "\n")
- )
+ prefix + createUsageMsg(cond)
}
/** Messages explaining usage and options */
diff --git a/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala b/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala
index 86ab76b59c..27596dc899 100644
--- a/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala
+++ b/src/compiler/scala/tools/nsc/GenericRunnerCommand.scala
@@ -20,8 +20,8 @@ extends CompilerCommand(args, settings) {
this(args, str => Console.println("Error: " + str))
/** name of the associated compiler command */
- override val cmdName = "scala"
- val compCmdName = "scalac"
+ override def cmdName = "scala"
+ def compCmdName = "scalac"
// change CompilerCommand behavior
override def shouldProcessArguments: Boolean = false
@@ -53,10 +53,10 @@ extends CompilerCommand(args, settings) {
Usage: @cmd@ <options> [<script|class|object|jar> <arguments>]
or @cmd@ -help
-All options to @compileCmd@ are also allowed. See @compileCmd@ -help.
- """)
+All options to @compileCmd@ (see @compileCmd@ -help) are also allowed.
+""")
- override def usageMsg = shortUsageMsg + "\n" + interpolate("""
+ override def usageMsg = shortUsageMsg + interpolate("""
The first given argument other than options to @cmd@ designates
what to run. Runnable targets are:
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 5fd5538660..2e2f9c1ad7 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -661,8 +661,21 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable
/** To be initialized from firstPhase. */
private var terminalPhase: Phase = NoPhase
- /** Whether compilation should stop at or skip the phase with given name. */
- protected def stopPhase(name: String) = settings.stop contains name
+ // Calculate where to stop based on settings -Ystop-before or -Ystop-after.
+ // Slightly complicated logic due to wanting -Ystop-before:parser to fail rather
+ // than mysteriously running to completion.
+ private lazy val stopPhaseSetting = {
+ val result = phaseDescriptors sliding 2 collectFirst {
+ case xs if xs exists (settings.stopBefore contains _.phaseName) => if (settings.stopBefore contains xs.head.phaseName) xs.head else xs.last
+ case xs if settings.stopAfter contains xs.head.phaseName => xs.last
+ }
+ if (result exists (_.phaseName == "parser"))
+ globalError("Cannot stop before parser phase.")
+
+ result
+ }
+ // The phase to stop BEFORE running.
+ protected def stopPhase(name: String) = stopPhaseSetting exists (_.phaseName == name)
protected def skipPhase(name: String) = settings.skip contains name
/** As definitions.init requires phase != NoPhase, and calling phaseDescriptors.head
@@ -792,6 +805,12 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable
_unitbufSize += 1 // counting as they're added so size is cheap
compiledFiles += unit.source.file.path
}
+ private def checkDeprecatedSettings(unit: CompilationUnit) {
+ // issue warnings for any usage of deprecated settings
+ settings.userSetSettings filter (_.isDeprecated) foreach { s =>
+ unit.deprecationWarning(NoPosition, s.name + " is deprecated: " + s.deprecationMessage.get)
+ }
+ }
/* An iterator returning all the units being compiled in this run */
/* !!! Note: changing this to unitbuf.toList.iterator breaks a bunch
@@ -868,17 +887,51 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable
}
}
+ def reportCompileErrors() {
+ if (reporter.hasErrors) {
+ for ((sym, file) <- symSource.iterator) {
+ sym.reset(new loaders.SourcefileLoader(file))
+ if (sym.isTerm)
+ sym.moduleClass reset loaders.moduleClassLoader
+ }
+ }
+ else {
+ def warn(count: Int, what: String, option: Settings#BooleanSetting) = (
+ if (option.isDefault && count > 0)
+ warning("there were %d %s warnings; re-run with %s for details".format(count, what, option.name))
+ )
+ warn(deprecationWarnings, "deprecation", settings.deprecation)
+ warn(uncheckedWarnings, "unchecked", settings.unchecked)
+ // todo: migrationWarnings
+ }
+ }
+
/** Compile list of source files */
def compileSources(_sources: List[SourceFile]) {
- val depSources = dependencyAnalysis.calculateFiles(_sources.distinct) // bug #1268, scalac confused by duplicated filenames
+ val depSources = dependencyAnalysis calculateFiles _sources.distinct
val sources = coreClassesFirst(depSources)
- if (reporter.hasErrors) // there is a problem already, e.g. a plugin was passed a bad option
+ // there is a problem already, e.g. a plugin was passed a bad option
+ if (reporter.hasErrors)
return
- val startTime = currentTime
- reporter.reset()
- for (source <- sources) addUnit(new CompilationUnit(source))
+ // nothing to compile, but we should still report use of deprecated options
+ if (sources.isEmpty) {
+ checkDeprecatedSettings(new CompilationUnit(new BatchSourceFile("<no file>", "")))
+ reportCompileErrors()
+ return
+ }
+ val startTime = currentTime
+ reporter.reset();
+ {
+ val first :: rest = sources
+ val unit = new CompilationUnit(first)
+ addUnit(unit)
+ checkDeprecatedSettings(unit)
+
+ for (source <- rest)
+ addUnit(new CompilationUnit(source))
+ }
globalPhase = firstPhase
if (opt.profileAll) {
@@ -947,23 +1000,7 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable
if (opt.noShow)
showMembers()
- if (reporter.hasErrors) {
- for ((sym, file) <- symSource.iterator) {
- sym.reset(new loaders.SourcefileLoader(file))
- if (sym.isTerm)
- sym.moduleClass reset loaders.moduleClassLoader
- }
- }
- else {
- def warn(count: Int, what: String, option: Settings#BooleanSetting) = (
- if (option.isDefault && count > 0)
- warning("there were %d %s warnings; re-run with %s for details".format(count, what, option.name))
- )
- warn(deprecationWarnings, "deprecation", settings.deprecation)
- warn(uncheckedWarnings, "unchecked", settings.unchecked)
- // todo: migrationWarnings
- }
-
+ reportCompileErrors()
symSource.keys foreach (x => resetPackageClass(x.owner))
informTime("total", startTime)
@@ -1077,13 +1114,15 @@ class Global(var settings: Settings, var reporter: Reporter) extends SymbolTable
*
*/
private def coreClassesFirst(files: List[SourceFile]) = {
+ val goLast = 4
def rank(f: SourceFile) = {
- if (f.file.container.name != "scala") 3
+ if (f.file.container.name != "scala") goLast
else f.file.name match {
case "ScalaObject.scala" => 1
case "LowPriorityImplicits.scala" => 2
case "StandardEmbeddings.scala" => 2
- case _ => 3
+ case "Predef.scala" => 3 /* Predef.scala before Any.scala, etc. */
+ case _ => goLast
}
}
files sortBy rank
diff --git a/src/compiler/scala/tools/nsc/MainGenericRunner.scala b/src/compiler/scala/tools/nsc/MainGenericRunner.scala
index 7ead4cce4a..f2d4bacb35 100644
--- a/src/compiler/scala/tools/nsc/MainGenericRunner.scala
+++ b/src/compiler/scala/tools/nsc/MainGenericRunner.scala
@@ -19,7 +19,7 @@ import GenericRunnerCommand._
* sources for the code to run: pre-compiled code, a script file,
* or interactive entry.
*/
-object MainGenericRunner {
+class MainGenericRunner {
def errorFn(ex: Throwable): Boolean = {
ex.printStackTrace()
false
@@ -29,11 +29,6 @@ object MainGenericRunner {
false
}
- def main(args: Array[String]) {
- if (!process(args))
- sys.exit(1)
- }
-
def process(args: Array[String]): Boolean = {
val command = new GenericRunnerCommand(args.toList, (x: String) => errorFn(x))
import command.{ settings, howToRun, thingToRun }
@@ -88,3 +83,10 @@ object MainGenericRunner {
}
}
}
+
+object MainGenericRunner extends MainGenericRunner {
+ def main(args: Array[String]) {
+ if (!process(args))
+ sys.exit(1)
+ }
+}
diff --git a/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala b/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala
index 786bcb1eb5..ad45651e23 100644
--- a/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala
+++ b/src/compiler/scala/tools/nsc/OfflineCompilerCommand.scala
@@ -5,10 +5,38 @@
package scala.tools.nsc
+import settings.FscSettings
+import io.Directory
+
/** A compiler command for the offline compiler.
*
* @author Martin Odersky and Lex Spoon
*/
-class OfflineCompilerCommand(arguments: List[String], settings: Settings) extends CompilerCommand(arguments, settings) {
+class OfflineCompilerCommand(arguments: List[String], settings: FscSettings) extends CompilerCommand(arguments, settings) {
+ import settings.currentDir
+ def extraFscArgs = List(currentDir.name, currentDir.value)
+
+ locally {
+ // if -current-dir is unset, we're on the client and need to obtain it.
+ if (currentDir.isDefault) {
+ // Prefer env variable PWD to system property user.dir because the former
+ // deals better with paths not rooted at / (filesystem mounts.)
+ val baseDirectory = System.getenv("PWD") match {
+ case null => Directory.Current getOrElse Directory("/")
+ case dir => Directory(dir)
+ }
+ currentDir.value = baseDirectory.path
+ }
+ else {
+ // Otherwise we're on the server and will use it to absolutize the paths.
+ settings.absolutize(currentDir.value)
+ }
+ }
+
override def cmdName = "fsc"
+ override def usageMsg = (
+ createUsageMsg("where possible fsc", false, x => x.isStandard && settings.isFscSpecific(x.name)) +
+ "\n\nStandard scalac options also available:" +
+ createUsageMsg(x => x.isStandard && !settings.isFscSpecific(x.name))
+ )
}
diff --git a/src/compiler/scala/tools/nsc/ScalaDoc.scala b/src/compiler/scala/tools/nsc/ScalaDoc.scala
index 61a3f343e7..a9330b053b 100644
--- a/src/compiler/scala/tools/nsc/ScalaDoc.scala
+++ b/src/compiler/scala/tools/nsc/ScalaDoc.scala
@@ -6,79 +6,71 @@
package scala.tools.nsc
-import java.io.File
-
-import scala.tools.nsc.reporters.{Reporter, ConsoleReporter}
-import scala.tools.nsc.util.FakePos //{Position}
+import java.io.File.pathSeparator
+import scala.tools.nsc.doc.DocFactory
+import scala.tools.nsc.reporters.ConsoleReporter
+import scala.tools.nsc.util.FakePos
import Properties.msilLibPath
-import File.pathSeparator
/** The main class for scaladoc, a front-end for the Scala compiler
* that generates documentation from source files.
*/
-object ScalaDoc {
-
- val versionMsg: String =
- "Scaladoc " +
- Properties.versionString + " -- " +
- Properties.copyrightString
-
- var reporter: ConsoleReporter = _
-
- private def scalacError(msg: String): Unit = {
- reporter.error(FakePos("scalac"), msg + "\n scalac -help gives more information")
- }
-
- def process(args: Array[String]): Unit = {
-
- val docSettings: doc.Settings =
- new doc.Settings(scalacError)
+class ScalaDoc {
+ val versionMsg = "Scaladoc %s -- %s".format(Properties.versionString, Properties.copyrightString)
+ def process(args: Array[String]): Boolean = {
+ var reporter: ConsoleReporter = null
+ val docSettings = new doc.Settings(msg => reporter.error(FakePos("scaladoc"), msg + "\n scaladoc -help gives more information"))
reporter = new ConsoleReporter(docSettings) {
- override def hasErrors = false // need to do this so that the Global instance doesn't trash all the symbols just because there was an error
+ // need to do this so that the Global instance doesn't trash all the
+ // symbols just because there was an error
+ override def hasErrors = false
}
-
- val command =
- new CompilerCommand(args.toList, docSettings)
-
- if (!reporter.hasErrors) { // No need to continue if reading the command generated errors
-
- if (docSettings.version.value)
- reporter.info(null, versionMsg, true)
- else if (docSettings.help.value) {
- reporter.info(null, command.usageMsg, true)
- }
- else if (docSettings.Xhelp.value)
- reporter.info(null, command.xusageMsg, true)
- else if (docSettings.Yhelp.value)
- reporter.info(null, command.yusageMsg, true)
- else if (docSettings.showPlugins.value)
- reporter.warning(null, "Plugins are not available when using Scaladoc")
- else if (docSettings.showPhases.value)
- reporter.warning(null, "Phases are restricted when using Scaladoc")
- else try {
-
- if (docSettings.target.value == "msil")
- msilLibPath foreach (x => docSettings.assemrefs.value += (pathSeparator + x))
-
- val docProcessor = new scala.tools.nsc.doc.DocFactory(reporter, docSettings)
- docProcessor.document(command.files)
-
- }
- catch {
- case ex @ FatalError(msg) =>
- if (docSettings.debug.value) ex.printStackTrace();
- reporter.error(null, "fatal error: " + msg)
- }
- finally {
- reporter.printSummary()
- }
+ val command = new ScalaDoc.Command(args.toList, docSettings)
+ def hasFiles = command.files.nonEmpty || docSettings.uncompilableFiles.nonEmpty
+
+ if (docSettings.version.value)
+ reporter.info(null, versionMsg, true)
+ else if (docSettings.Xhelp.value)
+ reporter.info(null, command.xusageMsg, true)
+ else if (docSettings.Yhelp.value)
+ reporter.info(null, command.yusageMsg, true)
+ else if (docSettings.showPlugins.value)
+ reporter.warning(null, "Plugins are not available when using Scaladoc")
+ else if (docSettings.showPhases.value)
+ reporter.warning(null, "Phases are restricted when using Scaladoc")
+ else if (docSettings.help.value || !hasFiles)
+ reporter.info(null, command.usageMsg, true)
+ else try {
+ if (docSettings.target.value == "msil")
+ msilLibPath foreach (x => docSettings.assemrefs.value += (pathSeparator + x))
+
+ new DocFactory(reporter, docSettings) document command.files
}
+ catch {
+ case ex @ FatalError(msg) =>
+ if (docSettings.debug.value) ex.printStackTrace()
+ reporter.error(null, "fatal error: " + msg)
+ }
+ finally reporter.printSummary()
+
+ // not much point in returning !reporter.hasErrors when it has
+ // been overridden with constant false.
+ true
+ }
+}
+object ScalaDoc extends ScalaDoc {
+ class Command(arguments: List[String], settings: doc.Settings) extends CompilerCommand(arguments, settings) {
+ override def cmdName = "scaladoc"
+ override def usageMsg = (
+ createUsageMsg("where possible scaladoc", false, x => x.isStandard && settings.isScaladocSpecific(x.name)) +
+ "\n\nStandard scalac options also available:" +
+ createUsageMsg(x => x.isStandard && !settings.isScaladocSpecific(x.name))
+ )
}
- def main(args: Array[String]): Unit = {
- process(args)
- sys.exit(if (reporter.hasErrors) 1 else 0)
+ def main(args: Array[String]): Unit = sys exit {
+ if (process(args)) 0 else 1
}
}
diff --git a/src/compiler/scala/tools/nsc/ast/DocComments.scala b/src/compiler/scala/tools/nsc/ast/DocComments.scala
index d9a2c555e6..2e97a3d820 100755
--- a/src/compiler/scala/tools/nsc/ast/DocComments.scala
+++ b/src/compiler/scala/tools/nsc/ast/DocComments.scala
@@ -7,6 +7,7 @@ package scala.tools.nsc
package ast
import symtab._
+import reporters.Reporter
import util.{Position, NoPosition}
import util.DocStrings._
import util.Chars._
@@ -18,6 +19,8 @@ import scala.collection.mutable.{HashMap, ListBuffer, StringBuilder}
*/
trait DocComments { self: SymbolTable =>
+ def reporter: Reporter
+
/** The raw doc comment map */
val docComments = new HashMap[Symbol, DocComment]
@@ -129,7 +132,6 @@ trait DocComments { self: SymbolTable =>
def expandWiki(str: String): String =
(str /: wikiReplacements) { (str1, regexRepl) => regexRepl._1 replaceAllIn(str1, regexRepl._2) }
-
private def getDocComment(sym: Symbol): Option[DocComment] =
mapFind(sym :: allInheritedOverriddenSymbols(sym))(docComments get _)
@@ -155,13 +157,13 @@ trait DocComments { self: SymbolTable =>
def merge(src: String, dst: String, sym: Symbol, copyFirstPara: Boolean = false): String = {
val srcSections = tagIndex(src)
val dstSections = tagIndex(dst)
- val srcParams = paramDocs(src, "@param", srcSections)
- val dstParams = paramDocs(dst, "@param", dstSections)
- val srcTParams = paramDocs(src, "@tparam", srcSections)
- val dstTParams = paramDocs(dst, "@tparam", dstSections)
- val out = new StringBuilder
- var copied = 0
- var tocopy = startTag(dst, dstSections dropWhile (!isMovable(dst, _)))
+ val srcParams = paramDocs(src, "@param", srcSections)
+ val dstParams = paramDocs(dst, "@param", dstSections)
+ val srcTParams = paramDocs(src, "@tparam", srcSections)
+ val dstTParams = paramDocs(dst, "@tparam", dstSections)
+ val out = new StringBuilder
+ var copied = 0
+ var tocopy = startTag(dst, dstSections dropWhile (!isMovable(dst, _)))
if (copyFirstPara) {
val eop = // end of comment body (first para), which is delimited by blank line, or tag, or end of comment
@@ -176,10 +178,12 @@ trait DocComments { self: SymbolTable =>
if (end > tocopy) tocopy = end
case None =>
srcSec match {
- case Some((start1, end1)) =>
+ case Some((start1, end1)) => {
out append dst.substring(copied, tocopy).trim
+ out append "\n"
copied = tocopy
out append src.substring(start1, end1).trim
+ }
case None =>
}
}
@@ -210,24 +214,18 @@ trait DocComments { self: SymbolTable =>
* @param owner The current owner in which variable definitions are searched.
* @param site The class for which doc comments are generated
*/
- def lookupVariable(vble: String, site: Symbol): Option[String] =
- if (site == NoSymbol)
- None
- else {
- def lookInBaseClasses = mapFind(site.info.baseClasses)(defs(_).get(vble)) match {
- case None => lookupVariable(vble, site.owner)
- case someStr => someStr
+ def lookupVariable(vble: String, site: Symbol): Option[String] = site match {
+ case NoSymbol => None
+ case _ =>
+ val searchList =
+ if (site.isModule) site :: site.info.baseClasses
+ else site.info.baseClasses
+
+ searchList collectFirst { case x if defs(x) contains vble => defs(x)(vble) } match {
+ case Some(str) if str startsWith '$' => lookupVariable(str.tail, site)
+ case res => res orElse lookupVariable(vble, site.owner)
}
- if (site.isModule)
- defs(site).get(vble) match {
- case Some(str) => return Some(str)
- case None => lookInBaseClasses
- }
- else lookInBaseClasses
- }
-
- private var expandCount = 0
- private final val expandLimit = 10
+ }
/** Expand variable occurrences in string `str', until a fix point is reached or
* a expandLimit is exceeded.
@@ -237,49 +235,57 @@ trait DocComments { self: SymbolTable =>
* @param site The class for which doc comments are generated
* @return Expanded string
*/
- protected def expandVariables(str: String, sym: Symbol, site: Symbol): String =
- if (expandCount < expandLimit) {
- try {
- val out = new StringBuilder
- var copied = 0
- var idx = 0
- while (idx < str.length) {
- if ((str charAt idx) == '$') {
- val vstart = idx
- idx = skipVariable(str, idx + 1)
- def replaceWith(repl: String) {
- out append str.substring(copied, vstart)
- out append repl
- copied = idx
- }
- val vname = variableName(str.substring(vstart + 1, idx))
- if (vname == "super") {
- superComment(sym) match {
- case Some(sc) =>
- val superSections = tagIndex(sc)
- replaceWith(sc.substring(3, startTag(sc, superSections)))
- for (sec @ (start, end) <- superSections)
- if (!isMovable(sc, sec)) out append sc.substring(start, end)
- case None =>
+ protected def expandVariables(initialStr: String, sym: Symbol, site: Symbol): String = {
+ val expandLimit = 10
+
+ def expandInternal(str: String, depth: Int): String = {
+ if (depth >= expandLimit)
+ throw new ExpansionLimitExceeded(str)
+
+ val out = new StringBuilder
+ var copied, idx = 0
+ // excluding variables written as \$foo so we can use them when
+ // necessary to document things like Symbol#decode
+ def isEscaped = idx > 0 && str.charAt(idx - 1) == '\\'
+ while (idx < str.length) {
+ if ((str charAt idx) != '$' || isEscaped)
+ idx += 1
+ else {
+ val vstart = idx
+ idx = skipVariable(str, idx + 1)
+ def replaceWith(repl: String) {
+ out append str.substring(copied, vstart)
+ out append repl
+ copied = idx
+ }
+ variableName(str.substring(vstart + 1, idx)) match {
+ case "super" =>
+ superComment(sym) foreach { sc =>
+ val superSections = tagIndex(sc)
+ replaceWith(sc.substring(3, startTag(sc, superSections)))
+ for (sec @ (start, end) <- superSections)
+ if (!isMovable(sc, sec)) out append sc.substring(start, end)
}
- } else if (vname.length > 0) {
+ case "" => idx += 1
+ case vname =>
lookupVariable(vname, site) match {
case Some(replacement) => replaceWith(replacement)
- case None => //println("no replacement for "+vname) // DEBUG
+ case None => reporter.warning(sym.pos, "Variable " + vname + " undefined in comment for " + sym)
}
- } else idx += 1
- } else idx += 1
- }
- if (out.length == 0) str
- else {
- out append str.substring(copied)
- expandVariables(out.toString, sym, site)
+ }
}
- } finally {
- expandCount -= 1
}
- } else throw new ExpansionLimitExceeded(str)
+ if (out.length == 0) str
+ else {
+ out append str.substring(copied)
+ expandInternal(out.toString, depth + 1)
+ }
+ }
+ // We suppressed expanding \$ throughout the recursion, and now we
+ // need to replace \$ with $ so it looks as intended.
+ expandInternal(initialStr, 0).replaceAllLiterally("""\$""", "$")
+ }
// !!! todo: inherit from Comment?
case class DocComment(raw: String, pos: Position = NoPosition) {
@@ -290,31 +296,27 @@ trait DocComments { self: SymbolTable =>
* useCases: all usecase sections (as instances of class UseCase)
*/
lazy val (template, defines, useCases) = {
- val sections = tagIndex(raw, idx =>
- startsWithTag(raw, idx, "@define") || startsWithTag(raw, idx, "@usecase"))
- val (defines, usecases) = sections partition (startsWithTag(raw, _, "@define"))
- val end = startTag(raw, sections)
- /*
- println("processing doc comment:")
- println(raw)
- println("===========>")
- println(raw.substring(0, end))
- println("++++++++++++++++")
- println(sections map { case (s, e) => raw.substring(s, e) })
- */
+ val sections = tagIndex(raw)
+
+ val defines = sections filter { startsWithTag(raw, _, "@define") }
+ val usecases = sections filter { startsWithTag(raw, _, "@usecase") }
+
+ val end = startTag(raw, (defines ::: usecases).sort(_._1 < _._1))
+
(if (end == raw.length - 2) raw else raw.substring(0, end) + "*/",
defines map { case (start, end) => raw.substring(start, end) },
usecases map { case (start, end) => decomposeUseCase(start, end) })
}
private def decomposeUseCase(start: Int, end: Int): UseCase = {
- val codeStart = skipWhitespace(raw, start + "@usecase".length)
- val codeEnd = skipToEol(raw, codeStart)
- val code = raw.substring(codeStart, codeEnd)
- val codePos = subPos(codeStart, codeEnd)
+ val codeStart = skipWhitespace(raw, start + "@usecase".length)
+ val codeEnd = skipToEol(raw, codeStart)
+ val code = raw.substring(codeStart, codeEnd)
+ val codePos = subPos(codeStart, codeEnd)
val commentStart = skipLineLead(raw, codeEnd + 1) min end
- val comment = "/** " + raw.substring(commentStart, end) + "*/"
- val commentPos = subPos(commentStart, end)
+ val comment = "/** " + raw.substring(commentStart, end) + "*/"
+ val commentPos = subPos(commentStart, end)
+
UseCase(DocComment(comment, commentPos), code, codePos)
}
@@ -329,14 +331,11 @@ trait DocComments { self: SymbolTable =>
def defineVariables(sym: Symbol) {
for (str <- defines) {
val start = skipWhitespace(str, "@define".length)
- var idx = skipVariable(str, start)
- val vble = variableName(str.substring(start, idx))
- if (idx < str.length && isWhitespace(str charAt idx)) idx += 1
- var end = str.lastIndexOf('\n')
- if (end == -1) end = str.length
- defs(sym) += vble -> str.substring(idx, end)
+ var idx = skipVariable(str, start)
+ val vble = variableName(str.substring(start, idx))
+
+ defs(sym) += vble -> (str drop idx).trim.replaceAll("""\s+\*+$""", "")
}
- //if (defs(sym).nonEmpty) println("vars of "+sym+" = "+defs(sym)) // !!!
}
}
@@ -372,18 +371,18 @@ trait DocComments { self: SymbolTable =>
}
}
val parts = getParts(0)
- assert(parts.length > 0, "parts is empty '" + str + "' in site " + site)
- val partnames = (parts.init map newTermName) ::: List(newTypeName(parts.last))
- val (start, rest) =
- if (parts.head == "this")
- (site.thisType, partnames.tail)
- else if (parts.tail.nonEmpty && parts(1) == "this")
- site.ownerChain.find(_.name.toString == parts.head) match {
- case Some(clazz) => (clazz.thisType, partnames.drop(2))
- case None => (NoType, List())
+ assert(parts.nonEmpty, "parts is empty '" + str + "' in site " + site)
+ val partnames = (parts.init map newTermName) :+ newTypeName(parts.last)
+ val (start, rest) = parts match {
+ case "this" :: _ => (site.thisType, partnames.tail)
+ case _ :: "this" :: _ =>
+ site.ownerChain.find(_.name == partnames.head) match {
+ case Some(clazz) => (clazz.thisType, partnames drop 2)
+ case _ => (NoType, Nil)
}
- else
+ case _ =>
(getSite(partnames.head), partnames.tail)
+ }
(start /: rest)(select(_, _, NoType))
}
@@ -429,4 +428,4 @@ trait DocComments { self: SymbolTable =>
}
class ExpansionLimitExceeded(str: String) extends Exception
-} \ No newline at end of file
+}
diff --git a/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala b/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala
index 436eb5fb90..bfd5b175a7 100644
--- a/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala
+++ b/src/compiler/scala/tools/nsc/backend/ScalaPrimitives.scala
@@ -90,8 +90,6 @@ abstract class ScalaPrimitives {
// Any operations
final val IS = 80 // x.is[y]
final val AS = 81 // x.as[y]
- final val ISERASED = 85 // x.is$erased[y]
- final val ASERASED = 86 // x.as$erased[y]
final val HASH = 87 // x.##
// AnyRef operations
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
index 64170482ce..249aefb10e 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
@@ -1153,7 +1153,7 @@ abstract class GenICode extends SubComponent {
ctx.bb.emit(DROP(from))
ctx.bb.emit(CONSTANT(Constant(null)))
}
- else if (from == ThrowableReference) {
+ else if (from == ThrowableReference && !(ThrowableClass.tpe <:< to.toType)) {
log("Inserted check-cast on throwable to " + to + " at " + pos)
ctx.bb.emit(CHECK_CAST(to))
}
diff --git a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala
index 076a59ce46..a38916b8e4 100644
--- a/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala
+++ b/src/compiler/scala/tools/nsc/backend/msil/GenMSIL.scala
@@ -15,6 +15,7 @@ import scala.tools.nsc.symtab._
import ch.epfl.lamp.compiler.msil.{Type => MsilType, _}
import ch.epfl.lamp.compiler.msil.emit._
+import ch.epfl.lamp.compiler.msil.util.PECustomMod
abstract class GenMSIL extends SubComponent {
import global._
@@ -250,10 +251,33 @@ abstract class GenMSIL extends SubComponent {
}
}
+ /**
+ * Mutates `member` adding CLR attributes (if any) based on sym.annotations.
+ * Please notice that CLR custom modifiers are a different beast (see customModifiers below)
+ * and thus shouldn't be added by this method.
+ */
def addAttributes(member: ICustomAttributeSetter, annotations: List[AnnotationInfo]) {
+ val attributes = annotations.map(_.atp.typeSymbol).collect {
+ case definitions.TransientAttr => null // TODO this is just an example
+ }
return // TODO: implement at some point
}
-/*
+
+ /**
+ * What's a CLR custom modifier? Intro available as source comments in compiler.msil.CustomModifier.
+ * It's basically a marker associated with a location (think of FieldInfo, ParameterInfo, and PropertyInfo)
+ * and thus that marker (be it optional or required) becomes part of the signature of that location.
+ * Some annotations will become CLR attributes (see addAttributes above), others custom modifiers (this method).
+ */
+ def customModifiers(annotations: List[AnnotationInfo]): Array[CustomModifier] = {
+ annotations.map(_.atp.typeSymbol).collect {
+ case definitions.VolatileAttr => new CustomModifier(true, CustomModifier.VolatileMarker)
+ } toArray
+ }
+
+
+
+ /*
if (settings.debug.value)
log("creating annotations: " + annotations + " for member : " + member)
for (annot@ AnnotationInfo(typ, annArgs, nvPairs) <- annotations ;
@@ -810,6 +834,9 @@ abstract class GenMSIL extends SubComponent {
fields(field) = fInfo
fInfo
}
+ if (fieldInfo.IsVolatile) {
+ mcode.Emit(OpCodes.Volatile)
+ }
if (!fieldInfo.IsLiteral) {
if (loadAddr) {
mcode.Emit(if (isStatic) OpCodes.Ldsflda else OpCodes.Ldflda, fieldInfo)
@@ -848,7 +875,7 @@ abstract class GenMSIL extends SubComponent {
} else if (typ == clrTypes.FLOAT) {
mcode.Emit(OpCodes.Ldc_R4, value.asInstanceOf[Float])
} else if (typ == clrTypes.DOUBLE) {
- mcode.Emit(OpCodes.Ldc_R4, value.asInstanceOf[Double])
+ mcode.Emit(OpCodes.Ldc_R8, value.asInstanceOf[Double])
} else {
/* TODO one more case is described in Partition II, 16.2: bytearray(...) */
abort("Unknown type for static literal field: " + fieldInfo)
@@ -1864,7 +1891,12 @@ abstract class GenMSIL extends SubComponent {
log("Adding field: " + sym.fullName)
var attributes = msilFieldFlags(sym)
- val fBuilder = mtype.DefineField(msilName(sym), msilType(sym.tpe), attributes)
+ val fieldTypeWithCustomMods =
+ new PECustomMod(msilType(sym.tpe),
+ customModifiers(sym.annotations))
+ val fBuilder = mtype.DefineField(msilName(sym),
+ fieldTypeWithCustomMods,
+ attributes)
fields(sym) = fBuilder
addAttributes(fBuilder, sym.annotations)
} // all iclass.fields iterated over
diff --git a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala
index 3e8c9cfea7..b2a93873b0 100644
--- a/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala
+++ b/src/compiler/scala/tools/nsc/dependencies/DependencyAnalysis.scala
@@ -11,7 +11,7 @@ trait DependencyAnalysis extends SubComponent with Files {
val phaseName = "dependencyAnalysis"
- def off = settings.make.isDefault
+ def off = settings.make.isDefault || settings.make.value == "all"
def shouldCheckClasspath = settings.make.value != "transitivenocp"
def newPhase(prev: Phase) = new AnalysisPhase(prev)
@@ -35,9 +35,9 @@ trait DependencyAnalysis extends SubComponent with Files {
}
lazy val maxDepth = settings.make.value match {
- case "changed" => 0
- case "transitive" | "transitivenocp" => Int.MaxValue
+ case "changed" => 0
case "immediate" => 1
+ case _ => Int.MaxValue
}
// todo: order insensible checking and, also checking timestamp?
@@ -176,6 +176,7 @@ trait DependencyAnalysis extends SubComponent with Files {
&& (tree.symbol != NoSymbol)
&& (!tree.symbol.isPackage)
&& (!tree.symbol.isJavaDefined)
+ && (!tree.symbol.tpe.isError)
&& ((tree.symbol.sourceFile eq null)
|| (tree.symbol.sourceFile.path != file.path))
&& (!tree.symbol.isClassConstructor)) {
diff --git a/src/compiler/scala/tools/nsc/doc/DocFactory.scala b/src/compiler/scala/tools/nsc/doc/DocFactory.scala
index c8a6e279ff..71ee6dfcb8 100644
--- a/src/compiler/scala/tools/nsc/doc/DocFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/DocFactory.scala
@@ -3,9 +3,11 @@
package scala.tools.nsc
package doc
+import scala.util.control.ControlThrowable
import reporters.Reporter
-import java.lang.ClassNotFoundException
-import util.{Position, NoPosition}
+import util.NoPosition
+import io.{ File, Directory }
+import DocParser.Parsed
/** A documentation processor controls the process of generating Scala documentation, which is as follows.
*
@@ -25,7 +27,6 @@ import util.{Position, NoPosition}
*
* @author Gilles Dubochet */
class DocFactory(val reporter: Reporter, val settings: doc.Settings) { processor =>
-
/** The unique compiler instance used by this processor and constructed from its `settings`. */
object compiler extends Global(settings, reporter) with interactive.RangePositions {
override protected def computeInternalPhases() {
@@ -38,64 +39,89 @@ class DocFactory(val reporter: Reporter, val settings: doc.Settings) { processor
phasesSet += refchecks
}
override def forScaladoc = true
- lazy val addSourceless = {
- val sless = new SourcelessComments { val global = compiler }
- docComments ++= sless.comments
- }
}
/** Creates a scaladoc site for all symbols defined in this call's `files`, as well as those defined in `files` of
* previous calls to the same processor.
* @param files The list of paths (relative to the compiler's source path, or absolute) of files to document. */
def makeUniverse(files: List[String]): Option[Universe] = {
- (new compiler.Run()) compile files
- compiler.addSourceless
assert(settings.docformat.value == "html")
- if (!reporter.hasErrors) {
- val modelFactory = (new model.ModelFactory(compiler, settings) with model.comment.CommentFactory with model.TreeFactory)
- modelFactory.makeModel match {
- case Some(madeModel) =>
- println("model contains " + modelFactory.templatesCount + " documentable templates")
- Some(madeModel)
- case None =>
- println("no documentable class found in compilation units")
- None
+ new compiler.Run() compile files
+ if (reporter.hasErrors)
+ return None
+
+ val extraTemplatesToDocument: Set[compiler.Symbol] = {
+ if (settings.docUncompilable.isDefault) Set()
+ else {
+ val uncompilable = new {
+ val global: compiler.type = compiler
+ val settings = processor.settings
+ } with Uncompilable { }
+
+ compiler.docComments ++= uncompilable.comments
+ docdbg("" + uncompilable)
+
+ uncompilable.templates
}
}
- else None
+
+ val modelFactory = (
+ new { override val global: compiler.type = compiler }
+ with model.ModelFactory(compiler, settings)
+ with model.comment.CommentFactory
+ with model.TreeFactory {
+ override def templateShouldDocument(sym: compiler.Symbol) =
+ extraTemplatesToDocument(sym) || super.templateShouldDocument(sym)
+ }
+ )
+
+ modelFactory.makeModel match {
+ case Some(madeModel) =>
+ println("model contains " + modelFactory.templatesCount + " documentable templates")
+ Some(madeModel)
+ case None =>
+ println("no documentable class found in compilation units")
+ None
+ }
+
+ }
+
+ object NoCompilerRunException extends ControlThrowable { }
+
+ val documentError: PartialFunction[Throwable, Unit] = {
+ case NoCompilerRunException =>
+ reporter.info(NoPosition, "No documentation generated with unsucessful compiler run", false)
+ case _: ClassNotFoundException =>
+ ()
}
/** Generate document(s) for all `files` containing scaladoc documenataion.
* @param files The list of paths (relative to the compiler's source path, or absolute) of files to document. */
def document(files: List[String]): Unit = {
+ def generate() = {
+ import doclet._
+ val docletClass = Class.forName(settings.docgenerator.value) // default is html.Doclet
+ val docletInstance = docletClass.newInstance().asInstanceOf[Generator]
- class NoCompilerRunException extends Exception
-
- try {
- val docletClass = Class.forName(settings.docgenerator.value) // default is html.Doclet
- val docletInstance = docletClass.newInstance().asInstanceOf[doclet.Generator]
- if (docletInstance.isInstanceOf[doclet.Universer]) {
- makeUniverse(files) match {
- case Some(universe) =>
- docletClass.getMethod("setUniverse", classOf[Universe]).invoke(docletInstance, universe)
- if (docletInstance.isInstanceOf[doclet.Indexer]) {
- val index = model.IndexModelFactory.makeIndex(universe)
- docletClass.getMethod("setIndex", classOf[Index]).invoke(docletInstance, index)
- }
- case None =>
- throw new NoCompilerRunException()
- }
+ docletInstance match {
+ case universer: Universer =>
+ val universe = makeUniverse(files) getOrElse { throw NoCompilerRunException }
+ universer setUniverse universe
+
+ docletInstance match {
+ case indexer: Indexer => indexer setIndex model.IndexModelFactory.makeIndex(universe)
+ case _ => ()
+ }
+ case _ => ()
}
docletInstance.generate
}
- catch {
- case e: ClassNotFoundException =>
- case e: NoCompilerRunException =>
- reporter.info(NoPosition, "No documentation generated with unsucessful compiler run", false)
- }
-
-
+ try generate()
+ catch documentError
+ }
+ private[doc] def docdbg(msg: String) {
+ if (settings.Ydocdebug.value)
+ println(msg)
}
-
}
diff --git a/src/compiler/scala/tools/nsc/doc/DocParser.scala b/src/compiler/scala/tools/nsc/doc/DocParser.scala
new file mode 100644
index 0000000000..1e45079c48
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/doc/DocParser.scala
@@ -0,0 +1,74 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools
+package nsc
+package doc
+
+import reporters._
+import util._
+import interactive.RangePositions
+import DocParser.Parsed
+
+/** A very minimal global customized for extracting DocDefs. It stops
+ * right after parsing so it can read DocDefs from source code which would
+ * otherwise cause the compiler to go haywire.
+ */
+class DocParser(settings: nsc.Settings, reporter: Reporter)
+ extends Global(settings, reporter)
+ with RangePositions {
+
+ def this(settings: Settings) = this(settings, new ConsoleReporter(settings))
+ def this() = this(new Settings(Console println _))
+
+ // the usual global initialization
+ locally { new Run() }
+
+ override def forScaladoc = true
+ override protected def computeInternalPhases() {
+ phasesSet += syntaxAnalyzer
+ }
+
+ /** Returns a list of DocParser.Parseds, which hold the DocDefs found in the
+ * given code along with the surrounding trees.
+ */
+ def docDefs(code: String) = {
+ def loop(enclosing: List[Tree], tree: Tree): List[Parsed] = tree match {
+ case x: PackageDef => x.stats flatMap (t => loop(enclosing :+ x, t))
+ case x: DocDef => new Parsed(enclosing, x) :: loop(enclosing :+ x.definition, x.definition)
+ case x => x.children flatMap (t => loop(enclosing, t))
+ }
+ loop(Nil, docUnit(code))
+ }
+
+ /** A compilation unit containing parsed source.
+ */
+ def docUnit(code: String) = {
+ val unit = new CompilationUnit(new BatchSourceFile("<console>", code))
+ val scanner = new syntaxAnalyzer.UnitParser(unit)
+
+ scanner.compilationUnit()
+ }
+}
+
+/** Since the DocParser's whole reason for existing involves trashing a
+ * global, it is designed to bottle up general Global#Tree types rather
+ * than path dependent ones. The recipient will have to deal.
+ */
+object DocParser {
+ type Tree = Global#Tree
+ type DefTree = Global#DefTree
+ type DocDef = Global#DocDef
+ type Name = Global#Name
+
+ class Parsed(val enclosing: List[Tree], val docDef: DocDef) {
+ def nameChain: List[Name] = (enclosing :+ docDef.definition) collect { case x: DefTree => x.name }
+ def raw: String = docDef.comment.raw
+
+ override def toString = (
+ nameChain.init.map(x => if (x.isTypeName) x + "#" else x + ".").mkString + nameChain.last
+ )
+ }
+}
diff --git a/src/compiler/scala/tools/nsc/doc/Settings.scala b/src/compiler/scala/tools/nsc/doc/Settings.scala
index 054d16719b..292eca91e3 100644
--- a/src/compiler/scala/tools/nsc/doc/Settings.scala
+++ b/src/compiler/scala/tools/nsc/doc/Settings.scala
@@ -41,6 +41,17 @@ class Settings(error: String => Unit) extends scala.tools.nsc.Settings(error) {
""
)
+ val docUncompilable = StringSetting (
+ "-doc-no-compile",
+ "path",
+ "A directory containing sources which should be parsed, no more (e.g. AnyRef.scala)",
+ ""
+ )
+ lazy val uncompilableFiles = docUncompilable.value match {
+ case "" => Nil
+ case path => io.Directory(path).deepFiles filter (_ hasExtension "scala") toList
+ }
+
/** A setting that defines a URL to be concatenated with source locations and show a link to source files.
* If needed the sourcepath option can be used to exclude undesired initial part of the link to sources */
val docsourceurl = StringSetting (
@@ -62,11 +73,14 @@ class Settings(error: String => Unit) extends scala.tools.nsc.Settings(error) {
"scala.tools.nsc.doc.html.Doclet"
)
- // TODO: add a new setting for whether or not to document sourceless entities (e.g., Any, Unit, etc)
-
// Somewhere slightly before r18708 scaladoc stopped building unless the
// self-type check was suppressed. I hijacked the slotted-for-removal-anyway
// suppress-vt-warnings option and renamed it for this purpose.
noSelfCheck.value = true
+ // For improved help output.
+ def scaladocSpecific = Set[Settings#Setting](
+ docformat, doctitle, docversion, docUncompilable, docsourceurl, docgenerator
+ )
+ val isScaladocSpecific: String => Boolean = scaladocSpecific map (_.name)
}
diff --git a/src/compiler/scala/tools/nsc/doc/SourcelessComments.scala b/src/compiler/scala/tools/nsc/doc/SourcelessComments.scala
deleted file mode 100644
index 18f8070f14..0000000000
--- a/src/compiler/scala/tools/nsc/doc/SourcelessComments.scala
+++ /dev/null
@@ -1,249 +0,0 @@
-/* NSC -- new Scala compiler -- Copyright 2007-2011 LAMP/EPFL */
-
-package scala.tools.nsc
-package doc
-
-import scala.collection._
-
-/**
- * A class that provides comments for all symbols which pre-exist in Scala (Any, Nothing, ...)
- * It also contains a HashSet of the given symbols
- * The comments are to be added to a HashMap called comments, which resides in the Global.scala file
- * @author Manohar Jonnalagedda, Stephane Micheloud, Sean McDirmid, Geoffrey Washburn
- * @version 1.0 */
-abstract class SourcelessComments {
-
- val global: Global
-
- import global._
- import definitions._
-
- lazy val comments = {
-
- val comment = mutable.HashMap.empty[Symbol, DocComment]
-
- comment(NothingClass) = new DocComment("""
- /** Class `Nothing` is - together with class [[scala.Null]] - at the bottom of Scala's type hierarchy.
- *
- * Type `Nothing` is a subtype of every other type (including [[scala.Null]]); there exist ''no instances'' of
- * this type. Even though type `Nothing` is empty, it is nevertheless useful as a type parameter. For instance,
- * the Scala library defines a value [[scala.collection.immutable.Nil]] of type `List[Nothing]`. Because lists
- * are covariant in Scala, this makes [[scala.collection.immutable.Nil]] an instance of `List[T]`, for any
- * element of type `T`. */
- """)
-
- comment(NullClass) = new DocComment("""
- /** Class `Null` is - together with class [[scala.Nothing]] - at the bottom of the Scala type hierarchy.
- *
- * Type `Null` is a subtype of all reference types; its only instance is the `null` reference. Since `Null` is
- * not a subtype of value types, `null` is not a member of any such type. For instance, it is not possible to
- * assign `null` to a variable of type [[scala.Int]]. */
- """)
-
- /*******************************************************************/
- /* Documentation for Any */
-
- comment(AnyClass) = new DocComment("""
- /** Class `Any` is the root of the Scala class hierarchy. Every class in a Scala execution environment inherits
- * directly or indirectly from this class. Class `Any` has two direct subclasses: [[scala.AnyRef]] and
- * [[scala.AnyVal]]. */
- """)
-
- comment(Any_equals) = new DocComment("""
- /** This method is used to compare the receiver object (`this`) with the argument object (`arg0`) for equivalence.
- *
- * The default implementations of this method is an [http://en.wikipedia.org/wiki/Equivalence_relation equivalence
- * relation]:
- * * It is reflexive: for any instance `x` of type `Any`, `x.equals(x)` should return `true`.
- * * It is symmetric: for any instances `x` and `y` of type `Any`, `x.equals(y)` should return `true` if and
- * only if `y.equals(x)` returns `true`.
- * * It is transitive: for any instances `x`, `y`, and `z` of type `AnyRef` if `x.equals(y)` returns `true` and
- * `y.equals(z)` returns `true`, then `x.equals(z)` should return `true`.
- *
- * If you override this method, you should verify that your implementation remains an equivalence relation.
- * Additionally, when overriding this method it is often necessary to override `hashCode` to ensure that objects
- * that are "equal" (`o1.equals(o2)` returns `true`) hash to the same [[scala.Int]]
- * (`o1.hashCode.equals(o2.hashCode)`).
- *
- * @param arg0 the object to compare against this object for equality.
- * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. */
- """)
-
- comment(Any_==) = new DocComment("""
- /** `o == arg0` is the same as `o.equals(arg0)`.
- *
- * @param arg0 the object to compare against this object for equality.
- * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. */
- """)
-
- comment(Any_!=) = new DocComment("""
- /** `o != arg0` is the same as `!(o == (arg0))`.
- *
- * @param arg0 the object to compare against this object for dis-equality.
- * @return `false` if the receiver object is equivalent to the argument; `true` otherwise. */
- """)
-
- comment(Any_toString) = new DocComment("""
- /** Returns a string representation of the object.
- *
- * The default representation is platform dependent.
- *
- * @return a string representation of the object. */
- """)
-
- comment(Any_asInstanceOf) = new DocComment("""
- /** This method is used to cast the receiver object to be of type `T0`.
- *
- * Note that the success of a cast at runtime is modulo Scala's erasure semantics. Therefore the expression
- * `1.asInstanceOf[String]` will throw a `ClassCastException` at runtime, while the expression
- * `List(1).asInstanceOf[List[String]]` will not. In the latter example, because the type argument is erased as
- * part of compilation it is not possible to check whether the contents of the list are of the requested typed.
- *
- * @throws ClassCastException if the receiver object is not an instance of erasure of type `T0`.
- * @return the receiver object. */
- """)
-
- comment(Any_isInstanceOf) = new DocComment("""
- /** This method is used to test whether the dynamic type of the receiver object is `T0`.
- *
- * Note that the test result of the test is modulo Scala's erasure semantics. Therefore the expression
- * `1.isInstanceOf[String]` will return `false`, while the expression `List(1).isInstanceOf[List[String]]` will
- * return `true`. In the latter example, because the type argument is erased as part of compilation it is not
- * possible to check whether the contents of the list are of the requested typed.
- *
- * @return `true` if the receiver object is an instance of erasure of type `T0`; `false` otherwise. */
- """)
-
- comment(Any_hashCode) = new DocComment("""
- /** Returns a hash code value for the object.
- *
- * The default hashing algorithm is platform dependent.
- *
- * Note that it is allowed for two objects to have identical hash codes (`o1.hashCode.equals(o2.hashCode)`) yet
- * not be equal (`o1.equals(o2)` returns `false`). A degenerate implementation could always return `0`.
- * However, it is required that if two objects are equal (`o1.equals(o2)` returns `true`) that they have
- * identical hash codes (`o1.hashCode.equals(o2.hashCode)`). Therefore, when overriding this method, be sure
- * to verify that the behavior is consistent with the `equals` method.
- *
- * @return the hash code value for the object. */
- """)
-
- /*******************************************************************/
- /* Documentation for AnyRef */
-
- comment(AnyRefClass) = new DocComment("""
- /** Class `AnyRef` is the root class of all ''reference types''. */
- """)
-
- comment(Object_==) = new DocComment("""
- /** `o == arg0` is the same as `if (o eq null) arg0 eq null else o.equals(arg0)`.
- *
- * @param arg0 the object to compare against this object for equality.
- * @return `true` if the receiver object is equivalent to the argument; `false` otherwise. */
- """)
-
- comment(Object_ne) = new DocComment("""
- /** `o.ne(arg0)` is the same as `!(o.eq(arg0))`.
- *
- * @param arg0 the object to compare against this object for reference dis-equality.
- * @return `false` if the argument is not a reference to the receiver object; `true` otherwise. */
- """)
-
-
- comment(Object_finalize) = new DocComment("""
- /** This method is called by the garbage collector on the receiver object when garbage collection determines that
- * there are no more references to the object.
- *
- * The details of when and if the `finalize` method are invoked, as well as the interaction between `finalize`
- * and non-local returns and exceptions, are all platform dependent. */
- """)
-
- comment(Object_clone) = new DocComment("""
- /** This method creates and returns a copy of the receiver object.
- *
- * The default implementation of the `clone` method is platform dependent.
- *
- * @return a copy of the receiver object. */
- """)
-
- comment(Object_getClass) = new DocComment("""
- /** Returns a representation that corresponds to the dynamic class of the receiver object.
- *
- * The nature of the representation is platform dependent.
- *
- * @return a representation that corresponds to the dynamic class of the receiver object. */
- """)
-
- comment(Object_notify) = new DocComment("""
- /** Wakes up a single thread that is waiting on the receiver object's monitor. */
- """)
-
- comment(Object_notifyAll) = new DocComment("""
- /** Wakes up all threads that are waiting on the receiver object's monitor. */
- """)
-
- comment(Object_eq) = new DocComment("""
- /** This method is used to test whether the argument (`arg0`) is a reference to the
- * receiver object (`this`).
- *
- * The `eq` method implements an [http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation] on
- * non-null instances of `AnyRef`:
- * * It is reflexive: for any non-null instance `x` of type `AnyRef`, `x.eq(x)` returns `true`.
- * * It is symmetric: for any non-null instances `x` and `y` of type `AnyRef`, `x.eq(y)` returns `true` if and
- * only if `y.eq(x)` returns `true`.
- * * It is transitive: for any non-null instances `x`, `y`, and `z` of type `AnyRef` if `x.eq(y)` returns `true`
- * and `y.eq(z)` returns `true`, then `x.eq(z)` returns `true`.
- *
- * Additionally, the `eq` method has three other properties.
- * * It is consistent: for any non-null instances `x` and `y` of type `AnyRef`, multiple invocations of
- * `x.eq(y)` consistently returns `true` or consistently returns `false`.
- * * For any non-null instance `x` of type `AnyRef`, `x.eq(null)` and `null.eq(x)` returns `false`.
- * * `null.eq(null)` returns `true`.
- *
- * When overriding the `equals` or `hashCode` methods, it is important to ensure that their behavior is
- * consistent with reference equality. Therefore, if two objects are references to each other (`o1 eq o2`), they
- * should be equal to each other (`o1 == o2`) and they should hash to the same value (`o1.hashCode == o2.hashCode`).
- *
- * @param arg0 the object to compare against this object for reference equality.
- * @return `true` if the argument is a reference to the receiver object; `false` otherwise. */
- """)
-
- /*******************************************************************/
-
- comment(AnyValClass) = new DocComment("""
- /** Class `AnyVal` is the root class of all ''value types''.
- *
- * `AnyVal` has a fixed number of subclasses, which describe values which are not implemented as objects in the
- * underlying host system.
- *
- * Classes [[scala.Double]], [[scala.Float]], [[scala.Long]], [[scala.Int]], [[scala.Char]], [[scala.Short]],
- * and [[scala.Byte]] are together called ''numeric value types''. Classes [[scala.Byte]], [[scala.Short]], and
- * [[scala.Char]] are called ''subrange types''. Subrange types, as well as [[scala.Int]] and [[scala.Long]] are
- * called ''integer types'', whereas [[scala.Float]] and [[scala.Double]] are called ''floating point types''. */
- """)
-
- comment(BooleanClass) = new DocComment("""
- /** Class `Boolean` has only two values: `true` and `false`. */
- """)
-
- comment(UnitClass) = new DocComment("""
- /** Class `Unit` has only one value: `()`. */
- """)
-
- List(ByteClass, CharClass, DoubleClass, LongClass, FloatClass, IntClass, ShortClass) foreach { sym =>
- val maxValue = "MAX_" + sym.name.toString().toUpperCase()
- val minValue = "MIN_" + sym.name.toString().toUpperCase()
- comment(sym) = new DocComment("""
- /** Class `""" + sym.name + """` belongs to the value classes whose instances are not represented as objects by
- * the underlying host system. There is an implicit conversion from instances of `""" + sym.name + """` to
- * instances of [[scala.runtime.Rich""" + sym.name + """]] which provides useful non-primitive operations.
- * All value classes inherit from class [[scala.AnyVal]].
- *
- * Values `""" + maxValue + """` and `""" + minValue + """` are defined in object [[scala.Math]]. */
- """)
- }
-
- comment
- }
-
-}
diff --git a/src/compiler/scala/tools/nsc/doc/Uncompilable.scala b/src/compiler/scala/tools/nsc/doc/Uncompilable.scala
new file mode 100644
index 0000000000..1f0c85361e
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/doc/Uncompilable.scala
@@ -0,0 +1,48 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc
+package doc
+
+/** Some glue between DocParser (which reads source files which can't be compiled)
+ * and the scaladoc model.
+ */
+trait Uncompilable {
+ val global: Global
+ val settings: Settings
+
+ import global.{ reporter, inform, warning, newTypeName, newTermName, Symbol, Name, DocComment }
+ import global.definitions.RootClass
+
+ private implicit def translateName(name: Global#Name) =
+ if (name.isTypeName) newTypeName("" + name) else newTermName("" + name)
+
+ def docSymbol(p: DocParser.Parsed) = p.nameChain.foldLeft(RootClass: Symbol)(_.tpe member _)
+ def docDefs(code: String) = new DocParser(settings, reporter) docDefs code
+ def docPairs(code: String) = docDefs(code) map (p => (docSymbol(p), new DocComment(p.raw)))
+
+ lazy val pairs = files flatMap { f =>
+ val comments = docPairs(f.slurp())
+ if (settings.verbose.value)
+ inform("Found %d doc comments in parse-only file %s: %s".format(comments.size, f, comments.map(_._1).mkString(", ")))
+
+ comments
+ }
+ def files = settings.uncompilableFiles
+ def symbols = pairs map (_._1)
+ def templates = symbols filter (x => x.isClass || x.isTrait) toSet
+ def comments = {
+ if (settings.debug.value || settings.verbose.value)
+ inform("Found %d uncompilable files: %s".format(files.size, files mkString ", "))
+
+ if (pairs.isEmpty)
+ warning("no doc comments read from " + settings.docUncompilable.value)
+
+ pairs
+ }
+ override def toString = pairs.size + " uncompilable symbols:\n" + (
+ symbols map (x => " " + x.owner.fullName + " " + x.defString) mkString "\n"
+ )
+}
diff --git a/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
index a14bacb267..f6dc58617e 100644
--- a/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
@@ -8,7 +8,6 @@ package doc
package html
import model._
-
import java.io.{ File => JFile }
import io.{ Streamable, Directory }
import scala.collection._
@@ -17,7 +16,6 @@ import scala.collection._
* @author David Bernard
* @author Gilles Dubochet */
class HtmlFactory(val universe: doc.Universe, index: doc.Index) {
-
/** The character encoding to be used for generated Scaladoc sites. This value is currently always UTF-8. */
def encoding: String = "UTF-8"
@@ -50,6 +48,8 @@ class HtmlFactory(val universe: doc.Universe, index: doc.Index) {
copyResource("lib/index.css")
copyResource("lib/ref-index.css")
copyResource("lib/template.css")
+ copyResource("lib/arrow-down.png")
+ copyResource("lib/arrow-right.png")
copyResource("lib/class.png")
copyResource("lib/class_big.png")
copyResource("lib/object.png")
diff --git a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
index 19372d9e7c..cd733ced9a 100644
--- a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
+++ b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
@@ -29,15 +29,18 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
</xml:group>
val valueMembers =
- (tpl.methods ::: tpl.values ::: (tpl.templates filter { tpl => tpl.isObject || tpl.isPackage })) sortBy (_.name)
+ tpl.methods ++ tpl.values ++ tpl.templates.filter(x => x.isObject || x.isPackage) sorted
+
+ val (absValueMembers, concValueMembers) =
+ valueMembers partition (_.isAbstract)
val typeMembers =
- (tpl.abstractTypes ::: tpl.aliasTypes ::: (tpl.templates filter { tpl => tpl.isTrait || tpl.isClass })) sortBy (_.name)
+ tpl.abstractTypes ++ tpl.aliasTypes ++ tpl.templates.filter(x => x.isTrait || x.isClass) sorted
val constructors = (tpl match {
- case cls: Class => cls.constructors
+ case cls: Class => (cls.constructors: List[MemberEntity]).sorted
case _ => Nil
- }) sortBy (_.name)
+ })
/* for body, there is a special case for AnyRef, otherwise AnyRef appears like a package/object
* this problem should be fixed, this implementation is just a patch
@@ -51,10 +54,20 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
<p id="owner">{ templatesToHtml(tpl.inTemplate.toRoot.reverse.tail, xml.Text(".")) }</p>
}
- <div id="definition">
- <img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/>
- <h1>{ if (tpl.isRootPackage) "root package" else tpl.name }</h1>
- </div>
+ { val templateName = if (tpl.isRootPackage) "root package" else tpl.name
+ val displayName = tpl.companion match {
+ case Some(companion) =>
+ if (companion.visibility.isPublic && companion.inSource != None)
+ <a href={relativeLinkTo(companion)} title="go to companion">{ templateName }</a>
+ else templateName
+ case _ =>
+ templateName
+ }
+ <div id="definition">
+ <img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/>
+ <h1>{ displayName }</h1>
+ </div>
+ }
{ signature(tpl, true) }
{ memberToCommentHtml(tpl, true) }
@@ -82,17 +95,11 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
<ol><li class="public in">Public</li><li class="all out">All</li></ol>
</div>
}
- {
- <div id="impl">
- <span class="filtertype">Impl.</span>
- <ol><li class="concrete in">Concrete</li><li class="abstract in">Abstract</li></ol>
- </div>
- }
</div>
{ if (constructors.isEmpty) NodeSeq.Empty else
<div id="constructors" class="members">
- <h3>Instance constructors</h3>
+ <h3>Instance Constructors</h3>
<ol>{ constructors map (memberToHtml(_)) }</ol>
</div>
}
@@ -104,10 +111,17 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
</div>
}
- { if (valueMembers.isEmpty) NodeSeq.Empty else
+ { if (absValueMembers.isEmpty) NodeSeq.Empty else
+ <div id="values" class="values members">
+ <h3>Abstract Value Members</h3>
+ <ol>{ absValueMembers map (memberToHtml(_)) }</ol>
+ </div>
+ }
+
+ { if (concValueMembers.isEmpty) NodeSeq.Empty else
<div id="values" class="values members">
- <h3>Value Members</h3>
- <ol>{ valueMembers map (memberToHtml(_)) }</ol>
+ <h3>{ if (absValueMembers.isEmpty) "Value Members" else "Concrete Value Members" }</h3>
+ <ol>{ concValueMembers map (memberToHtml(_)) }</ol>
</div>
}
@@ -183,10 +197,6 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
case dte: DocTemplateEntity if isSelf =>
// comment of class itself
<xml:group>
- { if (mbr.comment.isEmpty) NodeSeq.Empty
- else
- <div class="shortcomment cmt">{ commentToHtml(mbr.comment) }</div>
- }
<div id="comment" class="fullcomment">{ memberToCommentBodyHtml(mbr, isSelf = true) }</div>
</xml:group>
case dte: DocTemplateEntity if mbr.comment.isDefined =>
@@ -198,10 +208,15 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
if (commentBody.isEmpty)
NodeSeq.Empty
else {
- <xml:group>
- { memberToShortCommentHtml(mbr, isSelf) }
- <div class="fullcomment">{ memberToUseCaseCommentHtml(mbr, isSelf) }{ memberToCommentBodyHtml(mbr, isSelf) }</div>
- </xml:group>
+ val shortComment = memberToShortCommentHtml(mbr, isSelf)
+ val longComment = memberToUseCaseCommentHtml(mbr, isSelf) ++ memberToCommentBodyHtml(mbr, isSelf)
+
+ val includedLongComment = if (shortComment.text.trim == longComment.text.trim)
+ NodeSeq.Empty
+ else
+ <div class="fullcomment">{ longComment }</div>
+
+ shortComment ++ includedLongComment
}
}
}
@@ -225,32 +240,37 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
<p class="comment cmt">{ inlineToHtml(mbr.comment.get.short) }</p>
def memberToCommentBodyHtml(mbr: MemberEntity, isSelf: Boolean, isReduced: Boolean = false): NodeSeq = {
- NodeSeq.Empty ++
- { if (mbr.comment.isEmpty) NodeSeq.Empty else
- <div class="comment cmt">{ commentToHtml(mbr.comment) }</div>
- } ++
- { val prs: List[ParameterEntity] = mbr match {
+ val memberComment =
+ if (mbr.comment.isEmpty) NodeSeq.Empty
+ else <div class="comment cmt">{ commentToHtml(mbr.comment) }</div>
+
+ val paramComments = {
+ val prs: List[ParameterEntity] = mbr match {
case cls: Class => cls.typeParams ::: cls.valueParams.flatten
case trt: Trait => trt.typeParams
case dfe: Def => dfe.typeParams ::: dfe.valueParams.flatten
case ctr: Constructor => ctr.valueParams.flatten
case _ => Nil
}
+
def mbrCmt = mbr.comment.get
+
def paramCommentToHtml(prs: List[ParameterEntity]): NodeSeq = prs match {
- case Nil =>
- NodeSeq.Empty
+ case Nil => NodeSeq.Empty
+
case (tp: TypeParam) :: rest =>
val paramEntry: NodeSeq = {
<dt class="tparam">{ tp.name }</dt><dd class="cmt">{ bodyToHtml(mbrCmt.typeParams(tp.name)) }</dd>
}
paramEntry ++ paramCommentToHtml(rest)
+
case (vp: ValueParam) :: rest =>
val paramEntry: NodeSeq = {
<dt class="param">{ vp.name }</dt><dd class="cmt">{ bodyToHtml(mbrCmt.valueParams(vp.name)) }</dd>
}
paramEntry ++ paramCommentToHtml(rest)
}
+
if (mbr.comment.isEmpty) NodeSeq.Empty
else {
val cmtedPrs = prs filter {
@@ -258,7 +278,7 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
case vp: ValueParam => mbrCmt.valueParams isDefinedAt vp.name
}
if (cmtedPrs.isEmpty && mbrCmt.result.isEmpty) NodeSeq.Empty
- else
+ else {
<dl class="paramcmts block">{
paramCommentToHtml(cmtedPrs) ++ (
mbrCmt.result match {
@@ -267,119 +287,141 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
<dt>returns</dt><dd class="cmt">{ bodyToHtml(cmt) }</dd>
})
}</dl>
+ }
}
- } ++
- { val fvs: List[comment.Paragraph] = visibility(mbr).toList ::: mbr.flags
- if (fvs.isEmpty || isReduced) NodeSeq.Empty else
- <div class="block">
- attributes: { fvs map { fv => { inlineToHtml(fv.text) ++ xml.Text(" ") } } }
- </div>
- } ++
- { tpl.companion match {
- case Some(companion) if (isSelf && !isReduced) =>
- <div class="block">
- go to: <a href={relativeLinkTo(companion)}>companion</a>
- </div>
- case _ =>
- NodeSeq.Empty
- }
- } ++
- { val inDefTpls = mbr.inDefinitionTemplates
- if ((inDefTpls.tail.isEmpty && (inDefTpls.head == mbr.inTemplate)) || isReduced) NodeSeq.Empty else {
- <div class="block">
- definition classes: { templatesToHtml(inDefTpls, xml.Text(" → ")) }
- </div>
- }
- } ++
- { mbr match {
- case dtpl: DocTemplateEntity if (isSelf && !dtpl.linearizationTemplates.isEmpty && !isReduced) =>
- <div class="block">
- linear super types: { typesToHtml(dtpl.linearizationTypes, hasLinks = true, sep = xml.Text(", ")) }
- </div>
- case _ => NodeSeq.Empty
- }
- } ++
- { mbr match {
- case dtpl: DocTemplateEntity if (isSelf && !dtpl.subClasses.isEmpty && !isReduced) =>
- <div class="block">
- known subclasses: { templatesToHtml(dtpl.subClasses, xml.Text(", ")) }
- </div>
- case _ => NodeSeq.Empty
+ }
+
+ // --- start attributes block vals
+ val attributes: Seq[scala.xml.Node] = {
+ val fvs: List[comment.Paragraph] = visibility(mbr).toList ::: mbr.flags
+ if (fvs.isEmpty || isReduced) NodeSeq.Empty
+ else {
+ <dt>Attributes</dt>
+ <dd>{ fvs map { fv => { inlineToHtml(fv.text) ++ xml.Text(" ") } } }</dd>
}
- } ++
- { mbr match {
- case dtpl: DocTemplateEntity if (isSelf && !dtpl.selfType.isEmpty && !isReduced) =>
- <div class="block">
- self type: { typeToHtml(dtpl.selfType.get, hasLinks = true) }
- </div>
- case _ => NodeSeq.Empty
+ }
+
+ val definitionClasses: Seq[scala.xml.Node] = {
+ val inDefTpls = mbr.inDefinitionTemplates
+ if ((inDefTpls.tail.isEmpty && (inDefTpls.head == mbr.inTemplate)) || isReduced) NodeSeq.Empty
+ else {
+ <dt>Definition Classes</dt>
+ <dd>{ templatesToHtml(inDefTpls, xml.Text(" → ")) }</dd>
}
- } ++
- { if (!mbr.annotations.isEmpty) {
- <div class="block">
- annotations: {
+ }
+
+ val selfType: Seq[scala.xml.Node] = mbr match {
+ case dtpl: DocTemplateEntity if (isSelf && !dtpl.selfType.isEmpty && !isReduced) =>
+ <dt>Self Type</dt>
+ <dd>{ typeToHtml(dtpl.selfType.get, hasLinks = true) }</dd>
+ case _ => NodeSeq.Empty
+ }
+
+ val annotations: Seq[scala.xml.Node] =
+ if (!mbr.annotations.isEmpty) {
+ <dt>Annotations</dt>
+ <dd>{
mbr.annotations.map { annot =>
<xml:group>
<span class="name">@{ templateToHtml(annot.annotationClass) }</span>{ argumentsToHtml(annot.arguments) }
</xml:group>
}
}
- </div>
- }
- else NodeSeq.Empty
- } ++
- { mbr match {
- case dtpl: DocTemplateEntity if (isSelf && dtpl.sourceUrl.isDefined && dtpl.inSource.isDefined && !isReduced) =>
- val (absFile, line) = dtpl.inSource.get
- <div class="block">
- source: { <a href={ dtpl.sourceUrl.get.toString }>{ Text(absFile.file.getName) }</a> }
- </div>
- case _ => NodeSeq.Empty
+ </dd>
+ } else NodeSeq.Empty
+
+ val sourceLink: Seq[scala.xml.Node] = mbr match {
+ case dtpl: DocTemplateEntity if (isSelf && dtpl.sourceUrl.isDefined && dtpl.inSource.isDefined && !isReduced) =>
+ val (absFile, line) = dtpl.inSource.get
+ <dt>Source</dt>
+ <dd>{ <a href={ dtpl.sourceUrl.get.toString }>{ Text(absFile.file.getName) }</a> }</dd>
+ case _ => NodeSeq.Empty
+ }
+
+ val deprecation: Seq[scala.xml.Node] =
+ if (mbr.deprecation.isEmpty || isReduced) NodeSeq.Empty
+ else {
+ <dt>Deprecated</dt>
+ <dd class="cmt">{ bodyToHtml(mbr.deprecation.get) }</dd>
}
- } ++
- { if (mbr.deprecation.isEmpty || isReduced) NodeSeq.Empty else
- <div class="block"><ol>deprecated:
- { <li class="cmt">{ bodyToHtml(mbr.deprecation.get) }</li> }
- </ol></div>
- } ++
- { mbr.comment match {
- case Some(comment) =>
- <xml:group>
- { if(!comment.example.isEmpty && !isReduced)
- <div class="block">Example{ if (comment.example.length > 1) "s" else ""} :
+
+ val mainComment: Seq[scala.xml.Node] = mbr.comment match {
+ case Some(comment) =>
+ val example =
+ if(!comment.example.isEmpty && !isReduced)
+ <div class="block">Example{ if (comment.example.length > 1) "s" else ""} :
<ol>{
- val exampleXml: List[scala.xml.NodeSeq] =
- for(example <- comment.example ) yield
- <li class="cmt">{ bodyToHtml(example) }</li>
- exampleXml.reduceLeft(_ ++ Text(", ") ++ _)
- }</ol>
+ val exampleXml: List[scala.xml.NodeSeq] =
+ for(example <- comment.example ) yield
+ <li class="cmt">{ bodyToHtml(example) }</li>
+ exampleXml.reduceLeft(_ ++ Text(", ") ++ _)
+ }</ol>
</div>
- else NodeSeq.Empty
- }
- { if(!comment.version.isEmpty && !isReduced)
- <div class="block"><ol>version
- { for(body <- comment.version.toList) yield <li class="cmt">{bodyToHtml(body)}</li> }
- </ol></div>
- else NodeSeq.Empty
- }
- { if(!comment.since.isEmpty && !isReduced)
- <div class="block"><ol>since
- { for(body <- comment.since.toList) yield <li class="cmt">{bodyToHtml(body)}</li> }
- </ol></div>
- else NodeSeq.Empty
- }
- { if(!comment.see.isEmpty && !isReduced)
- <div class="block"><ol>see also:
- { val seeXml:List[scala.xml.NodeSeq]=(for(see <- comment.see ) yield <li class="cmt">{bodyToHtml(see)}</li> )
- seeXml.reduceLeft(_ ++ Text(", ") ++ _)
- }
- </ol></div>
- else NodeSeq.Empty
- }
- </xml:group>
- case None => NodeSeq.Empty
- }
+ else NodeSeq.Empty
+
+ val version: Seq[scala.xml.Node] =
+ if(!comment.version.isEmpty && !isReduced) {
+ <dt>Version</dt>
+ <dd>{ for(body <- comment.version.toList) yield {bodyToHtml(body)} }</dd>
+ } else NodeSeq.Empty
+
+ val sinceVersion: Seq[scala.xml.Node] =
+ if(!comment.since.isEmpty && !isReduced) {
+ <dt>Since</dt>
+ <dd>{ for(body <- comment.since.toList) yield {bodyToHtml(body)} }</dd>
+ } else NodeSeq.Empty
+
+ val seeAlso: Seq[scala.xml.Node] =
+ if(!comment.see.isEmpty && !isReduced) {
+ <dt>See also</dt>
+ <dd>{
+ val seeXml:List[scala.xml.NodeSeq]=(for(see <- comment.see ) yield <span class="cmt">{bodyToHtml(see)}</span> )
+ seeXml.reduceLeft(_ ++ Text(", ") ++ _)
+ }</dd>
+ } else NodeSeq.Empty
+
+ example ++ version ++ sinceVersion ++ seeAlso
+
+ case None => NodeSeq.Empty
+ }
+ // end attributes block vals ---
+
+ val attributesInfo = attributes ++ definitionClasses ++ selfType ++ annotations ++ sourceLink ++ deprecation ++ mainComment
+ val attributesBlock =
+ if (attributesInfo.isEmpty)
+ NodeSeq.Empty
+ else
+ <dl class="attributes block"> { attributesInfo }</dl>
+
+ val linearization = mbr match {
+ case dtpl: DocTemplateEntity if isSelf && !isReduced && dtpl.linearizationTemplates.nonEmpty =>
+ <div class="toggleContainer">
+ <div class="attributes block">
+ <span class="link showElement">Linear Supertypes</span>
+ <span class="link hideElement">Linear Supertypes</span>
+ </div>
+ <div class="superTypes hiddenContent">
+ <p>{ typesToHtml(dtpl.linearizationTypes, hasLinks = true, sep = xml.Text(", ")) }</p>
+ </div>
+ </div>
+ case _ => NodeSeq.Empty
}
+
+ val subclasses = mbr match {
+ case dtpl: DocTemplateEntity if isSelf && !isReduced && dtpl.subClasses.nonEmpty =>
+ <div class="toggleContainer">
+ <div class="attributes block">
+ <span class="link showElement">Known Subclasses</span>
+ <span class="link hideElement">Known Subclasses</span>
+ </div>
+ <div class="subClasses hiddenContent">
+ <p>{ templatesToHtml(dtpl.subClasses.sortBy(_.name), xml.Text(", ")) }</p>
+ </div>
+ </div>
+ case _ => NodeSeq.Empty
+ }
+
+ memberComment ++ paramComments ++ attributesBlock ++ linearization ++ subclasses
}
def kindToString(mbr: MemberEntity): String = {
@@ -427,11 +469,16 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
/** name, tparams, params, result */
def signature(mbr: MemberEntity, isSelf: Boolean, isReduced: Boolean = false): NodeSeq = {
- def inside(hasLinks: Boolean): NodeSeq =
+ def inside(hasLinks: Boolean, nameLink: String = ""): NodeSeq =
<xml:group>
<span class="kind">{ kindToString(mbr) }</span>
<span class="symbol">
- <span class={"name" + (if (mbr.deprecation.isDefined) " deprecated" else "") }>{ if (mbr.isConstructor) tpl.name else mbr.name }</span>
+ {
+ val nameHtml = <span class={"name" + (if (mbr.deprecation.isDefined) " deprecated" else "") }>{ if (mbr.isConstructor) tpl.name else mbr.name }</span>
+ if (!nameLink.isEmpty)
+ <a href={nameLink}>{nameHtml}</a>
+ else nameHtml
+ }
{
def tparamsToHtml(mbr: Entity): NodeSeq = mbr match {
case hk: HigherKinded =>
@@ -453,16 +500,14 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
def paramsToHtml(vlsss: List[List[ValueParam]]): NodeSeq = {
def param0(vl: ValueParam): NodeSeq =
// notice the }{ in the next lines, they are necessary to avoid a undesired withspace in output
- <span name={ vl.name }>
- { Text(vl.name) }
- { Text(": ") ++ typeToHtml(vl.resultType, hasLinks) }
- {
- vl.defaultValue match {
- case Some(v) => Text(" = ") ++ treeToHtml(v)
- case None => NodeSeq.Empty
- }
+ <span name={ vl.name }>{
+ Text(vl.name)
+ }{ Text(": ") ++ typeToHtml(vl.resultType, hasLinks) }{
+ vl.defaultValue match {
+ case Some(v) => Text(" = ") ++ treeToHtml(v)
+ case None => NodeSeq.Empty
}
- </span>
+ }</span>
def params0(vlss: List[ValueParam]): NodeSeq = vlss match {
case Nil => NodeSeq.Empty
@@ -482,21 +527,20 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
case _ => NodeSeq.Empty
}
}
- }
- { if (isReduced) NodeSeq.Empty else {
+ }{ if (isReduced) NodeSeq.Empty else {
mbr match {
- case tpl: DocTemplateEntity if (!tpl.isPackage) =>
- tpl.parentType match {
- case Some(st) => <span class="result"> extends { typeToHtml(st, hasLinks) }</span>
- case None =>NodeSeq.Empty
- }
+ case tpl: DocTemplateEntity if tpl.parentType.isDefined =>
+ <span class="result"> extends { typeToHtml(tpl.parentType.get, hasLinks) }</span>
+
case tme: MemberEntity if (tme.isDef || tme.isVal || tme.isLazyVal || tme.isVar) =>
<span class="result">: { typeToHtml(tme.resultType, hasLinks) }</span>
+
case abt: AbstractType =>
val b2s = boundsToHtml(abt.hi, abt.lo, hasLinks)
if (b2s != NodeSeq.Empty)
<span class="result">{ b2s }</span>
else NodeSeq.Empty
+
case alt: AliasType =>
<span class="result"> = { typeToHtml(alt.alias, hasLinks) }</span>
case _ => NodeSeq.Empty
@@ -506,7 +550,7 @@ class Template(tpl: DocTemplateEntity) extends HtmlPage {
</xml:group>
mbr match {
case dte: DocTemplateEntity if !isSelf =>
- <h4 class="signature"><a href={ relativeLinkTo(dte) }>{ inside(hasLinks = false) }</a></h4>
+ <h4 class="signature">{ inside(hasLinks = false, nameLink = relativeLinkTo(dte)) }</h4>
case _ if isSelf =>
<h4 id="signature" class="signature">{ inside(hasLinks = true) }</h4>
case _ =>
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png
new file mode 100644
index 0000000000..7229603ae5
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png
new file mode 100644
index 0000000000..b2f2935dc9
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png
index 25a8b4c185..97edbd49db 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png
index 51e85957fe..1a00abb401 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css
index aef3f341aa..7c05678313 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css
@@ -20,6 +20,10 @@ h1 {
display: none;
}
+.letters {
+ padding: 5px;
+}
+
#library {
display: none;
}
@@ -40,7 +44,7 @@ h1 {
right: 0;
left: 0;
top: 0;
- background-color: #B78E99;
+ background-color: #DADADA;
}
#textfilter {
@@ -72,7 +76,7 @@ h1 {
height: 16px;
padding: 2px;
font-weight: bold;
- color: #993300;
+ color: darkblue;
background-color: white;
width: 100%;
}
@@ -104,12 +108,19 @@ h1 {
}
#kindfilter {
- position: relative;
- display: block;
- padding: 5px;
- background-color: #F0F8FF;
+ position: relative;
+ display: block;
+ padding: 5px;
+ background-color: #999;
+ text-align: center;
}
+
+#kindfilter > a {
+ color: white;
+ text-decoration: underline;
+}
+
#tpl {
display: block;
position: fixed;
@@ -127,7 +138,7 @@ h1 {
float: right;
font-weight: normal;
color: white;
- padding: 1px 4px 1px 4px;
+ padding: 0 8px;
}
#tpl .packfocus {
@@ -135,24 +146,34 @@ h1 {
float: right;
font-weight: normal;
color: white;
- padding: 1px 0.5em 1px 4px;
+}
+
+#tpl .packages > ol {
+ /*margin-bottom: 5px;*/
+}
+
+#tpl .packages > ol > li {
+ margin-bottom: 1px;
}
#tpl .packages > li > h3 {
display: block;
- background-color: #2C475C;
color: white;
- padding: 1px 4px 1px 0.5em;
font-weight: bold;
display: block;
}
+#tpl ol > li.pack {
+ background-color: #2C475C;
+ padding: 3px 5px;
+}
+
#tpl ol > li {
display: block;
}
#tpl .templates > li {
- padding-left: 0.5em;
+ padding-left: 5px;
}
#tpl ol > li .icon {
@@ -168,7 +189,7 @@ h1 {
}
#tpl .templates span.tplLink {
- padding-left: 8px;
+ padding-left: 5px;
}
#content {
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js
index 212844c966..b06d5dc369 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js
@@ -227,25 +227,28 @@ function configureTextFilter() {
});
}
-// Filters all focused templates and packages. This function should be made less-blocking.
-// @param query The string of the query
-function textFilter() {
- scheduler.clear("filter");
+function compilePattern(query) {
+ var escaped = query.replace(/([\.\*\+\?\|\(\)\[\]\\])/g, '\\$1');
- $('#tpl').html('');
-
- var query = $("#textfilter input").attr("value") || '';
-
- var queryRegExp;
if (query.toLowerCase() != query) {
// Regexp that matches CamelCase subbits: "BiSe" is
// "[a-z]*Bi[a-z]*Se" and matches "BitSet", "ABitSet", ...
- queryRegExp = new RegExp(query.replace(/([A-Z])/g,"[a-z]*$1"));
+ return new RegExp(escaped.replace(/([A-Z])/g,"[a-z]*$1"));
}
else { // if query is all lower case make a normal case insensitive search
- queryRegExp = new RegExp(query, "i");
+ return new RegExp(escaped, "i");
}
+}
+// Filters all focused templates and packages. This function should be made less-blocking.
+// @param query The string of the query
+function textFilter() {
+ scheduler.clear("filter");
+
+ $('#tpl').html('');
+
+ var query = $("#textfilter input").attr("value") || '';
+ var queryRegExp = compilePattern(query);
var index = 0;
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png
index 886cd5c7c3..ad312793ea 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png
index 0a483cacf5..d51c797047 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png
index c3eef6ea51..6ea17ac320 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png
index 5ab05cc6ac..529aa93188 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css
index 687fe4634c..7957aebe8f 100755
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css
@@ -16,13 +16,15 @@ a {
}
.entry {
-
+ border-bottom: 1px solid lightgray;
+ padding: 5px 0 8px;
}
.name {
- background-color:#E5E5E5;
+ /* background-color:#E5E5E5; */
}
.occurrences {
- margin-left:0.7em
+ margin-left: 1em;
+ margin-top: 5px;
} \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css
index 13ccadefe5..192a56f9bb 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css
@@ -16,10 +16,6 @@ table, caption, tbody, tfoot, thead, tr, th, td {
vertical-align: baseline;
}
-body {
- line-height: 1.2;
-}
-
table { border-collapse: separate; border-spacing: 0; }
caption, th, td { text-align: left; font-weight: normal; }
table, td, th { vertical-align: middle; }
@@ -40,7 +36,7 @@ body {
a[href] {
text-decoration: underline;
- color: #69481D; /* brown */
+ color: #315479;
}
a[href]:hover {
@@ -48,7 +44,7 @@ a[href]:hover {
}
#owner {
- padding: 4px;
+ padding: 2px 10px 5px;
font-size: 12pt;
display: block;
}
@@ -58,16 +54,20 @@ a[href]:hover {
}
.value #owner {
- background-color: #7996AC;
+ background-color: #7996AC; /* light steel gray */
}
.type #owner {
- background-color: #799F5A;
+ background-color: #699D84; /* lighter green */
+}
+
+#types ol li > p {
+ margin-top: 5px;
}
#definition {
display: block;
- padding: 6px;
+ padding: 5px 6px;
}
#definition > img {
@@ -81,65 +81,111 @@ a[href]:hover {
display: inline-block;
}
+#definition h1 > a {
+ color: white;
+ font-size: 24pt;
+}
+
+#signature {
+ background-color: #EBEBEB;
+ font-size: 11.5pt;
+ margin-bottom: 10px;
+ padding: 8px;
+}
+
#signature > span.kind {
- font-size: 11pt;
display: inline;
float: left;
text-align: left;
width: auto;
- padding-left: 6px;
+ position: static;
}
#signature > span.symbol {
- font-size: 11pt;
text-align: left;
+ display: inline;
+ padding-left: 0.7em;
+}
+
+/* Linear super types and known subclasses */
+.hideElement,
+.hiddenContent {
+ display: none;
+}
+
+div.superTypes > h1 {
+ font-style: italic;
+ padding-top: 0.5em;
+}
+
+.link {
+ text-decoration: underline;
+ cursor: pointer;
+ color: #315479;
+}
+
+.toggleContainer p {
+ margin-top: 5px;
+}
+
+.toggleContainer .showElement {
+ padding-left: 15px;
+ background: url("arrow-right.png") no-repeat 0 5px transparent;
+}
+
+.toggleContainer .hideElement {
+ padding-left: 15px;
+ background: url("arrow-down.png") no-repeat 0 5px transparent;
}
.value #definition {
- background-color: #2C475C;
+ background-color: #2C475C; /* blue */
}
.type #definition {
- background-color: #385E1A;
+ background-color: #316555; /* green */
}
-#comment {
- display:none;
- padding-right: 8px;
- padding-left: 8px;
+#template {
+ margin-bottom: 50px;
}
-#template .values > h3 {
+h3 {
color: white;
- padding: 4px;
- background-color: #7996AC;
+ padding: 5px 10px;
font-size: 12pt;
font-weight: bold;
}
+dl.attributes > dt {
+ display: block;
+ float: left;
+ font-style: italic;
+}
+
+dl.attributes > dd {
+ display: block;
+ padding-left: 10em;
+ margin-bottom: 5px;
+}
+
+#template .values > h3 {
+ background-color: #315479; /* grayish blue */
+}
+
#template .types > h3 {
- padding: 4px;
- color: white;
- font-weight: bold;
- font-size: 12pt;
- background-color: #799F5A;
+ background-color: #316555; /* green */
}
#constructors > h3 {
- padding: 4px;
- color: white;
- font-weight: bold;
- font-size: 12pt;
background-color: #333;
}
#template > div.parent > h3 {
- color: white;
- padding: 4px;
+ background-color: #3B3B3B;
margin-top: 10px;
- background-color: #47166D;
+ font-style: italic;
font-size: 12pt;
- font-weight: bold;
}
#template > div.parent > h3 * {
@@ -155,6 +201,15 @@ div.members > ol {
div.members > ol > li {
display: block;
+ border-bottom: 1px solid gray;
+ padding: 5px 0 6px;
+ margin: 0 10px;
+ position: relative;
+}
+
+div.members > ol > li:last-child {
+ border: 0;
+ padding: 5px 0 5px;
}
/* Member signatures */
@@ -169,18 +224,16 @@ div.members > ol > li {
}
.signature {
- padding: 2px;
font-family: monospace;
font-size: 10pt;
+ line-height: 18px;
clear: both;
display: block;
- background-color: #E5E5E5;
}
.signature .kind {
+ position: absolute;
text-align: right;
- float: left;
- display: inline-block;
width: 8em;
}
@@ -197,8 +250,8 @@ div.members > ol > li {
}
.signature .symbol {
- display: inline;
- padding-left: 0.7em;
+ display: block;
+ padding-left: 8.7em;
}
.signature .name {
@@ -218,12 +271,22 @@ div.members > ol > li {
font-style: italic;
}
+#template .signature.closed {
+ background: url("arrow-right.png") no-repeat 0 5px transparent;
+ cursor: pointer;
+}
+
+#template .signature.opened {
+ background: url("arrow-down.png") no-repeat 0 5px transparent;
+ cursor: pointer;
+}
+
#template .values .signature .name {
- color: blue;
+ color: darkblue;
}
#template .types .signature .name {
- color: green;
+ color: darkgreen;
}
/* Comments text formating */
@@ -231,54 +294,49 @@ div.members > ol > li {
.cmt {}
.cmt p {
- margin-bottom: 0.9em;
- margin-top: 0.9em;
+ margin: 0.7em 0;
}
-.cmt h3 {
- margin-bottom: 1em;
- margin-top: 1em;
+.cmt p:first-child {
+ margin-top: 0;
+}
+
+.cmt p:last-child {
+ margin-bottom: 0;
+}
+
+.cmt h3,
+.cmt h4,
+.cmt h5,
+.cmt h6 {
+ margin-bottom: 0.7em;
+ margin-top: 1.4em;
display: block;
text-align: left;
font-weight: bold;
- font-size: x-large;
+}
+
+.cmt h3 {
+ font-size: 14pt;
}
.cmt h4 {
- margin-bottom: 0.6em;
- margin-top: 0.6em;
- display: block;
- text-align: left;
- font-weight: bold;
- font-size: large;
+ font-size: 13pt;
}
.cmt h5 {
- margin-bottom: 0.4em;
- margin-top: 0.4em;
- display: block;
- text-align: left;
- font-weight: bold;
+ font-size: 12pt;
}
.cmt h6 {
- margin-bottom: 0.4em;
- margin-top: 0.4em;
- display: block;
- text-align: left;
- font-style: italic;
+ font-size: 11pt;
}
.cmt pre {
- padding: 0.4em;
- border-color: #ddd;
- border-style: solid;
- border-width: 1px;
- margin-left: 0;
- margin-bottom: 0.4em;
- margin-right: 0;
- margin-top: 0.4em;
+ padding: 5px;
+ border: 1px solid #ddd;
background-color: #eee;
+ margin: 5px 0;
display: block;
font-family: monospace;
}
@@ -286,7 +344,7 @@ div.members > ol > li {
.cmt ul {
display: block;
list-style: circle;
- padding-left:20px;
+ padding-left: 20px;
}
.cmt ol {
@@ -315,7 +373,7 @@ div.members > ol > li {
}
.cmt li {
- display:list-item;
+ display: list-item;
}
.cmt code {
@@ -339,35 +397,32 @@ div.members > ol > li {
p.comment {
display: block;
margin-left: 8.7em;
+ margin-top: 5px;
}
.shortcomment {
display: block;
- cursor: pointer;
- margin: 4px 0px;
- padding: 0 8px;
+ margin: 5px 10px;
}
div.fullcomment {
- margin: 10px 0 10px 0;
+ margin: 5px 10px;
}
#template div.fullcomment {
display:none;
- margin: 6px 0 6px 8.7em;
+ margin: 5px 0 0 8.7em;
}
#template .shortcomment {
- margin: 0 0 0 8.7em;
- padding: 2px;
+ margin: 5px 0 0 8.7em;
+ padding: 0;
}
div.fullcomment .block {
- padding: 2px 0 2px 0;
- border-top: 1px solid gray;
- border-bottom: 1px solid gray;
- margin-top: 2px;
- margin-bottom: 2px;
+ padding: 5px 0 0;
+ border-top: 1px solid #EBEBEB;
+ margin-top: 5px;
}
div.fullcomment div.block ol li p,
@@ -375,10 +430,6 @@ div.fullcomment div.block ol li {
display:inline
}
-div.fullcomment .block + .block {
- border-top: none;
-}
-
div.fullcomment .block > h5 {
font-style: italic;
font-weight: normal;
@@ -386,39 +437,25 @@ div.fullcomment .block > h5 {
}
div.fullcomment .comment {
- margin: 6px 0 6px 0;
+ margin: 5px 0 10px;
+}
+
+div.fullcomment .comment:last-child {
+ margin-bottom: 0;
}
div.fullcomment dl.paramcmts > dt {
display: block;
float: left;
font-weight: bold;
- margin: 2px 4px 2px 0;
}
div.fullcomment dl.paramcmts > dd {
display: block;
padding-left: 80px;
- border-top: 1px dashed gray;
- border-bottom: 1px dashed gray;
+ margin-bottom: 5px;
}
-div.fullcomment dl.paramcmts > dt:first-child + dd {
- border-top: none;
-}
-
-div.fullcomment dl.paramcmts > dd:last-child {
- border-bottom: none;
-}
-
-div.fullcomment dl.paramcmts > dd + dt + dd {
- border-top: none;
-}
-
-div.fullcomment dl.paramcmts dd.cmt p {
- margin-top: 2px;
- margin-bottom: 2px;
-}
/* Members filter tool */
#textfilter {
@@ -466,31 +503,43 @@ div.fullcomment dl.paramcmts dd.cmt p {
}
#mbrsel {
- padding: 4px;
- background-color: #B78E99; /* grayish pink */
+ padding: 5px 10px;
+ background-color: #DADADA; /* light gray */
+ font-size: 9.5pt;
display: block;
- margin-bottom: 10px;
+ margin-top: 1em;
+/* margin-bottom: 1em; */
+}
+
+#mbrsel > div {
+ margin-bottom: 5px;
+}
+
+#mbrsel > div:last-child {
+ margin-bottom: 0;
}
#mbrsel > div > span.filtertype {
- padding: 4px;
+ padding: 3px 0;
float: left;
display: inline-block;
- color: white;
+ color: #404040;
width: 4.5em;
}
#mbrsel > div > ol {
display: inline-block;
- background-color: white;
+ /*background-color: white;*/
}
#mbrsel > div > ol#linearization {
- display: inline;
+ display: block;
+ margin-left: 4.5em;
+ margin-top: 5px;
}
#mbrsel > div > ol > li {
- padding: 4px 8px 4px 8px;
+ padding: 3px 10px;
background-color: white;
display: inline-block;
cursor: pointer;
@@ -502,8 +551,8 @@ div.fullcomment dl.paramcmts dd.cmt p {
}
#mbrsel > div > ol > li.out {
- color: #80384E;
- background-color: #9E6A77;
+ color: #4B4B4B;
+ background-color: #999;
}
#mbrsel .hideall {
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js
index ef98c13aaf..14a5613015 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js
@@ -69,24 +69,6 @@ $(document).ready(function(){
filter();
};
});
- $("#impl > ol > li.concrete").click(function() {
- if ($(this).hasClass("out")) {
- $(this).removeClass("out").addClass("in");
- $("li[data-isabs='false']").show();
- } else {
- $(this).removeClass("in").addClass("out");
- $("li[data-isabs='false']").hide();
- }
- });
- $("#impl > ol > li.abstract").click(function() {
- if ($(this).hasClass("out")) {
- $(this).removeClass("out").addClass("in");
- $("li[data-isabs='true']").show();
- } else {
- $(this).removeClass("in").addClass("out");
- $("li[data-isabs='true']").hide();
- }
- });
$("#order > ol > li.alpha").click(function() {
if ($(this).hasClass("out")) {
$(this).removeClass("out").addClass("in");
@@ -119,44 +101,47 @@ $(document).ready(function(){
$(this.getTip()).html(this.getTrigger().attr("name"))
}
});
- var docAllSigs = $(".signature");
- function commentShowFct(fullComment){
+
+ /* Add toggle arrows */
+ var docAllSigs = $("#template li").has(".fullcomment").find(".signature");
+
+ function commentToggleFct(signature){
+ var parent = signature.parent();
+ var shortComment = $(".shortcomment", parent);
+ var fullComment = $(".fullcomment", parent);
var vis = $(":visible", fullComment);
+ signature.toggleClass("closed").toggleClass("opened");
if (vis.length > 0) {
+ shortComment.slideDown(100);
fullComment.slideUp(100);
}
else {
+ shortComment.slideUp(100);
fullComment.slideDown(100);
}
};
- var docShowSigs = docAllSigs.filter(function(){
- return $("+ div.fullcomment", $(this)).length > 0;
- });
- docShowSigs.css("cursor", "pointer");
- docShowSigs.click(function(){
- commentShowFct($("+ div.fullcomment", $(this)));
+ docAllSigs.addClass("closed");
+ docAllSigs.click(function() {
+ commentToggleFct($(this));
});
- function commentToggleFct(shortComment){
- var vis = $("~ div.fullcomment:visible", shortComment);
- if (vis.length > 0) {
- shortComment.slideDown(100);
- vis.slideUp(100);
- }
- else {
- var hid = $("~ div.fullcomment:hidden", shortComment);
- hid.slideDown(100);
- shortComment.slideUp(100);
- }
+
+ /* Linear super types and known subclasses */
+ function toggleShowContentFct(outerElement){
+ var content = $(".hiddenContent", outerElement);
+ var vis = $(":visible", content);
+ if (vis.length > 0) {
+ content.slideUp(100);
+ $(".showElement", outerElement).show();
+ $(".hideElement", outerElement).hide();
+ }
+ else {
+ content.slideDown(100);
+ $(".showElement", outerElement).hide();
+ $(".hideElement", outerElement).show();
+ }
};
- var docToggleSigs = docAllSigs.filter(function(){
- return $("+ .shortcomment", $(this)).length > 0;
- });
- docToggleSigs.css("cursor", "pointer");
- docToggleSigs.click(function(){
- commentToggleFct($("+ .shortcomment", $(this)));
- });
- $(".shortcomment").click(function(){
- commentToggleFct($(this));
+ $(".toggleContainer").click(function() {
+ toggleShowContentFct($(this));
});
});
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png
index b3871a01c4..fb961a2eda 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png
index a44871309e..0159946d46 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai
index b56fd1d3cd..3b5c47c9e3 100644
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai
+++ b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai
@@ -1,7 +1,7 @@
%PDF-1.5 %âãÏÓ
-1 0 obj <</Metadata 1054 0 R/Pages 2 0 R/OCProperties<</D<</RBGroups[]/ON[37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R]/OFF[15 0 R 27 0 R]/Order 970 0 R>>/OCGs[15 0 R 27 0 R 37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R]>>/Type/Catalog>> endobj 1054 0 obj <</Subtype/XML/Length 44482/Type/Metadata>>stream
+1 0 obj <</Metadata 1054 0 R/OCProperties<</D<</OFF[15 0 R 27 0 R]/ON[37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R]/Order 1314 0 R/RBGroups[]>>/OCGs[15 0 R 27 0 R 37 0 R 65 0 R 78 0 R 90 0 R 116 0 R 129 0 R 141 0 R 167 0 R 180 0 R 192 0 R 218 0 R 237 0 R 255 0 R 287 0 R 306 0 R 324 0 R 356 0 R 375 0 R 393 0 R 425 0 R 444 0 R 462 0 R 480 0 R 515 0 R 534 0 R 552 0 R 570 0 R 605 0 R 624 0 R 642 0 R 660 0 R 695 0 R 699 0 R 718 0 R 735 0 R 753 0 R 785 0 R 789 0 R 808 0 R 825 0 R 843 0 R 878 0 R 882 0 R 901 0 R 918 0 R 936 0 R 971 0 R 975 0 R 994 0 R 1011 0 R 1029 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R 1143 0 R 1223 0 R 1224 0 R 1225 0 R 1226 0 R 1227 0 R 1228 0 R 1308 0 R 1309 0 R 1310 0 R 1311 0 R 1312 0 R 1313 0 R]>>/Pages 2 0 R/Type/Catalog>> endobj 1054 0 obj <</Length 44567/Subtype/XML/Type/Metadata>>stream
<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?>
-<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c036 46.277092, Fri Feb 23 2007 14:16:18 ">
+<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.0-c060 61.134777, 2010/02/12-17:32:00 ">
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<rdf:Description rdf:about=""
xmlns:dc="http://purl.org/dc/elements/1.1/">
@@ -13,32 +13,33 @@
</dc:title>
</rdf:Description>
<rdf:Description rdf:about=""
- xmlns:xap="http://ns.adobe.com/xap/1.0/"
- xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/">
- <xap:CreatorTool>Adobe Illustrator CS3</xap:CreatorTool>
- <xap:CreateDate>2009-11-23T17:10:12+01:00</xap:CreateDate>
- <xap:ModifyDate>2010-04-13T20:05:12+02:00</xap:ModifyDate>
- <xap:MetadataDate>2010-04-13T20:05:12+02:00</xap:MetadataDate>
- <xap:Thumbnails>
+ xmlns:xmp="http://ns.adobe.com/xap/1.0/"
+ xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/">
+ <xmp:CreatorTool>Adobe Illustrator CS3</xmp:CreatorTool>
+ <xmp:CreateDate>2009-11-23T17:10:12+01:00</xmp:CreateDate>
+ <xmp:ModifyDate>2011-04-04T19:44:30+02:00</xmp:ModifyDate>
+ <xmp:MetadataDate>2011-04-04T19:44:30+02:00</xmp:MetadataDate>
+ <xmp:Thumbnails>
<rdf:Alt>
<rdf:li rdf:parseType="Resource">
- <xapGImg:width>256</xapGImg:width>
- <xapGImg:height>208</xapGImg:height>
- <xapGImg:format>JPEG</xapGImg:format>
- <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXlX54yWv13ynba&#xA;/PLB5FuryZPMPpsVR5FjD2aSlP3nAujk022r1C5k6fka+ro1ZOl8kH+VVxocf5iarp3kyXn5TTTI&#xA;p9Sht3kmso9WaUKPRklHL4oVbcfap/kilmckwBl9V/YjH9W3J7DmE3OxV2KuxV2KuxV2KuxV2KpD&#xA;5s89eU/KUNvN5h1BLFbpylupWSV3KirFY4ld+K7ValBUeIycMcp8gxlIDmivLfmfQfMumDU9DvFv&#xA;bIu0ZkUMhV06q6OFdDuDRgNiD0IxnjlA0UxkDyTTIJdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVU7m2t7q3ltrmJJ7eZTHNDIodHRhRlZWqCCOoOEGlU9P03TtNtEs9OtYbKzir6dtbx&#xA;rFEvIljxRAFFSSTiZE7lAFIjAl2KuxV2KuxV2KuxV2KuxV5v5w0LVrT8wW84pbT3emJ5euNNMVin&#xA;rXYuhMZY1SHhJX1PUorcSoI+OgpXIxyHDw9eJrkN78kX+Wumaw+s+ZfNepaY+ir5hktDaaZNw9dY&#xA;raAj1puBIV5WlPJCAykb45pChEG+FYDcnvZ7mO2OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV&#xA;2KuxV2KuJAFT0xV5j58/Pryv5Zup9NtUbU9WhJR4YiPTRxx+3J0H7QIHxAj7NDXMrDpZT36NU8oD&#xA;zi6/5yR843N6k1rYQWtqtK2vL1OVDU1dkruNtszo9nCmg6gsv8tf85H6ZdziHXtPbTuVAs0LerGK&#xA;KftE8SOTUA2oOpbKcvZsgNt2cdSDzexW11b3VvHcW0qzQSqHilQhlZTuCCOoOa4iubkqmBXYq7FX&#xA;Yq7FXYq7FXYqwDzz+dXk/wApy/VZJDqGoUVvqlqVdgrgkFmrxX9k/ERUGormRi00ptcsgDzof85Q&#xA;aw5Xh5eh4j7ZNw9WHagCfD+OZo7Nvq0nU+TJfK3/ADkXoV/MINdtH0qR2/dzKfVgApQBn2ate/ED&#xA;7t68vZ047jdlHUA83rdtcwXMEdxbyLLBKoeORTUMrCoI+jNeRTkKmBXYq7FXYq7FXYq7FWHz/wB9&#xA;J/rH9ebAcmgrMKHYqn3l7/eaT/X/AIDMXPzbYck1yhm7FXYq7FXj3/OQv5mXflvSYtE0icR6pqis&#xA;ssqULwwinJga1RjWg271B2zL0uHiNlqyzp4J5D8ja95t1T6lpcXqSAc7i4kJEUSk/akeh6nt1Oba&#xA;WSOONycQRMjQe1Wf/OM5W3/0nXgtwR0ituSKfm0ilvuGY38q1yj9rZ+V82Geevyk17ypD9blZL7T&#xA;CQpvIQRwJ2AlQ1417GpHvXM7Ta2GXblJoy4TDfonH5IfmBc6PrUXlu/n/wBxF8zfVjIdoZiCeKkk&#xA;cVkP/DfMnMXtHSgjjHNt0+Xei+jc0bnOxV2KuxV2KuxV2KvLvz7/ADIl8peXY7LT246xq3JLd96R&#xA;xr/eSdKGlQAK9TuCKjMnTYuI+TVlnQeH/lv+U2uee7W91K2v4I3gm43BujIXd5BzL8lV6171zZT1&#xA;EcVAhx44zNllj/zj55wfVriyaW3itbbgDqDF/TkLIGpEvHk3HlQnYV75Z/KWMRB3vuY/lpEteavy&#xA;L8z6JpsmoRSQ6lbQKXuBByWRFG5bgw+JQOtDX2yzD2jjyHhOxYz08oi0R+SX5g3Wja1F5cvpS2k6&#xA;g/G1Lkn0Zz0Vd9lkO1Kfa+ZOUdo6UEcY5s9Pl3ovo7NG5zsVdirsVdirsVdirD5/76T/AFj+vNgO&#xA;TQVmFDsVT7y9/vNJ/r/wGYufm2w5MO178x9W0/zF5isYWshJodm9xp3l+RHOpauy2JuvUs29aOka&#xA;Sfu2CwSH4G6GmUM3n/mD86fN955Av3e503SHurLVzba7FJGyyva2kLRWtr9Sv7sW9873LlOU7ECL&#xA;lwqxVFUlv/M3nma91i2tNfuYJ5Lj6rcAz3Usscc2u2VpD61us0P1A+jcMLd4GVriLk5KvRgq9W8g&#xA;ah5wP5mebdM1y3u4rCGy019Jjlnimt44EmvLdJVpPNLzuxD6jFxzqpVzshZV4B+fmpXd5+ampxXD&#xA;8/qIjtoTSlI+PqqtB4erTNtpQBEOJlO73z/nHbSbWz/LW0vYlHr6nNPNO/c+nK0CivgBF+OYmtkT&#xA;krubcA9LEfzU/NPzVov5jGy065MNhpXoc7QAcJzJGsz+ptU1WTj7UqN8ztJpITxWRuWjNmkJ7dHu&#xA;Gpafa6rpdzYXK87a8iaKRSP2XWlaHuM1MJmMgRzDmEWKfFjXs1hdw3kLcbi0lSaJga0eNgykEe4z&#xA;qswBjTqobF9r2DyPY27yNzkaJC7kAFmKipoKDf2zkzzdqFfAl2KuxV2KuxV2KvkH/nInWF1D8y54&#xA;0DJHZQpb8TQVdGYO+xPXYV8AM2uljUXEymy9R/5xZ/5R3Wf+YqP/AJN5X2hzHuZ6fkU5/OT80tc8&#xA;pahp+n6RFD6k8ZuZ5p1LgrzKKigFafZPI/KmOi0kcgJkjPmMTQZ75S15PMPlnT9Y9MR/XYQ8kXUK&#xA;4qrqK9QGBpmHmx8EzHub4S4hb5T/ADAtk0LzrqkNgfSFletJa8duFG9RAP8AV2zo8cuPECeoddIV&#xA;M0+vLB+djbvUnlEjVapbdQd6985g83ZBXwJdirsVdirsVdirD5/76T/WP682A5NBWYUOxVPvL3+8&#xA;0n+v/AZi5+bbDkmuUM3Yq7FXYq+T/wDnJnyydM88RavClLbVIQ0jcuR9dCQ1evEMKcfkadM2eknc&#xA;a7nGyjdn3/ONP5gabPoP+ErydYdQtJHk09HNPWhlJdlSvV0csSPA+xyrWYjfEGWGW1Mx83fk1onm&#xA;XzXBr9xcyQ09MX1oqKyz+lsvxE/DVQFOx2HbBh10scOEBZ4BKVpr+ZPnrTvKPly4uZZlGpTRsmnW&#xA;1RzeUigbj14ITVj9HUjKtNgOSVdOrPJPhD5S8q6VN5h81abpMUfrCedTMlVFYlPKQVYhalRQVO5o&#xA;M3mpy1ElwccLL7VtoFt7eKBSzLEiorMasQopUnxznCbdkqYFdirsVdirsVdir5Z/5yj8vz2nnCz1&#xA;tUAtb+3ERK1P72Ekkt2BYNsPYnNlpJemnGzDdmn/ADinJz8ua37Xcf8AybyGuNkMsA2LN/zJ/Kiy&#xA;87XFldNfNYXNopiZxGJQ8RPLjQslCDWhr36ZDS6w4gRV2nLh42SWkGjeU/LEULzC20vSbcK08p6K&#xA;g3Zj3Zj4dSdsx5GWSd9S2ACI9z5I1C4ufPHn91t0fnrN8xVEBZ0hZiSaLyJ9OIVNB2zfSkMeOu4O&#xA;ABxSfZVrE0NtDCzBmjRUZgKAlRSoG9M54uxVMCuxV2KuxV2KuxV8e63/AM5B+fLXWb+2jjsfTguZ&#xA;Y0rC5PFHKiv7z2zcRxCg4plugv8AoYz8wP8Afdh/yJf/AKqYfCCOIu/6GM/MD/fdh/yJf/qpj4QX&#xA;iL3v/nHrzzrXnDyzqV9qywrNb3voRiBCi8fSRtwWberZgauNSDdiNh6pmK2uxV2KuxVjnn7yPpnn&#xA;Py7No1/VAx9S3mABaOVQQrivhXt8ulRlmPIYGwxlGw+PPN3kDzd5Kv6ahbSpArVt9QjDek1GIU8x&#xA;9lqqdvpFRvm1x5RLk4koEIi0/Nz8w7e2FtH5hvhEBQBpmZgB2DNVh9+S8PH/ADQvFLvQFmvmvzbq&#xA;3pWqXWsanMQHdmaV9zxBkkc/CKnqxplhyxgO4MREkvp78l/ykTydZHU9RYS69eJSUgUWKM7+mtQG&#xA;/wBb9W22q1OoMzXRysePhen5itrsVdirsVdirsVdirHPP3kjTfOfl2bRr4lAx9SCYAFo5VB4uKjt&#xA;Xt8ulRlmPIYG2Mo2GF/kF5I13yfbeYNM1aLiTdo1tOv2JYwhXmtd+o7/AKqE26nIJUQwxxpjP/OQ&#xA;H5gea/KfnPTf0HqMlmJtPDSxgK8bETSCpjkDoT70y/SQjKJ4he7DLIg7PIdX8+fmB53uI7G7vLnV&#xA;JCax2cKBUqP2vShVE2H7RG2ZkRDHuBTSTKXN73+Sn5Nz+WOWteYI431mZAIodnFupo1FIPHlX7Rp&#xA;1Hw7Cra/U6nj2HJyMeOub2DMNudirsVdirsVdirsVfnj5l/5SPVf+Yy4/wCTrZvIcg4Z5pbkkOxV&#xA;9V/84jf8oVrP/bSP/JiPNbrfqHucjDyeo6j5wk0/zrYeX7mzWOwvtPvL9dXedVVDYtCJUaIrsoW4&#xA;VuZcfLMNtYy35u6jN5d13zDY6AraZoF1JHcC7uzbTzWi2lveQzwRCCWstwl2PShcr25MrHiFV11+&#xA;cHop5quFtdONt5ZLRPC+plL0yiSONWubb6swtoGZ2/emRvs/ZPZVUufzetLe90HSpG0Y6trUX1su&#xA;usINPW2af0Ymgu5IEkuZJt/TjSDchgSAAxVeiYqpz21vcJ6c8Sypv8LqGG4Knr7EjEFWNH8q/wAt&#xA;yat5a09m7s1ujEnxJIqT88s8afex4B3J1pOgaLo9utvpdlDZwrXikSBQOVKgeA26ZGUieaQAEfkU&#xA;uxV2KuxV2KuxV2KuxV2KrXiRxRhvQjkCQwB60YUI+jFWMeaPy08oeaNQtL7WbT6zPZjgnI1DJy5c&#xA;H5VPGtelOpy2GWURQYygCmeieUfLGhBho+mW9gH48vQjCVKggHbvv16nISmTzKREBNsil2KuxV2K&#xA;uxV2KuxV2Kvzx8y/8pHqv/MZcf8AJ1s3kOQcM80tySHYq+q/+cRv+UK1n/tpH/kxHmt1v1D3ORh5&#xA;PXdW8p6Rq2s2eqX6GdrO0vbAWjhHt5YNR9H11mjZW57WygCtKE1B7YbaxW4/JDyolxJLotxceXY5&#xA;b+PU5LXSodOjt2nggjggDQzWk6MkJiaWNSKCV3f7XHiqm8vkBpdWn1h/MGpnVTDJa2F5Sw5WUE80&#xA;c8scC/VODBzAi/v1kIXpSpxVKJvyS8sSWjWqX1/DFdW8lprPBreuoQzXUt5IlxygbhynuZWrb+kR&#xA;yoKACir0LFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq+Rta/wCc&#xA;afzQu9Yv7qGC0MNxcSyxk3Kg8XcsKingc2cdVABxzjKC/wChX/zV/wCWez/6SV/ph/NwR4Rd/wBC&#xA;v/mr/wAs9n/0kr/TH83BfCL3b8gPy+8x+SPLeo6frqRJcXN568QhkEg4ekibke6nMPU5BMghtxxI&#xA;D1DMdsdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir&#xA;sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs&#xA;VdirsVdirsVdiqGOpWIJBmUEbEYOINnhS7nfpOw/3+uPEF8KXc79J2H+/wBceIL4Uu5VhuIZlLRO&#xA;HANCR44gsZRI5qmFi7FXYq7FVO4uIbaB553EcMYLO56ADElXj/mv/nIzSrK+ks/L1oNV9MsjXRYp&#xA;ATQbo1KtRq9BQihDZh5NWI8t2mWYBiUH5+/mCzDnHZtEOoERDkf63Lj/AMLmKdfJq/MFnvlP8+NJ&#xA;1K5W01u2/Rc0jBYpg3OCpIFGc0K9SakUpmTi1sZGjs2Qzg83qasrKGU1U7gjM1vbxV2KuxV2KuxV&#xA;2KuxV2KuxVDahqmnadbtcX9zHbQIpZpJGCgKCATv4VGAkDmgljx/NP8ALsS+l+n7QtUCoeq7/wCU&#xA;Bx/HK/Hh3sfEj3p7pet6RqsIm028hu4jUB4XDg8aA0p4VGTjIHkyBBRuSS7FXYq7FXYq7FXYqxCb&#xA;++k/1j+vKC7SPJZil2Kp95f/AN5pP9f+AyyDh6nmE0ybjOxV2KuxV86/85E/mHcz6n/g/T5THbwg&#xA;NqbKWBdmoViIIX/WPWopQ9a4Opy9A0ZZdGDeQvIet+aLs22mQgrHQ3FzIeMUQPTk1D1psAK5gxxS&#xA;yGg44iZHZ6/af848KsI+s63SUjdY7eqg/NpKn7hmQOze+X2Nv5bzec+cfLMWga9c6N9ZF21sE5TB&#xA;PTqZEDgceT9mHfNfnx+HPhu3GyR4TT0T8j/PF08x8rahNzSJC+nO53CggGLkSNl/ZFD9AGbLQ5yf&#xA;SXKwZL2L2bNk5LsVdirsVdirsVdirsVYf+Z35hWHkvQHu3ZZNQmPp2VoGHN3YH4qUaiim7Hb5mim&#xA;rLk4QwnKg+ZpdQ82/mB5iiW7mN3fXktLa1DCOFCRQBFYhVoq0qdzTcnNXOcpyrq4spGRZtqH5Iax&#xA;onlu71nU7q3Q2qK4tYuUjHkyrRmIRR9rtXHJpJxiZErLEQLLEtMutR0m6S90u5e1uUIYPGdjxPIB&#xA;lPwsKitCMw4ZpRNhpjMh9Dflh+Y0Xmqye3vSkOs21BNCDT1AannGD1XbxqO/Ynd6bUDIPNzsWTiD&#xA;Osym12KuxV2KuxV2KsQm/vpP9Y/rygu0jyWYpdiqfeX/APeaT/X/AIDLIOHqeYea+bfJvnPWPzE1&#xA;680wB4v0dplnbtfP9UhFpPJdHUIrK9jtLqaKZhFGrcD9mSrbiLjNxkt8k6j+Zun+VLfT57W/sdW0&#xA;vy7bJ5a0OOzaSwu5ItKBBv7uS05QXC3ClTA00VGAX468iqivJHmL8z7rVrOHzRc6jb6axVtPmtNM&#xA;mZrmcyASW2pyTaVbm3jQUpKkEKlW/vGKk4qyD8n9Y/MjUk1N/OimKVRAUtZIJoWguCZPXjjdrKyh&#xA;khFE4enJPTesrchRV8yecLmafzzrkkztI4vrhObks3GOQotSdzRVGajLzLhzfVP5LaRa6f8Al5pj&#xA;wqPVvVa6uJAN2d2IFf8AVQBcz9LECA83IxCosA/Mv81fNlp5qu9L0m5+oWlgwi+BEZ5GoCzMzq3c&#xA;7AZg6nVTEyAaAaMuU3Qeb3+sX+q6jPqF/L615cENNLQLyIAHRQANh2Ga/JIyNnm40jZsorynqs2m&#xA;+cdJvYKGWKbZT0IZSpB+g5dpTUgWeI0X1rnQOxdirsVdirsVdirsVdir5L/P3zBc6p+ZFzYu1bbS&#xA;VW3hRWZl5Mod2ofssahWp/Lmt1Mrk42U7su/5x20Xy/d319e6giNqFi9s2mM0jIwZxLz4oGUP9le&#xA;oOR0cYmRJ5jkjCATu941uw0rUNLuLPVlVtPmAFwruY1oGBFXUqRuB3zY5IiQqXJyZAEbvnL8yNN0&#xA;LSfNclloiomniGJlVJGmXkwPL42Zz+OaLV44xnUeTr80QDslvkvWp9F85aXewtxDzpbzAsUVo5mC&#xA;HkR+yCQ30Y6SZjMLhlUn1bnQOxdirsVdirsVdirEJv76T/WP68oLtI8lmKXYqn3l/wD3mk/1/wCA&#xA;yyDh6nmE0ybjOxV2KuxV8afnB5cm8vfmDqMbBjBdyG7gkYglhL8TluOwPOpp4U2GazNCpFxZii9x&#xA;/wCcfvPmnan5Yh8uzzKmq6byWKJjRpYCxdWSvXhXiQOgAzI0uQVw9Q24pbUyPzd+UflnzLqR1KZ5&#xA;7S9kAE727Lxk4igLK6t8VABUYc2kjM3yKzwiRt4N+YWiWnljzXe6Ras7W1uIjC8pBcrJEr1YgKOr&#xA;Htmpz4eCZAcTJCpUi/yZ0WfXfP1rMIxJZ6WDc3RYEpuCqKSAdyTUV60zJ0eK5X3NmGO76lzbuY7F&#xA;XYq7FXYq7FXYq7FXxt+c1tJafmlrnOvGaZZo2IIqrop2r4NUfRmszj1Fxcg3TX8oJlbzxoi13+sr&#xA;/wAROY2EfvQ1wHqD6I/NdWb8vdZCgk+khoPASoTm01f92XKy/SXy8hCmpzQF16vo4a88yaVax15S&#xA;3cC1ALUHqAs1B/KN8vwR9QZ4xu+xs6B2LsVdirsVdirsVfB3mHz152j1/U44/MOppGl3OqIt5cAA&#xA;CRgAAH6DMUl6GEBQ2S//AB956/6mPVP+k24/5rwWy4B3O/x956/6mPVP+k24/wCa8bXgHc+mf+cW&#xA;tZ1jVfKGrTapfXF/MmoFEkuZXmZV9CM8QXLECpy/FydVrwBIe57RljguxV2KuxVhP5qflpY+eNFE&#xA;LMYdStAz2FwADRj1U1ps1PH9QpVlxcQYTjb5S1/yt5q8o6i0OpW0ls8LgR3SV9NmoGUpIO/EhqGj&#xA;DuBmunjIO7jmNI+D81fPsUaxr5gv+KigBuJDt8ya4OOfeUcR71fQfL/nrz7qfK1S4vXkYLcandM7&#xA;RoNh8czciaV6Cp9sY4pTKiBL6k/L38v9K8maKlja/vrt/ivL1gA8khpX/VXbZf1nfNnixCApyoxo&#xA;Mpyxk7FXYq7FXYq7FXYq7FXiv/ORH5bXOtWcXmXS0aXULJBFcW6hmaSGpPw7kVQ9FoK1PViBmLqM&#xA;d7hqyR6vAPKvmObQ9csNUjXm1jPHP6Z2DCNgxUn/ACgKZgDYg9zRyNvrvSvzT/LnWdNWca3ZQxzL&#xA;SW1vZY4JFqN0eOUrWnQ0qPfNoM0CObkiYL55/N3W9Dm87Xj6JLBLp4jhWJ7Xj6NViUMF4fDsfDNX&#xA;qIgzNcnFyAGWzNP+cf8AyDdXF+PN2pI0UUIppkTBlL81IM1QV2psOtQTUUKk5Wkw16i24odX0Bme&#xA;5DsVdirsVdirsVfnl5l/5SPVf+Yy4/5OtmIXo4fSEtxZOxV9V/8AOI//AChWs/8AbSP/ACYjy7Fy&#xA;dT2h9Q9zJvOHnTW/K/mu/vtUk1BdBis5pNEs7ZdPeyvLi00+a8nhnbhJqEcnGIslCqfD13obXASN&#xA;PPXnMeVZJ7jUryz8zWV/oU+qWlza6d6Bs9YvI7YRWht2uaQODJQySNMOO/GoxVO187+ZdT/Nafy1&#xA;EbzSNLk07UoLEzaZP8V5Zy2gF+LiWIQvFSeRECuU2UtvJGuKsek/NfzdH5M8gXZF2bjU10e81/WI&#xA;tNnuYZorq9gtpbWM28EkMc0qyO1Nm2CoC7rRV7hiqjdWNndoUuoEmQqUIdQ3wtTkN/GmAi1pjw/L&#xA;H8vg3IeX7ISf79EQElfHmPir71yHhR7mPAGSQ28EC8IY1iTb4UUKNhQbD2GWUyX4q7FXYq7FXYq7&#xA;FXYq7FXYq06JIjI6h0cFWVhUEHYgg4q8x8+fkF5U8zXM2o2rNpmpzVZ5IQPSdzTd0pT+Ykjck9co&#xA;yacS3a5YwWAn/nFXWhLRPMNuYf5zA4an+ryI/wCGyn8oe9h4TL/J3/OOPlnSLiO81m4bWLmJuSxu&#xA;oW3qCCpMZrXoQQxI3yyGmA5so4gHrkUUUSBIkCIKkKooKk1PTxJzJbV2KuxV2KuxV2KuxV+eXmX/&#xA;AJSPVf8AmMuP+TrZiF6OH0hLcWTsVfVf/OI//KFaz/20j/yYjy7FydT2h9Q9z2MeWvLg1eXWhpVm&#xA;NYuE9KfUhbxfWZI+IXg83H1GXioFCemWuApWPlDynYWUljY6JYWljLMlzLawWsMcTTxOskcrIqhS&#xA;6OisrUqCAe2Kpi1patdR3jQxtdwxvDFcFQZEjlKNIivTkFdokLAdeI8BiqjHo+kR6fBp0djbpp9q&#xA;Yja2axIIYjbuskBjjA4r6TorJQfCQCOmKovFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq+edT/5xI+u6ld3v+K/T+tTSTen+j+XH1GLUr9ZFaV8Mq8J2Me0KFcP2/sQ&#xA;3/Qnn/f3f9y7/s6weF5p/lH+j9v7Hf8AQnn/AH93/cu/7OsfC81/lH+j9v7Hqv5R/lh/yrzRbzTP&#xA;0n+lPrdz9Z9b0Pq/H92qcePqTV+xWtcsjGnE1GfxDdUzrJNDsVdirsVdirsVdirsVdirsVdirsVd&#xA;irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVeE+eYtP1&#xA;78wPNVj5l1N/q2iWtnJ5d0WS7SxgmaWAPNKrOOLOjsd+prStBthZRxEg9OQaJiyWafkX5g1zXfIi&#xA;XWrtJM8VzLBaXc3IyTwIFIdnYn1CHZ05D+Wh3By3TSkYbs8RJG70LMhsdirsVdirsVdirsVdirsV&#xA;dirGPO3nyw8rCwt2tZ9R1fV5Gg0nTrYDlLKoH2nYhUQM6hm3IrWhocryZOH3ljKVLPJn5gWXmSe7&#xA;06a1k0rXtONL7SrgqzqK05xuu0kdduQA7dipMceYS25EIjO/eyrLmbsVdirsVdirsVdirsVdirsV&#xA;dirsVdirsVdirsVdirsVS3VfLHlrV5Ul1bSbLUZY14RyXdvFOyrWtFMisQK5EwB5hBAR1vb29tbx&#xA;W1tEkNvCixwwxqEREQUVVUUAAAoAMkAlUxV2KuxV2KuxV2KuxV2KuxV2KsB/NHyPruvXnl3XNBli&#xA;GqeW7prqO0uHaNJ0Yo7R+ooajMYFXfajGpGU5YE0R0YTiTuFD8vPIGq6f5p1jzlrf+i6jq6mOHSU&#xA;nN0tvFIUkkEk5Veb84wFC/Cq92r8McWKpGR5lEIUbei5kNjsVdirsVdirsVdirsVdirsVdirsVdi&#xA;rsVdirsVf//Z</xapGImg:image>
+ <xmpGImg:width>256</xmpGImg:width>
+ <xmpGImg:height>208</xmpGImg:height>
+ <xmpGImg:format>JPEG</xmpGImg:format>
+ <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA&#xA;AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK&#xA;DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f&#xA;Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgA0AEAAwER&#xA;AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA&#xA;AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB&#xA;UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE&#xA;1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ&#xA;qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy&#xA;obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp&#xA;0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo&#xA;+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXlX54yWv13ynbe&#xA;YJ5YPIt1eTJ5h9NiqPIsYezSUp+84F0cmm21eoXMnT8jX1dGrJ0vkgvyquNDj/MTVdO8mS8/KaaZ&#xA;FPqUNu8k1lHqzShR6Mko5fFCrbj7VP8AJFJ5yTAGX1X9jHH9W3J7FmG3uxV2KuxV2KuxV2KuxV2K&#xA;pD5s89eU/KUNvN5h1FLFbpylupWSV3KirFY4ld+K7ValBUeIycMcpcgxlIDmivLfmfQfMumDU9Dv&#xA;FvbIu0ZkUMhV06q6OFdDuDRgNiD0IxnjlE0UxkDuE0yCXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY&#xA;q7FXYq7FXYq7FVO5tre6t5ba5iSe3mUxzQyKHR0YUZWVqggjqDhBpVPT9N07TbRLLTrWGys4q+nb&#xA;W8axRLyJZuKIFUVJJOJJO5QBSIwJdirsVdirsVdirsVdirsVeb+cdC1a0/MF/OMdvNdaYnl24030&#xA;7FPXuxdCYyxqkPCSvqep8LcSoIPOgpXIxyHDw9eJrkDd+SL/AC10zWH1nzL5r1LTH0VfMMlobTTJ&#xA;uHrrFbQEetNwJ4vK0p5IQGUjfHNIUI3dLAbk97Pcx2x2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxVxIAqemKvMfPn59+V/LN1Pptqjanq0JKPDER6aOOP25Og/aBA+IEfZoa5lYdLKe/Rq&#xA;nlAeb3X/ADkl5xub1JrWwgtbVaVteQk5UNTV2Su422zOj2cKcc6ksw8s/wDOSGmXc4h1/T207lQL&#xA;NC3qxiin7RPEjk1ANqDqWynL2dIDbdsjqQeb2K2ura6t47i2lWaCVQ8UqEMrKdwQR1BzXEU5KpgV&#xA;2KuxV2KuxV2KuxV2KsA88/nX5P8AKcv1WSQ6hqFFb6palXYK4JBZq8V/ZPxEVBqK5kYtNKbXPKA8&#xA;5H/OUOsOV4eXoOIPxk3D1YdqAJ8P45mjs2+rQdV5Mm8rf85GaDfzCDXrR9Kd2/dzKfVgApQBn2at&#xA;e/ED7t6svZ847jdlDUg83rdtcwXMEdxbyLLBKoeORTUMrCoI+jMAinJVMCuxV2KuxV2KuxV2KsOn&#xA;/vpP9Y/rzYDk45WYVdiqf+Xv95ZP9f8AgMxc/NthyTXKGbsVdirsVePf85C/mZd+W9Ii0TSJxHqm&#xA;qKyyypQyQwinJga1RmrQbd6g7ZlabDxGy05Z0HgfkPyNr3m3VPqWlxepIBzuLiQkRRKT9qR6Hqe3&#xA;U5tpZI443JxBEyNB7VZ/84ykW/8ApOvhbgjpFbckU/NpFLfcMx/5VrlH7W38p5sM89/lHr/lOH63&#xA;KyX2lkhTeQgjgTsBKhrxr2NSPeuZ2m1sMu3KTRlwyhv0Tj8j/wAwbnR9ai8tX8/+4i+ZvqxkO0Mx&#xA;BPFSSOKyH/hvmTmL2jpQRxjm26bLvRfR2aNznYq7FXYq7FXYq7FXlv5+fmRL5S8uR2Wntx1jVuSW&#xA;770jjX+8k6UNKgAV6ncEVGZOmxcR8mrLOg8P/Lf8ptc892t7qVtfwRvBNxuGujIXd5BzL8lV6171&#xA;zZT1EcVAhxo4zNlll/zj35wk1a4smlt4rS24A6gxf05CyB6RLx5tx5UJ2Fe+T/lHGIg733Mfy0iV&#xA;vmr8ivM+h6bJqEUkOpW0Cl7hYOSyIo6twYfEoHWhr7ZZh7QxzPCdixnp5RF80T+SP5hXWja1F5bv&#xA;pS+k6g/G1Lkn0Zz0Vd9lkO1Kfa+ZOU9oaUEcY5s9Pl3ovo/NG57sVdirsVdirsVdirDp/wC+k/1j&#xA;+vNgOTjlZhV2Kp/5e/3lk/1/4DMXPzbYcmHa9+Y+raf5i8xWMLWQk0Oze407y/IjnUtXZbE3XqWb&#xA;etHSNJP3bBYJD8DdDTKGbz/zB+dHnC88gag73GnaQ91Zav8AVteikjZZXtbSF4rW1+pX92Le+d7m&#xA;QpynYgRcuFSVRVJL7zN56mv9Zt7XX7mGeS5+qzAz3UskcU2t2NnCJrZZoRYH0p2Fu8BDXEXJyyvR&#xA;gq9X8gah5wP5mebdM1y3u4rCGy019Jjlnimt44EmvLdJVpPNLzuxD6jFxzqpVzshZV4B+fupXd5+&#xA;ampxXD8/qIjtoTSlI+PqqtB4erT8c22lAEQ4eU7vfP8AnHbSbWz/AC0tL2JR6+pzTzTv3PpytAor&#xA;4ARfjmJrZE5K7m7APSxD81fzU81aL+YxstOuTDYaV6HO0AHCcyRrM/qbVNVk4+1KjfM3SaSE8Vkb&#xA;lozZpCe3R7jqen2uq6Xc2FyvO2vImikUj9l1pWh7jNTCRjIEcw5khYp8VNezWF3DeQtxuLSVJomB&#xA;rR42DKQR7jOqzAGNOphsX2zYPI9jbvI3ORokLuQAWYqKmgoN/bOUPN2wV8CXYq7FXYq7FXYq+QP+&#xA;citYXUfzMnjQMkdlClvxNBV0Zg77E9dhXwAza6WNRcTKbL1H/nFn/lHdZ/5io/8Ak3lXaHMe5lp+&#xA;RTn85PzT1zyjqGn6fpEUPqTxm5nmnUuCvMoqKAVp9k8j8qYdFpI5ATJc+YxIAZ75R19PMXlnT9Y9&#xA;MR/XYQ8kXUK4qrqK9QGBpmHmx8EzHuboS4gC+U/zAtk0LztqkNgfSFletJa8duFG9RAP9XbOixy4&#xA;8QJ6h10hwzNPr2wfnY271J5RI1WqW3UHevfOZPN2YV8CXYq7FXYq7FXYqw6f++k/1j+vNgOTjlZh&#xA;V2Kp/wCXv95ZP9f+AzFz822HJNcoZuxV2KuxV8n/APOTXlk6Z54i1eFKW2qQhpG5cj66Ehq9eIYU&#xA;4/I06ZstLO413OLmjuz3/nGj8wdNn0H/AAjeTrDqFpI8mno5p60MpLsqV6ujliR4H2OV6zEb4gyw&#xA;y2pmXm78mtD8y+a4NfuLmSGnpi+tFRWWf0tl+In4aqAp2Ow7YMOtljhwgJngEpWmv5lee9O8o+XL&#xA;i5lmUalNGyabbVHN5SKBuPXghNWP0dSMq02A5JV06s8uThD5Q8q6VN5h81abpMUfrCedTMlVFYkP&#xA;KQVYhalRQVO5oM3mpy1ElwMULL7XtoFt7eKBSzLEiorMasQopUnxznCbdmqYFdirsVdirsVdir5Z&#xA;/wCcpPL89p5ws9bVALW/txEStT+9hJJLdgWDbD2JzY6SXppxsw3Zp/zinJz8ua37Xcf/ACbyGuNk&#xA;JwDYs2/Mn8p7LztcWV0181hdWimJnEYlDxE8uNCyUINaGvfpkdLqziBFXbLLh42S2kGjeUvLEULz&#xA;C30vSbcK88p/ZQbs3+Ux8O52zHkZZJ31LYAIjyD5H1C4ufPHn+RbdH56zfMyogLOkLMSTReRPpxC&#xA;poO2b6Uhjx13B14HFJ9l2sTQ20MLMGaNFRmAoCVFKgb0zni7JUwK7FXYq7FXYq7FXx5rf/OQfny1&#xA;1m/to47H04LmaNKwuTxRyor+89s28cYoOIZG0H/0MZ+YH++7D/kS/wD1UyXhBHEXf9DGfmB/vuw/&#xA;5Ev/ANVMfCC8Re9/849eeda84eWdSvtWWFZre99CMQIUXj6SNuCzb1bMDVxqQb8RsPVMxW12KuxV&#xA;2Ksc8/8AkfTPOfl2bRr+qBj6lvMAC0cqghXFfCvb5dKjLMeQxNhjKNh8d+b/ACB5u8lX9NQtpUgV&#xA;62+oRhvSajEKeY+y1VO30io3zaY8olycSUCERafm7+YdvbC2j8w3wiAoA0zMwA7Bmqw+/J+Hj7gj&#xA;il3oCzXzX5u1b0rVLrWNTmIDuzNK+54gySOfhFT1Y0yZyxiO4MREkvp78l/ykTydZHU9RYS69eJS&#xA;UgUWKM7+mtQG/wBb9W22r1GoMzXRy8ePheoZitrsVdirsVdirsVdirHPP3kjTfOflybRr8lAx9SC&#xA;YAFo5VB4uKjtXt8ulRlmPIYm2Mo2GFfkD5I13yfbeYNM1aLiTdo1tOv2JYwhXmtd+o7/AKqE26jI&#xA;JUQwxRItjP8AzkB+YHmvyn5z039BajJZibTw0sYCyRsRNIKmOQOhPvTL9JCMoniF7sM0iDs8h1fz&#xA;5+YPne4jsbu8udUkJrHZQoFSo/a9KFUTYftEbZmREMe4FNBMpc3vn5J/k3P5Y5a15gjjfWZkAih2&#xA;cW6mjUUg8eVR8Rp1Hw7Cra/U6nj2HJycWKub2DMNudirsVdirsVdirsVfnh5m/5SPVf+Yy4/5Otm&#xA;7jyDhHmluSQ7FX1Z/wA4jf8AKFaz/wBtI/8AJiPNdrPqHucjDyeo6j5wk0/zrYeX7mzWOwvtPvL9&#xA;dXedVVDYtCJUaIrsoW4VuZcfLMNuYy35u6jN5d13zDY6AraZoF1JHcC7uzbTzWi2lveQzwRCCWst&#xA;wl2PShcr25MrHiFV11+cHop5quFtdONt5ZLRPC+plL0yiSONWubb6swtoGZ2/emRvs/ZPZVUufze&#xA;tLe80HSpH0Y6vrUX1ssNYQaets05hiaC7kgR7mSanwRpBuQwqAORVeiYqpz21vcJ6c8Sypv8LqGG&#xA;4Knr7EjEFWMn8q/y3Jq3lrT2buzW6MSfEkipPzyzxp97HgHcnekaBouj262+l2UNnCteKRIFA5Uq&#xA;B4DbpkZSJ5pAAR+RS7FXYq7FXYq7FXYq7FXYqteJHFGG9COQJDAHrRhQj6MVYx5o/LPyh5o1C0vt&#xA;ZtPrM9mOCcjUMnLlwflU8a16U6nLIZZRFBjKAKZ6J5R8saEGGj6Zb2Afjy9CMJUqCAdu+/XqcjKZ&#xA;PMpEQE2yKXYq7FXYq7FXYq7FXYq/PDzN/wApHqv/ADGXH/J1s3ceQcI80tySHYq+rP8AnEb/AJQr&#xA;Wf8AtpH/AJMR5rtZ9Q9zkYeT13VvKekatrNnql+hnaztL2wFo4R7eWDUfR9dZo2Vue1soArShNQe&#xA;2G3MVuPyQ8qJcSS6LcXHl2OW/j1OS10qHTo7dp4II4IA0M1pOjJCYmljUigld3+1x4qpvL5AaXVp&#xA;9YfzBqZ1UwyWtheUsOVlBPNHPLHAv1TgwcwIv79ZCF6UqcVSib8kvLElo1ql9fwxXVvJaazwa3rq&#xA;EM11LeSJccoG4cp7mVq2/pEcqCgAoq9CxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KvkXWv+cafzQu9Yv7qGC0MNxcSyxk3Kg8XcsKingc2cdVABxjiKC/6Ff8AzW/5&#xA;Z7P/AKSV/ph/NwR4Rd/0K/8Amt/yz2f/AEkr/TH83BfCL3f8gPy+8x+SPLWo6frqRJcXN59YiEMg&#xA;kHD0kTcj3U5h6nIJmw3Y4kDd6hmO2OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux&#xA;V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2&#xA;KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K&#xA;uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku&#xA;xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVDHUrEEgzKCNiMHEGzwpdzv0nYf7/XHiC+DLud+k&#xA;7D/f648QXwZdyrDcQzKWicOAaEjxxBYyiRzVMLF2KuxV2KqdxcQ20DzzuI4YwWdz0AGKCaeQeav+&#xA;cjdJsbyWz8v2Y1Vo2Km7LlIDt1U0JajV6bEbhsBLg5tfGPLdiMH5+fmCzDlHZmIdQIiHI/1uXH/h&#xA;cjxOCe1JBn3lP8+NJ1K5W01u2/Rc0jBY5g3OCpIFGc049SakUphEnLwdpQmaOz1JWVlDKaqdwRkn&#xA;ZN4q7FXYq7FXYq7FXYq7FXYqhr/UtP0+3a4vriO2hQFmeRgoABAJ3+YwgWgyA5pEfzN8gCX0/wBO&#xA;2paoFVeq7/5QHH8cn4Uu5q/MY+8J1pus6TqcQm067iuojUB4nDA8aA9PCoyBiRzbIzEuRRmBk7FX&#xA;Yq7FXYq7FXYqxCf++k/1j+vKC7WPJZiydiqfeX/95pP9f+AyyHJwdV9QTTJuM7FXYq7FXzr/AM5E&#xA;/mHcz6n/AIP0+Qx28IDamylgXZqFYiCF/wBY9ailD1rEl1utzfwhg/kLyHrfmi7NtpkIKR0NxcyE&#xA;rFED05MAetNgBXBTq4YZ5ZVF69af848IsI+s63SWm6x2/wAIPzaSp+4YeFyx2P3y+x5z5x8sxaBr&#xA;1zo31kXbWwTlME9PeRA4HHk/Zh3yJdTqcPhZDG7p6J+R/ni6eZvK2oTc0iQvp0jncKCAYuRI2X9k&#xA;UP0AZKJdz2ZqjIcBezZJ3DsVdirsVdirsVdirsVYl+ZPn6x8naE125WS/mPp2dqGHN2IPxUo3wim&#xA;5O3zNFNmOHEWnNlEA+c3vfNXnzzBH9clN1e3clLe2DCOFCRQBFY8VoopU7mm5OZ8YCIt0+TJLJKu&#xA;pZte/k1qmj+X7nVtRuYENsqt9Wi5SMeTBaMxCgfa7VxhqIykAAjLopxgZSPJjOny3+mXK3mmXD21&#xA;whBDodjxNQGU/CwqOhGZMsYkN3Bx55QNgvdfy58/p5ltHt7wpDq9vT1YgacwannGD22+Y79idVnw&#xA;8B8nodJqhlHmzTKHMdirsVdirsVdirEJ/wC+k/1j+vKC7WPJZiydiqfeX/8AeaT/AF/4DLIcnB1X&#xA;1B5r5t8m+c9Y/MTXrzTAHi/R2mWdu18/1SEWk8l0dQisr2O0upopmEUatwP2ZKtuIuM3GS3yTqP5&#xA;m6f5Ut9Pntb+x1bS/LtsnlrQ47NpLC7ki0oEG/u5LTlBcLcKVMDTRUYBfjryKqL8k+Y/zPutXtIf&#xA;NFzqNtprFW0+a00ydjczmQB7XU5JtKt2t40FKSpBEpVv7xipOKp/+T+sfmRqSam/nRTFKogKWskE&#xA;0LQXBMnrxxu1lZQyQiicPTknpvWVuQoq+ZfOFxNP551ySZ2kcX1wnNyWbjHIUWpO5oqjIF0OfmX1&#xA;R+S+kWun/l5pjwqPVvVa6uJAN2d2IFf9VAFyQdnooCOMebAPzL/NXzZaearvS9JufqFpYMIvgRGe&#xA;RqAszM6t3OwGRJdbrNdkGQxiaAeb3+sX+q6jPqF/L613cENNLQLyIAHRQANh2GB1OWZmeI8yivKe&#xA;qy6b5x0m9gAMsU2ynoQylSD9BxDkaGRjkBfWuWPVuxV2KuxV2KuxV2KuxV8rfnpr1xqn5i3Fk7Vt&#xA;9KVbeFFYsvJlDu1D0Y1CtT+XM3BGg6nVzuXuZf8AkDo2h3N3eXl8im+s2t205mkZCGcS8+KhlD/Z&#xA;HUHJamRAAHJjoYxlIk8xVfa9u1ix02+02e01MK1jKAJwzmMUDAirKVI3A75hQkQbHN2uSMZRIlye&#xA;CefbHRdM8zPZ6OqrYiKNlCSNKOTA8viZnP45ttPOUo+rm83rcUIzqHJLfKurzaR5t0y8hbiHmSCY&#xA;FiqmOVgp5EdgSG+jHURuJXRZDHIH0zmnendirsVdirsVdirEJ/76T/WP68oLtY8lmLJ2Kp95f/3m&#xA;k/1/4DLIcnB1X1BNMm4zsVdirsVfGv5weXJvL35g6jGwYwXchu4JGIJYS/E5bjsDzqaeFNhkC6bU&#xA;46kXuH/OP3nzTtT8sQ+XZ5lTVdN5LFExo0sBYurJXrwrxIHQAZIOXosoMeE8wyPzd+UflnzLqR1K&#xA;d57S9cATvbsvGTiKAsrq3xUAFRiQuo0EMsuI2C8G/MLQ7Tyx5rvdItWdra3ERheUguVeJXqxAUdS&#xA;e2QIdHqtPwZDEckX+TOiz675+tZxGJLPSwbi5LAlNwVRSQDuSaivWmEOX2fhud9z6lybv3Yq7FXY&#xA;q7FXYq7FXYq+QvzgtpLT8zta514yzLKjEUqrop2r4Go+jM7EfSHUakesp1+U06v5w0da7+uD/wAK&#xA;cvyH92XEwD99H3vfPzNUnyJq4AqfTQ7eAlUnMDT/AFh3Gt/upPnBCFNTm4eZKppxa78waZaxk8pb&#xA;qFagFqD1BVqDwG+U5pekuTpoXMe99ZZp3p3Yq7FXYq7FXYq+DfMPnrztHr+pxx+YdTSNLudURby4&#xA;AAEjAAAP0GYpL0cIDhGyX/4+89f9THqn/Sbcf814LZcA7nf4+89f9THqn/Sbcf8ANeNrwDufTP8A&#xA;zizrOsar5Q1abVL64v5k1Aokl1K8zKvoRniC5YgVOXYuTqe0ABIe57TlrgOxV2KuxVhP5p/lrY+d&#xA;9FELMYdStAz2FwADRj1U1ps1PEfgKAhpz4RMeb5S1/yt5q8o6iYdStpLZ4XAjukr6bNQMpSQd+JD&#xA;UNGHcDIuoyYjE7o+D81fPsUaxrr9/wAVFBWeQ7fMknFHiZP5xV9B8v8Anrz7qfK2S4vXkYLcandM&#xA;7RoNh8czciaV6Cp9saWGCWQ976k/L3yBpXkzRUsbX99dv8V5esAHkkNK+PFdtl/Wd8kA7jDhEBQZ&#xA;ThbnYq7FXYq7FXYq7FXYq8b/AOcgfy6uNYtIvMemI0t/ZKIp7dQzNJDUn4dyKoei0FanqxAy/DOt&#xA;nD1WK9w8J8q+ZJtE1qx1JBzaznjm9M7BgjAlfpG2ZZ3FOtG0ge59X6X+Z35favp6zjWbOFJVpJbX&#xA;kscEi1G6skpWvhtUZgnHIHk7iOeEhzDwb81td0WXzhdto8sEtgEhWN7biYqiNQ3Hh8PXwzPwyIju&#xA;6fVQichMeTLfyI8j3dzfjzXqKNFDCKabGwYFy4IMtRx2psOtQTUUKk4+oy3s5ei09eovd8xHZuxV&#xA;2KuxV2KuxV+ePmX/AJSPVf8AmMuP+TrZiHm9LD6QluBk7FX1X/ziN/yhWs/9tI/8mI8vxcnUdo/W&#xA;Pcyfzh501vyv5rv77VJNQXQYrOaTRLO2XT3sry4tNPmvJ4Z24SahHJxiLJQqnw9d6G116Rr5685D&#xA;ytLPPqV5Z+ZbK/0KfVLO5tdO9A2esXkdsIrQ27XIELgyUMkjTDjvxqMVTtfO/mXU/wA1p/LURvNI&#xA;0uTTtSgsTNpk/wAV5Zy2gF+LiWIQvFSeRECuU2UtvJGuKsek/NfzdH5M8gXZF2bjU10e81/WItNn&#xA;uYZorq9gtpbWM28EkMc0qyO1Nm2CoC7rRV7hiqjdWVndoUuoEmQqUIdQ3wtTkN/GmKCAWPD8sfy+&#xA;Dcx5fshJ/v0RASV8eY+KvvXGmvwYdzJIbeCBeEMaxJt8KKFGwoNh7DFtpfirsVdirsVdirsVdirs&#xA;VdirTojoyOoZGBVlYVBB2IIOKvNfPH5E+V/MlzNqFsW03Upas8kIHpu5pu6Up4kkbknrlsMxDjZN&#xA;NGW/Vgp/5xf1kS0TX4DD/OYHDU/1eRH/AA2W/mPJo/JHvZZ5R/5x58uaTPHd6vcNq1zE1VjdQtvU&#xA;EFSY969CCGJG+QlnJ5NuPSRHPd6vHFHEgSNQiCpCqKCpNT08TlDl0uxV2KuxV2KuxV2Kvzx8y/8A&#xA;KR6r/wAxlx/ydbMQ83pYfSEtwMnYq+q/+cRv+UK1n/tpH/kxHl+Lk6jtH6x7nsg8teXBq8utDSrM&#xA;axcJ6U+pC3i+syR8QvB5uPqMvFQKE9MtdepWPlDynYWUljY6JYWljLMlzLawWsMcTTxOskcrIqhS&#xA;6OisrUqCAe2Kpi1patdR3jQxtdwxvDFcFQZEjlKNIivTkFdokLAdeI8BiqjHo+kR6fBp0djbpp9q&#xA;Yja2axIIYjbuskBjjA4r6TorJQfCQCOmKovFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F&#xA;XYq7FXYq7FXYq7FXYq+eNT/5xH+vald3v+K/T+tTSTen+j+XH1GLUr9ZFaV8MqOLzdlHtGhXD9v7&#xA;EN/0J3/393/cu/7OsHhebL+Uv6P2/sd/0J3/AN/d/wBy7/s6x8LzX+Uv6P2/serflH+V/wDyrzRb&#xA;zTP0n+lPrdz9Z9b0Pq/H92qcePqTV+xWtcsjGnD1GfxDdUzrJOO7FXYq7FXYq7FXYq7FXYq7FXYq&#xA;7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7&#xA;FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXhPnm&#xA;HT9e/MDzVY+ZdTf6toltZyeXtEku0sYJmlg5TSBnHFnR2O/U1pWg2iXXZwJSkD05C6Zp+RfmDXNd&#xA;8iJdau0kzxXMsFpdzcjJPAgUh2difUIdnTkP5aHcHCG7RzlKHqehYXLdirsVdirsVdirsVdirsVd&#xA;irHfOHnax8tCxga2mv8AVNVkaDTNPtwOUsigfadiFRAzKGbcitaHfLMePi8gGjNnEKFWTyW+U/O1&#xA;pr011YTW0mm61Yn/AEzTZypdRWnONl2kSu3Knh4issuEwo84nqw0+qGQmPKQ5hkmUuU7FXYq7FXY&#xA;q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUt1Xyx5a1eVJdW0my1CWNeEcl3bxTsq1rRTIrECuLGU&#xA;InmEdb29vbW8VtbRJDbwoscMMahEREFFVVFAAAKADFIFKmKXYq7FXYq7FXYq7FXYq7FXYqwf8yfJ&#xA;uta3d6DrOiSxDUvL1y1zHbTs0aTIxR2TmoahJhC77UJqcvw5AAQeri6nDKRjKPOKn5F8k6rZeZNV&#xA;82ayfq99qi+nDpaTG5W3ico7iSYqvNuaAKF+FR3NdpZs1xERyDDTabhmch2MunNnmYzmuxV2KuxV&#xA;2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//2Q==</xmpGImg:image>
</rdf:li>
</rdf:Alt>
- </xap:Thumbnails>
+ </xmp:Thumbnails>
</rdf:Description>
<rdf:Description rdf:about=""
- xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#">
- <xapMM:DocumentID>uuid:89B13A64E5D9DE11BB37992E5642CB24</xapMM:DocumentID>
- <xapMM:InstanceID>uuid:bce40ba9-528e-1a48-b1a0-2636e427f460</xapMM:InstanceID>
- <xapMM:DerivedFrom rdf:parseType="Resource">
+ <xmpMM:DocumentID>uuid:89B13A64E5D9DE11BB37992E5642CB24</xmpMM:DocumentID>
+ <xmpMM:InstanceID>uuid:c9fc39ea-7338-234e-90fd-9c707322e008</xmpMM:InstanceID>
+ <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass>
+ <xmpMM:DerivedFrom rdf:parseType="Resource">
<stRef:instanceID>uuid:1052650b-0efc-4cb2-a32e-387095575b05</stRef:instanceID>
<stRef:documentID>uuid:6120892493BFDB11914A8590D31508C8</stRef:documentID>
- </xapMM:DerivedFrom>
+ </xmpMM:DerivedFrom>
</rdf:Description>
<rdf:Description rdf:about=""
xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
@@ -46,517 +47,517 @@
<illustrator:StartupProfile>Print</illustrator:StartupProfile>
</rdf:Description>
<rdf:Description rdf:about=""
- xmlns:xapTPg="http://ns.adobe.com/xap/1.0/t/pg/"
+ xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/"
xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#"
xmlns:stFnt="http://ns.adobe.com/xap/1.0/sType/Font#"
- xmlns:xapG="http://ns.adobe.com/xap/1.0/g/">
- <xapTPg:NPages>1</xapTPg:NPages>
- <xapTPg:HasVisibleTransparency>False</xapTPg:HasVisibleTransparency>
- <xapTPg:HasVisibleOverprint>False</xapTPg:HasVisibleOverprint>
- <xapTPg:MaxPageSize rdf:parseType="Resource">
- <stDim:w>841.889771</stDim:w>
- <stDim:h>595.275574</stDim:h>
+ xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/">
+ <xmpTPg:NPages>1</xmpTPg:NPages>
+ <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency>
+ <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint>
+ <xmpTPg:MaxPageSize rdf:parseType="Resource">
+ <stDim:w>841.889648</stDim:w>
+ <stDim:h>595.275391</stDim:h>
<stDim:unit>Pixels</stDim:unit>
- </xapTPg:MaxPageSize>
- <xapTPg:Fonts>
+ </xmpTPg:MaxPageSize>
+ <xmpTPg:Fonts>
<rdf:Bag>
<rdf:li rdf:parseType="Resource">
<stFnt:fontName>MyriadPro-Regular</stFnt:fontName>
<stFnt:fontFamily>Myriad Pro</stFnt:fontFamily>
<stFnt:fontFace>Regular</stFnt:fontFace>
<stFnt:fontType>Open Type</stFnt:fontType>
- <stFnt:versionString>Version 2.007;PS 002.000;Core 1.0.38;makeotf.lib1.7.9032</stFnt:versionString>
+ <stFnt:versionString>Version 2.062;PS 2.000;hotconv 1.0.57;makeotf.lib2.0.21895</stFnt:versionString>
<stFnt:composite>False</stFnt:composite>
<stFnt:fontFileName>MyriadPro-Regular.otf</stFnt:fontFileName>
</rdf:li>
</rdf:Bag>
- </xapTPg:Fonts>
- <xapTPg:PlateNames>
+ </xmpTPg:Fonts>
+ <xmpTPg:PlateNames>
<rdf:Seq>
<rdf:li>Cyan</rdf:li>
<rdf:li>Magenta</rdf:li>
<rdf:li>Yellow</rdf:li>
<rdf:li>Black</rdf:li>
</rdf:Seq>
- </xapTPg:PlateNames>
- <xapTPg:SwatchGroups>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
- <xapG:groupName>Default Swatch Group</xapG:groupName>
- <xapG:groupType>0</xapG:groupType>
- <xapG:Colorants>
+ <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>White</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>255</xapG:red>
- <xapG:green>255</xapG:green>
- <xapG:blue>255</xapG:blue>
+ <xmpG:swatchName>White</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>255</xmpG:green>
+ <xmpG:blue>255</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>Black</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>35</xapG:red>
- <xapG:green>31</xapG:green>
- <xapG:blue>32</xapG:blue>
+ <xmpG:swatchName>Black</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>35</xmpG:red>
+ <xmpG:green>31</xmpG:green>
+ <xmpG:blue>32</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>CMYK Red</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>236</xapG:red>
- <xapG:green>28</xapG:green>
- <xapG:blue>36</xapG:blue>
+ <xmpG:swatchName>CMYK Red</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>236</xmpG:red>
+ <xmpG:green>28</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>CMYK Yellow</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>255</xapG:red>
- <xapG:green>241</xapG:green>
- <xapG:blue>0</xapG:blue>
+ <xmpG:swatchName>CMYK Yellow</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>255</xmpG:red>
+ <xmpG:green>241</xmpG:green>
+ <xmpG:blue>0</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>CMYK Green</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>0</xapG:red>
- <xapG:green>165</xapG:green>
- <xapG:blue>81</xapG:blue>
+ <xmpG:swatchName>CMYK Green</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>165</xmpG:green>
+ <xmpG:blue>81</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>CMYK Cyan</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>0</xapG:red>
- <xapG:green>173</xapG:green>
- <xapG:blue>238</xapG:blue>
+ <xmpG:swatchName>CMYK Cyan</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>173</xmpG:green>
+ <xmpG:blue>238</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>CMYK Blue</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>46</xapG:red>
- <xapG:green>49</xapG:green>
- <xapG:blue>145</xapG:blue>
+ <xmpG:swatchName>CMYK Blue</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>46</xmpG:red>
+ <xmpG:green>49</xmpG:green>
+ <xmpG:blue>145</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>CMYK Magenta</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>235</xapG:red>
- <xapG:green>0</xapG:green>
- <xapG:blue>139</xapG:blue>
+ <xmpG:swatchName>CMYK Magenta</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>235</xmpG:red>
+ <xmpG:green>0</xmpG:green>
+ <xmpG:blue>139</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=16 M=98 Y=92 K=7</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>194</xapG:red>
- <xapG:green>39</xapG:green>
- <xapG:blue>45</xapG:blue>
+ <xmpG:swatchName>C=16 M=98 Y=92 K=7</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>194</xmpG:red>
+ <xmpG:green>39</xmpG:green>
+ <xmpG:blue>45</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=0 M=99 Y=97 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>236</xapG:red>
- <xapG:green>32</xapG:green>
- <xapG:blue>39</xapG:blue>
+ <xmpG:swatchName>C=0 M=99 Y=97 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>236</xmpG:red>
+ <xmpG:green>32</xmpG:green>
+ <xmpG:blue>39</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=0 M=79 Y=96 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>240</xapG:red>
- <xapG:green>92</xapG:green>
- <xapG:blue>39</xapG:blue>
+ <xmpG:swatchName>C=0 M=79 Y=96 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>240</xmpG:red>
+ <xmpG:green>92</xmpG:green>
+ <xmpG:blue>39</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=0 M=50 Y=98 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>246</xapG:red>
- <xapG:green>146</xapG:green>
- <xapG:blue>33</xapG:blue>
+ <xmpG:swatchName>C=0 M=50 Y=98 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>246</xmpG:red>
+ <xmpG:green>146</xmpG:green>
+ <xmpG:blue>33</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=0 M=35 Y=87 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>250</xapG:red>
- <xapG:green>175</xapG:green>
- <xapG:blue>59</xapG:blue>
+ <xmpG:swatchName>C=0 M=35 Y=87 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>250</xmpG:red>
+ <xmpG:green>175</xmpG:green>
+ <xmpG:blue>59</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=5 M=0 Y=93 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>249</xapG:red>
- <xapG:green>236</xapG:green>
- <xapG:blue>35</xapG:blue>
+ <xmpG:swatchName>C=5 M=0 Y=93 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>249</xmpG:red>
+ <xmpG:green>236</xmpG:green>
+ <xmpG:blue>35</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=19 M=0 Y=98 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>216</xapG:red>
- <xapG:green>223</xapG:green>
- <xapG:blue>39</xapG:blue>
+ <xmpG:swatchName>C=19 M=0 Y=98 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>216</xmpG:red>
+ <xmpG:green>223</xmpG:green>
+ <xmpG:blue>39</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=50 M=0 Y=99 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>139</xapG:red>
- <xapG:green>197</xapG:green>
- <xapG:blue>64</xapG:blue>
+ <xmpG:swatchName>C=50 M=0 Y=99 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>139</xmpG:red>
+ <xmpG:green>197</xmpG:green>
+ <xmpG:blue>64</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=74 M=0 Y=99 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>61</xapG:red>
- <xapG:green>180</xapG:green>
- <xapG:blue>74</xapG:blue>
+ <xmpG:swatchName>C=74 M=0 Y=99 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>61</xmpG:red>
+ <xmpG:green>180</xmpG:green>
+ <xmpG:blue>74</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=86 M=12 Y=100 K=9</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>0</xapG:red>
- <xapG:green>146</xapG:green>
- <xapG:blue>69</xapG:blue>
+ <xmpG:swatchName>C=86 M=12 Y=100 K=9</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>146</xmpG:green>
+ <xmpG:blue>69</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=88 M=28 Y=95 K=32</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>0</xapG:red>
- <xapG:green>104</xapG:green>
- <xapG:blue>55</xapG:blue>
+ <xmpG:swatchName>C=88 M=28 Y=95 K=32</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>104</xmpG:green>
+ <xmpG:blue>55</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=76 M=0 Y=75 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>34</xapG:red>
- <xapG:green>180</xapG:green>
- <xapG:blue>115</xapG:blue>
+ <xmpG:swatchName>C=76 M=0 Y=75 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>34</xmpG:red>
+ <xmpG:green>180</xmpG:green>
+ <xmpG:blue>115</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=78 M=9 Y=46 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>3</xapG:red>
- <xapG:green>168</xapG:green>
- <xapG:blue>156</xapG:blue>
+ <xmpG:swatchName>C=78 M=9 Y=46 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>3</xmpG:red>
+ <xmpG:green>168</xmpG:green>
+ <xmpG:blue>156</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=70 M=15 Y=0 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>37</xapG:red>
- <xapG:green>169</xapG:green>
- <xapG:blue>224</xapG:blue>
+ <xmpG:swatchName>C=70 M=15 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>37</xmpG:red>
+ <xmpG:green>169</xmpG:green>
+ <xmpG:blue>224</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=87 M=52 Y=0 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>16</xapG:red>
- <xapG:green>114</xapG:green>
- <xapG:blue>185</xapG:blue>
+ <xmpG:swatchName>C=87 M=52 Y=0 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>16</xmpG:red>
+ <xmpG:green>114</xmpG:green>
+ <xmpG:blue>185</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=99 M=96 Y=4 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>46</xapG:red>
- <xapG:green>55</xapG:green>
- <xapG:blue>143</xapG:blue>
+ <xmpG:swatchName>C=99 M=96 Y=4 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>46</xmpG:red>
+ <xmpG:green>55</xmpG:green>
+ <xmpG:blue>143</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=100 M=100 Y=26 K=25</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>38</xapG:red>
- <xapG:green>34</xapG:green>
- <xapG:blue>97</xapG:blue>
+ <xmpG:swatchName>C=100 M=100 Y=26 K=25</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>38</xmpG:red>
+ <xmpG:green>34</xmpG:green>
+ <xmpG:blue>97</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=74 M=98 Y=1 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>103</xapG:red>
- <xapG:green>48</xapG:green>
- <xapG:blue>144</xapG:blue>
+ <xmpG:swatchName>C=74 M=98 Y=1 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>103</xmpG:red>
+ <xmpG:green>48</xmpG:green>
+ <xmpG:blue>144</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=49 M=99 Y=1 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>146</xapG:red>
- <xapG:green>41</xapG:green>
- <xapG:blue>141</xapG:blue>
+ <xmpG:swatchName>C=49 M=99 Y=1 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>146</xmpG:red>
+ <xmpG:green>41</xmpG:green>
+ <xmpG:blue>141</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=34 M=100 Y=37 K=11</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>157</xapG:red>
- <xapG:green>30</xapG:green>
- <xapG:blue>96</xapG:blue>
+ <xmpG:swatchName>C=34 M=100 Y=37 K=11</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>157</xmpG:red>
+ <xmpG:green>30</xmpG:green>
+ <xmpG:blue>96</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=12 M=100 Y=49 K=1</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>211</xapG:red>
- <xapG:green>28</xapG:green>
- <xapG:blue>92</xapG:blue>
+ <xmpG:swatchName>C=12 M=100 Y=49 K=1</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>211</xmpG:red>
+ <xmpG:green>28</xmpG:green>
+ <xmpG:blue>92</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=0 M=96 Y=20 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>236</xapG:red>
- <xapG:green>37</xapG:green>
- <xapG:blue>122</xapG:blue>
+ <xmpG:swatchName>C=0 M=96 Y=20 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>236</xmpG:red>
+ <xmpG:green>37</xmpG:green>
+ <xmpG:blue>122</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=23 M=27 Y=40 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>198</xapG:red>
- <xapG:green>178</xapG:green>
- <xapG:blue>152</xapG:blue>
+ <xmpG:swatchName>C=23 M=27 Y=40 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>198</xmpG:red>
+ <xmpG:green>178</xmpG:green>
+ <xmpG:blue>152</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=40 M=43 Y=52 K=7</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>152</xapG:red>
- <xapG:green>133</xapG:green>
- <xapG:blue>118</xapG:blue>
+ <xmpG:swatchName>C=40 M=43 Y=52 K=7</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>152</xmpG:red>
+ <xmpG:green>133</xmpG:green>
+ <xmpG:blue>118</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=50 M=53 Y=61 K=23</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>117</xapG:red>
- <xapG:green>101</xapG:green>
- <xapG:blue>88</xapG:blue>
+ <xmpG:swatchName>C=50 M=53 Y=61 K=23</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>117</xmpG:red>
+ <xmpG:green>101</xmpG:green>
+ <xmpG:blue>88</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=57 M=60 Y=64 K=42</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>85</xapG:red>
- <xapG:green>72</xapG:green>
- <xapG:blue>65</xapG:blue>
+ <xmpG:swatchName>C=57 M=60 Y=64 K=42</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>85</xmpG:red>
+ <xmpG:green>72</xmpG:green>
+ <xmpG:blue>65</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=23 M=38 Y=63 K=1</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>197</xapG:red>
- <xapG:green>156</xapG:green>
- <xapG:blue>110</xapG:blue>
+ <xmpG:swatchName>C=23 M=38 Y=63 K=1</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>197</xmpG:red>
+ <xmpG:green>156</xmpG:green>
+ <xmpG:blue>110</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=32 M=49 Y=74 K=10</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>165</xapG:red>
- <xapG:green>124</xapG:green>
- <xapG:blue>82</xapG:blue>
+ <xmpG:swatchName>C=32 M=49 Y=74 K=10</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>165</xmpG:red>
+ <xmpG:green>124</xmpG:green>
+ <xmpG:blue>82</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=36 M=57 Y=84 K=23</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>139</xapG:red>
- <xapG:green>99</xapG:green>
- <xapG:blue>57</xapG:blue>
+ <xmpG:swatchName>C=36 M=57 Y=84 K=23</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>139</xmpG:red>
+ <xmpG:green>99</xmpG:green>
+ <xmpG:blue>57</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=39 M=64 Y=93 K=36</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>117</xapG:red>
- <xapG:green>77</xapG:green>
- <xapG:blue>36</xapG:blue>
+ <xmpG:swatchName>C=39 M=64 Y=93 K=36</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>117</xmpG:red>
+ <xmpG:green>77</xmpG:green>
+ <xmpG:blue>36</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=41 M=70 Y=96 K=49</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>97</xapG:red>
- <xapG:green>57</xapG:green>
- <xapG:blue>23</xapG:blue>
+ <xmpG:swatchName>C=41 M=70 Y=96 K=49</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>97</xmpG:red>
+ <xmpG:green>57</xmpG:green>
+ <xmpG:blue>23</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=47 M=73 Y=83 K=68</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>65</xapG:red>
- <xapG:green>35</xapG:green>
- <xapG:blue>18</xapG:blue>
+ <xmpG:swatchName>C=47 M=73 Y=83 K=68</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>65</xmpG:red>
+ <xmpG:green>35</xmpG:green>
+ <xmpG:blue>18</xmpG:blue>
</rdf:li>
</rdf:Seq>
- </xapG:Colorants>
+ </xmpG:Colorants>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:groupName>Print Color Group</xapG:groupName>
- <xapG:groupType>1</xapG:groupType>
- <xapG:Colorants>
+ <xmpG:groupName>Print Color Group</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=2 M=28 Y=72 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>246</xapG:red>
- <xapG:green>187</xapG:green>
- <xapG:blue>96</xapG:blue>
+ <xmpG:swatchName>C=2 M=28 Y=72 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>246</xmpG:red>
+ <xmpG:green>187</xmpG:green>
+ <xmpG:blue>96</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=5 M=70 Y=90 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>231</xapG:red>
- <xapG:green>110</xapG:green>
- <xapG:blue>52</xapG:blue>
+ <xmpG:swatchName>C=5 M=70 Y=90 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>231</xmpG:red>
+ <xmpG:green>110</xmpG:green>
+ <xmpG:blue>52</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=4 M=92 Y=77 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>229</xapG:red>
- <xapG:green>59</xapG:green>
- <xapG:blue>65</xapG:blue>
+ <xmpG:swatchName>C=4 M=92 Y=77 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>229</xmpG:red>
+ <xmpG:green>59</xmpG:green>
+ <xmpG:blue>65</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=29 M=2 Y=92 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>191</xapG:red>
- <xapG:green>210</xapG:green>
- <xapG:blue>65</xapG:blue>
+ <xmpG:swatchName>C=29 M=2 Y=92 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>191</xmpG:red>
+ <xmpG:green>210</xmpG:green>
+ <xmpG:blue>65</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=62 M=4 Y=93 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>109</xapG:red>
- <xapG:green>182</xapG:green>
- <xapG:blue>78</xapG:blue>
+ <xmpG:swatchName>C=62 M=4 Y=93 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>109</xmpG:red>
+ <xmpG:green>182</xmpG:green>
+ <xmpG:blue>78</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=30 M=2 Y=7 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>174</xapG:red>
- <xapG:green>218</xapG:green>
- <xapG:blue>230</xapG:blue>
+ <xmpG:swatchName>C=30 M=2 Y=7 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>174</xmpG:red>
+ <xmpG:green>218</xmpG:green>
+ <xmpG:blue>230</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=60 M=8 Y=5 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>85</xapG:red>
- <xapG:green>185</xapG:green>
- <xapG:blue>223</xapG:blue>
+ <xmpG:swatchName>C=60 M=8 Y=5 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>85</xmpG:red>
+ <xmpG:green>185</xmpG:green>
+ <xmpG:blue>223</xmpG:blue>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>C=78 M=4 Y=11 K=0</xapG:swatchName>
- <xapG:mode>RGB</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:red>0</xapG:red>
- <xapG:green>178</xapG:green>
- <xapG:blue>215</xapG:blue>
+ <xmpG:swatchName>C=78 M=4 Y=11 K=0</xmpG:swatchName>
+ <xmpG:mode>RGB</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:red>0</xmpG:red>
+ <xmpG:green>178</xmpG:green>
+ <xmpG:blue>215</xmpG:blue>
</rdf:li>
</rdf:Seq>
- </xapG:Colorants>
+ </xmpG:Colorants>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:groupName>Grayscale</xapG:groupName>
- <xapG:groupType>1</xapG:groupType>
- <xapG:Colorants>
+ <xmpG:groupName>Grayscale</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
<rdf:Seq>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=100</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>255</xapG:gray>
+ <xmpG:swatchName>K=100</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>255</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=90</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>229</xapG:gray>
+ <xmpG:swatchName>K=90</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>229</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=80</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>203</xapG:gray>
+ <xmpG:swatchName>K=80</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>203</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=70</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>178</xapG:gray>
+ <xmpG:swatchName>K=70</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>178</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=60</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>152</xapG:gray>
+ <xmpG:swatchName>K=60</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>152</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=50</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>127</xapG:gray>
+ <xmpG:swatchName>K=50</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>127</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=40</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>101</xapG:gray>
+ <xmpG:swatchName>K=40</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>101</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=30</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>76</xapG:gray>
+ <xmpG:swatchName>K=30</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>76</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=20</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>50</xapG:gray>
+ <xmpG:swatchName>K=20</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>50</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=10</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>25</xapG:gray>
+ <xmpG:swatchName>K=10</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>25</xmpG:gray>
</rdf:li>
<rdf:li rdf:parseType="Resource">
- <xapG:swatchName>K=5</xapG:swatchName>
- <xapG:mode>GRAY</xapG:mode>
- <xapG:type>PROCESS</xapG:type>
- <xapG:gray>12</xapG:gray>
+ <xmpG:swatchName>K=5</xmpG:swatchName>
+ <xmpG:mode>GRAY</xmpG:mode>
+ <xmpG:type>PROCESS</xmpG:type>
+ <xmpG:gray>12</xmpG:gray>
</rdf:li>
</rdf:Seq>
- </xapG:Colorants>
+ </xmpG:Colorants>
</rdf:li>
</rdf:Seq>
- </xapTPg:SwatchGroups>
+ </xmpTPg:SwatchGroups>
</rdf:Description>
</rdf:RDF>
</x:xmpmeta>
@@ -581,38 +582,26 @@
-<?xpacket end="w"?> endstream endobj 2 0 obj <</Count 1/Type/Pages/Kids[5 0 R]>> endobj 15 0 obj <</Intent 16 0 R/Usage 17 0 R/Name(Class)/Type/OCG>> endobj 27 0 obj <</Intent 28 0 R/Usage 29 0 R/Name(Package)/Type/OCG>> endobj 37 0 obj <</Intent 38 0 R/Usage 39 0 R/Name(Object)/Type/OCG>> endobj 65 0 obj <</Intent 66 0 R/Usage 67 0 R/Name(Class)/Type/OCG>> endobj 78 0 obj <</Intent 79 0 R/Usage 80 0 R/Name(Package)/Type/OCG>> endobj 90 0 obj <</Intent 91 0 R/Usage 92 0 R/Name(Object)/Type/OCG>> endobj 116 0 obj <</Intent 117 0 R/Usage 118 0 R/Name(Class)/Type/OCG>> endobj 129 0 obj <</Intent 130 0 R/Usage 131 0 R/Name(Package)/Type/OCG>> endobj 141 0 obj <</Intent 142 0 R/Usage 143 0 R/Name(Object)/Type/OCG>> endobj 167 0 obj <</Intent 168 0 R/Usage 169 0 R/Name(Class)/Type/OCG>> endobj 180 0 obj <</Intent 181 0 R/Usage 182 0 R/Name(Package)/Type/OCG>> endobj 192 0 obj <</Intent 193 0 R/Usage 194 0 R/Name(Object)/Type/OCG>> endobj 218 0 obj <</Intent 219 0 R/Usage 220 0 R/Name(Class)/Type/OCG>> endobj 237 0 obj <</Intent 238 0 R/Usage 239 0 R/Name(Package)/Type/OCG>> endobj 255 0 obj <</Intent 256 0 R/Usage 257 0 R/Name(Object)/Type/OCG>> endobj 287 0 obj <</Intent 288 0 R/Usage 289 0 R/Name(Class)/Type/OCG>> endobj 306 0 obj <</Intent 307 0 R/Usage 308 0 R/Name(Package)/Type/OCG>> endobj 324 0 obj <</Intent 325 0 R/Usage 326 0 R/Name(Object)/Type/OCG>> endobj 356 0 obj <</Intent 357 0 R/Usage 358 0 R/Name(Class)/Type/OCG>> endobj 375 0 obj <</Intent 376 0 R/Usage 377 0 R/Name(Package)/Type/OCG>> endobj 393 0 obj <</Intent 394 0 R/Usage 395 0 R/Name(Object)/Type/OCG>> endobj 425 0 obj <</Intent 426 0 R/Usage 427 0 R/Name(Class)/Type/OCG>> endobj 444 0 obj <</Intent 445 0 R/Usage 446 0 R/Name(Trait)/Type/OCG>> endobj 462 0 obj <</Intent 463 0 R/Usage 464 0 R/Name(Package)/Type/OCG>> endobj 480 0 obj <</Intent 481 0 R/Usage 482 0 R/Name(Object)/Type/OCG>> endobj 515 0 obj <</Intent 516 0 R/Usage 517 0 R/Name(Class)/Type/OCG>> endobj 534 0 obj <</Intent 535 0 R/Usage 536 0 R/Name(Trait)/Type/OCG>> endobj 552 0 obj <</Intent 553 0 R/Usage 554 0 R/Name(Package)/Type/OCG>> endobj 570 0 obj <</Intent 571 0 R/Usage 572 0 R/Name(Object)/Type/OCG>> endobj 605 0 obj <</Intent 606 0 R/Usage 607 0 R/Name(Class)/Type/OCG>> endobj 624 0 obj <</Intent 625 0 R/Usage 626 0 R/Name(Trait)/Type/OCG>> endobj 642 0 obj <</Intent 643 0 R/Usage 644 0 R/Name(Package)/Type/OCG>> endobj 660 0 obj <</Intent 661 0 R/Usage 662 0 R/Name(Object)/Type/OCG>> endobj 695 0 obj <</Intent 696 0 R/Usage 697 0 R/Name(Base)/Type/OCG>> endobj 699 0 obj <</Intent 700 0 R/Usage 701 0 R/Name(Class)/Type/OCG>> endobj 718 0 obj <</Intent 719 0 R/Usage 720 0 R/Name(Trait)/Type/OCG>> endobj 735 0 obj <</Intent 736 0 R/Usage 737 0 R/Name(Package)/Type/OCG>> endobj 753 0 obj <</Intent 754 0 R/Usage 755 0 R/Name(Object)/Type/OCG>> endobj 785 0 obj <</Intent 786 0 R/Usage 787 0 R/Name(Base)/Type/OCG>> endobj 789 0 obj <</Intent 790 0 R/Usage 791 0 R/Name(Class)/Type/OCG>> endobj 808 0 obj <</Intent 809 0 R/Usage 810 0 R/Name(Trait)/Type/OCG>> endobj 825 0 obj <</Intent 826 0 R/Usage 827 0 R/Name(Package)/Type/OCG>> endobj 843 0 obj <</Intent 844 0 R/Usage 845 0 R/Name(Object)/Type/OCG>> endobj 878 0 obj <</Intent 879 0 R/Usage 880 0 R/Name(Base)/Type/OCG>> endobj 882 0 obj <</Intent 883 0 R/Usage 884 0 R/Name(Class)/Type/OCG>> endobj 901 0 obj <</Intent 902 0 R/Usage 903 0 R/Name(Trait)/Type/OCG>> endobj 918 0 obj <</Intent 919 0 R/Usage 920 0 R/Name(Package)/Type/OCG>> endobj 936 0 obj <</Intent 937 0 R/Usage 938 0 R/Name(Object)/Type/OCG>> endobj 971 0 obj <</Intent 972 0 R/Usage 973 0 R/Name(Base)/Type/OCG>> endobj 975 0 obj <</Intent 976 0 R/Usage 977 0 R/Name(Class)/Type/OCG>> endobj 994 0 obj <</Intent 995 0 R/Usage 996 0 R/Name(Trait)/Type/OCG>> endobj 1011 0 obj <</Intent 1012 0 R/Usage 1013 0 R/Name(Package)/Type/OCG>> endobj 1029 0 obj <</Intent 1030 0 R/Usage 1031 0 R/Name(Object)/Type/OCG>> endobj 1030 0 obj [/View/Design] endobj 1031 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 1012 0 obj [/View/Design] endobj 1013 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 995 0 obj [/View/Design] endobj 996 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 976 0 obj [/View/Design] endobj 977 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 972 0 obj [/View/Design] endobj 973 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 937 0 obj [/View/Design] endobj 938 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 919 0 obj [/View/Design] endobj 920 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 902 0 obj [/View/Design] endobj 903 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 883 0 obj [/View/Design] endobj 884 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 879 0 obj [/View/Design] endobj 880 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 844 0 obj [/View/Design] endobj 845 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 826 0 obj [/View/Design] endobj 827 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 809 0 obj [/View/Design] endobj 810 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 790 0 obj [/View/Design] endobj 791 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 786 0 obj [/View/Design] endobj 787 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 754 0 obj [/View/Design] endobj 755 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 736 0 obj [/View/Design] endobj 737 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 719 0 obj [/View/Design] endobj 720 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 700 0 obj [/View/Design] endobj 701 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 696 0 obj [/View/Design] endobj 697 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 661 0 obj [/View/Design] endobj 662 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 643 0 obj [/View/Design] endobj 644 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 625 0 obj [/View/Design] endobj 626 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 606 0 obj [/View/Design] endobj 607 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 571 0 obj [/View/Design] endobj 572 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 553 0 obj [/View/Design] endobj 554 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 535 0 obj [/View/Design] endobj 536 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 516 0 obj [/View/Design] endobj 517 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 481 0 obj [/View/Design] endobj 482 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 463 0 obj [/View/Design] endobj 464 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 445 0 obj [/View/Design] endobj 446 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 426 0 obj [/View/Design] endobj 427 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 394 0 obj [/View/Design] endobj 395 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 376 0 obj [/View/Design] endobj 377 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 357 0 obj [/View/Design] endobj 358 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 325 0 obj [/View/Design] endobj 326 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 307 0 obj [/View/Design] endobj 308 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 288 0 obj [/View/Design] endobj 289 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 256 0 obj [/View/Design] endobj 257 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 238 0 obj [/View/Design] endobj 239 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 219 0 obj [/View/Design] endobj 220 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 193 0 obj [/View/Design] endobj 194 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 181 0 obj [/View/Design] endobj 182 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 168 0 obj [/View/Design] endobj 169 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 142 0 obj [/View/Design] endobj 143 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 130 0 obj [/View/Design] endobj 131 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 117 0 obj [/View/Design] endobj 118 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 91 0 obj [/View/Design] endobj 92 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 79 0 obj [/View/Design] endobj 80 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 66 0 obj [/View/Design] endobj 67 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 38 0 obj [/View/Design] endobj 39 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 28 0 obj [/View/Design] endobj 29 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 16 0 obj [/View/Design] endobj 17 0 obj <</CreatorInfo<</Subtype/Artwork/Creator(Adobe Illustrator 13.0)>>>> endobj 970 0 obj [1029 0 R 1011 0 R 994 0 R 975 0 R 971 0 R] endobj 5 0 obj <</CropBox[321.5 204.775 334.5 217.775]/Parent 2 0 R/Contents 1048 0 R/BleedBox[0.0 0.0 841.89 595.276]/PieceInfo<</Illustrator 962 0 R>>/ArtBox[321.5 204.775 334.5 217.775]/MediaBox[0.0 0.0 841.89 595.276]/Thumb 1053 0 R/TrimBox[0.0 0.0 841.89 595.276]/Resources<</XObject<</Fm0 986 0 R/Fm1 993 0 R/Fm2 1003 0 R/Fm3 1010 0 R/Fm4 1020 0 R/Fm5 1028 0 R/Fm6 1038 0 R/Fm7 1045 0 R>>/ColorSpace<</CS0 982 0 R>>/Font<</T1_0 1046 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 971 0 R/MC1 975 0 R/MC2 994 0 R/MC3 1011 0 R/MC4 1029 0 R>>/ExtGState<</GS0 978 0 R>>>>/Type/Page/LastModified(D:20100413200510+02'00')>> endobj 1048 0 obj <</Length 1948/Filter/FlateDecode>>stream
-H‰ÌWËŽ5Ý÷Wx™,®Çå··L
-ZÖíÿu¹ÄÐgIIy_±ã<¾+i,¼}pë:§Œ¿.ï öP—ÎØ5•æmØW±!¥´«{[°£
-ûYì$ÖC«je ¹g±-´uÊG+ÒL„S×±[SãÒAðÞ¡°j}l6
-w" )lÞ |IsZ±ƒ¢66]#Ì
-Piæñ6y†ÉK° †Ý¢±ß
-rHv”ËÆÐÄF’5 nZ¦1’¤”u\•î˜ÄI&b,p]4MV˜˜˜cœuÔ“ ãP´ÞÀÀœF%÷Ì :HÜÁÙQë‰4¨ò> ÷G!æišeH„¾¶éZ `Ãcõ
-H¶CŸá’:P«Ûzì Ž¾þ˜²må9cÄfwó§ s@Èð~¾0‡æð_f²p. ….7–ªdCõ¨¯¥^"'€ýù@Ó"¤2’L¯ü\BaËPp¯p]zòÐ&à‘¿—µL X‘¢EpÒïdüã„Àsômš»¥ì“¢Åxf†Íœ+ˆìÚ‹C?œÖ ŸU\ó†J³ôµŠ×scàÐ}„»½ÖÕGäl–²EÔ\8ÂK Gì.%C´:¨wHº'¥øœ7Ê ”ŠL'é%Jq¸z”k¦dÇ5m^4ÄÅsª_›025úèL¹íÇtˤðEi}†‚oH+%Ç#·×@ïŠÆ•>".wbì˜w ]NÈ`ͨiçÁ9ıgEÊÈ„C€f¼CΔÛNAÙ@ (K£Z Ú1‘šÚµcêq¤ð,°çG†3* ðÉWµGá
-6&-Ñ£´Y픪ç6 ¨¬ÌœJCÆL™ì»”t¤ ÀRõÒ±ú…7QX¥Î”î)çȸÀÓ¡nÒ¡Áb”‘{;¦Œ#å¦6‹qâÁ©Ä'Ý¥ÑBÖfž2N”ÛN¬$Ý3¢1•ô´›¾.g
-õ€´¼¯‘ÊÆ«ÛcöËUóñùË; ñÇRùÜ£`|²Âü‹»îx¼éÂKsuÄuϦ½pD ýÔ)>l”›R„ gmÚ‰’‚vÒ·3…}({j\"Š W O(ŽMä™r›((sMÆƱÅg)a´#¤°×:RJ¥8¶¶¼ÄÈ•Í-uÁ=¬옺)”vkâ@Ñr}Wv¾;Fš—¬Ž”ÛD‰‰YºÉ"›ov\, w-f
-eÀ!L<8“ØUoÎλvkºŠ]GîLxg‘‚bgv &›R;à2$ìx¶xÆ…˜N”Tg l3ûÝ#|XʪÕD^kE½ï‡V­%ÅIe@ÛT7|]Δ›ÚKšŸx OòºKËGìò0ðD¸M\[±)‡ðz®Ðy¶Û¿ãër¦ô“´™ïÍ•¨î?;äŸj"Ëi.ªÞGMr¿qÑ)ióµþÓö_'X(ü¶L|¯øJ_¦LãGA,)}Á^ç¾+¾´ïʽ²|ºBz${E» ×íóO‚ø¢
-ÿ«
-ù¬oH*U zE';«‹øhÐñ3žgÑn/µëRôÝ×ÜÀå pÄMùe#fP'Q¬
-8Éͯvù:¢—ÚÐÒó¹Ë&?`óø&Cw`„×}ëa¾Ù´i7¼6|F£†9¾5i#… g¦ºx;.¾s7íÀM;ª(Ϥc* Žr~g ê^±( ›xw ‡‹ÃSß/ýi‚^Êo€æÉiškMŸ| uàtŽ´•DÓÌu»¤UŽÊ@Ž‹˜ÝÚ‘ï?P\æË¡#¾Wðj‚­CÕ”s\Ñoè3«¡3 ¼¾ðW7¡Z³†¢ýEæðé|ý¸Êäm¶¢®Hg™UœRøÛå/
-8;Xnf&7>J<fDsP~> endstream endobj 978 0 obj <</OPM 1/BM/Normal/CA 1.0/OP false/SMask/None/ca 1.0/AIS false/op false/Type/ExtGState/SA true>> endobj 1046 0 obj <</Subtype/Type1/FontDescriptor 1047 0 R/LastChar 102/Widths[513 513 0 513 513 513 0 513 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 448 564 501 292]/BaseFont/XAMDXC+MyriadPro-Regular/FirstChar 49/Encoding/WinAnsiEncoding/Type/Font>> endobj 1047 0 obj <</StemV 88/FontName/XAMDXC+MyriadPro-Regular/FontStretch/Normal/FontFile3 1050 0 R/FontWeight 400/Flags 32/Descent -250/FontBBox[-157 -250 1126 952]/Ascent 952/FontFamily(Myriad Pro)/CapHeight 674/XHeight 484/Type/FontDescriptor/ItalicAngle 0>> endobj 1050 0 obj <</Subtype/Type1C/Length 1212/Filter/FlateDecode>>stream
-H‰|SmPg¾#\N„¦-ñMìÝY-àH‘BR?
-((ØH%t´sÚ LÔŠšv¦-„ X~P¨"ZGT§„ŠZÔ"ÅX$ÊHüK;ô{ñÍŒ½Øÿý³»Ïûì³ûî;ïâXh†ãø¬‚ô¼Ì‚Œy;M^e2¾ŸÏm)+Ñ™‚$ÃËq~f(?;‚B ÇË—/s ¨}¾}yvè¹H,ÇžÎ0–
-Ú-Ÿ[ØÄ„„„¸ U°¯2]o,âXõN³…Ûffs¶o2šJ&…Ódzé%%l~Pffó93g*jâÕñ¬JHØna3JEœ2%1þ¿«±3«cM܃PÍÄéY‹I§ç¶éL[Yãfö:-\®þdg)Ǧ°zn3†áX$ŽQ!Ø, ËaáÂ#`yX)Ö…ùñ|¼/duˆ3ä•H-Ú7UÓÃOöà‚×#ª å«üª@•¨BË`ÏĈE½A ž ˆ7¼Ža°˜¿D#D’#åü€·¦"¬ãÒ3`÷Óibé0z÷£ÃÙ@Ü jÅ’ßàÁŸñ£<èb-y©›€w`æ£Iˆ=Sý‰Ø´UFn}<h;á>qM>yruc›Ÿ–ŒRQâòì™RèYÃp{?èÃ?/
-²ž 'ð±q$ºH"ÖÀ”E"بZ’`GÓ‰CÇ›;g9ÄÕ›Á CÛH‰u:‡ ù~ŸˆÏòÓº)Ö¡ÂÑÚî<#‡¨«'ÛE¦&Eµ¶ùP)]–MTt\¯‘Ãœ©ç õê®´3­›´.­Ü¼»ºº’iƒÅØÅëô BÂ]ü§GÐ"”Vøc©]e¶ïv0‹¾Ê(Ö¬¶jÕúh4C†–>A0 ƒiêDfh E%t•øà ÏÐ-mÎ{“mŠ §Ž¾¨f9ëöÓ?·ºOõÊÇzÕññ¹iŒÄz“ïê<óxå0?\é“z žRRßbCášE²8o*̆·&ï1ªý5õ$í ¥÷îw»vE6–;Š"‘X‘5–zÔêÛú)ê”)Ú¾AóÛùž»Gé Ón‰LêÉ)Ð.¡í¼@ßíЬSmܤþ‚Ik.<= WÏu{h‰Û:Âc¿ãÂØ1)«©xV¾ cB§®{AÔ}ʺ÷Ó<D4˜×7®“£Ä÷†æ£Øç1=ðËá†F‹¬#úr~Ù0l­ˆìôAû„ÔÍÇø )ÔUMž-ÓžN—£é1±HigPÌãX½vþò1ºV,­t&£âªS6÷ï%“Nj·moÕ^ZêÎ٥ѫäqŸŽýõâòý'ƒÝëÕŒÃj¯´Ê$ÿX‡aI?ÌíÇ;‚k\ÄA9eÿ¾ö@“̧%¢9JD¢hí‹…ù÷zè +û‰ÝÅœ5Wžô‘«{?u£þ¬×'ÿ»U¡¶1VXå-HÁ½D°4ŠWBØ-ö#yç‡Á?Úš¾ý¦‘n"ê¿,­/‘}¶gk1S¤¯Ì[!³¬È
-(…ŸéòØ€6¸`¡Ëí
-XêÅüÊ:”[0º.ֵבô‘Y_xvkúDø„3â ~ÿ ~.õ¯
-H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó
- 
-V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó
-€x¯Íú·¶Ò-
-¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9
-N'çÎ)Î].ÂuæJ¸rî
-î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö
-n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯­^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh 8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜I JlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§ §|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK­—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO
-¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ
-/CS0 cs 0.29 0.486 0.133 scn
-1 i
+<?xpacket end="w"?> endstream endobj 2 0 obj <</Count 1/Kids[5 0 R]/Type/Pages>> endobj 5 0 obj <</ArtBox[154.5 205.274 523.59 501.023]/BleedBox[0.0 0.0 841.89 595.275]/Contents 1315 0 R/CropBox[0.0 0.0 841.89 595.275]/LastModified(D:20110404194430+02'00')/MediaBox[0.0 0.0 841.89 595.275]/Parent 2 0 R/PieceInfo<</Illustrator 1316 0 R>>/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/Font<</T1_0 1307 0 R>>/ProcSet[/PDF/Text]/Properties<</MC0 1308 0 R/MC1 1309 0 R/MC2 1310 0 R/MC3 1311 0 R/MC4 1312 0 R/MC5 1313 0 R>>/XObject<</Fm0 1319 0 R/Fm1 1320 0 R/Fm2 1321 0 R/Fm3 1322 0 R/Fm4 1323 0 R/Fm5 1324 0 R/Fm6 1325 0 R/Fm7 1326 0 R>>>>/Thumb 1327 0 R/TrimBox[0.0 0.0 841.89 595.275]/Type/Page>> endobj 1315 0 obj <</Filter/FlateDecode/Length 1961>>stream
+H‰ÌWÉŽ7½çWð(ŠÍ}¹ºå10€f ¨9†e· £ÚÆŒþ˜÷"˜™ÌTÙ² Œ–*ù‚Œ`06þýhÞ>:óÕ›G³|ý?JòJzx|ïÌõ£q¶çŠßæÚø5¯¿,ß`úÇKªÎfº·S—ØlŒÑŒÏÿ~Xž‡!¸ÚƯŒ9ÚPóo0Ž=SZLŒ)T[“Q÷ò)Ý}bŒ­Û”Â]Ưžgø§G|òß9ãÍÓóâ“ñIMvO»'óô²|xu}]^ýð}{N¯¿}ú'$\0›yz³¼ò)ä\^?ýLr±½ ùëç$Lòó)W.>ùD®¯Ÿ¾ ê›ÿbyîY,×’·­›ËŠqÿ˜_dÉËÃ?^œyóëòNÝùøÇáŸyÿø¯%™·$G3Áã/’ÌõE,Áß‹Ï6•„o°9èÙ¶ÿ×咢Β’˾cÇy|WÒX:x•}pë:'Œ?-ï¡öP—îØ5õ=Øäqèм9ç]Ý‹·;1h°ŸÅNÞhÕ¬CîYm}
+ÉzßM‚[×±¶åÎ¥ƒ‚žÂš °Û *Š8€¦°eƒð&ÍiÆŠÚÔegÐ#„j77ˆ·9vL^¢í0„— û @6gÃ6õÐ%ÇBŽÓ¥‚äˆñnk0‰
+]Ûe­±a²±’E¤Cßa(pKÉ(•n=ö…ÉGJY¶òœ1âH*ºúóE:"lxÙÞ/Òñ‹Štü«Šô¡HÄs‘ˆ,~¥³|eG½-í…Tóþ ²@iB„×QAÂÉ-_*A¬ì*®ò®‹‚úrù²–ŒÒµŠÎëÌ€Ÿœ'Ü­E_äq­û¤—^ƒb3ÄÎUDxÓÂàÐÂ
+TÃ>adm‰ôÓ™rÛ)Ž©WHáíŠR{‡‚oÌ+¥¤#·×@•~"®}bìXv ]NÈ`ýhyçÁ9¼c«ŠôñŽšñN9Sn; f%¢D)Få@åc2u±«bêq¤ð,°çÇ;Tà“ÿ®bÊlXz¦Gi³¦”&ç6Œ¨²̼ÊCÆL™ì»Ô|¤ ÈRù^±ø…·R\¥Îõ”sŒd]äéPCé‡Øa1ÊÈÈ¿SÆ‘r›¥4ñàT>dÙ¥ÓB–6Ÿ2N”ÛN¬ìÕ3^b*Ëi7/ |]Îêix_"• ™ÚcöËUròþEž=ÃQc©þ=n‡çQ0>[eþÀ½÷7<ÞË/ÏU-
+ÚÌÐÏö§ìµq¡®\F= wl.Ï”ÛDA¹ë~lœzºK‰£E!…ýבR³ŠcËË ÝØôRÜÉr@ÅÔåH¡ ´`Š—Ó]Ùïé^‹H8Rne
+8;Z]!0oj-o&4Mq#BXZ(r-qRjZg"d;e'fX2?:$%:pb1G;i=ZP,(M5$Ct>Pr+OM%Sb3
+$Z$YM!!)e4pih!i-MB:^dR_nsi+[p*`^+#SD`bS0lt>(HO8LDNEmrh`0uV.i4u*`_
+<QuhYM+[,LK_;/1Bi3D]@_As80$4fVpZLHDB2T:(K_'G0h$g%6n.8p"/JA-b,c&qf
+UbPa<\L=gX;:6"QDSB056Ip4P?@MB$feXFUaj4\dSiP/#U:<PVfi:Gt;qD1sE,nhI
+B.M&9Cj3K\";_P6/u!Kf]tDfDELrplU'e?"h&JBb-edM:j$_i`M&(%OVm&WU5dR#=
+[Sm2,zn4nE;!7($KU&~> endstream endobj 1328 0 obj [/Indexed/DeviceRGB 255 1329 0 R] endobj 1329 0 obj <</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
+b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
+E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
+6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
+VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
+PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
+l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 1319 0 obj <</BBox[155.001 324.272 210.999 268.274]/Group 1330 0 R/Length 283/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1331 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.173 0.522 0.345 scn
/GS0 gs
q 1 0 0 1 183 308.2725 cm
0 0 m
@@ -623,11 +612,11 @@ q 1 0 0 1 183 308.2725 cm
f
Q
q
-/Fm0 Do
+0 g
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
- endstream endobj 993 0 obj <</Subtype/Form/Length 244/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 988 0 R/Resources<</XObject<</Fm0 992 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[180.624 223.274 192.621 211.277]>>stream
-/CS0 cs 0.29 0.486 0.133 scn
-1 i
+ endstream endobj 1320 0 obj <</BBox[180.624 223.274 192.621 211.277]/Group 1332 0 R/Length 296/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1333 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.173 0.522 0.345 scn
/GS0 gs
q 1 0 0 1 186.627 218.2744 cm
0 0 m
@@ -638,11 +627,12 @@ q 1 0 0 1 186.627 218.2744 cm
f
Q
q
-/Fm0 Do
+0 g
+1 w 4 M 0 j 0 J []0 d
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
- endstream endobj 1003 0 obj <</Subtype/Form/Length 258/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 998 0 R/Resources<</XObject<</Fm0 1002 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[306.003 319.277 362.001 263.279]>>stream
-/CS0 cs 0.29 0.486 0.133 scn
-1 i
+ endstream endobj 1321 0 obj <</BBox[306.003 319.277 362.001 263.279]/Group 1334 0 R/Length 287/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1335 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.243 0.533 0.643 scn
/GS0 gs
q 1 0 0 1 334.002 303.2773 cm
0 0 m
@@ -653,11 +643,11 @@ q 1 0 0 1 334.002 303.2773 cm
f
Q
q
-/Fm0 Do
+0 g
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
- endstream endobj 1010 0 obj <</Subtype/Form/Length 247/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1005 0 R/Resources<</XObject<</Fm0 1009 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[321.996 217.271 334.002 205.274]>>stream
-/CS0 cs 0.29 0.486 0.133 scn
-1 i
+ endstream endobj 1322 0 obj <</BBox[321.996 217.271 334.002 205.274]/Group 1336 0 R/Length 298/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1337 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.212 0.624 0.78 scn
/GS0 gs
q 1 0 0 1 327.999 212.2715 cm
0 0 m
@@ -668,11 +658,12 @@ q 1 0 0 1 327.999 212.2715 cm
f
Q
q
-/Fm0 Do
+0 g
+1 w 4 M 0 j 0 J []0 d
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
- endstream endobj 1020 0 obj <</Subtype/Form/Length 262/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1015 0 R/Resources<</XObject<</Fm0 1019 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[295.671 461.774 351.669 405.776]>>stream
+ endstream endobj 1323 0 obj <</BBox[295.671 461.774 351.669 405.776]/Group 1338 0 R/Length 290/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1339 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn
-1 i
/GS0 gs
q 1 0 0 1 323.6699 445.7744 cm
0 0 m
@@ -683,11 +674,11 @@ q 1 0 0 1 323.6699 445.7744 cm
f
Q
q
-/Fm0 Do
+0 g
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
- endstream endobj 1028 0 obj <</Subtype/Form/Length 241/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1023 0 R/Resources<</XObject<</Fm0 1027 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[309.171 492.275 321.168 480.278]>>stream
+ endstream endobj 1324 0 obj <</BBox[309.171 492.275 321.168 480.278]/Group 1340 0 R/Length 292/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1341 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn
-1 i
/GS0 gs
q 1 0 0 1 315.165 487.2754 cm
0 0 m
@@ -698,11 +689,12 @@ q 1 0 0 1 315.165 487.2754 cm
f
Q
q
-/Fm0 Do
+0 g
+1 w 4 M 0 j 0 J []0 d
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
- endstream endobj 1038 0 obj <</Subtype/Form/Length 262/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1033 0 R/Resources<</XObject<</Fm0 1037 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[156.837 462.278 212.835 406.271]>>stream
+ endstream endobj 1325 0 obj <</BBox[156.837 462.278 212.835 406.271]/Group 1342 0 R/Length 290/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1343 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn
-1 i
/GS0 gs
q 1 0 0 1 184.8359 446.2783 cm
0 0 m
@@ -713,11 +705,11 @@ q 1 0 0 1 184.8359 446.2783 cm
f
Q
q
-/Fm0 Do
+0 g
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
- endstream endobj 1045 0 obj <</Subtype/Form/Length 240/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1040 0 R/Resources<</XObject<</Fm0 1044 0 R>>/ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[183.873 501.023 195.879 489.026]>>stream
+ endstream endobj 1326 0 obj <</BBox[183.873 501.023 195.879 489.026]/Group 1344 0 R/Length 291/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1345 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.196 0.322 0.616 scn
-1 i
/GS0 gs
q 1 0 0 1 189.876 496.0234 cm
0 0 m
@@ -728,9 +720,11 @@ q 1 0 0 1 189.876 496.0234 cm
f
Q
q
-/Fm0 Do
+0 g
+1 w 4 M 0 j 0 J []0 d
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
- endstream endobj 1040 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1044 0 obj <</Subtype/Form/Length 482/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1041 0 R/Resources<</XObject<</Fm0 1043 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[183.873 501.023 195.879 489.026]>>stream
+ endstream endobj 1344 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1345 0 obj <</BBox[183.873 501.023 195.879 489.026]/Group 1346 0 R/Length 534/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1347 0 R>>>>/Subtype/Form>>stream
q
189.876 496.023 m
189.876 501.023 l
@@ -745,13 +739,13 @@ q
190.883 495.569 190.426 496.026 189.876 496.023 c
W n
q
+1 w 4 M 0 j 0 J []0 d
/GS0 gs
-/Fm0 Do
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
Q
- endstream endobj 1041 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1043 0 obj <</Subtype/Form/Length 11006/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1042 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[183.873 501.023 195.879 489.026]>>stream
+ endstream endobj 1346 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1347 0 obj <</BBox[183.873 501.023 195.879 489.026]/Group 1348 0 R/Length 11001/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.2 0.325 0.624 scn
-1 i
/GS0 gs
q 1 0 0 1 189.876 496.0234 cm
0 0 m
@@ -1155,7 +1149,16 @@ q 1 0 0 1 189.876 501.0112 cm
0.15 0.006 0.046 -0.044 0 0 c
f
Q
- endstream endobj 1042 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1033 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1037 0 obj <</Subtype/Form/Length 482/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1034 0 R/Resources<</XObject<</Fm0 1036 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[156.837 462.278 212.835 406.271]>>stream
+ endstream endobj 1348 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1318 0 obj <</AIS false/BM/Normal/CA 1.0/OP false/OPM 1/SA true/SMask/None/Type/ExtGState/ca 1.0/op false>> endobj 1317 0 obj [/ICCBased 1349 0 R] endobj 1349 0 obj <</Filter/FlateDecode/Length 2574/N 3>>stream
+H‰œ–yTSwÇoÉž•°Ãc [€°5la‘QIBHØADED„ª•2ÖmtFOE.®c­Ö}êÒõ0êè8´׎8GNg¦Óïï÷9÷wïïÝß½÷ó
+ 
+V³)gB£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚ó
+€x¯Íú·¶Ò-
+¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°ŽSàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4zBgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"EÒI2’ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@ æP+¨íÔ!ê~êêmêæD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒÓ¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…åÆ’°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9
+N'çÎ)Î].ÂuæJ¸rî
+î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…EŒ…ÒbÅ~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„Æfm“Ž;'_9 œr:œ8Ýq¦:‹ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö
+n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=G</zÁ^Á^j¯­^—¼ Þ¡ÞZïQïBº0FX'Ü+œòáû¤útøŒû<öuñ-ôÝà{Ö÷µ__•ß˜ß-G”,ê}çïé/÷ñ¿ÀHh 8ðm W 2p[àŸƒ¸AiA«‚Ný#8$X¼?øAˆKHIÈ{!7Ä<q†¸Wüy(!46´-ôãÐaÁa†°ƒa†W†ï ¿¿@°@¹`lÁݧYÄŽˆÉH,²$òýÈÉ(Ç(YÔhÔ7ÑÎÑŠèÑ÷b<b*böÅ<Žõ‹ÕÇ~ûL&Y&9‡Ä%ÆuÇMÄsâsã‡ã¿NpJP%ìM˜I JlN<žDHJIÚtCj'•KwKg’C’—%ŸN¡§d§ §|“ꙪO=–§%§mL»½Ðu¡váx:H—¦oL¿“!ȨÉøC&13#s$ó/Y¢¬–¬³ÙÜìâì=ÙOsbsúrnåºçsOæ1óŠòvç=ËËïÏŸ\ä»hÙ¢óÖê‚#…¤Â¼Â…³‹ãoZ<]TÔUt}‰`IÃ’sK­—V-ý¤˜Y,+>TB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîÆ•Æ©ºÈº‘ºçõyõ‡Ø Ú† žkï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»ÎåwW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_p߶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO
+¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäüå„æ æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ
q
184.836 446.278 m
184.836 462.278 l
@@ -1171,12 +1174,11 @@ q
W n
q
/GS0 gs
-/Fm0 Do
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
Q
- endstream endobj 1034 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1036 0 obj <</Subtype/Form/Length 13533/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1035 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[156.837 462.278 212.835 406.271]>>stream
+ endstream endobj 1350 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1351 0 obj <</BBox[156.837 462.278 212.835 406.271]/Group 1352 0 R/Length 13528/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.208 0.337 0.655 scn
-1 i
/GS0 gs
q 1 0 0 1 184.8359 446.2783 cm
0 0 m
@@ -1634,7 +1636,7 @@ q 1 0 0 1 184.8359 462.2749 cm
0.701 -0.01 0.211 -0.214 0 0 c
f
Q
- endstream endobj 1035 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1023 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1027 0 obj <</Subtype/Form/Length 477/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1024 0 R/Resources<</XObject<</Fm0 1026 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[309.171 492.275 321.168 480.278]>>stream
+ endstream endobj 1352 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1340 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1341 0 obj <</BBox[309.171 492.275 321.168 480.278]/Group 1353 0 R/Length 529/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1354 0 R>>>>/Subtype/Form>>stream
q
315.165 487.275 m
315.165 492.275 l
@@ -1649,13 +1651,13 @@ q
316.17 486.824 315.713 487.279 315.165 487.275 c
W n
q
+1 w 4 M 0 j 0 J []0 d
/GS0 gs
-/Fm0 Do
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
Q
- endstream endobj 1024 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1026 0 obj <</Subtype/Form/Length 11079/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1025 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[309.171 492.275 321.168 480.278]>>stream
+ endstream endobj 1353 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1354 0 obj <</BBox[309.171 492.275 321.168 480.278]/Group 1355 0 R/Length 11074/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.2 0.325 0.624 scn
-1 i
/GS0 gs
q 1 0 0 1 315.165 487.2754 cm
0 0 m
@@ -2060,7 +2062,7 @@ q 1 0 0 1 315.165 492.2632 cm
0.15 0.006 0.046 -0.044 0 0 c
f
Q
- endstream endobj 1025 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1015 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1019 0 obj <</Subtype/Form/Length 473/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1016 0 R/Resources<</XObject<</Fm0 1018 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[295.671 461.774 351.669 405.776]>>stream
+ endstream endobj 1355 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1338 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1339 0 obj <</BBox[295.671 461.774 351.669 405.776]/Group 1356 0 R/Length 502/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1357 0 R>>>>/Subtype/Form>>stream
q
323.67 445.774 m
323.67 461.774 l
@@ -2076,12 +2078,11 @@ q
W n
q
/GS0 gs
-/Fm0 Do
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
Q
- endstream endobj 1016 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1018 0 obj <</Subtype/Form/Length 13391/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1017 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[295.671 461.774 351.669 405.776]>>stream
+ endstream endobj 1356 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1357 0 obj <</BBox[295.671 461.774 351.669 405.776]/Group 1358 0 R/Length 13386/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
/CS0 cs 0.208 0.337 0.655 scn
-1 i
/GS0 gs
q 1 0 0 1 323.6699 445.7744 cm
0 0 m
@@ -2536,7 +2537,7 @@ q 1 0 0 1 323.6699 461.771 cm
0.701 -0.01 0.211 -0.214 0 0 c
f
Q
- endstream endobj 1017 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1005 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1009 0 obj <</Subtype/Form/Length 478/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1006 0 R/Resources<</XObject<</Fm0 1008 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[321.996 217.271 334.002 205.274]>>stream
+ endstream endobj 1358 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1336 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1337 0 obj <</BBox[321.996 217.271 334.002 205.274]/Group 1359 0 R/Length 530/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1360 0 R>>>>/Subtype/Form>>stream
q
327.999 212.271 m
327.999 217.271 l
@@ -2551,13 +2552,13 @@ q
329.006 211.817 328.549 212.274 327.999 212.271 c
W n
q
+1 w 4 M 0 j 0 J []0 d
/GS0 gs
-/Fm0 Do
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
Q
- endstream endobj 1006 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1008 0 obj <</Subtype/Form/Length 11068/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1007 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[321.996 217.271 334.002 205.274]>>stream
-/CS0 cs 0.294 0.494 0.133 scn
-1 i
+ endstream endobj 1359 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1360 0 obj <</BBox[321.996 217.271 334.002 205.274]/Group 1361 0 R/Length 11068/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.216 0.631 0.792 scn
/GS0 gs
q 1 0 0 1 327.999 212.2715 cm
0 0 m
@@ -2598,7 +2599,7 @@ q 1 0 0 1 327.999 213.1963 cm
0 0 l
f
Q
-0.286 0.482 0.133 scn
+0.208 0.616 0.776 scn
q 1 0 0 1 327.999 213.3379 cm
0 0 m
-0.03 -0.092 -0.164 -0.17 -0.185 -0.265 c
@@ -2619,7 +2620,7 @@ q 1 0 0 1 327.999 213.3379 cm
0 0 l
f
Q
-0.278 0.471 0.129 scn
+0.204 0.604 0.757 scn
q 1 0 0 1 327.999 213.4785 cm
0 0 m
-0.294 -0.83 -1.296 -1.345 -1.079 -2.404 c
@@ -2636,7 +2637,7 @@ q 1 0 0 1 327.999 213.4785 cm
0 0 l
f
Q
-0.275 0.459 0.125 scn
+0.2 0.588 0.741 scn
q 1 0 0 1 327.999 213.6182 cm
0 0 m
-0.352 -0.866 -1.383 -1.428 -1.146 -2.558 c
@@ -2652,7 +2653,7 @@ q 1 0 0 1 327.999 213.6182 cm
0 0 l
f
Q
-0.267 0.447 0.122 scn
+0.196 0.573 0.722 scn
q 1 0 0 1 327.999 213.7549 cm
0 0 m
-0.193 -0.417 -0.585 -0.691 -0.795 -1.098 c
@@ -2669,7 +2670,7 @@ q 1 0 0 1 327.999 213.7549 cm
0 0 l
f
Q
-0.259 0.439 0.118 scn
+0.188 0.561 0.702 scn
q 1 0 0 1 327.999 213.9082 cm
0 0 m
-0.013 -0.025 -0.053 -0.04 -0.076 -0.058 c
@@ -2686,7 +2687,7 @@ q 1 0 0 1 327.999 213.9082 cm
0 0 l
f
Q
-0.255 0.427 0.118 scn
+0.184 0.545 0.686 scn
q 1 0 0 1 327.999 214.0996 cm
0 0 m
-0.034 -0.067 -0.142 -0.105 -0.203 -0.15 c
@@ -2703,7 +2704,7 @@ q 1 0 0 1 327.999 214.0996 cm
0 0 l
f
Q
-0.247 0.416 0.114 scn
+0.18 0.529 0.667 scn
q 1 0 0 1 327.999 214.2871 cm
0 0 m
-0.037 -0.069 -0.152 -0.104 -0.217 -0.147 c
@@ -2720,7 +2721,7 @@ q 1 0 0 1 327.999 214.2871 cm
0 0 l
f
Q
-0.239 0.404 0.11 scn
+0.176 0.518 0.651 scn
q 1 0 0 1 327.999 214.4717 cm
0 0 m
-0.176 -0.317 -0.542 -0.437 -0.748 -0.722 c
@@ -2737,7 +2738,7 @@ q 1 0 0 1 327.999 214.4717 cm
0 0 l
f
Q
-0.235 0.392 0.106 scn
+0.169 0.502 0.631 scn
q 1 0 0 1 327.999 214.7031 cm
0 0 m
-0.06 -0.133 -0.265 -0.211 -0.386 -0.291 c
@@ -2754,7 +2755,7 @@ q 1 0 0 1 327.999 214.7031 cm
0 0 l
f
Q
-0.227 0.38 0.106 scn
+0.165 0.486 0.612 scn
q 1 0 0 1 327.999 214.9854 cm
0 0 m
-0.04 -0.083 -0.167 -0.135 -0.239 -0.193 c
@@ -2771,7 +2772,7 @@ q 1 0 0 1 327.999 214.9854 cm
0 0 l
f
Q
-0.22 0.369 0.102 scn
+0.161 0.475 0.596 scn
q 1 0 0 1 327.999 215.2715 cm
0 0 m
-0.045 -0.106 -0.21 -0.167 -0.302 -0.236 c
@@ -2788,7 +2789,7 @@ q 1 0 0 1 327.999 215.2715 cm
0 0 l
f
Q
-0.212 0.361 0.098 scn
+0.157 0.459 0.576 scn
q 1 0 0 1 327.999 215.6543 cm
0 0 m
-0.163 -0.361 -0.542 -0.515 -0.779 -0.805 c
@@ -2806,7 +2807,7 @@ q 1 0 0 1 327.999 215.6543 cm
0 0 l
f
Q
-0.208 0.349 0.094 scn
+0.149 0.443 0.561 scn
q 1 0 0 1 327.999 216.0791 cm
0 0 m
-0.128 -0.296 -0.442 -0.404 -0.638 -0.631 c
@@ -2822,7 +2823,7 @@ q 1 0 0 1 327.999 216.0791 cm
0 0 l
f
Q
-0.2 0.337 0.09 scn
+0.145 0.431 0.541 scn
q 1 0 0 1 327.999 216.5439 cm
0 0 m
-0.037 -0.078 -0.154 -0.129 -0.22 -0.185 c
@@ -2837,7 +2838,7 @@ q 1 0 0 1 327.999 216.5439 cm
0 0 l
f
Q
-0.192 0.325 0.09 scn
+0.141 0.416 0.522 scn
q 1 0 0 1 327.999 216.9863 cm
0 0 m
-0.038 -0.066 -0.155 -0.09 -0.221 -0.129 c
@@ -2852,7 +2853,7 @@ q 1 0 0 1 327.999 216.9863 cm
0 0 l
f
Q
-0.188 0.314 0.086 scn
+0.137 0.4 0.506 scn
q 1 0 0 1 327.999 217.2598 cm
0 0 m
-0.043 -0.053 -0.154 -0.029 -0.221 -0.042 c
@@ -2866,7 +2867,7 @@ q 1 0 0 1 327.999 217.2598 cm
0 0 l
f
Q
-0.18 0.302 0.082 scn
+0.129 0.388 0.486 scn
q 1 0 0 1 327.0938 217.1953 cm
0 0 m
-1.738 -0.59 -1.75 -4.505 -1.75 -4.545 c
@@ -2878,7 +2879,7 @@ q 1 0 0 1 327.0938 217.1953 cm
0.115 0.021 0.049 0.013 0 0 c
f
Q
-0.173 0.29 0.078 scn
+0.125 0.373 0.471 scn
q 1 0 0 1 325.7642 216.7715 cm
0 0 m
-1.064 -0.938 -0.813 -4.867 -0.541 -5.6 c
@@ -2892,7 +2893,7 @@ q 1 0 0 1 325.7642 216.7715 cm
0.161 0.102 0.061 0.054 0 0 c
f
Q
-0.302 0.506 0.137 scn
+0.22 0.647 0.812 scn
q 1 0 0 1 329.5791 211.4561 cm
0 0 m
-0.095 0.068 -0.095 0.068 -0.519 0.587 c
@@ -2903,7 +2904,7 @@ q 1 0 0 1 329.5791 211.4561 cm
0.153 -0.144 0.065 -0.047 0 0 c
f
Q
-0.208 0.349 0.094 scn
+0.149 0.443 0.561 scn
q 1 0 0 1 330.5688 216.6631 cm
0 0 m
-1.295 0.462 -2.254 -0.325 -2.57 -0.584 c
@@ -2913,7 +2914,7 @@ q 1 0 0 1 330.5688 216.6631 cm
0.219 -0.095 0.096 -0.034 0 0 c
f
Q
-0.306 0.518 0.141 scn
+0.224 0.659 0.831 scn
q 1 0 0 1 329.6191 211.708 cm
0 0 m
-0.335 0.354 l
@@ -2924,7 +2925,7 @@ q 1 0 0 1 329.6191 211.708 cm
0.106 -0.131 0.048 -0.039 0 0 c
f
Q
-0.2 0.337 0.09 scn
+0.145 0.431 0.541 scn
q 1 0 0 1 329.7661 216.9941 cm
0 0 m
-0.649 0.12 -1.161 -0.01 -1.767 -0.45 c
@@ -2934,7 +2935,7 @@ q 1 0 0 1 329.7661 216.9941 cm
0.02 -0.005 0.009 -0.002 0 0 c
f
Q
-0.314 0.525 0.145 scn
+0.227 0.675 0.847 scn
q 1 0 0 1 329.623 211.9746 cm
0 0 m
-0.004 0.004 -0.533 0.572 -0.71 0.861 c
@@ -2945,7 +2946,7 @@ q 1 0 0 1 329.623 211.9746 cm
0.052 -0.044 0.021 -0.021 0 0 c
f
Q
-0.192 0.325 0.09 scn
+0.141 0.416 0.522 scn
q 1 0 0 1 328.9043 217.1943 cm
0 0 m
-0.314 -0.006 -0.487 -0.009 -0.905 -0.208 c
@@ -2954,7 +2955,7 @@ q 1 0 0 1 328.9043 217.1943 cm
0.157 -0.021 0.068 -0.004 0 0 c
f
Q
-0.188 0.314 0.086 scn
+0.137 0.4 0.506 scn
q 1 0 0 1 327.999 217.2598 cm
0 0 m
0 0.012 l
@@ -2962,7 +2963,7 @@ q 1 0 0 1 327.999 217.2598 cm
0.15 0.006 0.046 -0.045 0 0 c
f
Q
- endstream endobj 1007 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 998 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1002 0 obj <</Subtype/Form/Length 475/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 999 0 R/Resources<</XObject<</Fm0 1001 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[306.003 319.277 362.001 263.279]>>stream
+ endstream endobj 1361 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1334 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1335 0 obj <</BBox[306.003 319.277 362.001 263.279]/Group 1362 0 R/Length 504/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1363 0 R>>>>/Subtype/Form>>stream
q
334.002 303.277 m
334.002 319.277 l
@@ -2978,12 +2979,11 @@ q
W n
q
/GS0 gs
-/Fm0 Do
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
Q
- endstream endobj 999 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1001 0 obj <</Subtype/Form/Length 13469/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 1000 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[306.003 319.277 362.001 263.279]>>stream
-/CS0 cs 0.306 0.518 0.141 scn
-1 i
+ endstream endobj 1362 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1363 0 obj <</BBox[306.003 319.277 362.001 263.279]/Group 1364 0 R/Length 13467/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.259 0.565 0.682 scn
/GS0 gs
q 1 0 0 1 334.002 303.2773 cm
0 0 m
@@ -3022,7 +3022,7 @@ q 1 0 0 1 334.002 308.4409 cm
0 0 l
f
Q
-0.302 0.506 0.137 scn
+0.255 0.553 0.667 scn
q 1 0 0 1 334.002 310.2881 cm
0 0 m
-0.296 -0.712 -1.487 -1.168 -1.735 -1.898 c
@@ -3048,7 +3048,7 @@ q 1 0 0 1 334.002 310.2881 cm
0 0 l
f
Q
-0.294 0.494 0.133 scn
+0.247 0.541 0.651 scn
q 1 0 0 1 334.002 311.4072 cm
0 0 m
-0.627 -1.109 -1.866 -1.525 -2.708 -2.391 c
@@ -3073,7 +3073,7 @@ q 1 0 0 1 334.002 311.4072 cm
0 0 l
f
Q
-0.286 0.482 0.133 scn
+0.243 0.529 0.639 scn
q 1 0 0 1 334.002 312.3325 cm
0 0 m
-0.223 -0.377 -0.896 -0.494 -1.279 -0.706 c
@@ -3093,7 +3093,7 @@ q 1 0 0 1 334.002 312.3325 cm
0 0 l
f
Q
-0.278 0.471 0.129 scn
+0.235 0.518 0.624 scn
q 1 0 0 1 334.002 313.1323 cm
0 0 m
-0.174 -0.267 -0.682 -0.3 -0.974 -0.428 c
@@ -3110,7 +3110,7 @@ q 1 0 0 1 334.002 313.1323 cm
0 0 l
f
Q
-0.275 0.459 0.125 scn
+0.231 0.506 0.608 scn
q 1 0 0 1 334.002 313.833 cm
0 0 m
-0.26 -0.393 -1.01 -0.429 -1.443 -0.612 c
@@ -3127,7 +3127,7 @@ q 1 0 0 1 334.002 313.833 cm
0 0 l
f
Q
-0.267 0.447 0.122 scn
+0.227 0.494 0.592 scn
q 1 0 0 1 334.002 314.499 cm
0 0 m
-0.27 -0.397 -1.042 -0.411 -1.488 -0.586 c
@@ -3144,7 +3144,7 @@ q 1 0 0 1 334.002 314.499 cm
0 0 l
f
Q
-0.259 0.439 0.118 scn
+0.22 0.478 0.576 scn
q 1 0 0 1 334.002 315.1099 cm
0 0 m
-0.285 -0.403 -1.085 -0.384 -1.55 -0.549 c
@@ -3161,7 +3161,7 @@ q 1 0 0 1 334.002 315.1099 cm
0 0 l
f
Q
-0.255 0.427 0.118 scn
+0.216 0.467 0.565 scn
q 1 0 0 1 334.002 315.6826 cm
0 0 m
-0.294 -0.407 -1.113 -0.365 -1.59 -0.521 c
@@ -3178,7 +3178,7 @@ q 1 0 0 1 334.002 315.6826 cm
0 0 l
f
Q
-0.247 0.416 0.114 scn
+0.208 0.455 0.549 scn
q 1 0 0 1 334.002 316.2197 cm
0 0 m
-0.327 -0.44 -1.224 -0.37 -1.749 -0.528 c
@@ -3195,7 +3195,7 @@ q 1 0 0 1 334.002 316.2197 cm
0 0 l
f
Q
-0.239 0.404 0.11 scn
+0.204 0.443 0.533 scn
q 1 0 0 1 334.002 316.7344 cm
0 0 m
-0.315 -0.413 -1.169 -0.321 -1.671 -0.458 c
@@ -3212,7 +3212,7 @@ q 1 0 0 1 334.002 316.7344 cm
0 0 l
f
Q
-0.235 0.392 0.106 scn
+0.196 0.431 0.518 scn
q 1 0 0 1 334.002 317.207 cm
0 0 m
-0.326 -0.417 -1.197 -0.297 -1.71 -0.424 c
@@ -3229,7 +3229,7 @@ q 1 0 0 1 334.002 317.207 cm
0 0 l
f
Q
-0.227 0.38 0.106 scn
+0.192 0.42 0.506 scn
q 1 0 0 1 334.002 317.647 cm
0 0 m
-0.165 -0.201 -0.596 -0.119 -0.852 -0.169 c
@@ -3246,7 +3246,7 @@ q 1 0 0 1 334.002 317.647 cm
0 0 l
f
Q
-0.22 0.369 0.102 scn
+0.188 0.408 0.49 scn
q 1 0 0 1 334.002 318.0581 cm
0 0 m
-0.345 -0.419 -1.243 -0.245 -1.775 -0.35 c
@@ -3263,7 +3263,7 @@ q 1 0 0 1 334.002 318.0581 cm
0 0 l
f
Q
-0.212 0.361 0.098 scn
+0.18 0.392 0.475 scn
q 1 0 0 1 334.002 318.4131 cm
0 0 m
-0.359 -0.424 -1.279 -0.213 -1.827 -0.305 c
@@ -3280,7 +3280,7 @@ q 1 0 0 1 334.002 318.4131 cm
0 0 l
f
Q
-0.208 0.349 0.094 scn
+0.176 0.38 0.459 scn
q 1 0 0 1 334.002 318.7388 cm
0 0 m
-0.366 -0.422 -1.29 -0.183 -1.842 -0.262 c
@@ -3295,7 +3295,7 @@ q 1 0 0 1 334.002 318.7388 cm
0 0 l
f
Q
-0.2 0.337 0.09 scn
+0.169 0.369 0.443 scn
q 1 0 0 1 334.002 318.9941 cm
0 0 m
-0.38 -0.425 -1.322 -0.147 -1.889 -0.211 c
@@ -3310,7 +3310,7 @@ q 1 0 0 1 334.002 318.9941 cm
0 0 l
f
Q
-0.192 0.325 0.09 scn
+0.165 0.357 0.431 scn
q 1 0 0 1 334.002 319.1851 cm
0 0 m
-0.389 -0.421 -1.333 -0.109 -1.905 -0.156 c
@@ -3325,7 +3325,7 @@ q 1 0 0 1 334.002 319.1851 cm
0 0 l
f
Q
-0.188 0.314 0.086 scn
+0.157 0.345 0.416 scn
q 1 0 0 1 334.002 319.2739 cm
0 0 m
-0.403 -0.423 -1.362 -0.067 -1.945 -0.096 c
@@ -3339,7 +3339,7 @@ q 1 0 0 1 334.002 319.2739 cm
0 0 l
f
Q
-0.18 0.302 0.082 scn
+0.153 0.333 0.4 scn
q 1 0 0 1 329.771 318.957 cm
0 0 m
-22.534 -4.552 -23.533 -35.028 -6.33 -46.26 c
@@ -3350,7 +3350,7 @@ q 1 0 0 1 329.771 318.957 cm
0.544 0.077 0.232 0.04 0 0 c
f
Q
-0.173 0.29 0.078 scn
+0.145 0.322 0.384 scn
q 1 0 0 1 321.978 316.4971 cm
0 0 m
-16.565 -9.063 -17.347 -40.195 9.314 -48.713 c
@@ -3362,7 +3362,7 @@ q 1 0 0 1 321.978 316.4971 cm
1.31 0.61 0.543 0.297 0 0 c
f
Q
-0.314 0.525 0.145 scn
+0.267 0.58 0.698 scn
q 1 0 0 1 349.9282 293.1025 cm
0 0 m
-1.706 2.422 -2.871 5.191 -4.806 7.466 c
@@ -3376,7 +3376,7 @@ q 1 0 0 1 349.9282 293.1025 cm
0.589 -1.328 0.314 -0.446 0 0 c
f
Q
-0.322 0.537 0.145 scn
+0.271 0.592 0.71 scn
q 1 0 0 1 350.0625 295.5957 cm
0 0 m
-1.97 2.883 -3.056 4.472 -4.87 6.595 c
@@ -3393,7 +3393,7 @@ q 1 0 0 1 350.0625 295.5957 cm
0.33 -0.793 0.182 -0.267 0 0 c
f
Q
-0.325 0.549 0.149 scn
+0.278 0.604 0.725 scn
q 1 0 0 1 349.1475 299.125 cm
0 0 m
-0.737 0.235 -1.076 1.45 -1.576 2.04 c
@@ -3406,7 +3406,7 @@ q 1 0 0 1 349.1475 299.125 cm
0.026 0.014 0.011 -0.003 0 0 c
f
Q
-0.208 0.349 0.094 scn
+0.176 0.38 0.459 scn
q 1 0 0 1 346.0513 316.5498 cm
0 0 m
-5.275 2.417 -9.403 2.407 -12.049 2.189 c
@@ -3416,7 +3416,7 @@ q 1 0 0 1 346.0513 316.5498 cm
0.673 -0.334 0.292 -0.134 0 0 c
f
Q
-0.2 0.337 0.09 scn
+0.169 0.369 0.443 scn
q 1 0 0 1 342.2651 318.0342 cm
0 0 m
-3.078 0.794 -4.478 1.111 -8.263 0.96 c
@@ -3425,7 +3425,7 @@ q 1 0 0 1 342.2651 318.0342 cm
0.981 -0.329 0.425 -0.126 0 0 c
f
Q
-0.192 0.325 0.09 scn
+0.165 0.357 0.431 scn
q 1 0 0 1 338.2329 318.957 cm
0 0 m
-2.557 0.263 -2.657 0.273 -4.231 0.228 c
@@ -3434,14 +3434,14 @@ q 1 0 0 1 338.2329 318.957 cm
0.724 -0.122 0.312 -0.042 0 0 c
f
Q
-0.188 0.314 0.086 scn
+0.157 0.345 0.416 scn
q 1 0 0 1 334.002 319.2739 cm
0 0 m
0.335 0.003 0.669 -0.002 1.001 -0.014 c
0.701 -0.01 0.211 -0.214 0 0 c
f
Q
- endstream endobj 1000 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 988 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 992 0 obj <</Subtype/Form/Length 481/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 989 0 R/Resources<</XObject<</Fm0 991 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[180.624 223.274 192.621 211.277]>>stream
+ endstream endobj 1364 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1332 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1333 0 obj <</BBox[180.624 223.274 192.621 211.277]/Group 1365 0 R/Length 533/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1366 0 R>>>>/Subtype/Form>>stream
q
186.627 218.274 m
186.627 223.274 l
@@ -3456,13 +3456,13 @@ q
187.622 217.829 187.171 218.277 186.627 218.274 c
W n
q
+1 w 4 M 0 j 0 J []0 d
/GS0 gs
-/Fm0 Do
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
Q
- endstream endobj 989 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 991 0 obj <</Subtype/Form/Length 11020/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 990 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[180.624 223.274 192.621 211.277]>>stream
-/CS0 cs 0.294 0.494 0.133 scn
-1 i
+ endstream endobj 1365 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1366 0 obj <</BBox[180.624 223.274 192.621 211.277]/Group 1367 0 R/Length 11024/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.176 0.529 0.353 scn
/GS0 gs
q 1 0 0 1 186.627 218.2744 cm
0 0 m
@@ -3503,7 +3503,7 @@ q 1 0 0 1 186.627 219.1992 cm
0 0 l
f
Q
-0.286 0.482 0.133 scn
+0.173 0.518 0.345 scn
q 1 0 0 1 186.627 219.3418 cm
0 0 m
-0.03 -0.093 -0.164 -0.171 -0.185 -0.266 c
@@ -3524,7 +3524,7 @@ q 1 0 0 1 186.627 219.3418 cm
0 0 l
f
Q
-0.278 0.471 0.129 scn
+0.169 0.506 0.337 scn
q 1 0 0 1 186.627 219.4824 cm
0 0 m
-0.295 -0.834 -1.295 -1.352 -1.079 -2.413 c
@@ -3540,7 +3540,7 @@ q 1 0 0 1 186.627 219.4824 cm
0 0 l
f
Q
-0.275 0.459 0.125 scn
+0.165 0.49 0.329 scn
q 1 0 0 1 186.627 219.6211 cm
0 0 m
-0.353 -0.868 -1.382 -1.434 -1.146 -2.564 c
@@ -3556,7 +3556,7 @@ q 1 0 0 1 186.627 219.6211 cm
0 0 l
f
Q
-0.267 0.447 0.122 scn
+0.161 0.478 0.322 scn
q 1 0 0 1 186.627 219.7588 cm
0 0 m
-0.193 -0.418 -0.584 -0.692 -0.794 -1.099 c
@@ -3573,7 +3573,7 @@ q 1 0 0 1 186.627 219.7588 cm
0 0 l
f
Q
-0.259 0.439 0.118 scn
+0.157 0.467 0.314 scn
q 1 0 0 1 186.627 219.9111 cm
0 0 m
-0.013 -0.025 -0.053 -0.04 -0.076 -0.058 c
@@ -3590,7 +3590,7 @@ q 1 0 0 1 186.627 219.9111 cm
0 0 l
f
Q
-0.255 0.427 0.118 scn
+0.153 0.455 0.306 scn
q 1 0 0 1 186.627 220.1025 cm
0 0 m
-0.034 -0.067 -0.142 -0.105 -0.203 -0.15 c
@@ -3607,7 +3607,7 @@ q 1 0 0 1 186.627 220.1025 cm
0 0 l
f
Q
-0.247 0.416 0.114 scn
+0.149 0.443 0.294 scn
q 1 0 0 1 186.627 220.291 cm
0 0 m
-0.037 -0.07 -0.152 -0.104 -0.217 -0.148 c
@@ -3624,7 +3624,7 @@ q 1 0 0 1 186.627 220.291 cm
0 0 l
f
Q
-0.239 0.404 0.11 scn
+0.145 0.431 0.286 scn
q 1 0 0 1 186.627 220.4746 cm
0 0 m
-0.175 -0.316 -0.542 -0.436 -0.748 -0.721 c
@@ -3641,7 +3641,7 @@ q 1 0 0 1 186.627 220.4746 cm
0 0 l
f
Q
-0.235 0.392 0.106 scn
+0.141 0.42 0.278 scn
q 1 0 0 1 186.627 220.7061 cm
0 0 m
-0.06 -0.132 -0.265 -0.211 -0.386 -0.291 c
@@ -3658,7 +3658,7 @@ q 1 0 0 1 186.627 220.7061 cm
0 0 l
f
Q
-0.227 0.38 0.106 scn
+0.137 0.408 0.271 scn
q 1 0 0 1 186.627 220.9883 cm
0 0 m
-0.04 -0.083 -0.167 -0.135 -0.239 -0.193 c
@@ -3675,7 +3675,7 @@ q 1 0 0 1 186.627 220.9883 cm
0 0 l
f
Q
-0.22 0.369 0.102 scn
+0.133 0.396 0.263 scn
q 1 0 0 1 186.627 221.2744 cm
0 0 m
-0.045 -0.106 -0.21 -0.167 -0.303 -0.236 c
@@ -3692,7 +3692,7 @@ q 1 0 0 1 186.627 221.2744 cm
0 0 l
f
Q
-0.212 0.361 0.098 scn
+0.129 0.384 0.255 scn
q 1 0 0 1 186.627 221.6582 cm
0 0 m
-0.163 -0.362 -0.542 -0.515 -0.779 -0.805 c
@@ -3710,7 +3710,7 @@ q 1 0 0 1 186.627 221.6582 cm
0 0 l
f
Q
-0.208 0.349 0.094 scn
+0.125 0.373 0.247 scn
q 1 0 0 1 186.627 222.082 cm
0 0 m
-0.128 -0.296 -0.442 -0.404 -0.638 -0.631 c
@@ -3726,7 +3726,7 @@ q 1 0 0 1 186.627 222.082 cm
0 0 l
f
Q
-0.2 0.337 0.09 scn
+0.122 0.361 0.239 scn
q 1 0 0 1 186.627 222.5469 cm
0 0 m
-0.037 -0.078 -0.154 -0.129 -0.22 -0.185 c
@@ -3741,7 +3741,7 @@ q 1 0 0 1 186.627 222.5469 cm
0 0 l
f
Q
-0.192 0.325 0.09 scn
+0.118 0.349 0.231 scn
q 1 0 0 1 186.627 222.9893 cm
0 0 m
-0.038 -0.066 -0.155 -0.09 -0.221 -0.129 c
@@ -3756,7 +3756,7 @@ q 1 0 0 1 186.627 222.9893 cm
0 0 l
f
Q
-0.188 0.314 0.086 scn
+0.114 0.337 0.224 scn
q 1 0 0 1 186.627 223.2627 cm
0 0 m
-0.043 -0.052 -0.154 -0.029 -0.221 -0.042 c
@@ -3770,7 +3770,7 @@ q 1 0 0 1 186.627 223.2627 cm
0 0 l
f
Q
-0.18 0.302 0.082 scn
+0.11 0.325 0.216 scn
q 1 0 0 1 185.7217 223.1973 cm
0 0 m
-1.735 -0.588 -1.748 -4.507 -1.748 -4.547 c
@@ -3782,7 +3782,7 @@ q 1 0 0 1 185.7217 223.1973 cm
0.115 0.022 0.049 0.014 0 0 c
f
Q
-0.173 0.29 0.078 scn
+0.106 0.314 0.208 scn
q 1 0 0 1 184.3926 222.7744 cm
0 0 m
-1.065 -0.939 -0.813 -4.875 -0.541 -5.608 c
@@ -3796,7 +3796,7 @@ q 1 0 0 1 184.3926 222.7744 cm
0.161 0.103 0.062 0.054 0 0 c
f
Q
-0.302 0.506 0.137 scn
+0.18 0.541 0.361 scn
q 1 0 0 1 188.1982 217.4531 cm
0 0 m
-0.089 0.064 -0.089 0.064 -0.518 0.595 c
@@ -3807,7 +3807,7 @@ q 1 0 0 1 188.1982 217.4531 cm
0.153 -0.145 0.065 -0.047 0 0 c
f
Q
-0.208 0.349 0.094 scn
+0.125 0.373 0.247 scn
q 1 0 0 1 189.1953 222.666 cm
0 0 m
-1.292 0.462 -2.253 -0.325 -2.568 -0.584 c
@@ -3817,7 +3817,7 @@ q 1 0 0 1 189.1953 222.666 cm
0.215 -0.093 0.095 -0.034 0 0 c
f
Q
-0.306 0.518 0.141 scn
+0.184 0.553 0.369 scn
q 1 0 0 1 188.2393 217.709 cm
0 0 m
-0.336 0.357 l
@@ -3828,7 +3828,7 @@ q 1 0 0 1 188.2393 217.709 cm
0.105 -0.132 0.047 -0.039 0 0 c
f
Q
-0.2 0.337 0.09 scn
+0.122 0.361 0.239 scn
q 1 0 0 1 188.3931 222.9971 cm
0 0 m
-0.649 0.121 -1.161 -0.01 -1.766 -0.45 c
@@ -3838,7 +3838,7 @@ q 1 0 0 1 188.3931 222.9971 cm
0.019 -0.004 0.008 -0.001 0 0 c
f
Q
-0.314 0.525 0.145 scn
+0.188 0.565 0.376 scn
q 1 0 0 1 188.2437 217.9775 cm
0 0 m
-0.004 0.005 -0.532 0.572 -0.709 0.863 c
@@ -3849,7 +3849,7 @@ q 1 0 0 1 188.2437 217.9775 cm
0.049 -0.041 0.02 -0.02 0 0 c
f
Q
-0.192 0.325 0.09 scn
+0.118 0.349 0.231 scn
q 1 0 0 1 187.5317 223.1973 cm
0 0 m
-0.313 -0.006 -0.486 -0.009 -0.905 -0.208 c
@@ -3858,7 +3858,7 @@ q 1 0 0 1 187.5317 223.1973 cm
0.157 -0.021 0.068 -0.004 0 0 c
f
Q
-0.188 0.314 0.086 scn
+0.114 0.337 0.224 scn
q 1 0 0 1 186.627 223.2627 cm
0 0 m
0 0.012 l
@@ -3866,7 +3866,7 @@ q 1 0 0 1 186.627 223.2627 cm
0.15 0.006 0.046 -0.045 0 0 c
f
Q
- endstream endobj 990 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 979 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 985 0 obj <</Subtype/Form/Length 450/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 980 0 R/Resources<</XObject<</Fm0 984 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[155.001 324.272 210.999 268.274]>>stream
+ endstream endobj 1367 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1330 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1331 0 obj <</BBox[155.001 324.272 210.999 268.274]/Group 1368 0 R/Length 479/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ExtGState<</GS0 1318 0 R>>/XObject<</Fm0 1369 0 R>>>>/Subtype/Form>>stream
q
183 308.272 m
183 324.272 l
@@ -3882,12 +3882,11 @@ q
W n
q
/GS0 gs
-/Fm0 Do
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
Q
Q
- endstream endobj 980 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 984 0 obj <</Subtype/Form/Length 13394/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Group 981 0 R/Resources<</ColorSpace<</CS0 982 0 R>>/ExtGState<</GS0 978 0 R>>>>/BBox[155.001 324.272 210.999 268.274]>>stream
-/CS0 cs 0.306 0.518 0.141 scn
-1 i
+ endstream endobj 1368 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1369 0 obj <</BBox[155.001 324.272 210.999 268.274]/Group 1370 0 R/Length 13398/Matrix[1.0 0.0 0.0 1.0 0.0 0.0]/Resources<</ColorSpace<</CS0 1317 0 R>>/ExtGState<</GS0 1318 0 R>>>>/Subtype/Form>>stream
+/CS0 cs 0.184 0.553 0.369 scn
/GS0 gs
q 1 0 0 1 183 308.2725 cm
0 0 m
@@ -3926,7 +3925,7 @@ q 1 0 0 1 183 313.436 cm
0 0 l
f
Q
-0.302 0.506 0.137 scn
+0.18 0.541 0.361 scn
q 1 0 0 1 183 315.2832 cm
0 0 m
-0.296 -0.712 -1.487 -1.168 -1.735 -1.898 c
@@ -3952,7 +3951,7 @@ q 1 0 0 1 183 315.2832 cm
0 0 l
f
Q
-0.294 0.494 0.133 scn
+0.176 0.529 0.353 scn
q 1 0 0 1 183 316.4023 cm
0 0 m
-0.627 -1.109 -1.866 -1.525 -2.708 -2.391 c
@@ -3977,7 +3976,7 @@ q 1 0 0 1 183 316.4023 cm
0 0 l
f
Q
-0.286 0.482 0.133 scn
+0.173 0.518 0.345 scn
q 1 0 0 1 183 317.3276 cm
0 0 m
-0.223 -0.377 -0.896 -0.494 -1.279 -0.706 c
@@ -3997,7 +3996,7 @@ q 1 0 0 1 183 317.3276 cm
0 0 l
f
Q
-0.278 0.471 0.129 scn
+0.169 0.506 0.337 scn
q 1 0 0 1 183 318.1274 cm
0 0 m
-0.174 -0.267 -0.682 -0.3 -0.974 -0.428 c
@@ -4014,7 +4013,7 @@ q 1 0 0 1 183 318.1274 cm
0 0 l
f
Q
-0.275 0.459 0.125 scn
+0.165 0.49 0.329 scn
q 1 0 0 1 183 318.8281 cm
0 0 m
-0.26 -0.393 -1.01 -0.429 -1.443 -0.612 c
@@ -4031,7 +4030,7 @@ q 1 0 0 1 183 318.8281 cm
0 0 l
f
Q
-0.267 0.447 0.122 scn
+0.161 0.478 0.322 scn
q 1 0 0 1 183 319.4941 cm
0 0 m
-0.27 -0.397 -1.042 -0.411 -1.488 -0.586 c
@@ -4048,7 +4047,7 @@ q 1 0 0 1 183 319.4941 cm
0 0 l
f
Q
-0.259 0.439 0.118 scn
+0.157 0.467 0.314 scn
q 1 0 0 1 183 320.105 cm
0 0 m
-0.285 -0.403 -1.085 -0.384 -1.55 -0.549 c
@@ -4065,7 +4064,7 @@ q 1 0 0 1 183 320.105 cm
0 0 l
f
Q
-0.255 0.427 0.118 scn
+0.153 0.455 0.306 scn
q 1 0 0 1 183 320.6777 cm
0 0 m
-0.294 -0.407 -1.113 -0.365 -1.59 -0.521 c
@@ -4082,7 +4081,7 @@ q 1 0 0 1 183 320.6777 cm
0 0 l
f
Q
-0.247 0.416 0.114 scn
+0.149 0.443 0.294 scn
q 1 0 0 1 183 321.2148 cm
0 0 m
-0.327 -0.44 -1.224 -0.37 -1.749 -0.528 c
@@ -4099,7 +4098,7 @@ q 1 0 0 1 183 321.2148 cm
0 0 l
f
Q
-0.239 0.404 0.11 scn
+0.145 0.431 0.286 scn
q 1 0 0 1 183 321.7295 cm
0 0 m
-0.315 -0.413 -1.169 -0.321 -1.671 -0.458 c
@@ -4116,7 +4115,7 @@ q 1 0 0 1 183 321.7295 cm
0 0 l
f
Q
-0.235 0.392 0.106 scn
+0.141 0.42 0.278 scn
q 1 0 0 1 183 322.2021 cm
0 0 m
-0.326 -0.417 -1.197 -0.297 -1.71 -0.424 c
@@ -4133,7 +4132,7 @@ q 1 0 0 1 183 322.2021 cm
0 0 l
f
Q
-0.227 0.38 0.106 scn
+0.137 0.408 0.271 scn
q 1 0 0 1 183 322.6421 cm
0 0 m
-0.165 -0.201 -0.596 -0.119 -0.851 -0.169 c
@@ -4150,7 +4149,7 @@ q 1 0 0 1 183 322.6421 cm
0 0 l
f
Q
-0.22 0.369 0.102 scn
+0.133 0.396 0.263 scn
q 1 0 0 1 183 323.0532 cm
0 0 m
-0.345 -0.419 -1.243 -0.245 -1.775 -0.35 c
@@ -4167,7 +4166,7 @@ q 1 0 0 1 183 323.0532 cm
0 0 l
f
Q
-0.212 0.361 0.098 scn
+0.129 0.384 0.255 scn
q 1 0 0 1 183 323.4082 cm
0 0 m
-0.359 -0.424 -1.279 -0.213 -1.827 -0.305 c
@@ -4184,7 +4183,7 @@ q 1 0 0 1 183 323.4082 cm
0 0 l
f
Q
-0.208 0.349 0.094 scn
+0.125 0.373 0.247 scn
q 1 0 0 1 183 323.7339 cm
0 0 m
-0.366 -0.422 -1.29 -0.183 -1.842 -0.262 c
@@ -4199,7 +4198,7 @@ q 1 0 0 1 183 323.7339 cm
0 0 l
f
Q
-0.2 0.337 0.09 scn
+0.122 0.361 0.239 scn
q 1 0 0 1 183 323.9893 cm
0 0 m
-0.38 -0.425 -1.322 -0.147 -1.889 -0.211 c
@@ -4214,7 +4213,7 @@ q 1 0 0 1 183 323.9893 cm
0 0 l
f
Q
-0.192 0.325 0.09 scn
+0.118 0.349 0.231 scn
q 1 0 0 1 183 324.1802 cm
0 0 m
-0.389 -0.421 -1.333 -0.109 -1.905 -0.156 c
@@ -4229,7 +4228,7 @@ q 1 0 0 1 183 324.1802 cm
0 0 l
f
Q
-0.188 0.314 0.086 scn
+0.114 0.337 0.224 scn
q 1 0 0 1 183 324.269 cm
0 0 m
-0.403 -0.423 -1.362 -0.067 -1.945 -0.096 c
@@ -4243,7 +4242,7 @@ q 1 0 0 1 183 324.269 cm
0 0 l
f
Q
-0.18 0.302 0.082 scn
+0.11 0.325 0.216 scn
q 1 0 0 1 178.769 323.9521 cm
0 0 m
-22.529 -4.551 -23.528 -35.026 -6.329 -46.258 c
@@ -4254,7 +4253,7 @@ q 1 0 0 1 178.769 323.9521 cm
0.544 0.077 0.232 0.04 0 0 c
f
Q
-0.173 0.29 0.078 scn
+0.106 0.314 0.208 scn
q 1 0 0 1 170.9761 321.4922 cm
0 0 m
-16.563 -9.063 -17.344 -40.194 9.316 -48.713 c
@@ -4266,7 +4265,7 @@ q 1 0 0 1 170.9761 321.4922 cm
1.31 0.61 0.543 0.297 0 0 c
f
Q
-0.314 0.525 0.145 scn
+0.188 0.565 0.376 scn
q 1 0 0 1 198.9263 298.0972 cm
0 0 m
-1.706 2.422 -2.871 5.192 -4.806 7.466 c
@@ -4280,7 +4279,7 @@ q 1 0 0 1 198.9263 298.0972 cm
0.589 -1.328 0.314 -0.445 0 0 c
f
Q
-0.322 0.537 0.145 scn
+0.192 0.576 0.384 scn
q 1 0 0 1 199.0605 300.5908 cm
0 0 m
-1.97 2.883 -3.055 4.471 -4.87 6.595 c
@@ -4297,7 +4296,7 @@ q 1 0 0 1 199.0605 300.5908 cm
0.33 -0.793 0.182 -0.267 0 0 c
f
Q
-0.325 0.549 0.149 scn
+0.196 0.588 0.392 scn
q 1 0 0 1 198.1455 304.1201 cm
0 0 m
-0.737 0.235 -1.076 1.45 -1.576 2.04 c
@@ -4310,7 +4309,7 @@ q 1 0 0 1 198.1455 304.1201 cm
0.026 0.014 0.011 -0.003 0 0 c
f
Q
-0.208 0.349 0.094 scn
+0.125 0.373 0.247 scn
q 1 0 0 1 195.0493 321.5449 cm
0 0 m
-5.275 2.417 -9.403 2.407 -12.049 2.189 c
@@ -4320,7 +4319,7 @@ q 1 0 0 1 195.0493 321.5449 cm
0.673 -0.334 0.292 -0.134 0 0 c
f
Q
-0.2 0.337 0.09 scn
+0.122 0.361 0.239 scn
q 1 0 0 1 191.2632 323.0293 cm
0 0 m
-3.078 0.794 -4.478 1.111 -8.263 0.96 c
@@ -4329,7 +4328,7 @@ q 1 0 0 1 191.2632 323.0293 cm
0.981 -0.329 0.425 -0.126 0 0 c
f
Q
-0.192 0.325 0.09 scn
+0.118 0.349 0.231 scn
q 1 0 0 1 187.231 323.9521 cm
0 0 m
-2.557 0.263 -2.657 0.273 -4.231 0.228 c
@@ -4338,636 +4337,656 @@ q 1 0 0 1 187.231 323.9521 cm
0.724 -0.122 0.312 -0.042 0 0 c
f
Q
-0.188 0.314 0.086 scn
+0.114 0.337 0.224 scn
q 1 0 0 1 183 324.269 cm
0 0 m
0.335 0.003 0.669 -0.002 1.001 -0.014 c
0.701 -0.01 0.211 -0.214 0 0 c
f
Q
- endstream endobj 981 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1051 0 obj [/Indexed/DeviceRGB 255 1052 0 R] endobj 1052 0 obj <</Length 428/Filter[/ASCII85Decode/FlateDecode]>>stream
-8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0
-b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup`
-E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn
-6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1
-VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH<
-PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O(
-l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 962 0 obj <</Private 963 0 R/LastModified(D:20100413200510+02'00')>> endobj 963 0 obj <</RoundtripVersion 13/CreatorVersion 13/ContainerVersion 11/AIMetaData 964 0 R/AIPrivateData1 965 0 R/AIPrivateData2 966 0 R/AIPrivateData3 967 0 R/AIPrivateData4 968 0 R/NumBlock 4/RoundtripStreamType 1>> endobj 964 0 obj <</Length 974>>stream
-%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 13.0.2 %%For: (Gilles Dubochet) () %%Title: (type_tags.ai) %%CreationDate: 4/13/10 8:05 PM %%BoundingBox: -227 -99 143 234 %%HiResBoundingBox: -226.5 -98.5 142.5908 233.748 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 434 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: -59.5 -62.5 -46.5 -49.5 %AI3_TemplateBox: 40.5 29.5 40.5 29.5 %AI3_TileBox: -239.5552 -349.6377 319.4453 433.3623 %AI3_DocumentPreview: None %AI5_ArtSize: 841.8898 595.2756 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 5 %AI9_OpenToView: -285.3354 49.2085 4.4426 1589 965 18 0 0 470 360 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 77777 %%PageOrigin:-399 227 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 965 0 obj <</Length 7512>>stream
-%%BoundingBox: -227 -63 143 234 %%HiResBoundingBox: -226.5 -62.001 142.5908 233.748 %AI7_Thumbnail: 128 104 8 %%BeginData: 7364 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD0AFFA8282F53FD7CFF06A8FF5359FD7AFFA92EA8FF537EFD7BFF %53282E28A8FD27FF2E2828A8FD51FF847EAFFD27FF5953AFA928FD7BFF59 %2EFFA82FA8FD7AFF847E7E2E59FD7CFFA87D7DFDFCFFFDFCFFFD31FFA9FF %FFFFA9FFFFFFA9FD76FFA9FFA9AFA9FFA9AFA9FFA9AFA9FD1AFFA87E537E %A8FD2BFFA8A9A8AFA8FD23FFA9A9A8A9A8A9A8A9A8A9A8A9A8AFFD17FFA9 %7E282F282F282F2F7EA8FD26FFA8532F282F282F53A8FD22FFA9AFA9AFA9 %AFA9AFA9AFA9AFA9FD16FF7E2E0128062F292F292F062F7EFD23FFA85906 %28062F282F2829065384FD1FFFA8A9A8A9A8A9A8A9A8A9A8A984FD16FF84 %28062F292F292F29542F30292FA8FD21FFA853062928FD042F542F30292F %84FD1FFFA9AFA9FFA9AFA9FFA9AFA9AFA9FD09FFA8A87DFF7DFFA8FD04FF %A8280529282929535353292F292F292FA8FD1FFFA92F00280629062F292F %292F292F292FA8FD1DFFA8A9A8A9A8A9A8A9A8A9A8A9A8FD04FFA87DFF7D %FFA852275227277D27A8FFFFFF530628282F5AA9FD04FF7E302F302953FD %1FFF7E06282FA984A82F7EA8A9847E2F302953FD1EFFA9AFA9AFA9AFA9AF %A9AFA9A9A9FFFFFF52FF5227527D7D52527D527DF8A8FFFFA8002806297E %FD07FF7E30292F06A8FD1DFFA905280653FFFFFFA9FD05FF7E292F0684FD %1CFFA8A9A8A9A8A9A8A9A8A9A8A9A8AFFFFFA8527D7D27A8FD05527DFF7D %A8FFFF5328282959FD04FFA9FD04FF7E302F2F59FD1DFF7D28282953FD0A %FF5A292F53FD1DFFA9FFA9AFA9FFA9AFA9FFA9AFA9FD09FFA8FFA8FD06FF %A82E002806A9FFFFFF7E067EFD04FF292F292FA8FD1CFF5300280653FD04 %FF5A5AA9FFFFFF7E2F292FA8FD1BFFA9A9A8A9A8A9A8A9A8A9A8A9A8FD14 %FF2828062FFD04FF2F2F29FD04FF542F2F28FD1DFF2E28062953FFFFFFA8 %2F067EFFFFFFA92F2F28FD1DFFA9AFA9AFA9AFA9AFA9AFA9AFA9FD12FFA8 %28052828FFFFFFA82F292FA8FFFFFF2F2F2929A8FD1BFF842805280659FF %FFFF8407292FFFFFFF842F2929A8FD1BFFA8A9A8A9A8A9A8A9A8A9A8A9A8 %FD14FF2828062FFD04FF2F292FFD04FF54292F28FD1DFF5328282953FFFF %FFA82F077EFFFFFFAF292F28FD1DFFA9FFA9FFA9FFA9FFA9FFA9FD15FF53 %002806A8FFFFFFA92984FFFFFFA8072F0653A8FD1CFF7D00280659FD04FF %532FA8FFFFFF7E29282FA8FD1BFFFD04532E5353532E535353287EFD13FF %7D2828282FFD09FF532F28297DFD1DFF7E28282853FD0AFF53282953FD1C %FF5300280006002800060028000053FD13FFA92828060653FD07FF532928 %2828FD1FFF28280053FD09FF7E062806A8FD1CFF2E050028000600280006 %00280053FD14FFA8062828282E7E84AFA87E292F282F06A8FD1FFFA80628 %53FFFFFFA8A9FFFFA87E282F067DFD1DFF53002806280528062805280606 %53FD15FF7D0028052806280628062806280059FD21FF7D0053FFFFFF7E06 %2F28280628012EA8FD1DFF2E06002800280028002800280053FD04FFA8FF %FFFFA8FFFFA8A8FFA8FD07FF7E06280628282806282828067EFD23FF5952 %FFFFFF7E28062828280053A8FD1EFF5300280528062805280628050653FF %FFFF7D52FF7D52A852A852A8527DFF7D7DFD04FFA9A82828000600060028 %28A8FD24FFA8A8A9FFFF8400060028287DA8FD1FFF280600060028000600 %2800060059FFFFFFA852A8277DFF7D527DA8527D7D27A8FD07FFA87E597D %537EA8FD2BFFA8282E7D7DFD22FF5300280528062805280628052853FFFF %FFA87DA852527D52FF527DA852527D27FD3AFFA8FD25FF2E060028002800 %28002800280059FD04FF7DFFFFA8527D7D7DA87D7DFF7DA8FD60FF530028 %0628052806280528060653FD72FF2E05002800060028000600280053FD72 %FF5300280628052806280528060653FD72FF280000060006000600060006 %0053FD72FF7E2E532E5353532E5353532E537DFDFCFFFDFCFFFDFCFFFDFC %FFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD9AFFCACAA8CAA8CAA8CA %A8CAA8CAA8FD74FFFD0DCAFD18FFA8A8587C5883A8FD53FFCACAA8CAA8CA %A8CAA8CAA8CAA8CAFD17FF7C51262D2C2D2C5151A8FD52FFFD0DCAFD15FF %A82D2C262D2C512C2D2C2D2C7CA8FD29FFA87D5258515858A8FD1EFFA8CA %A8CAA8CAA8CAA8CAA8CAA1FD05FFA8FFA8FD0DFFAE2D2D2D512D572D572D %5757572C7CFD28FF7C51262D2C2D2C2D2D58A8FD1DFFCACACAFFCACACAFF %FD05CAFFFFFFFD047DFD0DFF2D26262D2C2D2C5757582D572D572C7CFD25 %FFA82D2C262D2C2D2D572C572C2D7DFD1BFFA8CAA8CAA8CAA8CAA8CAA8CA %A8FD04FFFD04527D7D7D275252A85252A8FFFF582C2C2D2C577CCFFD04FF %FD04572CA8FD24FF2D2C2C51517C83FF57572D572D2D7DFD1BFFFD0DCAFF %FFFF52A8522752FF525227A8A82752FFFFA82D042D2C2D83FD06FF572C57 %2D2D51FD23FF5126262D2CA8FFFFFF582C572C572C2D83FD19FFA8CAA8CA %A8CAA8CAA8CAA8CAA8CAFFFFFFA8A8FFA8A87DFF7DA852A87D7DFFFFA726 %2D2D2D83FD05FFCFAE2D5757572D57A8FD21FF832D2C2D2C57A8FFFFFF58 %57335757572C7CFD1AFFCAFFCACACAFFCACACAFFCACACAFD12FF5226262D %2DFD04FF832C572D572C572D572CA7FD21FF58042D2C51A8FD06FF7C2C57 %2D572CA8FD18FFCACAA8CAA8CAA8CAA8CAA8CAA8CAFD12FF7D042D267CFF %FFFFCF2C572C572D572D572D2D58FD21FF272D262D2DFD07FF58572D5733 %2D7CFD19FFFD0DCAFD12FF5226262C51FFFFFF832D2C2D2C572C572C572C %7CFD20FFA82D262D2657A7FD04FFA8A7582C572C572C58FD18FFCAFFCACA %CAFFCACACAFFCACACAFD13FF7D262D267CFD04FF572D2C572D572D572D2D %83FD20FFA8262D2C512D57A8FFFFFF57572D572D572D2D58FD18FFA176A1 %76A176A176A176A1769AA1FD12FF7D2D262D2CFD05FF7C7D7C572C572C2D %2CAEFD20FF832D262D2C512CA8FFFFFF572C572D572C572C58FD18FF4BFD %0420442020204420202076FD13FF272D262C7CFD07FF2D572D512658FD22 %FF262D2C2D2C57A8FFFFFF57572D572D572D2D7CFD18FF76204B444B204B %444B204B444476FD13FF7C042D262C7CFD06FF572C2D2C2C7DFD21FFA851 %042D262D2CA8FFFFFF582C512C572C2D0483FD18FF4B20204B2044204B20 %44204B2076FD13FFAE52262D262D518383A8A7832D512D2C58FD23FF7C2D %262D2C2DA7FFFFFFAEA857572D572C51AEFD18FF76204B444B204B444B20 %4B444476FD07FFA8FD0CFFA72D042D262D042C262D042D262651FD24FFAE %2626262D047DFD05FF582C2D2C2C58FD19FF4B44204B2045204B2045204B %2076FFFFFF7D7DFF52A87D52FF7D52A852FF527DFFFFFFA852042C262D26 %2D262D262C52FD26FFA8042D262D2CAEFD04FF512D2C2D51FD1AFF76204B %204B444B204B444B204476FFFFFF52A87D52A8FF52A8277DA87DA85252FD %04FFA87D27260426042604517DFD28FF7D04262626047C7D7D582D26262D %A8FD1AFF4B442044204B2044204B20442076FFFFFFA8275252527D52A852 %27FF52A85227FD07FFA77D587D58CFFD2BFFA82D26262D262C042C262D58 %FD1CFF76204B204B444B204B444B204576FFFFFF7DA8FF7DA8FF7DFFFFA8 %FFA8FFFFA8FD3AFF7C51042D042626587DFD1DFF4B442045204B2045204B %20452076FD4DFFCFFFA8A8A8FD20FF76204B444B204B444B204B444476FD %72FF4B20204B2044204B2044204B2076FD72FF76204B444B204B444B204B %444476FD72FF5244204B444B204B444B204B2076FDFCFFFDFCFFFDFCFFFD %FCFFFDFCFFFD2FFFA8512CA8FD7BFFA82D588304A8FD2EFFAEFD4CFF27FF %832C58FD2CFFAE5151A7FD4BFF2D517C04A8FD2CFF047D7D2C83FD4AFFA8 %7D58A8FD2DFF2DA8CF047DFD7BFF26587D26A7FD7BFFAE5158A8FD7EFFAE %FD42FFFF %%EndData endstream endobj 966 0 obj <</Length 65536>>stream
-%AI12_CompressedDataxœì½ë’$Çu ùùµ?dFš-ºÂãܵ5««³CF3š•ÁŠÝ°G}ú"‰óôëçò?žÕ€@Jfè$Øíž‘™áŸŸãá_Æ_ý¿ùò³«oÿðøÙôl¸8ýÕ_ݼ{|øðöݯ.´öâóW¯>¾ÿðNª~ñÛ_^”úªú¢«Ï÷¯ü…ÿõñÝû—oßüJŸz6Ö'ïeë_üõËW¯ß_Ü~üÃÛç|üðË‹_ü²>÷»—^=Ög?üéÛǯ><|óþÙÃË_ò®u7·êÓóe™.Ëp±ÿjX.~óëúüõÛo^¼|óÍõÛþÕÅgã¸]|vež.Æi®Ïÿ§—¿}|þ¢õÙR_¶×ÿ/óøl9†½¾zz¶Í{Ýâöíó¯ß|øÍ»·Ïß¿¿yûêí»÷¿º¸ùÓÛ‹_?|SŸy¸øï¯^½ý§‹ëWÏÿ>mrÿö͇úÒ_ÿéݡuûÏ~ûøÍÇWïÒKþæññÅã‹ï~áÕçËW÷/_=ÖcõúáÃÅ!Gõêó2~uýñå«óñõëAœå»]}>}¥Ÿî÷ïëǪŸPþ-ÕÛWŸ¿®5_>~øP¿t}i™ßþõuþFµR¿ø»úÖ/µ!ëQþ¿ôݾ{ûíë‡w_·ýl9äh­£üÿ¬Gn®5öºß=¾þöUm=°óPŸåÕñ/Uý>~è§Z¹,ãÅgSÝÉ:mÛÅTŽgó¼Lõ;MϦuœl›Ö
-ÿøòñŸ~uñ7oß<Úá¹z÷áË—ÿ«~á}.ÏöýØ/–cy6nËjÏÿöã«Çw¿óRŽ°Vv˜~ýöÅã«Úc/÷¯ôè裴ÿ·üîáÝ7jïyûêãíÈûàOÕfø/z”n±Ø|ñíã›ß½ý¯úI?÷åÙ4-óEýŽã°×ãQ¿á¸^”e?.Žµöº]ßlÞ†‹iå틾¹:ÙŸì·ÙäOmÅßÔvýâÝËo^¾ùÕgSíèµÃ[‹ÿõ»—/ZƒoãÅnÿ§_èÙžþ;øÏ>y=><¾ñãR;ÚͯSÇžýúËú¶wo^ܼ}-íñ^ιÚcÞÔÎôêí7ö\ü[Ÿ©›üöôw§é¸ü‡o?<¾¯ûzõX¿øå7ïþññ¢ŒûåÕ‹—ïê3ï/¯ÞÕ§/ož?¾¨\x¸¼{xþñÃãåß|¨½ýñò ^vºü}lñ`/yн]><ù®v•¯_=þóåC{mÿ ;ÎÎuËÓå£mú˜6}ŒM_Úî_Úk^¦×¼Œ×¼ÑÝŸ.ßÚkßÚkߦ׾׾µòÑ^úÑ^ú±½ôtù1^ûâá›oß]¾¨ðññòy=Þ—ï?<¾{%ßâýãs醗øXùùáòÛ‡wr¾ýãeÝâõÛxUÒ;=™ëÞ^\>ûmÅË7üpYOîr:_Úgˆ·{öæí‡__^Ý]~ñþÕÃû?ž¢êÛJ÷×/ß|l/âï?=¾¹|ýñ¼úôäuüýöÝ‹¯ë®^¾y”¿~xÿüã+)ð‚‡ZïïþßË—|ñöŸÞ\>þóóW¯õŸµw½|þðªn[}]Ïè—ož~Œo>ÊøòúmN¾þÐJv$*¶_~+ßüý·Ï/¯¬1®¼³ù_w—o¥¼yQ?ÒåãkýK;r=ĺS
-¶O-µz«|ñò_J‰ƒÇü¿Ç¿¾~÷`-z÷ñÝ[ý¤z¦ÄçÖ’îîtùõËú…½{Ôw¾ü¶¾ÏÛÒA´­Ûyö‡‡÷ñµP_úáo?¾¯]äty•ºè]ú÷•õŒ»øpwvh>·úÏswý<^ô¹½è {Ñi|ï/ì¿·Wü>ïæ÷öÔ i©÷ï_^¦­­!^?<'ý½Ž
-éÐýòù§ÞàÏÇ;ÙsÆ›ÕðîÝcÛ^‹üýº¥žÙ/ß¿n½1ÕüFÈóüÕã—ª!Çëyo·_׬&6­½{ó¯Þ~›>dÔÔ!ëâ¿=¼ûöûv-ÍT‰ù¢ž!z>·Ãøöõ·’÷]|ùLJoõã~øã½¾òËÐ_=¼©8×úØ¥à§ößʳIV;]„û}Ÿ}ö=L\.®ß¤§ÿZ°\ǹ_É®ß<êg°š‹òËÓ'ê*sÇ‹ë5àþ¿Oƒü)Ã4ÌÃ2¬Ã6ÃÕp=Ü wÃ})¥ò¼,e«ÇQ®Êu¹)·å~Æ2Žã4Îã2®ã>ãÕx=ÞŒ·ãíi¼ï§aªÙñ4O5_›öéjºžn¦ÛénºŸkú\SÑš¾Íë¼ÍÇ|5_Ï7óí|7ß/ÃR–q©iв.Û²×íj¹9-·ËÝ:¬e×i]ÖuÝÖ}=Ö«õz½Yo×»õ~¶²Û¼-ÛZ“ž};êãj»Þn¶Ûín»ß‡½ècܧ}>íó¾ìë^_·K.xµ_×ÇÍ~»ßí÷GýþG9ê7:¦£~¼c9ê{Õýí‡ü¹:®ëã渭»ú¸¿ªGëtUÍU=WÓUý>WõS_­Wõ\Õ}_Õm®äÏu}ÜÔÇíÕ]}Ü_Ý_ú¨õº¼ø»«Óu=(×Ëõz]¿ƒ|¸k}ÛkÝǵü¹©Ûú¸»¾¿¾¿©­uS[æf¼©‡ùf–Çéÿim;zëZûîÑ·Úƃ¶òTÒÒk´5­}§í-->¢É·®Ñ­Å‹·ùâ­¾OGjyiû!µ½¶þé;šIàz¹‘°Ü×>@/˜½œ÷„»“wéSí¹K\E—ÐNÝB;…÷‰Uû„õ
-é7§Ú-´c|²k,Ú5¬s\iç¸ÑÎq×:‡÷IûFí'í»v
-ë·Ú%¬CÐrëÚæ7­µÿ¥¶í[—ö•Öµö]»óÙÛøä<~¢ieÚùûZúÖ[ºœjc·¦Þõ¿óÓ½oñÖæ´º¶»¶|m÷“7½5þyó;
-´ý Òä¿Ö¬'€‡«“v:„q‚.!bÒNA· cÐ5è§Ú=¤ƒXG¡«´ÎK¤Ã|OZÛþ„þB;,ñоU{ªôÕ9ú«õXé³ÇÉ;í9”æ³ÎzƒÏ¬½Tú¨QHú¦ôKé•Ûtœj‡”î(Ž g­½OúÞmíw¥ö¸¥öµ£ö²ÛÚ»ŠŽ+›v%éF÷µûLµÃ쵓Ülwõ#Nûrªàп¯-;ÕvÜkËÝÖ“|¬'öZÏçë«ÛzõÌÝj£Þ\ßÕ¯3Ý,µ—\ÝÜÜÜÝXÛÞßßßÝßÞßÔ3ùêþ¨g«}v¹Ÿï§ûñ¾Üw÷www·w7w×u˜8jçÚ*Ö–»¹t¼+wÃíýíÝíííM¥ÿ•ôšSåÓv»Öse®'ßx[n‡›ûún·õ=¯ë;õý·zz,uT˜êQn†J‘»J“›J•«úI÷úy×ú©çÊ: ®‡
-£»
-¥›ú•®êÛë¹²Ö“r® +͆ã¾vÕÛÚm¯k>êØêáXj'Ÿj‡/ÇPχ;åæM=K®Nõ¸íõè­õTšë¡ë 6TþÞÕÓ‚Wõ„Ø뙹ÖC>ë9[¶¡žÉwµ)nê¹}Uf¯Í³ÖFškSU”u¨\¸«­wSÛðª¶ä^Ûs­­:׶k ó}eÌmeÍum÷Cù³V͵7ŒµOÔN8ÝWTÝÖ^r-å¨çûVy¶Ô4Õ~T¦a¼¯½ê¶ö­ëÚÇŽÚÓ¶JÅ¥ö»©ö¿2å¾öÇÛÚ+¯ËÕ¿EÛ¶e¯k¤òÓ´¬¶«4ëé§lWiÖÓm×ÖªÖ¨§Óª•;{Ù~lÛ~²uÿÍÏÛݾÿšóö{[ødMüÓµ0çí8skÛÎõÕõ»š É\Ô2\”aš/OõUª¹~*VŠg£\Ÿ»¾4ŽDë‡ehã'2´Q2´92´E"%5¶³Aòv¸×üL†ÉÑc»M‡ÊÝc÷ëúoå‹z`'ƒ¦›§z$dä”±s×ãcÞExãY”7i”'#jŽôöR¼w’Oƒ>yX‚7i{-.Z (#±ŒÅ׳å*·Êãޢ“†Žò°}-,J¸¸iȸkØhÿx
-îyä—è7Ú®´X,ÚôŠs]ä$8ltöØŸ"玞G7JŸÃé³iΚ]i ÖóÞÛ6“Sw=ÕïayZ}»zPzd ‘¡F›Iûl>è #ÃŽ <2ôÈàs¥Ùç®C B2 -z~ÙP4ž´× :"ɘ$£’ŒK22Éؤq¥„o’Õ!J)¦fíí£>.ƒYuÐ:é¸%#׎^2~É&c˜Œb›Žd«ž}vÎO:¦ÞmÛîu|“îö¤ÃÜ͵ý¹ÒáîÐ!o×aO¾U¿EÀYÁIBæRä¡3,’ZKàs¯Ãc}h_õ}ßøãÖwñ°d“+CL±Ø4 É2áâßl‰Çê-{<Žx\ŃÏâNõ¿Ûô¸‹Ç=Û!%=ÆxLé1Ÿ´ í±¤Çš[÷Ø»Çqþ8i_ñ‡Ô'4Ÿž¨›¾c^†©ºÑSïõôStÅç`òäÜ•'Ò5‰Ö™—âóq2S.§<ãò½ó-ÝŒKš[[¼M­ ¯NÞ`·Ö.Þräí0ÛAµÃ'ï+ìFÏ79ïîå,Ô³Q˜!§ç|ªçé¢zÀZtRG¬­I"5HÉøTÇ& ,ôµ˜hÖÁFb¡kZ–J €NŠŸ+&†úaê™XãŒÍ‰¼¤ì6¹Tóó˜^5/¿©ß×BŒ–‘Ë|‘ÄA0|{’pAcËÉ7n5/·‰-ÅNFOO8)N¾rÆ´Hy ¢8KA¤Òì/;cS+[[ _iójãjÓZÃ.Þ¨‡7¦5dÑ&œµå¶SÅïQYs]?ëmô½„k[Iˆs¿Ú7=)ßìS$ý,=u0½¦TßSÃ3´¹ Ìlz®f·)$#›|²ŽéºíäAá³v>o—;°ž„9¤ZÈë;îœ07š©\ë¹}¥çø¡Y‹>Nž¾XA 1k01i@¡!…=dŠNƒ‹;Ÿš¸UÛˆrE¸±k³錟³¢hÒA»† !ˆ%A·ŠH0r­³dפHÓ¢“gF‘ÉC£”§\{žd™’Å,–/YN¬‘‹'Mw'Í›,sºò×ÒÓ§so2ÎëCGüáúì±ûãÐÿ·i¹ú8é_s÷`Ïfòòü^ù©¦ ÿŒ?ÿ{vh¼¶Œ«]‰ž%Ó:4À¸ÑéÈQÃ:AŸ¤RrVßi5iÒdés‘:'~ªç\û²©p;¿f’”læJ§%¹ä5ëÔ¤ôGGïtzÒÆPFÐë“ÌSž žŒœ:j¦1“ñ2FK¿J!gçâ#¥“2R2J¶1ÒFH»kOçäLì<9<'> ÎÞÌÏâNúË
-_V8¦E…ƒõ¾’°Žÿ' n<,¸ö¶dõë¡1„]£[5²˜µ…íaë`ƈD$*©Éæ` Øb9Ì/‡¹ópÆÅø(ÏׄOÆÉ~½>{¤Ñ÷¤ –úÇùŸ~l¿ïGþ³¨ < Æ>®Ð5QýcyòHË)þ¹=yìùaK¿{Ùáw,:L8nº‹û‰ž|úúlÉa
-GçXFq‘~ÇjC¥>¥‹öyÚ÷,¦è–¢µÅh¶¾ðæ”–X•fëÒVï(Ú!ôøÄòþ¼ÀÿJÇÖ›65í«ûóâ±óUý¾xìäSÕ?hõØw®öh.ÊICïZðáK>b2[¯g¤ í¼îÃW~œ|ñG7«­×ºÛĶNmŸE?rÀý Çnâ‰}DÒ‡?n?ßEü9¿jÐ~gÇï£F¿yûêï.nß~à7@jÌñ´îb|VÆå¢<Ûš ÊEq)nr]z]êWü¨ÓWßêüCñ_ùÛ?iñ?×þÏZùOóů/þî /´þo[ÿò=±ã×µª«ÿ5þnZÓ€\•·{£ïóÅXð·ÿÖŸñk?zG/ÿôœ¾ýZžmò‰ëÆëR?Ük¯;¤fÙK¹ÐWÚ,˸ÎZž×UÊóZ»ÛsÛb=|=Ã:NòY¼¬¯ݦîKßeš6YêÑ’*YÖ,/™÷q–r=ƒVÝd²öáíâƶ™d{©+¶I R¤X?Q±]ÔS®–åCø»ݤjÙ¦Q_2¯»–e¡„–í]êâËÔPh•ºš¼ìúšJ9)×fÖ/·”Aߦ+{€¡žÚëQþ´ÚAÛ')WHlR>ä'ky™7ŸÚª“ÕMG¥G-O5–ºX÷ú—UÊË2mZ.›l“¾bßyAÝÙÁ0Êñ˜êZ7-×Qζ˜êá]©+è¯
-Ô0K¿â!ãž³žÐ{íûV^´¼Õpƒm¬ÅêW¬¹¾f·CR75ö웂ÚEœ’ûhU Kô%5¨Ðò4Z^ÖÝ€V{¯ls_ÿ[æz,=è¤nœ‚tR,c#]-5qëH'u£}bíÐK=Ö­‘NÊe^3éjÕ¾ÎtR.K#”§¥'Ý"§å¤“—ŒK#–‡Žtº×­‘®– ÛN:-/=é¤N“NÊÇØH'ûœ§žtòç¡‘NZi¤«åÑɤ«uºtµ¼ÎS#Ý"'åÚ‘nY*PfH·È¯½tµ<GOºZ·G#]-ïãÖH·Ôèk(éjÕ(? éj¹¶#<¿=éjݤ„wÒÕò²­tµ¼KOºZ·KnÙž õxC:)n¥'Ôík#–kuµ\äËfÔIà
-ÔÕ²\÷ ÔIyzÔÉ6ÇÐP—ö!¨“â´ô¨“º25Ôék¶†:-¯=ê´nj¨“ò26ÔÉ׫§`‡:9ÛÞP§íY꤇ìSºÚ‘]Wi¨«E™x Ôi¿+=ê¤on¥¡®–kÜÑPW˺mFôqÙÔ)[¶†:-ï=ê´îh¨Óófj¨S ê„5ÇÑP§å½¡NÊûñu5Ϙ§£#T-먓ruR.SéPWë¦u˜uR†=PWË£…ë®Ö”cÛƒtR®í¤“òºéæÈɳË1ä´l ÈiU™rR.(…œ”{ƒ€œd]ÇQrò‹î”qRÜ," ÆÉ7Û¦#§GkÞƒqµ¼J•WëöÁê”qµ|Ô*7ËÙX»vb\­š‰ß rµ¸X•qµ¸­BãjÝQ³÷`ܼ?½(WËÓ4/äjÝâq–B®–õØ
-é¤ìçNnÓC7éäDí„RÒm’· ƒt›æ­Sn×¼µ‘n×¼uìH'sü»ÅFJº]òÖa Òíš·vA]ÅSí¤+¨;4q-:™ª? kºC×} Ôš¸. uÓ̵Vu™k-w™«<ž¹–¡Ï\ËÐg®µü$s-C—¹–Òe®R<Ï\¥.g®ZN™k)O3W©Ë™k-w™«”Ï3WÙ&g®iʺò4s-¥Ï\õ5)sÕòYæªu)s•rÎ\Kyš¹–¡Ï\¥=å«ÃºãiâºkÞZ@LÀ¯FGEÝþ4oÝ%-GN§Ë)H·ë–sG:ÛF Ù”t»¦­cnš¶J9§€NΚilÝ®Yë˜A·kÖÚ"º]³Ö)@·kÖ:?¬õÔUx™tƒæ­s›¤$Ú¶-X7Hæ:ì}\§?s´·ÜuÔUÓnÜu0¬‚;Ç6®wƒ¦¯@Þ ùëñ`'=¾vÏ´4ŽŒ;©+rúÁ»ÁŽh à Ò
-»1ˆ7ØAlÈ“~9¬÷*óÉc·¥ÏdMd`J½A3Ùqì šÊ–µãÞ ¹¬ì ðÉ×UâFŒ§Ùléb<Éfç _é²YY^4YzÜB<If§Æ½Q“Ù¹e³’ÌÎ[ŸÍJ2kl´lVQiÙ¬$³ËY6+ÉlŠñFï×–ÍNšÌ–~ÊN“Yòdš³ö#?J:g'ɬ RmÎN“ÙÒæì$™]–6g'¹Ñ´ösv’ˆZ²9;Ifž6g'ɬ•Ûœ&³S›³ÓücŒ9;Mfç~ÎN’ÙmisvÀƒ9;Mf§~ήOf'Íe[2;=Íe'Me÷„L˸µ¯ÆZŒ×å²ÛaÚ‚{Òí–áØ;òI眎Š¾A“Ùq ö šÍÚ<`ÀON·ŠÌA?9Ê<¬?­á.P*E‰f
+ endstream endobj 1370 0 obj <</I true/K false/S/Transparency/Type/Group>> endobj 1308 0 obj <</Intent 1371 0 R/Name(Guides For Artboard)/Type/OCG/Usage 1372 0 R>> endobj 1309 0 obj <</Intent 1373 0 R/Name(Base)/Type/OCG/Usage 1374 0 R>> endobj 1310 0 obj <</Intent 1375 0 R/Name(Class)/Type/OCG/Usage 1376 0 R>> endobj 1311 0 obj <</Intent 1377 0 R/Name(Trait)/Type/OCG/Usage 1378 0 R>> endobj 1312 0 obj <</Intent 1379 0 R/Name(Package)/Type/OCG/Usage 1380 0 R>> endobj 1313 0 obj <</Intent 1381 0 R/Name(Object)/Type/OCG/Usage 1382 0 R>> endobj 1381 0 obj [/View/Design] endobj 1382 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>> endobj 1379 0 obj [/View/Design] endobj 1380 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>> endobj 1377 0 obj [/View/Design] endobj 1378 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>> endobj 1375 0 obj [/View/Design] endobj 1376 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>> endobj 1373 0 obj [/View/Design] endobj 1374 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>> endobj 1371 0 obj [/View/Design] endobj 1372 0 obj <</CreatorInfo<</Creator(Adobe Illustrator 15.0)/Subtype/Artwork>>>> endobj 1307 0 obj <</BaseFont/JEFNSX+MyriadPro-Regular/Encoding/WinAnsiEncoding/FirstChar 49/FontDescriptor 1383 0 R/LastChar 102/Subtype/Type1/Type/Font/Widths[513 513 0 513 513 513 0 513 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 448 564 501 292]>> endobj 1383 0 obj <</Ascent 952/CapHeight 674/CharSet(/one/two/four/five/six/eight/c/d/e/f)/Descent -250/Flags 32/FontBBox[-157 -250 1126 952]/FontFamily(Myriad Pro)/FontFile3 1384 0 R/FontName/JEFNSX+MyriadPro-Regular/FontStretch/Normal/FontWeight 400/ItalicAngle 0/StemV 88/Type/FontDescriptor/XHeight 484>> endobj 1384 0 obj <</Filter/FlateDecode/Length 1244/Subtype/Type1C>>stream
+H‰|SmPWÝ%ìF*MÛÄe4¡»«µ#"b(‚¢8
+6cˆ3~u &jÑ’v¦­ !:T,~à h2UÛ‚+h‘ÅÔ¢‚2ѱTíön|™i7ôOõÏ™{î™{Î}oÞñà ÇñYiéÕyKsö9­Ne4,Û¤ßU^¢5D†Wàüü`><”B+ãåË—Ùô½·ßè ~&Å‚püÞãTC™0»k·™]‘˜@å,&D³q±±±³¨d×ë …zV½ßdÖï5±™¥Ec™Á¨5ëu1ìú’vÖÂÄõ&½±"Ðüw#–3±zμ[odµ‚¸‹æzk6juú½Zc1k(ÿ¡;ÿ'ŠåJYÁ‹Õ”r¦6 M«-Õ-\ ³)E†òR³‘Ó›b–§«s÷—éÙU¬N¿ÃpLŠcT¶
+ ®«¥=U“¨xsëÑ2¦<ƒ¨<×W9¢€…/ž‚lL{=¯i+*hÌS˜Ú¬˜6XM€”X† wbFñ¯'á¤à­ôERUå¶Ï÷1‰§îÑlž“µa[š'GÉÓÂÇ BAšô‰Ss9m m%
+÷6ÂQŠ| WZœ' $ZFt|ò0”TJ]^83)sóK|ºd»Ê .¤(PHDŠ·3hÉt$„Üë½Øsšv²u Ä]ÒzÞê¾,çÇÅJuÐV}¨š–¹³ª4E*Ų‚±ßÿì¹?ýS×ÖÜfÆa±°È%X†aM?,êÇ]Á9!â ¡‚ªm´7“{ F+ÑÂxD¢ᄨў–ÃtU?q°XgÉVÄ¥¸a®•±÷S7\cÏN)smŒ„>Bü $àã“"Hãã!d…œßùjàÎé–Ï>m¦›†ˆ†÷5+
+·T¼‡)ÒUå¼'7gd úã…Çéô½Ó„¶9a¹Óíô›H>«e×û ÎïêÏÔ‹éã;Ò>9üwhÈà+Ss§êB_åçñoQÿ0
+%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 13.0 %%AI8_CreatorVersion: 15.0.0 %%For: (donna) () %%Title: (type_tags.ai) %%CreationDate: 4/4/11 7:44 PM %%Canvassize: 16383 %%BoundingBox: -227 -63 143 234 %%HiResBoundingBox: -226.5 -62.001 142.5898 233.748 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 9.0 %AI12_BuildNumber: 399 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_TemplateBox: 40.5 29.5 40.5 29.5 %AI3_TileBox: -239.5552 -349.6377 319.4453 433.3623 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 6 %AI9_OpenToView: -239.25 83.5 4 1355 732 18 0 0 43 154 0 0 1 1 1 0 1 %AI5_OpenViewLayers: 777777 %%PageOrigin:-399 227 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 1387 0 obj <</Length 7484>>stream
+%%BoundingBox: -227 -63 143 234 %%HiResBoundingBox: -226.5 -62.001 142.5898 233.748 %AI7_Thumbnail: 128 104 8 %%BeginData: 7336 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FD0AFFA8282F53FD7CFF06A8FF5359FD7AFFA92EA8FF537EFD7BFF %53282E28A8FD27FF2E2828A8FD51FF847EAFFD27FF5953AFA928FD7BFF59 %2EFFA82FA8FD7AFF847E7E2E59FD7CFFA87D7DFDFCFFFDFCFFFD31FFA9FF %FFFFA9FFFFFFA9FD76FFA9FFA9AFA9FFA9AFA9FFA9AFA9FD1AFFA87E537E %A8FD2BFFA8A9A8AFA8FD23FFA9A9A8A9A8A9A8A9A8A9A8A9A8AFFD17FFA9 %7E282F282F282F2F7EA8FD26FFA8532F282F282F53A8FD22FFA9AFA9AFA9 %AFA9AFA9AFA9AFA9FD16FF7E2E0128062F292F072F062F7EFD23FFA85906 %06062F282F0629062F84FD1FFFA8A9A8A9A8A9A8A9A8A9A8A984FD16FF84 %28062F282F292F29302F30292FA8FD21FFA8530629282F2F2F29302F2F29 %2F84FD1FFFA9AFA9FFA9AFA9FFA9AFA9AFA9FD09FFA8A87DFF7DFFA8FD04 %FFA8280529282907532F53292F292F072FA8FD1FFFA92E00280629062F29 %2F292F292F072FA8FD1DFFA8A9A8A9A8A9A8A9A8A9A8A9A8FD04FFA87DFF %7DFFA852275227277D27A8FFFFFF530628062F5AA9FD04FF7E302F300753 %FD1FFF7E05282FA984A82F7EA8A9845A2F302953FD1EFFA8AFA9AFA9AFA9 %AFA9AFA9A9A9FFFFFF52FF5227527D7D52527D527DF8A8FFFFA800280628 %7DFD07FF7E2F292F06A8FD1DFFA905280653FFFFFFA9FD05FF7E292F0684 %FD1CFFA8A9A8A9A8A9A8A9A8A9A8A9A8AFFFFFA8527D7D27A8FD05527DFF %7DA8FFFF5328282959FD04FFA9FD04FF7E302F2F59FD1DFF7D28282853FD %0AFF5A292F53FD1DFFA9FFA9AFA9FFA9AFA9FFA9AFA9FD09FFA8FFA8FD06 %FFA82E002806A9FFFFFF7E067EFD04FF292F292FA8FD1CFF5300280653FD %04FF595AA9FFFFFF7E2F292FA8FD1BFFA9A9A8A9A8A9A8A9A8A9A8A9A8AF %FD13FF2828062FFD04FF2F2F29FD04FF542F2F28FD1DFF2E28062953FFFF %FFA82F067EFFFFFFA92F2F28FD1DFFA9AFA9AFA9AFA9AFA9AFA9AFA9FD12 %FFA828052828FFFFFFA82F072FA8FFFFFF2F2F2829A8FD1BFF8428052806 %59FFFFFF8406292FFFFFFF842F2929A8FD1BFFA8A9A8A9A8A9A8A9A8A9A8 %A984FD14FF2828062FFD04FF2F292FFD04FF54292F28FD1DFF5328062953 %FFFFFFA82F075AFFFFFFAF292F28FD1DFFA9FFA9FFA9FFA9FFA9FFA9FD15 %FF53002806A8FFFFFFA82984FFFFFFA8062F0653A8FD1CFF7D00280659FD %04FF532FA8FFFFFF7E29062FA8FD1BFFFD04532E5353532E535353287EFD %13FF7D2828282FFD09FF532F28297DFD1DFF7E28062853FD0AFF53062953 %FD1CFF5300280006002800060028000053FD13FFA92828050653FD07FF53 %29282828FD1FFF28280053FD09FF7E062806A8FD1CFF2E05002800060028 %000600280053FD14FFA8052806282E7E84AFA87E292F282F06A8FD1FFFA8 %062853FFFFFFA8A9FFFFA87E282F067DFD1DFF5300280628052806280528 %060653FD15FF7D0028052806280628062806280059FD21FF7D0053FFFFFF %7E062F28280628012EA8FD1DFF2E05002800060028000600280053FD04FF %A8FFFFFFA8FFFFA8A8FFA8FD07FF7E06280528282806282828057EFD23FF %5952FFFFFF7E28062828280053A8FD1EFF53002805280628052806280506 %53FFFFFF7D52FF7D52A852A852A8527DFF7D7DFD04FFA9A8282800060006 %002828A8FD24FFA8A8A9FFFF8400060006287DA8FD1FFF28060006002800 %06002800060059FFFFFFA852A8277DFF7D527DA8527D7D27A8FD07FFA87E %597D537EA8FD2BFFA8282E7D7DFD22FF5300280528062805280628050653 %FFFFFFA87DA852527D52FF527DA852527D27FD3AFFA8FD25FF2E06000600 %280006002800060059FD04FF7DFFFFA8527D7D7DA87D7DFF7DA8FD60FF53 %00280628052806280528060653FD72FF2E05002800060028000600280053 %FD72FF5300280628052806280528060653FD72FF28000006000500060005 %00060053FD72FF7E2E532E5352532E5352532E537DFDFCFFFDFCFFFDFCFF %FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD9AFFCACAA8CACACA %A8CACACAA8CAA8FD74FFFD0DCAFD18FFA8A859595883A8FD53FFCACAA8CA %CACAA8CACACAA8CACACAFD17FF7D2E0B2E0B2E0B3434A8FD52FFFD0DCAFD %15FFA82D0B052E0B340B340B340B59A8FD29FFA8845959535959A8FD1EFF %A8CAA8CAA8CAA8CAA8CAA8CAA1FD05FFA8FFA8FD0DFFAE2D2D2D342E3434 %34123434340B59FD28FF7D2F0C2F2F352F352F5AA8FD1DFFCACACACBCACA %CACBFD05CAFFFFFFFD047DFD0DFF2D0B0B2E0B0C0BFD07340B59FD25FFA9 %2E2E0C2F0C352F352F352F357DFD1BFFA8CACACAA8CACACAA8CACACAA8FD %04FFFD04527D7D7D275252A85252A8FFFF590B0B2E0B345FAFFD04FFFD04 %340BA8FD24FF2E2E2E35358484FF5A36355A35357EFD1BFFFD0DCAFFFFFF %52A8522752FF525227A8A82752FFFFA82D052D0B2E84FD06FF340B34120C %2EFD23FF522E2E2F0CA9FFFFFF5A2F3635362F3584FD19FFCACAA8CAA8CA %A8CAA8CAA8CAA8CAFFFFFFA8A8FFA8A87DFF7DA852A87D7DFFFF84052E0B %2E83FD05FFAFAFFD04340C34AEFD21FF842E2E2F2F5AA9FFFFFF5A5A355A %365A2F5AFD1AFFCACBCACACACBCACACACBCACACAFD12FF5805052D2DFD04 %FF830B342E340C3434340BA8FD21FF59052E2E35A8FD06FF5A2F5A35352E %A8FD18FFCACAA8CACACAA8CACACAA8CACACAFD12FF7D052D0B59FFFFFFAF %0C340BFD073459FD21FF2E2E2E3535FD07FF5A35355A353559FD19FFFD0D %CAFD12FF5205050B34FFFFFF84340B340B340B340B340B59FD20FFA82E06 %2E0C3584FD04FFAF845A2F352F360D59FD18FFCAFFCACACAFFCACACAFFCA %CACAFD13FF7D052D0B59FD04FF34340BFD05342E2E83FD20FFA9282E2E35 %2F35A8FFFFFF5935355A355A353559FD18FFA176A176A176A176A176A176 %9AA1FD12FF7D2D050B0BFD05FF595F59340C340B2E0BAFFD20FF842E062E %2E352FA9FFFFFF5A2F352F352F352E59FD18FF4BFD042044202020442020 %2076FD13FF2D2D0B0B59FD07FF2E342E340B59FD22FF062E2E2F2F36A8FF %FFFF59352F5A35362F2F59FD18FF76204B444B204B444B204B444476FD13 %FF7D042D050B59FD06FF340B2E0B0B7DFD21FFA82E052E0C2F2EAFFFFFFF %5A0D352F352F2F0684FD18FF4B44204B2044204B2044204B2076FD13FFAF %58052D052D2E8484A884832E342D0B58FD23FF7DFD042E35A8FFFFFFAFAF %35352F352E59AFFD18FF76204B444B444B444B444B444476FD07FFA8FD0C %FF842E042D052D050B050B052D050B2EFD24FFAF282E062E0684FD05FF59 %0C352E2E59FD19FF4B44204B2044204B2044204B2076FFFFFF7D7DFF52A8 %7D52FF7D52A852FF527DFFFFFFA858050B052D0B2D052E050B52FD26FFA8 %05FD042EAFFD04FF592F2E2E53FD1AFF76204B204B444B204B444B204476 %FFFFFF52A87D52A8FF52A8277DA87DA85252FD04FFA87D2D0B0405040505 %2E7DFD28FF7D052E062E06597D84592F060C2EA9FD1AFF4B442044204B20 %44204B20442076FFFFFFA8275252527D52A85227FF52A85227FD07FF847D %597D59AFFD2BFFA82E2E062E062E062E062E59FD1CFF76204B444B444B44 %4B444B444476FFFFFF7DA8FF7DA8FF7DFFFFA8FFA8FFFFA8FD3AFF592E05 %2E062E065984FD1DFF4B442044204B2044204B20442076FD4FFFA8A8A8FD %20FF76204B444B204B444B204B444476FD72FF4B44204B2044204B204420 %4B2076FD72FF76204B444B204B444B204B444476FD72FF5244204B444B20 %4B444B204B2076FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFD2FFFA82E0BA8FD %7BFFA82D58830BA8FD2EFFAFFD4CFF2DFF830B59FD2CFFAF353584FD4BFF %2E2E5905A8FD2CFF067E840D84FD4AFFA87D59A8FD2DFF2FA8AF0C84FD7B %FF0C59840C84FD7BFFAF3559A8FD7EFFAFFD42FFFF %%EndData endstream endobj 1388 0 obj <</Length 65536>>stream
+%AI12_CompressedDataxœì½ë’Éu ùùµ?dFš-QáqîÚ˜ÕUÃYQ¤±ÉÍÊÆÚŠ@u#
+±ÖWõ8~ýîùÇøºRïÍãÛ§zÆøêckÙž¨~ý|óß<¼|¼¼²Î¸òÁæÝ]>Éy÷ª~¤ËÇ·ú—事u£4l›ÚjËmá«×¿-$vZìóÿÿúêýƒõèݧ÷OúIõH‰Ï­-ÝÜéò«×õ ûð¨ï|ùM}Ÿ§W2@´¯ÛqöÛ‡ñµQ_úñwOŸ>Ô!rº¼JCô.ýûÊFÆ]|¸;Û5?³å?ËÃõgñ¢ŸÙ‹~a/úEÚßûöŠßØ+~“7ó{ê•ôT=I_¦µ­#Þ>¼|/ã½r__öðR;¤íˆ>]þîÓ»¯ÞzûæáÓÇzÖSÃ?\¾|¨ë~}§,]þÓ—¿þPO í¼1}©˜º{÷òINò?½øòÙYõ3çÙ¿¿|þ²Ëç+ÌýÿÚU6ò6ýºF0§¿/kñcü¢lÓeÝWÿøéáMm¬—¯ß}U•HG ì}Ah xêΗƩìEÄ
+‚¯Þ¼zýÕW—õ‹¾ÕÓòå7ïŸ^}zY1ñºnñ£
+ÜáæþæîæöæææºÂà¸Ùëð^ë±3ßL7c=Û×÷×w×·×7õ3]ÕO¶×Ï·ÖO9×Ï:^—ÓõPOwõã LäŒrÔ¯³Õ/µÔ¯6Õ/X®†:`ïêð½©_úª~õ½î€µŽø¹Žþ± C=.îê"§À+ÙS{=€ÖºÛæz\õøê±vW¹›zô]Õcd¯»·îñº›çº³ÇºË‡J㻺ûoj'\Õ®ØëÓkí–yNõ¨/ë°Ü×Þº­}v]{î¨ý·Õ^\j_NµGË2Ì÷u§ÝVª\×¾>joµß—Êœ©† e¦û
+£»Š¤›SeÓU%{+k3s9c¥Ø0Þ×±t[GÔu=:¾¶J¼¥Ž¶é_×—ŸíÉÛýôÃöäõpŠžüúQºñô½úñ{õ¢uâééÅÚ‡táéû÷a=‹•q(÷ÿ›ôåyož¾çQù½{óô“Ñ›§?刴ެ}9_üÕ—×ïkr"E¨e¸(à K¾8ýÕ—iÉõ‡S±V<íú\¥5i‰Ï÷˘ÆÏdL£dLsdLrž#?"»©';Nwr›ô„G$&§="ëC#„kÏœêÐ;•ûˆËä\(gC9Jt&ñÚ•î³Ó<êÖÿîõl)Q›Ämõ¬yÒàm®;~Õ(Aœ„qÈ]i0'áÜö•üÿ­²ô^Ò‹³žÜå Èg9i~&áÞìÿ¿¤Çª!à¦a ýÿ®á¡Aá•ÿÿ•ž°¯5³»>Å?ëC_L»nkÕ!µø»MúÞ:¸ä¡Ó7þ¸ŠÇîú•Oõ›/>ðì잺›|·Éã&WñØõ!»|Õ‡ ÍIòÚIûÇÒgõQ»O»ÑWñØÓ#b]³©”S‰?2nâq›áº{\é˜ã±?NŒùCwªBhQÍ’$^—`‚?>WAØ#ÜQêH$
+‚á¤aý¦,wš¶Xêr£ÌÐò§½‹æ6-Ò­Z®[<£™4Â5ˆªCÿäé%8r\kØq¥e@Kv,ݱ”Ç’žQK‡zÀh@bé„%×'Ï‚,²LÈr¡)E)–ÝúÙãZwå¡rÓ½¼x\÷ýIc‹^,OºõèV" ÿo:{ŒÝcèšRÜ= Oú×µçößU<d)Ù‰=rܸwÍ*w'/ß­Nî^Ö£¸·¤R_‹3û·ÖzúŽJkþÜJþïö¶éߧ®Ðèÿ2Þ*­%ëvI®%¼FR%ÉÔáé“”…~VZ4ôÝzm±Bï¤Çœ—³õèšj/oÚçVƾÓª]xÚ£Z}ç¥ÆY‹»–o멳œê æ2ƒœ4ë S;UÊQv¥§H;=NZ€ÜôÂ
+²Ïíáô¹XÛNä$S$RG¤PK$O­Àw^â{Vä;}kÏ+}Ÿ)ô}g©ïäµ¾ï¬Ü~G©ïY±ïôýj·ß¿Øwú\µ¯+Õ½½âð¢cöy–Tã ©ÿX÷±ž&eöò2ƒ<u åXËÅx^çû6wýA6nó±Õg•ÂKýGÝÒº–¼©£"·Û´VTÿ1mu‘ljž^ Ó~±•SÝùíþ°›ÕO:Û¢ßp\ö¢3¼ëYkÚó7ÿ¦òÕG™ü=Úwׯ<Õåu,å½øÃlP?Ý: ó®ëîÃ2É7ê+·)omâ{n²Ùì6/Ú!ã P/Rÿ@ÛûSŠ½¿ªÿzxÓOy¾ì¢üezÌ_¦ÇüezÌ_¦ÇüezÌ_¦Ç|çÿ2=æ/Ócþ2=æÙ)™óï§/ÿ·›ó]Ó_þØÔ™qÆ4~&cûŒéúÙƒ¢ôu*S÷íÏ?§S*[QñÎíÏ=wý--ßàùg:ßìg
+U»4;ùɹH.&'è—fõZú•Ÿ©Û$3fêT3?kG,­çn‹Å-âl2×põÙg]E|˜§m°êkå°1ëg¯»¢+S×<Š†ë?ê‡)e·òk*–þ³jøR³VyÑzZµ>ʼ­Vt-«nð–}—÷šëÙHß«¦´Ç(5áy}1¬ÛÜ×ê¸Mþ)‘ÉoÞ½{xûøêâkÂ}­±Éç–vÑÉwžÉŸ={ô…}(q}|[û[bšÓgâ‘ÏÅSß7¥WœÎöÊ_E¯DLˆÄ%ÃSDå‡Ð£ÄôÐ+Ÿ*U¥I™q·ÝœÒÔP9ì·aK|½úq-G4¡õóAåØe6赨'=JW?B‰¨í˜´i Sšz«ôµ†Ò6Ùj²¤Èg|^—ãäStŸš[ê@´É¶ëmÎÄæ“ œýÆöQÙ.tïgk^Å<Í6KSâ
+fÙeF?$ÕŽ¸Tº9öXfϞƳ™CmÖÐOüòI˜:7`õy˜ÌÁœbîå`³.õ”vë«‚Xe]¢±]ûœk–µïOÚý³ÿÿä!UðŠ†zð ÿ»G?ô…:~<Tè#ˆgñE}\Ÿ=RÔrÒlýãüOÝ÷ÓY4Už‡[cé$¹þ±<{¤HïÿÜž=öü°©ªß>õ[&£v—¤ò4½"qÒBõ³©¨i"êìIÉžfÜ|~ªÎA=¥d#Ͻ9Ÿ—˜g&湉mv¢Í;½9¥I§%¦)ÚDÅÕŠÝ?zÙ©£)Mç¸5Ãõ6›péfâf¨‰q£áÐ÷˜Nø­ó~îÚ¼Ÿ“†hß6õÇ'ÿÄE)¿„óò ŸtòëLb*Ðuš$Ãâî,úúA‚’<Ê!
+ûW‡s}öƒl¯?åç)Ú/3ùO™Ôhí—Ooþááâöé#?oRcµçË.Æe\.Ê‹ýXg!ÍMf!¬Ký¦Ÿ´ÌuõÖ³ŠÿNÑßýA›ÿ©þó¿×…ÿt1_üüâïÿÛpñJ—ÿݯê_¾%6ü¶.êßêob‰¿›.é?@^”×{§ïó‹ý¬¿{øÿû£~å;qðØ>Ô·þÃúÑÖòbÛäMÊ‹µÆYúÙdÙ!K–½” }Å¡=·Œë¬m™ÇSÛó:/mõð©/ë8ÉkÖÊ(}Í0è:u[ú.Ó´°ÊR)Y4ʨíygi×CnÕUië0ß.nl)¤é²b«õ©M¦¼¬Å6Q•MŽ•‰w4Ê¢E~ÜQÚóºk»3Ö¶w©[ˆ/3Oã*Ëj<ºëk*"¥]û]¿ÜR}›zNÚc •ëQ{fZm§í“´+G6iò뙵½Ì›¿OíñÉ–MÇQ×_Le¨_c¯ßxY¥½È$i—U¶I_±o‹¼à˜äQÙSý@ë¦ízŠ´5¦º{×C–•aÔ×#ô5síÕÚ^ëþ§ ûl²Ÿë”eˆò’íXô»ÍuKûXVÝÄRp[g~!s{õûNòæõ,5êk6³Œú|™&Ö©ëë¢ÉËK¶¡h{߬YÏ…º—¥ç|m™´7˲èV·Y;s,•ŒÒ”ï*íze•]~ÇS:S"i Ð¥ÃÙµ½nÚ®£®­³lºŽ\v½HÛ¨g4m>ì¶iŽOVc=Vkfd¯™õ55¯²·ê·ã· ±Î> zÔ~·Vì@›ë Ò¯3.EÍuˆ=0ÍKÝN+³¼OíÎú}¤]ÏS‡ ‰­žî¥­}åƒfÙ}Í\tÔÔììÐMŒÒEõï¡pµ]C‹± Í]ߦ~ñI^Sê9RÚöêatÈŒ2i—}åKËòq9Aê!0ë½×±oíEÛ[UXÇz¬~ÅèkvÛ%uUcϾÙ.¨CÄ )¦.ª1¾¤F$Úž†CÛ˺Ðêè•uîëË\€¥,§ 4ËØHWÛC͉;ÒɲÑ>±è¥ rz†tÒ.óšIWíëÜH'í²4ÒI{ZzÒ-rX®A:yɸ4Òi{èH§[ÝéjÛ°í¤ÓöÒ“N–é¾sÒIûéd›óÔ“N¾à<4ÒéN+tµ=:ù‚tuY…n#]m×ÒH·ÈA¹v¤[–
+”Ò-òÃÁC#]mÏãÑ“®.[‡£‘®¶÷qk¤[Vý‰èLººh”_™†tµ]û¿‘NžßžtuÙ¤„wÒÕö²­tµ½KOººl?– ݲ½êþ†tÒÜJO:Y¶¯tÚ–ßÏvÔÕv‘/›Q'ËW ®¶åc NÚÃУNÖ9††º´ A4§¥G,+SC¾fk¨ÓöÚ£N—M uÒ^Ɔ:ùzõìP';rÛê´?KCŒ}êQWÒ¡Sp uµ)5­@Ž»Ò£NÆæVêj»Æ uµ­ëfÔÉ—õA²ek¨ÓöÞ£N— uzÜL uÊ¢¡C°æ8ê´½7ÔI{?ž£®&&ótt¤“E˺ê¤]Ï:i—©t¨«Ë¦u˜uÒ†=PWÛ£Eô®.)’¢@:i×þ ÒI{ÝŽtó
+ääÙårÚ¶ätQ™rÒ.(…œ´{ƒ€œ¤iÇQrò‹î”qÒÜ," ÆÉ7Û¦#§{kÞƒqµ½Jš•W—íƒ-SÆÕöQOTÁ¸YŽÆ:´ãê¢éøÍ W›«UW›5;ÆÕeGMýƒqó^wè°ãj{šæ¥ƒ\]¶xœ¥«mÝ7@®¶×q\;ÈÕe›³S!WÛõܾäfùŒûÞA®.ǽQ®¶ëª”«ÍzÚØ;ÊɲÑ裔“v±¡”“¶|ÝL9YVä Ü,?Uo‘–RNÚÓ´u”“e£ÅJ¹´ ¡œ4WxPNßÚr ¥œ´7ƒ©RÎÖÙ:Êé2 =”rú6v)ådeí('{²Ôñ
+Ômš¸.ê¶.qÝ$o5l)é6Í[K&lTHé6¡¶'²B:iû±¤Ût×MA:9ÐG; ”t›ä­F ݦyë¤Û5om¤Û5o;ÒI·ØHI·KÞ:lAº]óÖ.¨«xªƒtu‡&®%P'¥úð¨;$qÝ×@Ý¡‰ëÒP7<Ë\ë¢.s­í.s•çÏ3×2ô™kú̵ Ï3×2t™k)]æ*ÍóÌU–åÌUÛ)s-åyæ*ËræZÛ]æ*íóÌUÖÉ™kÚ†²®<Ï\Ké3W}MÊ\µ}–¹ê²”¹J;g®¥<Ï\eGæÌUúS¾:¬;ž'®»æ­ÔI~5:*êöçyë.ñh9‚tZ.?¦ Ý®kÎéäÜ6ZȦ¤Û5mƒtûó´U‘s
+è䨙ÆÑíšµŽt»f­-¢Û5kt»f­ó3ÐÉäP¡—I7hÞ:·"Ý qжmÁºA2×aïãºAR׽它¤®º{œvƒä®ƒaÜ <¶qm¼4}5
šÖ6
->w
-^^½ûpûRïoûðîO¿ªU¿Ðºö¡_^\~ùAnãzñ‹ëë«çÏ?¾þíÛzÛÒ_^üŸòÂÿ7½BïÞ§÷ü”û÷ÉýSýEWßù¢Ïoí%ÿWý¯þï÷'VŠ—¶R¼þC–†¯¿øåÅßþ· £¿8}r]ôÙBs9KÏf&¥*ÏLꉼ¦uÒÇÓ™I¡Ò:¤uÒr kHë¤ó™IÅÅ––Iý̤”Ïg&í´;6ËžVHOf&µ*ÍL*³Ò̤2îlfR8§c++¤nfRŠç3“òÍò̤­43©;›™”×æ™Éúw73)<:›™Tµ™Iùž‰årÎg&åHå™I!Iž™Ô¶8›™”&Î3“ÚÄifRϧ³™I9éòÌäVú™I9ãÏg&139)&*Ì#ŠöœÏLJ]ž™T>¥™IEØṲ̀Ôí¥E±‚½<3)åó™I©Ë3“º1¢X)žÏLê[o-Š•rž™´mú™I­K0×·I3“rDÎi®ìL3“²¿<3)_ëlfRŽF¢¹¼<3©ïlfR;gš™”rž™”6;Ÿ™Ô¶N3“Ú_JZ"}<™Ôº©Q<aÆ–HOf&VifRËifRÊyfòÁ¯Z‚ÿPzËÒ‘E»D /ZGø@"ÒâóÚ…íЧø\C1èË:ÏK
-Ðk×)vÁ¬èã2Í¥]`+l슓è5úì²w ÐësÚ‚§’*Î)N=eÉqú8l¶ aúzø)O˜¾.ÃÙĄ࢞œKÓw÷#L¯§‚å)JŸêøµí)J_†á°‹'Déëæó9J_6‹}m¶&çÊÆ£WN÷󰫤},ªõ(}/‡Q<GéÇa3¥Å&^ ÒÁG«¤¯Å†eÑùɆ£ëäØYŒî“/„è벧«ê5gœmj7‡èûla¼‡è3S·¢¯Ã1Ÿ‡è,x DW̶]¿j¡/Ó¶¦
-NDÔµ8v²iD­.éQ¸FÔR7»ÃaþiDØZ.sc€5˜¨|Ûµ”K75¢ mSRK„‚„ÔúËÐ4¤–rí{Ì 
-»?-MC4N•“f9Fe‰ï²Fe-ò8÷Ûú‰Që<”À¨ÄÇÛÜsTNÔ­4ŽÊнO£²ÍÊ£rÚsƒ©èÛGc©ÍGm,•ºak,¢¥¢oïcÏRÑ·í7–
-K–©ÁTôíµô0-LåÍcƒieÈbõ ¦5D˜ÝW˜Š¾½SÕ·µƒ©úÛë0•ïå¤TšÊ¹=¸ Måpí~¸ô´¨áR TŽÿæ/„oýˆ tÕå]S T{°¡5Pªö¶MA©ž=GTO¸}ìHªòövIÕÞn U3{.HÕÞ>ö
-:-{šâ ÓªeÒéÛÌGNôaìH'GÒƒ^%6ç´餇LËÒ‘NzÒbXRÒÍ0×I§=oÚ:ÒiïœFH'EÛ«‚Núó¶LèDÚ>æ1@§h9–
-d¤“×X~c¤+-ctRµ´”Ußfn)«Jê=çê܆–±jc£”sÒA6ÏÜáœt¤ciëtØzy8§ýnê3Ví›–-KŸ‘â1·”u’ßÈXú”Uºød
-:%ËÑrÖÉ—úgÐiÍ(è´¼Œ:EQÏ9Ými9«–‡–³ªç]žä¬“.ÈÝ:Î_'
-éÇÜqNä`Q’rN›³]Þ¨ÅRæþú†t¤É˜d˜ƒ·`N:žMr6ÌùOš‚9é
-«æjçY,_n˜“¥v­Â0'`Ù·†9)[¾Ü0W¼¹À\ñÜ Ì¿@™9§ XÆ9‘ºmrÞ8W<Aî97꺄5snäFsRÖlÝ@§"¥Š:ñ³Eœ1ÐIi²ÀK@'J³_½ÐÌÓ:èD…Þ×–¹ÊóÃÚg®bSO[Ë\MùžtZ.}æªûm‰«JÜ6骠SKÜ&ntR§äwЩ9>µK¹òÑŠ…w:ùÆ¥´Äu´…Ñ:‘\ç£O\U„=æ
-:±¶!²œ<bm{ k{[æ*Öö¼M:q¹>èFÑh™«jÚ6#  Szìçè¤niñœÇ–¹š]ÝaNìr´ÄUÊÇ8椼•þ
-„Ô­¥%®±Çœ”‡µO\õ­- Òž­¯±GA§å­K\µjn‰+®8 SGýèW9óÑWmN£”’NzÈb—$‚tÒ“¶¹%®£28@§oìóV霳ýê¯v¿ð蜓î|Ì}Þª?L0MÁ9ËÞòV-¡ƒszš4ÌiÑ®{(æDgáÜèë¦ÀÜ8ÅõqÅÜ8ùXßc®,âvkU¤JÃXÇœ”5U·ïjBw†œÔLÖ‚›j–ºß!'E› Ɖó¼Í턔ǥ­T‘ò¼ô+UÄÖ¶*âTø¶I?Eœ–‡~µŠîÖ.'(ãÔð¶ËFÊ8Õ¹íœ ÆIݶ¶Õ*&ŽÁ8)/Üãä:;•qÅÍƉ˺ïýr•¢“‹[0N¼Ù%嬢Ù[¿\Et\q`aœÛÆ/E\‘Y¿^ âj¡—2®–u医”91N|lòrƉ¿=ím¹Š<ïÌ ÆÒZÎ*ºöî±› ®–+¾ú«E¦2–¶ZEåk[y¢ˆ+$ q…g\!qƉò<Z~Sûzo«UŠäVe ÈI¹øe* 'uÃÐV«Ä>rRž×~µŠ¾÷<äô5~mŽmºÕ*Z5µÕ**OmµŠ|=qƒ3äÄØÞ÷¶ZEÛsrÒE»~+ò‹žs[®Rà­SN»ÞØ/W‘î¹ÛJí62>5ÌÕò0Mýréå‹]DPÌ)X¶¶\EË–,æôL±LV9g¤Ù‚sJ¢¡_®¢ûÚr)ûl圖‡'ËUô·'·.œÓ™ÍiÎÉŽz (œ‹òØû¼UnŸ²Ûijt!ÏH'á~y*P‡À êÄÞ^사¢N~ÁsÒ@œ“kK[7Y9;7ÔIy0Dêd·{iW[夆vå;£NÅñc Ô‰Ÿ=n-oÝdÙóÒç­rò [@²²¶Ù9\÷µ¿àª“‹KË[õg)§¶2OÎÈ͸¨“u…óØ.DrtZÞ*?Xz}4w°lÚQ' Ž–†:Yq^ò…ñ±·±å­âkÃdEÝà‹z2êL=k¬“ÅéëÒX7´ ÁºÁ®ÖÉŸMëŠÏ5fÖ©ÝòV-—–·–âSž™ub_ï-oC{+Kc]-/ÃÒ³N~5khykìÖéÊâuòÖ–êä%-œ³-º¼U«¦–·ª:>µ¼µøOsu¤«rÜ[Þ*Í9m~N~ qÚzÒÕžä÷=PÐ _·Ò”HÇ+{Ÿ·Êìx±ù8é42™î<UÐÕþ¼ùª™
- „C!É„C!pômç
-I&
-‰ƒĹA’ ‡Aá0H I&ö„à q$™q$0.íC‡A’‡AâŒC q$™qn€8 ‡A’‡AâŒC q$™q$0Æ!dÆ!
-Q³DŽ³4o¢f‰Ô[»ËŸ®9Ú]þ¤é&š[!º®dowù“²ßoDÍ]Š´÷wù“ºc˜/Ò>67@Vëxrõx™h•¾9í.Òu§£ÝåOºö2ÆP³DW0í.rRIØY"K“äÞ½¾š%ºÖèXC-™»’«%²ðFË;ª%R·´[’ÈüÆ<j–Èb&Y¾Ó~8–[[ªY"å²·»üÉZžµÝ“HÍ]ß3a–ÈBª Ó¤hYíFßƬ~Cý‰4WK¤¼¯í.B¡Z}«Œ<ök n–HyÛ]þfÓü0K:ŒºYF], ŒºXÒaÔÅ’À¨‹%QK2GÝ+ ŽºWu¯¤ã¨‹%ÀÔ¼’`©{%™¥®•K]+ –ºVÒ±Ôµ’`©k%S×J:˜ºV0u­$`ê^IS÷J¦î•
-®sÂa”dÂa”8áJ BI&B „C(q%‰qø$@ŸÈá“dÈ!”8äðI€>I¢: ”C'rè$™rè$PF@9t’Œ9t0‡NçðI2èðI > ¤Ã'I¤sÄA‡Mè°I2è°IâK¸MèÜ&ÉœÃ&sØ$p›$s›Îa“À9l’ :l@‡Nâ Ã&ɤs›Ða“
-  C!É C!t($€‡$ƒ‡Ðá
-üF*×2…4"ðŸ’5"Ëà]ïPkd°…õ¼Åb×eu±Úˆ”[¯ÚH-ïËKµ¹7™Ï!k”äœÝ#A­½×Ì«52IÇ°FäÛj÷YPkdÚÏnù`u8/Ú åúø:OaHY.Jj ìÚH­ÝîÈÅmYM7"eY¿í›è¸$uî|¨7"e•(ÜÑ‹ì.&¸6"UûPB‘+yø È·Y0\‘o<.sh#ò™üA‘ç‡P@Ô‘ªÍ ±Fä ®f‘¨62ùÒßFµi ½{¡k#µ¬kÐF¤7gtåCšs_ÆÐF¤Éýf#ªLjOÄ66í7¸ÛŽ62Èe­­y#2Ì7ŸÃ¼‰íý³lv©}ÚcýQG ¯ØDµ¹XxŒM‘ëvÛÑ´91÷¸ï‰i#EV½OM©G\pŽ6R¬±¼˜6"×·§ä™„9š7RŒòÑ=gÝÏ2'm¤Ø’¹ÐFÒÝÉB‘…ÃÑ´‘â¿ð6âA¹ocÚHý†Øhª[ÚHÉÞ˜¯ªuzÛ7¼yͱ4oDŽÚ_ÂIE£X#ŽQ¤‘ŒQ¤Ç(ÎÅÉE£H#pi$si˜º5K±F2K] –º6,um¤c©k#ÁR×F€©[#LÝ ˜º50uk¤ƒ©[#S·F€)ÖH†)Ú0Ŧx#™¦x#ÐT½PŠ7’PŠ6JÑF@)ÚHF)Ú(um’¢$’b@R·F
-=£ÜìÖHÆÜìÖ˜›Ýs³[#t³[#nvkÒÍndÒͦ
-ÏåæðÜ-‰9<wKº9<—KbÏå’˜Ãs¹¤›Ãs¹„´ÖÝ’ˆöÜ-é¢=wK"Ús·$¢=wK2
-9ì ‡>åÐG
-å°G ö”Ãù¤öH¥ö”ÃrØ#•rØ#P{ÊaÊ!@9ä(‡<R)‡="Ê!@9ä‘J9ä(‡<åG*åG ò”C©”CrÈ#P{¤R{¤”¸¶œ' ‡=ÂrâGD9¼‘¤œ¼‘å¶lv!}œ‚žCNÞÈ‹ròF’r[’8(ÞÈ ròFrGrG^“8’“8ää¼ 'o$)'o$)'o¤RNÊGRNÚHRNÚÈ‹rÒF’rk*hÒÈ‹r’F’r²F’rmuP’r²F’r²F’rn¼'k$'mÆ¡TÆ¡ˆqX#0k¤2kÆa
-9¬ ‡5ä°F*ä°F€Ú“6R‡5ã°F`ÖÈ7Œ“5òbœ¬‘d\X#‰8Y#/ÄÉIÄÉIÄÉ©ˆ“4’ˆ“4’ˆ“4òBœ¬'i$'iä…8I#‰¸F’p’F^„“4’„“4’„“4ò"œ¤‘$œ¤‘$\Ë<îºÈƒg'—œk·Fqa@8 #®/zm¡*xþh%¾„Ãqø"qø" _Äá‹TÆá‹À8„‡0R‡0ãFÄ8|‘Ê8|‡/ãðE
-ãP=`ºŒC©ŒCqeJd¹îâ$‹@8l‡-R ‡-á°E ¶He¶Œ“.’ˆ“.òBœtkW‘
-·E^ˆ“-’ˆ“-’ˆ“-òBœl‘Dœl‘Dœl‘âd‹$⤋$⤋TÆÉIÆÉIƵì¿×e‹TÆuÙ"0®Ër}Ï6bB®Ër]¶ë²E
-äºd ×%‹
-¹Žâ"ÈuÉ"@®K©ë’E€àr]¶H…\—-’ÛÊr]¶H‹"¢\—'åº<‘J¹~ÐèÂñðô! ×å‰TÈuy"@®ŸIbwº<‘
-¹.OÈu‰"@Q¤BQÈ!Šrx"ròD`žŒ“'R‡ââÐD@šHEšˆ+ûˆå@\©ŒCrX"@K¤BKÈa‰
-9, ×¥‰@¹.M¤R®KåzX"@®Ë©ë²D€\KÆuY"•q]–Œë²D`\—%R×Ãq]šˆë{®”SL1O q}ÏypG\—%ò‰8,‘Š8,‡%â©€ÃpX"
-8ì
-IÌ…’”k«’”“’”“’”“ò¢œ¬(‡åÐB*åÆ2¡çH+Èa…TÈa…
-ùd\Z!ri…@¹´BÀ\Z!•si…
-¿´A :ôK¤à/m
-bÿõ:óî‚X̾ȸ Ï¿ýkƒ bÿ~Zû¸ Ö£<â ¢/p‡ òü{³®1Â¥;VŒA±Žëùä.ƒ<ÿ~nx–Ë Þ× ‰Åò¬Iëþ׬ó|Hø…» Ö“±N.ˆõb¤Î¸ b=”×RE [º Öñ÷%úä‚ØpÃÜ !Äb6))#Ä~b(ŒÆôÿ"ù¸ÄÞÓñ1‡íL#ÄG:ÞBˆ—ô–BˆéÓîM!ÄÎf"*H±~™­~…bÿ¶a „û·=jþ !v•ìž „ØU´9-Œï/®ß¸b±!kÄf´íæX§#Äî]?Öê$#º¦þ£„Ø¿µŠˆ+!öŒ<·–ßøXŸÅ\Zg·µ‹ï”Bšå-ÿŽ/Wû<Ÿm¬¥Fìñíù›è2—Ÿ˜boÀñlŠb¯™5lpBì5œ[.h⯤õÎ-!'¤ÍXINˆuæo9!ÞáçÆ¥Û…ÖÛq)ÄD¬C’Ïçáû9cÕwBìŸ[¼lî„ظʱÖr'Äbϧ'3è8"Íÿí>¢~CÁ‹fã78!öokúà„Ø8¯ë%…XÌZ‹H!öï+öñ,*çYÿÿÁ © •’ •He„¼@*#JIJy‘TFH’TFH’TFÈ‹¤2B§¡„$M¥„¼h*%$i*%$i*%äES)!IS)!àTFÈ §2B§2B§2B^8•’8•N1B*NÑBÀ)^<Å ©<Å §î…
-RÔ@ŠHQC
-H1C
-èÐE
-ç0FàƜé¤Ãt2Ft2F^ “1’ ƒ¸€NÊÈ tRF
-; `‡A’°“ARa'$a·-,;ì$¼`'$i'$i·­)‹¤’¤’¤ ’íd$íd$íd¼h'ý#i'…$i'…äE;)$I;öíB"yÁNIÂ.$’d]ËNËY~a™Çɺ–s¾Á:9$/ÖÉ!u8$°‡¤²n¬U¦…C"uH$uH$B ¨Ã!©¨Ã!u8$ ‡¤¢‡Ôá€:’Š:I$‰Ò!‘|.’‚ºTH`]*$‚]$•viw)À»H*ðÒ xi€¼4H*óÒ z©€½TH*÷PHà^*$€/’J¾TH@_*$bIe_$À/ è—IÅI¶õdd[OÉ«­'$Ûz‹mÑØ“GòjìÉ#É.mx$Ù£•GR{´Z׈­4’ìÐJ#yuhC#Éþ¬4’º“Fòº“F’CwÒHrèNÉkèNIÝ©wÃÈ<’×È$¹“H’#wI^#wIräŽ}0r'•ä5t'•$ÇäØT’:v'“$Çîd’äØL’×ØL’ìÐÊ$É–žL’WKO&I¶ô¤’dKO*IÅ*‰ð—& üK“¤0MˆIÓ$©L“b’ÀÀ4I*S%ƒ©’ÀÁTI>@øß²I²…?ôRI¶˜»M•Äè»—d³yf’‡K²Å8jÊ$ÖÀ¹ï”I¶×OB&Ùl$e¤Lbyëg8>Fmó§˜$óçøh`’L¨9Ž4Iž#Û2]V&És$Od™$Ï‘øÍÃ$yþ½š$Ó“›:&‰Íï×ZVÄ:N6©Ÿ¸Jbø6Ó$±ùèk;Ó$«7´ø_÷•"Ém™ås‰$÷Ïñañf°D’'fgŒHbŸIËÅ@$±ÏäsdüÄnwëV ’ÜŽ«%’X€Å…0I¬_aiK˜$öRù 2I†5SÇÁoîR§yp¥I2|¥§–&ÉÐ÷À#“Ä®’¥üa’ _骧Ibáí|›$Ã×áêi’ŒŸã%Ç$™¶àX_¿¡ÿÞZÄM’é“*gš$öôæ’,2I,kÇÀ´öqx÷“ÄÒmìãÌß±aVëXû“dúÊZ^ä¹ó£¬{â&Éóø­Z2â-ó,³4IìͼO~CdÖ|?—HòÜÉË®ˆD’fw+×— ‘ÄÙýX"‰µ·k‰$-(ŸÏçᦺ]¤Ib ‹ý\&IYc,M{ç¹L’MUû1I¶põ›0I¶Ÿe‡…H²Yù\"ÉVe2åIÙëЯ%’Ø6ZmÄS­ž÷ñGXñéŸo’T¢’
-RL@ºö Å$© Å$¤˜$€“¤€4M4M“¤p4M’àhŠ$âhŠ$¤)’¤)’
-R‰$p“Žb’TŽÊ$£˜$`“¤b“DE$£I¶—H" E$¢ˆ$M“¤0.U1.U1.]’¸tIÄ8É$"\Ê$…pÈ$2 €C&IÀa’
-8L
-êÒ$ Ô¥H"Ö¥H²½„²IĺIĺI>X—&Ia]ª$b]ª$b]º$…ué’ˆu)“ˆu)“Ö¥L"Ö!“À:d’d& ¬Ã$u˜$•u˜$°“Öa’TÖa’À:LX‡JRY‡J"Öa’À:L’Â:DX'‘Ô!’TÔ!’À:D’dD’ë$’$ëB$IÔI$y±N&I²nƒÊb]˜$/ÔÉ$IÔÉ$IÔÉ$y¡N&I¢N&I¢N&É u2I’u2I’u2I^¬“’¬“I’¬“IòbL’d]îC¬“IòbL’dL’d]Ë.K²“Öa’Àº0I*é0ID:D‘.E’BºIDºIDºI
-éR$éÒ$êÒ$)¨K“D¨K“D¨K“¤ .M’@]Š$B"ÉöÒÉnõý…M‘D¤K‘ä“t˜$•t¨$®Ñ[Ðá’TÐá’
-9L ‡Iä0I*ä0I & ”Ã$©˜Ãs˜$`“¤b“Ì­}æ0I*æ0IÀ& ˜Ã$)˜K“D˜K“D˜K“¤`.M’À\Š$Â\Š$s)’s)’ˆs)’Î¥H²¥w&‰@—&I]š$]š$]š$ti’éR$éR$)¤K‘D¤K‘D¤K‘äƒti’Ò¥J"Ò¥J"Ò¥KRX—.‰X—2‰X—2I]Ê$‚2 °C&IØÉ$v˜$À“¤Â“Øa’
-;L`‡IìPI*ìPI;L`‡IR`‡HìI€"I…" °“HìI*ìI€"IÂN"É v2Iv\ìd’¼`'“$i'“$i·1eQh'“$i'“$i'“äE;™$I;™$I;™$/ÚÉIÚÉ$IÚÉ$yÑN&IÒ.÷!Ú…Iò‚L’„]˜$ɺ–=–d& ¬Ã$u˜$•u˜$ÁºIĺI
-ëI„ºI„ºI
-êR$êÒ$êÒ$)¨K“D¨K“D¨K“¤ .M’@]Š$B]Š$uˆ$"]Š$"]Š$¤[&IAÝRIĺ¥’vË%)´[.‰p·dñnÉ$xK&ñR&y)“$óÒ$zi’€½4I*÷0Ià^š$€/M’J¾4I@_š$°•¤²/UÁ/Mè—&IÁ"I¶õ$’d[O"É«­'‘$ÛzÉ65ö$’¼{I²K"Iöh…£W6L’ìÐÊ$É­L’W‡6L’ìÏÊ$É¡;™$¯¡;™$9t'“$‡îd’¼†îd’äÐ]toräN&ÉkäNHŽÜÉ$É‘;™$¯‘;™$9r—ûÐÈL’×ÐL’»“I’cw2IêØ& cw˜$ŒÝa’Ô±;LuhIhé!’Ô–" -=DZzˆ$)’Ë$ÿ–IR
-ër±.×8ër“º\ãD¬Ë5NÄ:9Y¨Ë5N„:™)I:©)/ÐINIÎa§$çÐS^œÃOÙÒLIΡ¦TΡ¦$çpSuÈ)/Ôa§$êÐSuø)uè)‰:ü”d•ê0Tu¹Ø‰XÇb'u¹Ø‰P—‹u¹ØIA].T"Ôåb'Áº\ë¤À.×:ìÖ.v¹ÖI†Š`‡ ìT*ìd¨À: X‡¡Ra‡¡ìPT€ŠJ…Š
-°CQv(*v(*¢†
-´ÃP©´ÃPw*àC¥âCÜIQv(*w(*àEÜ¡¨|âE¥âEÜ¡¨€;•Š;áCàa¨Tàa¨@< ˆ‡¡R‰‡¤ñ\J¹W;—;)ÈËåN„¼\îDÈËåN
-òr¹!/—;òr½“ż\îDÌCRIèa©¼¨‡§’ØCTIìaª¼°'UeKI%©‡¥R©‡¥’ÔCSIêÉSyAQ%¡‡©’ÐCU)ÐÃTI衪$ôpU^ÔCVIêåº'¢^®{R°Çº'¢^®{"êåº'…z¹f‰¨—ëžõrÙ“B½\öDÔ[»êå²'…zÈ*¢®
-ÔÃU©ÔCV{È*`Y¥bYìa«€=l•Š=l°‡­ö°U*ö°U„=É*PY¥RYê!«@=d•J=d¨‡­ö°U*ö°UÀ¶
-ØÃVùĶJŶ
-ØÃV{Ø*{Ø*²
-ØCV©ØCV{È*`Y¥b_칟â“(½\ù¤`/W>öråa/W>)ØË•O„½\ùDØË¥Oöråa_%±‡°òÂÊJbOÎJRiåE=¬•-}•…= +/ìm´ÉÀ^+‹zRVÞØ“³²°·%¢…½°V*õ$­,êÉZYÔ“¶ò¦ž¼•E=–@z,R©Ç(`%PÀK Tì±| Øc aP*öXìå.„=V@©Ø“·ö¤­$ö]š‚=y+‰=y+‰=÷V^Г·’Г¸ôW*ôW€â
-ÐC\©ÐC\ôðV ÞJ¥Þ
-ÔÃ[zx+•zx+PqêI\©ÐC\zˆ+@qåèI\yAOâJB/Ä•džÄ•ó$®À<y+É<y+/æÉ[IæÉ[IæÉ[y1OêJ2Ïfâ¼$æ±Je‹ À<-‚òX¥"EP@‹ €<VA)Èc'ue!OîÊy²Wò¤¯,æ…¿òFž–-Õ•DîJEîJ"y%™‡½òbúJ2%™‡ÀR ‡¿’ÐC`Ièa°¼ ‡Â’ÐËÕP½\ ¥@/WCôr5A/WC)ÐË•L½\ % —‹¡èåb(‚ÞÚE@ÅP
-ó¤°y, ƒ¥"…ä¡°€<–
-= '‡%™'‡åÅ<9,É<Ñ7™'‡åÅ<9,0O
-K2O
-Ë‹yRX’yRX’yRX^Ì“Â’Ì“Ã’Ì“Ãò‚ž–„ž–„^£ý†K… ÐÃaz8,•z8,¢
- ÔCa©ÔCaz(,P…¥R‹ê¹µâs¹A½\¥PõP½\EÔËõP
-õr=Q/×CõrA”E½\EÔÃbIꡱ¼¨‡È’ÔÃdIꡲ¼°‡Ë²¥Å’ØCc©Ø“Æ’ÔÃcIê!²¼¨‡É’ÔCeIêá²ꡲ$õpY’zÈ,/êa³$õraQ/F)ÔcaA/FôX¥0/5óra”`^®‹R˜—뢈ykÁ¼\¥@›EÔCfzÈ,•zØ,P›êa³Têa³@=t°‡ÎR±‡Îö¤³@=t–J=tQO6 ÐÃf©ÐÃfzØ,@›¥BO6 ÌCgyè,•yè,0桳|2¥2桳À¼ÐY*ñÐYD<lˆ'›¥›àa³
-< -ð.„––¼Ë¥Q
-ïri/—Fðri”¼\EÀË¥Q¼\e/—FðZx-/àá´$ðZxX-/ࡵl-É;Œ–Ê;Œ–JK§å<¤–VK­¥
-ñ[z.«¤Ù¸ ^K%b ÄClxˆ-•xˆ-³âa¶Tâa¶@<̇ÙR‘‡Ù"ä!¶À<Ä–Ê<ʇØó[*ó[€f ÐÃl©ÐÃlz˜-@³åz˜-z˜-@³èa¶Tìa¶{ˆ-`±¥r±î!¶À=Ä–Ê=¹-pÏÒ•#[!¸—«¤îå*)â^®’"îå*)…{¹JŠ¸—«¤ˆ{¹LÊâ^®’"îá¶$÷[^ÜCoIîá·$÷\^ÜÃpÙp[’{È-•{È-É=ì–Å=é-oîÉoYÜÛÒâž —Ê= . |2\ø¶œë(à“ã²ÀÇr)€åR*øX.ð±\
-àc¹”
->–:|,—"ð±ZJ«¥
-^šO·IËJŸÞ9ø±ÏhÀþìÓèœvœc4Gàì±JýQsßgilNgžY—ß“êŸËás* méé²Q€Ëç±Î©·ÿÙæy!½žšÊå§ïï &I»b-øãÌÅJöË:‰ö§W:Z·ÞWÔˆç Ê sH‹Ø´žÏŒy’Ó3èX5p·ÛrµqsѾÄ}b‹ö\ö‡ ‹æùvWÊE³|{G¹h»È-/šePìÇ|]´]hä¢í&!Åô¥_4›h÷ÜßrÑ,3ሹ:?”=dG.Únïãq¿.š=D–çÍEÛïH;ä¢í—žrÑ<½ÀÒuÑžS=Öö‹æëðÝÍ9ûýÖf^4Ûž1çì·×¿ýï‹æÏìŒ bãv–¯í˜•ÝÓz|åî-*O7iš—7^Q†¨³ÀÍû©<¢Mq_6¥¨n“³,WÙkš>??¹,§àyw}ÙNo{ØrÏ^­§b›¤¥“ûð>G2¬¢¡sô©Ößõ_ãÜ®Õú˜§ÿm›H¸áª.‰·>|
-üÁñ–ê®|uK
-jÑ
-ê£Hg^6o!ùÒßë²Y ÉZå\6o!Ù§Y—í³a-¤#\7o"y±·¸nÞDšíuݺš›\7o#YΣ®›µ‘ÆëªýÛßîeöïÿðoþãïÿ—§?÷wO—"ì¯ú~ø7ÿ·ý—ÿåOÿÓßÿçÿƒýü‹¿øýïÿê׿ùëû¿üaûñOžÿÿïÿñ‡¿þçÕÛú~_Ë{Z?ýizy&Ò±[¾9ÿú„›‹ËölgøëGØîøó²}ýØÉo„s'¿÷ÃûŸ°6Ò<\8½­³åÃßô¾îk»#ol¿»=OÃéøæBËÓûæh¬½À±‡ñ: GÑóýiÌXGï{§d;ùúÃßÚ0:Z’oïC
-¿6ñ×Ãݤì–ÔëÁS!w#d#¢_ôçæÈKõ´ã(Ì=ÏcöqŒÚ VìÂÎã»GõKîåmDÿæœp¸ñ9ö°• ‰à4¡>Žm^( Ú`ã®=wˆû¢ø(gìÀÄ ý1oBû‘ÙÈÕwàKÚ°×·õòç~%¼u®Õ‹‰ ¯ü¢àÓ®SP÷È‚›®¥…ç¦CóÅrµW]ImûÝ#СÍn˜Ú…ÓÅ¡=áqp•‡µ"ý.ÍæÓS¾â>OÃ×½³éå×gnQ×Þ÷NѼ@·~ù^‡Íƒgþ±¸§Y§:‚ËÒ¥,¸G®‹ ]‡Ý¡£°µd´•€#8×Pk¯6ú‹vp î±'éDpZp
-*â6PDì@øó‹âϦbwîÑR|´Ç¼,^’&~ßÝ«b­-‹e¿Ê<’g
-^[þ>šn>®›Ã²Ž¶‚ÏÑÓ> æyzÆS<â0lN$žæ¯È>yÄL± %]Ì|÷/]
-j~]NËFãí^OÐf³Ñvó"u/5BëÊg°-(wþ°²},fù<ÅטÁ¡nà<F3ž·‡y®¿ÅߚȴÑ6>Ç-x˜Oœ—uúªèiúÃz¸,hƒlºOÛq(æ3ÄË}Fͨ›øUáûäZáBßÅå"yœ€•¯‰˜UˆÔÅ‚Zö_éÆ>/ÒW…¯›÷c¬Ýî÷ÌÜq(xíù¸Y£•ýÆ2ymÿ‰½Žµ×1[î Ö'ô‹k…î,øl‘íØ!îÜ:ŸØòRSÃÂ'™#>´ÖMòªz¶Ovzm­ÁóíÎ߃¨l{?+ŸCï¼;_Ï^o^„{È£a¿µ­çžë oO7¡ lSËì`¼àž(óU6“g¾µ¶åQö©}mxò·žÒ:1·HãñØŽ]ÛzÒy¼Öà‹ +ôôZsì íG†u¼o¯¹‚ñ†ŒÐìòÞ¶ƒ?¶íùp´íø8‚+jDÆ’1ö$^·úÌ>)ÍSÛݯŒ^p¼ùÖ‚8¹ŠÃ¾œjEyjÏzɶqr}ç-?vbgÜñ§±Ô¯£l?ï¥8g°ÏªÊÅ{g¶A^/ÅFCÞ³ð~Ñï}¸Tg;âºØWQ!ÑÜe¾÷e/àšü)ÓI"øtýt­ýéVð¸ÚS;°‚¦Ë•UöÛ@Éqí
-ncêþ÷9öüµOÏ ±ñEôÒ‰]Ç¿ßw€{xê}l8Ô€ôhÛ¸×ÇviÓ›3E|»®í¼ß?÷Ç‹ðŒ?opÚÁÞõ-°öck<&›ëë´ÙÆ|Öâ½z>&OSH—äiÔEÐܶÃÚ‡^¬kz{q[|ål@4.@¿ n½q
-Ç¢<}þó‡:J±×èz?ÍÃìsÙ ôOäó5›¾ï=>§3æTãïoqÎÁø¹Ú)§•XoÏ®ËrŽÉ?õ¤ÏŸ{èÒr•ùèÆ//{«-íÝŒ`H¿~¤w¼fÜvéâûd%†²MÆÛ{Zª‡´õ8‚ÃËãN”VÒa…59Uÿî~U+ÅËÀ¬7 ‚.^¨™NpGO Ϩ(ßsÒÔ³ÊÃ
-f§Ýcñ{«n\‘1¯«7HÁ+{Â#ºEñ{k~ò`n»þÔwƒê~êro{î VÙõ“ñ5·ê&ç9yØ769“v–˜;8£Ñ¥[~©épœÙ„}¶ÎöÏ![#¶6ÉSÁy'‡t gyf<#.þ\¯Ô‰Á‹n• ²3;£ƒd-`+6Ím¤ð„½F±.ï—ËŸ _ø.2<rÏÑRðé,Ú/¾c¾²ÓR*ã¯íÙb^ß sys¨DMK³/sTk2Râa½«ÉlMþ|Å÷“ÞÁ™ïBÞ]ŸÃšùÞD{“·¯©`c|ÒSÄù9_ó;ª*Øî^. ‚ìnÖqˆÞÍ}•]YàÑzòùç •Ï·ë«ß­ÞV¯Í3Ê~ò>×£¸)ò°ç>D‹¨ën£Â¼e¦
-¢¾Ÿº~‚¶³ëaóó.6û·e­X-œaßUþ·ð³#_9ÃþNŒ_?A{³/ª=ñKdï€ —J«Eê¬U/:vO¿~¾Ng;^º,oËg{ýgºö]e\ý¬|ʯ¾eŒYÇÕlè’ª¯X4•Ÿà®µZº¯„bÚ'Ø£ï÷γÔl—3~Ã>%çõ@÷w?ÄéÆâöáz¿0—µz"è“~L·=ˆt'$.âÃ._IëŠøö´þÒ¯Øò˜vsÔìü ï>“è—ÊÊSØ@§Önݱú\ÔðOoƒú¼V_ôóÃRüçw'Ò«~QîógÍ„ÝÏ‹Î6}:4Q6Â7õU&lC›î·Å«ìP½fÒýÞWÄöÝòtqý6¼õ ‡úí¹þÑž8«cjSLc ›ËèM®Ñ†K
-Çlk¢¢MÀøeŠ÷s‹BÂþ©>ƒo¼(ð45\<‰'чP‡5
-öÙ¸PÖf·ûç“Áû¼õlzÿÕùà%2¿=Õ?ÚÃæ鶆_»Uè‘«èƒØöf ÛZ Ʀ¾}d0^ü3ÆÓr>xgÁY\ÎHËÃsðO¾¡ìµ8_Ï]òóõò›vÁ4%åA»³àŒîÂð i»Ë~}Æyø¶6†bCqÅÍ=õ3°|{‹õ&–{àE¨¿ˆ}¶š…w×"üî…1ÈþýøÄÚõu%›¿M·¿ÜÏ3Ó"‰Ù¿i»-]ò­õ8}ÓԸܞﭻ}Vg!ûNm6XfÃño n×iúþÔúâaOð>£³ã7ÆÔØÁØbf5¾ã>=òmØ”wɳö¬a+š¼ñM;h팂øþ€ºvm¶ãô#°·¹Œhžñ2uœâS÷´L$3;z|«ïXcÆ÷êÅoÿò‡ë½™¦&Ç7x7.NñÉÇg~§v·—íðËhj¨Ÿ„ãòïºÿ…¸4Ý°æA¿\ÛyEëőÛÍQŸnX¿s¶øÚ ð8õ šX.òn1Ðáï§zA¼îÄðÔµç";xmþ¢_º½qÁL/þù8¶#ÎÀdzþR_;·Vý¼Ä\<¶£ù‹;´ÃïDJÝÉR²®ëº{<Œ>7ùÝ'Ô3½MèÓÐÏî[¨C޳ϟM´?a3‡{´5{TE‚öŸ§?yëÙ ¶e·¬Ä‰_^ËK¾¯BvàE™Â·'û³¿‡ƒkAù.öàl&#ñ¦¶(Yh=Ðíy ·Ë‘{Ù·üšú]Ñ̺¶CÕ—`ó¯Íþœù%h‘2ça/1÷›Œ¾W¯ ÷—ºož çÛú"’ÑøÑõ½,âr†ùTÔÆ¥9}1ÁøâÆrÍÖ,°¼v=dÞ½´mýÀìt(±ï—ÑgÈü2žV¤Ò>gžƒeIïqmÖZ
-¿û¼~ïÙŽGþ›7Áùï¾5ß}¿~ã]üÞ{ûÝ7ü»Wö·îÂwï×çý'žož—¿Ô¶^5×u‹‹h};}.¯—ÍßWñ¾£ÌÓ/zŒtÁ•û®m=™Ù[dúf~ç+ôO|±¾ùº1zñí—ð{ßÌßø¾~ÿ[üݯöo|á¿Ûøn»á7Úßm|§åòýoÈo}o¾ûeúö+öå7¿x¿õuÜb… ßï°²ôœ'A|U&u¢º?ôÖÇ>Ý+‹°Oø+âÉ‹±OCòçë¹<ç÷¿ _þ ï~(&ÿÜÞΠÝ Jzäë+bO—×ZãºßDâW¿ÿá_1¦{©­ûn
-´“oƒ¬WSƱFÉl€ÓûòØZ³›O?F7u,¼ê£#À‚ÖqóŒzB_>Nå
-´q†÷æ·~ž11Ç^thd¼ªçíý‚14b
-&Çèάó ¾Q·väÄÃ6c\"bsœïØYÏ‹_ÛLzÿfKwb3vÚmâç%¼Æ,¸ïb›e0èïœ'l<!Èžƒ"> µOm[¾#nj ÞÑZà
-ò~Úl1™ióöyº‡&·=cÞq—ðtöóïå g§]"bÜñÓž
-&⶘d]Ûž[°92V>C¦ñç_áKO§ËZ‘îqÅØ_cM+"òó™6íz\ü)o
-xp¿ïob^Œ5Ÿa>úÜ©?Yúó“ÇÍ¿h>fži ¬ÝÑAzGLVçé+<£%AŸó—ˆ¯¼!Ì[úÖ/þ\½ö¯½‚§ÄtëYEÉ8µo
-Ò™9è’ZðÞ²áu…]ý~}¯Hy‹Ã±Ù®¶À'ÁH|…궧i‚b…׌ g‘® }Îzo[ƒ;ÙWlóg•éü û”¾‚gÜ¥±Xƒ[»ËœÜÑÛÆš#¨ï³"æek3ÆÏÏ=’£ê–G¤ßØ.Á„UhzL<-üey†²•FଅäY„~úÙÛÜf°VO„w|ïQž럜—î‡'eþY(Ç¡Käèý)^öCà}Ü™ä‹Rƶ÷¤3?ŸV¾nRð©k/c¿h@rúÈrÝÒçøt1ük)V[~#ºf]¼+¨Wq&ùmì¥mºD]ÇT‚J¤¤/IX–ñÇöx%šå~]ôe]iR²ÇʉseÅùzE{Ös±*xARÝ5ÚÕ,a¸ YSm³Ao†‰FÜ–í6€Fh|ݸ¬=^û­•†U—Êäa+Q¬mcôקç>¾ 6Þ³W¸uÆ©¼¶m¤ÍÁÉzû`¹®1Xý±­ž6k±ÛàîgðÊÒ+L'Ýöºûƒe]†c{x0›Æ]%þ=LÓÐêsé´6e| ì ÂuDÁD“¡Q†kvÆ.>Æm~§ýø¯u!c†Õž;»ï¿Ý»ô€y‚çäö>/w+A^ÏÌo{Ǻãñ]9s‘àˆÔnv°Â^ ‡`<ËVñνڋ¼é®™$<Iqzê<ëÅsnûÑ?‚±dÁzBW8&=hk9•ÉúÍüSÁvÚ_Ûº´5Ì  ¥®Ždù‘o¹Õ³Œ£íÊ7Ú ¡E†ì9s kžjqxId˜Ï¨g0GÇz ¥l;ÃŒæÁPbÂ
-Þ1…ÂøÔ
-Ó‰yGÚù|žL1|{í
-ÜK›aÇ¥ÕœØ+è¸y
-ŠðÓòIGmæ~]|#°|q ‡Rl,ŒcÔÊ°î9 ú*œ[/Á ô7ªnk_•>u
-²ú‚¯m§®·¯Ü”NÓà“‚Ÿ§ðÚvo›¶½s:bÅ|žˆß—0×°Eý{'¢·?ƒcйYa0Ö š¯û¡Xâv3f æcè3hÛŽ“ ^ï·½ƒ6^Ýh£¾Âä!”§` wIÁkrZû®Ry8¬öSÛßG[¯ë
-ö2q°¢eÔyke„±_
-ZŽR ò"<ŸÛö±íÕ5ã
-2Þ4V¶½4íG0âÙ~Ë)ÔðT·lwËN–^Nñ[9óq–`6û~~lk %ŸÏðGk'æ°åV0ÛQ9¸²-WöÈÂ+è5c?ï‚ £vòyî±ëíb¤æìëA¬a |x%ŒMoÓd–¸“oâšR³†œîMÙÖ*nO½] P”àSü4äV8*#zpêö¨1ùôÒ!ì`…7nB‹zA1—}fóRv@Äø¹¬¦µ¥uLcdÒ† •ãP‚GTO¡?±Â¾šÝOµon}ºó¦¿zÅx)Á.ÜúøØÖÆ{6Œ-ƒ½Ju7­£Ñc4e‹®_îjO·<ã™ ‹Ì¾)Ê ²<X9ÀlxC/ ÏVûjÜl{íl dΘ|\A^0/3þÞöRÆj÷*ä»b^ã`äTÛý^<²ÕÈ4‰íî2…gmô~õÌ<‰Á§²lëEÊ=èƒÕï`ÿYk­½ÃQ8Qœ¾š¾”‰ùon†ÚvÕnõž¡áýª÷ÆË­Ä'T㘙òæóÓ¼ù5è//žÂmËÉ ªeâv”þÐص÷Ïè€ÝŸQØtÅgy®´÷°Ô‹µÕ¼òáðêpq^Gv¯øc–«¡é½ÝkÏä tÛüضÓ<ÜT®é3x÷ú„­0S?¶×Ù5pâÃrß½Ükipq|®îWÂçPkŽÁ öèó¾‚=Û}×ꡯ™¦²mc¸¿õš&çÕücœ¥1¹a;èn³Bíµ¡NÁ~ «ßœ‚Û¿ú‹?<UùøHUþ×ÿ¬tek³ûÇÙf§l.À=¹SuxWøë;Ü”Îñõ½“߯üþT _3仪_t{ ü™ÈzšÈ?»cÖ9´rÀZš™ì±“yáidô¶½Õwÿx<©–üïùòþ|IJ¿ž—<NoèѭߨJÛF«b»öÈgò gË~ñ‘Àá³7¶Ý‰FÁva-ùxÉ¥ žðY<4 ¸]w´¿GL´ú3ålóäÚC;ÊÒ÷3¾¢N‰‡Ÿ£½_Wg3_ª]^e"¸«“3¢vjìwFN–.BÈOPS~¾àùÅz$‚5M—äÎ;oðÙµ­×ÒA†m >†¸6«˜¨¬’Áø×Eðõ <èëóÆlQª×Ã|Óį
-3Ú:£t¸[浌¨˜aAµ‡<èác¿Ox»t`>4;˜Ñ@µàáâœØ:±K/Ä#ã…Òžà‘#¾2{ìôŒõ ýP·¨–¦N`Ðð÷àÎAéÓã¿Ï³ëù{¯ù®G¶ñûkÆ離zÐ+æEÐƽc—¬ÿ[^OÕƒ^»Õ·Ý¥çXùÚ#Æ·f|FÙÁhy ÚŬLн3ÍÓµ‹[æCœ­®ö£¦ñÇø([Ø 'ÅñŽmíWýʦ ŒþŽyµÜ'8"+J'|ñ$ÕI¥TA,ìÄ1noA[tT»ðj¼ö·¼ï¹Ûëý×b·²×E‹àžtf+¨FÓ„v~>:Ü-LFûcsã·SOÍŒŠ?º“§Î×D¤¼­Å«;l™âsrb¡³bƒ‚š…³°ìÄÑFF¿ïsãŠGs؃ãæcÌÂ*ö`Ûîq
-$Ú{³kS 9Ú½Î8-³²¾ñ{Õ›×Ùê9¼#•O8Öu¹c©{ý¥–¿×”éê'XÐê´ó·ô~¤sé;=öÜQ_”ùªð8'_˜"Ù¬‘±óÄjг¯cþ“ØíŒÜ
-ÛAv4N}\Me™ÜœSy&‚Žm/Ï\ìÀÆÞ³=Ý™Þh;Ÿ«òæYÆYr’Ät›Úi]ôñ¿³íWÂù43·æn$øÔ(·ÏY—xØïjyòa°c¸èTÜ* m*ý“Ì”­à¬Ž0;‚ü^‘…áG/ä±~ï*im¹Zpl´³ÕôµàRt@¼^Sc@á–ódÁýÈO›î¹åŽï4|N¾6æ0£ßmAe¬ûƒSAmM¾FK¾õ=Õ^'ÃÁ$ý[0[ÐÜA$gÔ'Ôv0ò 0ó°:°Îq¹æÙ½Œis¿Nä. DV€eYnÙöÛgËß_ù¡XGSêúú6ê/í4ȳéÝÖp]x_‰f3odÑ ¯onìÈv~¹„kØÀCþØL2zŪåº5‘ØrdÐÛsy¶×óXržMNÉÁ€)¹Ù„V¯ 7mR _ëñžS'¶ÆË“x‡s§^É©Øѧڙ,Ȫ0ŸWdØ-“l“lw-³¦~‘I+1HÑcåØ눥?õó[[ΓC
-c^_¼go#›ƒ±v»¸óÓ6–Õ_Ͷª B㙟Ï Èë:¢7CÕXÁ¹ñ¬–ÿìäUæf¬ü£SUÍ›6½GL[Tl[  6„>·*%:6fÁ¼«@‹º[,7[É@M•tãVKÝk™s«Þnü¼GÚœͨ‘kŒÒnŒ / öÆHF¾\ͼ¬0•›úIɲ¾fö_n£OøèCϻذàNsú\ÝåÕf²¥}öôÐoöX7v÷õ‰Iè51Å6Ío%‰)O0êç»Á{æPL"ºïѺϿõUÑòdØ×>–նÚ2Ö,H¯YË2ô#ò’Ôžæíîªýg7"iªDT ­~eØ„WÛ¯¾©OP()jù®ya}b8vpÆ
-rù¥Ä‚U¾ayÌê¼ó^’J[ƘÅçnÕö¶s8SûÓÓÙ7Æã]m½r”iP9ß,ªIóŠŽ¿º:ø¬“àä%Øòl¯Áƒ4TÄ0¬k]««5¹½mœxŽ3á‚SléËuÇ~ï4즪F†G‘ñ'M…·A;Ø/ZˆŒt 2ªi‘Õ¾¢LjXä™F¨õ*8v fª_„GQ3þ MÄCoÕ <ô™--ír­4\vazÊäëα°Þ²9VºË¯ð5Á¨–в[³oåÍõÖW…™ž,/éŒi6uVûÝCÿ9rïn2ë‰ìw¿rznUÍcÖU³É-;crÒÖúò›?·cÝi† nuä}ø‰ßSŸ`f
-ংãÑ ©îOÚËG´Bh¾ùŽ[äð¾7/8—mËÔl·9¨XrÉ”SööF¦Þë£èpgç6KæíÛÎÛEjf+,8² ³+{T¤Îð¶k{­ñjî|~ëçJCí[Ö̳ ¹-Ë0=HÓ趕gâöUOcï!“yðÖê¡Ê¤g©‰ ßëHh
-'qf×Ê?¦hÏýª^m}ðNÅ4>`¿ÏÙ
-Ûmv
-¯`:y
-z.n¨jÁ³k.ÏvÛøÐú üW…Ï Rûr¨„•ëD9òÈb¹ã>jn­+ÑÞÿÒ±‘–ëŸ%íÑ4äHêÿ3þfm¢L¬X»Pƒª8‡/”÷ú‚ÛŸï³´Zô·Ÿ?³ÌCê´IÑ÷´[~¤¶<§™1×9õL
-Ì3PW0'Ö„ˆ]™sË †qæåbþGÍìC `{lQÈŽkdxäùQ Æ4骘ݾsg{N0X8g-S¿|+…AÃGË•BG£ÊV+%R[É#[Å,îlAyRBìÀ
-öæìý8¨Q×=kºVï÷Ì~!)R¶-å.f–]4·:góAÞµ^Œ¢øš™HžŸé©Ú &’¯1ûûD9__5jÕZΆ̛Š
-½å'N%˜ì
-¯çÐN2œ)É2€,8ŽÌ¡¿²¢÷¼ñéæ‘­áK¶gRÕñ=1“¨ôcµŒÓS«ÃGòÒÏ`ìÅv›¹SJÇõêÂ9¨¦[/~c“xö2;©=µûÞ?.cº~¨ÊJ­ÂÈÑ*c:Í
-\‡ÂŽàD²[«G+ár0Ts¬"P#—¼Zn8çú}Ú$>y¡§ã¤*õ}­Ôù†õ±Æ¬JôMv;…ý|nRÈ}ôƒ'Oñ\­#«‰I¸ü±åŒ5–°’†Üîræ@ñÇÈ«8îôËFªÿÆÝ‚Öׯ)?7Vm+ÏÈó–å>l#3V}ÛtY"Å‚ï-ÕØ R1¯Ö$ 'Urk¬/°õ}S8(O¼Áž#fÎߣ—[K]b­ÔÚÆbb æÓ}ÆØiW›éä#l Ò™›ÿ
-â:pÚøVõ›WÑ»Ú_ùJ¼³ûéVÜ ÆQSá‡OÍÑ)×áèÙtæ`#xN®­g1Ò<'º >Öûh¹ƒ¹úÚw–•Î(ëižðÏ—œøš]UÞÆܯž–¸={éë"d왶¹×7¹5[ü2¯®¾B6² ¯ð& h#§álDiew,÷öÓˆº
-qïh·åOÄôµªŠq9ÙÃJ"±¡¯ûTåG–‡?µF[^CFÔzþ±\ÅŲXÐÓ|zæ§T<ádj 14º³_åÙFáe=GdÛ€m»8¯L|²!_úÜkèjOÍ>ê7ãÅ*¦í{=WIfwô3-hK┾gNøÝTŒõÄÖœ”dó–zLZŽÌ8¹³.ŽÍªÐå½j
-Ÿ6“©SÈ8«Ázgq×7+©]Q¯AºŠŠá^LÒZ]ÆnsìÌæ”O®ã¡ÕúQZz6O½ñŠ¸øÎô5™KkÍ J¸³ã®U£|X÷$‚®ð®EK,Ý q
-x5wÌ[~U˜â‘w”€#8´_ú½Ç {sÎÉr&Ô¨»£ô“'m¬÷&«˜¶”Ôî5ÁñD{V5ÏJÜøVÉV£ñÖ{G¾*©,þfÆn5£àÝb€Õ{<Šè^‹P5ûÎ)BšPz¼NÙ¤cpGDì`dßäŽ
-N?½Þ;ØŽ|ºàœÃ…§Þçss¯Æî¢g½Å®”Ò¯¤½U…Í OG[¥1îUJÖò.ó&Ð>h=kšÝtî¼ÂïA¶Ú’DîÈÍøªð!óúÊ
-än«´Áí=©ˆùÝYã8~?òã¼V²Èg0~òtíóØ󂳞¼¸µE^”Ö'c]Áû¾ykÓžYyèZó'Ïngw=›–t/Y厎hìÀSå¡Š%ÝŸ\¦„-˜·ðÌô7ÛïÉ~Y¼g;Óaº#Ï3‚×Î?s ¼ØÕ*Œ­üü“ªrþë
-ȽwÖì o‰8è˜é\Ý) ÞZŒ3vJËÙwƒÆv\wÔÒ9¤rÓ%ð ÔÞk‰^Çâ¾TêUs³V4CÙ!íÊڶ̱zK×J·0-Ü ÁÀƒƒå?ÔˆòŒ„é–G`e%O¾´6ñ•ðA}yŸÿ ÌB;תÑq>ˆáxµN],Í›‹ÚР¶’(žâæa5c¬,L¬[ï7G'¬4Ž,‰kiÛu1+ÖÔUýÉkë00u1kux´˜½_[}T¬æCwZÏ—Õ'R*ú[k-Ý«0·…™1Íúwªýeβ%{ÊàAWá¬S)y±ý–‹²ÍÝù£-w
-A¬D_¨ÑÍ¿²RRBõrP¾=Õô²Ú¢WfFD%|¦1¢ uÿÍädšOc¶œdµ¬Dì=ëokF÷ÎõÕ·‹dÂ-S4ŽôÕ}êôbzNÆ$µŠË·gÀ©uº~dÏ÷+á›é˜<ˆ^ò#ra¯Î(„˜_«"íÇ~¿ênåRøÈä¯
-ߙλêNß'©Cn0EpF™Sòå°pf§â`ùœÓWä¹}{
-eñ 2sfÚV¾¤ß—ï•;wavÆýªð9S¥°šà*­à#_¿¿“Ø»éþöÒ¢í¿* ÚÓãô:™ƒFÉ„‹aË^TXßíÅIJVkó^KŸ;Æß=
-6ÕÃ\ÖX‹0ÜY lkµÿ˜ºËd¥¬ €½ÂywNÙß¹„ö+¸¯µQWøZK=ß™ò
-Ò÷¿Jíu›ÎóþØöŠ…Ç¢7ußÁµNV tÜY /ëðĵY`gmëT 2/Ø–9eW;òßu͈kÑòãS|d{1W¬V,¯¹
-²­-¯ÈÌ|ïÒÊM—H¿–ïlgtÀ~Òœ\®UÅ,KU0àÔÚóÛž •3ö,+_Ô0K ­õ3­º³¥ZDã¶í£a>¬±tÛîÉhVøl±×ºE+\Ö-”À¯kÍÌ©ëy’ ³­¥\i±–µnQ Öu‹Jx¯Éh{o*«œ%£½ô\ Æ)ŸX¾·l»i«g KÕ°Ý«¤ùHxܽŸ4yØU¦<W 4ï rŽ
-m–à/ÙW J”mm±SW ‡¿ϺŽõ
-lOYîáIRe.¼4J—²|‘OÖϪÛZE|¼ÉðôæEì †s®ósݤϠw{ò2L®§Oj2ÈlÇ®êÝ+˜ßT½eÛ¦Äk‚ýªë• «… ¥ +™´¤M]ÅÈ¥mß?¶µÂ}ñT­•‰v+[Dy­bdß~µ(ʶg$MÇa];Ë°†÷^> &¨p_u5"HÁ›ÙL”zäKÆ·sí`g1v/˜O¶Rz¼ ½’ÅóSk³&vXô§YFuc™Ù×#¬W>´/I?H-¾£NˆM¦ìm% jqQŸc9YËéi­d5‰WðyùášßÀb«d-C4ü%ø‹™Tè©n{Z«ªëÒ©³‚×Ïk‘¬=bò*^Ù-Æs­’•Öóðu.ÿÛV7
-‹œÝäªF–yå
-ƒ#Ê­à/ù|g[¥¹lkåDO†ÒZ1«œ‘ëøx‘לº˜ÑÜßð|<Wп ™Ÿ3ºÛȬÿ ÍeSýÇŠ¨çºåjg–²nYÕË=¬]Áµž—QK•W÷\lØ
-Ž{®•Œ^ëy™£×Xœ‚5ºl¢AKeµj|}‹o¶í”|(ëy­àk=¯W8]£Î.m[+atÖán×$ë¤åB•WËe7t´e=¯,ëy•èZÏËTÎCÁÌ'ê¹ °‚_ècæBÚ“Õ³‹êCË–Š3«¥•M¯´æ6êú$÷±VÏT×۳˖§Õ¬Jù Ûò¶m~óñî>ÍóYÚà*â2³±%=~¿¢t±eÏ'‰]Y¦=ßB›~É‹l V ^k¥f˻Ԇ¼YÈou*}*3v0rêøÌ™_+@ Ô¹–ožåboO_y®&ˆ2¤±|Àé¼õ™…ö˜ÝcHá<âì‘Á¦²f»?Z¿ãvíS›âŸ˜:?BGèÙŠ.Ao^p·WÙ`_£y׫Áܽ¯PÌŠ)äZ'ëÇ•mŸ;¨ ¶Ú+è¯ñv aº––ñ+è•þá›mwµÍ»ŠLG+¸¯ º¿ýg²UÖ²íFBõ ­`…FÉ:CÿýFÞ·2f™½Ö¯l׶ö|=û\„voí#x—%ÙJøȬÍX=»Å‡Ì[á^‚€dw«nk¢m,еGë;xÆbð´kW˜Þä~2_h®\¨ˆ¿1HªȲe«¡ôô”Ãl™fxcµ¦N¦íŠÏ†þRÌZÖÉJ ÜãsMš–Ðe¡¢s} jÐ=ü˜d8—èÉJ×V“¡2µ`#Ä{©êd¹g ÆÇÍ&¤·ö¼ÊÝ+á;³õwÉ.Ñr£kÙñ·æÝÓJdeÛ‹2dvùd‚” éι¸ó
-·,ãÕ¼«²m¼U‹Ž«s°òŠ+U¶Ý~f¡Â}ærË„\£àòÌUÃ%;7-¦¢ g«Eûð\U&Îͦà-œK7•:nd…¼ƒö˜¶<öõI€÷N5!Ö{‰¤ òa süµí¥BÁ¤|b *M(?m
-g–÷¬ÈgåK]ÄDµ· ÛûþØ{×åºnkMô ôü㪤ª©àÌí_¶r9û”r9qÒ®®.MQ6;馨8ÞO0.ßÀ\sQÖºÈâ"½vÊÞô˜˜X
-‘¿:
-x5Œ%ʼoü ¢°î”@ò„ÀC 2Á(r}ײŒC˜S̹ÒF&ì•@;oªØä|£dµ¹s„ðdµæcPÍÀʆ¯I=>¶$K@(´‚óæOrÙfÄsf*÷´€³:¹—Äb~·rR¡sæ{r‚Ò-D€=k5tÐôp9s^QdsD0e¯9±™®a >ÀÚJ48 h¨lXõ SaeÞµ,„\ãj²§Ÿ­h«ÂÉl#i<Ä‹ÅþÒb@Ø@’×H› Ö'ÇuÐTfAb¤æ¹ñiåV[i +0ÊLW'„°tãQ‘˜”²3Yƒ_9¼}BPšŽš3òŒx®TW×ÛŠcuÑ«”màD ô:Dع2„àJÎöÁ `J3¢tPÈôm)qå3˜ß@ilu‘7TsA"†TÜ`¥ÿ5ß{åí¦Ìv¥m“X>éU…@‡ln­­„8ÕÓg7ºˆüÀ)h:€*Ó:C'*—\–E[)ç?j4,<Öx´„ˆ@]ZFÒÒK¢±”±÷—X#2vº¨©ö›ltýðAý® Éë^¡Àæ-qüYÚÖj¿3¢FúãHƒÜ¤ªt*.£ù9Çg%Ôlß$<‹|Δ2÷›§¦h"&ZbùS…¾k·iIÖOÕ¼æšrp&ˆól³Y`% ÕXVhTÆŸM‘ ñÛT²Ÿ®¥EË¢êÚý´Ž½JVƒ–/o@ÄKfˆÙªÁ{Í¥Õ·bÍ^aëxG鱟ç
-5”­L§’_VˆÒAóÉjÛ$&µÕ5˜½œfä*©§BŒÕÁ@áue5ÂDÆjÞ\
-ûðQ9
-‘sÑÁ ;-&;û±b%È]¬[C‰ÒÕqaÑ–.«ª+«@]s"‰®ú:ˆ|ß+ƆÕÿ k_ƒÞ$Ž'Έò~EÝ­Õ¶š·FD­¨ÆQmE+
-œ&«ÒHN ƒÙ}4®™ì³ Ò •«^_q˜‚Z9ùIb˜Íœâ}mï'N÷k…ü6ª45ÌËØ)I²³ ‰ÊbÁ>ª(‡³u%ÿ•1G Q$E!”å×beõ‹¶W8)ãòë«ÄÔø9™w±³Ád\éÂU—Œˆ
-f?UÙ´ïp´;‹åOv
--õ}Û̃µBF>M¬jtRE€‚ðCó3"¼­%ùnmxÈ÷èäË‚XWý½ Ûm•ù0 8‚F„:]ô2m)ë¢T0` ¢
-"ˆ
-Š©Ã¡ b¹D5.t…8‘ç_ÈÌ*’,§h.=ÖhØ3#«ÿ]ûl-¬)Ö^M„JÄzj®Æ¼mS[
-ƒjã©!¥
-‚²6ˆ8-0ÖÍÚz1Q¡Wˆ\ž  2ʼkÐ4ÓàÙ[!rÁi€’džk;™4œ8p½Ìˆx_qxæm"Y(üËêÄ¢<ˆ`ûšà=kkŽ¬m蜛32e,44)–7'¤¨P¢qÁC_m[+l8ÛÁQ¢¶Í—/©ÛØË…åÑÊ.€½u>…™ùbÖ6BZeõXÄ0K‰š‘ý(ðíõ@æBõðR€€ÚƒË Of†Ô¶”]P~,IJê
-±oÝQ‹B«oq%²ŠjMâ’É/Ga4H»Ðê[ ÔmP7š“êªaùQ6ŠDFƒ+¢â,ÎÛÖÙ ƒ¢JöB‰áV@ÆY¶å°-­¥É ¢â— %“'€‰
-Ä!K°’¨ÅÂEY`Cy:-Kù$*FM`Z!rPl‰ƒ èõ•ƒNƆroCf§D—‚úvÖbÎf˜Ê’˜¥~ïª5™ãþ½·R®dEb` k4® ÷5(TäœÁÀêhÄUSà¼me"³…¢®× 2аf½f+r;#©å´A¥ýÝlaLKL¦¢ØÐ{¼Iœ3 %(t³Z€+Ä~]b
-‰Í
-€f”½‘<2=óÔ㜈´¤Æ¼- ©"yéóâ´ôùy8#cž‘’æÄáŒô÷µ½—xï°Ö•Pþf>¯„Òéóˆ¨<µºZQôÈe[µvÌ¿Áœ8û^ƒ<û¶i–ðd»`Ø+VvÌÐÝf»+[mØ•}âbÏ‚<¶·IA³càfp¯v`a
-×\!ƒÃRµ» À‹i¬÷ðí{0oëÕ•ËB…fŒY¬Œ¥oe&WÚ¢Z©b4œrÑà!È5¥‡ÒõžÉ3
-IKoúÁŠʉ´¡,ÚšÔ?mWˆC ^!Çy•ë¢½B¸^ù©!ˆ{ƒðž í³S;ÄûA\Qfä¡6P\*»CÁ ŒÓdÆSF(?U çm“ºú¥î˜äIN¸7˜ˆ)hYñyÛ¡:%¥¢9lj®“-"2Ò"jæÎXŸ‹(É7'ªö‡šâ`Q3’sÚã4#ÚI’í9këL¬™iµ3â\ž‘‡¶L¢RWª>à,D‡ËÚ"œÓ¢Ç¼`hÀ^‹‚
-YM1Þaw9­ª|« ‚‰8ÌÌÛVÛÚavš«¿$Ž)¬'…›,Âi±
-¢ÅDDw1ø4#Ú"
-ï[m‹•M‚³$²0²ü
-Ià„X2cfÏZ!2` :dýd
-ouqÀœ)š+‡‘PõÛÌÚK6ª1
-²t0'#=Æ)ª²bg\!›ä
-öK²Ÿ”6ŒŸúCrùÌì¡ä*u–#íH,Ë0»*w˜µÈŽ¼>'#©…6SXšˆÉÖ¦›unN&»X…½ÅÚF@ŃŒØåÂ2#J`¿ó¶#­AúV‰sûý Ó•§Åõ¨W«TŸ€›«=ÃàšñþÑÖr¦ãšĹgÝ$èÊ4¤pžSÌù)h Íl$} ×¼%C(¡ŽŽ:¹WˆlùDƒÌÕq´WœÑ¢–„cèÎÀ„ê8No4 Â'bV—ø
-‘§Š%üšû¸2c½h½aZh¾¥ƒL%ÁÛ¢m‚¸æHì :ÁÃFy„>YÄ>'¾«sŒÖ@¿–í#J‰Y[’XÔž¦Å7ÑÏeÃ9"©¥'̤#~Å¡Jaó’b4o›Q‰gæ¦]!—î
-î_Ëo˜;ŠÝPëçNeÎôt¨×®hb;Ê'ÂU=#Î}+d¸ÀG¯C÷âÌ8Tª6-Í’væ-yYQt\=Ê3¢*Còþ ‹Íít–LÁL´|qjIÜ̬ZÅ<k›Ä&פ®üÈ2.ùˆ]8Èà+D­…D¿$y’JÃï—Az´ÄPµŽ¥VgµœˆÅf YÛ@øS -uFl’ ‰@žÆ¶ÌÂUƱÚâò pØÚf­Q5˜™çÁ53òÄ¡›Y!XFÈ]niJ v€JZ³0 ÇBÅAðRËEÔØ¢ÏV¨ˆABÞ™{…*±äëAMë9‰”•ê%©›ŠžDÔ½a»ø›y Òq-€ª‹V­:n¤ÉfLUg°+BÔQû²Y…±È)C䜌rËi-s›¾§¥‚šV
-Ù.s¦×‰ZÜ+´ë)2e”QÖJ^7iÙGƒô£*ÆA4¼`6òQoyÌ~|C0÷ñ˜ÓÊÍEE¢¤æò¼­Åèè…-ÊG‚!ä<ØìŠ+«¸4 b®fHꄨR+åщ’È=·±Ï‰³¬Q3dÞ+ÌmÑ 8 b
-j»Ÿ·¥DÌË Ôƒ¤î¾y¦T€,:²`ï¯J–TŒQÕ«4K­¦m õqgmg§‚jÕ´ šgéõŠÝT8ÞÜG\M71òOÃœ8,¼ñ¾¶÷§qiz^X±Â#Ý„JšD¨'À(¢ja|JìÒ4‘@Á~QK6à0pù€z Õ(”£+M^o¸}FK*Ñ‘
-´­‹Ü iVëuND‰Éà*¢ÜaÍØdvžjüÉŒ6ÒŒ<†Ov).V$ ÊpeE‚¥ç–ò5_ä()Ë2f¢ü ÛÌê–¬ìT…¡ éL£õÀ½YÇáôäW1—w.s>
-èæ˵â—ÛÃLö…Na„`šI’2³mîΞ5Ük
-8ô+óêòî/g—Ò¶ßyv{y÷Ý›‹»Í·Þ/öî|<ºòöfâ­ùÉ}È?^Ü~{A+ùˆ„ mYÇSü?ß
-ÍæÂíÍ!³•×·7o6?9ÜøÓËéï°o4msÛ¤´þäó¹½`pÓI½zuywù¯ÍÕ©ñ¸®7Ÿ×ùù»7ï>÷0ŸÙì•È׺¾8Û8ýåüìêü7¯6ŸÛxáÓ§Öm,[̾~þO<…M?àê[¤’œ]_¾9{°Ò°µÝi;Øfwþd‚a6ŸÉc³~ƒaÄÜ»Åa9ôcÿd‚a6ŸÉc1è<ý`˜ÍëÊ=¾h˜#†ä_LËŸ#æy|8Ìù“ ‡Ù|&ån=†ÃÃaå2ú„Ãø_J8Ì<ÿÐoâ'³ùL›Aèq†Ãl±³ýŒ<™p˜ÍgòX$¼C ‡9hÿÏã‰æÙâÈmË<è>ƪ[Ä¿ÂÏö~¾j"à#ü|x üE¿øϯËÕG¾ÞÎòµ‘@ôx®¨Íe¤jÑ“,~¬“säh[p´òKæhOþÈÑŽíÈÑœ£ý"Ú‘¡:C» zägG~¶ ?;
-hG~vägG~öøùÙÜ©óõv^ø'ÆÖ6žü/ȇw<6››úK>6OþxlŽÇæ/—ÿ¾¸úËÕÙ_o—xˆQ, ô©ëK¸“¼qô¤ õ¯[PÎÞxLœïöâÍ͇Êk½B­¿y)ŽÃ/öòÔÊŠøÿyp'>÷»“þÏçýïþÿ?ïNžZÈö±†ŠÌë‘ÕPyû=UQÙtv©†Ê†·õG/ ò‰§yyýêâõåõåæ.Ë~R/Îî~»Åu0{ãà ÄŠ õ¡¿ÙlüÀ#õ·™Ëc‰Õ?,—luvœìèU:øDó›7ßß¼íéŸß}à°?>Öð¡-õ¸f/ðåCØØLøÏÍÏÍ?âØl>‘„ Í'Âü°ñD>0åùDüAOäžÁùDÒ#áÈãòÜR/xLWçÏ_7ðSÛŽo/ï¾{sq·¹¬ó‹½C‹c§{L
-ظþÛ1#ÿ“¡5_ý¸yø×°É6ŸÈxé|"ÿ>ppèÜìæõë·wt$n/^mŧwæmtüÿÌ3ýe(
-šÕÑ$þØLâÇ/=>‹¸;<“øQÝÛ…[¾£Â÷‘ÏÌQá;*|G…ï¨ð=¬Â·±€rTøµÂ÷TãÒŽ*ßcTù6®ÃñøT¾§vÔøŽßQã;j|Go›Â
-OEçÛf&®õå'§õm1£G¤õý››WßÞžmÎc*ߣVùž$"ÆV9âž¿ó+^l¬þ+^|r†p,ãùS9V¼ØóRFˆ'Á›õ;–½¾ê‚¬€,ÿÇ7WgçÿüüDH7ߟ_Þýø[áÞÞýxµ¹[[úDßm
-1ae‡²®ÿv{výöõ(‡³ßwj]PÛ1ßä1XCdjŸD=ÚC~áöŽœûâêê¨ëìy±šÛ à~|+ø§Ï¾øOï¾þÝõ+ƒ"R&Ê׺¹þKï‚Ë”œ
-ùË‹o/¯çžýé{íƒ}õã›on®Øvqòååí«_?s'_ôþñów³ÿ¹“ßöþüÌ=¯‘þïÄ=w1‡)ÑSsq’h›çEÿãy‹SðåägÏFPÎ?~ìÿñÿö?þO'ýp’Nþxò¿þ·;yE¿÷×g§Íçéy(S>i!¸ç©ôŽÞ¹Ð´Fäö<6ßN¨m~bNóóäƒ'bjÏkp•ˆ½+úëœ:HéyÌ™úMþy­!SÛþšŸR$byžRLtÏs©Ôk
-Ï‹÷Q:ˆþ9¿ÝŸ¶:qÃø¼¤ªDo=¶”õ×'?Múrz>E jš\Ð÷£µõ¹bà9Õç)¸Y¥Òücykå¦ý¯©éô³öÙú: ÅM¡éËíyk­
-Ù»þMˆØ»Ï>1ѧjJô¾‚æ^žWÏ«ßÉaòúë-5þ­ø¼¶”&!E7}»>o5Ò:õ5ìëÈ¿Ô—,õ‘¶LLLŒ}BbmÕÛøk(ôS¡/TÍMÛ¶Zx£ôo×
-»Ô÷AɼMr_çvòâþ=õòÙ뾑cqµñþõSqþèÿ½lcZ-Úå-'ú`îùDÍ<ígÚ¡oÿ¾½OZ¾Œ}šŸ—Ì;ªÀÙ¥>ç]hC6&UÿÜ……˜sÑ¥ªýuÇK&?Ñú‡J1I—-;þz½aè[ˆ¡Ÿ‡¬»¼†>J^@ß×L>T‰tbé}deIhÑ?O±ïb~?Çþ[üUÜô<Ò¬dQ«‹4Uמ— ‡„{/ï÷¯¥ïÇÐ?Šc2}žªç©Ny’Õ/Eöiÿf½"“
-µ/¿ß×Ò§Àäú<dùýàe…xQª}ß ašd«ðúKý?Šì Ðû•ú¬ôôõ³ïôÚ7ÈY¡_Æ°Õ{Û©HÛÔÙ‹üX’µ)¤’ôPTc4?çôÕ¨#hÔŒ^åý>™I~©¯¯Í–[ /Á”„Õôãäs÷_­¡êYï[R7F™¼Î [èÃ4a•¹3"ú¾B‘GÕ÷p›˜'b¿xöûÎê?ûšþq'¥÷/tºˆÅMÉÒýH÷­ì>U—‰Ý÷ÅêÇçä_ô·¤ó2MA"1ç7ú ÏËy M ›¤ŒUëçÒŪ‡¤óü¬<"Zaî¢v6SäÛõsTo©Ú:oKʦ0U='à}f§ÒEì—¹ï¤V*wQú%1q´}p*ºzZÒó“ûò¢‹Ü7« ܺ7ñI®Ÿ>»R‚œ lfú1HÑ5ë¢óÉåAÿÂY>k?9{ùT5¶¨›­9§ ó¥ŒèËÑrÉŨ'¶ó„~ó6Ž¤¦N²b“·ÐÙ
-̈eçšt»»É79D̆弴–ô`”>Bë"÷ Iþ†Óå¯M¿r*Îa¥kÄ©ÚÇèCoÅGy@ GÏG®Ìa¹_ï•™¤<ÙAJÓl%C±u@ë¾ë›°bÁzÇõ~‹×}RKµµHõ¹Ë <I~î[-7e´ñFa©]–¨³½ý¢wñUÿçïýŸéäW¿>ùÇÿ 1êû¹,µ…tßáÙûèì}pö>6{š}Ì^fïã²÷aÙû¨ì}Pö>&2u‚U‰-ï½h“U@Ô³ÑÅœ>r¥Ò½ûRÉ9åAcäÕ>H"ÔƒçäJÌ"“¿9F•+»¸¬—89í¥ŸN£úìôž|Ö«¶æI;ˆAÞú½°Q¤~ÀTŠìÂFáåP•TMA;qAöné{¶Lºò.{„©m“Qôªˆ‚ôcÑc)H”»w:´¾)ŠJhýTuI†ÖÉ]
-JöXæõÖºÎ] ñ¾é.ä&o@2–.¿’ÌþÒ´VŠ:¹Ÿé]#ݳUA«‰¡z!F:€/T ÅW!³4Íý’ޖݤ;\^×úZb’˜l€^Qä‹ÜYwÚ‰%:]£»jðRÉ}4^ÛÖX´ƒÉ5ý ʸ;×s¥éÖŒ¹ÿõBå·~ÚZSazÔ§jP½Ë† Ï"<^/1¨Ò<y¿Òô´O×U<Õ”û'ÀÎix¿s…\ðå£èu˜BÀ–VE™ZvÞ¯D—£j[N´f&çxCvŵ¨[7¸âU(MU{e¡ÒɪA;è=Úö^uëöëm‚T['í o}]Á\{[ÑÍâóI8<)<Þ©¾ú¿õ˜4%nŠE—€N~¬~Y4¹c:±ËÄGôýTµa%-ï_u)ã:,‹•õÞêD‚ö§ «Lú>«Y/U-¿¼ô›Ùž ÄÎu0ÙœjBe2=8êÞ;°¦]õ…¶=^ ´è±¬­¯vÑŸòN.¿¾ÖY.¿¾ÖX«~cT¶³2©.,|ÐgÑ«Ÿ¾kÅÎr©â»Æ~ÔµSº%±1œ w@;^Š>¶2©^MwKHtas—BÖ…ímïsbé
-ÉüQ*#HtëƒáO^tÙä¡4ÑE(Èj
-b°yñ>~(d¶09çõNå:bN)XmDª"YÍÎ\$ÁMV±‹ “KÆ7«>ú‘P­1Ø·it$²
-P¾TSWF¥Û.Wta*ŠÑ¢*Ã}°7[µBQi%zˆ0‘äB須ŃÉʼní‚D#µ‘QnJJœ¦¢æ¤0e]pÒloÙ>îœô§ú¦*~i}vÁLŵPc²×¯*ïò‰¼Ö…Á(B†‹^MS‹ï[Ê9±01&Š¨zw'B‚
-®_Qòbµ™1’ŠtÅ¿T²«A‡`Ô.qö¯¨ö3çD
-ëMû¶Ó)ô“@,^>?Ùt]ß=³°k®ØuACÌ‚B,Aºð¦6tá ãêr0®¢¶¬¶:lðNìŸB‰mRA4Ø2ö– œ#°]OÅk–@dÉ»°ÈG¬o3ÚòÁú)T:m¸X¼š”œhdbý4ô“ÓÀRŠìÏ)•( !5«’†˜Kµ'éÌÈ„™!øÞU”³OvÕ4©«69x]T`NÈÚHȺ¿‰šrjìb´Š
-D®pÐ^*Ù{Q
-«Yç
-)Ó"±Tž–¦ÊÞêïñ…ªà.ye©}õ¡ dú ^v"kBì"‹vá¢N¢³¤¡Ua#«ÞÇÅPˆU5•E )Ú6ãbèk•Ø5h
-;¤†úfnmþ¾ìCR#…Çõßj•Ío¤ø b˜‚Ú$]Êa* ØIÈ]Qu©O¬a’«‰ïf"ÒOÀ‰c ±k“ûŽÐnIG‚È€[¡/b›‚U¡/“¼ÒØ:/ãÄúåIqs¸îœÈž¾ Ÿ—­á'‘ úæ¯Pc‰œ˜svr¿Ë<¶§ˆ<t5GlÙ\Øz×i¬uà̸‰­ª¾È†”ãˆá;3Udzbá4x_dU¶¨Ã¤Ö—³ðNôapï® øI‰Õ‰rWh÷zíw\îÌ¢“HðDœxw±ÿ:ŽÊ-mf*0î°NÌrš=Ë«P°Ðúñk5Úû]€Wïçd
-ú}4/Ê1Ó‚7=:O,Ýt2³!v}K‰]Gí¼‘ nÖæ  wn6ñ@drò¿T²â½ã•‘ÅÕIdµ±4%†(¡£‡©%myH“jæðjY8eµ·Éî&1UŸ²ÚÛ÷¯Ê¨¤‰”Ë–µÙ— û€•á¬äiªÞÈ]óÐ_#˹PÉÂÎ n,wEלÕÐÑÇ[Š:è›9ûfàSìHßÂÚöº¾ÄÐ[V"é—è ‹E*ÁG5½w%»xq˜““AÄ“NŒŽÛØ¥ƒ&jŠ’E('-½É§ìû¾x¨î½%¶-E˜@Kg[$ðªm»€%“'†%²ëMõRÜåý¾¯sÚÎQºT#ÚJßö“žllªeé3„ÙFä(–{²qFÝ_ì±.0C·œ¡×¢×8®6§UØLÄ#¶ëp[€!ôŸèÌKUA7U¨Î¬ÊeÓ—A; ·JÀELžчû2Ê$Â+é­“W ÇZÈJtª’3·trß·EÈ•Ô—J®­©öÜ{€¿æ)‚hŽÿ
-ôÿÆÈfA§^<^ªµƒ ™Tm›y3‘ç
-ýf±4± „Åc¨¹ld2mñ—JÕ‹Œ .m‚w V˜,Î3!vÑ A}‡fŠj…ÉY5í"û]ÛªNÞ[J¨¡½÷»ÜÉ*ö Âé5AÌ‹ªyèKbhèL`‚ìÇKÀwÃK%×uqÙX Û™õp195óï9Q Hv²š¬V®¦™HõRÉ1W„†`3‰@ã=Xz©gªsA•Ÿ\kˆìrÍk‡˜Þç²P—Ⱥ!þ Ȇ˜œŠ¹Øt)dU>’éáD„}ýÿkÆ•°²8ó€-…—÷·&ÌߟÁMýÓýê‹W7ß\œ|q{÷çë¿œÝ}wòåí»·ßüíææê×ìÏîðyö™K.ºà|gÝ®¹ø{·ú^žt¾Þ9Mù]gSy\ømp9=û¬t1¾üιgŸ}ý›þS+Ñ´Ÿ}=#y0_ó.^}Mã¡ÐÈϾþ¼ÿ3<ûØ_=+æˆß-lQ/ðØÔBBÅ¥ªµ³ßÌ2ù‰YrÑŒ\lGæ÷ nãCW;|»ÄdM¤—p4£Ÿ²ÉѬ2cs"ožë‰ì—%ßÝ}û:ôðuy0+QíšÑÂÔ:‘],fdA™É¾‰Ö@çQäó>€LbçîÄ,6ItÀÁQLžÝZ±°Ú⊹֣…ä91„ËûæwÅ"
-¸µ+F@§®ñåDDºµáÅîŒÛVñ*h[‰-èÄ)Y@eI²,$ŒÅ1
-i€ÖØ6‹*G¦ÒwÐ@ öé½öú4áãÍ+ˆ‰G Í<ù:
-¬8™ÕlìþÆç
-#GŒøv;±†¤L]6Ò‡tF÷#…4¼Tr‹p'Á©Ö‰SˆèW>Z˜9žÌ.NTµ PSØûYCàžHÏ×ÌLHšDÓù±cê
-ÄÄOZÒt
-æ'Æ’*‚ä¦ Ü ¬¶J6‚Š SÕŒoÃû¤hÅRy:úk¸oÈÃ#<¢Á:U)€Ãi¯ÃŠÄä™^ª¸È¶Eé5ƒ%:oê<(iJ 7,+§qY8—Õ?ìʼÛÑZý’ìá( ]¨3¦sÔi±ù^‡)¥¸ºˆïëTyr›û]hWf¬8e'–¢6†®£T- ¹X­ƒÈXƒšðÃ6.%6óy„¦Ùb"ùU¢KXm$+aÏ:Ô<€Çʲs+ÛTìóÍaFŽû}ŒX›¦^MÖ”˜àô9ï‹ïgd]Ü
+¾t
+^^½ÿxûZošüðþ?­‹~ôÿüøâò‹rSà‹é½õþ£r·D¹×î/þOy‘õu ¥×^__½|ùéí¯ž>ê sý…WߺµŸÝÚKþ¯ú_ýßoNL&/m2yý‡Ì_/~ôã‹¿û/'&Mûï?eÎôÙ<u9‚Ϫ–²(W-õ _ÓêãyÕRˆµiµ\ÞÒêã¼j©(ÙÒ꣯ZJû¼ji‡äá Zö4{úxVµÔE©j©<KUKåßYÕR¨ç]fO]ÕRšçUKùf¹j©{+U-ogUKym®ZÖ¿»ª¥°ê¬j©¨jUKùž‰ó²Ϋ–²§rÕR(“«–ÚgUKéâ\µÔ.NUK=ÖΪ–r@æªåVúª¥Ðà¼j)`‰ªå¤© W¸t^µ”e¹j©ìJUKÅÛYÕR–í¥E¸‚Ä\µ”öyÕR–媥ncŒWšçUK}ë­E¸ÒÎUK[§¯Zê²z}›Tµ”=rNzåjªZÊörÕR¾ÖYÕRöF"½ì¼\µÔwVµÔÁ™ª–ÒÎUKé³óª¥öuªZêx)iúôñ¼j©Ë¦Fø„›>}<«Z*¬RÕRÛ©j)í\µüŸG÷ë–î?ÙeÊɢå ì—
+´£Á} iq}ÞÖ-)®×bÌý²Îó’û:¬Š]hký¸Lsi¦D?[»Rå}»\ÞûúœönÄ÷£¤˜sŠïGOur|?›­Cx¿ŽÂûuÎ
+‚’zà.9¼ß-^ˆð¾&–[¤è~ªç¶mOÑý2 ‡]t!º_7¯7äè~Ù,f¶úmMê•›-¶¯ ïë·ã¤Ø~,öè~/‡>G÷Ça•îÇb[‚ûcð3Y î×b§líqåsl¯Eµ³ØÞ‹6„ö벧«ñ5ל­$œCû}¶ðßCû™’¯‡öëpÌç¡=%íÁ-²×¯ÚGöË´­)°_-·n½%Á}`¿V‹õÀ¾^ÃÐÀ^ÌÓã,°—¡TR`_nlØ×uöý,°_ÆÑ<ì—ÙC"ì=YèC{O-´K™§ÚoS™ÏCû:&ÖÛï«W€µ|[Gzy}hoi{‹ìq±sªGöõt&…­>²—ÔÒ
+¬Öžd~“‡Úbß­^í\L䪱¶|r„ä`[–v&¶2ïøB‡Á¶´‡#>–N¨ËÖÂY ¶Åøš- Ö`[”¯éˆonÁ¶ŒÞ2¶`[bLKM,Ø–¸,-ž±eÛlûË‚m¦˜l×#g#v¶h»XÁ—p[N^iZ]ȶˆ´,Ühc ·‹m*Âm9¯öÁ¶È¤GiÁ6óg¶ëñU ¶ë²Ý®–X°-¯ñ+.l×våil×ç¦ÁBK" ˧m¯a·ÈY¢mé Ÿ—£Ñ¶´×eŽh[úNj¤-Ú6oöèZ¢mísŸB$ѶšŸs¬£Ñ¶,ÓS:Û¨cm™[¸½Êô‘®´p[qòÏ"ᶠß9Ö1½pÙ»h[Ž€ÅjÄm¯zEþˆh[Ë-ÖÑh».Ó=ÑvmדþB´½º¦“£mY¶Ú°Ñp[6±ÙQ¡á¶È£2…(‡Û«ª;m×æ<ÚÁ¦Ñ¶:¨kDèm˲éØí(óV#úÖv™¬ÃDܦˆ¶¥}X*ªÑ¶`h›úp[–I(H¸­¯±ìMÃmi×±GEù_ŒÝïMÓ”Få YŽ†Q™¼¬Q™Ã<Î=FÅû¶qbGÔ:%0*ññ6÷•u+£rêÞ§ÆQ™ÄfíÆQ9ì¹ÁT´ï£±Tšæ±6–ʲak,¢¥¢}ïcÏRѾí7–
+K–©ÁT´ïµô0-Le—ÍcƒieÈbËLkˆ0»W¯0í{9¦ª}kSõ¾×=`*ßËI©4•c{p‰šÊîÚ}wéaQÃ¥@©ìÿÍw^ˆâúAéªÓ¦@©Ž`Ck T­oÿš‚R=zŽ ©pûØ‘T¥ïí’ªõÝ@ªF÷\:ªõ}ìR,p@ªîµí”
+¼É6†e ¼IÛ~t"è&_p™JÐMw×p ö(ÛD¦ÝÚÄ·]–=Ð&ž·kÚDãÕ‘êhÕ{·ÀPѶø|±Œ¶e‰°NÑ&j°@¥›¨ÞeÚÝÄäÖ#Ôé&¦7–cF¬npƒnËç$¥›˜Þú Ž·Ú–I>™nuQ=ílA7ñšåªxS{îè&‹d®4tÓ¶¥J7Q¥G;uÝdÙZJÐMÌîi:oÒ–Læ›ÚßÖ™zÇ6œo˜ß™oúÞ–XéÞSmÛ²&å›­sd¾é¢5ð¦ïâG˜àM]÷aïø¦Æ¼Å^Ê7íMc“òMFȱŽßDô.öszì/³tø¦#ož:¾éà´ÌQMý«,k
+áT®,kG8Ѻ7ëÄM Í©€…qbB¯v† Æɲb‘¿BN­n‹)ôx‘ön퀜HØÅΞ
+9µ®÷–kÛØ”›}
+”“¶^‰wʩȽÍåT·P)§ú¼åÔP· .0'ßÇ驘Ó}65Ή;Y@ V¾¤éVk†N:ut-‰ Ò©Ê»èD÷vˆ)èÄ÷ÞËÖN|oºtbë¹ÂA'¾÷2%Ήì½Í[pNdï}X‚s³NÈ)çDöž—58'²÷èa›pNåÙ€
+:m{šâ ÓEˤӷ™ ºìÃØ‘Nö¤½J:íÎiÒÉ™–¥#Œ¤Å°¤¤›a®“NGÞ´u¤ÓÑ9Nš¶UŒçm™:Љì}Ìc€NÑr,:=&, Ðé2Ë‘tÚ¶í*é”EãØ‘N·[¶ ¶‡-H‡T~F:»·9“n’¹»sËV'Ÿÿë¤SAÓ‚Ä ,+ûî¤óÙkrB:¡×>[øé'ªÝ[ËV¥=n}¶*ª÷²·lU¥k ù”tÚûtU·kŽ’nÒ9r[NÚ«å+A:•»·–®š0>éTS·ø.H§vûØÒÕÉçHC:1a·¡OWÕ µeJ:±n§%@§ŽîÞg«êòZF«¤Ý{[¶:Ë0#a#ݘ‘N.: t2ÅÓbs÷UƒtC#²’®>¿ŸNft.-]×{å5ºúfûÖç«âzïkËWÕm¶*€®x3ƒNk+-aÕöØVõ§íDÖHW—ÍCKXgùLSi¤“.KO:±OÇ–²Æ6 ]‘ù¸}ʪïm)‘N^cù‘®´ŒÒÉ¢¥¥¬ú6sKYUnï9Wwä6´ŒU;Ó¥œ“²yæçd KËX§ÃæÙÃ9wSŸ±êØ´lYÆŒ4¹¥¬“ü¶ÆÒ§¬2Ä'+(è”,GËY'W2èt™U tÚ^Æ
+«æêàY,_n˜“©v­Â0'`Ù·†9i[¾Ü0W¼»À\ñÜ Ì¿@™9§_Æ9‘Á­8oœ+ž ÷œu^š97òäÎ9ik¶n SÓÅ
+´Ç k”y Љ£+ó2éDå,¹UÒþ3znÔ2Ý;Ò‰ð½7Љ|ì-qß{KØÞ~9GA'¶7D–ƒGloCtb{¯sË\Åöž·)@'Ž2×'
+ãÄÝ÷~ºJÑââŒßvI9«è¹ÇÖOWWÜY'¦·ñKW¤êâ׫A\]F襌«m9ãÄâ.eNŒ[K^Î8ñ¾§½MW‘çyÁ¸""[ËYEóÞ=vÄÕvÅW¢H)ci³UTÚ¶™'Š¸Bò‘W¨°8ã
+ Œ3NTéÑòÓ€œZÛ{›­R$·*k@NÚÅ/S9Y6 m¶JlÃ!'íyíg«è{Ïc@N_ãWÑæX§›­¢‹¦6[E¥ó©ÍV‘¯'Nq†œ˜ÞûÞf«hŽc@N†Èa×rE~ tnÓU
+¼uÊéÐûé*2<w›)£ÃFÊéSÃ\mÓÔOW‘Q¾ØEÅœ‚ekÓU´mÉr`NËd•sFš-8§$úé*º¡MW‘¶_ÀVÎi{x6]E³rëÂ9­lNspN~¨ÔEáœØ—ÇÞç­â~{Én?ÓE>#ÂýòT ñÔ‰õ½ØYEüª‚ç¤:9&×–¶n2svn¨“ö`ˆ
+ÔÉf÷Ò®¶ÊA; í:ªxF
+çǨ¯{ÜZ޺ɴç¥Ï[å඀:ÙeemÕ9c÷µ¿àªÅÅ¥å­ús–S›™'GäfÜ
+ÔɼÂyl"Ù;-o•:=Ž>š;˜6í¨“ ÇNKCÌ8/ùB„xÜÛØòVñ¼a²¢nðI=u¦¬5Öé=O–ƺ¡]¨Ö þ3°Nj|V0Ö¯5fÖ©>ÝòVm—–·–â%ÏÌ:±¶÷–·ŠÙ½•¥±®¶—aéY'¿¶5´¼5¶ëtfq:ykË‚ uò’ÎÙ]Þª‹¦–·ªr>µ¼µøOzu¤«;rÜ[Þ*Ý9­>'?¢8m=éêHòû%(脯[iJdà•½Ï[¥:^¬'ƒFŠéÎS]ϛϚ Ðír)ÎVQÐ Y¶­]pÝÍTî@§¿\ÚWEÍÒ@'(<³tu™Ï!SÎízM¥]pÝõl?Ÿs.|ºÐA ÎÈž½r°%$³Nu%& « rL‘¼† ’q§2ÈaÄVÞ… ðBÉÄ æÉÜÿešÚÅ×°A2õÐA ^è `/t̽ÁÌÙ6Í$tȇ’É×tG_ÓAœ}MIð „8„8$Çyø Äylè!„ä@!„dÖ…rY„–˺B*‹B*‹’SY×AÈdÑA(Ù¡ƒä’:%;=¬Z&‹Ò•ì܉’ç5TìÜé*v/ì§
+©„gø*6Ym'FǨÞúÆgG¤’E³Ò¥g—Jê29_"•ÈÜÆb? ¢c¥½L!èiKçHš¢R‰´U±p©DçC®½V"Ëvsru¦ƒÌÚñimhäïë¨V¢ÓÈJ ­D^£¿žåZ‰<?l¡n¨V¢{i «Dvâf–‰Z%²£×¶ŠZ%ÒrBÀ*Ñ qc «DÚ2c…uÄщtö³dj•HŸ»Ÿ­V‰N½,±ŽVe,éUµmhd„U"íµéj•,òÛƒcH%2\XÅnä"cøzsžù«DŽ+¬v±JäØ”k¾ŽZ%:¹r ©D&8î&#ÍÅç&Ná"©TbwÍ™C*‘-øï¨T"Ó7åÃsÖûûì³ý˜‚Z%2ë“ßdYìþ?[i?á V‰ÌhÔ0Ý­’˜9êV‰Ì,ݬÃdÞR‰¼drAD¤yº‰e6sJ'­š#ªR‰¾Æn™|¥@[¶«¤C©k%R×J¥î•t(u¯$PêfI ÔÕ’Ž¥®–K]- –ºZ’YêfI
+¾š%HÝ,¤.–HM,é8êbIpÔŒ਋%çÅ,É”C-r¨%P·$S·Ê™]ãÐK2ã\/qè% ½$!»Äa—À8·K2â°K@v ˆÃ.ɈÃ.qØ% Îí’L8ìçv‰Îå’Ì7—KÀr xC.ÉxC.oÈ%à ¹$ã ¹¼!—@8ä’L8ô‡^áÐK2áÐK cĹ^’ ‡^â„Ã.qn—dÂa—@8ì‡]’ ‡á°K@vIfv ŒKÛPÆa—dÆa—8ãK`rIfœÛ% »Äa—dÆa—8ãK`rIfr ŒC.qÈ%™qÈ%@»Èa—dÈa—@9ì’4´:’)‡]â”s¹È!—dÊ!—@9ä(‡\rN9ì’L9ô(‡^åðK2åðK † œC1ÉœC1t(&€Å$ÃÐa˜
+ž›']Ï­‘¨à¹y<7Oº
+ž›'QÁkÛ°
+ž›'] ÏÍjx.žD ÏÅ“®†çæIÔðÜ<‰ž›'] ÏÍÒZO"Úsñ¤‹ö\<‰hÏÅ“ˆö\<É
+öuÔ:ÑyHÇÚÉ|Ø-”\;‘I9ÒY>T;‘eK»•‰lÁoè£Ö‰Lt’©ý18íg¹]¦Z'Ò.{»s ÌóYÛ½ŒÔ:ѹ?óÖ‰L²š°PŠ¶ÕŠôu¬Ãê7ÔŸVsíDÚûÚî(ª‹o`•‘Ç~eÁ­ioc»s Âlšÿ ¬“£n€Q—N£.tué$0êÒI`Ô¥“ÌQwN‚£îœGÝ9é8êÒ 05ç$XêÎIf©+'ÁRWN‚¥®œt,uå$XêÊIÀÔ•“¦®œL]9 ˜ºsÒÁÔ“€©;'Àç$ÁåÄaŠqM1N2M1Nâ×¼Å8¥'¥' ã”bœd”bœ€R7Næö /jœd’bœ@RWN¤'¤'€ãbœdâ‹
+r˜%@³$C³È¥mln€ˆX’!‡Xä0K€fI†f Ã,r˜%r˜%@µÈ¡–dÈ•V"Èa–@9Ì’L9Ì(‡Yæ0K2æ0KÀf ˜Ã,ɘÃ,s¨%pµ$q³Îa–À9Ì’sÎa–dÎa–8çKàbI&b ¤C,tˆ% ux% ¯Ôá•dÔ¹Xâ¨Ã+ux% uh% ­Ô¡•dÔ¡•€:´P‡V’Q‡VêÐJ@^IF^ ¨Ã+ux% uh%Ž:·J@VIFV ¨Ã* Ô¹Uҡέ’@ÝИ¬¨s«¤C[%Á:·J‚uC»P¬s«$XçZ ¬s«¤c[%Á:·J‚un•t¬s#$XçVI°Î­’Žun•ëÚ66ó?ÊÙŒ¤’@Y%AºÒ’• [%A:·J‚tn•t¤s«Ò¡•@:´’L:×JtX%€«$ƒ«Ða•
+ÖÝ)‘ ß2Ó§DÚ2·ÛWÑs–,sDi«`áN‰^€wiÁ•Y´%”¹Ê'AJ‰|›kÁ•ùÆã2‡R"¯‘ÂJ‰<?„¢F‰,ÚÜŸ£Dvâj†‰*%“O‹ñuT)‘¾Ð;"ºRRÛ:o¥DÚqÃG×A¤;÷e ¥DºÜoR¢JɤfE¬c%ÁÁx”’A.ymÍ)‘ ¹æ”HÜïŸe³ËðÓëèAJèÅ*ª”È…ÄclJ‰\ÓÛŽ¦”ȹÇýRL))2#~jJIÝã‚z”’båcÀ”¹ö=%§¤HæhNI±3@ ÏY·³ÌI))6.”’tdzPJdÁp4¥¤øPJ<`÷uL)©ßSM•’b“C))Ù)óySu™ÞJ§D^s,Í)‘½öoa”$Œ"”€QŒÇ(BIÆ(B‰cŸŒâ“dŽ"”ÀQ„8ŠP’9ŠPLÝ(¥%™¥®”K]) –ºRÒ±Ô•’`©+%ÀÔ’¦n”LÝ( ˜ºQÒÁÔ’€©%À£$Ã¥˜â”@Sœ’LSœhªN (Å)I(E)¥(% ¥$£¥”ºRIQJI1J ©%€¥$ƒ¥¢”
+:wJ2é\) Ò d#)%è\) йR s¥$ƒÎ’
+§D®5íksJj[0®« •ÈNÚ&•;{„TRln›¯cR‰\.k“JŠ…g!•Œ6Ó„uT*!•HŸÛ=HL*©ï/µ(_G‹‚²Lø¶ Ý>RImk¼ÁûhñµŽÏ±9%2x§XEßFO[¬"R‰
+ž‹'QÁkÛ°
+ž‹'] ÏÅjxîD Ͻ“®†çâIÔð\<‰ž‹'] ÏÅÒZ÷N"Ús喇öÜ;‰hϽ“ˆöÜ;É
+ñDŠ;Û_DÅ“q2{ñ¤¶kâ¿…y2Ng·‹°ex3º®_q5Ü<{éd¬h\vœ)™ÊÝ pN´ÌÊ]<Ü9Ñʬù"êœhÙU wN´šë·‡Â9‘Ò«D¹8'ãdI!ΉÖYñÜ9‘/[»3¤y(H'ZËZC½v¥<F:‘¸áœÈ>^Ú*êœH?èÝÝ9©mf8'ÒÞš×±[…W+b('ÒÛ~UNd4¬í#Zg7æÛ6ìö"*œÈ˜[Ö9ÞEµi~¡¬Â8‘Q«7ƒñÉÉZAœÚ:bœÈÈ?¦5Œ9ž6“nÔ8‘crn2Œ'R¬œ†-”“Q湘ª4ÛÓÚU>T9‘UŽ=Œ“Ñ'}bœÔ¶Â?†å¬›ÑU1NÆÕŽ6Œ“1Ýí ãDJ¦3aœHmZo àÆIm«éëXw-6½åD^#£ åDžéÌfR „$àÂ8‘—¿«‰LÆRÍÿ÷1éêÆI Ô“@¨'BÝ8 „ºquã$3Ô…“`¨ 'ÁPN:†ºqHM8 ŽºpÒqÔ…“ਠ'ÁQN:Žºpuá$@êÂIRN¤.œHÝ8é@êÆI€Ô@Šq2ö²‰ƒ×’âšd’âš@RuMÀ(®IÆ(® Å5£¸&£¸&`Ôe(Šl’)ŠlE]6qˆâšdˆâš
+9Ô Wö¡’"C9P@±Èa–
+9Ì(‡Yå0K*å0K j ”C-©”C-å0K fI¥f ”“Yä0K*ä0K€f Ã,©Ã,r¨%Pµ¤P³Êa–@9Ì’OÊa–TÊa–@9Ì(‡YR)‡Yå0K fI¡b ”C,rˆ%•r˜%¢b ”C,©”C,rˆ%P±¤R±Ê!–@9Ä’J9Ä(‡Xå0K*å0KÊÒØ–ä0K(Q.©D”Ã)IÊÉ)yQnËfBÈ)è9ä䔼('§$)·%‰ƒrᔼ '§$!'©$!'©ä9I% 9I%@NNÉ rrJ’rrJ’rrJ*夃$夔$夔¼('¥$)·ö¡EM(yQNBIRNFIR®­JRNFIRNFIRÎ’ãd”$㤔À8”’Ê8”1£Æa”TÆa”À8Œ ‡QR!‡Qä0J€FI…F C)rRJ
+ã0J`F ŒÃ(ù†q2J^Œ“Q’Œ £$'£ä…8%‰8%‰8%qJqJqJ^ˆ“Qâ$”$â$”¼'¡$BINBÉ‹pJ’pJ’pJ^„“P’„“P’„k™ã]‹CxærÉÇv£$F „“Láú¢×ƒç–VÂá’@8\‡KR‡KâpI@.Ie. ŒC&qÈ$•qÈ$0™DŒÃ%©ŒÃ%q¸$0—¤0 Æ¡’À8T’Ê8TWö¡$—ë~!N" „Ã$p˜$•p˜$“Âa’TÆa’À8©$‰8©$/ÄI%q°v-`á&É q2Iq2Iq2I^ˆ“I’ˆ“I’ˆ“IòBœL’DœT’DœT’Ê8™$É8™$ɸ–}âãºL’ʸ.“Æu™$@®ïÙFLÈu™$@®Ë$r]&I\—HäºD ×%’TÈu™$‚\—HäºD’
+¹" ŒëI€\—HR!×Ñ_¹.‘Èu‰$r]" \@®Ë$©ë2Ir[™$@®Ë$éo‰D”ërH \—CR)×]øžZ互
+¹.‡Èõ3IìïN—CR!×å
+âÐ?@
+ ˆC!©ˆC!qeQFÄ’Ê8 ‡Aä0H*ä0H€ à ©Ã r]
+ ”ëRH*åºQ®‡Aäº ’
+¹.ƒÈõ0H`\—AR×eÀ¸.ƒÆu$•q= ×¥€¸¾g…b‘yrˆë{΃;⺠’OÄaTÄa€8 I €Ã p2H
+ßHà |C ©|“A"¼!€7’Š7ø†@ßH*ßHà |C ©|C o$𠃤ò ƒ¾aÀ7 ’þ–GÄ7¹#à w¤â w¾áŽÀ7Ü‘Ê7Üø†;ßpG*ß䎀7äð†<Rñ†<ÞG„7Ü‘Š7Üø†;ßpG
+àÐ>
+8Ä
+9Œ ‡2äPF
+ädŒÀ8Œ‡1òɸ4F*äÒriŒ€¹4F*çÒtiŒ@º4F
+êRu)Œ
+#•y)Œ
+#`/…¸—ÆHÆH¶ïdŒdûNÆí;É"´ï
+Õ¼'WäÕÀ“+’ØpE²ÿ*WäÕÕt_åŠd÷U®È«û®Hö^%‹äd‘×d‘¢“,Â\‘×\‘¢Sw†:¹"u„NšGŽÐIÉ:©"¯:©"9B·öá¥CBy ÑIÉ1:™"9F'Sä5F'S$ÇèdŠäL‘×L‘ì¾JÉÖT‘WëNª­;™"Ùº“)RÁ‡)øÒ|iŠTô¥)û0E`_š"~iŠ@?Tè—ªHÁ_š"
+ò–E|(¥·”EìHŸ6qÊ"v6‰A²ˆõÙ¬¢²ˆýÛ†4Eìßö¨ùo$‹ØU²{‚,bWÑæ»°E¼/¹~㶈ņŒ›í¶›c"l»wýXUMFt[è"öoUq]Äž‘çÖò´˜Ëîìã¶6óÂH³¼Á£åßñ¸ÏóÙÆ*QboÏßDwºüÄ|{ŽgS|{ͬу/b¯áܲŠ¿’Ös·dU|‘6£®’|ëèßÈ/òE|0 žFlªÓ㈠–Xg%ŸÏÃ÷sFµ÷EìŸ[¼lî‹Ø˜Ë±j¹/b±ç³”¾ˆ'tü‘æÿvQ¿a¡Œfc;ø"öoká‹Ø8¯ë%ŒXÌZ’#öï+
+y†•ó¬ÿÿà‹TJIJ¤²E^ •-H%‹$H%‹¼H*[$I*[$I*[äERÙ"‰ÓÐE’¦ÒE^4•.’4•.’4•.ò¢©t‘¤©tp*[ä…SÙ"‰SÙ"‰SÙ"/œÊIœÊ§Ø"§(#àgžâŒTžâŒÀSwF€)ÎH)Ê0E¦(#¦(#ÀTÊ,E©,E¥RF@)ÎHE)Î(Å¥8#¥( TÒ$•4RAŠ4Hs)ÚH)Ú E¤h#¤X#€kÊ©Å£X#pk¤‚k¢$H¥¼@Ú•5’•5òâhX#‰QY#‰QY#/ŒÊIŒÊIŒ†5ò¢¨´‘¤¨´‘¤¨´‘ŠbÆ!À8¤1g¤2gDŒ e¡ŒTÂÉp8#
+7Ìà†9ß0G
+ßGàâ|C©|;פ€ó qÀI©|Coˆ#
+Úµôƒç.'çd‘$èÂ"yqN*Ir®'ÃbÁz¹$•s¸$p—Ðá’С’
+:é$pΡ“Îa“À9l8‡MRI‡Méd“$èd“¼@'›$Aqt’褓
+êJ@B ¨C(©¨C(u% ¡¤¢¡Ô!”€:Œ’Š:%£ÒÉ(© Ct(%€¥¤‚¥Ðå>:¤’J:¤P‡TêJ
+êpJ@N ¨Ã)©¨Ã)u8%°§¤²§ÖI*uH%uH%BœH‡SRI‡SépJ NI%œ@‡SèpJ*èJ
+éK b‰H‡WRY‡W"Ö¡•À:´’
+;¼`‡WìðJ*ìä•
+ÿ,»J–ˆe2¼zVOËÄ:ÉÛù¶L†×öêi™ŒŸ
+R,@ºö Å2© Å2¤X&€ˤ€4-4-ˤp4-“àhJ&âhJ&¤)™¤)™
+RI&pËŽb™TŽÊ2£X&`ˤbËDE2£’L¶—d’ E2¢H&Mˤ0.51.51.=“¸ôLÄ8‰&"\Š&…pˆ&¢ €C4IÀa™
+8,
+áR2áR2áR2)„KÉDˆKËDˆKˤ .-1.-1.-“¸´L‚qH&B\J&…q)™ˆq)™ˆq)™|0.-“¸ÔLĸÔLĸôL
+ãÒ3ãR4åR4)”KÑD˜C4sˆ&‰9,0‡eæ°L*ç°Là– œÃ2©œÃ2sX&pͤ‚ÍD Ã2tX&uH&°ÉÖ!™TÖI2uH& ɤ¢ÉÔ!™€:I&•tX&ËÒa™TÒa™@:,H‡eRQ‡eê°L@–Ie,P‡eê°L*ê0D@– ¨Ã2©¨Ã2uk:,“Š:,P‡eê°L
+êÒ2ëÒ2ëÒ2)¬KË$X—’‰X—’Ia]J&b]J&b]J&…u)™ˆuX&B]Z&ui™ui™ui™Ô¥e¨KÉD¬KÉd{Éf!™ˆu)™ˆu)™|°.-“ºÔLĺÔLĺôL
+ëÒ3ëR4ëR4)¬KÑD¬C4uˆ&É:,X‡eë°L*ë°L`– ¬Ã2©¬Ã2uX&°ͤ²ÍD¬Ã2uX&…uH&°N’ ¨C2©¨C2uH&É:I&/ÖI2IÖ…d’¨“dòb,“dݕź°L^¨“e’¨“e’¨“eòB,“D,“D,“êd™$ëd™$ëd™¼X'C$Y'Ë$Y'ËäÅ:Y&ɺ܇X'ËäÅ:Y&É:Y&ɺ–]–d– ¬Ã2ua™TÒa™ˆtH&"]J&…t)™ˆt)™ˆt)™Ò¥d"Ò¥e"Ô¥eRP—–‰P—–‰P—–IA]Z&º”L„:$“í¥šÝêû ›’‰H—’É'é°L*éÐL ]£· Ã3© Ã3tˆ&€Ѥ‚ÑÐI4IÐI4Y “e’ “e’ “eò,“]X&É9Y&/ÎÉ2IÎÉ2IÎI3yqNš œ“e’œ“eR9'É$9'É$A’É‹s’L’s†çL*çLà’  C2© Ã2tX&€ˤ’ËÒa™@:,“J:,H‡eé°L*é°L – ¤Ã2©¤ÃtX&ˤ’ËÒ­}éd™TÐÉ2sX&pˤp.-q.-q.-“Bº´L‚tH&€ɤ‚ÉÐ!™
+:$@‡eè°L*è°L
+;,`‡eì°L*ì°L€– °C3©°C3ì°L€–I’ °C2vH&vH&ÀN’ °C2©°C2vH& ;I&/ØÉ2IØmpY°“eò‚,“¤,“¤ÝÆ”E¡,“¤,“¤,“íd™$íd™$íd™¼h'C$i'Ë$i'ËäE;Y&I»Ü‡h–É v²Lva™$ëZöX’uX&°ËÖa™TÖa™ëR2ëR2)¬C2êR2êR2)¨KÉD¨KËD¨Kˤ .-¡.-¡.-“‚º´Lu)™u)™Ô!™ˆt)™ˆt)™|nY&uK3ë–f"Ø-ϤÐny&ÂÝMÄ»%šà-ÑDÄKÑä¥h’ÌKËê¥eöÒ2©ÜÃ2{i™
+'Ï1Œ;tG%!«ÃÛ¸{âSh=,
+—Ož-võüg²Oìj ïÅt-ÞoÏî«È‰­ü(Šœ<ß„­ß«ÈÉóý ˆÛ Vm¦¯ñô¤--µ,ròó©ú%QãÄÆ2f[ŒºB&I”1 B“Ÿí“°í°AÍöC>é–3·­'ÝFç÷ud—¿_G¦”}bßUï½È>±æÙRŒ‰õø,åºR?±Ê`6"ýd÷–Nƒ>ö¡Ÿì. ©Ÿì¦ÿ´w“=J²aŸØÜŠ¹}bãüû™/Û'»¥©¥mb¿Ù</ û¤»™/CÔs´¿vÍBœh5¡ŸX.¸=_
+¢€`
+¢€`
+¢TSSS¥0˜‚(0XªÊb°\•7ƒe«,KWI㫼Œ°²¥ª’ÆU©ÆUI»¬’ÆVy]% Œ¯’FX)ÆWIKXI
+ê²HŠP—ER„º,’RP—N„º,’¬Ë)vY#E°[»Øe”;ìÁyØ!¯TØÉ^uØ+°{¥Â{Ø¡¯
+;ô`‡¾ìÐW*ìÐWD;ìh‡½Ri‡½î°WÀöJÅö
+¸“¾íÐW*îÐWÀú
+¸C_ùÄúJÅú
+¸C_wè+wè+Âö
+ÀÃ^©ÀÃ^xØ+{¥â¹°r¯v–I)ÈË2)B^–Iò²LJA^–Iò²LŠ—uRó²LŠ˜‡À’ÐÃ`yQ‡%±‡Ä’ØÃbyaOË–KRƒ¥Rƒ%©‡Â’Ô“Ãò‚KB‹%¡‡ÆR ‡Å’ÐCcIèá±¼¨‡È’ÔËz)¢^ÖK)Ø£^Š¨—õRD½¬—R¨—µND½¬—ÔËr)…zY.EÔ[»êe¹”B=DQêá±Tê!²€=D°‡ÈR±‡Èö0YÀ&KÅ& ØÃd{˜,{˜,žD¨‡ÈR©‡ÈõY "K¥" ÔÃd{˜,{˜,`“ìa²|b“¥b“ìa²€=L–Š=La‘ì!²Tì!²€=D°‡ÈR±‡ËöÜ]ñ –À^VL)ØËŠ)Â^VLö²bJÁ^VLö²bŠ°—%Sö²bŠ°‡Ë’ØCfya%±'Ÿ%©‡Ðò¢FË–.Ëžd–ö6Úd`/l–E=é,oìÉgYØÛÑÂ^-•zZõd´,êIiySONË¢¥S ¥S*õ(ö(ö(R±GÙ°GéaÊ){TN{¹ aÊ){rZÀž”–Ä^£KS°'§%±'§%±çNË zrZz’Z€RK…R ÐCjzH-zH-‚N ÔÃi©ÔÃiz8-P§¥R§ê!µ@=I-zH-@©è!µ|=I-/èIjIè…Ô’Ì“Ôòbž¤˜'§%™'§åÅ<9-É<9-É<9-/æIkIæÙ,÷ƒÄ<Š§TæQ<æ©x
+È£xJEÅS@ÅS@ÕS
+ò(žò¤µ,äÉky#OfËBžÔ–żp[Þȓܲ¥Ö’ÈÃk©ÈÃkIä!¶$ó0[^ÌCmIæá¶$ó[
+ôp[zÈ- =ì–ôÐ[zYEEÐË**zYEEÐË**‚^VQ)ÐË
+(‚^VQ èe•½,¢"è­]ô(¢R˜'½EÈÃnyØ-yè- ½ä¡·Tè¡·
+ﲤŠ€—%U¼,©R€—%U¼,©"àeM•¼,©"à!»$ð°]^ÀÃwIà!¼$ð0^^ÀCyÙ]’wØ.•wØ. <t—¾Ë x/ <Œ—ÊKžŒ—äÊKòçåÅ;¤—ä]ÖVﲶJá]ÖV𲶊€—µU
+ñ².ÊZA?<Ž ^–V)ÄËÒ*"ÞÚE/K«â!½ô,Ǥٸ ÎK%Ò ÄCzxH/•xH/ëâa½Tâa½@<¬‡õR‘‡õ"ä!½À<¤—Ê<¤˜‡ôó^*ó^€Ö ÐÃz©ÐÃzzX/@ëåzX/zX/@ëèa½Tìa½{H/`é¥réî!½À=¤—Ê=y/pÏR™#[!¸—ÕU
+÷²ºŠ¸—ÕUĽ¬®R¸—ÕUĽ¬®"îey•Å½¬®"îá½$÷_^ÜC}Iîá¾$÷_^ÜÃ~Ùð^’{ˆ/•{ˆ/É=Ì—Å=©/oîÉ}YÜÛÒâžì—Ê=É/ |²_ø¶œë(à“ÿ²ÀG™ÀG™•
+>ʬ
+³ÎŠ¸ê¬«ÎJa 0!¢ ‚«ÎŠ(˜…VWa0 ˜ä`*0/"Á¬ ,˜Õ
+âÁä(Ÿ<˜×(ŸD˜å““£|a^£|a²¿+&[2a^­?™0Ùú“ “­?™0•ƒ˜0â`Š0€0E˜JÂa@¡‹01•,L¦Âðy´„‹C´`* Ó‚…iÁ
+vì1ˆw¶0Ùž¿ã·õ9ÖiRÔóï§A›‹Þ[v˜ÿéCëäožMáÎó O.™ÿÀE™Ã/™aØIÙs¢köü·Yy\3olÖf9òšÙĉqͺ%lïçëšukxXÖ‰®Y·7ú9®Y·¶ÌsÇê5ë6{l×Q×ÌÆ-E–kf3&—Ý«rÍl,ÝÆß¹f67c‹Äê’Ùþ>çë’õ›rͺ Ž3¯Y·‘Ì>êE{þr·¤ž³®´.še
+ök¼.š=±f—y*±ÕN܃¯§½;±4¥%^šq·9KË[ŸÞ}ø±ÏhâþìÓ,vœc4GàtCËFecÅ~ŸÇ±YŸyæªþžvÿ\ï
+S‰j{hQ—\>ÓuN½ýÏ6Ï é«±Ù¡\~ú~ðÞ¤2´+ªÌg–:Ù/ëFÚŸ>\úhÝúg=’'ž70 +ƒÎ!qbS5 3)§çØQp·ÛrµqsѾÄ}ê‹ö\ö‡ ‹ævWÊE³Œ{G¹h»ûË-/šåXìÇ|]´]hä¢í¦)ŧ_4›Š÷ìàrÑ,wáˆÙ<?”=tH.Únïãq¿.š=D– ÎEÛïHLä¢í—žrÑ<Á†uÑžS=*ûEó
+÷ÁEsÎ>G¿µ™ÍF¿gÌJûíõoÿû¢ù3;ã‚ØÈžet;fåÿ´_¹{‹u«›DÎËF$¯XĨSžÈfµ¸¢M‚_6I YݦoY6³¯ˆúü`\ü䲬ƒçÝõ‚ Þö°bÏ^­/c›9¤”ûð>G2¬¢Áu1ôV­Gìÿ¾Æ¹]«õ1OÿÛ6ÕpÃU]o}ø$ùƒ‡cú.…uKjÑ
+K‰Æ’¢>Îtæeó’_—ÍZHÖbç²y É>ͺlŸîl!=áºyÉ—Š‹ëæM¤Ù^×­«¹Éuó6’eEêºYi¼®Ú¿ýí~Øiÿþ÷ÿæ?üþzz|÷tú~ú)ÂÞ=«ÿá‡óÙñ_þô?þýúßÙÏ¿ø‹ßÿþ¯~ý›¿þ±ÿ˶ÿäùÿîøûçÿ¾úcßïy_짣?M/ÏU:vKÔ·Qé_ŸpsµÙží ýÛ^¶¯;ùpîä÷~xÿã>Æ•ˆ¯ûiúøÿ°Ñ_,cŸgx¨ûÝ}€ìyNïæ7W^žÞÙ7GcíŽ=Œ×ÑX8–LߟÆÌf¹Æß9%ÛÉ×þÖþƒÑÑR”|{tø•°©Áî6d­`·´_ž
+¹!3ý¢?7G^ª§Gavz³tDІ½bvß=ª_òp/o#ú0+…Ãϱ‡m“NëDZíÏ eAŽÜµçnCu_´˜Ú¡?æMh?2Ûúî|‰Cöú¶^þܯ„·Î²Õf"èuc|Úu
+êYpÓµ´ðÜth^†W{Õ•Ô¶ß=Úì–£©]ØH^ÚWyX+ÒïÒl>á+îó4|Ý;›^~}æ«âû^ãÏ)šè¶ñ1ßë°™²ãÌ?×á4/UGpYB•÷Ȇñàƒá¡ë°;t¶–¬‚Vc8‚síàµöjƒ¤¿hÇà{O÷§§ "î EÄ„?ß¹(þl*vç- H{ÌËâ ÚÄï»»¤qUì½·Xö«Ì4yv àµåï£éáãº9,ëh+¸ñ=á“`ž§çDÅ#þ
+<MÇ¡˜O!<.÷‹JEØ´Á¯
+ß'÷ÐV=ô]\nšÇ Øú6³å%u± –…ýWº±Ï‹ôUáëæýk·û=³w
+^{>nÖfe¿Q#0¯í?±×±ö:fËDqC¿¸¶JžŸ-²;Ä[ç[^jiXøä#sÄwÖzI¾,„ží“^[kð|»ó÷ *ãÞÍÊçлï¾×³×›ámãAØomëÉ麆AÃÛóQhÛÜ3;Ø/¸gÒ|ÕÍä™o­my”}î_žü­§´NÌ5Óx<¶c׶ž•÷"莽}1:vÐö#Ã: Þ·‚×\ÁxCFxxyoÛÁÛö|8Úv|Á LÆ’1ö$^·ºÌ>kÍSÛ]ÀŒNp¼ùÖ‚8¹ŠÃ¾œjDyîÏzɶqr}ç-?vbgÜñ§±Ô¯£l?ï¥8g°Ï–‹÷ÎRpƒ¼¾VíxOÓûE¿÷ÑRíˆëb_E…Ds#” MÜ—½€kò§Ì7‰àÓóÓµö§[Áã"hOaì`{^¯¦Ë•-ý·’ãÚÜÆÔýïsìùkŸbã‹èk+vÿ~ßîá¹ù±áPÒ£mã^Û¥MoÎHñíº¶ónküÜ“ /Â3þ¼Áeh{×·ÀÚ­ñ˜lz¬¯Ó&óY‹÷êù˜<M!]’§QA“ß6kz±®=ä‹#Øâ+gãù£qúMpëS€8åéó/˜?Ô±{ž÷Ó<Ì.—Ý@ÿD>_³ÉáûÞãs:cJ5þþWàœÑŒŸ«rÚ:ëíÙuYΑ£ ù§‚ô¹ós]ªu™nüøò5sµ¥½› +ØôŽ×Ì‚ÛÎ!]|Ÿl ¢l“ñöž–KÄ!m=Žàðµu'J+é°•79Uÿî~U+Å׉Yo@ÝÌP3%>œà,Ž ŸžQQ8¾ç¤©gË+˜}vÅïmiäŠüˆù2²zƒ¼²#<¢[¿·æ'æ¶ëO}7¨Þ§.÷¶ç¢D¯Ÿìˆ¯¹-rž“‡-pc3ig™{±ƒ3]ºå—šÇ™MØgëlÿÒ9bk³@œwrHÇp–gÆSæâÏõJ»è¶´Aöegt¬l+Usé<a_àX‡÷ËíPF/|¹çh)ølíß±‚_Ùi9—ñ×öl1¯ï†É¾9R¢¦¥é™9¨5(ñ°ÞÆÕd¶&¾âûIïàÌw!ï®OaÍ|o¢½¿†IÛ×T°1<é9äüœ¯ùË*Øî^. ‚ìnÖqˆÞÍ¿•ÝiàÑzòéç •Ï·û«ß­ÞV¯ÍSÎ~ò>×£¸(ò°§>D‹¨ënãʼeæq î©®Ü^ |L:“ã ¾œZÄ|-«nq±<šîø5ó°Zé úü°¶K3ªµê#Ý}!yëMŠÓÝ®ÒCôž¹ïw³UÉr\óÒÙ>Ñ=ÇV/[µÕ‚>_›…tM,®Ëììö´¶3}´ÁlÃfÃ:]âïífWŒfiŒâ=-X(~Ï–…wzhÞgˆ½¶˜hŽpP}Óâq\£\?·!¸/úùÓø¾8Ùh«Xðܹ w´‰6[ö“!´Ëš±ƒ-’$ôxÅÌœÑ>Œmc
+îyãiþΨöߪK²µ ´YÓëWÂùéó~‚‚2ûÚd?ý“]¾—ݲÓ=;jfs
+búëáåw?Ä©zÖî°¶¢/èÅÇ懵ÝljÃò.þð–âŒËgWÕ~äWê´iëïÖ²~>8lÚRÏ«%WÚ<žŸ€+G :ËÆo\¬/ú½•©Šëâ.Vœëv3~ï™iþ´Í-úN“çí߬gf³I~±xÚžcñªSæ‚}v#.—µÙí.údð>o=™ÞuFøšßžêü¨yVþk·V€äêùേ½¡Â¶Öf±)oŒ×ýŒqtœÚYpDò–óÑÒoãØ}ñ'ßPZ[œ§§,ùyúºœv¡4åA³³àŒnÂð‰h»»~õ|¦yø¶6vbCq¥MJõ3ð×Ò‚=Ƈ%øòÔ_„<+œfáÝ…É¿{eŒ°ÿGy`í†zMÊæ¯ÔŸµçבÂìŸ5?ú'hÍÆq賦Våö|jÝý³uâ)±OÕfce6Jïâð–ávm‘¤ï­{‚÷}¿?&†ÄÆ«ñ ÷Ù‘'h£¦¼Jž³gM«†vòÚ7í µ3Ì÷çÓµÔh´§¸MeDûðŒwiŒXç)¾vOÓÇDó8³£ÇçúŽ4¾W_÷/ˆ°^›iêr|†wƒã¤|xæwjpû²~Mõ“P!/ÿ´û_ˆKÓmôkÀµW´¹Z¹Ýué†u;g‹OÝ°ñŽSÏ£‰çÂïãþú˜‘ª÷Ä×¥ž¸fŽ_›¿è—îo\1ó>ŽíˆSðñ¬¿Ô·ÎµV?†vñªŽæïïP†ß ”º“#¤e?\×y÷x}jò»O¨ç5zsÐg¡ŸÝ·‡¼Efß>›gÂ=ª¥Ùåí±jú´ÿ<ýɾšÝ`+ËeK ø嵬ôçã*âÜÞ"Û|Ñf‡ðíéÄÛCѵ˜d{n63Žx][¬hhýÏíy·Ë{Ùwüšú]Ñк¶AÕw`ó/žÍýœùh‘/ça_8î„7}¯¾ÀÜ_ê®yœoëõ'£á£Ë{Y2Äå$ó‰¨+szÂøêF¥Áf% ô<Ú3æÝJÛÖÌN÷ˆøý*úü˜_ÅÓÖ°´™g`YÆ{\Ú£µÔ›&ÚÚm8̈×ay%ßÁœ1fk‰ÄŠÑ„öÛ´Y­x'#¾€~Ç]&v
+A5mçˆqüh-ºv¸‚q
+3²Ê_ÛîS½ù×5¨A_lœ¾cü8‚û<t½"7þÔ}kªã²DWvà™#f"ÊÜラ‚}Îã› »´ì`…}õ¬÷»bb&‚ÏÓ¹—`ì@­¹÷¶þÙÒ•u í?¯·ˆ¨½E–¿§v¸m"ž_ç­í<ÁM>ŽÐ}"Ì ?u¿<}ƒþãÊ–-jæqËþcóa7N÷Yc ÚçzöúV˶yàq•à/š…{ðÚö¹³> dAæpJð.’W¸1„e™ƒÓgѶ+ŸûS:,9¯Yù¹í¥ëuEGO]-ý©/ÚÛ$Öx²Ÿ®¥ƒyPßÏí%ÿŽ5«_[ÞQÄÄc›^Î;Öznïð¡Þmh65ÚºqœGÜB¹€þ佶åïpK9:DfLBj7§& lþWq´^‚'\·½#çÎ÷écÑñ EGÕÿM‰Ç®hrx8²K<³ìñA± -ű‚ìÀ‡?·É¢+$¿C¾dhþ˜4„÷VýÎQfÓb^éë3x[n6?'lÒq½·í›r’ýòÑÔWûõtA?·QˆwX–\(B¯ /à<s+ÜÔ€>41ì“x1ÿáÁ½ùu²%6ŽãÎèùMŽ)„WÐÆ'¶}çWØ«Fp÷Á¼ˆž–HÐZ¼]ÓFé=F²Ÿ‚gôxÐKR¼ƒšMâtW˜V‰¯Väl±!崙m‹ÙM›ÆÏÓ=|„¹í‘+ó~ˆ»Ä€ K±Ÿ|/o8;ír㎘U0·Å¬ëÚöÜ‚Í‘¾ò2 ‰?ÿ
+_z:Ýߊ+Æ#èkª¢ÈÏ[¤kØ<ìqñ§¼)àÁý¾¿‰ù®ùû ûXÒçNýÉÒŸŸ<nž#þE;8Ç~êÑÌ3 ”µ;:HïàˆÙë<}…g´$#èstþñ•7„yKßzÉ_€ë±×Þ¶/Šày2ÝzVÑG2N훂tfº¤¼·lx]á[¿_ß+²àâpb*©yMÇ'ÁH|…궧™ƒb…¯;AO,]A>ú>¶õÞ¶wR±2ØæÏZÚó3ìsü
+žq—Æb` ní.GprGoŽ ¾CÊÒŠ˜/u›1~~î‘)U·<"Çv &lͶ¡ÇÄ3ÅQ*™'-ûQi8ÎZHžXè ŸÎmkõDxÇ÷剰þÉyé~xžæO‘œrºDŽÞŸ"f?ÞÙÇéA^È2¶½'ùù´òu“‚O]#zûE£“ÓG™ë–> Á§ãˆ±`Ë»ÚòÑ5ã]A½Š3Éoc/mÓ%ê:¦Tn%}I½Œ?¶Ç+Ñ,!ì¢/ë–“²?V‚œ[,Î×+ÚVÆÖÅ ’ên¬±¯f9Äýc˜Èšj›€3L4â¶lGH±q
+r]cäúc[=mÖb·‘ÞÏà•¤W˜Nºíu÷˺ Çö%ð`6»Êx˜¦¡­Ø¥ÓÚ”lðt$°ƒ×sO†F®Ù»øC´)Ÿöã¿Ö…ŒYW{îì¾ÿJtWìÒjä9ž“Ûû¼Ü­ym<Yÿ½íµÊã»ræ0"ÁÙÞì`…}É‚ñ,Ûz‰wîÕ^ÌàM?xpM. àÉ“ÓSç‰0ž†ÛþŒ2ë ]á˜)ô Õ *­õ›+ø%¦‡íþ´!¾¶uik˜YAËcÉò#ßr[á2Žv¶+ßh_-ÒeÏ™YóT‹Ã—QÖù,{st¬Rʶ3tÉh %+¬àó)ŒO­0˜wpä ÏíyðȼÓÉ·×®À­±´‚p\ZM½‚>€› ðÐÚ~Z×—kÊ9÷ëâÓå‹K8”}cÑc<£V†uO ÕWáÜz æ
+%|‡'ûSŒ¤ç'Ôç#¸_}” Cñ¾Vã{ÛM3|Ne ˆñ˜-®Ò
+Gp¡šfñ+xŠð{Í8‚§×«¡ƒ~ÇÇÂzTzCät½Vù{Û=ÖbŠ ¯iÉ#1°j5®öÞãžCU¶TJWOÏE½èn0$Xƒ{Tèø û÷"‚ÛÍ°œ—àŒ¿4}B%ƒÀ½ÝçǶæØü1_ ƃŒü(˜7lïŸÛnŒ°ÛƒÞ+hýÓ¾nᦠ‰‘¦£Ý®;ŽUAv@_ðµíÔõöj/Lé4 >)øy
+¯m÷¶iÛ;§#VÌç‰ø} s [¬ˆïDô¶ñgp :7+lÆTóZ!Šå n7b–`>†>ƒö±íè1™à+
+o3LõØ+³À÷ZµÏæNºÛ>¼IzⶓaDs)¯Ê º[çI°tFÂV„ wÖF&.ÐÙÇÖv„íÄ{0¢Íd-1Fã¶hÙù\×ÕfËà ¸åd†ÖÁòp_è1 Ðµ@LL ŽC¾ÑÅCd«˜FãQ¦Ñµ^tñ57o¾ï `õ7붖êÇ Ãë%Øc˜5v°Â{
+–S¨á©nÙîÒ¤½œâ·ÎÇY‚Ùìûù±­5”|>íl˜ÃªÐ­`¶£spe[®ì‘„WÐW‘ý¼ 6ŒÚÉç¹Ç®·‹‘šW°¯±†5ðá‹clz»˜&³Ä|×”š5ätoʶ¶÷ÔÛÅ
+`ùpø‚qq^Gv¯øc–«¡é½ÝW5ž%Èè8¶ù±m§y¸i§ÏàyÜë¶ÂLýØ^g×À‰Ë}÷ps¬¥ÁÅñ¹º_ ŸC­9{,Ø£Ïû
+öl÷]«‡¾fšÊ¶áþÖkšœ¯ïã,É ÛAot›5j¬ u
+öKXýæìÜþÕ_üá‰ËÇGâò¿þg%/[›Ý?Î6;esîÎZšw…¿¾ÃMé_ß;ùðÚÉïÿHëãk†|ׂÝ^&r‰ MäŸøÞ1ëZ9`Žf&{ìd^xYýƒíA_ ê»<žT3Úukk/cé×ó’âéã =ºõ ÕŶѪخ=ò™<èÙ²_|G$°EøìmwÆF¢Q°]¨L>^²ÅêPOø,šÜ®;Úß#&Zý‚™Ór¶yrmŽ¡ åìû_±t‰‡Ÿ£½_Wg3‰ª]^—f"¸«“3b9ÕØ,]„0ž ¦ü¼HúÅz$‚5M—äÎ;oðÙµ­/+¥ ‚ Û@} qm¶ˆ¢²JãC\Á+xÐkúÆl±z¯‡ù¦‰…_f´uÆbâl™×2b ª=äA_#>öû„·KæCñƒ T >,êÁÉ­ëQŒ!_;í 92áÕÜc§gÔöCÝbYà07uƒ†¿wJŸÿ}œ]×Èßû*ðzd¿¿fü~j!Aú"z´qïØÁ%…Çÿ–/±êA_ÎÕ·ÝåêØŠ¶GŒoÍøŒ²ƒÑò´)ŠÙÊA÷Î4O×.n™q¶ºÚwŒšÆã£la_K)Žwlk¿êW6-ÊÁXZÂß1_@÷ ŽÈŠÒ _<IuR)Å ûšb·· *Õ.|Y5^ûÎ[Þ÷Üíõþk±[©Žë¢EpO:³T£iB»?îÖÆ¥C˜7¸zjf,ÿ£;yê|ÍJÊÑZ¼ºÃJŸ“ µ˜
+jÎÂ>²Gý¼Ï+ÍaŽ›wŒI0 kÛv0—shSåé[ð8aÇœg°ÒZ¬`[<5Ãü̶³¦>4›ÌüãÕ‰ù ζ7žƒ€ý°œ±­—«;ðt¹aúˆXðàÕÑtÖ–:Ÿgd‚h9Œç}sa38›w7/Á­Ý&|=>š³qP^©QW€§h\ñ¨Ç^#‚‹“Q6ÃâñS=®ÜÁ9›mãá¶uŽüÚ„/d[údu\×Ô´-[ë™-µsY,E‡“ŠÏ¥…ÎÎÃrgl±{Þë×û$iG“«œë}û†üŽuL±ƒôj´m;ï‹û¿Ó¶w#™I+>™ÓØú‘ìPL£t¶áqð Θ-×nó÷t)_ŸQ¿ žrËæ¶óÎÛdàO¾€VñG š<¶ÒÄMŽÓ®Y&‹Þ;à“O4¨\ÂiKwŽ½ 0v`/“&F-ø´³¹]‘c`Ác{}¿ØsÖu™Ñ‚õ?7OíBcþÇæäÊD¿Ò÷{g‹Õ÷ÛxdùÞÏž­èÕ<²Õ>”{¥œúا¡éÅv"èSCâƒ.í“”qiòõž]^fÜÜëжʳòK ?ÛA§%æ2iìÀ²£ó«¦*öŒ½ÛG_ÛÞyÏNI·{æÑÌÈÜc¿>È©ËxX)om« z6›¾«k{ÄZ‚ëÀ"È:i> «ØóŒòùj4-|ï\™È!±àú´+wÚwºçtÝ›SŽ\„ÏØö$ßßw°ìãÎàuæÖ#î °UX#“jŽElh6c’þhÁ«sË=—ÝzM ÷­Ñtì æý/AîíÑFîàjpâTÛ¬ǽ)è#?ùÒg¾ô¢‚7·Æ†|·ƒÓ-ØÛÅaÅ7e">ÇSp¹ƒã˜º4sMzÚiÎÝœ‚‰ \C>›Rq¶®÷æ&]Ôk&Œà?µç{sË ó¡›ß”ß
+šÔSƒã•·iáãæc£1-ßVݸ™­A 6Þ„Ñh¿O¯è«ð‚î†Î{Õº)&©5¾!žY–[íQSx;A/_A_SVW–Ɖçúñâ]G`àæ QŽïuò†\‡F&-ì5gc¿J·3ù0a]»m¥ÉãI¶Þ#·°“(m&&rÒºÖLŽà~“ KÍ昱¹‡½Æ«±_E)+6ŠVÌóxb·.cßtð÷ÎåÓB#Í“By€nšK–oi7P(ž¬:uôQ
+*‚×ø†›~LÉØ<øÅMcÑ· /lg¯õÙ=ŒÅ0éõûNÎþÐ8£ï 6šF¾7EÏ •D³ðà[æ7É[·ì`t€ì…]¿Þ§2¥*µé¡ã®W!‚[¼1¾%—vTŽõEЋÝƃ} j9LÛ© ö±ƒ#¸£^Í'\ÊõÛö¸©ïÛ°J³ò|„|.]›=Šµ¯»£à}äÙÞcí`Nå°w‰×Û‘ù#"¨7Ž')vpdŸhƲ˜?ùâ#rºúFOË‚G¾qw&ùœ/8^…‰n÷8øcºà¹902v`‹‘ÂïsEpËæïœe‰ó$jÝKý~òI¹”/ù{¾x±è„}ÔV7a›¹ƒýbc(¡Ì”Âs¯ìŽ °éC•/Þ)£3¯¶;íåŽ)¸³¥¯_ÁX1ÑÞ›]›jÈÑîìuƨòÊúJÄïµ½ÎVÏá©|±®‹MK|莖¿×”éê'XЖnçoéýHçÒwzì¹_W}Qæ«Âãœ|=bŠd³FÆΫAÿ;Œ øOb·3rôAÐÃ9KÛÆ[£<£³k0w½62Žëu
+7­V×;c=3ý¬)¨£µüÄ©ÆòD‘ ;Y›“e׶çkw²%ßùëï—ÍÜML#¥{›fœúª+¾*|ìhV>ªÁ>»5RoÁlN¯•(lÙÑ8õq5•ersNåU˜:¶½<s±{Ïötgz£í|®Ê›ggÉIÓmnh§tÑÇÿζ_ çÓÌÜš»‘àS£Ü<7f\âa¿«åɇÁŽá¢SqkUiûS9àèŸdv lguÌ€Ùä÷Š, ?‚|!õ{WIkËÕ‚c£­¦¯×Ò â‹75n9OÜü´éž[îøNÃçäkãa¾3úÝTƺ?¸1ÔÖtáëa´ä‹QßSíu2LÒ¿³uà
+Š*Sž¥&.|¯#A¢<ÛA¹„míÀëë~O²
+¯;×ÙùýÓXá
+¦“§ g¥C­q¡<10»æòl·­ÊUø¼ µWH%¬ÔX'Ê‘GsÈ÷Qsk]‰öþ—Ž´\ÿ,i¦!o|@RÿŸñ7kebÅö-Æ“Ø)ׄ/¸ýù>K«E{ðùó1Ë<¤Nk}_€vËÔ–ç4³£3æ:§žƒ `ûÐ’h¤¹XÖÖ§/ã ß¼HÔö\‹ñ‡¾X¯7À‚ù®djŠ›ªÙ[ä«lºôäœZ.ú°™.ê•£gnëËs"ÐzÍóúå1]úâþõl%615>o†Nž°Ü†k¼v ƹƒm2ä}­ª$ç<s
+ì÷¯!}ðc-µ4C‡a«逊/Ì]ÚTQ
+bæÕÕWÈFô¾Ã„aÀMcä4œ ƒ(­ìŽÚo?XW!îãí¶âÉ1½„5C1.'{XI$6ôuŸZù‘šñ§
+¶å5dD­çË*.–Å‚žæÓ3?Å â 'S[ˆ¡Ñý*Ï6^ÖsDV± ض‹óÊÄ'òըϽ†®öôÐì£~3^¬Å´}¯çZ’™†ÇýL Z}¼“e§ï™~7+ÆzbkN–dó–zLZŽÌ8¹s]›!ÕB—÷ZSø´™LBæÀÙ¬w.îº3ãfKêFWÔ× ]‹ý˜¤µuu»Í±3›S>¹Ž‡ª/ô£<4´ôlžzãqñék2—VÍ J¸s5Æ]…žcù8°îI]á]EK,Ý q
+x5wÌ[~U˜Å#ïXŽàÐ~éô3ìÌ9'Ë™P£îŽVÐOž´±Þ›\Å´¥¤v¯ Ž'ÚsUó\‰{c×V²Õh¼u'$ÁÞ‘¯J*‹¿™±[Í(x·˜ z§Q±º¯ÆÅX5ûÎ)BšPz¼NêBÒ1¸# "v0²orÇ
+N?½Þ;ØŽ|ºàœÃ…§Þçss¯Æî¢g½Å®”Ò¯¤½­
+›žŽ¶–Ƹ×R²–w™7öA빦ÙMçÎW˜ã=ÈVC[’ȹ_>d^_™
+Å’îO.SÂÌ[xfú›í÷d¿ïÙÎt˜îÈóŒàµóÁÏ_ìj-Œ­üü“Uåü1Öœ™¿v—ò$Û‘Âé½\[Ј‰ójÖQå·jÛÊk¤„ˆ|Û"Ìq
+¼Íòe%óFÁy2²ÝM%î# ™gWáŸüE¿§ÖÅ™fš× á£ÎWÀrÆ¥7¾¦?;¸.¶ÍÂÒgfI_±ô¬ëÚëÈã;̬‡²íüYqŸ±UÇÉ^€°£Êy_r«¼"P¤`R_lfò8·º¦Ø cÁ9󻱑5¾|´µ¬¦%¾gîÆΩûi*ì$Xk;‚¾ƒ}«rÊÚV+'ø—RcœYBýUôa+ȾV!#¿ªúZ†÷ÞJŒŸk¬li4Ðz)óæܳºÐ
+N4\¶ò»}T*K^½ ²ä¿×¶,9°jèÙPèÎxÀª¡gIË“aÔÐóµ¡IѤ†ž-þÛîúDØ8}T’ʪŠ¶ 8YHÇÙiùü~’ø>#Árwe)û‹t4³W9έEÃ{ð9jµ Uìç]Qô^-5a·Šý” òùá3Ì‚³>I3vPfÁ&~˜Ù«$ë”mm%@&ò2uik9°W8àÎ ü; j¿‚ûª”ºÂ×*ü|gvÈ+ÈHÀUVb·É­1ïm¯(C}ËXeñ\U³Jx€¤ãΕñrUž(W›KìÔÓ¶.Æ ƒm™avÑ#ÿ]+FäXó‰–Åæ#[Y¿Z±¼æZžmmyEžæ{—¶8ÑTpiõ«˜g;£;ö“fè²råX–.«`À©JôÛž•Aö,u0j˜‚C«š¦­õl‰ÑÔmû¨Á_˜kÒ`Ûý"5ÍV#>ÛGìUÅh…K£Á‚øµ2ÑÌl˜ZÅÈSö(G̶–€¥Ò-«ŠQ Ö*F%¼×Ô´½7-²œ HûBt5§`|¢˜oÙvÓ¨VÏU',‘Tƒx¯ÎGÊÁ{dòý¤©Ä®E˳†è ±O›p@ë¶6¥ÅbèØ.+f«ápWt‹Vÿûd·,€iý¥h þ’=Ç DÙÖ*ŽºZý%xÖªÖ+<²=e™ˆ')–Y†i”fù"ŸTÓªÛÚúø 9x“á3èÍ‹ØA g9®ó³ŠÒgÐ;Ay&óÓ§8dîc×ZÞ+˜ßTù½eÛ¦4k‚ýªUJšF¡F)H"S˜Ô½©5LXÚöýc[[Æ/žªU§h·EŒh#¯šFöíW‹¢l{F
+uÖµS$€ŠÞ{ù€š† eüzTÙˆ Ëß´ÈmŠ D$/ ßεƒÒì¾|r<ÙJðñåé•:žŸZ›C±Ã¢wM5­"Ë<¿®a½ò!!øõƒDã;V ±©•½­tT•õ—“ÊNOkõˆ µ%^Áçå_„#<j¶¥-Ö6V”hø;Kð 9iÙ§ºíi­ª®KCÞÎ
+^?¯’Y+zÄTV¼²[ŒîÚºVªîáU‘.Üj…áKžÝd®FŠ¾r
+·\BÆ×rð®Ê¶±ü}Ô0:®ÌÁÊ+®TÙvû™²…ûÌâË„þoöÞu¹ŽÛZ}½ÿ¸*©ZT
+Wq‰™K§ª2¡f»XN%ÇbР $ä¯ÁŽØ)+‘nB|¸f„2t² Ÿ¤o¦ ž-¡°ˆñD(¼íª¯;m£KJ,È$ æÎâ”ÓÌ
+(¬°hÍ!jU=
+\”ªñ’©)žJ„ELË:,ÚJ"5 3X …é¢@ERbÇÕF ž/B™Ôj :œUáô–M6 ^Å("W§¯k´ì€Ýo
+ý¨D|œ"&y[­¨ÎDXÓ™*­'k~-ý¾fSq•¯†±H„ûÆÿX€…emˆÉ8£Èõ]ò2*aJ1wæ¬Sx´Ú‡cÁ~ —àK%«ž£‡G«C?Õ¬¤øŒHÊòù“%Y‚EL@`œ7ï’㨯0!žë¤cÞÓàÎêò^³yáfä¨ÞCçÌåÁ[ˆ
+kè êQsæÊ¢¨çÀ°=#rÒ=:2]Ê@ƒ€í•hp!ÐPÙÌêÂÂJÀkɹÔÕ€O?[ÐVE•É¶Òèˆg‹Ý¦…‚°$瑶lQŽk¤©ƒ¤I<t#âÓÊ7k ›0ØL'‹°¬ãQ­˜T²3Yc9ô}DP¡ªš³õŒx®WvÛŠ›uÑ«”tà @ðuˆ·!2òhKÀ;•£íƒhÀ'Dé “!rX´¥¤v–Ö`Œ¥² FÞ4RIIRƒÅgÀh.x'ÊÛUYï¬m•8?éUEB‡Lo´­¼8ÕÚg§º(
+q(æ
+¯+«ñ&2VóíRˆ”pñ!Jü!ŸaõÞ͈œ÷ˆ:Ùi¡ÙÉe+‡@ÎcÝJ”¨Æs‹¶tY]YñšIÕ×Aäû^ñ7¬6]û'Q=Ä(ïÔäš·Õœ6"jµ5ŽqË*XÁà4‘•FŠÈqªÌ
+¤1Ïd­ ­”õ‚ø܈Ý0TóÉÔh†á8ìk»Ÿ8îÖŒü«8VÌËô) ²³* ‰ÊbÁZªˆ“u%o–1G X$µ!äå×b‹eñ‹¶e8*ãÒìsâ Q~Jæ],ÄäE0é—ŽpE&#"¦ÝD‹ †rèýç‡`Fäâê°™v2?TáÐŽlT·Áä§
+:à+ìÄNâü£BK‹ïÄ:ñgÍÈȵŠš T 
+^Ô¸m#b­¥lñ¬í ßM+ÕÜ$kM>m˜+ÛæÅTMŽ68ÛÅЬF„µQn¸E[WF¿Ó+ˆeºÛÉÙ"
+
+ê p(Êœ¨Å¨ÐÈ£Õ눚!y4Z¯=jôk'b9뀴Wk[-7ºWö«ÀÂÚrÎàÈi¨ˆ­ìߘQ롘+5rªAÝi£‚§HÓ":<Å»&m§D+S9%ö0Ê)Õkö§ÝŠ’ÈílGéP•ˆ%ÈÙ
+Ç -§: *‚âÕNˆŸS¥äIEK04NÇ1(oiK#¢òb´æYË8©žV‘);%rÜ/Þy²T֩׊ãB‹ÓíÊYM¸©‘³N‰j_"*uŸØ”Xc˜ìb#£²<Ýê£dé¤^Y0’™çWý´í0>o”‰s¢›tÐÉd0„›‹“$4F†o•öäp8¿jgm5ó£<­mNÔòËØ…Jö£ 2"-¶ËÞ\O:°àò¢m
+-­ÊÞ’ë×…‰.RQ¢ _S~¢ÌF¾P1©ézÈ%1N㢂l¸`‰3¢ï{eJ¶H}2âê¾5µiJœ¨a0§#¤' ™™&A`ëDœë&m½˜F„¨iÑ3"—nCŒðBÍ4xöfD.FmPrŸ@wtG“†#‡±ç ï+FÏ´­C\ c`YX”;l_Ó½'mÍ À±¥î]„ssB¦ü…
+ã¦Èrçˆ$
+A4Ž#Xéó¶¥ ¼Á6³<H ·yö%‘{c¹°<ZÙ°·N§01_LÚV^}( b˜$HMȾÿöÀ s¡zxE@
+®Ëì”ö’QûÎÚÂB̹ c^“Ôö[“9 À{+ó*!W$Ö°Cãºñx¿“Q/ˆ’CÅQAÎ,¬ŽFœ›§mc/!™,0uFdÌ_tÐÉ@Êšôš¬
+ƒõƒ »NGI±ñâ:;UwYRÍk@q—N$®ÇÆŒ °3ÊåˆyŠÁAËÔˆ´ÀÆ´- ‰#iéóâ¸ôù¹;#‡4!ÿ(1L‰Ýé÷µÝKÜ;¬AEÙÎ+¢¬útT¥š¯Ö zä²­Z;¦ß`Jœ|¯Nž|Û8I²]Ðí³Óu·ÉîJV7v¶A\ìYûö6)hr Ü
+Ö £
+#©`éM?˜ ¡œVò¢­IýÑvFìbðŒ<L+`gíÂõ짺 î Þ{"´ONmï;q¦
+LÈ]m ¸Uv»‚Aù§ÑŒ5¦ŒP¶ªEOÛFuõK1É“œpo0SÐ’ãÓ¶]uŠX%D=rŽÓ^G[Dä§ ¨§;a}n@¹¾)Qµ?tÐÉÐ;‹šè”œá>Œ¢$Ùž“¶ÎÄš‰V;!N5à ¹kË!*U¦ÀβYA´xر¬- 9Éa𘂷t ØkÁP!«)Æ;ì.§•E•oe¤C0‡™yÛ¼­f§™ûKbŸÂŒ<*]gNK(—TýW‰`¨\Ó`ÖÖ)ÀÝAÄàã„h‹(¼oÞ+;fIdadù¢@7±œÆÄž5#2˜ :èdýd
+¯eqÀœ)š³ÃH¨úm&m³%„tÕ„8êt0%#YÆe)±2³3ΈÝ&9#Ã~Iö“\»ñSH.Ÿ‰=”\¥Îe¤‰e fW墖ܑקd¤¸Ðf
+K1ÙÚt³NÍÉd+°·XÛΨ”›\˜'Dé
+sÛ`1µÝOÛR¢ æeêN R“ß<S*Àt=°`ï¯J–TšQÕ«8I´¦m Õr'm'§‚*•¸ šgéë™ÝT8^î#ÎÓMŒü£Ä0%v ï°¯í~â8!.Mϳe+SÐÓM¨ÀÉ
+åèJ“×+nŸÞ’
+v$D@:Ÿ‡Ièö„ìM‚2OÚ–EnÐ8©ü:%¢àdpQî°fl2D;O5þdB›iBîÃ'|»8,V$ Êp¶"Á’õ{K ùš.ò )ËÒ&¢ü ÛLª˜ÌvªBTt¦QŽzà^.ÈýpzòócÌÅžó”À®A_ó¶¨ÛÕÉœhLgFƒšõ
+VÆ ·_:ÛcÔÜ´`‘=;mÂL'Ä)ã=•…´-ÂG‹¤"¨g ÌP¢t0¢²ã¤m°ÂUd‚öZN§µX¼|Ý)#ÝÁ‡I¶aÖ0Áa"-‡iM:¨@¹n¾<Q9ž1»=¬ÁÄaŸéz¦™ôG):[§îì QÃí± wˆ;†=/êb¶Ê5Þ°ª”ˆ’-ÚÚR‰>«5,IÄiLÀ„<áò¤Ò# ÷7ô„ÙÝá úuÚÖÈäFÚ=Lçï*³‘ˆøåŸn®ÿr{y}wyýÍ驹úÆôÁ“?½¢'ÞÉ£/þó¿¿¼jÝ<ùýyòïO~ó?>ÿÓÍ‹‹ö篾fâ¯O~óÅ]ë㛓_}ÿòêº=;¥ÿ¡B¿>ù·'ûŸþëìê ?ö'¿ùë»ùû^ñ³ß|v{{öÃòG/þöæö«7W×ç?ÃOÚŸŸ{yõâö⚟ÿöòüîòæúìv9>éá7¿¾<o”Þ¯î¦ù‘lÄáÑF<iÔöÊíåWoî.^S³öÀzœÌêöâõ›«»ÌkS3Âèçsº~óòÏçwgÿ¢f÷šWØÔ¤¦ÃŸOìõÝåÝù·»¼º÷Ì®o¾àw65ÁÙ4æ3üêìõÅïo/þûM;<?ÜsŽ”$¹©ù-&ño?Öøß<ðÙÍËW7¯/ï6É/¯ïùI¾¸ys{~ñ‡Û³Wß^žoêÛ\^/·Üåõ;ŽÿvÙ}>››W·gw7·÷œÒ»¾èÏ<¡>úwšoÝo/.¿ùö¾÷œwî“M­ F¿Ø¹/ÞÁ$~õÙ|ùÙÕ«oϾô›š üßöHœm„w÷½Ùn¾ú¿çwŸß¼¹~Ñ}~óý¦f8›Ï|ªïh¿Ö¶µ¿_ÎãÞ×ó¶æñÃrß]¾¸{‡|´]Æ ƒÿQnù›ß^|}òéQÛû©´½¯oÏš¸~õ§›Ë×G}ï½Ð÷â¦&uÔ÷ªïmKš9ª{Guï¨îÕ½ ©{ÛºàŽêÞû§&Õ½-2†÷XÝûÃٛׯ/Ï®?¿zósüøƒoŒ×w/~{ñ¯Ë3zú^ªó  õ}%_h;3Û¯õ=P:å‹qSÓÙôÊŸ¿þúõÅÝÏ‹ûÞÛ:2/vn‡÷½®76‘ëúA'þ†7Öçعß{ðÿâÕÅù›«³Û礴Ñÿì—ö_n.¯ïž«*µ9®ó?÷ܧ`{6µþg­špš¶6•ÕšÂ©ßÜgy·ùn…\ùÃÕ}= WzÎOÏo®nnÿý»oÅ0¸õÑÉ,¬Ôon¿>;¿øâüìÞÝV¼Î|‹É) ~vsýúîìúÞ&¥mMpgû'ù»ï_Ý\_Ü’Û:¼»³8@$¢Îþüæ­òÐÏ+mÚ[ò±o¯-Né÷ÏvÍ«è=bÿÞKA†=_ç¾c€Ýî¿­‰ø‰¼Ãb³Õ‰Ä‰Ü—mlkíp­]˜W—w9»|—hú~ݘfØÄ6å€Cï̳ÛË»o_^ÜmìC­¼;ÿxqûÍÏqoîùUú×-ÞØ÷>µ5–?X™ú0¾Æ&ï…{|‹Cã'‰Š }8 &êó‹]\}ñíÙ‹›ï6Ÿso?@ØØ÷YïØÚL ÚÚ¹yC†þxsûêÛ›«›o~Øäõâ¾¢ã¦öÃ.˹={qùæ¾q˜þ鶒å1øTËm}Ÿ:Øé
+dà C®Ü÷VßÖÓ¡ÏçsöâÅåÝå¿î+FÞ^°qfSóêS˜Oíüìêü7/î;µ«Ë닳mE€÷,>Úùù›—oÞípž˜s¯7öÍ&3XÌ Mÿă¿_‚ʽ+}ýÜÓœOæ±+QÜ_[ÚÖ±ÇùðZmÛº+¯VÛ¶>Õ¡
+ѶԻ¨@Û½Ïþù¶Ê!Á0uS390fcßå s †ùIõÂC¬½çs$ ³±Ù<R0ÌÆjG£a>4ÌÅU÷ÒÆnÙ:æ|cÞ‘ƒÂa¶%‹ÃaŽá0=f*›dàëÂa6&÷Ãa6õ9S6fg{äpÿ±„Ãlì;Ê»·um=æ'”¼·¥Úý?ïͧ:”l‹Ÿ­+©ö3GÂ}(…Ü6¶“?Òrzó'¤_a‹Õ.EyÜh–¶šá³››«Ï·8|y½OLBÚÖ6\_´qkê°¢~c³9mü©@ZRl[öˆý%Á>ÈbóQ5­uVœwÉ¿åùr[X$„#Gû9ZÞÔ†8r´#G{ GÛÖ>r´_œ£mëŠ;r´·Míâöæ]¹uCû-ÈQB;ò³£„väg ?ÛÖö}_ùÙÖ#IVÄ_l˳¿Œ¿øÎËô¹­Õ9›Í›²©±µc³­Õy?͇QIëöâåÍ»ÊÒl ’Öƒâšý‰ÿ4¸ŸÚÿº“öϧíïöÿŸ¶'›šê[C™?ò²a~c5öÔ ;V¨úP+T½~E5ª65³c…ª{–e`Aà¯ïº)~éòTsfÿêâìî·÷f—×/.¾¾¼¾Ü˜—k23÷ã«Íáš?FöǶ…Ç«þµµõAƒ—>€<»yùêæõå6Õª‡%a&~óŽWÞ¯­¶¹£sHªø–ý,a9­:ZÞõE·êeyÂ?ßá…Þh% {¾Îÿ|Ç
+ò(î=Š¸·©q”ö>riïƒ
+ÿ|G¦m’ÝÔ§ aÏ×ùŸïÝ6*âÑ°y‡§«_$îLä¾ lcÙáZº8¯.ïþrvù.Yüýº5·¹îÞÜ¢Qüð;óìöòîÛ—[«höQß»rÖßãÔÇ»sk[ëxw¾s:äÚÜ®
+}¼:§Wç¤q}€Í#®Ù ïýWÙ0+=Ü3÷€¯y¬DôSÔƒ+ým›EuøïšÚÇPhó%h0R}
+£‡8U6ÎŽ¡|¬ í7úh¢ö”ùm+Ïþ@î·Y®¾î¦¥”¿Ýž]¿þú(ñùû7×çÝâI~€•íîì«Ý„ûŒl<Êÿ|ˆ¥-œlËÍ0›ÁÃ
+®µ]ö‡ã.Ûä.{ZNÜɶæuÐ>ûü¸Ï¶¹Ïü{ÌÎ~z5õíöÿýåí¶¾ü¬¦~´ö±Th[m³GèðÄÆm¦í!ÇÓâ7ÌŒ+¦q5£æ/üÙÕÕ¦Våžõ¼2CJÃw9
+ùó‹o.¯§žüé•öÁ¾øáåW7W옾8ùüòöůŸ¸“ÏÚ?ÿøîÉ›ÉÝÉoÛ?~âž–Ǧ¥?ueÈ…þð®ä\‰Òþ3p”ßÓ<V7Œí:ŒÁç“œ=é€ÿø¡ýËÿÛþø¿ôÝI<ùãÉÿþ?îäýê_ŸœVŸÆ§!餆àžÆÜ:zIäLÿR+‘ëÓ¡úzBmÓÓ0¤ØˆCz}ðDŒµ Ó"¶®è¯sê ƧCJÔoôOK ‰Ú¶×ü"æ§1–‰îiÊ…záiö~ÿ”ßnOk¹áð4Ç¢Do=Ö˜ô×G?Žúr|:Ô8º ïÖÖ§
+bÏ©<ÁM:È…æ?ä§C)Ü´ý5V~Ò>k['¡¸1T}¹>­µ!{×¾ [÷É"FúTU‰ÞCÀÜóÓâyõ9Œ^½ÆÊ¿5<-5%†QHƒ³¾]žÖ2Ð:µ5lëÈ¿Ô–,¶ÿ%"m™!2qhë!–Ú¶Æ_B¦Ÿ
+m¡JªÚ¶–Ì¥}»šùÛŶrâm’Ú:דgû÷Ôó'_·íÚêµnÛî ®ÆÈ»}²0ÙÏO3-Ú@»9Eúnîéèü˜=mkÚ—áiÛ잺¦ULØ®éiN¼±Ú8\–½‘ËSÞ¬öeeRñí·Ë Ä”²®Xi¯;^±0ò4ˆÖ¾W¢tY“ã؆¶ã‰Ú±HºÙKh£äuôméä{åö•~ßYNYÚæDôOãÐ63¿Ÿ†ö[üqÜøt YÉÚZ“F¬Os³B½—÷ÛGÓ÷‡Ð¾c2}¥¢ÇªŒi”³l×öéZY&J[~¿­¥ÉåiHòûÁË
+ñ¢%ú¶!Â8ÊŽáõ—Ú¿dÙH¡õ+;´Yé!l,À;éµýn#Cç>÷`Ç·¶c–¶±qù±(k!Sˆ9êÙ(Æo›
+ÎéI*ƒŽ 6žPz•÷ÛdFù¥¶B¾T[Bl¶cŽÓ¸@ÏÝ~µ„¢G¾mIÝyô:ƒhÜ¡ ;Ð\„c¦ÆGˆèÛ
+ <ª¶‡ëȬ{øÙ“ß7¾ÿÉ—ô;ù+ýïÓÒ>mÿÖGûŽôGp¼?—ˆÖ–̵©üã³ö®üD¦ƒ%ç’8õK}ÐFéåTÐV­’ûÚ¹ÆG†¢G¥]
+Nc¡;ıØÇhC¯Ùò€ØŽž’T˜Ïr¿Þ+K‰i´ãÇÉJ†lë€ÖmïWa@ĈõÂkýf¯û¤äbkËS—*8“2€Ô¶ZªÊnGâÂX›`Q&{ûYëâ‹öÏßÛ?ãɯ~}òÿ"ÉêÕT¼z€H´ïð|t>8›ƒÍ¡Gæ sðq9ø°|T>(“?™†ÁÚŪFÄ0Újņ1è i"O¿Ré~®äS„Ð1vò¼õø9¹“ˆé/A5›¬—atÚK;£FmŠ§^Æ£Ozí–4jCã·ûcÏl±3•(Û±°Qx9ÚAeJcÐN\œÛÎÍ£®¿K^ecj[e­ƒ"b!ýØà±$Öí­m¬ÒZ;[M’¡5r‡‚’=–y·µ®sn¼¯º¹ÉKƒŒ¥É²$Æ?7…ˆõ¤Fn'»Bý‚îÜÆ° è ¡x!t Ÿ©V²/BfÉšû%U.¹Q÷¹¿¦ÖÈâ$±Ú
+4Ý
+Ye–ÁCH:”²X?˜œØ1H@RcÙéƨÄqÌja
+cÒ'-7ò–mãNQªÝhªîçÐgÏTh eˆöºóE¥^^8‘Úš 0@< É ^Íã
+…˜ƒtáMyh"ÆÕ¤a\)D­IÍwØàØ>…ë¨âh°el-+8G`SŸ
+Ù,È’7‘‘XÛf´!䃵S:ªŒZq%°x5*9Ò"ÈÄÚih+&§¥ÙŸc̃0„!«¥•ô„È\‚,?QgFVÝ‚o] röÉÔG5h•*¯‰
+Ì Y' I÷7QcÊBš0­"@Û‰‡ài[ˆ¼Ò.æäøŒ6"8elr“OÚ²Æéºh¾žŒ†²G‰«†1
+ÑGedÔ«Á
+QoÅÜN]b–ìÕ$'o¿‹I¯´³*òFi0ð. ýHU­¦,F'²n;Œ ü¨)–CT EÛ’aÙëÁUÕzUs-©«[ilÈE݈cy¡é»íŽ¬ºcŠ°z2´ºA·F aɈ\àC )<W²÷¢³ÔeR©Eb)$<U,M‘½ÕÞ!â3UÄ]ôÊRÛêCHô¼ìDÖ,„ØDí :‰Æ’â
+)³XUñ>.†L¬ªª,šI©Ð¶ C[»A‰MÖðwzfàf‰5 ƒ” 7QÄ&)èÍÉèbYˆŽ˜\™¤÷„Q¯1–»”(
+.1ø\1³vÄBqeVmêÚÛ(„˜ÆÄœíõ£J®IY)N 7n„S<œ|e@ãÉfsf9AˆC‚Æ3¦
+pIú ¼7S¼óƒ. _†˜W» 0)—"bÍ#>¢îNk]l¶å£5/¹q=Û1ÁC¥Éê>¡î³vÁŽ*Ý1£Wý‰G|ð2 J¦+Ý–•jâ3ë"0[;ÛßM…‚FºÎ ›­˜Üô«ªg׫®Ò]Œ–l¶\íGýìÕ–M’HV€}„j'©±FÓª¸-î0•}“ѳLÖø"âq?Ú½æ²1¤ÁÇ„;0è>ŸŽ{•±ó4&„8&Hí@èº4þçÒ»˜"yÔX$¥{K,–íå åÚ¡ÄݬÚ&GHCP÷ˆX‚J.ƒC4®Ì¯|9 ¥û¯¯j-l{§Â-˶é ˆÇAXª^—…¸«×ó1;¤†úfªuú¾ìCR#…ǵߪ…p¤øbƒZ&]”𣛢êR›XÂ(WßÍD¤Ÿ€Od Ž-ĦŒBl;B»% "n…¶ˆu JT „¾LôJc뾌˜'ÅÍáºs"{ú*|^¶†E2h›¿@%rdÎÙÈí.óØž"òÐÕ<`˦Ì6¼Fc­gÆl[õY6¤ÏÁ‰hо3Pq<+vŽ÷•˜U¶(ݤ֖3óNô¡sï¦ øQ‰Å‰r—i÷zí·_îÌ¢£HðDyw±ý:ŽÊ-mf*0®±FLrš=Ë«P°ÐÚñ«e°÷›
+DoamÛ]_‹kh-‹‘ôKtÐÄ"•à5À7%;{qž“«AÄ“FF¶´KUÔ%‹PNZz•OÙö}öPÝ[Kl[
+:–Î2¶HàEÛ6K.&O Kd)Öÿªê%¤¸Ëûm_æ´£4©F´•¶íG$<ÙØTJÒg“;ŒÈƒØïÉÆ9èþbïu†º¦}¼d½Æq…°9­Àv`"±]‡Û ¡ýDc^ª
+º±@ufýS.›¶ Ú9W.bò7ˆ>Ü–1xxRF^Io½:b8îBF§*y6sK#·}›…\H y®äR«jÏ­øûK- … ý?ƒ1²YЩ/‡çjí AC¦ÁUÛ&ÞLä¿B¿I,Mlañj.›™L[ü¹Rõ"#ƒKáã‚&‰ MˆMtCP[Àn…µÂ¤¤šv–ý®mU'o-%새ÐÞÛ]îdÛáú!æ ªyè‹bhhL`„ìÇNª¢KÀwÃs%—2èâ²±@¶3ëábrªæås¢ìd74Y­\‰‘ê¹’‡T&‚Í$
+Ï÷·&ÌߟÀYýãýê³7_]œ|v{÷çë¿œÝ}{òùí›×ßžüíææê×ìÕnðyò‰‹npÁyòÞU7üÞÍÿãåIãëÓäß5&1ægÁ…ß—â“Orãóïœ{òÉ—¿i?5‹§üäË;̓ù’‡pñâKÅL~òå§íŸÉàÙÓþâI6wü!ñŒzUí!$Z¼TªÚ<Û
+ù,‘Ϙu"7˜©‹­Éü¾#ñM£~è¢cço“›,Ɖ´sôc2išUDfoN¤Îs=—íÊä¼mbçƒÁ&&%ªus°ÀµFdG ¢Y\f²¯¢;Щ)½M `
+“šs°rí4~nô ~3¹`xÅÂ7™MÖÒZzͧœDvb´xŠnƒ#rE”Dl™cD¤ u`—JÊŒíÞ ;c¿0æóBÀ–ÎçJÎb'àŸ+F-± ™tBkl›EÕ¥FSùŒ;¨ ûôÞw ~ññ¦¿Ä°Ä‹£æ‡j¾}€|g“÷)Â
+vÄŠ 6v{ã‚»€,ø™rH{*&ì©q˜ì¿€ ‡âì7rF(ËšBŒÉt1Â6#3[BÐk̈Â.±Î8ì úb"â‰X ×…¡¨>t›<}ɱŸnxÒ“i’¼2à$(ø¦Ñ,´¡Y¼NÌìÀ²¦§s°U¬ÉéþâðòþqFDk„GlQXÐqô°õóX°iÚ?úu4œ6R1¦Uaµd—9I:#Á6ÊÝí4uùÕŒ™Ä
+‚m¾)LÈ„? X›ª¡_U²Ú”á'ô)öo‹ï'd]Ü
+¼Ÿ.f]–ÇmÄq]*CUœv–¡„ˆ0×"Íè·ë·ký†™t njn9ö*è–b­»–Œí›B°{Cʈ88a]²Ò³ZÌO7瀸X««³Ó׶Oìîv¾ê¸8¬ñ9È1ke¾Ù®¾R¬QñEügz×g§³ˆê«!¢&çÐA‚ÔÙÈl~Ó¶“Qp8½UÞ¡0„±eC‰6C$Ó4ºU‘IìC·CuΑ’vŒ¬šUeU‰£×¶ip˜G-
+‘üâÖ'‡ÎëÚø 5yÜ>ljƒ|†ˆ«" Ç䳌ɹTò„ŒEoWs'Ck-ƵHòK虯nsSF¿ÎÛ ®Cæ´`½ªQ–dÄ$QÎ$ç‹äå\Q‚ô¨%tšLlÛâÒ Cêa5$'â¤è@•= åV‹Ž%é9$]«úóêÐ~À!pXͧÔA5 `:¬,)íD6?2IÚÑAÒÆW f”Èr'aº'5÷U,ÑkÛ`* c6ìSFä¦!,¯zdœ›ÎEBùue¼9鈜{'"¬ˆ¬a!ýÊÃëÍæ ÑˆCÑü^Jä
+©'ƒ©¤£˜˜·ÀøEl¹s‘b:9tbbN!xcn»1Ñ6vÖ[m
+V q¸Ì¶‘ÍœM­ßùµg6Œêr¤¨¾†¡ñb4›M¯ m“iÛ5`dkgWv-‹!þH˜Å2.ð̘LÓ-ê¤ã—FÆç`¸çû[w^…˽mg."c,ƒ1H6ÁkÛœa ÙRCZ¥Ä‡ÇØ=ƒ-3‡ ÛàœGkâÉüc£)OI\)Œ]¬ ™h‘ø ¸•Lx#ò€dºä'þ©R+7¨œMD:à8˜YG]œn"drкé‘4Ñ;
+#ž ‡~¯–®@Vj´­‡ï—Aþ5äîtœkï6[$b1©i†ë®öªc¾Å’ȹÛlC˜xà \¬ÞzÕ`NîÀ™§&#Çhâÿnä#
+s½µ× µ«3Û:‰NH½Œ RÓ“zb¿>T.N‡·,
+!
+Ý‹íXÚ"ážnªê“ønI÷nØy½W"IFÊ88ij
+Šm˜ýÎìV.¸¥&Ö³d…4ùÒ&÷3Å´‚•“!9#›€ž0Fd“×Øycä’âI%–`Z`G‰#Nž³‹$‡›wfׄ#êWy‰ö´x Óz…Ÿ‰½ÝûlC€|ÊfO½x:%â*bOÈQãO’ÔÈb» çª=[ÏM{
+}Vc€šLj³´G«óœLúñˆÔŸ˜Õ£«Á’4¡ùÉlž…ªÔ²¢ÖŒOÃÐ…Ãâµm/‡Ád(PÌÌŒl"n;òXôv¢Q¬$;‡9C7dÓ?~®I«(Œâc—E¹þŽ¶NˆLÑPn&F WQ·¹m+Ö¤©†•S?Q§š=™Âš±2%ÚæŸýÄÛ•´˜ 褩M4
+?>]HùlT蜺ûì°û‰½cè\ÉtΤ)ð,¡Z! š&¾¨ANqRùA¼(eãÆ~m5·/Ås:ãPL_ÊJ~Ì¡{45xžõ‡ÜÇ›2¶TI˜gœˆÎCìSíPM{ð¡„jF
++Öë’)6£E”UÚúõØÐ9`m“›qïø€ƒCÆÓ$š2Y/“"ú©ºîç¸hn‹îƒna¦bñZ·dœÈ6f7âÌP#›…D€.ùÍìj=–za}zidoäú#¶*ó1$‹+¤ËÑ| s)ðùþÖŸ{àp{7á?Uay©ä„ú'òï̆«ê5Vð/n6ˆ%ªJµ6‚ìZÈ’—/ÄêQõ¢ùé\;`ÙªJp¥òªÌ§¯S¼ÌO„È—z•€ˆ–Ucß‹œb ÚW±¢ %Šì^%ì*#Ï|1ýó¶‡ÏéÒdõ¶CáwÙ³ÖxðÎÕF¡ÜÖ]ÜgÅ¥í}×Üz^¿êŸ|ùúýIÇ]½\ßëGó‘D„j"qƒµÕÚñL¶ô* ˆñEËñÜíW@œÞ²±ÃzW–ã,­cþ£%u²•ŠøVTå#Z®÷מõa¨©§HÅHFµ°"˯ßmÙPI”1Šè¤×™),§<ß×´÷0 ÊIiì} Ê“'S ˆlAeˆ)äªfZÖ€"F„M%K}+½´OÓ2ºÄ!g›¨+³l\¤µêÞ‹÷`XaéXY0-w"b¯¸p#†Ly‘Øë¡o„ÑLÀˆlQC\ÙÈZ“©˜-™ˆñY¬¤j„Æj¶þ(È
+ýÈZ¿jÍ)½nd«ð;Û¶Zêa¶1¢„àhãa2äPm¿L¶ëÉB¶ø£99ÇIk‡hA3d­ÆŠ† öW‚•k­“Z7È×*Û¡D¨ëˆ£6 ÄbÙžíßöº -öqGŒœpú¸Â˜mú€ó4Œ#ÆÀJ ±m+B2ë\°’¡š³¤D‡0Fƒ‹Ìä',Ø·f&í…«h¡8t›
+ÂúCOÝ tÖÐ6Ù*I!QrA%8DðªïO‰Æ–œ6£UÞn2³ö9i ×&
+6, B z˜É‰ŠÅEþN–ªE¥ |uôÕ-á
+ƒ”æšv rƽ[“±¯v~PR«Z§UŠàp’Jì< 5’(*|ßYU/$Épu!KF!‹
+°Šîý¥uGLoê))løÁLÊØûˆÕ^“EL–hq$ÔÉ8![•6‰‘³dÓ‹É®Ò!öEF‘æÅ<°O&}j¯&®m"c,XV¿û>…ˆÕãï£ù–&j´ä„"•1~|L&¢[„v©"kƒÅQÇ~Õ¡0a/i7A@<žË´“<|TA¤¶—;‹{X‹j.f}‰"9‡ÉçÕÒ;YüEFv0ÎCöð&óÊD”
+ŠbÇÅ[Uÿ’&›Ì[º]®ýÊ= ¶¥hÁg§³ÉDyÒ Øbc›Ñ4³¤Äš ‹ŒÃéò8]vÁ3YDµj=`?8˱,]ã‚ûƒ’ {]6µ‘¦ˆÄ‰f£Ï=Ù.\=R‚…@°þ¹(ê‡8Y›N1‹žšÌ²Œ%zŽr¶¥°( "ȵ`§rHP-‘UTB#ÇJ™äSP±3÷yêœ-fŸ[;”íqXƒØ4{'z;gä_šÿmú—Õ”ZŒ¢‘Ñ6žDn4ò8L¨ëžlWª4BDÆüˆ¬m»ó8
+ØjÐNyý ØNëbp§¼~t§t±¼SÞ?¾³Xàù–}ö¼=øZ|Âx¡pÈS
+×C{b1
+¸ÄÌkÆTd
+ÏÕz(S˜
+iu=䩈Ì{@O»r¾€=Ń%ð©Ð‚>…Ö~
+pÿ»o¬ê—F«~ù8ñªË‰hœé'_öHÓÓc
+®Çd¶Ó´De¶ëq™M#Z"3ÛƒÕØÌó,Й©­ÆgF;Í&=Êš<X¢4¿Å9µTîÁj¶s´æ±ë¡³=˜Í]¶\ 6¿å£~þ1½Ýó™å¦Þ èèÇô=ÎWÑpéþ`/mô%Àô[zšŸØ˜éþ`4m–PÓ]§^ 6=Ðàt×·WCN/ížrÌàéþ`=ý–7æ x€º?X@PÛ¶Õïü`jt°Cm]DmŠæŠÚ,Á¨íÁâÇÔÞõ€Ô¦•/!©Í4¸”Ú8ì–Úlƒ«©m£.¡©'Æ3`ß=œÚnÜ%<µ=X PÝ{X@T›ùg5Hµ­éj˜jû\uTm¶ŸõPÕèâ
+»›ÎVa›à±„Ã6yb5 6z8
+î` ø!JZ»YuÑId£5ªMa ÐPù
+n$MXåð w(wBRªíá$Ïž|½Ÿí¹“ßüÇõ]»¥Úsr~óòÕÍ›ë'¯¿={uqòòæÅÅ„å½yò«¿Ü\ýóìä·7w'M¹»¸m‘X¼7fOÿýßÄ(fÔÀÕ]Ãÿ9yõDïë‘
+6ƈÅ*‚lcå¼s1¸$[ó‘ø§œR2½°V=†Éç¡"ä1IývbQ^EzG°8R
+9«I!©SîfÄ0À8e«Ý$ÎĨÁ$8ÛXíÇ)»iÀŽÛ,Þ;"cw@⊘±x{WSïÄÌV4 Ve#AWã²Kí(ž?ùý[n4:ì¥ñá{]hÿýd½ú”Ë‚Ë}À£Äåù³¦d™b –Œ †2MlÌVæ'Dª2L¹Ù²2dõØÁö^ŒÙ‘”#­«2BŒ´¦¬‹Òjx\I9‹°£±°J–©Ü²„Â×ß– hƒûjà#'· þDIFŒR­ü”qª´<^‰ M¿ߊüÅôܘŒ~pµ¨Ÿ*”/«at2(± "äj× A9±û!;‘ÕO¹rÙ~Ôºâº<‚¡Zæ aôr]* eQ.%+æ5>-¸é²®l£2#€–pO“ìW`$
+[²a¤–ž÷­¥õ™¯ÅN+ú—$ŸíÙ“/ƒSíí—Hpy*C£€u4I)t„®(>7êxûðìrR´€jŽkÙ¶$o¾‹µr&™ýS**>ÖäÆ8ºì=.£~ºA¦ÄV³¹Ò‰ÇAw„\\D}L`A¯HFtVšŽ Vâ%JM
+ Ùh´“4ŒÅW±
+¶ÁuK/AÄJ–ÛX$ž7•#[Û´ÇÒùW5¦V%þW4-•ðª:¨ÏmvÄ|߯„:B¢°™Éœ°÷TÈ Ù}d·§kh†K•ZmrRý¶s¬5í“, Š^8‰€à­Æ%{õ Šè’¨÷#Î-k¥ë¸¹¨õ€Î‰pâÁ¡ ,ù89ߤ1²FôÂÜDåð¥×†ëÑ–ˆ ÇÂ×®eW“rÂòzÒƒÑE}|¤r¨P—-¹—tPÕ†IcÊe1
+œßœÙ*ƒ$'™7¢·%'(«ìgµ"–Vh2tXjüºÊYyÎ%DxJm㯷YUp@ƒh߶ö„VªÞçśܠµë*1Ýc<C6Îçbû…lb6L#J<Ÿ2x ‹‡Ü6k)IBaSгZ‰9Š¬Lƒ"ý@n~}¶Mº íŠm¼
+m㤬JEÊo2æ-8Ë}€Öù#óg©¯u·•-Á™6&I.aS 3ÉáâNfcK…Ç¥Á,8¥‹åƒrN²~ø¬Ë— \`S p“©ód S藺€ÝRù¶a/‰­Gö†û" q/qÉhÖŸ“ˆ.áXÀqŽPÁ¸€ (@ ìe À‰ b4q„+ÊJ ÛØ‹–&)¶ÎDv™
+Óõ¢"‰¯žAˆé±ÜöE° rè‹HÙª’¯Í!¹ª˜U±ÈTý>y øŒâ«²/4Ð\Õð’ŸsV³%™Ù!‰¯׎ˆœ<,ú¢ýд|Eõ‚I¬îäsØÒî°X"^K¯ÄÉ´@ a»²e1D­Ë‹¥êÑÙAçeˆ€,¢Ò½$†.sljÉUp÷FK÷òz…ýðDºPã$áO¹´vÊ&ýú_è×V!À«R1d©£‡ ±¢å EŠhË°
+HQÖ5ˆ _!v(zèìi0S4œ ƒ
+Qù¨åîc«½1£ #œÃ™!î¶è-Vi°µ¦¡â†)(ßKèƒÄ‡ÑÁ0¯´<š9ÍW§üAÍa*§ ýsB¥÷ZÄÿ_jbW;lt†,ª?Æd[^À’x­Hêͺ_h£ËÜ&õ|†  M²_ôšæêy¦@Üç:‚QdS’ÁÇ 4U„
+í8ÙG µP|2{'P%ŒÚ÷tú ²p¯QÀä 9ˆÑ„«¥L–ˆ4AD Q!À_aÞKQkéÀ£<Šã0ÇQOlOê“ÕèsðL®ΘÄ8>Šm¨o:D 7…SÅï$V"Ç^?í?Ýf‰\mZ¤M3ï§ ™$æœôüáÜUe¨$¥ªþçTÁ¡Á¯ÿ †.Ý)€ÓAÂú˜¶‰3{ª Åg‘Ø{/DøW„5:$Õ±'çÞ©vÁUÂHÖ‘•UüEöå 2RŒ…N:XQøìÆòÅ1F*דÔûÏ9+à+êh’ú®>öÆ/ƒ¨'Þ‰‚æ?T|r§µCN°bF-zMǯ”Ô=vÊѱ<©%UÏ<‰c½ªNÛˆžƒàôª6ßv=Œé»Ë¿Þæy˜|ã]ã±T™‡V"%öóŽC)S¹ª{rù:7(@‰2åS­â0šD´"¥KÔQ_PÁRî)%Ì^5š/Dìx2÷Je+B÷{\+m‰pó‡ŽÁ‰—8«Œ:¸
+u>½i4ƒ™" ˆ[ õµÃ’C©?Ÿäj€#i”ˆq¯e0å¤k”6É>*¨æbÙC^Ø’poѬÎPtR†@ìBÔä Yx)³öLõEµ¸£…~R’"žü}Q¹‹ˆ©ýÅc
+±ñÑz:Ò
+“Sø»&å–ÉîþÁL{äÇÒDÝ‘œªçåAÖÀIø±gô¿Ç\^…Cæßã°—zqˆ¼Åw=†a±„TëTÖ°| 7ÝÌ·I\¶|ôZBŸ¢6Òà;Úf«€Qëm ÒÿR‘4-6ÛI}Én +›ˆÒb°ºìcÎ:3P
+Aá%Mê-ºkX勵¸Ÿxû_{;NÝ<4h¤Æ_/¾¹|}wËþí‡Wj!
+» ÷ý«›Û»ÞÄüæó››«y›ë³¯®.þðæòÅÅëÉÁøìêæÍ‹Yì¢X§\r8ô ÉLT%x"=Ù#IOôẖ8£ÚÖ¢iŽ]Üwè÷Å’ÍW
+î0ÖòºnpZ±”î .tJ18Zl˜ì;œÈÈj…×ðýĹfHûž“ Ý]
+ã4~LÁþI4VžZMf"¨ÂÁ‹¼/°Ð$H¡ô”KR=š:pÀÿô ÌDÎVèω^KÃ&hxãUÿc"É•$XI Xʤ’Û¨`Œ°ŽF/a™D¤ø@–%†AÌ<…‘´b
+L’# k ^ ú~‡d 0Y²_ *ãŒÑýψÚüûô#ÅŒ†„‘&Ì&©Å Çõí§
+²ï²ÂË' –pÂ^
+¶!È 0­åÀ«¢nõmв&6S$Ù‚dPÐÿÅ=ˆAÀqm>¾$ªz‰X¤rlëµJUVî€ÀÈȲD É;B +I-Aj1;ºä»'±øÒA„+Q‘éú(Au%Se“Y'y]s–9«óê)RæèX™•&·£M"2uÖØ4î€ÔIô¥Ø'M*dr%e¾<é$FH¡€7Rùýdu£ªB}ÓQ®(É`š¬÷:N½àLŠ-"-ý\=ßVlºWhV7Ô4‹´—ØÛ¦ØÁ­UÔ:Gd'E JGÄ#ŽÄ+òŲç)¯}^ —Ð ÆQ̦ Q…F§o'ÊÏK!(¹1%;¥ƒÀI¤èœÄ²X­
+(E'¦1Å7¥x‰_%^!¦D
+/‰ðø5¾¡UPÉqìnù¦A Kf۸ȭ~t·¬²¬Æ ¾úLÎı|QÁ[ë
+ùQoÚmâ{!ó@’©èÉAѵÈä;±ÇoPE‰|[#3xþKãV‚½KŒ¨VPæu™”mOÂ@´®Ä5+téL™Mãd²¨¡#Æ°öD-É<+HRééÚeX]zz<U/2•p%6Úâñp8¡œ”A†¥UºÝò4¬¶­0F¢Sl[O#÷ɬ–ån$vY³~†ˆ‘+¯éêEzì*¥83®öÈÉDU~ŒÒRX âqë"ÒÊr@[˜¦Àí1‰!?Uñ ’=‰“^ÉhW ¡ˆn1*¯-ˆGæ&}wò¿©ŽmÛ ú¬ÿœr¸ Ç‹­‰n1Q}FÂÁO4ȇ=0M¦Q,N/iª>EÐÄcEÇ¢ ‚ŠeÍIÀ ]3lû§ÌqÛ"õ’ ·TQ©Hé>mDò‚¸©XôH ŒãJî ÆÞ½!j)ŽU­Á«ŽE4r£g"Œë•Jû%kؾ£[Yý©à2Ijñå{H~YU^ך,Q!+D™ñR#™ŒNô‚hcy̹£³j1ÄÑÂXtœ$ö³ÏV;H£G¬CUÕî1©C½UMÇÉ@î!·Û‹‘€bØûBNUS¼ª¹Þ霊¤á(]LŒÃy˜CÕb¦,Â"Äþ¹§¢áPž†×î
+DÖ ½)‡QÃíÙë%#Фo¾%3‹Ë—¶ŠÆlRuœ/]4´ŸñÓe
+—[C½1:à—“”E.ªTÌ,ÆW>z ÈTylLjãæRòcQ5H]\,ûêM@š”†¿Òñ–¢÷dN(ež©ƒšì–»îO1j¥§]¬*×@ß0ªêî¥R ë6™w!ÁLAidV)ö’žä( `©j/;eÑ$g1è
+$ k¡ý¦+¿•‰fæ‘þ"R8]µA9a“‹8Œ…{–ýO%±¦H6ÑðtT•§
+<˜($døq7Cå$ÝÃåAÛBe©Ó¥?ÕÍÊ9¡úóTaBò
++,ëÔ“æ–,®UiXÙqY4O^Ï°â“NÉ<à¢
+ï0…#5F­}´å³n¡NZ2¢êÛþ6JgÓOÅ «¼UÉÈ,—Í?JU›!‹ I6@±b7À¾¬… Iý €Å¬‚¤D<n¨Ðø0ì(†gJfŽ7 {³BÖ;á€E. ߢ٠"ƒÅ‰ÌÅ,©r"‘¸Áp§‰Z8oZ.«ERñXeûR‚\%¤¢P#…ØÉg"iŸeyÑxŠF§° ›OѨ["*Ê {”¸Ô„ÜGðPàµ`Ï‹Ny†’L*€öÊe¸“„t"f³À*Ê~j o!5Žogž®Æò°Ìe
+é1›ºDe¸@ 9>á…åºE¢¹£N9¤^pÈH±aÍH.!†.'½ŒÌ©¤èqX™]šî»Â°Œ`4ªÑ‰t£ìkåÖ¶^¨Â
+˜ZÕA>kœðÑÕB$NãtCB† Wgh)¹Wó ïØ{ëÆúÃíÙë׋o±Ç}YÄ‘Å( N“Æ2ï5Zd½Ã’HÛ’l/‰ûä¦Q[»¯b¢“›Q½7«1%dkѾ|s³c€c ¸Ö'EïU„Ùs Æȼ‚ëÆAÌ¡Äј F'7‚2i÷ì‡âEõ"[Y‡Ì>1œj4•±H\|‚†Âê’˜€Á™é'¶ö{N7ðSŠHDÙäƒ%Ѷ†Ð}ÁÓ“Ù؈¸¤šhhSÕD.g¼I?•M3$tà4}—‹#h ;OXš%>’¥/Å÷6ªSÔñÄ«Ÿ´0 býN¤1±ÔÇ¢ž„Ñ–À¼YqJÄoî¤è c±°L ñZÓð”C"]F0 ¡#®A}Ö¨5'’C‰ÅÃD¦“° àÅÃN #ƒ.
- ´nÛÑí4³DX:`+æ¯ó*iÐo™ÿÀ›†¾ï-ñ°¯®õSf§“¬§Øçmli ·7;FklÛfJøð ÂjÄä†Á°ŸuýµE“#]?Ø j‚ò"v(×xñ¾¯d‰K¢½¤©¦t,v>ç(±‚1pK³ x§mÉÄ<ÔzlQJ|‡^ì·¤\;qª‹%w‘99—Dþ }»2œ v*"'1ÿ›í<%Df’lè'ð‹ÉÄÀ.¹ ‹jýöû„Ñmlø:¼2è¥4W©›Ç¾-j]i£ŽÖ‘|È
-û Zž…i£†ÏÌÆî}±!@>eS§^<ƒ’p±wä¤1'Yª`±_«ª=[ÌM{
-cVS€šL^i³®'›óƒœMúñˆÅŸ™Ò“«µ’5eÈl˜…ºÔ²¡šŒÏ1á°zm;
-^0
-33#›ˆÛ<½Ÿh”#)Âa)Ð ÙÜŸëÒ*JŸø4dQ®°£­3¢Q4d›‰ÉBTTàãmnÛÆÊ1i2aãäNÔ¹ifC¦ðe¬LM¶ùgd?óp• m&:ijMÂOR>§€î¾rØýÌÞW23k’;K¨V*Fƒ£‰/j`SšÕv ŠÕ¸i\Õ£MÂíK1œQgªéK¥@ÉO% /¦ɳþPÆxsÁ
-2 íL3Ñ9VÈþ)ÑÆfÚƒ#TsNX©°^cȦØTŒ‘UIjë×cCs´€³ÍvnÁ½ãJ
-L—hêl½LVHèwÅH5tçMœã²<º,¢ž·…™ŠÅkÝ’i&݈ۘs?l>†ä·bWñÓ ëÓ#{#·Ÿ°U™_![,!]ŽæWX•_Þßú—çØÇÒM‡7ûOVÞ(9£¶Æ‰ü73à&ay ü‹›E±A5©Ä¦1Ñ.„"9÷Bl-*žÎµ–ªš„R*Ç¡ª{ú:EÇüøLˆ|7
-rÈÓ?ï»çc¸Xº|Þw%¼,÷¬2|pQøv•F›¬µ´Ýtµ­çÝ×û³¯ß~DïÑq?/×÷ú#øÃHþAuŽ©Áªjáw&[•úÃÈ’ål®w†Ÿf¡µlÚ°ÞU]¥Ð7KÜXýÑšÙJ%|%ªZˆ­µ¿þk/Æ0Ô°S¥¤ £Yàå˯·Æl¨D Ê%t2êÆT–J^Þ×tô#ÂnržF1¢Äx6uÈ6†¨±(3ÓŠ†41!0*[B[¥zª’Ñí, 9ØDÕh˜eãdäf­UÓ^Œx„»ÂäJÊÂe¹ ]Å…1dÊvÄ.c PfâEd‹ â’ÆFÖKÕ,ÇDÔ˜Îj%*øS#`05³ì'E‡ÕúUÛM•øt#[­Þ•m«¥V6F’ mgCÍöËl±V,d‹0Z%—4kíh¦áH¶i¬h(`|5XùÕ6«]ƒŒ¬*˜Jôˆ«N8j%û­öâþm¯ÛТÛ4Äȧ+†Ù¦8Oqš0ŽAìHˆ}[¡°‘Ùâ‚•
-V®¡ÓÁ|qF¼Ž|FõkÁÊf%Œ¢†@TQÙñz ØqD”Ш° "ÍÉÂÍ«Uã^‰šSD¶2!T•—`2>زõ:Ív vZ­àhýÖ8.ÙÉú]W+äá «=¹ÿ°瀞‘š’‹ú_¨%Ž>³*ûdήõù5xÆ:«öÌ£
-£Ì(Ôë=AÑÅΘ ÒÁ>¨ ÒÃ^¸ Ø*{ ƒJ{aƒÊ±Ùô'8è龡0(­a„‚ÏîŽ*‚Í^8¡ÒÅ^H¡ÐvÆ
-E»£…J{á…Âf²†ŠKÌP¦ï‡Š®×pC!7ïŽ*=ì…ŠEÝ=_v ?Tì…
-‘|w Q#k(¢`({àˆÂ’¸’(.°]±Dåý½ÐDQ\h<Qéb/DQ™È=˜¢x°ª(Ìk¸¢°gïŽ,*=܃-Š{ ‹Ž.vÆE{ ŒB'ÛcìŒ2:ÔÈqFÑÅÒ(·Ö¨éÌ»£¢‹5¼Q|¿=GÑÅsÔ軣Žâ\íŒ;*ì…<
-¸;ö(˜×ú¨<Ø ÞªÝHad܃N·=PH¥‹}pHG;#‘Âd»†EŠ îŽF*=ìƒGŠï´")öÛ8O{ ’‚S®á’âÁȤvöÀ&…º¾;:)zØŸZý¥Ðë×0Jñ` ¥ÔìŽS
-iuw¤R™ïÁ*Êù­–x¥Bß ±Zû˜¥èbÔRéb/ÜRØvG.•öÁ.…‘a ½n•=ðKMÅÜÁt¸˜¦¢Ÿï…bŠá­á˜âÁH¦ÒÅ=X¦°Èìf
-µ{‰g
-úˆ¦f/ÚÓšÿ¨¦¶#—¸¦x°²©œ—{°Mñ`‰n
-ú¾)Nާ濹åÔ,qNíÁîH§ÃUvÚéÐHx§ïy~¨Õ €ÍÿkÓÔ¯÷ Jýúã„¥.'¢á¤Ÿ}=JO¡ ÇÐ…_bè‚ïgçúæú¤k' ´_,õ:D0軃Ã.¼;L0.¹=€‚í"Ú*]ì,=ìŒÝ·`0±d0äè=@ƒïßn¸Û tðG ¾ûXC|oHÓná>pá{¤5rÀð{ºš…ÔÜ3l–@ÃÖÝjx<ØlxeDKÀa{°3ä0zØtxŒpxØèKèáû_x¹ÒÙ
-µõ¼;"µu±3&µ &»£RÙfg\êaiÞ™ÚF±Ä¦¶Ktê!¬íŒO=6ÇÎÕ¶9–Õc×ìŒRmçe‰SmvGªÆq^ê¶aW´jã»ãU[ ÄjÐ÷À¬F{ VÛ(–¸Õx°†\=ìŒ]mf¤ÝÑ«ÑÅ~µ=ØÁz˜Ëv°6Ác‰bmòÄÎ8Öèa$k3°.±¬ñ` ÍÚ,ñ¬íÁîˆÖHÖ0­íÁΨÖfb^âZÛó@¶6ÚÛvF·6#ÐßÚèK„k{°Ä¸†
->zZà•7vFGkØàødkèàö`‰nvG·}²Ä·¾—(áö`‰>¬"…}‰n–háÆ—xá÷<(iåÝ1Ã×íŽþÞƒ¢v‰n–ØávHvFŸß?],ľ;†8ºXC·»ãˆcíÖÄǃ–8ìŽ&>XÒ®xâ¶ûvG‡cWLqÈÝQÅÑÃθâ&P-‘ÅÇØvÄ¢Ú]ÜzÞ_Üú^"ŒÛƒ%Ƹ=X¢ŒÛhvÇ·.–Hãö`‰5>F³Š6>¾Æo|Lx8n`‰Üi–¨ãö`WÜqë`‰<n2ø®Øãc7¯¢¹ìŒ?>ôƒ¹=ÀÁš¦ù%º
-ù˜ÍÎ8ä6¸%ùì¬b‘ÛƒÝÑÈm¯-ñÈǃ"¹íóÝ1É­‹ÝQÉM¼Yâ’»"“› ¹;6ùCèä&â.ñÉǃBùLr²¼íiåÁ¥ÜìŽSn²Ö©Ü,±ÊÇ ´r»½wÇ+"ı܄Žfù /PË!­á–Ú~F°v¹u±D/7Io‰_nvG07IoanôQ̇p¹À1·K$s›ÎîXæèb ÍÜìŽgn²üÑÜìŽinß~‰j¾Ü‡ môdsÛÒ;b›3´@7ǃ%¾¹Ñ—çö`‰q>,PÎßcÇX5r¬a ´óŸ° cÎæù‡e§%îùÑ1²î9c?dŒŸúÓ˹-ytÜkþÞbnÿÙÿéÝ׿»~õÕo¾¹¹ÒÿþòâÛËk¥üêË«w'¿¿ºùáâö×ÏÈ\ÏÆúwýdJ¦ü9O±%d4n
-IPŠíMU%Ù‘ƒ }ÿãìy]¶~~væ€[€Ó÷V\ì8¨DF-¢|R6´¼!rljSã@/n¨Ò&alé[ýVøïÔ6kê€þ€Î±è÷>ûæþ•þÕ)á?Lý\þz²/¿üâüüÝ›¿ÞÜQÛÙ û»}•¾´<¤fùR(‚…R¾#¥!Ó2Eï++ä+Äêþä‡>t7E„jU*(Òì]kšÖ:?,Œ›(¬‡v{ôšÐ{JùöZß¹kHlÈ}A+BU%F»ë÷Y@DňXÕîDÏ©ÒM'æ¾âA&m%25zÍ%bA¯TV¢0}…‘i¤3œÓë~Ràr¢:•O ÉÉ“Ñ3úü<ZµS±ŽÐÏsYçS©tJaü6€2cÐÚÍ‘D^­„—¼²–4{†>MZ‚2Rò,HÙINjï5Y5¡4I„bÿý&@šè@êsF7À}Ò¤>­*!¤¦)äÑùçbpÊQñ©¼E„à¨G¯ET‰ÿ8Š–¢P\$€"lV0p•F¤ú%ý
-n"PLX™äð w¨OB¼Qê‡ÝÃI^<{}?¿s'¿ùÏë»~ õ;ääüæÍ÷7ï®_¼ýîìû‹“77¯.f¼îݳ_ýåæêŸg'¿½¹;é’ÆÝÅmg…Äܽ±yúßÿò &1“®Éþ÷É÷Ïô>žØa@à`Œ0¬"fd*gŽ‹A%ÛšOÄ?å”’i…µæ)Ì>}±OYê­óHò*’5‚E…R
- ý$¼HÎW:ÕYdQ'u·èì69e”s ‚52.VÃgƒýî¬PFF;I#R|_Ü0Úz«¤§MUâØyS92+°yzªƒa5ãbMwE©Ra®©¯ùü£ÍŽ¸­ã •
-Zh®Ã<<†d;{©¶_È\ À<¡ó)㪰<Èm‹Ö}$€4e#•˜£ˆÅ4(RäªwP][Ðl R¤ØŒÇ Ðä²rÐlY.ä” ]MáMZ"Nnz«€·¾ÏŸ½ýHÛ;&HGt5$µX¡ÙeÔAIi\à€Ì
-UɃ‚mi]`‚!8 ®DLdÙ[®¨ Ð7>Éý"U©•É|˜·üþ,w ó'æÏb_ë†;?)[ŽÁ46eÉ
-a«
-c&Éáâf»J™„ÇåhÆš:ä𨜓 ¾èòå(1lD`6ÍlqªÞý²Â 8¬‘;šyU¢$NžØ—í«$¯½Á½¢zNⱄIU9AÍâ¢ä0Ì.Ð&„É$®ø*ajÓ(*š¥:Ùá)|Ö‹$Rº2u†Ft£âqß
-Á²=È/Re–Jn5ÔªòÕDÓ'ȧ$Ú{ö@ðÅQe+h¾a«ªY!g+笾J6£BF'8ÑWtBß¡iùQê!XÁç°‘+ø`µ¤+‚Ÿ–^‰yi1BZe»aHZ7öHU’³[ŽHL
-+Ž˜6‚“Ò麙 âš!=Z™soÐìue“¬†JtR‚îäAW‘¯t°‰¬])Ú<ú~èn´\E œÄŽ$þ•ÑÄߌȬ˜€û@C¡'û(£n‰ÏfÍ$ó¨Aû‘ú¹x
-÷š¤˜¿$É™°®”ÉQ€ ˆ¨&¿+ Â{):-x”2q¤8é©‘ÍáIcRÃ}¾„ÉqÀÙ˜G7±½õGcÒànÃ98U4Mb%6ìõ#ÐþclÂÕnE
-4ó~ÚP‘éògÎIßÈOÇ]S†J‚©ª|Nu:üújÖçÒšÿ$(/ÂpMœÙS'>‹ÄØ7!ò¾¢žÑñ AŽý48÷N
-®èE⬬¢!²§UŒRÒrR»ª‚Yw–/n/ÒÚ¸>;˜¤ÞÎYÝÔPç’4võw~©¨õÞ‰Næ>¹Ó‹‚Ú
-!W5»‰¥¦ãWkþ8åhQŒM*7I…2OXE¯ªÆv¢ç6½ê„Í÷]SùºÀò¯÷9<¶ÉÕ@GÂ
-›àØø-¶ñþg?èbµ«žãŒ)=·&®ïçY„)Ò¬Dçôõ%åfBÉ hVؤ‰Ê|b“WêNÆÞÇ5Ð6‘ˆ4¯qãœøl‰±^¨ƒ €‡æúrAq†»L#àÒH¤pÊï-Dƒ6ª„e’'X9ÍÎgE«wpZÓ*Å"ýdê`œ,(0­\±2x7“bÄ JXˆšE¢Ú¸_ KD‚O‡¾Ê6ØùƒzBw´ÆZj[™©‰êª KÉ¡Þλ=ªð ¨vd‘ÔVKW¿È.£›AÇq~~˜´¼À_'&máL¨ÂéMm‰fo$ l1¿¬–
-ñù,—ÜC“Dx{-R)g[£ªIÚQÑ´TËöñˆ„x‹>u†k“ Df¢`d]ÂK´ªª€-Ó³”ØäZDôH¼¯ —±V/‹¶™úoMrüd0®‰ªR(eAy6•wÅêÔ'Ô†O=i–Æ!¿¯*CTú…:Ä\Y$劕!ÍõÜ5¤pøó¼
-̲?úXaàJ”¡#BIxÞ´|"d @eqMé ACAYéU]⾘’˜l×v"‡Ÿ~Dæ18¯PÂoà”$2Mûb´n‰Xu&ÅkI‡:6¸~²ÚRæE{hQ"‚d¡ÐR«t7¡J˜Š­ìÉz9Ò
-I‚$J:ÈÀ.&펾RÁ”`ìL^B)‰H‘},5Ä(¦žÂDþV1óe‰Þ—5P§~}Àú1—,Ù&PŠ”1>ˆèážgkþ}
-ב¢B1#£‹­Y*7±qÇ1|ÿ©Š¼¸¢½ò èðŸ°Óí²
-"BH^,.4
-±S¶ 7QnļÉ1ëR€ †ä½”ßobmå³ÈWÔ©úw%ûËÁ[¾
-·'ûé’ìkŽîm£F,ÒvÇ
-YrÌr^¤´&Ç3³r}Êá«ü¥ØŸU)"ÏÕÄ žÿÒ@” ë婵Ì'Y"”²IXˆV¤•˜d1 ý¨°á›Ì- ìÖ”¨%_ŽHê;]¼,«Ã®
--çY‚Zä&")‚5°BÜIlÁÄ0[ÑÃ`-réu½¼J¯Ñ.S
-㺋œÔäÇ(¥„E"·."­,Gè°5)c
-l¯ž²˜és¯ÙŽ8!• ?‰ÖÕŠÆ“ñöêÈŽÜÅŸNþ—¼{ý¬ùœrä Ç‹E‰n0Qz&ŸN4^‡=+]žQ<N
-éÒŒj=UÄžD¿ˆI8Å~æ$v†®¶éÓçå˜k‘xÉ5[›(S¤ZŸˆ&"Ù<\Tìv¤‰ÆO%·„O*³OIëÃpÔi ^Õƒ$R‘›D.9\oSÚ(Ecí]Èê&@©$9<©Y—¯ ùy¤f4áux] ¥$E=ÆK™b²`8QyE=²ÙÈŠÎJ¸3 SÕù;ɶgW - w'†¦Z]b7!?;¡ºzS
-u"aµ°S…|¥¦s5ó¨Ó!ÃQŽ—X€Ë$肪
-:D?Y¬éBˆâsÏE¹¡ä
-¯Ñ×:Ä„|ʦq}¢.P%/‰¬ðÅ’ÚSžÚN"î_—¨’( â´È¨¥
-‹fY1"0„’DÌ •©„I#åÙ™%#ÐLl¾|%ŠË÷µJÅl7uœÄ\5*ŸaËe
-Ê Qõ§œ/¼¶í ¶É´´?EõjXI›¤¶ˆ¨;î%ŠìlÒ­:RéKb¨Ó$4ÎC…
-c)ñÉkh¥
+×I(ý@ˆÈmr,q>\Fx€êîIR
+rm’õfª6T4ÏK>~£ÛÉf2Ì\ƒÈƒ¨ëJÇmû³­a>F
+¥Z"Vr‹{ã\°,ë|$mŒ¸v*Ç9GZkh9ÐÕºÀF63m«L!ù
+N“?ÀMîÕ§63 žÔrT¦mU2möÕÃÄ¥aíʽQtD–Œí؃)
+Q¸‚’òjØ݃#ðÐ@@&Oò·ËÂLäQÌÈ»|ÊE«d!vØÍ]©þDøW7fxèûÄú›«.°ˆ.Ý,#œtBSŠœGÉ’ ­ÐØÄx-Úñyâg1!ªÛfÙ¥xÙwlÞ?[9˜ òPãvSÄõ
+Ý€FUpY®ñòš+¹ù>¤þ˜.£Æ
+ŒSÍÛP»î(§00¹ÛJXÝhøºJ×VžëøµíÕÚX2ÂyŠ^UqÎÑfA5qõêÛ(/h<· ‡ÈfK4?WÕí
+¼3µËÔØÖØ-ÄWFY—6ü챚ÚfYu¬zQ¢Y?4V ìEeðPO•¢Øu[kÝ7Öª‚L8;Â!ÄÛn’â'›ŸD£å<Q!¢(  ­ç8òÔpTaçÒË’é×X†ß+zhØmvã
+Iº«0»|7
+â’‹¶]›"²CÊë§nÎM&·´mÝ&¶)”
+ ܈ƢÊ!ÖS˜UÍõŒÊ±*`D@t/voÌç“ÈÂ0Ùâ\—¸Q`Ç ßÄf%Å9‘Ýa¤íÞŽ¨$3èx…j|¤QOKv££0|YÖžU/b*ó²"ðÎª× ©C£¥±ÏÉ:æ`šÜ¼Js9 ‡´ËgGãb“…§Çœ}&ÔÙ"Ÿ´c*'Síëp2II WÈq¿'N•¯¾K ‚
+ñ.kÇQÒ¥®:o™ ¢BëñöCíqŸ 9 X7@–:“UµÕA Ž5øh¼Ð^m,ÅBjKX¶Û–ˬaÄò EsÂ(^ž§@)¯@.”âG Ž:@Ia;pÇÄÎŽFWãr)0ƺý€ÇÊÈÝÃi¿âXQÍh¢¨•ªKæÐ Vq@rc{±¹u˜ƒ®N@¥¶ª 1,ElPó°´%‡—ZËxs-ö-܃Wîºxðã
+0ä}»cÅHì0ЩÜâ¨
+(êÔø¤ôvÙ\ßØ’¾ãþ ›‘Ú
+jt­9Î>9è(ŽZIÍn±Å•DSà^, N÷_ÌÕì+ãð+Ý{)Kh”ÇœD9Áñ¼ŽF“þà" ¦Œ`õßF¥6&fŽ%k†6ùã¨Àè@‚±€¹ŸDKvK|heC2åû˜Á:›€x^\Ý'zRɪ›ÈŒæDEÑ-DKpGÅéÏ¢/݉j>ÐJõÍDÍh®É¸°,àhnî$÷l_ÒEõ²;1”“ÿÉ%ûÉI2>â\·’(šê.údoìÍã×NÉW/Éše€Ì3ATǪºa–p·É…(»=Ý®±s/$éÂ0-’
+?¥q‹ÔòóaXm·uŒH 7`{Ǿ³’ã}=ÀîïhÂ6Ymº¦
+%¥±¯OqZ£.d^©œM¶³€²`5!cðúh‰™¯­aÔ°Ò1(óÂk
+ZÌP5ȹzï˜9·mkÚ|q„†’s#HMŠ!&#1I5ü©HFâŒnÉ›¤–YÚ‘«j·øç¸o4œµö° lçU©-G%„½6óF*»ÍOõ a ô¶Du¼+ÖÀ*Þ
+>—ÎDa²4Öd<ÉZñdëéQemá?~r¥Í…;Bô^£—¨’JŽª³*à°ëˆÄçf2ÞQC‘ØÍ¢´C²z/h^‹sØsl¶ÒºC+ªöÕ¼ŠF@…….Œ†µ­côÆ…Ãkœi¯áÜ_r$e ?šs±Á U"½É|úž°ô)/SôìÁe:Ý _BŸµt&1ÁtpêÌQhäu7c¬¥¡Y붣ùŽ}ÐTãÞ,¼
+Ï«qÊ%¨uÛЫMÁ8û¡æ$Øc
+aóÄÒ%»è8ÆZ,r$)DÎ V5sÑ#EQ{TÓ“"ï7¥0î4O¥UÁªüx=qjš'š›|Ñ­™õ™j^•þPµ–R·(O´-E·HÛ¿ƒOG3<ý|T Ê(Çj`èø”)¥–
+ôP?**ž\%ã÷'RÕ9²ÚÏS†2
+Å[® @×n‘6ÖΟY•Ñ=we±pn‹ ­í1êi¨É€$»r,[¶=|ŽÂe'TA·-B¯¡'³ÆÊ‚:¹¤oRbSÉípˆ5Z×À¯­"ˆ]YÒçULi5®¼·ùOÉ ÝÝA,nw}vórÃVZ$¹Û„^4Ž
+E
+Ì&;xæWÉo‚y±Åê؉ð›V)
+>Œ\>”ˆ,ž@øŒŠÁ1ñ}Ä( ç¾DB™<†ßp?Í%æeUBŽ¼F]02¬ãi´.²öµIO•·¡h콡; !uXóöˆpr[g†ƒïÒ; Áy`iòêZˆE ´¦ÌwÅ\­B¦7t¯÷"Ï\ß_CV ç½t-Xy)ZÁf+ĬJaplrð² .C•‚Lá
+$cÖåò0ÃϤ>ï­Åôü¸/êTªµÈ*ë§ÓbCLÄ!ȇvZ’Tˆß†
+šôFpGfjŠûÁÿ(Ñ&‡‹¯¡ù|¥@”¿ß…ÙT§³MÑ)ÜfþŲ¸ÔçuÇ‚S ]ë#ƒdd,“"'Æ—§Éå©ÆúÂ&Šô‹Nr™p³2žœ'_»M¦¤¦¯ˆ¸‰KÕZïdëØëj'uZ†´2®Êì´5$Ä‚’cíÈ8¬„ðŒïUàbŒá6u°DòØÿê¡ŒƒÉw7×ý©H‹«„Ƨ$Ÿ¢›Òa`U³%\û/ÃrŠã½aŸç†^ëSĺJÜ—^P¹jiæv49š6„¢vH
+uR"I¼=$§q¢€’ý2dîÕíd­$Æ»Á·¢nWóHãzµÄ >»L«ƒL è“Bo J}ö î Ò”±Õ”³×Êà« æ¬K@Øn‹¤<z*eÏ*>UԡЇ;5¥4Á‡À†-qBÍGó*'¤+‹¡WU7À©ˆ„\Ý‚¨n“­AÞἺߠŽ\¬BÇhL©<†TQBò‡† )°VML'ë©„¢™m{Šî>Ò÷Ò3E˜[d[ƒ¤Ÿ¬‚|5¤}+n.e<™XøY?Hô¬(e‘á3㪸F‹(Y§…ë\ê*Ê(ô‰¯3h¼GF'£yV! ™pc£?YýI&ôÔAö‚¦ˆ–ÐâzÚr¾Ï's^)Rm€ H¡ŒH`ì¯Æ.h–†a*G%ý…bRŠZ e.Š·Š·&hs@ˆñKqÖØw/< ±p
+Á8Î
+Ž4 Õd/ÑÏÖã]æÀLÒˆ•i'ô†I?iæŸrQOC´”7„¦0ùÐö²£ÏEhpbÕ¶÷VJs€p"]MãJÛHkÔ†˜5Ê)e­úÁ6™)ìØȆÇ­
+û¦•â
+¿0(èzå(ûKq²{‹µ„¼ÃLxÍ-9üÊ8ÒÞ\¢¢hp$Œx‘ÝA…ȆBUaœËxÅi£XÄG¨æÈ…±Y tb¹úÞZÂì%î8š³]´*æ´›˜z˜®L4»® gªœ Aö› "|£ã¶8F§6H5G4uA{‰h«Ö`4Ë%(­Ä+O:Ù‘
+SÐý˜R‰CÍ|9hÅéþÔ­³¿ÏüT4Ú᮹†0Y“W¤lgØEŽQ­CÒ3yüØ–“,$k’Ë ¥¿A3¶´ä|ä, "b+bº£fuü–k]µ(¨œ51Še&£·êNÍê:ÌŠ?䪖_‡‡v4?kn{èsúZÈfæÒâ‰@Î‒âå0 áRí5daX,!,ø_‹}ÐÌa ’ÜìͱÁ]ëÇB기YԩÓª}£Õµ¨U
+½£yš"៦½»¨Ê”šglÎz”Àô9›§~pòÌ£„/ï½Æ•‘‡ÍÓð‘ïÍÉ]óEŒ‘ééòÈ@XŠ´Omð"\F~\‡åLs®5Xvs]ýI24ŽW¼6‡¢io»Ñ|œ+#ôê”ZNÙ…—aE¥¬ËJdÏ'v©.¥ŸÌ*,æ8B§ rƒ¨ `O}2‘d­›Fç×QôÄŠÕ˜8A"'iÅC¨Úšl4¿C”¢™$È4RŸ]Y93M¸—ºpØi¢wÇscxÂs`€YÊ;mñí–¸£`¨Œ‰Li÷O° ~ý°Ù
+¼Ï€·(w¶4$¸r“êÖ'R#OáŠi—œ¨¥¨Hø"%/‹;&øUv¸:¨ƒqg„BŽ¥®S°B0œß" Èü“‚á‘Ç©Cå.g?Œ5^DŠ¯„DÏÍâ4Rà°MD¦Ž l~õKXJQW×Yf¹9ØÈÒ8&ð>ÒÒ«ÅdÅ N"]&AÅ÷{œ@5qFo±mH—OëØÐÓ**oä[ó^bùÞx0 ·!üRĉE˘Yw¦heu#s¼šÚ& ›‹
+>Ââ”!«&g€ùRR¥›Í®¹–¶öhv¦{Î!Të¶G{N)me]š\ö®ñTÓ…jGÝhܶ¨S"S2†Ú]¢Ð},$ðÔKÜxkð/,Fûôƒ˜†Qˆè­€à"¶\1”‹¬¼™µÝ¨ëbô¨{ïÙ7$;!*›…Ë)CØ»QÍÞôAG¦m¥$ÖMúÔÍ¥´„\èd×ÍiŠO¯9Z[ÐftÇŠG³ýmœµæ>Gö6:ÓË'ÊÒ
+¨‚6
+hÄ“‹§Õ\ Ç@s[Ý]Ùhnk<·T4›„R†Ú©ð÷f ʲQ™qŸæx3Ë<bÞŒJG”x¤¥•(nkH)ªQz{VVd÷6N%…úp'b•ŒŸ8q®xí‘+(f1#Á
+Xzà9:y³³ƒz=i}@{²'o;¯¦3.s±šÛrà¿M=Û울'
+˜]$e‘®œŠówIÎ,Fì ¾Íó)º‡šá( Òš³ë™‚;¥¤’¡3 $ÉÎgf[ë(â šM›lòS‘ö"'>¬eöJb|¶¥æX]³f4K i~¥9Xh6ëÈÐý$«B>dsBn_°—UtÎÂ×AŠÞ¤äíñUÉ*Cª:OSœFpu%J
+CóÀžXú!µðûÿôþÇÏ®¿¼8ùøæöÓ«ÏÎn¿>ùäæõ«¯OþåúúŤKÜ^Ư?{ïïRÛÇvŒihIõçéø?YI›y²íâŸMÛÉ4=ÙÖüO·íÐÞû» D ?Kéa‡]ýœƒù-‡pñì·Ïº ÷8³é¬Oé¬é¬é¬é¬é¬é¬é¬ÿ6è¬ù^Þ,¢«ë«“>µ‡-Ÿþ›*i}~ñìäç/®ÿãâ掜ÖÃ}ùæÔ߸ZXæ©ÒO¤¿/Ýl]m*IN ñ2b…áÿeT™Ð4Q‹‹Xë9;
+ãª&
+Ä\tàSƒ£ë€84ƒº¢Ø tœ)@Yö ï*4‡J¦´•©-G#…KçÍŒ#e©È§—(ÈÂñˆ=›[ÄÚ§ŵèA4 ÅRB¿ɤNYÕIãâ~;w|V„…Ç­
+¯Â34ÀÏW•J&Þ/¶[ZÿUñŸÚÂÌU¿¬&#†d0ëÜ9 ‰¥Âô +qºÿ£tÁz €³Q$² …*”À°È†@M²NÀ©£¤~¦HnözÿÖæWµÝU¨ÂÒòw•Û ^‹[!^ì¦Ëž¼÷óm›ž*©Å„#ž“jÂÜ8¸5ùÞñœ}UÍÝl,F·Ûä”'Ö½„ã³"åçŽÀÏ$ËAg;2K3±J Í–ÛJ¢/–EÖ¶ÙX•=9*â Wƒe~!F®òðÅÀ6ÐÀªÄ§‹³€6Bd‘¬ŸT¦Ôr±ndlI–0iŸvýÔ“‡gìé‘ëþÚ_ëI!øŒ{éTKÏX+mº¤ï¶×6ûèɼµ$.É° ÓæcÙúÍ &—å©JþÈ ’CCX«Ãì¸|Gd¨W&:`ý’2IåÀü’Û&%3 °ÀOAŽv 1ÌÉ”^|2ÕEÑÏ™˜õÁ&óŸ«ÀX
+#—¾çÈïÌØñ´žRœÒµÊ š
+ÁDc$NyÎ:W9û½xk©š½óm#É%ЙŒÃŠ­ômÍ!c—‹-R¬°ÐØÄ©¾!<; §€NÌå"gÆ ±XÌ]²jÌ‚(d7#ME ¶Ÿ;QU 1w-„ËÈnh/Îó¨Î\|‘´þt‰9ì* E?È
+BòlŒ6ŒŠmºz剋• –;ÍÍ]Ô÷çFƒL5„ÄÐìö8áPèKfv%ocÖ{Æ :Ûe]£ˆøˆéÚâ³.b¢>'Ø'Sç6%¨I8BÕʃµìa-ÁYþÀ#øÙvÚ˜E4{Úá˪,‡¨1Ñ®¬šÆav+ÌìIW8U`[˜äM¥Â(ïLâH¹?‚Ø®)N¢ìJ–K_‹Êâ^ Ó†NDcÁ
+XÖâF¯³<É`:7¾)ém §*
+PšwJåý€œ'2º ‰áÇXÒ*A†Ô‡*k`Þq?ÕñÚc¤“€±©Vd€8.¶²Å„i-¨8‹'Z©´
+à —ë¼M¤ëµè{êz‡9Ïcr`•zh.¨Ðä$8²a­M–¦ÉžzàÊÚW/jbkÎ[²Ù×19
+Q ¨3ŽéSÑ* Y ½of爆É5hâÉpðõÕ—;0íÈ®qŒº“Ÿ£~e—÷°²÷¹ßA¤7vê"¤ÚRðæÍ;é‹Ó¸Ð¦Io÷u¼_^k$õA¤‘ïwaY•ÓÍrêXdªìÇm³¶¸·šÝ£`sÃ2f­ÊQ¬2+q§AäAÞ”E};Îr
+‡D²/-Åyl1àtW#@wÙ„ë“«L3%O‚·
+F^­‡ÙO#JP£¤›ö`4‹Ì
+€AÐXr˦û,£šˆ˜ì³¬í9Q'Úqvç5¬aïËl”·¦}\IîAuBeR°Ò›œÉtºÜA‹ùÀzx T®:…xW„„ë®uJïÈë£ óN¶r0*t;Ï"½
+ü#Q:öcàƒúñ©í4; ´–|Ôp¡Õ
+wÏS7;Þ‡Ê/˜ÜÑìX×”t;F³áµt UŽÀ.ätç]= —µEäÆFôwµÛ‹ùÖð
+ XL½
+‘Á@ï˜ëÍ]­Úñ—4ÉX)›å{j5y-û>ßöãZëØÎ,RÄå'å‘ÊJ¾%¢·ºÃ+^uÑDÜVH¥Bp®±®¢°Û´£‹ÞêÖ80t¥'Ü2•Hæ^ÆñL:bþ/
+a#&]HЧ
+Øêvªª@ B
+#Gšg2ûÉöû6SÕ(r×
+vœa
+Šç·³\â
+D5Ütœ²’ò»BÖ€/ˆt•¥ªÃÿÒûcÁâ
+nûJõ¿%ò„~xH Úï@UîT›;ÍeT­`"¾uš‚ ŒüÈ%èf`“ÔF•Š8@#¡§<iE‰¬i±ôþèƒæ(ùh¬%²aÛí"#¤"q/Ø7!)V1¬ðQÒ›§t T4ûp¢eÛí9‰emM€<xNRuB#á1Q…%¶
+î'¦V0ÀqP«n1m~T}yݹ[mÏ5¬qäÝ©"=$€¨iÝXŸx:æ9è£X=I¤*ç0²\*‹ü‡Gpá™]ÄìѪF¹Åþ:îžÍ°ÀÓÉç¸e6ÛuF>;«àß&R ¦õ0ç¿nŽz
+
+T:ˆÍ%V“vmœ²~êšöR g£@…|í¬kbSä‰&—~pýèòñÙ[–Ëjj<{‹«#VI!‰¹?f]Æ­1521LØ´O“²9^º$PÄÒ R\æ›÷i“k2
+zÅéC…_¸Ìfz ûµûòA¹\*˜Äp#DLGU…x®qÑ€Ž»Çû²™ŽT/…Ñhü‹÷²ÄÝ?}ë…ræ÷Á4 #@õÞ:Ë|š•=ccø§½÷~Ø·¹ª$>‹3]7ÁA¯{£ßß[£sïsåúñï»1–YŒõè³û³¶aÍ?ÿ9áí8 TbŽ—ǸÂå½æÔk„$…½Lº 5öEçƒ#Ç+¡£ÏÎf˜8êõ°‘#ˆ'Û›ÍzÐi˜Éƒ´àöè³ûcíÞ™˜šjA;NÙÒG$9Z'%v´×¨ýÉF+ê1¬J¯l4Æ哲¬ÝƒÏn^8 >ŽzÝ5€øþÞwÇÞçàÚ:üýyW,>ëÁgŸ5:½ûü1/-.Õb9™Ëˆ"û¼HÊÇEI34PyŠ¸Ï›¸’&’MŽïO1/¢‘ãçC „i…Æ$æE•[<¯\¨†Ÿe¨Òƒê4Áá—aÌ# .˶ärŒLÉÔü[ó°×ïÌ
+OÎ7ÓÝGÿ¡Î(™îžÀá@8èe„ú—æc:.C:éºvëˆÁñ¦ð7GðÄs|?¢ó8\ÚÎ~
+~j¥Õ…¸ÎA:dÊfžÐµ|˜C
+ ‚:µ:Ë2âBžCÄ/N™-J¾ÆhÌ8Ÿ.KPU"3•Ön®ÌsІŭ>SL'ÀÏB}¼Üüj˜ ìx™2ˆß¶øÊ:Ýo­y ã…1"³b¦Ý°Æ•9·1bƒ9_ÌÍ:®tI ¦YâWhBˆÆÌÀÎàýKmÖÍJÁ@UÖ°‘›G¬S6ØË9¨1ç>ëÖA
+÷¸å}ËÌãj›ŠŠ0êTWÞ óؘâ¨"÷Sª”ýAÃ×Ä
+¤UWKËSpKu‚Ó•é'üÔ v âr´:ŸÅ# –Ï)ƒ0{b›îb¤ºœ@ŠÛUìfµîù¢¾¹8Pž;¯:ìõ^Þ,?³¬õ{™^¿º¸½½¸WaJ“ ž´‚–¶Ô0ç°Ô#›½Í …¥sÅPa:O(±‡Éô榽Fq1ÈàÒæ#ݤH¸ ˆÚj¾O+ZøjÒd–u·jKD»r rªº¬<Hyªý ]ÑM@Q¯û°iâiq€µQ¿ª¢$R:VE
+ Xš‡µ2Ò$g¹³ø‘žòÞYð(⫈”±yƒS²î™wL!Ù¡ó¸ ðÀäÄîD*Q@GÍ]ƒFXŒ@¾=¶@SlHçQ&„¸«¶§Ä)“ ª£5à—8j¤av(æ¥!;ÜÆýŽ·ÀJR©9èÖ¾&Ö’ù>íÞÉë^NR½Ï9Vç— O?
+Î @a¢ˆ×ú~'ˆÇ2êbc £&wói½à¢Oÿ†¹©Î‹™™/mnÏÞ4}ÈÈ5j¤Nâ= x]£"D'}
+ðWóº¨{ÖÚ^q ›wب›*V¸Òe€*æ@^28žy̦.ðâ’ZU%P^(Kiä
+[5Lâ©Lþ=&ŠtΫnL+SæãÝ€‘GÑ|‘NOóÕ“9ƒï¼®C>²'ÕO.“˜C«T†ã¥Â~éc*Ðö³êO 4ó¶®ôÛª`•ŠŽÔ9
+s ]žð±„¶/Q(’­Ôvªrb—"Õ¤ÂI%(%E â©HÉ×d=ª ¾œ–ÄO0©BB
+‘Mm
+„Zˆ@¾é?e9­·79†–½—^ìÝ;QRQ„óP]l¿ æÄKkȪ²¡…î‰Á@0ý–¼­ë´p$^Ò”¦‰»ÔÅ™"Fl¢F¼zj¦Æ
+”8Œº4IOÆG[«ysâvOŽ\Åér±Žû,‘jL]D=¼"½«%ï6ë%×}uˆ%œ,é«øÂ/Ó*ñ>dÙ–ÉÍÖ8m¸?=i­!úQ&¼bd`Õ©Ö0œÄp«§ÈÒŸ&¸]àóý•ÝY%$§SYÓ¢\Ú¥¯ë±ŒÚ ý
+9Áuê\èÀôPÈžZŒ!TdP&Sy·aAµƒKs¸@£¯p¨}Ø#œä9 ±jÄF©Z]Cƒ…³q… <ÉL(ˆ»O˜êÚY]!’IÆ!`²f”Ä/nS2®z¤Q•-¾%*冫žÄó¬Ç(ƒ?ÍÆþ”£ã ëºö#XeµRb}Õ‰^ÜœTâÃÝ
+«Hü³X'u‰o—<O˾›"T¬ÞuaŸœH^ÒïÙF,•J—º0Çå%SXr¬sê‚À˜œØ¼;—X·eðµU¦HTÇš©YjöÞö£–õšaÙ
+,š*O¥ÐÐ:ñ.òc-µËªçk(Š§+_̛ͯ(˜q `¶„ ¹6Où^––]¶ëNäeå  g^uQû»vÝO¸ ”raQ—šJb—}+Ö~pŽª
+‘̃\«Ú ^AVï;â¸äàÚ ÈCM~KŠQGҧ̈́g'R—⻋šìjTŠfœ¬ùEu”eW=,ºGeœôSIùIœJ—NCk±?qÎÃ|¿Œ¯&¸Ý,±Ù[ˆÊuÕ²N(,½öˆQo úTËËP2m!QAz°¤(¢h ’CöÀ0žQ•€+pyH^¯¹RJ“–& Ãix³$Ú". kŸÍáha*N¤ôHss¿ôl¸ž'7$zíRÊc¯QZ‚JwU·UáÕx¶Œ,a³ ÷:']s´FE5ïÃ0-$Ý Ë‚âjñ6ÇlöÌ<Ø¥7—íÇílšíiÁ‘”X=ÄÊë
+’ÂU!‰m+Gƒç9!¨ž«Âfòá̼̌jèç$Aq¹9RûwLMwFÅ>Ò&"žhÔQgnŒÙ§ 5Y× ÙHÈÏ–l¼R@ài‰N'‡e…“¼ãþ¸š¨øî\r”eå‹ïav”Š1¤#¡:ËX.âU;¯XoÁTòkË­b —÷í:ÁÈ%H´É$Œà¾§þ Åo­‰ž!ˆÉ[µ{ã_úWë”Ì
+KŸ’ÒÅ÷} ?2#^ÀÿLNM€":9A5‡Ž+¨bʺÚ'‰d!ÖªrOõ‚ÏA1C#)*ºÜí³„‘š7ó,ò‰d‰ÞË>:&ßkÚË]¹1)³&H™ÃÙG“B×D; +Œ;öÄt°C/ãìYÂoœ¾[C}ÌËNf¡-~gùŒ{²°æ«ù^GD‡XjQ‚œˠ.'kH$ -i_`K“Ž°²•¹‹‰G–,x×Æ:Úp0e(Mì»áH¹ù ŒÀee€°IwkC´ež”Œ8J*<*—]ƒŽIB%Ë4°©uÐf€ôd
+ AW³Ì˜}á%§c§”¸éüaÇ¥)Ý)¶+Q$È$’—`Þ¹‰‡OÄEŸvó(Rø0qÁ™ÇL ×Ådš×ì+R<y)JÝVóÍõƒšeýAÄæ
+õæ´VX×ÔGfg—(¢¥íË"åî®
+JÔ‘˜_I¶ˆ¿ë¹élÉ0‡¢o#!Á}\Š¡ßÖu›pŽË5ÚJæ—¨Ò‚ùÂÊ
+lò‚çuv„E7uB'7"öPb·8ô“@Ç\ªs£VIxRJRéIG}
+1šŠ–Èü§ç Ýe `
+@
+LhB²B‘w"wˆ
+K8;=—æ<€&­ ¥LÚì
+ì“y¬_瘠ÈO¼>7z©ûa0EÊdIRÀÔ1•Bòs±NŠžXaÜœÍÒ¾{èrn”\¿—·_ª
+Û£>Û*ÍpÔ ­‹]°?DÛ*†^þ;E*àd©@¿&̓QCKñâCj¿ýcÊö”ªÑ³U FpÓç Àºg’·Ã\YëXu¼&ȺîödBÞŽGØ80 Ì€o”Öáv.DqvÀà§ó4‚úH”ßQ:¹Æ"¢9h
+ºÆÆUìaÎíÏÓàð\ÌÇÄn¹&OuY‘>¿"wLCr_‘Ol¬„>W¯^ÕrÿºÖ€lL…ÕÖ‘-4?È.§DÒ¼H@å<¢FbPÕºSœpJJ€ÅÉÊ#sš·_ØK=ÖÿÇË
+TÈqI$¹P¬@ŠI+XN‹ƒ½fi䩆Èù¬³¦ùÏs  ùéP0”¾+õ³nÒ‚>•:¨„—½²FëjH-uøt3HŒWõj Á)´`’ЯqŒO&$ÄõAþTÝ.NœÉ0—3Bk5¢ò]ÉÅ´H:ŠÛ£ÒV¸šN“/Ñ3ª/ñÈý8öøŠzÀš®v¨>gõÈšm.Q²Ug(ý 16ã[ŒbæŒê
+W ÕqÕ3¯î‚?K`*¬JRƒS!ÀGíRÒŠ-{fõÒ1Êp › ”¸Dy!­iÐÊ|FS
+Ý#¹>töŒ·#ÍGVùRLýPÖ2è>fù[[.Àók%ž"ŽðˆƒàÓÌÆ_úξ#8Üw'¡‡ …kÉX”ÙQJ˜G‰ ‹j·fª8ø°¬ÜU+JÚeÎbÿ$úb
+þ39‚ N7·®„¢Wå
+vÁFpøÉRŸ¥Øx±—næýÈôjÐ #yÖ¥¶XFì"";‰ð^ù¡Ò«)Š<„Ƨ©¥›Ýû§½I3àÊr,´ð)IУÓLŠC‡²™d›"ƒê Ë;AÒÓØçæû dЛ9ŠÓ*^£èjqÁq¢]ÈijyÄyéòúÐÛ¨”òÑÆ"~(Ú%ÖÇ0ÌÒÖˆÓ0±¡ÏIßäÉâ!ǘ‡Ý3¬•WÂ3…µ™£’I¡ãöA‰”"õX¢¿ÓkZèE-™>GP`ñYK@0+Úm5Á³-† \3ÿd*®n+?ƒ‚V¸J\„Js+ê‡4Å!yÇÝC E¢¯#ð"#òD’1[B3-QÞ‰o?'Û(\꿵qc%jÐ2[¼P.»†ù&}^çÔæ¡j]„i„j´¢8Ò6ÏßÜŒP§ÍæìŶ•ÒHûÍŠ•Cà<Þ«d]ÊУFz]ãZCÍ ·ló£†z'«x×å‹xÒ0­t¥„[ BcAKÈäl—Å Ëœ±4îsD³+› à­œ½ÄqV·¹²ÛúnXeUŸF%‹ «5(å•u·‹Ž£ Âà! ñ¹xbɹ ËÜ:¢ Âg£R¶…rJêá’Řòa…Q ÂHÀDš8‚K
+kgÕ¥“Hz.aùW–ÂWcö‡Æƒ fá_HW¬Ì®óÕ:O*BÃPF–‡ÑÚ@2_&[z†Í=3ß'@’vEgž­QH?¬¡ÚÌ$°š&Þ[¯xw{Úà"g³
+fÕ:©r~ÉÉäBMìåo)°àt ¶f—,\qP®%˜³35yy¯=œžmQi}hK¢‘¤x´ê £"y…°£’üôÛèdeä²²ŠQÕ,0s‰´Àëi¸ÆïžG˜â6.K>ë÷lµQ OâMã”I‡vq)oÏ)ŽÚ™+£ÛaÎô,öàN¾ižï[ºpA7cÅ'%Ž™$ÿm< †æz¬ehƤÏ"Ü×ÃlÜ£x:šÊbª/B<Ž4¬%òN8W f]ËÁB˜!äÈn)Ž #K&iᯕUÊòÚƒ
+ÜBîqxp Ŭfø“ F0LU„÷Ö“ˆ÷‡WØ âä
+´ÁZœ»g„Gð/Ò#2åí iϺÐÁÕÎÀ*™c0ÍÚó€.]Ìž>{æží±…†ÇV©¶PÆj‹âÙÔ@Ó±x_Ù’¦tf< ÔØ9òT­²—A@÷»ØžD‘¯¡DEÁ²>`ãEÎÁR‡Ç—o˜´/ŠcÂ9Ÿ¸¨¡Á˜…ÇБl0ˆ²‘¸3*V j!ùÙ:
+Ûä
+P»/Tô€Sœ%ôx44òÚ7½Ð ¯k„Tí©=hÁÉ Sb0vÝK¡‡Å¬z(´xg‘Žø(^ø2dÈ»1è¤så¢/Fºk¤*
+±HÀð›0wF9)C~$ ¸Ê{F½h¤Z×Q=°¸H ÿj}Š°®Ü 
+Ä9Þܲ‡zvlÊÔCï›ÚÅ3g$)Í9DñÃÅÓqpêÚïZèÄ¡¨fîÁóo'¶­Î;£±·4NãöÅ\ÆR+¦<!HÁ%R{4¿té;æx õªíèK?ñD÷ovYMH:™HOa¢‹†º`±ëw¢
+è)a°†C]Cƒ
+ù}E|S#˺©XŸ5Ž±Îfõ¥lzÐöÕZ« ¤©’,‹ÊÄc,&•t* Té…Ä–¯cI4cØ$ŒR{ŸUÖö­ø-³~¬Î2D5-%Ê5j“ P® %Ã7·7hqƒïgr o†\wÙ,0wÛ†ÞéèVË<çæ!lÜu
+±hjÞ,=.y”¾‚±Ä[Ž'‚±ÕE›AT²ø-y§pPllÌ r/»Mº?±Ná1cr-±êÒƒv %&©Ì.šF 5•úâæ\°Ô
+‘]œdלgîxFÒ–½ˆz1^ìhd\ňsZÂÜVŸ1\䜗thjÅaÄ­ÒÌ" Ý͵Ðk˜º,8SY(|!KÞƒ¸©ƒ%ÁÏ"aïÖý]Vè8V<QD¥Ç1eá´löfaS«ÈŸzÒŪÆÕ¯eÚëWÅ”}NZq`”¡ÑAÙ$„퀕"Ž³“‘á9œØ¤æý
+:ÉF
+ј$š1H·(õ«ãÜ̧ˆ±—d.€YzïDk¹fr»¼4°Ž;*qdÌñuݵ›ÈZÜ9”Æ°DF¡Õm²&b•dœBûÄfZ™¡Qƒ²º=mäHB¶×²ÐÄÝÈtªÑTZí&´@tF9ƒuÅ2
+4¶¾Ãÿ`X
+å”÷¼ ϸ-ðÚÎìXåÆ“ám&Ôæ0€žVÞJH+m–›ʚ 4Àµ¸Ó/ýÔ¢¯à8Šx·F-JŠ—V@ó†žMÙ¥–mC3AÆ”«,59Ôøœ‚%ULÔ:9ðØPžÀõ!õÃ
+옶`«g4Ÿ¥ô¶¥X–±LfYr™©Ô<Ê:ùÔxË%HdÔåÚ;($žTƒYƒ.qÎÌ }Ç©Ë÷¤!±ÊDŽI²B¹Šä 6ƒÄ:Q¶É> n-½!Z§²ÝØY/K[û¹á¨rH×x>pPסˆµØ–"ªVþ,³•Ë)
+oã½w ëÔÎ5öû\·ñðX3-”µµRÀ±»-šIòÆ«å{OȪ¿l/î‹Û?¼¸xõÞGÿ|uýWü—Í°yÿã+D.>úå6ú“¿ï£7£ç›‹øëGO®/_bßþüù‹mîðùmñ=¿:ÑÔúGý‘?ò÷}é‹Û³óßß/½Á/}röêùùáÏÜ\ÿþâO~¥ðŸ_|zãÏnzÛD\ß~~qŽEð ÔÇ<'ß*«¸£GºŠ¶)?úéÅïNþá体÷úAœèNø³'ÿðÞÉGŸÝÜ>ð0Ÿ¼¸¸zö§ÿOŽœßÿÞßG¼ÿ[ü'ÆþäúêÙëç·ß2îÃ/þ¯/ô-&
+_ßçéÓ÷Àé•fï››>Qž2Èór¨¾Yá€èæ”;2Õã.øõÙ·«oÞ_&ùx™Œ±`ηGød;ŸNÞÿÕ«‹Ÿ}sqõé³gƒkçO<†ÎíúÓ“ŸýîwÛù÷²?ƒÿþO/^¼~u{sv{}óáÙË—Ûa¦CsûÜ…µ÷úøè_žß¾øÎÏoüçíÍëg'ÿãä“‹o.^D~úüÕËgпâû6®Ï/¶ëãý }é§/o¿þàáåµ+¸®ERª®šé·ZB¯¾>{vñäúÅõ ~¾ôØ—z'/_¡½NcÄ7ß\¿øæâ㫯ôº¶#òŸ®n·Ž^ßüîì|?³ögô_>¾üòùviâoíîß~Ëö°·úÓo.n^9LžÝxõúòé󯾾}u´ÜŸ_}óüÕóm¼ÿxqÍOOãðþ×¾rô >ó/Î^F?ì<žë?Ÿ¿úÅõ³‹Ã?m¿»]ˆñ…|wðÿøâúÕ+S?ྞœ½ääÅ ñgïô}Áuv¿¼¹xuq³Ý­/¯ÇóêW/Ïn[óQ“ïÓßýîÕÅ­G²8¥{M9ßë2×ûMåþßo*÷¿˜øÔ_ßþæ~çéþ×î7¥~/ß{ÂRîþÞ¯ï?_ºû™ÿïƒïÚé§ÈNÇ7^`iýôù ¿†ôêÝ?üúh\lÝÞúÅÕ«ç·8úmþé³ëWœ”Ó|·9~ Þýß<Ø˯uŽêßï¿ýZV«Ï ¯ÖÑÌݳjÛžý§«£¿¼<»9»|µÏÒ?]=¿}~öâù/ž ç|;NoÎ>Û6òË Š‡;üÆy°Ï°Ðoÿù‚óñëŸ< o}òÛOÿ¿ÛÁõïУ~OÉ®¥J¥
+òsyÜ\ šþ(OLøRÄ
+‡yÙVq;^Äù;|¸±9?»¹~y}×ñâp¦?~öï›azi)ìƒ_½|õ|³·Å}Øúd[…Û"9q}þûÿxþêMÄ7w´þ’>ÓŸëÿ™ÞÎç¸ëÇÝù¸›§TÈ•Ñû¼‚ñ&—šÈt§bm')eÂAümÇ\~<áO¸wî„›O¸õ WÚÊð×\'òå4ƒmûø„[¨'‘ê·äé[O¸í“ýñ{<äÞ¹Cî Xx<äþF¹²lîìã9÷v)¾?ïüR{?žSò±ºóGC(?ð"û[„!üÛbÿßúå„œSz'¼åÇ#ò¿ß*û[<"aÆMu…층38å j·H­^p&„@2¤QÊ딑ZH­Ç¢’Ç¢’G Ö#Pë¨õÔzjý®Ê;ó~tUþû­²¿UWe^ÖNÁ“<Í Aó´L™Õ%ešÐlø81U$¾É£oòè›<ú&¾É£oòè›<ú&?¨oò˜i~ôM}“GßäÑ7y¬p'|“Ç
+÷GçäÑ9ytN“¯sòÓ³W__àA`7¿ Êß0¼ñ¿Àoú
+´­X7è¸Ïcä[¿å ãžÐñrÜqáëß Vm³eÞ¦æˆÎg×Ï—Þ÷üÞñÖÅo~²MŶW瓃)Y[ÊåxÀzO3­­nûÖ-‡[zÍkžsónñ<”¥ w‰í³X–âh~7ÛÌýNÃ6­“d.¶mÉîÖeiÇÌÌ9æ·ìkSë~׃~çVkÓÚoëvÝܽl(Ã.,¤KrÇs{¨ãÇ"çlîXE\¹uó;¼­ÆÙ©»Z°¶ñ›Ÿä”¶ÎÖ8¶óŸçMmrqÖeæ³—)M8ia«b±r¸›?z\¶ wWß:¬%ž{jE,Q©´lרå£u$<÷ÁYð“yòcÏýp>·»€ßIÛâéxmÚ¶«ß“9aaª't‹?MjqÇ26X;Ü`ÛÎá•û²&«›h­ïã÷¿”ÛÊâãéê~±
+æ´ô±ú·Ë€{ÎX…x7Ëä‡÷ºhr}0ÞE'Q×9v°úy|烧ßÎÔE®Ô²¹â|éeª~þÜx“ï§`œ³ýðhkœà‡×mŽ–®iˆƒ%oÁ›fŠ‰ÌAkVošÚÆ4Tœ„9Ç¡U*n1>ífe4=?L¬¡Ï&H=|MÛnNöçv/|ºµ/}ÁXJjK=ÒåÇj,Üv¸^S¼ÿr¸®J­Z>e.‰ÚÒ´.Gìçöäu a°ãÍ$Ú΄#>ìy3½,ÙNÄÎû¥çºêäžÖL;ÊÝlÿ†]ÓÖð+÷3è7ØûU¾-†Î“i›Íà´­:_Û–ùqÔø‰ÚîÞ=OX ¥Æµ0M‰ ~ëF³<ñ—ÚvS¦VcG,ÞcPúÅÞðò&ì²VÆ,gߺ›13sÈ55ZVÛ%Y¦£[fŠó¬ÞºœåŠ1ÕƒuQËvuðÃ˪iÞÍæÍ°¡A6ìË÷yÕ|{cÉ5쌃ÎcoL‹&”çõv¢­Åó¬>îÈ»yOö¡kêKci‡ó¼7+G=ÕíšÐ±¶܆½&žÌû+—à±­þ“Šý¼Í² †:ÅêÈeR×ë:)EÙVÉVm<§¼Ž“2ÂvéðÞŽŒ_àt·IÖâÖܶ[æžË¬Ž–¼j5 ³Û«áÀgI‡rÃú˜±î zZØõ'_™òôùÕÅÙÍfó˜’ÿ4.åÏ»¯cÀ  g/Þ¼ÛûŸÿö!–ï9ÄòfCü®nïݾÿξ¹x…ãíÅÍÕGè¿ÿzÐÛ¿¼¼û vòÙõ‹ßŸüôúö{utÿ[º^ߧC~ÂJºm¼×¯_"ºöÙW8зƒŽsÙì®”y[‚Ó‘ç<,üy\ćP [l.G†ø[$m‰kýžço‹ÙÅòÇËf>ôÞ.ÎŽyÀQPÂã‹nßNÉŽO<ïú$e]äʧ²Ùz4ŶWw,b=Åõ°Ä°3¢âðJñá<L›Ï £iÙ,2yæ›mzäIû'. ù<.zÅz8² K«ZUs+
+ À9íá;ˆÊõÀtÆóç|`3¾¿m¼?¼:?CˆN‹ùä«÷ÞÇÅ1¼6ô<©uÓ†URÔ¸Œ;†cPã¼[ðÉÕ8 MÿÞfküFÛ­úý7ê0É~£ {úà7Æ·öýë²i?ûdÄ×"Œ¶Ö#nïýò¥bsüKDçž>u{‹<€Œ¸{·*é8–~”P¿ûcïßþ{`”9éO_üáòËëèæÿB$íõÅÉ'Ïožm¿úäÅõküÿÏ·ý|æÅÍþÀø·m¼z…\¿Â´|à~·‘öúí£óLýôúü51~zv{†’¸øwVÃ…š·Ù€í§¶•çbØ“¹øÏÛ“Ÿ={~{öåó®¡Ü>ÜBuý~qqûúåÉÓ³«¯^Ÿ}uqòÙõË×/ý… õzñø“³«oÎ^}ñüúÔftngn|j=9»¹ýòúìæÙÉ9ùrò%Bcêð[?¦¿—ƒ¿ßÞœ]½zyvsquþ‡“¯nž?;y5~2í½ž¼<{yq³ýñòõ‹ƒrÀÍkGBáÛF•OnT…ùŸüŠAG~vÛR´}ôÓ×·/_ßž|~öj»â¬sòùÅ«ë¯÷‘ä~ô_\¼úú;¾‘ŽÞê³xQÏ·OÝ^œ°æÜ`©oýðﯮϽ î+]²øèûÿú‹‹gÏ__üà¿Ý˜yhuüünñ«mžU‡z‚ ‚:½»$c‘m³ws0il{öòù‡wF}öâù«±8\–ùòúöΧ. fg£ÔáåÙ3¿ÁÀ O>~}{=&öâ ßí¾6¿sóŸ<X0ýúO¹M®jYÿïx=ŬÿyùâjûÀ)þÏÕ˜Õ‡ÿþÍÙîêþùö/ã¥||³]I:2ŽFpyq{öl;YÞ~
+?ï° ˜œsŽÆäœsN‹œÎœ™ß³’mpÀ6fÁ©;÷
+°Ü-µZ¤Vó¬Çñ,CRG¿ÛdMÖßø˜£ø_rÁ²àß¼X$‰=öËâ¯ÿcð²]OÿŸPÄ@ª‡Ûy:ÁC†ÿÊ1±»¼¢®{zÑO§×i²¹4 ¿¯—U=­å—C2Ú=ÖÙpþË7’¿_Äærÿgço¾áüEæä¼’Ça5y<^׿lDÝŠ¸£š®À6ÌÍ×ây½$ʵŠðáäþKFö<€‰¦ŠéÿrEû=mó¥Î3¢„l§3îKž×³aŠWòN³—m!ï°šÞ&·‡Éx[™oÛ  cD«,°Òt»>þ™ ùß?çù¼@uÜMÇoXoœ‰Hñ? +‡ó€i¼ŸRóî`g¨Èd¢òm ƒ¡r体bݹ_+øçðŸùùôNDŠóÂáv…鈮óÿ^Ù¬¹‰¦Kð"¸9èí¥¹ZOW¥óa±ÞΩ»Ü`5-a8LZ_׬.o[Øôø5™ïݼ±õ{àj² Vo“ËüŠÀà+0PÉìðóлÉ|ÆÚ“8`­Èê|›_±Ã4w˜Ž·ÐпÏùVï£-¼ðœÆ˜-™k0¦±R²Äê4YL†$ÆoÛí=ÀÙ ïÏOï°ÌŒÓÛœpwÿ"¦Îd 'ýBiýßù,-ò6U ˆ5Ï[3½æÍ?‡‰é—<ƒnpÌJnS‚ÅÇÛíýšÛy›O[‰otžÃ»Iç°Ëgqì—Íú8ëw#­“\ú© 9cÌþÇîÜyÎ&éýâð‡fVL´K”ªà>=¬Üþg¼Ÿ‘»)OQ}æ¼ÃWŠIÁ
+ûSmô,¹ÀË”vä;dDÛÜ å\Œ)çØ¡¢Ôú®=ÄU°M•%žšÅ¡DŽS¹Â”ÈÛ¬ýAdÓ€A=ÛŸhú‰xì9!šH˜çÓKïœxE"½Én‹’›ÕDÚD«OˆM
+ÿS '¯¾ &O·é?2ž*Ï€4
+9¤³~HüÞ?gÀ0ÕÙøy³¾·•ûàì‡àIºB÷ÖMpK¬\ {콂ɚŒµ;•heVÅf…öGcZžz,´ &T‡–.ë¹F±ofˆœÚ냕h¨EÀg.cø3ÕæÝ–7<€§‹.WvÚˆ¯ƒ)Ÿ>‘ÏY#§ðÔ­Oäð‚Ë®¼MÿùǼÉd}èzvSÚg|Ѫ!²¯—³« uïz!6¿„݉ÎE|…Ÿ9»Ð;Ü»®µÎéMÞŸ¾¤Š‰‰Åp‹fÛŠ˜É}Ìè-w±ô,­–¡±mdkmèÄí6_öèyš¶ê7Þ>\òr`΢ղÒǶE2j=õ‘¸zõMrlaìÙ±X>âN)9—ÿ<ü¢ÐZˆÂ<Ý!òYêA°¦ðì9Ž áÌöSNÍ•V×—#ÚBë„è|^Áãļ‚ÔŠÕôá7®9x,ÿ¸šÆ­>rÑ.=ð‘ò6¢B䪾Q°¢´é'êKW,:ï«}–$¢ o»ˆ6Q= º¬ß„èËòbh ˆ±—øAL£1/×AIJ+•ëÅ=G슫±ßê.Ä©
+d—A1@ÜÖáñDòvÄ‹;Rˆ¯Ž ÿt
+f ªšn$Ê‘p#¸D"{«‰ùtï*†HBuV"xéAR豇¤‹G’5Þ¢HnŒ‘BX¯EJ*W)O¢k¤šÎ;º¥UG·9Ò:Hg\,½VÝ ÊÛ2ª9 ȤQ©"³ÖQ‰,f¡²:Œ¯ÈFeI!;_û„Š¦$rš6OÈÕ`KÉ‘ôø&Wcy¹*¦PÉ5«V]®‡-rãÉ-ù±_n·æw2Tîüñeäž‚Z#÷ûö=yH=È#çöI_Uªr|uÈÓýôVžë¥Šòâ,ïW¶å½¼~mÔäm €Ó‹nåòaÊ';€yáOÛäë:
+•#¼Rhד¦ÂXu¥V{Û£pªìz…g7¾(#ÿB©ütX!ST¤ª\‘kn‚ŠR¯ìPÔ~‚FE[¡U+úÞ£\1.ÏŠù²ºSüز?2T±¯ÄWŠ‹*ºTÊ‹á…Rmˆ/•úAr¥´ø³?J'Rß)½½áIÊe³ª•){Ô¨Ìë›NeÅp *›&_RÙ37JʱOÑU.òÙ•r3ºÜ”ÇkÒ„"þ[P†¢ªV!‡êoêj-Œ÷¨ëÕ£‚*„Æ,‹*š\•Wh>Ô¢U·)‚¶å×:ØnNèìgíB†£z\Lw*d6v¨Ô›YYeRíŽ*‡[îWùJÖ®*²Žjd¨*éjdUùÖf¯ª© AU§œœ¨Æ–µCµœ;»ª=Ö4©nFmS­º4jãÜÜR;}“Ú_ö÷Ô±ìÁ¡N«3u©
+«›kÍQ=¸­òê…«­Wïré¡úº‰„üS‡‚ˆÆ´ð¶4.¯Ë§ þx®šîoiò@*jjûªJÓ맚Yæ˜Ólc—æËʵêØ|ª5Çõ%­;— iËI›<amÉ´™i[™xS;: Yí:TX´§­Ç©C±“^gRu:W;éÂ)ÇF—²+纲ê0Öµó¸K=ÝfÝïꮇaW¯Õ.ûz›ç0ÔûSò‰Yú‚Ûê›ùÖY?–_PýOÞcÒ_å· 5h†Š˜Á†§ †€ñÐ5$.øÚPœ^†v¿d7LGö„a7Ù4ò}mc4¢!½Ñí3FÑ©iÌncÃÙ³G½fÞ¸1UVÆÛ²c1écݼɥšlM‘Õ`1eš¦©‘ (Mãl=eÚfö[³<c˜•ÊÄì™)œæø-50}W»¹SÏ Ì€æSi0±h4Ñ€Å^Wl,aç·d®%…¥±Äš–IÙî´ì^+šÖäd¨ÕZК­ÁªveM-ykýà¶Y'ÖøÁºO•6ô´ŽÚlAµÞ:$¶¶l|жµt¦¤ ‚nÛ)§PÛµXuow9´#{Ü9ªÛKîXÆÞ÷*#öŸÜÒã7‹ê0_ãzG0àV92m½ÜÑÒ)¯Žy[yq\ìÊ‹S¿Ñ]Þ¦[îLÆ㨳n.jSãÒâ<tn—N »<ÖQÊ…ÇÌUW­Rº&[ÍÖuò¶Un]Ïár{µ3è³ä Ûr7B¶{v>èÜ—Ô-ùbÓH¥Žžl<æðtBþ‚güxňÍk›gKÞ˜ªqô–«€w4W‚õî |ºu»ìóárȬpÒמ¯Ž¾u-ˆÉP¿2»=øñ$îÇ0õÅ_Ãú9ÿ¬™Qû¯cK3`Ñ(œHüg(­¦éÀØÓÓN‹Î(h ·ãÁn¦ Æ«ipØPfƒÇŒÓ2$³çP›ôC…¬.vò`öCÇõQ6ã›p¨pÇ\)<Æ Xø|{#æbÒ‰ºíêHUƒ"‘ÙnsŒ"ƒþ&jw×ÑĬ½Œ6—ÍEôG=^ÅÔÍOÌ[¾íbÙ£åÄ’ŠØñ<ÕËи© ³Ç£¶\(^½^3ñÅ$ÙÀ”­Û s ,S4™°~sÅŽ£|5aV…Ö‰˜G§MÔ{H4±ÖíÚ¸ºùsÁýæ•/Ì7u|R¼^’ˆOL:žA2­-
+QW¢[h:…Â.Ðʦ<î/b‹­Ø•ß ÅSb£.ÙVcE)îÝJÃëàZFú‹[Ùƒäå¢WƒÊÐòBïÒV4æ’¥¶ÿ¸+ 9\ÙꙪy®ªW“æʤ:(j5DÞÓ×<µp VòiŠµåu1©ë¦ E=ÖÍúêj¤\?×ü›†s´6ò«P¾±P%~šÚXÕ!C›Ñå¢ÞìxPyó¼%Z®Tÿ§UÔkü­å&?mëGJwë×'í~×æé ãõ¢ã[åšÁwèìÚ\׺¸èºYûrÐ &¡ž68EzqtÝéõ&ÇPé›T2´ï/ø&ýz¹šëj[÷À1v)E¤³¬ÝºúÐT¯'†iÕ=œ¶Vú‘Ö‘¾â{ëf4è^§cezÒ‡#æ¸)UÇ·t©<ñWJ¥IcÖ(MκIeê)\2tZ½X»ÓC6=ž¹ ËŸYyj9Ïv®vîÈXœóR°›oãþÊž:MÅfë¶Ø,"ö¥ÝfO/‹UÕp¹¹•½¼÷¯Jæ]cµÝœÏkGOë_—ë¾îz_ÈëóÇUš¦ª=ýîç¸L7^Õv¶i`Q÷æòso‰²gÛ¾Yç;ykÚEÕÝn`Ã3{µÆ«Þ'ÔÖÞ~j¶·ézȤìÍÃj
+m–¢âXªGǃÉÈГgržšé±üŒØMósÄÔoœ‡:wò¢EÞÿ/ôð{mŒó(äèŒÈcoÙ{¹ç\Žãý}Ånu0NÄð
+‹å‚ý`KƒEñLºHÀp¼D.Y›Y†Fü9ä|o”¹Æ–©r.pÌ«À
+M1“I½|B•›µ>7†£>w'yÅ~ú1GÇh
+répJº®¦«¼‡t
+Å6Z—‘bÍÆ,g±öyÌ<¨pDß9C,.ø`@@!šÈPËDžvŸõ!<@}
+4Y²yÜ‘Àlm[°nË¢…^)8Í`À?û) ˆ™|tÀ+ÆœÐ(–yt OwÀª V`£¹ƒø͉İ!Ajè©;\×Ï4ZÃ~ôØÂœ=%Æcµ2æšÔË6 Ek«é5ZRNóÑšÍføïmxgÖI´FáÛƒD$ײØt°¡y¶¦sê>aí¶¨&f=رVRø›ä AÈ241´ê1G+ƒGÎçUÝáË7ÃÄ yœë³ LžÎ ¼.)ÙgÒýN'rb!(`xéƒ7 Žm­1KÆé’–5 'äš"þÚU­e®·gRrf’A÷ûÄ·Îü­äØÉ´Žrét«xç¸FuÔÆW®J'1±tØü|6X€úò?:B’ãAŒ\2:ÌX n G8\©Y–þqɵON¨§zÚe£ÅA,ÇÅšÌðøl×&„'Ï$c[W°IÃv]s@…¦jŠ §2ôb^Ä’tP•D„Ʋð5Ͻ嶛‚O†kò(Ÿx½z¿£À¡ˆ?}9,âëËÚ¥¥±[²ié=*ÿܧڕ\ÑBöÊ냙NæŽtÙrÌž¢9]ò:œí¢ÕQ3¯ƒœ°P§\ÑZþ°Œ4jé1žð”[24 ·$zr†CÁ†«\¾˜ó›71ÝœTwÄÙŽIÁ¬êªs@<ÕÑÊö¨c¶+S@ü©îÊJgŠfÛÕ=0ˆi~>ŒÔܪb<wªYY*C§ÂQõ€¥*8>Ô"+b@æîç`I9'œ§ÔìÃç–¦a¼­J4yHjÓ  b¹ vK©]vâ)Å[—gphlRòٔ$œZâ)ËR·'›×ò4¶ÍXLp®ºôút{Âk#Ò˜˜Ý¥T¾b êQ»
+Q&lZå nMÆsø)XÜ´Ì'¾°Õ ‰‡¿ƒ‡ýÙ’ø ~A¡'^$¾ºª9[> o?Äáo1T4`ÄÝN#V± ;Çl
+&9`Ø)HüÍO
+–9ëF|
+h¹Ý•ÙvÎHÛG”[ÝöiP€“)`ÿ/y.Ý#–Fm˜DP¶‡FÀP+ªã+};n^‡‚>j®Øtbù"Àö&œv„cÎA)E µ+`ð Gò<ÅœŒŽ9ªÉçô(¥¶À³ í¶õÏè¨w3ÏÆÁ€fz|4 y±dÛ½
+<±¿l¨wç¡f?`Pš»÷4—‰•K0–ö®@9ø·6-ª ÓÎîhf?¨,îÍmR²ä²“#í#sc¶ÎÌK|ÕC|úPr8¼sVßfДmòz`Ú—ôšõÁHË ¶±úÁ#`ñÍv[ T"Híí
+aÃ.F«ÉÙ˜—àÙ©#^bˆjn¶9d¹ñ
+UŒOßK ~®S"ùLÏä51‰é42Ô—×Û»ÑZM…°˜%œ~€ÍQQ*Š-r¤¾í 0HJÇ£}`"FÒ- Ç0CÍùˆ’½õn¢‰ZÔí­,½ŽQl³6Š` ]%­qo¨=Ì3à…ÕáM$:6áµ½EÅbÛ¨¯™˜£-¯§‚=‡ZÒH)3EcêA,›t¸‰sݹ"¨ 3ÄÙG°~í
+à"t¼4ŸÕƒpm»tfÛÖi0[˜a³×Àܳ
+áÃhåd¬ÔÇî)põ…öðf¶ØD·F½¹Ñ9€G·{9åð ˜}¸•ç+ÄÍ=,› ˜ISÍV®ñ„u¡Á}ÑŠü>¡M ü5³+ˆGC1ztbéñ}’?Û’Ц_²Ô„eÓò8–ì0ÜJm<b¹Áœï'8¢3X [‡ïxm`åØG`†= °vFK:—îš{pß»Š ìÝ7Š~\“ÞE½«^Ac¥|G \šóeÄë8èµH™Aàm`{xQwU‚ÿ©HÀhÒòbTI,îF ûóSl¢M¬žÐ\&}(H¬\bY.†1`áÛ‚Xª¹˜M»¨ñ‚°ª33è2g£‡UQÇôœÄV*ÁöwO”ñÁ÷.±
+[
+e1“˜Ò€É.Ü52!>Îꮺç1Ç-<ài3|r¢ÉNãÔ”ØÆ~~J,=+_±ŒFƒÃmÐ4¹oÝŽw„i”¸ªÒÈsæ¬ñgã5ÇgÁRfìY1ƒ|gˆ–uC !§;+SgnWKº› pÖ5` Lk¾Â`rÃGÛò˜ý±™Þa²Rpcˆ¸ÎI: –M(‡–[¨Ž
+×5{ âíÉ̲–`6.:·o ¯Âý =w^ìÚ½ŽqÔ¡V¼ÖfÖõ$/Wxl
+^ûF<¢ž×Ø›q.b¡æjŽW€ÏLv<µ^bR‹6±¥SµæH¯‡àºË¬‡–&å5% b.d(±_u'<ZŠ}ùËíÀ º\'«·‚Mãã ¦[›§î€=1OtéÄ#<I4©‚_Å¡nß±w“„Ø"(Vê¸k£”ÇnQb[² ,µÃ÷Ñ<П5mlã)…q \õV›Ñ7HiH-ËcN-nrlæÖ iI=¯)(*S´«G+‡ÜÈ:i7L—Ò8¦ä†~ øû.ÛŽÎĺ·· tlÒšWÀj ¥’íáqDÈÈÇò ücr¨8ap#®pË©00}Â@DgO1¢K÷設¬¹B~
+¸ê¥™¬ÔºG­à7—+,ƒ,,ÌVWã´ˆ*Gsnö£ñ ¦•t–{lqèë‰Ðoüšõ1Œ×’7ÓqÍv´zöá
+GŸá{u§T—QºüÏï³èø²õ@¯% Þo‡miƒ-Éâ
+ðº¯ý•:=Q”Ûõ=ÛšÿÆ ˜ÁäûÃtu>ìæØá¯=yC¹àõ?
+v/½ÇˆKQh0$¶=˜³èÝaA£__þÜö›=à?“dŽ˜ž×Ç·u}…¼6êï‚èm2Üx¿‘íksnþ}Í  óRÔ.¦ïõ%®õí¸ì8˜‘»É.ÎúpáKâ|z¡ÄD¯ç☠5FU¸×âq­èë1>'PíÅ¥PÂ5;¾Îk«Ûn²¯·RÆ
+é&ľ¡$÷“t@Ín/WÓôp»OâýŠ–ô~ó–TdÜÍâ†éÔˆd×U„ Èz‹ðîÖû31dæ/¼YcúsäÖ‡³Å¬ÏëôáÕÕ?Ù²ÏþxP~|"øíáÚ5†-¼ÉMJQ Ž±…¥z<µéƒ×
+ÑÚSAÄhVWd(¢mˆ¶Ðñ"†Õ<-Lˆþæ«"†| CŒ–¼Íb¶5z'×–Û%:‡máâ(dyìWǵë™ÄqEú©%5œÇeèù
+N¢†c!Éz/!O*Ð4ᇎ£‘8÷:¬ƒ·kx0œZuQ÷žÂbW–õq£®ðå\BÃ%d²ç¼J¸§Àm”»œÏþK 1¤-fG•ݳ‹¿6lƒÃFe™©¬æ" öÜ·\
+åþ¬
+ m,ø¢P¥‘Y–´I$ ²f†5^¤É”­&H^['TH/Nì9mNîÝB9ˆVû<«š¶½»µjRÇቕr–…´¤Vs:»á‘FJs2‰vxî¯ö5¤‘±Ë+­¼HáQEiJ†*í¬¤Q¬æ~¤å¸6tRîr|Hõþ­/D#óÂf%]¸)ò#u´ÛÜk)ð"•ãK·²²³ùÊP Þïãcu)ÐÍ>B:¶$ £?Ò¤%ªžkÜm© åøª0„)¤m£†CàpÁ¤È›èmpÒNÀ’s­©ŽƒT†^ä©ùÁUm
+/Òª_mDšWí>¤Pò;ºFKu¨•óõ"Ϧæ…nG«áEÚPï—‚H««òhB •¡Ïcí&-ì1À4gGëx$äGzÌÈù™ Ñ6†IùU€ÀÝ¢¥ÎbüHó¡ÄpPî÷y‘ö‹›4ê—ç±þ´3\
+RH¯a=g¤HoÜÕ’Hcmkš- çK=„
+ó:8Ñé$Oœo#“‘%nÏrJ£%<¤.ôsºüHíŽ R D~¬{Œ9VÂÓD
+UÞT錉ÔQ>2­§«2ÎT*”°þHíòBëÿ1Òä–…TÛ&¼W&Zƒ6A¤„õ/€øƒÀúÐHÁXXcí "¾8„‘Bë_© …öÿŠ¬Ä$†4§DJØ4R¸öYh¡MQcÍêÜ{GO|¢&BïÌvRÚ n»=sí ´t)NƒD«ø²sEñ%-b`̽(%-Ÿ–îH³ƒÔ©04!üv¦„‹ªá¬xóZá3ÐBGͬF9ëP&‘þ~è¨ 5ˆ7¥ü!zò&»\ãÄl§E…>”@©?†üB@˜ÀwÛô .x$q¢O@ìÅÌ«9†>þT˜33+>cK’9ÜQ&LÅ”@—ë%ðƒ
+´7Ý:¤ÝN‰cÆJ*67ÐaKƉ¢ÄÈM¶—Äש7Íé³KÛ°nÞ`S‡-Œ8'HHËþ-–}Etø‡ê<éÌóŒOŽO†Ò#$þÎà}þªò×ó§xŒOGñß¡ñZ!–ôù;üIz‰%̪‹ýà‚ dRØýN,¿ñ-΢ùŠ¥‘IÎJöNïSž—îÀ¸éPœü1åm±Ž7#Nw™0±Ø¢Gû,z ¶è± ŠÙ+ÖMôÒg&]fPEŠ~Ú àm$w ôÇ0(ÚY÷ü´kA±-´*‰xïÐÚò÷‡ÆÔbÄàìáF-ÿŠÔɬŠÚMàí¦çŒŠ©Å£š—L*jöŸÄh`iÞŸ„¼ܹƒ¶eÈäó‘V:צÉp´Ž•êÑ2ÎÿKÂX„µôê Þ9‡ÁÉDP‡˜U*0>PÝ»<ºçu7Æ¥®;ñUtåXÞº‰Î¥Âj¨[ ðOWÏؤxb 5‰,ßtŠ1'þJ¢ŸyŒï!Ÿy£X~t‰Ñ/b,×$oÏBÉÉEhËüZ7?YaÏSB{|yýó”Ì’¯¬0©¢gã¹ÈPAÅ$Áf¤k¦{TK2ôùMBš¤Þ·žøÖþ,É–Ó<ÄÊhÅ+Ò¥k8#¨+‹ª?RL:Ð%aƒî>u2TÚ /_Ô°xeó³fpŠoÌ_²´£A‘œü°ê^B¿Àª”Œ­PÞí×}‡—ÖwbÞ$Óªû˜bÃó)Æ–hoöëÈŽÃŒÜç'ÇõºüÒ:fí¿€þ¤øœA!ƒ–WAÛb­òBŽ1 lþUy Ë¿¶*c­“ò=G™Ü}šÉÜ2ÉÑ´žøûÔiËUR‡mÉ¥NèòPË/Ãü†aŠ#x×Ëëi
+]Ä]<NG(N~îÊ ) ©#Ûòw4y±ì!}d½€ŠZ¦`èºû†ONnJ²=ÎöØú—‰‰ÐŸÒço j
+û¼%ðyžbãð·O7`ïúe¡> ‹!‰–Y¬óâ•o1“ø÷Ä,
+¢°÷øÄ€‰ŸÃ’6>"Ö÷*sNòø8‘«çõ"èæ÷»$ùø"r%Ö%¾”98–·’æ$Éšç(}¶ç½ªë[GAÈóc¼‡AÞ ‰›Á>ŽWµ
+ñ¡É$&»±OB¾$8Ìù§c2ÙMhÛ†í%½JvöOÅ7Ò2!z„åš¾rCœlV¦°4`ì#XÖ盉íô*óQšÌão9½Äªr{'vá#”o¥˜¹oy‰Y‡¯}{@,¾½ì‡=ö:{8ÜxŽœ0 x·Î{hö;VIA³K0 Œa)qóÀ^š]’óøn¯ÎÀ¿‘Ç7y•ÿ¢`­„SÓ„“`ÄMéç3ðêàJ!Ô©_Š¦ðü½</ùÁ,ÉŽ`òΟÔ<>ÏùUNŒ3°O§C`_Ë=Ó;B™)ï
+ñÒ)Æ°~H±—i¢ÒIK´_QŒøµÅZm#û SŠs°ž'“Kš-ûó}v³K½Â·Ï—ã€
+”Çs#¨`×ïóáX§¡î憎ǽw”̈ûv>ÜË[¾’ÇÚ±’pÔòwùp\_Lh[f²}žYÜ×ÎDPì3‘B¶¥”3‘ƒ¤3‘¯ÖþecÿÔ ˆ$>ÏF'à^;D8RòH¡öç ™\O'DÎÀ¿–h0¹N8 ö|Þ™QËFàijú¤{:ñ¬>½˜Î"Œö´Ÿ,C:ùˆUøt`¢×ÊðÉ1ÁeØ>J]†"Ö8¤÷{þ"/£}ç6`Î{ËG ÀùJ"$f–¦Å^¾Xà6-¡cÖÏW¿¼ •æÜÖ¨5<Ç°`ò™øÅN/êGFªUþÛ"Œ1 ],ü«ŒÔ±|(!‰TbFêX>‘2x‘ê÷•ŒÔÞé;©Î72Ra¾Øç©Ê72R!i×@s\b¾s}ľ4õíCFZ#5ûìeØúxrRáøåØ·Sáˆóü¢'z¾‘
+Ç;/_O…û}Ü’M1qßý ¿òƒT8æDD2Üÿ$Ž'ªð?H…ãIôÏÚb†!S0ïOK|Z žU•r#<Û‹›^¸ERzAPNIE dLøf»7m˜§K†ßÝ\`d£·%náˆÝÎ D9ŸÊ£±¼NnææÕõ¯Ãá*‡{t”G=ÐëV3ðá£æ€(q*®’ÛÆxˆ)f·îUFx-TJDÌW5üx-ìneñN≦\µL<fšÆã1s!¨ïêݲ»LEœØ¹X|YgÐK¢r”ºÂygž²¯Äd/v²›ZÌ3ƒÏ ¤Î• ¡ ;G»%–ì63 "µàµ˜X†Z\çÇBHG"H“F/)7˧¿0¢pÜd7Gk•{T&䤀É5bÉnV)»Ÿ'”açR(N®[O(Ù­+–u¶Ï°;Ôj‚HU¹ùj&„t.^¯ÜFš(t“‚äUîíþ¡Ò2;ÃŽ˜U°`©QŸ(>÷IlççkGFX-½œ$ˆm‰lG©Îœ‹Ç-ܽ¤~ÛrªXìX‘[¶«ß“caí•T‡ï¤ö¼>¡Êš×±:Ièc_L¤S¯§¾:çAz¯ß¬$ÇWv„çN Ñ%±JroEẘä#’/²!‰;!ß8×÷ªˆœè¹>éüô¢ˆœàøøê¾½*6"u|¯k H&ú«:#œ»Ô>¨'}½$çÂ…ˆ»J-@'éýM6Ýïâ0ïfÓñù÷Zœß˦“x?̇Ùt|1Aîzù<›Ž/—î·™ÂÙt|±xþ“öŸdÓ±ÈB­YÞûÇ>ʦãõâ†_dÓýR#¿™MÇ·OóЕ_˦ãË¥cúûßɦãË¥“x¶çl:¾Xû½û÷²éøf—ˆô~5›ŽÏ¸ažýN6_.ÀmódÓ=wi¥¶”~›MÇgœÊÐogÓñÍÏi¨³é¸ ^ÖþU6mùÝl:éû$›ŽŠ»'þ¥lº_Qìíl:Ñ«¯eÓñçV;›Ž
+ÝIÛ<:f¿pÏ•=\·ŠO¢ô<‹ì׎(³´Éýë\0´ V*
+îòÀu/ϾâO˜FgѼ¤D:)'še¯3 …qHÎ/XDŽ¾qˆ RG0ôÇædi¶
+€zy~Lòi(
+U í¾ÁÂk›$±SoÀùÂ-$œO«U“Pî‹ï†Ã÷ΪÖ%$2¼µÃ«Õó,Æ„DIø+ÜÝó+…jÜýbò®ømÝê÷*܉e>~° ïŒFU¸ûJ¥¼—ùDÒ*å}šOô¨”÷ù2©pÇÎK’’ò›
+wbõ^a»÷+ÜI½Õf?}žXÛ;ÑfŽ÷*9±
+¥»¢í %áõ‘‚±Èñ£]p¬–¤¢SDªNOLK¡:lZé#“‹&pÉic e§¦]Ôn]GÐÎÉrÔjÂÝ-R
+ Ì­9ÇJÃssÿ˜äÍJH]
+ÔQÀFt –›7AšTº„‘&ËŠR¢î›'ÅJ­ä"­ˆÕÌ6„‘&uœu²  UÂç†Ç'* ó¦ šÙ³/Ðη¶cæWZF:_TD½ïpMÐjŒ¹íàÍ*ÚÃVžq‘8ñCÑI<6 ˆêÔ»A¬*f¯NJÐÍ
+té)¹_IöçyTŸå“^‘í“¢|Œ±ü‹ò=Eþ'Eù^UdûNQ>2gDÜ@ù¼(Ÿ å±
+¿^”ï¹>òÿ¢(Ÿp}äoå“T¿ò“¢|̨ì”K°S‰^¥ Wõûün¨Ì7X×OÒÝP×õc í wC Õõ{ïœÒoëú‰WõûÕÝP<uýÄ£Büžøûuýø™Oôn¨_Ôõ{ÍÉߨë'~2ä¹ú°®ß«L®/tE«úÉзº‚uýćƉ]üº®«#OUý~Q„·®Ÿø€øN¨þ¦®o:¢Ø­æÒ #9S–÷.è_Ôõ¿ùë±'þa]?QE'´Øêú‰‡…ߺJ¤®Ÿ¸«Ë{
+úuýøÒ$é¥÷Y=¾/伿U×O
+Œó£®Ÿø†ŠL2œOß¹©¿­ëÇcj2ªú1«3X>¨ëÇY†vU?Ö]o§§Xuý^æ½~¥®ŸxU¿'X×OüÀ5##õ£º~tþ/rî¹úu]?qìêú‰¬µËÆþ¥z|:q(’ëñ½(''¹ßGuýPx—Ï»ÙOuýDò^ž¶¿[×OÜ’‡7|£®Ÿo<ï$þ.K‚9ßI|µ _ÕõßofŸ"ø}]?6µ¹Þâoëñ½wHC¸ß–Ï£ªßçõø¤$1½º½áù¬Æ{¥ø¸©ŸÕõc¶Ÿªú‘CŸ×õ{¤J‰Õý¸®Ÿ¸™#Àco×õ¯ê÷ñ­MT]¿c}ëúIÈ{ýB]?ñª~o×ãûU.GZ>×õû}2<£ªËGuýžCÉ̪~B·œ½[×OüxG‹ýº®ŸøA'NLé×uýxæ…QÕOü^8éuý~·dSìýœ'¿òƒº~´àâ«ê÷ëÓƒœº~¢Á¨
+hÆûÉJËUˆÏäó5‰˜/3?îUlJ‰fÄ>
+‹=æ±{üóv_¹ðblëQxÞÆ£`# Œ»'L×…mWÌ|ðdèï!Ö-4DW=è‹Gë*ÿ(¾rgÑZtß„:Àk‹uuŠµÝ¬M;m­ï³Q³ÓŒ ¬ãcŒú$g ¸>Ö5íÀo’íaðCK~ËFâ y•àixr8Ö±§ ’iÛú·@~ÚG.Ý9êö >÷Ŷ]d­aK0­_r.1§65‹ ’%¾F|…•­ûWÌݧt'<p¯eœŸM®êËëí]âEbV}…¥_®¼ýd$Tf,ÏÑ`»Ä6˜z „(†«´=ЇÎ/òÞûp[Z<a=»#§>>–¡.…¯UML c´–¹é)²¹l·ø1ÎpÍA'ÙDÌè÷ûòú;ôÏ‹=¾§îF¹[sñh(æBN,=Õ_,¾†|¿`4ú‡-¬Ùö6>Ë—Ãñ¼©«ÇGša`Y./Èc˜z,= "ñUwz]ö+ÁoœÅêu®cÅë J?uŸ”k´z3©b©švDÐNç>êBò-@ÀºKo \3wµLÎèÕZ`Ú75€N Õ²Pš`ýu[A²—m{
+Ùy*™›…ˆÙ:Câ¨d4õt6Írl*:¾Óés>íÜ­UúÄ
+Wä~¥WAÕ§ßÖ L_›ÐŸp@À?²ëéJõݳ}ì=Nd§ü—çë]îWo´Ä\Eþjë÷Šµ›p
+÷ _–NT¨±IhÀmÉ*qO~äé7@Ürj$
+Î$µñM N¡,O½xººóW} NªP×~2 "L+@J"ƒûõ0ê>3/Ї#ƒ÷Ž×ñµc3¢ÕGõ’ Ö­dçÁÚ˜™õôõQ•mÀlwŒ[à>2?D)s +…*™ŠÑ¨ NÌлÕÞ;õcÕó\ºDqàxèb~ý™»™DÍ9‚̯ƒH˜…Qnæ-{ókNïg~¸ƒÌ¯Ë`ˆñ˜F^æ׺ÆÇä1kr`bîx€ùõècÂŽ96ðÎÃ̯®\„ù5\‰2W%P­(³+“¥ÞÇüz´2;2Uº™™ƒÌŽL]ñ¡N›ú•mkšc?1ÕQpß°…)»µ_sY­ýÊÕ%I¢ß½ }5F˜î÷UIe„Iþ0ß`˜ÈÄŠR=‚H`+'‹y|òÜ#ðÐ(…ôŒd$B\9á';íÉ<ãKÑ×Äé®$CC<V³RÞÃÀŒ–íTùfpûѳ& Û¢Uz,Ö´Ú¹[à <­²ÇòП°Y ¾¢—q¿eŒŠ¹°áØF‡$ `xr±J#/–ÙqxSíÜˈL<dW!7³&­E#¹—T¡<E@e^—r KÖg5C²iîAüÆéÎ#ðÚ^Ä}r|‹µ¶Ö$ô«zi}´þóþTÄ‹mÌ¡Û=>F’ŸC“Š1@ºÞ”åyu؆3oÒ®ô¡.ójá ÙFþ™ûÞ‘êX”Ýéðå« N6%¥öÊ1"°Õ´¡½íÆùÐÖ’£ãPx:¬Éø2jÓîjux¾Á äAÝOL"a1'BÓ ÛF…r^ãꤴd69ƒ \ÉûŠ”†v$¶7«YTvë*[lÎÍ
+ã¶Ûo>2صÃp?ADÆ|ÑÚÈ¢®G ûÊ*:-¶PŒ–iGùi13ß=¤¤sßÐ-åÇ·ºçLJî8$yùÏ°ÉH.}ªSEH Ùs>â¹m¸CB¬M¦'|p©P·Á…&¶ƒUïv ñÚ!37g„»›Bº ®-µ=»û~˜t“ ¥@¨mسNNìúÀ hûθ(ãtèd(J‡&«‰ §ü¼T¸Ec|~€Ù
+ôwà Í0L‹Åb7§«ãÖM`„¯k±ûÑRÄŸm-Ý
+-H~{,8¥Èc
+g”flk*¢Æ­Ón8Íèˆ:¬KB6
+‡ ˜&c°ô¦µ‰ ñéÎø¶þÕ—y„7|RaCÈz‚™kŸÜ©™äÒZøÜFìÙ0œþg|Nz•
+c|ÕM¨¨@$ëÓXœF!Ím³ ÓHÚš\éÜŽ´ˆìp@E' ñÍ#WÃNÄó^]÷­öÞ.´žMkD
+Xh>0ȵ2 ßOp]’<¤kј:¬)ñæÌëP¬Jh™:­FÔ‚…ÝÏC]j‡’?a5X»)2
+ìûÝ=¬êÐ2-
+°j½6›âuÙ«GдeßAÄ2n¿hÚQ8~ãö‹¦-ãt׸ÕSÁ˜Iâw¦­Ž=Ò¸BÚT–lü{œ¬ø’iKÜ ö0ní1†qûEÓV†
+·_4mÉóÉ]š…Ž­LDÈHÚº,ÓÖK#Pà¦mÂ6Ò¶|À?¦­Ý37q–iKM˜—¬o ÛB¶tþ#Œ[
+—¿øÃÅ/î¹—^ÿ*|òí¹Ë×îþ õߟݿt!ÿé÷o}ÿàÊÝ _îó÷Kç¿ü‹ë?\L“+ü{éü?þp6~ûû÷fÌØ
+Øï=kÈþ•§ دüt!û§
+Ø›wôéCöO°™üs!ûÿß›{MÌ‚M Áoμÿã[÷ß½û«Ûw7¯î½¾wæìï¯Ý½yïÒý[·>¼õ¿/Ü;øñ»[wn^Ûœ9ûÁù+Wšìèƒ{7om˜Õ‘?¯+%W13ã£ìbšcç.|Ùÿü­Ø_ûË}òæÊjf0øT¼üÇNŸyI, nßxáÄ-ÿ—^ýú›ðë% +.fù!7õÉ—_¼pëþ¹/¾òÎÕ¿_øË•>Øqâå;_\ü᧗é={9¿†Ö&_ÿãÜç Ô¿¼õ§Wå׃ӺovÃЭd Ãñ‡N½ñׄ×øO}AÞå÷Ú™^=õÖ[}û…Wþö»¿ÂUñWüáO/œ>o¾ðê;_~áå^¼„ýñŠnÛ¡ïÒõIš|ïÞ°0è"{õ«¯ÞÔ­'ü·¿SŠ  ü»‡°Ïè>…SÜ~úæÖË没öÒØK—_±__;‰É¸|Úlelf»…ìÞ‡c«_YéIkºã›õÔJ[½Á›|eõ‡¿?ÿÇñ‡ó§×»S,kºrf½m_ÿêìøû~Q¯ÌÁòç?¾¼ÒÆVßüçó¯®Îÿ­¿ûÏWö!_ÅöŸ¯P¿ Ÿ=øæGùÃûž¿Æ?]{A~}ï­åÞ×™V+c—¨
+¿¼Ha¿Æ˜ÒÕ&‚â]YÚ÷Þ=£ÄÎsÿð{ùõšW&'çÌ{ÿˆS{Ô‹”ÒÆ?øäê¢C~>¾…ˆÿTfì™oüᵯî¾tíÒÓ7+:²9Nvø'–³4]Á]žðîùåŽGÝOýÊO|ÇaªóŽ§ÞnëíÏ—ÞzéÖ‡¤ä ÚçÇ~8 ? ßÐe tºsýÅ¡²ÝH+ç
+^_¼«¬McÓ~qíŒÁþ‹¹×¾eWÏ¿/þÞìW‚¬Õ7=ÀŸÃ‹×¿?÷Þ….½ðòþ§Î÷w¾'ïòâþᇡ«½ö¶HÚß_O¾ùÆç/üë}䪃ýë»o­40¹Ëõ·¾?õ¡h²gï}ýîËv¼•¿Q¦>üáâ©k¾¾tòàŸûCø“»ôò©W÷Ï}{òý»çî¼uçÃó·¿)g.\¹ò÷/½ðêÉ—&Û0‹²pñÑ'N_T·•_ù
+y™o|ñéG_¿õÑ—×.‘*i,JÇŃüù©GüõÆT>-7?•ÃæíW¹ˆ0
+ìä ¼öÙ»÷à)“óÜ©;÷Ñ–«\>wÑíx8S`zÙÌÿü’*gÛK”mC|ïží—¿}e˜ùÿz€½³äöïÞûÃ<K ñ¿ÿc)&
+s:¥Zâžu1ù÷ß¼©†þT*å9ZûÌc‚ñ»ol5Äù?Uãÿè,êË,Úv~&CÿaüúëÃ7
+—?~¢î@ÁìY:¦_^dòßÛE7~€/Yâéä’%>Y_/©Žvë›[¯˜GåÊ£hVÒK᥷^øÌâÉ毒~Ç}pæöÇ÷Õ¦»ýêk¯0 2þþõ‹oU¡šöRF·-Åp¸Õ×÷™ Åß#S×ß<Ïýy¢ð[le“»Å<Üï˜üw8³dÞ5 ‚»ÞÌ@ü¿Ï‡àÀë2AW¼¿~ñî͵ÿïÄ ùàÖÿÇùú¹[_ݾ{õÆO·îïùþÇÉü&oBΛÚùÛdŒ^ýbï䟼}óփͥ{÷7gï?üâÞû7Om®ÞÝ;qýŒü~áöÁÃÛ÷îÞ¸ÿÓæ5 }üÎÕkW.l^ÛØç®Ëç®/Ÿ{}sRžÒaD.;…`Äuyòë{nsVþûñ¿÷œ=üò“üò¶üð ý{ãÝæÍ?>s››¸ðý½Ó!´Mî›ïöNûŸ®êO§=~Â_—ŸøדwOm^þÙç{Ý?æqå¦eß—’7¾W}„ÕïW׿Ǫñ¨ßyýS>ZxÜ£µºcÄË~Ƴ…­««hí‘ö‘§|¾ø¸ç«÷Þ„õñr_ý~uùÝý}\¿û»]ÿ”–÷h²û%ÈNˆi?ðá|Kë‘««‘àÇÈøÔá‘ñ©§|ÈüXè9·ßjÞœNqßž±®®®òXðñ‘Cö‘§|¾ò¸ç“õû>\*ó·«ã·æJúÍ®|ʪ\ÝäĉâWùÃéB,­~àŸžò{Ûã¾76¿‰"|¾ÛKE¦»õÂ_¯.¿ž¥î‡ª…Ë èžò©úcžêê9=äTà)púôÏœ ‰‚ «sáÜ·žè Ð ^òûÍÙïå§w÷ܾ 1ú²qûÁ'ùY~ðÞù$ÿ:ù¿(¶ßsii®¶´úáã>CÒöÒ€µ(N¾ÛË^$r¿_¿ < õU½|ç×yõ—òرÖÚð(ÝõØž)D_›ü{ëÏcå»Ï§õËòܼãiŸ–‡Á/W=Ùö7ÏOéCx<^Ç”¹Z]ÏÙüa™³T/¶éá¡yy ýu>ˆïm¿áx°/?ô»]þåW*Êl`bñ`0È!y®ÝœŸ²ëm™žù!ð—'±«»¶õÅ[ŸÅs½HÀé6gÀ’
+¢zÊSËä5‹}¾DàŠ… EìØœÄ:QžG?÷«˜Ù›èäÑeƒèæìNÔÈP¡Ãr‚ä¥ñS(ûÍËdëH : ¦ >Vû¾Q C„Uˆò^¥pkå·AíÃ;Äý./¤ßVåc²urØ-›QS =eˆ³™–‹S i{/þôô‚åàËÁ3 –ƒ§,G½è˜„ÿ‘}(ÛÆb95<Jí>BƒŽ B^;5Jrò¾Êk(à‹¼nŠfÝÈ£";R¦¿g~eßO­ð{[ìMGj”¿áIœ- ŒõV#à«Ã›;ÌhLxQsÔÏå(G|‚€ñ¹ øÀ˜ \ø¶ŸR¯qð¥ŒMÕ’‹«=bâkªLé²õ²[Ó°ž"/E¶Æœ‚JÖS6Fªìq/ “#ö¡¼_3?“cú- NäR†ë¢#D0òb@V}(Z¸lÁu’Ǹ£C±ÀU'’+„®»)TÑÂe$;újEvÈ“ã÷f’£î‹uˆÛ¸à0U®hb¤F
+ëîÇ4ÆÇŽ’' ½ѱ~Ñ1 Ct”œélI¹R@T9oèÇy«±Òx*©zO¢êᚨJß”*ïMt@ Ä—@Ìpo7!dIqÁdBu X!ºK‰ÈŠ·¢ŒÃ@J…€–ÇÈ6;ÁÛ]š‹²k
+^Òw‹!S3´ùñ.²³)\)ãª(FºÌ€˜6B8aNÊøœh.M^ ø}y<g•¹N‰2(E|¬ò¢Ú!€3 Ôyl o
+ZQ—R{D½lŸ†ç9rbyQ›ö@K+žB¢¦àÕÏ(3¸åa¡¸Øò°èÍ!£åH
+F€˜è‚¨¤hÝ—ÅÌɹy¡
+Ze$¦RuWzÙ%‘Š‰¬g^N ‘¹¥äÈrÈUbº‰Î¢Ÿ“i©òžÉ8ž¸U£èQ`ë‚mðe7Bm¢^FD³¢ö«š
+¶¼Ø¹²9ÞÜ•
+Ú" @È«¤âò·^Ô&a@?ÓwJoê>”ˆ¢RÓ¹¨ž¾Ë­…-Gö¸aËaøB¨r|ɘ(6Šü"§0r0å·ËɈ‘$šÖ@¾<
+´êh@“jUUŽ’ jkDð)b¿éHH‘^y¡0ð‰˜àÙù1ˆý,_‹ÙŒÝT"Ñ $suNeZ™‹íìå!årBŠð1ÈF ±êº‹fàyðˆv3àÉ'–u¨™Ê“jCñû3¦qY5þŽ<W/j“`ðŒ>Óx. P9¦ð¤^ÖËÓ™¬®Y‰Œ¦™ðláˆð¬ø’¼9"œœÎpCqHP¥±2æÈ‚øôX%
+sÞðé«lb|‰§Ð+òL.Á§ˆÅªø”é¡ôäaoø¤5$ëÒJ÷Ÿ4WÝðvi«&ÇG‰ÇálßzQ›„ÏØÕÎE‘ÔµîšÆa¸`€§jE·+$ß„É·ìP3§øÌ•K]ñÙ ¯*¡wŸ^—Æ[i—ˆØ¢ÎÌfºNXÊS(‹G`$T‹ºxxQ…—¨&} ³R|2FÃk’œD§œU@ x:å;Sz‹€“ã‹j„TÄi?b‹@g£*Js^Á)ª
+/f =F ƒÂ;‰r³•’e,A']äŠß&»èôÃ…oî|ßÌ›{Ý;ùöMUÙ~'<43xŠqÒ‹½žž²áœE…mE²U¢.RǧNOpŠ.0À™ÁÙbK›­y\Ö,—C}õ¢6 œôºg{—dYÑ<»Âs(}6¨é>á ;4,ðÌÐ0³ò%ž ¸ËIsi°#°6àߘ?)ÃÄÏi¨¨*cJ?‡£XNÅJV†÷6‡UÃîIæ¿©Ò)ò09Ò/¸ŠtC0»ÌÀY;Ît±ê{­Íðø"f™ÅBG¼ì!9®GT½4e !ôäÔ\êOGX“Ÿp’|yÂN(­N™í°§|¬ûÅ&ç,.kFÙ{À¹õ¢œ„NY%ër@Ñob}ð‡¸ì@§FðãåMZ3Aà­J®ü`àD\ºE¤Á–äu¹6¥MƒÈ
+“RFâB@¤N'…$à
+ŽüœA‘L R&,¾NGW>{c±ÀJƒ)ÀoNb³’!ècµÐ$c‹‚ñl$J¹ÝaÉ”I:³Á¨†-]¼!ƒG ôEO_$ ¨zñ 2aI&€ ‡‹ÿM"ª—¼
+ebA'¢R¡ ÚåœU'Ë BCKäHИ]8;p”Þº)”)’Å ~ª3Ÿt4´ôócÆ^'¦J†÷l˜òÕ'µy5T—”Ý@VŒ–ž NïKJŒ6¨Œ•Ù®Õ®(ƒÃÇ`õu|ŒÄA°‹ÊóŽð9R&¢m ÈgÚ”±‚±F´é ‡çöQÕL"!¤D¢·Y³r fÄg9
+•$‹QŸ]oŽ~ä¡1"Lpñ©=–ª~¸’
+sQf|(út‘‚ø—•Ÿ(G@q $H>(h~²<~¿-œ¾Ü‘&!ç…F½ª7ýsfîT0^ÁÿíðaOî,XV¿ÚÜGYw?ü(Åë«TLA`Öù¨mø¿½ú]0–5XÆNÓæw§ñ`(…yãI¶#3Xˆ;#Í3âä'ÝNcò =Y
+PÐU«k©Œ@Ìrýù1YÁ(¯*cÝi(îòªI9jºŸúqMÒ¼"ÐäÉ•Öà!rþ|àU–TÕgjŒÊ+_£bŠ"#÷–Œ%0–Õªàñ7SFj’ÃÜòÀzÂ)½ªD<NÂôP,H*oNŸ2`óä<Ô˜ß@ »ÞM¡‘+Ÿ7‡]Á$Ë™”yÞ³J<™ñD&¤K¾ü)he€<RXÌñ¢`ò2à0¶g`"ßnžËS—óFÞž¾]l"ÀÄ[&¢Ì¶óÈÜDà¦êV—/ÊÌ›Š¤WˈÒ!79ÏEªœl¸•‹®¤Ø'Ô"É%RŸ°¼ò|ÍÒàžN23¡PE#®L<íšÿá
+¦¢f‘QÈS¾µŒÈ×q=å¸.ãs`ˆÂm߸«1^AókÝn$ÁBæ¨},ÀÝM½Ó(i ô™t5¯¼ŒŒ((twX¡´êÂÀ<´º8| »Ø˜Ïžf¼½ÊO™Lª±ˆqQúáøÎCFÝC~2qo
+×·A^&>bBÜTàzÄ|3Ô7f¾êHkÉ iIþÂ5u騑š=“‰è[¥V±Jb˜E^¯©<ص0Ù«$K{ƶChPE¬óŽ!·c9˜ìWrÔm«¶
+©ž2¥¡…±™Å´6³
+'P“#ÒÔt 5"GHÑ2 ¹§F¹×b2ÙÄÈ#œê<g9Å‚ ^“‡”³«i\(7ãq6x­¸Þð¼µ4ÏÇo‡T±ìfÕ- \@åjš.‰H2l¡ŽpË<Â4½¨=(ÁjQà "uÔ²D‰†Du„å;·=Â`Èñ(ù ‚OsvdQpd˜?ÐMª1>´ÆJ–ýî ³Œëæð[<U#·]ÿy¸­°Þ‰
+mN̓ғ’Ò"R3F¥éne6¡ÒǵMºfåôâIìDÀÓæ¬'µ.ãTŒª60â”wI
+Êá§?x>^YšÒ×VRꘀ„—0.~1FkQwý–­þ(;~N‰œέÖ“ò 0‹j—vd0ëœËýÓPÛé?ÆXÖuˆÜäxÖ¨¡çí‡?øu¼0RY??B-ÞÞ±‡YÔëàrUM$ÃX£ó¸C]èjbÕ¾žª¨ãÚÑ¥–ÂæÌ•»Y]ÉoÎÞ}xûìÛ7ܾûÕ;·~}ïæV¥%Ï‚NV i«ÐßžÏÍÝ‘7ÿUŸüšyòýëÑvâ:kÓ¸ç‡è©²¤öóŽ;¬àû¹"8ååµådáh³•µ‡ š]„¤Ý¤×-ŸÈCjT½j~CV¿Þò{(\õ¨:[?óûɳ7ï}qk/l.~ùå­ƒ‡§P ì¾Lñæd·ùÝè5ׯÜ}ððÆ݃[×/Üxxãú• ×ß¹ñ½^²{S·9sîÞ½;›“÷oܺûðÖ}½ì´Ù¬gÞ¿uCþxóöwï~ùåƒ[?Ñ?û#þô±ýiÜðû÷o|÷`ùº+wo?¼}ãÎíÿwëæ|ÚÝç>{¥_¿ø¿·~Äg¶ßÂÿìýû7Æt\Ùœýñá½Íû7ÈsË}— 9tÓw¿xpëþÿܺyý/·~º®=XaÒ˵wïÝÝTçÁä6ïïU“o÷ýÏÇg÷Òæ½x?»'
+iÔñ9§á(d!g±1¯ª*æÆ2’Ží$ƒó¾9aá7À×=.÷Y‘k^EO›qIŠWî'¬  Æ#þ8ŽÅ}£bE&¼“2ÀÉŠ<¥1bˆ‚g\]eOàòª‚ª¢.œ?buïì}¹÷ò5´Ý„ꪎß/-߇*}ª7A%9M÷¹á)ªÖ}:©ÐQ<A«ÃU)©¢m3#}:üè{@RnUU#›Âoc>YîFÌ~_-`N'½‹à*;_†1(hx(5bx/ƒ—'ß~½Gë;bÆP™ÛjŒ$^ô‰âÁR%“óB ?”õÐxz[j„¥:2Ûx/ÐT¶ÞΛNïÔ¼~WšqŸedùº9¶<Õ¼Ó|ô×;ÿø9ЉúhïÈY?biò¡‡:r¡£a2ç÷aêHОñ£A¼‹ô]¼ì”øûåe_þ ´ÿí( ]ZÏB“S­„‰òvYÍ­ÚÔè}ƒ æ8gCˆf›h%Õƒ1¤1«¨wƒ¡¼=ÏÈã´Ùe¬æÒ¶¯jóx]¿ÀÁ³®ÏÁ3®ÏÁ3­ÏÁ3®ÏάìÎÁQó´5›H›ÒÁh—©‡CaÜ+l¨ŒOj²‹qDô!ñÁÜ&žäY^”ç+2GuaལúH§s™|êg„ÒÄ2_™N ®äÊ9…»´Ï`
+é`´Ô6Ô‚Ç_Û‹Ý…SN#vÒbeHƒÅ¨†qŸÉIã|ª&Ä0Rû!r3ÜYåC®²ä§g•Ï&*žQT<›¨<xüØL=§ÚCã®PýcÂÔý* ÈP&“‘±dNr®CúXI³\)ŒÊ”cpÞ(˜½™Q~n©êgP³ û
+†t3ÚH­Ù„xK&X2
+p«×h–I2Ä;+ [ööÅüάa@ Òu¯8 D’‡ßÀíàŠS(Å0íFrøÑ4h¹aÛ0 ¬Û‹ùÉýŒÃBb ì´Æ·JA¨P³’Ž°t’Þ,"¼d¡¦ÞT…0£OÞä\ŽÃ)J&†XÿÉ>šIwÁôújÁ,eJËâ×N/(öq‚Sa×ÓíQ#1ÉŠ8jœnåÁìÙÒˆYCç˜oäÝ9°™zN•”–»BÛ>.Åd·ækdè£:ö Olì
+Wü<¨}ÚÝ
+Å02=—Z7'³@QäÌŠÖ%«°Š¹h9lÍÎîÂø|„B~ÌÀ隨çVEi¹mA¼Ýà©BÐRC082PC…¬Us
+dr‚ÐY¢EÚ‡¤íy8‚T{MO託¼ê–9M˜õh¨%ͤeUà Šžf ¾>?*/[¶”2¯akÕz†b%JxUa9ê~ñàU¬T'„YÁd³¤¹P&'aY Í&=Þ Ý›©çVLi¹¯›SRz=Åu²µë¹ª¦œ”B‹ÐU±²ù„‘ÌRÄ,¬Œd…ðR ´àLÏ&¦U ÈV.a(9ªdoú ˆæÁ¤9€4|›EJÒýĈºbMg(DÛHßTý%­Ëb tRs°ZV_<YyÄT‡'wwÆvÖËÕdz»s`3õÜÊ,-÷e‘¬,ŒÉÁÖ ³)”hggŠÃÁÐU¯KP&íÁ›kf¤u…³×ôº®¹’
+5tzµÝïcSYÇÈÖÌî¬+ÛslïÎÍÔs+.µÜ—šéÜ1èSWç Ûe,]mÎô­ŒG*‹váÛ-ö_-Cáî†÷Bò7·3d2Óœé@é&¹5Á„’ÛÙ1 Õø©rÇùQõ‹ ¾ÕW¦ð É„y7Ù­N ¡ôŽá[É8ˆåh²›U
+(G’|‹ÓaêaSß,jiªIÖÀÂȇ'xgyG9Îã ñÝ9°™znEªVqúVý¢›ØÄ$m¬F!fш4„pQÃwB¼Ù]ûðꙢ“æk³ð„ïÅVÅT›ŠoM.'À¡ó¬# Y«©bŽÓ Ïd­ê€ësà]ãÈS¾¢mXWÕ›²ÚРU6³HR€;º ¹™‡iN Œ¢še†A“AU6t.}R ú²#˜8»[k›f=ÿã‹ïÃs`3õ|ê\-7]qs×b»¶:â¶Þ~„·JÍzMˆuJ¥–{·=‘®mK,ªJñO橲™×Åh\ÑZ¥E«SÑWg̃l°‡š\?Kb]Vuמ <fb=ø4òÔJ6ÿI^ãzµPr;ÍŒYÁÄ/§X%7ÚÏPH×ñ¦q_+s ŬNÿH)ª®Py<4µ;‹ZÛq܇ç@'êy•ÈZGsê$åHÊPžºÄк‹æΪ€Î¾/‚|w$ ãmÃÀ£ªä3<Sk1õ%Lˆ²è 0¾N-$¨}G’­éâÉtš<8-ehR¨†Nð|j¢°’ùýX÷zxÈSN¶1š¹Äkf= Xj.“ž‹ždG£l{¶qÊÒM=ÚÞ¥ãû8ç·M¦:Í.Ž‹»%E¾oÉ|[šXXëÊã¼3v¦ÀæéyÕçZYpjÁ q¶zFçzT/Wy]ÊÒâJdz.uÛj|·P²N€ªÂ‹œ€FZ(©*v>äØý8Œ^1â[ÙÒ314C—H¡3¶—³§+šåË##Z*Y` ²FÂÔ¿b¢ &ÌPN0ç8Ž ó†2R¯»§NN~jÕ|7=Y6*;j-¬l‘Tú´³D¶KÔÓ¯[Èí£ÝrÓÅÒ0ö¼ê€­0êËÁ ÞUæ47”JMýf²ïÔaz
+UœBRë2PmCñPë õ‡MŒÄÑI¥Xò/Ü„¥Y^ž~€egUñ(Z·KŽSMêôéa%ôþÞ¼*
+Õqk7×HOÓIC@c«º‘Ú\Ò tÃÄŒÝ$öl‹<¬MŒÙ–À¡£+-ËUá‘£F/bÝ¡ð°)r¸øy Aõº#õ¸ªa|©3 šZ -™¿&Bª–b'BŠ:yóhþA¶C¡–9§2 Š‚s¦2j¨CCýÔ»C¿¨óƒ–•&IhZD`2Uûä
+œgf`¶Ýœ‹ÐÊØÀ«}Á’£«GJcšQüQš•·ªiÁƒ·-euT¢P僅Íoô¼Jtmv?Æ\s³>[TÆ÷Êð[´ÿqbÕîd³iAG ΄Â`§´žÍ‡žë¿E½~í¢^ôGÑÚµÊ^s ή›ôOah.‘þ¢µ¹ha4û³Ú ë/#N?0ÒRqÜb 2ë/ö ãÒŒ)l}|õ¿‘B`ì-›æ‘…ÀH²Mÿ©ÕÀ*Qø êgA« jû–q6S{µí3›û¥ ¡ãàdšCÃfu®n]W–M‡ñhÜmCneèÁdñ¥yT#ÖqªkñÐ14
+R 14$gÿšÒ”ÒIk QSŒ´tŠ:ìb²^¨ÄÁ‚^ uƒSÕL´ûS@=†?d„½ð|×®RØW]OÑ¢+
+ûUæ-ƒMÝÃp¢i«CüÎLý”„ƒÛXÛsŸõ€4ñ”ÑÍӲǢFë}Ð’XÀ«ÓÞvÌ‘ŒòÝh;‰gGC`#å;“ˆ/ì %E  ȿŸ!¨LÀ‘ÈÚµµ=iRDOc êöw£ù!`ØŠk²xV6.‚&Èí,Ê
+ bÌd<`¿ýªc. õµ¸  ¯ìLÑ»+KÑ:ß*é|Œ,Òƒ2³e 6.wm 5(ì={ÈÂQV‹Õ Æ@¶ÊÃ…#Áè³´tæê6ö:K~°åÐúÍÕ´Žj²Nn}r2 whFμÈYŽ¾$HeÐ:"Qžªúô±3Øš¼·ßÚ±¨m´ðNCÞ£9•ùä/!ì‹1 CÔÂ…èx@ê{vjYìæ1¢/Ý­.Ûzâ¶ÖKƒþÇ›[ï:fÃÀ)Së³ri<]è¡»ÆTa'ÒÙ¨3V¿dVU- ¡tܵ(×Íd2ˆ}8-šâDˆüŒ8Ác– md™½²QhH8¥ñfð7MŠÐ¾ŒŠ‘R3 ä¢í‘w囊ÓÚ˜†¸KqJ.6½60Ï U6™$ƒ¢fa£‰Çª ¼ 2aˆFêcfßµRrÊÑø…ÕÒá+±6‚SÉÀ‚MÑ-‰…š‘_ù|ÆÌm­XëÇÄÆØ~Õ1›È÷%IÃA_c @çF»JViÈZg4-% ]ÚU.îyì‰MÊÀb­‡N*qÍ¿E!TKT¥”lçÆ–Ïš£À$yFô e*-|xŽÆoÍêvËMiþ1k GLOw8´bS`
+Üé/#´˜ò&(cïR&D
+PƒgSx¶–‡ÂéD‰%„™ƒðèôŠÊ¤6fpš3]¼Å’ž²áŽ¶ÅtGØâZjAB¬h€§ÏC€$V•ŠÎQK´”(á*u–ÌkHH êä¶=ïG¶ 2/eSÇdYKð¨ŽÍL%`“5v›0 ¢)˜¨pƒ‰*kiÑfõõeÁX‡ù˜€së]ÇlüÏÈ4áyJ¥12“ÄtF7×™®´*zºTðXnÙ“–òeÓÄnöãb”Àë@ÁtUѪwj¡ÔÖÕ0©Fèˆ
+5-Ý3èÕ1$G‡•N!;èFôxÇÁY¢–*ãˆÍÛ9?¿]Ãœ øz6Šµ4°ë³2…iÁ1+ûfÓ7é˜óhýM`2=†~;¥˜LaÁýØHÈÉdI«#5Ù{)›Ý‰ÛZ­Y õ së]Çl d¶T$z§U¤eW3¯@–Û%ÃG­3“vèDkpvv54l‚ÉØV²ž,¾TXÕBsà,핲òÆaÀC õÒ VÇ¢8¦$zÜ»aŒ$"µAéI½®Ðþ(ÿ
+J°ô˜®™õ¨ÈWúh¹kA+à¢*ë Gkt_I³Èd¬Æ‘}‚ITy¢‹@׸oh‰~‡jÑë Å¢™4K5»tkÒVkÎjKÇ—;ïj“1ZK”¨«1e¹u­zäà“dÝQÆkÖ5GÒ6,Y®~ÈÌh‹`ôF߯ÑÎÖL-RçS‚>tßÉîYÈóåB3¯hkòªFZ
+üêÎë‘ê.3[Šjt®Dõ4—Á<Nž-µ=šoG¥¢ý
+ÊßPP<ÅMa%•4` Â
+éþ¤h
+Žq9ÐÇÌm­˜•<:èÜ~W›Î*[œ€sÚýµ) 5l¥°Í2ŸÖgµMª “ðؘÌÀx,Qì Z¹å
+SyUj“¥ÕÄ´‚/.s Z>S
+é¸tŒlË9®HƒSÄ>š=³êwAY¢t6$y¾¨ø, ]å-j”²6ýYÙ2£âp!A›m g|]ϘèC>UvbôFш^›¢ý3¦,ͧ‰…*AæÖåI²£Ùèmm‚ÛÄm-X>F§úö»ÚlÌZ†™)hÝ4õ¬Ä¬•ÃSg|h¦ÜÇ)Céî\cÓk@Ú°‰,BºN¬ÚSÀYŠˆgH
+Öowfʬ¹XhôãËV»?"DZ‹ðKM)ÀÄØÙrœÙ¥¥h²r¨6ÿ€*‚ˆ=A°@æ5ºÕµª'«nÂ@w
+NÖu@³Šá@‚KÇœcØèL yÌ‘ØdÿSÃ&’¸3¢»Á¯°éµjîîÄm­Wéõx꽫ÍÆ(("s‘‘• £’C³Ì KÍw¬½s MJßg*ZLpt>ª«eǪM*ÍHƒ 5ø0à´ç«ñ%¢³VÙFYÔË„£³xU-PLvF3¡ˆÊŸöó) ©Èƒ+Æ‚!2@Šaˆ6%i¯‘ΚYy—ù ƒ­kŽÓƒ#úlê7É2hVP˜º”µyˆ5+ÙgÔ€gÚŽ:#`ši¡gê²7ËoKͯIq¶êK-jŽxl‘g/ªé!Ür¥gömŒã‡4ssVw­hngXB4 ¥G5«Yˆ•},ÓÅÄÀ°_ŒÉ
+Þ°È%p•´ÛoKÝ¥-¹ÄU7,•¨Ç`†×¥Y
+\Kê*°û¨¦TÕÂj1¤Ù‘~QšRÙCµbÞÅZ$J¶À5zvVÊ=³Þ`‹ýÁJlö Ïc6ÛÁi"D¢×„rí`­Àa^£Fq@jðʾƒ²@ǪÙü&¡¤•¶}@I‹Zˆ’ÆJRg(O~×â ³«\œ\–ši«›ö6"xrJvBYýÎÑPÒGH|’0¼*àÄ\,‰ƒˆ\l4naçÁEârTÖ‹‹8Ї@.ˆh]k—Äh=+
+¢1ˆé¡ðšÖ²€–†°7¶èoˆò`Á*S ëÃSÍ‚Ìd »É
+’»ê¬‚¬k²°ÂPz4³]jÿ'~Ô*Vr†©µœ%• Ö2CPàZ**C™³ìö— î½&6¯§ÏÊtÔ˜ØOD^P?À©ýf\([m–â¬ù£Å˜¸((H÷`Ql6ÓhW‹¶™Å•JÔét}ÂkЬ[«* äÃ*îÀ‘¼‡€†º‰‰\ìè”ÐI!?b>ì•­t毶&£fvA·»Ìp,#Qˆ½Fä†C
+ÆRÏz¨Ðuá4†zò¬ðÞž>µ® «3‘QÀÚÓÑfíØK;Ò“Ü7»®ËXA[ᢵ®›(x±5‡4d­24ÃÐÃœ(?qåhq¢@±¡ÂþIÜ,o0)wµ ò¡W;ONVÖüH=é#w¬€ª“°)ZYcÑ$y0dó¨7Å¡*&HÌÖ†-E-ïœ~X`2ûì`O‡:‡Z¡>êu}Ò,Ów úL¤¿SLÈP÷tÖ4eŠÁ¶a$1Àˆ+º6‹V€Òœ?dëÉÜb@S¢ÀŽƒ@€œ¬&×A!ñÔj=24€ GT¶½# úÞé¢ñ"%hÖŠj48ÙvÉÚé…®Âé;ºŒ’Õêºd´ ä!åvVv
+Ä@…ç 0Ø·‘Ͳͮƒp‰£û(æˆÄ&vóÆOð(n, ë%`CRj¬Zél5 rðᤥ”‘k…¶×¸–U0žh‰+tŽC}
+Õ&›‡ÓhÄóå™V['ôrÈ¿ðÄ2“QÅì41hRÍÅYI±ÿË›kãn’‚cR¾¯iZ±1›~èáž“£e«_›#`Ý!»/Èà;sC¢¾qÎþ¡üSz™”~m ºRdº%¦™ÓŽ3D§=;+PLÔ¬4»tcãI£ l=úÁ¯e¯C9[#‹G󒢉ÎÃFMr“ÕMàõ©¤« 8j©²+ÿ[ï×®¿åÒ*ï©3Š
+÷tF‘@€X ¶=ÆbFåårœÛvIÍêRˆ}3/gùZÄ”ô’%Èr¹>Ëo¤‚Þéa>>¢„žù?°€Þ/«—6ïÐK÷"Õ‚¯:j;l竪4ƒ(uÄì-˜½Wç瀠ܷGFÑkFuÌú°®Ï8¼Ÿªç³ªð¼h¿5Ðô®QK¶ìØ6heuuOÙ,à!wiHkhɼ„lýüý`Oëøí0.AȤœ<82 ë‘s@}n…¤ŸAß®n­\"N7$¶³'ß`+‰lþ ­æŽ9¹¢|1´Z†ñÁ#† ‚¡KÈÕCkleò¼‚æý§ÍÙ½)¦†b»¼£„ÔQ"Šõ³êgÅÓ®Ý麒ÞÜ bt7ëÒ"Õ]£ µY¢ªc çNVªæ‘“EO+Xÿpä|·§)MôrgûÛ¬f—µ{•ž›ë a§XËÞò¢X­´jcù¦:I´q¤´Îk íZ[Ý&éc­¿
+Cµ­ž&qq>ïÎ;=ª`ÞQï>†Ðš†ï3¬iÄ'{Z"½/CÓ=˜g¥è²5?ç÷–‘nµÀÇMJØ~fû]>‚\JWWô1ãËÈüžeh<˸Í|ÚÝ7:ÿ¸·¶™Ñh;³|hÒáÇ9´ž‡—|ç÷Ž‚Î!tùÝ >ŒÑC(>„Šz#©;ˆ5Å¢ P›_í'ËÇ)ƒÁ[—DÆÿÂéxÃéÒêÍ“ö–7ŠžGa|²&MÔÆólÂ5aÏwMü@áWv G09Tû«'!­Ï¥õË‚Âeõ–!ƺ×Ú¡p÷Áže1že1že1že1¶'b罘™9{a¿³&Dzö(›1}¶$­ 5]>–3TƒÖ—1Ž°
+A›~•¼†k´öKÕˆǺ Yuê›>@ýs‰pÚÚ#^-Ø¿5ëÓ9mq]´Ü7ßjˆPê€XcFjÑlU~? ^ˆyjù ×tëA"wöºƒ´°!"žD¡6¡ Væ‚ÑÔdAö°^sÍZƒÞ(³ \öZ-ƒu.ÊÈŸÕƉÀ‘Š¾®2ą́UW˜SaÁug­†™ô뢵Õ‘N<x²–l|J(­y S¨<§¤lƒÔº³­¹óÖ63£Ö¦HE:)™Ì0ÊjLmmM‹ú,áudîlMFquk†žÓ÷ºýHùÈY+;p0Ì È;?jÒYW÷b5ò¹ÅºbÞ*ÎߊS ñ‰ŠÓÊHyrv@0/ÀõA÷I27)øå½ÚTFÊØ£u׬Mkû[vn1osGèE÷¼W:ºc§mÂ4F=g‚µðaœû^lá<a«sÆ®M»“¸³~¾¯¯9.¨Ý~k›™QÛ1&­[C`Á9ö'¢6èŸHÕ°Ü™ªõw
+~ߦV—T·…Ã(v¸ZŠœÝ1ÔhvÞÚff
+Ì L•±®à½ò…œ–šŸ¯y45¬ÊÿÚ!ô„´¦€æ›)±Áûn»`¨µ^ L2…*ê³gÉŽ•¼Y{|Q{õRölê5aGTÉOe…Ÿ‚92ž¡†P±öÆÎWtÓxYÕŠž¸·QDu1ãI`ýT2¿1RãP:È--“‰Ïn‚Òð;Ó´½@Ú1þ¸Árç­mff%?­:qâY€Úi%?’×”­ÙÏ:V¤R´™k¿eÄÇÑ9t¯¤B†u3Ô¬7’,«”·0mZsûheŒ›6tOÊ]£bP4.ÀòUfñš.š†áœƒÔ7SF³ÏCcÖ.p¹Z5à)8M¤Ð¬‹ÌÚf•ãõ¡X—QÛA;sX:ˆõBº Î’‡a^ôÐÃ#”ϧÅ–in³¹³¤¾;øn¿µĮ́§–+¹–1
+ª
+ÑÞÕ ™PeÝÈtÄÐI¸È»ðeŠÞ° †Ó#ç- 5ãc5N°øZ>2Z¯%ÈeÖÐÉÖÒXákxd6Á—M i+hpnÁ\_Ú
+ŒÂ ±Èë[2ä´òôíøom:>¼uÅöÑ,)-<ÂïÝY¢‘î¸ZF-ârÜÀ»óÖ63£äZ©ZûU0è0/ ¬±kAVºÕlP=k/] æ]ƒV¿ØöA63Ãç`'c·#Òšl™u¡Oœò<Ë”¸ºª8ɳKZRä ìšyÓL.j‰ÑME͸àƉÜ{6­7¼f–W-­BÀK(Üsö"5_…µ|mrsëÜÆÆȺ Í"²ÕÏ¡²áµ®µZê£iêîdn/£Öé8nàÝyk›™Q]W`‡ÄàÌU—¼ö's•ážI\J
+Õ6¼ÃæúòV›“BÓÈ¢iÎ[¹^?·‡?F¨=ôÖœ—Q¯(y’œ“|»c—3RÕ„˜5#Ê·B²Â×Ya; ]ÓDT4¢‡Šm‹ù†ád‡?(*p‰`Óq›i†j¾'åR0 Í¡„6Žþ«#Hh!¯$ÏÖ‘—:DÑ(CAûƒáìµ”CÍcó¸j%?¼YZöHÈšƒŸ^š:\ÏÚÿƒ1>u ³0m×(ŠÖæG¹yæ3ÑqÖÌ,ëƒ"ÐloÍåöÖ#Vù?·[ïl³2J2ñE¬š£ {_a›š£7lróÓìzDüÙë mêm‰Å$(nU½ #ÌI94 <Mhf˜ð%U̦Q. "Zm$gÕ€×ÑjM²¥NF¦dÑê`ÌÁ˜Ó  Î AîóCz­uŸ 6皆|ŠäbjNÖbòm¸üÜЫæ™0×°‰@vVÝÂtö`Þ@èÅÞt ×ÌîDA‚¦á‹U„ÌÂil)sh ¶—¾„µþqLð¾ýÒ6/³>R"ãB Òh«‰
+1†’ýÌIÓ ™å#¢²N=ôc#FŸÍ !k:2x_!˜·rñGiÓ=Àn ´J”bú¦M£Ðv\`›z–@¤JÆ!Š×T;ÀÙâÂÔSg H2¬!¶ ‚K^Þ®É-M]Š1öa÷8Ç”Ë: ]•oJdX~K+ë–µCÓÊ-DQ
+ü†!æ]Ú†±`«Ù*£ìƒ·TN-óâ]QˆÅض˜JäRIxý­ˆYãÇL-ª¶–`.¥.ãȹ<٥ŠOfÅÄd*”9­’v4¦˜Kšù0Us?i2ïn1p±H6U¸š¸ZIz"Zô9Œs¬iv2m—D¦@£^¢àª*œÚˆMÁùoÅÕ1¸egd-­ÄÃþ2ºÆu\ ñÿNææÝZUÃI£ V£ÏÚ˺d5”}”ƒŸ‘ÌŠ³ÂïV$“-x_0›¾ãꕤ2ŸÉYó×i±Ú~œ Tè’³~£†að´Çé3C}ÅñsÓÂø\@[)k™­Ìµ…Ó»u!¥¦¨ø`êÞ`ƒ
+Q·3T 4~´¶³tǪïbj“·‘áÖH]`EtŽh̃Lòdc#‡i²1ØÚøÐ,<'clA‚KZgÅ'ƒ Ê4|^µCQ…¹gºMLð¸×˜†?0êˆQ¿³‡2Œ®¹çw&¨5¡$£A‡ߦ¬ðóå,ÿ?„yÕ`ñoM€ÁºiŸœ¶µ‘"Ct+T[أؿM%ø
+ÙÆFÓo;Ù~´Æ¢\!¿xÓ"¦.4Šê4zì_ËixÌÖ>ZŠŠ×Ecw¢fdÙzƒ_Ë|}¤1´¼b=l¿â¢nælmeu#•´,7\adŒºAÐØy¤ÿÖ2ú•kªE‹%Óý©lÓ—}€Š•÷ +©2?þÐWÑÌ»j˜á#ÁP¯pz/ù—WÍ/Á,·Qì¹~#…`á9QxQ×ÈPýX×hS+Ï¡¸ä¯Ö[Ï“Ò6µ;ÖU;éÍà8<–5âtuýÙ£ÆPLRή±n˜¬ÉÇI1–iÓmÉåEõȺsUÚýXHY}e£gì2†J¨5ÛÓk?¼âFe0=þ–l n —=Œ"ʯ®‚¾J¥²Ü]K’VO@Œ`c:¢\©ïl Ž'Í£§³T¶Á4‹núœÑ¬·=zlµBó³Gí—qõX¤¥vÐÕs{'Î^É×/Þ½yõÆO·îŸ>­¿Ÿ»õÕí»ÙÐr“žrôÉûBWÞd ^ýbïä{7¾½ñ•àÿ꣤ËÇï\½våÂæµÍríëÙîº\-ÚÓgå¿ÿ{«´¶AíB •æY^Ò¥ä5Kž}ÞVIe³–x™wDøÛòÃ72ôïì™Í?>s››øÚ÷÷²DŒ¯E¿SD1D»@‹1¢¶~–MϦȨÇUÊ~¶p¿^"àhš4nC•Ó)kV¿ HRÿN‰ªºêEìJÛµÝ2oÄtIŒÀ¤˜ß5/Áã&4oÃG6ÚÍÖ{=¢öјn1ÍÎ*f^ÈGŠŸY• ­¨,­~šÇ1Ôª™jc kéO´ô'vÞBYXØæ-=Gøúç÷–=L ˜w‰»|“ ȧ*˜²,Ãf×´lÓ:o3GÆ7Íù0ó.ãywßéüãÞÛæ棽#ìˆEí;s4Ágcç÷Ž
+Ϥ½Ó|Ê¢´D{;ørb¤4–mU&ÂW¯ªÁiÀ—“Ï£eN4¢5,¹Ž11~õëœÒ`=zyÑC‡T Ð-ŒƒºêY/ò}I‚–,çìj!ø®Ô/LS
+~~ezƒo]Û jxÍ[Éô»8ÝZ„ŽÐ@:¼½z‘uðL"ëàDÖÁ3‰¬Ç¿ø˜‹åuº›áíh c3%7 &tͳç
+ˆP¾lŸò T^T<® #Ö‘WŠfî3¤Á.]xgÝ9€µù:=²x÷¢™|M[:`Äy‹û‚KRu§ÍJ¬ÊMÄHÖF±«ÝÈ¢ë9ªh Z·¶±(„Á¨ÇN`ñò‡&h= >„ cÎ
+\Ú†%J²JÒÍèLVß åULújˆ¶û
+ûëàÉÑAÈôª•éQ^fžê nÜ¡0*Pß1¦É
+„GHÒb8,ÿÊf!AZ7 Ñ›WY¢ÁŒ tÁô 9`Ût8 p:… ¬7I{Û:vo¾oïËš|8¦託ߠ­id&ÇœWí€­Ó Ê´CÑJŽä4ñ;˜ÏÄX Ú"çY>ƒÉ#|8(,ƒÐVÌìó\f‡aí/êéÀS¢sh¶œ£ªºÔ(/Ë“Ô€
+¨•Q]d©.ņèÄkÍA4ì
+b(€c*AK‰ÅjþËV¢òÄ­HÓ ÏæÙavmŒ¥äFœ]LÜÊ1gêënq z Ÿ χãµqC Ú[XT¶†Gë㦎1 ½šýF7ü›U™ÖÁEX01cÁ@úQ žq\‚2@/ Ž)zY¦ÔÏzð£3ƒd,~9œéb´œª³Š³©J!kña WÛ›¢i1²494™9é<‚z´^« ~½ÊèÓ¹³Q“Ž‚w_ܦÇ\|`òBK´}`Õ³bS2RsFµ¦¥QüÒî{}_JÃ0òð0ù® vNG¬¸,Òš‚­_3›@bkj
+À%((Ô»B § Þ`8:¬ËQƒÄ0Ãøû,vGñƒiPÁ] è„?‹]ÒäDb' K7®·dºÑ¢¶²¯–ÚO Ã÷/îå1†;êj
+4©91³X8I,³fÖì@{YZ
+pøKwt"C+³ >A¹3­]DÎaÅ­(m¸ˆó€`ø"@0½I)`dº'G¢\Œˆ|ë?ímhõSôâ^¾¸—LJ¶aCãq%k®}Kð˜ëÝ(mÍËʯ”Ký†27†A¡€QP‹Ý ¡:Ūù
+麷5PU2‘!µÆª§¾j¬
+0{äj$£ò ©ª¡˜å=¤ïÉ,Œº<›"#>ìeâGn!ÈèËOgÇï¬O/ñ`œÍ0H Z6Ñ’ÏM뜦þÏê)ÙlE€»â¬¨#L8묊ªf
+‚koÓõ°¿’ås!&–²¿G“µ»~¢Š
+UæÝ6°ªÅÅÞÝÍ<Ç’°Lö»>Y ‘€É@u9ea*´ŽI}X•lfD@ Ýœ}Œ[Pœ—U¸ªLoAƒ$t*XiO~( ùdÚƒ)4Áªp¶ÂÝ`5L=ô“šy)î±ÚPåùaL*5sçm<fPG·kÒ÷ïòJ…ÿPëgCºJdNu™Zøã³g™:ïÔÕاUœØxÕñ+r¯ Lʈ
+ÍÀˆ‚U¨ŸQz¶q&²\^pïý!!7`–¼ï‡Š;ôM'ÌTQZlMЊÎņ6)˜6c÷oU:OÊúÀg•2–âÒT®qðY …öǾ2]~†IúÚkýÞZ
-d^RC6WsŸªj@êÇb±W/R¢4•Ž·Ô'³oFh(óLMóÓ µ2Ô~
- PS<íbÕ¶"}äZ»—ò1¬ÖÞ…„ô}‘Y¥˜NHhTv 4.¥©©ì”­C³Dà+-Z…ö›®@VØTf$šNGª‹àtÓ†QO°»X®g±ÿTrbª$Åç“j;MºD!ë¶HºÚ&©®Dm m¥!à–þT_*'rêÏSÙIl0ŸSOš X‹øO¥acïdÕð:y½ÀTOê8„ò€{ˆâ.TW%&!ʵÌEEÕ© Ð!ƒ%©¨_®DAyµÕ€šø i˜FÆÙÈRT¢T¤R>oÖBò³0gÒ€²†¼Q"EÙ™p‘[GðÄ"©Vu ”¬
-ÀHEc«® ÀIÑÞaŠÊEŒúh/Êg!µB=±d?Õ·+œj”‰¦ŸŠ³Ly«’yY.'š’R3±ˆùH6@µ
-4 xº¬€Å¬ÎN«âXT3"”½
-ÈÔ¬HñÄŽD8`‘+Ä1}A…cÀ6º˜G8UKúFκ+ÄHÌÐâŒxÛrµ+ˆ§&˜²ÛŠè õ)vN> ú,Æ‹²S5ì„…g|ªFÐQ¡^ØqÄh$|>‹4…dz®#tÊs”œ^’þµW®À5’$VÁ˜&QvGkÜ
-©p|?ót5H‡¤e®HÙÎ%ÚRäº}äßd»SŽêjIÔ¢*·Ô)‡Ç é4¬É5Ä8¼õdTw9•Ìú*n©j(G¶Ÿ¬¿ßdÕÖ(÷Û· Ë­é*lºPmX9´ªQ¾kšEæÑåBÖ#ÎÁt¢­’Ë)ôªÔm¼Wõ Ø£uVýáöìíÛEeŒwûÕÇØÔuElXlá4ç«ðQ#EÑ‹+‹ˆ-iñ’bOnµ­û&&9¹Õ[ÃA­-B¶­¦Ë×5;8Š€«nR$^C”<GWLÌÐ(PnŠbþ$6Æœ/9¹Dz)Hg¿o&ÊìOlU…}4b(Õle*8‘¹L …u$1ù‚ÓÁÍlÝ÷œ-ñSŠDyßÑr`Û>è’àáÉaìGäZÒG4h©i‡¦VDžÆ&†Î›
-G:pšnËe 4º‡%,Âë(R —bu+Ñ)‚xæ¯ÏZ˜—$±vgR“XÔcùN̤0CV|ñˆ;)ÏÁRãT-ÄRƒ?¼V<åðFW¦Â ãˆXåžÕhMiä°`ñ(ä$à'xñ¸‡^ `‡¼.M#}½hôò~“bÚy’ã$. ?ÉFnˆ®÷!Sbš‰šê#%¨ùÍ‘KT#]¼ýïbËŠXÍ‘EDò©DÁÖ8…”*¸ÉfO^W„Ü» -ÖCµ!÷‹HudáüT7éUÌG'ɺ8rðŠg‚q2Š4Ð!Â…K—p‘& ºw²”bæMîÍFJ­°© Ž“Æ•£–.'[”v¡_¦Œâà4¬ÇxßÚ>‹Ù‚ë°Yu/¨ø”Êv|ZÛ*€EŽ#Y´÷® ò¡O’<ˆiؼ4 /TÙ
-KD-Žé2Âá„‹KW|PåÄ1‹Ì”¯/æB‡B›<…I,Aʤ~òªÙ(<—IäÉF>rýg´Ú8my½É­;é. °T-Ùr‹~ùìõzöö¼øÏ*8Åöᢟ}MGÒ›‚“ãÅfKÎ(*,E¹H†‚g '@ÑúÞ>‰¨(µ¯h²OX#îå¬ ÌVn˜­Qb,Êÿ?{oº$Çqf‰Þà;¤Ùµ#mº@÷ðX¦M?HPìÑ4(âÒ´4mc²B¡HV«XUZžþÆY>Ȫ T ¢Rœ…ôÊôôððå[Îwθ¥GfÂ^Žbm5Õ—©Þd–§OÚL.|¦§¡Qt"€T_@µ²…´’4ŽT¢0*о"»è[Ñ?“wºH2fCˆ¦Yu1~2Î0‡Ÿ8Ó‰fó“²61bxâ××^š‰1!r&åêÎ $c„]*7 æ*b`¦êCt^ù$Q­J7÷$áÅøC«S¤ÕÖ2ÑL“†äqêö_èr–™ˆ²+AµAÌt¡¶üÙ&/#`Ó{%î8îù©®5
-Š3ʬÌ÷‘PX¢ ì]"T†ø‹Ç®Ùƨ „>GA³h΢oƒG®7–˜Ð•ªà¬q3µ×Ì£A¦3PóÝZ=Gñ…ÉàM—×AtS4ªÆŒé½Œª¨®Ÿ£¶bÖZ3ê
-ø®®"4kÅG1éJg!:öŽ|Ë^ó4®¹ÒþO¢®ªhè÷‘P$[“âdeˆx*9¬¡3Áê§ãž‚0b×)ï§ihÌ!%Ô߀Ië2
-mvq™£„bY| E7³#1"[báIÜDLipÜzî€0£n6ŽîÁxh¨ñ'­&£ôËõ`Bð¨Aäå=tY«d"ØÍUÉûD@W5àæûÄú}Î0€.Ü,“›¼?CŠ[ý‘ɦÐØ‹xZü6"×ÄŽbCĶe…âAFߪÝúÙXÀΰ 5.wC\
-hTy
-yì´ÝP³}‰Ønøl
-35ÂÔØϱ[™Œ:ÝzØñ£ÇjšiÖ¹êD)dýP[0•ŸCuTŠÂUÂuLÛ«òJø7‚ ô„Ën’²&› ‰D£e3Qï¡ 3 æ8óÔ QaÚÒ¯’µ× ƒ GWdÍ0Õì¸TbO=9&aì“ôMaiù0îAÕ3i@ÚÈǶ!#Ó<GP²AÑH2Ù…¦KflS9V Ãä{ŠVääOÓNf"¤Ô £(š—#8š'J¹Ye’hË |<#ãH2§Npz` 4ºI‹\6«¹O‡,³MÙP?qs×ËÊ–†¬ÛÄ …Â_áјU[z»ªwu¢¨Šã\³=3ï$²' 69ç)®˜î,±Y)oNd¯ѵyd‡åï"SõŽÇâ÷`cîÜè¨ ßC'sÏê1ayYhçÌKÐÉ¡QÊÍØç$ôls0 nž¥mœ7Z妣q²ÍÂÓcì|&”Ñbš4d —€ésó+É$ ïÇa¾Ç΃Ͼs
-à”[EI i .0~vdœkž  ÁžDa@ê–•ã±›gÙ¨…8ÿ¬N]¿‡OJ×–ÀÛý!‰9îÁ°©t FWŽãì#JƒžbÛ¡e–À’6n\9Uæ Ý’7=~A*g³¦´Ã/Wï¥N‚ž<æ$~ æ¹5š¬Y0¬`³ü¾Õ]cbÆX²f&a£q=´$Ì
-äú.Z:·ÄÁ‡F0$ó±·,£Ù'AÀÕX}¢'Uð¡r¶‰Ì
-ûòX¶\M’ñçº;Ñ<Mu½c{v‹æöký¦ä«—LÊ2@Æ‘)ÈTÝ0søÛd-”]jjßØ©zT”&IrÑ8ŽEj™÷0¬–ÛºF$‡°¼cßYÉ‚:oÐë;°Mf‹ïF yøæ$í5Ön²NÁèÕ6½¦ø¬.s4º¢Ÿ\6dôÚ®PV˜$1·mD_¯Ò©†qIÛU›oŒï7ÚvÔ¢«¬óÂ’$Y×rüh’GzbžœûÎœaýƶèS”AÑð#Moï0ï­~ðJèëðd݃R±ÅÚ®ëŠHŠÚféP<‰fÞïhf¹ykVi –zŠ•X[Å=‰(§p1l”ÛbòÌ@¢0xA׫ÍÚO ?ÚPƒ›&û–\‰Aô!±I«-lKÔÿ¦lnBõ‰_P²Ÿ»ÚUê"äDÞàܨVâzÅB{³ í¾Ø©¨l¡?6‡8ÊÎÒÔ™k…Ôkê oI ®N~tˆÊ„³Eô‡ª³n
-fÆÜ<è\°½8Kw=‘¡·IçR(†¢¦ØH¹¶àE‘ æ<D¸¦ÅÆ›z(huĈùwV¹-ˆŽL‹Lqf‘MFú€-T3÷Ž|ç¾´@  Œ¾¨Ž¤™!ÈÉtÿ#|Ó1´‰_ce``L=::Víª3(£|OŠŠ?~rª-6U}2ªƒà÷7¯£`Œ%~nålº–£Y¯x:V-·Á©Laí¶¥0í}}œAe”®¯¶?% Ñ(n’VÀ1j¹Ô«›mñ¢>¬Dm¶g‰Z2Õä€xnê‚ó„—™Žk
-àÑ%K‰vT)u…}Šã•ãìXåhîœ ³™ƒ¦Gk̤výV «ƒë.Ü`„«¨/sÔ&"ʪ`0óA— Í®+Þ<fõCžmÙ›¶_¢¡ö[ S“1ˆ HLR ‡*8¤ûä]Rò(ÇYõX|‹c\8HŽZˆ{X.
->—Epa²4ùc@É¢ì$ß©Q9m>~r¦ÑB„ÛKû×Z¢—’îIž*®
-SÞ0ìˆdçb3ÎQBú×Íâ¢C~ºY/hž³ÓÖcl¶Ò¼C+
-ñÕ<‹@Å‚.v†¹­sd†}Ãmi°áàŸºHÄ6Æ|4w5Æ/T¹ó^>à“•OÝ4DÏ\G¯£:ÉK`³–Î b—
-ŠðadiÆÕ«D©gÖ¯­`}ÑdošJ\œ™7 ¿]ã6„¥`êÇŽñöª=mW­£_¨@À 0‹Òìþš,®R_×ÉYrs,¨VA^B§wÍ°²Äz0·3y—òë‚ë„@ƒ)»,ÔF£; Ú¦{1BÌÄÄÕ¸¸/NCöm›ÐÆ™üY¼ÿ˜­iŠx•F|w-oÍ$¹h¦9›ÁËñ$šÅ¶1ƒ·umÌ ìIW³‚4ZÁ-ÍRÄãD¢ ï‰ç¬6—¯ïœÈéaS»åwÐlõ9˜ä¦ší„¹RZLrÐ6­EÚTsLÈ Ô±Òhƒj‰(ŠP27Š> ³a®x ›.˜ïjº¤¸}SŽMƽ8¢Æû#ÂcÝWóÈÒ"%/h;ÇúXåHSˆV,iæG’¢Ô¨òÉ&Eêo04¡]&hr1”‚¥öñzâØ4ËM4÷òF—f–\ªyVDÕXÊÞ¢âÐÖ#íÿ:)Óã%mO…€2˱<>"ãI.9Ðu
-éÒ¬‚ÈÉ2v0{ÎÁí`r‹5ä†áÈdï©¿bs§}9´ÍZYâì`‡åê2|ÉÚú~‘`•ýg“õ¢0]¨‹>Ög?‰Ü…×?Õ~ùýÞlŒ|‘e0¿x‰ EÂBCc`°zÝ®ê  øËÇ9>ká\2!CÜGµ3²JaØUëxI–!¶`tuCá;„¡^É.èïÎ>6("×èØ{f®ªEáØŒ©a Š÷\/м»IÚU+ÅÜfÕ;×ÔÞ••@—-Æ3ಖSÄX§&ý^Î¥a ´Ö‚±­t”#;©
-.¸>'¯&þ2ÇÊ‚!:¸foPrS îðˆ0šç
-ú~ŒªÓÒìÚ)5 ƒÄŽ£ýÄŠ 6š/=°0Á©õU:Ó阫´šZ†Õì1F©â5,öG$5s¼š$&í¾Û¬Â‘åT£V·-i|–7Ê)åR_ZyjeÇ;@®XVwo¯#VyÙhEü,=LP)ö1‚Òv"\§Y²@±Y.¬³ß¨Ð›Í Æ)èjˆYㅈϢ³°Ï߇™’SãÍçêk•Íò`„½&CZ«Âûˆ,FÂQC@)X…rõß´!DVœB´w‰+Šâ*\Ý|ã"ï°.*nÆ)iàJ
-–‹.?’ª+ž@ŒŠñ1±xÄ( ÿ>GBÉ<FàpA9æeVNŽlE^08¬ã™´*žõ¹—À)mnÃ9ÐXk5(whšæ0Œß­ää¶îBÈKï0´ßÿ¥Ñ«èCÙÑ5%‡Ð¸JØj2ዽf9çúþH8ï%BÁÒJ‘Õà6ý fU
-p
-MM½éMz¦-¡Ð²Àö*XŽ,
-2÷ظl¾¦2 =ãØxH)æE7„·’HldJ§¥HX!QÏ~AZ‹‚^€'çÈ/Éi¨wdß ¸
-u;XÚˆAïÉ ©vRÃ[Ÿ†ÙæôIa¸ˆÒ@1>û£éÇØÊÆÙka€ E$c§k@ØWgÀµ£÷ %QSñÌ¢HEí ÌM"bSœQc ÃѬ4˜T&€#ñ¹ ‘ÝÞ¿&ánv·A9Y3ŽКRE  „ßý2[Íš—,–Õ#)93ã$J]~$ä¥/·H7Á>¹ùfÈæ–ÝœEÍLyp±Iâß&Ï 7E*³,·˜êÀ9šD²
-4š©Ð—»YmÙÒÛAvÆJƒÎÈ d4ªA#“nlôzã'‹?ɤž:è„¿ -¢4¹F„Æœ/ôÁTVŠVä®'£þë}l,ë]².Lç¨h?SúI‹¦£EuUñPÂí¢jû”9öå WC<@¹ˆÇ’'ˆWq‰ Æð¡94Jº
-k Œ8¯Áû+q†¡Y¥ Îë]"64Òj懛K4ÁAb2 •.д@#ºÎ 7ÐràI5nž$8ûmƒ(âHT#|ÜhUÊÍÝ´¶Š¾÷BêO<=£Ð;w‚Í’ÏÐåÚšÍ ´kW»U‹‘ ™¡Å~1íñ6éØ»®Ál—›‚Õd7оƻì7I+V¶æò¤ÄE=4‰Q^šF`åC—Ëž>¡Šˆ¦ê,ÅVJc
-ÎÔZ1Âß¹,º¢4—X¬4Ë\LMš.òrŽ0›!ŠÚ¹ñ\ÎáhZŽh›>ömgRÍóèêÉ$q
-:Šb?‚©Û›"®Ä9× ;ªïg)]èPUí"ã4IyQ`"5&ÇÀ¤6eWÈàÆ™ÐÅŸ:N+K&ÅšÃý ŸVž2Q‚jÍZ¶Kj0µ­øH\¾I<QñýΤ IûõI4ëðBóà­ÎfÖ0±y4x•á*2K‰ÊÒ\Y±ÖN;[£8½Y•8ÑÌ—ƒVœîOÜ:úûLQE£ý-àaà›kƒÕ3yEÊt†]ä ÕÜ4ç‘4“Ëm9ÄB:&yœPékDbSŸœ’…CDpEôuÔ­,àr­«Œu”£&FÁÌdWYW]~YBÇÔrëðÐÇágÍV5M_ ¹·´x"’39‼xÞÆ!\=‡Ð &$a÷k² šƒ ‘‹½Ù6¸KüX<6k9uxRq¯µºµHO·5CäüÓ°öa÷ŘRâB£àà ÎYaƒò•>g»¡nNž1*÷`{G¯qet‚ķ桹‹s¿¶&÷Ì÷Ц‡ë6î"a)Äf<±5À{pjruÔ'Q̹”àÎíÊìO’u±½á¹w(šæ¶Ͳ9‹7K½RÝÁY»pã:AQ ëÒÙóÉŸŠËçS
-ÙŽÐ!¨Ú S3¸”'cPµA„º÷Áè4ãÜ*ŸX¨šG,H„à$¶Ac#{E[“fÐcŒRÜ‘šFö‘+«^vMî¥.Äuz¸º¹g|¢q`„YZ:ý6Ü}⎂e Rd4¥ÝU×ó«¨99ý2ÞG•³eA›T­>”‰
-J#¶ä\-eBÂɪRFAð>ËW¥Q®Ü€Ð¼±0u
-"ÆóûH2¥hx$ÇqêP‹Ëéã'qÝ+#Q»Þâвà°MÄ‘Ž lh~×Ê觰”¥..¶ìäæ`#K‘˜àûê©Mù/û+n¸p‰ê2³)¾_ã*© Dy“mCº|jœÛŽf1t#yØ÷ÞL¬ák&%6„_²Ø à¡ “ëC,¹ašÝÆ$¯f¶ÔˆÍÙTˆCL“«3a+-C,„Ó»­"¡àLNRjpˆ¨/%UªÙê²@á‘kéçÍNu](Ïð¦­ÑÁšTgN[YW&§@¾+‡;•u¡âQ——ê”ÈŒ¡ÔF•‚smëìó’:
-áàJ,Ä,?±s®x®‘m+@f±#½
-çdš]ázýC>/4e—KÙt!¤DHK–G…š)¤ehH(£èkr–ln‹£XÅÏ*ËWÚ˜g:á?“@ãƒ*I…É™ÌÙM% €
-Ræ0÷J¸½#Üi³\ÔS‡ÉîkCh!]f·!MUë~ˆò’›À±A¦©å¨|CJÚ>aMp²k_V©.Ûì]jrÊ’Ñ–CÇ/ÑÚS³ý)}R Î4ç°&muý“1žíE¤£ÊáñU,A<N¬,u##ÒËXÐ.j’:Q­‰ÔwJÎ+Fè  ¾Åñɺ‡zÃQ@5v.qdîˆ
-I†Î€†¤sl¾c¶µ´:Þ
-øÃ’G¯¤ÆgûÔ;TW⬆ÍjBZ_i î™Å82z?ɨ„< œ†[ÌeÕ³öµ÷Òçlø,dU"§)N#xº’
-„š]q‹êa(|icy\RPVåRxЧqíÀK”ïVàë¨Ô&b™9z0Fe‡©´•“ëÙ£d.ço„Ï€.*”£ëmkTÙˆà=ìn˜¹ô{¡°eä ‚K­Dõ_ÍîHø‰ÁÅ}¬WÑz¡¶n>zBV¥¨%UÜÇeØEÚ½DlÍÁ.eg©‘ÙA¥ç)àÚ.Ä×—wàFMíúÑfNÆÌð4è'S(‡£ä·%K~7÷¨*Ô“åæmG
-k+¹‹").)­ƒ^l׺Â:ë¢æ¥êrÐÝç 1¡È}º„‹hž:‘£ËÛh‰„¡ÈªQc–’í–šàüR{J30•Z̬YZç<«ÒÒj”V&“á¯K96™84×RýYép±Wahîà1y£’ù¾ÿo~òâêùéî“ëÛ//Ÿß~»ûôúÕÍ·»_]]D~ÄåUüæéÿ”úei,§XZþ7¥òyÚÿ_§¿¤Å:Y6ñχå`/Kþ³e7ôüÓ
-8E9èûÀ¡t)}dªÃ²HÑBaÐyã™
-’ç9ʯp¢
-kƒžÃÑú¯’ùª%âýN=‘¹.§Pð¢fÜý%É ‰Ž2ø…n;/8n`q6Åw÷Ñ9…EªÂaþ®¹á°ku+ ‹íÁÜØã>_væ‘RXÌ.â9©̃‹’ïÏYg§°Ì{ÅX6Ù(e’ŽÂlÕNqñÇÛG²‹uÁg˱“êa‘´™µ™Ì^,,ŠmoóTd+tÞOð.Ü–ê…ž¸J@SúÞ+’’BäÍ"Ø|±C²2PRå’³•cO²`Iµê§?<cOö<õWNïZ
-¡flÜ 'öXhÆÚhós Y·¼¶ÑgO7VÂŽÁ0GÞ–­qÞ arY©À”!t€מCC÷m • ÇD¬VRÞòžC]2mk  @F 
- š€BÖb&F>7Fƹðüƒ]÷)Í€¤Ãòμ»y¯vz4Vn° =Àš84ÄC˜øUÅ·.Yðß—‡V™ÁC]|¶úÅšÞ¸m‡jĬ¼°l#Õ+à TéE3h¢< Þ–ˆ{pIàøhxW©u": ®
-"`ÄgD«²D¼ih „™¬0²]à”tíà ïUŒBÎ$F”{ˆÍšâê\³rá;QiB\ªa×®‰¸+˜
-ä'­…(Óh†çO‚Œ
-2㔎±«B‹õ!ÝÍLq/] Nxò
-Å‚Xřݦõô>—Ɔw¡=à‚)„+×ÜNfÒóÇxöë@:¿ F݇Ç"þß‚Êðß
-ñŽE±k„¢3‰¸ñTM]NTUH^`¤'ö H8±üþ¬Ë@âp- ÀiV ø| €É9_lÀqt3S:ÑŸ°C£©«Ž¥`¹ca d ÒA'×ú)ÃæxÛøY“pF>Pò0kR¦!@Øâäìż˜I\„y8½
--x½W|­ªWçÁu¤!ÆÔgÍ@LŸ¥'Â×âŠx;ã è œØIPyÖ@‰Òä»^ë…'žŽ¨žìõXçv¡±)6ÓžõGzÁBU"'‡˜Ã X²ö±G ÞPöëÑB#ig}¶AõgCKç̵¦°£ à.öé#¡YÀøÕË×Â|Ri¨„ƒŽ–`Q~WP‘’¢°µy^z¬Jœcô""Yš§6ýHvèá¡)h—•·CéÝi—çÖAÑ
-&¬[ç(è¾Hƒ\Pfnš5IZaT)‹é3òxÊ”ÁšÛ[@ïÞgu½F
-TGZsm•¤íÇ«·¤uißÙ(Ð ß7«–ØÁy¡ÑénîÝ:>t󴽡†ž‡nví_„¿
- "1‰íǬ¼¸4¦¶8{mФì×,é±æ‚ó–¹ïÞ´Æ‘5˜æ½â$ˆt¡".\^3Ðù}ûÖA‰Z
-XÂpDG5ƒx®vÃE õ¾l›#µK%@4Úï~öA'±ö/ÿòrìÁ„ ;O-"½¶íúF¥ÉØÎ(bìµnãþVñãÞgqŠëìßôº6j
-ÇñÖD¸¸×œj‰˜dž°{Ib¡Æ:éDpc$s%´÷ÙѼ{½n9‚x²µÙ´ ›Nû†‡Ü  Pýþ`÷>»>ÖÚ鈩)–ªã”MµE£uPG›Œ²žl´VC¨ôÁZc\7©“}»ùìâr³Žc¯×µQˆï¯­q[¬}6­íï«üðv¬›ÏnŸ5:½ûü1/}\£ÙB11öA‘šÝŽ«‘Údh òA(4q dlßb^DǓΧhÐ2ÍhlæEY<¨\†Ÿje\Òƒª4ºáƒaÌ-ä-[6w+šY‘¡÷oÍB¿3˜šAw©5.íGkuçŸ~rròêâ««["ï6`¹w¿
-0št ›Qã":ù8±éÙ94¬·“[A*2„£¬QÃ_Ú=’773«£?Ö&GrÚäUB™Íaèã·ªÖrm†k«É-»eåFßm¹ xòW|±Þö“n~¤÷ò®²ð…®fv$;5ªÍFs`ÊŽ›tدsE¶Ÿ¾-­æ/¥ÕqGxÏk[Ê@©Wß®„SÂô¨j_ðÃ#gjëÜ,A”E4„¤ óO ²*wùÁ)ø±¶;·Y—å3Æü®›Úì©ôeËèMMV’˜ô9×ÌìÜ«MHºL±qºö‚òßß8ì€>[núéú1]Z9ȃ4¬äF+ñ27Àp ¬íîÍÁ{t.%\Óè­í6MF«ÕÅqœµ·G‰÷ho Ö#/»e¬:S•ïuÐ5ci
-žQet\‰Ô’­7Z6–A‘Y†ðˆ×!8íiÈöyÒÆ?vñ}Û_)Ü4_BwýÇ:•džK;§!žŸzÌqïÑ× [Z´ ^5å»ÑØ"k¤~ãûÛ©Ò¯ü`1“Õ®rÝø¾8x* 8¨h”ma+“«ø `’½}þT1r©1SÞ?Õɧ¾?ïÏ™?LVÚà š—‹{Í,ÛRcí»{·5Žsí7ƒIý\î|Ì_ñÙÖ붑#ˆÖæ)lµµ×ÒÜÒ͚Ǿ?ڽϮÏÕz½7aF¦øÁ T§v"¬Í›MíŠC‚Z1&7Æv¶k¼ýl6¹ø^ŸÛFþ~¤ÐÝœÓöDXn$T÷Gq$p¬ÛO¶gÚöyïù11IîîW°ÊA‹ AÔ HÛfÈh"ÀÎP;#íÈã˜MêîvºUÜp9“‹‘½Ñ®~ÊKpŸy2è\]_{”'~ì~Ç”õ‰ ŽàRš±AA¢E8ˆ ‘§©D¬T¢‰ŒÖÎCd¥rÎbÁV)úâ³LO«×*˦¬AüÔLË
-aš)‚mÈv<ŒK~Ô9$0uj)•©…y<‡G1ß“|cÑ` |ƒ?§ •Dr)ÍÕnYÇ øŠ›{¤”c`—+…õxùÕ0¡W¿2»9»ýäÛi‚ î2^PcƉ ƒC¦ÃHÛ`ŽÛ1R{c´—óÅôÚ‘3ÚJ{”`…%Ñù^
-ߨë"Έy„·Æhƒ5)á®Õ÷kí,tìÆS‚hè$Î)?ºv©É÷íbÇ[`… ùÎÛT‹T'ɼ¶í`.‡Ylû¶KÈtÊm
-Žsâ´•)‡1*F$ŠAÂÂAÑ£Õ
-‹^qà„wh¨šÏU˜Ð©¡"Æ@M2ä/K1vfðâ
-zR9
-î-]*\à>¦)?ª°ðˆX?Ó“aëý¾¬ŠaÖ)2p80€vÄZOp˜C¹–Éw©¬H•‹ÈS¿¡Y:,Xv]³V)²=ª­’κY6Z—ô¶Äó0Æâ:\LLûhdU©tMˈXÌŽî@꤄z§ &,*j‰÷ï"…ÍOM®eH8¹N%í/ÊÅñ Þ©®˜ØÀ•YÔ |G¦>·ªþ&Lv/*%QOîì>ò"£áÃ
-¶%Õ䵃G¢Ÿ“U£‚¡PXr4Á¦
-¥[À»YoC²÷¹¶ýGY2W¸¼¢.!tLS
-Z±õ„VÇ>î³1
-3A–žs0Ê–>j0M¨-¯cÛ´ÈÙúƒ÷&-N£@ÁÎ’2ê7@õ¤’sñÄÅ­>“â•ÚD}Ôü Æ#Q­@ùëV÷éB9¦!œ‰Ð³ì%®óxusTkÒ›@£M™îE
-Iô9JÖIÇ9ëÆ™›;‹8D$
-ÔÛ[Z–[†iž˜ggIÿéŸöq
-‘
-FÑPãdNȪç¢À™œ8“÷")¯
-øq"È-27FVÿŽ©‰ų́·GâD¬À£C:êÌl1Z‹áˆ°^æ5H2R ì;jCKÜÝB&àÞ´’¦óÂ2ÃI½q\½Hôî\rTOå‹caç8£H{
-‚uV›œD‚v^¶,,©ä– ZDð-÷Û¥~‘M¸Ò¬¨#Hê©HZ„k¢gèVòV­ÞøþÁÙz"£ÓGäcq½|ÃÑ€ˆ— ?ƒ“àsNNQ!·
-ž—<ÏvJ"OˆµªìFDT½à»à‡¡‘µY oŠ£YF½7ó(êŽ4‡ÞË>:ßkÚËUÙ1 ¨ H5ÂÑG/+„®‰v@§8RìDØÃf‡^ÄÙ3…ã:87‡P0ú§•ŠB[üÎòi÷dfõVï{!æt`©EbB
-tNgœ„o<| eÐد$QAL%N:"HM”Ç*5Zt°†ß]koÃÁ”¡‚°ïnÄ#åçƒîÏ‚LÈ+Ô6éjmˆð/ƒrƒHI™Gå´jÅ1MÈ£dµ4Ò P– a Ì&]tÐM˜¬‹U‡äfu ®V„2Ö埲 nmâÁdP<ûl‰ãþQ4¼±½«ïDLí›E'ðžAˆ+ƒç«îUÅ›… «Yf̺ð’À±SrÜôaÞ°ãÜ+á)®KF$¨’T`\i…›OÄEŸVó("Rø0¢²AvÇT —Å0˜Ç¯ó)†»µk³™âê¦ìQ¿Fï°øó6k&ð2Ý&ðC²„j±r¢ÃË 6Ø„T¨§¹ÂJ¥Ú’;“h@ÌýºÌ’ àö*`3m¹ù™L‰#ÉgzÍIUl‹¾1J™ƒ ¸HJ0ÍG¯×b(­UÝ'œ¥ÉBa=­%ÓC©¶<sŒ2<ªèLûÁaO6AV¸évC~™Bÿ²úå03¡CÚrê[L~Ž#”ñ{û!lÖYõšGÕ ’ígƒ9ݦN!4Ýq’tÍÑHD˘Ê!ùPßTºnîÍÛ<ê®Ó —%–&GX²öÔò™³s!¦
-ò7¬x:™w° Œgâ¹ k[#c\‰,ÎTÀAwág.fíOMHX(úNÜ1a çc¥óÒ; I뛪 &mt ‹ªºæ§º?eûÁûÍÂqàÀðŠzF'(Ea•1Dï«#­ÝPmSLIùʹZÚmDehýÏ#·¥Ü5¼ðQ·f{bÆ»DÑ5néËR¸S×›r<TÓËÀ…îb° M…}sw¯1ºåYéË (7'‡2Zü
-15z§‰†ðšfj€7¸I¥±)σ,ß¡eEH±'†+›¼ÀÓ [áàë…C_ ÏN­jÖy.Së/;|®Cðµ§ÕåÁpÍZ¿‡R8¤cZȘ̩¢ DE¿†EÒdŽaê‡UmZ/4›š±E§Pž#îz8LÁÎëÉ»jñžSä“&« ð›ÁòÚ¢ïˆâöÑ9 ý­ *´ý¬yc¿°!¿l6>JDîd¯e<l>5ígJ*ŸÖÐHßIsN(Ô9‡üJ‘X-`g.9ÌA„Nx¯×£ê`r›Šfu‘[±w*š‘\èJj+Ç“ÆÁ:¾„¬ô¯êÂ
-Ðrô\šæS'!YGÙØK¬œ<²@ &“õ`‰ç}³K*P-.‘°‚R-û–jÂ!>§>Z¹™Ò˜"<CªR ›’lMZÙÅÒd´—û8ða:v-/e¢%Xžs¸àq½Þð!€¶Aý¤q4‡¥óTl
--)gj HãhQivÄ×L‹<×Þ##5×t
-Ñ9.¤]š)#â
-vÍÔ]cŒ…³[{¶7Æ0[2ioñlÿ䣧ùµÊüMc¤m#@2íµ?œ‰Ì¥ÑS
-W‚tÀzvr%§±l/ú»èû’‰SŠ1Ç}¿!gC¦‡*Шöwd·ÁÃð}¾ª»‰žúÁk&å‚©ßÜQŒ"ê…ˆÚy;M%b*Q#…Š2a9ÃFÌ"#œ¹·B»øh‹«¾ûÌ ¹%gñÌ*ùïÈökºYr%î<+_°*.‚w(-RÙû,ÆÆ‹½p3ïGfYƒ0)´*¹ÄÜ¢ƒXé€×
-ÅeMQì!T>¥D­ÍØÛ‘0Ì{X;X8C .pdm5|
- уAÁèýx6SmCäcPFa…&ˆrÝû‚¯óbφL´Êب›Zc`ðh2mJp^º¼ÿø¬5}´±HŠ’t‰u2 ´ôsDj˜ÜÐg‰¨ïåËâÊ‹]³¬–WÚ3…µÙEI“ÂÇ5ì7b©%ê¡*L§×4Þ‹‚0uŒ°Àä³–€¯§ªêæe‚…¾ôHœz.9ÐËC ¹fÊ
-_‰›P¹.BdÅþ†8%ïx|ˆ¥H¶µÅ^dÄ@cHBd(ºb¶5Q£‰o?'Û(|\J¸õ-蜨"ˤñDëÚl&ôy…S?6)ê,l#¤ž€À™¶8ÿ¶`z#Õi³9…A…lå5Òzõ£´Du8×r™D§2D¤‘f׸æÐcØͯ•: Cã`éíºzRj¶•î±Ô½VB¥†PYP²ÅAÚirÖ2,­;ÂÑì'Èn+w/‰›Ùm®ñ¶¾ZVêP£¤E–ÕYõʼ[•ÂQYaQhéÑz™º
-z±á³Q3Û‡þIªá ·âŘòf†QÏ!,x’Âdèý¬ÚEe
-aÂ
-ц’#Á¥@2Œ,™¤™G¼VZ”+ËmºÓ4·î¸±¥GdåEù”ù·åRúj˜V›Dg¡ ñÙ1,vGNœ«ûjÆßÁñ®vx`?"©Ð=*váy Ç@cq°·xßo$&0‹]ä¤húðS-&²ù¾ÓÇ­ä‘Á€*ÅEä­n={hÕ,ó² %¿š©b§-Gz«”&ÚÜõ¯Q€´ÅùV©ŠÆqÔ •äÕD&Ž%½*?0,—¼Ã{Ïc̘ËùÃæŠYŸƒ‹a áÄÐ –’ØL"&˜6”¼o•ãËI -lOar Ý#ý핾¹€¡ßëUÖ‡´:ój1²dÆ=­¦&ÞFÝê#‡Yà:2l
-ƒAÔ\6˜³s÷Œï
-¨Ò‘Ñ0°`w‘¥êk«}i$óx½“ITJðJœ0ð"c‡ÈN.ÄãuË7LöE1á™\ÒÐQìÉÔ‘¤0ˆ±‘¸3ÊV j!ÚÜ ªÃàÏ’²^ÓXIÍ&(e¸¬SS|ᚦÓÔÀ(Øun âWÆ¡úW¹Fröž %9
-1”ï[lrZNÅ—Âf¬Ÿè ¼§!ÄAgUm}¦1â°›Ç*ƒ{¡¤Z„D‰
-3Œíg²ñ„³4ÀQ»;6äI%s
-ë‡Å}ŠëQ´ø(¨TÀËBòΘ‹.Ö/âªUXN …ßàHˆÚ†€¦2•Ýöz¥å+\+Z™#ªÜèi@dí15r äÖa°Ž¬†ÄtÄ'­æ<nI)
-B΂Ԯ ýoP` dŠ³„îŽFF
-û^/48ìÀ!UzjZ22X•Š×zèf.«d ªmÞ™¤>Äù‰>5!ñj:é\¹¨ÀŽQƒà‰ŠL,PüÖzÐ]¥ÄNÊŠo)`"®º5Ÿ Þ3­s«˜\©… Õ=EXÚ@nPµZÚ/nZã<+²@µê¡ØM ìì™3’‡$æ¢ȱâaŒ(8•é7UàFÄ¡´f¬Áéo6'˜µÖÊ÷ËáÑX› }m—/&ÓK-›ø„×I­±üŒ‰^ë¤V´^±}á'è»àÍN³ I)ã)²¶26pÉ<bÛ¯t¢OƒïÖÈpztVJïKèY@‚§S GÈ Ëx5ÜéÒRHï+Þ›jœ¡X×½j†ðYËhZ_JŸ}_VŵjB47 [T d2·¤ó
-ÍYFY¡š•¥ÆÉ(—‡’á›Û´¸Áú38
-È%äù pªAaÉô3IŸ»¯~‰..t +ž)ÂÒqEy8›Ö*tjTMºZÕ8ûµ ÂÅ:X+*ëHo¸ž¡Ðì ¬:X¥㬤dx
-ç5©\ï‹5gyÔ,& ’˱X™Ycdûy¾€qh¸ÙäL6š§6ºI^îG„SÙù •Z›KלÆ2P*¡Sq´^X0oPEan#«\"[´‘@"ŸqÊ0)oè®Îy8E¥ï½ùœ×Dd|Zaº›!÷R7Ô¤!,3ëAìô &öÒ’õêÙg¥&auÄôžS\0Ï%ÒŒ*šaRcY!Bsð&ìó¥|چ׌”ý¨wS@qà3åÇíéd [Ý <ñ¼öƒ
-û;`\àP•9f¬âheÛ%Þˆžf ¬ˆ$`DrdðÀŠxº²î—#Ñ™p"‰õVÊ Êd¶½Y#5²9ý ¬ƒFÖ©È­ïÅH{HÄ”UÓ{ÓœØ+>5¶
-ž¾<rº Ûæ²æ«e•OüÄU„#48&Aò8€ $^ÀfÎÁ’W¦°Ü7 ïÛhÀÜÌ@6-n¦¨„)¶L}€6×°¦Ý¬b
-Æ)gJpñŒ&Ja*³°Ò“jOî@B× g:¤ Û £8$Úð}ѳêᘜV£oÄëûiµÐˆH2£­¬zÐuõÂÅñöÞØ>›!Có‹¸u6…
-/ã½w ¿vjLJëýF.ƒÛxx¬™>ô´µR,ï7hBÞxµ¼õ„ÌúËòâžÝþéüôæƒÿíòê—üÅ°ùð“K.>þå2úÝ?ðñ'‹ÑóÝiüõãÇW/±o??;_æŸ_ßÙåNPëGõÇþÈ??ô¥g·Ç'¿Û/½Á/}z|sv²ý™ë«ßŸ~ïW2ÿýüËkvédkè-quûÕé Á üQó|ìÞTaÑ&åÇŸ~½û—Ý»7Ý Jô/;þêî_>Ø}üôøúögùôüôòÅ÷?ý÷œßÛq¯^¿þšñ~ÏÐ_]¾xuvûšao¿øc¼t¼Îw˜'|}¦/?
-ü×Z^Çïüäpû|8ÿ!ÇŽêÀ¡ûž,™œê
-I™æÔͺ_g~vùNü@§»ß~üÅoÿm÷Õé &ÉESOÇ0«Ñíúßžž#_ág­qÚ;´·¼ÇE Øöí½>=½Œ/ÇÙnèkŠ/Ç=0ËØm_~ü§ãøîó1ûÙøÍÖ/{ÄßGÂk)ÚÔºøôüUÌÒEÒ¦ÉS¦~ñU=zûêÇßœ^ÞûÛ]¨AͶg–c& ¸Ñö^£ðgCKáñÏûü‹Ÿ-¿ðÛŸ-cþ·Ÿë»Œ·>qŠößeüÿ .¼ô”ÐÑŒŽÆ¥£Ô:ãw·ÅxË}ä±»ÙÕ°×U 4sÜÈøW¼ftUÇ6:®éµ«šÐÕ´×UÑ$¬‚[è*Þ§µ®㵫eþögÓæ%ìÌr7ö5G÷mÊ4ê©.=qLeÓQ^ Ž¶úWó´%¶÷&ª›£§ÍÓ=ªÞÔkÔc³”–•×µ…9rOó¦§1VåöÙr„óÚÞÉÚîêiìê)væÊQgIJMOÛw˜µVÔã„5º|ç·?ëRZúœ£ÏE‹¥Ê»M¦6›{„M5Å —¾¿øY沯K%Ç·@æ Îùêìî¶çÝlÊŸƒw¬Û‰‹i`û~}½ ‹ãÐ]µ¸GŒ «¿¶=ÆÚï6ºp]¼Ó!¶»—Ž{ÂKí°dÓöU8Jö¨¶]´=0úFßNùÇXòË>ÊwzšcL6̽Ð3Þê ÔÕŒ5»¼øåù¶]‰Ãž//fe=I}¨µ7Qôo‚ÄÇLx S–ëÝÛ-êá3·Ó­Šññ Ù¬_žˆÝÞžÒûÜžÓ뉧XÝnÎ~ŽqÛQñmµ\>¼‹Éú¥¸s†˜¸.&¸lÏìÒ·ç-8Šº.îƒèiE€>–Z»h¦ðtÚ…\¶og™®è»ÇþíÖ ¡]à~ ÛÓ-Öa¿]~)^tÞ.šì#i95'Š³Éçf "U‹°ÇåZ¶íˆÁm»ìcE·a´³%~¬Æ´×¸´{-x¿+Œu9&~‹EÞ®Áv’nþ%Ø$ûX®íÍ–þîÁZÑó€e‹»Æè†x)í…7MšV›“}¿l‚èûqÀ[°‹úÜ&7vqt]Ã
-i§N;›†hé·×ç¸`ýe]
-šŸß£v.þ›es{QLü÷o¾xòË«§þñ_vþñâürùóÑrn.³üêVÕg¬È[–ìI?Bÿ›O-¯ýüÅõ©‹˜Åÿsû§—§úë‡ÿíòæwß_ßü˦JkûÑïŽÒgÑ~óšÏéjÄ]|ðŸÿîgçòêòô &¨„ýᙉOþóßö¹žŸ]¾XÚ½Á³-‹ãÙéí/ù?ü|ÛOÿH¯ÿg¢ûÞ™x£ç?;^ÎÞ7Yø?øVÿž6úÿøî·:>ú7^Ñx¼“W7·Wۓ쯷ÿÇÍ1²\¸ó–-ö¦Ëñ¯¾/ž¡Ðÿ½ÊOa—Þ|ý‡÷ø6þoƒ›ó³“¿÷³ø(ça¼öý¾Ñ»ý[¼GC~´ø??ô0z“‡ùÓßúaÊ0ÃÃ~èiþ tõ?цý·|ª<W:~衾5_Æ?Õ·YãoùX xóºz~u»˜ON¿¾ýòúìjñýà£ÝÿÎ{põóÌ{võêúäôS€ýþæwÿrCý­‡pqz{üb1…Þuó;Žãÿ}áØÛ¬®Í‡9}¨,þ¢ëv-ˆ±˜1¯^îž_~óêø›ÓÝÓ«—¯^ê C­À¨ù;óîøúöùÕñõ‹Ý ã»Ýî:|˶9ØõSÓ+í~uúÇÛÝÏ_œÝ??;7·ÖòÿñÅ鋳W»¯No®Î_7tW¸ò¡A~~Žhóåéµ~âv·z~wÏ‚Òª²_¿ð(´ñ‚¥Œ{¿yyu{çSÇçgÞu%2ïÅ˳Gj‹É\æâºÍø'¿Ø}òêöj÷ÕñÍíéõÙŸOït‰Y|yüry€›³‹WçR¥îµó|¯‹e^âÅîΖ<¾=Ý‘Çu<Kg+úûâôæÛ6$þæfê¿·ûß_^üþêÕíîÅòÛd¬ùêöåòïï>ožîöúøòæåñ²%Nþ´ô{öb™‹˜¨\qß/ÅÏÖÜçéõŸÍëêüÁO>oì°~ô{ÝŒu»?Òî붌OÎÏ^.Ÿ‡£õÇe¼ß,æ%7®£ØûÆ5çùè»Ó“ÛåGžŸ_žÜ_e{_YÞê°v·ËnÜ_»¶÷öÜÿ÷ê»t÷D4Jß7ð`PÛ]}wzýAÓ›ý7ýûO~ñ,n§ËhoþýÛ³“oŸ^_}}v~jRµM×{}úÙç
-Ÿy¡»Ô¹©w?· âL}~ݧþîÞsMyW
-R~n
-ØbŸÑí™9’ó›Ã Rn³“Ý©ÃL6pjÚî¿°ûÄö¼Õ¨¯@H,.òZ^nRËíõJ·<1{˜Ï&ÌÁ÷¶”ÏþéÞ¹¿_J/¹{òš êÙ³ùyõ³s¼u‚ ÑÔNhŸýÓ†¬%,Ùn|ž¬.Û±„ÌM©6§G¿¢àä/Ìh>ß.àoy×ï'(¿SrSÜŸ Nø„P°áˆÐ["6²n[!S‚ KD‹ î#z®mÐí$4´ÛÎwк•Ç?ÔöŒˆ™M9¿SvÉõt_,a}6, 5x®6(Üuh_®€É÷¤Ù‰•üLõ€ÎÔÉøt– .£Ç
-¿¢Žº KÍ|Ìvô–LÎOGøµ ¿šS£ÈQ?ŒÁ¿;áXNNè+‹ôÌãÞ2ïÉä¢þ¯çËsX¦& ›’ ׸ÅYˆœ «¹oÏ8™J€Öº~j¢| m'òWç
-ZЫëÃo*R·÷Ùþëi›7ÆØYÿワÌpmcL©é0•‰(aj‡q‚á^ÀºšpÙ Ö¾6`KcºèæÓ§ê{ÌZ0cU™ÀL­A 3÷R¿˜ebÖcÖŸU³m+UÌ~öÎ1§ê¢Æœ×¦skB9ÌcR 0¯}xÂ|±¢ó“® hb,8‚š¶‹Dre,Ú
-ÿ`±Ýˆ%K~«†XJsRcdåÃ2ø¡‡eË–7_ãXaŒ±RÔ¨Ç*O«Nâ+¬ž-º°¦­ÓÄZ×_%ÖÙ›RØ×0¼Xz¦T7=lÔp›°I«VÇfƒ[Ì"l Kl­±e°m {ÄöeK;NÛGìbrd”Xv|Uª‰¢R“Pi”ºe§©4&£6¥ùŒ”¶â8¨tÚ‹[®tÿrJ_I«S»ž2¢‡”±S÷¨L.ku%9È»”Ù~v£,ô2eeyVt)k›êNÙ¼´Ê® ÀéÅ7Jå°Ž •“-À¼fÊU
-¸ñªíáöÒx‡{.q#*i"x¶¨ãéeu‰óa=^÷ZbxWyéàƒÍúˆÏ~Wüw8ªà‡Åt«Áfc—F»žU5Íö qy•AM bÿÖÄVqפ=­¼¦ØYï4 )¬ùª¦'š±måÒüÌÝßšѶh®f}[«9·ÍZóÜÚѺZ}‹6X ö´‰üޥ͖ë3m¥‰jÛ+ÝA;¸.‹Ú…§kÔn Ù¡ö²ŽEüÓF˜βðwt¿'  ÿú.ºìèŠ@*껺F×맺YîPÐm6î’È+õÚÄ|ª·&½·Pˆè£ƒ³EŸ>g}Ųžé;¹d[?Úcyý*Ò
-™÷ߦԙ\™ÊÓ³ÊÔíWœ¦éÈ™2m'ë¶Y¹k¬Íf<b4{æ¸9^:¶ÍùÍbon¹{Nó¨×.š×–ÚÒ|ýù²YŒ‰ï¢Å£™l,±å`±ä[º¶¥U©-ã|3cÙäv«2ç Y͵ÚÄꛩÜÖä53°–§õ«™XÁBt[•ÁĦÓÅC6gSµ¶EÝcÒ–»TT¶ÖѶMªN·mðÚñ¬® Àíö’Þj×õK{vl+Ú›{¯Ã>±'÷ö]¦ÒràÇUÜákŽÈ>µq䓃®£c°¤À&ó:Ž•Ö©'ê;§Ç¥9“îQÓYñ&rξ_sþ~|.e»lSà.ë%it…C^+×5*]ƒúâšwÕg×Ù©>»kÃÅío{•ît2‰»›Ö²Þ=5ÿØÜG“Áë1QÏ>ÊxÈ„µîiÔêCÏd£ÛxŽþ®Ækè¹<^¿~F‚ý,=Èw¼­ˆcíöïy÷–b¹í e2_>™pù¾"Á’o•ýúUå˜Ãï˜ç+þ„¦uðWSË4W~÷…Lê[ H%dV4èΗ‡Àª&xPß샮dš „ölýBpÖÎiƒ—±­²éTîP,ù»
-U–ÓlhìëéCÇÅ×(lŽv“áˆa¦—ÆËixØRçÇœÛ1¥ó§H˜˜ô#¥¼!~ÁìG«ƒ&j6'×ÑHéÔ–…JtLšˆèé0öǬå´5÷:µ±ºÇb³íúÇýuÜ9þ^ÅS³îO¼ýÓ^ĵãeBZÿ&üÕë6‘?ØN‰A"­JNS£OZJg2î(D’õË%—\LÒ-BݹÎo¹t&re‹…è·—qâ0*ÖSVMd•Jø úT³‡ÅS+öKjÛ¿g2h]úÉÒ|Ý$'åË9ôá´Û줳úÀ’îãÓbúhÔŸ26>™!*§u¦³LE2[Ãæ'kjä#Ù¸^ÿ›m~O“Ù_ú”Ó_¥\d®2æêe?·lÍ#y]ùûœ Zy`Œø¼\]
-:ß©[ ^¨kã†Â²õý[ÔÛ±V1²J$‹æÊQüM±’Ñû³,Å=©ïRÛ­*•¶¡Q¶É`™ØåoåÕT>¦ÖÚŠc9VU²ÑÞµ2¼ .U¬¿¸V}ä^Y-ûu¸¯.Œ}Mg­ØjQ篷ÖòY£µm©™«[çšf=m­MꃲþÐÀ”=cÃ׈†•€®Üø¹,&Mô¥j&¾óæW=VmžÁuË=Û[Åe¤ØZhR¿m}¢îRàíøÏ¢ÙþòáÊöiIu<™þo§lÔ;?ëâ´k©½]¢ßœtûßß6^-¾ËBô«a
-쿶)}áÛ¾8¾óΟÁ÷l0‰ôôá)ÖK⫯^orˆô±¾E£ÀûÁR`ÒoVë…þ¾±ñ\cjPƾƒ•×ÐZšÍÔ0«³{‡ÓÎÒ8Ò»²×Qrg_ß—éXôÆÑX«=þŠUêãk¶Rk•Ê¤5kU&'ä6õ•.->­ŸíßÓ}>;žyL?¿³êÔvšm[ßú¹+gsÏ+á¯Ä|“ ÖÎÌqº(·;×Åzsþ8ÎìO¹®þ
-üèEÜÇvv¬<aNËü³ô[§¡Á›>ëñ…ÿÿÜÍUAGUý#PÜ-76ÀÏÛ8Œw·£#§ÝÅ
-ð
-,ËðŠcìwˆS"wn²yµsoÛi›VIë̯½Ö™MóÄÆ[ÙR#èðX2RµS&¿˜oDöÛ£Šx“û1Ôš}Uìp0 ˆÇ ‚Sòíi{ª;H§Hb­÷˜é¥Ùšlö¾ªHXÇ! ‰¿N‹¾ (¨‰·M”YúlŒ!úS¨ÊSÍ“¦Ôˆæè:²`évlÆH$erÑŸ0 §g¿¥šÉ{‡¼rÂMc¹{úLìºp 6š»Ð37– †ˆÔÐRwy¾<¿Óxƒø5 kþ˜µê„gÒ¬†2Ä0o,§—xE=-Æ'˜}`¿wUà7³¯Tg½ÞID­ZÎ2¬`¾å”¹MXwO,ê©¢'
->™.éƒrâ÷ƒ®"Áìy¿H®Î+”–æïŠC¯Êf˜QçÍprM—WÑÎ}ånHz@Ž9Á[¼`H_†³m¼>ÊÖUXGR
-1#Âo†WSNŽ ;gË0hˆE\;àì5’ê±%¹»9`)÷„÷–ž}ø~ÍÙiX¿6€M4½O™Ó0 bµ »£6FÂ'zK{ñVÕ›4ˆ|>c&C)·½…cù1ì¨æb Olr6 œ«o†?½¾èÊàŠµ&Vo%S¬Ù'ƒfÜ©ÁÔ)‡^=HÚÓÉB ~Š€%nÛæ“@ÔnÒ%£÷g@ááþ†j‰žÁ¯ (“è‡è«§^pTáÛ0úõA>KP â!3éu›‰šcøuHÁ&! “asø€¸£JÀF%…âよÝ;¹ÿ"ˆšÀÞTP—PÀX
-ôdºgM|>—ç'Zõ+x`ÛîYEÚv¶ vq³ 0¯·ÙŸç‰Eõ\·®*ß@mN“”¾ít(¿¥!QSH³!f…¡Qv'^&‰ßö0¹úõXƒ‹-þô[ƒÐ$2òzk³=윙Ñh5¶¾é3 ÀJ¦ýÿɲðîþ€ñcÖG)Ugdµ²6¹4v“ÖU$ çŠK'Ž-²ËÞB2†0cì9¨dùR§
-:
-Ôš§'«#bF…&B­s†*™ °,ýŸ«ý³:ê_ÏóI0 ™‘ #~"Ýõ.€9žrØiW‘¶Šé{<#…Zc©ÚQ•X4i §I¡Ÿ¥(D–*Üü”à„4k1¾ò’ƒ¾AE¦vב÷o}ôì‡Ljë·Ï;-äÕJ Œ¥»-Ñþµ‹Ç«¥z‹$ô³Û f±ï56ïú:©Ø
-ùɱ‘ù>Ç×ÌKrÙÃÆHz8¼­¬¾Ì %ŸX@µ¯,ž @OË ±v„1æÅÝ` ̶ÜDJÚ_Œ·X|¸?™Ò”JlÖ=XªÆhk|¼!hxcÁ|W ÌÇ%Æ…]Ž×Ó³_0/á“#ÖÄühÐ „uWÇ.¹zäXty¾¢IöWPXc
-Ü¿!÷ ±c¿·lܸ— L&÷:ÙEiþµ9<q 1qÍëO¹—ÕȽ?`%“úÊ&Hî/‡1Òí!Ê°òY` ,îM†KDO0/OîJXj33Š¹oQ ’Ü%i× X|æÃq¿"¬`ìFOíܺœFžgºsi"LKÐvØ ·yGb[Ž€]Œ£x”\‰òÕùH];§ŒÏ‚µc1ë.%ZuôÅíã*¸ÈL~bÉEIlÊv÷O8Ú±C¦®'ƒ`³önº¥MìôËÌßW˜Ê¤NxT—
->sùFQÉ ÷¶6…Øè¢êÔж닱Pà)Ó¾x»cñïÔ´²ÑóÔ%Ú3ùƒ¯@õ+½gk©ob ýæÇ·t±“ÙWjÖ~`5ð-ÀŒ· `^Xê µ…­`Å @Aé5Éapiå#uDŽ[0É?Œš3/à\]ã¾ÉáÇbÏ´Lô30Å@k¨fR·÷ëy¯ì“BÖÁ€¸ï¯°Ë%sb³µ-ÀzYy"r7<øíC£ÛÁy-½¾êÞ Ú5 Ìf“ãc“/3aóiÉäܳŽ7ˆ±=±ñ©|6‡é¸ŠÊÕ š0–„yXEè|"<í|¦!ŠñZ#v|\ªsr.žc{¢žN:YJ¶¢wíÐCï/ÞÐjúMd§µJÂÕv\&~ ÂÀæa«’º\´àÏôÈ ­Ó“h -ï æÕññ£ê»¼ƒ% Ô¡•…´>l1ßÃE÷Ò«ñ!\Ý¡ÔÄúuàjÞTÏ| ºNUš:Ÿ±—ü^¦ÈùHÏô%5It
-<P4:¿ã†ã,–hö¶@{©èeQ „ðíkOddTd2Þ*b,ÛrŒ05ÜwŸ!Õ[ÿ:žjĽþÚß5JlÁ 6Ñ&p#CSIoÞ™wõ XaVt Em°¶³i@Ìkí%—pu•ÍL¸çÒÊ)­æq è,=ˆe-ó#µgó'¶‡»aÅ>þuª€‰ðåg@ì>¬D껕K<ßµÏXHÃùÒŒ˜mý&ö™è™Hùòú‡‘¿”Þ–n§ÞO/(k,퉅?·!&†î/ŒN!2¾Ù)‘;”·^Àìã¼@)iíù|ÈJ©jŽjÝL¦ì ˆ×”· më€äoX=a2Ixðƒ›ÈŽ7øƒüÙTô€6ý”¥"ŸU&´ä2PÈt­tɘí2s¾›˜Ád&lþÆï
-
-ÒÛ­±ñéi?_
-ãÿÌOòî zÂô²”%U—ÈkÔº+çÖUº{ÙÝtså3¥ &¼÷òµn&X™ÞRÓ'Tl)ˆÜ‰#ûZX)¼B’ž™i~ã-ýÇ;Ѳ@vxþŸ½˜åÖ…¼ °º]¡'%›xf)5ÄÚü§“öe2³ Å.}¸ý°qZm!Žö“¾î x={¿üáorUÞz\’$ ¨ –þKjÔeE]¼R’¼Òˆ‘aènHµs!¾ûéÎÔ
-Û¬š+èÝ~Á _ÿ]wëBÙ‚dzZdJ8ȳã˼±¼n'»ñj#u÷ g ËR=XB­uH®8°‹·ç“Öjþ¿r»ÂRSå(}¬yLQ“¨ª«›~ÌJðÊÜHÞ·cYF¥ÐàÀÞ¼9_,Óýuw¿F˜º0%»[ÿƒ¥!ÿqnæà Þk]rëCBTÝHxÃèí ™ýD0Ìq¼ÆhkbµYEƒ1º¼8á'‡+T 8ï/ª÷OèEÐm\ÄŸ^gTµð˜Xغ‘û[‡1\ó,1½3ÆÌVmMcÆÈ:„éK_~Ì´\W£…3^uÌTì˜ÙVtجᮡwcI}Õuvœ‹ sÄÚ-"΄Ïéó|y¶_(A95˜·¶ÌpžTà§S$<‰›¥\,ï?G|™PÛBî¿\­Ô©÷e#¾Ènƒ ÇÃS»!îÝÑXœêª1i6Ô
-çÓ)xn
-#M{î@v`D:P—
-
-œ‡–AêYåÓ¸0Ò¦;íøIiÅÞs)ƒT3hÏZSÑ,‚ԽԵݔ0R—¾g 9~„Gª$.®j6¡±ÚÈD>&‚Ô£RïNú°ÒîÀF.Ju)Jž¼£Mc!=7l"Mg Qò:¾"B
-Öâ$ÅÓ6Xɽk¤
-œOà‹Ê¥‘vÍ:£%W˜&oª·&9H¿B¶‚×l‡H <¤
-ü¬ÌÌ÷žÚØì
-%¿ëÛl«õJ¡±ž•ù̼ôý¥× "miw?¢HëËêh‚*ðDZ~§m­ü!$Œ´àÄ›d,FzÈ)…™ Ѷ†iåE„Àße[;š'„‘#©á Úï "í—×Y„î/cýíºg¤ÒžÏÖ?oÌÂHK¿‡mÙïsò,í0kÞ‰ø„טÒnÓ–Zms‚H}%³‹õÍ@Ž´#Ÿi®CïF:qêyL£ÿ*Œ ©CÑe¸#-ØF†@"51Hˆ€ý=Þ„~øÄGzÞkÂ4ÒKÔÈ)Öë)¤‰®=Ë„¦Ó¹Á
-œA‹,¤´s¾…‘ºº_¢HÁ&òkçécì±"KG)Üò¦bHgl¤®:°‘Yh}¥D…t¦Ñ¨¤Hû¿#uòÈ µÿûHÓR}Y¯l´‡¢H‘ö/‚؃@û0HÁX8cí‹">»Ä‘Bí_©‡úÿRx¬!Ì"…´ EŠt
-)ä}Z¨S48³:÷ßУOôDè“_³­œvƒëvÇæ}‘–Õqꔟ¶s/éuGK‹s/NKËÖé¶:5–ƒ&B^O´pÑÔc<Ž·®Tó'rÐÍ´±eeïGúÐáQ‡@Düõ/êEÄŸþ&€à§ f'#šhô‘Nÿ1÷4¤ßÜuKÐ0¸ðjÄó>±—°.ç~ÿSck̴Ϭ|oL@,iöpG¹(íS]nVÀ Th¯†u(½ǬT4\Þ=n Ã¶œÇѸ Û\+I¨Sk–×)v—†W-XºE“Cµ±üh<w "9–ýk"ÿŒèðÝyʘŸŸgFˆþˆÎàmþêÊçó§ºÏ@¯1¡Båµ)A,ùó·G듲,dK˜Ýø%EA)ä,÷±‚æ—V³®8;2µ²Ò½ã딤;Pn¾è•ü6å‰/Nšî
-qbqEþQô R\Ñã=ŠgK7Õ˞ؼw™C@ %z„i7€—ŒÜ,ÒSÊDý¡igß Ó®kÆDŶW"œàкÊׇÆÞÅÐàœÑV£øŒÔ鼆>Mìa䊽‹±F5¯X4ôì?ˆÑÀÒÚ¿4 ! Ö0ç:,ÚÞÙ½ÎGz è\‡™&ÓÁ>Vk3¨”Ÿÿ„±‰ïÒ˽1|[9¬•Œœ:ÂÀìr BtgòùnLÊå;i®{åXÙ¹JÎ¥ÊnjÚMðÏ·‘uHñ°,€dÔ¥òBÓ (ÆžPøL(ãˆ~\`|w)ø¸6ÊÕ{—XýBc¹¤{IOÎbƒŒÙæ—¦õA {œÆâ+§d–~¦…É=kßY‹nL2tF¦1Ðf¾/¢Û’e~Ó&™×µ'!ÞŸ¥¹rZ€XÅ=³ñJté͉î•åÝ9*è’¸Bw›:.o•/©X<Óù93¸Ã%‹æ/]Ù2 ¨•ü°úNF¿
-ü•N©þ(
-\b¥ƒµÃÝôþ"
-ÊÝšd Üdò+p^ß÷îö¾
-\HàlB­½”Í>:ÖQ\¦7ÞØ<¾qøìÝØÛþ²ÐÅÅLÍ, ø¼|bfÊÿš˜ÀZØKBV‹ŠÙ?F?p™¹…liŽ%þÌ/¨ILÂ<‡#Oµ…‚ü0
-ÂÄö¼–@uy)„Š yÝm,æ4F7ƒ½í¯êšUÒCSÈLvãFB¾êD+Ìù»c*ÙMì؆k%=Kv·O¥XÒ2% Â1MŸ™!)^6'SX0n–ýñÄfâ8>Ë|”'³ÆäKF/âJ1³wâ¡|)Åå¾ef>·í±„βïúØ£ëì™ãpí;ðÜ$à·MÁ Ù?œX¥EÕ.Ñ,0–¦ÄÏ{ªvÉÎã»>‹!oò,ÿEÅqZ‰§¦‰'ÁH«Ò1ðÚðR%Ö©˜PŠ¦øü=—E0Ks=˜‚ó'7Ïwz–#µ¸ÑéØÇ2DOÌɇXfÊ+Àž¯xùã:XߤØÓ4Qùƒd$ÚŸ(Æuü:®™è”áÖ drÉÓe|¾fÖÕkÂ~Ké|9
-v¬3ÙÞϬ‡ÜÇb"(nL¤˜n)'&²µ—ùŒ÷Ïkç»j@H¼ŸŽà˜žÍ¾L8ròHD¡Pú‚óL®‡H‰øç &׉;ÄãYµlD"žµGÃCijöød"xL(êíé´ÞaC&ùˆåUx— 0Éke„ä˜(vrÙPB‡ô~Í^\hŸ¹ Áy}Dò‘œ$BVy»ØS8âW‹Ü¦%fýx%ðÓÛи^iÞmzÓ£ &ŸI_ìôÔ ¾g¤Ú• aYìbá?e¤Ž•CI¤23RÇʉ—Á“T¿d¤öŽŸÉH…p>‘‘
-óÅÞÏH…P>‘‘
-áÈ»šg Åõ!¿4õå #½™ž}.vÞfC^*œ°ût*Šç—ŒèùD*œà¼|<îï~K.Ťm÷ìÊ7RáØw¡d¸ÿ“T8¯ÂÿA*œ°L¦}Ö•R Ù¢€}²TâÓR4VUÎð\},iybÉ ô‚ Ü²<Š2ȘøÍv/ê0— ¿z¸ÀÊFïÊ<‘ºˆr¡-Áò<¹™ŸW×½‡¿9ܼ£Ûÿ°jœI=¨Äe¤¼LoZã!¡š]S¤_H%³^´@ò“¨·‹Ê†_©S,žñ4rÉ„ešL&¬yX„ ~¸mGø†ÛeÚãÄÍÅÊ:ƒV£ô-žwæ«*ìåÅMv NËE¶ó™…Ô½4à!l/–açêv¤’ÝfVQ¤6²‘Ê°ÃË«âX éHiÚìg!åçbŒg–ŽŸìæê, ÷Ê„¼0¥N*ÙÍná!åÖã nÅ2ì<*ÕÑsí‰%»}Kem¥3ìö†(RMa¾œ‰!K×ã«vÄ‘¦JßiQòªwÎàP i•›a‡f0,=jô‰^ç™í‚Bí(¯§¥«WÑ¥¯Píè­³àPDK7+)B^7ü UÊw,#ä–«ÁwÔX8gDÍþ3©=Ï#Tù^ñ:VG]b‹ItêYpê³8Êzýd%9¡²#wªÈð.IU’{É ÷MÈ‘|’ ‰î„|!®ïY9ɸ>ùëéI9Ññ Õ}{VlDîøž×MôguFxw©½Q?N>¿¤çâ…ˆDÃ]å “öôþ%›îo~˜W³é„ì€[-ÎÏeÓɼæÍl:!Ÿ Ÿ_ÞϦÊ¥ûkæ£x6/^8Òþl:Yhž¼ì­l:!POnùC6Ýwä³é„Îiî{åDzé„réØöþg²é„rédÆö¼M'äk¿U`ÿ\6Ðì"OïG³é„”vìèg²é„réDn›#›î±KK•¸¦ô×l:!åT:›Nhþ¢¡Þ̦ãƒzZSøOÙtbºåg³éäSìl:(þ™ø‡²éþD±—³é$s¬>–M'œ[ýél:!
-"YÏbâuI®(Q]Ž{0õ§.AŠN½TvYªK¢F‚Ne—ED&ÜŸQÔž;ó,"§ÚxRØ\Ú3w¯–%Uèîí2w¬{®dªä)s'Z]./+WIf™;±L.y‰t²$¤ã“™BwïÍUº{SeFÒK%«ÌÝS"$ÌÛeîhFºÐÝÛeî¨Ü·'…îäò¸çÊmÚ¥'Q~žEþc!J‡<£rÿ9— -¬—»>EOy`º§±‡ÏÖ'L£ƒÆ³¤^V"œˆfÅó Cñ Ùù…
-£5z+G˜±÷.QR6„Hù´Þ«T µáñHfâ=FPKZâb1Ôóóú#™)÷›_×$A®Ÿª`^TĈeó~ó¥BÕb§o°ðÚÛêE*ªó8¸%€‚ónµj
-Ê …n8|-Vµ)#‘á¥^½Q€ [2dyàß®pw˯«q÷6®økÝê×*ÜIe>¾Á†·…FW¸ûH¥¼§ùDò*å½›Ot¯”÷>JT¸ãæ%ÉÉùK…;©z¯°ÆÝëîäÞj³ŸÞO¬í5GÌz•X €=Wsrª6Ýßkù™îwýG0¿°(˜ýÚ=WÎäæÃÎGò9‹6y¶ØS8â¹°¼$&ųk&P¹¼WòÛ…’˜Ø§¢P@˜Ø0 {22üZ·ºo2Ó˜ä$1iþ%ÊÚÅä¤1qùÄwÊ€ºÏ‹hS@'+C]Òl¿se@'‡+å$1iÃ;¾òýW»²óR“X¬(±Ó¾¦vèÞ7nåç)†—%vºT ˆOä¸&-â·ŠAûåÕŠt/•{D¤×ǺŸ»šª‹Nß>”ãÚ½šêufr~©Üã“JyÖ?渲øó†!#ëùyŽ+è’ì¬g©WÚ'¢àÆwSý`Æ[&Ü Öödškªy®®À‰¨±ÞïGFø”® ì>²Ó#gmDIPrí²|Çô'N^)Zc#åäÃ)ð³ªÕ­°]UÜ:läwW$N/ž„wºŽv®Læ¥áÙ b¹•Ú[Ó÷Å’ðz¢HÁX”äÁ):V[ZõÕEªÍN,?buØô Ò{&CàŠÛÁBÊMM;k½¦Ž “—å¨×E¿7BH8$0¿æ' oÌÏýc“7ªˆ õ¨pW‰1>X~FÜPiZíGš®ª¾„¢ºo¾ 'µ’´&UG0ßGšJ5INd@«†ïM÷OtæÕ¶rg_¤3imÇί´ ¸ ˆÆÀþ’b¶I0残¯tÞkhowóLJø‰ïÌ°I@T·qª˜=œ”±7Øa~bÓS‰xJÒch•h—àJïTRNjÓóĦó§*³ ‡î“Ê,r=I„th•èÔ=Tfꯄ IeÝñnž|#+íI„&E%…¼õÄ;ôzu|w¯5Ì»{¹Ê¢H—¢´øü"›è/Ei)p©N‰û‰_ë–âqZtbcyâ*Õ‹¸‡×©Çš)3%
-ü%‡®h]?é¡ñ|®ëÇéÈCU¿?T
-Þý‡º~Ò7ÝÏÄ߬ë'¹Ñ%Ñ.öº~Òná—n ’¨ë'mê
-FAÿ¡®ŸPš$ÃzïÕãû@ÎûKuý¤¡@?ÿ'êúI¨(dÃy'ñŸ‘ú׺~ª&«ª»:ƒíº~<6´q«úqîìz9=Åv¯ë÷4ïõ#uý¤«úÝWò›uý¤®Y©oÕõcò·„Ö"ïž«?×õ“& Ò`?P×O‚×Îkç‡êñ¤¡È®Ç÷¤œœìz|oÕõ»CdŸW³9êúIä=<¶¿Z×OZ“‡7|¢®ŸØÞz<Iü[þ– uþv’øŒ ŸÕõ“>oæFü½®—Ú|kñ¯õø^ Ò¯Ç÷ö¹Wõ{¿Ÿœ$¦g·7<Æj¼VŠŸ‘ú^]?Žcû¡ª•1ô~]¿{ª”T]Ñ·ëúI«9"kìåº~ÒUýÞ¾µ‰®ë÷¦¯Of]?y¯¨ë']Õïåz|ÊÂåIËǺ~O†gUõcay«®ß£+™]ÕOì–³WëúI‡wñv±?×õ“tâù”þ\×O`^XUý¤ï…“_×ïï~K.Å^Ïy±+ߨëÇ.¡ª~ŽäÕõ“\¬
- ïÕõ“V )ëõýº~Ò ±ôŽüv]?î ùUýô1Ù7Yqëú‰+A”óä&+™uýdé0o×õcÏäãŽDv­
-×õ“Þ$³8?–KíûVíáKJG+7…#>ø÷J-©y{%x*îÚ•¼ç¥-rVÓm1§7‘ðOù¦hT:ÎiÙ3„±YËsÏž%Ž%Z8ÃÜ7Çy‰m%‡¿Kj›µ³öR`>¦.F²›n‡Y§ß—ó´Ì‘‘Mß_mtæ­^›8&l™ŸR\u¼&<Xo<s‚O£îö3šbùXs×Ýoîu[\S_‘ìXò–æ.¤]£DmÝŒÎêEO{Ù˜—ÜÇ–n¾P·ãzñ«lÔòëÀ&ÔÙÏ£ºÝqè=â§ØÎSÂÚ¥¨VíÔ¥=øâ;›Õ_—ªo×¾7мr;#ÍF½…YŒƒæø9¶Œ!§6f#ù„\Ls¶´GS;F~ÝéìkgϪgrvO¾+÷Lˆ1l5·-΂_yK{ûµžÎ½=,6çWQ¹Õ2„“_ü* ýñiõ
-ÿL˜© Û­Y…à)ð¿ClÚˆžf8Œ75ÁQréÍâø® ÷
-%H x~gP¿{q„êU¶1‹ÜÃålJ2êÐGÏ6AííCòƒŽº N -ÈÐBçFøÀ3otsEu¿ÓÞauÚ}*›|Ú•LÙ0,žeå;‰Ÿ¶`Œâí«ŽºP8Cí0Òw¥[ãÞ“¬.£gÊd\ ~V»ÀÆ-îí 4=„i•â0&ÕÑÔ]¯É8tþ®“ÑtÑ3¥2MÛføŽ8Â{WçŠÕYI’8Â6Wº­<N%~±Òq a _{Ó`ƒf§&øm\G˜ìéÍûE+z
-6ÿ–=;Ön‰½óM¸ /‘©ÒÒÕ¡?Õ»‚ÙgtKT—jèJø¢Ë¯¬et=Ã÷É9¹©t1çM›£®µ€âÁ•æר†õƒéyqu¿ RŒ¾‡„{g…&Yîa¨‚ÞÌå µ­cÀÊ+ÓFz@Ĺ~ïš#Kçö›}O -û¨îéL÷±Øl¡#NÔ¬!
-ü͉ ¯Ñ½W[Ý
- ¤RHÙò»Óž¶Çⶼ}ëŸÊf¸;èž0܈y®–W»É¶3‚Þ^7ŸhïÌ%–݉ÏÌ»)б85!OÞºŠ4óN 1‚gßaê@Ŧ³|!%ÿ¦âÛ€QT·ØMIt 0ŽØMºr‘ß>)dõ4oèj]ʨšŸ×Z6uÜEF3ãøIÌ‹{”Ë…Jïö,gÛ)Z¶Æ3OÌqÝ–íýÚÅ#í´b~{ÆúZj}¬ë߀ gƒvˆ!ÈU·pôÈ»¿ê)l°JjGh¬úî‘ÃpýÎ43åôІ—nøÉɸñe˜é ˆi(EôÆš î9òí©ðbÊJ¦ã˜̾¢Ý{ÏÚl›^í³Ù³Ú äh#{,0[òga7ͶÜ:ë§ãù)‘C¹w¸p£}šYøÔ²OÔZEd„ó^ø3Ý+ ˆCçO2ÖXÂK{áÐúã+ìîf4ñاëG n“8Ó⑃Ùû«ÍDX·p˜øKew賡`ª¸>âè¬[ÆÈÕ;†_1—3ÚÔyQ½ò‚x 9ØÄê6£ŽQ©TBšÒÄãÐ×0Â>Í&Ê€_4 ¿ô(;7]˜EAo#V»é°%C4mD Œ= :—5AC1} ÃÈèîî¢è¦U‹¢n ±ù5yL%Êmì(oqã\`ƪ2ªÀÑÿh‹ð~ðè`ýšïí¡Öùøhâ,âä…é’ùx|²aC¾BÛË*‹¤ûÈ 4
-A“»Ó”=Õ¹:‚úE{áX+¯4Ž†iKüÑÕ!àè@þ8¿û@¾*ñ÷ʪØö—§_7F‚Þf
-†@÷RNNthÉÞòvÐeeΑy̾ºf ÿÍ’ƒôr0“´«‘Š_8±Vª=c>¤#Ì_bvM$a iÇpJÚÁDÅ=
-؇q¯^³ÎX#à.¨“áÛ‹¤™yÁ;f`^
-!îf{ÈÛ!JŽåàŸ(Åû¦ã¡,Ìöw¹"¹I
-m‘÷?»I
-m‘
-üÓ›¤ÐÉlœŸÚ$…¶Hn) Û¡ÎC$.;z×Íw?ñ9ìf0£MÆ®§f0ÝŽŠE˜jØ›r\‡òm#‘lL\¼`ÕÑs-Þ
-Ðe[öB¡LàÅÝÈœ
-ÐV"3z™ð”ïEj¾yí¸Tå RÇ,9[†¨Oî¨v¼µ¢ž‰Ü²‘Ä}Jºý»€KBÅØJï ÷32Ur ÃüÍgô’J~“–ÿ·*9¤ØŸ|F/©älÓÿJN]Bêû?VÉἈ¨ÐTÉÙæÿN%XX>±ÿ+•®1 ”ßUò3eôi¥›œú!Ðk)+szê˜nØ ¬è¸Îëã¾µ"eƒ²øzt\¢ÛN ;Tf‰“ RwÑÜÐoÜ3S‡d€×¾€bÜ:ݽ½´´
-Š$ÌN5~Údv~Æäø<e„£,V‰•$è†RŒÍêìòžé¡GK…¢lº ´Ðê~:f¤£Æ?QP)k·S»Û¤Àqð¤>¿\°{˜˜ÿ¬v…ñæ'…ýõ¯ ükÿçúçp»Ñ^?xà†O ….1>Ïõÿ
-;>´ÆOb5½¬ö»ñé?ÿðQ§Xhf‰tÃà?è‡mš‚çzèy‚¾ ¶qð_çÚø|*+l›Ãév
-È/<†ûŸÀ
-ŸèÿöÉgŸþìóß|ú¿×ßãýOþ¯?þþò¿ÿÍÝô›»vÿ—uÿ«ÿñ ž•¿Åg¥oñYákŸõîo%–X xóækC‚@x*Þ¾ÿä‹/þ,Á`W~½dø·ý?áÝñc#¦ /8„Ý·þPFK½[∈7 é÷eay®ýþòLí¾Ä‡°P¼6Þ¨ë_—xÊõ¡…Š­8Úú·55cýø¼;®YÈÌsí‰ã9±­ 3ò=™w¤PÖÓz9þ=ŵmð­û)L^~üξf¿Ë~Îñ¾§z»vÈ/¯øŸùèõ×¹6|Œº¿6ýÛ¯ñié¡æ÷Ø›Ø?¿”‡ÒŽ¿Ú[¾½Û#1¯;îðgà'×4Ùl쿽ŗåõ´8O—¤Tùùû1>pü’Ø«ì‡ïzú˜·Ï|¨OÂ?Ü=3“ÏÍö¼¾Á3«v]ÙÓÊ¿½{OÑs‹°·wÏ¡ð)RoVþÞý»Ï¹™¸üXJk«”Ê}|ÛäPÇÀù[#N8Ší¸þˆô#V^VþÞ>·­su=Ó—yÝ>—‚öÞþZRð[—–”ü}ÎãMÌã7ž˜Çš˜Ço>1wÏ|ìyl‚x]h#7Œ•ÖøÂ}m¶Ø1[!ˆÖË–šñŒ™×Îã}åaA¾áGÊœ|¥µK¨x¥4¾cMÞXcyî ¸¹=äÆWeýkª÷9¯÷Ñ-ù¡§¸>šéÚ Úœ3Œ¥fö‡:'h}4þ”ÚÈk²5²$jám}®·c¨!½òú®Ö8‰½ó× 0ð ùa®Ò¯õuÛÚ:5=¤Q’ÍÇÒ ËxˆkÚïog3½..-•Û½ø§o.X?@°<~`yü†‚å¹õIø÷µÏ’zÉé(…Ç­Œì¨.±ãV«õ¨!k/ü´µ×¼ÏÊßšP•øƒ#Ï¡‘ž×¿á‚­Ü›£gà6÷€O˜Ê\ð…1׬ûj+^×Òû}ic1V®øx(evŒ„–꣄|Ú\)WŸ‰¸@&õ鈕›½™†ó-¹ÒÖ¾ÃXšÖz®„‘¾6·äÊÀ䬻©>ôÊ{jNI_1ê²X×+,PuÉŒ”—dYŸ±¬¸®ïÈ#­²
-¹¼ŽW*$Ä\`*êÃZÇŠ‘ZG”ÌH}uäÒº6d\$SYKY}¯¯Sb¬i¥Ð¨ë`ë„óXzŠî[3Ò×'f€£âHâ.ÍKçÈ ±!ÙÞ.Ðl3³i$®™†ª+í»=7¨¶A7µ0΄3qéâimãû¸vLò3qm4LÙÂi ëuq(öÍ{Auaxøž°,½R“Ž-GïÀ^™ØÏàc½ÞRÜc)U·A»‡¦Eq·¶\N¶KQë¾°ks¯ïÄê¦ýTÄ‘]©úÉg‹äXXŸRZ| ¿ùP›G½¢
-KPŒµZrGk(¹ÞòÁ3Çd:c~Ôä…Ðud­±¥Åòm¬‰Ç@M¦éÎub¤,µÊ!Ÿ–nÃÅŒ%ê4É-Qÿ®™8]¯3Ó"\2ºjêp¬ù^Ö\Óð=a.|GÊtŒ´€ÍÒ´ziûô*PÌÖV ¼
-¿·„ò}\ª™±…ðÖ5ë¼Ê¹ê kg>ïëAØ-}Nj÷ËÐ̶â#ó[Ý ‘e3`B‰®®a½ÖûÆx¬ gòX¯:ÓxÀ<}¨M‚±"Ús)ÖfNí1¼Í>èéËÂ+Ûݽ¹­­¥ª±e@&‰Þ—們ä&NS, ŽiS»––OùL N0ÌAÀÅ}‰îJËʾá²HZ{Ó´z]Ç‚åóC#©dºJèÉa‰@P9yÄ|]?‹IÌÓ´Ÿ‰oxt kKÆV,îzÉu¹Ö¿d8ÖþH¹k¹×ÞŽ<h–"ã¨ä¯éï•zŒPI ¡EwÝø4‹5°ç^*Oj“਴ˆkÖñOTz¬Ÿx/Fawãr
-g™ã²ãé#Eó2„u c ¸†P .cIÌ=q±<@êÄò(k%—12Ê$r.²zós½õù;,Ø4,K¥Beˆ¹dê\/€ê¸uý¥Ü6à‹êËz¦úÀ²´+5Ù…Ë´þH !h
-Û”×*ð0Æ@2e½e3m©ù/TθEe,8êúƜϢ’Ö´{¼l}­à8| ’òü6I³[ô˜dðY& —I±&ï ’³Cr¬ƒã-5å:Í1P¶O«Ø+,œ
-]X¸@/fèÑDeY¿LU£´";’×,YYÒÜB3T”õùœˆ•c¡2x/œ-xRIM½ç}öC;]Òrà|6 a‰ÒuµCÏœ§:‚9˹ððÑØ:\»ëç–ø¤ÝEvä@a9gÜÂ’[e­@·ó¸äÌ­ãèþfÕZ{¨¾
-Xž>Ô&áŠKê“xß–±“YŠŸäWXfØ-ùðÑ®í—׬æp‰1ñª» Kê\”0]Xò_Þ #¼™ó ›Å`¹p–è¢uÃ’Ðà q¦"TÄuÐÃÆK®=`Ó>ú—Ý>a<5S\×9²“ûõ/µK¦iX…š7,sÌHßx¨†¶þ”–J™a-ÒI<àå{¯me‘ŠÑõ X˜G7X®¯àÜU6Çrµ2_CìàæCm®¸ÔL—ŽÉOîqÒ˜«g`N(dÌe‰v>ßÂRpïã [_Óvð  -JŒv¯M:ÕÒ”"Ù[eÔ§u7]–jÈ@ÝQ6wy}Q^óò,—aň–ûï²äî‚e,£8,yR¯Ã˜îGþ|ZVò=€žf,sª”Ÿs‰Y×-ÛZRÀ2 †¢,3îËSn
-Âr"ͱ1Ã%A¿„°¾ÁåªýþfõZû)¿
-`ž>Ô&Ái©bYfN<Ÿß¡%¬?1ª%‹}s½D-ÛÏM®13:—Àl2Cá·ÒHëKPrQZt\ÒÈ… ¥i
-e2ù­RÖ¸šÜ1© GX_ŸÁVÉ4èÄÉ Ø`j&ü ™aT˜‰8äðäï¯Oï
-¤úð,¡š–=½ÄåÒ.‹P¹Œí5F‰P=×ì9T Cec/=&æ(`2ÿ
-HR$p‰g8`×m=J<#F‘D°Œî…°.;œj(²I
-£7‰b’àfíô ¿L0JY
-„z§ þû‡¥N)lÀUÄ©XîFõKgy”úuÂÑLsã¨O¾ƒù;jrjª²v€#ø¥1²­O=hÈ$n4'2  × O´«}ã(¦ÀH…G˜EódèÜ튗@ÀÍ>ü¸KüÒ/ƒw繋üû¥­ue”.3cÌ¢D+‰rjMtN8šëš€*ß7ӡ׫õJC£%¾ærX:c®”¸©çŠÖ¤)ß?ÍyH$.¿¡ÈSdÒêÌ4AݺÍ&¶ž"i®Í¸‘d()ò“Iˆïâw–1¯ÇHÙfîhQئáÔ‘ VT@‚º‰Ä%$Òsî– ª•Iiqh"¦ÒÊ3Ò›A«Íõ! ÆõØ@ZV(ÓöbîKd0p¡»Zfã2aúúå%áL]¤+P°Ž[4Lð¨ƒFéO$^[¼È†Åšä™:»-~/±4[=ű W,•¥©È•Ç?K2Yü£KS¿ßEFg0!ºk`bDNæQΆ“¹£t,™ ¸ûFS«É0^ M±Ç"3VÁµ¢ &¬Ø±¹Ôô¤”ÂÀp‚²³¼"Œ>…/8?pÞõØý6æÌ4¨™Ê·^pFä®m±”h``d¦?AÝjÄ™Ž2¼wÌR$‰T
-®Í@]×ÐF\e0NRŽYæXÌ›¬²ÜŸÀ‚©†qÿ  °Ú^Œ LC€‚Ù(™zaëò¥¥T$¸—¶SÓËÓ¿‰$¼ª\Á%î[ £¿@~ð‘r‡Ä…‡qä×Õ‰2…u6(JÕ£)˜+ó…"ñi¸8Þ)¬H|úÎæ<¯õŽîiQç©Ò"òªæ£w^G¹P0VÜC6ÍÐcç×i|¼.
-}í·oýZG{Tª+L“2½@)úº =VËÚfUhÙ1­Ó5àFôôðûeίŸ6à ïq)¹‘LÚ…<¡4¬»ºr}³T\$¦¹7¼£ô¡Þ#Sù¨)–úΖem:z*±çéà‹ò×׋Í! V:×b*ÓF¬©Z¸ ….ð¯õl85L[`Ý5t4#!6Š¯2äŽÅcdçÉ·ÕÜ»u‡w¡ý¸ÕVÕ*ï)xÒ2d™’é ¹ÄRÉ(ƒ¨IÍ"wEˆJ°Â9:Y·‘Æ°XÃúÄšÁ¥ÁAK‘²Á³F»p ˆ=™”S›ëiÑëÄ.‹2¨ ôuÉãöÈdéQ¯aÈuf«Õ–“´Zý,~ƒ…]šÝ¶V.¯O]c3(pwWqCÍ*¬“ï× Ûa¡ÈDeÅøP]¯²*¦¨Ð`sJ¥è˜¢ÌкU?-øŽ°,žÜ=?rô²NLð¨Žñ‚ƒ6Gi=<7âèИÌ=‚Þ2aÓÔêšJ™Ÿèc·°ef&ME½ºè"å¹î¨AäÉ]Û«Wݪ¸AQTHo!†!8C“MáJàÉKÍu¢¬Ï¦CV(‚y|D+ö[Ó"Š#ñ]{;GˆjM#JJ\€©u¯Nç,ÃÜ´„Ëê †Èüù-Xê•dk¾ŒŸrYS’š!tí¡ÎÚΩ‚‹
-µ }íxŽˆT¡vvà Ç3ÒmF°“‰b¢ÂDpà@õè–!¶’ºv2YX½ÛïŸ~õã \MƒIäòÌW÷7au µÓZeƒ"SŠJßÓDEèKüÇB?ÏgÃY’sŠCÌ„>°V«Naú½Ö¢@£éhJwd2ÈÓ·¿ªÍßØ]²V¢Í³1ƒ5Öôàõ-ݽY
-i“?ýÆÈþ2|OÆñ!œñ4‹Bþ˜?™•…ÀšíõüâJ8ý¼«ZÌÍŒwÍ
-ß¾üu.^lîC/íü戂D‹ D«dv»fvO¡êªÊÂØ {wB ˜²‘ú<OR–Høåó¬Déþ'?ûü$"Š÷}þÇß}ôþwŸ|ñ»ÏÿåçŸþñþþ77¤D‘ÜGFtßó~;Ï>ü;}ó_-RüÊ}þÅþâc2·ýÅÇðZ,½s-©ýùâÁby!W‡÷ºF6¹›`Bž 1Ä·ì"¿]wÜQ]Rt]µ¡ÊwÜb/…«¾Œ’ê£?üáýqMãýGÿöÇßßÿâ“/þøé~÷ÿ}úW ÎúÚOMäšèßüþŸ?ýø£ŸÍÿÛ?ñéþýÓß|ü|ú§uÑšïŸ\áò÷xÿ“¿ýýïßßÿåÿúäŸ|öÅñ¯?ûüwüÝ'ï×ïÚÊ¿òŸ>~úùz% ¿1õ'¿øô“õ¿ùÝgÿí·¿ýâÓ?þZÿŸù§_ý•Á|þ%õe÷ù§÷÷Ûß~úøÇãËýŽýõ?ûü‹?~òùã§ÿô“?~òñÏ~úñÏ?ù_õt‚þîúøoø‰ÛN˜ŒëòÏÿù}/…X
-÷¿¸ †4qýꣻW_ª?S¢þ<}q÷×gB²Û·þDÇLE(.h†uA!ýÛ:˜Ë0+.IJƒzú1‡ õöUÌØ‚¸GhŽzçI}g™î±lN
->‰ª9³¿Iö%™>b‡Bj¡Ÿ¯BZCLòP ³îù} “è~_PøU¹uï¤6Å€±Š"\;† Áçú`P˜òø9ÑY‡#fWÑÛe9-*yúÿI¥wŸÇòƒe6åè!4G=ŽE”óøˆ9Þñt•½u‚ÛÍ5D.—ñö™Õ}÷Û»¿þå’•Óä≵îƒÉêø²8QßÐ]mÊR‡ß a:-®*EŠh¶Y« AÌío£  U´ØÃpæVÓøk,µîe™ ¡º¤Ú/ðýè):w1Ô.?†1èRx)Y|2j7¿ý¼/§¥{f|¨í­ä#…ýZØc˜Å†¤r^ho§vò··åµAØ^ôÅg!ñãæåmà­©2pí‹àöÔÔøsŽ‘ãçöØñVûIûÕ/Ÿ÷ö«ç@õwÏÎú3KSŸ¼Ô³ ý ·y{÷SÏ‚îéŒ?â+Ò¯x¹Ù½€îäG„ýˆ°çö÷çYëki£ƒ9¯ä-ë65zn¡sß× Tsc“©LžÁ`NÅg</ª·óŒÚVO9=ÆP”{{ÕØgéù?t}?p}?h}?p}.³rƒçæéf6Q]¤Ál—Ég‡¡äÏJ-&j~§JClŒ#Kù±‘˜Ìµ™Ê‹êþD–o‚Ê÷R>&}œ(u“çy­*ý
-ܨs
-ózî`¬8hµ_àÍã?;›=¬!o»yø­ ©`°YÖ^~`…BQ|Mj`«#}>!7ÃûóX}2á’%úPQùøa¢òñEå㇉Êǯž›©—sîø¡âçæréúÅ0ÖPeZ s¯Šñ{ÔÚ]9%TQ(åPÛ" ~á8ŽQçnêqßÖ`µÁd?Ag¼ö¡ô^Mî +ÈdJE]<wyÏf{0f Ø$°½°%öoVEà0H?º^!8H£'81;‘kMy”Ó¶gKá­Å½\u`Ç°^jÚ‰ëÖÝ€n ‘ £qûpçŒMž}!,š¢‡ex,Ø3±Ç—Jþ2þMÄÕì>Kz1DÞ#»µ2¥Ó»…“”o¼¿O:)±… <‡ˆxz8ufÅBŠqj‚v±gÏ\€tÁ/)d^ù¾ÎÍÔK„ŽÇAøÚnÍäµ
-ª L§ƒÂá)íZ܇s,×ÝP€ŒµrU¹€?„ÕY77£œ0+ÀzvHºÜ§±û­ŒüPŒ(¯<=$Á·£`ÇŽ{Ù QÉ:I°zA[1QÌŨéþÉì\W$Ög”ðW†ÊøÜD½”=èxZC„ÛP©Š(¤)
-7¡î5ºþ•¹µ
-†N
-)bÂi ª9rQÞüƒ÷ld¤’#»5h'8¼«‰eöÕ˜\›‘"P£).¤Ä¬žH•,DúØ|­h#1Ž-POü Bsxy£ð4·CáŸÌ‚Á2[v1þ¿ÒÝ5{±ËBY”øUƒõ:6S/§:˜Û!KIùÈÁ1 ¬%µl‡dÉî=˜ÒÜ
-ÔE{ã†Y`S¸`•—®›ª&
-‹‰Äضn?šÄEX׳¢P>‡,ÃucR,€ÛÖ³+R¶ FÌQܼҳ׾´Seà„5Ìsÿ“â…ÇAÉ–ßÄjMUâk›‰iô\=r]yšô²H_2T›ºÛåÈãÄ^×3´üê1}™›©SÏ‹ÝqÓÒè)t¶c°FÓûXK­¡îÀG ¸Ã‹–%L´2M
-–¨æ»½‘‹¥è¢è²éx\F`:y#†ˆÄîÔ¶ ;ZÐÈÚ«[ç]Cc±o·Ù´93ãev/kʤµWŽëëØL½œÚèpnOøcØÈÖįˇ)®pö­÷ÕÈœI;TÖç°Û¸ûÀ§µFj&…KKrŠxØ…5·é;É&U’Ù³ëßæŸ8¤¾u Y9~1ç.jàÍ;1BÏ–yN×UÐh‘'Ð o“6fõ|*š–Ì2Ý~C±…#ï:º¿‰©™Ô s½Qmj/+êT7¯Õ×9°™z9/ÒñÀÈ·«ËÅ y+¦kÙ•˜ÌOTÓát+qNS´‡kÑ}‰Ã¸¬.ðØ$™iìòA:î4´S|#B_ß?™d,&+¡(eÝôD@>{ß Ž.7R2{&_î2j+fSÆJ•¬[¯^O’3»mû˜‡Äwö‘›™½,([ݼrP_çÀfêå¤JÇ©º¨ÎI¯ÛC4P7_3$(šë¡šb9Ú¡IÄ`¨‡y×›«ÕÓ€Þ˜Q Q,3R˜eÀtŒL“ժѠ¬&øÅ&OÅ:ï[åß^À–ëK¸KÅÄ÷4i-ç†À<cÀVò =5›´fé>%G‰ÎKÛ‚V‚¤Ên26Ø$n45¤jè÷é_ÖÕ)'_3¶¯s`3õrr¦SŒ}ôx¨!¶¸•¢ö_[N(.v› Úía§qŸî¦3¦8Øû°øBœÍ–L¡C[µ×D6Ô›s£Š*“[v|¥ŠÜÈÖ{ÙS1à-QÑÜjJ¿¦t6ˆH²ª¡èJæ.v3Òœ;¼‘m‡0‹aœšËX¾Ø.¢ˆ³{³¨eóÑ¿^`?›©ñ;Ï:¥Ó0Å–bÝ㔶ÌÑÃR­W]“rßRhÔ9m+‡³í„C'™·d ·šQŒ¢5±p6±2ÑõfÉÕÐE¸Þ“BÆQp“«Õ†•O±x…W«æ©GIY@oJê š2䘸åÌJR£]
-…r÷/Íbª@qVß^Ö¤—P=|2µ—µìãµ ê§s ‰z95Ô9 ÓwPÍÌï©[kpź©ÐT¹ÆyHn7ܘʋïLŽD)”Ü;ÀÒ{3E%mp’~…n•Ø·¾‘d»1ýÕÔíbÚKõ”æ:’k/Œ×Ñi'»¼BæÇ#‹³»ºK-¶%†ù¶{eØ;aÍ2k“ØgN/äôãÕHÑ”?[f¶]íL@yœµûW“J’Þ°ÇàáD©®«Ï!oKs„uT|Í{â26O/æ¥:iþðNû–`X·¥%¸åøBo¥¨5©žAÖ²R}í–•–ZÕ—KÛ=D3ãå”Ì*±#¡æýH°LMU+kÄÐŽ:¢Ír²‚½]SI,O‰l¥Y‰”"LðH[ÓÊ…~•´ƒ1ɼÜ8%̹Éغ¶MßiòetsÈÌbUœL®‘%ì%Ì#›=¾©±°oÈ´NK»ß@v:ýÚ²å’i{ÿÕéHN¦Wö”„ÁuFG³2vë*3»¾”·HeµÒì
-†¬2°ú¹+ñHŒdoüѬR¿6¬ÄM7MU
-F+4“š·:4éÃôëùÑÜ$@؈ `ä• px8G²{Lª•p¨*‘úÞM.+þÈ,®yèèQÛÁ)!N 3èÿ0@ÇÆOòbº¬Ó/€½e+ÄQ¯–«çÐ-à u‡¢Nñr8«ª¥x•K¯
-8Ÿ6êuE^Jç%E„ñ©í^ï!>öðåP‘3ý`ßkŸæçðñM4 Ü›Ák
-S(š¹àVcž&œw;^7 1f{
-ææõÏ^HóÌbÙêuà¨^(Ätõ9kJj•’]†çÆU i(6dÂ*mhkQÏdBwh<ª©KPìÍéXÝ&Xâ‡:>";ž¬øJK±‡IãPÛ¾ŽV|°5›%µât½è™ ~)× Ü˜¡È
-Õw½`RsÚun'-Ã÷6!*)›Ö‚EÔ
-ðŸAC/s÷ o'T©}Ie¿‰|<¤ŸO?Äkú8Þ…O©õxÛÛïù2º¬§_­ØÌbÑß‘_½.øõúÄhtwÉÔ”ÁI@¿§&†Ô›I5‚h43ïü oØ[7?²ÖM-±úw_Ò‹æ`?ÅN?äCû]ôÓÛOyû¥ßj“ñwO'õé´'oñtù® |ÁÀÛ»§0y¤ ÖÞÞ=…ãÀ^!paÀú`WÅ yE ùûã“£zÀž<ˆùþý‰i‰ãþ÷~ä3žûø!ÓôøÓôøÓôøͧéñîK?ø2!>eº£ÈlÁÄ¥ªkØŽœÉM%³sÝ,"aFk(%Ýg¡Ç£r幬eûá,Ú(ÿðèGËåç¿­4¬å$ÚÞEô‡@u»Ô••Æ’ø9ßä bâXô™–ä‡Ðº¶-Y‚&;P×Í©©„T©4E¾×Ú&åÞ¢íܹ¨.bg9LCbƒ›hŽgôSÍ’J¯‡:ö蟾±¸yüqóøâæñŠ›/ÿVŸYÆŸ–·û‚Ì
-š¤‡Nn!~ÚRÆ÷ÿ*ÄÇå[}6œ¢êC¹Peˆùë’HãÀ$3“Yu_v(a®ÅkZÄ¢ÆGÌÿFO£iéíHöb)°í’7ýÝÂ{ä­b/Õõ\ÿ~l•ž”YtŒ£æþ»¹“_ô¸~ðuBNSF× †‚Ýf% n%°³N^ÀLÜ•¼²;€å¬zƒœt^àÕIeš"··>¦H62†à
-ä1ÄnÕ¿¹(kÒ•Ó”­¨ý9É7’FS[¾BQ*£ò¦±£#ÛA==½!
-0j<)è›4¼&éH‹›oõÙx))¥?®"L]Û@pAô>ü
-;²Ë+%†-ïªzþÃbE¥nU/t;¢°S×Ì¿0>TÑÉ
-§˜úìáï,rOI™0xŒuÓŽU‡¢ ¦Š’V•GIœQ@jPƒ5´cÇñµ~=ñîh<ËÈáúͲö„R^ò×›¥K¤$i€c® ,—´r¤æŸµ±N1¢‹vˆÚq{žƒ‹ ’³Ë¢œP°,—_ào?ÕçâeŽÇÃÊ …öˆd9Ô¶(¿Ä¸r1Puw‚@ÙtVÏÍZס÷Ñ3ÕÐY­¾D$Z¬¯Ø܉MÅÅ0ð”›[Yg<ºÄ2G©"Ï"Ü¥ËA Áž×ÍR¨ñKÈñhéQî§zDó$s°#¦½¤nl–Å—²˜üÐÁ,QþCÌG6²s ,OÅ[,©E ÄGOã+;OÜÍ2)0ÿ: yó­>/ãoô‡5e™™FJN@‹ˆ„
-w¥ô,T7ˆ_¢ ‹ÂÊv²=‹¸MyÛhlB‚p¸A¬—ÝV&°u`5L+ÎÁDA±O›…ó•X·ŸêsñRÖÆÃűÞwƒ’2¯Y{[ ’ZÚˆî’hÄèZ¬dR2†Á¶Â*îRÊz9´ªd%*ürvíÚ<ÅsæÐ窂˜âpRå!D.œÓFL ‘kw%À‹í2Ym
-ô+0€PÝH&E#YrTÎÙÚýuânVjS„¾TÞ|«ÏÆKÉ ¾%2)œ*Öj$¶Îcï3oÌÑ0¨*cf9Îü¥DF ‰Í¹É¬fè|Öu™:ãÚ™:Îï"ç)t<
-½ž’…ù…È0Ì8FÖOÆlÕ`Iä¯àÊ"ëw¶êiÎIF‰aûˆ Oçñ½¤¸"¶lhòZ —X—#LlHÒØT¡æͤ ™££¼@^¾Õ&㥼„ÇÓÈÊîR2Ûì[êaœ…ר2Kwä ÊÐÛÎ{&.²je¹Â,Œƒã'*»"% ~ñu€Fde+LÅÕZ–¿€Læ@ŠìãÑñ9+µ]E@ÃÓ_@Ê÷t#Åñˆ?Š,ÅT_djᇡ*$$„ò®CñEÛf|W¶à?7‰Ç˼¿ÎÛÍ:¥òJ,ïë·úl¼”PðÁ¹oP²¸˜–U02T¸«‰8ºèa.°ÁŒtãB/Ö]¢ì´ºÐ‘$E£ ±%Gƒƒ(ÛÊ7ñE¡b´h…†DêFŒÙP=g¦ÜÔŒ¯Ké\W•3ä$Ø¢èˆ"»!*‘&òd|?FZz”£„%Ó>¬2ì°º a©9ˆ¨Ã]NÄýA(‚%“a>ÎnŸ¹›¥2B WËÛoµÙxàñ¤>vF
-‹ÛØU˺—%¸Á\¸Ãú=ÑL’el j8ôèîŠ×b—f:½aèuZ ]pD.5‰InÝÀÙS€Èµu:9@Š’¬z[Â5¡0]šé›ªV”Ýeçá0ºcÈÃ6/£eRä¨fzèQ ¯'ùéT°—qðÏ|Ïšt_’²v1»”­j›¸›Eª¯èì¾ýV›—úgÜØP‰ú<úAŒ)áÈDx2ÁtÀY! T'…9þ«QWBÃà-ëÔ N¦¤¬~L^C(œ±Y¯Ùšj~S·™H1D ÐR÷$Ü W\¤–$„OßÄ$™ЇÁ½ApŒâåXº Ã;Q#Úȃ ¡8•ìØi¨DtE(6Å*£¸b¯w³Rmö×Oò­6/¤Ô; á&B=oãV,\Lúðl¾: uj##]!*[#™4x b’Ëd‹Òþ+v³–‡ºšÓ4d‘,D!‰‹Ôk€¹)o¸´¢ö“DRÕùW–Ä…!6U.Á‚ÛŒ¶ú¥5ý
-š.4&V UõÈNò˜¦Nò^1#ïL.ÑfÀœÇv#ßG xÎV³UÅÝñ¤Ž~l†P3ËD&ó(¹ô-ô2@4€7I,Å
-‹QQ Í›Ó$µ0PÀ·elfᇒq0è€ 'tÂD2´ Šv­3ŠÙE$D¯NʹƑ=˜àb§¥^èåfò3ˆ~K³
-©$¦P'ùmRT5c3ïª" (`ÿiðÄKz»~/c’ÃÑ“¸ˆ¬Y`èpÓgª#1M}Ó…‘OÇþ0îê€Ñ_¼³(r;ÈoŠr1m!é
-YrÈMdTùåÒ$Èõ«uB¶î:f¡Ö¨š]úü'݉wšÑ³ðØ´ž¨L5
-<éd.Âe,cjE5üÌ‘ž2k >HlHð¼¿Nø ùvÖ Ö)½…:øgL›&ᬹ¢œÑ¹ U9DfGUÊ£ÌczVCrt.²`öQŽ"úE
-
-TsžCIHÁFÍìbPmZ™½’î@aˆê!¶œÃCª pÑ‚¯9…ñÂtÐÜÅ®ŽJö@…Ÿiú¸¹ˆ+MèÀŒkÉýˆH¬Yö‚oä«ŽT_‚5>9r%
-QY Ë?ib€ €Ñ¤ÖÀ‰^fxðŸœAÎbOtó€¾ µ¡9Øõj·³þ+>TñoHgŽRJCÁ€‡Ð™C§É-¾`B*2šž0/ø9‡°F‡!¼ÞÀþÉ3d”…mrn †€ÿ"4!ô2Ç“8Š´§™TM¦&Û0\ó>Ô‘^6DÊ@Gœ…ðëß{Q¹Kµ@&¾¡^®ý;¤%Œ„˜i x[E]³ìlJÀ^ê÷
-5q¨Z2?ý2­‚*s
-×Á1{Yrt[
-XËJ§ å6?¤éVËhæßæ¢ 9^3DTXÍÈ~òò/ä±+`ìñlQ Ï u2ø0ÀYn‘õ¥µÆ'îWØÀÇ\€×tH*™%‹˜^N7Mw P5ä¬Ub[IÚ¼xÓl7¯þRººg m(ØéÆÔ# 2/i*vÛ³#àuK¤W È¥?1$Ÿû®Éç (íœüGTž·ÿˆQ|ü‡4p´èÜ]¦P=.ÇQl—ô*_@ž÷ûr’³"Ô£KŽ( |Çåz—}Ü·¿„?Îðþ=cË{b} ßpÜw‹{j)â°qßI×E*Ò3C°ÀÛönß÷t ¿óvÄùšÉùX6a…q®Ä¸¤ž“"w_ƒ”âx30ôÔ,“Ç;I‚ŽJïî”6‚L+Tý¸,†PÌ…Çæ{9î¿?Þ‰Å)~ ¢nÈ~©žŒÂÈýÔ8aþ݃öQÓZŒd$”¡ô›=áö
-Šî¶¸qaÖlÏ ›çD /vQóµ‚ækÅÌ'6»3eœ#úƒyã؃ Xr<nüìN¥>ô,Wû·MÙVÕ&IGÞ¹
-Fü÷.PŠ×6Ùð§vß\Ú=~ˆ´{ü i÷øU_m3óR"™ý¼,² •ì ¸ì"q¡fÅÖ'@ £ª‡©ë)e½Ù
-ÝJ¿•NåwZ†ZÃ+Ô^._m3óR¾›ÓóXª.øÑÊÙÒ˜ÿ8LUM1Nþ+¯Qĉ¬6Êš\öÙxϱ$y[ÕnŠr7Ê·8«é:ÖÌñž¸5Þ£ÃÅ’úÓweM°ø4vƒòP «‹©϶¬Ë` µ(ÿ­He%4Fzv ƒ){Þ†—Èœ&-ü2M·K£Î㯠—¯¶™y)ÛÍéy¬:¿±Ñ³7àF6U‘\!m„¬v“!Ū-ùÓ™UÿF#Êð;Ô¼(5Œz@“ŸtMfКÆYÜ.®‡½‡©œ5V׋լvëö ¥ 2Õ,T6d6£;YVÏtõ¹9?;2ïìˆ!cé2¦ÉÊVÝîn:'’;’Òåd6ÜXÞ6›—dù«ÃííWÛ̼ çô8±¹hðÛŽ¶è8´
-Ílùlx £÷À¢‹1[C bRÇTk“+ØYc°eƒ@BÙ˜ð Æ#™GK¬öP;Ëvd ç“(‚¶ç.RÖšÏG¥K°ïZñˆÓ$×fŸ”ãD}%K)Þ(×ÝNú1¶?#Z§å˜ÍNç÷²4^xZ>ñ—¼6Ð^¾Úfæ¥l9ûyIÎŽZ7
-FÛ²Âo»T¢Äi‰nj™Ël÷ò™èmî=R &l¦í7+”tÃýƒ$–m•û[= ×–í¬iÄ,iÈœ•ŸB» uÚEI%^¬mõ>ÒkÍ!‘,uû:“·«K}…˜½|µÍÌK)wNÏã"š¨ef,Ö…|ÅÀj3?h¦2¨™6ÉìRe»²U_½_«¸¦)¤.øºð#&M ¶dYl°˜‚¼Ã,0 ÖÂô³w©®“°!Tt/1ø'Í#«‚ *Ò¾‘¤»G<TJâA‹¾L&àÃy5Šç*8j+òWÃ${Ö˜»÷2—·ë^¡zpóÍ6+/åã9=/íp¹e¸û;¶!ürÕO²6É<4ød‹ ¨|5
-ê ,‹¢h5÷
-xYæ™å£ÍY\CI„ÒÉ› Mѳ£Ã½æÍŠF=I}`(0hòÍDž.ä毮O¾šóòžžÓƒÎ©„èôaÛÃâ´Éåðîd¡•°55v˜ò'›ÜÛÞC ¹ŠÐÒð3~‡ÒºÇ÷,ZµÛÕzÂRYhŠ´ž§­•ç©ö ïº1_D3£ì•PZš=¼ y ¬êUÁðœ\¼$[ª¢ ÑÉÒY
-D7Ø0›kzXئ¾™ËÛ…ëÏ,í¬7ßl³òRŸ“èæIllËÍ–" ±Ò`“i2îMàn˘•ü<IÕâÄgÉ!ˆ³¥ ã¶=‡˜UŠÊ³?y— b!æd ~¹O
-£úƒº‡ Õ%’†‡•à½7_9¹
-«5[à{ZLºSšdkâ<apmáÁHƒY¯ßáºÉõX½GœT2ýT/¾g¬[9ÆLŒ¥ˆd£Vàæ³DÞÛÙ1Ϫû줨îÎhÖ*s±”Ù ¶ÚF·›T«¶ •·8Œæ5‰å3¢¨ˆÖ›-^ÖÂðø±9U–2I¾9oóľHr,q³"}ôʺÊì:9•luØdz»b ú}I˜hÒ¢søá «àhí¢‹Õí‹:óôV/¢z}Œäê³í¹lZ˜]SüƒÌQ9 Áš5=Yo'ZúÀ>êŒ{š¦0ÀÓü™ âh5ž$Žyn`f;°YØ }­f¤ÕCÁItAüúhŽ^KR-›¢…ÆV3÷l6›è<¨XïO¼Ê4x'ºAÛò¤ÅÐ5<YQFÙÙŠ;)6™iЛù„5kdx®NMî0ïXu½*º^FúÝw;m/d aº¹™-&_«ÝØYæû G²ÝÑó•†Ñᘠ·ÃÍ9ŽxöRè§UœL]C¬ŒO©b4y ÏvÊÃõÕõ¤M
-öâ<«–¹ØÎÃv>V«zýü+ªp-N/¯ÈŽæê}Qå~ëìUföÛ|Æj)‡ÈœR…É_ä©’³,«ž²­&+Œ1$¯Êg»·iBÖÜgîãÉ»õã,û>‹¼‰Õ˜;ÓNJ%¶Dï°fEšÀ®o1(Ú&¨pì*¤–ÈåÍÅ(˜È]lÌK†v®;è>™¥0·0~ï‰<ð kÆAX(Px"&+×yÕ%+Ü)¨¾ÊÛ
-Óc¹æVˆÆT`y
-rö[”·ÕS]›ÄuUµb|°¸E Ñj‚‰êÖvL6ÏsPBôI+¢>6-g/i©F“­«¬‚Á’ÕÀ°hÂÙÜQ-»8V,…!W+ÔIžGyžÊó`ŠG¡gù¤Vk’k³Z>ü¸”ÐÑÜû“ð„õM-ØziRl3(˜=g*(~ekž­$j±Ø$gØ Tn¾ã¥4=_b~©5s|àL3Ý~à¡8{¶jíô ISƒSpÏDò"ÌàÙ—Wú‘Òç;¦ô!P›8}Š©òÔéŠÁaOý‰ºø= y¤›û?ÌÓ-*P±«ÜŽöÒ=]ô¬õ_^µÿ`Uƒ°÷úañûÀ® K³úzÿ÷‰ÞçÏ ö`k-âB3ñkcYM˜ÞÙ¡m&ÂÓ±ª¸Ï»ó½Ï qF—±ipÌä„w£Y²“iÁã(€ûa¿\U®·¥RåÇò¤Çè;{µ·W¿µ¼ü0™þ §HµÄh­|D§L9ïé*¨›Ô §¼Ze±löá鶖LŽM;¯ÙWoZ½3°tö_ñ‡i¶ôžÑªÇ>?vZ¡}ïscIÍÞ=ƒ£ÿ9XuÞýíÝ_|ô³úñß}þ›wŸüéÓ?¼y£¿ÿí§ÿò»Ï9r V0hµë{×ÿ†ûŠÁwÿ|÷—ÿý“Çÿç“YàÝ— Ž_ýüÝ/öÓûÿr\û7”Æáãuõú§ üÑú¿_ýÇ éÈJ†û{ºÙ3øŸ£f'·4™–k'\ò]ø×5ô÷åþç÷ÿøOáþ7ø¥_Ü1Vˆ:’ØYy?“I‘GÛ‡r÷Ä-¦÷ž­êœ]uA@ÕÚCµ».©è§žÌÌÇPm ÊEÕo<r¾´,õS±µéT¿^>ˆ5†A°k_‚×aNÎ~ _Ùr\n¾ëKYžù~ÝŒ"˜b.þµ˜'±I| ¤š-x»GøÚoLßOɃrü’ ¬»:òFÉf׌jÓ±³Gü—öÀ~™ýßë7½ýªï¶¹ù‡»g&ú™Å˜—×yfIŸ,ûoïžÐSÝâðíÝ3P}
-ç§Ø¸å^êÐŒþ‡ÛíðѸ‰Ûê&ëýF?ÂHÔ@ûëÁªbÈili Þ¥==+z0×虉{ü‰{ü°‰{ü‰{ü°‰{¼ûªf‚luÖq,ó®g/ÈI™#mw¤C<#§j5V[â÷h§ ;句e¿eS
-¨}]Lü¸eqâغ±G)ƒoHпtˆÎ=ÙRØa”OŒÕ5)ü¹ <ãˆöaô¥b¬
-qèß«.Š‰MR’˜Õ9»â«ŸJ¶Ã4•Ì–5#qLõZT¨Guò+Noa"lSžnï?}€Èzü ‘õø"ëñƒDÖW¸O"«ÃK7»Nìd°Ò¢ì½¦ª£›“a½T * (¯–¼È¬]Œß€&¶à {Í)¬
-±2»ØóÁxŠ@@DCv$μ§øi0Ñ0¦ú
-tl€8`Ì“t×42¢F†u;iJ݈ìP¬ È]‹½ª½
-CÀ6Z—á%HYd'\ƒZ6Æ8¸fºíõh¸·w%:‹ÆøúdÏÓ÷é1Ùãô]u·&{N~覘̭Ôi*2Ô™ àsUe5µlѾ„Ó˜çDCÐ#ùnÙ¸RGbè£>¢Ä‡B\A@‰#h„óÈnëȯ"¦é¼2pÞ?ÌŽ|¼U¤çˆóv+öÓ+:Ï}üu‚n¦‘…t Q*
-ìx°˜l4ì˜Ûý1”?ý±If4²ˆ ß JŸ .+züu³5DžU‰hAî‚e²‚)ŸÚ>Òäx£ßÊ¡ ÀÙ¹PVdâA3Ø—eÚRâãëGK7Ÿ?Ë=GÐ
- ƒ9àh)/ù
-Ñ=(SŽÌP–[š¶{jš³›œ=ªÂ úF’Å%m„;ð}@pžÅÛŸëcµŠhÜŠ@0MtCgæ*àñ†YFÞm¼wo!‚9'°®‚NErsâÚýÓ‰¼YÆì…•¯ ¿O?ܦÇñk¶Ow…×Ry%Ÿa±®yõÉ+%xü|¹cÁô’”q G ’ ¬ŠïÕ°¢%µ6Ö™Êôè¼<äëX&t”á`vÃ¥Ù¥y¬Ù 30Â}…Õ*òÑ¥ˆ:ø¿q %
-ÂͨRb,±!J©Â5ÕLJ†•Dp<ˆ§
-­¯8ióJ(M£Ï¸™½XœÀ¥&!à†§Ù,^fØ•êN+;†ËÊp/ëW[yÊïÓ·é¹wû¶çîˆ=rPfŸ8„N:
-“\øBBrq’”_æªbÄX×&iÜxIPÓÂPÎpÌhÝe‚ÉøC,@xRa­¡X‚F#î{Vö†Nn¸¶ˆbí¬>²›Ä#Š“ò1àð¥•Iš‚{ œîðpNÞpWˆáTþ GséÖ Ãtyà÷Y‹€t :Ò |»ˆ0Q©
-S«¤¾Ä0v¦nÜé`’;-e÷Úå׆áë‡Ûô8†-²0¶¹æ‡ ú>„‘¬1F²Zörª\?=–V” \@í+ëÑš‘ÍÇÁ¤ð¤ãˆZ½e^&$âû$·éFò­2Ÿ\ï@p£ù–Õ “ZÍ¥
-)HD¥YÔƒ‘è0~–•4² aë'Æàb &„Áˆ
-pÈe–E$ˆwF±‹¸áÙp¹ x†Ó”F`{²5Ì‘ºûÓâ†V_£÷ôÃmzÂ2׫÷ÎùÎÛwÛaW‹Ë3Ð0¬‘÷h‡œEA‰nÌfÃÅ™¨>†@Íȇ6Á¡ÊûHʆI€ÉG݇té ÂRN‘»åÎ]²·5eHU’º!®Æ´¦îITÀ4ûò!âš•©Ò­e']¼lœØP c¬XW…2ÅD†"…–¯¹ds ø½”=§^ä,fÃÓ#é>€˜n‘Y7çâ6óe•š¥‘ž×’2ý5‚øúá6=b6oŠ½mÁÈ*€iqy&[܆âÙ´85§2'(ãhDq§c-ËŠ2c®²ÅíÛ†ôF9ÛPç×.# Ãx¶0¯]„(P%f‚K:…TßÏóàHépš5DŽåëÅÝ éA~´d©È¥BaŠ#”ÌŠÿeë2IˆHª*óf2ù‘2óü¢ŽëÛ‘Y«nf&^rƒn@:^¾×8[ïYïŸâÁp找ã*£ç ă¿Õ¬ÝË-ÌŠªú³ÎŒ€jé§ 3$»‰5Šq› Þ°”í>j¬Ý’Û'R¦7ÞMVþ·˜Î»ñù1ÿ+S¯í–Ä›‹|š@a ´œÒ/–-c’HVšéJÎB7&Dú-
-èà‹'¦*Ê[P˜
-‡ìæΓU%
-BKŸŒx0z&ÌÀ9B ÎrÆUÃ8ž¾×83j+ ¾ gž€¾RGsY”g²³øC­oœ ‰*±fUW´ðã³Î2EÞ©^©§I8‘g æ:«ù¯Èx)=ZÈ* fu :_‘ÙÆþlp xÁˆÖ9ϳdë¾$Ü70Súh1e¢€ u:ÛÜäÀ4%ÿV%ò$«ؤ•Á¯]PY~ƒí!‘~­+CågH±¡Á÷c­_•€Á1f‚j7¤M/¶ûOxài×À=“áÄß®^ñDú?Ê©n¬m&Ðð'ÆX–akMpd’Ú]Öwmv¦ˆvëe­]áŠ_g¨ÖŽÜ7K¦U9t<éé²0áx†vÅ
-:;/°dË"¬À˜ÚÀ%±@qdªAV63Œe¶ìÁ9`î“qd*©…ŒÕ‘Tûr”ÿ@a-¸„‘¬Ëé?`æår³ NןvBúѸdG*7Ý>°¢ˆ&°Âô`‰•µºGú=Â8m8Cñú¡iu A‡ŠÂ`å£ê¾™9™‘NR”%©Hfñ¢†L‘©L&á’#ÁXkŽ†ÒìŸ^D‘ûÝ­(š°ÜÑÕÎe†¦‚¨Kˆw#Âym # i±”4Ü<à/Óøh c‡ÄÎâÝÉ:»yסï¤Å#9³µË÷Å#â3~e+½µª7b!ëØ®‰ 9AŽ`¤s‡êlVŽÄàøƒ?*ñ"ÜÅ=Š„&ïÑ…ÜÔŽ ;KŒñ¨eã^û®VgI
-u׃ëwZↈ[…›f¾ÊS½îOuJÛ
- ª?ŽŒLB‘U«uµi¶uæmC,‹LÆJC¶À
-G,¨JÃÛ´Rég±'a…
- _USÕz¡ÓŒ Šódk˜Êb/I;u­z:ÐP*epMÅ«´31=!%5­ ”“ª–¼úM%sÑhü±Ñ¦6Ñ™í½Æ°Ï9frŒ„;¬
-g挓ª(Yy¥X–éÀîŸÀaFc× b¸<•äƒ)aþšî[ŸÆí¥ôQÕ÷É(V‰Ãkª¢]…¼Ý¤j\Îd^3.¸"ž,Ëã·ã×+SAþã%h«ñÜÔÚä)U°µ£DW¬Ò3þŸ¯ñm7,ù-k>4nvM`ð&Y@»$ÑôÂHûJ^’€¶âLÐk8žÒÈqb;Ÿb”ø–5/šÛâ¡=¸êºd{d*ݺ'sðø­ø² ¼ð¦Ô’áçV¤œŸÅ)ÖÑ'¥˜µ×ZÆåñµŽŸZ¨ðùbŠvïr´Òí_º;4 «Þ±5Œê¡2ø/œ,šþÙÄ5º~Ê—ÍÐ7ô [ÒÜ°’¦(ŇóQ­ÁÂÒþ4RjÆ^ÿz«Þ&¾pÂ<urÊ85Xóå es4ߌ½¿Sï2_Eë÷)/áÀõÛ¿;§ÔsS鳚ÚCi [“Ô4ì’aœ±ÍÊõ8V5eä!–Õ¯S=ä‚üî¹ Ï·*JÈ=D«­¹G [:…­R6[𞤎ð8ÂciWŒz}Ä1Ãoݳ‡èÉæ·äSØsúþUä‘þ&ºb¿ê~Äí÷ü°¨$ß裾ŒIÒöÎ÷‰Jò>å<Œîy&É+>/èì_ίÆf›ß™ß—¿ƒ¦qh"úH®e&x Qã³óÔŒ¡%©òiÆuŠ@6™UGX²y8’êAöØ;º²ä@ÿ
-lcLk¬ïg'%ùo5ÆSÒ&j»‘Q•¼%2Ø>`‰ü’û"¸°³Ü¾•¤›(€’cQ=<XÒÆ2{wËS„ïNÿܘ/Ð{£ª‹÷?==¥åÝ á<ë±'û’Æ…µ÷-xT/‰A)rD ßÃ
-ôSå·¡XɺÈiQ|DZ•ªã"¸‹˜ è48 ®l·í±iŽ%ödÆêTþêåO6òH*#2¸Ÿ®šjê̘¥¹T¹ð¯U™LÇœ ë&rŒô}×à‡¼}fz}òÑ¿þå:Èý/Q¼´?]ÿ÷‹«Dùè‡+Q¾8ÍÇ™¸ÔIz?€½ô s$ë}J˜†á²ÔÏõW £Æ-­—\öˆgi²wÞ jóÈ‹zãXñTyÕýþõ¯Áê:‘Lz>!7\ŽÕžŒ@‰¾ù¥vz”¨ðIÈ Õ+Ãåqú¤/ã"}òÕú[baîé Ô‘"ešü+w/¾~]Kî¸=à/ùöîBˆª\S=!æË;úÀ[q¬:®AÆŠ¾ßŸsŒ?¶ÇöùƒR½ù’·_õ¡\‘O§ò¹é~ò
-Ï.Ýuy/x{wÁÈS•'û Ÿö¼ú¶ÑoÂëô#D^Dþþ¼Ô3•ìë ®Œ æù-ø`$Ú@¾ƒ!TcŒ||Žá™|þµlmOC©”vs éNoüø‹ðøa‹ðøáñ/Âí \>ø錜g-Älcð!"ŒgG:ë+¨¿’T»‰Ÿ6¤onH¢âÈ°*\æ’êšVí£ú°"éç{Ž±“>~¸‰³Á~Ža–5Gà#Òˆfše3r¬&+G@¿È®k¨@*`JH%TâaCbåËaiCÓEìæ„· ¥i ©÷Šï÷§¡Œù7RàOßTž=~<{ü0yöø äÙãW}¨MƇÒqí瀪À&ŸÝ µhCE1›´²ÅIhDtxÇ)4ÀÎÁÛê4ø‰.o]“¢öÃÖ Ž‘¡+Àg¤-Tõ[ ¥ŒÜsq¸`Úw¦ÕY•È fWDŒ€Œ ¶Pøl¸ÄXtᇆ)vë¯ÍÊõ¬K‚u /…¼­Ú ðNc„d•@,Sg0rÚkmš\bé9‘O‡“=dÐnÚ%››±Y| ó0w¨6-ÛÈ5&ºkĘ U5Q¤oÀE¹­. ùû¡k¤¸$)Š`¬ù×±¯4QÁÖ½W˜ÜBR±ðW°÷.j“ñ-1‹”ÆÏWæ¸ØÃDl—µêê5‡ÊÊgv”wPu®±ë€d
-k$t.®EÚ×®?Êõt&4œ=êb++Œ0+OËÁpÆ–áé²0iâbÍ÷×™¼¬á¸¹ä ÖñÌ\|;<d§‡æ%«Cjdé"QHaJ@'¸SP†éMä X(:""è¾
-0ª¿·aI£+·–ç2ʺ×nñL 3"¥~Fðæ ¢r€f;‹VŠy¶BliSxÒ-=^pÝ.‹›©¼¬â¼¹æ ×ùÜd|Kd`§Çd»8;f°ÉXj&~@Kñ› š­)sS“®:“%èÄ2ò*Ê.ˆ;œ¿„ëTv$» l›¡+xUÆsw=n›âÛƒRX Ìæ¯è‚ÅßçE”R¥@pmÓ|ÊÔc’üÔ‹ó%3ªBN*jÀ×,ÛcCiÙÕW}°çíñ’Ûe4|ýðñzùP›ŒoƒüëäÜõÖ°¤D‚¦hàV¤¬rD$ŠpPÄa†ÃpM€UÚ°øgX4M£(Ó4Y̱‘\`×\841/•dª€xèÞµp5Í­ H'é´ÀOŠ®16=© éâZ{5CžÔo£9
-³ïù¯Ð[áy§ì` U®û
-Y®“y»Žêö
-
-Æ>ˆ!Í ¦Ê–„W¦é›€UtÀêtè^­&OKèBð”VÑåÖЊϖ2èŠ*bF†Ît+øL*ªbÀÈ„É÷¿†ŠŠ•¨
-tl(³ùʹ<¯bqåú‡×'j“ñíwžÊnk×iË0³¡“Ñ%.Œ¹ù™>¯„†²uײæûšµ›Ü*RAÙ°†ú@U•ÀY»bwÖ÷5šIp "Äk·€WNépÕš0¥¡¦ X&~ÕR›S6´q%±Ûƒ’§u >­Ñ”Á`VÛdë ÀèÆ$[‡®Z¶à­Ú:-Kð´†éÿoïÛv$¹®+¿ þ¡^xŠ>÷ËÌ“Ô–
-„"FzÞ>‡&´lz;6š±qžÆQ•¡QŠ%¦,©bôK”3y…ðÉÎ7`ž;¨qyö]¤r*.𢮜5~>õ/Ôø(–¿-æçE…‡ènÉÅ\½) %PýðâìÙG™øJÄŽêÓ-È %4´
-  ¡bZŠuDSÖߨ|¡ 5ÈOhÐåYz‹tãTÎô0«‘èðŽâX³SbP»µÌº”þú¢ËØÛ/pp’¯ãÏ ^ÂÑ¥÷Т2™c
-Jì¼?Ôw•=¶µeo4R©–}l¡)Öä*¡ÔèçHŃŠÆÛ˜¹i».3½ýz³pªq½ âIÅ/May:ê¬,„¤OLÕØåU…iDäx%Ür̆{ÇóÉ4í
-ŠŽ™„„â«QÈgÝ55zªìiÓeë £©¼Øy%¾«½û‹×ŽèÅ
-Q6¼è²x$ôb£XÇßÝ
-hԛ么ìfI;x_Ed&|õ".ùeY/è‰(š’¢%zVh…UÊõ¡•3He/ sÔ)+W†éù6’(Á©$m˜¤õ=×Ø!©ên³v,cZïb¸R½¼[BÓªbÈfWT{Ó¤h¦Çæ©z*7DI!'÷ܦ-A¯¬óZÞˆ ·ÜŠÔNžwÈÁÚ£ÙûÙÂÇÕ‚v¦­.œ£w:PŠ]ñ'«6®Ý”`*däEAZŸ€Äû•dÉšÑÌ bŠœvbµÛßÆ°]Ŭ’¤ú°nOa\ +Û@îšÐè¡än ¹ Õ‘4ê¤ó
-^O¾€a8HÌDÎZ+‚ч¦anOðI,G¯†­8ãÊû
-å¹€ƒ5Œ°¦[’/MÉ4Ì¢.:]¬‡e?<ó²MŽ Z»–tÌF±v*’ªÑí"Ã%^+×é$…Ÿ ±©ïÅf˲ÅÇ uÎ!ÜN³Ý¦1 õïÑ,.±Öc¸Mœ®8`ït҄ઠBpÑh8þDª„g‘<1íÅ$ ´Wx«]‹>k3<- ŠÝXóJO2?I6”u6{H«Ÿ??ö³"¹/Á´VÐÈ^Êj6YÑîql´k×O×·œJ¥;·`pP€X2%;~¥ÉJo¦8ãÊ
-ð21<²é»i-/V4Pöä1»Î w¬dÀ]5»OõQàPUûÙ.ù¢°ùé´÷{;ãœgO ˜ªÀÆ"N:
-¾Ó]t”[xÒò@=š?׬Ý~S‘ön˜ž}d… ?’ນö5£t÷·á†zÂ'½îäøãõF5hå¯Ëvž¦]åôù×µ`mØ»‚¼È°$c§nä…4ê{&RX‡LŒQëol–ÞdÏž"™ÿO§ÝP—E~üÞú{ê³þ7ÝërÅ»Îæ]ãºö›+;søÞá~dŒP´Z‘{‚Š«´é·)T')Ô >úþ|ìýùÈûóqwb|jdĵB×dÉ1—‘ Ê=T@„ÉXÝ°~\$sÇJŽ‘|xÉ^+¤PènÖ˜É@a{!K½Z×_°üEÇÈ°³–x“ȶÊ{šÙÒ°AU
-}3åp5Š8Ìóð«ú\‡›ÓÕœÂYðèQŸ"vº¾(K8±C€baB'>÷¯X‚ b’%|
-Ìã '|Iü)6@/ØéÀä}¸Tf(ï?é¢í›)"àÕc8†Ë´.¶‹¿¹ ×­­‹í·ÿè1_½g9|ÙþåîÚF\Ý®Ëm}uw}ûä1˜^Ý]Ý5h–Ç»p èÃ,]ÐD}÷(Õ ì^`÷Ýa÷óÓ¢àÊ­^
-ör\J.(јËĘ] ¡h Å¿×7h(¦h; Rb —“6OGvÈI˜
-áx<ïÛ×'TÀ©í®,É•…;-pµ¤
- •›ËsÓìd“k€’¬â" h¯Òt¬-áœÄÑ4C%¸<hÚ‰¬ôõJ¨ËÖp¥ÂÑÔ+œDzƒáÌ.5‰é9RD™b¾žâUæü«r©F¾ìj®ªWã->€™£Þ1Ö—\'ø^xVeò7­x’³@Jò]×|*ôðõó›ÅÎÙùh“’¯\S¤¦{¼¾l¦é¾ =ëÉšŒY=öiN¹HQ‘}‘óxY‘¦ábË2d)M€æô=Ž(¨E›i%ÜQDŠö»°¾É ¼ØК\‘œÎi·1¯'a¹Ð,|k×˯~è*îÊ’\Y¸}«¸Þ–nA—5
-ªqìí¹dóšHâÇo"¿ÚíN`ž=àÕÂЀ*•ÐNÄ»9²Eß„A î2¾“W ¢lÅÉTHQäø£Æ°eϱ\“Ó8Y¨9o‘Æ[F îSî2‡~aŒ¢Þ09°wFÃ#ˆˆ5Ö™EdWNÌåñT.ÿE[=±¾lÏe =\ ="‹0k.}· 7Ì&–#@„*]J
-| HrUZjF“¿pî*«‚ï…3;<0Ž?elò«]VÙýa~nšaŽ5-:IƒÔž4ì͇”‡32Š\§_®fÿ:ÊŒ®)«F1¾Ú'ö‚ƒª&¸S® 0ÏJFxºpÇ0‚Ißí>÷Üù“tŠMfä°^íÆYƒÏ"žëAcÑx²Uð<·£k˜°)·‰R|Îúo™ö‹³&HOûùÕe[xM£ÈËzj5|ÑnÄûyº0¹ü@åQ(¬(a¤ˆî Eu˜·Âòˆ8ñ’·ŽÒ);ê¢àÀ»‘<¹œSZÚÎ÷Ú5b5uqr¦0y`$«<<Ó×ÕëPÞ8=ÛùÐé):<Q8[84*ø£äoˆ˜Õåp%•,âÝ›³4
-›åª¯jz&FB‹ÐD!„™!R'ËJÅJ _ˆ»äø¡Q4Tëòxq/7Wd^°þÄrø²Ý†8ôpÝ©òQ÷é“ôfo7qÝé…OµGÇÚ‹[[Zö—ý€¢—Ø…ëÍ×ÔSÑ*l.yè­{b¸n ÓüºÑÎR¤‰àl+H]"21ê1FÇ: B}ÊVÞ ~³’Wùž¶×öZÓ«£MÕœrJÀUÌ»OÄ'æÕƒÙ–c=áÉÊ-ìYç7÷éEÃ…,bÖ«Œ#~¼¼—ÛKî°__ _´ñ•žÂcÛï`ÏökÌØÚ)4Åâ!­$ü·ìæü´ùÛ8Â@Üq*ähÖDz]H|vÜ„ªÈ.L›æP71,WԄפIÌ¿´º·sê„+î÷°Î•S­˜šÇ=–
-C¤&‘QjØI OcÐŒý[+<…&D_j‘Õ8“Y?cˆä‡c6Ѳ¿ku¬ã稫-íyk³¼È¤?¹¶l7¢;=]x >âPGÃÃ(æÔm8­fw@Ò£Oµ­y¨6£ÅBQˆê6ÍæW¢ÑíS˜ZœëRÎ,¨%ÌH·‹õÚŒ ù ì3ÞDÁ4q«§WBÉÒëì!”‘Ä=
-Ë[F÷3ÞL5­Aoô+8ºâèp¥qÝÚ4Ë\øÐðsš]æ}=4Êy g¶2n¡½h)gŠ÷WV÷r{ÉDõ‚ö'—ÖíFl©'ÿšþŽv4_@¨qëD{oš²Šå*z5´NÅŽæ,ž
- ‹ß€‡ñïAfY1À½Í覓išŽ8TØú1‰P—¡ŽoÇrª2QÛ²õ-Pcsi±OŒ0†¾Ë*àçÆU±¶kè]ì4ãI®þÀÜÜkí÷®—U2Æ"Ýa3ƒ9ïÙÀžµj¥Óš¾º—ÛË& ´?¹¶l·àZ=]•½¤õɼBôD1’d£›¨{nêµ NÈn1›è#Óm*<Ís–ýÈQ$½É í‰8v°4t{Y™ŠìÄÄ¢Xø‹$²Ö‡øš@#NUxÚ^¹ÚŒ_÷Áf’X†÷¦‰¾th{Õ1“ª€:»€ õ‚òU`}7dȨMw)eC{W¨æ¾Ï|všJWør{Ūô‚ö§–Öí/fj=yc½›×J3?Ô`Òn6f˜$x:%rú
-‰!=ŒeµÓˆÞtzÏÆ Z+âsÇ(hB¨J½ÁòÁ‚íUOCø¨¡§=7 ŽÓœìÍÀXÈCß3«y~\XDšåþ
-fnCb{þ)ÌLt,:ʨp„ÅÙ¥GXŠ‘É
-ÜR-«9¤*—ºãdßbŒ©Ø:lšw¨Œr¨éŸ=ñqª˜<?êw¯Úï©”N„K]‰âÒ܆ ÁPíµ!£±‰Í†Ai ã”Ô ¬ŠÃŽQ<
-¢“Ao1£®ˆÁ¶n/–䙻ƳÎ<0™«¸9ÞšQl®¡ú0£àÿÇöDãd¤áÈÚ"˜S¥?S.OÇ\¥QÛ{¤™FŸÖäµ³Æ}÷xyoÄyË’ó!1¹ ¹Ô˜èGÔ»R³§ªIcPК¢&!–l,ª<c²ùˆæ7 Ô±”¾à› Qöèy˜N¾k`ü‰2cXœ®FW,Ö÷¿i}’Þ—ü¼T8
-w†=d K¹öŠÕîxETkvÚÌäÄ5ËËH_œ-„ÛÛ
-Ì]m–W%3Z¯$ÒŽA²·½4ijÙÒAQ];+AµÕ­æõMòq·˜»üùÒ(äj^+õ›”0ìê¨udöKŒ’pÛ ìðØ’'•§Uñݪ®L™ÜTD½ªØѾc² _ ¦°”ËF¤zÓùQ/ªÑ¬óBž
-‹Ùâ(s·«ukt?oÖèÅÅÒPT@m`y²ªyÓ¸Ft î\k¡®÷†Äñê‰0çLGë:2wœ{Î] kÞ£¨§cl td V Áð—©ï¬Oqú—)“R¢>Ç)de3‘µ˜×ä6LØ,Œ€G[ ì‹;{õ™Æµ3-2ΫJ{B»Xk†rÞò9®5úVú)7€¸FŒ²äó"—Q¬ êŽ,qÁ ìÊQª¬[±ÂØyU|œì6”ÊÜ% Ž8zeD›/§ØàÒ±ò¢Ú.ÁÉ€Ã{Ç+ÊÚ]Ó¤Æ}l 3KÄm“j0|¡õ3Xà¡©Ä"š™Özå©nõüD,„S Ï^vUŒVŸëÖÕ¾<¶9¼Ê}ûÍC
-§5…Ïj·¾ö™6 ô…Zù{¥VV4P!B‘+ïzŒ-®
- A¬Ï­Gð‹=~RpV“ï˜Ie> ;m'Ýêƒ0­òÚÉ by:³ÍæTFXð”gûg8G0’Ï¡·YO¢¶Wh,!|(μV˜
-Xd¢Ã<ý¢‹,Œ©ÐæúÜ~ó:‹Ë‡$g÷?†/8|ŸÁß«
-ÔpurÔü¬ƒÈïþÕÝQXllÙºVŠ—7/Á+3Ks;~¦ÛʬË,Éá×\¶ß”_hÝøÅýzç
-Ø2ýËÝÕ5¿²1éÊ=]Ùæ+`8CæÕÝu`]…ßãU¿çKÌ_bæ‚w÷»ñ½
-ÒKôÕ@×X½¡ óç
-¶1 †å¨‘øAü-kýkMžuÆHÔãTÐ#hQ$¦D=C¨Þ6Ï4D£9Ó⯘•–ƒæÿ*/
-Ø:ÝŒÕm¿nÊqYBld4}mÛÔƒ^¤5»Ï9§2pÌ&q¥!¹¦RdÉ&ÑPÓDOÕ5r‘úe$UÂ?
-V¨B¶Rós‚)d¦ênŽ´“—“§Þ'[ è묘KûBsòA[µRž†¦i¢ùâ7î:àüd,ŒøeQ&Œa¯ø\ éþñª]îYíGíÅ
-Ø:ÝŒ m¿n‡HãJÉA„b-ŠJq“X¢(íq„2Æ0½4ìÅI›W.^´bÄ4»Tá"%Oè639]uóMN{5 0
-ðt°½@fÆäÆ9q“<ËÀH=Zó|C·/Í‹Yå”UÚ»v?ðÛ[ÏnŒrÿx}/vבóáâûrlnCÁ¶_”äeîMiÊãU/ÝÖ<
-™K\ÏÚ7vXJ˜ìÙÆ°¨[J)¹9må”â².šúAÂ(I4Ö½« W¦ŠLl±§Ý.iCHfɴ٬⠪ÁŒdã'ÞQhiª›=ÎŒz¯˜gñtw²
-Ufï¥P˜‹°ŸK_•¤ ª»Ðfå ‡ŠVÆÞÕ ½Ë^o<ÍéÌæÞ>¨qJ‰“1üñÒ^li ­|Ø ¾\[§›1­í¡øˆ.5WÚ#k›BqOiCªÞµlo¡HDÆ®î[7FöSÑͬàHFßCsÕ[ƒ°]JYAºÚ†gŠ¦ öÜ^íË´¡ìí½’…çèf-°À×Ì÷HœÁBIÚ;ø2PN( 1“Fy&¡—6Ín,F¯Þ¡1‘67­£à ­‘¦¶ž‡Ëµ½ØÙí
-k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ùc1ª!Ûl[æŹknf—ÔëÓRH´8t"J]°RFŽÎ¥Äs¨;°‡…H¶—?—ÕqK;;úÕZ³‰ÐK?Ø@öÌÑB$9s‹ëª}š HdûÔ)LO ¶cl„$:‡äBï²è„šM÷qµÍÔHÝdS%ÖÒÆ•œW÷bggK8¶/W@Ët+δcþÆÚM¡ Gk¶G'C;dä6%¾Bx¡´™îºÙ'Ã,Ð$ªMš,‡Nä2L³ÓÓnJÞE›—ÔqÆC1û"3Xiž6™1¥[=Êèv±>Š%Òûn±ÿZ‡bUŸ‰ÍA¶3A.~hÚ!ÆPØ™eóÕàÀ˜&VD¬Rœ@ÌJØò~&ˆÀnÓ÷vS&™å>O»mûrÂDöàÿ‡z(-€­ÒÍÈÕ>.êüTTí|eë=m&EdÃä >í·MªY´Ñt4;¤ùf(͉°/ˆŸv@(Fvxz):<{‘s/ÍÝCÿMð©TŠíû½+iñÖ4h—¦ƒ²úÝqo Øà£m)Tî|UxõGÍ AV†"=˜žc±8¼ò™o>Ë—Z#5¨´Ì® ¹,Ï€ìtò¾c=Á\¢.rÄx ±[1±í?ÄÉËV fb–ä6xgòî⊠–dæT[ ^¬Ùpʼ>áfå„€‘¥ÿ¶cÕœ €·™±Y' ÓÅW=yæ\I¤ž|+ÄD˹hpK¶É=ñ«Uf‘‡O†%yx
-Ûl¨%ÉV9L Ø–$<)ì®Ùž¤£ëÄi–G»­ÌobTüƒ(òäöU§Fœ"™«Èæsƒéë‰É1ÀŽ*KT÷¼XÍÔö#™°¤q ¶9~,øk¥_X/Ê­H׿ëÁ[3“k”xR€A2¯GEf›ŸrçA¦Õ žÚà#œõîæô<ê/_Ì``lܪ[F‹Îõƒiø#åöÁjJñf¼7J”ðk3šhÏ÷¡Œá £k¨š¡I˜†éòjÔYûbŠ©´Ê Ž
-
-‰¸#Š
-â¬*,âk}¥Ñ”{Àû ïéá9\¨sD¼ÀŸIQ´Ï›¬‹´Útõf‡°3ÌCÏ`¶S|‚€ù«§[y•Zõ<å“ÝþiGªš©‰Óô®|‚JàJi£ÿ®ˆ&ìj\¨ÞŽÓÌFõD~P¶…fkñÞö³,ÙXûjkVOhl`¨a
-ìZ£Pœ:¸ÝìgÃÑ˘àê0²U$¯!Ÿ`5Õäìg·ù‘ɹí ï:Ï¡æU{ØÌ“,¦Ϋv+'Г»zDÞôC0k·Î¸VÐŒï™?ºƒïuãS쩈OL6·vôê´PÌŒÎc„²g€—ÕõH):Ž%û»-±x¼´êö­Ù7sYŸó±ç¥ø ¸>·ÝâV1þ…£¾Xع®
-œ ¹bc˜£õ^f·Ò©ï-ñž“·7®®Í¼¬¦¡æ­{¶ÐÚ¦Bmº‘‘­K§xÊÄt#c+–fu[´5Í©˜jaÁ}ôÏy gV3=üªÙDûj³N’fÒ+T¤ßi€úç¬8²d/Ì=,î­Ø¹¬åGVc(‹¨BJ‘
+Ç`) •ø!|‹gíõM
+~erÓ´)œ,±£ógíÇÚCSh„B¿ÓÕ¢ºkZlÚU¤úø~ªSÖVH°ýqe´` EJ§Ö5¤Øû̯ ñþ± + 9ìW„½)7y]þE{32]˜ÃžÿÍ+ÌëîÏ{nÞ-¼„.äk¡ùrR™64O`Æ<¨ Ç a^ zù¼#©AUfŒƒÑpL/å¸ôE1sIöJ„)ËT)KhyñÐVð-B†ÒÈ'è%±fðø¦†ºáRM‹˜4FÖ0cð®‡2øDÕ“vf)
+­ ÞTVûw&§’©dV¦Ã„ÎT5©ƒ,¾©á.š›ÇŽ} ƒÉ¾‘,wa5[ɑׅí欃SõJV*6‰]=L 2£ì±ëzMYž* Â’°ÞMß;,Cɘ¦jR“ÂQܸÃÏTeÆ
+)¨ÐjÜÜä7$/¶åù11À­k>´p5ƒJ­MQUåµÑš1J\6Xz%VôžˆÒÙ’{±æ›qÎQ
+n¿?j¿?fÿ/ø?Í
+ßDd“ÿ¤žÀòŸ%k⬷üòÍM„U…ÓzBÌw/¹²êQýtû ʯ´€ë97ÉímÙþEëA©^ÞäËïzÑ@gäå^¼¶_/~«{;}ùæd/1X^,ì+h~‰ø3|~yÞê/f*yí7ˆ} ÓàyPØ…%!õ?$Ñ‚ k"8Y±5„BĪöó_ËžXx¥RÚå3ä†8ýâçÜ„çÛ„çï½ Ïß{®+p÷Â/Wä¼j!fËÁD¾‘,J:Û%+<ÑdIõ×X¢j‘Þ¹¡Ú‹’á®aV½ê3­ú¥úðK‘ËôÊ8c/ß§È F„„á” @%‰Øpšë.)«ÉÈÿñ/r`v-¦„¢G•H6¤DMYÃMâè#üÊPšI}Ã÷øþæ$ÊXßxÑ¿ÿ¾úìùƒôÙó‡é³çï¡Ïž¿ëE½¢Û•U+K‡
+qËMiÞÄÔ”á+¾‰:‚
+sy}­¥^¬õl”mqCÆ2{ª ¢(³b­h¢xÛÜ +c%Hg’VˆÚ°åe’“ W…9…¹µ=½X‘ëV¶uû$0w÷¢^ŒÇPžžÊyÙßÚz€=JUL€¬Éæ «?®üdûtxc êK­}kFߦ}„a‰²Hû@j‚ÂÈl¥wéW*:bµkdaØó‚8‡·ëÊ·­Âj8 Z}hóþ¢0wh‹f7ÎËŸ¨/C6r7VÉ DA6R3²]ܶNµ”úRŠO/Öñºƒš_ø @õîE½"7;=¶e+ÈíšGs<C2,9ì€d×<h‡«'·ÃþÅÜQùNÓM™PD}ªÆïaûÉ.°®ë2_m ÊxH×°zWkä2Â6‘#í_t­o7“&FWI0¯e´£®ÝIpc »”²>#8ÿ„N1PÀ°E;Å|´[ÚžôÇ3^pÝŒËRÞíâ¼|æ#†ë|m1Bdvzè@‰ôò§@ÇZ:yJÍÊIr*ßl`¶n6é¦É ÜsVm0 3äáUôŠu¸| Ö©ªMR1wØG¡+]O´ªL»/#!œ²u*XV$BÔ)üŠz
+Œ(‹ÀÚ¦ãªdeÿÔçÌ®
+7©hâ\s&dCµäuí%HÏëñ#×M4º>~´Þ½¨ã!Äe§HÚH¥$lŠÏhE--%âDx"» cl.'‚ÅšÃ~¦iƒ¢L³8¬‘–%Àq²Dphâ‹*É–€(èÞµs5Ím
+ÈêtŽ EéÖ›\žThÆû×^m8Œ¨H¸Êý§nå–'ÔÌmTŽË¡cN ;e#Ò–l»(ÓšözÞÇÞ/y‹°w/êÅxOÙé±,x·å¬o|Ï5…u¥r‹LW¦žåu=¾cƧ4.”/õfë¶"dõ(,-G«réòÑs±Zæ`tÚ®æ^ÜÕ‡ÿuœ§à8mšŠ$ðÒwd³½V'U‰Æ‘ˆ—ÆìŠ(•<…WR½òÞe…—Ç 7†X”õJJc|ªqn×ýZ^·qÔþiàõîE½"&;=¶€*×*–܇sÊ‹a9%)H™±I^nrXbÇqNB]à³8ºÌ6€³f!¸MÕo Ëpòkغ¾ÇŒƒ¬×º‚Фs
+ɳÏþ?DE­T´:Î LÚ;õʵ<obY&öÇŽÖ/êÅxéØé¡œ#·Ð:½ 3œÌ/q_èg1¿*ʶ_SȾþšµ[k™¡·Ck ª… ج]Ù;O­@?iZEßåÚòÊ)Ý‚µV¥ô֔˄¯IÓmÊkÍgU8³<=þl¬U6“€YYokÖÁ8€©Ò¤Y‡>ÅÞ—+yÝÂ˧ջõb<ˆ^ì’OHÃh=~±KH±Útµ_¬‚†&¶kÛe 0êÏ·Sø¼µÑΈŒ»®ºoºma,ÝÊáN´ ¢1Íœ8ݶ¢­Yëdö´ê{ƒÁQ„†-Nl¥ÖÉE_´Ò¸uédºò´y›‡ 0‚F£B¸G¦mˆ\Ò⺫bÈClfŒk3|£¤HÒ4Hª˜V
+,)8$ s˜T,q@)¯ðØXbþ«2ü Ú fˆ9šR¹Ô°¢
+êXتBÛ,·pkPñ‹5œ®‡]Ø4]hR})»œÔáÙe°cÐù+ª>Õ cT*4ºLÔ äÄÐU
+…¡ ‰’’?kÊ7ƒ†!od‰šlÙ1YÜŸ¹úíÓdæ:×VC Á˜=^ñG†‚f¼c !¡øjòY|Jžê
+÷´¹dœR£©\ì|ïã껿¬]¬ec^–
+½Ûhóþ̨hX/Se†!t=ª;Nõ]¨ó¢FXFJ;9cE\+¼ˆ¦ü–²¬ëz"ª¦DéK‰^‹E[a7G}hg†ÃašS„US!_9¨#Sú¯ k¹:’(!Áˆ©$mXÒÇþž‚mì¶S½·mç¯ÀP^+u|Ë<@ä`ºd!†l+£úÞIцŠ‰Þ Q&SÈi9rs™0AØu-DÖƒŸÜŠ”PžšÞÈ1á£ù¶v4¹:ˆgÝuç+}§?¥PFƒrrýqíV}ä§AèÅl×,'þ^ùDNÝŒfŸˆisZÕ?ÿ8&ûŠm”¤¢ˆO!^ü//^Û11‰vèÓ™ÞAð¶-¥åõµS˜a<é«k-g d‘"¯ëdÄÆɪiØ%ª:¤È# wWœqç„…ùÜ çàþÖ|K²£©)¹ÃÖvÑYc½,»°™³mrMÐJ¶¤C7Š»¯ÈG—ŒtL”¬bʸÏ*Ée¤M}/6¿.ë_.Ôƒ’ð{š7Ÿ–‚6 G›#\c-ÈXszÅ;ûNN€®"@M¾ãŸèA¥ò¬¢'ÄW½ ø}¿·Úµê³6+ìé e(þamÕ‚’§J²¡T}¨³ù%]`}íQ_r›‚UZÐxbÊj¶¬h39Hª·kÃçRƾ¥÷pà8(˜¬¾š’œ¥æJoÖªq§xD™CÙÊpºCÆõå–gf{³aÈ¢üªæß©¶ œ±êï‘Æ“·ˆGÅÓ5èí
+{I¾1P«Š+Vç;duZVW<nº¢Õ·sYÏÇ^q¹·˜Vêô8â–E…\‹ƒN3^Ê»í5~§g¹0ïP¦“F=Úõknå>®k_se*Y’Ã…$ðŽ–üµ8Üruùõ¡µz‡ûúº?´^¯7jE—Ën3{ZÙÊ?\_ׂµá‹„,|ÈðíÉ8ë‹òGæ»Úþs'ùZ‡²“ü3£¸”ýê‰Îjÿ¸òŒY¶w. 5óÿ“^ê†JÁïü½ýï©Ï®‰å fað\ÿÍ}¦Nß;ýÞŸ
+]ý$DßÁXÅ×íce¬êÌXuÁæŽÌ?—8*ÿpL^è¨9Ÿ]1œ`]2’NTE“Gj2Ü;ÜÖ‚€±¬dÛÞ²¯MTH¢›Ý24ßÉR¯n ."©èS‚c¾&Z°Dx¾•*8•TjƒŠöq°]´–7YÃ8]£t_Õ8«ÝµÖn[³æ󧲊iq& ’l#¨(!¦•‰©¡Î-úê,Ê*hû꼯ɼ?W6ªý”¡¢ßo¯²4²n=N}P—|UI3ùOÕd¼*–˜@9¹õ.¤9au[”vdIdÅûCÅ%š:z> Ð]Zw‘dÓLïÍ![Úû«™»º•ýHºö‡šþt»kmçåŸZ‡ËúO; ˜b: Øûå+‹û.ª›ø«?{ó³ŸÿEýû?ÿÍ?~õ«ßýÛ·oõï?ûú×ÿüJÞ,-x?¦',ý±(bª~õoþÓÿ‡¡êÿê]—ÈßþåWý¿xú/Oû£ÿ•—vøûãÃǹ\Ô??þ÷·ÿqá„úÅc(¡î.òÿvüŸ9DÿñTžþòéÿŸðôøÓõæíñ5¨‘Ë–ÔXŒ—`…(Ë{ ÎvO5·D{œyPœMÃÌ0ÊoNÕÐq”¬ §?Zof~
+I¡ÈÛçRhÇ*§§QÄɶ§¿ªÏåqúqzÚâ(×+¼xÕ÷0KýàPÕë‹»…‘d„Ên"Œ½ÅçþKTå´…oAÝÆaƒÚØ’µÇ)Ù2ðñ
+&yY<¹Õ;àx‚ã7¡©'Ï¢ )ž¯ü™ç_Ñç_Ñç^Ñç_Ñç7ß½$¯-ÜmD&°ÊfdYÁFÑqýhìKlsJ¤a5ï¥ÔéŽÎD“^u( ‡_§¤<f„ù£#Cy¾ëÀð=ÜCÓ¨ŠÎ©É`+?2‚® " (‡NÀ2"÷%ÿ‚.‘/T!žHQTÕZä(Å ñõªbÁ+i&­ùˆ|Úø"Ã$áaRP iè|“ýß ’I¾ à—¾ìËDá7¯/•Äï?T>°.|þ`]øüÁºð}˱–íß“9<=¸éèXÅ°é†ØNдº1tÉße@Æ9ðå,$ThP¢‰ž‰2? áh`g}¯@ ‚SLÑû!v\`™CE/x˜5ä"L…à<ŸþcÅë;Â'©û^Y’Wî²ÀÕÓV!*7—§¨ùœ“Ÿ€’¬Z$ £¯Ò{,EáÈŸÄA;C%»<hò‰¬ ^ ”PÇ­ÉQ…S©e8݈”cIÀ=o‰µÙ’ÀæË·¢`ž"øåp¯·ESͼ”^Uë(žÆŸø|¼œkƬá:Á´Æ{°ˆ“Óµ–œeÆQ­¢†o¡å¯_ëA'©_yM!|’zïår¬esÕ³½^ ͘ՠaŸþ+)i-’9r1+Û Ò`ì~QÊ,… Ñל:Èq+µèq]!EÔ§ û›œ<ŒAWÔ+’Ë¡ío{–;5à ½ÞõS×w¯,É+ w[à*®¸­(dëe͵jœ¡DS/yøI
+)‹Ü#G’Ю˨ßÂïÀ<¿Ìyf˜m£p'ìJ*žÑƒoxªÄ:³
+V9Š#`blí¨çëB‰r9²^®\Æžu~sq!óR8}‘EnÂz•­¤yÊ/—÷~{Éêý쯯ÆZ´ÇП^âhǾa=û1qKd§Ð,ŠeE»’àßò2î§çŽã
+¤Y
+Îê®8:\i<·6 mW½>üœ6ËV‡mrÙ]ó-´-åLñé•Õ½ß^rZ}Fû;—ÃËöòÕ‹¯Í^€…u4j@¨©òÄzoŠ“½ëÃsΩÖÑäÅ3±Ž)÷Af™0@½‡ÓÃ4`£æ÷Í/X'}¬V;/Ã,œRä´hb2¶mè;hãyÍ4×'ƒGdë²D†ªû¹mU ðË5»•Dío™©{­Ý`ﺪ’¹xp‡g!sŽµ¡žµj¥]³Ÿkuï7—íCŸ±þÎåð²=„ºõòX6¥.¬OfâJ(#}6ºE}¥ç¦nmKvGlâïy÷4ÎÙ
+i"‘ ÎÑ›Iw•tàœHÁï@T–8§Î¦F7ƒS± ìÛγsoÓº
+^,îýÞ¦êg¨¿{9¼lᙽÜ$+Z‘u4{É/ŽÞÈg"jae¯À(N‘±ÃŒ3§5C˃œžN(Ó2ÝΡÎ)È£lò?àz¢êª”®e,¶:H”SøKiªE¡’_„ÿ ß2T%¥ÀË¢tº§ôJ¡Ùi͘q–áh
+N®4çQ•Â?€¼kP ÝœÊ÷*6pÜé‚¢›aÇ#•|6ÿÓËŽß[’ß~†ú;—ÃËö’ÚËcû¸ÒQOóoµåƒ–€ˆÞDB~8(#P;Yo­^f“j³kL´±îB†Šö¬ÈŒæ:Å,5£^«…æ`B]°ƒ€– ¡ÅÊDß57Ùéämd
+ŠXW¦ÉÜN)»çqZP
+v×,)›@Ž¯$ÓR
+‘ÆT¼ÇϪ¬j
+êPvÕaÇd
+²åàªëþ/{ò ®Döá!}ÉÂ"rê-67`WªÎ
+Ù1qÞ9a°ä‚…Ns5Uõ>³ñ9(ž ~è¨ÌÛTîèbm¦%ÛŠ3¹À“ëCÃß*€î>qW¸"Î%À’ò¦’¥˜óÉÃý¡XÄ%Ù;[UȯÞPŽœj±ÛWdÍl#Œñ©¹r⨚úC9q¦ø›>ç.ÛîaiÔÐÝ…Rì‚ìªuqƒn¯š¤‰ÿ“–
+—Qãg^¯OEi“ fí¸^Âë\jI½²¸\Änª­Ö©@¥Ïð+×°5o¯XûŽÛ¤º7ê°¨W0.*Ýv6 Zý¹mä+&´»š4_•ÌèNK¾²Eò…G‡Nj\fwPØ''¨»Õ¼¿Iîo¢Ñ7o|f£p¬I±T~ÒÐ0Á£V•‰v,8JȽHâ!&í*Ï®bÁU=²Î©¥zUq¤¿cr6°k3¥½‘4©«}Ž¨[l4÷mŽàÞw
+‹ÍöúzZwÏüu³De.‡¢bêo³EåVDV}ð6â2ö®¥´‹½7|vŠmO„Dg:;
+И¹Ë6½QäÜeû°üáYE_ á/@¶à Fʬ̳>ÅÁcV-$ÝR­StkîH®°‰¬Þ|¹&âÙf|AÚmPhß¾±a0dF×ZlxdX•…v·Ø û¼7<t^lô¹ôK"1eõçM[£¸ ¬EÔ(9ËÁðÊhª{¬»0
+1KC./öŠfnfVœ=8ÂÍšsM÷àÒ±V¢ÚîÑÉàÄ{ƒç+ÊñžÝؤ¾l O3kʽI5`h R4•cD«éŽÕWÞê1ÜÍp¢âÕ#¯ŠçêsÝMñÛ»›c•ÅŸ£ñHátOù¬þéhï‘éQ¤TªæÛøÌÉö™“ííÈÉö™ø¬ÄB±UÔÏ7 ±Øâ6»qƒd³:ƒ˜3Îÿ.^p±O_Ù"9;-¥§Ìzþ+Ó|з_Áÿ¾æ~Àå]~*´Ð,@€Ò|-ô†îÇÉ ]‚ú_}V蟿¹î÷†í÷í÷†ì÷ìïÀMÆèïO’Mo£vÑl0íÌ-!*{ÛtgF Ý*ǴŘ™Y"É"sû^VMyá9Ï"04·•½[BøLc: ©>ÚÈ®wÙ®ˆ°hWÔ0D¶?·_a=ì囂m›LÍ¬à›°7|2Îs¦] >9>úEÍ"Ìc êg³äí3¢É@ÒÛ¬Q»m!œzŽ|WPiN„yù‹Kä »ñûs·"`¹I²ÿõ‰ùŽ}ø‡2+š™@ =È¢f§¥vRG£.Ý¥ˆ_IšL\Í ðâáx*xïRŒ‡Òq÷ÃH'ÞÄKqú“÷ʶ¾deS`$N¢¹=‹åw2i Øù§áayœÿõ%ßÃ$üCXË^YM‹rT-ÇI’ù¡¿[µ´EŠCrysÔ(º“h½þ—oÎÂâ €ûY)Þ¿½_ÚÍÊíü™î¥ÝÙ’Ó_[²ÛZÚ?üîå¾üÎð2ýÍ›W7í•M¯ü¦Wpò
+š®˜ûòÍëÈ|¿/WýõóphîA÷Ë3@¦ú™B2'MMÆ’hr|ÓÜL#Q#Þ(ª}Ÿ›”«žWÒÞ
+¬uzWÝí¹䥖848MPÝŒ.ÝÒÜš{fH´ù°!,M'¾Zf5œ»_†3yªú¢´¸«LnœQ‚ó¸®xòtñÔ¶µ7I´'<îJWBëpÐa_ìÚĪí)#nøͤc4Ž[¼p²Ò4­’'íÐ}YŸŠn©
+Ó¢Ž…Šû"4äFƒ šÌ Ç`“y®æ$+:ä°zk½»êìùͱ氱•vÊò¯šˆ8‰&SyEj$½þjBVŠ'9+• f–NaE1ÿjAô'”¤+›Ý%+~M2@kçe £ ˆa¢¯Íû4ñ‹Xëô0†¼Ûs9ÍÅǸÄთ|(Hwh0³¢£w–WA»ö!4ý­˪eˆ*ãŸ*ÅÍk˜‘ ’k'ú®×EûX§±XšQÈÁáÌsW,'@ϵšÌae¡‘Ä»Þ"S¶X¾â*%)¸[¡»ýAÆâÓFèÝ
+¬uz­ÝúCAL@  œƒ5™;”¬Ch«6)ýªÇ —¶EY†ŒÅ•£ŠÀ˜Æ°­X"µTÓè©¥BûÔóreéË!¥]Ÿš,M
+·Ü_ݦ S]ŒD<Íu:§I 9l6<7 ´S ç\Ž`MÊE9z…î¶'…Ø?m€Þ¯€×éQ\t·Ç¦·!ÄÞK«kïRºGk^V=‡·Ê¾±EL¶M¹¦Rd×&%=h°§ºr‘öe0MÂ]<CŠU{=Áú˜
+eŒaµ4|oÒä•Ã]/™f—&ÜÄê ýqV™sin^ä4WÓpÈ€1P"9¯ÞÒ(û™¶E m¹ÀE"²aÈ6­ÉæF²Ï€šO›×uWÏí—¢ª
+Æ6‹õ)JuÿìѪÃi;‰œ]dÌ…PŽs„’].C³dŽ›ÁJQ[Þd/yÕ÷´Ù¬¦Wwj
+i#x¬B#]zú°7V]œ‚;½ëU£3cZ–9Q{<˺H=ºÛ¿¡;™¶Å¬§Ï*Ý]û:îÇç…£<½\ß»½]¸ùtÑ}¿^§ÇÝžJʵ…î­‚4(‚шª;·µ’Ì%ngo;B%L~¹1‚K)¥eL;ºœRÜÆE“;?Hp%‰FÕwÕËR‘2ût3KÚ”Y÷Ç?Ú<g—DB7'ð¨ö´æfS6ceÕô³€Iª;9¼s”–#lÕ]d†0xã¿PRÍSÓÝÛÁâio«[K>]t߯€×éa<q·çÎ26¾Ó\žz6/ZFk\ö=»}Û¶50§–Ñ
+É;rQWH4Ʊ4p‘>Ï·á~¥4‡æó²_Fž²_8í‚
+í$r wp`*¾W5yÆzU@fǨ°˜‹N@.}g¼Éx@lw´X½Tt}}W[7v0¯ÒçiÇ3ÛÅ}+¾)]N®ó—K{·±¤?û¤¡}¿^§‡ñÃÝ¢ó½uKu¬m
+e¹KRuå² ‡"»zÛº1ò:ÝÖ‡™0ÚRÀ5Û¥”¨«m¬äÑô± ÑÁ½êŽ™I”Ñ}«hà9ºY•,ð5›á«æŽÓc(I·%^ Je!fÒ2ÇK­Àmo,F¯«ud‚ÇÚºG%M;ífŒûµ½ÛÙã
+$<)ìK²MEyÆ¥§MÎ^^Ö2¿‰}PbÉ“ÛW2âɾ"ûà ?’î“%.Ä
+Š,O<¾ÅÄÀ-M¾8ǵ‡mõq òo0ËYD?öÖc°E¾¾pº»>´¦*ÒÞA­£ œ
+ ˜yËm+ÍÀa~Ùr'GS(±¹3¾àãTˆh€ã¬ª.âµ¾ÓhÊ=à>è·$ñáÎY¨:sļÀúIQtŒçMÖEÚ횺Ù!¬Áf‚]ô .dŸâ ̤4£âƒ‡å¡ÒÕC%–°ˆÆTˆz@êŽe µ3‡ÎÔäl:[k
+ªâJ9é)†¯ˆ'lI­ u5C[¬+¹”{¡[Vó;MY¨ ­¿ÚšK ÍX8ÙóáBDÐ¥.úeˆj)‹DͬÌéaU«Žjʺ&Æú«®o*U S†¤ÓªR Õ¢¸3–$’}³ͱì"W·\òa,GCF²ql<Í·ýŠ1(K·(–»°}·÷xx§èÌTÉñ)<3V]QV1§B©Åˆqm¯1i­(}Õ×$Ž³(J%éi‡²¿šs6WŠ­ÙRu¨ÄYúb1|’ Ìžmûž½mƒ-¿´â‹Ø>¨añ”}œ>’âÞ36î0kÜ#s0À[6pSsÜñØ]!íÒÿ¼Xxjró«þ,ÊÅ¢¾›Ü(ó~n^ jca™ÃÝä5%7#ß`7Ýä¼Nr[(çV–èù®ÓjÞʼnÍ^f±V¸®ÚÃئÀ¸¾t'ÂônÜÁ¦pq/¡-ó¸?ûŠïõ(ä§aOˆŸà§ómW[(¶±ó¸ÅIÙTÀLJºÔJ):%¯^†ÆæÓ²û%[ó7sÙŸ[£®Kñ0úÒcó¸s̸»Aqˆºîbœ dÑÍÛÑ›yô¼ œ£Ïi5GîžÏ¼“”,¿¡Z®·Ì¢»¦Ârú!#»©§¬ž–æð‡ŒMYš ½L—Cÿcªv†¤+ÏãyêOsÍXXâWm>ÝÖž••´¨ÆØÙ¢"åO[u}Îå”%¯BÞÓâ>ŠRÌB20CÙtÒ¸øbî¡úrhñ®6.ì{ÝÓ± eàÉÝ!'£?×vq¤µ•â Ñr ®òQ}XzåE'ößúÝNÙzߨ±â—÷݆>ã×dëQ~_ò­J¸Š¼Ô»L·áEMG®²ãþ¨„cËTþÌàð™Ááú’Ÿ‰ÅL,6§Ò‚šZlËŠ†ÓÅ,}
+ì)Á[uŸë×Ì4n¢å̵4/Ÿƒ&ªœni–‹HÓß´Œq}ÊM¼SãRÎÓ¢]iho}n¿
0000000016 00000 n
-0000045544 00000 n
+0000046044 00000 n
0000000004 00000 f
0000000006 00000 f
-0000055744 00000 n
+0000046095 00000 n
0000000007 00000 f
0000000008 00000 f
0000000009 00000 f
@@ -4977,9 +4996,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000013 00000 f
0000000014 00000 f
0000000018 00000 f
-0000045595 00000 n
-0000055567 00000 n
-0000055598 00000 n
+0000359516 00000 n
+0000372837 00000 n
+0000372868 00000 n
0000000019 00000 f
0000000020 00000 f
0000000021 00000 f
@@ -4989,9 +5008,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000025 00000 f
0000000026 00000 f
0000000030 00000 f
-0000045664 00000 n
-0000055451 00000 n
-0000055482 00000 n
+0000359585 00000 n
+0000372721 00000 n
+0000372752 00000 n
0000000031 00000 f
0000000032 00000 f
0000000033 00000 f
@@ -4999,9 +5018,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000035 00000 f
0000000036 00000 f
0000000040 00000 f
-0000045735 00000 n
-0000055335 00000 n
-0000055366 00000 n
+0000359656 00000 n
+0000372605 00000 n
+0000372636 00000 n
0000000041 00000 f
0000000042 00000 f
0000000043 00000 f
@@ -5027,9 +5046,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000063 00000 f
0000000064 00000 f
0000000068 00000 f
-0000045805 00000 n
-0000055219 00000 n
-0000055250 00000 n
+0000359726 00000 n
+0000372489 00000 n
+0000372520 00000 n
0000000069 00000 f
0000000070 00000 f
0000000071 00000 f
@@ -5040,9 +5059,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000076 00000 f
0000000077 00000 f
0000000081 00000 f
-0000045874 00000 n
-0000055103 00000 n
-0000055134 00000 n
+0000359795 00000 n
+0000372373 00000 n
+0000372404 00000 n
0000000082 00000 f
0000000083 00000 f
0000000084 00000 f
@@ -5052,9 +5071,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000088 00000 f
0000000089 00000 f
0000000093 00000 f
-0000045945 00000 n
-0000054987 00000 n
-0000055018 00000 n
+0000359866 00000 n
+0000372257 00000 n
+0000372288 00000 n
0000000094 00000 f
0000000095 00000 f
0000000096 00000 f
@@ -5078,9 +5097,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000114 00000 f
0000000115 00000 f
0000000119 00000 f
-0000046015 00000 n
-0000054869 00000 n
-0000054901 00000 n
+0000359936 00000 n
+0000372139 00000 n
+0000372171 00000 n
0000000120 00000 f
0000000121 00000 f
0000000122 00000 f
@@ -5091,9 +5110,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000127 00000 f
0000000128 00000 f
0000000132 00000 f
-0000046087 00000 n
-0000054751 00000 n
-0000054783 00000 n
+0000360008 00000 n
+0000372021 00000 n
+0000372053 00000 n
0000000133 00000 f
0000000134 00000 f
0000000135 00000 f
@@ -5103,9 +5122,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000139 00000 f
0000000140 00000 f
0000000144 00000 f
-0000046161 00000 n
-0000054633 00000 n
-0000054665 00000 n
+0000360082 00000 n
+0000371903 00000 n
+0000371935 00000 n
0000000145 00000 f
0000000146 00000 f
0000000147 00000 f
@@ -5129,9 +5148,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000165 00000 f
0000000166 00000 f
0000000170 00000 f
-0000046234 00000 n
-0000054515 00000 n
-0000054547 00000 n
+0000360155 00000 n
+0000371785 00000 n
+0000371817 00000 n
0000000171 00000 f
0000000172 00000 f
0000000173 00000 f
@@ -5142,9 +5161,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000178 00000 f
0000000179 00000 f
0000000183 00000 f
-0000046306 00000 n
-0000054397 00000 n
-0000054429 00000 n
+0000360227 00000 n
+0000371667 00000 n
+0000371699 00000 n
0000000184 00000 f
0000000185 00000 f
0000000186 00000 f
@@ -5154,9 +5173,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000190 00000 f
0000000191 00000 f
0000000195 00000 f
-0000046380 00000 n
-0000054279 00000 n
-0000054311 00000 n
+0000360301 00000 n
+0000371549 00000 n
+0000371581 00000 n
0000000196 00000 f
0000000197 00000 f
0000000198 00000 f
@@ -5180,9 +5199,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000216 00000 f
0000000217 00000 f
0000000221 00000 f
-0000046453 00000 n
-0000054161 00000 n
-0000054193 00000 n
+0000360374 00000 n
+0000371431 00000 n
+0000371463 00000 n
0000000222 00000 f
0000000223 00000 f
0000000224 00000 f
@@ -5199,9 +5218,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000235 00000 f
0000000236 00000 f
0000000240 00000 f
-0000046525 00000 n
-0000054043 00000 n
-0000054075 00000 n
+0000360446 00000 n
+0000371313 00000 n
+0000371345 00000 n
0000000241 00000 f
0000000242 00000 f
0000000243 00000 f
@@ -5217,9 +5236,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000253 00000 f
0000000254 00000 f
0000000258 00000 f
-0000046599 00000 n
-0000053925 00000 n
-0000053957 00000 n
+0000360520 00000 n
+0000371195 00000 n
+0000371227 00000 n
0000000259 00000 f
0000000260 00000 f
0000000261 00000 f
@@ -5249,9 +5268,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000285 00000 f
0000000286 00000 f
0000000290 00000 f
-0000046672 00000 n
-0000053807 00000 n
-0000053839 00000 n
+0000360593 00000 n
+0000371077 00000 n
+0000371109 00000 n
0000000291 00000 f
0000000292 00000 f
0000000293 00000 f
@@ -5268,9 +5287,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000304 00000 f
0000000305 00000 f
0000000309 00000 f
-0000046744 00000 n
-0000053689 00000 n
-0000053721 00000 n
+0000360665 00000 n
+0000370959 00000 n
+0000370991 00000 n
0000000310 00000 f
0000000311 00000 f
0000000312 00000 f
@@ -5286,9 +5305,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000322 00000 f
0000000323 00000 f
0000000327 00000 f
-0000046818 00000 n
-0000053571 00000 n
-0000053603 00000 n
+0000360739 00000 n
+0000370841 00000 n
+0000370873 00000 n
0000000328 00000 f
0000000329 00000 f
0000000330 00000 f
@@ -5318,9 +5337,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000354 00000 f
0000000355 00000 f
0000000359 00000 f
-0000046891 00000 n
-0000053453 00000 n
-0000053485 00000 n
+0000360812 00000 n
+0000370723 00000 n
+0000370755 00000 n
0000000360 00000 f
0000000361 00000 f
0000000362 00000 f
@@ -5337,9 +5356,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000373 00000 f
0000000374 00000 f
0000000378 00000 f
-0000046963 00000 n
-0000053335 00000 n
-0000053367 00000 n
+0000360884 00000 n
+0000370605 00000 n
+0000370637 00000 n
0000000379 00000 f
0000000380 00000 f
0000000381 00000 f
@@ -5355,9 +5374,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000391 00000 f
0000000392 00000 f
0000000396 00000 f
-0000047037 00000 n
-0000053217 00000 n
-0000053249 00000 n
+0000360958 00000 n
+0000370487 00000 n
+0000370519 00000 n
0000000397 00000 f
0000000398 00000 f
0000000399 00000 f
@@ -5387,9 +5406,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000423 00000 f
0000000424 00000 f
0000000428 00000 f
-0000047110 00000 n
-0000053099 00000 n
-0000053131 00000 n
+0000361031 00000 n
+0000370369 00000 n
+0000370401 00000 n
0000000429 00000 f
0000000430 00000 f
0000000431 00000 f
@@ -5406,9 +5425,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000442 00000 f
0000000443 00000 f
0000000447 00000 f
-0000047182 00000 n
-0000052981 00000 n
-0000053013 00000 n
+0000361103 00000 n
+0000370251 00000 n
+0000370283 00000 n
0000000448 00000 f
0000000449 00000 f
0000000450 00000 f
@@ -5424,9 +5443,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000460 00000 f
0000000461 00000 f
0000000465 00000 f
-0000047254 00000 n
-0000052863 00000 n
-0000052895 00000 n
+0000361175 00000 n
+0000370133 00000 n
+0000370165 00000 n
0000000466 00000 f
0000000467 00000 f
0000000468 00000 f
@@ -5442,9 +5461,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000478 00000 f
0000000479 00000 f
0000000483 00000 f
-0000047328 00000 n
-0000052745 00000 n
-0000052777 00000 n
+0000361249 00000 n
+0000370015 00000 n
+0000370047 00000 n
0000000484 00000 f
0000000485 00000 f
0000000486 00000 f
@@ -5477,9 +5496,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000513 00000 f
0000000514 00000 f
0000000518 00000 f
-0000047401 00000 n
-0000052627 00000 n
-0000052659 00000 n
+0000361322 00000 n
+0000369897 00000 n
+0000369929 00000 n
0000000519 00000 f
0000000520 00000 f
0000000521 00000 f
@@ -5496,9 +5515,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000532 00000 f
0000000533 00000 f
0000000537 00000 f
-0000047473 00000 n
-0000052509 00000 n
-0000052541 00000 n
+0000361394 00000 n
+0000369779 00000 n
+0000369811 00000 n
0000000538 00000 f
0000000539 00000 f
0000000540 00000 f
@@ -5514,9 +5533,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000550 00000 f
0000000551 00000 f
0000000555 00000 f
-0000047545 00000 n
-0000052391 00000 n
-0000052423 00000 n
+0000361466 00000 n
+0000369661 00000 n
+0000369693 00000 n
0000000556 00000 f
0000000557 00000 f
0000000558 00000 f
@@ -5532,9 +5551,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000568 00000 f
0000000569 00000 f
0000000573 00000 f
-0000047619 00000 n
-0000052273 00000 n
-0000052305 00000 n
+0000361540 00000 n
+0000369543 00000 n
+0000369575 00000 n
0000000574 00000 f
0000000575 00000 f
0000000576 00000 f
@@ -5567,9 +5586,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000603 00000 f
0000000604 00000 f
0000000608 00000 f
-0000047692 00000 n
-0000052155 00000 n
-0000052187 00000 n
+0000361613 00000 n
+0000369425 00000 n
+0000369457 00000 n
0000000609 00000 f
0000000610 00000 f
0000000611 00000 f
@@ -5586,9 +5605,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000622 00000 f
0000000623 00000 f
0000000627 00000 f
-0000047764 00000 n
-0000052037 00000 n
-0000052069 00000 n
+0000361685 00000 n
+0000369307 00000 n
+0000369339 00000 n
0000000628 00000 f
0000000629 00000 f
0000000630 00000 f
@@ -5604,9 +5623,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000640 00000 f
0000000641 00000 f
0000000645 00000 f
-0000047836 00000 n
-0000051919 00000 n
-0000051951 00000 n
+0000361757 00000 n
+0000369189 00000 n
+0000369221 00000 n
0000000646 00000 f
0000000647 00000 f
0000000648 00000 f
@@ -5622,9 +5641,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000658 00000 f
0000000659 00000 f
0000000663 00000 f
-0000047910 00000 n
-0000051801 00000 n
-0000051833 00000 n
+0000361831 00000 n
+0000369071 00000 n
+0000369103 00000 n
0000000664 00000 f
0000000665 00000 f
0000000666 00000 f
@@ -5657,13 +5676,13 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000693 00000 f
0000000694 00000 f
0000000698 00000 f
-0000047983 00000 n
-0000051683 00000 n
-0000051715 00000 n
+0000361904 00000 n
+0000368953 00000 n
+0000368985 00000 n
0000000702 00000 f
-0000048054 00000 n
-0000051565 00000 n
-0000051597 00000 n
+0000361975 00000 n
+0000368835 00000 n
+0000368867 00000 n
0000000703 00000 f
0000000704 00000 f
0000000705 00000 f
@@ -5680,9 +5699,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000716 00000 f
0000000717 00000 f
0000000721 00000 f
-0000048126 00000 n
-0000051447 00000 n
-0000051479 00000 n
+0000362047 00000 n
+0000368717 00000 n
+0000368749 00000 n
0000000722 00000 f
0000000723 00000 f
0000000724 00000 f
@@ -5697,9 +5716,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000733 00000 f
0000000734 00000 f
0000000738 00000 f
-0000048198 00000 n
-0000051329 00000 n
-0000051361 00000 n
+0000362119 00000 n
+0000368599 00000 n
+0000368631 00000 n
0000000739 00000 f
0000000740 00000 f
0000000741 00000 f
@@ -5715,9 +5734,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000751 00000 f
0000000752 00000 f
0000000756 00000 f
-0000048272 00000 n
-0000051211 00000 n
-0000051243 00000 n
+0000362193 00000 n
+0000368481 00000 n
+0000368513 00000 n
0000000757 00000 f
0000000758 00000 f
0000000759 00000 f
@@ -5747,13 +5766,13 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000783 00000 f
0000000784 00000 f
0000000788 00000 f
-0000048345 00000 n
-0000051093 00000 n
-0000051125 00000 n
+0000362266 00000 n
+0000368363 00000 n
+0000368395 00000 n
0000000792 00000 f
-0000048416 00000 n
-0000050975 00000 n
-0000051007 00000 n
+0000362337 00000 n
+0000368245 00000 n
+0000368277 00000 n
0000000793 00000 f
0000000794 00000 f
0000000795 00000 f
@@ -5770,9 +5789,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000806 00000 f
0000000807 00000 f
0000000811 00000 f
-0000048488 00000 n
-0000050857 00000 n
-0000050889 00000 n
+0000362409 00000 n
+0000368127 00000 n
+0000368159 00000 n
0000000812 00000 f
0000000813 00000 f
0000000814 00000 f
@@ -5787,9 +5806,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000823 00000 f
0000000824 00000 f
0000000828 00000 f
-0000048560 00000 n
-0000050739 00000 n
-0000050771 00000 n
+0000362481 00000 n
+0000368009 00000 n
+0000368041 00000 n
0000000829 00000 f
0000000830 00000 f
0000000831 00000 f
@@ -5805,9 +5824,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000841 00000 f
0000000842 00000 f
0000000846 00000 f
-0000048634 00000 n
-0000050621 00000 n
-0000050653 00000 n
+0000362555 00000 n
+0000367891 00000 n
+0000367923 00000 n
0000000847 00000 f
0000000848 00000 f
0000000849 00000 f
@@ -5839,14 +5858,14 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000875 00000 f
0000000876 00000 f
0000000877 00000 f
-0000000881 00001 f
-0000048707 00000 n
-0000050503 00000 n
-0000050535 00000 n
+0000000881 00000 f
+0000362628 00000 n
+0000367773 00000 n
+0000367805 00000 n
0000000885 00000 f
-0000048778 00000 n
-0000050385 00000 n
-0000050417 00000 n
+0000362699 00000 n
+0000367655 00000 n
+0000367687 00000 n
0000000886 00000 f
0000000887 00000 f
0000000888 00000 f
@@ -5863,9 +5882,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000899 00000 f
0000000900 00000 f
0000000904 00000 f
-0000048850 00000 n
-0000050267 00000 n
-0000050299 00000 n
+0000362771 00000 n
+0000367537 00000 n
+0000367569 00000 n
0000000905 00000 f
0000000906 00000 f
0000000907 00000 f
@@ -5880,9 +5899,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000916 00000 f
0000000917 00000 f
0000000921 00000 f
-0000048922 00000 n
-0000050149 00000 n
-0000050181 00000 n
+0000362843 00000 n
+0000367419 00000 n
+0000367451 00000 n
0000000922 00000 f
0000000923 00000 f
0000000924 00000 f
@@ -5898,9 +5917,9 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000934 00000 f
0000000935 00000 f
0000000939 00000 f
-0000048996 00000 n
-0000050031 00000 n
-0000050063 00000 n
+0000362917 00000 n
+0000367301 00000 n
+0000367333 00000 n
0000000940 00000 f
0000000941 00000 f
0000000942 00000 f
@@ -5918,103 +5937,440 @@ k­æ(†ìlYÆÛœz»Ï­Ds7ùp†w$Ëô¦Þ-‹9[·Rtý&쎕ë,“vv2.š"­Ê:©#ß?^Ù‹me Ù ìË°uº‹Ú~Ù
0000000954 00000 f
0000000955 00000 f
0000000956 00000 f
-0000000957 00001 f
+0000000957 00000 f
0000000958 00000 f
0000000959 00000 f
0000000960 00000 f
0000000961 00000 f
+0000000962 00000 f
+0000000963 00000 f
+0000000964 00000 f
+0000000965 00000 f
+0000000966 00000 f
+0000000967 00000 f
+0000000968 00000 f
0000000969 00000 f
-0000174447 00000 n
-0000174523 00000 n
-0000174747 00000 n
-0000175772 00000 n
-0000183336 00000 n
-0000248925 00000 n
-0000314514 00000 n
-0000000974 00001 f
-0000055683 00000 n
-0000049069 00000 n
-0000049913 00000 n
-0000049945 00000 n
-0000000987 00001 f
-0000049140 00000 n
-0000049795 00000 n
+0000000970 00000 f
+0000000974 00000 f
+0000362990 00000 n
+0000367183 00000 n
+0000367215 00000 n
+0000000978 00000 f
+0000363061 00000 n
+0000367065 00000 n
+0000367097 00000 n
+0000000979 00000 f
+0000000980 00000 f
+0000000981 00000 f
+0000000982 00000 f
+0000000983 00000 f
+0000000984 00000 f
+0000000985 00000 f
+0000000986 00000 f
+0000000987 00000 f
+0000000988 00000 f
+0000000989 00000 f
+0000000990 00000 f
+0000000991 00000 f
+0000000992 00000 f
+0000000993 00000 f
+0000000997 00000 f
+0000363133 00000 n
+0000366947 00000 n
+0000366979 00000 n
+0000000998 00000 f
+0000000999 00000 f
+0000001000 00000 f
+0000001001 00000 f
+0000001002 00000 f
+0000001003 00000 f
+0000001004 00000 f
+0000001005 00000 f
+0000001006 00000 f
+0000001007 00000 f
+0000001008 00000 f
+0000001009 00000 f
+0000001010 00000 f
+0000001014 00000 f
+0000363205 00000 n
+0000366827 00000 n
+0000366860 00000 n
+0000001015 00000 f
+0000001016 00000 f
+0000001017 00000 f
+0000001018 00000 f
+0000001019 00000 f
+0000001020 00000 f
+0000001021 00000 f
+0000001022 00000 f
+0000001023 00000 f
+0000001024 00000 f
+0000001025 00000 f
+0000001026 00000 f
+0000001027 00000 f
+0000001028 00000 f
+0000001032 00000 f
+0000363282 00000 n
+0000366707 00000 n
+0000366740 00000 n
+0000001033 00000 f
+0000001034 00000 f
+0000001035 00000 f
+0000001036 00000 f
+0000001037 00000 f
+0000001038 00000 f
+0000001039 00000 f
+0000001040 00000 f
+0000001041 00000 f
+0000001042 00000 f
+0000001043 00000 f
+0000001044 00000 f
+0000001045 00000 f
+0000001046 00000 f
+0000001047 00000 f
+0000001048 00000 f
+0000001049 00000 f
+0000001050 00000 f
+0000001051 00000 f
+0000001052 00000 f
+0000001053 00000 f
+0000001055 00000 f
+0000001397 00000 n
+0000001061 00000 f
+0000363358 00000 n
+0000363432 00000 n
+0000363507 00000 n
+0000363582 00000 n
+0000363659 00000 n
+0000001062 00000 f
+0000001063 00000 f
+0000001064 00000 f
+0000001065 00000 f
+0000001066 00000 f
+0000001067 00000 f
+0000001068 00000 f
+0000001069 00000 f
+0000001070 00000 f
+0000001071 00000 f
+0000001072 00000 f
+0000001073 00000 f
+0000001074 00000 f
+0000001075 00000 f
+0000001076 00000 f
+0000001077 00000 f
+0000001078 00000 f
+0000001079 00000 f
+0000001080 00000 f
+0000001081 00000 f
+0000001082 00000 f
+0000001083 00000 f
+0000001084 00000 f
+0000001085 00000 f
+0000001086 00000 f
+0000001087 00000 f
+0000001088 00000 f
+0000001089 00000 f
+0000001090 00000 f
+0000001091 00000 f
+0000001092 00000 f
+0000001093 00000 f
+0000001094 00000 f
+0000001095 00000 f
+0000001096 00000 f
+0000001097 00000 f
+0000001098 00000 f
+0000001099 00000 f
+0000001100 00000 f
+0000001101 00000 f
+0000001102 00000 f
+0000001103 00000 f
+0000001104 00000 f
+0000001105 00000 f
+0000001106 00000 f
+0000001107 00000 f
+0000001108 00000 f
+0000001109 00000 f
+0000001110 00000 f
+0000001111 00000 f
+0000001112 00000 f
+0000001113 00000 f
+0000001114 00000 f
+0000001115 00000 f
+0000001116 00000 f
+0000001117 00000 f
+0000001128 00000 f
+0000366587 00000 n
+0000366620 00000 n
+0000366467 00000 n
+0000366500 00000 n
+0000366347 00000 n
+0000366380 00000 n
+0000366227 00000 n
+0000366260 00000 n
+0000366107 00000 n
+0000366140 00000 n
+0000001129 00000 f
+0000001130 00000 f
+0000001131 00000 f
+0000001132 00000 f
+0000001133 00000 f
+0000001134 00000 f
+0000001135 00000 f
+0000001136 00000 f
+0000001137 00000 f
+0000001144 00000 f
+0000363735 00000 n
+0000363824 00000 n
+0000363898 00000 n
+0000363973 00000 n
+0000364048 00000 n
+0000364125 00000 n
+0000001145 00000 f
+0000001146 00000 f
+0000001147 00000 f
+0000001148 00000 f
+0000001149 00000 f
+0000001150 00000 f
+0000001151 00000 f
+0000001152 00000 f
+0000001153 00000 f
+0000001154 00000 f
+0000001155 00000 f
+0000001156 00000 f
+0000001157 00000 f
+0000001158 00000 f
+0000001159 00000 f
+0000001160 00000 f
+0000001161 00000 f
+0000001162 00000 f
+0000001163 00000 f
+0000001164 00000 f
+0000001165 00000 f
+0000001166 00000 f
+0000001167 00000 f
+0000001168 00000 f
+0000001169 00000 f
+0000001170 00000 f
+0000001171 00000 f
+0000001172 00000 f
+0000001173 00000 f
+0000001174 00000 f
+0000001175 00000 f
+0000001176 00000 f
+0000001177 00000 f
+0000001178 00000 f
+0000001179 00000 f
+0000001180 00000 f
+0000001181 00000 f
+0000001182 00000 f
+0000001183 00000 f
+0000001184 00000 f
+0000001185 00000 f
+0000001186 00000 f
+0000001187 00000 f
+0000001188 00000 f
+0000001189 00000 f
+0000001190 00000 f
+0000001191 00000 f
+0000001192 00000 f
+0000001193 00000 f
+0000001194 00000 f
+0000001195 00000 f
+0000001196 00000 f
+0000001197 00000 f
+0000001198 00000 f
+0000001199 00000 f
+0000001200 00000 f
+0000001213 00000 f
+0000365987 00000 n
+0000366020 00000 n
+0000365867 00000 n
+0000365900 00000 n
+0000365747 00000 n
+0000365780 00000 n
+0000365627 00000 n
+0000365660 00000 n
+0000365507 00000 n
+0000365540 00000 n
+0000365387 00000 n
+0000365420 00000 n
+0000001214 00000 f
+0000001215 00000 f
+0000001216 00000 f
+0000001217 00000 f
+0000001218 00000 f
+0000001219 00000 f
+0000001220 00000 f
+0000001221 00000 f
+0000001242 00000 f
+0000000000 00000 f
+0000364201 00000 n
+0000364290 00000 n
+0000364364 00000 n
+0000364439 00000 n
+0000364514 00000 n
+0000364591 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000365267 00000 n
+0000365300 00000 n
+0000365147 00000 n
+0000365180 00000 n
+0000365027 00000 n
+0000365060 00000 n
+0000364907 00000 n
+0000364940 00000 n
+0000364787 00000 n
+0000364820 00000 n
+0000364667 00000 n
+0000364700 00000 n
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000000000 00000 f
+0000165196 00000 n
+0000164010 00000 n
+0000164099 00000 n
+0000164173 00000 n
+0000164248 00000 n
+0000164323 00000 n
+0000164400 00000 n
+0000372953 00000 n
+0000046731 00000 n
+0000167129 00000 n
+0000066385 00000 n
+0000066270 00000 n
0000049827 00000 n
-0000058541 00000 n
-0000159418 00000 n
-0000160143 00000 n
-0000173817 00000 n
-0000060510 00000 n
-0000060547 00000 n
-0000160206 00000 n
-0000159481 00000 n
-0000063196 00000 n
-0000000997 00001 f
-0000147299 00000 n
-0000148055 00000 n
-0000159355 00000 n
-0000148118 00000 n
-0000147362 00000 n
-0000063689 00000 n
-0000049212 00000 n
-0000049677 00000 n
-0000049709 00000 n
-0000001004 00001 f
-0000132732 00000 n
-0000133484 00000 n
-0000147235 00000 n
-0000133547 00000 n
-0000132795 00000 n
-0000064172 00000 n
-0000001014 00001 f
-0000120560 00000 n
-0000121317 00000 n
-0000132668 00000 n
-0000121381 00000 n
-0000120624 00000 n
-0000064671 00000 n
-0000049284 00000 n
-0000049557 00000 n
-0000049590 00000 n
-0000001021 00001 f
-0000106070 00000 n
-0000106822 00000 n
-0000120496 00000 n
-0000106886 00000 n
-0000106134 00000 n
-0000065160 00000 n
-0000001022 00001 f
-0000001032 00001 f
-0000093888 00000 n
-0000094644 00000 n
-0000106006 00000 n
-0000094708 00000 n
-0000093952 00000 n
-0000065664 00000 n
-0000049361 00000 n
-0000049437 00000 n
-0000049470 00000 n
-0000001039 00001 f
-0000079247 00000 n
-0000080008 00000 n
-0000093824 00000 n
-0000080072 00000 n
-0000079311 00000 n
-0000066147 00000 n
-0000000000 00001 f
-0000067133 00000 n
-0000067894 00000 n
-0000079183 00000 n
-0000067958 00000 n
-0000067197 00000 n
-0000066651 00000 n
-0000058655 00000 n
-0000058947 00000 n
-0000056363 00000 n
-0000362622 00000 n
-0000059211 00000 n
-0000173880 00000 n
-0000173932 00000 n
-0000058383 00000 n
-0000000982 00000 n
-trailer <</Size 1055/Root 1 0 R/Info 1049 0 R/ID[<DFAD564605F549E3ABF1FC747EBA5A34><45AB28F93CAE4209BAB0B0278EBC9323>]>> startxref 362760 %%EOF \ No newline at end of file
+0000050354 00000 n
+0000050894 00000 n
+0000051425 00000 n
+0000051967 00000 n
+0000052501 00000 n
+0000053037 00000 n
+0000053571 00000 n
+0000048764 00000 n
+0000049260 00000 n
+0000049312 00000 n
+0000149504 00000 n
+0000149568 00000 n
+0000137318 00000 n
+0000137382 00000 n
+0000122718 00000 n
+0000122782 00000 n
+0000110491 00000 n
+0000110555 00000 n
+0000095974 00000 n
+0000096038 00000 n
+0000083742 00000 n
+0000083806 00000 n
+0000069074 00000 n
+0000069138 00000 n
+0000054106 00000 n
+0000054170 00000 n
+0000054920 00000 n
+0000054984 00000 n
+0000066206 00000 n
+0000066424 00000 n
+0000069865 00000 n
+0000069929 00000 n
+0000083678 00000 n
+0000084551 00000 n
+0000084615 00000 n
+0000095910 00000 n
+0000096756 00000 n
+0000096820 00000 n
+0000110427 00000 n
+0000111301 00000 n
+0000111365 00000 n
+0000122654 00000 n
+0000123502 00000 n
+0000123566 00000 n
+0000137254 00000 n
+0000138131 00000 n
+0000138195 00000 n
+0000149440 00000 n
+0000150263 00000 n
+0000150327 00000 n
+0000163946 00000 n
+0000165076 00000 n
+0000165109 00000 n
+0000164956 00000 n
+0000164989 00000 n
+0000164836 00000 n
+0000164869 00000 n
+0000164716 00000 n
+0000164749 00000 n
+0000164596 00000 n
+0000164629 00000 n
+0000164476 00000 n
+0000164509 00000 n
+0000165488 00000 n
+0000165798 00000 n
+0000167207 00000 n
+0000167437 00000 n
+0000168418 00000 n
+0000175955 00000 n
+0000241545 00000 n
+0000307135 00000 n
+0000373027 00000 n
+trailer <</Size 1392/Root 1 0 R/Info 1391 0 R/ID[<DFAD564605F549E3ABF1FC747EBA5A34><483E7E53040A4057B79E46A3828ABB5E>]>> startxref 373165 %%EOF \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/doc/model/Entity.scala b/src/compiler/scala/tools/nsc/doc/model/Entity.scala
index 37485bccab..4fb0341684 100644
--- a/src/compiler/scala/tools/nsc/doc/model/Entity.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/Entity.scala
@@ -50,6 +50,15 @@ trait Entity {
}
+object Entity {
+ private def isDeprecated(x: Entity) = x match {
+ case x: MemberEntity => x.deprecation.isDefined
+ case _ => false
+ }
+ /** Ordering deprecated things last. */
+ implicit lazy val EntityOrdering: Ordering[Entity] =
+ Ordering[(Boolean, String)] on (x => (isDeprecated(x), x.name))
+}
/** A template, which is either a class, trait, object or package. Depending on whether documentation is available
* or not, the template will be modeled as a [scala.tools.nsc.doc.model.NoDocTemplate] or a
@@ -156,7 +165,11 @@ trait MemberEntity extends Entity {
def isAbstract: Boolean
}
-
+object MemberEntity {
+ // Oh contravariance, contravariance, wherefore art thou contravariance?
+ // Note: the above works for both the commonly misunderstood meaning of the line and the real one.
+ implicit lazy val MemberEntityOrdering: Ordering[MemberEntity] = Entity.EntityOrdering on (x => x)
+}
/** An entity that is parameterized by types */
trait HigherKinded extends Entity {
diff --git a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
index a7f22e94ff..405da29a57 100644
--- a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
@@ -17,7 +17,7 @@ import model.{ RootPackage => RootPackageEntity }
class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory: ModelFactory with CommentFactory with TreeFactory =>
import global._
- import definitions.{ ObjectClass, ScalaObjectClass, RootPackage, EmptyPackage, NothingClass, AnyClass, AnyRefClass }
+ import definitions.{ ObjectClass, ScalaObjectClass, RootPackage, EmptyPackage, NothingClass, AnyClass, AnyValClass, AnyRefClass }
private var droppedPackages = 0
def templatesCount = templatesCache.size - droppedPackages
@@ -25,6 +25,8 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory
private var modelFinished = false
private var universe: Universe = null
+ private lazy val noSubclassCache = Set(AnyClass, AnyRefClass, ObjectClass, ScalaObjectClass)
+
/** */
def makeModel: Option[Universe] = {
val universe = new Universe { thisUniverse =>
@@ -160,10 +162,18 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory
* * All non-package members (including other templates, as full templates). */
abstract class DocTemplateImpl(sym: Symbol, inTpl: => DocTemplateImpl) extends MemberImpl(sym, inTpl) with TemplateImpl with HigherKindedImpl with DocTemplateEntity {
//if (inTpl != null) println("mbr " + sym + " in " + (inTpl.toRoot map (_.sym)).mkString(" > "))
+ if (settings.verbose.value)
+ inform("Creating doc template for " + sym)
+
templatesCache += (sym -> this)
lazy val definitionName = optimize(inDefinitionTemplates.head.qualifiedName + "." + name)
override def toRoot: List[DocTemplateImpl] = this :: inTpl.toRoot
- def inSource = if (sym.sourceFile != null) Some((sym.sourceFile, sym.pos.line)) else None
+ def inSource =
+ if (sym.sourceFile != null && ! sym.isSynthetic)
+ Some((sym.sourceFile, sym.pos.line))
+ else
+ None
+
def sourceUrl = {
def fixPath(s: String) = s.replaceAll("\\" + java.io.File.separator, "/")
val assumedSourceRoot: String = {
@@ -187,33 +197,40 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory
else None
}
def parentType = {
- if (sym.isPackage) None else {
+ if (sym.isPackage || sym == AnyClass) None else {
val tps =
(sym.tpe.parents filter (_ != ScalaObjectClass.tpe)) map { _.asSeenFrom(sym.thisType, sym) }
Some(makeType(RefinedType(tps, EmptyScope), inTpl))
}
}
val linearization: List[(TemplateEntity, TypeEntity)] = {
- val acs = sym.ancestors filter { _ != ScalaObjectClass }
- val tps = acs map { cls => makeType(sym.info.baseType(cls), this) }
- val tpls = acs map { makeTemplate(_) }
- tpls map {
- case dtpl: DocTemplateImpl => dtpl.registerSubClass(this)
- case _ =>
+ val acs = sym.ancestors filterNot (_ == ScalaObjectClass)
+ val tps = acs map (cls => makeType(sym.info.baseType(cls), this))
+ val tpls = acs map makeTemplate
+
+ tpls foreach {
+ case dtpl: DocTemplateImpl => dtpl.registerSubClass(this)
+ case _ =>
}
tpls zip tps
}
def linearizationTemplates = linearization map { _._1 }
def linearizationTypes = linearization map { _._2 }
- private lazy val subClassesCache = mutable.Buffer.empty[DocTemplateEntity]
+
+ private lazy val subClassesCache = (
+ if (noSubclassCache(sym)) null
+ else mutable.ListBuffer[DocTemplateEntity]()
+ )
def registerSubClass(sc: DocTemplateEntity): Unit = {
- assert(subClassesCache != null)
- subClassesCache += sc
+ if (subClassesCache != null)
+ subClassesCache += sc
}
- def subClasses = subClassesCache.toList
+ def subClasses = if (subClassesCache == null) Nil else subClassesCache.toList
+
protected lazy val memberSyms =
// Only this class's constructors are part of its members, inherited constructors are not.
sym.info.members.filter(s => localShouldDocument(s) && (!s.isConstructor || s.owner == sym))
+
val members = memberSyms flatMap (makeMember(_, this))
val templates = members collect { case c: DocTemplateEntity => c }
val methods = members collect { case d: Def => d }
@@ -591,8 +608,14 @@ class ModelFactory(val global: Global, val settings: doc.Settings) { thisFactory
/* Refined types */
case RefinedType(parents, defs) =>
appendTypes0((if (parents.length > 1) parents filterNot (_ == ObjectClass.tpe) else parents), " with ")
- if (!defs.isEmpty) {
- nameBuffer append " {...}" // TODO: actually print the refinement
+ // XXX Still todo: properly printing refinements.
+ // Since I didn't know how to go about displaying a multi-line type, I went with
+ // printing single method refinements (which should be the most common) and printing
+ // the number of members if there are more.
+ defs.toList match {
+ case Nil => ()
+ case x :: Nil => nameBuffer append (" { " + x.defString + " }")
+ case xs => nameBuffer append (" { ... /* %d definitions in type refinement */ }" format xs.size)
}
/* Eval-by-name types */
case NullaryMethodType(result) =>
diff --git a/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala b/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala
index 7485533641..e332b28c67 100644
--- a/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala
+++ b/src/compiler/scala/tools/nsc/doc/model/comment/CommentFactory.scala
@@ -21,7 +21,7 @@ import util.{NoPosition, Position}
trait CommentFactory { thisFactory: ModelFactory with CommentFactory =>
val global: Global
- import global.reporter
+ import global.{ reporter, definitions }
protected val commentCache = mutable.HashMap.empty[(global.Symbol, TemplateImpl), Comment]
@@ -172,7 +172,7 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory =>
/** Safe HTML tags that can be kept. */
protected val SafeTags =
- new Regex("""((&\w+;)|(&#\d+;)|(<code( [^>]*)?>.*?</code>)|(</?(abbr|acronym|address|area|a|bdo|big|blockquote|br|button|b|caption|cite|col|colgroup|dd|del|dfn|em|fieldset|form|hr|img|input|ins|i|kbd|label|legend|link|map|object|optgroup|option|param|pre|q|samp|select|small|span|strong|sub|sup|table|tbody|td|textarea|tfoot|th|thead|tr|tt|var)( [^>]*)?/?>))""")
+ new Regex("""((&\w+;)|(&#\d+;)|(</?(abbr|acronym|address|area|a|bdo|big|blockquote|br|button|b|caption|cite|code|col|colgroup|dd|del|dfn|em|fieldset|form|hr|img|input|ins|i|kbd|label|legend|link|map|object|optgroup|option|param|pre|q|samp|select|small|span|strong|sub|sup|table|tbody|td|textarea|tfoot|th|thead|tr|tt|var)( [^>]*)?/?>))""")
protected val safeTagMarker = '\u000E'
@@ -515,10 +515,50 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory =>
/* INLINES */
+ val OPEN_TAG = "^<([A-Za-z]+)( [^>]*)?(/?)>$".r
+ val CLOSE_TAG = "^</([A-Za-z]+)>$".r
+ private def readHTMLFrom(begin: HtmlTag): String = {
+ val list = mutable.ListBuffer.empty[String]
+ val stack = mutable.ListBuffer.empty[String]
+
+ begin.close match {
+ case Some(HtmlTag(CLOSE_TAG(s))) =>
+ stack += s
+ case _ =>
+ return ""
+ }
+
+ do {
+ readUntil { char == safeTagMarker || char == endOfText }
+ val str = getRead()
+ nextChar()
+
+ list += str
+
+ str match {
+ case OPEN_TAG(s, _, standalone) => {
+ if (standalone != "/") {
+ stack += s
+ }
+ }
+ case CLOSE_TAG(s) => {
+ if (s == stack.last) {
+ stack.remove(stack.length-1)
+ }
+ }
+ case _ => ;
+ }
+ } while (stack.length > 0 && char != endOfText);
+
+ return list.mkString("")
+ }
def inline(isInlineEnd: => Boolean): Inline = {
def inline0(): Inline = {
- if (char == safeTagMarker) htmlTag()
+ if (char == safeTagMarker) {
+ val tag = htmlTag()
+ HtmlTag(tag.data + readHTMLFrom(tag))
+ }
else if (check("'''")) bold()
else if (check("''")) italic()
else if (check("`")) monospace()
@@ -563,7 +603,7 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory =>
}
- def htmlTag(): Inline = {
+ def htmlTag(): HtmlTag = {
jump(safeTagMarker)
readUntil(safeTagMarker)
if (char != endOfText) jump(safeTagMarker)
@@ -634,7 +674,7 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory =>
}
def link(): Inline = {
- val SchemeUri = new Regex("""([^:]+:.*)""")
+ val SchemeUri = """([^:]+:.*)""".r
jump("[[")
readUntil { check("]]") || check(" ") }
val target = getRead()
@@ -645,18 +685,20 @@ trait CommentFactory { thisFactory: ModelFactory with CommentFactory =>
})
else None
jump("]]")
+
(target, title) match {
- case (SchemeUri(uri), Some(title)) =>
- Link(uri, title)
- case (SchemeUri(uri), None) =>
- Link(uri, Text(uri))
- case (qualName, None) =>
- entityLink(qualName)
- case (qualName, Some(text)) =>
- reportError(pos, "entity link to " + qualName + " cannot have a custom title'" + text + "'")
+ case (SchemeUri(uri), optTitle) =>
+ Link(uri, optTitle getOrElse Text(uri))
+ case (qualName, optTitle) =>
+ optTitle foreach (text => reportError(pos, "entity link to " + qualName + " cannot have a custom title'" + text + "'"))
+ // XXX rather than warning here we should allow unqualified names
+ // to refer to members of the same package. The "package exists"
+ // exclusion is because [[scala]] is used in some scaladoc.
+ if (!qualName.contains(".") && !definitions.packageExists(qualName))
+ reportError(pos, "entity link to " + qualName + " should be a fully qualified name")
+
entityLink(qualName)
}
-
}
/* UTILITY */
diff --git a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
index 76df0a6bd6..8ec93d70e3 100644
--- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
+++ b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
@@ -103,11 +103,8 @@ trait CompilerControl { self: Global =>
throw new FatalError("no context found for "+pos)
}
- private def postWorkItem(item: WorkItem) {
- scheduler.postWorkItem(item)
- }
-
- private def onCompilerThread = Thread.currentThread == compileRunner
+ private def postWorkItem(item: WorkItem) =
+ if (item.onCompilerThread) item() else scheduler.postWorkItem(item)
/** Makes sure a set of compilation units is loaded and parsed.
* Returns () to syncvar `response` on completions.
@@ -132,13 +129,8 @@ trait CompilerControl { self: Global =>
/** Sets sync var `response` to the fully attributed & typechecked tree contained in `source`.
* @pre `source` needs to be loaded.
*/
- def askType(source: SourceFile, forceReload: Boolean, response: Response[Tree]) = {
- if (debugIDE) {
- println("ask type called")
- new Exception().printStackTrace()
- }
+ def askType(source: SourceFile, forceReload: Boolean, response: Response[Tree]) =
postWorkItem(new AskTypeItem(source, forceReload, response))
- }
/** Sets sync var `response` to the position of the definition of the given link in
* the given sourcefile.
@@ -230,7 +222,9 @@ trait CompilerControl { self: Global =>
}
/** Asks for a computation to be done quickly on the presentation compiler thread */
- def ask[A](op: () => A): A = scheduler doQuickly op
+ def ask[A](op: () => A): A = if (self.onCompilerThread) op() else scheduler doQuickly op
+
+ def onCompilerThread = Thread.currentThread == compileRunner
/** Info given for every member found by completion
*/
@@ -258,7 +252,9 @@ trait CompilerControl { self: Global =>
// items that get sent to scheduler
- abstract class WorkItem extends (() => Unit)
+ abstract class WorkItem extends (() => Unit) {
+ def onCompilerThread = self.onCompilerThread
+ }
case class ReloadItem(sources: List[SourceFile], response: Response[Unit]) extends WorkItem {
def apply() = reload(sources, response)
@@ -296,12 +292,12 @@ trait CompilerControl { self: Global =>
}
class AskLoadedTypedItem(val source: SourceFile, response: Response[Tree]) extends WorkItem {
- def apply() = self.waitLoadedTyped(source, response)
+ def apply() = self.waitLoadedTyped(source, response, this.onCompilerThread)
override def toString = "wait loaded & typed "+source
}
class AskParsedEnteredItem(val source: SourceFile, val keepLoaded: Boolean, response: Response[Tree]) extends WorkItem {
- def apply() = self.getParsedEntered(source, keepLoaded, response)
+ def apply() = self.getParsedEntered(source, keepLoaded, response, this.onCompilerThread)
override def toString = "getParsedEntered "+source+", keepLoaded = "+keepLoaded
}
}
@@ -321,4 +317,3 @@ object ShutdownReq extends ControlThrowable
class NoSuchUnitError(file: AbstractFile) extends Exception("no unit found for file "+file)
class MissingResponse extends Exception("response missing")
-
diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala
index ddc870a045..2563feeb72 100644
--- a/src/compiler/scala/tools/nsc/interactive/Global.scala
+++ b/src/compiler/scala/tools/nsc/interactive/Global.scala
@@ -277,7 +277,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
* @param pos The position of the tree if polling while typechecking, NoPosition otherwise
*
*/
- protected[interactive] def pollForWork(pos: Position) {
+ private[interactive] def pollForWork(pos: Position) {
if (!interruptsEnabled) return
if (pos == NoPosition || nodesSeen % yieldPeriod == 0)
Thread.`yield`()
@@ -386,7 +386,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
private var threadId = 0
/** The current presentation compiler runner */
- @volatile protected[interactive] var compileRunner = newRunnerThread()
+ @volatile private[interactive] var compileRunner = newRunnerThread()
/** Create a new presentation compiler runner.
*/
@@ -553,7 +553,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
}
}
- protected def reloadSource(source: SourceFile) {
+ private def reloadSource(source: SourceFile) {
val unit = new RichCompilationUnit(source)
unitOfFile(source.file) = unit
reset(unit)
@@ -561,7 +561,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
}
/** Make sure a set of compilation units is loaded and parsed */
- protected def reloadSources(sources: List[SourceFile]) {
+ private def reloadSources(sources: List[SourceFile]) {
newTyperRun()
minRunId = currentRunId
sources foreach reloadSource
@@ -569,7 +569,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
}
/** Make sure a set of compilation units is loaded and parsed */
- protected def reload(sources: List[SourceFile], response: Response[Unit]) {
+ private[interactive] def reload(sources: List[SourceFile], response: Response[Unit]) {
informIDE("reload: " + sources)
lastWasReload = true
respond(response)(reloadSources(sources))
@@ -577,7 +577,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
}
/** A fully attributed tree located at position `pos` */
- protected def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match {
+ private def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match {
case None =>
reloadSources(List(pos.source))
val result = typedTreeAt(pos)
@@ -612,31 +612,28 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
}
/** A fully attributed tree corresponding to the entire compilation unit */
- protected def typedTree(source: SourceFile, forceReload: Boolean): Tree = {
+ private def typedTree(source: SourceFile, forceReload: Boolean): Tree = {
informIDE("typedTree " + source + " forceReload: " + forceReload)
val unit = getOrCreateUnitOf(source)
if (forceReload) reset(unit)
parseAndEnter(unit)
- if (unit.status <= PartiallyChecked) {
- //newTyperRun() // not deeded for idempotent type checker phase
- typeCheck(unit)
- }
+ if (unit.status <= PartiallyChecked) typeCheck(unit)
unit.body
}
/** Set sync var `response` to a fully attributed tree located at position `pos` */
- protected def getTypedTreeAt(pos: Position, response: Response[Tree]) {
+ private[interactive] def getTypedTreeAt(pos: Position, response: Response[Tree]) {
respond(response)(typedTreeAt(pos))
}
/** Set sync var `response` to a fully attributed tree corresponding to the
* entire compilation unit */
- protected def getTypedTree(source: SourceFile, forceReload: Boolean, response: Response[Tree]) {
+ private[interactive] def getTypedTree(source: SourceFile, forceReload: Boolean, response: Response[Tree]) {
respond(response)(typedTree(source, forceReload))
}
/** Implements CompilerControl.askLinkPos */
- protected def getLinkPos(sym: Symbol, source: SourceFile, response: Response[Position]) {
+ private[interactive] def getLinkPos(sym: Symbol, source: SourceFile, response: Response[Position]) {
informIDE("getLinkPos "+sym+" "+source)
respond(response) {
val preExisting = unitOfFile isDefinedAt source.file
@@ -699,7 +696,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
import analyzer.{SearchResult, ImplicitSearch}
- protected def getScopeCompletion(pos: Position, response: Response[List[Member]]) {
+ private[interactive] def getScopeCompletion(pos: Position, response: Response[List[Member]]) {
informIDE("getScopeCompletion" + pos)
respond(response) { scopeMembers(pos) }
}
@@ -740,7 +737,7 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
}
/** Return all members visible without prefix in context enclosing `pos`. */
- protected def scopeMembers(pos: Position): List[ScopeMember] = {
+ private def scopeMembers(pos: Position): List[ScopeMember] = {
typedTreeAt(pos) // to make sure context is entered
val context = doLocateContext(pos)
val locals = new Members[ScopeMember]
@@ -773,13 +770,13 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
result
}
- protected def getTypeCompletion(pos: Position, response: Response[List[Member]]) {
+ private[interactive] def getTypeCompletion(pos: Position, response: Response[List[Member]]) {
informIDE("getTypeCompletion " + pos)
respondGradually(response) { typeMembers(pos) }
//if (debugIDE) typeMembers(pos)
}
- protected def typeMembers(pos: Position): Stream[List[TypeMember]] = {
+ private def typeMembers(pos: Position): Stream[List[TypeMember]] = {
var tree = typedTreeAt(pos)
// if tree consists of just x. or x.fo where fo is not yet a full member name
@@ -848,40 +845,42 @@ class Global(settings: Settings, reporter: Reporter, projectName: String = "")
}
}
- /** Synchronous version of askStructure. */
- def getStructure(source: SourceFile, response: Response[Tree]) {
- getUnit(source) match {
- case Some(_) => waitLoadedTyped(source, response)
- case None => getParsedEntered(source, false, response)
- }
- }
-
/** Implements CompilerControl.askLoadedTyped */
- protected def waitLoadedTyped(source: SourceFile, response: Response[Tree]) {
+ private[interactive] def waitLoadedTyped(source: SourceFile, response: Response[Tree], onSameThread: Boolean = true) {
getUnit(source) match {
case Some(unit) =>
- if (unit.isUpToDate) { debugLog("already typed"); response set unit.body }
- else { debugLog("wait for later"); outOfDate = true; waitLoadedTypeResponses(source) += response }
+ if (unit.isUpToDate) {
+ debugLog("already typed");
+ response set unit.body
+ } else if (onSameThread) {
+ getTypedTree(source, forceReload = false, response)
+ } else {
+ debugLog("wait for later")
+ outOfDate = true
+ waitLoadedTypeResponses(source) += response
+ }
case None =>
debugLog("load unit and type")
try reloadSources(List(source))
- finally waitLoadedTyped(source, response)
+ finally waitLoadedTyped(source, response, onSameThread)
}
}
/** Implements CompilerControl.askParsedEntered */
- protected def getParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree]) {
+ private[interactive] def getParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree], onSameThread: Boolean = true) {
getUnit(source) match {
case Some(unit) =>
getParsedEnteredNow(source, response)
case None =>
- if (keepLoaded)
- try reloadSources(List(source))
- finally getParsedEnteredNow(source, response)
- else if (outOfDate)
- getParsedEnteredResponses(source) += response
- else
- getParsedEnteredNow(source, response)
+ try {
+ if (keepLoaded || outOfDate && onSameThread)
+ reloadSources(List(source))
+ } finally {
+ if (keepLoaded || !outOfDate || onSameThread)
+ getParsedEnteredNow(source, response)
+ else
+ getParsedEnteredResponses(source) += response
+ }
}
}
diff --git a/src/compiler/scala/tools/nsc/interactive/Picklers.scala b/src/compiler/scala/tools/nsc/interactive/Picklers.scala
index 250f648250..53ef20507f 100644
--- a/src/compiler/scala/tools/nsc/interactive/Picklers.scala
+++ b/src/compiler/scala/tools/nsc/interactive/Picklers.scala
@@ -160,7 +160,7 @@ trait Picklers { self: Global =>
implicit def askLoadedTypedItem: CondPickler[AskLoadedTypedItem] =
pkl[SourceFile]
- .wrapped { new AskLoadedTypedItem(_, new Response) } { _.source }
+ .wrapped { source => new AskLoadedTypedItem(source, new Response) } { _.source }
.asClass (classOf[AskLoadedTypedItem])
implicit def askParsedEnteredItem: CondPickler[AskParsedEnteredItem] =
diff --git a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala b/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala
index 39c27cfbb1..85dcff2086 100644
--- a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala
@@ -5,8 +5,9 @@
package scala.tools.nsc
package interpreter
-import scala.tools.nsc.io.AbstractFile
+import scala.tools.nsc.io.{ File, AbstractFile }
import util.ScalaClassLoader
+import java.net.URL
/**
* A class loader that loads files from a {@link scala.tools.nsc.io.AbstractFile}.
@@ -17,28 +18,42 @@ class AbstractFileClassLoader(root: AbstractFile, parent: ClassLoader)
extends ClassLoader(parent)
with ScalaClassLoader
{
- private def findBytes(name: String, onError: => Array[Byte]): Array[Byte] = {
+ protected def classNameToPath(name: String): String =
+ if (name endsWith ".class") name
+ else name.replace('.', '/') + ".class"
+
+ protected def findAbstractFile(name: String): AbstractFile = {
var file: AbstractFile = root
- val pathParts = name.split("[./]").toList
+ val pathParts = classNameToPath(name) split '/'
for (dirPart <- pathParts.init) {
file = file.lookupName(dirPart, true)
if (file == null)
- return onError
+ return null
}
- file.lookupName(pathParts.last+".class", false) match {
- case null => onError
- case file => file.toByteArray
+ file.lookupName(pathParts.last, false) match {
+ case null => null
+ case file => file
}
}
- override def findBytesForClassName(name: String): Array[Byte] =
- findBytes(name, super.findBytesForClassName(name))
-
+ override def getResourceAsStream(name: String) = findAbstractFile(name) match {
+ case null => super.getResourceAsStream(name)
+ case file => file.input
+ }
+ override def classBytes(name: String): Array[Byte] = findAbstractFile(name) match {
+ case null => super.classBytes(name)
+ case file => file.toByteArray
+ }
override def findClass(name: String): JClass = {
- val bytes = findBytes(name, throw new ClassNotFoundException(name))
- defineClass(name, bytes, 0, bytes.length)
+ val bytes = classBytes(name)
+ if (bytes.isEmpty) throw new ClassNotFoundException(name)
+ else defineClass(name, bytes, 0, bytes.length)
}
+ // Don't know how to construct an URL for something which exists only in memory
+ // override def getResource(name: String): URL = findAbstractFile(name) match {
+ // case null => super.getResource(name)
+ // case file => new URL(...)
+ // }
}
-
diff --git a/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala b/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala
index 2dadba3b4c..1b2f6443ae 100644
--- a/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala
@@ -6,9 +6,7 @@
package scala.tools.nsc
package interpreter
-import java.io.File
import java.lang.reflect
-import java.util.jar.{ JarEntry, JarFile }
import java.util.concurrent.ConcurrentHashMap
import util.ScalaClassLoader
import ScalaClassLoader.getSystemLoader
diff --git a/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala b/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala
index 94bcf3e4c8..e96918c90c 100644
--- a/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala
@@ -9,6 +9,6 @@ package interpreter
/** A command line for the interpreter.
*/
class CommandLine(arguments: List[String], error: String => Unit) extends CompilerCommand(arguments, error) {
- override val cmdName = "scala"
+ override def cmdName = "scala"
override lazy val fileEndings = List(".scalaint")
}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala b/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala
index a775fca92c..cfe932ad0b 100644
--- a/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala
@@ -55,8 +55,9 @@ trait ConsoleReaderHelper extends ConsoleReader {
var linesLeft = if (isPaginationEnabled()) height - 1 else Int.MaxValue
val columnSize = longest + marginSize
val padded = items map ("%-" + columnSize + "s" format _)
+ val groupSize = 1 max (width / columnSize) // make sure it doesn't divide to 0
- padded grouped (width / columnSize) foreach { xs =>
+ padded grouped groupSize foreach { xs =>
println(xs.mkString)
linesLeft -= 1
if (linesLeft <= 0) {
diff --git a/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala b/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala
index bfa6576b25..2c556656ca 100644
--- a/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/Dossiers.scala
@@ -33,7 +33,7 @@ trait Dossiers {
}
class TermDossier(val symbol: TermSymbol, val staticType: Type, val value: AnyRef) extends Dossier {
- def runtimeClass: Class[_] = value.getClass
+ def runtimeClass: JClass = value.getClass
def runtimeSymbol: Symbol = safeClass(runtimeClass.getName) getOrElse NoSymbol
def runtimeType: Type = runtimeSymbol.tpe
def runtimeTypeString = TypeStrings.fromClazz(runtimeClass)
diff --git a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala
index 584b8867b2..d6e447ca0a 100644
--- a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala
@@ -8,7 +8,6 @@ package interpreter
import Predef.{ println => _, _ }
import java.io.{ BufferedReader, FileReader, PrintWriter }
-
import scala.sys.process.Process
import session._
import scala.tools.nsc.interpreter.{ Results => IR }
@@ -44,11 +43,14 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
var settings: Settings = _
var intp: IMain = _
- lazy val power = new Power(this)
+ lazy val power = {
+ val g = intp.global
+ Power[g.type](this, g)
+ }
// TODO
// object opt extends AestheticSettings
-
+ //
@deprecated("Use `intp` instead.")
def interpreter = intp
@@ -62,7 +64,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
// Install a signal handler so we can be prodded.
private val signallable =
- if (isReplDebug) Signallable("Dump repl state.")(dumpCommand(""))
+ if (isReplDebug) Signallable("Dump repl state.")(dumpCommand())
else null
// classpath entries added via :cp
@@ -125,7 +127,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
|// Calling Thread.stop on runaway %s with offending code:
|// scala> %s""".stripMargin
- println(template.format(line.thread, line.code))
+ echo(template.format(line.thread, line.code))
// XXX no way to suppress the deprecation warning
line.thread.stop()
in.redrawLine()
@@ -146,12 +148,40 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
}
/** print a friendly help message */
- def printHelp() = {
- out println "All commands can be abbreviated - for example :he instead of :help.\n"
- val cmds = commands map (x => (x.usage, x.help))
- val width: Int = cmds map { case (x, _) => x.length } max
- val formatStr = "%-" + width + "s %s"
- cmds foreach { case (usage, help) => out println formatStr.format(usage, help) }
+ def helpCommand(line: String): Result = {
+ if (line == "") helpSummary()
+ else uniqueCommand(line) match {
+ case Some(lc) => echo("\n" + lc.longHelp)
+ case _ => ambiguousError(line)
+ }
+ }
+ private def helpSummary() = {
+ val usageWidth = commands map (_.usageMsg.length) max
+ val formatStr = "%-" + usageWidth + "s %s %s"
+
+ echo("All commands can be abbreviated, e.g. :he instead of :help.")
+ echo("Those marked with a * have more detailed help, e.g. :help imports.\n")
+
+ commands foreach { cmd =>
+ val star = if (cmd.hasLongHelp) "*" else " "
+ echo(formatStr.format(cmd.usageMsg, star, cmd.help))
+ }
+ }
+ private def ambiguousError(cmd: String): Result = {
+ matchingCommands(cmd) match {
+ case Nil => echo(cmd + ": no such command. Type :help for help.")
+ case xs => echo(cmd + " is ambiguous: did you mean " + xs.map(":" + _.name).mkString(" or ") + "?")
+ }
+ Result(true, None)
+ }
+ private def matchingCommands(cmd: String) = commands filter (_.name startsWith cmd)
+ private def uniqueCommand(cmd: String): Option[LoopCommand] = {
+ // this lets us add commands willy-nilly and only requires enough command to disambiguate
+ matchingCommands(cmd) match {
+ case List(x) => Some(x)
+ // exact match OK even if otherwise appears ambiguous
+ case xs => xs find (_.name == cmd)
+ }
}
/** Print a welcome message */
@@ -164,28 +194,37 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
stripMargin.format(versionString, javaVmName, javaVersion)
val addendum = if (isReplDebug) "\n" + new java.util.Date else ""
- plushln(welcomeMsg + addendum)
+ echo(welcomeMsg + addendum)
}
/** Show the history */
- def printHistory(xs: List[String]): Result = {
- if (history eq NoHistory)
- return "No history available."
+ lazy val historyCommand = new LoopCommand("history", "show the history (optional num is commands to show)") {
+ override def usage = "[num]"
+ def defaultLines = 20
- val defaultLines = 20
- val current = history.index
- val count = try xs.head.toInt catch { case _: Exception => defaultLines }
- val lines = history.asStrings takeRight count
- val offset = current - lines.size + 1
+ def apply(line: String): Result = {
+ if (history eq NoHistory)
+ return "No history available."
- for ((line, index) <- lines.zipWithIndex)
- println("%3d %s".format(index + offset, line))
+ val xs = words(line)
+ val current = history.index
+ val count = try xs.head.toInt catch { case _: Exception => defaultLines }
+ val lines = history.asStrings takeRight count
+ val offset = current - lines.size + 1
+
+ for ((line, index) <- lines.zipWithIndex)
+ echo("%3d %s".format(index + offset, line))
+ }
}
- /** Some print conveniences */
- def println(x: Any) = out println x
- def plush(x: Any) = { out print x ; out.flush() }
- def plushln(x: Any) = { out println x ; out.flush() }
+ private def echo(msg: String) = {
+ out println msg
+ out.flush()
+ }
+ private def echoNoNL(msg: String) = {
+ out print msg
+ out.flush()
+ }
/** Search the history */
def searchHistory(_cmdline: String) {
@@ -193,7 +232,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
val offset = history.index - history.size + 1
for ((line, index) <- history.asStrings.zipWithIndex ; if line.toLowerCase contains cmdline)
- println("%d %s".format(index + offset, line))
+ echo("%d %s".format(index + offset, line))
}
private var currentPrompt = Properties.shellPromptString
@@ -201,39 +240,57 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
/** Prompt to print when awaiting input */
def prompt = currentPrompt
+ import LoopCommand.{ cmd, nullary }
+
/** Standard commands **/
- val standardCommands: List[LoopCommand] = {
- List(
- LineArg("cp", "add an entry (jar or directory) to the classpath", addClasspath),
- NoArgs("help", "print this help message", printHelp),
- VarArgs("history", "show the history (optional arg: lines to show)", printHistory),
- LineArg("h?", "search the history", searchHistory),
- LineArg("implicits", "show the implicits in scope (-v to include Predef)", implicitsCommand),
- LineArg("javap", "disassemble a file or class name", javapCommand),
- LineArg("keybindings", "show how ctrl-[A-Z] and other keys are bound", keybindingsCommand),
- OneArg("load", "load and interpret a Scala file", load),
- NoArgs("paste", "enter paste mode: all input up to ctrl-D compiled together", pasteCommand),
- NoArgs("power", "enable power user mode", powerCmd),
- NoArgs("quit", "exit the interpreter", () => Result(false, None)),
- NoArgs("replay", "reset execution and replay all previous commands", replay),
- LineArg("sh", "fork a shell and run a command", shCommand),
- NoArgs("silent", "disable/enable automatic printing of results", verbosity),
- LineArg("type", "display the type of an expression without evaluating it", typeCommand)
- )
- }
+ lazy val standardCommands = List(
+ cmd("cp", "<path>", "add a jar or directory to the classpath", addClasspath),
+ cmd("help", "[command]", "print this summary or command-specific help", helpCommand),
+ historyCommand,
+ cmd("h?", "<string>", "search the history", searchHistory),
+ cmd("imports", "[name name ...]", "show import history, identifying sources of names", importsCommand),
+ cmd("implicits", "[-v]", "show the implicits in scope", implicitsCommand),
+ cmd("javap", "<path|class>", "disassemble a file or class name", javapCommand),
+ nullary("keybindings", "show how ctrl-[A-Z] and other keys are bound", keybindingsCommand),
+ cmd("load", "<path>", "load and interpret a Scala file", loadCommand),
+ nullary("paste", "enter paste mode: all input up to ctrl-D compiled together", pasteCommand),
+ nullary("power", "enable power user mode", powerCmd),
+ nullary("quit", "exit the interpreter", () => Result(false, None)),
+ nullary("replay", "reset execution and replay all previous commands", replay),
+ shCommand,
+ nullary("silent", "disable/enable automatic printing of results", verbosity),
+ cmd("type", "<expr>", "display the type of an expression without evaluating it", typeCommand)
+ )
/** Power user commands */
- val powerCommands: List[LoopCommand] = {
- List(
- LineArg("dump", "displays a view of the interpreter's internal state", dumpCommand),
- LineArg("phase", "set the implicit phase for power commands", phaseCommand),
- LineArg("wrap", "code to wrap around all executions", wrapCommand)
- )
- }
+ lazy val powerCommands: List[LoopCommand] = List(
+ nullary("dump", "displays a view of the interpreter's internal state", dumpCommand),
+ cmd("phase", "<phase>", "set the implicit phase for power commands", phaseCommand),
+ cmd("wrap", "<method>", "name of method to wrap around each repl line", wrapCommand) withLongHelp ("""
+ |:wrap
+ |:wrap <method>
+ |
+ |Installs a wrapper around each line entered into the repl.
+ |Currently it must be the simple name of an existing method
+ |with the specific signature shown in the following example.
+ |
+ |def timed[T](body: => T): T = {
+ | val start = System.nanoTime
+ | try body
+ | finally println((System.nanoTime - start) + " nanos elapsed.")
+ |}
+ |:wrap timed
+ |
+ |If given no argument, :wrap removes any wrapper present.
+ |Note that wrappers do not compose (a new one replaces the old
+ |one) and also that the :phase command uses the same machinery,
+ |so setting :wrap will clear any :phase setting.
+ """.stripMargin.trim)
+ )
- private def dumpCommand(line: String): Result = {
- println(power)
- history.asStrings takeRight 30 foreach println
+ private def dumpCommand(): Result = {
+ echo("" + power)
+ history.asStrings takeRight 30 foreach echo
in.redrawLine()
}
@@ -245,6 +302,31 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
"scala.runtime." -> "runtime."
)
+ private def importsCommand(line: String): Result = {
+ val tokens = words(line)
+ val handlers = intp.languageWildcardHandlers ++ intp.importHandlers
+ val isVerbose = tokens contains "-v"
+
+ handlers.filterNot(_.importedSymbols.isEmpty).zipWithIndex foreach {
+ case (handler, idx) =>
+ val (types, terms) = handler.importedSymbols partition (_.name.isTypeName)
+ val imps = handler.implicitSymbols
+ val found = tokens filter (handler importsSymbolNamed _)
+ val typeMsg = if (types.isEmpty) "" else types.size + " types"
+ val termMsg = if (terms.isEmpty) "" else terms.size + " terms"
+ val implicitMsg = if (imps.isEmpty) "" else imps.size + " are implicit"
+ val foundMsg = if (found.isEmpty) "" else found.mkString(" // imports: ", ", ", "")
+ val statsMsg = List(typeMsg, termMsg, implicitMsg) filterNot (_ == "") mkString ("(", ", ", ")")
+
+ intp.reporter.printMessage("%2d) %-30s %s%s".format(
+ idx + 1,
+ handler.importString,
+ statsMsg,
+ foundMsg
+ ))
+ }
+ }
+
private def implicitsCommand(line: String): Result = {
val intp = ILoop.this.intp
import intp._
@@ -303,19 +385,22 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
}
}
- private object javap extends Javap(intp.classLoader, new IMain.ReplStrippingWriter(intp)) {
+ protected def newJavap() = new Javap(intp.classLoader, new IMain.ReplStrippingWriter(intp)) {
override def tryClass(path: String): Array[Byte] = {
// Look for Foo first, then Foo$, but if Foo$ is given explicitly,
// we have to drop the $ to find object Foo, then tack it back onto
// the end of the flattened name.
- def className = intp pathToFlatName path
- def moduleName = (intp pathToFlatName path.stripSuffix("$")) + "$"
+ def className = intp flatName path
+ def moduleName = (intp flatName path.stripSuffix("$")) + "$"
val bytes = super.tryClass(className)
if (bytes.nonEmpty) bytes
else super.tryClass(moduleName)
}
}
+ private lazy val javap =
+ try newJavap()
+ catch { case _: Exception => null }
private def typeCommand(line: String): Result = {
intp.typeOfExpression(line) match {
@@ -325,6 +410,8 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
}
private def javapCommand(line: String): Result = {
+ if (javap == null)
+ return ":javap unavailable on this platform."
if (line == "")
return ":javap [-lcsvp] [path1 path2 ...]"
@@ -333,20 +420,39 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
else res.show()
}
}
- private def keybindingsCommand(line: String): Result = {
+ private def keybindingsCommand(): Result = {
if (in.keyBindings.isEmpty) "Key bindings unavailable."
else {
- println("Reading jline properties for default key bindings.")
- println("Accuracy not guaranteed: treat this as a guideline only.\n")
- in.keyBindings foreach println
+ echo("Reading jline properties for default key bindings.")
+ echo("Accuracy not guaranteed: treat this as a guideline only.\n")
+ in.keyBindings foreach (x => echo ("" + x))
}
}
private def wrapCommand(line: String): Result = {
- intp setExecutionWrapper line
- if (line == "") "Cleared wrapper."
- else "Set wrapper to '" + line + "'"
+ def failMsg = "Argument to :wrap must be the name of a method with signature [T](=> T): T"
+ val intp = ILoop.this.intp
+ val g: intp.global.type = intp.global
+ import g._
+
+ words(line) match {
+ case Nil =>
+ intp setExecutionWrapper ""
+ "Cleared wrapper."
+ case wrapper :: Nil =>
+ intp.typeOfExpression(wrapper) match {
+ case Some(PolyType(List(targ), MethodType(List(arg), restpe))) =>
+ intp setExecutionWrapper intp.pathToTerm(wrapper)
+ "Set wrapper to '" + wrapper + "'"
+ case Some(x) =>
+ failMsg + "\nFound: " + x
+ case _ =>
+ failMsg + "\nFound: <unknown>"
+ }
+ case _ => failMsg
+ }
}
- private def pathToPhased = intp.pathToTerm("power") + ".phased"
+
+ private def pathToPhaseWrapper = intp.pathToTerm("$r") + ".phased.atCurrent"
private def phaseCommand(name: String): Result = {
// This line crashes us in TreeGen:
//
@@ -377,7 +483,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
if (what.isEmpty || !phased.set(what))
"'" + name + "' does not appear to represent a valid phase."
else {
- intp.setExecutionWrapper(pathToPhased)
+ intp.setExecutionWrapper(pathToPhaseWrapper)
val activeMessage =
if (what.toString.length == name.length) "" + what
else "%s (%s)".format(what, name)
@@ -402,28 +508,24 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
case ex: Throwable =>
if (settings.YrichExes.value) {
val sources = implicitly[Sources]
- out.println("\n" + ex.getMessage)
- out.println(
+ echo("\n" + ex.getMessage)
+ echo(
if (isReplDebug) "[searching " + sources.path + " for exception contexts...]"
else "[searching for exception contexts...]"
)
- out.println(Exceptional(ex).force().context())
+ echo(Exceptional(ex).force().context())
}
else {
- out.println(util.stackTraceString(ex))
+ echo(util.stackTraceString(ex))
}
ex match {
case _: NoSuchMethodError | _: NoClassDefFoundError =>
- out.println("Unrecoverable error.")
+ echo("Unrecoverable error.")
throw ex
case _ =>
- out.print(replayQuestionMessage)
- out.flush()
- if (in.readAssumingNo("")) {
- out.println("\nAttempting session recovery with replay.")
- replay()
- }
- else out.println("\nAbandoning crashed session.")
+ def fn(): Boolean = in.readYesOrNo(replayQuestionMessage, { echo("\nYou must enter y or n.") ; fn() })
+ if (fn()) replay()
+ else echo("\nAbandoning crashed session.")
}
}
@@ -458,7 +560,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
try file applyReader { reader =>
in = SimpleReader(reader, out, false)
- plushln("Loading " + file + "...")
+ echo("Loading " + file + "...")
loop()
}
finally {
@@ -472,33 +574,32 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
closeInterpreter()
createInterpreter()
for (cmd <- replayCommands) {
- plushln("Replaying: " + cmd) // flush because maybe cmd will have its own output
+ echo("Replaying: " + cmd) // flush because maybe cmd will have its own output
command(cmd)
- out.println
+ echo("")
}
}
/** fork a shell and run a command */
- def shCommand(cmd: String): Result = {
- if (cmd == "")
- return "Usage: sh <command line>"
-
- intp quietRun "import _root_.scala.sys.process._"
- val pb = Process(cmd)
- intp.bind("builder", pb)
- val stdout = Process(cmd).lines
- intp.bind("stdout", stdout)
- ()
+ lazy val shCommand = new LoopCommand("sh", "run a shell command (result is implicitly => List[String])") {
+ override def usage = "<command line>"
+ def apply(line: String): Result = line match {
+ case "" => showUsage()
+ case _ =>
+ val toRun = classOf[ProcessResult].getName + "(" + string2codeQuoted(line) + ")"
+ intp interpret toRun
+ ()
+ }
}
def withFile(filename: String)(action: File => Unit) {
val f = File(filename)
if (f.exists) action(f)
- else out.println("That file does not exist")
+ else echo("That file does not exist")
}
- def load(arg: String) = {
+ def loadCommand(arg: String) = {
var shouldReplay: Option[String] = None
withFile(arg)(f => {
interpretAllFrom(f)
@@ -512,61 +613,41 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
if (f.exists) {
addedClasspath = ClassPath.join(addedClasspath, f.path)
val totalClasspath = ClassPath.join(settings.classpath.value, addedClasspath)
- println("Added '%s'. Your new classpath is:\n\"%s\"".format(f.path, totalClasspath))
+ echo("Added '%s'. Your new classpath is:\n\"%s\"".format(f.path, totalClasspath))
replay()
}
- else out.println("The path '" + f + "' doesn't seem to exist.")
+ else echo("The path '" + f + "' doesn't seem to exist.")
}
def powerCmd(): Result = {
- if (isReplPower) return "Already in power mode."
+ if (isReplPower) "Already in power mode."
else enablePowerMode()
}
def enablePowerMode() = {
- isReplPower = true
+ replProps.power setValue true
power.unleash()
- out.println(power.banner)
+ echo(power.banner)
}
def verbosity() = {
val old = intp.printResults
intp.printResults = !old
- out.println("Switched " + (if (old) "off" else "on") + " result printing.")
+ echo("Switched " + (if (old) "off" else "on") + " result printing.")
}
/** Run one command submitted by the user. Two values are returned:
* (1) whether to keep running, (2) the line to record for replay,
* if any. */
def command(line: String): Result = {
- def withError(msg: String) = {
- out println msg
- Result(true, None)
- }
- def ambiguous(cmds: List[LoopCommand]) = "Ambiguous: did you mean " + cmds.map(":" + _.name).mkString(" or ") + "?"
-
- // not a command
- if (!line.startsWith(":")) {
- // Notice failure to create compiler
- if (intp.global == null) return Result(false, None)
- else return Result(true, interpretStartingWith(line))
- }
-
- val tokens = (line drop 1 split """\s+""").toList
- if (tokens.isEmpty)
- return withError(ambiguous(commands))
-
- val (cmd :: args) = tokens
-
- // this lets us add commands willy-nilly and only requires enough command to disambiguate
- commands.filter(_.name startsWith cmd) match {
- case List(x) => x(args)
- case Nil => withError("Unknown command. Type :help for help.")
- case xs =>
- xs find (_.name == cmd) match {
- case Some(exact) => exact(args)
- case _ => withError(ambiguous(xs))
- }
+ if (line startsWith ":") {
+ val cmd = line.tail takeWhile (x => !x.isWhitespace)
+ uniqueCommand(cmd) match {
+ case Some(lc) => lc(line.tail stripPrefix cmd dropWhile (_.isWhitespace))
+ case _ => ambiguousError(cmd)
+ }
}
+ else if (intp.global == null) Result(false, None) // Notice failure to create compiler
+ else Result(true, interpretStartingWith(line))
}
private def readWhile(cond: String => Boolean) = {
@@ -574,10 +655,9 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
}
def pasteCommand(): Result = {
- out.println("// Entering paste mode (ctrl-D to finish)\n")
- out.flush()
+ echo("// Entering paste mode (ctrl-D to finish)\n")
val code = readWhile(_ => true) mkString "\n"
- out.println("\n// Exiting paste mode, now interpreting.\n")
+ echo("\n// Exiting paste mode, now interpreting.\n")
intp interpret code
()
}
@@ -587,13 +667,19 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
val PromptString = "scala> "
def interpret(line: String): Unit = {
- out.println(line.trim)
+ echo(line.trim)
intp interpret line
- out.println("")
+ echo("")
}
- def transcript(start: String) =
+ def transcript(start: String) = {
+ // Printing this message doesn't work very well becaues it's buried in the
+ // transcript they just pasted. Todo: a short timer goes off when
+ // lines stop coming which tells them to hit ctrl-D.
+ //
+ // echo("// Detected repl transcript paste: ctrl-D to finish.")
apply(Iterator(start) ++ readWhile(_.trim != PromptString.trim))
+ }
}
import paste.{ ContinueString, PromptString }
@@ -614,7 +700,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
case IR.Success => Some(code)
case IR.Incomplete =>
if (in.interactive && code.endsWith("\n\n")) {
- out.println("You typed two blank lines. Starting a new command.")
+ echo("You typed two blank lines. Starting a new command.")
None
}
else in.readLine(ContinueString) match {
@@ -641,7 +727,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
* and avoid the interpreter, as it's likely not valid scala code.
*/
if (code == "") None
- else if (!paste.running && code.startsWith(PromptString)) {
+ else if (!paste.running && code.trim.startsWith(PromptString)) {
paste.transcript(code)
None
}
@@ -679,7 +765,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
val cmd = ":load " + filename
command(cmd)
addReplay(cmd)
- out.println()
+ echo("")
}
case _ =>
}
@@ -696,7 +782,9 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
else new JLineCompletion(intp)
)
catch {
- case _: Exception | _: NoClassDefFoundError => SimpleReader()
+ case ex @ (_: Exception | _: NoClassDefFoundError) =>
+ echo("Failed to created JLineReader: " + ex + "\nFalling back to SimpleReader.")
+ SimpleReader()
}
}
@@ -724,7 +812,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
// they type a command the compiler is ready to roll.
intp.initialize()
if (isReplPower) {
- plushln("Starting in power mode, one moment...\n")
+ echo("Starting in power mode, one moment...\n")
enablePowerMode()
}
loop()
@@ -735,8 +823,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
/** process command-line arguments and do as they request */
def process(args: Array[String]): Boolean = {
- def error1(msg: String) = out println ("scala: " + msg)
- val command = new CommandLine(args.toList, error1)
+ val command = new CommandLine(args.toList, msg => echo("scala: " + msg))
def neededHelp(): String =
(if (command.settings.help.value) command.usageMsg + "\n" else "") +
(if (command.settings.Xhelp.value) command.xusageMsg + "\n" else "")
@@ -744,7 +831,7 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
// if they asked for no help and command is valid, we call the real main
neededHelp() match {
case "" => command.ok && process(command.settings)
- case help => plush(help) ; true
+ case help => echoNoNL(help) ; true
}
}
@@ -761,11 +848,47 @@ class ILoop(in0: Option[BufferedReader], protected val out: PrintWriter)
object ILoop {
implicit def loopToInterpreter(repl: ILoop): IMain = repl.intp
+ private def echo(msg: String) = Console println msg
+
+ // Designed primarily for use by test code: take a String with a
+ // bunch of code, and prints out a transcript of what it would look
+ // like if you'd just typed it into the repl.
+ def runForTranscript(code: String, settings: Settings): String = {
+ import java.io.{ BufferedReader, StringReader, OutputStreamWriter }
+
+ stringFromStream { ostream =>
+ Console.withOut(ostream) {
+ val output = new PrintWriter(new OutputStreamWriter(ostream), true) {
+ override def write(str: String) = {
+ // completely skip continuation lines
+ if (str forall (ch => ch.isWhitespace || ch == '|')) ()
+ // print a newline on empty scala prompts
+ else if ((str contains '\n') && (str.trim == "scala> ")) super.write("\n")
+ else super.write(str)
+ }
+ }
+ val input = new BufferedReader(new StringReader(code)) {
+ override def readLine(): String = {
+ val s = super.readLine()
+ // helping out by printing the line being interpreted.
+ if (s != null)
+ output.println(s)
+ s
+ }
+ }
+ val repl = new ILoop(input, output)
+ if (settings.classpath.isDefault)
+ settings.classpath.value = sys.props("java.class.path")
+
+ repl process settings
+ }
+ }
+ }
/** Creates an interpreter loop with default settings and feeds
* the given code to it as input.
*/
- def run(code: String): String = {
+ def run(code: String, sets: Settings = new Settings): String = {
import java.io.{ BufferedReader, StringReader, OutputStreamWriter }
stringFromStream { ostream =>
@@ -773,10 +896,11 @@ object ILoop {
val input = new BufferedReader(new StringReader(code))
val output = new PrintWriter(new OutputStreamWriter(ostream), true)
val repl = new ILoop(input, output)
- val settings = new Settings
- settings.classpath.value = sys.props("java.class.path")
- repl process settings
+ if (sets.classpath.isDefault)
+ sets.classpath.value = sys.props("java.class.path")
+
+ repl process sets
}
}
}
@@ -792,11 +916,11 @@ object ILoop {
val msg = if (args.isEmpty) "" else " Binding " + args.size + " value%s.".format(
if (args.size == 1) "" else "s"
)
- Console.println("Debug repl starting." + msg)
+ echo("Debug repl starting." + msg)
val repl = new ILoop {
override def prompt = "\ndebug> "
}
- repl.settings = new Settings(Console println _)
+ repl.settings = new Settings(echo)
repl.settings.embeddedDefaults[T]
repl.createInterpreter()
repl.in = JLineReader(repl)
@@ -806,7 +930,7 @@ object ILoop {
args foreach (p => repl.bind(p.name, p.tpe, p.value))
repl.loop()
- Console.println("\nDebug repl exiting.")
+ echo("\nDebug repl exiting.")
repl.closeInterpreter()
}
}
diff --git a/src/compiler/scala/tools/nsc/interpreter/IMain.scala b/src/compiler/scala/tools/nsc/interpreter/IMain.scala
index d74aa5e6df..62e781958f 100644
--- a/src/compiler/scala/tools/nsc/interpreter/IMain.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/IMain.scala
@@ -11,7 +11,7 @@ import java.io.{ PrintWriter }
import java.lang.reflect
import java.net.URL
import util.{ Set => _, _ }
-import io.VirtualDirectory
+import io.{ AbstractFile, VirtualDirectory }
import reporters.{ ConsoleReporter, Reporter }
import symtab.{ Flags, Names }
import scala.tools.nsc.interpreter.{ Results => IR }
@@ -57,7 +57,7 @@ import IMain._
* @author Moez A. Abdel-Gawad
* @author Lex Spoon
*/
-class IMain(val settings: Settings, protected val out: PrintWriter) {
+class IMain(val settings: Settings, protected val out: PrintWriter) extends Imports {
imain =>
/** construct an interpreter that reports to Console */
@@ -78,7 +78,16 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
import formatting._
/** directory to save .class files to */
- val virtualDirectory = new VirtualDirectory("(memory)", None)
+ val virtualDirectory = new VirtualDirectory("(memory)", None) {
+ private def pp(root: io.AbstractFile, indentLevel: Int) {
+ val spaces = " " * indentLevel
+ out.println(spaces + root.name)
+ if (root.isDirectory)
+ root.toList sortBy (_.name) foreach (x => pp(x, indentLevel + 1))
+ }
+ // print the contents hierarchically
+ def show() = pp(this, 0)
+ }
/** reporter */
lazy val reporter: ConsoleReporter = new IMain.ReplReporter(this)
@@ -102,11 +111,8 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
private def _initialize(): Boolean = {
val source = """
- |// this is assembled to force the loading of approximately the
- |// classes which will be loaded on the first expression anyway.
|class $repl_$init {
- | val x = "abc".reverse.length + (5 max 5)
- | scala.runtime.ScalaRunTime.stringOf(x)
+ | List(1) map (_ + 1)
|}
|""".stripMargin
@@ -157,11 +163,9 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
else null
}
@deprecated("Use `global` for access to the compiler instance.")
- lazy val compiler = global
+ lazy val compiler: global.type = global
import global._
- import definitions.{ ScalaPackage, JavaLangPackage, PredefModule, RootClass }
- import nme.{ INTERPRETER_IMPORT_WRAPPER }
object naming extends {
val global: imain.global.type = imain.global
@@ -268,9 +272,21 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
if (parentClassLoader == null) ScalaClassLoader fromURLs compilerClasspath
else new URLClassLoader(compilerClasspath, parentClassLoader)
- new AbstractFileClassLoader(virtualDirectory, parent)
+ new AbstractFileClassLoader(virtualDirectory, parent) {
+ /** Overridden here to try translating a simple name to the generated
+ * class name if the original attempt fails. This method is used by
+ * getResourceAsStream as well as findClass.
+ */
+ override protected def findAbstractFile(name: String): AbstractFile = {
+ super.findAbstractFile(name) match {
+ // deadlocks on startup if we try to translate names too early
+ case null if isInitializeComplete => generatedName(name) map (x => super.findAbstractFile(x)) orNull
+ case file => file
+ }
+ }
+ }
}
- private def loadByName(s: String): Class[_] =
+ private def loadByName(s: String): JClass =
(classLoader tryToInitializeClass s) getOrElse sys.error("Failed to load expected class: '" + s + "'")
protected def parentClassLoader: ClassLoader =
@@ -286,12 +302,12 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
*
* $line19.$read$$iw$$iw$$iw$$iw$$iw$$iw$$iw$$iw$Bippy
*/
- def pathToFlatName(id: String): String = {
- requestForIdent(id) match {
- case Some(req) => req fullFlatName id
- case _ => id
- }
+ def generatedName(simpleName: String): Option[String] = {
+ if (simpleName endsWith "$") optFlatName(simpleName.init) map (_ + "$")
+ else optFlatName(simpleName)
}
+ def flatName(id: String) = optFlatName(id) getOrElse id
+ def optFlatName(id: String) = requestForIdent(id) map (_ fullFlatName id)
def allDefinedNames = definedNameMap.keys.toList sortBy (_.toString)
def pathToType(id: String): String = pathToName(newTypeName(id))
@@ -336,6 +352,22 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
prevRequests += req
req.referencedNames foreach (x => referencedNameMap(x) = req)
+ // warning about serially defining companions. It'd be easy
+ // enough to just redefine them together but that may not always
+ // be what people want so I'm waiting until I can do it better.
+ if (!settings.nowarnings.value) {
+ for {
+ name <- req.definedNames filterNot (x => req.definedNames contains x.companionName)
+ oldReq <- definedNameMap get name.companionName
+ newSym <- req.definedSymbols get name
+ oldSym <- oldReq.definedSymbols get name.companionName
+ } {
+ printMessage("warning: previously defined %s is not a companion to %s.".format(oldSym, newSym))
+ printMessage("Companions must be defined together; you may wish to use :paste mode for this.")
+ }
+ }
+
+ // Updating the defined name map
req.definedNames foreach { name =>
if (definedNameMap contains name) {
if (name.isTypeName) handleTypeRedefinition(name.toTypeName, definedNameMap(name), req)
@@ -345,114 +377,6 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
}
}
- /** Compute imports that allow definitions from previous
- * requests to be visible in a new request. Returns
- * three pieces of related code:
- *
- * 1. An initial code fragment that should go before
- * the code of the new request.
- *
- * 2. A code fragment that should go after the code
- * of the new request.
- *
- * 3. An access path which can be traverested to access
- * any bindings inside code wrapped by #1 and #2 .
- *
- * The argument is a set of Names that need to be imported.
- *
- * Limitations: This method is not as precise as it could be.
- * (1) It does not process wildcard imports to see what exactly
- * they import.
- * (2) If it imports any names from a request, it imports all
- * of them, which is not really necessary.
- * (3) It imports multiple same-named implicits, but only the
- * last one imported is actually usable.
- */
- private case class ComputedImports(prepend: String, append: String, access: String)
- private def importsCode(wanted: Set[Name]): ComputedImports = {
- /** Narrow down the list of requests from which imports
- * should be taken. Removes requests which cannot contribute
- * useful imports for the specified set of wanted names.
- */
- case class ReqAndHandler(req: Request, handler: MemberHandler) { }
-
- def reqsToUse: List[ReqAndHandler] = {
- /** Loop through a list of MemberHandlers and select which ones to keep.
- * 'wanted' is the set of names that need to be imported.
- */
- def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = {
- val isWanted = wanted contains _
- // Single symbol imports might be implicits! See bug #1752. Rather than
- // try to finesse this, we will mimic all imports for now.
- def keepHandler(handler: MemberHandler) = handler match {
- case _: ImportHandler => true
- case x => x.definesImplicit || (x.definedNames exists isWanted)
- }
-
- reqs match {
- case Nil => Nil
- case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted)
- case rh :: rest =>
- import rh.handler._
- val newWanted = wanted ++ referencedNames -- definedNames -- importedNames
- rh :: select(rest, newWanted)
- }
- }
-
- /** Flatten the handlers out and pair each with the original request */
- select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse
- }
-
- val code, trailingBraces, accessPath = new StringBuilder
- val currentImps = mutable.HashSet[Name]()
-
- // add code for a new object to hold some imports
- def addWrapper() {
- val impname = INTERPRETER_IMPORT_WRAPPER
- code append "object %s {\n".format(impname)
- trailingBraces append "}\n"
- accessPath append ("." + impname)
-
- currentImps.clear
- }
-
- addWrapper()
-
- // loop through previous requests, adding imports for each one
- for (ReqAndHandler(req, handler) <- reqsToUse) {
- handler match {
- // If the user entered an import, then just use it; add an import wrapping
- // level if the import might conflict with some other import
- case x: ImportHandler =>
- if (x.importsWildcard || (currentImps exists (x.importedNames contains _)))
- addWrapper()
-
- code append (x.member + "\n")
-
- // give wildcard imports a import wrapper all to their own
- if (x.importsWildcard) addWrapper()
- else currentImps ++= x.importedNames
-
- // For other requests, import each defined name.
- // import them explicitly instead of with _, so that
- // ambiguity errors will not be generated. Also, quote
- // the name of the variable, so that we don't need to
- // handle quoting keywords separately.
- case x =>
- for (imv <- x.definedNames) {
- if (currentImps contains imv) addWrapper()
-
- code append ("import %s\n" format (req fullPath imv))
- currentImps += imv
- }
- }
- }
- // add one extra wrapper, to prevent warnings in the common case of
- // redefining the value bound in the last interpreter request.
- addWrapper()
- ComputedImports(code.toString, trailingBraces.toString, accessPath.toString)
- }
-
/** Parse a line into a sequence of trees. Returns None if the input is incomplete. */
def parse(line: String): Option[List[Tree]] = {
var justNeedsMore = false
@@ -497,7 +421,6 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
def compileString(code: String): Boolean =
compileSources(new BatchSourceFile("<script>", code))
-
/** Build a request from the user. `trees` is `line` after being parsed.
*/
private def buildRequest(line: String, trees: List[Tree]): Request = new Request(line, trees)
@@ -627,14 +550,14 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
virtualDirectory.clear()
resetClassLoader()
resetAllCreators()
- prevRequests.clear
+ prevRequests.clear()
}
/** This instance is no longer needed, so release any resources
* it is using. The reporter's output gets flushed.
*/
def close() {
- reporter.flush
+ reporter.flush()
}
/** Here is where we:
@@ -862,8 +785,10 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
// lazy val definedTypes: Map[Name, Type] = {
// typeNames map (x => x -> afterTyper(resultSymbol.info.nonPrivateDecl(x).tpe)) toMap
// }
- lazy val definedSymbols: Map[Name, Symbol] =
- termNames map (x => x -> applyToResultMember(x, x => x)) toMap
+ lazy val definedSymbols: Map[Name, Symbol] = (
+ termNames.map(x => x -> applyToResultMember(x, x => x)) ++
+ typeNames.map(x => x -> compilerTypeOf.get(x).map(_.typeSymbol).getOrElse(NoSymbol))
+ ).toMap
lazy val typesOfDefinedTerms: Map[Name, Type] =
termNames map (x => x -> applyToResultMember(x, _.tpe)) toMap
@@ -905,7 +830,13 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
execution.state match {
case Done => ("" + execution.get(), true)
- case Threw => if (bindLastException) handleException(execution.caught()) else throw execution.caught()
+ case Threw =>
+ val ex = execution.caught()
+ if (isReplDebug)
+ ex.printStackTrace()
+
+ if (bindLastException) handleException(ex)
+ else throw ex
case Cancelled => ("Execution interrupted by signal.\n", false)
case Running => ("Execution still running! Seems impossible.", false)
}
@@ -929,8 +860,10 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
case _ => naming.mostRecentVar
})
- private def requestForName(name: Name): Option[Request] =
+ private def requestForName(name: Name): Option[Request] = {
+ assert(definedNameMap != null, "definedNameMap is null")
definedNameMap get name
+ }
private def requestForIdent(line: String): Option[Request] =
requestForName(newTermName(line)) orElse requestForName(newTypeName(line))
@@ -948,22 +881,21 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
requestForName(name) flatMap { req =>
req.handlers find (_.definedNames contains name)
}
- //
def valueOfTerm(id: String): Option[AnyRef] =
requestForIdent(id) flatMap (_.getEval)
- def classOfTerm(id: String): Option[Class[_]] =
+ def classOfTerm(id: String): Option[JClass] =
valueOfTerm(id) map (_.getClass)
def typeOfTerm(id: String): Option[Type] = newTermName(id) match {
- case nme.ROOTPKG => Some(RootClass.tpe)
+ case nme.ROOTPKG => Some(definitions.RootClass.tpe)
case name => requestForName(name) flatMap (_.compilerTypeOf get name)
}
def symbolOfTerm(id: String): Symbol =
requestForIdent(id) flatMap (_.definedSymbols get newTermName(id)) getOrElse NoSymbol
- def runtimeClassAndTypeOfTerm(id: String): Option[(Class[_], Type)] = {
+ def runtimeClassAndTypeOfTerm(id: String): Option[(JClass, Type)] = {
for {
clazz <- classOfTerm(id)
tpe <- runtimeTypeOfTerm(id)
@@ -997,17 +929,23 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
return None
}
+ def asQualifiedImport = {
+ val name = expr.takeWhile(_ != '.')
+ importedTermNamed(name) flatMap { sym =>
+ typeOfExpression(sym.fullName + expr.drop(name.length))
+ }
+ }
def asModule = safeModule(expr) map (_.tpe)
def asExpr = beSilentDuring {
val lhs = freshInternalVarName()
- interpret("lazy val " + lhs + " = { " + expr + " } ") match {
+ interpret("lazy val " + lhs + " = { " + expr + " } ", true) match {
case IR.Success => typeOfExpression(lhs)
case _ => None
}
}
typeOfExpressionDepth += 1
- try typeOfTerm(expr) orElse asModule orElse asExpr
+ try typeOfTerm(expr) orElse asModule orElse asExpr orElse asQualifiedImport
finally typeOfExpressionDepth -= 1
}
// def compileAndTypeExpr(expr: String): Option[Typer] = {
@@ -1016,70 +954,22 @@ class IMain(val settings: Settings, protected val out: PrintWriter) {
// }
// }
- private def onlyTerms(xs: List[Name]) = xs collect { case x: TermName => x }
- private def onlyTypes(xs: List[Name]) = xs collect { case x: TypeName => x }
+ protected def onlyTerms(xs: List[Name]) = xs collect { case x: TermName => x }
+ protected def onlyTypes(xs: List[Name]) = xs collect { case x: TypeName => x }
- def importHandlers = allHandlers collect { case x: ImportHandler => x }
def definedTerms = onlyTerms(allDefinedNames) filterNot isInternalVarName
def definedTypes = onlyTypes(allDefinedNames)
- def importedTerms = onlyTerms(importHandlers flatMap (_.importedNames))
- def importedTypes = onlyTypes(importHandlers flatMap (_.importedNames))
+ def definedSymbols = prevRequests.toSet flatMap ((x: Request) => x.definedSymbols.values)
/** the previous requests this interpreter has processed */
- private lazy val prevRequests = mutable.ArrayBuffer[Request]()
+ private lazy val prevRequests = mutable.ListBuffer[Request]()
private lazy val referencedNameMap = mutable.Map[Name, Request]()
private lazy val definedNameMap = mutable.Map[Name, Request]()
- private def allHandlers = prevRequests.toList flatMap (_.handlers)
- private def allReqAndHandlers = prevRequests.toList flatMap (req => req.handlers map (req -> _))
- def allSeenTypes = prevRequests.toList flatMap (_.typeOf.values.toList) distinct
+ protected def prevRequestList = prevRequests.toList
+ private def allHandlers = prevRequestList flatMap (_.handlers)
+ def allSeenTypes = prevRequestList flatMap (_.typeOf.values.toList) distinct
def allImplicits = allHandlers filter (_.definesImplicit) flatMap (_.definedNames)
-
- private def membersAtPickler(sym: Symbol): List[Symbol] =
- atPickler(sym.info.nonPrivateMembers)
-
- /** Symbols whose contents are language-defined to be imported. */
- def languageWildcardSyms: List[Symbol] = List(JavaLangPackage, ScalaPackage, PredefModule)
- def languageWildcards: List[Type] = languageWildcardSyms map (_.tpe)
-
- /** Types which have been wildcard imported, such as:
- * val x = "abc" ; import x._ // type java.lang.String
- * import java.lang.String._ // object java.lang.String
- *
- * Used by tab completion.
- *
- * XXX right now this gets import x._ and import java.lang.String._,
- * but doesn't figure out import String._. There's a lot of ad hoc
- * scope twiddling which should be swept away in favor of digging
- * into the compiler scopes.
- */
- def sessionWildcards: List[Type] = {
- importHandlers flatMap {
- case x if x.importsWildcard => x.targetType
- case _ => None
- } distinct
- }
- def wildcardTypes = languageWildcards ++ sessionWildcards
-
- def languageSymbols = languageWildcardSyms flatMap membersAtPickler
- def sessionSymbols = importHandlers flatMap (_.importedSymbols)
- def importedSymbols = languageSymbols ++ sessionSymbols
- def implicitSymbols = importedSymbols filter (_.isImplicit)
-
- /** Tuples of (source, imported symbols) in the order they were imported.
- */
- def importedSymbolsBySource: List[(Symbol, List[Symbol])] = {
- val lang = languageWildcardSyms map (sym => (sym, membersAtPickler(sym)))
- val session = importHandlers filter (_.targetType.isDefined) map { mh =>
- (mh.targetType.get.typeSymbol, mh.importedSymbols)
- }
-
- lang ++ session
- }
- def implicitSymbolsBySource: List[(Symbol, List[Symbol])] = {
- importedSymbolsBySource map {
- case (k, vs) => (k, vs filter (_.isImplicit))
- } filterNot (_._2.isEmpty)
- }
+ def importHandlers = allHandlers collect { case x: ImportHandler => x }
def visibleTermNames: List[Name] = definedTerms ++ importedTerms distinct
@@ -1141,7 +1031,7 @@ object IMain {
def apply(contributors: List[T]): String = stringFromWriter { code =>
code println preamble
- contributors map generate foreach (code print _)
+ contributors map generate foreach (code println _)
code println postamble
}
}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Imports.scala b/src/compiler/scala/tools/nsc/interpreter/Imports.scala
new file mode 100644
index 0000000000..b2706330e7
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/interpreter/Imports.scala
@@ -0,0 +1,194 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc
+package interpreter
+
+import scala.collection.{ mutable, immutable }
+
+trait Imports {
+ self: IMain =>
+
+ import global._
+ import definitions.{ ScalaPackage, JavaLangPackage, PredefModule }
+ import memberHandlers._
+
+ /** Synthetic import handlers for the language defined imports. */
+ private def makeWildcardImportHandler(sym: Symbol): ImportHandler = {
+ val hd :: tl = sym.fullName.split('.').toList map newTermName
+ val tree = Import(
+ tl.foldLeft(Ident(hd): Tree)((x, y) => Select(x, y)),
+ List(ImportSelector(nme.WILDCARD, -1, null, -1))
+ )
+ tree setSymbol sym
+ new ImportHandler(tree)
+ }
+
+ /** Symbols whose contents are language-defined to be imported. */
+ def languageWildcardSyms: List[Symbol] = List(JavaLangPackage, ScalaPackage, PredefModule)
+ def languageWildcards: List[Type] = languageWildcardSyms map (_.tpe)
+ def languageWildcardHandlers = languageWildcardSyms map makeWildcardImportHandler
+
+ def importedTerms = onlyTerms(importHandlers flatMap (_.importedNames))
+ def importedTypes = onlyTypes(importHandlers flatMap (_.importedNames))
+
+ /** Types which have been wildcard imported, such as:
+ * val x = "abc" ; import x._ // type java.lang.String
+ * import java.lang.String._ // object java.lang.String
+ *
+ * Used by tab completion.
+ *
+ * XXX right now this gets import x._ and import java.lang.String._,
+ * but doesn't figure out import String._. There's a lot of ad hoc
+ * scope twiddling which should be swept away in favor of digging
+ * into the compiler scopes.
+ */
+ def sessionWildcards: List[Type] = {
+ importHandlers flatMap {
+ case x if x.importsWildcard => x.targetType
+ case _ => None
+ } distinct
+ }
+ def wildcardTypes = languageWildcards ++ sessionWildcards
+
+ def languageSymbols = languageWildcardSyms flatMap membersAtPickler
+ def sessionImportedSymbols = importHandlers flatMap (_.importedSymbols)
+ def importedSymbols = languageSymbols ++ sessionImportedSymbols
+ def importedTermSymbols = importedSymbols collect { case x: TermSymbol => x }
+ def importedTypeSymbols = importedSymbols collect { case x: TypeSymbol => x }
+ def implicitSymbols = importedSymbols filter (_.isImplicit)
+
+ def importedTermNamed(name: String) = importedTermSymbols find (_.name.toString == name)
+
+ /** Tuples of (source, imported symbols) in the order they were imported.
+ */
+ def importedSymbolsBySource: List[(Symbol, List[Symbol])] = {
+ val lang = languageWildcardSyms map (sym => (sym, membersAtPickler(sym)))
+ val session = importHandlers filter (_.targetType.isDefined) map { mh =>
+ (mh.targetType.get.typeSymbol, mh.importedSymbols)
+ }
+
+ lang ++ session
+ }
+ def implicitSymbolsBySource: List[(Symbol, List[Symbol])] = {
+ importedSymbolsBySource map {
+ case (k, vs) => (k, vs filter (_.isImplicit))
+ } filterNot (_._2.isEmpty)
+ }
+
+ /** Compute imports that allow definitions from previous
+ * requests to be visible in a new request. Returns
+ * three pieces of related code:
+ *
+ * 1. An initial code fragment that should go before
+ * the code of the new request.
+ *
+ * 2. A code fragment that should go after the code
+ * of the new request.
+ *
+ * 3. An access path which can be traverested to access
+ * any bindings inside code wrapped by #1 and #2 .
+ *
+ * The argument is a set of Names that need to be imported.
+ *
+ * Limitations: This method is not as precise as it could be.
+ * (1) It does not process wildcard imports to see what exactly
+ * they import.
+ * (2) If it imports any names from a request, it imports all
+ * of them, which is not really necessary.
+ * (3) It imports multiple same-named implicits, but only the
+ * last one imported is actually usable.
+ */
+ case class ComputedImports(prepend: String, append: String, access: String)
+ protected def importsCode(wanted: Set[Name]): ComputedImports = {
+ /** Narrow down the list of requests from which imports
+ * should be taken. Removes requests which cannot contribute
+ * useful imports for the specified set of wanted names.
+ */
+ case class ReqAndHandler(req: Request, handler: MemberHandler) { }
+
+ def reqsToUse: List[ReqAndHandler] = {
+ /** Loop through a list of MemberHandlers and select which ones to keep.
+ * 'wanted' is the set of names that need to be imported.
+ */
+ def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = {
+ val isWanted = wanted contains _
+ // Single symbol imports might be implicits! See bug #1752. Rather than
+ // try to finesse this, we will mimic all imports for now.
+ def keepHandler(handler: MemberHandler) = handler match {
+ case _: ImportHandler => true
+ case x => x.definesImplicit || (x.definedNames exists isWanted)
+ }
+
+ reqs match {
+ case Nil => Nil
+ case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted)
+ case rh :: rest =>
+ import rh.handler._
+ val newWanted = wanted ++ referencedNames -- definedNames -- importedNames
+ rh :: select(rest, newWanted)
+ }
+ }
+
+ /** Flatten the handlers out and pair each with the original request */
+ select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse
+ }
+
+ val code, trailingBraces, accessPath = new StringBuilder
+ val currentImps = mutable.HashSet[Name]()
+
+ // add code for a new object to hold some imports
+ def addWrapper() {
+ val impname = nme.INTERPRETER_IMPORT_WRAPPER
+ code append "object %s {\n".format(impname)
+ trailingBraces append "}\n"
+ accessPath append ("." + impname)
+
+ currentImps.clear
+ }
+
+ addWrapper()
+
+ // loop through previous requests, adding imports for each one
+ for (ReqAndHandler(req, handler) <- reqsToUse) {
+ handler match {
+ // If the user entered an import, then just use it; add an import wrapping
+ // level if the import might conflict with some other import
+ case x: ImportHandler =>
+ if (x.importsWildcard || (currentImps exists (x.importedNames contains _)))
+ addWrapper()
+
+ code append (x.member + "\n")
+
+ // give wildcard imports a import wrapper all to their own
+ if (x.importsWildcard) addWrapper()
+ else currentImps ++= x.importedNames
+
+ // For other requests, import each defined name.
+ // import them explicitly instead of with _, so that
+ // ambiguity errors will not be generated. Also, quote
+ // the name of the variable, so that we don't need to
+ // handle quoting keywords separately.
+ case x =>
+ for (imv <- x.definedNames) {
+ if (currentImps contains imv) addWrapper()
+
+ code append ("import %s\n" format (req fullPath imv))
+ currentImps += imv
+ }
+ }
+ }
+ // add one extra wrapper, to prevent warnings in the common case of
+ // redefining the value bound in the last interpreter request.
+ addWrapper()
+ ComputedImports(code.toString, trailingBraces.toString, accessPath.toString)
+ }
+
+ private def allReqAndHandlers =
+ prevRequestList flatMap (req => req.handlers map (req -> _))
+
+ private def membersAtPickler(sym: Symbol): List[Symbol] =
+ atPickler(sym.info.nonPrivateMembers)
+} \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala b/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala
index 1430cbe55c..edade4da1b 100644
--- a/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala
@@ -27,12 +27,13 @@ trait InteractiveReader {
def redrawLine(): Unit
def currentLine: String
- def readYesOrNo(prompt: String) = readOneKey(prompt) match {
+ def readYesOrNo(prompt: String, alt: => Boolean): Boolean = readOneKey(prompt) match {
case 'y' => true
case 'n' => false
+ case _ => alt
}
- def readAssumingNo(prompt: String) = try readYesOrNo(prompt) catch { case _: MatchError => false }
- def readAssumingYes(prompt: String) = try readYesOrNo(prompt) catch { case _: MatchError => true }
+ def readAssumingNo(prompt: String) = readYesOrNo(prompt, false)
+ def readAssumingYes(prompt: String) = readYesOrNo(prompt, true)
protected def readOneLine(prompt: String): String
protected def readOneKey(prompt: String): Int
diff --git a/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala b/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala
index 7430406306..b7baea57fc 100644
--- a/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala
@@ -102,7 +102,9 @@ class JLineCompletion(val intp: IMain) extends Completion with CompletionOutput
def excludeStartsWith: List[String] = List("<") // <byname>, <repeated>, etc.
def excludeNames: List[String] = (anyref.methodNames filterNot anyRefMethodsToShow) :+ "_root_"
- def methodSignatureString(sym: Symbol) = afterTyper(new MethodSymbolOutput(sym).methodString())
+ def methodSignatureString(sym: Symbol) = {
+ IMain stripString afterTyper(new MethodSymbolOutput(sym).methodString())
+ }
def exclude(name: String): Boolean = (
(name contains "$") ||
diff --git a/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala b/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala
index d9260427b3..d222a80196 100644
--- a/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala
@@ -6,7 +6,6 @@
package scala.tools.nsc
package interpreter
-import java.io.File
import scala.tools.jline.console.ConsoleReader
import scala.tools.jline.console.completer._
import session._
diff --git a/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala b/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala
index 24fde9425f..196d8b882f 100644
--- a/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala
@@ -6,43 +6,87 @@
package scala.tools.nsc
package interpreter
+import collection.{ mutable, immutable }
+import mutable.ListBuffer
+
+class ProcessResult(val line: String) {
+ import sys.process._
+ private val buffer = new ListBuffer[String]
+
+ val builder = Process(line)
+ val logger = ProcessLogger(buffer += _)
+ val exitCode = builder ! logger
+ def lines = buffer.toList
+
+ def show() = lines foreach println
+ override def toString = "`%s` (%d lines, exit %d)".format(line, buffer.size, exitCode)
+}
+object ProcessResult {
+ implicit def processResultToOutputLines(pr: ProcessResult): List[String] = pr.lines
+ def apply(line: String): ProcessResult = new ProcessResult(line)
+}
+
trait LoopCommands {
protected def out: java.io.PrintWriter
// a single interpreter command
- sealed abstract class LoopCommand extends (List[String] => Result) {
- def name: String
- def help: String
- def commandError(msg: String) = {
- out.println(":" + name + " " + msg + ".")
+ abstract class LoopCommand(val name: String, val help: String) extends (String => Result) {
+ private var _longHelp: String = null
+ final def defaultHelp = usageMsg + " (no extended help available.)"
+ def hasLongHelp = _longHelp != null || longHelp != defaultHelp
+ def withLongHelp(text: String): this.type = { _longHelp = text ; this }
+ def longHelp = _longHelp match {
+ case null => defaultHelp
+ case text => text
+ }
+ def usage: String = ""
+ def usageMsg: String = ":" + name + (
+ if (usage == "") "" else " " + usage
+ )
+ def apply(line: String): Result
+
+ // called if no args are given
+ def showUsage(): Result = {
+ "usage is " + usageMsg
Result(true, None)
}
- def usage(): String
+
+ def onError(msg: String) = {
+ out.println("error: " + msg)
+ showUsage()
+ }
}
- case class NoArgs(name: String, help: String, f: () => Result) extends LoopCommand {
- def usage(): String = ":" + name
- def apply(args: List[String]) = if (args.isEmpty) f() else commandError("accepts no arguments")
+ object LoopCommand {
+ def nullary(name: String, help: String, f: () => Result): LoopCommand =
+ new NullaryCmd(name, help, _ => f())
+
+ def cmd(name: String, usage: String, help: String, f: String => Result): LoopCommand =
+ if (usage == "") new NullaryCmd(name, help, f)
+ else new LineCmd(name, usage, help, f)
+
+ def varargs(name: String, usage: String, help: String, f: List[String] => Result): LoopCommand =
+ new VarArgsCmd(name, usage, help, f)
}
- case class LineArg(name: String, help: String, f: (String) => Result) extends LoopCommand {
- def usage(): String = ":" + name + " "
- def apply(args: List[String]) = f(args mkString " ")
+ class NullaryCmd(name: String, help: String, f: String => Result) extends LoopCommand(name, help) {
+ def apply(line: String): Result = f(line)
}
- case class OneArg(name: String, help: String, f: (String) => Result) extends LoopCommand {
- def usage(): String = ":" + name + " "
- def apply(args: List[String]) =
- if (args.size == 1) f(args.head)
- else commandError("requires exactly one argument")
+ class LineCmd(name: String, argWord: String, help: String, f: String => Result) extends LoopCommand(name, help) {
+ override def usage = argWord
+ def apply(line: String): Result = f(line)
}
- case class VarArgs(name: String, help: String, f: (List[String]) => Result) extends LoopCommand {
- def usage(): String = ":" + name + " [arg]"
+ class VarArgsCmd(name: String, argWord: String, help: String, f: List[String] => Result)
+ extends LoopCommand(name, help) {
+ override def usage = argWord
+ def apply(line: String): Result = apply(words(line))
def apply(args: List[String]) = f(args)
}
// the result of a single command
case class Result(val keepRunning: Boolean, val lineToRecord: Option[String])
+
object Result {
// the default result means "keep running, and don't record that line"
val default = Result(true, None)
diff --git a/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala b/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala
index 29c31f50d6..330294f823 100644
--- a/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala
@@ -18,23 +18,6 @@ trait MemberHandlers {
import global._
import naming._
- def string2codeQuoted(str: String) = "\"" + string2code(str) + "\""
-
- /** Convert a string into code that can recreate the string.
- * This requires replacing all special characters by escape
- * codes. It does not add the surrounding " marks. */
- def string2code(str: String): String = {
- val res = new StringBuilder
- for (c <- str) c match {
- case '"' | '\'' | '\\' => res += '\\' ; res += c
- case _ if c.isControl => res ++= Chars.char2uescape(c)
- case _ => res += c
- }
- res.toString
- }
- def any2stringOf(x: Any, maxlen: Int) =
- "scala.runtime.ScalaRunTime.stringOf(%s, %s)".format(x, maxlen)
-
private def codegenln(leadingPlus: Boolean, xs: String*): String = codegen(leadingPlus, (xs ++ Array("\n")): _*)
private def codegenln(xs: String*): String = codegenln(true, xs: _*)
@@ -121,7 +104,6 @@ trait MemberHandlers {
class ValHandler(member: ValDef) extends MemberDefHandler(member) {
val maxStringElements = 1000 // no need to mkString billions of elements
- def stringOf(x: Any) = any2stringOf(x, maxStringElements)
override def definesValue = true
override def resultExtractionCode(req: Request): String = {
@@ -131,7 +113,7 @@ trait MemberHandlers {
// if this is a lazy val we avoid evaluating it here
val resultString =
if (mods.isLazy) codegenln(false, "<lazy>")
- else stringOf(req fullPath name)
+ else any2stringOf(req fullPath name, maxStringElements)
""" + "%s: %s = " + %s""".format(prettyName, string2code(req typeOf name), resultString)
}
@@ -215,7 +197,9 @@ trait MemberHandlers {
/** The names imported by this statement */
override lazy val importedNames: List[Name] = wildcardNames ++ individualNames
+ lazy val importsSymbolNamed: Set[String] = importedNames map (_.toString) toSet
- override def resultExtractionCode(req: Request) = codegenln(imp.toString) + "\n"
+ def importString = imp.toString
+ override def resultExtractionCode(req: Request) = codegenln(importString) + "\n"
}
}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Pasted.scala b/src/compiler/scala/tools/nsc/interpreter/Pasted.scala
index e605bb010d..83321356a3 100644
--- a/src/compiler/scala/tools/nsc/interpreter/Pasted.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/Pasted.scala
@@ -9,51 +9,93 @@ package interpreter
/** If it looks like they're pasting in a scala interpreter
* transcript, remove all the formatting we inserted so we
* can make some sense of it.
+ *
+ * Most of the interesting code in here is due to my goal of
+ * "paste idempotence" i.e. the transcript resulting from pasting
+ * a transcript should itself be pasteable and should achieve
+ * the same result.
*/
abstract class Pasted {
def ContinueString: String
def PromptString: String
def interpret(line: String): Unit
- private var isRunning = false
+ def matchesPrompt(line: String) = matchesString(line, PromptString)
+ def matchesContinue(line: String) = matchesString(line, ContinueString)
def running = isRunning
+ private def matchesString(line: String, target: String): Boolean = (
+ (line startsWith target) ||
+ (line.nonEmpty && " \t".toSet(line.head) && matchesString(line.tail, target))
+ )
+ private def stripString(line: String, target: String) = line indexOf target match {
+ case -1 => line
+ case idx => line drop (idx + target.length)
+ }
+ private var isRunning = false
+ private val resReference = """(?<!^)(res\d+)""".r
+ private val resCreation = """^\s*(res\d+):.*""".r
+ private val resAssign = """^val (res\d+).*""".r
+
+ private class PasteAnalyzer(val lines: List[String]) {
+ val referenced = lines flatMap (resReference findAllIn _.trim.stripPrefix("res")) toSet
+ val cmds = lines reduceLeft append split PromptString filterNot (_.trim == "") toList
+
+ /** If it's a prompt or continuation line, strip the formatting bits and
+ * assemble the code. Otherwise ship it off to be analyzed for res references
+ * and discarded.
+ */
+ def append(code: String, line: String): String =
+ if (matchesPrompt(line)) code + "\n" + line
+ else if (matchesContinue(line)) code + "\n" + stripString(line, ContinueString)
+ else fixResRefs(code, line)
+
+ /** If the line looks like
+ * res15: Int
+ *
+ * and the additional conditions hold that:
+ * 1) res15 is referenced from elsewhere in the transcript
+ * 2) the preceding repl line is not "val res15 = ..." because that
+ * indicates it has already been "val-ified" on a previous paste
+ *
+ * then we go back in time to the preceding scala> prompt and
+ * rewrite the line containing <expr> as
+ * val res15 = { <expr> }
+ * and the rest as they say is rewritten history.
+ *
+ * In all other cases, discard the line.
+ */
+ def fixResRefs(code: String, line: String) = line match {
+ case resCreation(resName) if referenced(resName) =>
+ code.lastIndexOf(PromptString) match {
+ case -1 => code
+ case idx =>
+ val (str1, str2) = code splitAt (idx + PromptString.length)
+ str2 match {
+ case resAssign(`resName`) => code
+ case _ => "%sval %s = { %s }".format(str1, resName, str2)
+ }
+ }
+ case _ => code
+ }
+
+ def run() {
+ println("// Replaying %d commands from transcript.\n" format cmds.size)
+ cmds foreach { cmd =>
+ print(PromptString)
+ interpret(cmd)
+ }
+ }
+ }
+
/** Commands start on lines beginning with "scala>" and each successive
* line which begins with the continuation string is appended to that command.
* Everything else is discarded. When the end of the transcript is spotted,
* all the commands are replayed.
*/
def apply(lines: TraversableOnce[String]) = {
- val cmds = lines reduceLeft append split PromptString filterNot (_.trim == "") toList;
- println("// Replaying %d commands from transcript.\n" format cmds.size)
-
isRunning = true
- try cmds foreach interpret
+ try new PasteAnalyzer(lines.toList) run()
finally isRunning = false
}
-
- private def isPrompted(line: String) = line startsWith PromptString
- private def isContinuation(line: String) = line startsWith ContinueString
-
- private def append(code: String, line: String): String =
- if (isPrompted(line)) code + "\n" + line
- else if (isContinuation(line)) code + "\n" + line.stripPrefix(ContinueString)
- else fixResRefs(code, line)
-
- /** If the line looks like
- * res15: Int
- * then we go back in time to the preceding scala> prompt and rewrite
- * the line containing <expr> as
- * val res15 = { <expr> }
- * and the rest as they say is rewritten history.
- *
- * In all other cases, discard the line.
- */
- private val resRegex = """^(res\d+):.*""".r
- private def fixResRefs(code: String, line: String) = line match {
- case resRegex(resName) if code contains PromptString =>
- val (str1, str2) = code splitAt code.lastIndexOf(PromptString) + PromptString.length
- "%sval %s = { %s }".format(str1, resName, str2)
- case _ => code
- }
}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Phased.scala b/src/compiler/scala/tools/nsc/interpreter/Phased.scala
index 1406d2af39..b3d33325e4 100644
--- a/src/compiler/scala/tools/nsc/interpreter/Phased.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/Phased.scala
@@ -6,6 +6,9 @@
package scala.tools.nsc
package interpreter
+import scala.collection.{ mutable, immutable }
+import immutable.SortedMap
+
/** Mix this into an object and use it as a phasing
* swiss army knife.
*/
@@ -63,11 +66,14 @@ trait Phased {
try parseInternal(str)
catch { case _: Exception => NoPhaseName }
- def apply[T](body: => T): T = atPhase(get)(body)
+ def apply[T](body: => T): SortedMap[PhaseName, T] =
+ SortedMap[PhaseName, T](atMap(PhaseName.all)(body): _*)
+
+ def atCurrent[T](body: => T): T = atPhase(get)(body)
def multi[T](body: => T): Seq[T] = multi map (ph => at(ph)(body))
- def all[T](body: => T): Seq[T] = ats(PhaseName.all)(body)
- def allshow[T](body: => T): Seq[T] = {
- val pairs = atz(PhaseName.all)(body)
+ def all[T](body: => T): Seq[T] = atMulti(PhaseName.all)(body)
+ def show[T](body: => T): Seq[T] = {
+ val pairs = atMap(PhaseName.all)(body)
pairs foreach { case (ph, op) => Console.println("%15s -> %s".format(ph, op.toString take 240)) }
pairs map (_._2)
}
@@ -75,25 +81,27 @@ trait Phased {
def at[T](ph: PhaseName)(body: => T): T = {
val saved = get
set(ph)
- try apply(body)
+ try atCurrent(body)
finally set(saved)
}
- def ats[T](phs: Seq[PhaseName])(body: => T): Seq[T] = {
+ def atMulti[T](phs: Seq[PhaseName])(body: => T): Seq[T] = {
val saved = multi
setMulti(phs)
try multi(body)
finally setMulti(saved)
}
- def atshow[T](phs: Seq[PhaseName])(body: => T): Unit =
- atz[T](phs)(body) foreach {
+ def showAt[T](phs: Seq[PhaseName])(body: => T): Unit =
+ atMap[T](phs)(body) foreach {
case (ph, op) => Console.println("%15s -> %s".format(ph, op.toString take 240))
}
- def atz[T](phs: Seq[PhaseName])(body: => T): Seq[(PhaseName, T)] =
- phs zip ats(phs)(body)
+ def atMap[T](phs: Seq[PhaseName])(body: => T): Seq[(PhaseName, T)] =
+ phs zip atMulti(phs)(body)
object PhaseName {
+ implicit lazy val phaseNameOrdering: Ordering[PhaseName] = Ordering[Int] on (_.id)
+
lazy val all = List(
Parser, Namer, Packageobjects, Typer, Superaccessors, Pickler, Refchecks,
Selectiveanf, Liftcode, Selectivecps, Uncurry, Tailcalls, Specialize,
diff --git a/src/compiler/scala/tools/nsc/interpreter/Power.scala b/src/compiler/scala/tools/nsc/interpreter/Power.scala
index 0933365d9e..c2f72e9f37 100644
--- a/src/compiler/scala/tools/nsc/interpreter/Power.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/Power.scala
@@ -6,20 +6,57 @@
package scala.tools.nsc
package interpreter
+import scala.reflect.NameTransformer
import scala.collection.{ mutable, immutable }
import scala.util.matching.Regex
import scala.tools.nsc.util.{ BatchSourceFile }
import session.{ History }
+import scala.io.Codec
+import java.net.{ URL, MalformedURLException }
+import io.{ Path }
+
+trait SharesGlobal[G <: Global] {
+ val global: G
+
+ // This business gets really old:
+ //
+ // found : power.intp.global.Symbol
+ // required: global.Symbol
+ //
+ // Have tried many ways to cast it aside, this is the current winner.
+ // Todo: figure out a way to abstract over all the type members.
+ type AnySymbol = Global#Symbol
+ type AnyType = Global#Type
+ type AnyName = Global#Name
+ type AnyTree = Global#Tree
+
+ type Symbol = global.Symbol
+ type Type = global.Type
+ type Name = global.Name
+ type Tree = global.Tree
+
+ implicit def upDependentSymbol(x: AnySymbol): Symbol = x.asInstanceOf[Symbol]
+ implicit def upDependentType(x: AnyType): Type = x.asInstanceOf[Type]
+ implicit def upDependentName(x: AnyName): Name = x.asInstanceOf[Name]
+ implicit def upDependentTree(x: AnyTree): Tree = x.asInstanceOf[Tree]
+}
+
+object Power {
+ def apply[G <: Global](repl: ILoop, g: G) =
+ new { final val global: G = g } with Power[G](repl, repl.intp)
+
+ def apply(intp: IMain) =
+ new { final val global = intp.global } with Power[Global](null, intp)
+}
/** A class for methods to be injected into the intp in power mode.
*/
-class Power(repl: ILoop, intp: IMain) {
- def this(repl: ILoop) = this(repl, repl.intp)
- def this(intp: IMain) = this(null, intp)
-
- val global: intp.global.type = intp.global
- import global._
+abstract class Power[G <: Global](
+ val repl: ILoop,
+ val intp: IMain
+) extends SharesGlobal[G] {
import intp.{ beQuietDuring, interpret, parse }
+ import global.{ opt, definitions, stringToTermName, NoSymbol, NoType, analyzer, CompilationUnit }
abstract class SymSlurper {
def isKeep(sym: Symbol): Boolean
@@ -82,7 +119,10 @@ class Power(repl: ILoop, intp: IMain) {
def slurp() = apply(modClass)
}
- def banner = """
+ private def customBanner = replProps.powerBanner.option flatMap (f => io.File(f).safeSlurp())
+ private def customInit = replProps.powerInitCode.option flatMap (f => io.File(f).safeSlurp())
+
+ def banner = customBanner getOrElse """
|** Power User mode enabled - BEEP BOOP WHIR **
|** scala.tools.nsc._ has been imported **
|** global._ and definitions._ also imported **
@@ -91,27 +131,28 @@ class Power(repl: ILoop, intp: IMain) {
|** New defs! Type power.<tab> to reveal **
""".stripMargin.trim
- def init = """
+ def init = customInit getOrElse """
|import scala.tools.nsc._
- |val global: intp.global.type = intp.global
+ |import scala.collection.JavaConverters._
|import global._
- |import definitions._
- |import power.phased
|import power.Implicits._
""".stripMargin
/** Starts up power mode and runs whatever is in init.
*/
def unleash(): Unit = beQuietDuring {
- if (repl != null) {
- intp.bind[ILoop]("repl", repl)
- intp.bind[History]("history", repl.in.history)
- intp.bind("completion", repl.in.completion)
- }
+ val r = new ReplVals(repl)
+ intp.bind[ILoop]("repl", repl)
+ intp.bind[ReplVals]("$r", r)
+
+ intp.bind("intp", r.intp)
+ intp.bind("global", r.global)
+ intp.bind("power", r.power)
+ intp.bind("phased", r.phased)
+ intp.bind("isettings", r.isettings)
+ intp.bind("completion", r.completion)
+ intp.bind("history", r.history)
- intp.bind[IMain]("intp", intp)
- intp.bind[Power]("power", this)
- intp.bind[ISettings]("isettings", intp.isettings)
init split '\n' foreach interpret
}
@@ -122,9 +163,11 @@ class Power(repl: ILoop, intp: IMain) {
private def getCompilerClass(name: String) = missingWrap(definitions.getClass(name))
private def getCompilerModule(name: String) = missingWrap(definitions.getModule(name))
- object InternalInfo {
+ trait LowPriorityInternalInfo {
implicit def apply[T: Manifest] : InternalInfo[T] = new InternalInfo[T](None)
}
+ object InternalInfo extends LowPriorityInternalInfo { }
+
/** Todos...
* translate manifest type arguments into applied types
* customizable symbol filter (had to hardcode no-spec to reduce noise)
@@ -152,11 +195,13 @@ class Power(repl: ILoop, intp: IMain) {
def allMembers = tpe.members
def bts = info.baseTypeSeq.toList
def btsmap = bts map (x => (x, x.decls.toList)) toMap
- def pkgName = erasure.getPackage.getName
- def pkg = getCompilerModule(pkgName)
+ def pkgName = Option(erasure.getPackage) map (_.getName)
+ def pkg = pkgName map getCompilerModule getOrElse NoSymbol
def pkgmates = pkg.tpe.members
- def pkgslurp = new PackageSlurper(pkgName) slurp()
-
+ def pkgslurp = pkgName match {
+ case Some(name) => new PackageSlurper(name) slurp()
+ case _ => Set()
+ }
def ? = this
def whoHas(name: String) = bts filter (_.decls.toList exists (_.name.toString == name))
@@ -171,8 +216,24 @@ class Power(repl: ILoop, intp: IMain) {
}
}
- trait PCFormatter extends (Any => List[String]) {
- def apply(x: Any): List[String]
+ trait LowPriorityPrettifier {
+ implicit object AnyPrettifier extends Prettifier[Any] {
+ def prettify(x: Any): List[String] = x match {
+ case x: Name => List(x.decode)
+ case Tuple2(k, v) => List(prettify(k) ++ Seq("->") ++ prettify(v) mkString " ")
+ case xs: TraversableOnce[_] => (xs.toList flatMap prettify).sorted
+ case x => List(rutil.stringOf(x))
+ }
+ }
+ }
+ object Prettifier extends LowPriorityPrettifier {
+ def prettify[T](value: T): List[String] = default[T] prettify value
+ def default[T] = new Prettifier[T] {
+ def prettify(x: T): List[String] = AnyPrettifier prettify x
+ }
+ }
+ trait Prettifier[T] {
+ def prettify(x: T): List[String]
private var indentLevel = 0
private def spaces = " " * indentLevel
@@ -182,12 +243,13 @@ class Power(repl: ILoop, intp: IMain) {
finally indentLevel -= 1
}
- def show(x: Any): Unit = grep(x, _ => true)
- def grep(x: Any, p: String => Boolean): Unit =
- apply(x) filter p foreach (x => println(spaces + x))
+ def show(x: T): Unit = grep(x, _ => true)
+ def grep(x: T, p: String => Boolean): Unit =
+ prettify(x) filter p foreach (x => println(spaces + x))
}
- class MultiPrintingConvenience[T](coll: Traversable[T])(implicit fmt: PCFormatter) {
- import fmt._
+ class MultiPrintingConvenience[T: Prettifier](coll: TraversableOnce[T]) {
+ val pretty = implicitly[Prettifier[T]]
+ import pretty._
def freqBy[U](p: T => U) = {
val map = coll.toList groupBy p
@@ -197,8 +259,8 @@ class Power(repl: ILoop, intp: IMain) {
val buf = new mutable.ListBuffer[String]
freqBy(p) foreach { case (k, vs) =>
- buf += "%d: %s".format(vs.size, k)
- vs flatMap fmt foreach (buf += " " + _)
+ buf += "%d: %s".format(vs.size, Prettifier.prettify(k))
+ vs flatMap prettify foreach (buf += " " + _)
}
buf.toList
}
@@ -215,45 +277,85 @@ class Power(repl: ILoop, intp: IMain) {
def #?[U](p: T => U) = this freqByFormatted p
}
- class PrintingConvenience[T](value: T)(implicit fmt: PCFormatter) {
- def > : Unit = >(_ => true)
+ class PrintingConvenience[T: Prettifier](value: T) {
+ val pretty = implicitly[Prettifier[T]]
+
+ def > { >(_ => true) }
def >(s: String): Unit = >(_ contains s)
def >(r: Regex): Unit = >(_ matches r.pattern.toString)
- def >(p: String => Boolean): Unit = fmt.grep(value, p)
+ def >(p: String => Boolean): Unit = pretty.grep(value, p)
}
+ class RichInputStream(in: InputStream)(implicit codec: Codec) {
+ def bytes(): Array[Byte] = io.Streamable.bytes(in)
+ def slurp(): String = io.Streamable.slurp(in)
+ }
+
protected trait Implicits1 {
- implicit def replPrinting[T](x: T)(implicit fmt: PCFormatter) = new PrintingConvenience[T](x)
+ // fallback
+ implicit def replPrinting[T](x: T)(implicit pretty: Prettifier[T] = Prettifier.default[T]) = new PrintingConvenience[T](x)
}
- object Implicits extends Implicits1 {
- implicit lazy val powerNameOrdering: Ordering[Name] = Ordering[String] on (_.toString)
- implicit lazy val powerSymbolOrdering: Ordering[Symbol] = Ordering[Name] on (_.name)
- implicit lazy val powerTypeOrdering: Ordering[Type] = Ordering[Symbol] on (_.typeSymbol)
+ trait Implicits2 extends Implicits1 with SharesGlobal[G] {
+ import global._
+ class RichSymbol(sym: Symbol) {
+ // convenient type application
+ def apply(targs: Type*): Type = typeRef(NoPrefix, sym, targs.toList)
+ }
object symbolSubtypeOrdering extends Ordering[Symbol] {
def compare(s1: Symbol, s2: Symbol) =
if (s1 eq s2) 0
else if (s1 isLess s2) -1
else 1
}
- implicit def replCollPrinting[T](xs: Traversable[T])(implicit fmt: PCFormatter) = new MultiPrintingConvenience[T](xs)
+ implicit lazy val powerNameOrdering: Ordering[Name] = Ordering[String] on (_.toString)
+ implicit lazy val powerSymbolOrdering: Ordering[Symbol] = Ordering[Name] on (_.name)
+ implicit lazy val powerTypeOrdering: Ordering[Type] = Ordering[Symbol] on (_.typeSymbol)
+
+ implicit def replCollPrinting[T: Prettifier](xs: TraversableOnce[T]): MultiPrintingConvenience[T] = new MultiPrintingConvenience[T](xs)
implicit def replInternalInfo[T: Manifest](x: T): InternalInfo[T] = new InternalInfo[T](Some(x))
- implicit object ReplDefaultFormatter extends PCFormatter {
- def apply(x: Any): List[String] = x match {
- case Tuple2(k, v) => List(apply(k) ++ Seq("->") ++ apply(v) mkString " ")
- case xs: Traversable[_] => (xs.toList flatMap apply).sorted.distinct
- case x => List("" + x)
+ implicit def replPrettifier[T] : Prettifier[T] = Prettifier.default[T]
+ implicit def replTypeApplication(sym: Symbol): RichSymbol = new RichSymbol(sym)
+ implicit def replInputStream(in: InputStream)(implicit codec: Codec): RichInputStream = new RichInputStream(in)
+ implicit def replInputStreamURL(url: URL)(implicit codec: Codec) = replInputStream(url.openStream())
+ }
+ object Implicits extends Implicits2 {
+ val global: G = Power.this.global
+ }
+
+ trait ReplUtilities {
+ def ?[T: Manifest] = InternalInfo[T]
+ def url(s: String) = {
+ try new URL(s)
+ catch { case _: MalformedURLException =>
+ if (Path(s).exists) Path(s).toURL
+ else new URL("http://" + s)
+ }
+ }
+ def sanitize(s: String): String = sanitize(s.getBytes())
+ def sanitize(s: Array[Byte]): String = (s map {
+ case x if x.toChar.isControl => '?'
+ case x => x.toChar
+ }).mkString
+
+ def strings(s: Seq[Byte]): List[String] = {
+ if (s.length == 0) Nil
+ else s dropWhile (_.toChar.isControl) span (x => !x.toChar.isControl) match {
+ case (next, rest) => next.map(_.toChar).mkString :: strings(rest)
}
}
+ def stringOf(x: Any): String = scala.runtime.ScalaRunTime.stringOf(x)
}
- object phased extends Phased {
- val global: Power.this.global.type = Power.this.global
+ lazy val rutil: ReplUtilities = new ReplUtilities { }
+ lazy val phased: Phased = new Phased with SharesGlobal[G] {
+ val global: G = Power.this.global
}
- def context(code: String) = analyzer.rootContext(unit(code))
- def source(code: String) = new BatchSourceFile("<console>", code)
- def unit(code: String) = new CompilationUnit(source(code))
- def trees(code: String): List[Tree] = parse(code) getOrElse Nil
- def typeOf(id: String): Type = intp.typeOfExpression(id) getOrElse NoType
+
+ def context(code: String) = analyzer.rootContext(unit(code))
+ def source(code: String) = new BatchSourceFile("<console>", code)
+ def unit(code: String) = new CompilationUnit(source(code))
+ def trees(code: String) = parse(code) getOrElse Nil
+ def typeOf(id: String): Type = intp.typeOfExpression(id) getOrElse NoType
override def toString = """
|** Power mode status **
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala b/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala
new file mode 100644
index 0000000000..a8287e3a9a
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala
@@ -0,0 +1,42 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc
+package interpreter
+
+import sys.{ Prop, BooleanProp }
+
+trait ReplConfig {
+
+ class ReplProps {
+ private def bool(name: String) = BooleanProp.keyExists(name)
+
+ val jlineDebug = bool("scala.tools.jline.internal.Log.debug")
+ val jlineTrace = bool("scala.tools.jline.internal.Log.trace")
+
+ val debug = bool("scala.repl.debug")
+ val trace = bool("scala.repl.trace")
+ val power = bool("scala.repl.power")
+
+ val replInitCode = Prop[JFile]("scala.repl.initcode")
+ val powerInitCode = Prop[JFile]("scala.repl.power.initcode")
+ val powerBanner = Prop[JFile]("scala.repl.power.banner")
+ }
+ lazy val replProps = new ReplProps
+
+ /** Debug output */
+ private[nsc] def repldbg(msg: String) = if (isReplDebug) Console println msg
+
+ /** Tracing */
+ private[nsc] def tracing[T](msg: String)(x: T): T = {
+ if (isReplDebug)
+ println("(" + msg + ") " + x)
+
+ x
+ }
+
+ def isReplDebug: Boolean = replProps.debug
+ def isReplPower: Boolean = replProps.power
+}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala b/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala
new file mode 100644
index 0000000000..cef46c963a
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala
@@ -0,0 +1,45 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc
+package interpreter
+
+import scala.collection.{ mutable, immutable }
+import scala.PartialFunction.cond
+import scala.reflect.NameTransformer
+import util.Chars
+
+trait ReplStrings {
+ // Longest common prefix
+ def longestCommonPrefix(xs: List[String]): String = {
+ if (xs.isEmpty || xs.contains("")) ""
+ else xs.head.head match {
+ case ch =>
+ if (xs.tail forall (_.head == ch)) "" + ch + longestCommonPrefix(xs map (_.tail))
+ else ""
+ }
+ }
+ /** Convert a string into code that can recreate the string.
+ * This requires replacing all special characters by escape
+ * codes. It does not add the surrounding " marks. */
+ def string2code(str: String): String = {
+ val res = new StringBuilder
+ for (c <- str) c match {
+ case '"' | '\'' | '\\' => res += '\\' ; res += c
+ case _ if c.isControl => res ++= Chars.char2uescape(c)
+ case _ => res += c
+ }
+ res.toString
+ }
+
+ def string2codeQuoted(str: String) =
+ "\"" + string2code(str) + "\""
+
+ def any2stringOf(x: Any, maxlen: Int) =
+ "scala.runtime.ScalaRunTime.replStringOf(%s, %s)".format(x, maxlen)
+
+ def words(s: String) = s.trim split "\\s+" filterNot (_ == "") toList
+ def isQuoted(s: String) = (s.length >= 2) && (s.head == s.last) && ("\"'" contains s.head)
+}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala b/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala
new file mode 100644
index 0000000000..2c5f5474af
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala
@@ -0,0 +1,20 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc
+package interpreter
+
+import java.lang.reflect.{ Method => JMethod }
+
+class ReplVals(final val r: ILoop) {
+ final val intp = r.intp
+ final val global = r.power.global
+ final val power = r.power
+ final val phased = r.power.phased
+ final val isettings = r.intp.isettings
+ final val completion = r.in.completion
+ final val history = r.in.history
+ final val rutil = r.power.rutil
+}
diff --git a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala b/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala
index e377a140af..fc286b4868 100644
--- a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala
@@ -63,7 +63,7 @@ trait TypeStrings {
private def tvarString(tvar: TypeVariable[_]): String = tvarString(tvar.getBounds.toList)
private def tvarString(bounds: List[AnyRef]): String = {
- val xs = bounds filterNot (_ == ObjectClass) collect { case x: Class[_] => x }
+ val xs = bounds filterNot (_ == ObjectClass) collect { case x: JClass => x }
if (xs.isEmpty) "_"
else scalaName(xs.head)
}
diff --git a/src/compiler/scala/tools/nsc/interpreter/package.scala b/src/compiler/scala/tools/nsc/interpreter/package.scala
index 13fb860128..1865e90e92 100644
--- a/src/compiler/scala/tools/nsc/interpreter/package.scala
+++ b/src/compiler/scala/tools/nsc/interpreter/package.scala
@@ -22,50 +22,17 @@ package scala.tools.nsc
* InteractiveReader contains { history: History, completion: Completion }
* IMain contains { global: Global }
*/
-package object interpreter {
+package object interpreter extends ReplConfig with ReplStrings {
+ type JFile = java.io.File
type JClass = java.lang.Class[_]
type JList[T] = java.util.List[T]
type JCollection[T] = java.util.Collection[T]
-
- private[nsc] val DebugProperty = "scala.repl.debug"
- private[nsc] val TraceProperty = "scala.repl.trace"
- private[nsc] val PowerProperty = "scala.repl.power"
- private[nsc] var isReplDebug = sys.props contains DebugProperty // Also set by -Yrepl-debug
- private[nsc] var isReplPower = sys.props contains PowerProperty
+ type InputStream = java.io.InputStream
+ type OutputStream = java.io.OutputStream
private[nsc] implicit def enrichClass[T](clazz: Class[T]) = new RichClass[T](clazz)
private[interpreter] implicit def javaCharSeqCollectionToScala(xs: JCollection[_ <: CharSequence]): List[String] = {
import collection.JavaConverters._
xs.asScala.toList map ("" + _)
}
-
- /** Debug output */
- private[nsc] def repldbg(msg: String) = if (isReplDebug) Console println msg
-
- /** Tracing */
- private[nsc] def tracing[T](msg: String)(x: T): T = {
- if (isReplDebug)
- println("(" + msg + ") " + x)
-
- x
- }
-
- // Longest common prefix
- def longestCommonPrefix(xs: List[String]): String = {
- if (xs.isEmpty || xs.contains("")) ""
- else xs.head.head match {
- case ch =>
- if (xs.tail forall (_.head == ch)) "" + ch + longestCommonPrefix(xs map (_.tail))
- else ""
- }
- }
-
- private[nsc] def words(s: String) = s.trim split "\\s+" toList
- private[nsc] def isQuoted(s: String) =
- (s.length >= 2) && (s.head == s.last) && ("\"'" contains s.head)
-
- /** Class objects */
- private[nsc] def classForName(name: String): Option[JClass] =
- try Some(Class forName name)
- catch { case _: ClassNotFoundException | _: SecurityException => None }
}
diff --git a/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala b/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala
new file mode 100644
index 0000000000..88efe1e0b5
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/io/ClassAndJarInfo.scala
@@ -0,0 +1,39 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc
+package io
+
+import java.net.URL
+import collection.JavaConverters._
+
+/** A convenience class for finding the jar with the bytecode for
+ * a given Class object and similar common tasks.
+ */
+class ClassAndJarInfo[T: ClassManifest] {
+ val man = classManifest[T]
+ def clazz = man.erasure
+
+ def baseOfPath(path: String) = path indexOf '!' match {
+ case -1 => path stripSuffix internalClassName
+ case idx => path take idx
+ }
+
+ def classUrl = clazz getResource simpleClassName + ".class"
+ def codeSource = protectionDomain.getCodeSource()
+ def internalClassName = internalName + ".class"
+ def internalName = clazz.getName.replace('.', '/')
+ def jarManifest = new JManifest(jarManifestUrl.openStream())
+ def jarManifestMainAttrs = jarManifest.getMainAttributes().asScala
+ def jarManifestUrl = new URL(baseOfPath("" + classUrl) + "!/META-INF/MANIFEST.MF")
+ def locationFile = File(locationUrl.toURI.getPath())
+ def locationUrl = if (codeSource == null) new URL("file:///") else codeSource.getLocation()
+ def protectionDomain = clazz.getProtectionDomain()
+ def rootClasspath = rootPossibles find (_.exists)
+ def rootFromLocation = Path(locationUrl.toURI.getPath())
+ def rootFromResource = Path(baseOfPath(classUrl.getPath) stripPrefix "file:")
+ def rootPossibles = Iterator(rootFromResource, rootFromLocation)
+ def simpleClassName = clazz.getName split """[$.]""" last
+}
diff --git a/src/compiler/scala/tools/nsc/io/File.scala b/src/compiler/scala/tools/nsc/io/File.scala
index 60d9a0f169..b11151ab7e 100644
--- a/src/compiler/scala/tools/nsc/io/File.scala
+++ b/src/compiler/scala/tools/nsc/io/File.scala
@@ -137,6 +137,10 @@ class File(jfile: JFile)(implicit constructorCodec: Codec) extends Path(jfile) w
finally out close
}
+ def safeSlurp(): Option[String] =
+ try Some(slurp())
+ catch { case _: IOException => None }
+
def copyTo(destPath: Path, preserveFileDate: Boolean = false): Boolean = {
val CHUNK = 1024 * 1024 * 16 // 16 MB
val dest = destPath.toFile
diff --git a/src/compiler/scala/tools/nsc/io/Jar.scala b/src/compiler/scala/tools/nsc/io/Jar.scala
index a9f0acaa00..bd7dbde5ec 100644
--- a/src/compiler/scala/tools/nsc/io/Jar.scala
+++ b/src/compiler/scala/tools/nsc/io/Jar.scala
@@ -1,3 +1,8 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2011 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
package scala.tools.nsc
package io
@@ -5,6 +10,27 @@ import java.io.{ InputStream, OutputStream, IOException, FileNotFoundException,
import java.util.jar._
import collection.JavaConverters._
import Attributes.Name
+import util.ClassPath
+
+// Attributes.Name instances:
+//
+// static Attributes.Name CLASS_PATH
+// static Attributes.Name CONTENT_TYPE
+// static Attributes.Name EXTENSION_INSTALLATION
+// static Attributes.Name EXTENSION_LIST
+// static Attributes.Name EXTENSION_NAME
+// static Attributes.Name IMPLEMENTATION_TITLE
+// static Attributes.Name IMPLEMENTATION_URL
+// static Attributes.Name IMPLEMENTATION_VENDOR
+// static Attributes.Name IMPLEMENTATION_VENDOR_ID
+// static Attributes.Name IMPLEMENTATION_VERSION
+// static Attributes.Name MAIN_CLASS
+// static Attributes.Name MANIFEST_VERSION
+// static Attributes.Name SEALED
+// static Attributes.Name SIGNATURE_VERSION
+// static Attributes.Name SPECIFICATION_TITLE
+// static Attributes.Name SPECIFICATION_VENDOR
+// static Attributes.Name SPECIFICATION_VERSION
class Jar(file: File) extends Iterable[JarEntry] {
def this(path: String) = this(File(path))
@@ -74,21 +100,6 @@ object Jar {
def isJarOrZip(f: Path, examineFile: Boolean): Boolean =
f.hasExtension("zip", "jar") || (examineFile && magicNumberIsZip(f))
- def locateByClass(clazz: Class[_]): Option[File] = {
- try Some(File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()))
- catch { case _: Exception => None }
- }
- /** Walks upward from wherever the scala library jar is searching for
- * the given jar name. This approach finds the scala library jar in the
- * release layout and in trunk builds going up from pack.
- */
- def locateByName(name: String): Option[File] = {
- def toSrc(d: Directory) = d.dirs.toList map (_ / name)
- def walk(d: Directory) = d.parents flatMap toSrc find (_.isFile) map (_.toFile)
-
- locateByClass(classOf[ScalaObject]) flatMap (x => walk(x.parent))
- }
-
def create(file: File, sourceDir: Directory, mainClass: String): File = {
val writer = new Jar(file).jarWriter()
writer.manifest(Name.MANIFEST_VERSION) = "1.0"
diff --git a/src/compiler/scala/tools/nsc/io/Sources.scala b/src/compiler/scala/tools/nsc/io/Sources.scala
index c763b04511..35c7a504a5 100644
--- a/src/compiler/scala/tools/nsc/io/Sources.scala
+++ b/src/compiler/scala/tools/nsc/io/Sources.scala
@@ -4,7 +4,6 @@ package io
import util.ClassPath
import java.util.concurrent.{ Future, ConcurrentHashMap, ExecutionException }
import java.util.zip.ZipException
-import Jar.{ isJarOrZip, locateByClass }
import collection.JavaConverters._
import Properties.{ envOrElse, propOrElse }
@@ -20,7 +19,7 @@ class Sources(val path: String) {
private val partitioned = ClassPath toPaths expandedPath partition (_.isDirectory)
val dirs = partitioned._1 map (_.toDirectory)
- val jars = partitioned._2 filter isJarOrZip map (_.toFile)
+ val jars = partitioned._2 filter Jar.isJarOrZip map (_.toFile)
val (isDone, force) = {
val f1 = spawn(calculateDirs())
val f2 = spawn(calculateJars())
@@ -63,25 +62,12 @@ trait LowPrioritySourcesImplicits {
}
object Sources extends LowPrioritySourcesImplicits {
- // Examples of what libraryJar might be, each of which we'd like to find
- // the source files automatically:
- //
- // /scala/trunk/build/pack/lib/scala-library.jar
- // /scala/trunk/build/quick/classes/library
- // /scala/inst/scala-2.9.0.r24213-b20110206233447/lib/scala-library.jar
- private def libraryJar = locateByClass(classOf[ScalaObject]) map (_.toAbsolute.path)
- private def autoSourcePaths: List[String] = libraryJar.toList flatMap { lib =>
- val markers = List("build/pack/lib", "build/quick/classes", "scala-library.jar")
- markers filter (lib contains _) flatMap { m =>
- val dir = Path(lib take lib.indexOf(m)) / "src"
-
- if (dir.exists) ClassPath.expandDir(dir.path)
- else Nil
- }
- }
+ private def libraryInits = ClassPath.scalaLibrary.toList flatMap (_.toAbsolute.parents)
+ private def librarySourceDir = libraryInits map (_ / "src") find (_.isDirectory)
+ private def expandedSourceDir = librarySourceDir.toList flatMap (ClassPath expandDir _.path)
- val sourcePathEnv = envOrElse("SOURCEPATH", "")
- val defaultSources = apply(autoSourcePaths :+ sourcePathEnv: _*)
+ val sourcePathProp = sys.props.traceSourcePath.value
+ val defaultSources = apply(expandedSourceDir :+ sourcePathProp: _*)
def apply(paths: String*): Sources = new Sources(ClassPath.join(paths: _*))
}
diff --git a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala
index 3de17d6b56..c600f6364b 100644
--- a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala
+++ b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala
@@ -305,14 +305,14 @@ trait JavaScanners extends ast.parser.ScannersCommon {
*/
private def fetchToken() {
if (token == EOF) return
- lastPos = in.cpos - 1 // Position.encode(in.cline, in.ccol)
+ lastPos = in.cpos - 1
//var index = bp
while (true) {
in.ch match {
case ' ' | '\t' | CR | LF | FF =>
in.next
case _ =>
- pos = in.cpos // Position.encode(in.cline, in.ccol)
+ pos = in.cpos
(in.ch: @switch) match {
case 'A' | 'B' | 'C' | 'D' | 'E' |
'F' | 'G' | 'H' | 'I' | 'J' |
diff --git a/src/compiler/scala/tools/nsc/plugins/Plugins.scala b/src/compiler/scala/tools/nsc/plugins/Plugins.scala
index 6205633a7c..64e38fee9a 100644
--- a/src/compiler/scala/tools/nsc/plugins/Plugins.scala
+++ b/src/compiler/scala/tools/nsc/plugins/Plugins.scala
@@ -115,6 +115,6 @@ trait Plugins {
/** Summary of the options for all loaded plugins */
def pluginOptionsHelp: String =
(for (plug <- roughPluginsList ; help <- plug.optionsHelp) yield {
- "Options for plugin %s:\n%s\n".format(plug.name, help)
+ "\nOptions for plugin '%s':\n%s\n".format(plug.name, help)
}) mkString
}
diff --git a/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala
index 6f130b9e74..be2f8a370a 100644
--- a/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/AbsScalaSettings.scala
@@ -9,17 +9,19 @@ package settings
trait AbsScalaSettings {
self: AbsSettings =>
- type BooleanSetting <: AbsSetting { type T = Boolean }
- type ChoiceSetting <: AbsSetting { type T = String }
- type IntSetting <: AbsSetting { type T = Int }
- type MultiStringSetting <: AbsSetting { type T = List[String] }
- type PathSetting <: AbsSetting { type T = String }
- type PhasesSetting <: AbsSetting { type T = List[String] }
- type StringSetting <: AbsSetting { type T = String }
- type PrefixSetting <: AbsSetting { type T = List[String] }
+ type Setting <: AbsSetting
+
+ type BooleanSetting <: Setting { type T = Boolean }
+ type ChoiceSetting <: Setting { type T = String }
+ type IntSetting <: Setting { type T = Int }
+ type MultiStringSetting <: Setting { type T = List[String] }
+ type PathSetting <: Setting { type T = String }
+ type PhasesSetting <: Setting { type T = List[String] }
+ type StringSetting <: Setting { type T = String }
+ type PrefixSetting <: Setting { type T = List[String] }
type OutputDirs
- type OutputSetting <: AbsSetting
+ type OutputSetting <: Setting
def BooleanSetting(name: String, descr: String): BooleanSetting
def ChoiceSetting(name: String, helpArg: String, descr: String, choices: List[String], default: String): ChoiceSetting
diff --git a/src/compiler/scala/tools/nsc/settings/AbsSettings.scala b/src/compiler/scala/tools/nsc/settings/AbsSettings.scala
index f70e6dc7d3..82e311028b 100644
--- a/src/compiler/scala/tools/nsc/settings/AbsSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/AbsSettings.scala
@@ -75,8 +75,10 @@ trait AbsSettings {
*/
def withAbbreviation(name: String): this.type
def withHelpSyntax(help: String): this.type
+ def withDeprecationMessage(msg: String): this.type
def helpSyntax: String = name
+ def deprecationMessage: Option[String] = None
def abbreviations: List[String] = Nil
def dependencies: List[(Setting, String)] = Nil
def respondsTo(label: String) = (name == label) || (abbreviations contains label)
@@ -122,10 +124,11 @@ trait AbsSettings {
/** These categorizations are so the help output shows -X and -P among
* the standard options and -Y among the advanced options.
*/
- def isAdvanced = name match { case "-Y" => true ; case "-X" => false ; case _ => name startsWith "-X" }
- def isPrivate = name match { case "-Y" => false ; case _ => name startsWith "-Y" }
- def isStandard = !isAdvanced && !isPrivate
- def isForDebug = isPrivate && (name contains ("-debug")) // by convention, i.e. -Ytyper-debug
+ def isAdvanced = name match { case "-Y" => true ; case "-X" => false ; case _ => name startsWith "-X" }
+ def isPrivate = name match { case "-Y" => false ; case _ => name startsWith "-Y" }
+ def isStandard = !isAdvanced && !isPrivate
+ def isForDebug = name endsWith "-debug" // by convention, i.e. -Ytyper-debug
+ def isDeprecated = deprecationMessage.isDefined
def compare(that: Setting): Int = name compare that.name
diff --git a/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala b/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala
index d7bec764b3..0908ea60b6 100644
--- a/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/AestheticSettings.scala
@@ -25,7 +25,7 @@ trait AestheticSettings {
def fatalWarnings = settings.Xwarnfatal.value
def logClasspath = settings.Ylogcp.value
def printStats = settings.Ystatistics.value
- def richExes = settings.YrichExes.value
+ def richExes = settings.YrichExes.value || sys.props.traceSourcePath.isSet
def target = settings.target.value
def unchecked = settings.unchecked.value
def verbose = settings.verbose.value
diff --git a/src/compiler/scala/tools/nsc/settings/FscSettings.scala b/src/compiler/scala/tools/nsc/settings/FscSettings.scala
index a219148b16..bb62750026 100644
--- a/src/compiler/scala/tools/nsc/settings/FscSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/FscSettings.scala
@@ -8,28 +8,45 @@ package nsc
package settings
import util.ClassPath
+import io.{ Directory, Path, AbstractFile }
class FscSettings(error: String => Unit) extends Settings(error) {
outer =>
- def this() = this(Console.println)
+ locally {
+ disable(prompt)
+ disable(resident)
+ }
+ val currentDir = StringSetting ("-current-dir", "path", "Base directory for resolving relative paths", "").internalOnly()
val reset = BooleanSetting("-reset", "Reset compile server caches")
val shutdown = BooleanSetting("-shutdown", "Shutdown compile server")
val server = StringSetting ("-server", "hostname:portnumber", "Specify compile server socket", "")
- val preferIPv4 = BooleanSetting("-ipv4", "Use IPv4 rather than IPv6 for the server socket")
- val absClasspath = BooleanSetting("-absolute-cp", "Make classpath elements absolute paths before sending to server") .
- withPostSetHook (_ => absolutizeClasspath())
+ val preferIPv4 = BooleanSetting("-ipv4", "Use IPv4 rather than IPv6 for the server socket")
val idleMins = IntSetting ("-max-idle", "Set idle timeout in minutes for fsc (use 0 for no timeout)",
30, Some(0, Int.MaxValue), (_: String) => None)
- disable(prompt)
- disable(resident)
+ // For improved help output, separating fsc options from the others.
+ def fscSpecific = Set[Settings#Setting](
+ currentDir, reset, shutdown, server, preferIPv4, idleMins
+ )
+ val isFscSpecific: String => Boolean = fscSpecific map (_.name)
+
+ /** If a setting (other than a PathSetting) represents a path or paths.
+ * For use in absolutization.
+ */
+ private def holdsPath = Set[Settings#Setting](
+ d, dependencyfile, pluginsDir, Ygenjavap
+ )
- // Make the classpath absolute: for going from client to server.
- private def absolutizeClasspath() {
- userSetSettings collect {
- case x: PathSetting => x.value = ClassPath.makeAbsolute(x.value)
+ /** All user set settings rewritten with absolute paths. */
+ def absolutize(root: Path) {
+ def rewrite(p: String) = (root resolve Path(p)).normalize.path
+ userSetSettings foreach {
+ case p: OutputSetting => p.outputDirs setSingleOutput AbstractFile.getDirectory(rewrite(p.value))
+ case p: PathSetting => p.value = ClassPath.map(p.value, rewrite)
+ case p: StringSetting => if (holdsPath(p)) p.value = rewrite(p.value)
+ case _ => ()
}
}
}
diff --git a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
index b485d4725a..477c2a528e 100644
--- a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
@@ -345,6 +345,10 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal
private var dependency: Option[(Setting, String)] = None
override def dependencies = dependency.toList
def dependsOn(s: Setting, value: String): this.type = { dependency = Some((s, value)); this }
+
+ private var _deprecationMessage: Option[String] = None
+ override def deprecationMessage = _deprecationMessage
+ def withDeprecationMessage(msg: String): this.type = { _deprecationMessage = Some(msg) ; this }
}
/** A setting represented by an integer */
@@ -479,13 +483,14 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal
/** Set the output directory. */
class OutputSetting private[nsc](
- outputDirs: OutputDirs,
+ private[nsc] val outputDirs: OutputDirs,
default: String)
extends StringSetting("-d", "directory", "Specify where to place generated class files", default) {
value = default
override def value_=(str: String) {
super.value_=(str)
- outputDirs.setSingleOutput(str)
+ try outputDirs.setSingleOutput(str)
+ catch { case FatalError(msg) => errorFn(msg) }
}
}
@@ -559,7 +564,7 @@ class MutableSettings(val errorFn: String => Unit) extends AbsSettings with Scal
protected var v: List[String] = Nil
override def value = if (v contains "all") List("all") else super.value
private lazy val (numericValues, stringValues) =
- value partition (_ forall (ch => ch.isDigit || ch == '-'))
+ value filterNot (_ == "" ) partition (_ forall (ch => ch.isDigit || ch == '-'))
/** A little ad-hoc parsing. If a string is not the name of a phase, it can also be:
* a phase id: 5
diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
index 7405ca0b3d..a92b5d7034 100644
--- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
@@ -79,7 +79,6 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings {
val sourceReader = StringSetting ("-Xsource-reader", "classname", "Specify a custom method for reading source files.", "")
val Xwarnfatal = BooleanSetting ("-Xfatal-warnings", "Fail the compilation if there are any warnings.")
- val Xwarninit = BooleanSetting ("-Xwarninit", "Warn about possible changes in initialization semantics.")
val Xchecknull = BooleanSetting ("-Xcheck-null", "Emit warning on selection of nullable reference.")
// Experimental Extensions
@@ -129,21 +128,25 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings {
val Ynosqueeze = BooleanSetting ("-Yno-squeeze", "Disable creation of compact code in matching.")
val Ystatistics = BooleanSetting ("-Ystatistics", "Print compiler statistics.") .
withPostSetHook(set => util.Statistics.enabled = set.value)
- val stop = PhasesSetting ("-Ystop", "Stop after phase")
+ val stopAfter = PhasesSetting ("-Ystop-after", "Stop after given phase") withAbbreviation ("-stop") // backward compat
+ val stopBefore = PhasesSetting ("-Ystop-before", "Stop before given phase")
val refinementMethodDispatch =
ChoiceSetting ("-Ystruct-dispatch", "policy", "structural method dispatch policy",
List("no-cache", "mono-cache", "poly-cache", "invoke-dynamic"), "poly-cache")
val Yrangepos = BooleanSetting ("-Yrangepos", "Use range positions for syntax trees.")
- val YrichExes = BooleanSetting ("-Yrich-exceptions", "More revealing exceptions. Set SOURCEPATH to java/scala source jars.")
+ val YrichExes = BooleanSetting ("-Yrich-exceptions",
+ "Fancier exceptions. Set source search path with -D" +
+ sys.SystemProperties.traceSourcePath.key)
val Yidedebug = BooleanSetting ("-Yide-debug", "Generate, validate and output trees using the interactive compiler.")
val Ybuilderdebug = ChoiceSetting ("-Ybuilder-debug", "manager", "Compile using the specified build manager.", List("none", "refined", "simple"), "none")
val Ybuildmanagerdebug =
BooleanSetting ("-Ybuild-manager-debug", "Generate debug information for the Refined Build Manager compiler.")
- val Ytyperdebug = BooleanSetting ("-Ytyper-debug", "Trace all type assignements.")
+ val Ytyperdebug = BooleanSetting ("-Ytyper-debug", "Trace all type assignments.")
val Ypmatdebug = BooleanSetting ("-Ypmat-debug", "Trace all pattern matcher activity.")
val Yrepldebug = BooleanSetting ("-Yrepl-debug", "Trace all repl activity.") .
- withPostSetHook(set => interpreter.isReplDebug = true)
+ withPostSetHook(_ => interpreter.replProps.debug setValue true)
val Ycompletion = BooleanSetting ("-Ycompletion-debug", "Trace all tab completion activity.")
+ val Ydocdebug = BooleanSetting ("-Ydoc-debug", "Trace all scaladoc activity.")
val Ypmatnaive = BooleanSetting ("-Ypmat-naive", "Desugar matches as naively as possible.")
val Ynotnull = BooleanSetting ("-Ynotnull", "Enable (experimental and incomplete) scala.NotNull.")
val YdepMethTpes = BooleanSetting ("-Ydependent-method-types", "Allow dependent method types.")
@@ -153,6 +156,8 @@ trait ScalaSettings extends AbsScalaSettings with StandardScalaSettings {
val exposeEmptyPackage = BooleanSetting("-Yexpose-empty-package", "Internal only: expose the empty package.").internalOnly()
+ def stop = stopAfter
+
/**
* Warnings
*/
diff --git a/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala
index 3975ae4998..cc960e55dd 100644
--- a/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala
@@ -35,6 +35,7 @@ trait StandardScalaSettings {
val g = ChoiceSetting ("-g", "level", "Set level of generated debugging info.", List("none", "source", "line", "vars", "notailcalls"), "vars")
val help = BooleanSetting ("-help", "Print a synopsis of standard options")
val make = ChoiceSetting ("-make", "policy", "Recompilation detection policy", List("all", "changed", "immediate", "transitive", "transitivenocp"), "all")
+ . withDeprecationMessage ("this option is unmaintained. Use sbt or an IDE for selective recompilation.")
val nowarn = BooleanSetting ("-nowarn", "Generate no warnings")
val optimise: BooleanSetting // depends on post hook which mutates other settings
val print = BooleanSetting ("-print", "Print program with Scala-specific features removed.")
diff --git a/src/compiler/scala/tools/nsc/symtab/Definitions.scala b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
index 118d650586..1134f0e15f 100644
--- a/src/compiler/scala/tools/nsc/symtab/Definitions.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Definitions.scala
@@ -539,10 +539,10 @@ trait Definitions extends reflect.generic.StandardDefinitions {
var Object_synchronized: Symbol = _
lazy val Object_isInstanceOf = newPolyMethod(
ObjectClass, "$isInstanceOf",
- tparam => MethodType(List(), booltype)) setFlag FINAL
+ tparam => MethodType(List(), booltype)) setFlag (FINAL | SYNTHETIC)
lazy val Object_asInstanceOf = newPolyMethod(
ObjectClass, "$asInstanceOf",
- tparam => MethodType(List(), tparam.typeConstructor)) setFlag FINAL
+ tparam => MethodType(List(), tparam.typeConstructor)) setFlag (FINAL | SYNTHETIC)
def Object_getClass = getMember(ObjectClass, nme.getClass_)
def Object_clone = getMember(ObjectClass, nme.clone_)
@@ -614,6 +614,10 @@ trait Definitions extends reflect.generic.StandardDefinitions {
case result => result
}
}
+ def packageExists(packageName: String): Boolean = {
+ try getModuleOrClass(newTermName(packageName)).isPackage
+ catch { case _: MissingRequirementError => false }
+ }
/** If you're looking for a class, pass a type name.
* If a module, a term name.
@@ -741,7 +745,8 @@ trait Definitions extends reflect.generic.StandardDefinitions {
case _ => tp
}
def flatNameString(sym: Symbol, separator: Char): String =
- if (sym.owner.isPackageClass) sym.fullName('.') + (if (sym.isModuleClass) "$" else "")
+ if (sym == NoSymbol) "" // be more resistant to error conditions, e.g. neg/t3222.scala
+ else if (sym.owner.isPackageClass) sym.fullName('.') + (if (sym.isModuleClass) "$" else "")
else flatNameString(sym.owner, separator) + "$" + sym.simpleName;
def signature1(etp: Type): String = {
if (etp.typeSymbol == ArrayClass) "[" + signature1(erasure(etp.normalize.typeArgs.head))
diff --git a/src/compiler/scala/tools/nsc/symtab/Symbols.scala b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
index d7f9063ec6..d17077b129 100644
--- a/src/compiler/scala/tools/nsc/symtab/Symbols.scala
+++ b/src/compiler/scala/tools/nsc/symtab/Symbols.scala
@@ -59,6 +59,7 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
// annotations
private var rawannots: List[AnnotationInfoBase] = Nil
+ def rawAnnotations = rawannots
/* Used in namer to check whether annotations were already assigned or not */
def hasAssignedAnnotations = rawannots.nonEmpty
@@ -1400,8 +1401,17 @@ trait Symbols extends reflect.generic.Symbols { self: SymbolTable =>
final def overridingSymbol(ofclazz: Symbol): Symbol =
if (isClassConstructor) NoSymbol else matchingSymbol(ofclazz, ofclazz.thisType)
+ /** Returns all symbols overriden by this symbol
+ */
final def allOverriddenSymbols: List[Symbol] =
if (!owner.isClass) Nil
+ else owner.ancestors map overriddenSymbol filter (_ != NoSymbol)
+
+ /** Returns all symbols overridden by this symbol, plus all matching symbols
+ * defined in parents of the selftype
+ */
+ final def extendedOverriddenSymbols: List[Symbol] =
+ if (!owner.isClass) Nil
else owner.thisSym.ancestors map overriddenSymbol filter (_ != NoSymbol)
/** The symbol accessed by a super in the definition of this symbol when
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index 4eca9f140e..96ff17e897 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -933,7 +933,7 @@ abstract class ClassfileParser {
throw new RuntimeException("Scala class file does not contain Scala annotation")
}
if (settings.debug.value)
- log("" + sym + "; annotations = " + sym.annotations)
+ log("" + sym + "; annotations = " + sym.rawAnnotations)
} else
in.skip(attrLen)
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
index b57f89c020..0940598bd2 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
@@ -582,12 +582,12 @@ abstract class Pickler extends SubComponent {
case ClassInfoType(parents, decls, clazz) =>
writeRef(clazz); writeRefs(parents); CLASSINFOtpe
case mt @ MethodType(formals, restpe) =>
- writeRef(restpe); writeRefs(formals)
- if (mt.isImplicit) IMPLICITMETHODtpe
- else METHODtpe
- case mt @ NullaryMethodType(restpe) => // reuse POLYtpe since those can never have an empty list of tparams -- TODO: is there any way this can come back and bite us in the bottom?
- // ugliness and thrift aside, this should make this somewhat more backward compatible
- // (I'm not sure how old scalac's would deal with nested PolyTypes, as these used to be folded into one)
+ writeRef(restpe); writeRefs(formals) ; METHODtpe
+ case mt @ NullaryMethodType(restpe) =>
+ // reuse POLYtpe since those can never have an empty list of tparams.
+ // TODO: is there any way this can come back and bite us in the bottom?
+ // ugliness and thrift aside, this should make this somewhat more backward compatible
+ // (I'm not sure how old scalac's would deal with nested PolyTypes, as these used to be folded into one)
writeRef(restpe); writeRefs(Nil); POLYtpe
case PolyType(tparams, restpe) => // invar: tparams nonEmpty
writeRef(restpe); writeRefs(tparams); POLYtpe
@@ -1037,8 +1037,7 @@ abstract class Pickler extends SubComponent {
case ClassInfoType(parents, decls, clazz) =>
print("CLASSINFOtpe "); printRef(clazz); printRefs(parents);
case mt @ MethodType(formals, restpe) =>
- print(if (mt.isImplicit) "IMPLICITMETHODtpe " else "METHODtpe ");
- printRef(restpe); printRefs(formals)
+ print("METHODtpe"); printRef(restpe); printRefs(formals)
case PolyType(tparams, restpe) =>
print("POLYtpe "); printRef(restpe); printRefs(tparams);
case ExistentialType(tparams, restpe) =>
diff --git a/src/compiler/scala/tools/nsc/transform/CleanUp.scala b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
index 8d0ecd247b..9980db6ff5 100644
--- a/src/compiler/scala/tools/nsc/transform/CleanUp.scala
+++ b/src/compiler/scala/tools/nsc/transform/CleanUp.scala
@@ -512,17 +512,31 @@ abstract class CleanUp extends Transform with ast.TreeDSL {
* constructor. */
case Template(parents, self, body) =>
localTyper = typer.atOwner(tree, currentClass)
+ var savedNewStaticMembers : mutable.Buffer[Tree] = null
+ var savedNewStaticInits : mutable.Buffer[Tree] = null
+ var savedSymbolsStoredAsStatic : mutable.Map[String, Symbol] = null
+ if(forMSIL) {
+ savedNewStaticMembers = newStaticMembers.clone
+ savedNewStaticInits = newStaticInits.clone
+ savedSymbolsStoredAsStatic = symbolsStoredAsStatic.clone
+ }
newStaticMembers.clear
newStaticInits.clear
symbolsStoredAsStatic.clear
- val transformedTemplate: Template =
- if (!forMSIL || forMSIL) {
- var newBody =
- transformTrees(body)
- treeCopy.Template(tree, parents, self, transformTrees(newStaticMembers.toList) ::: newBody)
- }
- else super.transform(tree).asInstanceOf[Template]
- addStaticInits(transformedTemplate) // postprocess to include static ctors
+ val transformedTemplate: Template = {
+ var newBody = transformTrees(body)
+ treeCopy.Template(tree, parents, self, transformTrees(newStaticMembers.toList) ::: newBody)
+ }
+ val res = addStaticInits(transformedTemplate) // postprocess to include static ctors
+ newStaticMembers.clear
+ newStaticInits.clear
+ symbolsStoredAsStatic.clear
+ if(forMSIL) {
+ newStaticMembers ++= savedNewStaticMembers
+ newStaticInits ++= savedNewStaticInits
+ symbolsStoredAsStatic ++= savedSymbolsStoredAsStatic
+ }
+ res
case Literal(c) if (c.tag == ClassTag) && !forMSIL=>
val tpe = c.typeValue
diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala
index a9e4c01d9f..c1efe4843d 100644
--- a/src/compiler/scala/tools/nsc/transform/Constructors.scala
+++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala
@@ -70,7 +70,6 @@ abstract class Constructors extends Transform with ast.TreeDSL {
}
}
- var thisRefSeen: Boolean = false
var usesSpecializedField: Boolean = false
// A transformer for expressions that go into the constructor
@@ -78,6 +77,7 @@ abstract class Constructors extends Transform with ast.TreeDSL {
def isParamRef(sym: Symbol) =
sym.isParamAccessor &&
sym.owner == clazz &&
+ !(clazz isSubClass DelayedInitClass) &&
!(sym.isGetter && sym.accessed.isVariable) &&
!sym.isSetter
private def possiblySpecialized(s: Symbol) = specializeTypes.specializedTypeVars(s).nonEmpty
@@ -95,16 +95,9 @@ abstract class Constructors extends Transform with ast.TreeDSL {
// references to parameter accessor field of own class become references to parameters
gen.mkAttributedIdent(parameter(tree.symbol)) setPos tree.pos
case Select(_, _) =>
- thisRefSeen = true
if (specializeTypes.specializedTypeVars(tree.symbol).nonEmpty)
usesSpecializedField = true
super.transform(tree)
- case This(_) =>
- thisRefSeen = true
- super.transform(tree)
- case Super(_, _) =>
- thisRefSeen = true
- super.transform(tree)
case _ =>
super.transform(tree)
}
@@ -117,16 +110,8 @@ abstract class Constructors extends Transform with ast.TreeDSL {
// Should tree be moved in front of super constructor call?
def canBeMoved(tree: Tree) = tree match {
- //todo: eliminate thisRefSeen
- case ValDef(mods, _, _, _) =>
- if (settings.Xwarninit.value)
- if (!(mods hasFlag PRESUPER | PARAMACCESSOR) && !thisRefSeen &&
- { val g = tree.symbol.getter(tree.symbol.owner);
- g != NoSymbol && !g.allOverriddenSymbols.isEmpty
- })
- unit.warning(tree.pos, "the semantics of this definition has changed;\nthe initialization is no longer be executed before the superclass is called")
- (mods hasFlag PRESUPER | PARAMACCESSOR)// || !thisRefSeen && (!settings.future.value && !settings.checkInit.value)
- case _ => false
+ case ValDef(mods, _, _, _) => (mods hasFlag PRESUPER | PARAMACCESSOR)
+ case _ => false
}
// Create an assignment to class field `to' with rhs `from'
@@ -230,12 +215,13 @@ abstract class Constructors extends Transform with ast.TreeDSL {
// the symbol is an outer accessor of a final class which does not override another outer accessor. )
def maybeOmittable(sym: Symbol) = sym.owner == clazz && (
sym.isParamAccessor && sym.isPrivateLocal ||
- sym.isOuterAccessor && sym.owner.isFinal && sym.allOverriddenSymbols.isEmpty
+ sym.isOuterAccessor && sym.owner.isFinal && sym.allOverriddenSymbols.isEmpty &&
+ !(clazz isSubClass DelayedInitClass)
)
// Is symbol known to be accessed outside of the primary constructor,
// or is it a symbol whose definition cannot be omitted anyway?
- def mustbeKept(sym: Symbol) = !maybeOmittable(sym) || accessedSyms(sym)
+ def mustbeKept(sym: Symbol) = !maybeOmittable(sym) || (accessedSyms contains sym)
// A traverser to set accessedSyms and outerAccessors
val accessTraverser = new Traverser {
@@ -593,7 +579,10 @@ abstract class Constructors extends Transform with ast.TreeDSL {
// Unlink all fields that can be dropped from class scope
for (sym <- clazz.info.decls.toList)
- if (!mustbeKept(sym)) clazz.info.decls unlink sym
+ if (!mustbeKept(sym)) {
+ // println("dropping "+sym+sym.locationString)
+ clazz.info.decls unlink sym
+ }
// Eliminate all field definitions that can be dropped from template
treeCopy.Template(impl, impl.parents, impl.self,
diff --git a/src/compiler/scala/tools/nsc/transform/Erasure.scala b/src/compiler/scala/tools/nsc/transform/Erasure.scala
index ca39ec4a4d..f9f2f94917 100644
--- a/src/compiler/scala/tools/nsc/transform/Erasure.scala
+++ b/src/compiler/scala/tools/nsc/transform/Erasure.scala
@@ -209,7 +209,7 @@ abstract class Erasure extends AddInterfaces
!sym.isHigherOrderTypeParameter &&
sym.isTypeParameterOrSkolem && (
(initialSymbol.enclClassChain.exists(sym isNestedIn _)) ||
- traceSig.seq("isMethod", Seq(initialSymbol, initialSymbol.typeParams)) {
+ traceSig("isMethod", (initialSymbol, initialSymbol.typeParams)) {
(initialSymbol.isMethod && initialSymbol.typeParams.contains(sym))
}
)
@@ -229,7 +229,8 @@ abstract class Erasure extends AddInterfaces
}
}
// for debugging signatures: traces logic given system property
- private val traceSig = util.Tracer(sys.props contains "scalac.sigs.trace")
+ private val traceProp = sys.BooleanProp keyExists "scalac.sigs.trace"
+ private val traceSig = util.Tracer(traceProp)
/** This object is only used for sanity testing when -check:genjvm is set.
* In that case we make sure that the erasure of the `normalized' type
@@ -356,7 +357,7 @@ abstract class Erasure extends AddInterfaces
}
else if (sym.isClass) {
val preRebound = pre.baseType(sym.owner) // #2585
- traceSig.seq("sym.isClass", Seq(sym.ownerChain, preRebound, sym0.enclClassChain)) {
+ traceSig("sym.isClass", (sym.ownerChain, preRebound, sym0.enclClassChain)) {
dotCleanup(
(
if (needsJavaSig(preRebound)) {
@@ -389,7 +390,7 @@ abstract class Erasure extends AddInterfaces
def paramSig(tsym: Symbol) = tsym.name + boundSig(hiBounds(tsym.info.bounds))
val paramString = if (toplevel) tparams map paramSig mkString ("<", "", ">") else ""
- traceSig.seq("PolyType", Seq(tparams, restpe))(paramString + jsig(restpe))
+ traceSig("PolyType", (tparams, restpe))(paramString + jsig(restpe))
case MethodType(params, restpe) =>
"("+(params map (_.tpe) map (jsig(_))).mkString+")"+
(if (restpe.typeSymbol == UnitClass || sym0.isConstructor) VOID_TAG.toString else jsig(restpe))
@@ -408,7 +409,7 @@ abstract class Erasure extends AddInterfaces
else jsig(etp)
}
}
- traceSig.seq("javaSig", Seq(sym0, info)) {
+ traceSig("javaSig", (sym0, info)) {
if (needsJavaSig(info)) {
try Some(jsig(info, toplevel = true))
catch { case ex: UnknownSig => None }
diff --git a/src/compiler/scala/tools/nsc/transform/LiftCode.scala b/src/compiler/scala/tools/nsc/transform/LiftCode.scala
index ad6ccaff59..b52419f7ca 100644
--- a/src/compiler/scala/tools/nsc/transform/LiftCode.scala
+++ b/src/compiler/scala/tools/nsc/transform/LiftCode.scala
@@ -51,9 +51,6 @@ abstract class LiftCode extends Transform with Reifiers {
def className(value: AnyRef): String = value match {
case _ :: _ => "scala.$colon$colon"
case reflect.MethodType(_, _) =>
- if (value.isInstanceOf[reflect.ImplicitMethodType])
- "scala.reflect.ImplicitMethodType"
- else
"scala.reflect.MethodType"
case x:Product =>
"scala.reflect."+x.productPrefix //caseName
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index cd845ab9e5..f966e1476c 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -783,9 +783,9 @@ trait Namers { self: Analyzer =>
// if default getters (for constructor defaults) need to be added to that module, here's the namer
// to use. clazz is the ModuleClass. sourceModule works also for classes defined in methods.
val module = clazz.sourceModule
- if (classAndNamerOfModule contains module) {
- val (cdef, _) = classAndNamerOfModule(module)
- classAndNamerOfModule(module) = (cdef, templateNamer)
+ classAndNamerOfModule get module match {
+ case Some((cdef, _)) => classAndNamerOfModule(module) = (cdef, templateNamer)
+ case None =>
}
if (opt.verbose) {
@@ -1008,11 +1008,14 @@ trait Namers { self: Analyzer =>
val module = companionModuleOf(meth.owner, context)
module.initialize // call type completer (typedTemplate), adds the
// module's templateNamer to classAndNamerOfModule
- if (!classAndNamerOfModule.contains(module))
- return // fix #3649 (prevent crash in erroneous source code)
- val (cdef, nmr) = classAndNamerOfModule(module)
- moduleNamer = Some(cdef, nmr)
- (cdef, nmr)
+ classAndNamerOfModule get module match {
+ case s @ Some((cdef, nmr)) if nmr != null =>
+ moduleNamer = s
+ (cdef, nmr)
+ case _ =>
+ return // fix #3649 (prevent crash in erroneous source code)
+ // nmr == null can happen in IDE; this is really an ugly hack on top[ of an ugly hack but it seems to work
+ }
}
deftParams = cdef.tparams map copyUntypedInvariant
nmr
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index 63542e6dd5..3eb5107870 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -352,7 +352,7 @@ abstract class RefChecks extends InfoTransform {
} else if ((member hasFlag (OVERRIDE | ABSOVERRIDE)) &&
!(member.owner.thisType.baseClasses exists (_ isSubClass other.owner)) &&
!member.isDeferred && !other.isDeferred &&
- intersectionIsEmpty(member.allOverriddenSymbols, other.allOverriddenSymbols)) {
+ intersectionIsEmpty(member.extendedOverriddenSymbols, other.extendedOverriddenSymbols)) {
overrideError("cannot override a concrete member without a third member that's overridden by both "+
"(this rule is designed to prevent ``accidental overrides'')")
} else if (other.isStable && !member.isStable) { // (1.4)
@@ -550,6 +550,13 @@ abstract class RefChecks extends InfoTransform {
if (abstractErrors.nonEmpty)
unit.error(clazz.pos, abstractErrorMessage)
+ } else if (clazz.isTrait) {
+ // prevent abstract methods in interfaces that override final members in Object; see #4431
+ for (decl <- clazz.info.decls.iterator) {
+ val overridden = decl.overriddenSymbol(ObjectClass)
+ if (overridden.isFinal)
+ unit.error(decl.pos, "trait cannot redefine final method from class AnyRef")
+ }
}
/** Returns whether there is a symbol declared in class `inclazz`
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
index 83d72fc3a0..240f0c5f12 100644
--- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
@@ -125,7 +125,7 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT
// otherwise lead to either a compiler crash or runtime failure.
private lazy val isDisallowed = {
import definitions._
- Set(Any_isInstanceOf, Object_isInstanceOf, Object_==, Object_!=, Object_##)
+ Set(Any_isInstanceOf, Object_isInstanceOf, Any_asInstanceOf, Object_asInstanceOf, Object_==, Object_!=, Object_##)
}
override def transform(tree: Tree): Tree = {
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 08d5f0e12d..3afbc5640b 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -1647,7 +1647,8 @@ trait Typers extends Modes {
namer.enterSyms(trees)
typedStats(trees, NoSymbol)
useCase.defined = context.scope.toList filterNot (useCase.aliases contains _)
-// println("defined use cases: "+(useCase.defined map (sym => sym+":"+sym.tpe)))
+ if (settings.debug.value)
+ useCase.defined foreach (sym => println("defined use cases: %s:%s".format(sym, sym.tpe)))
}
/**
@@ -2523,13 +2524,22 @@ trait Typers extends Modes {
/** Calling constfold right here is necessary because some trees (negated
* floats and literals in particular) are not yet folded.
*/
- def tryConst(tr: Tree, pt: Type) = typed(constfold(tr), EXPRmode, pt) match {
- // null cannot be used as constant value for classfile annotations
- case l @ Literal(c) if !(l.isErroneous || c.value == null) =>
- Some(LiteralAnnotArg(c))
- case _ =>
- error(tr.pos, "annotation argument needs to be a constant; found: "+tr)
- None
+ def tryConst(tr: Tree, pt: Type): Option[LiteralAnnotArg] = {
+ val const: Constant = typed(constfold(tr), EXPRmode, pt) match {
+ case l @ Literal(c) if !l.isErroneous => c
+ case tree => tree.tpe match {
+ case ConstantType(c) => c
+ case tpe => null
+ }
+ }
+ def fail(msg: String) = { error(tr.pos, msg) ; None }
+
+ if (const == null)
+ fail("annotation argument needs to be a constant; found: " + tr)
+ else if (const.value == null)
+ fail("annotation argument cannot be null")
+ else
+ Some(LiteralAnnotArg(const))
}
/** Converts an untyped tree to a ClassfileAnnotArg. If the conversion fails,
@@ -2575,7 +2585,7 @@ trait Typers extends Modes {
def trees2ConstArg(trees: List[Tree], pt: Type): Option[ArrayAnnotArg] = {
val args = trees.map(tree2ConstArg(_, pt))
if (args.exists(_.isEmpty)) None
- else Some(ArrayAnnotArg(args.map(_.get).toArray))
+ else Some(ArrayAnnotArg(args.flatten.toArray))
}
// begin typedAnnotation
diff --git a/src/compiler/scala/tools/nsc/util/ClassPath.scala b/src/compiler/scala/tools/nsc/util/ClassPath.scala
index bb404480a9..962062eb2d 100644
--- a/src/compiler/scala/tools/nsc/util/ClassPath.scala
+++ b/src/compiler/scala/tools/nsc/util/ClassPath.scala
@@ -9,9 +9,9 @@ package util
import java.net.URL
import scala.collection.mutable.ListBuffer
-import io.{ File, Directory, Path, AbstractFile }
+import io.{ File, Directory, Path, Jar, AbstractFile, ClassAndJarInfo }
import scala.tools.util.StringOps.splitWhere
-import Path.isJarOrZip
+import Jar.isJarOrZip
import File.pathSeparator
/** <p>
@@ -22,6 +22,14 @@ import File.pathSeparator
* @author Stepan Koltsov
*/
object ClassPath {
+ def scalaLibrary = locate[ScalaObject]
+ def scalaCompiler = locate[Global]
+
+ def info[T: ClassManifest] = new ClassAndJarInfo[T]
+ def locate[T: ClassManifest] = info[T] rootClasspath
+ def locateJar[T: ClassManifest] = info[T].rootPossibles find (x => isJarOrZip(x)) map (x => File(x))
+ def locateDir[T: ClassManifest] = info[T].rootPossibles find (_.isDirectory) map (_.toDirectory)
+
/** Expand single path entry */
private def expandS(pattern: String): List[String] = {
val wildSuffix = File.separator + "*"
diff --git a/src/compiler/scala/tools/nsc/util/InterruptReq.scala b/src/compiler/scala/tools/nsc/util/InterruptReq.scala
index 342284fb70..2857823ceb 100644
--- a/src/compiler/scala/tools/nsc/util/InterruptReq.scala
+++ b/src/compiler/scala/tools/nsc/util/InterruptReq.scala
@@ -24,7 +24,7 @@ abstract class InterruptReq {
notify()
}
- /** To be called from interrupting client to get result fo interrupt */
+ /** To be called from interrupting client to get result for interrupt */
def getResult(): R = synchronized {
while (result.isEmpty) {
try {
@@ -34,7 +34,9 @@ abstract class InterruptReq {
result.get match {
case Left(res) => res
- case Right(t) => throw t
+ case Right(t) => throw new FailedInterrupt(t)
}
}
}
+
+class FailedInterrupt(cause: Throwable) extends Exception("Compiler exception during call to 'ask'", cause)
diff --git a/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala b/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala
index be69c39547..d6d19eef92 100644
--- a/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala
+++ b/src/compiler/scala/tools/nsc/util/ScalaClassLoader.scala
@@ -37,12 +37,8 @@ trait ScalaClassLoader extends JavaClassLoader {
Class.forName(path, initialize, this).asInstanceOf[Class[T]]
/** Create an instance of a class with this classloader */
- def create(path: String): AnyRef = {
- tryToInitializeClass(path) match {
- case Some(clazz) => clazz.newInstance()
- case None => null
- }
- }
+ def create(path: String): AnyRef =
+ tryToInitializeClass[AnyRef](path) map (_.newInstance()) orNull
override def findClass(name: String) = {
val result = super.findClass(name)
@@ -60,14 +56,15 @@ trait ScalaClassLoader extends JavaClassLoader {
manifest[T].erasure.getConstructors.toList map (_.asInstanceOf[Constructor[T]])
/** The actual bytes for a class file, or an empty array if it can't be found. */
- def findBytesForClassName(s: String): Array[Byte] = {
- val name = s.replaceAll("""\.""", "/") + ".class"
- val url = this.getResource(name)
-
- if (url == null) Array()
- else io.Streamable.bytes(url.openStream)
+ def classBytes(className: String): Array[Byte] = classAsStream(className) match {
+ case null => Array()
+ case stream => io.Streamable.bytes(stream)
}
+ /** An InputStream representing the given class name, or null if not found. */
+ def classAsStream(className: String) =
+ getResourceAsStream(className.replaceAll("""\.""", "/") + ".class")
+
/** Run the main method of a class to be loaded by this classloader */
def run(objectName: String, arguments: Seq[String]) {
val clsToRun = tryToInitializeClass(objectName) getOrElse (
diff --git a/src/compiler/scala/tools/nsc/util/ShowPickled.scala b/src/compiler/scala/tools/nsc/util/ShowPickled.scala
index 476e0944cd..a8499fc6a7 100644
--- a/src/compiler/scala/tools/nsc/util/ShowPickled.scala
+++ b/src/compiler/scala/tools/nsc/util/ShowPickled.scala
@@ -76,7 +76,7 @@ object ShowPickled extends Names {
case CLASSINFOtpe => "CLASSINFOtpe"
case METHODtpe => "METHODtpe"
case POLYtpe => "POLYtpe"
- case IMPLICITMETHODtpe => "IMPLICITMETHODtpe"
+ case IMPLICITMETHODtpe => "METHODtpe" // IMPLICITMETHODtpe no longer used.
case SUPERtpe => "SUPERtpe"
case LITERALunit => "LITERALunit"
case LITERALboolean => "LITERALboolean"
diff --git a/src/compiler/scala/tools/nsc/util/Tracer.scala b/src/compiler/scala/tools/nsc/util/Tracer.scala
index 17be05a4d6..1dd21b26c2 100644
--- a/src/compiler/scala/tools/nsc/util/Tracer.scala
+++ b/src/compiler/scala/tools/nsc/util/Tracer.scala
@@ -6,31 +6,56 @@
package scala.tools.nsc
package util
+import java.io.PrintStream
+
class Tracer(enabled: () => Boolean) {
+ def out: PrintStream = System.out
+ def intoString(x: Any): String = "" + x
+ def stringify(x: Any): String = x match {
+ case null => "null"
+ case x: TraversableOnce[_] => x map stringify mkString ", "
+ case x: Product => stringify(x.productIterator)
+ case x: AnyRef => intoString(x)
+ }
+
+ private val LBRACE = "{"
+ private val RBRACE = "}"
private var indentLevel = 0
- private def ind(s: String) = (" " * (indentLevel*2)) + s
+ private def ind(s: String) = (" " * (indentLevel * 2)) + s
private def indented[T](body: => T): T = {
indentLevel += 1
try body
finally indentLevel -= 1
}
private def p(s: String) = {
- System.out.print(s)
- System.out.flush()
+ out.print(s)
+ out.flush()
}
private def pin[T](x: T): T = {
p(ind("" + x))
x
}
- def seq[T](name: String, args: => Seq[Any])(body: => T): T = {
+ def apply[T](name: String, args: => Any)(body: => T): T = {
+ val result = body
if (enabled()) {
- p(ind("%s(%s) = {\n".format(name, args mkString ", ")))
- try indented(pin(body))
- finally println("\n" + ind("}"))
+ // concise output optimization
+ val boolResult = result match {
+ case x: Boolean => Some(x)
+ case _ => None
+ }
+ p(ind("%s(%s) = %s\n".format(
+ name,
+ stringify(args),
+ boolResult getOrElse LBRACE))
+ )
+ if (boolResult.isEmpty) {
+ indented(pin(result))
+ p("\n" + ind(RBRACE))
+ }
+ result
}
- else body
+ else result
}
- def apply[T](name: String, args: Any*)(body: => T): T = seq(name, args.toSeq)(body)
}
object Tracer {
diff --git a/src/compiler/scala/tools/util/Javap.scala b/src/compiler/scala/tools/util/Javap.scala
index bda8ffbd1b..581cc9dbef 100644
--- a/src/compiler/scala/tools/util/Javap.scala
+++ b/src/compiler/scala/tools/util/Javap.scala
@@ -77,7 +77,7 @@ class Javap(
if (path endsWith ".class") (path dropRight 6).replace('/', '.')
else path
)
- loader.findBytesForClassName(extName)
+ loader.classBytes(extName)
}
}
diff --git a/src/library-aux/README b/src/library-aux/README
new file mode 100644
index 0000000000..e6dcd29277
--- /dev/null
+++ b/src/library-aux/README
@@ -0,0 +1,3 @@
+Source files under this directory cannot be compiled by normal means.
+
+They exist for bootstrapping and documentation purposes. \ No newline at end of file
diff --git a/src/library-aux/scala/Any.scala b/src/library-aux/scala/Any.scala
new file mode 100644
index 0000000000..a97e5f050b
--- /dev/null
+++ b/src/library-aux/scala/Any.scala
@@ -0,0 +1,105 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package scala
+
+/** Class `Any` is the root of the Scala class hierarchy. Every class in a Scala
+ * execution environment inherits directly or indirectly from this class.
+ */
+abstract class Any {
+ /** Compares the receiver object (`this`) with the argument object (`that`) for equivalence.
+ *
+ * The default implementations of this method is an [[http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]]:
+ *
+ * - It is reflexive: for any instance `x` of type `Any`, `x.equals(x)` should return `true`.
+ * - It is symmetric: for any instances `x` and `y` of type `Any`, `x.equals(y)` should return `true` if and
+ * only if `y.equals(x)` returns `true`.
+ * - It is transitive: for any instances `x`, `y`, and `z` of type `AnyRef` if `x.equals(y)` returns `true` and
+ * `y.equals(z)` returns `true`, then `x.equals(z)` should return `true`.
+ *
+ * If you override this method, you should verify that your implementation remains an equivalence relation.
+ * Additionally, when overriding this method it is usually necessary to override `hashCode` to ensure that
+ * objects which are "equal" (`o1.equals(o2)` returns `true`) hash to the same [[scala.Int]].
+ * (`o1.hashCode.equals(o2.hashCode)`).
+ *
+ * @param that the object to compare against this object for equality.
+ * @return `true` if the receiver object is equivalent to the argument; `false` otherwise.
+ */
+ def equals(that: Any): Boolean
+
+ /** Calculate a hash code value for the object.
+ *
+ * The default hashing algorithm is platform dependent.
+ *
+ * Note that it is allowed for two objects to have identical hash codes (`o1.hashCode.equals(o2.hashCode)`) yet
+ * not be equal (`o1.equals(o2)` returns `false`). A degenerate implementation could always return `0`.
+ * However, it is required that if two objects are equal (`o1.equals(o2)` returns `true`) that they have
+ * identical hash codes (`o1.hashCode.equals(o2.hashCode)`). Therefore, when overriding this method, be sure
+ * to verify that the behavior is consistent with the `equals` method.
+ *
+ * @return the hash code value for this object.
+ */
+ def hashCode: Int
+
+ /** Returns a string representation of the object.
+ *
+ * The default representation is platform dependent.
+ *
+ * @return a string representation of the object.
+ */
+ def toString: String
+
+ /** Test two objects for equality.
+ *
+ * @param that the object to compare against this object for equality.
+ * @return `true` if the receiver object is equivalent to the argument; `false` otherwise.
+ */
+ final def ==(that: Any): Boolean = this equals that
+
+ /** Test two objects for inequality.
+ *
+ * @param that the object to compare against this object for equality.
+ * @return `true` if !(this == that), false otherwise.
+ */
+ final def != (that: Any): Boolean = !(this == that)
+
+ /** Equivalent to `x.hashCode` except for boxed numeric types.
+ * For numerics, it returns a hash value which is consistent
+ * with value equality: if two value type instances compare
+ * as true, then ## will produce the same hash value for each
+ * of them.
+ *
+ * @return a hash value consistent with ==
+ */
+ final def ## : Int = sys.error("##")
+
+ /** Test whether the dynamic type of the receiver object is `T0`.
+ *
+ * Note that the result of the test is modulo Scala's erasure semantics.
+ * Therefore the expression `1.isInstanceOf[String]` will return `false`, while the
+ * expression `List(1).isInstanceOf[List[String]]` will return `true`.
+ * In the latter example, because the type argument is erased as part of compilation it is
+ * not possible to check whether the contents of the list are of the specified type.
+ *
+ * @return `true` if the receiver object is an instance of erasure of type `T0`; `false` otherwise.
+ */
+ def isInstanceOf[T0]: Boolean = sys.error("isInstanceOf")
+
+ /** Cast the receiver object to be of type `T0`.
+ *
+ * Note that the success of a cast at runtime is modulo Scala's erasure semantics.
+ * Therefore the expression `1.asInstanceOf[String]` will throw a `ClassCastException` at
+ * runtime, while the expression `List(1).asInstanceOf[List[String]]` will not.
+ * In the latter example, because the type argument is erased as part of compilation it is
+ * not possible to check whether the contents of the list are of the requested type.
+ *
+ * @throws ClassCastException if the receiver object is not an instance of the erasure of type `T0`.
+ * @return the receiver object.
+ */
+ def asInstanceOf[T0]: T0 = sys.error("asInstanceOf")
+}
diff --git a/src/library-aux/scala/AnyRef.scala b/src/library-aux/scala/AnyRef.scala
new file mode 100644
index 0000000000..6792ba68b7
--- /dev/null
+++ b/src/library-aux/scala/AnyRef.scala
@@ -0,0 +1,129 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package scala
+
+/** Class `AnyRef` is the root class of all ''reference types''.
+ * All types except the value types descend from this class.
+ */
+trait AnyRef extends Any {
+
+ /** The equality method for reference types. See equals in [[scala.Any]].
+ *
+ * @param that the object to compare against this object for equality.
+ * @return `true` if the receiver object is equivalent to the argument; `false` otherwise.
+ */
+ def equals(that: Any): Boolean = this eq that
+
+ /** The hashCode method for reference types. See hashCode in [[scala.Any]].
+ *
+ * @return the hash code value for this object.
+ */
+ def hashCode: Int = sys.error("hashCode")
+
+ /** Creates a String representation of this object. The default
+ * representation is platform dependent. On the java platform it
+ * is the concatenation of the class name, "@", and the object's
+ * hashcode in hexadecimal.
+ *
+ * @return a String representation of the object.
+ */
+ def toString: String = sys.error("toString")
+
+ /** Executes the code in `body` with an exclusive lock on `this`.
+ *
+ * @param body the code to execute
+ * @return the result of `body`
+ */
+ def synchronized[T](body: => T): T
+
+ /** Tests whether the argument (`arg0`) is a reference to the receiver object (`this`).
+ *
+ * The `eq` method implements an [[http://en.wikipedia.org/wiki/Equivalence_relation equivalence relation]] on
+ * non-null instances of `AnyRef`, and has three additional properties:
+ *
+ * - It is consistent: for any non-null instances `x` and `y` of type `AnyRef`, multiple invocations of
+ * `x.eq(y)` consistently returns `true` or consistently returns `false`.
+ * - For any non-null instance `x` of type `AnyRef`, `x.eq(null)` and `null.eq(x)` returns `false`.
+ * - `null.eq(null)` returns `true`.
+ *
+ * When overriding the `equals` or `hashCode` methods, it is important to ensure that their behavior is
+ * consistent with reference equality. Therefore, if two objects are references to each other (`o1 eq o2`), they
+ * should be equal to each other (`o1 == o2`) and they should hash to the same value (`o1.hashCode == o2.hashCode`).
+ *
+ * @param that the object to compare against this object for reference equality.
+ * @return `true` if the argument is a reference to the receiver object; `false` otherwise.
+ */
+ final def eq(that: AnyRef): Boolean = sys.error("eq")
+
+ /** Equivalent to `!(this eq that)`.
+ *
+ * @param that the object to compare against this object for reference equality.
+ * @return `true` if the argument is not a reference to the receiver object; `false` otherwise.
+ */
+ final def ne(that: AnyRef): Boolean = !(this eq that)
+
+ /** The expression `x == that` is equivalent to `if (x eq null) that eq null else x.equals(that)`.
+ *
+ * @param arg0 the object to compare against this object for equality.
+ * @return `true` if the receiver object is equivalent to the argument; `false` otherwise.
+ */
+ final def ==(that: AnyRef): Boolean =
+ if (this eq null) that eq null
+ else this equals that
+
+ /** Create a copy of the receiver object.
+ *
+ * The default implementation of the `clone` method is platform dependent.
+ *
+ * @note not specified by SLS as a member of AnyRef
+ * @return a copy of the receiver object.
+ */
+ protected def clone(): AnyRef
+
+ /** Called by the garbage collector on the receiver object when there
+ * are no more references to the object.
+ *
+ * The details of when and if the `finalize` method is invoked, as
+ * well as the interaction between `finalize` and non-local returns
+ * and exceptions, are all platform dependent.
+ *
+ * @note not specified by SLS as a member of AnyRef
+ */
+ protected def finalize(): Unit
+
+ /** A representation that corresponds to the dynamic class of the receiver object.
+ *
+ * The nature of the representation is platform dependent.
+ *
+ * @note not specified by SLS as a member of AnyRef
+ * @return a representation that corresponds to the dynamic class of the receiver object.
+ */
+ def getClass(): Class[_]
+
+ /** Wakes up a single thread that is waiting on the receiver object's monitor.
+ *
+ * @note not specified by SLS as a member of AnyRef
+ */
+ def notify(): Unit
+
+ /** Wakes up all threads that are waiting on the receiver object's monitor.
+ *
+ * @note not specified by SLS as a member of AnyRef
+ */
+ def notifyAll(): Unit
+
+ /** Causes the current Thread to wait until another Thread invokes
+ * the notify() or notifyAll() methods.
+ *
+ * @note not specified by SLS as a member of AnyRef
+ */
+ def wait (): Unit
+ def wait (timeout: Long, nanos: Int): Unit
+ def wait (timeout: Long): Unit
+}
diff --git a/src/library-aux/scala/Nothing.scala b/src/library-aux/scala/Nothing.scala
new file mode 100644
index 0000000000..eed6066039
--- /dev/null
+++ b/src/library-aux/scala/Nothing.scala
@@ -0,0 +1,23 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package scala
+
+/** `Nothing` is - together with [[scala.Null]] - at the bottom of Scala's type hierarchy.
+ *
+ * `Nothing` is a subtype of every other type (including [[scala.Null]]); there exist
+ * ''no instances'' of this type. Although type `Nothing` is uninhabited, it is
+ * nevertheless useful in several ways. For instance, the Scala library defines a value
+ * [[scala.collection.immutable.Nil]] of type `List[Nothing]`. Because lists are covariant in Scala,
+ * this makes [[scala.collection.immutable.Nil]] an instance of `List[T]`, for any element of type `T`.
+ *
+ * Another usage for Nothing is the return type for methods which never return normally.
+ * One example is method error in [[scala.sys]], which always throws an exception.
+ */
+sealed trait Nothing
+
diff --git a/src/library-aux/scala/Null.scala b/src/library-aux/scala/Null.scala
new file mode 100644
index 0000000000..7455e78ae7
--- /dev/null
+++ b/src/library-aux/scala/Null.scala
@@ -0,0 +1,17 @@
+/* __ *\
+** ________ ___ / / ___ Scala API **
+** / __/ __// _ | / / / _ | (c) 2002-2010, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+package scala
+
+/** `Null` is - together with [[scala.Nothing]] - at the bottom of the Scala type hierarchy.
+ *
+ * `Null` is a subtype of all reference types; its only instance is the `null` reference.
+ * Since `Null` is not a subtype of value types, `null` is not a member of any such type. For instance,
+ * it is not possible to assign `null` to a variable of type [[scala.Int]].
+ */
+sealed trait Null
diff --git a/src/library/scala/AnyVal.scala b/src/library/scala/AnyVal.scala
index 4b4b6038d1..850042700f 100755
--- a/src/library/scala/AnyVal.scala
+++ b/src/library/scala/AnyVal.scala
@@ -8,4 +8,21 @@
package scala
+/** `AnyVal` is the root class of all ''value types'', which describe values
+ * not implemented as objects in the underlying host system. The value classes
+ * are specified in SLS 12.2.
+ *
+ * The standard implementation includes nine `AnyVal` subtypes:
+ *
+ * [[scala.Double]], [[scala.Float]], [[scala.Long]], [[scala.Int]], [[scala.Char]],
+ * [[scala.Short]], and [[scala.Byte]] are the ''numeric value types''.
+ *
+ * [[scala.Unit]] and [[scala.Boolean]] are the ''non-numeric value types''.
+ *
+ * Other groupings:
+ *
+ * The ''subrange types'' are [[scala.Byte]], [[scala.Short]], and [[scala.Char]].
+ * The ''integer types'' include the subrange types as well as [[scala.Int]] and [[scala.Long]].
+ * The ''floating point types'' are [[scala.Float]] and [[scala.Double]].
+ */
sealed trait AnyVal
diff --git a/src/library/scala/Boolean.scala b/src/library/scala/Boolean.scala
index dc2076cb1d..7719065ae7 100755
--- a/src/library/scala/Boolean.scala
+++ b/src/library/scala/Boolean.scala
@@ -10,8 +10,12 @@
package scala
-import java.{ lang => jl }
-
+/** `Boolean` is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system.
+ *
+ * There is an implicit conversion from [[scala.Boolean]] => [[scala.runtime.RichBoolean]]
+ * which provides useful non-primitive operations.
+ */
final class Boolean extends AnyVal {
def unary_! : Boolean = sys.error("stub")
@@ -28,7 +32,26 @@ final class Boolean extends AnyVal {
}
object Boolean extends AnyValCompanion {
+
+ /** Transform a value type into a boxed reference type.
+ *
+ * @param x the Boolean to be boxed
+ * @return a java.lang.Boolean offering `x` as its underlying value.
+ */
+ def box(x: Boolean): java.lang.Boolean = java.lang.Boolean.valueOf(x)
+
+ /** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a java.lang.Boolean.
+ *
+ * @param x the java.lang.Boolean to be unboxed.
+ * @throws ClassCastException if the argument is not a java.lang.Boolean
+ * @return the Boolean resulting from calling booleanValue() on `x`
+ */
+ def unbox(x: java.lang.Object): Boolean = x.asInstanceOf[java.lang.Boolean].booleanValue()
+
+ /** The String representation of the scala.Boolean companion object.
+ */
override def toString = "object scala.Boolean"
- def box(x: Boolean): jl.Boolean = jl.Boolean.valueOf(x)
- def unbox(x: jl.Object): Boolean = x.asInstanceOf[jl.Boolean].booleanValue()
-} \ No newline at end of file
+}
+
diff --git a/src/library/scala/Byte.scala b/src/library/scala/Byte.scala
index 69d435b33b..540e05c19f 100644
--- a/src/library/scala/Byte.scala
+++ b/src/library/scala/Byte.scala
@@ -10,9 +10,12 @@
package scala
-import java.{ lang => jl }
-
-
+/** `Byte` is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system.
+ *
+ * There is an implicit conversion from [[scala.Byte]] => [[scala.runtime.RichByte]]
+ * which provides useful non-primitive operations.
+ */
final class Byte extends AnyVal {
def toByte: Byte = sys.error("stub")
def toShort: Short = sys.error("stub")
@@ -143,12 +146,34 @@ final class Byte extends AnyVal {
}
-
object Byte extends AnyValCompanion {
- final val MinValue = jl.Byte.MIN_VALUE
- final val MaxValue = jl.Byte.MAX_VALUE
-
- def box(x: Byte): jl.Byte = jl.Byte.valueOf(x)
- def unbox(x: jl.Object): Byte = x.asInstanceOf[jl.Byte].byteValue()
+ /** The smallest value representable as a Byte.
+ */
+ final val MinValue = java.lang.Byte.MIN_VALUE
+
+ /** The largest value representable as a Byte.
+ */
+ final val MaxValue = java.lang.Byte.MAX_VALUE
+
+ /** Transform a value type into a boxed reference type.
+ *
+ * @param x the Byte to be boxed
+ * @return a java.lang.Byte offering `x` as its underlying value.
+ */
+ def box(x: Byte): java.lang.Byte = java.lang.Byte.valueOf(x)
+
+ /** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a java.lang.Byte.
+ *
+ * @param x the java.lang.Byte to be unboxed.
+ * @throws ClassCastException if the argument is not a java.lang.Byte
+ * @return the Byte resulting from calling byteValue() on `x`
+ */
+ def unbox(x: java.lang.Object): Byte = x.asInstanceOf[java.lang.Byte].byteValue()
+
+ /** The String representation of the scala.Byte companion object.
+ */
override def toString = "object scala.Byte"
}
+
diff --git a/src/library/scala/Char.scala b/src/library/scala/Char.scala
index 88d7617ea5..a5d1cb019b 100644
--- a/src/library/scala/Char.scala
+++ b/src/library/scala/Char.scala
@@ -10,9 +10,12 @@
package scala
-import java.{ lang => jl }
-
-
+/** `Char` is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system.
+ *
+ * There is an implicit conversion from [[scala.Char]] => [[scala.runtime.RichChar]]
+ * which provides useful non-primitive operations.
+ */
final class Char extends AnyVal {
def toByte: Byte = sys.error("stub")
def toShort: Short = sys.error("stub")
@@ -143,12 +146,34 @@ final class Char extends AnyVal {
}
-
object Char extends AnyValCompanion {
- final val MinValue = jl.Character.MIN_VALUE
- final val MaxValue = jl.Character.MAX_VALUE
-
- def box(x: Char): jl.Character = jl.Character.valueOf(x)
- def unbox(x: jl.Object): Char = x.asInstanceOf[jl.Character].charValue()
+ /** The smallest value representable as a Char.
+ */
+ final val MinValue = java.lang.Character.MIN_VALUE
+
+ /** The largest value representable as a Char.
+ */
+ final val MaxValue = java.lang.Character.MAX_VALUE
+
+ /** Transform a value type into a boxed reference type.
+ *
+ * @param x the Char to be boxed
+ * @return a java.lang.Character offering `x` as its underlying value.
+ */
+ def box(x: Char): java.lang.Character = java.lang.Character.valueOf(x)
+
+ /** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a java.lang.Character.
+ *
+ * @param x the java.lang.Character to be unboxed.
+ * @throws ClassCastException if the argument is not a java.lang.Character
+ * @return the Char resulting from calling charValue() on `x`
+ */
+ def unbox(x: java.lang.Object): Char = x.asInstanceOf[java.lang.Character].charValue()
+
+ /** The String representation of the scala.Char companion object.
+ */
override def toString = "object scala.Char"
}
+
diff --git a/src/library/scala/Double.scala b/src/library/scala/Double.scala
index fe37860c07..6fd7b0984b 100644
--- a/src/library/scala/Double.scala
+++ b/src/library/scala/Double.scala
@@ -10,9 +10,12 @@
package scala
-import java.{ lang => jl }
-
-
+/** `Double` is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system.
+ *
+ * There is an implicit conversion from [[scala.Double]] => [[scala.runtime.RichDouble]]
+ * which provides useful non-primitive operations.
+ */
final class Double extends AnyVal {
def toByte: Byte = sys.error("stub")
def toShort: Short = sys.error("stub")
@@ -117,13 +120,14 @@ final class Double extends AnyVal {
}
-
object Double extends AnyValCompanion {
- /** The smallest positive value greater than 0.0d.*/
- final val MinPositiveValue = jl.Double.MIN_VALUE
- final val NaN = jl.Double.NaN
- final val PositiveInfinity = jl.Double.POSITIVE_INFINITY
- final val NegativeInfinity = jl.Double.NEGATIVE_INFINITY
+ /** The smallest positive value greater than 0.0d which is
+ * representable as a Double.
+ */
+ final val MinPositiveValue = java.lang.Double.MIN_VALUE
+ final val NaN = java.lang.Double.NaN
+ final val PositiveInfinity = java.lang.Double.POSITIVE_INFINITY
+ final val NegativeInfinity = java.lang.Double.NEGATIVE_INFINITY
@deprecated("use Double.MinPositiveValue instead")
final val Epsilon = MinPositiveValue
@@ -133,12 +137,30 @@ object Double extends AnyValCompanion {
* is the smallest positive value representable by a Double. In Scala that number
* is called Double.MinPositiveValue.
*/
- final val MinValue = -jl.Double.MAX_VALUE
+ final val MinValue = -java.lang.Double.MAX_VALUE
/** The largest finite positive number representable as a Double. */
- final val MaxValue = jl.Double.MAX_VALUE
+ final val MaxValue = java.lang.Double.MAX_VALUE
- def box(x: Double): jl.Double = jl.Double.valueOf(x)
- def unbox(x: jl.Object): Double = x.asInstanceOf[jl.Double].doubleValue()
+ /** Transform a value type into a boxed reference type.
+ *
+ * @param x the Double to be boxed
+ * @return a java.lang.Double offering `x` as its underlying value.
+ */
+ def box(x: Double): java.lang.Double = java.lang.Double.valueOf(x)
+
+ /** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a java.lang.Double.
+ *
+ * @param x the java.lang.Double to be unboxed.
+ * @throws ClassCastException if the argument is not a java.lang.Double
+ * @return the Double resulting from calling doubleValue() on `x`
+ */
+ def unbox(x: java.lang.Object): Double = x.asInstanceOf[java.lang.Double].doubleValue()
+
+ /** The String representation of the scala.Double companion object.
+ */
override def toString = "object scala.Double"
}
+
diff --git a/src/library/scala/Dynamic.scala b/src/library/scala/Dynamic.scala
index 25ce4ef638..2f99518988 100644
--- a/src/library/scala/Dynamic.scala
+++ b/src/library/scala/Dynamic.scala
@@ -2,11 +2,12 @@ package scala
/** A marker trait that enables dynamic invocations. Instances `x` of this trait
* allow calls `x.meth(args)` for arbitrary method names `meth` and argument lists
- * `args`. If a call is not natively supported by `x`, it is rewritten to
+ * `args`. If a call is not natively supported by `x`, it is rewritten to
* `x.applyDynamic("meth", args)`.
+ *
+ * As of scala 2.9, scalac must receive the -Xexperimental optional for Dynamic
+ * to receive this treatment.
*/
-trait Dynamic {
-
-}
+trait Dynamic
diff --git a/src/library/scala/Equals.scala b/src/library/scala/Equals.scala
index d0929a9ac4..8aff7af175 100644
--- a/src/library/scala/Equals.scala
+++ b/src/library/scala/Equals.scala
@@ -6,22 +6,22 @@
** |/ **
\* */
-
-
package scala
/** An interface containing operations for equality.
* The only method not already present in class `AnyRef` is `canEqual`.
*/
trait Equals {
-
/** A method that should be called from every well-designed equals method
* that is open to be overridden in a subclass. See Programming in Scala,
* Chapter 28 for discussion and design.
+ *
+ * @param that the value being probed for possible equality
+ * @return true if this instance can possibly equal `that`, otherwise false
*/
def canEqual(that: Any): Boolean
- /** The equality method defined in `AnyRef`.
+ /** The universal equality method defined in `AnyRef`.
*/
def equals(that: Any): Boolean
}
diff --git a/src/library/scala/Float.scala b/src/library/scala/Float.scala
index 39e510e477..38819e5d16 100644
--- a/src/library/scala/Float.scala
+++ b/src/library/scala/Float.scala
@@ -10,9 +10,12 @@
package scala
-import java.{ lang => jl }
-
-
+/** `Float` is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system.
+ *
+ * There is an implicit conversion from [[scala.Float]] => [[scala.runtime.RichFloat]]
+ * which provides useful non-primitive operations.
+ */
final class Float extends AnyVal {
def toByte: Byte = sys.error("stub")
def toShort: Short = sys.error("stub")
@@ -117,13 +120,14 @@ final class Float extends AnyVal {
}
-
object Float extends AnyValCompanion {
- /** The smallest positive value greater than 0.0f.*/
- final val MinPositiveValue = jl.Float.MIN_VALUE
- final val NaN = jl.Float.NaN
- final val PositiveInfinity = jl.Float.POSITIVE_INFINITY
- final val NegativeInfinity = jl.Float.NEGATIVE_INFINITY
+ /** The smallest positive value greater than 0.0f which is
+ * representable as a Float.
+ */
+ final val MinPositiveValue = java.lang.Float.MIN_VALUE
+ final val NaN = java.lang.Float.NaN
+ final val PositiveInfinity = java.lang.Float.POSITIVE_INFINITY
+ final val NegativeInfinity = java.lang.Float.NEGATIVE_INFINITY
@deprecated("use Float.MinPositiveValue instead")
final val Epsilon = MinPositiveValue
@@ -133,12 +137,30 @@ object Float extends AnyValCompanion {
* is the smallest positive value representable by a Float. In Scala that number
* is called Float.MinPositiveValue.
*/
- final val MinValue = -jl.Float.MAX_VALUE
+ final val MinValue = -java.lang.Float.MAX_VALUE
/** The largest finite positive number representable as a Float. */
- final val MaxValue = jl.Float.MAX_VALUE
+ final val MaxValue = java.lang.Float.MAX_VALUE
- def box(x: Float): jl.Float = jl.Float.valueOf(x)
- def unbox(x: jl.Object): Float = x.asInstanceOf[jl.Float].floatValue()
+ /** Transform a value type into a boxed reference type.
+ *
+ * @param x the Float to be boxed
+ * @return a java.lang.Float offering `x` as its underlying value.
+ */
+ def box(x: Float): java.lang.Float = java.lang.Float.valueOf(x)
+
+ /** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a java.lang.Float.
+ *
+ * @param x the java.lang.Float to be unboxed.
+ * @throws ClassCastException if the argument is not a java.lang.Float
+ * @return the Float resulting from calling floatValue() on `x`
+ */
+ def unbox(x: java.lang.Object): Float = x.asInstanceOf[java.lang.Float].floatValue()
+
+ /** The String representation of the scala.Float companion object.
+ */
override def toString = "object scala.Float"
}
+
diff --git a/src/library/scala/Function0.scala b/src/library/scala/Function0.scala
index d17122c0d8..f8e68a2e04 100644
--- a/src/library/scala/Function0.scala
+++ b/src/library/scala/Function0.scala
@@ -6,7 +6,7 @@
** |/ **
\* */
// GENERATED CODE: DO NOT EDIT.
-// genprod generated these sources at: Sat Feb 19 20:13:51 PST 2011
+// genprod generated these sources at: Wed Mar 30 13:47:19 PDT 2011
package scala
diff --git a/src/library/scala/Function1.scala b/src/library/scala/Function1.scala
index e256a94961..dc8e67bbb0 100644
--- a/src/library/scala/Function1.scala
+++ b/src/library/scala/Function1.scala
@@ -25,6 +25,7 @@ package scala
* }
* }}}
*/
+@annotation.implicitNotFound(msg = "No implicit view available from ${T1} => ${R}.")
trait Function1[@specialized(scala.Int, scala.Long, scala.Float, scala.Double) -T1, @specialized(scala.Unit, scala.Boolean, scala.Int, scala.Float, scala.Long, scala.Double) +R] extends AnyRef { self =>
/** Apply the body of this function to the argument.
* @return the result of function application.
diff --git a/src/library/scala/Int.scala b/src/library/scala/Int.scala
index 69fb0a66b7..c53be1241d 100644
--- a/src/library/scala/Int.scala
+++ b/src/library/scala/Int.scala
@@ -10,9 +10,12 @@
package scala
-import java.{ lang => jl }
-
-
+/** `Int` is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system.
+ *
+ * There is an implicit conversion from [[scala.Int]] => [[scala.runtime.RichInt]]
+ * which provides useful non-primitive operations.
+ */
final class Int extends AnyVal {
def toByte: Byte = sys.error("stub")
def toShort: Short = sys.error("stub")
@@ -143,12 +146,34 @@ final class Int extends AnyVal {
}
-
object Int extends AnyValCompanion {
- final val MinValue = jl.Integer.MIN_VALUE
- final val MaxValue = jl.Integer.MAX_VALUE
-
- def box(x: Int): jl.Integer = jl.Integer.valueOf(x)
- def unbox(x: jl.Object): Int = x.asInstanceOf[jl.Integer].intValue()
+ /** The smallest value representable as a Int.
+ */
+ final val MinValue = java.lang.Integer.MIN_VALUE
+
+ /** The largest value representable as a Int.
+ */
+ final val MaxValue = java.lang.Integer.MAX_VALUE
+
+ /** Transform a value type into a boxed reference type.
+ *
+ * @param x the Int to be boxed
+ * @return a java.lang.Integer offering `x` as its underlying value.
+ */
+ def box(x: Int): java.lang.Integer = java.lang.Integer.valueOf(x)
+
+ /** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a java.lang.Integer.
+ *
+ * @param x the java.lang.Integer to be unboxed.
+ * @throws ClassCastException if the argument is not a java.lang.Integer
+ * @return the Int resulting from calling intValue() on `x`
+ */
+ def unbox(x: java.lang.Object): Int = x.asInstanceOf[java.lang.Integer].intValue()
+
+ /** The String representation of the scala.Int companion object.
+ */
override def toString = "object scala.Int"
}
+
diff --git a/src/library/scala/Long.scala b/src/library/scala/Long.scala
index 7fdefebae3..3124130663 100644
--- a/src/library/scala/Long.scala
+++ b/src/library/scala/Long.scala
@@ -10,9 +10,12 @@
package scala
-import java.{ lang => jl }
-
-
+/** `Long` is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system.
+ *
+ * There is an implicit conversion from [[scala.Long]] => [[scala.runtime.RichLong]]
+ * which provides useful non-primitive operations.
+ */
final class Long extends AnyVal {
def toByte: Byte = sys.error("stub")
def toShort: Short = sys.error("stub")
@@ -143,12 +146,34 @@ final class Long extends AnyVal {
}
-
object Long extends AnyValCompanion {
- final val MinValue = jl.Long.MIN_VALUE
- final val MaxValue = jl.Long.MAX_VALUE
-
- def box(x: Long): jl.Long = jl.Long.valueOf(x)
- def unbox(x: jl.Object): Long = x.asInstanceOf[jl.Long].longValue()
+ /** The smallest value representable as a Long.
+ */
+ final val MinValue = java.lang.Long.MIN_VALUE
+
+ /** The largest value representable as a Long.
+ */
+ final val MaxValue = java.lang.Long.MAX_VALUE
+
+ /** Transform a value type into a boxed reference type.
+ *
+ * @param x the Long to be boxed
+ * @return a java.lang.Long offering `x` as its underlying value.
+ */
+ def box(x: Long): java.lang.Long = java.lang.Long.valueOf(x)
+
+ /** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a java.lang.Long.
+ *
+ * @param x the java.lang.Long to be unboxed.
+ * @throws ClassCastException if the argument is not a java.lang.Long
+ * @return the Long resulting from calling longValue() on `x`
+ */
+ def unbox(x: java.lang.Object): Long = x.asInstanceOf[java.lang.Long].longValue()
+
+ /** The String representation of the scala.Long companion object.
+ */
override def toString = "object scala.Long"
}
+
diff --git a/src/library/scala/Option.scala b/src/library/scala/Option.scala
index ef2cbcfd31..c2b1764fdb 100644
--- a/src/library/scala/Option.scala
+++ b/src/library/scala/Option.scala
@@ -21,7 +21,7 @@ object Option {
*/
def apply[A](x: A): Option[A] = if (x == null) None else Some(x)
- /** An Option factory which returns $none in a manner consistent with
+ /** An Option factory which returns `None` in a manner consistent with
* the collections hierarchy.
*/
def empty[A] : Option[A] = None
diff --git a/src/library/scala/Predef.scala b/src/library/scala/Predef.scala
index 61c8ca3f6a..20473009bf 100644
--- a/src/library/scala/Predef.scala
+++ b/src/library/scala/Predef.scala
@@ -12,7 +12,7 @@ import scala.collection.{ mutable, immutable, generic }
import immutable.StringOps
import mutable.ArrayOps
import generic.CanBuildFrom
-import annotation.elidable
+import annotation.{ elidable, implicitNotFound }
import annotation.elidable.ASSERTION
/** The <code>Predef</code> object provides definitions that are
@@ -342,6 +342,7 @@ object Predef extends LowPriorityImplicits {
* where L is the required lower bound).
* in part contributed by Jason Zaugg
*/
+ @implicitNotFound(msg = "Cannot prove that ${From} <:< ${To}.")
sealed abstract class <:<[-From, +To] extends (From => To) with Serializable
implicit def conforms[A]: A <:< A = new (A <:< A) { def apply(x: A) = x }
// not in the <:< companion object because it is also intended to subsume identity (which is no longer implicit)
@@ -350,6 +351,7 @@ object Predef extends LowPriorityImplicits {
*
* @see <:< for expressing subtyping constraints
*/
+ @implicitNotFound(msg = "Cannot prove that ${From} =:= ${To}.")
sealed abstract class =:=[From, To] extends (From => To) with Serializable
object =:= {
implicit def tpEquals[A]: A =:= A = new (A =:= A) {def apply(x: A) = x}
diff --git a/src/library/scala/Product.scala b/src/library/scala/Product.scala
index 786be5ec13..dfa04bbbe7 100644
--- a/src/library/scala/Product.scala
+++ b/src/library/scala/Product.scala
@@ -8,30 +8,33 @@
package scala
-/** Base trait for all products. See [[scala.Product2]].
+/** Base trait for all products, which in the standard library include at least
+ * [[scala.Product1]] through [[scala.Product22]] and therefore also their
+ * subclasses [[scala.Tuple1]] through [[scala.Tuple22]]. In addition, all case
+ * classes implement Product with synthetically generated methods.
*
* @author Burak Emir
* @version 1.0
* @since 2.3
*/
trait Product extends Equals {
-
- /** Returns the nth element of this product, 0-based. In other words, for a
- * product <code>A(x_1,...,x_k)</code>, returns <code>x_(n+1)</code>
- * where <code>0 &lt;= n &lt; k</code>
+ /** The nth element of this product, 0-based. In other words, for a
+ * product `A(x_1, ..., x_k)`, returns x_(n+1) where 0 < n < k.
*
- * @param n the index of the element to return
- * @throws IndexOutOfBoundsException
- * @return The element <code>n</code> elements after the first element
+ * @param n the index of the element to return
+ * @throws IndexOutOfBoundsException
+ * @return the element `n` elements after the first element
*/
def productElement(n: Int): Any
- /** Returns the size of this product.
- * @return For a product <code>A(x_1,...,x_k)</code>, returns `k`
+ /** The size of this product.
+ * @return for a product `A(x_1, ..., x_k)`, returns `k`
*/
def productArity: Int
- /** An iterator that returns all fields of this product */
+ /** An iterator over all the elements of this product.
+ * @return in the default implementation, an Iterator[Any]
+ */
def productIterator: Iterator[Any] = new Iterator[Any] {
private var c: Int = 0
private val cmax = productArity
@@ -42,12 +45,11 @@ trait Product extends Equals {
@deprecated("use productIterator instead")
def productElements: Iterator[Any] = productIterator
- /**
- * Returns a string that is used in the `toString` method of subtraits/classes.
- * Implementations may override this
- * method in order to prepend a string prefix to the result of the
- * toString methods.
- * @return the empty string
+ /** A string used in the `toString` methods of derived classes.
+ * Implementations may override this method to prepend a string prefix
+ * to the result of toString methods.
+ *
+ * @return in the default implementation, the empty string
*/
def productPrefix = ""
}
diff --git a/src/library/scala/Short.scala b/src/library/scala/Short.scala
index df3e680575..8bf6f09154 100644
--- a/src/library/scala/Short.scala
+++ b/src/library/scala/Short.scala
@@ -10,9 +10,12 @@
package scala
-import java.{ lang => jl }
-
-
+/** `Short` is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system.
+ *
+ * There is an implicit conversion from [[scala.Short]] => [[scala.runtime.RichShort]]
+ * which provides useful non-primitive operations.
+ */
final class Short extends AnyVal {
def toByte: Byte = sys.error("stub")
def toShort: Short = sys.error("stub")
@@ -143,12 +146,34 @@ final class Short extends AnyVal {
}
-
object Short extends AnyValCompanion {
- final val MinValue = jl.Short.MIN_VALUE
- final val MaxValue = jl.Short.MAX_VALUE
-
- def box(x: Short): jl.Short = jl.Short.valueOf(x)
- def unbox(x: jl.Object): Short = x.asInstanceOf[jl.Short].shortValue()
+ /** The smallest value representable as a Short.
+ */
+ final val MinValue = java.lang.Short.MIN_VALUE
+
+ /** The largest value representable as a Short.
+ */
+ final val MaxValue = java.lang.Short.MAX_VALUE
+
+ /** Transform a value type into a boxed reference type.
+ *
+ * @param x the Short to be boxed
+ * @return a java.lang.Short offering `x` as its underlying value.
+ */
+ def box(x: Short): java.lang.Short = java.lang.Short.valueOf(x)
+
+ /** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a java.lang.Short.
+ *
+ * @param x the java.lang.Short to be unboxed.
+ * @throws ClassCastException if the argument is not a java.lang.Short
+ * @return the Short resulting from calling shortValue() on `x`
+ */
+ def unbox(x: java.lang.Object): Short = x.asInstanceOf[java.lang.Short].shortValue()
+
+ /** The String representation of the scala.Short companion object.
+ */
override def toString = "object scala.Short"
}
+
diff --git a/src/library/scala/Tuple2.scala b/src/library/scala/Tuple2.scala
index fc9b348fdb..afac96fe97 100644
--- a/src/library/scala/Tuple2.scala
+++ b/src/library/scala/Tuple2.scala
@@ -49,7 +49,7 @@ case class Tuple2[@specialized(Int, Long, Double) +T1, @specialized(Int, Long, D
* }}}
*
* @see Zipped
- * $willNotTerminateInf
+ * Note: will not terminate for infinite-sized collections.
*/
def zipped[Repr1, El1, Repr2, El2](implicit w1: T1 => TLike[El1, Repr1], w2: T2 => ILike[El2, Repr2]): Zipped[Repr1, El1, Repr2, El2]
= new Zipped[Repr1, El1, Repr2, El2](_1, _2)
diff --git a/src/library/scala/Tuple3.scala b/src/library/scala/Tuple3.scala
index 2f533b10b2..6458fa5042 100644
--- a/src/library/scala/Tuple3.scala
+++ b/src/library/scala/Tuple3.scala
@@ -46,7 +46,7 @@ case class Tuple3[+T1, +T2, +T3](_1: T1, _2: T2, _3: T3)
* }}}
*
* @see Zipped
- * $willNotTerminateInf
+ * Note: will not terminate for infinite-sized collections.
*/
def zipped[Repr1, El1, Repr2, El2, Repr3, El3](implicit w1: T1 => TLike[El1, Repr1],
w2: T2 => ILike[El2, Repr2],
diff --git a/src/library/scala/Unit.scala b/src/library/scala/Unit.scala
index 9e2d4dc616..58b024273b 100755
--- a/src/library/scala/Unit.scala
+++ b/src/library/scala/Unit.scala
@@ -10,14 +10,35 @@
package scala
-import java.{ lang => jl }
-
-import runtime.BoxedUnit
+/** Unit is a member of the value classes, those whose instances are
+ * not represented as objects by the underlying host system. There is
+ * only one value of type Unit: `()`.
+ */
final class Unit extends AnyVal { }
+
object Unit extends AnyValCompanion {
+
+ /** Transform a value type into a boxed reference type.
+ *
+ * @param x the Unit to be boxed
+ * @return a scala.runtime.BoxedUnit offering `x` as its underlying value.
+ */
+ def box(x: Unit): scala.runtime.BoxedUnit = scala.runtime.BoxedUnit.UNIT
+
+ /** Transform a boxed type into a value type. Note that this
+ * method is not typesafe: it accepts any Object, but will throw
+ * an exception if the argument is not a scala.runtime.BoxedUnit.
+ *
+ * @param x the scala.runtime.BoxedUnit to be unboxed.
+ * @throws ClassCastException if the argument is not a scala.runtime.BoxedUnit
+ * @return the Unit value ()
+ */
+ def unbox(x: java.lang.Object): Unit = ()
+
+ /** The String representation of the scala.Unit companion object.
+ */
override def toString = "object scala.Unit"
- def box(x: Unit): BoxedUnit = BoxedUnit.UNIT
- def unbox(x: jl.Object): Unit = ()
-} \ No newline at end of file
+}
+
diff --git a/src/library/scala/collection/Iterator.scala b/src/library/scala/collection/Iterator.scala
index 81582b7f78..4e349cb423 100644
--- a/src/library/scala/collection/Iterator.scala
+++ b/src/library/scala/collection/Iterator.scala
@@ -12,7 +12,6 @@ package scala.collection
import mutable.ArrayBuffer
import annotation.{ tailrec, migration }
-import parallel.ParIterable
/** The `Iterator` object provides various functions for
* creating specialized iterators.
diff --git a/src/library/scala/collection/Map.scala b/src/library/scala/collection/Map.scala
index 075317a483..7dcaafe45d 100644
--- a/src/library/scala/collection/Map.scala
+++ b/src/library/scala/collection/Map.scala
@@ -13,7 +13,7 @@ import generic._
/**
* A map from keys of type `A` to values of type `B`.
*
- * $mapnote
+ * $mapNote
*
* '''Note:''' If you do not have specific implementations for `add` and `-` in mind,
* you might consider inheriting from `DefaultMap` instead.
diff --git a/src/library/scala/collection/Parallel.scala b/src/library/scala/collection/Parallel.scala
index df77e5d1c7..037abde2b6 100644
--- a/src/library/scala/collection/Parallel.scala
+++ b/src/library/scala/collection/Parallel.scala
@@ -6,21 +6,11 @@
** |/ **
\* */
-
package scala.collection
-
-
-
-
-
/** A marker trait for objects with parallelised operations.
*
* @since 2.9
* @author prokopec
*/
trait Parallel
-
-
-
-
diff --git a/src/library/scala/collection/SetProxyLike.scala b/src/library/scala/collection/SetProxyLike.scala
index eaf67323b7..9308de45b0 100644
--- a/src/library/scala/collection/SetProxyLike.scala
+++ b/src/library/scala/collection/SetProxyLike.scala
@@ -19,10 +19,8 @@ import generic._
* @author Martin Odersky
* @version 2.8
*/
-trait SetProxyLike[A, +This <: SetLike[A, This] with Set[A]] extends SetLike[A, This] with IterableProxyLike[A, This]
-{
+trait SetProxyLike[A, +This <: SetLike[A, This] with Set[A]] extends SetLike[A, This] with IterableProxyLike[A, This] {
def empty: This
- // def empty: This
override def contains(elem: A): Boolean = self.contains(elem)
override def + (elem: A) = self.+(elem)
override def - (elem: A) = self.-(elem)
diff --git a/src/library/scala/collection/SortedSet.scala b/src/library/scala/collection/SortedSet.scala
index 46629b0cec..a1d1cd3fc3 100644
--- a/src/library/scala/collection/SortedSet.scala
+++ b/src/library/scala/collection/SortedSet.scala
@@ -29,6 +29,3 @@ object SortedSet extends SortedSetFactory[SortedSet] {
def empty[A](implicit ord: Ordering[A]): immutable.SortedSet[A] = immutable.SortedSet.empty[A](ord)
implicit def canBuildFrom[A](implicit ord: Ordering[A]): CanBuildFrom[Coll, A, SortedSet[A]] = new SortedSetCanBuildFrom[A]
}
-
-
-
diff --git a/src/library/scala/collection/TraversableOnce.scala b/src/library/scala/collection/TraversableOnce.scala
index 0a2d851b2d..f660d31ab2 100644
--- a/src/library/scala/collection/TraversableOnce.scala
+++ b/src/library/scala/collection/TraversableOnce.scala
@@ -37,11 +37,17 @@ import annotation.unchecked.{ uncheckedVariance => uV }
* @since 2.8
*
* @define coll traversable or iterator
+ * @define orderDependent
+ *
+ * Note: might return different results for different runs, unless the underlying collection type is ordered.
* @define orderDependentFold
*
* Note: might return different results for different runs, unless the
* underlying collection type is ordered or the operator is associative
* and commutative.
+ * @define mayNotTerminateInf
+ *
+ * Note: may not terminate for infinite-sized collections.
* @define willNotTerminateInf
*
* Note: will not terminate for infinite-sized collections.
@@ -393,7 +399,7 @@ trait TraversableOnce[+A] {
}
def minBy[B](f: A => B)(implicit cmp: Ordering[B]): A = {
if (isEmpty)
- throw new UnsupportedOperationException("empty.maxBy")
+ throw new UnsupportedOperationException("empty.minBy")
reduceLeft((x, y) => if (cmp.lteq(f(x), f(y))) x else y)
}
diff --git a/src/library/scala/collection/TraversableViewLike.scala b/src/library/scala/collection/TraversableViewLike.scala
index 6f7f7f5a28..b5b18b7a8a 100644
--- a/src/library/scala/collection/TraversableViewLike.scala
+++ b/src/library/scala/collection/TraversableViewLike.scala
@@ -30,7 +30,7 @@ trait ViewMkString[+A] {
}
/** A template trait for non-strict views of traversable collections.
- * $traversableviewinfo
+ * $traversableViewInfo
*
* Implementation note: Methods such as `map` or `flatMap` on this view will not invoke the implicitly passed
* `Builder` factory, but will return a new view directly, to preserve by-name behavior.
@@ -38,14 +38,14 @@ trait ViewMkString[+A] {
* that takes a `View` as its `From` type parameter must yield the same view (or a generic
* superclass of it) as its result parameter. If that assumption is broken, cast errors might result.
*
- * @define viewinfo
+ * @define viewInfo
* A view is a lazy version of some collection. Collection transformers such as
* `map` or `filter` or `++` do not traverse any elements when applied on a view.
* Instead they create a new view which simply records that fact that the operation
* needs to be applied. The collection elements are accessed, and the view operations are applied,
* when a non-view result is needed, or when the `force` method is called on a view.
- * @define traversableviewinfo
- * $viewinfo
+ * @define traversableViewInfo
+ * $viewInfo
*
* All views for traversable collections are defined by creating a new `foreach` method.
diff --git a/src/library/scala/collection/generic/Addable.scala b/src/library/scala/collection/generic/Addable.scala
index d80e85c039..5be428305e 100644
--- a/src/library/scala/collection/generic/Addable.scala
+++ b/src/library/scala/collection/generic/Addable.scala
@@ -16,10 +16,10 @@ package generic
* @tparam A the type of the elements of the $coll
* @tparam Repr the type of the $coll itself
* @author Martin Odersky
- * @version 2.8
- * @since 2.8
- * @define $coll collection
- * @define $Coll Addable
+ * @version 2.8
+ * @since 2.8
+ * @define coll collection
+ * @define Coll Addable
*/
@deprecated("Will be removed after scala 2.9")
trait Addable[A, +Repr <: Addable[A, Repr]] { self =>
diff --git a/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala b/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala
index 69ae465806..82270d5728 100644
--- a/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala
+++ b/src/library/scala/collection/generic/ClassManifestTraversableFactory.scala
@@ -6,20 +6,14 @@
** |/ **
\* */
-
package scala.collection
package generic
-
-
-
-
abstract class ClassManifestTraversableFactory[CC[X] <: Traversable[X] with GenericClassManifestTraversableTemplate[X, CC]]
-extends GenericClassManifestCompanion[CC] {
+ extends GenericClassManifestCompanion[CC] {
class GenericCanBuildFrom[A](implicit manif: ClassManifest[A]) extends CanBuildFrom[CC[_], A, CC[A]] {
def apply(from: CC[_]) = from.genericClassManifestBuilder[A]
def apply = newBuilder[A]
}
-
}
diff --git a/src/library/scala/collection/generic/GenericClassManifestCompanion.scala b/src/library/scala/collection/generic/GenericClassManifestCompanion.scala
index b85fc93cba..546e82fb4a 100644
--- a/src/library/scala/collection/generic/GenericClassManifestCompanion.scala
+++ b/src/library/scala/collection/generic/GenericClassManifestCompanion.scala
@@ -6,17 +6,12 @@
** |/ **
\* */
-
-
package scala.collection
package generic
import mutable.Builder
-
-
-
-/** This class represents companions of classes which require classmanifests
+/** This class represents companions of classes which require ClassManifests
* for their element types.
*
* @author Aleksandar Prokopec
@@ -34,4 +29,3 @@ abstract class GenericClassManifestCompanion[+CC[X] <: Traversable[X]] {
b.result
}
}
-
diff --git a/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala b/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala
index 80415f8e79..03d426946b 100644
--- a/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala
+++ b/src/library/scala/collection/generic/GenericClassManifestTraversableTemplate.scala
@@ -6,17 +6,12 @@
** |/ **
\* */
-
-
package scala.collection
package generic
import mutable.Builder
import annotation.unchecked.uncheckedVariance
-
-
-
/** This trait represents collections classes which require class
* manifests for their element types.
*
@@ -27,4 +22,3 @@ trait GenericClassManifestTraversableTemplate[+A, +CC[X] <: Traversable[X]] exte
def classManifestCompanion: GenericClassManifestCompanion[CC]
def genericClassManifestBuilder[B](implicit man: ClassManifest[B]): Builder[B, CC[B]] = classManifestCompanion.newBuilder[B]
}
-
diff --git a/src/library/scala/collection/generic/GenericCompanion.scala b/src/library/scala/collection/generic/GenericCompanion.scala
index 5aa9656cf2..084f884ebb 100644
--- a/src/library/scala/collection/generic/GenericCompanion.scala
+++ b/src/library/scala/collection/generic/GenericCompanion.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.collection
package generic
diff --git a/src/library/scala/collection/generic/GenericParCompanion.scala b/src/library/scala/collection/generic/GenericParCompanion.scala
index 0da1a3a543..9e151e7543 100644
--- a/src/library/scala/collection/generic/GenericParCompanion.scala
+++ b/src/library/scala/collection/generic/GenericParCompanion.scala
@@ -1,14 +1,13 @@
package scala.collection.generic
-
import scala.collection.parallel.Combiner
import scala.collection.parallel.ParIterable
import scala.collection.parallel.ParMap
-
-
/** A template class for companion objects of parallel collection classes.
* They should be mixed in together with `GenericCompanion` type.
+ *
+ * @define Coll ParIterable
* @tparam CC the type constructor representing the collection class
* @since 2.8
*/
diff --git a/src/library/scala/collection/generic/ParFactory.scala b/src/library/scala/collection/generic/ParFactory.scala
index a7ebb8c912..b4da60a133 100644
--- a/src/library/scala/collection/generic/ParFactory.scala
+++ b/src/library/scala/collection/generic/ParFactory.scala
@@ -9,8 +9,8 @@ import scala.collection.parallel.Combiner
/** A template class for companion objects of `ParIterable` and subclasses thereof.
* This class extends `TraversableFactory` and provides a set of operations to create `$Coll` objects.
*
- * @define $coll parallel collection
- * @define $Coll ParIterable
+ * @define coll parallel collection
+ * @define Coll ParIterable
*/
abstract class ParFactory[CC[X] <: ParIterable[X] with GenericParTemplate[X, CC]]
extends TraversableFactory[CC]
diff --git a/src/library/scala/collection/generic/ParMapFactory.scala b/src/library/scala/collection/generic/ParMapFactory.scala
index 2fba05c743..dda49e1354 100644
--- a/src/library/scala/collection/generic/ParMapFactory.scala
+++ b/src/library/scala/collection/generic/ParMapFactory.scala
@@ -1,20 +1,15 @@
package scala.collection.generic
-
-
import scala.collection.parallel.ParMap
import scala.collection.parallel.ParMapLike
import scala.collection.parallel.Combiner
import scala.collection.mutable.Builder
-
-
-
/** A template class for companion objects of `ParMap` and subclasses thereof.
* This class extends `TraversableFactory` and provides a set of operations to create `$Coll` objects.
*
- * @define $coll parallel map
- * @define $Coll ParMap
+ * @define coll parallel map
+ * @define Coll ParMap
*/
abstract class ParMapFactory[CC[X, Y] <: ParMap[X, Y] with ParMapLike[X, Y, CC[X, Y], _]]
extends MapFactory[CC]
diff --git a/src/library/scala/collection/generic/Subtractable.scala b/src/library/scala/collection/generic/Subtractable.scala
index 158a3cac60..1b3425d792 100644
--- a/src/library/scala/collection/generic/Subtractable.scala
+++ b/src/library/scala/collection/generic/Subtractable.scala
@@ -16,10 +16,10 @@ package generic
* @tparam A the type of the elements of the $coll.
* @tparam Repr the type of the $coll itself
* @author Martin Odersky
- * @version 2.8
- * @since 2.8
- * @define $coll collection
- * @define $Coll Subtractable
+ * @version 2.8
+ * @since 2.8
+ * @define coll collection
+ * @define Coll Subtractable
*/
trait Subtractable[A, +Repr <: Subtractable[A, Repr]] { self =>
diff --git a/src/library/scala/collection/immutable/IntMap.scala b/src/library/scala/collection/immutable/IntMap.scala
index 140ba4dbec..ea68b53518 100644
--- a/src/library/scala/collection/immutable/IntMap.scala
+++ b/src/library/scala/collection/immutable/IntMap.scala
@@ -35,6 +35,11 @@ private[immutable] object IntMapUtils extends BitOperations.Int {
import IntMapUtils._
/** A companion object for integer maps.
+ *
+ * @define Coll IntMap
+ * @define mapCanBuildFromInfo
+ * The standard `CanBuildFrom` instance for `$Coll` objects.
+ * The created value is an instance of class `MapCanBuildFrom`.
* @since 2.7
*/
object IntMap {
diff --git a/src/library/scala/collection/immutable/List.scala b/src/library/scala/collection/immutable/List.scala
index c46c487968..84b62e7e29 100644
--- a/src/library/scala/collection/immutable/List.scala
+++ b/src/library/scala/collection/immutable/List.scala
@@ -33,7 +33,7 @@ import annotation.tailrec
* @define thatinfo the class of the returned collection. In the standard library configuration,
* `That` is always `List[B]` because an implicit of type `CanBuildFrom[List, B, That]`
* is defined in object `List`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `List`.
diff --git a/src/library/scala/collection/immutable/LongMap.scala b/src/library/scala/collection/immutable/LongMap.scala
index d5f1374540..030dd72d35 100644
--- a/src/library/scala/collection/immutable/LongMap.scala
+++ b/src/library/scala/collection/immutable/LongMap.scala
@@ -35,9 +35,14 @@ private[immutable] object LongMapUtils extends BitOperations.Long {
import LongMapUtils._
/** A companion object for long maps.
+ *
+ * @define Coll LongMap
+ * @define mapCanBuildFromInfo
+ * The standard `CanBuildFrom` instance for `$Coll` objects.
+ * The created value is an instance of class `MapCanBuildFrom`.
* @since 2.7
*/
-object LongMap{
+object LongMap {
/** $mapCanBuildFromInfo */
implicit def canBuildFrom[A, B] = new CanBuildFrom[LongMap[A], (Long, B), LongMap[B]] {
def apply(from: LongMap[A]): Builder[(Long, B), LongMap[B]] = apply()
@@ -69,7 +74,6 @@ object LongMap{
else LongMap.Bin[S](prefix, mask, left, right);
}
}
-
}
import LongMap._
diff --git a/src/library/scala/collection/immutable/Set.scala b/src/library/scala/collection/immutable/Set.scala
index 7975134174..33bc50ab56 100644
--- a/src/library/scala/collection/immutable/Set.scala
+++ b/src/library/scala/collection/immutable/Set.scala
@@ -15,13 +15,12 @@ import generic._
import parallel.immutable.ParSet
/** A generic trait for immutable sets.
+ * $setNote
+ * $setTags
*
- * $setnote
- *
+ * @since 1.0
* @author Matthias Zenger
* @author Martin Odersky
- * @version 2.8
- * @since 1
* @define Coll immutable.Set
* @define coll immutable set
*/
diff --git a/src/library/scala/collection/immutable/StringLike.scala b/src/library/scala/collection/immutable/StringLike.scala
index 926fde4fe0..98f1b90866 100644
--- a/src/library/scala/collection/immutable/StringLike.scala
+++ b/src/library/scala/collection/immutable/StringLike.scala
@@ -162,6 +162,21 @@ self =>
if (toString.endsWith(suffix)) toString.substring(0, toString.length() - suffix.length)
else toString
+ /** Replace all literal occurrences of `literal` with the string `replacement`.
+ * This is equivalent to [[java.lang.String#replaceAll]] except that both arguments
+ * are appropriately quoted to avoid being interpreted as metacharacters.
+ *
+ * @param literal the string which should be replaced everywhere it occurs
+ * @param replacement the replacement string
+ * @return the resulting string
+ */
+ def replaceAllLiterally(literal: String, replacement: String): String = {
+ val arg1 = java.util.regex.Pattern.quote(literal)
+ val arg2 = java.util.regex.Matcher.quoteReplacement(replacement)
+
+ toString.replaceAll(arg1, arg2)
+ }
+
/**
* For every line in this string:
*
diff --git a/src/library/scala/collection/mutable/ArrayBuffer.scala b/src/library/scala/collection/mutable/ArrayBuffer.scala
index daa3c48578..7edbad6518 100644
--- a/src/library/scala/collection/mutable/ArrayBuffer.scala
+++ b/src/library/scala/collection/mutable/ArrayBuffer.scala
@@ -31,7 +31,7 @@ import parallel.mutable.ParArray
* @define thatinfo the class of the returned collection. In the standard library configuration,
* `That` is always `ArrayBuffer[B]` because an implicit of type `CanBuildFrom[ArrayBuffer, B, ArrayBuffer[B]]`
* is defined in object `ArrayBuffer`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `ArrayBuffer`.
diff --git a/src/library/scala/collection/mutable/ArraySeq.scala b/src/library/scala/collection/mutable/ArraySeq.scala
index 0b3f0ebc5b..b6cafbb677 100644
--- a/src/library/scala/collection/mutable/ArraySeq.scala
+++ b/src/library/scala/collection/mutable/ArraySeq.scala
@@ -30,7 +30,7 @@ import parallel.mutable.ParArray
* @define thatinfo the class of the returned collection. In the standard library configuration,
* `That` is always `ArraySeq[B]` because an implicit of type `CanBuildFrom[ArraySeq, B, ArraySeq[B]]`
* is defined in object `ArraySeq`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `ArraySeq`.
diff --git a/src/library/scala/collection/mutable/BitSet.scala b/src/library/scala/collection/mutable/BitSet.scala
index 4735d58e33..a547e8a17e 100644
--- a/src/library/scala/collection/mutable/BitSet.scala
+++ b/src/library/scala/collection/mutable/BitSet.scala
@@ -23,7 +23,7 @@ import BitSetLike.{LogWL, updateArray}
* @define thatinfo the class of the returned collection. In the standard library configuration,
* `That` is always `BitSet[B]` because an implicit of type `CanBuildFrom[BitSet, B, BitSet]`
* is defined in object `BitSet`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `BitSet`.
diff --git a/src/library/scala/collection/mutable/DoubleLinkedList.scala b/src/library/scala/collection/mutable/DoubleLinkedList.scala
index f2a732ffd1..2d630c3756 100644
--- a/src/library/scala/collection/mutable/DoubleLinkedList.scala
+++ b/src/library/scala/collection/mutable/DoubleLinkedList.scala
@@ -28,7 +28,7 @@ import generic._
* @define thatinfo the class of the returned collection. In the standard library configuration,
* `That` is always `DoubleLinkedList[B]` because an implicit of type `CanBuildFrom[DoubleLinkedList, B, DoubleLinkedList[B]]`
* is defined in object `DoubleLinkedList`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `DoubleLinkedList`.
@@ -66,26 +66,24 @@ class DoubleLinkedList[A]() extends LinearSeq[A]
* @define Coll DoubleLinkedList
*/
object DoubleLinkedList extends SeqFactory[DoubleLinkedList] {
- /** $genericCanBuildFrom */
+ /** $genericCanBuildFromInfo */
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, DoubleLinkedList[A]] = new GenericCanBuildFrom[A]
+
def newBuilder[A]: Builder[A, DoubleLinkedList[A]] =
new Builder[A, DoubleLinkedList[A]] {
- var current: DoubleLinkedList[A] = _
- val emptyList = new DoubleLinkedList[A]()
- if(null == current)
- current = emptyList
+ def emptyList() = new DoubleLinkedList[A]()
+ var current = emptyList()
def +=(elem: A): this.type = {
- if (current.nonEmpty)
- current.insert(new DoubleLinkedList(elem, emptyList))
+ if (current.isEmpty)
+ current = new DoubleLinkedList(elem, emptyList())
else
- current = new DoubleLinkedList(elem, emptyList)
+ current append new DoubleLinkedList(elem, emptyList())
+
this
}
- def clear() {
- current = emptyList
- }
+ def clear(): Unit = current = emptyList()
def result() = current
}
}
diff --git a/src/library/scala/collection/mutable/DoubleLinkedListLike.scala b/src/library/scala/collection/mutable/DoubleLinkedListLike.scala
index 18a0e164a2..7ad2f9558f 100644
--- a/src/library/scala/collection/mutable/DoubleLinkedListLike.scala
+++ b/src/library/scala/collection/mutable/DoubleLinkedListLike.scala
@@ -110,12 +110,9 @@ trait DoubleLinkedListLike[A, This <: Seq[A] with DoubleLinkedListLike[A, This]]
private def outofbounds(n: Int) = throw new IndexOutOfBoundsException(n.toString)
- override def drop(n: Int): This = super[SeqLike].drop(n)
-
- override def tail = drop(1)
-
- override def apply(n: Int): A = atLocation(n)(_.elem)(outofbounds(n))
- override def update(n: Int, x: A): Unit = atLocation(n)(_.elem = x)(outofbounds(n))
- override def get(n: Int): Option[A] = atLocation[Option[A]](n)(x => Some(x.elem))(None)
-
+ override def drop(n: Int): This = super[SeqLike].drop(n)
+ override def tail = drop(1)
+ override def apply(n: Int): A = atLocation(n)(_.elem)(outofbounds(n))
+ override def update(n: Int, x: A): Unit = atLocation(n)(_.elem = x)(outofbounds(n))
+ override def get(n: Int): Option[A] = atLocation[Option[A]](n)(x => Some(x.elem))(None)
}
diff --git a/src/library/scala/collection/mutable/FlatHashTable.scala b/src/library/scala/collection/mutable/FlatHashTable.scala
index 48386c8034..d78c466f69 100644
--- a/src/library/scala/collection/mutable/FlatHashTable.scala
+++ b/src/library/scala/collection/mutable/FlatHashTable.scala
@@ -16,13 +16,10 @@ package mutable
* This trait is used internally. It can be mixed in with various collections relying on
* hash table as an implementation.
*
- * @coll flat hash table
- *
+ * @define coll flat hash table
* @define cannotStoreNull '''Note''': A $coll cannot store `null` elements.
- *
* @since 2.3
- *
- * @tparam A the type of the elements contained in the flat hash table.
+ * @tparam A the type of the elements contained in the $coll.
*/
trait FlatHashTable[A] extends FlatHashTable.HashUtils[A] {
import FlatHashTable._
diff --git a/src/library/scala/collection/mutable/HashMap.scala b/src/library/scala/collection/mutable/HashMap.scala
index e78e9a1296..19ad53faf5 100644
--- a/src/library/scala/collection/mutable/HashMap.scala
+++ b/src/library/scala/collection/mutable/HashMap.scala
@@ -32,7 +32,7 @@ import scala.collection.parallel.mutable.ParHashMap
* pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[HashMap, (A, B), HashMap[A, B]]`
* is defined in object `HashMap`. Otherwise, `That` resolves to the most specific type that doesn't have
* to contain pairs of type `(A, B)`, which is `Iterable`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `HashMap`.
diff --git a/src/library/scala/collection/mutable/HashSet.scala b/src/library/scala/collection/mutable/HashSet.scala
index 2ba5065964..134558ad15 100644
--- a/src/library/scala/collection/mutable/HashSet.scala
+++ b/src/library/scala/collection/mutable/HashSet.scala
@@ -23,15 +23,12 @@ import collection.parallel.mutable.ParHashSet
* @version 2.0, 31/12/2006
* @since 1
*
- * @tparam A the type of the elements contained in this set.
- *
- *
* @define Coll mutable.HashSet
* @define coll mutable hash set
* @define thatinfo the class of the returned collection. In the standard library configuration,
* `That` is always `HashSet[B]` because an implicit of type `CanBuildFrom[HashSet, B, HashSet[B]]`
* is defined in object `HashSet`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `HashSet`.
diff --git a/src/library/scala/collection/mutable/IndexedSeqView.scala b/src/library/scala/collection/mutable/IndexedSeqView.scala
index 12b0229ae1..6af00d03b1 100644
--- a/src/library/scala/collection/mutable/IndexedSeqView.scala
+++ b/src/library/scala/collection/mutable/IndexedSeqView.scala
@@ -16,7 +16,7 @@ import generic._
import TraversableView.NoBuilder
/** A non-strict view of a mutable `IndexedSeq`.
- * $viewinfo
+ * $viewInfo
* Some of the operations of this class will yield again a mutable indexed sequence,
* others will just yield a plain indexed sequence of type `collection.IndexedSeq`.
* Because this is a leaf class there is no associated `Like' class.
diff --git a/src/library/scala/collection/mutable/LinkedHashMap.scala b/src/library/scala/collection/mutable/LinkedHashMap.scala
index 6df68b6e6e..31f539cc09 100644
--- a/src/library/scala/collection/mutable/LinkedHashMap.scala
+++ b/src/library/scala/collection/mutable/LinkedHashMap.scala
@@ -35,7 +35,7 @@ object LinkedHashMap extends MutableMapFactory[LinkedHashMap] {
* pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[LinkedHashMap, (A, B), LinkedHashMap[A, B]]`
* is defined in object `LinkedHashMap`. Otherwise, `That` resolves to the most specific type that doesn't have
* to contain pairs of type `(A, B)`, which is `Iterable`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `LinkedHashMap`.
diff --git a/src/library/scala/collection/mutable/LinkedHashSet.scala b/src/library/scala/collection/mutable/LinkedHashSet.scala
index bdbd22286a..7a1e695f32 100644
--- a/src/library/scala/collection/mutable/LinkedHashSet.scala
+++ b/src/library/scala/collection/mutable/LinkedHashSet.scala
@@ -29,7 +29,7 @@ import generic._
* @define thatinfo the class of the returned collection. In the standard library configuration,
* `That` is always `LinkedHashSet[B]` because an implicit of type `CanBuildFrom[LinkedHashSet, B, LinkedHashSet[B]]`
* is defined in object `LinkedHashSet`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `LinkedHashSet`.
diff --git a/src/library/scala/collection/mutable/LinkedList.scala b/src/library/scala/collection/mutable/LinkedList.scala
index beee4857b0..b701a42596 100644
--- a/src/library/scala/collection/mutable/LinkedList.scala
+++ b/src/library/scala/collection/mutable/LinkedList.scala
@@ -28,7 +28,7 @@ import generic._
* @define thatinfo the class of the returned collection. In the standard library configuration,
* `That` is always `LinkedList[B]` because an implicit of type `CanBuildFrom[LinkedList, B, LinkedList[B]]`
* is defined in object `LinkedList`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `LinkedList`.
@@ -60,10 +60,9 @@ class LinkedList[A]() extends LinearSeq[A]
* @define coll linked list
*/
object LinkedList extends SeqFactory[LinkedList] {
-
override def empty[A]: LinkedList[A] = new LinkedList[A]
-
implicit def canBuildFrom[A]: CanBuildFrom[Coll, A, LinkedList[A]] = new GenericCanBuildFrom[A]
+
def newBuilder[A]: Builder[A, LinkedList[A]] =
(new MutableList) mapResult ((l: MutableList[A]) => l.toLinkedList)
}
diff --git a/src/library/scala/collection/mutable/LinkedListLike.scala b/src/library/scala/collection/mutable/LinkedListLike.scala
index b24cda946e..a3fd786c2a 100644
--- a/src/library/scala/collection/mutable/LinkedListLike.scala
+++ b/src/library/scala/collection/mutable/LinkedListLike.scala
@@ -60,12 +60,14 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq
var next: This = _
override def isEmpty = next eq this
-
override def length: Int = length0(repr, 0)
- @tailrec private def length0(elem: This, acc: Int): Int = if (elem.isEmpty) acc else length0(elem.next, acc + 1)
+ @tailrec private def length0(elem: This, acc: Int): Int =
+ if (elem.isEmpty) acc else length0(elem.next, acc + 1)
- override def head: A = elem
+ override def head: A =
+ if (isEmpty) throw new NoSuchElementException
+ else elem
override def tail: This = {
require(nonEmpty, "tail of empty list")
@@ -92,7 +94,8 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq
def insert(that: This): Unit = {
require(nonEmpty, "insert into empty list")
if (that.nonEmpty) {
- next = next.append(that)
+ that append next
+ next = that
}
}
@@ -100,7 +103,7 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq
var i = 0
var these: This = repr
while (i < n && !these.isEmpty) {
- these = these.next.asInstanceOf[This] // !!! concrete overrides abstract problem
+ these = these.next
i += 1
}
these
@@ -108,7 +111,7 @@ trait LinkedListLike[A, This <: Seq[A] with LinkedListLike[A, This]] extends Seq
private def atLocation[T](n: Int)(f: This => T) = {
val loc = drop(n)
- if (!loc.isEmpty) f(loc)
+ if (loc.nonEmpty) f(loc)
else throw new IndexOutOfBoundsException(n.toString)
}
diff --git a/src/library/scala/collection/mutable/ListBuffer.scala b/src/library/scala/collection/mutable/ListBuffer.scala
index 67d34cb481..6a75108dfb 100644
--- a/src/library/scala/collection/mutable/ListBuffer.scala
+++ b/src/library/scala/collection/mutable/ListBuffer.scala
@@ -29,7 +29,7 @@ import immutable.{List, Nil, ::}
* @define thatinfo the class of the returned collection. In the standard library configuration,
* `That` is always `ListBuffer[B]` because an implicit of type `CanBuildFrom[ListBuffer, B, ListBuffer[B]]`
* is defined in object `ListBuffer`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `ListBuffer`.
diff --git a/src/library/scala/collection/mutable/ListMap.scala b/src/library/scala/collection/mutable/ListMap.scala
index 37baea60c2..c02593fdf3 100644
--- a/src/library/scala/collection/mutable/ListMap.scala
+++ b/src/library/scala/collection/mutable/ListMap.scala
@@ -25,7 +25,7 @@ import generic._
* pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[ListMap, (A, B), ListMap[A, B]]`
* is defined in object `ListMap`. Otherwise, `That` resolves to the most specific type that doesn't have
* to contain pairs of type `(A, B)`, which is `Iterable`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `ListMap`.
diff --git a/src/library/scala/collection/mutable/MutableList.scala b/src/library/scala/collection/mutable/MutableList.scala
index 0595faff67..86b0da39f1 100644
--- a/src/library/scala/collection/mutable/MutableList.scala
+++ b/src/library/scala/collection/mutable/MutableList.scala
@@ -17,8 +17,7 @@ import immutable.{List, Nil}
// !!! todo: convert to LinkedListBuffer?
/**
* This class is used internally to represent mutable lists. It is the
- * basis for the implementation of the classes
- * `Stack`, and `Queue`.
+ * basis for the implementation of the class `Queue`.
*
* @author Matthias Zenger
* @author Martin Odersky
diff --git a/src/library/scala/collection/mutable/Set.scala b/src/library/scala/collection/mutable/Set.scala
index 8d0588e5b9..dba629ae67 100644
--- a/src/library/scala/collection/mutable/Set.scala
+++ b/src/library/scala/collection/mutable/Set.scala
@@ -13,11 +13,14 @@ package mutable
import generic._
-/** A base trait for sets that can be mutated.
+/** A generic trait for mutable sets.
* $setNote
* $setTags
+ *
* @since 1.0
* @author Matthias Zenger
+ * @define Coll mutable.Set
+ * @define coll mutable set
*/
trait Set[A] extends Iterable[A]
with scala.collection.Set[A]
diff --git a/src/library/scala/collection/mutable/StringBuilder.scala b/src/library/scala/collection/mutable/StringBuilder.scala
index 0d1c51c42f..925a9fd9da 100644
--- a/src/library/scala/collection/mutable/StringBuilder.scala
+++ b/src/library/scala/collection/mutable/StringBuilder.scala
@@ -445,10 +445,9 @@ final class StringBuilder(private val underlying: JavaStringBuilder)
*/
override def mkString = toString
- /** Returns the result of this Builder, which in the case
- * of StringBuilders is a StringBuilder (not a String.)
+ /** Returns the result of this Builder (a String)
*
- * @return this StringBuilder
+ * @return the string assembled by this StringBuilder
*/
def result(): String = toString
}
diff --git a/src/library/scala/collection/mutable/UnrolledBuffer.scala b/src/library/scala/collection/mutable/UnrolledBuffer.scala
index 10a572408b..0933aeaf69 100644
--- a/src/library/scala/collection/mutable/UnrolledBuffer.scala
+++ b/src/library/scala/collection/mutable/UnrolledBuffer.scala
@@ -1,15 +1,8 @@
package scala.collection.mutable
-
-
import collection.generic._
-
import annotation.tailrec
-
-
-
-
/** A buffer that stores elements in an unrolled linked list.
*
* Unrolled linked lists store elements in linked fixed size
@@ -32,10 +25,10 @@ import annotation.tailrec
* Better than singly linked lists for random access, but
* should still be avoided for such a purpose.
*
+ * @define coll unrolled buffer
+ * @define Coll UnrolledBuffer
* @author Aleksandar Prokopec
*
- * @coll unrolled buffer
- * @Coll UnrolledBuffer
*/
@SerialVersionUID(1L)
class UnrolledBuffer[T](implicit val manifest: ClassManifest[T])
diff --git a/src/library/scala/collection/mutable/WeakHashMap.scala b/src/library/scala/collection/mutable/WeakHashMap.scala
index 3e6366dbd0..be2daa05ce 100644
--- a/src/library/scala/collection/mutable/WeakHashMap.scala
+++ b/src/library/scala/collection/mutable/WeakHashMap.scala
@@ -30,7 +30,7 @@ import generic._
* pairs of type `(A, B)`. This is because an implicit of type `CanBuildFrom[WeakHashMap, (A, B), WeakHashMap[A, B]]`
* is defined in object `WeakHashMap`. Otherwise, `That` resolves to the most specific type that doesn't have
* to contain pairs of type `(A, B)`, which is `Iterable`.
- * @define $bfinfo an implicit value of class `CanBuildFrom` which determines the
+ * @define bfinfo an implicit value of class `CanBuildFrom` which determines the
* result class `That` from the current representation type `Repr`
* and the new element type `B`. This is usually the `canBuildFrom` value
* defined in object `WeakHashMap`.
diff --git a/src/library/scala/collection/parallel/ParIterable.scala b/src/library/scala/collection/parallel/ParIterable.scala
index 48b0e35151..aeed6949c7 100644
--- a/src/library/scala/collection/parallel/ParIterable.scala
+++ b/src/library/scala/collection/parallel/ParIterable.scala
@@ -6,15 +6,12 @@
** |/ **
\* */
-
package scala.collection.parallel
-
import scala.collection.generic._
import scala.collection.parallel.mutable.ParArrayCombiner
import scala.collection.parallel.mutable.ParArray
-
/** A template trait for parallel iterable collections.
*
* $paralleliterableinfo
@@ -35,7 +32,7 @@ trait ParIterable[+T] extends Iterable[T]
override def companion: GenericCompanion[ParIterable] with GenericParCompanion[ParIterable] = ParIterable
}
-/** $factoryinfo
+/** $factoryInfo
*/
object ParIterable extends ParFactory[ParIterable] {
implicit def canBuildFrom[T]: CanCombineFrom[Coll, T, ParIterable[T]] = new GenericCanCombineFrom[T]
@@ -44,17 +41,3 @@ object ParIterable extends ParFactory[ParIterable] {
def newCombiner[T]: Combiner[T, ParIterable[T]] = ParArrayCombiner[T]
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/library/scala/collection/parallel/immutable/ParHashMap.scala b/src/library/scala/collection/parallel/immutable/ParHashMap.scala
index 84705c33e7..11d4a02e18 100644
--- a/src/library/scala/collection/parallel/immutable/ParHashMap.scala
+++ b/src/library/scala/collection/parallel/immutable/ParHashMap.scala
@@ -146,7 +146,7 @@ self =>
}
-/** $factoryinfo
+/** $factoryInfo
* @define Coll immutable.ParHashMap
* @define coll immutable parallel hash map
*/
diff --git a/src/library/scala/collection/parallel/immutable/ParHashSet.scala b/src/library/scala/collection/parallel/immutable/ParHashSet.scala
index 29c6eb0f93..e292a3ef72 100644
--- a/src/library/scala/collection/parallel/immutable/ParHashSet.scala
+++ b/src/library/scala/collection/parallel/immutable/ParHashSet.scala
@@ -127,7 +127,7 @@ self =>
}
-/** $factoryinfo
+/** $factoryInfo
* @define Coll immutable.ParHashSet
* @define coll immutable parallel hash set
*/
diff --git a/src/library/scala/collection/parallel/immutable/ParIterable.scala b/src/library/scala/collection/parallel/immutable/ParIterable.scala
index c4da1ced8e..085f5220dd 100644
--- a/src/library/scala/collection/parallel/immutable/ParIterable.scala
+++ b/src/library/scala/collection/parallel/immutable/ParIterable.scala
@@ -44,7 +44,7 @@ extends collection.immutable.Iterable[T]
}
-/** $factoryinfo
+/** $factoryInfo
*/
object ParIterable extends ParFactory[ParIterable] {
implicit def canBuildFrom[T]: CanCombineFrom[Coll, T, ParIterable[T]] =
diff --git a/src/library/scala/collection/parallel/mutable/ParArray.scala b/src/library/scala/collection/parallel/mutable/ParArray.scala
index f976098f5e..0ac009d58c 100644
--- a/src/library/scala/collection/parallel/mutable/ParArray.scala
+++ b/src/library/scala/collection/parallel/mutable/ParArray.scala
@@ -682,7 +682,7 @@ self =>
}
-/** $factoryinfo
+/** $factoryInfo
* @define Coll mutable.ParArray
* @define coll parallel array
*/
diff --git a/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala b/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala
index 3bb3d4d763..f2205fbb17 100644
--- a/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala
+++ b/src/library/scala/collection/parallel/mutable/ParFlatHashTable.scala
@@ -6,21 +6,16 @@
** |/ **
\* */
-
package scala.collection
package parallel.mutable
-
-
-
import collection.parallel.ParIterableIterator
-
-
-
/** Parallel flat hash table.
*
- * @tparam T type of the elements in the table
+ * @tparam T type of the elements in the $coll.
+ * @define coll table
+ * @define Coll flat hash table
*
* @author Aleksandar Prokopec
*/
diff --git a/src/library/scala/collection/parallel/mutable/ParHashMap.scala b/src/library/scala/collection/parallel/mutable/ParHashMap.scala
index 2945bcdc61..a3f3c33af5 100644
--- a/src/library/scala/collection/parallel/mutable/ParHashMap.scala
+++ b/src/library/scala/collection/parallel/mutable/ParHashMap.scala
@@ -141,7 +141,7 @@ self =>
}
-/** $factoryinfo
+/** $factoryInfo
* @define Coll mutable.ParHashMap
* @define coll parallel hash map
*/
diff --git a/src/library/scala/collection/parallel/mutable/ParHashSet.scala b/src/library/scala/collection/parallel/mutable/ParHashSet.scala
index 0b969d1cf0..6d82e1b6aa 100644
--- a/src/library/scala/collection/parallel/mutable/ParHashSet.scala
+++ b/src/library/scala/collection/parallel/mutable/ParHashSet.scala
@@ -6,12 +6,8 @@
** |/ **
\* */
-
package scala.collection.parallel.mutable
-
-
-
import collection.generic._
import collection.mutable.HashSet
import collection.mutable.FlatHashTable
@@ -19,18 +15,15 @@ import collection.parallel.Combiner
import collection.parallel.EnvironmentPassingCombiner
import collection.mutable.UnrolledBuffer
-
-
-
/** A parallel hash set.
*
* `ParHashSet` is a parallel set which internally keeps elements within a hash table.
* It uses linear probing to resolve collisions.
*
- * @tparam T type of the elements in the parallel hash map
+ * @tparam T type of the elements in the $coll.
*
- * @define Coll ParHashMap
- * @define coll parallel hash map
+ * @define Coll ParHashSet
+ * @define coll parallel hash set
*
* @author Aleksandar Prokopec
*/
@@ -317,7 +310,6 @@ self: EnvironmentPassingCombiner[T, ParHashSet[T]] =>
}
-
private[parallel] object ParHashSetCombiner {
private[mutable] val discriminantbits = 5
private[mutable] val numblocks = 1 << discriminantbits
@@ -327,16 +319,3 @@ private[parallel] object ParHashSetCombiner {
def apply[T] = new ParHashSetCombiner[T](FlatHashTable.defaultLoadFactor) with EnvironmentPassingCombiner[T, ParHashSet[T]]
}
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/library/scala/collection/parallel/mutable/ParIterable.scala b/src/library/scala/collection/parallel/mutable/ParIterable.scala
index fcba75452f..cd0c45bd0d 100644
--- a/src/library/scala/collection/parallel/mutable/ParIterable.scala
+++ b/src/library/scala/collection/parallel/mutable/ParIterable.scala
@@ -39,7 +39,7 @@ trait ParIterable[T] extends collection.mutable.Iterable[T]
override def toSeq: ParSeq[T] = toParCollection[T, ParSeq[T]](() => ParSeq.newCombiner[T])
}
-/** $factoryinfo
+/** $factoryInfo
*/
object ParIterable extends ParFactory[ParIterable] {
implicit def canBuildFrom[T]: CanCombineFrom[Coll, T, ParIterable[T]] =
diff --git a/src/library/scala/io/Position.scala b/src/library/scala/io/Position.scala
index d08ed2d7e7..3cc7a481f3 100644
--- a/src/library/scala/io/Position.scala
+++ b/src/library/scala/io/Position.scala
@@ -6,97 +6,76 @@
** |/ **
\* */
-
-
package scala.io
-/** <p>
- * The object <code>Position</code> provides convenience methods to encode
- * line and column number in one single integer. The encode line (column)
- * numbers range from 0 to <code>LINE_MASK</code>
- * (<code>COLUMN_MASK</code>), where 0 indicates that the line (column) is
- * the undefined and 1 represents the first line (column). Line (Column)
- * numbers greater than <code>LINE_MASK</code>
- * (<code>COLUMN_MASK</code>) are replaced by <code>LINE_MASK</code>
- * (<code>COLUMN_MASK</code>). Furthermore, if the encoded line number is
- * <code>LINE_MASK</code>, the column number is always set to 0.
- * </p>
- * <p>
- * The following properties hold:
- * </p>
- * <ul>
- * <li>
- * the undefined position is 0: <code>encode(0,0) == 0</code>
- * </li>
- * <li>
- * encodings are non-negative : <code>encode(line,column) >= 0</code>
- * </li>
- * <li>
- * position order is preserved:
- * <code>(line1 &lt; line2) || (line1 == line2 &amp;&amp; column1 &lt; column2)</code>
- * <div>implies</div>
- * <code>encode(line1,column1) &lt;= encode(line2,column2)</code>
- * </li>
- * </ul>
+/** The object Position provides convenience methods to encode
+ * line and column number in one single integer. The encoded line
+ * (column) numbers range from 0 to LINE_MASK (COLUMN_MASK),
+ * where 0 indicates that the line (column) is undefined and 1
+ * represents the first line (column).
+ *
+ * Line (Column) numbers greater than LINE_MASK (COLUMN_MASK) are
+ * replaced by LINE_MASK (COLUMN_MASK). Furthermore, if the encoded
+ * line number is LINE_MASK, the column number is always set to 0.
+ *
+ * The following properties hold:
+ *
+ * the undefined position is 0: encode(0,0) == 0
+ * encodings are non-negative : encode(line,column) >= 0
+ * position order is preserved:
+ *
+ * (line1 <= line2) || (line1 == line2 && column1 <= column2)
+ * implies
+ * encode(line1,column1) <= encode(line2,column2)
*
* @author Burak Emir (translated from work by Matthias Zenger and others)
*/
-object Position {
+abstract class Position {
+ /** Definable behavior for overflow conditions.
+ */
+ def checkInput(line: Int, column: Int): Unit
/** Number of bits used to encode the line number */
final val LINE_BITS = 20
/** Number of bits used to encode the column number */
final val COLUMN_BITS = 31 - LINE_BITS // no negatives => 31
-
/** Mask to decode the line number */
final val LINE_MASK = (1 << LINE_BITS) - 1
/** Mask to decode the column number */
final val COLUMN_MASK = (1 << COLUMN_BITS) - 1
- /** The undefined position */
- final val NOPOS = 0
-
- /** The first position in a source file */
- final val FIRSTPOS = encode(1, 1)
-
/** Encodes a position into a single integer. */
final def encode(line: Int, column: Int): Int = {
- var line1, column1 = 0
- if (line < 0)
- throw new IllegalArgumentException(line + " < 0")
- if ((line == 0) && (column != 0))
- throw new IllegalArgumentException(line + "," + column + " not allowed")
- if (column < 0)
- throw new IllegalArgumentException(line + "," + column + " not allowed")
+ checkInput(line, column)
- if (line >= LINE_MASK) {
- line1 = LINE_MASK
- column1 = 0
- }
- else {
- line1 = line
- if (column > COLUMN_MASK)
- column1 = COLUMN_MASK
- else
- column1 = column
- }
- (line1 << COLUMN_BITS) | column1
+ if (line >= LINE_MASK)
+ LINE_MASK << COLUMN_BITS
+ else
+ (line << COLUMN_BITS) | math.min(LINE_MASK, line)
}
/** Returns the line number of the encoded position. */
- final def line(pos: Int): Int =
- (pos >> COLUMN_BITS) & LINE_MASK
+ final def line(pos: Int): Int = (pos >> COLUMN_BITS) & LINE_MASK
/** Returns the column number of the encoded position. */
- final def column(pos: Int): Int =
- pos & COLUMN_MASK
+ final def column(pos: Int): Int = pos & COLUMN_MASK
/** Returns a string representation of the encoded position. */
- def toString(pos: Int): String = {
- val sb = new StringBuilder
- sb append line(pos)
- sb append ':'
- sb append column(pos)
- sb.toString()
+ def toString(pos: Int): String = line(pos) + ":" + column(pos)
+}
+
+object Position extends Position {
+ /** The undefined position */
+ @deprecated("This will be removed") final val NOPOS = 0
+ /** The first position in a source file */
+ @deprecated("This will be removed") final val FIRSTPOS = encode(1, 1)
+
+ def checkInput(line: Int, column: Int) {
+ if (line < 0)
+ throw new IllegalArgumentException(line + " < 0")
+ if ((line == 0) && (column != 0))
+ throw new IllegalArgumentException(line + "," + column + " not allowed")
+ if (column < 0)
+ throw new IllegalArgumentException(line + "," + column + " not allowed")
}
}
diff --git a/src/library/scala/io/Source.scala b/src/library/scala/io/Source.scala
index 570c48a91a..c81f2bfed0 100644
--- a/src/library/scala/io/Source.scala
+++ b/src/library/scala/io/Source.scala
@@ -186,7 +186,6 @@ abstract class Source extends Iterator[Char] {
/** description of this source, default empty */
var descr: String = ""
-
var nerrors = 0
var nwarnings = 0
@@ -242,7 +241,8 @@ abstract class Source extends Iterator[Char] {
*/
def next: Char = positioner.next
- class Positioner {
+ class Positioner(encoder: Position) {
+ def this() = this(RelaxedPosition)
/** the last character returned by next. */
var ch: Char = _
@@ -258,7 +258,7 @@ abstract class Source extends Iterator[Char] {
def next: Char = {
ch = iter.next
- pos = Position.encode(cline, ccol)
+ pos = encoder.encode(cline, ccol)
ch match {
case '\n' =>
ccol = 1
@@ -271,7 +271,14 @@ abstract class Source extends Iterator[Char] {
ch
}
}
- object NoPositioner extends Positioner {
+ /** A Position implementation which ignores errors in
+ * the positions.
+ */
+ object RelaxedPosition extends Position {
+ def checkInput(line: Int, column: Int): Unit = ()
+ }
+ object RelaxedPositioner extends Positioner(RelaxedPosition) { }
+ object NoPositioner extends Positioner(Position) {
override def next: Char = iter.next
}
def ch = positioner.ch
@@ -321,7 +328,7 @@ abstract class Source extends Iterator[Char] {
private[this] var resetFunction: () => Source = null
private[this] var closeFunction: () => Unit = null
- private[this] var positioner: Positioner = new Positioner
+ private[this] var positioner: Positioner = RelaxedPositioner
def withReset(f: () => Source): this.type = {
resetFunction = f
@@ -335,10 +342,13 @@ abstract class Source extends Iterator[Char] {
descr = text
this
}
- // we'd like to default to no positioning, but for now we break
- // less by defaulting to status quo.
+ /** Change or disable the positioner. */
def withPositioning(on: Boolean): this.type = {
- positioner = if (on) new Positioner else NoPositioner
+ positioner = if (on) RelaxedPositioner else NoPositioner
+ this
+ }
+ def withPositioning(pos: Positioner): this.type = {
+ positioner = pos
this
}
diff --git a/src/library/scala/math/Ordering.scala b/src/library/scala/math/Ordering.scala
index eeb8c080a1..10e42a6de4 100644
--- a/src/library/scala/math/Ordering.scala
+++ b/src/library/scala/math/Ordering.scala
@@ -30,6 +30,7 @@ import java.util.Comparator
* @version 0.9.5, 2008-04-15
* @since 2.7
*/
+@annotation.implicitNotFound(msg = "No implicit Ordering defined for ${T}.")
trait Ordering[T] extends Comparator[T] with PartialOrdering[T] with Serializable {
outer =>
diff --git a/src/library/scala/reflect/ClassManifest.scala b/src/library/scala/reflect/ClassManifest.scala
index d18cfbc652..3f3892e802 100644
--- a/src/library/scala/reflect/ClassManifest.scala
+++ b/src/library/scala/reflect/ClassManifest.scala
@@ -144,16 +144,10 @@ trait ClassManifest[T] extends OptManifest[T] with Equals with Serializable {
else ""
}
-/** <p>
- * This object is used by the compiler and <b>should not be used in client
- * code</b>. The object Manifest defines factory methods for
- * manifests.
- * </p>
- * <p>
- * <b>BE AWARE</b>: The factory for refinement types is missing and
- * will be implemented in a later version of this class.
- * </p>
- */
+/** The object ClassManifest defines factory methods for manifests.
+ * It is intended for use by the compiler and should not be used
+ * in client code.
+ */
object ClassManifest {
val Byte = Manifest.Byte
val Short = Manifest.Short
diff --git a/src/library/scala/reflect/Manifest.scala b/src/library/scala/reflect/Manifest.scala
index 5545a43740..229fa728a8 100644
--- a/src/library/scala/reflect/Manifest.scala
+++ b/src/library/scala/reflect/Manifest.scala
@@ -10,17 +10,35 @@ package scala.reflect
import scala.collection.mutable.{ ArrayBuilder, WrappedArray }
-/** <p>
- * A <code>Manifest[T]</code> is an opaque descriptor for type <code>T</code>.
- * Currently, its only use is to give access to the erasure of the type as a
- * <code>Class</code> instance.
- * </p>
- * <p>
- * <b>BE AWARE</b>: The different type-relation operators are all forwarded
- * to the erased type as an approximation of the final semantics where
- * these operators should be on the unerased type.
- * </p>
- */
+/** A Manifest[T] is an opaque descriptor for type T. Its
+ * supported use is to give access to the erasure of the type
+ * as a Class instance, as is necessary for the creation of native
+ * Arrays if the class is not known at compile time.
+ *
+ * The type-relation operators <:< and =:= should be considered
+ * approximations only, as there are numerous aspects of type conformance
+ * which are not yet adequately represented in manifests.
+ *
+ * Example usages:
+{{{
+ def arr[T] = new Array[T](0) // does not compile
+ def arr[T](implicit m: Manifest[T]) = new Array[T](0) // compiles
+ def arr[T: Manifest] = new Array[T](0) // shorthand for the preceding
+
+ // Methods manifest, classManifest, and optManifest are in [[scala.Predef]].
+ def isApproxSubType[T: Manifest, U: Manifest] = manifest[T] <:< manifest[U]
+ isApproxSubType[List[String], List[AnyRef]] // true
+ isApproxSubType[List[String], List[Int]] // false
+
+ def methods[T: ClassManifest] = classManifest[T].erasure.getMethods
+ def retType[T: ClassManifest](name: String) =
+ methods[T] find (_.getName == name) map (_.getGenericReturnType)
+
+ retType[Map[_, _]]("values") // Some(scala.collection.Iterable<B>)
+}}}
+ *
+ */
+@annotation.implicitNotFound(msg = "No Manifest available for ${T}.")
trait Manifest[T] extends ClassManifest[T] with Equals {
override def typeArguments: List[Manifest[_]] = Nil
@@ -52,16 +70,10 @@ trait AnyValManifest[T] extends Manifest[T] with Equals {
override def hashCode = System.identityHashCode(this)
}
-/** <ps>
- * This object is used by the compiler and <b>should not be used in client
- * code</b>. The object <code>Manifest</code> defines factory methods for
- * manifests.
- * </p>
- * <p>
- * <b>BE AWARE</b>: The factory for refinement types is missing and
- * will be implemented in a later version of this class.
- * </p>
- */
+/** The object Manifest defines factory methods for manifests.
+ * It is intended for use by the compiler and should not be used
+ * in client code.
+ */
object Manifest {
private def ObjectClass = classOf[java.lang.Object]
diff --git a/src/library/scala/reflect/NameTransformer.scala b/src/library/scala/reflect/NameTransformer.scala
index 6cfb40cadf..7bc5a61f6c 100755
--- a/src/library/scala/reflect/NameTransformer.scala
+++ b/src/library/scala/reflect/NameTransformer.scala
@@ -6,8 +6,6 @@
** |/ **
\* */
-
-
package scala.reflect
/**
@@ -21,7 +19,6 @@ object NameTransformer {
private val op2code = new Array[String](nops)
private val code2op = new Array[OpCodes](ncodes)
-
private def enterOp(op: Char, code: String) = {
op2code(op) = code
val c = (code.charAt(1) - 'a') * 26 + code.charAt(2) - 'a'
@@ -48,10 +45,10 @@ object NameTransformer {
enterOp('?', "$qmark")
enterOp('@', "$at")
- /** Replace operator symbols by corresponding "<code>$op_name</code>".
+ /** Replace operator symbols by corresponding `\$opname`.
*
- * @param name ...
- * @return ...
+ * @param name the string to encode
+ * @return the string with all recognized opchars replaced with their encoding
*/
def encode(name: String): String = {
var buf: StringBuilder = null
@@ -82,10 +79,10 @@ object NameTransformer {
if (buf eq null) name else buf.toString()
}
- /** Replace <code>$op_name</code> by corresponding operator symbol.
+ /** Replace `\$opname` by corresponding operator symbol.
*
- * @param name0 ...
- * @return ...
+ * @param name0 the string to decode
+ * @return the string with all recognized operator symbol encodings replaced with their name
*/
def decode(name0: String): String = {
//System.out.println("decode: " + name);//DEBUG
diff --git a/src/library/scala/reflect/Type.scala b/src/library/scala/reflect/Type.scala
index 85b047d97c..5aa92b3828 100644
--- a/src/library/scala/reflect/Type.scala
+++ b/src/library/scala/reflect/Type.scala
@@ -6,12 +6,8 @@
** |/ **
\* */
-
-
package scala.reflect
-import collection.immutable.List
-
/** This type is required by the compiler and <b>should not be used in client code</b>. */
abstract class Type
@@ -55,13 +51,6 @@ case class NullaryMethodType(resultType: Type) extends Type
/** This type is required by the compiler and <b>should not be used in client code</b>. */
case class PolyType(typeParams: List[Symbol], typeBounds: List[(Type, Type)], resultType: Type) extends Type
-
-/** This type is required by the compiler and <b>should not be used in client code</b>. */
-class ImplicitMethodType(formals: List[Symbol], restpe: Type)
-extends MethodType(formals, restpe)
-
-
-
/* Standard pattern match:
case reflect.NoPrefix =>
@@ -72,7 +61,7 @@ extends MethodType(formals, restpe)
case reflect.ThisType(clazz) =>
case reflect.AppliedType(tpe, args) =>
case reflect.TypeBounds(lo, hi) =>
- case reflect.MethodType(formals, restpe) => //can also be ImplicitMethodType
+ case reflect.MethodType(formals, restpe) =>
case reflect.NullaryMethodType(restpe) =>
case reflect.PolyType(typeParams, typeBounds, resultType) =>
*/
diff --git a/src/library/scala/reflect/generic/PickleFormat.scala b/src/library/scala/reflect/generic/PickleFormat.scala
index a1f988a22d..1667e8c24f 100755
--- a/src/library/scala/reflect/generic/PickleFormat.scala
+++ b/src/library/scala/reflect/generic/PickleFormat.scala
@@ -137,7 +137,7 @@ object PickleFormat {
final val CLASSINFOtpe = 19
final val METHODtpe = 20
final val POLYtpe = 21
- final val IMPLICITMETHODtpe = 22
+ final val IMPLICITMETHODtpe = 22 // no longer generated
final val LITERAL = 23 // base line for literals
final val LITERALunit = 24
diff --git a/src/library/scala/reflect/generic/Symbols.scala b/src/library/scala/reflect/generic/Symbols.scala
index 770c6e920c..49cf7df1ef 100755
--- a/src/library/scala/reflect/generic/Symbols.scala
+++ b/src/library/scala/reflect/generic/Symbols.scala
@@ -25,11 +25,11 @@ trait Symbols { self: Universe =>
*/
def name: Name
- /** The name of the symbol before decoding, e.g. `$eq$eq` instead of `==`.
+ /** The name of the symbol before decoding, e.g. `\$eq\$eq` instead of `==`.
*/
def encodedName: String
- /** The decoded name of the symbol, e.g. `==` instead of `$eq$eq`.
+ /** The decoded name of the symbol, e.g. `==` instead of `\$eq\$eq`.
*/
def decodedName: String = stripLocalSuffix(NameTransformer.decode(encodedName))
diff --git a/src/library/scala/runtime/RichUnit.scala b/src/library/scala/runtime/RichUnit.scala
deleted file mode 100644
index 522b139cb4..0000000000
--- a/src/library/scala/runtime/RichUnit.scala
+++ /dev/null
@@ -1,22 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ Scala API **
-** / __/ __// _ | / / / _ | (c) 2002-2011, LAMP/EPFL **
-** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
-** /____/\___/_/ |_/____/_/ | | **
-** |/ **
-\* */
-
-
-
-package scala.runtime
-
-/** This class exists only as a dummy subclass so that there are two ambiguous
- * implicit conversions from Unit to some subclass to Object.
- * It's important that this class should NOT inherit from Ordered.
- *
- * Note - in reality the ambiguity is successfully introduced by any2stringadd
- * and orderingToOrdered, and adding an implicit from () => RichUnit actually
- * resolves the ambiguity by being more specific, and succeeds! So this class
- * is probably useless, and unitWrapper has been removed from Predef.
- */
-final class RichUnit {}
diff --git a/src/library/scala/runtime/ScalaRunTime.scala b/src/library/scala/runtime/ScalaRunTime.scala
index 3168fedc40..41a63777c5 100644
--- a/src/library/scala/runtime/ScalaRunTime.scala
+++ b/src/library/scala/runtime/ScalaRunTime.scala
@@ -252,9 +252,8 @@ object ScalaRunTime {
* called on null and (b) depending on the apparent type of an
* array, toString may or may not print it in a human-readable form.
*
- * @param arg the value to stringify
- * @return a string representation of <code>arg</code>
- *
+ * @param arg the value to stringify
+ * @return a string representation of arg.
*/
def stringOf(arg: Any): String = stringOf(arg, scala.Int.MaxValue)
def stringOf(arg: Any, maxElements: Int): String = {
@@ -288,14 +287,18 @@ object ScalaRunTime {
case (k, v) => inner(k) + " -> " + inner(v)
case _ => inner(arg)
}
- // The recursively applied attempt to prettify Array printing
+ // The recursively applied attempt to prettify Array printing.
+ // Note that iterator is used if possible and foreach is used as a
+ // last resort, because the parallel collections "foreach" in a
+ // random order even on sequences.
def inner(arg: Any): String = arg match {
case null => "null"
case "" => "\"\""
case x: String => if (x.head.isWhitespace || x.last.isWhitespace) "\"" + x + "\"" else x
- case x if useOwnToString(x) => x.toString
+ case x if useOwnToString(x) => x toString
case x: AnyRef if isArray(x) => WrappedArray make x take maxElements map inner mkString ("Array(", ", ", ")")
- case x: collection.Map[_, _] => x take maxElements map mapInner mkString (x.stringPrefix + "(", ", ", ")")
+ case x: collection.Map[_, _] => x.iterator take maxElements map mapInner mkString (x.stringPrefix + "(", ", ", ")")
+ case x: Iterable[_] => x.iterator take maxElements map inner mkString (x.stringPrefix + "(", ", ", ")")
case x: Traversable[_] => x take maxElements map inner mkString (x.stringPrefix + "(", ", ", ")")
case x: Product1[_] if isTuple(x) => "(" + inner(x._1) + ",)" // that special trailing comma
case x: Product if isTuple(x) => x.productIterator map inner mkString ("(", ",", ")")
@@ -304,13 +307,16 @@ object ScalaRunTime {
// The try/catch is defense against iterables which aren't actually designed
// to be iterated, such as some scala.tools.nsc.io.AbstractFile derived classes.
- val s =
- try inner(arg)
- catch {
- case _: StackOverflowError | _: UnsupportedOperationException => arg.toString
- }
-
+ try inner(arg)
+ catch {
+ case _: StackOverflowError | _: UnsupportedOperationException | _: AssertionError => "" + arg
+ }
+ }
+ /** stringOf formatted for use in a repl result. */
+ def replStringOf(arg: Any, maxElements: Int): String = {
+ val s = stringOf(arg, maxElements)
val nl = if (s contains "\n") "\n" else ""
+
nl + s + "\n"
}
}
diff --git a/src/library/scala/sys/BooleanProp.scala b/src/library/scala/sys/BooleanProp.scala
index 85719103de..e940990785 100644
--- a/src/library/scala/sys/BooleanProp.scala
+++ b/src/library/scala/sys/BooleanProp.scala
@@ -46,6 +46,8 @@ object BooleanProp {
def setValue[T1 >: Boolean](newValue: T1): Boolean = value
def get: String = "" + value
val clear, enable, disable, toggle = ()
+ def option = if (isSet) Some(value) else None
+
protected def zero = false
}
diff --git a/src/library/scala/sys/Prop.scala b/src/library/scala/sys/Prop.scala
index de38a56c73..33b88f119f 100644
--- a/src/library/scala/sys/Prop.scala
+++ b/src/library/scala/sys/Prop.scala
@@ -53,6 +53,10 @@ trait Prop[+T] {
*/
def get: String
+ /** Some(value) if the property is set, None otherwise.
+ */
+ def option: Option[T]
+
/** Removes the property from the underlying map.
*/
def clear(): Unit
@@ -69,11 +73,13 @@ object Prop {
* parameter of type Creator[T] is in scope, a Prop[T] can be created
* via this object's apply method.
*/
+ @annotation.implicitNotFound("No implicit property creator available for type ${T}.")
trait Creator[+T] {
/** Creates a Prop[T] of this type based on the given key. */
def apply(key: String): Prop[T]
}
+ implicit object FileProp extends CreatorImpl[java.io.File](s => new java.io.File(s))
implicit object StringProp extends CreatorImpl[String](s => s)
implicit object IntProp extends CreatorImpl[Int](_.toInt)
implicit object DoubleProp extends CreatorImpl[Double](_.toDouble)
diff --git a/src/library/scala/sys/PropImpl.scala b/src/library/scala/sys/PropImpl.scala
index 888e9d7327..b84553ea22 100644
--- a/src/library/scala/sys/PropImpl.scala
+++ b/src/library/scala/sys/PropImpl.scala
@@ -31,6 +31,8 @@ private[sys] class PropImpl[+T](val key: String, valueFn: String => T) extends P
else ""
def clear(): Unit = underlying -= key
+ def option: Option[T] = if (isSet) Some(value) else None
+ def or[T1 >: T](alt: => T1): T1 = if (isSet) value else alt
/** The underlying property map, in our case always sys.props */
protected def underlying: mutable.Map[String, String] = scala.sys.props
diff --git a/src/library/scala/sys/SystemProperties.scala b/src/library/scala/sys/SystemProperties.scala
index 228ca6315e..296db9e469 100644
--- a/src/library/scala/sys/SystemProperties.scala
+++ b/src/library/scala/sys/SystemProperties.scala
@@ -55,14 +55,15 @@ object SystemProperties {
implicit def systemPropertiesToCompanion(p: SystemProperties): SystemProperties.type = this
private lazy val propertyHelp = mutable.Map[String, String]()
- private def bool(key: String, helpText: String): BooleanProp = {
- val prop = (
- if (key startsWith "java.") BooleanProp.valueIsTrue(key)
- else BooleanProp.keyExists(key)
- )
- propertyHelp(key) = helpText
- prop
+ private def addHelp[P <: Prop[_]](p: P, helpText: String): P = {
+ propertyHelp(p.key) = helpText
+ p
}
+ private def str(key: String, helpText: String) = addHelp(Prop[String](key), helpText)
+ private def bool(key: String, helpText: String): BooleanProp = addHelp[BooleanProp](
+ if (key startsWith "java.") BooleanProp.valueIsTrue(key) else BooleanProp.keyExists(key),
+ helpText
+ )
def help(key: String) = propertyHelp.getOrElse(key, "")
// Todo: bring some sanity to the intersection of system properties aka "mutable
@@ -72,5 +73,6 @@ object SystemProperties {
lazy val preferIPv4Stack = bool("java.net.preferIPv4Stack", "system should prefer IPv4 sockets")
lazy val preferIPv6Addresses = bool("java.net.preferIPv6Addresses", "system should prefer IPv6 addresses")
lazy val noTraceSupression = bool("scala.control.noTraceSuppression", "scala should not suppress any stack trace creation")
+ lazy val traceSourcePath = str("scala.control.sourcepath", "sourcepath for looking up stack trace elements")
}
diff --git a/src/library/scala/util/control/NoStackTrace.scala b/src/library/scala/util/control/NoStackTrace.scala
index f33e8cd013..f5a844d2c9 100644
--- a/src/library/scala/util/control/NoStackTrace.scala
+++ b/src/library/scala/util/control/NoStackTrace.scala
@@ -11,7 +11,7 @@ package scala.util.control
/** A trait for exceptions which, for efficiency reasons, do not
* fill in the stack trace. Stack trace suppression can be disabled
* on a global basis via a system property wrapper in
- * [[ scala.sys.SystemProperties ]].
+ * [[scala.sys.SystemProperties]].
*
* @author Paul Phillips
* @since 2.8
diff --git a/src/library/scala/util/logging/Logged.scala b/src/library/scala/util/logging/Logged.scala
index 3ec70c00c6..01757e1bfa 100644
--- a/src/library/scala/util/logging/Logged.scala
+++ b/src/library/scala/util/logging/Logged.scala
@@ -6,34 +6,25 @@
** |/ **
\* */
-
-
package scala.util.logging
-/** <p>
- * Mixing in the class <code>Logged</code> indicates that a class provides
- * support for logging. For instance, the developer of a library writes
- * </p>
- * <pre>
- * <b>class</b> MyClass <b>extends</b> Logged { /* do stuff, call log */ }
- * </pre>
- * <p>
- * The user of the library instantiates:
- * </p>
- * <pre>
- * <b>val</b> x = <b>new</b> MyClass() <b>with</b> ConsoleLogger
- * </pre>
- * <p>
- * and the logging will be sent to the <a href="../../Console$object.html"
- * target="contentFrame"><code>Console</code></a> object.
- * </p>
+/** Mixing in Logged indicates that a class provides support for logging.
+ * For instance:
+{{{
+ // The developer of the library writes:
+ class MyClass extends Logged {
+ // do stuff, call log
+ }
+ // The user of the library instantiates:
+ val x = new MyClass() with ConsoleLogger
+}}}
+ * and the logging is sent to the [[scala.util.logging.ConsoleLogger]] object.
*/
trait Logged {
-
/** This method should log the message given as argument somewhere
* as a side-effect.
*
- * @param msg ...
+ * @param msg message to be logged
*/
def log(msg: String): Unit = {}
}
diff --git a/src/library/scala/xml/Attribute.scala b/src/library/scala/xml/Attribute.scala
index dfee02c48a..5b69017e70 100644
--- a/src/library/scala/xml/Attribute.scala
+++ b/src/library/scala/xml/Attribute.scala
@@ -64,16 +64,6 @@ abstract trait Attribute extends MetaData {
(next(arg, scope, key) == null) && (next wellformed scope)
}
- override def canEqual(other: Any) = other match {
- case _: Attribute => true
- case _ => false
- }
- override def strict_==(other: Equality) = other match {
- case x: Attribute => (pre == x.pre) && (key == x.key) && (value sameElements x.value) && (next == x.next)
- case _ => false
- }
- override def basisForHashCode = List(pre, key, value)
-
/** Appends string representation of only this attribute to stringbuffer.
*/
def toString1(sb: StringBuilder) {
diff --git a/src/library/scala/xml/Elem.scala b/src/library/scala/xml/Elem.scala
index b068a1a17d..4ea7e90de2 100644
--- a/src/library/scala/xml/Elem.scala
+++ b/src/library/scala/xml/Elem.scala
@@ -17,8 +17,7 @@ package scala.xml
* Copyright 2008 Google Inc. All Rights Reserved.
* @author Burak Emir <bqe@google.com>
*/
-object Elem
-{
+object Elem {
def apply(prefix: String,label: String, attributes: MetaData, scope: NamespaceBinding, child: Node*) =
new Elem(prefix,label,attributes,scope,child:_*)
diff --git a/src/library/scala/xml/MetaData.scala b/src/library/scala/xml/MetaData.scala
index ff3071e050..2e55a9d67e 100644
--- a/src/library/scala/xml/MetaData.scala
+++ b/src/library/scala/xml/MetaData.scala
@@ -71,8 +71,7 @@ object MetaData {
* Copyright 2008 Google Inc. All Rights Reserved.
* @author Burak Emir <bqe@google.com>
*/
-abstract class MetaData extends Iterable[MetaData] with Equality with Serializable
-{
+abstract class MetaData extends Iterable[MetaData] with Equality with Serializable {
/** Updates this MetaData with the MetaData given as argument. All attributes that occur in updates
* are part of the resulting MetaData. If an attribute occurs in both this instance and
* updates, only the one in updates is part of the result (avoiding duplicates). For prefixed
@@ -135,10 +134,10 @@ abstract class MetaData extends Iterable[MetaData] with Equality with Serializab
case _ => false
}
override def strict_==(other: Equality) = other match {
- case m: MetaData => this.toSet == m.toSet
+ case m: MetaData => this.asAttrMap == m.asAttrMap
case _ => false
}
- def basisForHashCode: Seq[Any] = List(this.toSet)
+ def basisForHashCode: Seq[Any] = List(this.asAttrMap)
/** Returns an iterator on attributes */
def iterator: Iterator[MetaData] = Iterator.single(this) ++ next.iterator
diff --git a/src/library/scala/xml/include/sax/EncodingHeuristics.scala b/src/library/scala/xml/include/sax/EncodingHeuristics.scala
index 349187437d..eaf0dffca8 100644
--- a/src/library/scala/xml/include/sax/EncodingHeuristics.scala
+++ b/src/library/scala/xml/include/sax/EncodingHeuristics.scala
@@ -14,14 +14,11 @@ import scala.xml.include._
import java.io.InputStream
import scala.util.matching.Regex
-/**
- * <p>
- * <code>EncodingHeuristics</code> reads from a stream
+/** `EncodingHeuristics` reads from a stream
* (which should be buffered) and attempts to guess
* what the encoding of the text in the stream is.
* If it fails to determine the type of the encoding,
* it returns the default UTF-8.
- * </p>
*
* @author Burak Emir
* @author Paul Phillips
@@ -40,16 +37,13 @@ object EncodingHeuristics
}
import EncodingNames._
- /**
- * <p>
- * This utility method attempts to determine the XML character encoding
- * by examining the input stream, as specified here:
- * http://www.w3.org/TR/xml/#sec-guessing
- * </p>
+ /** This utility method attempts to determine the XML character encoding
+ * by examining the input stream, as specified at
+ * [[http://www.w3.org/TR/xml/#sec-guessing w3]].
*
- * @param in <code>InputStream</code> to read from.
- * @return String The name of the encoding.
+ * @param in `InputStream` to read from.
* @throws IOException if the stream cannot be reset
+ * @return the name of the encoding.
*/
def readEncodingFromStream(in: InputStream): String = {
var ret: String = null
diff --git a/src/library/scala/xml/pull/XMLEventReader.scala b/src/library/scala/xml/pull/XMLEventReader.scala
index 4188f8b084..3902967626 100755
--- a/src/library/scala/xml/pull/XMLEventReader.scala
+++ b/src/library/scala/xml/pull/XMLEventReader.scala
@@ -24,8 +24,7 @@ import scala.xml.parsing.{ ExternalSources, MarkupHandler, MarkupParser }
* @author Burak Emir
* @author Paul Phillips
*/
-class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent]
-{
+class XMLEventReader(src: Source) extends ProducerConsumerIterator[XMLEvent] {
// We implement a pull parser as an iterator, but since we may be operating on
// a stream (e.g. XML over a network) there may be arbitrarily long periods when
// the queue is empty. Fortunately the ProducerConsumerIterator is ideally
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java b/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java
index aefb6fdaf1..0f2c4e6764 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java
+++ b/src/msil/ch/epfl/lamp/compiler/msil/Attribute.java
@@ -108,20 +108,20 @@ public class Attribute {
private static final Map id2type = new HashMap();
static {
map("Boolean", Signature.ELEMENT_TYPE_BOOLEAN);
- map("Char", Signature.ELEMENT_TYPE_CHAR);
- map("SByte", Signature.ELEMENT_TYPE_I1);
- map("Byte", Signature.ELEMENT_TYPE_U1);
- map("Int16", Signature.ELEMENT_TYPE_I2);
- map("UInt16", Signature.ELEMENT_TYPE_U2);
- map("Int32", Signature.ELEMENT_TYPE_I4);
- map("UInt32", Signature.ELEMENT_TYPE_U4);
- map("Int64", Signature.ELEMENT_TYPE_I8);
- map("UInt64", Signature.ELEMENT_TYPE_U8);
- map("Single", Signature.ELEMENT_TYPE_R4);
- map("Double", Signature.ELEMENT_TYPE_R8);
- map("String", Signature.ELEMENT_TYPE_STRING);
- map("Type", Signature.X_ELEMENT_TYPE_TYPE);
- map("Object", Signature.ELEMENT_TYPE_OBJECT);
+ map("Char", Signature.ELEMENT_TYPE_CHAR);
+ map("SByte", Signature.ELEMENT_TYPE_I1);
+ map("Byte", Signature.ELEMENT_TYPE_U1);
+ map("Int16", Signature.ELEMENT_TYPE_I2);
+ map("UInt16", Signature.ELEMENT_TYPE_U2);
+ map("Int32", Signature.ELEMENT_TYPE_I4);
+ map("UInt32", Signature.ELEMENT_TYPE_U4);
+ map("Int64", Signature.ELEMENT_TYPE_I8);
+ map("UInt64", Signature.ELEMENT_TYPE_U8);
+ map("Single", Signature.ELEMENT_TYPE_R4);
+ map("Double", Signature.ELEMENT_TYPE_R8);
+ map("String", Signature.ELEMENT_TYPE_STRING);
+ map("Type", Signature.X_ELEMENT_TYPE_TYPE);
+ map("Object", Signature.ELEMENT_TYPE_OBJECT);
}
private static void map(String type, int id) {
Type t = Type.GetType("System." + type);
@@ -150,42 +150,102 @@ public class Attribute {
private void parseBlob0() {
if (buf != null)
return;
- buf = ByteBuffer.wrap(value);
+ buf = ByteBuffer.wrap(value); // Sec. 23.3 in Partition II of CLR Spec.
buf.order(ByteOrder.LITTLE_ENDIAN);
- short sig = buf.getShort();
+ short sig = buf.getShort(); // Prolog
assert sig == 1 : PEFile.bytes2hex(value);
ParameterInfo[] params = constr.GetParameters();
constrArgs = new Object[params.length];
for (int i = 0; i < params.length; i++) {
- constrArgs[i] = parseElement(params[i].ParameterType);
+ constrArgs[i] = parseFixedArg(params[i].ParameterType); // FixedArg
}
- int ncount = buf.getShort();
+ int ncount = buf.getShort(); // NumNamed
namedArgs = new LinkedHashMap();
for (int i = 0; i < ncount; i++) {
- int designator = buf.get();
+ int designator = buf.get(); // designator one of 0x53 (FIELD) or 0x54 (PROPERTY)
assert designator == Signature.X_ELEMENT_KIND_FIELD
|| designator == Signature.X_ELEMENT_KIND_PROPERTY
: "0x" + PEFile.byte2hex(designator);
- Type type = parseType();
- String name = parseString();
- Object value = parseElement(type);
+ Type type = parseFieldOrPropTypeInNamedArg(); // FieldOrPropType
+ String name = parseString(); // FieldOrPropName
+ Object value = parseFixedArg(type); // FixedArg
NamedArgument narg =
new NamedArgument(designator, name, type, value);
namedArgs.put(name, narg);
}
}
- private Object parseElement(Type type) {
- if (type.IsArray())
+ private Object parseFixedArg(Type type) {
+ if (type.IsArray())
return parseArray(type.GetElementType());
- if (type.IsEnum())
- return parseElement(type.getUnderlyingType());
- return parseElement(getTypeId(type));
+ else
+ return parseElem(type);
+ }
+
+ /* indicates whether the "simple" case (the other is "enum") of the first row
+ in the Elem production should be taken. */
+ private boolean isSimpleElem(Type type) {
+ if(!type2id.containsKey(type)) return false;
+ int id = getTypeId(type);
+ switch(id){
+ case Signature.ELEMENT_TYPE_STRING:
+ case Signature.X_ELEMENT_TYPE_TYPE:
+ case Signature.ELEMENT_TYPE_OBJECT:
+ return false;
+ default:
+ return true;
+ }
}
- private Object parseElement(int id) {
+ /* indicates whether the second row in the Elem production
+ should be taken (and more specifically, "string" case within that row). */
+ private boolean isStringElem(Type type) {
+ if(!type2id.containsKey(type)) return false;
+ int id = getTypeId(type);
+ return id == Signature.ELEMENT_TYPE_STRING;
+ }
+
+ /* indicates whether the second row in the Elem production
+ should be taken (and more specifically, "type" case within that row). */
+ private boolean isTypeElem(Type type) {
+ if(!type2id.containsKey(type)) return false;
+ int id = getTypeId(type);
+ return id == Signature.X_ELEMENT_TYPE_TYPE;
+ }
+
+ /* indicates whether the third row in the Elem production
+ should be taken (and more specifically, "boxed" case within that row). */
+ private boolean isSystemObject(Type type) {
+ if(!type2id.containsKey(type)) return false;
+ int id = getTypeId(type);
+ return id == Signature.ELEMENT_TYPE_OBJECT;
+ }
+
+ private Object parseElem(Type type) {
+ // simple or enum
+ if (isSimpleElem(type)) return parseVal(getTypeId(type));
+ if (type.IsEnum()) return parseVal(getTypeId(type.getUnderlyingType()));
+ // string or type
+ if (isStringElem(type)) return parseString();
+ if (isTypeElem(type)) return getTypeFromSerString();
+ // boxed valuetype, please notice that a "simple" boxed valuetype is preceded by 0x51
+ if (isSystemObject(type)) {
+ Type boxedT = parse0x51();
+ if(boxedT.IsEnum()) {
+ return new BoxedArgument(boxedT, parseVal(getTypeId(boxedT.getUnderlyingType())));
+ } else {
+ return new BoxedArgument(boxedT, parseVal(getTypeId(boxedT))); // TODO dead code?
+ }
+ } else {
+ Type boxedT = parseType();
+ return parseVal(getTypeId(boxedT));
+ }
+ }
+
+ /* this does not parse an Elem, but a made-up production (Element). Don't read too much into this method name! */
+ private Object parseVal(int id) {
switch (id) {
case Signature.ELEMENT_TYPE_BOOLEAN:
return new Boolean(buf.get() == 0 ? false : true);
@@ -193,29 +253,26 @@ public class Attribute {
return new Character(buf.getChar());
case Signature.ELEMENT_TYPE_I1:
case Signature.ELEMENT_TYPE_U1:
- return new Byte(buf.get());
+ return new Byte(buf.get()); // TODO U1 not the same as I1
case Signature.ELEMENT_TYPE_I2:
case Signature.ELEMENT_TYPE_U2:
- return new Short(buf.getShort());
+ return new Short(buf.getShort()); // TODO U2 not the same as I2
case Signature.ELEMENT_TYPE_I4:
case Signature.ELEMENT_TYPE_U4:
- return new Integer(buf.getInt());
+ return new Integer(buf.getInt()); // TODO U4 not the same as I4
case Signature.ELEMENT_TYPE_I8:
case Signature.ELEMENT_TYPE_U8:
- return new Long(buf.getLong());
+ return new Long(buf.getLong()); // TODO U8 not the same as I8
case Signature.ELEMENT_TYPE_R4:
return new Float(buf.getFloat());
case Signature.ELEMENT_TYPE_R8:
return new Double(buf.getDouble());
+ case Signature.X_ELEMENT_TYPE_TYPE:
+ return getTypeFromSerString();
case Signature.ELEMENT_TYPE_STRING:
return parseString();
- case Signature.X_ELEMENT_TYPE_TYPE:
- return getType();
- case Signature.ELEMENT_TYPE_OBJECT:
- Type type = parseType();
- return new BoxedArgument(type, parseElement(type));
default:
- throw new RuntimeException("Unknown type id: " + id);
+ throw new RuntimeException("Shouldn't have called parseVal with: " + id);
}
}
@@ -232,7 +289,7 @@ public class Attribute {
case Signature.ELEMENT_TYPE_CHAR:
return parseCharArray();
case Signature.ELEMENT_TYPE_I1:
- case Signature.ELEMENT_TYPE_U1:
+ case Signature.ELEMENT_TYPE_U1: // TODO U1 not the same as I1
return parseByteArray();
case Signature.ELEMENT_TYPE_I2:
case Signature.ELEMENT_TYPE_U2:
@@ -250,19 +307,61 @@ public class Attribute {
case Signature.ELEMENT_TYPE_STRING:
return parseStringArray();
case Signature.X_ELEMENT_TYPE_ENUM:
- return parseArray(getType());
+ return parseArray(getTypeFromSerString());
default:
throw new RuntimeException("Unknown type id: " + id);
}
}
- private Type parseType() {
+ private Type parseType() { // FieldOrPropType, Sec. 23.3 in Partition II of CLR Spec.
+ int id = buf.get();
+ switch (id) {
+ case Signature.ELEMENT_TYPE_SZARRAY:
+ Type arrT = Type.mkArray(parseType(), 1);
+ return arrT;
+ case Signature.X_ELEMENT_TYPE_ENUM:
+ String enumName = parseString();
+ Type enumT = Type.getType(enumName);
+ return enumT;
+ default:
+ Type t = (Type)id2type.get(new Integer(id));
+ assert t != null : PEFile.byte2hex(id);
+ return t;
+ }
+ }
+
+ private Type parse0x51() {
int id = buf.get();
switch (id) {
+ case 0x51:
+ return parse0x51();
case Signature.ELEMENT_TYPE_SZARRAY:
- return Type.mkArray(parseType(), 1);
+ Type arrT = Type.mkArray(parseType(), 1);
+ return arrT;
+ case Signature.X_ELEMENT_TYPE_ENUM:
+ String enumName = parseString();
+ Type enumT = Type.getType(enumName);
+ return enumT;
+ default:
+ Type t = (Type)id2type.get(new Integer(id));
+ assert t != null : PEFile.byte2hex(id);
+ return t;
+ }
+ }
+
+
+ private Type parseFieldOrPropTypeInNamedArg() { // FieldOrPropType, Sec. 23.3 in Partition II of CLR Spec.
+ int id = buf.get();
+ switch (id) {
+ case 0x51:
+ return (Type)(id2type.get(new Integer(Signature.ELEMENT_TYPE_OBJECT)));
+ // TODO remove case Signature.ELEMENT_TYPE_SZARRAY:
+ // Type arrT = Type.mkArray(parseType(), 1);
+ // return arrT;
case Signature.X_ELEMENT_TYPE_ENUM:
- return getType();
+ String enumName = parseString();
+ Type enumT = Type.getType(enumName); // TODO this "lookup" only covers already-loaded assemblies.
+ return enumT; // TODO null as return value (due to the above) spells trouble later.
default:
Type t = (Type)id2type.get(new Integer(id));
assert t != null : PEFile.byte2hex(id);
@@ -270,13 +369,11 @@ public class Attribute {
}
}
- private Type getType() {
+ private Type getTypeFromSerString() {
String typename = parseString();
int i = typename.indexOf(',');
- // fully qualified assembly name follows
- // just strip it on the assumtion theat the
- // assembly is referenced in the externs and the
- // type will be found
+ /* fully qualified assembly name follows. Just strip it on the assumption that
+ the assembly is referenced in the externs and the type will be found. */
String name = (i < 0) ? typename : typename.substring(0, i);
Type t = Type.GetType(name);
if (t == null && i > 0) {
@@ -358,7 +455,7 @@ public class Attribute {
return arr;
}
- private String parseString() {
+ private String parseString() { // SerString convention
String str = null;
int length = parseLength();
if (length < 0)
@@ -541,7 +638,7 @@ public class Attribute {
//##########################################################################
- protected static final class BoxedArgument {
+ public static class BoxedArgument {
public final Type type;
public final Object value;
public BoxedArgument(Type type, Object value) {
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java b/src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java
new file mode 100644
index 0000000000..cf30008c60
--- /dev/null
+++ b/src/msil/ch/epfl/lamp/compiler/msil/CustomModifier.java
@@ -0,0 +1,45 @@
+package ch.epfl.lamp.compiler.msil;
+
+/**
+ * Quoting from the CIL spec, Partition II, Sec. 7.1.1:
+ *
+ * Custom modifiers, defined using `modreq` (required modifier) and `modopt` (optional modifier), are
+ * similar to custom attributes (Sec. 21) except that modifiers are part of a signature rather than being attached to a
+ * declaration. Each modifer associates a type reference with an item in the signature.
+ *
+ */
+public class CustomModifier {
+
+ public boolean isReqd;
+ public Type marker;
+
+ public CustomModifier(boolean isReqd, Type marker) {
+ this.isReqd = isReqd;
+ this.marker = marker;
+ }
+
+ public String toString() {
+ String res = (isReqd ? "modreq( " : "modopt( ") + marker.toString() + " )";
+ return res;
+ }
+
+ public static Type[] helperCustomMods(boolean isReqd, CustomModifier[] cmods) {
+ if(cmods == null) return null;
+ int count = 0;
+ for (int idx = 0; idx < cmods.length; idx++) {
+ if(cmods[idx].isReqd == isReqd) count++;
+ }
+ Type[] res = new Type[count];
+ int residx = 0;
+ for (int idx = 0; idx < cmods.length; idx++) {
+ res[residx] = cmods[idx].marker;
+ residx++;
+ }
+ return res;
+ }
+
+ public static Type VolatileMarker() {
+ return Type.GetType("System.Runtime.CompilerServices.IsVolatile");
+ }
+
+}
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java b/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java
index 9649dabd4e..536a67e9a8 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java
+++ b/src/msil/ch/epfl/lamp/compiler/msil/FieldInfo.java
@@ -5,13 +5,15 @@
package ch.epfl.lamp.compiler.msil;
+import ch.epfl.lamp.compiler.msil.util.PECustomMod;
+
/**
* Discovers the attributes of a field and provides access to field metadata.
*
* @author Nikolay Mihaylov
* @version 1.0
*/
-public class FieldInfo extends MemberInfo {
+public class FieldInfo extends MemberInfo implements HasCustomModifiers {
//##########################################################################
// public interface
@@ -24,6 +26,9 @@ public class FieldInfo extends MemberInfo {
/** Type of the field represented by this FieldInfo object. */
public final Type FieldType;
+ /** can be null */
+ public final CustomModifier[] cmods;
+
protected final Object value;
public final boolean IsStatic() {
@@ -80,6 +85,33 @@ public class FieldInfo extends MemberInfo {
return (Attributes & FieldAttributes.NotSerialized) != 0;
}
+ private boolean knownVolatile = false;
+ private boolean cachedVolatile = false;
+ public final boolean IsVolatile() {
+ if(knownVolatile) return cachedVolatile;
+ knownVolatile = true;
+ if(cmods == null) {
+ cachedVolatile = false;
+ return cachedVolatile;
+ }
+ for (int idx = 0; idx < cmods.length; idx++) {
+ if(cmods[idx].marker == CustomModifier.VolatileMarker()) {
+ cachedVolatile = true;
+ return cachedVolatile;
+ }
+ }
+ cachedVolatile = false;
+ return cachedVolatile;
+ }
+
+ public final Type[] GetOptionalCustomModifiers () {
+ return CustomModifier.helperCustomMods(false, cmods);
+ }
+
+ public final Type[] GetRequiredCustomModifiers() {
+ return CustomModifier.helperCustomMods(true, cmods);
+ }
+
public String toString() {
return FieldAttributes.toString(Attributes) + " " +
FieldType + " " + DeclaringType.FullName + "::" + Name;
@@ -90,17 +122,14 @@ public class FieldInfo extends MemberInfo {
protected static final FieldInfo[] EMPTY_ARRAY = new FieldInfo[0];
/** Initializes a new instance of the FieldInfo class. */
- protected FieldInfo(String name, Type declType, int attrs, Type fieldType) {
- this(name, declType, attrs, fieldType, null);
- }
-
protected FieldInfo(String name, Type declType,
- int attrs, Type fieldType, Object value)
+ int attrs, PECustomMod fieldTypeWithMods, Object value)
{
- super(name, declType);
- FieldType = fieldType;
- Attributes = (short) attrs;
- this.value = value;
+ super(name, declType);
+ FieldType = fieldTypeWithMods.marked;
+ cmods = fieldTypeWithMods.cmods;
+ Attributes = (short) attrs;
+ this.value = value;
}
/**
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java b/src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java
new file mode 100644
index 0000000000..5ead087350
--- /dev/null
+++ b/src/msil/ch/epfl/lamp/compiler/msil/HasCustomModifiers.java
@@ -0,0 +1,9 @@
+package ch.epfl.lamp.compiler.msil;
+
+public interface HasCustomModifiers {
+
+ public Type[] GetOptionalCustomModifiers();
+
+ public Type[] GetRequiredCustomModifiers();
+
+}
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java b/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java
index d6d12c8b4a..481d5f2116 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java
+++ b/src/msil/ch/epfl/lamp/compiler/msil/PEFile.java
@@ -873,10 +873,11 @@ public class PEFile {
return type;
} // decodeType0()
- public Type decodeFieldType() {
- skipByte(FIELD);
- skipCustomMods();
- return decodeType();
+ public PECustomMod decodeFieldType() {
+ skipByte(FIELD); // 0x06
+ CustomModifier[] cmods = getCustomMods();
+ Type fieldType = decodeType();
+ return new PECustomMod(fieldType, cmods);
}
/** decodes the return type of a method signature (22.2.11). */
@@ -908,10 +909,10 @@ public class PEFile {
}
public void skipCustomMods() {
- while (getByte() == ELEMENT_TYPE_CMOD_OPT
- || getByte() == ELEMENT_TYPE_CMOD_REQD)
+ while (getByte() == ELEMENT_TYPE_CMOD_OPT /* 0x20 */
+ || getByte() == ELEMENT_TYPE_CMOD_REQD /* 0x1f */ )
{
- boolean isREQD = (getByte() == ELEMENT_TYPE_CMOD_REQD);
+ boolean isREQD = (getByte() == ELEMENT_TYPE_CMOD_REQD); // 0x1f
// skip the tag 23.2.7
readByte();
// skip the TypeDefOrRefEncoded (23.2.8)
@@ -923,7 +924,22 @@ public class PEFile {
}
}
- //######################################################################
+ /**
+ * @see CustomModifier
+ */
+ public CustomModifier[] getCustomMods() {
+ java.util.List/*<CustomModifier>*/ cmods = new java.util.LinkedList();
+ while (getByte() == ELEMENT_TYPE_CMOD_OPT || getByte() == ELEMENT_TYPE_CMOD_REQD) {
+ boolean isReqd = (getByte() == ELEMENT_TYPE_CMOD_REQD);
+ readByte(); // tag 23.2.7
+ Type t = pemodule.getTypeDefOrRef(decodeInt()); // TypeDefOrRefEncoded (23.2.8)
+ cmods.add(new CustomModifier(isReqd, t));
+ }
+ CustomModifier[] res = (CustomModifier[])cmods.toArray(new CustomModifier[0]);
+ return res;
+ }
+
+ //######################################################################
} // class Sig
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/PEType.java b/src/msil/ch/epfl/lamp/compiler/msil/PEType.java
index 25e5373df1..418c6603b3 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/PEType.java
+++ b/src/msil/ch/epfl/lamp/compiler/msil/PEType.java
@@ -10,6 +10,7 @@ import ch.epfl.lamp.compiler.msil.PEFile.Sig;
import ch.epfl.lamp.compiler.msil.util.Table;
import ch.epfl.lamp.compiler.msil.util.Table.*;
import ch.epfl.lamp.compiler.msil.util.Signature;
+import ch.epfl.lamp.compiler.msil.util.PECustomMod;
import java.util.ArrayList;
@@ -83,7 +84,7 @@ final class PEType extends Type implements Signature {
String name = file.FieldDef.getName();
//System.out.println("\t-->Loading field: " + name);
Sig sig = file.FieldDef.getSignature();
- Type fieldType = sig.decodeFieldType();
+ PECustomMod pecmod = sig.decodeFieldType();
Object val = null;
Table.Constant consts = file.Constant;
for (int i = 1; i <= consts.rows; i++) {
@@ -93,10 +94,8 @@ final class PEType extends Type implements Signature {
if (tableId == Table.FieldDef.ID && refRow == frow)
val = consts.getValue();
}
- FieldInfo field =
- new PEFieldInfo(row, name, attrs, fieldType, val);
- if (field.Name.equals("value__") && field.IsSpecialName())
- {
+ FieldInfo field = new PEFieldInfo(row, name, attrs, pecmod, val);
+ if (field.Name.equals("value__") && field.IsSpecialName()) {
assert underlyingType == null : underlyingType.toString();
underlyingType = field.FieldType;
}
@@ -158,8 +157,7 @@ final class PEType extends Type implements Signature {
//System.out.println("Retval attributes 0x" +
// PEFile.short2hex(pattr));
} else {
- params[seq - 1] = new ParameterInfo
- (paramName, paramType[seq - 1], pattr, seq - 1);
+ params[seq - 1] = new ParameterInfo(paramName, paramType[seq - 1], pattr, seq - 1);
}
}
for (int i = 0; i < params.length; i++) {
@@ -351,9 +349,9 @@ final class PEType extends Type implements Signature {
private class PEFieldInfo extends FieldInfo {
private final int definingRow;
public PEFieldInfo(int definingRow, String name,
- int attrs, Type fieldType, Object value)
+ int attrs, PECustomMod pecmod, Object value)
{
- super(name, PEType.this, attrs, fieldType, value);
+ super(name, PEType.this, attrs, pecmod, value);
this.definingRow = definingRow;
}
protected void loadCustomAttributes(Type attributeType) {
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java b/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java
index ccca52edba..b19fe29869 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java
+++ b/src/msil/ch/epfl/lamp/compiler/msil/PrimitiveType.java
@@ -1,5 +1,7 @@
package ch.epfl.lamp.compiler.msil;
+import ch.epfl.lamp.compiler.msil.util.PECustomMod;
+
public final class PrimitiveType extends Type {
public PrimitiveType(Module module,
int attributes,
@@ -31,7 +33,8 @@ public final class PrimitiveType extends Type {
}
public FieldInfo addField(String name, int attrs, Type fieldType) {
- FieldInfo res = new FieldInfo(name, this, attrs, fieldType);
+ PECustomMod fieldTypeWithMods = new PECustomMod(fieldType, null);
+ FieldInfo res = new FieldInfo(name, this, attrs, fieldTypeWithMods, null);
FieldInfo[] ms = new FieldInfo[fields.length + 1];
System.arraycopy(fields, 0, ms, 0, fields.length);
ms[ms.length - 1] = res;
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/Type.java b/src/msil/ch/epfl/lamp/compiler/msil/Type.java
index b2489ab66e..830632ce45 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/Type.java
+++ b/src/msil/ch/epfl/lamp/compiler/msil/Type.java
@@ -315,6 +315,18 @@ public abstract class Type extends MemberInfo {
return false;
}
+ public boolean IsNestedType() {
+ return DeclaringType != null;
+ }
+
+ public boolean IsDefinitelyInternal() {
+ if(IsNestedType()) {
+ return IsNestedPrivate();
+ } else {
+ return IsNotPublic();
+ }
+ }
+
//public final boolean IsCOMObject;
//public final boolean IsContextful;
//public final boolean IsMarshalByRef;
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala b/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala
index 3ea06382e5..7ef9dc7a5b 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala
+++ b/src/msil/ch/epfl/lamp/compiler/msil/emit/FieldBuilder.scala
@@ -9,6 +9,9 @@ import ch.epfl.lamp.compiler.msil.FieldInfo
import ch.epfl.lamp.compiler.msil.Type
import ch.epfl.lamp.compiler.msil.FieldAttributes
import ch.epfl.lamp.compiler.msil.ConstructorInfo
+
+import ch.epfl.lamp.compiler.msil.util.PECustomMod
+
import java.io.IOException
/**
@@ -17,8 +20,8 @@ import java.io.IOException
* @author Nikolay Mihaylov
* @version 1.0
*/
-class FieldBuilder(name: String, declType: Type, attrs: Int, fieldType: Type)
- extends FieldInfo(name, declType, attrs, fieldType)
+class FieldBuilder(name: String, declType: Type, attrs: Int, fieldTypeWithMods: PECustomMod)
+ extends FieldInfo(name, declType, attrs, fieldTypeWithMods, null)
with ICustomAttributeSetter
with Visitable
{
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala b/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala
index 73bc0f435c..d3a57194da 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala
+++ b/src/msil/ch/epfl/lamp/compiler/msil/emit/ILPrinterVisitor.scala
@@ -271,7 +271,7 @@ abstract class ILPrinterVisitor extends Visitor {
// [[int32]] <fieldAttr>* <type> <id> [= <fieldInit> | at <dataLabel>]
print(".field ")
print(FieldAttributes.toString(field.Attributes))
- print(" "); printSignature(field.FieldType)
+ print(" "); printSignature(field.FieldType, field.cmods)
print(" \'"); print(field.Name); print("\'")
if (field.IsLiteral()) {
print(" = ")
@@ -608,16 +608,16 @@ abstract class ILPrinterVisitor extends Visitor {
}
- def printSignature(field: FieldInfo) {
- printSignature(field.FieldType)
- //print(' ') print(owner)
- print(' ')
- //if (field.IsStatic && field.DeclaringType != currentType) {
- printReference(field.DeclaringType)
- print("::")
- //}
- printName(field.Name)
- }
+ def printSignature(field: FieldInfo) {
+ printSignature(field.FieldType, field.cmods)
+ //print(' ') print(owner)
+ print(' ')
+ //if (field.IsStatic && field.DeclaringType != currentType) {
+ printReference(field.DeclaringType)
+ print("::")
+ //}
+ printName(field.Name)
+ }
// print method head
@throws(classOf[IOException])
@@ -670,7 +670,19 @@ abstract class ILPrinterVisitor extends Visitor {
print(")")
}
- def printSignature(`type`: Type) {
+ def printSignature(marked: Type, cmods: Array[CustomModifier]) {
+ printSignature(marked)
+ if( (cmods != null) && !cmods.isEmpty ) {
+ print(" ")
+ for(cm <- cmods) {
+ print(if (cm.isReqd) "modreq( " else "modopt( ")
+ printReference(cm.marker)
+ print(" ) ")
+ }
+ }
+ }
+
+ def printSignature(`type`: Type) {
val sigOpt = primitive.get(`type`)
if (sigOpt.isDefined) {
print(sigOpt.get)
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala b/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala
index 663b2c5cb0..5126a0c34d 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala
+++ b/src/msil/ch/epfl/lamp/compiler/msil/emit/TypeBuilder.scala
@@ -6,6 +6,9 @@
package ch.epfl.lamp.compiler.msil.emit
import ch.epfl.lamp.compiler.msil._
+
+import ch.epfl.lamp.compiler.msil.util.PECustomMod
+
import java.io.IOException
/**
@@ -38,15 +41,22 @@ class TypeBuilder (module: Module, attributes: Int, fullName: String, baseType:
}
/**
- * Adds a new field to the class, with the given name,
- * attributes and field type.
+ * Adds a new field to the class, with the given name, attributes and field type. The location has no custom mods.
*/
- def DefineField(name: String, `type`: Type, attrs: Short): FieldBuilder = {
- val field: FieldBuilder = new FieldBuilder(name, this, attrs, `type`)
- fieldBuilders += field
- return field
+ def DefineField(name: String, fieldType: Type, attrs: Short): FieldBuilder = {
+ val fieldTypeWithCustomMods = new PECustomMod(fieldType, null)
+ DefineField(name, fieldTypeWithCustomMods, attrs)
}
+ /**
+ * Adds a new field to the class, with the given name, attributes and (field type , custom mods) combination.
+ */
+ def DefineField(name: String, fieldTypeWithMods: PECustomMod, attrs: Short): FieldBuilder = {
+ val field: FieldBuilder = new FieldBuilder(name, this, attrs, fieldTypeWithMods)
+ fieldBuilders += field
+ return field
+ }
+
/**
* Adds a new method to the class, with the given name and
* method signature.
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java b/src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java
new file mode 100644
index 0000000000..56519e8487
--- /dev/null
+++ b/src/msil/ch/epfl/lamp/compiler/msil/util/PECustomMod.java
@@ -0,0 +1,23 @@
+package ch.epfl.lamp.compiler.msil.util;
+
+import ch.epfl.lamp.compiler.msil.Type;
+import ch.epfl.lamp.compiler.msil.CustomModifier;
+
+/**
+ * A PECustomMod holds the info parsed from metadata per the CustomMod production in Sec. 23.2.7, Partition II.
+ * */
+public final class PECustomMod {
+
+ public final Type marked;
+ public final CustomModifier[] cmods;
+
+ /** Terminology:
+ the CustomModifier(s) are markers,
+ and the msil.Type is a type marked by those markers. */
+ public PECustomMod(Type marked, CustomModifier[] cmods) {
+ this.marked = marked;
+ this.cmods = cmods;
+ }
+
+}
+
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java b/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java
index ef043875ec..649d9e74f2 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java
+++ b/src/msil/ch/epfl/lamp/compiler/msil/util/PEStream.java
@@ -152,7 +152,7 @@ public final class PEStream implements Signature {
assert length == 2 : "length == " + length;
return new Character(buffer.getChar());
case ELEMENT_TYPE_I1:
- case ELEMENT_TYPE_U1:
+ case ELEMENT_TYPE_U1: // TODO U1 not the same as I1
assert length == 1;
return new Byte(buffer.get());
case ELEMENT_TYPE_I2:
diff --git a/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java b/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java
index 119d9e6ba3..1f43b8c2fa 100644
--- a/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java
+++ b/src/msil/ch/epfl/lamp/compiler/msil/util/Table.java
@@ -1615,7 +1615,7 @@ public abstract class Table {
public int Number;
public int Flags;
- public int Owner; // a TypeOrMethodDef (§24.2.6) coded index
+ public int Owner; // a TypeOrMethodDef (Sec 24.2.6) coded index
public int Name; // a non-null index into the String heap
private java.util.Map /*<Integer, java.util.Set<Integer>>*/ GenericParamIdxesForMethodDefIdx =
@@ -1760,7 +1760,7 @@ public abstract class Table {
public static final int ID = 0x2c;
public int Owner; // an index into the GenericParam table
- public int Constraint; // a TypeDefOrRef (§24.2.6) coded index
+ public int Constraint; // a TypeDefOrRef (Sec 24.2.6) coded index
public GenericParamConstraint(PEFile file, int rows) {
super(file, ID, rows);
diff --git a/src/partest/scala/tools/partest/PartestTask.scala b/src/partest/scala/tools/partest/PartestTask.scala
index f1b3ea496d..1a75621d4d 100644
--- a/src/partest/scala/tools/partest/PartestTask.scala
+++ b/src/partest/scala/tools/partest/PartestTask.scala
@@ -19,7 +19,6 @@ import util.PathResolver
import scala.tools.ant.sabbus.CompilationPathProperty
import java.io.File
-import java.net.URLClassLoader
import java.lang.reflect.Method
import org.apache.tools.ant.Task
diff --git a/src/partest/scala/tools/partest/ReplTest.scala b/src/partest/scala/tools/partest/ReplTest.scala
index 2f6bcea78b..b31c43ba6f 100644
--- a/src/partest/scala/tools/partest/ReplTest.scala
+++ b/src/partest/scala/tools/partest/ReplTest.scala
@@ -5,6 +5,7 @@
package scala.tools.partest
+import scala.tools.nsc.Settings
import scala.tools.nsc.interpreter.ILoop
import java.lang.reflect.{ Method => JMethod, Field => JField }
@@ -13,7 +14,8 @@ import java.lang.reflect.{ Method => JMethod, Field => JField }
*/
abstract class ReplTest extends App {
def code: String
- def eval() = (ILoop run code).lines drop 1
+ def settings: Settings = new Settings // override for custom settings
+ def eval() = ILoop.runForTranscript(code, settings).lines drop 1
def show() = eval() foreach println
show()
diff --git a/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala b/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala
index 4182cc78b8..02edf0fc31 100644
--- a/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala
+++ b/src/partest/scala/tools/partest/nest/ConsoleFileManager.scala
@@ -166,6 +166,7 @@ class ConsoleFileManager extends FileManager {
var latestCompFile: File = _
var latestPartestFile: File = _
var latestFjbgFile: File = _
+ def latestScalapFile: File = (latestLibFile.parent / "scalap.jar").jfile
var testClassesDir: Directory = _
// initialize above fields
findLatest()
diff --git a/src/partest/scala/tools/partest/nest/PathSettings.scala b/src/partest/scala/tools/partest/nest/PathSettings.scala
index b02417a50c..7461b45fee 100644
--- a/src/partest/scala/tools/partest/nest/PathSettings.scala
+++ b/src/partest/scala/tools/partest/nest/PathSettings.scala
@@ -10,7 +10,6 @@ import scala.tools.nsc.util.ClassPath
import scala.tools.nsc.io
import io.{ Path, File, Directory }
import RunnerUtils._
-import java.net.URLClassLoader
object PathSettings {
import PartestDefaults.{ testRootDir, srcDirName }
diff --git a/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala b/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala
index b0aa56f9ff..f39debf31d 100644
--- a/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala
+++ b/src/partest/scala/tools/partest/nest/ReflectiveRunner.scala
@@ -48,9 +48,9 @@ class ReflectiveRunner {
new ConsoleFileManager
import fileManager.
- { latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile }
+ { latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile, latestScalapFile }
val files =
- Array(latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile) map (x => io.File(x))
+ Array(latestCompFile, latestLibFile, latestPartestFile, latestFjbgFile, latestScalapFile) map (x => io.File(x))
val sepUrls = files map (_.toURL)
val sepLoader = new URLClassLoader(sepUrls, null)
diff --git a/src/partest/scala/tools/partest/nest/Worker.scala b/src/partest/scala/tools/partest/nest/Worker.scala
index afbdfdba83..301fe5e32b 100644
--- a/src/partest/scala/tools/partest/nest/Worker.scala
+++ b/src/partest/scala/tools/partest/nest/Worker.scala
@@ -9,7 +9,7 @@ package scala.tools.partest
package nest
import java.io._
-import java.net.{ URLClassLoader, URL }
+import java.net.URL
import java.util.{ Timer, TimerTask }
import scala.util.Properties.{ isWin }
@@ -285,25 +285,7 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor
*/
def runCommand(command: String, outFile: File): Boolean = {
NestUI.verbose("running command:\n"+command)
-
- // This is laboriously avoiding #> since it swallows exit failure code.
- // To be revisited. XXX.
- val out = new StringBuilder
- val err = new StringBuilder
- val errorLogger = ProcessLogger(x => err append (x + "\n"))
- val pio = BasicIO(
- false,
- x => out append (x + "\n"),
- Some(errorLogger)
- )
- val process = Process(command) run pio
- val code = process.exitValue()
- SFile(outFile) writeAll out.toString
-
- (code == 0) || {
- SFile(outFile).appendAll(command + " failed with code: " + code + "\n", err.toString)
- false
- }
+ (command #> outFile !) == 0
}
def execTest(outDir: File, logFile: File, classpathPrefix: String = ""): Boolean = {
@@ -842,35 +824,31 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor
case "scalap" =>
runInContext(file, (logFile: File, outDir: File) => {
- val sourceDir = file.getParentFile
- val sourceDirName = sourceDir.getName
-
- // 1. Find file with result text
- val results = sourceDir.listFiles(new FilenameFilter {
- def accept(dir: File, name: String) = name == "result.test"
- })
+ val sourceDir = Directory(if (file.isFile) file.getParent else file)
+ val sources = sourceDir.files filter (_ hasExtension "scala") map (_.jfile) toList
+ val results = sourceDir.files filter (_.name == "result.test") map (_.jfile) toList
- if (results.length != 1) {
- NestUI.verbose("Result file not found in directory " + sourceDirName + " \n")
+ if (sources.length != 1 || results.length != 1) {
+ NestUI.warning("Misconfigured scalap test directory: " + sourceDir + " \n")
false
}
else {
- val resFile = results(0)
+ val resFile = results.head
// 2. Compile source file
- if (!compileMgr.shouldCompile(outDir, List(file), kind, logFile)) {
- NestUI.verbose("compilerMgr failed to compile %s to %s".format(file, outDir))
+ if (!compileMgr.shouldCompile(outDir, sources, kind, logFile)) {
+ NestUI.normal("compilerMgr failed to compile %s to %s".format(sources mkString ", ", outDir))
false
}
else {
// 3. Decompile file and compare results
- val isPackageObject = sourceDir.getName.startsWith("package")
- val className = sourceDirName.capitalize + (if (!isPackageObject) "" else ".package")
- val url = outDir.toURI.toURL
- val loader = new URLClassLoader(Array(url), getClass.getClassLoader)
- val clazz = loader.loadClass(className)
+ val isPackageObject = sourceDir.name startsWith "package"
+ val className = sourceDir.name.capitalize + (if (!isPackageObject) "" else ".package")
+ val url = outDir.toURI.toURL
+ val loader = ScalaClassLoader.fromURLs(List(url), this.getClass.getClassLoader)
+ val clazz = loader.loadClass(className)
val byteCode = ByteCode.forClass(clazz)
- val result = scala.tools.scalap.Main.decompileScala(byteCode.bytes, isPackageObject)
+ val result = scala.tools.scalap.Main.decompileScala(byteCode.bytes, isPackageObject)
SFile(logFile) writeAll result
diffCheck(compareFiles(logFile, resFile))
@@ -951,10 +929,12 @@ class Worker(val fileManager: FileManager, params: TestRunParams) extends Actor
wr.flush()
swr.flush()
NestUI.normal(swr.toString)
- if (isFail && (fileManager.showDiff || isPartestDebug) && diff != "")
- NestUI.normal(diff)
- if (isFail && fileManager.showLog)
- showLog(logFile)
+ if (isFail) {
+ if ((fileManager.showDiff || isPartestDebug) && diff != "")
+ NestUI.normal(diff)
+ else if (fileManager.showLog)
+ showLog(logFile)
+ }
}
cleanup()
}
diff --git a/src/scalap/scala/tools/scalap/Decode.scala b/src/scalap/scala/tools/scalap/Decode.scala
index c8bb58c81e..816041720f 100644
--- a/src/scalap/scala/tools/scalap/Decode.scala
+++ b/src/scalap/scala/tools/scalap/Decode.scala
@@ -33,7 +33,7 @@ object Decode {
*/
def scalaSigBytes(name: String): Option[Array[Byte]] = scalaSigBytes(name, getSystemLoader())
def scalaSigBytes(name: String, classLoader: ScalaClassLoader): Option[Array[Byte]] = {
- val bytes = classLoader.findBytesForClassName(name)
+ val bytes = classLoader.classBytes(name)
val reader = new ByteArrayReader(bytes)
val cf = new Classfile(reader)
cf.scalaSigAttribute map (_.data)
@@ -43,7 +43,7 @@ object Decode {
*/
def scalaSigAnnotationBytes(name: String): Option[Array[Byte]] = scalaSigAnnotationBytes(name, getSystemLoader())
def scalaSigAnnotationBytes(name: String, classLoader: ScalaClassLoader): Option[Array[Byte]] = {
- val bytes = classLoader.findBytesForClassName(name)
+ val bytes = classLoader.classBytes(name)
val byteCode = ByteCode(bytes)
val classFile = ClassFileParser.parse(byteCode)
import classFile._
diff --git a/src/scalap/scala/tools/scalap/Main.scala b/src/scalap/scala/tools/scalap/Main.scala
index 2a2716ba20..9ddb521a10 100644
--- a/src/scalap/scala/tools/scalap/Main.scala
+++ b/src/scalap/scala/tools/scalap/Main.scala
@@ -5,50 +5,33 @@
**
*/
-
package scala.tools.scalap
-import java.io.{PrintStream, OutputStreamWriter, ByteArrayOutputStream}
+import java.io.{ PrintStream, OutputStreamWriter, ByteArrayOutputStream }
import scalax.rules.scalasig._
import tools.nsc.util.{ ClassPath, JavaClassPath }
import tools.util.PathResolver
import ClassPath.DefaultJavaContext
-import tools.nsc.io.{PlainFile, AbstractFile}
+import tools.nsc.io.{ PlainFile, AbstractFile }
/**The main object used to execute scalap on the command-line.
*
* @author Matthias Zenger, Stephane Micheloud, Burak Emir, Ilya Sergey
*/
-object Main {
- val SCALA_SIG = "ScalaSig"
+class Main {
+ val SCALA_SIG = "ScalaSig"
val SCALA_SIG_ANNOTATION = "Lscala/reflect/ScalaSignature;"
- val BYTES_VALUE = "bytes"
+ val BYTES_VALUE = "bytes"
- val versionMsg = "Scala classfile decoder " +
- Properties.versionString + " -- " +
- Properties.copyrightString + "\n"
+ val versionMsg = "Scala classfile decoder %s -- %s\n".format(Properties.versionString, Properties.copyrightString)
/**Verbose program run?
*/
var verbose = false
var printPrivates = false
- /**Prints usage information for scalap.
- */
- def usage {
- Console.println("usage: scalap {<option>} <name>")
- Console.println("where <name> is fully-qualified class name or <package_name>.package for package objects")
- Console.println("and <option> is")
- Console.println(" -private print private definitions")
- Console.println(" -verbose print out additional information")
- Console.println(" -version print out the version number of scalap")
- Console.println(" -help display this usage message")
- Console.println(" -classpath <path> specify where to find user class files")
- Console.println(" -cp <path> specify where to find user class files")
- }
-
def isScalaFile(bytes: Array[Byte]): Boolean = {
- val byteCode = ByteCode(bytes)
+ val byteCode = ByteCode(bytes)
val classFile = ClassFileParser.parse(byteCode)
classFile.attribute("ScalaSig").isDefined
}
@@ -69,11 +52,12 @@ object Main {
def isPackageObjectFile(s: String) = s != null && (s.endsWith(".package") || s == "package")
def parseScalaSignature(scalaSig: ScalaSig, isPackageObject: Boolean) = {
- val baos = new ByteArrayOutputStream
+ val baos = new ByteArrayOutputStream
val stream = new PrintStream(baos)
- val syms = scalaSig.topLevelClasses ::: scalaSig.topLevelObjects
+ val syms = scalaSig.topLevelClasses ++ scalaSig.topLevelObjects
+
syms.head.parent match {
- //Partial match
+ // Partial match
case Some(p) if (p.name != "<empty>") => {
val path = p.path
if (!isPackageObject) {
@@ -93,9 +77,7 @@ object Main {
}
// Print classes
val printer = new ScalaSigPrinter(stream, printPrivates)
- for (c <- syms) {
- printer.printSymbol(c)
- }
+ syms foreach (printer printSymbol _)
baos.toString
}
@@ -109,12 +91,8 @@ object Main {
}
}
- /**Executes scalap with the given arguments and classpath for the
- * class denoted by <code>classname</code>.
- *
- * @param args...
- * @param path...
- * @param classname...
+ /** Executes scalap with the given arguments and classpath for the
+ * class denoted by `classname`.
*/
def process(args: Arguments, path: ClassPath[AbstractFile])(classname: String): Unit = {
// find the classfile
@@ -139,136 +117,9 @@ object Main {
}
// if the class corresponds to the artificial class scala.Any.
// (see member list in class scala.tool.nsc.symtab.Definitions)
- } else if (classname == "scala.Any") {
- Console.println("package scala")
- Console.println("class Any {")
- Console.println(" final def ==(scala.Any): scala.Boolean")
- Console.println(" final def !=(scala.Any): Boolean")
- Console.println(" def equals(scala.Any): scala.Boolean")
- Console.println(" def hashCode(): scala.Int")
- Console.println(" def toString(): java.lang.String")
- Console.println(" final def isInstanceOf[a]: scala.Boolean")
- Console.println(" final def asInstanceOf[a]: a")
- Console.println("}")
- // if the class corresponds to the artificial class scala.AnyRef.
- } else if (classname == "scala.AnyRef") {
- Console.println("package scala")
- Console.println("class AnyRef extends Any {")
- Console.println(" def equals(scala.Any): scala.Boolean")
- Console.println(" def hashCode(): scala.Int")
- Console.println(" def toString(): java.lang.String")
- Console.println("}")
- // if the class corresponds to the artificial class scala.AnyVal.
- } else if (classname == "scala.AnyVal") {
- Console.println("package scala")
- Console.println("sealed class AnyVal extends Any")
- // if the class corresponds to the artificial class scala.Boolean.
- } else if (classname == "scala.Boolean") {
- Console.println("package scala")
- Console.println("sealed abstract class Boolean extends AnyVal {")
- Console.println(" def &&(p: => scala.Boolean): scala.Boolean // boolean and")
- Console.println(" def ||(p: => scala.Boolean): scala.Boolean // boolean or")
- Console.println(" def & (x: scala.Boolean): scala.Boolean // boolean strict and")
- Console.println(" def | (x: scala.Boolean): scala.Boolean // boolean stric or")
- Console.println(" def ==(x: scala.Boolean): scala.Boolean // boolean equality")
- Console.println(" def !=(x: scala.Boolean): scala.Boolean // boolean inequality")
- Console.println(" def !: scala.Boolean // boolean negation")
- Console.println("}")
- // if the class corresponds to the artificial class scala.Int.
- } else if (classname == "scala.Int") {
- Console.println("package scala")
- Console.println("sealed abstract class Int extends AnyVal {")
- Console.println(" def ==(that: scala.Double): scala.Boolean")
- Console.println(" def ==(that: scala.Float): scala.Boolean")
- Console.println(" def ==(that: scala.Long): scala.Boolean")
- Console.println(" def ==(that: scala.Int): scala.Boolean")
- Console.println(" def ==(that: scala.Short): scala.Boolean")
- Console.println(" def ==(that: scala.Byte): scala.Boolean")
- Console.println(" def ==(that: scala.Char): scala.Boolean")
- Console.println(" /* analogous for !=, <, >, <=, >= */")
- Console.println
- Console.println(" def + (that: scala.Double): scala.Double // double addition")
- Console.println(" def + (that: scala.Float): scala.Float // float addition")
- Console.println(" def + (that: scala.Long): scala.Long // long addition")
- Console.println(" def + (that: scala.Int): scala.Int // int addition")
- Console.println(" def + (that: scala.Short): scala.Int // int addition")
- Console.println(" def + (that: scala.Byte): scala.Int // int addition")
- Console.println(" def + (that: scala.Char): scala.Int // int addition")
- Console.println(" /* analogous for -, *, /, % */")
- Console.println
- Console.println(" def & (that: scala.Long): scala.Long // long bitwise and")
- Console.println(" def & (that: scala.Int): scala.Int // int bitwise and")
- Console.println(" def & (that: scala.Short): scala.Int // int bitwise and")
- Console.println(" def & (that: scala.Byte): scala.Int // int bitwise and")
- Console.println(" def & (that: scala.Char): scala.Int // int bitwise and")
- Console.println(" /* analogous for |, ^ */")
- Console.println
- Console.println(" def <<(cnt: scala.Int): scala.Int // int left shift")
- Console.println(" def <<(cnt: scala.Long): scala.Int // long left shift")
- Console.println(" /* analogous for >>, >>> */")
- Console.println
- Console.println(" def + : scala.Int // int identity")
- Console.println(" def - : scala.Int // int negation")
- Console.println(" def ~ : scala.Int // int bitwise negation")
- Console.println
- Console.println(" def toByte: scala.Byte // convert to Byte")
- Console.println(" def toShort: scala.Short // convert to Short")
- Console.println(" def toChar: scala.Char // convert to Char")
- Console.println(" def toInt: scala.Int // convert to Int")
- Console.println(" def toLong: scala.Long // convert to Long")
- Console.println(" def toFloat: scala.Float // convert to Float")
- Console.println(" def toDouble: scala.Double // convert to Double")
- Console.println("}")
- // if the class corresponds to the artificial class scala.Nothing.
- } else if (classname == "scala.Nothing") {
- Console.println("package scala")
- Console.println("sealed abstract class Nothing")
- // if the class corresponds to the artificial class scala.Null.
- } else if (classname == "scala.Null") {
- Console.println("package scala")
- Console.println("sealed abstract class Null")
- } else
- Console.println("class/object " + classname + " not found.")
- }
-
- /**The main method of this object.
- */
- def main(args: Array[String]) {
- // print usage information if there is no command-line argument
- if (args.length == 0)
- usage
- // otherwise parse the arguments...
- else {
- val arguments = Arguments.Parser('-')
- .withOption("-private")
- .withOption("-verbose")
- .withOption("-version")
- .withOption("-help")
- .withOptionalArg("-classpath")
- .withOptionalArg("-cp")
- .parse(args);
- if (arguments contains "-version")
- Console.println(versionMsg)
- if (arguments contains "-help")
- usage
- verbose = arguments contains "-verbose"
- printPrivates = arguments contains "-private"
- // construct a custom class path
- def cparg = List("-classpath", "-cp") map (arguments getArgument _) reduceLeft (_ orElse _)
- val path = cparg match {
- case Some(cpstring) =>
- new JavaClassPath(DefaultJavaContext.classesInExpandedPath(cpstring), DefaultJavaContext)
-
- case None =>
- PathResolver.fromPathString("")
- }
- // print the classpath if output is verbose
- if (verbose)
- Console.println(Console.BOLD + "CLASSPATH" + Console.RESET + " = " + path)
-
- // process all given classes
- arguments.getOthers.foreach(process(arguments, path))
}
+ else
+ Console.println("class/object " + classname + " not found.")
}
object EmptyClasspath extends ClassPath[AbstractFile] {
@@ -284,3 +135,55 @@ object Main {
val sourcepaths: List[AbstractFile] = Nil
}
}
+
+object Main extends Main {
+ /** Prints usage information for scalap. */
+ def usage() {
+ Console println """
+ |Usage: scalap {<option>} <name>
+ |where <name> is fully-qualified class name or <package_name>.package for package objects
+ |and <option> is
+ | -private print private definitions
+ | -verbose print out additional information
+ | -version print out the version number of scalap
+ | -help display this usage message
+ | -classpath <path> specify where to find user class files
+ | -cp <path> specify where to find user class files
+ """.stripMargin.trim
+ }
+
+ def main(args: Array[String]) {
+ // print usage information if there is no command-line argument
+ if (args.isEmpty)
+ return usage()
+
+ val arguments = Arguments.Parser('-')
+ .withOption("-private")
+ .withOption("-verbose")
+ .withOption("-version")
+ .withOption("-help")
+ .withOptionalArg("-classpath")
+ .withOptionalArg("-cp")
+ .parse(args);
+
+ if (arguments contains "-version")
+ Console.println(versionMsg)
+ if (arguments contains "-help")
+ usage()
+
+ verbose = arguments contains "-verbose"
+ printPrivates = arguments contains "-private"
+ // construct a custom class path
+ val cparg = List("-classpath", "-cp") map (arguments getArgument _) reduceLeft (_ orElse _)
+ val path = cparg match {
+ case Some(cp) => new JavaClassPath(DefaultJavaContext.classesInExpandedPath(cp), DefaultJavaContext)
+ case _ => PathResolver.fromPathString("")
+ }
+ // print the classpath if output is verbose
+ if (verbose)
+ Console.println(Console.BOLD + "CLASSPATH" + Console.RESET + " = " + path)
+
+ // process all given classes
+ arguments.getOthers foreach process(arguments, path)
+ }
+}
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala
index 170a9a15a3..995c629b5d 100644
--- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala
+++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSig.scala
@@ -253,9 +253,11 @@ object ScalaSigEntryParsers extends RulesWithState with MemoisableRules {
18 -~ classSymRef ~ (typeRef*) ^~^ RefinedType,
19 -~ symbolRef ~ (typeRef*) ^~^ ClassInfoType,
20 -~ typeRef ~ (symbolRef*) ^~^ MethodType,
- 21 -~ typeRef ~ (refTo(typeSymbol)+) ^~^ PolyType, // TODO: make future safe for past by doing the same transformation as in the full unpickler in case we're reading pre-2.9 classfiles
+ 21 -~ typeRef ~ (refTo(typeSymbol)+) ^~^ PolyType,
+ // TODO: make future safe for past by doing the same transformation as in the
+ // full unpickler in case we're reading pre-2.9 classfiles
21 -~ typeRef ^^ NullaryMethodType,
- 22 -~ typeRef ~ (symbolRef*) ^~^ ImplicitMethodType,
+ 22 -~ typeRef ~ (symbolRef*) ^~^ MethodType,
42 -~ typeRef ~ (attribTreeRef*) ^~^ AnnotatedType,
51 -~ typeRef ~ symbolRef ~ (attribTreeRef*) ^~~^ AnnotatedWithSelfType,
47 -~ typeLevel ~ typeIndex ^~^ DeBruijnIndexType,
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala
index acaf64df2a..93c1c7a394 100644
--- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala
+++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/ScalaSigPrinter.scala
@@ -205,16 +205,17 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) {
case ms: MethodSymbol => ms.name + " : " + toString(ms.infoType)(TypeFlags(true))
case _ => "^___^"
})
+ val implicitWord = mt.paramSymbols.headOption match {
+ case Some(p) if p.isImplicit => "implicit "
+ case _ => ""
+ }
// Print parameter clauses
- print(paramEntries.mkString(
- "(" + (mt match {case _: ImplicitMethodType => "implicit "; case _ => ""})
- , ", ", ")"))
+ print(paramEntries.mkString("(" + implicitWord, ", ", ")"))
// Print result type
mt.resultType match {
case mt: MethodType => printMethodType(mt, printResult)({})
- case imt: ImplicitMethodType => printMethodType(imt, printResult)({})
case x => if (printResult) {
print(" : ");
printType(x)
@@ -225,7 +226,6 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) {
t match {
case NullaryMethodType(resType) => if (printResult) { print(" : "); printType(resType) }
case mt@MethodType(resType, paramSymbols) => _pmt(mt)
- case mt@ImplicitMethodType(resType, paramSymbols) => _pmt(mt)
case pt@PolyType(mt, typeParams) => {
print(typeParamString(typeParams))
printMethodType(mt, printResult)({})
@@ -373,7 +373,6 @@ class ScalaSigPrinter(stream: PrintStream, printPrivates: Boolean) {
case ClassInfoTypeWithCons(symbol, typeRefs, cons) => sep + typeRefs.map(toString).
mkString(cons + " extends ", " with ", "")
- case ImplicitMethodType(resultType, _) => toString(resultType, sep)
case MethodType(resultType, _) => toString(resultType, sep)
case NullaryMethodType(resultType) => toString(resultType, sep)
diff --git a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala
index 3658cb1c89..543ddbe186 100644
--- a/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala
+++ b/src/scalap/scala/tools/scalap/scalax/rules/scalasig/Type.scala
@@ -20,7 +20,6 @@ case class MethodType(resultType : Type, paramSymbols : Seq[Symbol]) extends Typ
case class NullaryMethodType(resultType : Type) extends Type
case class PolyType(typeRef : Type, symbols : Seq[TypeSymbol]) extends Type
case class PolyTypeWithCons(typeRef : Type, symbols : Seq[TypeSymbol], cons: String) extends Type
-case class ImplicitMethodType(resultType : Type, paramSymbols : Seq[Symbol]) extends Type
case class AnnotatedType(typeRef : Type, attribTreeRefs : List[Int]) extends Type
case class AnnotatedWithSelfType(typeRef : Type, symbol : Symbol, attribTreeRefs : List[Int]) extends Type
case class DeBruijnIndexType(typeLevel : Int, typeIndex : Int) extends Type
diff --git a/src/swing/scala/swing/ComboBox.scala b/src/swing/scala/swing/ComboBox.scala
index 69cfa6988f..75f981064b 100644
--- a/src/swing/scala/swing/ComboBox.scala
+++ b/src/swing/scala/swing/ComboBox.scala
@@ -122,7 +122,7 @@ object ComboBox {
def newConstantModel[A](items: Seq[A]): ComboBoxModel = {
new AbstractListModel with ComboBoxModel {
- private var selected = items(0)
+ private var selected: A = if (items.isEmpty) null.asInstanceOf[A] else items(0)
def getSelectedItem: AnyRef = selected.asInstanceOf[AnyRef]
def setSelectedItem(a: Any) {
if ((selected != null && selected != a) ||
diff --git a/src/swing/scala/swing/Component.scala b/src/swing/scala/swing/Component.scala
index 3cbe2dbfd1..b7a93ef448 100644
--- a/src/swing/scala/swing/Component.scala
+++ b/src/swing/scala/swing/Component.scala
@@ -103,7 +103,7 @@ abstract class Component extends UIElement {
def tooltip_=(t: String) = peer.setToolTipText(t)
def inputVerifier: Component => Boolean = { a =>
- peer.getInputVerifier.verify(a.peer)
+ Option(peer.getInputVerifier) forall (_ verify a.peer)
}
def inputVerifier_=(v: Component => Boolean) {
peer.setInputVerifier(new javax.swing.InputVerifier {
diff --git a/src/swing/scala/swing/TextField.scala b/src/swing/scala/swing/TextField.scala
index d2a9f150a2..f04e122fb9 100644
--- a/src/swing/scala/swing/TextField.scala
+++ b/src/swing/scala/swing/TextField.scala
@@ -60,15 +60,15 @@ class TextField(text0: String, columns0: Int) extends TextComponent with TextCom
peer.removeActionListener(actionListener)
}
- def verifier: String => Boolean = s => peer.getInputVerifier.verify(peer)
+ def verifier: String => Boolean = s => Option(peer.getInputVerifier) forall (_ verify peer)
def verifier_=(v: String => Boolean) {
peer.setInputVerifier(new InputVerifier {
- private val old = peer.getInputVerifier
+ private val old = Option(peer.getInputVerifier)
def verify(c: JComponent) = v(text)
- override def shouldYieldFocus(c: JComponent) = old.shouldYieldFocus(c)
+ override def shouldYieldFocus(c: JComponent) = old forall (_ shouldYieldFocus c)
})
}
- def shouldYieldFocus: String=>Boolean = s => peer.getInputVerifier.shouldYieldFocus(peer)
+ def shouldYieldFocus: String => Boolean = s => Option(peer.getInputVerifier) forall (_ shouldYieldFocus peer)
def shouldYieldFocus_=(y: String=>Boolean) {
peer.setInputVerifier(new InputVerifier {
private val old = peer.getInputVerifier