summaryrefslogtreecommitdiff
path: root/src/scaladoc
diff options
context:
space:
mode:
authorJason Zaugg <jzaugg@gmail.com>2013-05-17 17:01:20 +0200
committerPaul Phillips <paulp@improving.org>2013-05-17 11:16:39 -0700
commitb7c352a57f65458c66c78a368f75aaaa4a08e443 (patch)
tree4b2b7fcea439948c5de65b05a392091a66eea0a4 /src/scaladoc
parent4f8c306aca703c63282295c9f74f0cb35f9f85d4 (diff)
parentbe405eed9bef9736f0142d6ddf53b6bf8af08696 (diff)
downloadscala-b7c352a57f65458c66c78a368f75aaaa4a08e443.tar.gz
scala-b7c352a57f65458c66c78a368f75aaaa4a08e443.tar.bz2
scala-b7c352a57f65458c66c78a368f75aaaa4a08e443.zip
Merge v2.10.1-326-g4f8c306' into merge/v2.10.1-326-g4f8c306-to-master
================================================================ Merge commit 'v2.10.1-326-g4f8c306' into merge/v2.10.1-326-g4f8c306-to-master Conflicts: src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala src/reflect/scala/reflect/runtime/JavaMirrors.scala ================================================================ Merge -s ours 4e64a27 ([nomaster commit range]) ================================================================ Merge commit '0ae7e55' into merge/v2.10.1-326-g4f8c306-to-master Conflicts: src/compiler/scala/tools/nsc/typechecker/Macros.scala
Diffstat (limited to 'src/scaladoc')
-rw-r--r--src/scaladoc/scala/tools/ant/Scaladoc.scala695
-rw-r--r--src/scaladoc/scala/tools/nsc/ScalaDoc.scala72
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/DocFactory.scala132
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/DocParser.scala69
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/Index.scala17
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala263
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala49
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/Settings.scala348
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/Uncompilable.scala51
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/Universe.scala16
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/base/CommentFactoryBase.scala935
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/base/LinkTo.scala13
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/base/MemberLookupBase.scala202
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/base/comment/Body.scala93
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/base/comment/Comment.scala131
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/doclet/Generator.scala30
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/doclet/Indexer.scala21
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/doclet/Universer.scala21
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/Doclet.scala19
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/HtmlFactory.scala152
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala226
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/Page.scala103
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/SyntaxHigh.scala287
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/Index.scala133
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala69
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/html/page/ReferenceIndex.scala61
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala127
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/Template.scala980
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramGenerator.scala53
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala66
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala508
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala225
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/arrow-down.pngbin0 -> 6232 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/arrow-right.pngbin0 -> 6220 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class.pngbin0 -> 3357 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_big.pngbin0 -> 7516 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_diagram.pngbin0 -> 3910 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_to_object_big.pngbin0 -> 9006 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/constructorsbg.gifbin0 -> 1206 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/conversionbg.gifbin0 -> 167 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/defbg-blue.gifbin0 -> 1544 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/defbg-green.gifbin0 -> 1341 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/diagrams.css143
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/diagrams.js324
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left.pngbin0 -> 1692 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left.psdbin0 -> 30823 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left2.gifbin0 -> 1462 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_right.pngbin0 -> 1803 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_right.psdbin0 -> 31295 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterbg.gifbin0 -> 1324 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.gifbin0 -> 1104 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.pngbin0 -> 965 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbg.gifbin0 -> 1366 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/fullcommenttopbg.gifbin0 -> 1115 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.css338
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js536
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery-ui.js6
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.js2
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js5486
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js4
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/navigation-li-a.pngbin0 -> 1198 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/navigation-li.pngbin0 -> 2441 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object.pngbin0 -> 3356 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_big.pngbin0 -> 7653 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_diagram.pngbin0 -> 3903 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_class_big.pngbin0 -> 9158 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_trait_big.pngbin0 -> 9200 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_type_big.pngbin0 -> 9158 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownderbg2.gifbin0 -> 1145 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownerbg.gifbin0 -> 1118 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownerbg2.gifbin0 -> 1145 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/package.pngbin0 -> 3335 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/package_big.pngbin0 -> 7312 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/packagesbg.gifbin0 -> 1201 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/raphael-min.js10
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/html/resource/lib/ref-index.css30
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/remove.pngbin0 -> 3186 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/remove.psdbin0 -> 28904 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/scheduler.js71
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-implicits.pngbin0 -> 1150 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-right-implicits.pngbin0 -> 646 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-right.pngbin0 -> 1380 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected.pngbin0 -> 1864 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected2-right.pngbin0 -> 1434 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected2.pngbin0 -> 1965 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/signaturebg.gifbin0 -> 1214 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/signaturebg2.gifbin0 -> 1209 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.css848
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.js466
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/tools.tooltip.js14
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait.pngbin0 -> 3374 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_big.pngbin0 -> 7410 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_diagram.pngbin0 -> 3882 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_to_object_big.pngbin0 -> 8967 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type.pngbin0 -> 1445 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_big.pngbin0 -> 4236 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_diagram.pngbin0 -> 1841 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_tags.ai6376
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_to_object_big.pngbin0 -> 4969 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/typebg.gifbin0 -> 1206 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/unselected.pngbin0 -> 1879 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/valuemembersbg.gifbin0 -> 1206 bytes
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/html/resource/lib/versions.txt1
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/CommentFactory.scala100
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/Entity.scala597
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala59
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/MemberLookup.scala56
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/ModelFactory.scala1023
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala575
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala315
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/TreeEntity.scala27
-rwxr-xr-xsrc/scaladoc/scala/tools/nsc/doc/model/TreeFactory.scala95
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/TypeEntity.scala27
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/ValueArgument.scala20
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/Visibility.scala39
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/diagram/Diagram.scala137
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramDirectiveParser.scala257
-rw-r--r--src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala254
-rw-r--r--src/scaladoc/scala/tools/partest/ScaladocModelTest.scala203
119 files changed, 24606 insertions, 0 deletions
diff --git a/src/scaladoc/scala/tools/ant/Scaladoc.scala b/src/scaladoc/scala/tools/ant/Scaladoc.scala
new file mode 100644
index 0000000000..fd6d637212
--- /dev/null
+++ b/src/scaladoc/scala/tools/ant/Scaladoc.scala
@@ -0,0 +1,695 @@
+/* __ *\
+** ________ ___ / / ___ Scala Ant Tasks **
+** / __/ __// _ | / / / _ | (c) 2005-2013, LAMP/EPFL **
+** __\ \/ /__/ __ |/ /__/ __ | http://scala-lang.org/ **
+** /____/\___/_/ |_/____/_/ | | **
+** |/ **
+\* */
+
+
+package scala.tools.ant
+
+import java.io.File
+
+import org.apache.tools.ant.Project
+import org.apache.tools.ant.types.{Path, Reference}
+import org.apache.tools.ant.util.{FileUtils, GlobPatternMapper}
+
+import scala.tools.nsc.Global
+import scala.tools.nsc.doc.Settings
+import scala.tools.nsc.reporters.{Reporter, ConsoleReporter}
+
+/** An Ant task to document Scala code.
+ *
+ * This task can take the following parameters as attributes:
+ * - `srcdir` (mandatory),
+ * - `srcref`,
+ * - `destdir`,
+ * - `classpath`,
+ * - `classpathref`,
+ * - `sourcepath`,
+ * - `sourcepathref`,
+ * - `bootclasspath`,
+ * - `bootclasspathref`,
+ * - `extdirs`,
+ * - `extdirsref`,
+ * - `encoding`,
+ * - `doctitle`,
+ * - `header`,
+ * - `footer`,
+ * - `top`,
+ * - `bottom`,
+ * - `addparams`,
+ * - `deprecation`,
+ * - `docgenerator`,
+ * - `docrootcontent`,
+ * - `unchecked`,
+ * - `nofail`,
+ * - `skipPackages`.
+ *
+ * It also takes the following parameters as nested elements:
+ * - `src` (for srcdir),
+ * - `classpath`,
+ * - `sourcepath`,
+ * - `bootclasspath`,
+ * - `extdirs`.
+ *
+ * @author Gilles Dubochet, Stephane Micheloud
+ */
+class Scaladoc extends ScalaMatchingTask {
+
+ /** The unique Ant file utilities instance to use in this task. */
+ private val fileUtils = FileUtils.getFileUtils()
+
+/*============================================================================*\
+** Ant user-properties **
+\*============================================================================*/
+
+ abstract class PermissibleValue {
+ val values: List[String]
+ def isPermissible(value: String): Boolean =
+ (value == "") || values.exists(_.startsWith(value))
+ }
+
+ /** Defines valid values for the `deprecation` and
+ * `unchecked` properties.
+ */
+ object Flag extends PermissibleValue {
+ val values = List("yes", "no", "on", "off")
+ def getBooleanValue(value: String, flagName: String): Boolean =
+ if (Flag.isPermissible(value))
+ ("yes".equals(value) || "on".equals(value))
+ else
+ buildError("Unknown " + flagName + " flag '" + value + "'")
+ }
+
+ /** The directories that contain source files to compile. */
+ private var origin: Option[Path] = None
+ /** The directory to put the compiled files in. */
+ private var destination: Option[File] = None
+
+ /** The class path to use for this compilation. */
+ private var classpath: Option[Path] = None
+ /** The source path to use for this compilation. */
+ private var sourcepath: Option[Path] = None
+ /** The boot class path to use for this compilation. */
+ private var bootclasspath: Option[Path] = None
+ /** The external extensions path to use for this compilation. */
+ private var extdirs: Option[Path] = None
+
+ /** The character encoding of the files to compile. */
+ private var encoding: Option[String] = None
+
+ /** The fully qualified name of a doclet class, which will be used to generate the documentation. */
+ private var docgenerator: Option[String] = None
+
+ /** The file from which the documentation content of the root package will be taken */
+ private var docrootcontent: Option[File] = None
+
+ /** The document title of the generated HTML documentation. */
+ private var doctitle: Option[String] = None
+
+ /** The document footer of the generated HTML documentation. */
+ private var docfooter: Option[String] = None
+
+ /** The document version, to be added to the title. */
+ private var docversion: Option[String] = None
+
+ /** 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 = ""
+
+ /** Instruct the compiler to generate deprecation information. */
+ private var deprecation: Boolean = false
+
+ /** Instruct the compiler to generate unchecked information. */
+ private var unchecked: Boolean = false
+
+ /** Instruct the ant task not to fail in the event of errors */
+ private var nofail: Boolean = false
+
+ /** Instruct the scaladoc tool to document implicit conversions */
+ private var docImplicits: Boolean = false
+
+ /** Instruct the scaladoc tool to document all (including impossible) implicit conversions */
+ private var docImplicitsShowAll: Boolean = false
+
+ /** Instruct the scaladoc tool to output implicits debugging information */
+ private var docImplicitsDebug: Boolean = false
+
+ /** Instruct the scaladoc tool to create diagrams */
+ private var docDiagrams: Boolean = false
+
+ /** Instruct the scaladoc tool to output diagram creation debugging information */
+ private var docDiagramsDebug: Boolean = false
+
+ /** Instruct the scaladoc tool to use the binary given to create diagrams */
+ private var docDiagramsDotPath: Option[String] = None
+
+ /** Instruct the scaladoc to produce textual ouput from html pages, for easy diff-ing */
+ private var docRawOutput: Boolean = false
+
+ /** Instruct the scaladoc not to generate prefixes */
+ private var docNoPrefixes: Boolean = false
+
+ /** Instruct the scaladoc tool to group similar functions together */
+ private var docGroups: Boolean = false
+
+ /** Instruct the scaladoc tool to skip certain packages */
+ private var docSkipPackages: String = ""
+
+/*============================================================================*\
+** Properties setters **
+\*============================================================================*/
+
+ /** Sets the `srcdir` attribute. Used by [[http://ant.apache.org Ant]].
+ *
+ * @param input The value of `origin`.
+ */
+ def setSrcdir(input: Path) {
+ if (origin.isEmpty) origin = Some(input)
+ else origin.get.append(input)
+ }
+
+ /** Sets the `origin` as a nested src Ant parameter.
+ *
+ * @return An origin path to be configured.
+ */
+ def createSrc(): Path = {
+ if (origin.isEmpty) origin = Some(new Path(getProject))
+ origin.get.createPath()
+ }
+
+ /** Sets the `origin` as an external reference Ant parameter.
+ *
+ * @param input A reference to an origin path.
+ */
+ def setSrcref(input: Reference) {
+ createSrc().setRefid(input)
+ }
+
+ /** Sets the `destdir` attribute. Used by [[http://ant.apache.org Ant]].
+ *
+ * @param input The value of `destination`.
+ */
+ def setDestdir(input: File) {
+ destination = Some(input)
+ }
+
+ /** Sets the `classpath` attribute. Used by [[http://ant.apache.org Ant]].
+ *
+ * @param input The value of `classpath`.
+ */
+ def setClasspath(input: Path) {
+ if (classpath.isEmpty) classpath = Some(input)
+ else classpath.get.append(input)
+ }
+
+ /** Sets the `classpath` as a nested classpath Ant parameter.
+ *
+ * @return A class path to be configured.
+ */
+ def createClasspath(): Path = {
+ if (classpath.isEmpty) classpath = Some(new Path(getProject))
+ classpath.get.createPath()
+ }
+
+ /** Sets the `classpath` as an external reference Ant parameter.
+ *
+ * @param input A reference to a class path.
+ */
+ def setClasspathref(input: Reference) =
+ createClasspath().setRefid(input)
+
+ /** Sets the `sourcepath` attribute. Used by [[http://ant.apache.org Ant]].
+ *
+ * @param input The value of `sourcepath`.
+ */
+ def setSourcepath(input: Path) =
+ if (sourcepath.isEmpty) sourcepath = Some(input)
+ else sourcepath.get.append(input)
+
+ /** Sets the `sourcepath` as a nested sourcepath Ant parameter.
+ *
+ * @return A source path to be configured.
+ */
+ def createSourcepath(): Path = {
+ if (sourcepath.isEmpty) sourcepath = Some(new Path(getProject))
+ sourcepath.get.createPath()
+ }
+
+ /** Sets the `sourcepath` as an external reference Ant parameter.
+ *
+ * @param input A reference to a source path.
+ */
+ def setSourcepathref(input: Reference) =
+ createSourcepath().setRefid(input)
+
+ /** Sets the `bootclasspath` attribute. Used by [[http://ant.apache.org Ant]].
+ *
+ * @param input The value of `bootclasspath`.
+ */
+ def setBootclasspath(input: Path) =
+ if (bootclasspath.isEmpty) bootclasspath = Some(input)
+ else bootclasspath.get.append(input)
+
+ /** Sets the `bootclasspath` as a nested `sourcepath` Ant parameter.
+ *
+ * @return A source path to be configured.
+ */
+ def createBootclasspath(): Path = {
+ if (bootclasspath.isEmpty) bootclasspath = Some(new Path(getProject))
+ bootclasspath.get.createPath()
+ }
+
+ /** Sets the `bootclasspath` as an external reference Ant parameter.
+ *
+ * @param input A reference to a source path.
+ */
+ def setBootclasspathref(input: Reference) {
+ createBootclasspath().setRefid(input)
+ }
+
+ /** Sets the external extensions path attribute. Used by [[http://ant.apache.org Ant]].
+ *
+ * @param input The value of `extdirs`.
+ */
+ def setExtdirs(input: Path) {
+ if (extdirs.isEmpty) extdirs = Some(input)
+ else extdirs.get.append(input)
+ }
+
+ /** Sets the `extdirs` as a nested sourcepath Ant parameter.
+ *
+ * @return An extensions path to be configured.
+ */
+ def createExtdirs(): Path = {
+ if (extdirs.isEmpty) extdirs = Some(new Path(getProject))
+ extdirs.get.createPath()
+ }
+
+ /** Sets the `extdirs` as an external reference Ant parameter.
+ *
+ * @param input A reference to an extensions path.
+ */
+ def setExtdirsref(input: Reference) {
+ createExtdirs().setRefid(input)
+ }
+
+ /** Sets the `encoding` attribute. Used by Ant.
+ *
+ * @param input The value of `encoding`.
+ */
+ def setEncoding(input: String) {
+ encoding = Some(input)
+ }
+
+ /** Sets the `docgenerator` attribute.
+ *
+ * @param input A fully qualified class name of a doclet.
+ */
+ def setDocgenerator(input: String) {
+ docgenerator = Some(input)
+ }
+
+ /**
+ * Sets the `docrootcontent` attribute.
+ *
+ * @param input The file from which the documentation content of the root
+ * package will be taken.
+ */
+ def setDocrootcontent(input : File) {
+ docrootcontent = Some(input)
+ }
+
+ /** Sets the `docversion` attribute.
+ *
+ * @param input The value of `docversion`.
+ */
+ def setDocversion(input: String) {
+ docversion = Some(input)
+ }
+
+ /** Sets the `docsourceurl` attribute.
+ *
+ * @param input The value of `docsourceurl`.
+ */
+ def setDocsourceurl(input: String) {
+ docsourceurl = Some(input)
+ }
+
+ /** Sets the `doctitle` attribute.
+ *
+ * @param input The value of `doctitle`.
+ */
+ def setDoctitle(input: String) {
+ doctitle = Some(input)
+ }
+
+ /** Sets the `docfooter` attribute.
+ *
+ * @param input The value of `docfooter`.
+ */
+ def setDocfooter(input: String) {
+ docfooter = Some(input)
+ }
+
+ /** Set the `addparams` info attribute.
+ *
+ * @param input The value for `addparams`.
+ */
+ def setAddparams(input: String) {
+ addParams = input
+ }
+
+ /** Set the `deprecation` info attribute.
+ *
+ * @param input One of the flags `yes/no` or `on/off`.
+ */
+ def setDeprecation(input: String) {
+ if (Flag.isPermissible(input))
+ deprecation = "yes".equals(input) || "on".equals(input)
+ else
+ buildError("Unknown deprecation flag '" + input + "'")
+ }
+
+ /** Set the `unchecked` info attribute.
+ *
+ * @param input One of the flags `yes/no` or `on/off`.
+ */
+ def setUnchecked(input: String) {
+ if (Flag.isPermissible(input))
+ unchecked = "yes".equals(input) || "on".equals(input)
+ else
+ buildError("Unknown unchecked flag '" + input + "'")
+ }
+
+ def setDocUncompilable(input: String) {
+ docUncompilable = Some(input)
+ }
+
+ /** Set the `nofail` info attribute.
+ *
+ * @param input One of the flags `yes/no` or `on/off`. Default if no/off.
+ */
+ def setNoFail(input: String) =
+ nofail = Flag.getBooleanValue(input, "nofail")
+
+ /** Set the `implicits` info attribute.
+ * @param input One of the flags `yes/no` or `on/off`. Default if no/off. */
+ def setImplicits(input: String) =
+ docImplicits = Flag.getBooleanValue(input, "implicits")
+
+ /** Set the `implicitsShowAll` info attribute to enable scaladoc to show all implicits, including those impossible to
+ * convert to from the default scope
+ * @param input One of the flags `yes/no` or `on/off`. Default if no/off. */
+ def setImplicitsShowAll(input: String) =
+ docImplicitsShowAll = Flag.getBooleanValue(input, "implicitsShowAll")
+
+ /** Set the `implicitsDebug` info attribute so scaladoc outputs implicit conversion debug information
+ * @param input One of the flags `yes/no` or `on/off`. Default if no/off. */
+ def setImplicitsDebug(input: String) =
+ docImplicitsDebug = Flag.getBooleanValue(input, "implicitsDebug")
+
+ /** Set the `diagrams` bit so Scaladoc adds diagrams to the documentation
+ * @param input One of the flags `yes/no` or `on/off`. Default if no/off. */
+ def setDiagrams(input: String) =
+ docDiagrams = Flag.getBooleanValue(input, "diagrams")
+
+ /** Set the `diagramsDebug` bit so Scaladoc outputs diagram building debug information
+ * @param input One of the flags `yes/no` or `on/off`. Default if no/off. */
+ def setDiagramsDebug(input: String) =
+ docDiagramsDebug = Flag.getBooleanValue(input, "diagramsDebug")
+
+ /** Set the `diagramsDotPath` attribute to the path where graphviz dot can be found (including the binary file name,
+ * eg: /usr/bin/dot) */
+ def setDiagramsDotPath(input: String) =
+ docDiagramsDotPath = Some(input)
+
+ /** Set the `rawOutput` bit so Scaladoc also outputs text from each html file
+ * @param input One of the flags `yes/no` or `on/off`. Default if no/off. */
+ def setRawOutput(input: String) =
+ docRawOutput = Flag.getBooleanValue(input, "rawOutput")
+
+ /** Set the `noPrefixes` bit to prevent Scaladoc from generating prefixes in
+ * front of types -- may lead to confusion, but significantly speeds up the generation.
+ * @param input One of the flags `yes/no` or `on/off`. Default if no/off. */
+ def setNoPrefixes(input: String) =
+ docNoPrefixes = Flag.getBooleanValue(input, "noPrefixes")
+
+ /** Instruct the scaladoc tool to group similar functions together */
+ def setGroups(input: String) =
+ docGroups = Flag.getBooleanValue(input, "groups")
+
+ /** Instruct the scaladoc tool to skip certain packages.
+ * @param input A colon-delimited list of fully qualified package names that will be skipped from scaladoc.
+ */
+ def setSkipPackages(input: String) =
+ docSkipPackages = input
+
+/*============================================================================*\
+** Properties getters **
+\*============================================================================*/
+
+ /** Gets the value of the `classpath` attribute in a
+ * Scala-friendly form.
+ *
+ * @return The class path as a list of files.
+ */
+ private def getClasspath: List[File] =
+ if (classpath.isEmpty) buildError("Member 'classpath' is empty.")
+ else classpath.get.list().toList map nameToFile
+
+ /** Gets the value of the `origin` attribute in a Scala-friendly
+ * form.
+ *
+ * @return The origin path as a list of files.
+ */
+ private def getOrigin: List[File] =
+ if (origin.isEmpty) buildError("Member 'origin' is empty.")
+ else origin.get.list().toList map nameToFile
+
+ /** Gets the value of the `destination` attribute in a
+ * Scala-friendly form.
+ *
+ * @return The destination as a file.
+ */
+ private def getDestination: File =
+ if (destination.isEmpty) buildError("Member 'destination' is empty.")
+ else existing(getProject resolveFile destination.get.toString)
+
+ /** Gets the value of the `sourcepath` attribute in a
+ * Scala-friendly form.
+ *
+ * @return The source path as a list of files.
+ */
+ private def getSourcepath: List[File] =
+ if (sourcepath.isEmpty) buildError("Member 'sourcepath' is empty.")
+ else sourcepath.get.list().toList map nameToFile
+
+ /** Gets the value of the `bootclasspath` attribute in a
+ * Scala-friendly form.
+ *
+ * @return The boot class path as a list of files.
+ */
+ private def getBootclasspath: List[File] =
+ if (bootclasspath.isEmpty) buildError("Member 'bootclasspath' is empty.")
+ else bootclasspath.get.list().toList map nameToFile
+
+ /** Gets the value of the `extdirs` attribute in a
+ * Scala-friendly form.
+ *
+ * @return The extensions path as a list of files.
+ */
+ private def getExtdirs: List[File] =
+ if (extdirs.isEmpty) buildError("Member 'extdirs' is empty.")
+ else extdirs.get.list().toList map nameToFile
+
+/*============================================================================*\
+** Compilation and support methods **
+\*============================================================================*/
+
+ /** This is forwarding method to circumvent bug #281 in Scala 2. Remove when
+ * bug has been corrected.
+ */
+ override protected def getDirectoryScanner(baseDir: java.io.File) =
+ super.getDirectoryScanner(baseDir)
+
+ /** Transforms a string name into a file relative to the provided base
+ * directory.
+ *
+ * @param base A file pointing to the location relative to which the name
+ * will be resolved.
+ * @param name A relative or absolute path to the file as a string.
+ * @return A file created from the name and the base file.
+ */
+ private def nameToFile(base: File)(name: String): File =
+ existing(fileUtils.resolveFile(base, name))
+
+ /** Transforms a string name into a file relative to the build root
+ * directory.
+ *
+ * @param name A relative or absolute path to the file as a string.
+ * @return A file created from the name.
+ */
+ private def nameToFile(name: String): File =
+ existing(getProject resolveFile name)
+
+ /** Tests if a file exists and prints a warning in case it doesn't. Always
+ * returns the file, even if it doesn't exist.
+ *
+ * @param file A file to test for existance.
+ * @return The same file.
+ */
+ private def existing(file: File): File = {
+ if (!file.exists())
+ log("Element '" + file.toString + "' does not exist.",
+ Project.MSG_WARN)
+ file
+ }
+
+ /** Transforms a path into a Scalac-readable string.
+ *
+ * @param path A path to convert.
+ * @return A string-representation of the path like `a.jar:b.jar`.
+ */
+ private def asString(path: List[File]): String =
+ path.map(asString).mkString("", File.pathSeparator, "")
+
+ /** Transforms a file into a Scalac-readable string.
+ *
+ * @param file A file to convert.
+ * @return A string-representation of the file like `/x/k/a.scala`.
+ */
+ private def asString(file: File): String =
+ file.getAbsolutePath()
+
+/*============================================================================*\
+** The big execute method **
+\*============================================================================*/
+
+ /** Initializes settings and source files */
+ protected def initialize: Pair[Settings, List[File]] = {
+ // Tests if all mandatory attributes are set and valid.
+ if (origin.isEmpty) buildError("Attribute 'srcdir' is not set.")
+ if (getOrigin.isEmpty) buildError("Attribute 'srcdir' is not set.")
+ if (!destination.isEmpty && !destination.get.isDirectory())
+ buildError("Attribute 'destdir' does not refer to an existing directory.")
+ if (destination.isEmpty) destination = Some(getOrigin.head)
+
+ val mapper = new GlobPatternMapper()
+ mapper setTo "*.html"
+ mapper setFrom "*.scala"
+
+ // Scans source directories to build up a compile lists.
+ // If force is false, only files were the .class file in destination is
+ // older than the .scala file will be used.
+ val sourceFiles: List[File] =
+ for {
+ originDir <- getOrigin
+ originFile <- {
+ val includedFiles =
+ getDirectoryScanner(originDir).getIncludedFiles()
+ val list = includedFiles.toList
+ if (list.length > 0)
+ log(
+ "Documenting " + list.length + " source file" +
+ (if (list.length > 1) "s" else "") +
+ (" to " + getDestination.toString)
+ )
+ else
+ log("No files selected for documentation", Project.MSG_VERBOSE)
+
+ list
+ }
+ } yield {
+ log(originFile, Project.MSG_DEBUG)
+ nameToFile(originDir)(originFile)
+ }
+
+ def decodeEscapes(s: String): String = {
+ // In Ant script characters '<' and '>' must be encoded when
+ // used in attribute values, e.g. for attributes "doctitle", "header", ..
+ // in task Scaladoc you may write:
+ // doctitle="&lt;div&gt;Scala&lt;/div&gt;"
+ // so we have to decode them here.
+ s.replaceAll("&lt;", "<").replaceAll("&gt;",">")
+ .replaceAll("&amp;", "&").replaceAll("&quot;", "\"")
+ }
+
+ // Builds-up the compilation settings for Scalac with the existing Ant
+ // parameters.
+ val docSettings = new Settings(buildError)
+ docSettings.outdir.value = asString(destination.get)
+ if (!classpath.isEmpty)
+ docSettings.classpath.value = asString(getClasspath)
+ if (!sourcepath.isEmpty)
+ docSettings.sourcepath.value = asString(getSourcepath)
+ /*else if (origin.get.size() > 0)
+ settings.sourcepath.value = origin.get.list()(0)*/
+ if (!bootclasspath.isEmpty)
+ docSettings.bootclasspath.value = asString(getBootclasspath)
+ if (!extdirs.isEmpty) docSettings.extdirs.value = asString(getExtdirs)
+ if (!encoding.isEmpty) docSettings.encoding.value = encoding.get
+ if (!doctitle.isEmpty) docSettings.doctitle.value = decodeEscapes(doctitle.get)
+ if (!docfooter.isEmpty) docSettings.docfooter.value = decodeEscapes(docfooter.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
+ docSettings.docImplicits.value = docImplicits
+ docSettings.docImplicitsDebug.value = docImplicitsDebug
+ docSettings.docImplicitsShowAll.value = docImplicitsShowAll
+ docSettings.docDiagrams.value = docDiagrams
+ docSettings.docDiagramsDebug.value = docDiagramsDebug
+ docSettings.docRawOutput.value = docRawOutput
+ docSettings.docNoPrefixes.value = docNoPrefixes
+ docSettings.docGroups.value = docGroups
+ docSettings.docSkipPackages.value = docSkipPackages
+ if(!docDiagramsDotPath.isEmpty) docSettings.docDiagramsDotPath.value = docDiagramsDotPath.get
+
+ if (!docgenerator.isEmpty) docSettings.docgenerator.value = docgenerator.get
+ if (!docrootcontent.isEmpty) docSettings.docRootContent.value = docrootcontent.get.getAbsolutePath()
+ log("Scaladoc params = '" + addParams + "'", Project.MSG_DEBUG)
+
+ docSettings processArgumentString addParams
+ Pair(docSettings, sourceFiles)
+ }
+
+ def safeBuildError(message: String): Unit = if (nofail) log(message) else buildError(message)
+
+ /** Performs the compilation. */
+ override def execute() = {
+ val Pair(docSettings, sourceFiles) = initialize
+ val reporter = new ConsoleReporter(docSettings)
+ try {
+ val docProcessor = new scala.tools.nsc.doc.DocFactory(reporter, docSettings)
+ docProcessor.document(sourceFiles.map (_.toString))
+ if (reporter.ERROR.count > 0)
+ safeBuildError(
+ "Document failed with " +
+ reporter.ERROR.count + " error" +
+ (if (reporter.ERROR.count > 1) "s" else "") +
+ "; see the documenter error output for details.")
+ else if (reporter.WARNING.count > 0)
+ log(
+ "Document succeeded with " +
+ reporter.WARNING.count + " warning" +
+ (if (reporter.WARNING.count > 1) "s" else "") +
+ "; see the documenter output for details.")
+ reporter.printSummary()
+ } catch {
+ case exception: Throwable =>
+ exception.printStackTrace()
+ val msg = Option(exception.getMessage) getOrElse "no error message provided"
+ safeBuildError(s"Document failed because of an internal documenter error ($msg); see the error output for details.")
+ }
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/ScalaDoc.scala b/src/scaladoc/scala/tools/nsc/ScalaDoc.scala
new file mode 100644
index 0000000000..52a0c20a11
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/ScalaDoc.scala
@@ -0,0 +1,72 @@
+/* scaladoc, a documentation generator for Scala
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Martin Odersky
+ * @author Geoffrey Washburn
+ */
+
+package scala.tools.nsc
+
+import java.io.File.pathSeparator
+import scala.tools.nsc.doc.DocFactory
+import scala.tools.nsc.reporters.ConsoleReporter
+import scala.reflect.internal.util.FakePos
+
+/** The main class for scaladoc, a front-end for the Scala compiler
+ * that generates documentation from source files.
+ */
+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"),
+ msg => reporter.printMessage(msg))
+ reporter = new ConsoleReporter(docSettings) {
+ // 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 ScalaDoc.Command(args.toList, docSettings)
+ def hasFiles = command.files.nonEmpty || docSettings.uncompilableFiles.nonEmpty
+
+ if (docSettings.version.value)
+ reporter.echo(versionMsg)
+ else if (docSettings.Xhelp.value)
+ reporter.echo(command.xusageMsg)
+ else if (docSettings.Yhelp.value)
+ reporter.echo(command.yusageMsg)
+ 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.echo(command.usageMsg)
+ else
+ try { 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", shouldExplain = 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 = sys exit {
+ if (process(args)) 0 else 1
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/DocFactory.scala b/src/scaladoc/scala/tools/nsc/doc/DocFactory.scala
new file mode 100644
index 0000000000..4607684c0d
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/DocFactory.scala
@@ -0,0 +1,132 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author David Bernard, Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc
+package doc
+
+import scala.util.control.ControlThrowable
+import reporters.Reporter
+import scala.reflect.internal.util.BatchSourceFile
+
+/** A documentation processor controls the process of generating Scala
+ * documentation, which is as follows.
+ *
+ * * A simplified compiler instance (with only the front-end phases enabled)
+ * * is created, and additional `sourceless` comments are registered.
+ * * Documentable files are compiled, thereby filling the compiler's symbol table.
+ * * A documentation model is extracted from the post-compilation symbol table.
+ * * A generator is used to transform the model into the correct final format (HTML).
+ *
+ * A processor contains a single compiler instantiated from the processor's
+ * `settings`. Each call to `document` uses the same compiler instance with
+ * the same symbol table. In particular, this implies that the scaladoc site
+ * obtained from a call to `run` will contain documentation about files compiled
+ * during previous calls to the same processor's `run` method.
+ *
+ * @param reporter The reporter to which both documentation and compilation errors will be reported.
+ * @param settings The settings to be used by the documenter and compiler for generating documentation.
+ *
+ * @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 ScaladocGlobal(settings, reporter)
+
+ /** Creates a scaladoc site for all symbols defined in this call's `source`,
+ * as well as those defined in `sources` of previous calls to the same processor.
+ * @param source The list of paths (relative to the compiler's source path,
+ * or absolute) of files to document or the source code. */
+ def makeUniverse(source: Either[List[String], String]): Option[Universe] = {
+ assert(settings.docformat.value == "html")
+ source match {
+ case Left(files) =>
+ new compiler.Run() compile files
+ case Right(sourceCode) =>
+ new compiler.Run() compileSources List(new BatchSourceFile("newSource", sourceCode))
+ }
+
+ 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
+ }
+ }
+
+ val modelFactory = (
+ new { override val global: compiler.type = compiler }
+ with model.ModelFactory(compiler, settings)
+ with model.ModelFactoryImplicitSupport
+ with model.ModelFactoryTypeSupport
+ with model.diagram.DiagramFactory
+ with model.CommentFactory
+ with model.TreeFactory
+ with model.MemberLookup {
+ override def templateShouldDocument(sym: compiler.Symbol, inTpl: DocTemplateImpl) =
+ extraTemplatesToDocument(sym) || super.templateShouldDocument(sym, inTpl)
+ }
+ )
+
+ modelFactory.makeModel match {
+ case Some(madeModel) =>
+ if (!settings.scaladocQuietRun)
+ println("model contains " + modelFactory.templatesCount + " documentable templates")
+ Some(madeModel)
+ case None =>
+ if (!settings.scaladocQuietRun)
+ println("no documentable class found in compilation units")
+ None
+ }
+ }
+
+ object NoCompilerRunException extends ControlThrowable { }
+
+ val documentError: PartialFunction[Throwable, Unit] = {
+ case NoCompilerRunException =>
+ reporter.info(null, "No documentation generated with unsucessful compiler run", force = 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]) {
+ def generate() = {
+ import doclet._
+ val docletClass = Class.forName(settings.docgenerator.value) // default is html.Doclet
+ val docletInstance = docletClass.newInstance().asInstanceOf[Generator]
+
+ docletInstance match {
+ case universer: Universer =>
+ val universe = makeUniverse(Left(files)) getOrElse { throw NoCompilerRunException }
+ universer setUniverse universe
+
+ docletInstance match {
+ case indexer: Indexer => indexer setIndex model.IndexModelFactory.makeIndex(universe)
+ case _ => ()
+ }
+ case _ => ()
+ }
+ docletInstance.generate()
+ }
+
+ try generate()
+ catch documentError
+ }
+
+ private[doc] def docdbg(msg: String) {
+ if (settings.Ydocdebug)
+ println(msg)
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/DocParser.scala b/src/scaladoc/scala/tools/nsc/doc/DocParser.scala
new file mode 100644
index 0000000000..6dc3e5a62b
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/DocParser.scala
@@ -0,0 +1,69 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools
+package nsc
+package doc
+
+import reporters._
+import scala.reflect.internal.util._
+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) {
+ def this(settings: Settings) = this(settings, new ConsoleReporter(settings))
+ def this() = this(new Settings(Console println _))
+
+ // the usual global initialization
+ locally { new Run() }
+
+ 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 = newUnitParser(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/scaladoc/scala/tools/nsc/doc/Index.scala b/src/scaladoc/scala/tools/nsc/doc/Index.scala
new file mode 100644
index 0000000000..f9b9eecdb3
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/Index.scala
@@ -0,0 +1,17 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Martin Odersky
+ */
+
+package scala.tools.nsc.doc
+
+import scala.collection._
+
+
+trait Index {
+
+ type SymbolMap = SortedMap[String, SortedSet[model.MemberEntity]]
+
+ def firstLetterIndex: Map[Char, SymbolMap]
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala b/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala
new file mode 100644
index 0000000000..d407b93a4b
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/ScaladocAnalyzer.scala
@@ -0,0 +1,263 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc
+package doc
+
+import scala.tools.nsc.ast.parser.{ SyntaxAnalyzer, BracePatch }
+import scala.reflect.internal.Chars._
+import symtab._
+import typechecker.Analyzer
+import scala.reflect.internal.util.{ BatchSourceFile, RangePosition }
+import scala.tools.nsc.doc.base.{ CommentFactoryBase, MemberLookupBase, LinkTo, LinkToExternal }
+import scala.language.postfixOps
+
+trait ScaladocAnalyzer extends Analyzer {
+ val global : Global // generally, a ScaladocGlobal
+ import global._
+
+ override def newTyper(context: Context): ScaladocTyper = new Typer(context) with ScaladocTyper
+
+ trait ScaladocTyper extends Typer {
+ private def unit = context.unit
+
+ override def canAdaptConstantTypeToLiteral = false
+
+ override protected def macroImplementationNotFoundMessage(name: Name): String = (
+ super.macroImplementationNotFoundMessage(name)
+ + "\nWhen generating scaladocs for multiple projects at once, consider using -Ymacro-no-expand to disable macro expansions altogether."
+ )
+
+ override def typedDocDef(docDef: DocDef, mode: Mode, pt: Type): Tree = {
+ val sym = docDef.symbol
+
+ if ((sym ne null) && (sym ne NoSymbol)) {
+ val comment = docDef.comment
+ docComments(sym) = comment
+ comment.defineVariables(sym)
+ val typer1 = newTyper(context.makeNewScope(docDef, context.owner))
+ for (useCase <- comment.useCases) {
+ typer1.silent(_ => typer1 defineUseCases useCase) match {
+ case SilentTypeError(err) =>
+ unit.warning(useCase.pos, err.errMsg)
+ case _ =>
+ }
+ for (useCaseSym <- useCase.defined) {
+ if (sym.name != useCaseSym.name)
+ unit.warning(useCase.pos, "@usecase " + useCaseSym.name.decode + " does not match commented symbol: " + sym.name.decode)
+ }
+ }
+ }
+
+ super.typedDocDef(docDef, mode, pt)
+ }
+
+ def defineUseCases(useCase: UseCase): List[Symbol] = {
+ def stringParser(str: String): syntaxAnalyzer.Parser = {
+ val file = new BatchSourceFile(context.unit.source.file, str) {
+ override def positionInUltimateSource(pos: Position) = {
+ pos.withSource(context.unit.source, useCase.pos.start)
+ }
+ }
+ newUnitParser(new CompilationUnit(file))
+ }
+
+ val trees = stringParser(useCase.body+";").nonLocalDefOrDcl
+ val enclClass = context.enclClass.owner
+
+ def defineAlias(name: Name) = (
+ if (context.scope.lookup(name) == NoSymbol) {
+ lookupVariable(name.toString.substring(1), enclClass) foreach { repl =>
+ silent(_.typedTypeConstructor(stringParser(repl).typ())) map { tpt =>
+ val alias = enclClass.newAliasType(name.toTypeName, useCase.pos)
+ val tparams = cloneSymbolsAtOwner(tpt.tpe.typeSymbol.typeParams, alias)
+ val newInfo = genPolyType(tparams, appliedType(tpt.tpe, tparams map (_.tpe)))
+ alias setInfo newInfo
+ context.scope.enter(alias)
+ }
+ }
+ }
+ )
+
+ for (tree <- trees; t <- tree)
+ t match {
+ case Ident(name) if name startsWith '$' => defineAlias(name)
+ case _ =>
+ }
+
+ useCase.aliases = context.scope.toList
+ namer.enterSyms(trees)
+ typedStats(trees, NoSymbol)
+ useCase.defined = context.scope.toList filterNot (useCase.aliases contains _)
+
+ if (settings.debug)
+ useCase.defined foreach (sym => println("defined use cases: %s:%s".format(sym, sym.tpe)))
+
+ useCase.defined
+ }
+ }
+}
+
+abstract class ScaladocSyntaxAnalyzer[G <: Global](val global: G) extends SyntaxAnalyzer {
+ import global._
+
+ class ScaladocJavaUnitParser(unit: CompilationUnit) extends {
+ override val in = new ScaladocJavaUnitScanner(unit)
+ } with JavaUnitParser(unit) { }
+
+ class ScaladocJavaUnitScanner(unit: CompilationUnit) extends JavaUnitScanner(unit) {
+ /** buffer for the documentation comment
+ */
+ var docBuffer: StringBuilder = null
+
+ /** add the given character to the documentation buffer
+ */
+ protected def putDocChar(c: Char) {
+ if (docBuffer ne null) docBuffer.append(c)
+ }
+
+ override protected def skipComment(): Boolean = {
+ if (in.ch == '/') {
+ do {
+ in.next
+ } while ((in.ch != CR) && (in.ch != LF) && (in.ch != SU))
+ true
+ } else if (in.ch == '*') {
+ docBuffer = null
+ in.next
+ val scalaDoc = ("/**", "*/")
+ if (in.ch == '*')
+ docBuffer = new StringBuilder(scalaDoc._1)
+ do {
+ do {
+ if (in.ch != '*' && in.ch != SU) {
+ in.next; putDocChar(in.ch)
+ }
+ } while (in.ch != '*' && in.ch != SU)
+ while (in.ch == '*') {
+ in.next; putDocChar(in.ch)
+ }
+ } while (in.ch != '/' && in.ch != SU)
+ if (in.ch == '/') in.next
+ else incompleteInputError("unclosed comment")
+ true
+ } else {
+ false
+ }
+ }
+ }
+
+ class ScaladocUnitScanner(unit0: CompilationUnit, patches0: List[BracePatch]) extends UnitScanner(unit0, patches0) {
+
+ private var docBuffer: StringBuilder = null // buffer for comments (non-null while scanning)
+ private var inDocComment = false // if buffer contains double-star doc comment
+ private var lastDoc: DocComment = null // last comment if it was double-star doc
+
+ private object unmooredParser extends { // minimalist comment parser
+ val global: Global = ScaladocSyntaxAnalyzer.this.global
+ }
+ with CommentFactoryBase with MemberLookupBase {
+ import global.{ settings, Symbol }
+ def parseComment(comment: DocComment) = {
+ val nowarnings = settings.nowarn.value
+ settings.nowarn.value = true
+ try parseAtSymbol(comment.raw, comment.raw, comment.pos)
+ finally settings.nowarn.value = nowarnings
+ }
+
+ override def internalLink(sym: Symbol, site: Symbol): Option[LinkTo] = None
+ override def chooseLink(links: List[LinkTo]): LinkTo = links.headOption orNull
+ override def toString(link: LinkTo): String = "No link"
+ override def findExternalLink(sym: Symbol, name: String): Option[LinkToExternal] = None
+ override def warnNoLink: Boolean = false
+ }
+
+ /**
+ * Warn when discarding buffered doc at the end of a block.
+ * This mechanism doesn't warn about arbitrary unmoored doc.
+ * Also warn under -Xlint, but otherwise only warn in the presence of suspicious
+ * tags that appear to be documenting API. Warnings are suppressed while parsing
+ * the local comment so that comments of the form `[at] Martin` will not trigger a warning.
+ * By omission, tags for `see`, `todo`, `note` and `example` are ignored.
+ */
+ override def discardDocBuffer() = {
+ import scala.tools.nsc.doc.base.comment.Comment
+ val doc = flushDoc
+ // tags that make a local double-star comment look unclean, as though it were API
+ def unclean(comment: Comment): Boolean = {
+ import comment._
+ authors.nonEmpty || result.nonEmpty || throws.nonEmpty || valueParams.nonEmpty ||
+ typeParams.nonEmpty || version.nonEmpty || since.nonEmpty
+ }
+ def isDirty = unclean(unmooredParser parseComment doc)
+ if ((doc ne null) && (settings.lint || isDirty))
+ unit.warning(doc.pos, "discarding unmoored doc comment")
+ }
+
+ override def flushDoc(): DocComment = (try lastDoc finally lastDoc = null)
+
+ override protected def putCommentChar() {
+ if (inDocComment)
+ docBuffer append ch
+
+ nextChar()
+ }
+ override def skipDocComment(): Unit = {
+ inDocComment = true
+ docBuffer = new StringBuilder("/**")
+ super.skipDocComment()
+ }
+ override def skipBlockComment(): Unit = {
+ inDocComment = false
+ docBuffer = new StringBuilder("/*")
+ super.skipBlockComment()
+ }
+ override def skipComment(): Boolean = {
+ // emit a block comment; if it's double-star, make Doc at this pos
+ def foundStarComment(start: Int, end: Int) = try {
+ val str = docBuffer.toString
+ val pos = new RangePosition(unit.source, start, start, end)
+ unit.comment(pos, str)
+ if (inDocComment)
+ lastDoc = DocComment(str, pos)
+ true
+ } finally {
+ docBuffer = null
+ inDocComment = false
+ }
+ super.skipComment() && ((docBuffer eq null) || foundStarComment(offset, charOffset - 2))
+ }
+ }
+ class ScaladocUnitParser(unit: CompilationUnit, patches: List[BracePatch]) extends UnitParser(unit, patches) {
+ override def newScanner() = new ScaladocUnitScanner(unit, patches)
+ override def withPatches(patches: List[BracePatch]) = new ScaladocUnitParser(unit, patches)
+
+ override def joinComment(trees: => List[Tree]): List[Tree] = {
+ val doc = in.flushDoc
+ if ((doc ne null) && doc.raw.length > 0) {
+ log(s"joinComment(doc=$doc)")
+ val joined = trees map {
+ t =>
+ DocDef(doc, t) setPos {
+ if (t.pos.isDefined) {
+ val pos = doc.pos.withEnd(t.pos.endOrPoint)
+ // always make the position transparent
+ pos.makeTransparent
+ } else {
+ t.pos
+ }
+ }
+ }
+ joined.find(_.pos.isOpaqueRange) foreach {
+ main =>
+ val mains = List(main)
+ joined foreach { t => if (t ne main) ensureNonOverlapping(t, mains) }
+ }
+ joined
+ }
+ else trees
+ }
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala b/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala
new file mode 100644
index 0000000000..20f24dc753
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/ScaladocGlobal.scala
@@ -0,0 +1,49 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc
+package doc
+
+import scala.tools.nsc.ast.parser.{ SyntaxAnalyzer, BracePatch }
+import scala.reflect.internal.Chars._
+import symtab._
+import reporters.Reporter
+import typechecker.Analyzer
+import scala.reflect.internal.util.{ BatchSourceFile, RangePosition }
+
+trait ScaladocGlobalTrait extends Global {
+ outer =>
+
+ override val useOffsetPositions = false
+ override def newUnitParser(unit: CompilationUnit) = new syntaxAnalyzer.ScaladocUnitParser(unit, Nil)
+
+ override lazy val syntaxAnalyzer = new ScaladocSyntaxAnalyzer[outer.type](outer) {
+ val runsAfter = List[String]()
+ val runsRightAfter = None
+ }
+ override lazy val loaders = new SymbolLoaders {
+ val global: outer.type = outer
+
+ // SI-5593 Scaladoc's current strategy is to visit all packages in search of user code that can be documented
+ // therefore, it will rummage through the classpath triggering errors whenever it encounters package objects
+ // that are not in their correct place (see bug for details)
+ override protected def signalError(root: Symbol, ex: Throwable) {
+ log(s"Suppressing error involving $root: $ex")
+ }
+ }
+}
+
+class ScaladocGlobal(settings: doc.Settings, reporter: Reporter) extends Global(settings, reporter) with ScaladocGlobalTrait {
+ override protected def computeInternalPhases() {
+ phasesSet += syntaxAnalyzer
+ phasesSet += analyzer.namerFactory
+ phasesSet += analyzer.packageObjects
+ phasesSet += analyzer.typerFactory
+ }
+ override def forScaladoc = true
+ override lazy val analyzer = new {
+ val global: ScaladocGlobal.this.type = ScaladocGlobal.this
+ } with ScaladocAnalyzer
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/Settings.scala b/src/scaladoc/scala/tools/nsc/doc/Settings.scala
new file mode 100644
index 0000000000..e16b6be853
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/Settings.scala
@@ -0,0 +1,348 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Martin Odersky
+ */
+
+package scala.tools.nsc
+package doc
+
+import java.io.File
+import scala.language.postfixOps
+
+/** An extended version of compiler settings, with additional Scaladoc-specific options.
+ * @param error A function that prints a string to the appropriate error stream
+ * @param printMsg A function that prints the string, without any extra boilerplate of error */
+class Settings(error: String => Unit, val printMsg: String => Unit = println(_)) extends scala.tools.nsc.Settings(error) {
+
+ /** A setting that defines in which format the documentation is output. ''Note:'' this setting is currently always
+ * `html`. */
+ val docformat = ChoiceSetting (
+ "-doc-format",
+ "format",
+ "Selects in which format documentation is rendered",
+ List("html"),
+ "html"
+ )
+
+ /** A setting that defines the overall title of the documentation, typically the name of the library being
+ * documented. ''Note:'' This setting is currently not used. */
+ val doctitle = StringSetting (
+ "-doc-title",
+ "title",
+ "The overall name of the Scaladoc site",
+ ""
+ )
+
+ /** A setting that defines the overall version number of the documentation, typically the version of the library being
+ * documented. ''Note:'' This setting is currently not used. */
+ val docversion = StringSetting (
+ "-doc-version",
+ "version",
+ "An optional version number, to be appended to the title",
+ ""
+ )
+
+ val docfooter = StringSetting (
+ "-doc-footer",
+ "footer",
+ "A footer on every ScalaDoc page, by default the EPFL/Typesafe copyright notice. Can be overridden with a custom footer.",
+ ""
+ )
+
+ 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 (
+ "-doc-source-url",
+ "url",
+ "A URL pattern used to build links to template sources; use variables, for example: ?{TPL_NAME} ('Seq'), ?{TPL_OWNER} ('scala.collection'), ?{FILE_PATH} ('scala/collection/Seq')",
+ ""
+ )
+
+ val docExternalDoc = MultiStringSetting (
+ "-doc-external-doc",
+ "external-doc",
+ "comma-separated list of classpath_entry_path#doc_URL pairs describing external dependencies."
+ )
+
+ val useStupidTypes = BooleanSetting (
+ "-Yuse-stupid-types",
+ "Print the types of inherited members as seen from their original definition context. Hint: you don't want to do that!"
+ )
+
+ val docgenerator = StringSetting (
+ "-doc-generator",
+ "class-name",
+ "The fully qualified name of a doclet class, which will be used to generate the documentation",
+ "scala.tools.nsc.doc.html.Doclet"
+ )
+
+ val docRootContent = PathSetting (
+ "-doc-root-content",
+ "The file from which the root package documentation should be imported.",
+ ""
+ )
+
+ val docImplicits = BooleanSetting (
+ "-implicits",
+ "Document members inherited by implicit conversions."
+ )
+
+ val docImplicitsDebug = BooleanSetting (
+ "-implicits-debug",
+ "Show debugging information for members inherited by implicit conversions."
+ )
+
+ val docImplicitsShowAll = BooleanSetting (
+ "-implicits-show-all",
+ "Show members inherited by implicit conversions that are impossible in the default scope. " +
+ "(for example conversions that require Numeric[String] to be in scope)"
+ )
+
+ val docImplicitsSoundShadowing = BooleanSetting (
+ "-implicits-sound-shadowing",
+ "Use a sound implicit shadowing calculation. Note: this interacts badly with usecases, so " +
+ "only use it if you haven't defined usecase for implicitly inherited members."
+ )
+
+ val docImplicitsHide = MultiStringSetting (
+ "-implicits-hide",
+ "implicit(s)",
+ "Hide the members inherited by the given comma separated, fully qualified implicit conversions. Add dot (.) to include default conversions."
+ )
+
+ val docDiagrams = BooleanSetting (
+ "-diagrams",
+ "Create inheritance diagrams for classes, traits and packages."
+ )
+
+ val docDiagramsDebug = BooleanSetting (
+ "-diagrams-debug",
+ "Show debugging information for the diagram creation process."
+ )
+
+ val docDiagramsDotPath = PathSetting (
+ "-diagrams-dot-path",
+ "The path to the dot executable used to generate the inheritance diagrams. Eg: /usr/bin/dot",
+ "dot" // by default, just pick up the system-wide dot
+ )
+
+ /** The maxium nuber of normal classes to show in the diagram */
+ val docDiagramsMaxNormalClasses = IntSetting(
+ "-diagrams-max-classes",
+ "The maximum number of superclasses or subclasses to show in a diagram",
+ 15,
+ None,
+ _ => None
+ )
+
+ /** The maxium nuber of implcit classes to show in the diagram */
+ val docDiagramsMaxImplicitClasses = IntSetting(
+ "-diagrams-max-implicits",
+ "The maximum number of implicitly converted classes to show in a diagram",
+ 10,
+ None,
+ _ => None
+ )
+
+ val docDiagramsDotTimeout = IntSetting(
+ "-diagrams-dot-timeout",
+ "The timeout before the graphviz dot util is forcefully closed, in seconds (default: 10)",
+ 10,
+ None,
+ _ => None
+ )
+
+ val docDiagramsDotRestart = IntSetting(
+ "-diagrams-dot-restart",
+ "The number of times to restart a malfunctioning dot process before disabling diagrams (default: 5)",
+ 5,
+ None,
+ _ => None
+ )
+
+ val docRawOutput = BooleanSetting (
+ "-raw-output",
+ "For each html file, create another .html.raw file containing only the text. (can be used for quickly diffing two scaladoc outputs)"
+ )
+
+ val docNoPrefixes = BooleanSetting (
+ "-no-prefixes",
+ "Prevents generating prefixes in types, possibly creating ambiguous references, but significantly speeding up scaladoc."
+ )
+
+ val docNoLinkWarnings = BooleanSetting (
+ "-no-link-warnings",
+ "Avoid warnings for ambiguous and incorrect links."
+ )
+
+ val docSkipPackages = StringSetting (
+ "-skip-packages",
+ "<package1>:...:<packageN>",
+ "A colon-delimited list of fully qualified package names that will be skipped from scaladoc.",
+ ""
+ )
+
+ val docExpandAllTypes = BooleanSetting (
+ "-expand-all-types",
+ "Expand all type aliases and abstract types into full template pages. (locally this can be done with the @template annotation)"
+ )
+
+ val docGroups = BooleanSetting (
+ "-groups",
+ "Group similar functions together (based on the @group annotation)"
+ )
+
+ // For improved help output.
+ def scaladocSpecific = Set[Settings#Setting](
+ docformat, doctitle, docfooter, docversion, docUncompilable, docsourceurl, docgenerator, docRootContent, useStupidTypes,
+ docDiagrams, docDiagramsDebug, docDiagramsDotPath,
+ docDiagramsDotTimeout, docDiagramsDotRestart,
+ docImplicits, docImplicitsDebug, docImplicitsShowAll, docImplicitsHide,
+ docDiagramsMaxNormalClasses, docDiagramsMaxImplicitClasses,
+ docNoPrefixes, docNoLinkWarnings, docRawOutput, docSkipPackages,
+ docExpandAllTypes, docGroups
+ )
+ val isScaladocSpecific: String => Boolean = scaladocSpecific map (_.name)
+
+ override def isScaladoc = true
+
+ // set by the testsuite, when checking test output
+ var scaladocQuietRun = false
+
+ lazy val skipPackageNames =
+ if (docSkipPackages.value == "")
+ Set[String]()
+ else
+ docSkipPackages.value.toLowerCase.split(':').toSet
+
+ def skipPackage(qname: String) =
+ skipPackageNames(qname.toLowerCase)
+
+ lazy val hiddenImplicits: Set[String] = {
+ if (docImplicitsHide.value.isEmpty) hardcoded.commonConversionTargets
+ else docImplicitsHide.value.toSet flatMap { name: String =>
+ if(name == ".") hardcoded.commonConversionTargets
+ else Set(name)
+ }
+ }
+
+ def appendIndex(url: String): String = {
+ val index = "/index.html"
+ if (url.endsWith(index)) url else url + index
+ }
+
+ lazy val extUrlMapping: Map[String, String] = docExternalDoc.value flatMap { s =>
+ val idx = s.indexOf("#")
+ if (idx > 0) {
+ val (first, last) = s.splitAt(idx)
+ Some(new File(first).getAbsolutePath -> appendIndex(last.substring(1)))
+ } else {
+ error(s"Illegal -doc-external-doc option; expected a pair with '#' separator, found: '$s'")
+ None
+ }
+ } toMap
+
+ /**
+ * This is the hardcoded area of Scaladoc. This is where "undesirable" stuff gets eliminated. I know it's not pretty,
+ * but ultimately scaladoc has to be useful. :)
+ */
+ object hardcoded {
+
+ /** The common context bounds and some humanly explanations. Feel free to add more explanations
+ * `<root>.scala.package.Numeric` is the type class
+ * `tparam` is the name of the type parameter it gets (this only describes type classes with 1 type param)
+ * the function result should be a humanly-understandable description of the type class
+ */
+ val knownTypeClasses: Map[String, String => String] = Map() +
+ ("scala.math.Numeric" -> ((tparam: String) => tparam + " is a numeric class, such as Int, Long, Float or Double")) +
+ ("scala.math.Integral" -> ((tparam: String) => tparam + " is an integral numeric class, such as Int or Long")) +
+ ("scala.math.Fractional" -> ((tparam: String) => tparam + " is a fractional numeric class, such as Float or Double")) +
+ ("scala.reflect.Manifest" -> ((tparam: String) => tparam + " is accompanied by a Manifest, which is a runtime representation of its type that survives erasure")) +
+ ("scala.reflect.ClassManifest" -> ((tparam: String) => tparam + " is accompanied by a ClassManifest, which is a runtime representation of its type that survives erasure")) +
+ ("scala.reflect.OptManifest" -> ((tparam: String) => tparam + " is accompanied by an OptManifest, which can be either a runtime representation of its type or the NoManifest, which means the runtime type is not available")) +
+ ("scala.reflect.ClassTag" -> ((tparam: String) => tparam + " is accompanied by a ClassTag, which is a runtime representation of its type that survives erasure")) +
+ ("scala.reflect.api.TypeTags.WeakTypeTag" -> ((tparam: String) => tparam + " is accompanied by an WeakTypeTag, which is a runtime representation of its type that survives erasure")) +
+ ("scala.reflect.api.TypeTags.TypeTag" -> ((tparam: String) => tparam + " is accompanied by a TypeTag, which is a runtime representation of its type that survives erasure"))
+
+ /**
+ * Set of classes to exclude from index and diagrams
+ * TODO: Should be configurable
+ */
+ def isExcluded(qname: String) = {
+ ( ( qname.startsWith("scala.Tuple") || qname.startsWith("scala.Product") ||
+ qname.startsWith("scala.Function") || qname.startsWith("scala.runtime.AbstractFunction")
+ ) && !(
+ qname == "scala.Tuple1" || qname == "scala.Tuple2" ||
+ qname == "scala.Product" || qname == "scala.Product1" || qname == "scala.Product2" ||
+ qname == "scala.Function" || qname == "scala.Function1" || qname == "scala.Function2" ||
+ qname == "scala.runtime.AbstractFunction0" || qname == "scala.runtime.AbstractFunction1" ||
+ qname == "scala.runtime.AbstractFunction2"
+ )
+ )
+ }
+
+ /** Common conversion targets that affect any class in Scala */
+ val commonConversionTargets = Set(
+ "scala.Predef.StringFormat",
+ "scala.Predef.StringAdd",
+ "scala.Predef.ArrowAssoc",
+ "scala.Predef.Ensuring",
+ "scala.collection.TraversableOnce.alternateImplicit")
+
+ /** There's a reason all these are specialized by hand but documenting each of them is beyond the point */
+ val arraySkipConversions = List(
+ "scala.Predef.refArrayOps",
+ "scala.Predef.intArrayOps",
+ "scala.Predef.doubleArrayOps",
+ "scala.Predef.longArrayOps",
+ "scala.Predef.floatArrayOps",
+ "scala.Predef.charArrayOps",
+ "scala.Predef.byteArrayOps",
+ "scala.Predef.shortArrayOps",
+ "scala.Predef.booleanArrayOps",
+ "scala.Predef.unitArrayOps",
+ "scala.LowPriorityImplicits.wrapRefArray",
+ "scala.LowPriorityImplicits.wrapIntArray",
+ "scala.LowPriorityImplicits.wrapDoubleArray",
+ "scala.LowPriorityImplicits.wrapLongArray",
+ "scala.LowPriorityImplicits.wrapFloatArray",
+ "scala.LowPriorityImplicits.wrapCharArray",
+ "scala.LowPriorityImplicits.wrapByteArray",
+ "scala.LowPriorityImplicits.wrapShortArray",
+ "scala.LowPriorityImplicits.wrapBooleanArray",
+ "scala.LowPriorityImplicits.wrapUnitArray",
+ "scala.LowPriorityImplicits.genericWrapArray")
+
+ // included as names as here we don't have access to a Global with Definitions :(
+ def valueClassList = List("unit", "boolean", "byte", "short", "char", "int", "long", "float", "double")
+ def valueClassFilterPrefixes = List("scala.LowPriorityImplicits", "scala.Predef")
+
+ /** Dirty, dirty, dirty hack: the value params conversions can all kick in -- and they are disambiguated by priority
+ * but showing priority in scaladoc would make no sense -- so we have to manually remove the conversions that we
+ * know will never get a chance to kick in. Anyway, DIRTY DIRTY DIRTY! */
+ def valueClassFilter(value: String, conversionName: String): Boolean = {
+ val valueName = value.toLowerCase
+ val otherValues = valueClassList.filterNot(_ == valueName)
+
+ for (prefix <- valueClassFilterPrefixes)
+ if (conversionName.startsWith(prefix))
+ for (otherValue <- otherValues)
+ if (conversionName.startsWith(prefix + "." + otherValue))
+ return false
+
+ true
+ }
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/Uncompilable.scala b/src/scaladoc/scala/tools/nsc/doc/Uncompilable.scala
new file mode 100644
index 0000000000..ea45ca1a56
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/Uncompilable.scala
@@ -0,0 +1,51 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Paul Phillips
+ */
+
+package scala.tools.nsc
+package doc
+import scala.language.implicitConversions
+import scala.language.postfixOps
+
+/** 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, DocComment, NoSymbol }
+ import global.definitions.AnyRefClass
+ import global.rootMirror.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)
+ 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 || x == AnyRefClass/* which is now a type alias */) toSet
+ def comments = {
+ if (settings.debug || settings.verbose)
+ 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 filterNot (_ == NoSymbol) map (x => " " + x.owner.fullName + " " + x.defString) mkString "\n"
+ )
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/Universe.scala b/src/scaladoc/scala/tools/nsc/doc/Universe.scala
new file mode 100644
index 0000000000..11520c810e
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/Universe.scala
@@ -0,0 +1,16 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Martin Odersky
+ */
+
+package scala.tools.nsc.doc
+
+/**
+ * Class to hold common dependencies across Scaladoc classes.
+ * @author Pedro Furlanetto
+ * @author Gilles Dubochet
+ */
+trait Universe {
+ def settings: Settings
+ def rootPackage: model.Package
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/CommentFactoryBase.scala b/src/scaladoc/scala/tools/nsc/doc/base/CommentFactoryBase.scala
new file mode 100755
index 0000000000..cd1d604843
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/base/CommentFactoryBase.scala
@@ -0,0 +1,935 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc
+package doc
+package base
+
+import base.comment._
+import scala.collection._
+import scala.util.matching.Regex
+import scala.reflect.internal.util.Position
+import scala.language.postfixOps
+
+/** The comment parser transforms raw comment strings into `Comment` objects.
+ * Call `parse` to run the parser. Note that the parser is stateless and
+ * should only be built once for a given Scaladoc run.
+ *
+ * @author Manohar Jonnalagedda
+ * @author Gilles Dubochet */
+trait CommentFactoryBase { this: MemberLookupBase =>
+
+ val global: Global
+ import global.{ reporter, Symbol, NoSymbol }
+
+ /* Creates comments with necessary arguments */
+ def createComment (
+ body0: Option[Body] = None,
+ authors0: List[Body] = List.empty,
+ see0: List[Body] = List.empty,
+ result0: Option[Body] = None,
+ throws0: Map[String,Body] = Map.empty,
+ valueParams0: Map[String,Body] = Map.empty,
+ typeParams0: Map[String,Body] = Map.empty,
+ version0: Option[Body] = None,
+ since0: Option[Body] = None,
+ todo0: List[Body] = List.empty,
+ deprecated0: Option[Body] = None,
+ note0: List[Body] = List.empty,
+ example0: List[Body] = List.empty,
+ constructor0: Option[Body] = None,
+ source0: Option[String] = None,
+ inheritDiagram0: List[String] = List.empty,
+ contentDiagram0: List[String] = List.empty,
+ group0: Option[Body] = None,
+ groupDesc0: Map[String,Body] = Map.empty,
+ groupNames0: Map[String,Body] = Map.empty,
+ groupPrio0: Map[String,Body] = Map.empty
+ ) : Comment = new Comment{
+ val body = if(body0 isDefined) body0.get else Body(Seq.empty)
+ val authors = authors0
+ val see = see0
+ val result = result0
+ val throws = throws0
+ val valueParams = valueParams0
+ val typeParams = typeParams0
+ val version = version0
+ val since = since0
+ val todo = todo0
+ val deprecated = deprecated0
+ val note = note0
+ val example = example0
+ val constructor = constructor0
+ val inheritDiagram = inheritDiagram0
+ val contentDiagram = contentDiagram0
+ val groupDesc = groupDesc0
+ val group =
+ group0 match {
+ case Some(Body(List(Paragraph(Chain(List(Summary(Text(groupId)))))))) => Some(groupId.toString.trim)
+ case _ => None
+ }
+ val groupPrio = groupPrio0 flatMap {
+ case (group, body) =>
+ try {
+ body match {
+ case Body(List(Paragraph(Chain(List(Summary(Text(prio))))))) => List(group -> prio.trim.toInt)
+ case _ => List()
+ }
+ } catch {
+ case _: java.lang.NumberFormatException => List()
+ }
+ }
+ val groupNames = groupNames0 flatMap {
+ case (group, body) =>
+ try {
+ body match {
+ case Body(List(Paragraph(Chain(List(Summary(Text(name))))))) if (!name.trim.contains("\n")) => List(group -> (name.trim))
+ case _ => List()
+ }
+ } catch {
+ case _: java.lang.NumberFormatException => List()
+ }
+ }
+
+ }
+
+ private val endOfText = '\u0003'
+ private val endOfLine = '\u000A'
+
+ /** Something that should not have happened, happened, and Scaladoc should exit. */
+ private def oops(msg: String): Nothing =
+ throw FatalError("program logic: " + msg)
+
+ /** The body of a line, dropping the (optional) start star-marker,
+ * one leading whitespace and all trailing whitespace. */
+ private val CleanCommentLine =
+ new Regex("""(?:\s*\*\s?)?(.*)""")
+
+ /** Dangerous HTML tags that should be replaced by something safer,
+ * such as wiki syntax, or that should be dropped. */
+ private val DangerousTags =
+ new Regex("""<(/?(div|ol|ul|li|h[1-6]|p))( [^>]*)?/?>|<!--.*-->""")
+
+ /** Maps a dangerous HTML tag to a safe wiki replacement, or an empty string
+ * if it cannot be salvaged. */
+ private def htmlReplacement(mtch: Regex.Match): String = mtch.group(1) match {
+ case "p" | "div" => "\n\n"
+ case "h1" => "\n= "
+ case "/h1" => " =\n"
+ case "h2" => "\n== "
+ case "/h2" => " ==\n"
+ case "h3" => "\n=== "
+ case "/h3" => " ===\n"
+ case "h4" | "h5" | "h6" => "\n==== "
+ case "/h4" | "/h5" | "/h6" => " ====\n"
+ case "li" => "\n * - "
+ case _ => ""
+ }
+
+ /** Javadoc tags that should be replaced by something useful, such as wiki
+ * syntax, or that should be dropped. */
+ private val JavadocTags =
+ new Regex("""\{\@(code|docRoot|inheritDoc|link|linkplain|literal|value)([^}]*)\}""")
+
+ /** Maps a javadoc tag to a useful wiki replacement, or an empty string if it cannot be salvaged. */
+ private def javadocReplacement(mtch: Regex.Match): String = mtch.group(1) match {
+ case "code" => "`" + mtch.group(2) + "`"
+ case "docRoot" => ""
+ case "inheritDoc" => ""
+ case "link" => "`" + mtch.group(2) + "`"
+ case "linkplain" => "`" + mtch.group(2) + "`"
+ case "literal" => mtch.group(2)
+ case "value" => "`" + mtch.group(2) + "`"
+ case _ => ""
+ }
+
+ /** Safe HTML tags that can be kept. */
+ private val SafeTags =
+ 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)( [^>]*)?/?>))""")
+
+ private val safeTagMarker = '\u000E'
+
+ /** A Scaladoc tag not linked to a symbol and not followed by text */
+ private val SingleTagRegex =
+ new Regex("""\s*@(\S+)\s*""")
+
+ /** A Scaladoc tag not linked to a symbol. Returns the name of the tag, and the rest of the line. */
+ private val SimpleTagRegex =
+ new Regex("""\s*@(\S+)\s+(.*)""")
+
+ /** A Scaladoc tag linked to a symbol. Returns the name of the tag, the name
+ * of the symbol, and the rest of the line. */
+ private val SymbolTagRegex =
+ new Regex("""\s*@(param|tparam|throws|groupdesc|groupname|groupprio)\s+(\S*)\s*(.*)""")
+
+ /** The start of a scaladoc code block */
+ private val CodeBlockStartRegex =
+ new Regex("""(.*?)((?:\{\{\{)|(?:\u000E<pre(?: [^>]*)?>\u000E))(.*)""")
+
+ /** The end of a scaladoc code block */
+ private val CodeBlockEndRegex =
+ new Regex("""(.*?)((?:\}\}\})|(?:\u000E</pre>\u000E))(.*)""")
+
+ /** A key used for a tag map. The key is built from the name of the tag and
+ * from the linked symbol if the tag has one.
+ * Equality on tag keys is structural. */
+ private sealed abstract class TagKey {
+ def name: String
+ }
+
+ private final case class SimpleTagKey(name: String) extends TagKey
+ private final case class SymbolTagKey(name: String, symbol: String) extends TagKey
+
+ /** Parses a raw comment string into a `Comment` object.
+ * @param comment The expanded comment string (including start and end markers) to be parsed.
+ * @param src The raw comment source string.
+ * @param pos The position of the comment in source. */
+ protected def parseAtSymbol(comment: String, src: String, pos: Position, site: Symbol = NoSymbol): Comment = {
+ /** The cleaned raw comment as a list of lines. Cleaning removes comment
+ * start and end markers, line start markers and unnecessary whitespace. */
+ def clean(comment: String): List[String] = {
+ def cleanLine(line: String): String = {
+ //replaceAll removes trailing whitespaces
+ line.replaceAll("""\s+$""", "") match {
+ case CleanCommentLine(ctl) => ctl
+ case tl => tl
+ }
+ }
+ val strippedComment = comment.trim.stripPrefix("/*").stripSuffix("*/")
+ val safeComment = DangerousTags.replaceAllIn(strippedComment, { htmlReplacement(_) })
+ val javadoclessComment = JavadocTags.replaceAllIn(safeComment, { javadocReplacement(_) })
+ val markedTagComment =
+ SafeTags.replaceAllIn(javadoclessComment, { mtch =>
+ java.util.regex.Matcher.quoteReplacement(safeTagMarker + mtch.matched + safeTagMarker)
+ })
+ markedTagComment.lines.toList map (cleanLine(_))
+ }
+
+ /** Parses a comment (in the form of a list of lines) to a `Comment`
+ * instance, recursively on lines. To do so, it splits the whole comment
+ * into main body and tag bodies, then runs the `WikiParser` on each body
+ * before creating the comment instance.
+ *
+ * @param docBody The body of the comment parsed until now.
+ * @param tags All tags parsed until now.
+ * @param lastTagKey The last parsed tag, or `None` if the tag section hasn't started. Lines that are not tagged
+ * are part of the previous tag or, if none exists, of the body.
+ * @param remaining The lines that must still recursively be parsed.
+ * @param inCodeBlock Whether the next line is part of a code block (in which no tags must be read). */
+ def parse0 (
+ docBody: StringBuilder,
+ tags: Map[TagKey, List[String]],
+ lastTagKey: Option[TagKey],
+ remaining: List[String],
+ inCodeBlock: Boolean
+ ): Comment = remaining match {
+
+ case CodeBlockStartRegex(before, marker, after) :: ls if (!inCodeBlock) =>
+ if (!before.trim.isEmpty && !after.trim.isEmpty)
+ parse0(docBody, tags, lastTagKey, before :: marker :: after :: ls, inCodeBlock = false)
+ else if (!before.trim.isEmpty)
+ parse0(docBody, tags, lastTagKey, before :: marker :: ls, inCodeBlock = false)
+ else if (!after.trim.isEmpty)
+ parse0(docBody, tags, lastTagKey, marker :: after :: ls, inCodeBlock = true)
+ else lastTagKey match {
+ case Some(key) =>
+ val value =
+ ((tags get key): @unchecked) match {
+ case Some(b :: bs) => (b + endOfLine + marker) :: bs
+ case None => oops("lastTagKey set when no tag exists for key")
+ }
+ parse0(docBody, tags + (key -> value), lastTagKey, ls, inCodeBlock = true)
+ case None =>
+ parse0(docBody append endOfLine append marker, tags, lastTagKey, ls, inCodeBlock = true)
+ }
+
+ case CodeBlockEndRegex(before, marker, after) :: ls =>
+ if (!before.trim.isEmpty && !after.trim.isEmpty)
+ parse0(docBody, tags, lastTagKey, before :: marker :: after :: ls, inCodeBlock = true)
+ if (!before.trim.isEmpty)
+ parse0(docBody, tags, lastTagKey, before :: marker :: ls, inCodeBlock = true)
+ else if (!after.trim.isEmpty)
+ parse0(docBody, tags, lastTagKey, marker :: after :: ls, inCodeBlock = false)
+ else lastTagKey match {
+ case Some(key) =>
+ val value =
+ ((tags get key): @unchecked) match {
+ case Some(b :: bs) => (b + endOfLine + marker) :: bs
+ case None => oops("lastTagKey set when no tag exists for key")
+ }
+ parse0(docBody, tags + (key -> value), lastTagKey, ls, inCodeBlock = false)
+ case None =>
+ parse0(docBody append endOfLine append marker, tags, lastTagKey, ls, inCodeBlock = false)
+ }
+
+ case SymbolTagRegex(name, sym, body) :: ls if (!inCodeBlock) =>
+ val key = SymbolTagKey(name, sym)
+ val value = body :: tags.getOrElse(key, Nil)
+ parse0(docBody, tags + (key -> value), Some(key), ls, inCodeBlock)
+
+ case SimpleTagRegex(name, body) :: ls if (!inCodeBlock) =>
+ val key = SimpleTagKey(name)
+ val value = body :: tags.getOrElse(key, Nil)
+ parse0(docBody, tags + (key -> value), Some(key), ls, inCodeBlock)
+
+ case SingleTagRegex(name) :: ls if (!inCodeBlock) =>
+ val key = SimpleTagKey(name)
+ val value = "" :: tags.getOrElse(key, Nil)
+ parse0(docBody, tags + (key -> value), Some(key), ls, inCodeBlock)
+
+ case line :: ls if (lastTagKey.isDefined) =>
+ val key = lastTagKey.get
+ val value =
+ ((tags get key): @unchecked) match {
+ case Some(b :: bs) => (b + endOfLine + line) :: bs
+ case None => oops("lastTagKey set when no tag exists for key")
+ }
+ parse0(docBody, tags + (key -> value), lastTagKey, ls, inCodeBlock)
+
+ case line :: ls =>
+ if (docBody.length > 0) docBody append endOfLine
+ docBody append line
+ parse0(docBody, tags, lastTagKey, ls, inCodeBlock)
+
+ case Nil =>
+ // Take the {inheritance, content} diagram keys aside, as it doesn't need any parsing
+ val inheritDiagramTag = SimpleTagKey("inheritanceDiagram")
+ val contentDiagramTag = SimpleTagKey("contentDiagram")
+
+ val inheritDiagramText: List[String] = tags.get(inheritDiagramTag) match {
+ case Some(list) => list
+ case None => List.empty
+ }
+
+ val contentDiagramText: List[String] = tags.get(contentDiagramTag) match {
+ case Some(list) => list
+ case None => List.empty
+ }
+
+ val stripTags=List(inheritDiagramTag, contentDiagramTag, SimpleTagKey("template"), SimpleTagKey("documentable"))
+ val tagsWithoutDiagram = tags.filterNot(pair => stripTags.contains(pair._1))
+
+ val bodyTags: mutable.Map[TagKey, List[Body]] =
+ mutable.Map(tagsWithoutDiagram mapValues {tag => tag map (parseWikiAtSymbol(_, pos, site))} toSeq: _*)
+
+ def oneTag(key: SimpleTagKey): Option[Body] =
+ ((bodyTags remove key): @unchecked) match {
+ case Some(r :: rs) =>
+ if (!rs.isEmpty) reporter.warning(pos, "Only one '@" + key.name + "' tag is allowed")
+ Some(r)
+ case None => None
+ }
+
+ def allTags(key: SimpleTagKey): List[Body] =
+ (bodyTags remove key) getOrElse Nil
+
+ def allSymsOneTag(key: TagKey): Map[String, Body] = {
+ val keys: Seq[SymbolTagKey] =
+ bodyTags.keys.toSeq flatMap {
+ case stk: SymbolTagKey if (stk.name == key.name) => Some(stk)
+ case stk: SimpleTagKey if (stk.name == key.name) =>
+ reporter.warning(pos, "Tag '@" + stk.name + "' must be followed by a symbol name")
+ None
+ case _ => None
+ }
+ val pairs: Seq[(String, Body)] =
+ for (key <- keys) yield {
+ val bs = (bodyTags remove key).get
+ if (bs.length > 1)
+ reporter.warning(pos, "Only one '@" + key.name + "' tag for symbol " + key.symbol + " is allowed")
+ (key.symbol, bs.head)
+ }
+ Map.empty[String, Body] ++ pairs
+ }
+
+ val com = createComment (
+ body0 = Some(parseWikiAtSymbol(docBody.toString, pos, site)),
+ authors0 = allTags(SimpleTagKey("author")),
+ see0 = allTags(SimpleTagKey("see")),
+ result0 = oneTag(SimpleTagKey("return")),
+ throws0 = allSymsOneTag(SimpleTagKey("throws")),
+ valueParams0 = allSymsOneTag(SimpleTagKey("param")),
+ typeParams0 = allSymsOneTag(SimpleTagKey("tparam")),
+ version0 = oneTag(SimpleTagKey("version")),
+ since0 = oneTag(SimpleTagKey("since")),
+ todo0 = allTags(SimpleTagKey("todo")),
+ deprecated0 = oneTag(SimpleTagKey("deprecated")),
+ note0 = allTags(SimpleTagKey("note")),
+ example0 = allTags(SimpleTagKey("example")),
+ constructor0 = oneTag(SimpleTagKey("constructor")),
+ source0 = Some(clean(src).mkString("\n")),
+ inheritDiagram0 = inheritDiagramText,
+ contentDiagram0 = contentDiagramText,
+ group0 = oneTag(SimpleTagKey("group")),
+ groupDesc0 = allSymsOneTag(SimpleTagKey("groupdesc")),
+ groupNames0 = allSymsOneTag(SimpleTagKey("groupname")),
+ groupPrio0 = allSymsOneTag(SimpleTagKey("groupprio"))
+ )
+
+ for ((key, _) <- bodyTags)
+ reporter.warning(pos, "Tag '@" + key.name + "' is not recognised")
+
+ com
+
+ }
+
+ parse0(new StringBuilder(comment.size), Map.empty, None, clean(comment), inCodeBlock = false)
+
+ }
+
+ /** Parses a string containing wiki syntax into a `Comment` object.
+ * Note that the string is assumed to be clean:
+ * - Removed Scaladoc start and end markers.
+ * - Removed start-of-line star and one whitespace afterwards (if present).
+ * - Removed all end-of-line whitespace.
+ * - Only `endOfLine` is used to mark line endings. */
+ def parseWikiAtSymbol(string: String, pos: Position, site: Symbol): Body = new WikiParser(string, pos, site).document()
+
+ /** TODO
+ *
+ * @author Ingo Maier
+ * @author Manohar Jonnalagedda
+ * @author Gilles Dubochet */
+ protected final class WikiParser(val buffer: String, pos: Position, site: Symbol) extends CharReader(buffer) { wiki =>
+ var summaryParsed = false
+
+ def document(): Body = {
+ val blocks = new mutable.ListBuffer[Block]
+ while (char != endOfText)
+ blocks += block()
+ Body(blocks.toList)
+ }
+
+ /* BLOCKS */
+
+ /** {{{ block ::= code | title | hrule | para }}} */
+ def block(): Block = {
+ if (checkSkipInitWhitespace("{{{"))
+ code()
+ else if (checkSkipInitWhitespace('='))
+ title()
+ else if (checkSkipInitWhitespace("----"))
+ hrule()
+ else if (checkList)
+ listBlock
+ else {
+ para()
+ }
+ }
+
+ /** listStyle ::= '-' spc | '1.' spc | 'I.' spc | 'i.' spc | 'A.' spc | 'a.' spc
+ * Characters used to build lists and their constructors */
+ protected val listStyles = Map[String, (Seq[Block] => Block)]( // TODO Should this be defined at some list companion?
+ "- " -> ( UnorderedList(_) ),
+ "1. " -> ( OrderedList(_,"decimal") ),
+ "I. " -> ( OrderedList(_,"upperRoman") ),
+ "i. " -> ( OrderedList(_,"lowerRoman") ),
+ "A. " -> ( OrderedList(_,"upperAlpha") ),
+ "a. " -> ( OrderedList(_,"lowerAlpha") )
+ )
+
+ /** Checks if the current line is formed with more than one space and one the listStyles */
+ def checkList =
+ (countWhitespace > 0) && (listStyles.keys exists { checkSkipInitWhitespace(_) })
+
+ /** {{{
+ * nListBlock ::= nLine { mListBlock }
+ * nLine ::= nSpc listStyle para '\n'
+ * }}}
+ * Where n and m stand for the number of spaces. When `m > n`, a new list is nested. */
+ def listBlock: Block = {
+
+ /** Consumes one list item block and returns it, or None if the block is
+ * not a list or a different list. */
+ def listLine(indent: Int, style: String): Option[Block] =
+ if (countWhitespace > indent && checkList)
+ Some(listBlock)
+ else if (countWhitespace != indent || !checkSkipInitWhitespace(style))
+ None
+ else {
+ jumpWhitespace()
+ jump(style)
+ val p = Paragraph(inline(isInlineEnd = false))
+ blockEnded("end of list line ")
+ Some(p)
+ }
+
+ /** Consumes all list item blocks (possibly with nested lists) of the
+ * same list and returns the list block. */
+ def listLevel(indent: Int, style: String): Block = {
+ val lines = mutable.ListBuffer.empty[Block]
+ var line: Option[Block] = listLine(indent, style)
+ while (line.isDefined) {
+ lines += line.get
+ line = listLine(indent, style)
+ }
+ val constructor = listStyles(style)
+ constructor(lines)
+ }
+
+ val indent = countWhitespace
+ val style = (listStyles.keys find { checkSkipInitWhitespace(_) }).getOrElse(listStyles.keys.head)
+ listLevel(indent, style)
+ }
+
+ def code(): Block = {
+ jumpWhitespace()
+ jump("{{{")
+ val str = readUntil("}}}")
+ if (char == endOfText)
+ reportError(pos, "unclosed code block")
+ else
+ jump("}}}")
+ blockEnded("code block")
+ Code(normalizeIndentation(str))
+ }
+
+ /** {{{ title ::= ('=' inline '=' | "==" inline "==" | ...) '\n' }}} */
+ def title(): Block = {
+ jumpWhitespace()
+ val inLevel = repeatJump('=')
+ val text = inline(check("=" * inLevel))
+ val outLevel = repeatJump('=', inLevel)
+ if (inLevel != outLevel)
+ reportError(pos, "unbalanced or unclosed heading")
+ blockEnded("heading")
+ Title(text, inLevel)
+ }
+
+ /** {{{ hrule ::= "----" { '-' } '\n' }}} */
+ def hrule(): Block = {
+ jumpWhitespace()
+ repeatJump('-')
+ blockEnded("horizontal rule")
+ HorizontalRule()
+ }
+
+ /** {{{ para ::= inline '\n' }}} */
+ def para(): Block = {
+ val p =
+ if (summaryParsed)
+ Paragraph(inline(isInlineEnd = false))
+ else {
+ val s = summary()
+ val r =
+ if (checkParaEnded()) List(s) else List(s, inline(isInlineEnd = false))
+ summaryParsed = true
+ Paragraph(Chain(r))
+ }
+ while (char == endOfLine && char != endOfText)
+ nextChar()
+ p
+ }
+
+ /* 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 {
+ val str = readUntil { char == safeTagMarker || char == endOfText }
+ 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)
+
+ list mkString ""
+ }
+
+ def inline(isInlineEnd: => Boolean): Inline = {
+
+ def inline0(): Inline = {
+ if (char == safeTagMarker) {
+ val tag = htmlTag()
+ HtmlTag(tag.data + readHTMLFrom(tag))
+ }
+ else if (check("'''")) bold()
+ else if (check("''")) italic()
+ else if (check("`")) monospace()
+ else if (check("__")) underline()
+ else if (check("^")) superscript()
+ else if (check(",,")) subscript()
+ else if (check("[[")) link()
+ else {
+ val str = readUntil { char == safeTagMarker || check("''") || char == '`' || check("__") || char == '^' || check(",,") || check("[[") || isInlineEnd || checkParaEnded || char == endOfLine }
+ Text(str)
+ }
+ }
+
+ val inlines: List[Inline] = {
+ val iss = mutable.ListBuffer.empty[Inline]
+ iss += inline0()
+ while (!isInlineEnd && !checkParaEnded) {
+ val skipEndOfLine = if (char == endOfLine) {
+ nextChar()
+ true
+ } else {
+ false
+ }
+
+ val current = inline0()
+ (iss.last, current) match {
+ case (Text(t1), Text(t2)) if skipEndOfLine =>
+ iss.update(iss.length - 1, Text(t1 + endOfLine + t2))
+ case (i1, i2) if skipEndOfLine =>
+ iss ++= List(Text(endOfLine.toString), i2)
+ case _ => iss += current
+ }
+ }
+ iss.toList
+ }
+
+ inlines match {
+ case Nil => Text("")
+ case i :: Nil => i
+ case is => Chain(is)
+ }
+
+ }
+
+ def htmlTag(): HtmlTag = {
+ jump(safeTagMarker)
+ val read = readUntil(safeTagMarker)
+ if (char != endOfText) jump(safeTagMarker)
+ HtmlTag(read)
+ }
+
+ def bold(): Inline = {
+ jump("'''")
+ val i = inline(check("'''"))
+ jump("'''")
+ Bold(i)
+ }
+
+ def italic(): Inline = {
+ jump("''")
+ val i = inline(check("''"))
+ jump("''")
+ Italic(i)
+ }
+
+ def monospace(): Inline = {
+ jump("`")
+ val i = inline(check("`"))
+ jump("`")
+ Monospace(i)
+ }
+
+ def underline(): Inline = {
+ jump("__")
+ val i = inline(check("__"))
+ jump("__")
+ Underline(i)
+ }
+
+ def superscript(): Inline = {
+ jump("^")
+ val i = inline(check("^"))
+ if (jump("^")) {
+ Superscript(i)
+ } else {
+ Chain(Seq(Text("^"), i))
+ }
+ }
+
+ def subscript(): Inline = {
+ jump(",,")
+ val i = inline(check(",,"))
+ jump(",,")
+ Subscript(i)
+ }
+
+ def summary(): Inline = {
+ val i = inline(check("."))
+ Summary(
+ if (jump("."))
+ Chain(List(i, Text(".")))
+ else
+ i
+ )
+ }
+
+ def link(): Inline = {
+ val SchemeUri = """([a-z]+:.*)""".r
+ jump("[[")
+ val parens = 2 + repeatJump('[')
+ val stop = "]" * parens
+ //println("link with " + parens + " matching parens")
+ val target = readUntil { check(stop) || check(" ") }
+ val title =
+ if (!check(stop)) Some({
+ jump(" ")
+ inline(check(stop))
+ })
+ else None
+ jump(stop)
+
+ (target, title) match {
+ case (SchemeUri(uri), optTitle) =>
+ Link(uri, optTitle getOrElse Text(uri))
+ case (qualName, optTitle) =>
+ makeEntityLink(optTitle getOrElse Text(target), pos, target, site)
+ }
+ }
+
+ /* UTILITY */
+
+ /** {{{ eol ::= { whitespace } '\n' }}} */
+ def blockEnded(blockType: String): Unit = {
+ if (char != endOfLine && char != endOfText) {
+ reportError(pos, "no additional content on same line after " + blockType)
+ jumpUntil(endOfLine)
+ }
+ while (char == endOfLine)
+ nextChar()
+ }
+
+ /**
+ * Eliminates the (common) leading spaces in all lines, based on the first line
+ * For indented pieces of code, it reduces the indent to the least whitespace prefix:
+ * {{{
+ * indented example
+ * another indented line
+ * if (condition)
+ * then do something;
+ * ^ this is the least whitespace prefix
+ * }}}
+ */
+ def normalizeIndentation(_code: String): String = {
+
+ val code = _code.trim
+ var maxSkip = Integer.MAX_VALUE
+ var crtSkip = 0
+ var wsArea = true
+ var index = 0
+ var firstLine = true
+ var emptyLine = true
+
+ while (index < code.length) {
+ code(index) match {
+ case ' ' =>
+ if (wsArea)
+ crtSkip += 1
+ case c =>
+ wsArea = (c == '\n')
+ maxSkip = if (firstLine || emptyLine) maxSkip else if (maxSkip <= crtSkip) maxSkip else crtSkip
+ crtSkip = if (c == '\n') 0 else crtSkip
+ firstLine = if (c == '\n') false else firstLine
+ emptyLine = if (c == '\n') true else false
+ }
+ index += 1
+ }
+
+ if (maxSkip == 0)
+ code
+ else {
+ index = 0
+ val builder = new StringBuilder
+ while (index < code.length) {
+ builder.append(code(index))
+ if (code(index) == '\n') {
+ // we want to skip as many spaces are available, if there are less spaces (like on empty lines, do not
+ // over-consume them)
+ index += 1
+ val limit = index + maxSkip
+ while ((index < code.length) && (code(index) == ' ') && index < limit)
+ index += 1
+ }
+ else
+ index += 1
+ }
+ builder.toString
+ }
+ }
+
+ def checkParaEnded(): Boolean = {
+ (char == endOfText) ||
+ ((char == endOfLine) && {
+ val poff = offset
+ nextChar() // read EOL
+ val ok = {
+ checkSkipInitWhitespace(endOfLine) ||
+ checkSkipInitWhitespace('=') ||
+ checkSkipInitWhitespace("{{{") ||
+ checkList ||
+ checkSkipInitWhitespace('\u003D')
+ }
+ offset = poff
+ ok
+ })
+ }
+
+ def reportError(pos: Position, message: String) {
+ reporter.warning(pos, message)
+ }
+ }
+
+ protected sealed class CharReader(buffer: String) { reader =>
+
+ var offset: Int = 0
+ def char: Char =
+ if (offset >= buffer.length) endOfText else buffer charAt offset
+
+ final def nextChar() {
+ offset += 1
+ }
+
+ final def check(chars: String): Boolean = {
+ val poff = offset
+ val ok = jump(chars)
+ offset = poff
+ ok
+ }
+
+ def checkSkipInitWhitespace(c: Char): Boolean = {
+ val poff = offset
+ jumpWhitespace()
+ val ok = jump(c)
+ offset = poff
+ ok
+ }
+
+ def checkSkipInitWhitespace(chars: String): Boolean = {
+ val poff = offset
+ jumpWhitespace()
+ val (ok0, chars0) =
+ if (chars.charAt(0) == ' ')
+ (offset > poff, chars substring 1)
+ else
+ (true, chars)
+ val ok = ok0 && jump(chars0)
+ offset = poff
+ ok
+ }
+
+ def countWhitespace: Int = {
+ var count = 0
+ val poff = offset
+ while (isWhitespace(char) && char != endOfText) {
+ nextChar()
+ count += 1
+ }
+ offset = poff
+ count
+ }
+
+ /* JUMPERS */
+
+ /** jumps a character and consumes it
+ * @return true only if the correct character has been jumped */
+ final def jump(ch: Char): Boolean = {
+ if (char == ch) {
+ nextChar()
+ true
+ }
+ else false
+ }
+
+ /** jumps all the characters in chars, consuming them in the process.
+ * @return true only if the correct characters have been jumped */
+ final def jump(chars: String): Boolean = {
+ var index = 0
+ while (index < chars.length && char == chars.charAt(index) && char != endOfText) {
+ nextChar()
+ index += 1
+ }
+ index == chars.length
+ }
+
+ final def repeatJump(c: Char, max: Int = Int.MaxValue): Int = {
+ var count = 0
+ while (jump(c) && count < max)
+ count += 1
+ count
+ }
+
+ final def jumpUntil(ch: Char): Int = {
+ var count = 0
+ while (char != ch && char != endOfText) {
+ nextChar()
+ count += 1
+ }
+ count
+ }
+
+ final def jumpUntil(pred: => Boolean): Int = {
+ var count = 0
+ while (!pred && char != endOfText) {
+ nextChar()
+ count += 1
+ }
+ count
+ }
+
+ def jumpWhitespace() = jumpUntil(!isWhitespace(char))
+
+ /* READERS */
+
+ final def readUntil(c: Char): String = {
+ withRead {
+ while (char != c && char != endOfText) {
+ nextChar()
+ }
+ }
+ }
+
+ final def readUntil(chars: String): String = {
+ assert(chars.length > 0)
+ withRead {
+ val c = chars.charAt(0)
+ while (!check(chars) && char != endOfText) {
+ nextChar()
+ while (char != c && char != endOfText)
+ nextChar()
+ }
+ }
+ }
+
+ final def readUntil(pred: => Boolean): String = {
+ withRead {
+ while (char != endOfText && !pred) {
+ nextChar()
+ }
+ }
+ }
+
+ private def withRead(read: => Unit): String = {
+ val start = offset
+ read
+ buffer.substring(start, offset)
+ }
+
+
+ /* CHARS CLASSES */
+
+ def isWhitespace(c: Char) = c == ' ' || c == '\t'
+
+ }
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/LinkTo.scala b/src/scaladoc/scala/tools/nsc/doc/base/LinkTo.scala
new file mode 100755
index 0000000000..3d80f9da52
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/base/LinkTo.scala
@@ -0,0 +1,13 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ */
+
+package scala.tools.nsc
+package doc
+package base
+
+sealed trait LinkTo
+final case class LinkToMember[Mbr, Tpl](mbr: Mbr, tpl: Tpl) extends LinkTo
+final case class LinkToTpl[Tpl](tpl: Tpl) extends LinkTo
+final case class LinkToExternal(name: String, url: String) extends LinkTo
+final case class Tooltip(name: String) extends LinkTo
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/MemberLookupBase.scala b/src/scaladoc/scala/tools/nsc/doc/base/MemberLookupBase.scala
new file mode 100755
index 0000000000..cc217d2f80
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/base/MemberLookupBase.scala
@@ -0,0 +1,202 @@
+package scala.tools.nsc
+package doc
+package base
+
+import comment._
+
+/** This trait extracts all required information for documentation from compilation units.
+ * The base trait has been extracted to allow getting light-weight documentation
+ * for a particular symbol in the IDE.*/
+trait MemberLookupBase {
+
+ val global: Global
+ import global._
+
+ def internalLink(sym: Symbol, site: Symbol): Option[LinkTo]
+ def chooseLink(links: List[LinkTo]): LinkTo
+ def toString(link: LinkTo): String
+ def findExternalLink(sym: Symbol, name: String): Option[LinkToExternal]
+ def warnNoLink: Boolean
+
+ import global._
+ import rootMirror.{RootPackage, EmptyPackage}
+
+ private def isRoot(s: Symbol) = (s eq NoSymbol) || s.isRootSymbol || s.isEmptyPackage || s.isEmptyPackageClass
+
+ def makeEntityLink(title: Inline, pos: Position, query: String, site: Symbol) =
+ new EntityLink(title) { lazy val link = memberLookup(pos, query, site) }
+
+ private var showExplanation = true
+ private def explanation: String =
+ if (showExplanation) {
+ showExplanation = false
+ """
+ |Quick crash course on using Scaladoc links
+ |==========================================
+ |Disambiguating terms and types: Prefix terms with '$' and types with '!' in case both names are in use:
+ | - [[scala.collection.immutable.List!.apply class List's apply method]] and
+ | - [[scala.collection.immutable.List$.apply object List's apply method]]
+ |Disambiguating overloaded members: If a term is overloaded, you can indicate the first part of its signature followed by *:
+ | - [[[scala.collection.immutable.List$.fill[A](Int)(⇒A):List[A]* Fill with a single parameter]]]
+ | - [[[scala.collection.immutable.List$.fill[A](Int,Int)(⇒A):List[List[A]]* Fill with a two parameters]]]
+ |Notes:
+ | - you can use any number of matching square brackets to avoid interference with the signature
+ | - you can use \\. to escape dots in prefixes (don't forget to use * at the end to match the signature!)
+ | - you can use \\# to escape hashes, otherwise they will be considered as delimiters, like dots.""".stripMargin
+ } else ""
+
+ def memberLookup(pos: Position, query: String, site: Symbol): LinkTo = {
+ val members = breakMembers(query)
+
+ // (1) First look in the root package, as most of the links are qualified
+ val fromRoot = lookupInRootPackage(pos, members)
+
+ // (2) Or recursively go into each containing template.
+ val fromParents = Stream.iterate(site)(_.owner) takeWhile (!isRoot(_)) map (lookupInTemplate(pos, members, _))
+
+ val syms = (fromRoot +: fromParents) find (!_.isEmpty) getOrElse Nil
+
+ val links = syms flatMap { case (sym, site) => internalLink(sym, site) } match {
+ case Nil =>
+ // (3) Look at external links
+ syms.flatMap { case (sym, owner) =>
+ // reconstruct the original link
+ def linkName(sym: Symbol) = {
+ def nameString(s: Symbol) = s.nameString + (if ((s.isModule || s.isModuleClass) && !s.isPackage) "$" else "")
+ val packageSuffix = if (sym.isPackage) ".package" else ""
+
+ sym.ownerChain.reverse.filterNot(isRoot(_)).map(nameString(_)).mkString(".") + packageSuffix
+ }
+
+ if (sym.isClass || sym.isModule || sym.isTrait || sym.isPackage)
+ findExternalLink(sym, linkName(sym))
+ else if (owner.isClass || owner.isModule || owner.isTrait || owner.isPackage)
+ findExternalLink(sym, linkName(owner) + "@" + externalSignature(sym))
+ else
+ None
+ }
+ case links => links
+ }
+ links match {
+ case Nil =>
+ if (warnNoLink)
+ reporter.warning(pos, "Could not find any member to link for \"" + query + "\".")
+ // (4) if we still haven't found anything, create a tooltip
+ Tooltip(query)
+ case List(l) => l
+ case links =>
+ val chosen = chooseLink(links)
+ def linkToString(link: LinkTo) = {
+ val chosenInfo =
+ if (link == chosen) " [chosen]" else ""
+ toString(link) + chosenInfo + "\n"
+ }
+ if (warnNoLink) {
+ val allLinks = links.map(linkToString).mkString
+ reporter.warning(pos,
+ s"""The link target \"$query\" is ambiguous. Several members fit the target:
+ |$allLinks
+ |$explanation""".stripMargin)
+ }
+ chosen
+ }
+ }
+
+ private sealed trait SearchStrategy
+ private case object BothTypeAndTerm extends SearchStrategy
+ private case object OnlyType extends SearchStrategy
+ private case object OnlyTerm extends SearchStrategy
+
+ private def lookupInRootPackage(pos: Position, members: List[String]) =
+ lookupInTemplate(pos, members, EmptyPackage) ::: lookupInTemplate(pos, members, RootPackage)
+
+ private def lookupInTemplate(pos: Position, members: List[String], container: Symbol): List[(Symbol, Symbol)] = {
+ // Maintaining compatibility with previous links is a bit tricky here:
+ // we have a preference for term names for all terms except for the last, where we prefer a class:
+ // How to do this:
+ // - at each step we do a DFS search with the prefered strategy
+ // - if the search doesn't return any members, we backtrack on the last decision
+ // * we look for terms with the last member's name
+ // * we look for types with the same name, all the way up
+ val result = members match {
+ case Nil => Nil
+ case mbrName::Nil =>
+ var syms = lookupInTemplate(pos, mbrName, container, OnlyType) map ((_, container))
+ if (syms.isEmpty)
+ syms = lookupInTemplate(pos, mbrName, container, OnlyTerm) map ((_, container))
+ syms
+
+ case tplName::rest =>
+ def completeSearch(syms: List[Symbol]) =
+ syms flatMap (lookupInTemplate(pos, rest, _))
+
+ completeSearch(lookupInTemplate(pos, tplName, container, OnlyTerm)) match {
+ case Nil => completeSearch(lookupInTemplate(pos, tplName, container, OnlyType))
+ case syms => syms
+ }
+ }
+ //println("lookupInTemplate(" + members + ", " + container + ") => " + result)
+ result
+ }
+
+ private def lookupInTemplate(pos: Position, member: String, container: Symbol, strategy: SearchStrategy): List[Symbol] = {
+ val name = member.stripSuffix("$").stripSuffix("!").stripSuffix("*")
+ def signatureMatch(sym: Symbol): Boolean = externalSignature(sym).startsWith(name)
+
+ // We need to cleanup the bogus classes created by the .class file parser. For example, [[scala.Predef]] resolves
+ // to (bogus) class scala.Predef loaded by the class loader -- which we need to eliminate by looking at the info
+ // and removing NoType classes
+ def cleanupBogusClasses(syms: List[Symbol]) = { syms.filter(_.info != NoType) }
+
+ def syms(name: Name) = container.info.nonPrivateMember(name.encodedName).alternatives
+ def termSyms = cleanupBogusClasses(syms(newTermName(name)))
+ def typeSyms = cleanupBogusClasses(syms(newTypeName(name)))
+
+ val result = if (member.endsWith("$"))
+ termSyms
+ else if (member.endsWith("!"))
+ typeSyms
+ else if (member.endsWith("*"))
+ cleanupBogusClasses(container.info.nonPrivateDecls) filter signatureMatch
+ else
+ strategy match {
+ case BothTypeAndTerm => termSyms ::: typeSyms
+ case OnlyType => typeSyms
+ case OnlyTerm => termSyms
+ }
+
+ //println("lookupInTemplate(" + member + ", " + container + ") => " + result)
+ result
+ }
+
+ private def breakMembers(query: String): List[String] = {
+ // Okay, how does this work? Well: you split on . but you don't want to split on \. => thus the ugly regex
+ // query.split((?<=[^\\\\])\\.).map(_.replaceAll("\\."))
+ // The same code, just faster:
+ var members = List[String]()
+ var index = 0
+ var last_index = 0
+ val length = query.length
+ while (index < length) {
+ if ((query.charAt(index) == '.' || query.charAt(index) == '#') &&
+ ((index == 0) || (query.charAt(index-1) != '\\'))) {
+
+ val member = query.substring(last_index, index).replaceAll("\\\\([#\\.])", "$1")
+ // we want to allow javadoc-style links [[#member]] -- which requires us to remove empty members from the first
+ // elemnt in the list
+ if ((member != "") || (!members.isEmpty))
+ members ::= member
+ last_index = index + 1
+ }
+ index += 1
+ }
+ if (last_index < length)
+ members ::= query.substring(last_index, length).replaceAll("\\\\\\.", ".")
+ members.reverse
+ }
+
+ def externalSignature(sym: Symbol) = {
+ sym.info // force it, otherwise we see lazy types
+ (sym.nameString + sym.signatureString).replaceAll("\\s", "")
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/comment/Body.scala b/src/scaladoc/scala/tools/nsc/doc/base/comment/Body.scala
new file mode 100755
index 0000000000..ac5fec80b3
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/base/comment/Body.scala
@@ -0,0 +1,93 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc
+package doc
+package base
+package comment
+
+import scala.collection._
+
+/** A body of text. A comment has a single body, which is composed of
+ * at least one block. Inside every body is exactly one summary (see
+ * [[scala.tools.nsc.doc.model.comment.Summary]]). */
+final case class Body(blocks: Seq[Block]) {
+
+ /** The summary text of the comment body. */
+ lazy val summary: Option[Inline] = {
+ def summaryInBlock(block: Block): Seq[Inline] = block match {
+ case Title(text, _) => summaryInInline(text)
+ case Paragraph(text) => summaryInInline(text)
+ case UnorderedList(items) => items flatMap summaryInBlock
+ case OrderedList(items, _) => items flatMap summaryInBlock
+ case DefinitionList(items) => items.values.toSeq flatMap summaryInBlock
+ case _ => Nil
+ }
+ def summaryInInline(text: Inline): Seq[Inline] = text match {
+ case Summary(text) => List(text)
+ case Chain(items) => items flatMap summaryInInline
+ case Italic(text) => summaryInInline(text)
+ case Bold(text) => summaryInInline(text)
+ case Underline(text) => summaryInInline(text)
+ case Superscript(text) => summaryInInline(text)
+ case Subscript(text) => summaryInInline(text)
+ case Link(_, title) => summaryInInline(title)
+ case _ => Nil
+ }
+ (blocks flatMap { summaryInBlock(_) }).toList match {
+ case Nil => None
+ case inline :: Nil => Some(inline)
+ case inlines => Some(Chain(inlines))
+ }
+ }
+}
+
+/** A block-level element of text, such as a paragraph or code block. */
+sealed abstract class Block
+
+final case class Title(text: Inline, level: Int) extends Block
+final case class Paragraph(text: Inline) extends Block
+final case class Code(data: String) extends Block
+final case class UnorderedList(items: Seq[Block]) extends Block
+final case class OrderedList(items: Seq[Block], style: String) extends Block
+final case class DefinitionList(items: SortedMap[Inline, Block]) extends Block
+final case class HorizontalRule() extends Block
+
+/** An section of text inside a block, possibly with formatting. */
+sealed abstract class Inline
+
+final case class Chain(items: Seq[Inline]) extends Inline
+final case class Italic(text: Inline) extends Inline
+final case class Bold(text: Inline) extends Inline
+final case class Underline(text: Inline) extends Inline
+final case class Superscript(text: Inline) extends Inline
+final case class Subscript(text: Inline) extends Inline
+final case class Link(target: String, title: Inline) extends Inline
+final case class Monospace(text: Inline) extends Inline
+final case class Text(text: String) extends Inline
+abstract class EntityLink(val title: Inline) extends Inline { def link: LinkTo }
+object EntityLink {
+ def apply(title: Inline, linkTo: LinkTo) = new EntityLink(title) { def link: LinkTo = linkTo }
+ def unapply(el: EntityLink): Option[(Inline, LinkTo)] = Some((el.title, el.link))
+}
+final case class HtmlTag(data: String) extends Inline {
+ private val Pattern = """(?ms)\A<(/?)(.*?)[\s>].*\z""".r
+ private val (isEnd, tagName) = data match {
+ case Pattern(s1, s2) =>
+ (! s1.isEmpty, Some(s2.toLowerCase))
+ case _ =>
+ (false, None)
+ }
+
+ def canClose(open: HtmlTag) = {
+ isEnd && tagName == open.tagName
+ }
+
+ private val TagsNotToClose = Set("br", "img")
+ def close = tagName collect { case name if !TagsNotToClose(name) => HtmlTag(s"</$name>") }
+}
+
+/** The summary of a comment, usually its first sentence. There must be exactly one summary per body. */
+final case class Summary(text: Inline) extends Inline
diff --git a/src/scaladoc/scala/tools/nsc/doc/base/comment/Comment.scala b/src/scaladoc/scala/tools/nsc/doc/base/comment/Comment.scala
new file mode 100644
index 0000000000..a3d05ae50b
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/base/comment/Comment.scala
@@ -0,0 +1,131 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc
+package doc
+package base
+package comment
+
+import scala.collection._
+
+/** A Scaladoc comment and all its tags.
+ *
+ * '''Note:''' the only instantiation site of this class is in [[CommentFactory]].
+ *
+ * @author Manohar Jonnalagedda
+ * @author Gilles Dubochet */
+abstract class Comment {
+
+ /** The main body of the comment that describes what the entity does and is. */
+ def body: Body
+
+ private def closeHtmlTags(inline: Inline) = {
+ val stack = mutable.ListBuffer.empty[HtmlTag]
+ def scan(i: Inline) {
+ i match {
+ case Chain(list) =>
+ list foreach scan
+ case tag: HtmlTag => {
+ if (stack.length > 0 && tag.canClose(stack.last)) {
+ stack.remove(stack.length-1)
+ } else {
+ tag.close match {
+ case Some(t) =>
+ stack += t
+ case None =>
+ ;
+ }
+ }
+ }
+ case _ =>
+ ;
+ }
+ }
+ scan(inline)
+ Chain(List(inline) ++ stack.reverse)
+ }
+
+ /** A shorter version of the body. Usually, this is the first sentence of the body. */
+ def short: Inline = {
+ body.summary match {
+ case Some(s) =>
+ closeHtmlTags(s)
+ case _ =>
+ Text("")
+ }
+ }
+
+ /** A list of authors. The empty list is used when no author is defined. */
+ def authors: List[Body]
+
+ /** A list of other resources to see, including links to other entities or
+ * to external documentation. The empty list is used when no other resource
+ * is mentionned. */
+ def see: List[Body]
+
+ /** A description of the result of the entity. Typically, this provides additional
+ * information on the domain of the result, contractual post-conditions, etc. */
+ def result: Option[Body]
+
+ /** A map of exceptions that the entity can throw when accessed, and a
+ * description of what they mean. */
+ def throws: Map[String, Body]
+
+ /** A map of value parameters, and a description of what they are. Typically,
+ * this provides additional information on the domain of the parameters,
+ * contractual pre-conditions, etc. */
+ def valueParams: Map[String, Body]
+
+ /** A map of type parameters, and a description of what they are. Typically,
+ * this provides additional information on the domain of the parameters. */
+ def typeParams: Map[String, Body]
+
+ /** The version number of the entity. There is no formatting or further
+ * meaning attached to this value. */
+ def version: Option[Body]
+
+ /** A version number of a containing entity where this member-entity was introduced. */
+ def since: Option[Body]
+
+ /** An annotation as to expected changes on this entity. */
+ def todo: List[Body]
+
+ /** Whether the entity is deprecated. Using the `@deprecated` Scala attribute
+ * is prefereable to using this Scaladoc tag. */
+ def deprecated: Option[Body]
+
+ /** An additional note concerning the contract of the entity. */
+ def note: List[Body]
+
+ /** A usage example related to the entity. */
+ def example: List[Body]
+
+ /** A description for the primary constructor */
+ def constructor: Option[Body]
+
+ /** A set of diagram directives for the inheritance diagram */
+ def inheritDiagram: List[String]
+
+ /** A set of diagram directives for the content diagram */
+ def contentDiagram: List[String]
+
+ /** The group this member is part of */
+ def group: Option[String]
+
+ /** Member group descriptions */
+ def groupDesc: Map[String,Body]
+
+ /** Member group names (overriding the short tag) */
+ def groupNames: Map[String,String]
+
+ /** Member group priorities */
+ def groupPrio: Map[String,Int]
+
+ override def toString =
+ body.toString + "\n" +
+ (authors map ("@author " + _.toString)).mkString("\n") +
+ (result map ("@return " + _.toString)).mkString("\n") +
+ (version map ("@version " + _.toString)).mkString
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/doclet/Generator.scala b/src/scaladoc/scala/tools/nsc/doc/doclet/Generator.scala
new file mode 100644
index 0000000000..42b56aa927
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/doclet/Generator.scala
@@ -0,0 +1,30 @@
+package scala.tools.nsc.doc
+package doclet
+
+import scala.collection._
+
+/** Custom Scaladoc generators must implement the `Generator` class. A custom generator can be selected in Scaladoc
+ * using the `-doc-generator` command line option.
+ * The `Generator` class does not provide data about the documented code. A number of data provider traits can be used
+ * to configure what data is actually available to the generator:
+ * - A `Universer` provides a `Universe` data structure representing the interfaces and comments of the documented
+ * program.
+ * - An `Indexer` provides precalculated indexing information about a universe.
+ * To implement this class only requires defining method `generateImpl`. */
+abstract class Generator {
+
+ /** A series of tests that must be true before generation can be done. This is used by data provider traits to
+ * confirm that they have been correctly initialised before allowing generation to proceed. */
+ protected val checks: mutable.Set[()=>Boolean] =
+ mutable.Set.empty[()=>Boolean]
+
+ /** Outputs documentation (as a side effect). */
+ def generate(): Unit = {
+ assert(checks forall { check => check() })
+ generateImpl()
+ }
+
+ /** Outputs documentation (as a side effect). This method is called only if all `checks` are true. */
+ protected def generateImpl(): Unit
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/doclet/Indexer.scala b/src/scaladoc/scala/tools/nsc/doc/doclet/Indexer.scala
new file mode 100644
index 0000000000..0cdd47182f
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/doclet/Indexer.scala
@@ -0,0 +1,21 @@
+package scala.tools.nsc
+package doc
+package doclet
+
+/** A `Generator` may implement the `Indexer` trait to gain access to pre-calculated indexing information */
+trait Indexer extends Generator with Universer {
+
+ protected var indexField: Index = null
+
+ def index: Index = indexField
+
+ def setIndex(i: Index) {
+ assert(indexField == null)
+ indexField = i
+ }
+
+ checks += { () =>
+ indexField != null
+ }
+
+} \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/doclet/Universer.scala b/src/scaladoc/scala/tools/nsc/doc/doclet/Universer.scala
new file mode 100644
index 0000000000..ee8b7809e5
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/doclet/Universer.scala
@@ -0,0 +1,21 @@
+package scala.tools.nsc
+package doc
+package doclet
+
+/** A `Generator` may implement the `Universer` trait to gain access to a model of the documented program */
+trait Universer extends Generator {
+
+ protected var universeField: Universe = null
+
+ def universe: Universe = universeField
+
+ def setUniverse(u: Universe) {
+ assert(universeField == null)
+ universeField = u
+ }
+
+ checks += { () =>
+ universeField != null
+ }
+
+} \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/Doclet.scala b/src/scaladoc/scala/tools/nsc/doc/html/Doclet.scala
new file mode 100644
index 0000000000..21c5f6bb67
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/Doclet.scala
@@ -0,0 +1,19 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author David Bernard, Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc.doc
+package html
+
+import doclet._
+
+/** The default doclet used by the scaladoc command line tool
+ * when no user-provided doclet is provided. */
+class Doclet extends Generator with Universer with Indexer {
+
+ def generateImpl() {
+ new html.HtmlFactory(universe, index).generate()
+ }
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/HtmlFactory.scala b/src/scaladoc/scala/tools/nsc/doc/html/HtmlFactory.scala
new file mode 100644
index 0000000000..d721a96ad7
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/HtmlFactory.scala
@@ -0,0 +1,152 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author David Bernard, Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc
+package doc
+package html
+
+import model._
+import java.io.{ File => JFile }
+import io.{ Streamable, Directory }
+import scala.collection._
+import page.diagram._
+
+import html.page.diagram.DiagramGenerator
+
+/** A class that can generate Scaladoc sites to some fixed root folder.
+ * @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"
+
+ def siteRoot: JFile = new JFile(universe.settings.outdir.value)
+
+ def libResources = List(
+ "index.js",
+ "jquery-ui.js",
+ "jquery.js",
+ "jquery.layout.js",
+ "scheduler.js",
+ "diagrams.js",
+ "template.js",
+ "tools.tooltip.js",
+ "modernizr.custom.js",
+
+ "index.css",
+ "ref-index.css",
+ "template.css",
+ "diagrams.css",
+
+ "class.png",
+ "class_big.png",
+ "class_diagram.png",
+ "object.png",
+ "object_big.png",
+ "object_diagram.png",
+ "package.png",
+ "package_big.png",
+ "trait.png",
+ "trait_big.png",
+ "trait_diagram.png",
+ "type.png",
+ "type_big.png",
+ "type_diagram.png",
+
+ "class_to_object_big.png",
+ "object_to_class_big.png",
+ "trait_to_object_big.png",
+ "object_to_trait_big.png",
+ "type_to_object_big.png",
+ "object_to_type_big.png",
+
+ "arrow-down.png",
+ "arrow-right.png",
+ "filter_box_left.png",
+ "filter_box_left2.gif",
+ "filter_box_right.png",
+ "filterbg.gif",
+ "filterboxbarbg.gif",
+ "filterboxbg.gif",
+
+ "constructorsbg.gif",
+ "defbg-blue.gif",
+ "defbg-green.gif",
+ "filterboxbarbg.png",
+ "fullcommenttopbg.gif",
+ "ownderbg2.gif",
+ "ownerbg.gif",
+ "ownerbg2.gif",
+ "packagesbg.gif",
+ "signaturebg.gif",
+ "signaturebg2.gif",
+ "typebg.gif",
+ "conversionbg.gif",
+ "valuemembersbg.gif",
+
+ "navigation-li-a.png",
+ "navigation-li.png",
+ "remove.png",
+ "selected-right.png",
+ "selected.png",
+ "selected2-right.png",
+ "selected2.png",
+ "selected-right-implicits.png",
+ "selected-implicits.png",
+ "unselected.png"
+ )
+
+ /** Generates the Scaladoc site for a model into the site root.
+ * A scaladoc site is a set of HTML and related files
+ * that document a model extracted from a compiler run.
+ */
+ def generate() {
+
+ def copyResource(subPath: String) {
+ val bytes = new Streamable.Bytes {
+ val p = "/scala/tools/nsc/doc/html/resource/" + subPath
+ val inputStream = getClass.getResourceAsStream(p)
+ assert(inputStream != null, p)
+ }.toByteArray()
+ val dest = Directory(siteRoot) / subPath
+ dest.parent.createDirectory()
+ val out = dest.toFile.bufferedOutput()
+ try out.write(bytes, 0, bytes.length)
+ finally out.close()
+ }
+
+ DiagramGenerator.initialize(universe.settings)
+
+ libResources foreach (s => copyResource("lib/" + s))
+
+ new page.Index(universe, index) writeFor this
+ new page.IndexScript(universe, index) writeFor this
+
+ writeTemplates(_ writeFor this)
+
+ for (letter <- index.firstLetterIndex) {
+ new html.page.ReferenceIndex(letter._1, index, universe) writeFor this
+ }
+
+ DiagramGenerator.cleanup()
+ }
+
+ def writeTemplates(writeForThis: HtmlPage => Unit) {
+ val written = mutable.HashSet.empty[DocTemplateEntity]
+ val diagramGenerator: DiagramGenerator = new DotDiagramGenerator(universe.settings)
+
+ def writeTemplate(tpl: DocTemplateEntity) {
+ if (!(written contains tpl)) {
+ writeForThis(new page.Template(universe, diagramGenerator, tpl))
+ written += tpl
+ tpl.templates collect { case d: DocTemplateEntity => d } map writeTemplate
+ }
+ }
+
+ writeTemplate(universe.rootPackage)
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala b/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala
new file mode 100644
index 0000000000..159e16375c
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/HtmlPage.scala
@@ -0,0 +1,226 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author David Bernard, Manohar Jonnalagedda
+ */
+
+package scala
+package tools
+package nsc
+package doc
+package html
+
+import base._
+import base.comment._
+import model._
+
+import scala.xml.NodeSeq
+import scala.xml.dtd.{DocType, PublicID}
+import scala.collection._
+import java.io.Writer
+
+/** An html page that is part of a Scaladoc site.
+ * @author David Bernard
+ * @author Gilles Dubochet */
+abstract class HtmlPage extends Page { thisPage =>
+ /** The title of this page. */
+ protected def title: String
+
+ /** The page description */
+ protected def description: String =
+ // unless overwritten, will display the title in a spaced format, keeping - and .
+ title.replaceAll("[^a-zA-Z0-9\\.\\-]+", " ").replaceAll("\\-+", " - ").replaceAll(" +", " ")
+
+ /** The page keywords */
+ protected def keywords: String =
+ // unless overwritten, same as description, minus the " - "
+ description.replaceAll(" - ", " ")
+
+ /** Additional header elements (links, scripts, meta tags, etc.) required for this page. */
+ protected def headers: NodeSeq
+
+ /** The body of this page. */
+ def body: NodeSeq
+
+ def writeFor(site: HtmlFactory) {
+ val doctype =
+ DocType("html", PublicID("-//W3C//DTD XHTML 1.1//EN", "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"), Nil)
+ val html =
+ <html>
+ <head>
+ <title>{ title }</title>
+ <meta name="description" content={ description }/>
+ <meta name="keywords" content={ keywords }/>
+ <meta http-equiv="content-type" content={ "text/html; charset=" + site.encoding }/>
+ { headers }
+ </head>
+ { body }
+ </html>
+
+ writeFile(site) { (w: Writer) =>
+ w.write("<?xml version='1.0' encoding='" + site.encoding + "'?>\n")
+ w.write(doctype.toString + "\n")
+ w.write(xml.Xhtml.toXhtml(html))
+ }
+
+ if (site.universe.settings.docRawOutput)
+ writeFile(site, ".raw") {
+ // we're only interested in the body, as this will go into the diff
+ _.write(body.text)
+ }
+
+ //XML.save(pageFile.getPath, html, site.encoding, xmlDecl = false, doctype = doctype)
+ }
+
+ /** Transforms an optional comment into an styled HTML tree representing its body if it is defined, or into an empty
+ * node sequence if it is not. */
+ def commentToHtml(comment: Option[Comment]): NodeSeq =
+ (comment map (commentToHtml(_))) getOrElse NodeSeq.Empty
+
+ /** Transforms a comment into an styled HTML tree representing its body. */
+ def commentToHtml(comment: Comment): NodeSeq =
+ bodyToHtml(comment.body)
+
+ def bodyToHtml(body: Body): NodeSeq =
+ body.blocks flatMap (blockToHtml(_))
+
+ def blockToHtml(block: Block): NodeSeq = block match {
+ case Title(in, 1) => <h3>{ inlineToHtml(in) }</h3>
+ case Title(in, 2) => <h4>{ inlineToHtml(in) }</h4>
+ case Title(in, 3) => <h5>{ inlineToHtml(in) }</h5>
+ case Title(in, _) => <h6>{ inlineToHtml(in) }</h6>
+ case Paragraph(in) => <p>{ inlineToHtml(in) }</p>
+ case Code(data) =>
+ <pre>{ SyntaxHigh(data) }</pre> //<pre>{ scala.xml.Text(data) }</pre>
+ case UnorderedList(items) =>
+ <ul>{ listItemsToHtml(items) }</ul>
+ case OrderedList(items, listStyle) =>
+ <ol class={ listStyle }>{ listItemsToHtml(items) }</ol>
+ case DefinitionList(items) =>
+ <dl>{items map { case (t, d) => <dt>{ inlineToHtml(t) }</dt><dd>{ blockToHtml(d) }</dd> } }</dl>
+ case HorizontalRule() =>
+ <hr/>
+ }
+
+ def listItemsToHtml(items: Seq[Block]) =
+ items.foldLeft(xml.NodeSeq.Empty){ (xmlList, item) =>
+ item match {
+ case OrderedList(_, _) | UnorderedList(_) => // html requires sub ULs to be put into the last LI
+ xmlList.init ++ <li>{ xmlList.last.child ++ blockToHtml(item) }</li>
+ case Paragraph(inline) =>
+ xmlList :+ <li>{ inlineToHtml(inline) }</li> // LIs are blocks, no need to use Ps
+ case block =>
+ xmlList :+ <li>{ blockToHtml(block) }</li>
+ }
+ }
+
+ def inlineToHtml(inl: Inline): NodeSeq = inl match {
+ case Chain(items) => items flatMap (inlineToHtml(_))
+ case Italic(in) => <i>{ inlineToHtml(in) }</i>
+ case Bold(in) => <b>{ inlineToHtml(in) }</b>
+ case Underline(in) => <u>{ inlineToHtml(in) }</u>
+ case Superscript(in) => <sup>{ inlineToHtml(in) }</sup>
+ case Subscript(in) => <sub>{ inlineToHtml(in) }</sub>
+ case Link(raw, title) => <a href={ raw } target="_blank">{ inlineToHtml(title) }</a>
+ case Monospace(in) => <code>{ inlineToHtml(in) }</code>
+ case Text(text) => scala.xml.Text(text)
+ case Summary(in) => inlineToHtml(in)
+ case HtmlTag(tag) => scala.xml.Unparsed(tag)
+ case EntityLink(target, link) => linkToHtml(target, link, hasLinks = true)
+ }
+
+ def linkToHtml(text: Inline, link: LinkTo, hasLinks: Boolean) = link match {
+ case LinkToTpl(dtpl: TemplateEntity) =>
+ if (hasLinks)
+ <a href={ relativeLinkTo(dtpl) } class="extype" name={ dtpl.qualifiedName }>{ inlineToHtml(text) }</a>
+ else
+ <span class="extype" name={ dtpl.qualifiedName }>{ inlineToHtml(text) }</span>
+ case LinkToMember(mbr: MemberEntity, inTpl: TemplateEntity) =>
+ if (hasLinks)
+ <a href={ relativeLinkTo(inTpl) + "#" + mbr.signature } class="extmbr" name={ mbr.qualifiedName }>{ inlineToHtml(text) }</a>
+ else
+ <span class="extmbr" name={ mbr.qualifiedName }>{ inlineToHtml(text) }</span>
+ case Tooltip(tooltip) =>
+ <span class="extype" name={ tooltip }>{ inlineToHtml(text) }</span>
+ case LinkToExternal(name, url) =>
+ <a href={ url } class="extype" target="_top">{ inlineToHtml(text) }</a>
+ case _ =>
+ inlineToHtml(text)
+ }
+
+ def typeToHtml(tpes: List[model.TypeEntity], hasLinks: Boolean): NodeSeq = tpes match {
+ case Nil =>
+ NodeSeq.Empty
+ case List(tpe) =>
+ typeToHtml(tpe, hasLinks)
+ case tpe :: rest =>
+ typeToHtml(tpe, hasLinks) ++ scala.xml.Text(" with ") ++ typeToHtml(rest, hasLinks)
+ }
+
+ def typeToHtml(tpe: model.TypeEntity, hasLinks: Boolean): NodeSeq = {
+ val string = tpe.name
+ def toLinksOut(inPos: Int, starts: List[Int]): NodeSeq = {
+ if (starts.isEmpty && (inPos == string.length))
+ NodeSeq.Empty
+ else if (starts.isEmpty)
+ scala.xml.Text(string.slice(inPos, string.length))
+ else if (inPos == starts.head)
+ toLinksIn(inPos, starts)
+ else {
+ scala.xml.Text(string.slice(inPos, starts.head)) ++ toLinksIn(starts.head, starts)
+ }
+ }
+ def toLinksIn(inPos: Int, starts: List[Int]): NodeSeq = {
+ val (link, width) = tpe.refEntity(inPos)
+ val text = comment.Text(string.slice(inPos, inPos + width))
+ linkToHtml(text, link, hasLinks) ++ toLinksOut(inPos + width, starts.tail)
+ }
+ if (hasLinks)
+ toLinksOut(0, tpe.refEntity.keySet.toList)
+ else
+ scala.xml.Text(string)
+ }
+
+ def typesToHtml(tpess: List[model.TypeEntity], hasLinks: Boolean, sep: NodeSeq): NodeSeq = tpess match {
+ case Nil => NodeSeq.Empty
+ case tpe :: Nil => typeToHtml(tpe, hasLinks)
+ case tpe :: tpes => typeToHtml(tpe, hasLinks) ++ sep ++ typesToHtml(tpes, hasLinks, sep)
+ }
+
+ def hasPage(e: DocTemplateEntity) = {
+ e.isPackage || e.isTrait || e.isClass || e.isObject || e.isCaseClass
+ }
+
+ /** Returns the HTML code that represents the template in `tpl` as a hyperlinked name. */
+ def templateToHtml(tpl: TemplateEntity, name: String = null) = tpl match {
+ case dTpl: DocTemplateEntity =>
+ if (hasPage(dTpl)) {
+ <a href={ relativeLinkTo(dTpl) } class="extype" name={ dTpl.qualifiedName }>{ if (name eq null) dTpl.name else name }</a>
+ } else {
+ scala.xml.Text(if (name eq null) dTpl.name else name)
+ }
+ case ndTpl: NoDocTemplate =>
+ scala.xml.Text(if (name eq null) ndTpl.name else name)
+ }
+
+ /** Returns the HTML code that represents the templates in `tpls` as a list of hyperlinked names. */
+ def templatesToHtml(tplss: List[TemplateEntity], sep: NodeSeq): NodeSeq = tplss match {
+ case Nil => NodeSeq.Empty
+ case tpl :: Nil => templateToHtml(tpl)
+ case tpl :: tpls => templateToHtml(tpl) ++ sep ++ templatesToHtml(tpls, sep)
+ }
+
+ /** Returns the _big image name corresponding to the DocTemplate Entity (upper left icon) */
+ def docEntityKindToBigImage(ety: DocTemplateEntity) =
+ if (ety.isTrait && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None) "trait_to_object_big.png"
+ else if (ety.isTrait) "trait_big.png"
+ else if (ety.isClass && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None) "class_to_object_big.png"
+ else if (ety.isClass) "class_big.png"
+ else if ((ety.isAbstractType || ety.isAliasType) && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None) "type_to_object_big.png"
+ else if ((ety.isAbstractType || ety.isAliasType)) "type_big.png"
+ else if (ety.isObject && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None && ety.companion.get.isClass) "object_to_class_big.png"
+ else if (ety.isObject && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None && ety.companion.get.isTrait) "object_to_trait_big.png"
+ else if (ety.isObject && !ety.companion.isEmpty && ety.companion.get.visibility.isPublic && ety.companion.get.inSource != None && (ety.companion.get.isAbstractType || ety.companion.get.isAliasType)) "object_to_trait_big.png"
+ else if (ety.isObject) "object_big.png"
+ else if (ety.isPackage) "package_big.png"
+ else "class_big.png" // FIXME: an entity *should* fall into one of the above categories, but AnyRef is somehow not
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/Page.scala b/src/scaladoc/scala/tools/nsc/doc/html/Page.scala
new file mode 100644
index 0000000000..93950fd0a7
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/Page.scala
@@ -0,0 +1,103 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author David Bernard, Manohar Jonnalagedda
+ */
+
+package scala
+package tools.nsc.doc.html
+
+import scala.tools.nsc.doc.model._
+import java.io.{FileOutputStream, File}
+import scala.reflect.NameTransformer
+import java.nio.channels.Channels
+import java.io.Writer
+
+abstract class Page {
+ thisPage =>
+
+ /** The path of this page, relative to the API site. `path.tail` is a list
+ * of folder names leading to this page (from closest package to
+ * one-above-root package), `path.head` is the file name of this page.
+ * Note that `path` has a length of at least one. */
+ def path: List[String]
+
+ def absoluteLinkTo(path: List[String]) = path.reverse.mkString("/")
+
+ def createFileOutputStream(site: HtmlFactory, suffix: String = "") = {
+ val file = new File(site.siteRoot, absoluteLinkTo(thisPage.path) + suffix)
+ val folder = file.getParentFile
+ if (! folder.exists) {
+ folder.mkdirs
+ }
+ new FileOutputStream(file.getPath)
+ }
+
+ def writeFile(site: HtmlFactory, suffix: String = "")(fn: Writer => Unit) = {
+ val fos = createFileOutputStream(site, suffix)
+ val w = Channels.newWriter(fos.getChannel, site.encoding)
+ try {
+ fn(w)
+ }
+ finally {
+ w.close()
+ fos.close()
+ }
+ }
+
+ /** Writes this page as a file. The file's location is relative to the
+ * generator's site root, and the encoding is also defined by the generator.
+ * @param site The generator that is writing this page. */
+ def writeFor(site: HtmlFactory): Unit
+
+ def kindToString(mbr: MemberEntity) =
+ mbr match {
+ case c: Class => if (c.isCaseClass) "case class" else "class"
+ case _: Trait => "trait"
+ case _: Package => "package"
+ case _: Object => "object"
+ case _: AbstractType => "type"
+ case _: AliasType => "type"
+ case _: Constructor => "new"
+ case v: Def => "def"
+ case v: Val if (v.isLazyVal) => "lazy val"
+ case v: Val if (v.isVal) => "val"
+ case v: Val if (v.isVar) => "var"
+ case _ => sys.error("Cannot create kind for: " + mbr + " of class " + mbr.getClass)
+ }
+
+ def templateToPath(tpl: TemplateEntity): List[String] = {
+ def doName(tpl: TemplateEntity): String =
+ (if (tpl.inPackageObject) "package$$" else "") + NameTransformer.encode(tpl.name) + (if (tpl.isObject) "$" else "")
+ def downPacks(pack: Package): List[String] =
+ if (pack.isRootPackage) Nil else (doName(pack) :: downPacks(pack.inTemplate))
+ def downInner(nme: String, tpl: TemplateEntity): (String, Package) = {
+ tpl.inTemplate match {
+ case inPkg: Package => (nme + ".html", inPkg)
+ case inTpl => downInner(doName(inTpl) + "$" + nme, inTpl)
+ }
+ }
+ val (file, pack) =
+ tpl match {
+ case p: Package => ("package.html", p)
+ case _ => downInner(doName(tpl), tpl)
+ }
+ file :: downPacks(pack)
+ }
+
+ /** A relative link from this page to some destination class entity.
+ * @param destClass The class or object entity that the link will point to. */
+ def relativeLinkTo(destClass: TemplateEntity): String =
+ relativeLinkTo(templateToPath(destClass))
+
+ /** A relative link from this page to some destination path.
+ * @param destPath The path that the link will point to. */
+ def relativeLinkTo(destPath: List[String]): String = {
+ def relativize(from: List[String], to: List[String]): List[String] = (from, to) match {
+ case (f :: fs, t :: ts) if (f == t) => // both paths are identical to that point
+ relativize(fs, ts)
+ case (fss, tss) =>
+ List.fill(fss.length - 1)("..") ::: tss
+ }
+ relativize(thisPage.path.reverse, destPath.reverse).mkString("/")
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/SyntaxHigh.scala b/src/scaladoc/scala/tools/nsc/doc/html/SyntaxHigh.scala
new file mode 100644
index 0000000000..fe0fc64033
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/SyntaxHigh.scala
@@ -0,0 +1,287 @@
+/* NSC -- new Scala compiler
+ * Copyright 2010-2013 LAMP/EPFL
+ * @author Stephane Micheloud
+ */
+
+package scala
+package tools.nsc.doc.html
+
+import scala.xml.NodeSeq
+import scala.annotation.tailrec
+
+/** Highlight the syntax of Scala code appearing in a `{{{` wiki block
+ * (see method `HtmlPage.blockToHtml`).
+ *
+ * @author Stephane Micheloud
+ * @version 1.0
+ */
+private[html] object SyntaxHigh {
+
+ /** Reserved words, sorted alphabetically
+ * (see [[scala.reflect.internal.StdNames]]) */
+ val reserved = Array(
+ "abstract", "case", "catch", "class", "def",
+ "do", "else", "extends", "false", "final", "finally",
+ "for", "if", "implicit", "import", "lazy", "match",
+ "new", "null", "object", "override", "package",
+ "private", "protected", "return", "sealed", "super",
+ "this", "throw", "trait", "true", "try", "type",
+ "val", "var", "while", "with", "yield")
+
+ /** Annotations, sorted alphabetically */
+ val annotations = Array(
+ "BeanProperty", "SerialVersionUID",
+ "beanGetter", "beanSetter", "bridge",
+ "deprecated", "deprecatedName", "deprecatedOverriding", "deprecatedInheritance",
+ "elidable", "field", "getter", "inline",
+ "migration", "native", "noinline", "param",
+ "remote", "setter", "specialized", "strictfp", "switch",
+ "tailrec", "throws", "transient",
+ "unchecked", "uncheckedStable", "uncheckedVariance",
+ "varargs", "volatile")
+
+ /** Standard library classes/objects, sorted alphabetically */
+ val standards = Array (
+ "WeakTypeTag", "Any", "AnyRef", "AnyVal", "App", "Array",
+ "Boolean", "Byte", "Char", "Class", "ClassTag", "ClassManifest",
+ "Console", "Double", "Enumeration", "Float", "Function", "Int",
+ "List", "Long", "Manifest", "Map",
+ "NoManifest", "None", "Nothing", "Null", "Object", "Option", "OptManifest",
+ "Pair", "Predef",
+ "Seq", "Set", "Short", "Some", "String", "Symbol",
+ "Triple", "TypeTag", "Unit")
+
+ def apply(data: String): NodeSeq = {
+ val buf = data.getBytes
+ val out = new StringBuilder
+
+ def compare(offset: Int, key: String): Int = {
+ var i = offset
+ var j = 0
+ val l = key.length
+ while (i < buf.length && j < l) {
+ val bch = buf(i).toChar
+ val kch = key charAt j
+ if (bch < kch) return -1
+ else if (bch > kch) return 1
+ i += 1
+ j += 1
+ }
+ if (j < l) -1
+ else if (i < buf.length &&
+ ('A' <= buf(i) && buf(i) <= 'Z' ||
+ 'a' <= buf(i) && buf(i) <= 'z' ||
+ '0' <= buf(i) && buf(i) <= '9' ||
+ buf(i) == '_')) 1
+ else 0
+ }
+
+ def lookup(a: Array[String], i: Int): Int = {
+ var lo = 0
+ var hi = a.length - 1
+ while (lo <= hi) {
+ val m = (hi + lo) / 2
+ val d = compare(i, a(m))
+ if (d < 0) hi = m - 1
+ else if (d > 0) lo = m + 1
+ else return m
+ }
+ -1
+ }
+
+ def comment(i: Int): String = {
+ val out = new StringBuilder("/")
+ def line(i: Int): Int =
+ if (i == buf.length || buf(i) == '\n') i
+ else {
+ out append buf(i).toChar
+ line(i+1)
+ }
+ var level = 0
+ def multiline(i: Int, star: Boolean): Int = {
+ if (i == buf.length) return i
+ val ch = buf(i).toChar
+ out append ch
+ ch match {
+ case '*' =>
+ if (star) level += 1
+ multiline(i+1, !star)
+ case '/' =>
+ if (star) {
+ if (level > 0) level -= 1
+ if (level == 0) i else multiline(i+1, star = true)
+ } else
+ multiline(i+1, star = false)
+ case _ =>
+ multiline(i+1, star = false)
+ }
+ }
+ if (buf(i) == '/') line(i) else multiline(i, star = true)
+ out.toString
+ }
+
+ /* e.g. `val endOfLine = '\u000A'`*/
+ def charlit(j: Int): String = {
+ val out = new StringBuilder("'")
+ def charlit0(i: Int, bslash: Boolean): Int = {
+ if (i == buf.length) i
+ else if (i > j+6) { out setLength 0; j }
+ else {
+ val ch = buf(i).toChar
+ out append ch
+ ch match {
+ case '\\' =>
+ charlit0(i+1, bslash = true)
+ case '\'' if !bslash =>
+ i
+ case _ =>
+ if (bslash && '0' <= ch && ch <= '9') charlit0(i+1, bslash = true)
+ else charlit0(i+1, bslash = false)
+ }
+ }
+ }
+ charlit0(j, bslash = false)
+ out.toString
+ }
+
+ def strlit(i: Int): String = {
+ val out = new StringBuilder("\"")
+ def strlit0(i: Int, bslash: Boolean): Int = {
+ if (i == buf.length) return i
+ val ch = buf(i).toChar
+ out append ch
+ ch match {
+ case '\\' =>
+ strlit0(i+1, bslash = true)
+ case '"' if !bslash =>
+ i
+ case _ =>
+ strlit0(i+1, bslash = false)
+ }
+ }
+ strlit0(i, bslash = false)
+ out.toString
+ }
+
+ def numlit(i: Int): String = {
+ val out = new StringBuilder
+ def intg(i: Int): Int = {
+ if (i == buf.length) return i
+ val ch = buf(i).toChar
+ ch match {
+ case '.' =>
+ out append ch
+ frac(i+1)
+ case _ =>
+ if (Character.isDigit(ch)) {
+ out append ch
+ intg(i+1)
+ } else i
+ }
+ }
+ def frac(i: Int): Int = {
+ if (i == buf.length) return i
+ val ch = buf(i).toChar
+ ch match {
+ case 'e' | 'E' =>
+ out append ch
+ expo(i+1, signed = false)
+ case _ =>
+ if (Character.isDigit(ch)) {
+ out append ch
+ frac(i+1)
+ } else i
+ }
+ }
+ def expo(i: Int, signed: Boolean): Int = {
+ if (i == buf.length) return i
+ val ch = buf(i).toChar
+ ch match {
+ case '+' | '-' if !signed =>
+ out append ch
+ expo(i+1, signed = true)
+ case _ =>
+ if (Character.isDigit(ch)) {
+ out append ch
+ expo(i+1, signed)
+ } else i
+ }
+ }
+ intg(i)
+ out.toString
+ }
+
+ @tailrec def parse(pre: String, i: Int): Unit = {
+ out append pre
+ if (i == buf.length) return
+ buf(i) match {
+ case '\n' =>
+ parse("\n", i+1)
+ case ' ' =>
+ parse(" ", i+1)
+ case '&' =>
+ parse("&amp;", i+1)
+ case '<' if i+1 < buf.length =>
+ val ch = buf(i+1).toChar
+ if (ch == '-' || ch == ':' || ch == '%')
+ parse("<span class=\"kw\">&lt;"+ch+"</span>", i+2)
+ else
+ parse("&lt;", i+1)
+ case '>' =>
+ if (i+1 < buf.length && buf(i+1) == ':')
+ parse("<span class=\"kw\">&gt;:</span>", i+2)
+ else
+ parse("&gt;", i+1)
+ case '=' =>
+ if (i+1 < buf.length && buf(i+1) == '>')
+ parse("<span class=\"kw\">=&gt;</span>", i+2)
+ else
+ parse(buf(i).toChar.toString, i+1)
+ case '/' =>
+ if (i+1 < buf.length && (buf(i+1) == '/' || buf(i+1) == '*')) {
+ val c = comment(i+1)
+ parse("<span class=\"cmt\">"+c+"</span>", i+c.length)
+ } else
+ parse(buf(i).toChar.toString, i+1)
+ case '\'' =>
+ val s = charlit(i+1)
+ if (s.length > 0)
+ parse("<span class=\"lit\">"+s+"</span>", i+s.length)
+ else
+ parse(buf(i).toChar.toString, i+1)
+ case '"' =>
+ val s = strlit(i+1)
+ parse("<span class=\"lit\">"+s+"</span>", i+s.length)
+ case '@' =>
+ val k = lookup(annotations, i+1)
+ if (k >= 0)
+ parse("<span class=\"ano\">@"+annotations(k)+"</span>", i+annotations(k).length+1)
+ else
+ parse(buf(i).toChar.toString, i+1)
+ case _ =>
+ if (i == 0 || (i >= 1 && !Character.isJavaIdentifierPart(buf(i-1).toChar))) {
+ if (Character.isDigit(buf(i)) ||
+ (buf(i) == '.' && i + 1 < buf.length && Character.isDigit(buf(i+1)))) {
+ val s = numlit(i)
+ parse("<span class=\"num\">"+s+"</span>", i+s.length)
+ } else {
+ val k = lookup(reserved, i)
+ if (k >= 0)
+ parse("<span class=\"kw\">"+reserved(k)+"</span>", i+reserved(k).length)
+ else {
+ val k = lookup(standards, i)
+ if (k >= 0)
+ parse("<span class=\"std\">"+standards(k)+"</span>", i+standards(k).length)
+ else
+ parse(buf(i).toChar.toString, i+1)
+ }
+ }
+ } else
+ parse(buf(i).toChar.toString, i+1)
+ }
+ }
+
+ parse("", 0)
+ scala.xml.Unparsed(out.toString)
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/Index.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/Index.scala
new file mode 100644
index 0000000000..c034647320
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/Index.scala
@@ -0,0 +1,133 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author David Bernard, Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc
+package doc
+package html
+package page
+
+import model._
+import scala.collection._
+import scala.xml._
+
+class Index(universe: doc.Universe, val index: doc.Index) extends HtmlPage {
+
+ def path = List("index.html")
+
+ def title = {
+ val s = universe.settings
+ ( if (!s.doctitle.isDefault) s.doctitle.value else "" ) +
+ ( if (!s.docversion.isDefault) (" " + s.docversion.value) else "" )
+ }
+
+ val headers =
+ <xml:group>
+ <link href={ relativeLinkTo{List("index.css", "lib")} } media="screen" type="text/css" rel="stylesheet"/>
+ <script type="text/javascript" src={ relativeLinkTo{List("jquery.js", "lib")} }></script>
+ <script type="text/javascript" src={ relativeLinkTo{List("jquery-ui.js", "lib")} }></script>
+ <script type="text/javascript" src={ relativeLinkTo{List("jquery.layout.js", "lib")} }></script>
+ <script type="text/javascript" src={ relativeLinkTo{List("index.js", "lib")} }></script>
+ <script type="text/javascript" src={ relativeLinkTo{List("scheduler.js", "lib")} }></script>
+ </xml:group>
+
+ val body =
+ <body>
+ <div id="library">
+ <img class='class icon' src={ relativeLinkTo{List("class.png", "lib")} }/>
+ <img class='trait icon' src={ relativeLinkTo{List("trait.png", "lib")} }/>
+ <img class='object icon' src={ relativeLinkTo{List("object.png", "lib")} }/>
+ <img class='package icon' src={ relativeLinkTo{List("package.png", "lib")} }/>
+ </div>
+ { browser }
+ <div id="content" class="ui-layout-center">
+ <iframe id="template" name="template" src={ relativeLinkTo{List("package.html")} }/>
+ </div>
+ </body>
+
+ def letters: NodeSeq =
+ '_' +: ('a' to 'z') map {
+ char => {
+ val label = if (char == '_') '#' else char.toUpper
+
+ index.firstLetterIndex.get(char) match {
+ case Some(_) =>
+ <a target="template" href={ "index/index-" + char + ".html" }>{
+ label
+ }</a>
+ case None => <span>{ label }</span>
+ }
+ }
+ }
+
+ def browser =
+ <div id="browser" class="ui-layout-west">
+ <div class="ui-west-center">
+ <div id="filter">
+ <div id="textfilter"></div>
+ <div id="letters">{ letters }</div>
+ </div>
+ <div class="pack" id="tpl">{
+ def packageElem(pack: model.Package): NodeSeq = {
+ <xml:group>
+ { if (!pack.isRootPackage)
+ <a class="tplshow" href={ relativeLinkTo(pack) } target="template">{ pack.qualifiedName }</a>
+ else NodeSeq.Empty
+ }
+ <ol class="templates">{
+ val tpls: Map[String, Seq[DocTemplateEntity]] =
+ (pack.templates collect {
+ case t: DocTemplateEntity if !t.isPackage && !universe.settings.hardcoded.isExcluded(t.qualifiedName) => t
+ }) groupBy (_.name)
+
+ val placeholderSeq: NodeSeq = <div class="placeholder"></div>
+
+ def createLink(entity: DocTemplateEntity, includePlaceholder: Boolean, includeText: Boolean) = {
+ val entityType = kindToString(entity)
+ val linkContent = (
+ { if (includePlaceholder) placeholderSeq else NodeSeq.Empty }
+ ++
+ { if (includeText) <span class="tplLink">{ Text(packageQualifiedName(entity)) }</span> else NodeSeq.Empty }
+ )
+ <a class="tplshow" href={ relativeLinkTo(entity) } target="template"><span class={ entityType }>({ Text(entityType) })</span>{ linkContent }</a>
+ }
+
+ for (tn <- tpls.keySet.toSeq sortBy (_.toLowerCase)) yield {
+ val entities = tpls(tn)
+ val row = (entities find (e => e.isPackage || e.isObject), entities find (e => e.isTrait || e.isClass))
+
+ val itemContents = row match {
+ case (Some(obj), None) => createLink(obj, includePlaceholder = true, includeText = true)
+
+ case (maybeObj, Some(template)) =>
+ val firstLink = maybeObj match {
+ case Some(obj) => createLink(obj, includePlaceholder = false, includeText = false)
+ case None => placeholderSeq
+ }
+
+ firstLink ++ createLink(template, includePlaceholder = false, includeText = true)
+
+ case _ => // FIXME: this default case should not be necessary. For some reason AnyRef is not a package, object, trait, or class
+ val entry = entities.head
+ placeholderSeq ++ createLink(entry, includePlaceholder = false, includeText = true)
+ }
+
+ <li title={ entities.head.qualifiedName }>{ itemContents }</li>
+ }
+ }</ol>
+ <ol class="packages"> {
+ for (sp <- pack.packages sortBy (_.name.toLowerCase)) yield
+ <li class="pack" title={ sp.qualifiedName }>{ packageElem(sp) }</li>
+ }</ol>
+ </xml:group>
+ }
+ packageElem(universe.rootPackage)
+ }</div></div><script src="index.js"></script>
+ </div>
+
+ def packageQualifiedName(ety: DocTemplateEntity): String =
+ if (ety.inTemplate.isPackage) ety.name
+ else (packageQualifiedName(ety.inTemplate) + "." + ety.name)
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala
new file mode 100644
index 0000000000..e3c94505ab
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/IndexScript.scala
@@ -0,0 +1,69 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author David Bernard, Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc.doc.html.page
+
+import scala.tools.nsc.doc
+import scala.tools.nsc.doc.model.{Package, DocTemplateEntity}
+import scala.tools.nsc.doc.html.{Page, HtmlFactory}
+import scala.util.parsing.json.{JSONObject, JSONArray}
+
+class IndexScript(universe: doc.Universe, index: doc.Index) extends Page {
+ def path = List("index.js")
+
+ override def writeFor(site: HtmlFactory) {
+ writeFile(site) {
+ _.write("Index.PACKAGES = " + packages.toString() + ";")
+ }
+ }
+
+ val packages = {
+ val pairs = allPackagesWithTemplates.toIterable.map(_ match {
+ case (pack, templates) => {
+ val merged = mergeByQualifiedName(templates)
+
+ val ary = merged.keys.toList.sortBy(_.toLowerCase).map(key => {
+ val pairs = merged(key).map(
+ t => kindToString(t) -> relativeLinkTo(t)
+ ) :+ ("name" -> key)
+
+ JSONObject(scala.collection.immutable.Map(pairs : _*))
+ })
+
+ pack.qualifiedName -> JSONArray(ary)
+ }
+ }).toSeq
+
+ JSONObject(scala.collection.immutable.Map(pairs : _*))
+ }
+
+ def mergeByQualifiedName(source: List[DocTemplateEntity]) = {
+ var result = Map[String, List[DocTemplateEntity]]()
+
+ for (t <- source) {
+ val k = t.qualifiedName
+ result += k -> (result.getOrElse(k, List()) :+ t)
+ }
+
+ result
+ }
+
+ def allPackages = {
+ def f(parent: Package): List[Package] = {
+ parent.packages.flatMap(
+ p => f(p) :+ p
+ )
+ }
+ f(universe.rootPackage).sortBy(_.toString)
+ }
+
+ def allPackagesWithTemplates = {
+ Map(allPackages.map((key) => {
+ key -> key.templates.collect {
+ case t: DocTemplateEntity if !t.isPackage && !universe.settings.hardcoded.isExcluded(t.qualifiedName) => t
+ }
+ }) : _*)
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/ReferenceIndex.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/ReferenceIndex.scala
new file mode 100755
index 0000000000..84ee82f994
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/ReferenceIndex.scala
@@ -0,0 +1,61 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Pedro Furlanetto
+ */
+
+package scala
+package tools
+package nsc
+package doc
+package html
+package page
+
+import doc.model._
+
+class ReferenceIndex(letter: Char, index: doc.Index, universe: Universe) extends HtmlPage {
+
+ def path = List("index-"+letter+".html", "index")
+
+ def title = {
+ val s = universe.settings
+ ( if (!s.doctitle.isDefault) s.doctitle.value else "" ) +
+ ( if (!s.docversion.isDefault) (" " + s.docversion.value) else "" )
+ }
+
+ def headers =
+ <xml:group>
+ <link href={ relativeLinkTo(List("ref-index.css", "lib")) } media="screen" type="text/css" rel="stylesheet"/>
+ <script type="text/javascript" src={ relativeLinkTo{List("jquery.js", "lib")} }></script>
+ </xml:group>
+
+
+ private def entry(name: String, methods: Iterable[MemberEntity]) = {
+ val occurrences = methods.map(method => {
+ val html = templateToHtml(method.inDefinitionTemplates.head)
+ if (method.deprecation.isDefined) {
+ <strike>{ html }</strike>
+ } else {
+ html
+ }
+ }).toList.distinct
+
+ <div class="entry">
+ <div class="name">{
+ if (methods.find { ! _.deprecation.isDefined } != None)
+ name
+ else
+ <strike>{ name }</strike>
+ }</div>
+ <div class="occurrences">{
+ for (owner <- occurrences) yield owner ++ scala.xml.Text(" ")
+ }</div>
+ </div>
+ }
+
+ def body =
+ <body>{
+ for(groups <- index.firstLetterIndex(letter)) yield
+ entry(groups._1, groups._2.view)
+ }</body>
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala
new file mode 100644
index 0000000000..37145756d9
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/Source.scala
@@ -0,0 +1,127 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author David Bernard, Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc
+package doc
+package html
+package page
+
+import scala.xml.NodeSeq
+import java.io.File
+
+class Source(sourceFile: File) extends HtmlPage {
+
+ val path = List("source.html")
+
+ val title = "Scaladoc: page source"
+
+ val headers =
+ NodeSeq.Empty
+
+ val body =
+ <body>
+ <h1>Page source is not implemented yet</h1>
+ </body>
+
+ /*
+
+
+ def readTextFromSrcDir(subPath: String) :Option[String] = {
+ readTextFromFile(new File(sourceDir, subPath))
+ }
+
+ def readTextFromFile(f : File) :Option[String] = {
+ if (f.exists) {
+ Some(Source.fromFile(f)(Codec.default).getLines().mkString(""))
+ } else {
+ None
+ }
+ }
+
+
+ def writeTextToFile(f : File, txt : String, header: Option[String], footer: Option[String]) {
+ val out = new FileOutputStream(f)
+ try {
+ val enc = "UTF-8"
+ header.foreach(s => out.write(s.getBytes(enc)))
+ out.write(txt.getBytes(enc))
+ footer.foreach(s => out.write(s.getBytes(enc)))
+ } finally {
+ try {
+ out.close()
+ } catch {
+ case _ => //ignore
+ }
+ }
+ }
+
+ trait SourceHtmlizer {
+ def scalaToHtml(src :File) : Option[File]
+ }
+
+ lazy val sourceHtmlizer : SourceHtmlizer = {
+ if (cfg.htmlizeSource) {
+ new SourceHtmlizer {
+
+ val inDir: File = cfg.sourcedir
+ val outDir: File = cfg.outputdir
+
+ private def relativize(uri: URI, from: URI) = linkHelper.relativize(uri, from).getOrElse("__notFound__" + uri.getPath)
+
+ def header(dest: URI) = Some("""
+ <html>
+ <head>
+ <link href='""" + relativize(new URI("site:/_highlighter/SyntaxHighlighter.css"), dest) + """' rel='stylesheet' type='text/css'/>
+ <script language='javascript' src='""" + relativize(new URI("site:/_highlighter/shAll.js"), dest) + """'></script>
+ </head>
+ <body>
+ <pre name="code" class="scala" style="width:100%">
+ """)
+
+ def footer(dest: URI) = Some("""</pre>
+ <script language='javascript'>
+ dp.SyntaxHighlighter.ClipboardSwf = '""" + relativize(new URI("site:/_highlighter/clipboard.swf"), dest) + """';
+ dp.SyntaxHighlighter.HighlightAll('code');
+ </script>
+ </body>
+ </html>
+ """)
+
+ //TODO: escape the source code
+ def scalaToHtml(src :File) = {
+ val dest = new File(outDir, fileHelper.relativePathUnderDir(src, inDir) + ".html")
+ if (!dest.exists || dest.lastModified < src.lastModified) {
+
+ //we need to verify whether the directory we are trying to write to has already been created or not
+ if(!dest.getParentFile.exists) dest.getParentFile.mkdirs
+
+ val uri = linkHelper.uriFor(dest).get
+ var txt = fileHelper.readTextFromFile(src).getOrElse("")
+ txt = txt.replace("<", "&lt;")
+ fileHelper.writeTextToFile(dest, txt, header(uri), footer(uri))
+ }
+ Some(dest)
+ }
+
+ def copyResources() {
+ val loader = this.getClass().getClassLoader()
+ val buf = new Array[Byte](1024)
+ def copyResource(name: String) = fileHelper.copyResource("/scala/tools/nsc/doc/html/resource/", name, outDir, loader, buf)
+ copyResource("_highlighter/clipboard.swf")
+ copyResource("_highlighter/shAll.js")
+ copyResource("_highlighter/SyntaxHighlighter.css")
+ }
+
+ copyResources()
+ }
+ } else {
+ new SourceHtmlizer {
+ def scalaToHtml(src :File) = None
+ }
+ }
+ }
+ */
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/Template.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/Template.scala
new file mode 100644
index 0000000000..119d4e0143
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/Template.scala
@@ -0,0 +1,980 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author David Bernard, Manohar Jonnalagedda
+ */
+
+package scala
+package tools
+package nsc
+package doc
+package html
+package page
+
+import base._
+import base.comment._
+
+import model._
+import model.diagram._
+import scala.xml.{ NodeSeq, Text, UnprefixedAttribute }
+import scala.language.postfixOps
+import scala.collection.mutable. { Set, HashSet }
+
+import model._
+import model.diagram._
+import diagram._
+
+class Template(universe: doc.Universe, generator: DiagramGenerator, tpl: DocTemplateEntity) extends HtmlPage {
+
+ val path =
+ templateToPath(tpl)
+
+ def title = {
+ val s = universe.settings
+
+ tpl.name +
+ ( if (!s.doctitle.isDefault) " - " + s.doctitle.value else "" ) +
+ ( if (!s.docversion.isDefault) (" " + s.docversion.value) else "" ) +
+ " - " + tpl.qualifiedName
+ }
+
+ val headers =
+ <xml:group>
+ <link href={ relativeLinkTo{List("template.css", "lib")} } media="screen" type="text/css" rel="stylesheet"/>
+ <link href={ relativeLinkTo{List("diagrams.css", "lib")} } media="screen" type="text/css" rel="stylesheet" id="diagrams-css" />
+ <script type="text/javascript" src={ relativeLinkTo{List("jquery.js", "lib")} } id="jquery-js"></script>
+ <script type="text/javascript" src={ relativeLinkTo{List("jquery-ui.js", "lib")} }></script>
+ <script type="text/javascript" src={ relativeLinkTo{List("template.js", "lib")} }></script>
+ <script type="text/javascript" src={ relativeLinkTo{List("tools.tooltip.js", "lib")} }></script>
+ { if (universe.settings.docDiagrams.value) {
+ <script type="text/javascript" src={ relativeLinkTo{List("modernizr.custom.js", "lib")} }></script>
+ <script type="text/javascript" src={ relativeLinkTo{List("diagrams.js", "lib")} } id="diagrams-js"></script>
+ } else NodeSeq.Empty }
+ <script type="text/javascript">
+ if(top === self) {{
+ var url = '{ val p = templateToPath(tpl); "../" * (p.size - 1) + "index.html" }';
+ var hash = '{ val p = templateToPath(tpl); (p.tail.reverse ::: List(p.head.replace(".html", ""))).mkString(".") }';
+ var anchor = window.location.hash;
+ var anchor_opt = '';
+ if (anchor.length { scala.xml.Unparsed(">=") /* unless we use Unparsed, it gets escaped and crashes the script */ } 1)
+ anchor_opt = '@' + anchor.substring(1);
+ window.location.href = url + '#' + hash + anchor_opt;
+ }}
+ </script>
+ </xml:group>
+
+ val valueMembers =
+ tpl.methods ++ tpl.values ++ tpl.templates.filter(x => x.isObject || x.isPackage) sorted
+
+ val (absValueMembers, nonAbsValueMembers) =
+ valueMembers partition (_.isAbstract)
+
+ val (deprValueMembers, nonDeprValueMembers) =
+ nonAbsValueMembers partition (_.deprecation.isDefined)
+
+ val (concValueMembers, shadowedImplicitMembers) =
+ nonDeprValueMembers partition (!_.isShadowedOrAmbiguousImplicit)
+
+ val typeMembers =
+ tpl.abstractTypes ++ tpl.aliasTypes ++ tpl.templates.filter(x => x.isTrait || x.isClass) sorted (implicitly[Ordering[MemberEntity]])
+
+ val constructors = (tpl match {
+ case cls: Class => (cls.constructors: List[MemberEntity]).sorted
+ case _ => Nil
+ })
+
+ /* 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. */
+ val body = {
+ 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>
+ case _ =>
+ templateName
+ }
+ val owner = {
+ if (tpl.isRootPackage || tpl.inTemplate.isRootPackage)
+ NodeSeq.Empty
+ else
+ <p id="owner">{ templatesToHtml(tpl.inTemplate.toRoot.reverse.tail, scala.xml.Text(".")) }</p>
+ }
+
+ <body class={ if (tpl.isType) "type" else "value" }>
+ <div id="definition">
+ {
+ tpl.companion match {
+ case Some(companion) if (companion.visibility.isPublic && companion.inSource != None) =>
+ <a href={relativeLinkTo(companion)} title="Go to companion"><img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/></a>
+ case _ =>
+ <img src={ relativeLinkTo(List(docEntityKindToBigImage(tpl), "lib")) }/>
+ }}
+ { owner }
+ <h1>{ displayName }</h1>
+ </div>
+
+ { signature(tpl, isSelf = true) }
+ { memberToCommentHtml(tpl, tpl.inTemplate, isSelf = true) }
+
+ <div id="mbrsel">
+ <div id='textfilter'><span class='pre'/><span class='input'><input id='mbrsel-input' type='text' accesskey='/'/></span><span class='post'/></div>
+ { if (tpl.linearizationTemplates.isEmpty && tpl.conversions.isEmpty && (!universe.settings.docGroups.value || (tpl.members.map(_.group).distinct.length == 1)))
+ NodeSeq.Empty
+ else
+ <div id="order">
+ <span class="filtertype">Ordering</span>
+ <ol>
+ {
+ if (!universe.settings.docGroups.value || (tpl.members.map(_.group).distinct.length == 1))
+ NodeSeq.Empty
+ else
+ <li class="group out"><span>Grouped</span></li>
+ }
+ <li class="alpha in"><span>Alphabetic</span></li>
+ {
+ if (tpl.linearizationTemplates.isEmpty && tpl.conversions.isEmpty)
+ NodeSeq.Empty
+ else
+ <li class="inherit out"><span>By inheritance</span></li>
+ }
+ </ol>
+ </div>
+ }
+ { if (tpl.linearizationTemplates.isEmpty && tpl.conversions.isEmpty) NodeSeq.Empty else
+ {
+ if (!tpl.linearizationTemplates.isEmpty)
+ <div id="ancestors">
+ <span class="filtertype">Inherited<br/>
+ </span>
+ <ol id="linearization">
+ { (tpl :: tpl.linearizationTemplates).map(wte => <li class="in" name={ wte.qualifiedName }><span>{ wte.name }</span></li>) }
+ </ol>
+ </div>
+ else NodeSeq.Empty
+ } ++ {
+ if (!tpl.conversions.isEmpty)
+ <div id="ancestors">
+ <span class="filtertype">Implicitly<br/>
+ </span>
+ <ol id="implicits"> {
+ tpl.conversions.map { conv =>
+ val name = conv.conversionQualifiedName
+ val hide = universe.settings.hiddenImplicits(name)
+ <li class="in" name={ name } data-hidden={ hide.toString }><span>{ "by " + conv.conversionShortName }</span></li>
+ }
+ }
+ </ol>
+ </div>
+ else NodeSeq.Empty
+ } ++
+ <div id="ancestors">
+ <span class="filtertype"></span>
+ <ol>
+ <li class="hideall out"><span>Hide All</span></li>
+ <li class="showall in"><span>Show all</span></li>
+ </ol>
+ <a href="http://docs.scala-lang.org/overviews/scaladoc/usage.html#members" target="_blank">Learn more about member selection</a>
+ </div>
+ }
+ {
+ <div id="visbl">
+ <span class="filtertype">Visibility</span>
+ <ol><li class="public in"><span>Public</span></li><li class="all out"><span>All</span></li></ol>
+ </div>
+ }
+ </div>
+
+ <div id="template">
+ <div id="allMembers">
+ { if (constructors.isEmpty) NodeSeq.Empty else
+ <div id="constructors" class="members">
+ <h3>Instance Constructors</h3>
+ <ol>{ constructors map (memberToHtml(_, tpl)) }</ol>
+ </div>
+ }
+
+ { if (typeMembers.isEmpty) NodeSeq.Empty else
+ <div id="types" class="types members">
+ <h3>Type Members</h3>
+ <ol>{ typeMembers map (memberToHtml(_, tpl)) }</ol>
+ </div>
+ }
+
+ { if (absValueMembers.isEmpty) NodeSeq.Empty else
+ <div id="values" class="values members">
+ <h3>Abstract Value Members</h3>
+ <ol>{ absValueMembers map (memberToHtml(_, tpl)) }</ol>
+ </div>
+ }
+
+ { if (concValueMembers.isEmpty) NodeSeq.Empty else
+ <div id="values" class="values members">
+ <h3>{ if (absValueMembers.isEmpty) "Value Members" else "Concrete Value Members" }</h3>
+ <ol>{ concValueMembers map (memberToHtml(_, tpl)) }</ol>
+ </div>
+ }
+
+ { if (shadowedImplicitMembers.isEmpty) NodeSeq.Empty else
+ <div id="values" class="values members">
+ <h3>Shadowed Implicit Value Members</h3>
+ <ol>{ shadowedImplicitMembers map (memberToHtml(_, tpl)) }</ol>
+ </div>
+ }
+
+ { if (deprValueMembers.isEmpty) NodeSeq.Empty else
+ <div id="values" class="values members">
+ <h3>Deprecated Value Members</h3>
+ <ol>{ deprValueMembers map (memberToHtml(_, tpl)) }</ol>
+ </div>
+ }
+ </div>
+
+ <div id="inheritedMembers">
+ {
+ // linearization
+ NodeSeq fromSeq (for ((superTpl, superType) <- (tpl.linearizationTemplates zip tpl.linearizationTypes)) yield
+ <div class="parent" name={ superTpl.qualifiedName }>
+ <h3>Inherited from {
+ typeToHtmlWithStupidTypes(tpl, superTpl, superType)
+ }</h3>
+ </div>
+ )
+ }
+ {
+ // implicitly inherited
+ NodeSeq fromSeq (for (conversion <- (tpl.conversions)) yield
+ <div class="conversion" name={ conversion.conversionQualifiedName }>
+ <h3>Inherited by implicit conversion { conversion.conversionShortName } from
+ { typeToHtml(tpl.resultType, hasLinks = true) } to { typeToHtml(conversion.targetType, hasLinks = true) }
+ </h3>
+ </div>
+ )
+ }
+ </div>
+
+ <div id="groupedMembers">
+ {
+ val allGroups = tpl.members.map(_.group).distinct
+ val orderedGroups = allGroups.map(group => (tpl.groupPriority(group), group)).sorted.map(_._2)
+ // linearization
+ NodeSeq fromSeq (for (group <- orderedGroups) yield
+ <div class="group" name={ group }>
+ <h3>{ tpl.groupName(group) }</h3>
+ {
+ tpl.groupDescription(group) match {
+ case Some(body) => <div class="comment cmt">{ bodyToHtml(body) }</div>
+ case _ => NodeSeq.Empty
+ }
+ }
+ </div>
+ )
+ }
+ </div>
+
+ </div>
+
+ <div id="tooltip" ></div>
+
+ {
+ if (Set("epfl", "EPFL").contains(tpl.universe.settings.docfooter.value))
+ <div id="footer">Scala programming documentation. Copyright (c) 2003-2013 <a href="http://www.epfl.ch" target="_top">EPFL</a>, with contributions from <a href="http://typesafe.com" target="_top">Typesafe</a>.</div>
+ else
+ <div id="footer"> { tpl.universe.settings.docfooter.value } </div>
+ }
+
+
+ </body>
+ }
+
+ def memberToHtml(mbr: MemberEntity, inTpl: DocTemplateEntity): NodeSeq = {
+ val memberComment = memberToCommentHtml(mbr, inTpl, isSelf = false)
+ <li name={ mbr.definitionName } visbl={ if (mbr.visibility.isProtected) "prt" else "pub" }
+ data-isabs={ mbr.isAbstract.toString }
+ fullComment={ if(memberComment.filter(_.label=="div").isEmpty) "no" else "yes" }
+ group={ mbr.group }>
+ <a id={ mbr.signature }/>
+ <a id={ mbr.signatureCompat }/>
+ { signature(mbr, isSelf = false) }
+ { memberComment }
+ </li>
+ }
+
+ def memberToCommentHtml(mbr: MemberEntity, inTpl: DocTemplateEntity, isSelf: Boolean): NodeSeq = {
+ mbr match {
+ case dte: DocTemplateEntity if isSelf =>
+ // comment of class itself
+ <xml:group>
+ <div id="comment" class="fullcommenttop">{ memberToCommentBodyHtml(mbr, inTpl, isSelf = true) }</div>
+ </xml:group>
+ case dte: DocTemplateEntity if mbr.comment.isDefined =>
+ // comment of inner, documented class (only short comment, full comment is on the class' own page)
+ memberToInlineCommentHtml(mbr, isSelf)
+ case _ =>
+ // comment of non-class member or non-documentented inner class
+ val commentBody = memberToCommentBodyHtml(mbr, inTpl, isSelf = false)
+ if (commentBody.isEmpty)
+ NodeSeq.Empty
+ else {
+ val shortComment = memberToShortCommentHtml(mbr, isSelf)
+ val longComment = memberToUseCaseCommentHtml(mbr, isSelf) ++ memberToCommentBodyHtml(mbr, inTpl, isSelf)
+
+ val includedLongComment = if (shortComment.text.trim == longComment.text.trim)
+ NodeSeq.Empty
+ else
+ <div class="fullcomment">{ longComment }</div>
+
+ shortComment ++ includedLongComment
+ }
+ }
+ }
+
+ def memberToUseCaseCommentHtml(mbr: MemberEntity, isSelf: Boolean): NodeSeq = {
+ mbr match {
+ case nte: NonTemplateMemberEntity if nte.isUseCase =>
+ inlineToHtml(comment.Text("[use case] "))
+ case _ => NodeSeq.Empty
+ }
+ }
+
+ def memberToShortCommentHtml(mbr: MemberEntity, isSelf: Boolean): NodeSeq =
+ mbr.comment.fold(NodeSeq.Empty) { comment =>
+ <p class="shortcomment cmt">{ memberToUseCaseCommentHtml(mbr, isSelf) }{ inlineToHtml(comment.short) }</p>
+ }
+
+ def memberToInlineCommentHtml(mbr: MemberEntity, isSelf: Boolean): NodeSeq =
+ <p class="comment cmt">{ inlineToHtml(mbr.comment.get.short) }</p>
+
+ def memberToCommentBodyHtml(mbr: MemberEntity, inTpl: DocTemplateEntity, isSelf: Boolean, isReduced: Boolean = false): NodeSeq = {
+ val s = universe.settings
+
+ 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 paramCommentToHtml(prs: List[ParameterEntity], comment: Comment): NodeSeq = prs match {
+
+ case (tp: TypeParam) :: rest =>
+ val paramEntry: NodeSeq = {
+ <dt class="tparam">{ tp.name }</dt><dd class="cmt">{ bodyToHtml(comment.typeParams(tp.name)) }</dd>
+ }
+ paramEntry ++ paramCommentToHtml(rest, comment)
+
+ case (vp: ValueParam) :: rest =>
+ val paramEntry: NodeSeq = {
+ <dt class="param">{ vp.name }</dt><dd class="cmt">{ bodyToHtml(comment.valueParams(vp.name)) }</dd>
+ }
+ paramEntry ++ paramCommentToHtml(rest, comment)
+
+ case _ =>
+ NodeSeq.Empty
+ }
+
+ mbr.comment.fold(NodeSeq.Empty) { comment =>
+ val cmtedPrs = prs filter {
+ case tp: TypeParam => comment.typeParams isDefinedAt tp.name
+ case vp: ValueParam => comment.valueParams isDefinedAt vp.name
+ }
+ if (cmtedPrs.isEmpty && comment.result.isEmpty) NodeSeq.Empty
+ else {
+ <dl class="paramcmts block">{
+ paramCommentToHtml(cmtedPrs, comment) ++ (
+ comment.result match {
+ case None => NodeSeq.Empty
+ case Some(cmt) =>
+ <dt>returns</dt><dd class="cmt">{ bodyToHtml(cmt) }</dd>
+ })
+ }</dl>
+ }
+ }
+ }
+
+ val implicitInformation = mbr.byConversion match {
+ case Some(conv) =>
+ <dt class="implicit">Implicit information</dt> ++
+ {
+ val targetType = typeToHtml(conv.targetType, hasLinks = true)
+ val conversionMethod = conv.convertorMethod match {
+ case Left(member) => Text(member.name)
+ case Right(name) => Text(name)
+ }
+
+ // strip off the package object endings, they make things harder to follow
+ val conversionOwnerQualifiedNane = conv.convertorOwner.qualifiedName.stripSuffix(".package")
+ val conversionOwner = templateToHtml(conv.convertorOwner, conversionOwnerQualifiedNane)
+
+ val constraintText = conv.constraints match {
+ case Nil =>
+ NodeSeq.Empty
+ case List(constraint) =>
+ scala.xml.Text("This conversion will take place only if ") ++ constraintToHtml(constraint) ++ scala.xml.Text(".")
+ case List(constraint1, constraint2) =>
+ scala.xml.Text("This conversion will take place only if ") ++ constraintToHtml(constraint1) ++
+ scala.xml.Text(" and at the same time ") ++ constraintToHtml(constraint2) ++ scala.xml.Text(".")
+ case constraints =>
+ <br/> ++ "This conversion will take place only if all of the following constraints are met:" ++ <br/> ++ {
+ var index = 0
+ constraints map { constraint => scala.xml.Text({ index += 1; index } + ". ") ++ constraintToHtml(constraint) ++ <br/> }
+ }
+ }
+
+ <dd>
+ This member is added by an implicit conversion from { typeToHtml(inTpl.resultType, hasLinks = true) } to
+ { targetType } performed by method { conversionMethod } in { conversionOwner }.
+ { constraintText }
+ </dd>
+ } ++ {
+ if (mbr.isShadowedOrAmbiguousImplicit) {
+ // These are the members that are shadowing or ambiguating the current implicit
+ // see ImplicitMemberShadowing trait for more information
+ val shadowingSuggestion = {
+ val params = mbr match {
+ case d: Def => d.valueParams map (_ map (_ name) mkString("(", ", ", ")")) mkString
+ case _ => "" // no parameters
+ }
+ <br/> ++ scala.xml.Text("To access this member you can use a ") ++
+ <a href="http://stackoverflow.com/questions/2087250/what-is-the-purpose-of-type-ascription-in-scala"
+ target="_blank">type ascription</a> ++ scala.xml.Text(":") ++
+ <br/> ++ <div class="cmt"><pre>{"(" + Template.lowerFirstLetter(tpl.name) + ": " + conv.targetType.name + ")." + mbr.name + params }</pre></div>
+ }
+
+ val shadowingWarning: NodeSeq =
+ if (mbr.isShadowedImplicit)
+ scala.xml.Text("This implicitly inherited member is shadowed by one or more members in this " +
+ "class.") ++ shadowingSuggestion
+ else if (mbr.isAmbiguousImplicit)
+ scala.xml.Text("This implicitly inherited member is ambiguous. One or more implicitly " +
+ "inherited members have similar signatures, so calling this member may produce an ambiguous " +
+ "implicit conversion compiler error.") ++ shadowingSuggestion
+ else NodeSeq.Empty
+
+ <dt class="implicit">Shadowing</dt> ++
+ <dd>{ shadowingWarning }</dd>
+
+ } else NodeSeq.Empty
+ }
+ case _ =>
+ NodeSeq.Empty
+ }
+
+ // --- start attributes block vals
+ val attributes: NodeSeq = {
+ val fvs: List[comment.Paragraph] = visibility(mbr).toList
+ if (fvs.isEmpty || isReduced) NodeSeq.Empty
+ else {
+ <dt>Attributes</dt>
+ <dd>{ fvs map { fv => { inlineToHtml(fv.text) ++ scala.xml.Text(" ") } } }</dd>
+ }
+ }
+
+ val definitionClasses: NodeSeq = {
+ val inDefTpls = mbr.inDefinitionTemplates
+ if ((inDefTpls.tail.isEmpty && (inDefTpls.head == inTpl)) || isReduced) NodeSeq.Empty
+ else {
+ <dt>Definition Classes</dt>
+ <dd>{ templatesToHtml(inDefTpls, scala.xml.Text(" → ")) }</dd>
+ }
+ }
+
+ val fullSignature: NodeSeq = {
+ mbr match {
+ case nte: NonTemplateMemberEntity if nte.isUseCase =>
+ <div class="full-signature-block toggleContainer">
+ <span class="toggle">Full Signature</span>
+ <div class="hiddenContent full-signature-usecase">{ signature(nte.useCaseOf.get,isSelf = true) }</div>
+ </div>
+ case _ => NodeSeq.Empty
+ }
+ }
+
+ val selfType: NodeSeq = 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: NodeSeq = {
+ // A list of annotations which don't show their arguments, e. g. because they are shown separately.
+ val annotationsWithHiddenArguments = List("deprecated", "Deprecated", "migration")
+
+ def showArguments(annotation: Annotation) =
+ !(annotationsWithHiddenArguments.contains(annotation.qualifiedName))
+
+ if (!mbr.annotations.isEmpty) {
+ <dt>Annotations</dt>
+ <dd>{
+ mbr.annotations.map { annot =>
+ <xml:group>
+ <span class="name">@{ templateToHtml(annot.annotationClass) }</span>{
+ if (showArguments(annot)) argumentsToHtml(annot.arguments) else NodeSeq.Empty
+ }
+ </xml:group>
+ }
+ }
+ </dd>
+ } else NodeSeq.Empty
+ }
+
+ val sourceLink: NodeSeq = mbr match {
+ case dtpl: DocTemplateEntity if (isSelf && dtpl.sourceUrl.isDefined && dtpl.inSource.isDefined && !isReduced) =>
+ val (absFile, _) = dtpl.inSource.get
+ <dt>Source</dt>
+ <dd>{ <a href={ dtpl.sourceUrl.get.toString } target="_blank">{ Text(absFile.file.getName) }</a> }</dd>
+ case _ => NodeSeq.Empty
+ }
+
+ val deprecation: NodeSeq =
+ mbr.deprecation match {
+ case Some(deprecation) if !isReduced =>
+ <dt>Deprecated</dt>
+ <dd class="cmt">{ bodyToHtml(deprecation) }</dd>
+ case _ => NodeSeq.Empty
+ }
+
+ val migration: NodeSeq =
+ mbr.migration match {
+ case Some(migration) if !isReduced =>
+ <dt>Migration</dt>
+ <dd class="cmt">{ bodyToHtml(migration) }</dd>
+ case _ => NodeSeq.Empty
+ }
+
+ val mainComment: NodeSeq = mbr.comment match {
+ case Some(comment) if (! isReduced) =>
+ def orEmpty[T](it: Iterable[T])(gen: =>NodeSeq): NodeSeq =
+ if (it.isEmpty) NodeSeq.Empty else gen
+
+ val example =
+ orEmpty(comment.example) {
+ <div class="block">Example{ if (comment.example.length > 1) "s" else ""}:
+ <ol>{
+ val exampleXml: List[NodeSeq] = for (ex <- comment.example) yield
+ <li class="cmt">{ bodyToHtml(ex) }</li>
+ exampleXml.reduceLeft(_ ++ Text(", ") ++ _)
+ }</ol>
+ </div>
+ }
+
+ val version: NodeSeq =
+ orEmpty(comment.version) {
+ <dt>Version</dt>
+ <dd>{ for(body <- comment.version.toList) yield bodyToHtml(body) }</dd>
+ }
+
+ val sinceVersion: NodeSeq =
+ orEmpty(comment.since) {
+ <dt>Since</dt>
+ <dd>{ for(body <- comment.since.toList) yield bodyToHtml(body) }</dd>
+ }
+
+ val note: NodeSeq =
+ orEmpty(comment.note) {
+ <dt>Note</dt>
+ <dd>{
+ val noteXml: List[NodeSeq] = for(note <- comment.note ) yield <span class="cmt">{bodyToHtml(note)}</span>
+ noteXml.reduceLeft(_ ++ Text(", ") ++ _)
+ }</dd>
+ }
+
+ val seeAlso: NodeSeq =
+ orEmpty(comment.see) {
+ <dt>See also</dt>
+ <dd>{
+ val seeXml: List[NodeSeq] = for(see <- comment.see ) yield <span class="cmt">{bodyToHtml(see)}</span>
+ seeXml.reduceLeft(_ ++ _)
+ }</dd>
+ }
+
+ val exceptions: NodeSeq =
+ orEmpty(comment.throws) {
+ <dt>Exceptions thrown</dt>
+ <dd>{
+ val exceptionsXml: List[NodeSeq] =
+ for((name, body) <- comment.throws.toList.sortBy(_._1) ) yield
+ <span class="cmt">{Text(name) ++ bodyToHtml(body)}</span>
+ exceptionsXml.reduceLeft(_ ++ Text("") ++ _)
+ }</dd>
+ }
+
+ val todo: NodeSeq =
+ orEmpty(comment.todo) {
+ <dt>To do</dt>
+ <dd>{
+ val todoXml: List[NodeSeq] = (for(todo <- comment.todo ) yield <span class="cmt">{bodyToHtml(todo)}</span> )
+ todoXml.reduceLeft(_ ++ Text(", ") ++ _)
+ }</dd>
+ }
+
+ example ++ version ++ sinceVersion ++ exceptions ++ todo ++ note ++ seeAlso
+
+ case _ => NodeSeq.Empty
+ }
+ // end attributes block vals ---
+
+ val attributesInfo = implicitInformation ++ attributes ++ definitionClasses ++ fullSignature ++ selfType ++ annotations ++ deprecation ++ migration ++ sourceLink ++ 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 block">
+ <span class="toggle">Linear Supertypes</span>
+ <div class="superTypes hiddenContent">{
+ typesToHtml(dtpl.linearizationTypes, hasLinks = true, sep = scala.xml.Text(", "))
+ }</div>
+ </div>
+ case _ => NodeSeq.Empty
+ }
+
+ val subclasses = mbr match {
+ case dtpl: DocTemplateEntity if isSelf && !isReduced =>
+ val subs: Set[DocTemplateEntity] = HashSet.empty
+ def transitive(dtpl: DocTemplateEntity) {
+ for (sub <- dtpl.directSubClasses if !(subs contains sub)) {
+ subs add sub
+ transitive(sub)
+ }
+ }
+ transitive(dtpl)
+ if (subs.nonEmpty)
+ <div class="toggleContainer block">
+ <span class="toggle">Known Subclasses</span>
+ <div class="subClasses hiddenContent">{
+ templatesToHtml(subs.toList.sortBy(_.name), scala.xml.Text(", "))
+ }</div>
+ </div>
+ else NodeSeq.Empty
+ case _ => NodeSeq.Empty
+ }
+
+ def createDiagram(f: DocTemplateEntity => Option[Diagram], description: String, id: String): NodeSeq =
+ if (s.docDiagrams.value) mbr match {
+ case dtpl: DocTemplateEntity if isSelf && !isReduced =>
+ val diagram = f(dtpl)
+ if (diagram.isDefined) {
+ val diagramSvg = generator.generate(diagram.get, tpl, this)
+ if (diagramSvg != NodeSeq.Empty) {
+ <div class="toggleContainer block diagram-container" id={ id + "-container"}>
+ <span class="toggle diagram-link">{ description }</span>
+ <a href="http://docs.scala-lang.org/overviews/scaladoc/usage.html#diagrams" target="_blank" class="diagram-help">Learn more about scaladoc diagrams</a>
+ <div class="diagram" id={ id }>{
+ diagramSvg
+ }</div>
+ </div>
+ } else NodeSeq.Empty
+ } else NodeSeq.Empty
+ case _ => NodeSeq.Empty
+ } else NodeSeq.Empty // diagrams not generated
+
+ val typeHierarchy = createDiagram(_.inheritanceDiagram, "Type Hierarchy", "inheritance-diagram")
+ val contentHierarchy = createDiagram(_.contentDiagram, "Content Hierarchy", "content-diagram")
+
+ memberComment ++ paramComments ++ attributesBlock ++ linearization ++ subclasses ++ typeHierarchy ++ contentHierarchy
+ }
+
+ def boundsToHtml(hi: Option[TypeEntity], lo: Option[TypeEntity], hasLinks: Boolean): NodeSeq = {
+ def bound0(bnd: Option[TypeEntity], pre: String): NodeSeq = bnd match {
+ case None => NodeSeq.Empty
+ case Some(tpe) => scala.xml.Text(pre) ++ typeToHtml(tpe, hasLinks)
+ }
+ bound0(lo, " >: ") ++ bound0(hi, " <: ")
+ }
+
+ def visibility(mbr: MemberEntity): Option[comment.Paragraph] = {
+ import comment._
+ import comment.{ Text => CText }
+ mbr.visibility match {
+ case PrivateInInstance() =>
+ Some(Paragraph(CText("private[this]")))
+ case PrivateInTemplate(owner) if (owner == mbr.inTemplate) =>
+ Some(Paragraph(CText("private")))
+ case PrivateInTemplate(owner) =>
+ Some(Paragraph(Chain(List(CText("private["), EntityLink(comment.Text(owner.qualifiedName), LinkToTpl(owner)), CText("]")))))
+ case ProtectedInInstance() =>
+ Some(Paragraph(CText("protected[this]")))
+ case ProtectedInTemplate(owner) if (owner == mbr.inTemplate) =>
+ Some(Paragraph(CText("protected")))
+ case ProtectedInTemplate(owner) =>
+ Some(Paragraph(Chain(List(CText("protected["), EntityLink(comment.Text(owner.qualifiedName), LinkToTpl(owner)), CText("]")))))
+ case Public() =>
+ None
+ }
+ }
+
+ /** name, tparams, params, result */
+ def signature(mbr: MemberEntity, isSelf: Boolean, isReduced: Boolean = false): NodeSeq = {
+ def inside(hasLinks: Boolean, nameLink: String = ""): NodeSeq =
+ <xml:group>
+ <span class="modifier_kind">
+ <span class="modifier">{ mbr.flags.map(flag => inlineToHtml(flag.text) ++ scala.xml.Text(" ")) }</span>
+ <span class="kind">{ kindToString(mbr) }</span>
+ </span>
+ <span class="symbol">
+ {
+ val nameClass =
+ if (mbr.isImplicitlyInherited)
+ if (mbr.isShadowedOrAmbiguousImplicit)
+ "implicit shadowed"
+ else
+ "implicit"
+ else
+ "name"
+
+ val nameHtml = {
+ val value = if (mbr.isConstructor) tpl.name else mbr.name
+ val span = if (mbr.deprecation.isDefined)
+ <span class={ nameClass + " deprecated"} title={"Deprecated: "+bodyToStr(mbr.deprecation.get)}>{ value }</span>
+ else
+ <span class={ nameClass }>{ value }</span>
+ val encoded = scala.reflect.NameTransformer.encode(value)
+ if (encoded != value) {
+ span % new UnprefixedAttribute("title",
+ "gt4s: " + encoded +
+ span.attribute("title").map(
+ node => ". " + node
+ ).getOrElse(""),
+ scala.xml.Null)
+ } else {
+ span
+ }
+ }
+ if (!nameLink.isEmpty)
+ <a href={nameLink}>{nameHtml}</a>
+ else nameHtml
+ }{
+ def tparamsToHtml(mbr: Any): NodeSeq = mbr match {
+ case hk: HigherKinded =>
+ val tpss = hk.typeParams
+ if (tpss.isEmpty) NodeSeq.Empty else {
+ def tparam0(tp: TypeParam): NodeSeq =
+ <span name={ tp.name }>{ tp.variance + tp.name }{ tparamsToHtml(tp) }{ boundsToHtml(tp.hi, tp.lo, hasLinks)}</span>
+ def tparams0(tpss: List[TypeParam]): NodeSeq = (tpss: @unchecked) match {
+ case tp :: Nil => tparam0(tp)
+ case tp :: tps => tparam0(tp) ++ Text(", ") ++ tparams0(tps)
+ }
+ <span class="tparams">[{ tparams0(tpss) }]</span>
+ }
+ case _ => NodeSeq.Empty
+ }
+ tparamsToHtml(mbr)
+ }{
+ if (isReduced) NodeSeq.Empty else {
+ def paramsToHtml(vlsss: List[List[ValueParam]]): NodeSeq = {
+ def param0(vl: ValueParam): NodeSeq =
+ // notice the }{ in the next lines, they are necessary to avoid an 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>
+
+ def params0(vlss: List[ValueParam]): NodeSeq = vlss match {
+ case Nil => NodeSeq.Empty
+ case vl :: Nil => param0(vl)
+ case vl :: vls => param0(vl) ++ Text(", ") ++ params0(vls)
+ }
+ def implicitCheck(vlss: List[ValueParam]): NodeSeq = vlss match {
+ case vl :: vls => if(vl.isImplicit) { <span class="implicit">implicit </span> } else Text("")
+ case _ => Text("")
+ }
+ vlsss map { vlss => <span class="params">({implicitCheck(vlss) ++ params0(vlss) })</span> }
+ }
+ mbr match {
+ case cls: Class => paramsToHtml(cls.valueParams)
+ case ctr: Constructor => paramsToHtml(ctr.valueParams)
+ case dfe: Def => paramsToHtml(dfe.valueParams)
+ case _ => NodeSeq.Empty
+ }
+ }
+ }{ if (isReduced) NodeSeq.Empty else {
+ mbr match {
+ case tme: MemberEntity if (tme.isDef || tme.isVal || tme.isLazyVal || tme.isVar) =>
+ <span class="result">: { typeToHtml(tme.resultType, hasLinks) }</span>
+
+ case abt: MemberEntity with AbstractType =>
+ val b2s = boundsToHtml(abt.hi, abt.lo, hasLinks)
+ if (b2s != NodeSeq.Empty)
+ <span class="result">{ b2s }</span>
+ else NodeSeq.Empty
+
+ case alt: MemberEntity with AliasType =>
+ <span class="result"> = { typeToHtml(alt.alias, hasLinks) }</span>
+
+ case tpl: MemberTemplateEntity if !tpl.parentTypes.isEmpty =>
+ <span class="result"> extends { typeToHtml(tpl.parentTypes.map(_._2), hasLinks) }</span>
+
+ case _ => NodeSeq.Empty
+ }
+ }}
+ </span>
+ </xml:group>
+ mbr match {
+ case dte: DocTemplateEntity if !isSelf =>
+ <h4 class="signature">{ inside(hasLinks = true, nameLink = relativeLinkTo(dte)) }</h4>
+ case _ if isSelf =>
+ <h4 id="signature" class="signature">{ inside(hasLinks = true) }</h4>
+ case _ =>
+ <h4 class="signature">{ inside(hasLinks = true) }</h4>
+ }
+
+ }
+
+ /** */
+ def treeToHtml(tree: TreeEntity): NodeSeq = {
+
+ /** Makes text good looking in the html page : newlines and basic indentation,
+ * You must change this function if you want to improve pretty printing of default Values
+ */
+ def codeStringToXml(text: String): NodeSeq = {
+ var goodLookingXml: NodeSeq = NodeSeq.Empty
+ var indent = 0
+ for (c <- text) c match {
+ case '{' => indent+=1
+ goodLookingXml ++= Text("{")
+ case '}' => indent-=1
+ goodLookingXml ++= Text("}")
+ case '\n' =>
+ goodLookingXml++= <br/> ++ indentation
+ case _ => goodLookingXml ++= Text(c.toString)
+ }
+ def indentation:NodeSeq = {
+ var indentXml = NodeSeq.Empty
+ for (x <- 1 to indent) indentXml ++= Text("&nbsp;&nbsp;")
+ indentXml
+ }
+ goodLookingXml
+ }
+
+ var index = 0
+ val str = tree.expression
+ val length = str.length
+ var myXml: NodeSeq = NodeSeq.Empty
+ for ((from, (member, to)) <- tree.refEntity.toSeq) {
+ if (index < from) {
+ myXml ++= codeStringToXml(str.substring(index,from))
+ index = from
+ }
+ if (index == from) {
+ member match {
+ case mbr: DocTemplateEntity =>
+ val link = relativeLinkTo(mbr)
+ myXml ++= <span class="name"><a href={link}>{str.substring(from, to)}</a></span>
+ case mbr: MemberEntity =>
+ val anchor = "#" + mbr.signature
+ val link = relativeLinkTo(mbr.inTemplate)
+ myXml ++= <span class="name"><a href={link ++ anchor}>{str.substring(from, to)}</a></span>
+ }
+ index = to
+ }
+ }
+
+ if (index <= length-1)
+ myXml ++= codeStringToXml(str.substring(index, length ))
+
+ if (length < 36)
+ <span class="symbol">{ myXml }</span>
+ else
+ <span class="defval" name={ myXml }>{ "..." }</span>
+ }
+
+ private def argumentsToHtml(argss: List[ValueArgument]): NodeSeq = {
+ def argumentsToHtml0(argss: List[ValueArgument]): NodeSeq = argss match {
+ case Nil => NodeSeq.Empty
+ case arg :: Nil => argumentToHtml(arg)
+ case arg :: args => argumentToHtml(arg) ++ scala.xml.Text(", ") ++ argumentsToHtml0(args)
+ }
+ <span class="args">({ argumentsToHtml0(argss) })</span>
+ }
+
+ private def argumentToHtml(arg: ValueArgument): NodeSeq = {
+ <span>
+ {
+ arg.parameter match {
+ case Some(param) => Text(param.name + " = ")
+ case None => NodeSeq.Empty
+ }
+ }
+ { treeToHtml(arg.value) }
+ </span>
+ }
+
+ private def bodyToStr(body: comment.Body): String =
+ body.blocks flatMap (blockToStr(_)) mkString ""
+
+ private def blockToStr(block: comment.Block): String = block match {
+ case comment.Paragraph(in) => inlineToStr(in)
+ case _ => block.toString
+ }
+
+ private def inlineToStr(inl: comment.Inline): String = inl match {
+ case comment.Chain(items) => items flatMap (inlineToStr(_)) mkString ""
+ case comment.Italic(in) => inlineToStr(in)
+ case comment.Bold(in) => inlineToStr(in)
+ case comment.Underline(in) => inlineToStr(in)
+ case comment.Monospace(in) => inlineToStr(in)
+ case comment.Text(text) => text
+ case comment.Summary(in) => inlineToStr(in)
+ case _ => inl.toString
+ }
+
+ private def typeToHtmlWithStupidTypes(tpl: TemplateEntity, superTpl: TemplateEntity, superType: TypeEntity): NodeSeq =
+ if (tpl.universe.settings.useStupidTypes.value)
+ superTpl match {
+ case dtpl: DocTemplateEntity =>
+ val sig = signature(dtpl, isSelf = false, isReduced = true) \ "_"
+ sig
+ case tpl: TemplateEntity =>
+ Text(tpl.name)
+ }
+ else
+ typeToHtml(superType, hasLinks = true)
+
+ private def constraintToHtml(constraint: Constraint): NodeSeq = constraint match {
+ case ktcc: KnownTypeClassConstraint =>
+ scala.xml.Text(ktcc.typeExplanation(ktcc.typeParamName) + " (" + ktcc.typeParamName + ": ") ++
+ templateToHtml(ktcc.typeClassEntity) ++ scala.xml.Text(")")
+ case tcc: TypeClassConstraint =>
+ scala.xml.Text(tcc.typeParamName + " is ") ++
+ <a href="http://stackoverflow.com/questions/2982276/what-is-a-context-bound-in-scala" target="_blank">
+ context-bounded</a> ++ scala.xml.Text(" by " + tcc.typeClassEntity.qualifiedName + " (" + tcc.typeParamName + ": ") ++
+ templateToHtml(tcc.typeClassEntity) ++ scala.xml.Text(")")
+ case impl: ImplicitInScopeConstraint =>
+ scala.xml.Text("an implicit value of type ") ++ typeToHtml(impl.implicitType, hasLinks = true) ++ scala.xml.Text(" is in scope")
+ case eq: EqualTypeParamConstraint =>
+ scala.xml.Text(eq.typeParamName + " is " + eq.rhs.name + " (" + eq.typeParamName + " =:= ") ++
+ typeToHtml(eq.rhs, hasLinks = true) ++ scala.xml.Text(")")
+ case bt: BoundedTypeParamConstraint =>
+ scala.xml.Text(bt.typeParamName + " is a superclass of " + bt.lowerBound.name + " and a subclass of " +
+ bt.upperBound.name + " (" + bt.typeParamName + " >: ") ++
+ typeToHtml(bt.lowerBound, hasLinks = true) ++ scala.xml.Text(" <: ") ++
+ typeToHtml(bt.upperBound, hasLinks = true) ++ scala.xml.Text(")")
+ case lb: LowerBoundedTypeParamConstraint =>
+ scala.xml.Text(lb.typeParamName + " is a superclass of " + lb.lowerBound.name + " (" + lb.typeParamName + " >: ") ++
+ typeToHtml(lb.lowerBound, hasLinks = true) ++ scala.xml.Text(")")
+ case ub: UpperBoundedTypeParamConstraint =>
+ scala.xml.Text(ub.typeParamName + " is a subclass of " + ub.upperBound.name + " (" + ub.typeParamName + " <: ") ++
+ typeToHtml(ub.upperBound, hasLinks = true) ++ scala.xml.Text(")")
+ }
+}
+
+object Template {
+ /* Vlad: Lesson learned the hard way: don't put any stateful code that references the model here,
+ * it won't be garbage collected and you'll end up filling the heap with garbage */
+
+ def lowerFirstLetter(s: String) = if (s.length >= 1) s.substring(0,1).toLowerCase() + s.substring(1) else s
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramGenerator.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramGenerator.scala
new file mode 100644
index 0000000000..61c1819d11
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramGenerator.scala
@@ -0,0 +1,53 @@
+/**
+ * @author Damien Obrist
+ * @author Vlad Ureche
+ */
+package scala.tools.nsc
+package doc
+package html
+package page
+package diagram
+
+import scala.xml.NodeSeq
+import scala.tools.nsc.doc.html.HtmlPage
+import scala.tools.nsc.doc.model.diagram.Diagram
+import scala.tools.nsc.doc.model.DocTemplateEntity
+
+trait DiagramGenerator {
+
+ /**
+ * Generates a visualization of the internal representation
+ * of a diagram.
+ *
+ * @param d The model of the diagram
+ * @param p The page the diagram will be embedded in (needed for link generation)
+ * @return The HTML to be embedded in the Scaladoc page
+ */
+ def generate(d: Diagram, t: DocTemplateEntity, p: HtmlPage):NodeSeq
+}
+
+object DiagramGenerator {
+
+ // TODO: This is tailored towards the dot generator, since it's the only generator. In the future it should be more
+ // general.
+
+ private[this] var dotRunner: DotRunner = null
+ private[this] var settings: doc.Settings = null
+
+ def initialize(s: doc.Settings) =
+ settings = s
+
+ def getDotRunner() = {
+ if (dotRunner == null)
+ dotRunner = new DotRunner(settings)
+ dotRunner
+ }
+
+ def cleanup() = {
+ DiagramStats.printStats(settings)
+ if (dotRunner != null) {
+ dotRunner.cleanup()
+ dotRunner = null
+ }
+ }
+} \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala
new file mode 100644
index 0000000000..ab8e9e2756
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala
@@ -0,0 +1,66 @@
+/**
+ * @author Vlad Ureche
+ */
+package scala.tools.nsc.doc
+package html.page.diagram
+
+object DiagramStats {
+
+ class TimeTracker(title: String) {
+ var totalTime: Long = 0l
+ var maxTime: Long = 0l
+ var instances: Int = 0
+
+ def addTime(ms: Long) = {
+ if (maxTime < ms)
+ maxTime = ms
+ totalTime += ms
+ instances += 1
+ }
+
+ def printStats(print: String => Unit) = {
+ if (instances == 0)
+ print(title + ": no stats gathered")
+ else {
+ print(" " + title)
+ print(" " + "=" * title.length)
+ print(" count: " + instances + " items")
+ print(" total time: " + totalTime + " ms")
+ print(" average time: " + (totalTime/instances) + " ms")
+ print(" maximum time: " + maxTime + " ms")
+ print("")
+ }
+ }
+ }
+
+ private[this] val filterTrack = new TimeTracker("diagrams model filtering")
+ private[this] val modelTrack = new TimeTracker("diagrams model generation")
+ private[this] val dotGenTrack = new TimeTracker("dot diagram generation")
+ private[this] val dotRunTrack = new TimeTracker("dot process runnning")
+ private[this] val svgTrack = new TimeTracker("svg processing")
+ private[this] var brokenImages = 0
+ private[this] var fixedImages = 0
+
+ def printStats(settings: Settings) = {
+ if (settings.docDiagramsDebug) {
+ settings.printMsg("\nDiagram generation running time breakdown:\n")
+ filterTrack.printStats(settings.printMsg)
+ modelTrack.printStats(settings.printMsg)
+ dotGenTrack.printStats(settings.printMsg)
+ dotRunTrack.printStats(settings.printMsg)
+ svgTrack.printStats(settings.printMsg)
+ println(" Broken images: " + brokenImages)
+ println(" Fixed images: " + fixedImages)
+ println("")
+ }
+ }
+
+ def addFilterTime(ms: Long) = filterTrack.addTime(ms)
+ def addModelTime(ms: Long) = modelTrack.addTime(ms)
+ def addDotGenerationTime(ms: Long) = dotGenTrack.addTime(ms)
+ def addDotRunningTime(ms: Long) = dotRunTrack.addTime(ms)
+ def addSvgTime(ms: Long) = svgTrack.addTime(ms)
+
+ def addBrokenImage(): Unit = brokenImages += 1
+ def addFixedImage(): Unit = fixedImages += 1
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala
new file mode 100644
index 0000000000..4ff436bdc6
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala
@@ -0,0 +1,508 @@
+/**
+ * @author Damien Obrist
+ * @author Vlad Ureche
+ */
+package scala
+package tools
+package nsc
+package doc
+package html
+package page
+package diagram
+
+import scala.xml.{NodeSeq, XML, PrefixedAttribute, Elem, MetaData, Null, UnprefixedAttribute}
+import scala.collection.immutable._
+import model._
+import model.diagram._
+
+class DotDiagramGenerator(settings: doc.Settings) extends DiagramGenerator {
+
+ // the page where the diagram will be embedded
+ private var page: HtmlPage = null
+ // path to the "lib" folder relative to the page
+ private var pathToLib: String = null
+ // maps nodes to unique indices
+ private var node2Index: Map[Node, Int] = null
+ // true if the current diagram is a class diagram
+ private var isInheritanceDiagram = false
+ // incoming implicit nodes (needed for determining the CSS class of a node)
+ private var incomingImplicitNodes: List[Node] = List()
+ // the suffix used when there are two many classes to show
+ private final val MultiSuffix = " classes/traits"
+ // used to generate unique node and edge ids (i.e. avoid conflicts with multiple diagrams)
+ private var counter = 0
+
+ def generate(diagram: Diagram, template: DocTemplateEntity, page: HtmlPage):NodeSeq = {
+ counter = counter + 1
+ this.page = page
+ pathToLib = "../" * (page.templateToPath(template).size - 1) + "lib/"
+ val dot = generateDot(diagram)
+ val result = generateSVG(dot, template)
+ // clean things up a bit, so we don't leave garbage on the heap
+ this.page = null
+ node2Index = null
+ incomingImplicitNodes = List()
+ result
+ }
+
+ /**
+ * Generates a dot string for a given diagram.
+ */
+ private def generateDot(d: Diagram) = {
+ // inheritance nodes (all nodes except thisNode and implicit nodes)
+ var nodes: List[Node] = null
+ // inheritance edges (all edges except implicit edges)
+ var edges: List[(Node, List[Node])] = null
+
+ // timing
+ var tDot = -System.currentTimeMillis
+
+ // variables specific to class diagrams:
+ // current node of a class diagram
+ var thisNode:Node = null
+ var subClasses = List[Node]()
+ var superClasses = List[Node]()
+ var incomingImplicits = List[Node]()
+ var outgoingImplicits = List[Node]()
+ isInheritanceDiagram = false
+
+ d match {
+ case InheritanceDiagram(_thisNode, _superClasses, _subClasses, _incomingImplicits, _outgoingImplicits) =>
+
+ def textTypeEntity(text: String) =
+ new TypeEntity {
+ val name = text
+ def refEntity: SortedMap[Int, (base.LinkTo, Int)] = SortedMap()
+ }
+
+ // it seems dot chokes on node names over 8000 chars, so let's limit the size of the string
+ // conservatively, we'll limit at 4000, to be sure:
+ def limitSize(str: String) = if (str.length > 4000) str.substring(0, 3996) + " ..." else str
+
+ // avoid overcrowding the diagram:
+ // if there are too many super / sub / implicit nodes, represent
+ // them by on node with a corresponding tooltip
+ superClasses = if (_superClasses.length > settings.docDiagramsMaxNormalClasses.value) {
+ val superClassesTooltip = Some(limitSize(_superClasses.map(_.tpe.name).mkString(", ")))
+ List(NormalNode(textTypeEntity(_superClasses.length + MultiSuffix), None)(superClassesTooltip))
+ } else _superClasses
+
+ subClasses = if (_subClasses.length > settings.docDiagramsMaxNormalClasses.value) {
+ val subClassesTooltip = Some(limitSize(_subClasses.map(_.tpe.name).mkString(", ")))
+ List(NormalNode(textTypeEntity(_subClasses.length + MultiSuffix), None)(subClassesTooltip))
+ } else _subClasses
+
+ incomingImplicits = if (_incomingImplicits.length > settings.docDiagramsMaxImplicitClasses.value) {
+ val incomingImplicitsTooltip = Some(limitSize(_incomingImplicits.map(_.tpe.name).mkString(", ")))
+ List(ImplicitNode(textTypeEntity(_incomingImplicits.length + MultiSuffix), None)(incomingImplicitsTooltip))
+ } else _incomingImplicits
+
+ outgoingImplicits = if (_outgoingImplicits.length > settings.docDiagramsMaxImplicitClasses.value) {
+ val outgoingImplicitsTooltip = Some(limitSize(_outgoingImplicits.map(_.tpe.name).mkString(", ")))
+ List(ImplicitNode(textTypeEntity(_outgoingImplicits.length + MultiSuffix), None)(outgoingImplicitsTooltip))
+ } else _outgoingImplicits
+
+ thisNode = _thisNode
+ nodes = List()
+ edges = (thisNode -> superClasses) :: subClasses.map(_ -> List(thisNode))
+ node2Index = (thisNode::subClasses:::superClasses:::incomingImplicits:::outgoingImplicits).zipWithIndex.toMap
+ isInheritanceDiagram = true
+ incomingImplicitNodes = incomingImplicits
+ case _ =>
+ nodes = d.nodes
+ edges = d.edges
+ node2Index = d.nodes.zipWithIndex.toMap
+ incomingImplicitNodes = List()
+ }
+
+ val implicitsDot = {
+ if (!isInheritanceDiagram) ""
+ else {
+ // dot cluster containing thisNode
+ val thisCluster = "subgraph clusterThis {\n" +
+ "style=\"invis\"\n" +
+ node2Dot(thisNode) +
+ "}"
+ // dot cluster containing incoming implicit nodes, if any
+ val incomingCluster = {
+ if(incomingImplicits.isEmpty) ""
+ else "subgraph clusterIncoming {\n" +
+ "style=\"invis\"\n" +
+ incomingImplicits.reverse.map(n => node2Dot(n)).mkString +
+ (if (incomingImplicits.size > 1)
+ incomingImplicits.map(n => "node" + node2Index(n)).mkString(" -> ") +
+ " [constraint=\"false\", style=\"invis\", minlen=\"0.0\"];\n"
+ else "") +
+ "}"
+ }
+ // dot cluster containing outgoing implicit nodes, if any
+ val outgoingCluster = {
+ if(outgoingImplicits.isEmpty) ""
+ else "subgraph clusterOutgoing {\n" +
+ "style=\"invis\"\n" +
+ outgoingImplicits.reverse.map(n => node2Dot(n)).mkString +
+ (if (outgoingImplicits.size > 1)
+ outgoingImplicits.map(n => "node" + node2Index(n)).mkString(" -> ") +
+ " [constraint=\"false\", style=\"invis\", minlen=\"0.0\"];\n"
+ else "") +
+ "}"
+ }
+
+ // assemble clusters into another cluster
+ val incomingTooltip = incomingImplicits.map(_.name).mkString(", ") + " can be implicitly converted to " + thisNode.name
+ val outgoingTooltip = thisNode.name + " can be implicitly converted to " + outgoingImplicits.map(_.name).mkString(", ")
+ "subgraph clusterAll {\n" +
+ "style=\"invis\"\n" +
+ outgoingCluster + "\n" +
+ thisCluster + "\n" +
+ incomingCluster + "\n" +
+ // incoming implicit edge
+ (if (!incomingImplicits.isEmpty) {
+ val n = incomingImplicits.last
+ "node" + node2Index(n) +" -> node" + node2Index(thisNode) +
+ " [id=\"" + cssClass(n, thisNode) + "|" + node2Index(n) + "_" + node2Index(thisNode) + "\", tooltip=\"" + incomingTooltip + "\"" +
+ ", constraint=\"false\", minlen=\"2\", ltail=\"clusterIncoming\", lhead=\"clusterThis\", label=\"implicitly\"];\n"
+ } else "") +
+ // outgoing implicit edge
+ (if (!outgoingImplicits.isEmpty) {
+ val n = outgoingImplicits.head
+ "node" + node2Index(thisNode) + " -> node" + node2Index(n) +
+ " [id=\"" + cssClass(thisNode, n) + "|" + node2Index(thisNode) + "_" + node2Index(n) + "\", tooltip=\"" + outgoingTooltip + "\"" +
+ ", constraint=\"false\", minlen=\"2\", ltail=\"clusterThis\", lhead=\"clusterOutgoing\", label=\"implicitly\"];\n"
+ } else "") +
+ "}"
+ }
+ }
+
+ // assemble graph
+ val graph = "digraph G {\n" +
+ // graph / node / edge attributes
+ graphAttributesStr +
+ "node [" + nodeAttributesStr + "];\n" +
+ "edge [" + edgeAttributesStr + "];\n" +
+ implicitsDot + "\n" +
+ // inheritance nodes
+ nodes.map(n => node2Dot(n)).mkString +
+ subClasses.map(n => node2Dot(n)).mkString +
+ superClasses.map(n => node2Dot(n)).mkString +
+ // inheritance edges
+ edges.map{ case (from, tos) => tos.map(to => {
+ val id = "graph" + counter + "_" + node2Index(to) + "_" + node2Index(from)
+ // the X -> Y edge is inverted twice to keep the diagram flowing the right way
+ // that is, an edge from node X to Y will result in a dot instruction nodeY -> nodeX [dir="back"]
+ "node" + node2Index(to) + " -> node" + node2Index(from) +
+ " [id=\"" + cssClass(to, from) + "|" + id + "\", " +
+ "tooltip=\"" + from.name + (if (from.name.endsWith(MultiSuffix)) " are subtypes of " else " is a subtype of ") +
+ to.name + "\", dir=\"back\", arrowtail=\"empty\"];\n"
+ }).mkString}.mkString +
+ "}"
+
+ tDot += System.currentTimeMillis
+ DiagramStats.addDotGenerationTime(tDot)
+
+ graph
+ }
+
+ /**
+ * Generates the dot string of a given node.
+ */
+ private def node2Dot(node: Node) = {
+
+ // escape HTML characters in node names
+ def escape(name: String) = name.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")
+
+ // assemble node attribues in a map
+ val attr = scala.collection.mutable.Map[String, String]()
+
+ // link
+ node.doctpl match {
+ case Some(tpl) => attr += "URL" -> (page.relativeLinkTo(tpl) + "#inheritance-diagram")
+ case _ =>
+ }
+
+ // tooltip
+ node.tooltip match {
+ case Some(text) => attr += "tooltip" -> text
+ // show full name where available (instead of TraversableOps[A] show scala.collection.parallel.TraversableOps[A])
+ case None if node.tpl.isDefined => attr += "tooltip" -> node.tpl.get.qualifiedName
+ case _ =>
+ }
+
+ // styles
+ if(node.isImplicitNode)
+ attr ++= implicitStyle
+ else if(node.isOutsideNode)
+ attr ++= outsideStyle
+ else if(node.isTraitNode)
+ attr ++= traitStyle
+ else if(node.isClassNode)
+ attr ++= classStyle
+ else if(node.isObjectNode)
+ attr ++= objectStyle
+ else if(node.isTypeNode)
+ attr ++= typeStyle
+ else
+ attr ++= defaultStyle
+
+ // HTML label
+ var name = escape(node.name)
+ var img = ""
+ if(node.isTraitNode)
+ img = "trait_diagram.png"
+ else if(node.isClassNode)
+ img = "class_diagram.png"
+ else if(node.isObjectNode)
+ img = "object_diagram.png"
+ else if(node.isTypeNode)
+ img = "type_diagram.png"
+
+ if(!img.equals("")) {
+ img = "<TD><IMG SCALE=\"TRUE\" SRC=\"" + settings.outdir.value + "/lib/" + img + "\" /></TD>"
+ name = name + " "
+ }
+ val label = "<<TABLE BORDER=\"0\" CELLBORDER=\"0\">" +
+ "<TR>" + img + "<TD VALIGN=\"MIDDLE\">" + name + "</TD></TR>" +
+ "</TABLE>>"
+
+ // dot does not allow to specify a CSS class, therefore
+ // set the id to "{class}|{id}", which will be used in
+ // the transform method
+ val id = "graph" + counter + "_" + node2Index(node)
+ attr += ("id" -> (cssClass(node) + "|" + id))
+
+ // return dot string
+ "node" + node2Index(node) + " [label=" + label + "," + flatten(attr.toMap) + "];\n"
+ }
+
+ /**
+ * Returns the CSS class for an edge connecting node1 and node2.
+ */
+ private def cssClass(node1: Node, node2: Node): String = {
+ if (node1.isImplicitNode && node2.isThisNode)
+ "implicit-incoming"
+ else if (node1.isThisNode && node2.isImplicitNode)
+ "implicit-outgoing"
+ else
+ "inheritance"
+ }
+
+ /**
+ * Returns the CSS class for a node.
+ */
+ private def cssClass(node: Node): String =
+ if (node.isImplicitNode && incomingImplicitNodes.contains(node))
+ "implicit-incoming" + cssBaseClass(node, "", " ")
+ else if (node.isImplicitNode)
+ "implicit-outgoing" + cssBaseClass(node, "", " ")
+ else if (node.isThisNode)
+ "this" + cssBaseClass(node, "", " ")
+ else if (node.isOutsideNode)
+ "outside" + cssBaseClass(node, "", " ")
+ else
+ cssBaseClass(node, "default", "")
+
+ private def cssBaseClass(node: Node, default: String, space: String) =
+ if (node.isClassNode)
+ space + "class"
+ else if (node.isTraitNode)
+ space + "trait"
+ else if (node.isObjectNode)
+ space + "object"
+ else if (node.isTypeNode)
+ space + "type"
+ else
+ default
+
+ /**
+ * Calls dot with a given dot string and returns the SVG output.
+ */
+ private def generateSVG(dotInput: String, template: DocTemplateEntity) = {
+ val dotOutput = DiagramGenerator.getDotRunner().feedToDot(dotInput, template)
+ var tSVG = -System.currentTimeMillis
+
+ val result = if (dotOutput != null) {
+ val src = scala.io.Source.fromString(dotOutput)
+ try {
+ val cpa = scala.xml.parsing.ConstructingParser.fromSource(src, preserveWS = false)
+ val doc = cpa.document()
+ if (doc != null)
+ transform(doc.docElem)
+ else
+ NodeSeq.Empty
+ } catch {
+ case exc: Exception =>
+ if (settings.docDiagramsDebug) {
+ settings.printMsg("\n\n**********************************************************************")
+ settings.printMsg("Encountered an error while generating page for " + template.qualifiedName)
+ settings.printMsg(dotInput.toString.split("\n").mkString("\nDot input:\n\t","\n\t",""))
+ settings.printMsg(dotOutput.toString.split("\n").mkString("\nDot output:\n\t","\n\t",""))
+ settings.printMsg(exc.getStackTrace.mkString("\nException: " + exc.toString + ":\n\tat ", "\n\tat ",""))
+ settings.printMsg("\n\n**********************************************************************")
+ } else {
+ settings.printMsg("\nThe diagram for " + template.qualifiedName + " could not be created due to an internal error.")
+ settings.printMsg("Use " + settings.docDiagramsDebug.name + " for more information and please file this as a bug.")
+ }
+ NodeSeq.Empty
+ }
+ } else
+ NodeSeq.Empty
+
+ tSVG += System.currentTimeMillis
+ DiagramStats.addSvgTime(tSVG)
+
+ result
+ }
+
+ /**
+ * Transforms the SVG generated by dot:
+ * - adds a class attribute to the SVG element
+ * - changes the path of the node images from absolute to relative
+ * - assigns id and class attributes to nodes and edges
+ * - removes title elements
+ */
+ private def transform(e:scala.xml.Node): scala.xml.Node = e match {
+ // add an id and class attribute to the SVG element
+ case Elem(prefix, "svg", attribs, scope, child @ _*) => {
+ val klass = if (isInheritanceDiagram) "class-diagram" else "package-diagram"
+ Elem(prefix, "svg", attribs, scope, child map(x => transform(x)) : _*) %
+ new UnprefixedAttribute("id", "graph" + counter, Null) %
+ new UnprefixedAttribute("class", klass, Null)
+ }
+ // change the path of the node images from absolute to relative
+ case img @ <image></image> => {
+ val href = (img \ "@{http://www.w3.org/1999/xlink}href").toString
+ val file = href.substring(href.lastIndexOf("/") + 1, href.size)
+ img.asInstanceOf[Elem] %
+ new PrefixedAttribute("xlink", "href", pathToLib + file, Null)
+ }
+ // assign id and class attributes to edges and nodes:
+ // the id attribute generated by dot has the format: "{class}|{id}"
+ case g @ Elem(prefix, "g", attribs, scope, children @ _*) if (List("edge", "node").contains((g \ "@class").toString)) => {
+ var res = new Elem(prefix, "g", attribs, scope, (children map(x => transform(x))): _*)
+ val dotId = (g \ "@id").toString
+ if (dotId.count(_ == '|') == 1) {
+ val Array(klass, id) = dotId.toString.split("\\|")
+ /* Sometimes dot "forgets" to add the image -- that's very annoying, but it seems pretty random, and simple
+ * tests like excute 20K times and diff the output don't trigger the bug -- so it's up to us to place the image
+ * back in the node */
+ val kind = getKind(klass)
+ if (kind != "")
+ if (((g \ "a" \ "image").isEmpty)) {
+ DiagramStats.addBrokenImage()
+ val xposition = getPosition(g, "x", -22)
+ val yposition = getPosition(g, "y", -11.3334)
+ if (xposition.isDefined && yposition.isDefined) {
+ val imageNode = <image xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href={ ("./lib/" + kind + "_diagram.png") } width="16px" height="16px" preserveAspectRatio="xMinYMin meet" x={ xposition.get.toString } y={ yposition.get.toString }/>
+ val anchorNode = (g \ "a") match {
+ case Seq(Elem(prefix, "a", attribs, scope, children @ _*)) =>
+ transform(new Elem(prefix, "a", attribs, scope, (children ++ imageNode): _*))
+ case _ =>
+ g \ "a"
+ }
+ res = new Elem(prefix, "g", attribs, scope, anchorNode: _*)
+ DiagramStats.addFixedImage()
+ }
+ }
+ res % new UnprefixedAttribute("id", id, Null) %
+ new UnprefixedAttribute("class", (g \ "@class").toString + " " + klass, Null)
+ }
+ else res
+ }
+ // remove titles
+ case <title>{ _* }</title> =>
+ scala.xml.Text("")
+ // apply recursively
+ case Elem(prefix, label, attribs, scope, child @ _*) =>
+ Elem(prefix, label, attribs, scope, child map(x => transform(x)) : _*)
+ case x => x
+ }
+
+ def getKind(klass: String): String =
+ if (klass.contains("class")) "class"
+ else if (klass.contains("trait")) "trait"
+ else if (klass.contains("object")) "object"
+ else ""
+
+ def getPosition(g: scala.xml.Node, axis: String, offset: Double): Option[Double] = {
+ val node = g \ "a" \ "text" \ ("@" + axis)
+ if (node.isEmpty)
+ None
+ else
+ Some(node.toString.toDouble + offset)
+ }
+
+ /* graph / node / edge attributes */
+
+ private val graphAttributes: Map[String, String] = Map(
+ "compound" -> "true",
+ "rankdir" -> "TB"
+ )
+
+ private val nodeAttributes = Map(
+ "shape" -> "rectangle",
+ "style" -> "filled",
+ "penwidth" -> "1",
+ "margin" -> "0.08,0.01",
+ "width" -> "0.0",
+ "height" -> "0.0",
+ "fontname" -> "Arial",
+ "fontsize" -> "10.00"
+ )
+
+ private val edgeAttributes = Map(
+ "color" -> "#d4d4d4",
+ "arrowsize" -> "0.5",
+ "fontcolor" -> "#aaaaaa",
+ "fontsize" -> "10.00",
+ "fontname" -> "Arial"
+ )
+
+ private val defaultStyle = Map(
+ "color" -> "#ababab",
+ "fillcolor" -> "#e1e1e1",
+ "fontcolor" -> "#7d7d7d",
+ "margin" -> "0.1,0.04"
+ )
+
+ private val implicitStyle = Map(
+ "color" -> "#ababab",
+ "fillcolor" -> "#e1e1e1",
+ "fontcolor" -> "#7d7d7d"
+ )
+
+ private val outsideStyle = Map(
+ "color" -> "#ababab",
+ "fillcolor" -> "#e1e1e1",
+ "fontcolor" -> "#7d7d7d"
+ )
+
+ private val traitStyle = Map(
+ "color" -> "#37657D",
+ "fillcolor" -> "#498AAD",
+ "fontcolor" -> "#ffffff"
+ )
+
+ private val classStyle = Map(
+ "color" -> "#115F3B",
+ "fillcolor" -> "#0A955B",
+ "fontcolor" -> "#ffffff"
+ )
+
+ private val objectStyle = Map(
+ "color" -> "#102966",
+ "fillcolor" -> "#3556a7",
+ "fontcolor" -> "#ffffff"
+ )
+
+ private val typeStyle = Map(
+ "color" -> "#115F3B",
+ "fillcolor" -> "#0A955B",
+ "fontcolor" -> "#ffffff"
+ )
+
+ private def flatten(attributes: Map[String, String]) = attributes.map{ case (key, value) => key + "=\"" + value + "\"" }.mkString(", ")
+
+ private val graphAttributesStr = graphAttributes.map{ case (key, value) => key + "=\"" + value + "\";\n" }.mkString
+ private val nodeAttributesStr = flatten(nodeAttributes)
+ private val edgeAttributesStr = flatten(edgeAttributes)
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala
new file mode 100644
index 0000000000..2fa1bf62f3
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala
@@ -0,0 +1,225 @@
+package scala.tools.nsc
+package doc
+package html
+package page
+package diagram
+
+import java.io.InputStream
+import java.io.OutputStream
+import java.io.InputStreamReader
+import java.io.OutputStreamWriter
+import java.io.BufferedWriter
+import java.io.BufferedReader
+import scala.sys.process._
+import scala.concurrent.SyncVar
+
+import model._
+
+/** This class takes care of running the graphviz dot utility */
+class DotRunner(settings: doc.Settings) {
+
+ private[this] var dotRestarts = 0
+ private[this] var dotProcess: DotProcess = null
+
+ def feedToDot(dotInput: String, template: DocTemplateEntity): String = {
+
+ if (dotProcess == null) {
+ if (dotRestarts < settings.docDiagramsDotRestart.value) {
+ if (dotRestarts != 0)
+ settings.printMsg("Graphviz will be restarted...\n")
+ dotRestarts += 1
+ dotProcess = new DotProcess(settings)
+ } else
+ return null
+ }
+
+ val tStart = System.currentTimeMillis
+ val result = dotProcess.feedToDot(dotInput, template.qualifiedName)
+ val tFinish = System.currentTimeMillis
+ DiagramStats.addDotRunningTime(tFinish - tStart)
+
+ if (result == null) {
+ dotProcess.cleanup()
+ dotProcess = null
+ if (dotRestarts == settings.docDiagramsDotRestart.value) {
+ settings.printMsg("\n")
+ settings.printMsg("**********************************************************************")
+ settings.printMsg("Diagrams will be disabled for this run because the graphviz dot tool")
+ settings.printMsg("has malfunctioned too many times. These scaladoc flags may help:")
+ settings.printMsg("")
+ val baseList = List(settings.docDiagramsDebug,
+ settings.docDiagramsDotPath,
+ settings.docDiagramsDotRestart,
+ settings.docDiagramsDotTimeout)
+ val width = (baseList map (_.helpSyntax.length)).max
+ def helpStr(s: doc.Settings#Setting) = ("%-" + width + "s") format (s.helpSyntax) + " " + s.helpDescription
+ baseList.foreach((sett: doc.Settings#Setting) => settings.printMsg(helpStr(sett)))
+ settings.printMsg("\nPlease note that graphviz package version 2.26 or above is required.")
+ settings.printMsg("**********************************************************************\n\n")
+
+ }
+ }
+
+ result
+ }
+
+ def cleanup() =
+ if (dotProcess != null)
+ dotProcess.cleanup()
+}
+
+class DotProcess(settings: doc.Settings) {
+
+ @volatile var error: Boolean = false // signal an error
+ val inputString = new SyncVar[String] // used for the dot process input
+ val outputString = new SyncVar[String] // used for the dot process output
+ val errorBuffer: StringBuffer = new StringBuffer() // buffer used for both dot process error console AND logging
+
+ // set in only one place, in the main thread
+ var process: Process = null
+ var templateName: String = ""
+ var templateInput: String = ""
+
+ def feedToDot(input: String, template: String): String = {
+
+ templateName = template
+ templateInput = input
+
+ try {
+
+ // process creation
+ if (process == null) {
+ val procIO = new ProcessIO(inputFn(_), outputFn(_), errorFn(_))
+ val processBuilder: ProcessBuilder = Seq(settings.docDiagramsDotPath.value, "-Tsvg")
+ process = processBuilder.run(procIO)
+ }
+
+ // pass the input and wait for the output
+ assert(!inputString.isSet)
+ assert(!outputString.isSet)
+ inputString.put(input)
+ var result = outputString.take(settings.docDiagramsDotTimeout.value * 1000)
+ if (error) result = null
+
+ result
+
+ } catch {
+ case exc: Throwable =>
+ errorBuffer.append(" Main thread in " + templateName + ": " +
+ (if (exc.isInstanceOf[NoSuchElementException]) "Timeout" else "Exception: " + exc))
+ error = true
+ return null
+ }
+ }
+
+ def cleanup(): Unit = {
+
+ // we'll need to know if there was any error for reporting
+ val _error = error
+
+ if (process != null) {
+ // if there's no error, this should exit cleanly
+ if (!error) feedToDot("<finish>", "<finishing>")
+
+ // just in case there's any thread hanging, this will take it out of the loop
+ error = true
+ process.destroy()
+ // we'll need to unblock the input again
+ if (!inputString.isSet) inputString.put("")
+ if (outputString.isSet) outputString.take()
+ }
+
+ if (_error) {
+ if (settings.docDiagramsDebug.value) {
+ settings.printMsg("\n**********************************************************************")
+ settings.printMsg("The graphviz dot diagram tool has malfunctioned and will be restarted.")
+ settings.printMsg("\nThe following is the log of the failure:")
+ settings.printMsg(errorBuffer.toString)
+ settings.printMsg(" Cleanup: Last template: " + templateName)
+ settings.printMsg(" Cleanup: Last dot input: \n " + templateInput.replaceAll("\n","\n ") + "\n")
+ settings.printMsg(" Cleanup: Dot path: " + settings.docDiagramsDotPath.value)
+ if (process != null)
+ settings.printMsg(" Cleanup: Dot exit code: " + process.exitValue)
+ settings.printMsg("**********************************************************************")
+ } else {
+ // we shouldn't just sit there for 50s not reporting anything, no?
+ settings.printMsg("Graphviz dot encountered an error when generating the diagram for:")
+ settings.printMsg(templateName)
+ settings.printMsg("These are usually spurious errors, but if you notice a persistant error on")
+ settings.printMsg("a diagram, please use the " + settings.docDiagramsDebug.name + " flag and report a bug with the output.")
+ }
+ }
+ }
+
+ /* The standard input passing function */
+ private[this] def inputFn(stdin: OutputStream): Unit = {
+ val writer = new BufferedWriter(new OutputStreamWriter(stdin))
+ try {
+ var input = inputString.take()
+
+ while (!error) {
+ if (input == "<finish>") {
+ // empty => signal to finish
+ stdin.close()
+ return
+ } else {
+ // send output to dot
+ writer.write(input + "\n\n")
+ writer.flush()
+ }
+
+ if (!error) input = inputString.take()
+ }
+ stdin.close()
+ } catch {
+ case exc: Throwable =>
+ error = true
+ stdin.close()
+ errorBuffer.append(" Input thread in " + templateName + ": Exception: " + exc + "\n")
+ }
+ }
+
+ private[this] def outputFn(stdOut: InputStream): Unit = {
+ val reader = new BufferedReader(new InputStreamReader(stdOut))
+ val buffer: StringBuilder = new StringBuilder()
+ try {
+ var line = reader.readLine
+ while (!error && line != null) {
+ buffer.append(line + "\n")
+ // signal the last element in the svg (only for output)
+ if (line == "</svg>") {
+ outputString.put(buffer.toString)
+ buffer.setLength(0)
+ }
+ if (error) { stdOut.close(); return }
+ line = reader.readLine
+ }
+ assert(!outputString.isSet)
+ outputString.put(buffer.toString)
+ stdOut.close()
+ } catch {
+ case exc: Throwable =>
+ error = true
+ stdOut.close()
+ errorBuffer.append(" Output thread in " + templateName + ": Exception: " + exc + "\n")
+ }
+ }
+
+ private[this] def errorFn(stdErr: InputStream): Unit = {
+ val reader = new BufferedReader(new InputStreamReader(stdErr))
+ try {
+ var line = reader.readLine
+ while (line != null) {
+ errorBuffer.append(" DOT <error console>: " + line + "\n")
+ error = true
+ line = reader.readLine
+ }
+ stdErr.close()
+ } catch {
+ case exc: Throwable =>
+ error = true
+ stdErr.close()
+ errorBuffer.append(" Error thread in " + templateName + ": Exception: " + exc + "\n")
+ }
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/arrow-down.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/arrow-down.png
new file mode 100644
index 0000000000..7229603ae5
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/arrow-down.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/arrow-right.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/arrow-right.png
new file mode 100644
index 0000000000..b2f2935dc9
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/arrow-right.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class.png
new file mode 100644
index 0000000000..97edbd49db
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_big.png
new file mode 100644
index 0000000000..cb1f638a58
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_diagram.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_diagram.png
new file mode 100644
index 0000000000..9d7aec792b
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_diagram.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_to_object_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_to_object_big.png
new file mode 100644
index 0000000000..5dd6e38d2e
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/class_to_object_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/constructorsbg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/constructorsbg.gif
new file mode 100644
index 0000000000..2e3f5ea530
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/constructorsbg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/conversionbg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/conversionbg.gif
new file mode 100644
index 0000000000..4be145d0af
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/conversionbg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/defbg-blue.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/defbg-blue.gif
new file mode 100644
index 0000000000..69038337a7
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/defbg-blue.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/defbg-green.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/defbg-green.gif
new file mode 100644
index 0000000000..36c43be3a2
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/defbg-green.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/diagrams.css b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/diagrams.css
new file mode 100644
index 0000000000..5fe33f72f5
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/diagrams.css
@@ -0,0 +1,143 @@
+.diagram-container
+{
+ display: none;
+}
+
+.diagram
+{
+ overflow: hidden;
+ padding-top:15px;
+}
+
+.diagram svg
+{
+ display: block;
+ position: absolute;
+ visibility: hidden;
+ margin: auto;
+}
+
+.diagram-help
+{
+ float:right;
+ display:none;
+}
+
+.magnifying
+{
+ cursor: -webkit-zoom-in ! important;
+ cursor: -moz-zoom-in ! important;
+ cursor: pointer;
+}
+
+#close-link
+{
+ position: absolute;
+ z-index: 100;
+ font-family: Arial, sans-serif;
+ font-size: 10pt;
+ text-decoration: underline;
+ color: #315479;
+}
+
+#close:hover
+{
+ text-decoration: none;
+}
+
+svg a
+{
+ cursor:pointer;
+}
+
+svg text
+{
+ font-size: 10px;
+}
+
+/* try to move the node text 1px in order to be vertically
+ centered (does not work in all browsers) */
+svg .node text
+{
+ transform: translate(0px,1px);
+ -ms-transform: translate(0px,1px);
+ -webkit-transform: translate(0px,1px);
+ -o-transform: translate(0px,1px);
+ -moz-transform: translate(0px,1px);
+}
+
+/* hover effect for edges */
+
+svg .edge.over text,
+svg .edge.implicit-incoming.over polygon,
+svg .edge.implicit-outgoing.over polygon
+{
+ fill: #202020;
+}
+
+svg .edge.over path,
+svg .edge.over polygon
+{
+ stroke: #202020;
+}
+
+/* hover effect for nodes in class diagrams */
+
+svg.class-diagram .node
+{
+ opacity: 0.75;
+}
+
+svg.class-diagram .node.this
+{
+ opacity: 1.0;
+}
+
+svg.class-diagram .node.over
+{
+ opacity: 1.0;
+}
+
+svg .node.over polygon
+{
+ stroke: #202020;
+}
+
+/* hover effect for nodes in package diagrams */
+
+svg.package-diagram .node.class.over polygon,
+svg.class-diagram .node.this.class.over polygon
+{
+ fill: #098552;
+ fill: #04663e;
+}
+
+svg.package-diagram .node.trait.over polygon,
+svg.class-diagram .node.this.trait.over polygon
+{
+ fill: #3c7b9b;
+ fill: #235d7b;
+}
+
+svg.package-diagram .node.type.over polygon,
+svg.class-diagram .node.this.type.over polygon
+{
+ fill: #098552;
+ fill: #04663e;
+}
+
+
+svg.package-diagram .node.object.over polygon
+{
+ fill: #183377;
+}
+
+svg.package-diagram .node.outside.over polygon
+{
+ fill: #d4d4d4;
+}
+
+svg.package-diagram .node.default.over polygon
+{
+ fill: #d4d4d4;
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/diagrams.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/diagrams.js
new file mode 100644
index 0000000000..478f2e38ac
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/diagrams.js
@@ -0,0 +1,324 @@
+/**
+ * JavaScript functions enhancing the SVG diagrams.
+ *
+ * @author Damien Obrist
+ */
+
+var diagrams = {};
+
+/**
+ * Initializes the diagrams in the main window.
+ */
+$(document).ready(function()
+{
+ // hide diagrams in browsers not supporting SVG
+ if(Modernizr && !Modernizr.inlinesvg)
+ return;
+
+ // only execute this in the main window
+ if(diagrams.isPopup)
+ return;
+
+ if($("#content-diagram").length)
+ $("#inheritance-diagram").css("padding-bottom", "20px");
+
+ $(".diagram-container").css("display", "block");
+
+ $(".diagram").each(function() {
+ // store inital dimensions
+ $(this).data("width", $("svg", $(this)).width());
+ $(this).data("height", $("svg", $(this)).height());
+ // store unscaled clone of SVG element
+ $(this).data("svg", $(this).get(0).childNodes[0].cloneNode(true));
+ });
+
+ // make diagram visible, hide container
+ $(".diagram").css("display", "none");
+ $(".diagram svg").css({
+ "position": "static",
+ "visibility": "visible",
+ "z-index": "auto"
+ });
+
+ // enable linking to diagrams
+ if($(location).attr("hash") == "#inheritance-diagram") {
+ diagrams.toggle($("#inheritance-diagram-container"), true);
+ } else if($(location).attr("hash") == "#content-diagram") {
+ diagrams.toggle($("#content-diagram-container"), true);
+ }
+
+ $(".diagram-link").click(function() {
+ diagrams.toggle($(this).parent());
+ });
+
+ // register resize function
+ $(window).resize(diagrams.resize);
+
+ // don't bubble event to parent div
+ // when clicking on a node of a resized
+ // diagram
+ $("svg a").click(function(e) {
+ e.stopPropagation();
+ });
+
+ diagrams.initHighlighting();
+});
+
+/**
+ * Initializes the diagrams in the popup.
+ */
+diagrams.initPopup = function(id)
+{
+ // copy diagram from main window
+ if(!jQuery.browser.msie)
+ $("body").append(opener.$("#" + id).data("svg"));
+
+ // positioning
+ $("svg").css("position", "absolute");
+ $(window).resize(function()
+ {
+ var svg_w = $("svg").css("width").replace("px", "");
+ var svg_h = $("svg").css("height").replace("px", "");
+ var x = $(window).width() / 2 - svg_w / 2;
+ if(x < 0) x = 0;
+ var y = $(window).height() / 2 - svg_h / 2;
+ if(y < 0) y = 0;
+ $("svg").css("left", x + "px");
+ $("svg").css("top", y + "px");
+ });
+ $(window).resize();
+
+ diagrams.initHighlighting();
+ $("svg a").click(function(e) {
+ opener.diagrams.redirectFromPopup(this.href.baseVal);
+ window.close();
+ });
+ $(document).keyup(function(e) {
+ if (e.keyCode == 27) window.close();
+ });
+}
+
+/**
+ * Initializes highlighting for nodes and edges.
+ */
+diagrams.initHighlighting = function()
+{
+ // helper function since $.hover doesn't work in IE
+
+ function hover(elements, fn)
+ {
+ elements.mouseover(fn);
+ elements.mouseout(fn);
+ }
+
+ // inheritance edges
+
+ hover($("svg .edge.inheritance"), function(evt){
+ var toggleClass = evt.type == "mouseout" ? diagrams.removeClass : diagrams.addClass;
+ var parts = $(this).attr("id").split("_");
+ toggleClass($("#" + parts[0] + "_" + parts[1]));
+ toggleClass($("#" + parts[0] + "_" + parts[2]));
+ toggleClass($(this));
+ });
+
+ // nodes
+
+ hover($("svg .node"), function(evt){
+ var toggleClass = evt.type == "mouseout" ? diagrams.removeClass : diagrams.addClass;
+ toggleClass($(this));
+ var parts = $(this).attr("id").split("_");
+ var index = parts[1];
+ $("svg#" + parts[0] + " .edge.inheritance").each(function(){
+ var parts2 = $(this).attr("id").split("_");
+ if(parts2[1] == index)
+ {
+ toggleClass($("#" + parts2[0] + "_" + parts2[2]));
+ toggleClass($(this));
+ } else if(parts2[2] == index)
+ {
+ toggleClass($("#" + parts2[0] + "_" + parts2[1]));
+ toggleClass($(this));
+ }
+ });
+ });
+
+ // incoming implicits
+
+ hover($("svg .node.implicit-incoming"), function(evt){
+ var toggleClass = evt.type == "mouseout" ? diagrams.removeClass : diagrams.addClass;
+ toggleClass($(this));
+ toggleClass($("svg .edge.implicit-incoming"));
+ toggleClass($("svg .node.this"));
+ });
+
+ hover($("svg .edge.implicit-incoming"), function(evt){
+ var toggleClass = evt.type == "mouseout" ? diagrams.removeClass : diagrams.addClass;
+ toggleClass($(this));
+ toggleClass($("svg .node.this"));
+ $("svg .node.implicit-incoming").each(function(){
+ toggleClass($(this));
+ });
+ });
+
+ // implicit outgoing nodes
+
+ hover($("svg .node.implicit-outgoing"), function(evt){
+ var toggleClass = evt.type == "mouseout" ? diagrams.removeClass : diagrams.addClass;
+ toggleClass($(this));
+ toggleClass($("svg .edge.implicit-outgoing"));
+ toggleClass($("svg .node.this"));
+ });
+
+ hover($("svg .edge.implicit-outgoing"), function(evt){
+ var toggleClass = evt.type == "mouseout" ? diagrams.removeClass : diagrams.addClass;
+ toggleClass($(this));
+ toggleClass($("svg .node.this"));
+ $("svg .node.implicit-outgoing").each(function(){
+ toggleClass($(this));
+ });
+ });
+};
+
+/**
+ * Resizes the diagrams according to the available width.
+ */
+diagrams.resize = function()
+{
+ // available width
+ var availableWidth = $("body").width() - 20;
+
+ $(".diagram-container").each(function() {
+ // unregister click event on whole div
+ $(".diagram", this).unbind("click");
+ var diagramWidth = $(".diagram", this).data("width");
+ var diagramHeight = $(".diagram", this).data("height");
+
+ if(diagramWidth > availableWidth)
+ {
+ // resize diagram
+ var height = diagramHeight / diagramWidth * availableWidth;
+ $(".diagram svg", this).width(availableWidth);
+ $(".diagram svg", this).height(height);
+
+ // register click event on whole div
+ $(".diagram", this).click(function() {
+ diagrams.popup($(this));
+ });
+ $(".diagram", this).addClass("magnifying");
+ }
+ else
+ {
+ // restore full size of diagram
+ $(".diagram svg", this).width(diagramWidth);
+ $(".diagram svg", this).height(diagramHeight);
+ // don't show custom cursor any more
+ $(".diagram", this).removeClass("magnifying");
+ }
+ });
+};
+
+/**
+ * Shows or hides a diagram depending on its current state.
+ */
+diagrams.toggle = function(container, dontAnimate)
+{
+ // change class of link
+ $(".diagram-link", container).toggleClass("open");
+ // get element to show / hide
+ var div = $(".diagram", container);
+ if (div.is(':visible'))
+ {
+ $(".diagram-help", container).hide();
+ div.unbind("click");
+ div.removeClass("magnifying");
+ div.slideUp(100);
+ }
+ else
+ {
+ diagrams.resize();
+ if(dontAnimate)
+ div.show();
+ else
+ div.slideDown(100);
+ $(".diagram-help", container).show();
+ }
+};
+
+/**
+ * Opens a popup containing a copy of a diagram.
+ */
+diagrams.windows = {};
+diagrams.popup = function(diagram)
+{
+ var id = diagram.attr("id");
+ if(!diagrams.windows[id] || diagrams.windows[id].closed) {
+ var title = $(".symbol .name", $("#signature")).text();
+ // cloning from parent window to popup somehow doesn't work in IE
+ // therefore include the SVG as a string into the HTML
+ var svgIE = jQuery.browser.msie ? $("<div />").append(diagram.data("svg")).html() : "";
+ var html = '' +
+ '<?xml version="1.0" encoding="UTF-8"?>\n' +
+ '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n' +
+ '<html>\n' +
+ ' <head>\n' +
+ ' <title>' + title + '</title>\n' +
+ ' <link href="' + $("#diagrams-css").attr("href") + '" media="screen" type="text/css" rel="stylesheet" />\n' +
+ ' <script type="text/javascript" src="' + $("#jquery-js").attr("src") + '"></script>\n' +
+ ' <script type="text/javascript" src="' + $("#diagrams-js").attr("src") + '"></script>\n' +
+ ' <script type="text/javascript">\n' +
+ ' diagrams.isPopup = true;\n' +
+ ' </script>\n' +
+ ' </head>\n' +
+ ' <body onload="diagrams.initPopup(\'' + id + '\');">\n' +
+ ' <a href="#" onclick="window.close();" id="close-link">Close this window</a>\n' +
+ ' ' + svgIE + '\n' +
+ ' </body>\n' +
+ '</html>';
+
+ var padding = 30;
+ var screenHeight = screen.availHeight;
+ var screenWidth = screen.availWidth;
+ var w = Math.min(screenWidth, diagram.data("width") + 2 * padding);
+ var h = Math.min(screenHeight, diagram.data("height") + 2 * padding);
+ var left = (screenWidth - w) / 2;
+ var top = (screenHeight - h) / 2;
+ var parameters = "height=" + h + ", width=" + w + ", left=" + left + ", top=" + top + ", scrollbars=yes, location=no, resizable=yes";
+ var win = window.open("about:blank", "_blank", parameters);
+ win.document.open();
+ win.document.write(html);
+ win.document.close();
+ diagrams.windows[id] = win;
+ }
+ win.focus();
+};
+
+/**
+ * This method is called from within the popup when a node is clicked.
+ */
+diagrams.redirectFromPopup = function(url)
+{
+ window.location = url;
+};
+
+/**
+ * Helper method that adds a class to a SVG element.
+ */
+diagrams.addClass = function(svgElem, newClass) {
+ newClass = newClass || "over";
+ var classes = svgElem.attr("class");
+ if ($.inArray(newClass, classes.split(/\s+/)) == -1) {
+ classes += (classes ? ' ' : '') + newClass;
+ svgElem.attr("class", classes);
+ }
+};
+
+/**
+ * Helper method that removes a class from a SVG element.
+ */
+diagrams.removeClass = function(svgElem, oldClass) {
+ oldClass = oldClass || "over";
+ var classes = svgElem.attr("class");
+ classes = $.grep(classes.split(/\s+/), function(n, i) { return n != oldClass; }).join(' ');
+ svgElem.attr("class", classes);
+};
+
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left.png
new file mode 100644
index 0000000000..0e8c893315
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left.psd b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left.psd
new file mode 100644
index 0000000000..4d740f3b17
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left.psd
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left2.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left2.gif
new file mode 100644
index 0000000000..b9b49076a6
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_left2.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_right.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_right.png
new file mode 100644
index 0000000000..f127e35b48
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_right.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_right.psd b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_right.psd
new file mode 100644
index 0000000000..63a1ae8349
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filter_box_right.psd
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterbg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterbg.gif
new file mode 100644
index 0000000000..542ba4aa5a
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterbg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.gif
new file mode 100644
index 0000000000..b5075c16cd
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.png
new file mode 100644
index 0000000000..d613cf5633
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbg.gif
new file mode 100644
index 0000000000..ae2f85823b
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/filterboxbg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/fullcommenttopbg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/fullcommenttopbg.gif
new file mode 100644
index 0000000000..a0d93f4844
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/fullcommenttopbg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.css b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.css
new file mode 100644
index 0000000000..55fb370a41
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.css
@@ -0,0 +1,338 @@
+* {
+ color: inherit;
+ font-size: 10pt;
+ text-decoration: none;
+ font-family: Arial, sans-serif;
+ border-width: 0px;
+ padding: 0px;
+ margin: 0px;
+}
+
+a {
+ cursor: pointer;
+}
+
+a:hover {
+ text-decoration: underline;
+}
+
+h1 {
+ display: none;
+}
+
+.selected {
+ -moz-box-shadow: inset 0px 5px 10px rgba(58, 88, 97, .36);
+ -webkit-box-shadow: inset 0px 5px 10px rgba(58, 88, 97, .36);
+ border-top: solid 1px rgba(119, 138, 153, 0.8);
+ border-bottom: solid 1px rgba(151, 173, 191, 0.4);
+ background-color: #ced2d9;
+ margin: -1px 0px;
+}
+
+/*.letters {
+ font-family: monospace;
+ font-size: 2pt;
+ padding: 5px;
+ background-color: #DADADA;
+ text-shadow: #ffffff 0 1px 0;
+}*/
+
+#library {
+ display: none;
+}
+
+#browser {
+ top: 0px;
+ left: 0px;
+ bottom: 0px;
+ width: 100%;
+ display: block;
+ position: fixed;
+}
+
+#filter {
+ position: absolute;
+ display: block;
+/* padding: 5px;*/
+ right: 0;
+ left: 0;
+ top: 0;
+ background-image:url('filterbg.gif');
+ background-repeat:repeat-x;
+ background-color: #ededee; /* light gray */
+ /*background-color: #DADADA;*/
+ border:1px solid #bbbbbb;
+ border-top:0;
+ border-left:0;
+ border-right:0;
+}
+
+#textfilter {
+ position: relative;
+ display: block;
+ height: 20px;
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+#textfilter > .pre {
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 23px;
+ width: 21px;
+ background: url("filter_box_left.png");
+}
+
+#textfilter > .input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 20px;
+ left: 20px;
+}
+
+#textfilter > .input > input {
+ height: 20px;
+ padding: 1px;
+ font-weight: bold;
+ color: #000000;
+ background: #ffffff url("filterboxbarbg.png") repeat-x bottom left;
+ width: 100%;
+}
+
+#textfilter > .post {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 23px;
+ width: 21px;
+ background: url("filter_box_right.png");
+}
+
+/*#textfilter {
+ position: relative;
+ display: block;
+ height: 20px;
+ margin-bottom: 5px;
+}
+
+#textfilter > .pre {
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 20px;
+ width: 20px;
+ background: url("filter_box_left.png");
+}
+
+#textfilter > .input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 20px;
+ left: 20px;
+}
+
+#textfilter > .input > input {
+ height: 16px;
+ padding: 2px;
+ font-weight: bold;
+ color: darkblue;
+ background-color: white;
+ width: 100%;
+}
+
+#textfilter > .post {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 20px;
+ width: 20px;
+ background: url("filter_box_right.png");
+}*/
+
+#focusfilter {
+ position: relative;
+ text-align: center;
+ display: block;
+ padding: 5px;
+ background-color: #fffebd; /* light yellow*/
+ text-shadow: #ffffff 0 1px 0;
+}
+
+#focusfilter .focuscoll {
+ font-weight: bold;
+ text-shadow: #ffffff 0 1px 0;
+}
+
+#focusfilter img {
+ bottom: -2px;
+ position: relative;
+}
+
+#kindfilter {
+ position: relative;
+ display: block;
+ padding: 5px;
+/* background-color: #999;*/
+ text-align: center;
+}
+
+#kindfilter > a {
+ color: black;
+/* text-decoration: underline;*/
+ text-shadow: #ffffff 0 1px 0;
+
+}
+
+#kindfilter > a:hover {
+ color: #4C4C4C;
+ text-decoration: none;
+ text-shadow: #ffffff 0 1px 0;
+}
+
+#letters {
+ position: relative;
+ text-align: center;
+ padding-bottom: 5px;
+ border:1px solid #bbbbbb;
+ border-top:0;
+ border-left:0;
+ border-right:0;
+}
+
+#letters > a, #letters > span {
+/* font-family: monospace;*/
+ color: #858484;
+ font-weight: bold;
+ font-size: 8pt;
+ text-shadow: #ffffff 0 1px 0;
+ padding-right: 2px;
+}
+
+#letters > span {
+ color: #bbb;
+}
+
+#tpl {
+ display: block;
+ position: fixed;
+ overflow: auto;
+ right: 0;
+ left: 0;
+ bottom: 0;
+ top: 5px;
+ position: absolute;
+ display: block;
+}
+
+#tpl .packhide {
+ display: block;
+ float: right;
+ font-weight: normal;
+ color: white;
+}
+
+#tpl .packfocus {
+ display: block;
+ float: right;
+ font-weight: normal;
+ color: white;
+}
+
+#tpl .packages > ol {
+ background-color: #dadfe6;
+ /*margin-bottom: 5px;*/
+}
+
+/*#tpl .packages > ol > li {
+ margin-bottom: 1px;
+}*/
+
+#tpl .packages > li > a {
+ padding: 0px 5px;
+}
+
+#tpl .packages > li > a.tplshow {
+ display: block;
+ color: white;
+ font-weight: bold;
+ display: block;
+ text-shadow: #000000 0 1px 0;
+}
+
+#tpl ol > li.pack {
+ padding: 3px 5px;
+ background: url("packagesbg.gif");
+ background-repeat:repeat-x;
+ min-height: 14px;
+ background-color: #6e808e;
+}
+
+#tpl ol > li {
+ display: block;
+}
+
+#tpl .templates > li {
+ padding-left: 5px;
+ min-height: 18px;
+}
+
+#tpl ol > li .icon {
+ padding-right: 5px;
+ bottom: -2px;
+ position: relative;
+}
+
+#tpl .templates div.placeholder {
+ padding-right: 5px;
+ width: 13px;
+ display: inline-block;
+}
+
+#tpl .templates span.tplLink {
+ padding-left: 5px;
+}
+
+#content {
+ border-left-width: 1px;
+ border-left-color: black;
+ border-left-style: white;
+ right: 0px;
+ left: 0px;
+ bottom: 0px;
+ top: 0px;
+ position: fixed;
+ margin-left: 300px;
+ display: block;
+}
+
+#content > iframe {
+ display: block;
+ height: 100%;
+ width: 100%;
+}
+
+.ui-layout-pane {
+ background: #FFF;
+ overflow: auto;
+}
+
+.ui-layout-resizer {
+ background-image:url('filterbg.gif');
+ background-repeat:repeat-x;
+ background-color: #ededee; /* light gray */
+ border:1px solid #bbbbbb;
+ border-top:0;
+ border-bottom:0;
+ border-left: 0;
+}
+
+.ui-layout-toggler {
+ background: #AAA;
+} \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js
new file mode 100644
index 0000000000..96689ae701
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/index.js
@@ -0,0 +1,536 @@
+// © 2009–2010 EPFL/LAMP
+// code by Gilles Dubochet with contributions by Johannes Rudolph and "spiros"
+
+var topLevelTemplates = undefined;
+var topLevelPackages = undefined;
+
+var scheduler = undefined;
+
+var kindFilterState = undefined;
+var focusFilterState = undefined;
+
+var title = $(document).attr('title');
+
+var lastHash = "";
+
+$(document).ready(function() {
+ $('body').layout({
+ west__size: '20%',
+ center__maskContents: true
+ });
+ $('#browser').layout({
+ center__paneSelector: ".ui-west-center"
+ //,center__initClosed:true
+ ,north__paneSelector: ".ui-west-north"
+ });
+ $('iframe').bind("load", function(){
+ var subtitle = $(this).contents().find('title').text();
+ $(document).attr('title', (title ? title + " - " : "") + subtitle);
+
+ setUrlFragmentFromFrameSrc();
+ });
+
+ // workaround for IE's iframe sizing lack of smartness
+ if($.browser.msie) {
+ function fixIFrame() {
+ $('iframe').height($(window).height() )
+ }
+ $('iframe').bind("load",fixIFrame)
+ $('iframe').bind("resize",fixIFrame)
+ }
+
+ scheduler = new Scheduler();
+ scheduler.addLabel("init", 1);
+ scheduler.addLabel("focus", 2);
+ scheduler.addLabel("filter", 4);
+
+ prepareEntityList();
+
+ configureTextFilter();
+ configureKindFilter();
+ configureEntityList();
+
+ setFrameSrcFromUrlFragment();
+
+ // If the url fragment changes, adjust the src of iframe "template".
+ $(window).bind('hashchange', function() {
+ if(lastFragment != window.location.hash) {
+ lastFragment = window.location.hash;
+ setFrameSrcFromUrlFragment();
+ }
+ });
+});
+
+// Set the iframe's src according to the fragment of the current url.
+// fragment = "#scala.Either" => iframe url = "scala/Either.html"
+// fragment = "#scala.Either@isRight:Boolean" => iframe url = "scala/Either.html#isRight:Boolean"
+function setFrameSrcFromUrlFragment() {
+ var fragment = location.hash.slice(1);
+ if(fragment) {
+ var loc = fragment.split("@")[0].replace(/\./g, "/");
+ if(loc.indexOf(".html") < 0) loc += ".html";
+ if(fragment.indexOf('@') > 0) loc += ("#" + fragment.split("@", 2)[1]);
+ frames["template"].location.replace(loc);
+ }
+ else
+ frames["template"].location.replace("package.html");
+}
+
+// Set the url fragment according to the src of the iframe "template".
+// iframe url = "scala/Either.html" => url fragment = "#scala.Either"
+// iframe url = "scala/Either.html#isRight:Boolean" => url fragment = "#scala.Either@isRight:Boolean"
+function setUrlFragmentFromFrameSrc() {
+ try {
+ var commonLength = location.pathname.lastIndexOf("/");
+ var frameLocation = frames["template"].location;
+ var relativePath = frameLocation.pathname.slice(commonLength + 1);
+
+ if(!relativePath || frameLocation.pathname.indexOf("/") < 0)
+ return;
+
+ // Add #, remove ".html" and replace "/" with "."
+ fragment = "#" + relativePath.replace(/\.html$/, "").replace(/\//g, ".");
+
+ // Add the frame's hash after an @
+ if(frameLocation.hash) fragment += ("@" + frameLocation.hash.slice(1));
+
+ // Use replace to not add history items
+ lastFragment = fragment;
+ location.replace(fragment);
+ }
+ catch(e) {
+ // Chrome doesn't allow reading the iframe's location when
+ // used on the local file system.
+ }
+}
+
+var Index = {};
+
+(function (ns) {
+ function openLink(t, type) {
+ var href;
+ if (type == 'object') {
+ href = t['object'];
+ } else {
+ href = t['class'] || t['trait'] || t['case class'] || t['type'];
+ }
+ return [
+ '<a class="tplshow" target="template" href="',
+ href,
+ '"><img width="13" height="13" class="',
+ type,
+ ' icon" src="lib/',
+ type,
+ '.png" />'
+ ].join('');
+ }
+
+ function createPackageHeader(pack) {
+ return [
+ '<li class="pack">',
+ '<a class="packfocus">focus</a><a class="packhide">hide</a>',
+ '<a class="tplshow" target="template" href="',
+ pack.replace(/\./g, '/'),
+ '/package.html">',
+ pack,
+ '</a></li>'
+ ].join('');
+ };
+
+ function createListItem(template) {
+ var inner = '';
+
+
+ if (template.object) {
+ inner += openLink(template, 'object');
+ }
+
+ if (template['class'] || template['trait'] || template['case class'] || template['type']) {
+ inner += (inner == '') ?
+ '<div class="placeholder" />' : '</a>';
+ inner += openLink(template, template['trait'] ? 'trait' : template['type'] ? 'type' : 'class');
+ } else {
+ inner += '<div class="placeholder"/>';
+ }
+
+ return [
+ '<li>',
+ inner,
+ '<span class="tplLink">',
+ template.name.replace(/^.*\./, ''),
+ '</span></a></li>'
+ ].join('');
+ }
+
+
+ ns.createPackageTree = function (pack, matched, focused) {
+ var html = $.map(matched, function (child, i) {
+ return createListItem(child);
+ }).join('');
+
+ var header;
+ if (focused && pack == focused) {
+ header = '';
+ } else {
+ header = createPackageHeader(pack);
+ }
+
+ return [
+ '<ol class="packages">',
+ header,
+ '<ol class="templates">',
+ html,
+ '</ol></ol>'
+ ].join('');
+ }
+
+ ns.keys = function (obj) {
+ var result = [];
+ var key;
+ for (key in obj) {
+ result.push(key);
+ }
+ return result;
+ }
+
+ var hiddenPackages = {};
+
+ function subPackages(pack) {
+ return $.grep($('#tpl ol.packages'), function (element, index) {
+ var pack = $('li.pack > .tplshow', element).text();
+ return pack.indexOf(pack + '.') == 0;
+ });
+ }
+
+ ns.hidePackage = function (ol) {
+ var selected = $('li.pack > .tplshow', ol).text();
+ hiddenPackages[selected] = true;
+
+ $('ol.templates', ol).hide();
+
+ $.each(subPackages(selected), function (index, element) {
+ $(element).hide();
+ });
+ }
+
+ ns.showPackage = function (ol, state) {
+ var selected = $('li.pack > .tplshow', ol).text();
+ hiddenPackages[selected] = false;
+
+ $('ol.templates', ol).show();
+
+ $.each(subPackages(selected), function (index, element) {
+ $(element).show();
+
+ // When the filter is in "packs" state,
+ // we don't want to show the `.templates`
+ var key = $('li.pack > .tplshow', element).text();
+ if (hiddenPackages[key] || state == 'packs') {
+ $('ol.templates', element).hide();
+ }
+ });
+ }
+
+})(Index);
+
+function configureEntityList() {
+ kindFilterSync();
+ configureHideFilter();
+ configureFocusFilter();
+ textFilter();
+}
+
+/* Updates the list of entities (i.e. the content of the #tpl element) from the raw form generated by Scaladoc to a
+ form suitable for display. In particular, it adds class and object etc. icons, and it configures links to open in
+ the right frame. Furthermore, it sets the two reference top-level entities lists (topLevelTemplates and
+ topLevelPackages) to serve as reference for resetting the list when needed.
+ Be advised: this function should only be called once, on page load. */
+function prepareEntityList() {
+ var classIcon = $("#library > img.class");
+ var traitIcon = $("#library > img.trait");
+ var typeIcon = $("#library > img.type");
+ var objectIcon = $("#library > img.object");
+ var packageIcon = $("#library > img.package");
+
+ $('#tpl li.pack > a.tplshow').attr("target", "template");
+ $('#tpl li.pack').each(function () {
+ $("span.class", this).each(function() { $(this).replaceWith(classIcon.clone()); });
+ $("span.trait", this).each(function() { $(this).replaceWith(traitIcon.clone()); });
+ $("span.type", this).each(function() { $(this).replaceWith(typeIcon.clone()); });
+ $("span.object", this).each(function() { $(this).replaceWith(objectIcon.clone()); });
+ $("span.package", this).each(function() { $(this).replaceWith(packageIcon.clone()); });
+ });
+ $('#tpl li.pack')
+ .prepend("<a class='packhide'>hide</a>")
+ .prepend("<a class='packfocus'>focus</a>");
+}
+
+/* Handles all key presses while scrolling around with keyboard shortcuts in left panel */
+function keyboardScrolldownLeftPane() {
+ scheduler.add("init", function() {
+ $("#textfilter input").blur();
+ var $items = $("#tpl li");
+ $items.first().addClass('selected');
+
+ $(window).bind("keydown", function(e) {
+ var $old = $items.filter('.selected'),
+ $new;
+
+ switch ( e.keyCode ) {
+
+ case 9: // tab
+ $old.removeClass('selected');
+ break;
+
+ case 13: // enter
+ $old.removeClass('selected');
+ var $url = $old.children().filter('a:last').attr('href');
+ $("#template").attr("src",$url);
+ break;
+
+ case 27: // escape
+ $old.removeClass('selected');
+ $(window).unbind(e);
+ $("#textfilter input").focus();
+
+ break;
+
+ case 38: // up
+ $new = $old.prev();
+
+ if (!$new.length) {
+ $new = $old.parent().prev();
+ }
+
+ if ($new.is('ol') && $new.children(':last').is('ol')) {
+ $new = $new.children().children(':last');
+ } else if ($new.is('ol')) {
+ $new = $new.children(':last');
+ }
+
+ break;
+
+ case 40: // down
+ $new = $old.next();
+ if (!$new.length) {
+ $new = $old.parent().parent().next();
+ }
+ if ($new.is('ol')) {
+ $new = $new.children(':first');
+ }
+ break;
+ }
+
+ if ($new.is('li')) {
+ $old.removeClass('selected');
+ $new.addClass('selected');
+ } else if (e.keyCode == 38) {
+ $(window).unbind(e);
+ $("#textfilter input").focus();
+ }
+ });
+ });
+}
+
+/* Configures the text filter */
+function configureTextFilter() {
+ scheduler.add("init", function() {
+ $("#textfilter").append("<span class='pre'/><span class='input'><input id='index-input' type='text' accesskey='/'/></span><span class='post'/>");
+ var input = $("#textfilter input");
+ resizeFilterBlock();
+ input.bind('keyup', function(event) {
+ if (event.keyCode == 27) { // escape
+ input.attr("value", "");
+ }
+ if (event.keyCode == 40) { // down arrow
+ $(window).unbind("keydown");
+ keyboardScrolldownLeftPane();
+ return false;
+ }
+ textFilter();
+ });
+ input.bind('keydown', function(event) {
+ if (event.keyCode == 9) { // tab
+ $("#template").contents().find("#mbrsel-input").focus();
+ input.attr("value", "");
+ return false;
+ }
+ textFilter();
+ });
+ input.focus(function(event) { input.select(); });
+ });
+ scheduler.add("init", function() {
+ $("#textfilter > .post").click(function(){
+ $("#textfilter input").attr("value", "");
+ textFilter();
+ });
+ });
+}
+
+function compilePattern(query) {
+ var escaped = query.replace(/([\.\*\+\?\|\(\)\[\]\\])/g, '\\$1');
+
+ if (query.toLowerCase() != query) {
+ // Regexp that matches CamelCase subbits: "BiSe" is
+ // "[a-z]*Bi[a-z]*Se" and matches "BitSet", "ABitSet", ...
+ return new RegExp(escaped.replace(/([A-Z])/g,"[a-z]*$1"));
+ }
+ else { // if query is all lower case make a normal case insensitive search
+ 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;
+
+ var searchLoop = function () {
+ var packages = Index.keys(Index.PACKAGES).sort();
+
+ while (packages[index]) {
+ var pack = packages[index];
+ var children = Index.PACKAGES[pack];
+ index++;
+
+ if (focusFilterState) {
+ if (pack == focusFilterState ||
+ pack.indexOf(focusFilterState + '.') == 0) {
+ ;
+ } else {
+ continue;
+ }
+ }
+
+ var matched = $.grep(children, function (child, i) {
+ return queryRegExp.test(child.name);
+ });
+
+ if (matched.length > 0) {
+ $('#tpl').append(Index.createPackageTree(pack, matched,
+ focusFilterState));
+ scheduler.add('filter', searchLoop);
+ return;
+ }
+ }
+
+ $('#tpl a.packfocus').click(function () {
+ focusFilter($(this).parent().parent());
+ });
+ configureHideFilter();
+ };
+
+ scheduler.add('filter', searchLoop);
+}
+
+/* Configures the hide tool by adding the hide link to all packages. */
+function configureHideFilter() {
+ $('#tpl li.pack a.packhide').click(function () {
+ var packhide = $(this)
+ var action = packhide.text();
+
+ var ol = $(this).parent().parent();
+
+ if (action == "hide") {
+ Index.hidePackage(ol);
+ packhide.text("show");
+ }
+ else {
+ Index.showPackage(ol, kindFilterState);
+ packhide.text("hide");
+ }
+ return false;
+ });
+}
+
+/* Configures the focus tool by adding the focus bar in the filter box (initially hidden), and by adding the focus
+ link to all packages. */
+function configureFocusFilter() {
+ scheduler.add("init", function() {
+ focusFilterState = null;
+ if ($("#focusfilter").length == 0) {
+ $("#filter").append("<div id='focusfilter'>focused on <span class='focuscoll'></span> <a class='focusremove'><img class='icon' src='lib/remove.png'/></a></div>");
+ $("#focusfilter > .focusremove").click(function(event) {
+ textFilter();
+
+ $("#focusfilter").hide();
+ $("#kindfilter").show();
+ resizeFilterBlock();
+ focusFilterState = null;
+ });
+ $("#focusfilter").hide();
+ resizeFilterBlock();
+ }
+ });
+ scheduler.add("init", function() {
+ $('#tpl li.pack a.packfocus').click(function () {
+ focusFilter($(this).parent());
+ return false;
+ });
+ });
+}
+
+/* Focuses the entity index on a specific package. To do so, it will copy the sub-templates and sub-packages of the
+ focuses package into the top-level templates and packages position of the index. The original top-level
+ @param package The <li> element that corresponds to the package in the entity index */
+function focusFilter(package) {
+ scheduler.clear("filter");
+
+ var currentFocus = $('li.pack > .tplshow', package).text();
+ $("#focusfilter > .focuscoll").empty();
+ $("#focusfilter > .focuscoll").append(currentFocus);
+
+ $("#focusfilter").show();
+ $("#kindfilter").hide();
+ resizeFilterBlock();
+ focusFilterState = currentFocus;
+ kindFilterSync();
+
+ textFilter();
+}
+
+function configureKindFilter() {
+ scheduler.add("init", function() {
+ kindFilterState = "all";
+ $("#filter").append("<div id='kindfilter'><a>display packages only</a></div>");
+ $("#kindfilter > a").click(function(event) { kindFilter("packs"); });
+ resizeFilterBlock();
+ });
+}
+
+function kindFilter(kind) {
+ if (kind == "packs") {
+ kindFilterState = "packs";
+ kindFilterSync();
+ $("#kindfilter > a").replaceWith("<a>display all entities</a>");
+ $("#kindfilter > a").click(function(event) { kindFilter("all"); });
+ }
+ else {
+ kindFilterState = "all";
+ kindFilterSync();
+ $("#kindfilter > a").replaceWith("<a>display packages only</a>");
+ $("#kindfilter > a").click(function(event) { kindFilter("packs"); });
+ }
+}
+
+/* Applies the kind filter. */
+function kindFilterSync() {
+ if (kindFilterState == "all" || focusFilterState != null) {
+ $("#tpl a.packhide").text('hide');
+ $("#tpl ol.templates").show();
+ } else {
+ $("#tpl a.packhide").text('show');
+ $("#tpl ol.templates").hide();
+ }
+}
+
+function resizeFilterBlock() {
+ $("#tpl").css("top", $("#filter").outerHeight(true));
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery-ui.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery-ui.js
new file mode 100755
index 0000000000..faab0cf1a3
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery-ui.js
@@ -0,0 +1,6 @@
+/*! jQuery UI - v1.9.0 - 2012-10-05
+* http://jqueryui.com
+* Includes: jquery.ui.core.js, jquery.ui.widget.js, jquery.ui.mouse.js, jquery.ui.position.js, jquery.ui.accordion.js, jquery.ui.autocomplete.js, jquery.ui.button.js, jquery.ui.datepicker.js, jquery.ui.dialog.js, jquery.ui.draggable.js, jquery.ui.droppable.js, jquery.ui.effect.js, jquery.ui.effect-blind.js, jquery.ui.effect-bounce.js, jquery.ui.effect-clip.js, jquery.ui.effect-drop.js, jquery.ui.effect-explode.js, jquery.ui.effect-fade.js, jquery.ui.effect-fold.js, jquery.ui.effect-highlight.js, jquery.ui.effect-pulsate.js, jquery.ui.effect-scale.js, jquery.ui.effect-shake.js, jquery.ui.effect-slide.js, jquery.ui.effect-transfer.js, jquery.ui.menu.js, jquery.ui.progressbar.js, jquery.ui.resizable.js, jquery.ui.selectable.js, jquery.ui.slider.js, jquery.ui.sortable.js, jquery.ui.spinner.js, jquery.ui.tabs.js, jquery.ui.tooltip.js
+* Copyright (c) 2012 jQuery Foundation and other contributors Licensed MIT */
+
+(function(e,t){function i(t,n){var r,i,o,u=t.nodeName.toLowerCase();return"area"===u?(r=t.parentNode,i=r.name,!t.href||!i||r.nodeName.toLowerCase()!=="map"?!1:(o=e("img[usemap=#"+i+"]")[0],!!o&&s(o))):(/input|select|textarea|button|object/.test(u)?!t.disabled:"a"===u?t.href||n:n)&&s(t)}function s(t){return!e(t).parents().andSelf().filter(function(){return e.css(this,"visibility")==="hidden"||e.expr.filters.hidden(this)}).length}var n=0,r=/^ui-id-\d+$/;e.ui=e.ui||{};if(e.ui.version)return;e.extend(e.ui,{version:"1.9.0",keyCode:{BACKSPACE:8,COMMA:188,DELETE:46,DOWN:40,END:35,ENTER:13,ESCAPE:27,HOME:36,LEFT:37,NUMPAD_ADD:107,NUMPAD_DECIMAL:110,NUMPAD_DIVIDE:111,NUMPAD_ENTER:108,NUMPAD_MULTIPLY:106,NUMPAD_SUBTRACT:109,PAGE_DOWN:34,PAGE_UP:33,PERIOD:190,RIGHT:39,SPACE:32,TAB:9,UP:38}}),e.fn.extend({_focus:e.fn.focus,focus:function(t,n){return typeof t=="number"?this.each(function(){var r=this;setTimeout(function(){e(r).focus(),n&&n.call(r)},t)}):this._focus.apply(this,arguments)},scrollParent:function(){var t;return e.browser.msie&&/(static|relative)/.test(this.css("position"))||/absolute/.test(this.css("position"))?t=this.parents().filter(function(){return/(relative|absolute|fixed)/.test(e.css(this,"position"))&&/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0):t=this.parents().filter(function(){return/(auto|scroll)/.test(e.css(this,"overflow")+e.css(this,"overflow-y")+e.css(this,"overflow-x"))}).eq(0),/fixed/.test(this.css("position"))||!t.length?e(document):t},zIndex:function(n){if(n!==t)return this.css("zIndex",n);if(this.length){var r=e(this[0]),i,s;while(r.length&&r[0]!==document){i=r.css("position");if(i==="absolute"||i==="relative"||i==="fixed"){s=parseInt(r.css("zIndex"),10);if(!isNaN(s)&&s!==0)return s}r=r.parent()}}return 0},uniqueId:function(){return this.each(function(){this.id||(this.id="ui-id-"+ ++n)})},removeUniqueId:function(){return this.each(function(){r.test(this.id)&&e(this).removeAttr("id")})}}),e("<a>").outerWidth(1).jquery||e.each(["Width","Height"],function(n,r){function u(t,n,r,s){return e.each(i,function(){n-=parseFloat(e.css(t,"padding"+this))||0,r&&(n-=parseFloat(e.css(t,"border"+this+"Width"))||0),s&&(n-=parseFloat(e.css(t,"margin"+this))||0)}),n}var i=r==="Width"?["Left","Right"]:["Top","Bottom"],s=r.toLowerCase(),o={innerWidth:e.fn.innerWidth,innerHeight:e.fn.innerHeight,outerWidth:e.fn.outerWidth,outerHeight:e.fn.outerHeight};e.fn["inner"+r]=function(n){return n===t?o["inner"+r].call(this):this.each(function(){e(this).css(s,u(this,n)+"px")})},e.fn["outer"+r]=function(t,n){return typeof t!="number"?o["outer"+r].call(this,t):this.each(function(){e(this).css(s,u(this,t,!0,n)+"px")})}}),e.extend(e.expr[":"],{data:e.expr.createPseudo?e.expr.createPseudo(function(t){return function(n){return!!e.data(n,t)}}):function(t,n,r){return!!e.data(t,r[3])},focusable:function(t){return i(t,!isNaN(e.attr(t,"tabindex")))},tabbable:function(t){var n=e.attr(t,"tabindex"),r=isNaN(n);return(r||n>=0)&&i(t,!r)}}),e(function(){var t=document.body,n=t.appendChild(n=document.createElement("div"));n.offsetHeight,e.extend(n.style,{minHeight:"100px",height:"auto",padding:0,borderWidth:0}),e.support.minHeight=n.offsetHeight===100,e.support.selectstart="onselectstart"in n,t.removeChild(n).style.display="none"}),e.fn.extend({disableSelection:function(){return this.bind((e.support.selectstart?"selectstart":"mousedown")+".ui-disableSelection",function(e){e.preventDefault()})},enableSelection:function(){return this.unbind(".ui-disableSelection")}}),e.extend(e.ui,{plugin:{add:function(t,n,r){var i,s=e.ui[t].prototype;for(i in r)s.plugins[i]=s.plugins[i]||[],s.plugins[i].push([n,r[i]])},call:function(e,t,n){var r,i=e.plugins[t];if(!i||!e.element[0].parentNode||e.element[0].parentNode.nodeType===11)return;for(r=0;r<i.length;r++)e.options[i[r][0]]&&i[r][1].apply(e.element,n)}},contains:e.contains,hasScroll:function(t,n){if(e(t).css("overflow")==="hidden")return!1;var r=n&&n==="left"?"scrollLeft":"scrollTop",i=!1;return t[r]>0?!0:(t[r]=1,i=t[r]>0,t[r]=0,i)},isOverAxis:function(e,t,n){return e>t&&e<t+n},isOver:function(t,n,r,i,s,o){return e.ui.isOverAxis(t,r,s)&&e.ui.isOverAxis(n,i,o)}})})(jQuery);(function(e,t){var n=0,r=Array.prototype.slice,i=e.cleanData;e.cleanData=function(t){for(var n=0,r;(r=t[n])!=null;n++)try{e(r).triggerHandler("remove")}catch(s){}i(t)},e.widget=function(t,n,r){var i,s,o,u,a=t.split(".")[0];t=t.split(".")[1],i=a+"-"+t,r||(r=n,n=e.Widget),e.expr[":"][i.toLowerCase()]=function(t){return!!e.data(t,i)},e[a]=e[a]||{},s=e[a][t],o=e[a][t]=function(e,t){if(!this._createWidget)return new o(e,t);arguments.length&&this._createWidget(e,t)},e.extend(o,s,{version:r.version,_proto:e.extend({},r),_childConstructors:[]}),u=new n,u.options=e.widget.extend({},u.options),e.each(r,function(t,i){e.isFunction(i)&&(r[t]=function(){var e=function(){return n.prototype[t].apply(this,arguments)},r=function(e){return n.prototype[t].apply(this,e)};return function(){var t=this._super,n=this._superApply,s;return this._super=e,this._superApply=r,s=i.apply(this,arguments),this._super=t,this._superApply=n,s}}())}),o.prototype=e.widget.extend(u,{widgetEventPrefix:t},r,{constructor:o,namespace:a,widgetName:t,widgetBaseClass:i,widgetFullName:i}),s?(e.each(s._childConstructors,function(t,n){var r=n.prototype;e.widget(r.namespace+"."+r.widgetName,o,n._proto)}),delete s._childConstructors):n._childConstructors.push(o),e.widget.bridge(t,o)},e.widget.extend=function(n){var i=r.call(arguments,1),s=0,o=i.length,u,a;for(;s<o;s++)for(u in i[s])a=i[s][u],i[s].hasOwnProperty(u)&&a!==t&&(n[u]=e.isPlainObject(a)?e.widget.extend({},n[u],a):a);return n},e.widget.bridge=function(n,i){var s=i.prototype.widgetFullName;e.fn[n]=function(o){var u=typeof o=="string",a=r.call(arguments,1),f=this;return o=!u&&a.length?e.widget.extend.apply(null,[o].concat(a)):o,u?this.each(function(){var r,i=e.data(this,s);if(!i)return e.error("cannot call methods on "+n+" prior to initialization; "+"attempted to call method '"+o+"'");if(!e.isFunction(i[o])||o.charAt(0)==="_")return e.error("no such method '"+o+"' for "+n+" widget instance");r=i[o].apply(i,a);if(r!==i&&r!==t)return f=r&&r.jquery?f.pushStack(r.get()):r,!1}):this.each(function(){var t=e.data(this,s);t?t.option(o||{})._init():new i(o,this)}),f}},e.Widget=function(e,t){},e.Widget._childConstructors=[],e.Widget.prototype={widgetName:"widget",widgetEventPrefix:"",defaultElement:"<div>",options:{disabled:!1,create:null},_createWidget:function(t,r){r=e(r||this.defaultElement||this)[0],this.element=e(r),this.uuid=n++,this.eventNamespace="."+this.widgetName+this.uuid,this.options=e.widget.extend({},this.options,this._getCreateOptions(),t),this.bindings=e(),this.hoverable=e(),this.focusable=e(),r!==this&&(e.data(r,this.widgetName,this),e.data(r,this.widgetFullName,this),this._on({remove:"destroy"}),this.document=e(r.style?r.ownerDocument:r.document||r),this.window=e(this.document[0].defaultView||this.document[0].parentWindow)),this._create(),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:e.noop,_getCreateEventData:e.noop,_create:e.noop,_init:e.noop,destroy:function(){this._destroy(),this.element.unbind(this.eventNamespace).removeData(this.widgetName).removeData(this.widgetFullName).removeData(e.camelCase(this.widgetFullName)),this.widget().unbind(this.eventNamespace).removeAttr("aria-disabled").removeClass(this.widgetFullName+"-disabled "+"ui-state-disabled"),this.bindings.unbind(this.eventNamespace),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")},_destroy:e.noop,widget:function(){return this.element},option:function(n,r){var i=n,s,o,u;if(arguments.length===0)return e.widget.extend({},this.options);if(typeof n=="string"){i={},s=n.split("."),n=s.shift();if(s.length){o=i[n]=e.widget.extend({},this.options[n]);for(u=0;u<s.length-1;u++)o[s[u]]=o[s[u]]||{},o=o[s[u]];n=s.pop();if(r===t)return o[n]===t?null:o[n];o[n]=r}else{if(r===t)return this.options[n]===t?null:this.options[n];i[n]=r}}return this._setOptions(i),this},_setOptions:function(e){var t;for(t in e)this._setOption(t,e[t]);return this},_setOption:function(e,t){return this.options[e]=t,e==="disabled"&&(this.widget().toggleClass(this.widgetFullName+"-disabled ui-state-disabled",!!t).attr("aria-disabled",t),this.hoverable.removeClass("ui-state-hover"),this.focusable.removeClass("ui-state-focus")),this},enable:function(){return this._setOption("disabled",!1)},disable:function(){return this._setOption("disabled",!0)},_on:function(t,n){n?(t=e(t),this.bindings=this.bindings.add(t)):(n=t,t=this.element);var r=this;e.each(n,function(n,i){function s(){if(r.options.disabled===!0||e(this).hasClass("ui-state-disabled"))return;return(typeof i=="string"?r[i]:i).apply(r,arguments)}typeof i!="string"&&(s.guid=i.guid=i.guid||s.guid||e.guid++);var o=n.match(/^(\w+)\s*(.*)$/),u=o[1]+r.eventNamespace,a=o[2];a?r.widget().delegate(a,u,s):t.bind(u,s)})},_off:function(e,t){t=(t||"").split(" ").join(this.eventNamespace+" ")+this.eventNamespace,e.unbind(t).undelegate(t)},_delay:function(e,t){function n(){return(typeof e=="string"?r[e]:e).apply(r,arguments)}var r=this;return setTimeout(n,t||0)},_hoverable:function(t){this.hoverable=this.hoverable.add(t),this._on(t,{mouseenter:function(t){e(t.currentTarget).addClass("ui-state-hover")},mouseleave:function(t){e(t.currentTarget).removeClass("ui-state-hover")}})},_focusable:function(t){this.focusable=this.focusable.add(t),this._on(t,{focusin:function(t){e(t.currentTarget).addClass("ui-state-focus")},focusout:function(t){e(t.currentTarget).removeClass("ui-state-focus")}})},_trigger:function(t,n,r){var i,s,o=this.options[t];r=r||{},n=e.Event(n),n.type=(t===this.widgetEventPrefix?t:this.widgetEventPrefix+t).toLowerCase(),n.target=this.element[0],s=n.originalEvent;if(s)for(i in s)i in n||(n[i]=s[i]);return this.element.trigger(n,r),!(e.isFunction(o)&&o.apply(this.element[0],[n].concat(r))===!1||n.isDefaultPrevented())}},e.each({show:"fadeIn",hide:"fadeOut"},function(t,n){e.Widget.prototype["_"+t]=function(r,i,s){typeof i=="string"&&(i={effect:i});var o,u=i?i===!0||typeof i=="number"?n:i.effect||n:t;i=i||{},typeof i=="number"&&(i={duration:i}),o=!e.isEmptyObject(i),i.complete=s,i.delay&&r.delay(i.delay),o&&e.effects&&(e.effects.effect[u]||e.uiBackCompat!==!1&&e.effects[u])?r[t](i):u!==t&&r[u]?r[u](i.duration,i.easing,s):r.queue(function(n){e(this)[t](),s&&s.call(r[0]),n()})}}),e.uiBackCompat!==!1&&(e.Widget.prototype._getCreateOptions=function(){return e.metadata&&e.metadata.get(this.element[0])[this.widgetName]})})(jQuery);(function(e,t){var n=!1;e(document).mouseup(function(e){n=!1}),e.widget("ui.mouse",{version:"1.9.0",options:{cancel:"input,textarea,button,select,option",distance:1,delay:0},_mouseInit:function(){var t=this;this.element.bind("mousedown."+this.widgetName,function(e){return t._mouseDown(e)}).bind("click."+this.widgetName,function(n){if(!0===e.data(n.target,t.widgetName+".preventClickEvent"))return e.removeData(n.target,t.widgetName+".preventClickEvent"),n.stopImmediatePropagation(),!1}),this.started=!1},_mouseDestroy:function(){this.element.unbind("."+this.widgetName),this._mouseMoveDelegate&&e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate)},_mouseDown:function(t){if(n)return;this._mouseStarted&&this._mouseUp(t),this._mouseDownEvent=t;var r=this,i=t.which===1,s=typeof this.options.cancel=="string"&&t.target.nodeName?e(t.target).closest(this.options.cancel).length:!1;if(!i||s||!this._mouseCapture(t))return!0;this.mouseDelayMet=!this.options.delay,this.mouseDelayMet||(this._mouseDelayTimer=setTimeout(function(){r.mouseDelayMet=!0},this.options.delay));if(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)){this._mouseStarted=this._mouseStart(t)!==!1;if(!this._mouseStarted)return t.preventDefault(),!0}return!0===e.data(t.target,this.widgetName+".preventClickEvent")&&e.removeData(t.target,this.widgetName+".preventClickEvent"),this._mouseMoveDelegate=function(e){return r._mouseMove(e)},this._mouseUpDelegate=function(e){return r._mouseUp(e)},e(document).bind("mousemove."+this.widgetName,this._mouseMoveDelegate).bind("mouseup."+this.widgetName,this._mouseUpDelegate),t.preventDefault(),n=!0,!0},_mouseMove:function(t){return!e.browser.msie||document.documentMode>=9||!!t.button?this._mouseStarted?(this._mouseDrag(t),t.preventDefault()):(this._mouseDistanceMet(t)&&this._mouseDelayMet(t)&&(this._mouseStarted=this._mouseStart(this._mouseDownEvent,t)!==!1,this._mouseStarted?this._mouseDrag(t):this._mouseUp(t)),!this._mouseStarted):this._mouseUp(t)},_mouseUp:function(t){return e(document).unbind("mousemove."+this.widgetName,this._mouseMoveDelegate).unbind("mouseup."+this.widgetName,this._mouseUpDelegate),this._mouseStarted&&(this._mouseStarted=!1,t.target===this._mouseDownEvent.target&&e.data(t.target,this.widgetName+".preventClickEvent",!0),this._mouseStop(t)),!1},_mouseDistanceMet:function(e){return Math.max(Math.abs(this._mouseDownEvent.pageX-e.pageX),Math.abs(this._mouseDownEvent.pageY-e.pageY))>=this.options.distance},_mouseDelayMet:function(e){return this.mouseDelayMet},_mouseStart:function(e){},_mouseDrag:function(e){},_mouseStop:function(e){},_mouseCapture:function(e){return!0}})})(jQuery);(function(e,t){function h(e,t,n){return[parseInt(e[0],10)*(l.test(e[0])?t/100:1),parseInt(e[1],10)*(l.test(e[1])?n/100:1)]}function p(t,n){return parseInt(e.css(t,n),10)||0}e.ui=e.ui||{};var n,r=Math.max,i=Math.abs,s=Math.round,o=/left|center|right/,u=/top|center|bottom/,a=/[\+\-]\d+%?/,f=/^\w+/,l=/%$/,c=e.fn.position;e.position={scrollbarWidth:function(){if(n!==t)return n;var r,i,s=e("<div style='display:block;width:50px;height:50px;overflow:hidden;'><div style='height:100px;width:auto;'></div></div>"),o=s.children()[0];return e("body").append(s),r=o.offsetWidth,s.css("overflow","scroll"),i=o.offsetWidth,r===i&&(i=s[0].clientWidth),s.remove(),n=r-i},getScrollInfo:function(t){var n=t.isWindow?"":t.element.css("overflow-x"),r=t.isWindow?"":t.element.css("overflow-y"),i=n==="scroll"||n==="auto"&&t.width<t.element[0].scrollWidth,s=r==="scroll"||r==="auto"&&t.height<t.element[0].scrollHeight;return{width:i?e.position.scrollbarWidth():0,height:s?e.position.scrollbarWidth():0}},getWithinInfo:function(t){var n=e(t||window),r=e.isWindow(n[0]);return{element:n,isWindow:r,offset:n.offset()||{left:0,top:0},scrollLeft:n.scrollLeft(),scrollTop:n.scrollTop(),width:r?n.width():n.outerWidth(),height:r?n.height():n.outerHeight()}}},e.fn.position=function(t){if(!t||!t.of)return c.apply(this,arguments);t=e.extend({},t);var n,l,d,v,m,g=e(t.of),y=e.position.getWithinInfo(t.within),b=e.position.getScrollInfo(y),w=g[0],E=(t.collision||"flip").split(" "),S={};return w.nodeType===9?(l=g.width(),d=g.height(),v={top:0,left:0}):e.isWindow(w)?(l=g.width(),d=g.height(),v={top:g.scrollTop(),left:g.scrollLeft()}):w.preventDefault?(t.at="left top",l=d=0,v={top:w.pageY,left:w.pageX}):(l=g.outerWidth(),d=g.outerHeight(),v=g.offset()),m=e.extend({},v),e.each(["my","at"],function(){var e=(t[this]||"").split(" "),n,r;e.length===1&&(e=o.test(e[0])?e.concat(["center"]):u.test(e[0])?["center"].concat(e):["center","center"]),e[0]=o.test(e[0])?e[0]:"center",e[1]=u.test(e[1])?e[1]:"center",n=a.exec(e[0]),r=a.exec(e[1]),S[this]=[n?n[0]:0,r?r[0]:0],t[this]=[f.exec(e[0])[0],f.exec(e[1])[0]]}),E.length===1&&(E[1]=E[0]),t.at[0]==="right"?m.left+=l:t.at[0]==="center"&&(m.left+=l/2),t.at[1]==="bottom"?m.top+=d:t.at[1]==="center"&&(m.top+=d/2),n=h(S.at,l,d),m.left+=n[0],m.top+=n[1],this.each(function(){var o,u,a=e(this),f=a.outerWidth(),c=a.outerHeight(),w=p(this,"marginLeft"),x=p(this,"marginTop"),T=f+w+p(this,"marginRight")+b.width,N=c+x+p(this,"marginBottom")+b.height,C=e.extend({},m),k=h(S.my,a.outerWidth(),a.outerHeight());t.my[0]==="right"?C.left-=f:t.my[0]==="center"&&(C.left-=f/2),t.my[1]==="bottom"?C.top-=c:t.my[1]==="center"&&(C.top-=c/2),C.left+=k[0],C.top+=k[1],e.support.offsetFractions||(C.left=s(C.left),C.top=s(C.top)),o={marginLeft:w,marginTop:x},e.each(["left","top"],function(r,i){e.ui.position[E[r]]&&e.ui.position[E[r]][i](C,{targetWidth:l,targetHeight:d,elemWidth:f,elemHeight:c,collisionPosition:o,collisionWidth:T,collisionHeight:N,offset:[n[0]+k[0],n[1]+k[1]],my:t.my,at:t.at,within:y,elem:a})}),e.fn.bgiframe&&a.bgiframe(),t.using&&(u=function(e){var n=v.left-C.left,s=n+l-f,o=v.top-C.top,u=o+d-c,h={target:{element:g,left:v.left,top:v.top,width:l,height:d},element:{element:a,left:C.left,top:C.top,width:f,height:c},horizontal:s<0?"left":n>0?"right":"center",vertical:u<0?"top":o>0?"bottom":"middle"};l<f&&i(n+s)<l&&(h.horizontal="center"),d<c&&i(o+u)<d&&(h.vertical="middle"),r(i(n),i(s))>r(i(o),i(u))?h.important="horizontal":h.important="vertical",t.using.call(this,e,h)}),a.offset(e.extend(C,{using:u}))})},e.ui.position={fit:{left:function(e,t){var n=t.within,i=n.isWindow?n.scrollLeft:n.offset.left,s=n.width,o=e.left-t.collisionPosition.marginLeft,u=i-o,a=o+t.collisionWidth-s-i,f;t.collisionWidth>s?u>0&&a<=0?(f=e.left+u+t.collisionWidth-s-i,e.left+=u-f):a>0&&u<=0?e.left=i:u>a?e.left=i+s-t.collisionWidth:e.left=i:u>0?e.left+=u:a>0?e.left-=a:e.left=r(e.left-o,e.left)},top:function(e,t){var n=t.within,i=n.isWindow?n.scrollTop:n.offset.top,s=t.within.height,o=e.top-t.collisionPosition.marginTop,u=i-o,a=o+t.collisionHeight-s-i,f;t.collisionHeight>s?u>0&&a<=0?(f=e.top+u+t.collisionHeight-s-i,e.top+=u-f):a>0&&u<=0?e.top=i:u>a?e.top=i+s-t.collisionHeight:e.top=i:u>0?e.top+=u:a>0?e.top-=a:e.top=r(e.top-o,e.top)}},flip:{left:function(e,t){var n=t.within,r=n.offset.left+n.scrollLeft,s=n.width,o=n.isWindow?n.scrollLeft:n.offset.left,u=e.left-t.collisionPosition.marginLeft,a=u-o,f=u+t.collisionWidth-s-o,l=t.my[0]==="left"?-t.elemWidth:t.my[0]==="right"?t.elemWidth:0,c=t.at[0]==="left"?t.targetWidth:t.at[0]==="right"?-t.targetWidth:0,h=-2*t.offset[0],p,d;if(a<0){p=e.left+l+c+h+t.collisionWidth-s-r;if(p<0||p<i(a))e.left+=l+c+h}else if(f>0){d=e.left-t.collisionPosition.marginLeft+l+c+h-o;if(d>0||i(d)<f)e.left+=l+c+h}},top:function(e,t){var n=t.within,r=n.offset.top+n.scrollTop,s=n.height,o=n.isWindow?n.scrollTop:n.offset.top,u=e.top-t.collisionPosition.marginTop,a=u-o,f=u+t.collisionHeight-s-o,l=t.my[1]==="top",c=l?-t.elemHeight:t.my[1]==="bottom"?t.elemHeight:0,h=t.at[1]==="top"?t.targetHeight:t.at[1]==="bottom"?-t.targetHeight:0,p=-2*t.offset[1],d,v;a<0?(v=e.top+c+h+p+t.collisionHeight-s-r,e.top+c+h+p>a&&(v<0||v<i(a))&&(e.top+=c+h+p)):f>0&&(d=e.top-t.collisionPosition.marginTop+c+h+p-o,e.top+c+h+p>f&&(d>0||i(d)<f)&&(e.top+=c+h+p))}},flipfit:{left:function(){e.ui.position.flip.left.apply(this,arguments),e.ui.position.fit.left.apply(this,arguments)},top:function(){e.ui.position.flip.top.apply(this,arguments),e.ui.position.fit.top.apply(this,arguments)}}},function(){var t,n,r,i,s,o=document.getElementsByTagName("body")[0],u=document.createElement("div");t=document.createElement(o?"div":"body"),r={visibility:"hidden",width:0,height:0,border:0,margin:0,background:"none"},o&&e.extend(r,{position:"absolute",left:"-1000px",top:"-1000px"});for(s in r)t.style[s]=r[s];t.appendChild(u),n=o||document.documentElement,n.insertBefore(t,n.firstChild),u.style.cssText="position: absolute; left: 10.7432222px;",i=e(u).offset().left,e.support.offsetFractions=i>10&&i<11,t.innerHTML="",n.removeChild(t)}(),e.uiBackCompat!==!1&&function(e){var n=e.fn.position;e.fn.position=function(r){if(!r||!r.offset)return n.call(this,r);var i=r.offset.split(" "),s=r.at.split(" ");return i.length===1&&(i[1]=i[0]),/^\d/.test(i[0])&&(i[0]="+"+i[0]),/^\d/.test(i[1])&&(i[1]="+"+i[1]),s.length===1&&(/left|center|right/.test(s[0])?s[1]="center":(s[1]=s[0],s[0]="center")),n.call(this,e.extend(r,{at:s[0]+i[0]+" "+s[1]+i[1],offset:t}))}}(jQuery)})(jQuery);(function(e,t){var n=0,r={},i={};r.height=r.paddingTop=r.paddingBottom=r.borderTopWidth=r.borderBottomWidth="hide",i.height=i.paddingTop=i.paddingBottom=i.borderTopWidth=i.borderBottomWidth="show",e.widget("ui.accordion",{version:"1.9.0",options:{active:0,animate:{},collapsible:!1,event:"click",header:"> li > :first-child,> :not(li):even",heightStyle:"auto",icons:{activeHeader:"ui-icon-triangle-1-s",header:"ui-icon-triangle-1-e"},activate:null,beforeActivate:null},_create:function(){var t=this.accordionId="ui-accordion-"+(this.element.attr("id")||++n),r=this.options;this.prevShow=this.prevHide=e(),this.element.addClass("ui-accordion ui-widget ui-helper-reset"),this.headers=this.element.find(r.header).addClass("ui-accordion-header ui-helper-reset ui-state-default ui-corner-all"),this._hoverable(this.headers),this._focusable(this.headers),this.headers.next().addClass("ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom").hide(),!r.collapsible&&r.active===!1&&(r.active=0),r.active<0&&(r.active+=this.headers.length),this.active=this._findActive(r.active).addClass("ui-accordion-header-active ui-state-active").toggleClass("ui-corner-all ui-corner-top"),this.active.next().addClass("ui-accordion-content-active").show(),this._createIcons(),this.originalHeight=this.element[0].style.height,this.refresh(),this.element.attr("role","tablist"),this.headers.attr("role","tab").each(function(n){var r=e(this),i=r.attr("id"),s=r.next(),o=s.attr("id");i||(i=t+"-header-"+n,r.attr("id",i)),o||(o=t+"-panel-"+n,s.attr("id",o)),r.attr("aria-controls",o),s.attr("aria-labelledby",i)}).next().attr("role","tabpanel"),this.headers.not(this.active).attr({"aria-selected":"false",tabIndex:-1}).next().attr({"aria-expanded":"false","aria-hidden":"true"}).hide(),this.active.length?this.active.attr({"aria-selected":"true",tabIndex:0}).next().attr({"aria-expanded":"true","aria-hidden":"false"}):this.headers.eq(0).attr("tabIndex",0),this._on(this.headers,{keydown:"_keydown"}),this._on(this.headers.next(),{keydown:"_panelKeyDown"}),this._setupEvents(r.event)},_getCreateEventData:function(){return{header:this.active,content:this.active.length?this.active.next():e()}},_createIcons:function(){var t=this.options.icons;t&&(e("<span>").addClass("ui-accordion-header-icon ui-icon "+t.header).prependTo(this.headers),this.active.children(".ui-accordion-header-icon").removeClass(t.header).addClass(t.activeHeader),this.headers.addClass("ui-accordion-icons"))},_destroyIcons:function(){this.headers.removeClass("ui-accordion-icons").children(".ui-accordion-header-icon").remove()},_destroy:function(){var e;this.element.removeClass("ui-accordion ui-widget ui-helper-reset").removeAttr("role"),this.headers.removeClass("ui-accordion-header ui-accordion-header-active ui-helper-reset ui-state-default ui-corner-all ui-state-active ui-state-disabled ui-corner-top").removeAttr("role").removeAttr("aria-selected").removeAttr("aria-controls").removeAttr("tabIndex").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this._destroyIcons(),e=this.headers.next().css("display","").removeAttr("role").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeClass("ui-helper-reset ui-widget-content ui-corner-bottom ui-accordion-content ui-accordion-content-active ui-state-disabled").each(function(){/^ui-accordion/.test(this.id)&&this.removeAttribute("id")}),this.options.heightStyle!=="content"&&(this.element.css("height",this.originalHeight),e.css("height",""))},_setOption:function(e,t){if(e==="active"){this._activate(t);return}e==="event"&&(this.options.event&&this._off(this.headers,this.options.event),this._setupEvents(t)),this._super(e,t),e==="collapsible"&&!t&&this.options.active===!1&&this._activate(0),e==="icons"&&(this._destroyIcons(),t&&this._createIcons()),e==="disabled"&&this.headers.add(this.headers.next()).toggleClass("ui-state-disabled",!!t)},_keydown:function(t){if(t.altKey||t.ctrlKey)return;var n=e.ui.keyCode,r=this.headers.length,i=this.headers.index(t.target),s=!1;switch(t.keyCode){case n.RIGHT:case n.DOWN:s=this.headers[(i+1)%r];break;case n.LEFT:case n.UP:s=this.headers[(i-1+r)%r];break;case n.SPACE:case n.ENTER:this._eventHandler(t);break;case n.HOME:s=this.headers[0];break;case n.END:s=this.headers[r-1]}s&&(e(t.target).attr("tabIndex",-1),e(s).attr("tabIndex",0),s.focus(),t.preventDefault())},_panelKeyDown:function(t){t.keyCode===e.ui.keyCode.UP&&t.ctrlKey&&e(t.currentTarget).prev().focus()},refresh:function(){var t,n,r=this.options.heightStyle,i=this.element.parent();this.element.css("height",this.originalHeight),r==="fill"?(e.support.minHeight||(n=i.css("overflow"),i.css("overflow","hidden")),t=i.height(),this.element.siblings(":visible").each(function(){var n=e(this),r=n.css("position");if(r==="absolute"||r==="fixed")return;t-=n.outerHeight(!0)}),n&&i.css("overflow",n),this.headers.each(function(){t-=e(this).outerHeight(!0)}),this.headers.next().each(function(){e(this).height(Math.max(0,t-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):r==="auto"&&(t=0,this.headers.next().each(function(){t=Math.max(t,e(this).height("").height())}).height(t)),r!=="content"&&this.element.height(this.element.height())},_activate:function(t){var n=this._findActive(t)[0];if(n===this.active[0])return;n=n||this.active[0],this._eventHandler({target:n,currentTarget:n,preventDefault:e.noop})},_findActive:function(t){return typeof t=="number"?this.headers.eq(t):e()},_setupEvents:function(t){var n={};if(!t)return;e.each(t.split(" "),function(e,t){n[t]="_eventHandler"}),this._on(this.headers,n)},_eventHandler:function(t){var n=this.options,r=this.active,i=e(t.currentTarget),s=i[0]===r[0],o=s&&n.collapsible,u=o?e():i.next(),a=r.next(),f={oldHeader:r,oldPanel:a,newHeader:o?e():i,newPanel:u};t.preventDefault();if(s&&!n.collapsible||this._trigger("beforeActivate",t,f)===!1)return;n.active=o?!1:this.headers.index(i),this.active=s?e():i,this._toggle(f),r.removeClass("ui-accordion-header-active ui-state-active"),n.icons&&r.children(".ui-accordion-header-icon").removeClass(n.icons.activeHeader).addClass(n.icons.header),s||(i.removeClass("ui-corner-all").addClass("ui-accordion-header-active ui-state-active ui-corner-top"),n.icons&&i.children(".ui-accordion-header-icon").removeClass(n.icons.header).addClass(n.icons.activeHeader),i.next().addClass("ui-accordion-content-active"))},_toggle:function(t){var n=t.newPanel,r=this.prevShow.length?this.prevShow:t.oldPanel;this.prevShow.add(this.prevHide).stop(!0,!0),this.prevShow=n,this.prevHide=r,this.options.animate?this._animate(n,r,t):(r.hide(),n.show(),this._toggleComplete(t)),r.attr({"aria-expanded":"false","aria-hidden":"true"}),r.prev().attr("aria-selected","false"),n.length&&r.length?r.prev().attr("tabIndex",-1):n.length&&this.headers.filter(function(){return e(this).attr("tabIndex")===0}).attr("tabIndex",-1),n.attr({"aria-expanded":"true","aria-hidden":"false"}).prev().attr({"aria-selected":"true",tabIndex:0})},_animate:function(e,t,n){var s,o,u,a=this,f=0,l=e.length&&(!t.length||e.index()<t.index()),c=this.options.animate||{},h=l&&c.down||c,p=function(){a._toggleComplete(n)};typeof h=="number"&&(u=h),typeof h=="string"&&(o=h),o=o||h.easing||c.easing,u=u||h.duration||c.duration;if(!t.length)return e.animate(i,u,o,p);if(!e.length)return t.animate(r,u,o,p);s=e.show().outerHeight(),t.animate(r,{duration:u,easing:o,step:function(e,t){t.now=Math.round(e)}}),e.hide().animate(i,{duration:u,easing:o,complete:p,step:function(e,n){n.now=Math.round(e),n.prop!=="height"?f+=n.now:a.options.heightStyle!=="content"&&(n.now=Math.round(s-t.outerHeight()-f),f=0)}})},_toggleComplete:function(e){var t=e.oldPanel;t.removeClass("ui-accordion-content-active").prev().removeClass("ui-corner-top").addClass("ui-corner-all"),t.length&&(t.parent()[0].className=t.parent()[0].className),this._trigger("activate",null,e)}}),e.uiBackCompat!==!1&&(function(e,t){e.extend(t.options,{navigation:!1,navigationFilter:function(){return this.href.toLowerCase()===location.href.toLowerCase()}});var n=t._create;t._create=function(){if(this.options.navigation){var t=this,r=this.element.find(this.options.header),i=r.next(),s=r.add(i).find("a").filter(this.options.navigationFilter)[0];s&&r.add(i).each(function(n){if(e.contains(this,s))return t.options.active=Math.floor(n/2),!1})}n.call(this)}}(jQuery,jQuery.ui.accordion.prototype),function(e,t){e.extend(t.options,{heightStyle:null,autoHeight:!0,clearStyle:!1,fillSpace:!1});var n=t._create,r=t._setOption;e.extend(t,{_create:function(){this.options.heightStyle=this.options.heightStyle||this._mergeHeightStyle(),n.call(this)},_setOption:function(e,t){if(e==="autoHeight"||e==="clearStyle"||e==="fillSpace")this.options.heightStyle=this._mergeHeightStyle();r.apply(this,arguments)},_mergeHeightStyle:function(){var e=this.options;if(e.fillSpace)return"fill";if(e.clearStyle)return"content";if(e.autoHeight)return"auto"}})}(jQuery,jQuery.ui.accordion.prototype),function(e,t){e.extend(t.options.icons,{activeHeader:null,headerSelected:"ui-icon-triangle-1-s"});var n=t._createIcons;t._createIcons=function(){this.options.icons&&(this.options.icons.activeHeader=this.options.icons.activeHeader||this.options.icons.headerSelected),n.call(this)}}(jQuery,jQuery.ui.accordion.prototype),function(e,t){t.activate=t._activate;var n=t._findActive;t._findActive=function(e){return e===-1&&(e=!1),e&&typeof e!="number"&&(e=this.headers.index(this.headers.filter(e)),e===-1&&(e=!1)),n.call(this,e)}}(jQuery,jQuery.ui.accordion.prototype),jQuery.ui.accordion.prototype.resize=jQuery.ui.accordion.prototype.refresh,function(e,t){e.extend(t.options,{change:null,changestart:null});var n=t._trigger;t._trigger=function(e,t,r){var i=n.apply(this,arguments);return i?(e==="beforeActivate"?i=n.call(this,"changestart",t,{oldHeader:r.oldHeader,oldContent:r.oldPanel,newHeader:r.newHeader,newContent:r.newPanel}):e==="activate"&&(i=n.call(this,"change",t,{oldHeader:r.oldHeader,oldContent:r.oldPanel,newHeader:r.newHeader,newContent:r.newPanel})),i):!1}}(jQuery,jQuery.ui.accordion.prototype),function(e,t){e.extend(t.options,{animate:null,animated:"slide"});var n=t._create;t._create=function(){var e=this.options;e.animate===null&&(e.animated?e.animated==="slide"?e.animate=300:e.animated==="bounceslide"?e.animate={duration:200,down:{easing:"easeOutBounce",duration:1e3}}:e.animate=e.animated:e.animate=!1),n.call(this)}}(jQuery,jQuery.ui.accordion.prototype))})(jQuery);(function(e,t){var n=0;e.widget("ui.autocomplete",{version:"1.9.0",defaultElement:"<input>",options:{appendTo:"body",autoFocus:!1,delay:300,minLength:1,position:{my:"left top",at:"left bottom",collision:"none"},source:null,change:null,close:null,focus:null,open:null,response:null,search:null,select:null},pending:0,_create:function(){var t,n,r;this.isMultiLine=this._isMultiLine(),this.valueMethod=this.element[this.element.is("input,textarea")?"val":"text"],this.isNewMenu=!0,this.element.addClass("ui-autocomplete-input").attr("autocomplete","off"),this._on({keydown:function(i){if(this.element.prop("readOnly")){t=!0,r=!0,n=!0;return}t=!1,r=!1,n=!1;var s=e.ui.keyCode;switch(i.keyCode){case s.PAGE_UP:t=!0,this._move("previousPage",i);break;case s.PAGE_DOWN:t=!0,this._move("nextPage",i);break;case s.UP:t=!0,this._keyEvent("previous",i);break;case s.DOWN:t=!0,this._keyEvent("next",i);break;case s.ENTER:case s.NUMPAD_ENTER:this.menu.active&&(t=!0,i.preventDefault(),this.menu.select(i));break;case s.TAB:this.menu.active&&this.menu.select(i);break;case s.ESCAPE:this.menu.element.is(":visible")&&(this._value(this.term),this.close(i),i.preventDefault());break;default:n=!0,this._searchTimeout(i)}},keypress:function(r){if(t){t=!1,r.preventDefault();return}if(n)return;var i=e.ui.keyCode;switch(r.keyCode){case i.PAGE_UP:this._move("previousPage",r);break;case i.PAGE_DOWN:this._move("nextPage",r);break;case i.UP:this._keyEvent("previous",r);break;case i.DOWN:this._keyEvent("next",r)}},input:function(e){if(r){r=!1,e.preventDefault();return}this._searchTimeout(e)},focus:function(){this.selectedItem=null,this.previous=this._value()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}clearTimeout(this.searching),this.close(e),this._change(e)}}),this._initSource(),this.menu=e("<ul>").addClass("ui-autocomplete").appendTo(this.document.find(this.options.appendTo||"body")[0]).menu({input:e(),role:null}).zIndex(this.element.zIndex()+1).hide().data("menu"),this._on(this.menu.element,{mousedown:function(t){t.preventDefault(),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur});var n=this.menu.element[0];e(t.target).closest(".ui-menu-item").length||this._delay(function(){var t=this;this.document.one("mousedown",function(r){r.target!==t.element[0]&&r.target!==n&&!e.contains(n,r.target)&&t.close()})})},menufocus:function(t,n){if(this.isNewMenu){this.isNewMenu=!1;if(t.originalEvent&&/^mouse/.test(t.originalEvent.type)){this.menu.blur(),this.document.one("mousemove",function(){e(t.target).trigger(t.originalEvent)});return}}var r=n.item.data("ui-autocomplete-item")||n.item.data("item.autocomplete");!1!==this._trigger("focus",t,{item:r})?t.originalEvent&&/^key/.test(t.originalEvent.type)&&this._value(r.value):this.liveRegion.text(r.value)},menuselect:function(e,t){var n=t.item.data("ui-autocomplete-item")||t.item.data("item.autocomplete"),r=this.previous;this.element[0]!==this.document[0].activeElement&&(this.element.focus(),this.previous=r,this._delay(function(){this.previous=r,this.selectedItem=n})),!1!==this._trigger("select",e,{item:n})&&this._value(n.value),this.term=this._value(),this.close(e),this.selectedItem=n}}),this.liveRegion=e("<span>",{role:"status","aria-live":"polite"}).addClass("ui-helper-hidden-accessible").insertAfter(this.element),e.fn.bgiframe&&this.menu.element.bgiframe(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_destroy:function(){clearTimeout(this.searching),this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete"),this.menu.element.remove(),this.liveRegion.remove()},_setOption:function(e,t){this._super(e,t),e==="source"&&this._initSource(),e==="appendTo"&&this.menu.element.appendTo(this.document.find(t||"body")[0]),e==="disabled"&&t&&this.xhr&&this.xhr.abort()},_isMultiLine:function(){return this.element.is("textarea")?!0:this.element.is("input")?!1:this.element.prop("isContentEditable")},_initSource:function(){var t,n,r=this;e.isArray(this.options.source)?(t=this.options.source,this.source=function(n,r){r(e.ui.autocomplete.filter(t,n.term))}):typeof this.options.source=="string"?(n=this.options.source,this.source=function(t,i){r.xhr&&r.xhr.abort(),r.xhr=e.ajax({url:n,data:t,dataType:"json",success:function(e,t){i(e)},error:function(){i([])}})}):this.source=this.options.source},_searchTimeout:function(e){clearTimeout(this.searching),this.searching=this._delay(function(){this.term!==this._value()&&(this.selectedItem=null,this.search(null,e))},this.options.delay)},search:function(e,t){e=e!=null?e:this._value(),this.term=this._value();if(e.length<this.options.minLength)return this.close(t);if(this._trigger("search",t)===!1)return;return this._search(e)},_search:function(e){this.pending++,this.element.addClass("ui-autocomplete-loading"),this.cancelSearch=!1,this.source({term:e},this._response())},_response:function(){var e=this,t=++n;return function(r){t===n&&e.__response(r),e.pending--,e.pending||e.element.removeClass("ui-autocomplete-loading")}},__response:function(e){e&&(e=this._normalize(e)),this._trigger("response",null,{content:e}),!this.options.disabled&&e&&e.length&&!this.cancelSearch?(this._suggest(e),this._trigger("open")):this._close()},close:function(e){this.cancelSearch=!0,this._close(e)},_close:function(e){this.menu.element.is(":visible")&&(this.menu.element.hide(),this.menu.blur(),this.isNewMenu=!0,this._trigger("close",e))},_change:function(e){this.previous!==this._value()&&this._trigger("change",e,{item:this.selectedItem})},_normalize:function(t){return t.length&&t[0].label&&t[0].value?t:e.map(t,function(t){return typeof t=="string"?{label:t,value:t}:e.extend({label:t.label||t.value,value:t.value||t.label},t)})},_suggest:function(t){var n=this.menu.element.empty().zIndex(this.element.zIndex()+1);this._renderMenu(n,t),this.menu.refresh(),n.show(),this._resizeMenu(),n.position(e.extend({of:this.element},this.options.position)),this.options.autoFocus&&this.menu.next()},_resizeMenu:function(){var e=this.menu.element;e.outerWidth(Math.max(e.width("").outerWidth()+1,this.element.outerWidth()))},_renderMenu:function(t,n){var r=this;e.each(n,function(e,n){r._renderItemData(t,n)})},_renderItemData:function(e,t){return this._renderItem(e,t).data("ui-autocomplete-item",t)},_renderItem:function(t,n){return e("<li>").append(e("<a>").text(n.label)).appendTo(t)},_move:function(e,t){if(!this.menu.element.is(":visible")){this.search(null,t);return}if(this.menu.isFirstItem()&&/^previous/.test(e)||this.menu.isLastItem()&&/^next/.test(e)){this._value(this.term),this.menu.blur();return}this.menu[e](t)},widget:function(){return this.menu.element},_value:function(e){return this.valueMethod.apply(this.element,arguments)},_keyEvent:function(e,t){if(!this.isMultiLine||this.menu.element.is(":visible"))this._move(e,t),t.preventDefault()}}),e.extend(e.ui.autocomplete,{escapeRegex:function(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")},filter:function(t,n){var r=new RegExp(e.ui.autocomplete.escapeRegex(n),"i");return e.grep(t,function(e){return r.test(e.label||e.value||e)})}}),e.widget("ui.autocomplete",e.ui.autocomplete,{options:{messages:{noResults:"No search results.",results:function(e){return e+(e>1?" results are":" result is")+" available, use up and down arrow keys to navigate."}}},__response:function(e){var t;this._superApply(arguments);if(this.options.disabled||this.cancelSearch)return;e&&e.length?t=this.options.messages.results(e.length):t=this.options.messages.noResults,this.liveRegion.text(t)}})})(jQuery);(function(e,t){var n,r,i,s,o="ui-button ui-widget ui-state-default ui-corner-all",u="ui-state-hover ui-state-active ",a="ui-button-icons-only ui-button-icon-only ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary ui-button-text-only",f=function(){var t=e(this).find(":ui-button");setTimeout(function(){t.button("refresh")},1)},l=function(t){var n=t.name,r=t.form,i=e([]);return n&&(r?i=e(r).find("[name='"+n+"']"):i=e("[name='"+n+"']",t.ownerDocument).filter(function(){return!this.form})),i};e.widget("ui.button",{version:"1.9.0",defaultElement:"<button>",options:{disabled:null,text:!0,label:null,icons:{primary:null,secondary:null}},_create:function(){this.element.closest("form").unbind("reset"+this.eventNamespace).bind("reset"+this.eventNamespace,f),typeof this.options.disabled!="boolean"?this.options.disabled=!!this.element.prop("disabled"):this.element.prop("disabled",this.options.disabled),this._determineButtonType(),this.hasTitle=!!this.buttonElement.attr("title");var t=this,u=this.options,a=this.type==="checkbox"||this.type==="radio",c="ui-state-hover"+(a?"":" ui-state-active"),h="ui-state-focus";u.label===null&&(u.label=this.type==="input"?this.buttonElement.val():this.buttonElement.html()),this.buttonElement.addClass(o).attr("role","button").bind("mouseenter"+this.eventNamespace,function(){if(u.disabled)return;e(this).addClass("ui-state-hover"),this===n&&e(this).addClass("ui-state-active")}).bind("mouseleave"+this.eventNamespace,function(){if(u.disabled)return;e(this).removeClass(c)}).bind("click"+this.eventNamespace,function(e){u.disabled&&(e.preventDefault(),e.stopImmediatePropagation())}),this.element.bind("focus"+this.eventNamespace,function(){t.buttonElement.addClass(h)}).bind("blur"+this.eventNamespace,function(){t.buttonElement.removeClass(h)}),a&&(this.element.bind("change"+this.eventNamespace,function(){if(s)return;t.refresh()}),this.buttonElement.bind("mousedown"+this.eventNamespace,function(e){if(u.disabled)return;s=!1,r=e.pageX,i=e.pageY}).bind("mouseup"+this.eventNamespace,function(e){if(u.disabled)return;if(r!==e.pageX||i!==e.pageY)s=!0})),this.type==="checkbox"?this.buttonElement.bind("click"+this.eventNamespace,function(){if(u.disabled||s)return!1;e(this).toggleClass("ui-state-active"),t.buttonElement.attr("aria-pressed",t.element[0].checked)}):this.type==="radio"?this.buttonElement.bind("click"+this.eventNamespace,function(){if(u.disabled||s)return!1;e(this).addClass("ui-state-active"),t.buttonElement.attr("aria-pressed","true");var n=t.element[0];l(n).not(n).map(function(){return e(this).button("widget")[0]}).removeClass("ui-state-active").attr("aria-pressed","false")}):(this.buttonElement.bind("mousedown"+this.eventNamespace,function(){if(u.disabled)return!1;e(this).addClass("ui-state-active"),n=this,t.document.one("mouseup",function(){n=null})}).bind("mouseup"+this.eventNamespace,function(){if(u.disabled)return!1;e(this).removeClass("ui-state-active")}).bind("keydown"+this.eventNamespace,function(t){if(u.disabled)return!1;(t.keyCode===e.ui.keyCode.SPACE||t.keyCode===e.ui.keyCode.ENTER)&&e(this).addClass("ui-state-active")}).bind("keyup"+this.eventNamespace,function(){e(this).removeClass("ui-state-active")}),this.buttonElement.is("a")&&this.buttonElement.keyup(function(t){t.keyCode===e.ui.keyCode.SPACE&&e(this).click()})),this._setOption("disabled",u.disabled),this._resetButton()},_determineButtonType:function(){var e,t,n;this.element.is("[type=checkbox]")?this.type="checkbox":this.element.is("[type=radio]")?this.type="radio":this.element.is("input")?this.type="input":this.type="button",this.type==="checkbox"||this.type==="radio"?(e=this.element.parents().last(),t="label[for='"+this.element.attr("id")+"']",this.buttonElement=e.find(t),this.buttonElement.length||(e=e.length?e.siblings():this.element.siblings(),this.buttonElement=e.filter(t),this.buttonElement.length||(this.buttonElement=e.find(t))),this.element.addClass("ui-helper-hidden-accessible"),n=this.element.is(":checked"),n&&this.buttonElement.addClass("ui-state-active"),this.buttonElement.prop("aria-pressed",n)):this.buttonElement=this.element},widget:function(){return this.buttonElement},_destroy:function(){this.element.removeClass("ui-helper-hidden-accessible"),this.buttonElement.removeClass(o+" "+u+" "+a).removeAttr("role").removeAttr("aria-pressed").html(this.buttonElement.find(".ui-button-text").html()),this.hasTitle||this.buttonElement.removeAttr("title")},_setOption:function(e,t){this._super(e,t);if(e==="disabled"){t?this.element.prop("disabled",!0):this.element.prop("disabled",!1);return}this._resetButton()},refresh:function(){var t=this.element.is(":disabled");t!==this.options.disabled&&this._setOption("disabled",t),this.type==="radio"?l(this.element[0]).each(function(){e(this).is(":checked")?e(this).button("widget").addClass("ui-state-active").attr("aria-pressed","true"):e(this).button("widget").removeClass("ui-state-active").attr("aria-pressed","false")}):this.type==="checkbox"&&(this.element.is(":checked")?this.buttonElement.addClass("ui-state-active").attr("aria-pressed","true"):this.buttonElement.removeClass("ui-state-active").attr("aria-pressed","false"))},_resetButton:function(){if(this.type==="input"){this.options.label&&this.element.val(this.options.label);return}var t=this.buttonElement.removeClass(a),n=e("<span></span>",this.document[0]).addClass("ui-button-text").html(this.options.label).appendTo(t.empty()).text(),r=this.options.icons,i=r.primary&&r.secondary,s=[];r.primary||r.secondary?(this.options.text&&s.push("ui-button-text-icon"+(i?"s":r.primary?"-primary":"-secondary")),r.primary&&t.prepend("<span class='ui-button-icon-primary ui-icon "+r.primary+"'></span>"),r.secondary&&t.append("<span class='ui-button-icon-secondary ui-icon "+r.secondary+"'></span>"),this.options.text||(s.push(i?"ui-button-icons-only":"ui-button-icon-only"),this.hasTitle||t.attr("title",e.trim(n)))):s.push("ui-button-text-only"),t.addClass(s.join(" "))}}),e.widget("ui.buttonset",{version:"1.9.0",options:{items:"button, input[type=button], input[type=submit], input[type=reset], input[type=checkbox], input[type=radio], a, :data(button)"},_create:function(){this.element.addClass("ui-buttonset")},_init:function(){this.refresh()},_setOption:function(e,t){e==="disabled"&&this.buttons.button("option",e,t),this._super(e,t)},refresh:function(){var t=this.element.css("direction")==="rtl";this.buttons=this.element.find(this.options.items).filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":first").addClass(t?"ui-corner-right":"ui-corner-left").end().filter(":last").addClass(t?"ui-corner-left":"ui-corner-right").end().end()},_destroy:function(){this.element.removeClass("ui-buttonset"),this.buttons.map(function(){return e(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy")}})})(jQuery);(function($,undefined){function Datepicker(){this.debug=!1,this._curInst=null,this._keyEvent=!1,this._disabledInputs=[],this._datepickerShowing=!1,this._inDialog=!1,this._mainDivId="ui-datepicker-div",this._inlineClass="ui-datepicker-inline",this._appendClass="ui-datepicker-append",this._triggerClass="ui-datepicker-trigger",this._dialogClass="ui-datepicker-dialog",this._disableClass="ui-datepicker-disabled",this._unselectableClass="ui-datepicker-unselectable",this._currentClass="ui-datepicker-current-day",this._dayOverClass="ui-datepicker-days-cell-over",this.regional=[],this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],weekHeader:"Wk",dateFormat:"mm/dd/yy",firstDay:0,isRTL:!1,showMonthAfterYear:!1,yearSuffix:""},this._defaults={showOn:"focus",showAnim:"fadeIn",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:!1,hideIfNoPrevNext:!1,navigationAsDateFormat:!1,gotoCurrent:!1,changeMonth:!1,changeYear:!1,yearRange:"c-10:c+10",showOtherMonths:!1,selectOtherMonths:!1,showWeek:!1,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"fast",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:!0,showButtonPanel:!1,autoSize:!1,disabled:!1},$.extend(this._defaults,this.regional[""]),this.dpDiv=bindHover($('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}function bindHover(e){var t="button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a";return e.delegate(t,"mouseout",function(){$(this).removeClass("ui-state-hover"),this.className.indexOf("ui-datepicker-prev")!=-1&&$(this).removeClass("ui-datepicker-prev-hover"),this.className.indexOf("ui-datepicker-next")!=-1&&$(this).removeClass("ui-datepicker-next-hover")}).delegate(t,"mouseover",function(){$.datepicker._isDisabledDatepicker(instActive.inline?e.parent()[0]:instActive.input[0])||($(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover"),$(this).addClass("ui-state-hover"),this.className.indexOf("ui-datepicker-prev")!=-1&&$(this).addClass("ui-datepicker-prev-hover"),this.className.indexOf("ui-datepicker-next")!=-1&&$(this).addClass("ui-datepicker-next-hover"))})}function extendRemove(e,t){$.extend(e,t);for(var n in t)if(t[n]==null||t[n]==undefined)e[n]=t[n];return e}$.extend($.ui,{datepicker:{version:"1.9.0"}});var PROP_NAME="datepicker",dpuuid=(new Date).getTime(),instActive;$.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",maxRows:4,log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(e){return extendRemove(this._defaults,e||{}),this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase(),inline=nodeName=="div"||nodeName=="span";target.id||(this.uuid+=1,target.id="dp"+this.uuid);var inst=this._newInst($(target),inline);inst.settings=$.extend({},settings||{},inlineSettings||{}),nodeName=="input"?this._connectDatepicker(target,inst):inline&&this._inlineDatepicker(target,inst)},_newInst:function(e,t){var n=e[0].id.replace(/([^A-Za-z0-9_-])/g,"\\\\$1");return{id:n,input:e,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:t,dpDiv:t?bindHover($('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>')):this.dpDiv}},_connectDatepicker:function(e,t){var n=$(e);t.append=$([]),t.trigger=$([]);if(n.hasClass(this.markerClassName))return;this._attachments(n,t),n.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,n,r){t.settings[n]=r}).bind("getData.datepicker",function(e,n){return this._get(t,n)}),this._autoSize(t),$.data(e,PROP_NAME,t),t.settings.disabled&&this._disableDatepicker(e)},_attachments:function(e,t){var n=this._get(t,"appendText"),r=this._get(t,"isRTL");t.append&&t.append.remove(),n&&(t.append=$('<span class="'+this._appendClass+'">'+n+"</span>"),e[r?"before":"after"](t.append)),e.unbind("focus",this._showDatepicker),t.trigger&&t.trigger.remove();var i=this._get(t,"showOn");(i=="focus"||i=="both")&&e.focus(this._showDatepicker);if(i=="button"||i=="both"){var s=this._get(t,"buttonText"),o=this._get(t,"buttonImage");t.trigger=$(this._get(t,"buttonImageOnly")?$("<img/>").addClass(this._triggerClass).attr({src:o,alt:s,title:s}):$('<button type="button"></button>').addClass(this._triggerClass).html(o==""?s:$("<img/>").attr({src:o,alt:s,title:s}))),e[r?"before":"after"](t.trigger),t.trigger.click(function(){return $.datepicker._datepickerShowing&&$.datepicker._lastInput==e[0]?$.datepicker._hideDatepicker():$.datepicker._datepickerShowing&&$.datepicker._lastInput!=e[0]?($.datepicker._hideDatepicker(),$.datepicker._showDatepicker(e[0])):$.datepicker._showDatepicker(e[0]),!1})}},_autoSize:function(e){if(this._get(e,"autoSize")&&!e.inline){var t=new Date(2009,11,20),n=this._get(e,"dateFormat");if(n.match(/[DM]/)){var r=function(e){var t=0,n=0;for(var r=0;r<e.length;r++)e[r].length>t&&(t=e[r].length,n=r);return n};t.setMonth(r(this._get(e,n.match(/MM/)?"monthNames":"monthNamesShort"))),t.setDate(r(this._get(e,n.match(/DD/)?"dayNames":"dayNamesShort"))+20-t.getDay())}e.input.attr("size",this._formatDate(e,t).length)}},_inlineDatepicker:function(e,t){var n=$(e);if(n.hasClass(this.markerClassName))return;n.addClass(this.markerClassName).append(t.dpDiv).bind("setData.datepicker",function(e,n,r){t.settings[n]=r}).bind("getData.datepicker",function(e,n){return this._get(t,n)}),$.data(e,PROP_NAME,t),this._setDate(t,this._getDefaultDate(t),!0),this._updateDatepicker(t),this._updateAlternate(t),t.settings.disabled&&this._disableDatepicker(e),t.dpDiv.css("display","block")},_dialogDatepicker:function(e,t,n,r,i){var s=this._dialogInst;if(!s){this.uuid+=1;var o="dp"+this.uuid;this._dialogInput=$('<input type="text" id="'+o+'" style="position: absolute; top: -100px; width: 0px;"/>'),this._dialogInput.keydown(this._doKeyDown),$("body").append(this._dialogInput),s=this._dialogInst=this._newInst(this._dialogInput,!1),s.settings={},$.data(this._dialogInput[0],PROP_NAME,s)}extendRemove(s.settings,r||{}),t=t&&t.constructor==Date?this._formatDate(s,t):t,this._dialogInput.val(t),this._pos=i?i.length?i:[i.pageX,i.pageY]:null;if(!this._pos){var u=document.documentElement.clientWidth,a=document.documentElement.clientHeight,f=document.documentElement.scrollLeft||document.body.scrollLeft,l=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[u/2-100+f,a/2-150+l]}return this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px"),s.settings.onSelect=n,this._inDialog=!0,this.dpDiv.addClass(this._dialogClass),this._showDatepicker(this._dialogInput[0]),$.blockUI&&$.blockUI(this.dpDiv),$.data(this._dialogInput[0],PROP_NAME,s),this},_destroyDatepicker:function(e){var t=$(e),n=$.data(e,PROP_NAME);if(!t.hasClass(this.markerClassName))return;var r=e.nodeName.toLowerCase();$.removeData(e,PROP_NAME),r=="input"?(n.append.remove(),n.trigger.remove(),t.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)):(r=="div"||r=="span")&&t.removeClass(this.markerClassName).empty()},_enableDatepicker:function(e){var t=$(e),n=$.data(e,PROP_NAME);if(!t.hasClass(this.markerClassName))return;var r=e.nodeName.toLowerCase();if(r=="input")e.disabled=!1,n.trigger.filter("button").each(function(){this.disabled=!1}).end().filter("img").css({opacity:"1.0",cursor:""});else if(r=="div"||r=="span"){var i=t.children("."+this._inlineClass);i.children().removeClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!1)}this._disabledInputs=$.map(this._disabledInputs,function(t){return t==e?null:t})},_disableDatepicker:function(e){var t=$(e),n=$.data(e,PROP_NAME);if(!t.hasClass(this.markerClassName))return;var r=e.nodeName.toLowerCase();if(r=="input")e.disabled=!0,n.trigger.filter("button").each(function(){this.disabled=!0}).end().filter("img").css({opacity:"0.5",cursor:"default"});else if(r=="div"||r=="span"){var i=t.children("."+this._inlineClass);i.children().addClass("ui-state-disabled"),i.find("select.ui-datepicker-month, select.ui-datepicker-year").prop("disabled",!0)}this._disabledInputs=$.map(this._disabledInputs,function(t){return t==e?null:t}),this._disabledInputs[this._disabledInputs.length]=e},_isDisabledDatepicker:function(e){if(!e)return!1;for(var t=0;t<this._disabledInputs.length;t++)if(this._disabledInputs[t]==e)return!0;return!1},_getInst:function(e){try{return $.data(e,PROP_NAME)}catch(t){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(e,t,n){var r=this._getInst(e);if(arguments.length==2&&typeof t=="string")return t=="defaults"?$.extend({},$.datepicker._defaults):r?t=="all"?$.extend({},r.settings):this._get(r,t):null;var i=t||{};typeof t=="string"&&(i={},i[t]=n);if(r){this._curInst==r&&this._hideDatepicker();var s=this._getDateDatepicker(e,!0),o=this._getMinMaxDate(r,"min"),u=this._getMinMaxDate(r,"max");extendRemove(r.settings,i),o!==null&&i.dateFormat!==undefined&&i.minDate===undefined&&(r.settings.minDate=this._formatDate(r,o)),u!==null&&i.dateFormat!==undefined&&i.maxDate===undefined&&(r.settings.maxDate=this._formatDate(r,u)),this._attachments($(e),r),this._autoSize(r),this._setDate(r,s),this._updateAlternate(r),this._updateDatepicker(r)}},_changeDatepicker:function(e,t,n){this._optionDatepicker(e,t,n)},_refreshDatepicker:function(e){var t=this._getInst(e);t&&this._updateDatepicker(t)},_setDateDatepicker:function(e,t){var n=this._getInst(e);n&&(this._setDate(n,t),this._updateDatepicker(n),this._updateAlternate(n))},_getDateDatepicker:function(e,t){var n=this._getInst(e);return n&&!n.inline&&this._setDateFromField(n,t),n?this._getDate(n):null},_doKeyDown:function(e){var t=$.datepicker._getInst(e.target),n=!0,r=t.dpDiv.is(".ui-datepicker-rtl");t._keyEvent=!0;if($.datepicker._datepickerShowing)switch(e.keyCode){case 9:$.datepicker._hideDatepicker(),n=!1;break;case 13:var i=$("td."+$.datepicker._dayOverClass+":not(."+$.datepicker._currentClass+")",t.dpDiv);i[0]&&$.datepicker._selectDay(e.target,t.selectedMonth,t.selectedYear,i[0]);var s=$.datepicker._get(t,"onSelect");if(s){var o=$.datepicker._formatDate(t);s.apply(t.input?t.input[0]:null,[o,t])}else $.datepicker._hideDatepicker();return!1;case 27:$.datepicker._hideDatepicker();break;case 33:$.datepicker._adjustDate(e.target,e.ctrlKey?-$.datepicker._get(t,"stepBigMonths"):-$.datepicker._get(t,"stepMonths"),"M");break;case 34:$.datepicker._adjustDate(e.target,e.ctrlKey?+$.datepicker._get(t,"stepBigMonths"):+$.datepicker._get(t,"stepMonths"),"M");break;case 35:(e.ctrlKey||e.metaKey)&&$.datepicker._clearDate(e.target),n=e.ctrlKey||e.metaKey;break;case 36:(e.ctrlKey||e.metaKey)&&$.datepicker._gotoToday(e.target),n=e.ctrlKey||e.metaKey;break;case 37:(e.ctrlKey||e.metaKey)&&$.datepicker._adjustDate(e.target,r?1:-1,"D"),n=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&$.datepicker._adjustDate(e.target,e.ctrlKey?-$.datepicker._get(t,"stepBigMonths"):-$.datepicker._get(t,"stepMonths"),"M");break;case 38:(e.ctrlKey||e.metaKey)&&$.datepicker._adjustDate(e.target,-7,"D"),n=e.ctrlKey||e.metaKey;break;case 39:(e.ctrlKey||e.metaKey)&&$.datepicker._adjustDate(e.target,r?-1:1,"D"),n=e.ctrlKey||e.metaKey,e.originalEvent.altKey&&$.datepicker._adjustDate(e.target,e.ctrlKey?+$.datepicker._get(t,"stepBigMonths"):+$.datepicker._get(t,"stepMonths"),"M");break;case 40:(e.ctrlKey||e.metaKey)&&$.datepicker._adjustDate(e.target,7,"D"),n=e.ctrlKey||e.metaKey;break;default:n=!1}else e.keyCode==36&&e.ctrlKey?$.datepicker._showDatepicker(this):n=!1;n&&(e.preventDefault(),e.stopPropagation())},_doKeyPress:function(e){var t=$.datepicker._getInst(e.target);if($.datepicker._get(t,"constrainInput")){var n=$.datepicker._possibleChars($.datepicker._get(t,"dateFormat")),r=String.fromCharCode(e.charCode==undefined?e.keyCode:e.charCode);return e.ctrlKey||e.metaKey||r<" "||!n||n.indexOf(r)>-1}},_doKeyUp:function(e){var t=$.datepicker._getInst(e.target);if(t.input.val()!=t.lastVal)try{var n=$.datepicker.parseDate($.datepicker._get(t,"dateFormat"),t.input?t.input.val():null,$.datepicker._getFormatConfig(t));n&&($.datepicker._setDateFromField(t),$.datepicker._updateAlternate(t),$.datepicker._updateDatepicker(t))}catch(r){$.datepicker.log(r)}return!0},_showDatepicker:function(e){e=e.target||e,e.nodeName.toLowerCase()!="input"&&(e=$("input",e.parentNode)[0]);if($.datepicker._isDisabledDatepicker(e)||$.datepicker._lastInput==e)return;var t=$.datepicker._getInst(e);$.datepicker._curInst&&$.datepicker._curInst!=t&&($.datepicker._curInst.dpDiv.stop(!0,!0),t&&$.datepicker._datepickerShowing&&$.datepicker._hideDatepicker($.datepicker._curInst.input[0]));var n=$.datepicker._get(t,"beforeShow"),r=n?n.apply(e,[e,t]):{};if(r===!1)return;extendRemove(t.settings,r),t.lastVal=null,$.datepicker._lastInput=e,$.datepicker._setDateFromField(t),$.datepicker._inDialog&&(e.value=""),$.datepicker._pos||($.datepicker._pos=$.datepicker._findPos(e),$.datepicker._pos[1]+=e.offsetHeight);var i=!1;$(e).parents().each(function(){return i|=$(this).css("position")=="fixed",!i});var s={left:$.datepicker._pos[0],top:$.datepicker._pos[1]};$.datepicker._pos=null,t.dpDiv.empty(),t.dpDiv.css({position:"absolute",display:"block",top:"-1000px"}),$.datepicker._updateDatepicker(t),s=$.datepicker._checkOffset(t,s,i),t.dpDiv.css({position:$.datepicker._inDialog&&$.blockUI?"static":i?"fixed":"absolute",display:"none",left:s.left+"px",top:s.top+"px"});if(!t.inline){var o=$.datepicker._get(t,"showAnim"),u=$.datepicker._get(t,"duration"),a=function(){var e=t.dpDiv.find("iframe.ui-datepicker-cover");if(!!e.length){var n=$.datepicker._getBorders(t.dpDiv);e.css({left:-n[0],top:-n[1],width:t.dpDiv.outerWidth(),height:t.dpDiv.outerHeight()})}};t.dpDiv.zIndex($(e).zIndex()+1),$.datepicker._datepickerShowing=!0,$.effects&&($.effects.effect[o]||$.effects[o])?t.dpDiv.show(o,$.datepicker._get(t,"showOptions"),u,a):t.dpDiv[o||"show"](o?u:null,a),(!o||!u)&&a(),t.input.is(":visible")&&!t.input.is(":disabled")&&t.input.focus(),$.datepicker._curInst=t}},_updateDatepicker:function(e){this.maxRows=4;var t=$.datepicker._getBorders(e.dpDiv);instActive=e,e.dpDiv.empty().append(this._generateHTML(e)),this._attachHandlers(e);var n=e.dpDiv.find("iframe.ui-datepicker-cover");!n.length||n.css({left:-t[0],top:-t[1],width:e.dpDiv.outerWidth(),height:e.dpDiv.outerHeight()}),e.dpDiv.find("."+this._dayOverClass+" a").mouseover();var r=this._getNumberOfMonths(e),i=r[1],s=17;e.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""),i>1&&e.dpDiv.addClass("ui-datepicker-multi-"+i).css("width",s*i+"em"),e.dpDiv[(r[0]!=1||r[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi"),e.dpDiv[(this._get(e,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"),e==$.datepicker._curInst&&$.datepicker._datepickerShowing&&e.input&&e.input.is(":visible")&&!e.input.is(":disabled")&&e.input[0]!=document.activeElement&&e.input.focus();if(e.yearshtml){var o=e.yearshtml;setTimeout(function(){o===e.yearshtml&&e.yearshtml&&e.dpDiv.find("select.ui-datepicker-year:first").replaceWith(e.yearshtml),o=e.yearshtml=null},0)}},_getBorders:function(e){var t=function(e){return{thin:1,medium:2,thick:3}[e]||e};return[parseFloat(t(e.css("border-left-width"))),parseFloat(t(e.css("border-top-width")))]},_checkOffset:function(e,t,n){var r=e.dpDiv.outerWidth(),i=e.dpDiv.outerHeight(),s=e.input?e.input.outerWidth():0,o=e.input?e.input.outerHeight():0,u=document.documentElement.clientWidth+(n?0:$(document).scrollLeft()),a=document.documentElement.clientHeight+(n?0:$(document).scrollTop());return t.left-=this._get(e,"isRTL")?r-s:0,t.left-=n&&t.left==e.input.offset().left?$(document).scrollLeft():0,t.top-=n&&t.top==e.input.offset().top+o?$(document).scrollTop():0,t.left-=Math.min(t.left,t.left+r>u&&u>r?Math.abs(t.left+r-u):0),t.top-=Math.min(t.top,t.top+i>a&&a>i?Math.abs(i+o):0),t},_findPos:function(e){var t=this._getInst(e),n=this._get(t,"isRTL");while(e&&(e.type=="hidden"||e.nodeType!=1||$.expr.filters.hidden(e)))e=e[n?"previousSibling":"nextSibling"];var r=$(e).offset();return[r.left,r.top]},_hideDatepicker:function(e){var t=this._curInst;if(!t||e&&t!=$.data(e,PROP_NAME))return;if(this._datepickerShowing){var n=this._get(t,"showAnim"),r=this._get(t,"duration"),i=function(){$.datepicker._tidyDialog(t)};$.effects&&($.effects.effect[n]||$.effects[n])?t.dpDiv.hide(n,$.datepicker._get(t,"showOptions"),r,i):t.dpDiv[n=="slideDown"?"slideUp":n=="fadeIn"?"fadeOut":"hide"](n?r:null,i),n||i(),this._datepickerShowing=!1;var s=this._get(t,"onClose");s&&s.apply(t.input?t.input[0]:null,[t.input?t.input.val():"",t]),this._lastInput=null,this._inDialog&&(this._dialogInput.css({position:"absolute",left:"0",top:"-100px"}),$.blockUI&&($.unblockUI(),$("body").append(this.dpDiv))),this._inDialog=!1}},_tidyDialog:function(e){e.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(e){if(!$.datepicker._curInst)return;var t=$(e.target),n=$.datepicker._getInst(t[0]);(t[0].id!=$.datepicker._mainDivId&&t.parents("#"+$.datepicker._mainDivId).length==0&&!t.hasClass($.datepicker.markerClassName)&&!t.closest("."+$.datepicker._triggerClass).length&&$.datepicker._datepickerShowing&&(!$.datepicker._inDialog||!$.blockUI)||t.hasClass($.datepicker.markerClassName)&&$.datepicker._curInst!=n)&&$.datepicker._hideDatepicker()},_adjustDate:function(e,t,n){var r=$(e),i=this._getInst(r[0]);if(this._isDisabledDatepicker(r[0]))return;this._adjustInstDate(i,t+(n=="M"?this._get(i,"showCurrentAtPos"):0),n),this._updateDatepicker(i)},_gotoToday:function(e){var t=$(e),n=this._getInst(t[0]);if(this._get(n,"gotoCurrent")&&n.currentDay)n.selectedDay=n.currentDay,n.drawMonth=n.selectedMonth=n.currentMonth,n.drawYear=n.selectedYear=n.currentYear;else{var r=new Date;n.selectedDay=r.getDate(),n.drawMonth=n.selectedMonth=r.getMonth(),n.drawYear=n.selectedYear=r.getFullYear()}this._notifyChange(n),this._adjustDate(t)},_selectMonthYear:function(e,t,n){var r=$(e),i=this._getInst(r[0]);i["selected"+(n=="M"?"Month":"Year")]=i["draw"+(n=="M"?"Month":"Year")]=parseInt(t.options[t.selectedIndex].value,10),this._notifyChange(i),this._adjustDate(r)},_selectDay:function(e,t,n,r){var i=$(e);if($(r).hasClass(this._unselectableClass)||this._isDisabledDatepicker(i[0]))return;var s=this._getInst(i[0]);s.selectedDay=s.currentDay=$("a",r).html(),s.selectedMonth=s.currentMonth=t,s.selectedYear=s.currentYear=n,this._selectDate(e,this._formatDate(s,s.currentDay,s.currentMonth,s.currentYear))},_clearDate:function(e){var t=$(e),n=this._getInst(t[0]);this._selectDate(t,"")},_selectDate:function(e,t){var n=$(e),r=this._getInst(n[0]);t=t!=null?t:this._formatDate(r),r.input&&r.input.val(t),this._updateAlternate(r);var i=this._get(r,"onSelect");i?i.apply(r.input?r.input[0]:null,[t,r]):r.input&&r.input.trigger("change"),r.inline?this._updateDatepicker(r):(this._hideDatepicker(),this._lastInput=r.input[0],typeof r.input[0]!="object"&&r.input.focus(),this._lastInput=null)},_updateAlternate:function(e){var t=this._get(e,"altField");if(t){var n=this._get(e,"altFormat")||this._get(e,"dateFormat"),r=this._getDate(e),i=this.formatDate(n,r,this._getFormatConfig(e));$(t).each(function(){$(this).val(i)})}},noWeekends:function(e){var t=e.getDay();return[t>0&&t<6,""]},iso8601Week:function(e){var t=new Date(e.getTime());t.setDate(t.getDate()+4-(t.getDay()||7));var n=t.getTime();return t.setMonth(0),t.setDate(1),Math.floor(Math.round((n-t)/864e5)/7)+1},parseDate:function(e,t,n){if(e==null||t==null)throw"Invalid arguments";t=typeof t=="object"?t.toString():t+"";if(t=="")return null;var r=(n?n.shortYearCutoff:null)||this._defaults.shortYearCutoff;r=typeof r!="string"?r:(new Date).getFullYear()%100+parseInt(r,10);var i=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,s=(n?n.dayNames:null)||this._defaults.dayNames,o=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,u=(n?n.monthNames:null)||this._defaults.monthNames,a=-1,f=-1,l=-1,c=-1,h=!1,p=function(t){var n=y+1<e.length&&e.charAt(y+1)==t;return n&&y++,n},d=function(e){var n=p(e),r=e=="@"?14:e=="!"?20:e=="y"&&n?4:e=="o"?3:2,i=new RegExp("^\\d{1,"+r+"}"),s=t.substring(g).match(i);if(!s)throw"Missing number at position "+g;return g+=s[0].length,parseInt(s[0],10)},v=function(e,n,r){var i=$.map(p(e)?r:n,function(e,t){return[[t,e]]}).sort(function(e,t){return-(e[1].length-t[1].length)}),s=-1;$.each(i,function(e,n){var r=n[1];if(t.substr(g,r.length).toLowerCase()==r.toLowerCase())return s=n[0],g+=r.length,!1});if(s!=-1)return s+1;throw"Unknown name at position "+g},m=function(){if(t.charAt(g)!=e.charAt(y))throw"Unexpected literal at position "+g;g++},g=0;for(var y=0;y<e.length;y++)if(h)e.charAt(y)=="'"&&!p("'")?h=!1:m();else switch(e.charAt(y)){case"d":l=d("d");break;case"D":v("D",i,s);break;case"o":c=d("o");break;case"m":f=d("m");break;case"M":f=v("M",o,u);break;case"y":a=d("y");break;case"@":var b=new Date(d("@"));a=b.getFullYear(),f=b.getMonth()+1,l=b.getDate();break;case"!":var b=new Date((d("!")-this._ticksTo1970)/1e4);a=b.getFullYear(),f=b.getMonth()+1,l=b.getDate();break;case"'":p("'")?m():h=!0;break;default:m()}if(g<t.length){var w=t.substr(g);if(!/^\s+/.test(w))throw"Extra/unparsed characters found in date: "+w}a==-1?a=(new Date).getFullYear():a<100&&(a+=(new Date).getFullYear()-(new Date).getFullYear()%100+(a<=r?0:-100));if(c>-1){f=1,l=c;do{var E=this._getDaysInMonth(a,f-1);if(l<=E)break;f++,l-=E}while(!0)}var b=this._daylightSavingAdjust(new Date(a,f-1,l));if(b.getFullYear()!=a||b.getMonth()+1!=f||b.getDate()!=l)throw"Invalid date";return b},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24*60*60*1e7,formatDate:function(e,t,n){if(!t)return"";var r=(n?n.dayNamesShort:null)||this._defaults.dayNamesShort,i=(n?n.dayNames:null)||this._defaults.dayNames,s=(n?n.monthNamesShort:null)||this._defaults.monthNamesShort,o=(n?n.monthNames:null)||this._defaults.monthNames,u=function(t){var n=h+1<e.length&&e.charAt(h+1)==t;return n&&h++,n},a=function(e,t,n){var r=""+t;if(u(e))while(r.length<n)r="0"+r;return r},f=function(e,t,n,r){return u(e)?r[t]:n[t]},l="",c=!1;if(t)for(var h=0;h<e.length;h++)if(c)e.charAt(h)=="'"&&!u("'")?c=!1:l+=e.charAt(h);else switch(e.charAt(h)){case"d":l+=a("d",t.getDate(),2);break;case"D":l+=f("D",t.getDay(),r,i);break;case"o":l+=a("o",Math.round(((new Date(t.getFullYear(),t.getMonth(),t.getDate())).getTime()-(new Date(t.getFullYear(),0,0)).getTime())/864e5),3);break;case"m":l+=a("m",t.getMonth()+1,2);break;case"M":l+=f("M",t.getMonth(),s,o);break;case"y":l+=u("y")?t.getFullYear():(t.getYear()%100<10?"0":"")+t.getYear()%100;break;case"@":l+=t.getTime();break;case"!":l+=t.getTime()*1e4+this._ticksTo1970;break;case"'":u("'")?l+="'":c=!0;break;default:l+=e.charAt(h)}return l},_possibleChars:function(e){var t="",n=!1,r=function(t){var n=i+1<e.length&&e.charAt(i+1)==t;return n&&i++,n};for(var i=0;i<e.length;i++)if(n)e.charAt(i)=="'"&&!r("'")?n=!1:t+=e.charAt(i);else switch(e.charAt(i)){case"d":case"m":case"y":case"@":t+="0123456789";break;case"D":case"M":return null;case"'":r("'")?t+="'":n=!0;break;default:t+=e.charAt(i)}return t},_get:function(e,t){return e.settings[t]!==undefined?e.settings[t]:this._defaults[t]},_setDateFromField:function(e,t){if(e.input.val()==e.lastVal)return;var n=this._get(e,"dateFormat"),r=e.lastVal=e.input?e.input.val():null,i,s;i=s=this._getDefaultDate(e);var o=this._getFormatConfig(e);try{i=this.parseDate(n,r,o)||s}catch(u){this.log(u),r=t?"":r}e.selectedDay=i.getDate(),e.drawMonth=e.selectedMonth=i.getMonth(),e.drawYear=e.selectedYear=i.getFullYear(),e.currentDay=r?i.getDate():0,e.currentMonth=r?i.getMonth():0,e.currentYear=r?i.getFullYear():0,this._adjustInstDate(e)},_getDefaultDate:function(e){return this._restrictMinMax(e,this._determineDate(e,this._get(e,"defaultDate"),new Date))},_determineDate:function(e,t,n){var r=function(e){var t=new Date;return t.setDate(t.getDate()+e),t},i=function(t){try{return $.datepicker.parseDate($.datepicker._get(e,"dateFormat"),t,$.datepicker._getFormatConfig(e))}catch(n){}var r=(t.toLowerCase().match(/^c/)?$.datepicker._getDate(e):null)||new Date,i=r.getFullYear(),s=r.getMonth(),o=r.getDate(),u=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g,a=u.exec(t);while(a){switch(a[2]||"d"){case"d":case"D":o+=parseInt(a[1],10);break;case"w":case"W":o+=parseInt(a[1],10)*7;break;case"m":case"M":s+=parseInt(a[1],10),o=Math.min(o,$.datepicker._getDaysInMonth(i,s));break;case"y":case"Y":i+=parseInt(a[1],10),o=Math.min(o,$.datepicker._getDaysInMonth(i,s))}a=u.exec(t)}return new Date(i,s,o)},s=t==null||t===""?n:typeof t=="string"?i(t):typeof t=="number"?isNaN(t)?n:r(t):new Date(t.getTime());return s=s&&s.toString()=="Invalid Date"?n:s,s&&(s.setHours(0),s.setMinutes(0),s.setSeconds(0),s.setMilliseconds(0)),this._daylightSavingAdjust(s)},_daylightSavingAdjust:function(e){return e?(e.setHours(e.getHours()>12?e.getHours()+2:0),e):null},_setDate:function(e,t,n){var r=!t,i=e.selectedMonth,s=e.selectedYear,o=this._restrictMinMax(e,this._determineDate(e,t,new Date));e.selectedDay=e.currentDay=o.getDate(),e.drawMonth=e.selectedMonth=e.currentMonth=o.getMonth(),e.drawYear=e.selectedYear=e.currentYear=o.getFullYear(),(i!=e.selectedMonth||s!=e.selectedYear)&&!n&&this._notifyChange(e),this._adjustInstDate(e),e.input&&e.input.val(r?"":this._formatDate(e))},_getDate:function(e){var t=!e.currentYear||e.input&&e.input.val()==""?null:this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return t},_attachHandlers:function(e){var t=this._get(e,"stepMonths"),n="#"+e.id.replace(/\\\\/g,"\\");e.dpDiv.find("[data-handler]").map(function(){var e={prev:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(n,-t,"M")},next:function(){window["DP_jQuery_"+dpuuid].datepicker._adjustDate(n,+t,"M")},hide:function(){window["DP_jQuery_"+dpuuid].datepicker._hideDatepicker()},today:function(){window["DP_jQuery_"+dpuuid].datepicker._gotoToday(n)},selectDay:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectDay(n,+this.getAttribute("data-month"),+this.getAttribute("data-year"),this),!1},selectMonth:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(n,this,"M"),!1},selectYear:function(){return window["DP_jQuery_"+dpuuid].datepicker._selectMonthYear(n,this,"Y"),!1}};$(this).bind(this.getAttribute("data-event"),e[this.getAttribute("data-handler")])})},_generateHTML:function(e){var t=new Date;t=this._daylightSavingAdjust(new Date(t.getFullYear(),t.getMonth(),t.getDate()));var n=this._get(e,"isRTL"),r=this._get(e,"showButtonPanel"),i=this._get(e,"hideIfNoPrevNext"),s=this._get(e,"navigationAsDateFormat"),o=this._getNumberOfMonths(e),u=this._get(e,"showCurrentAtPos"),a=this._get(e,"stepMonths"),f=o[0]!=1||o[1]!=1,l=this._daylightSavingAdjust(e.currentDay?new Date(e.currentYear,e.currentMonth,e.currentDay):new Date(9999,9,9)),c=this._getMinMaxDate(e,"min"),h=this._getMinMaxDate(e,"max"),p=e.drawMonth-u,d=e.drawYear;p<0&&(p+=12,d--);if(h){var v=this._daylightSavingAdjust(new Date(h.getFullYear(),h.getMonth()-o[0]*o[1]+1,h.getDate()));v=c&&v<c?c:v;while(this._daylightSavingAdjust(new Date(d,p,1))>v)p--,p<0&&(p=11,d--)}e.drawMonth=p,e.drawYear=d;var m=this._get(e,"prevText");m=s?this.formatDate(m,this._daylightSavingAdjust(new Date(d,p-a,1)),this._getFormatConfig(e)):m;var g=this._canAdjustMonth(e,-1,d,p)?'<a class="ui-datepicker-prev ui-corner-all" data-handler="prev" data-event="click" title="'+m+'"><span class="ui-icon ui-icon-circle-triangle-'+(n?"e":"w")+'">'+m+"</span></a>":i?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+m+'"><span class="ui-icon ui-icon-circle-triangle-'+(n?"e":"w")+'">'+m+"</span></a>",y=this._get(e,"nextText");y=s?this.formatDate(y,this._daylightSavingAdjust(new Date(d,p+a,1)),this._getFormatConfig(e)):y;var b=this._canAdjustMonth(e,1,d,p)?'<a class="ui-datepicker-next ui-corner-all" data-handler="next" data-event="click" title="'+y+'"><span class="ui-icon ui-icon-circle-triangle-'+(n?"w":"e")+'">'+y+"</span></a>":i?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+y+'"><span class="ui-icon ui-icon-circle-triangle-'+(n?"w":"e")+'">'+y+"</span></a>",w=this._get(e,"currentText"),E=this._get(e,"gotoCurrent")&&e.currentDay?l:t;w=s?this.formatDate(w,E,this._getFormatConfig(e)):w;var S=e.inline?"":'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" data-handler="hide" data-event="click">'+this._get(e,"closeText")+"</button>",x=r?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(n?S:"")+(this._isInRange(e,E)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" data-handler="today" data-event="click">'+w+"</button>":"")+(n?"":S)+"</div>":"",T=parseInt(this._get(e,"firstDay"),10);T=isNaN(T)?0:T;var N=this._get(e,"showWeek"),C=this._get(e,"dayNames"),k=this._get(e,"dayNamesShort"),L=this._get(e,"dayNamesMin"),A=this._get(e,"monthNames"),O=this._get(e,"monthNamesShort"),M=this._get(e,"beforeShowDay"),_=this._get(e,"showOtherMonths"),D=this._get(e,"selectOtherMonths"),P=this._get(e,"calculateWeek")||this.iso8601Week,H=this._getDefaultDate(e),B="";for(var j=0;j<o[0];j++){var F="";this.maxRows=4;for(var I=0;I<o[1];I++){var q=this._daylightSavingAdjust(new Date(d,p,e.selectedDay)),R=" ui-corner-all",U="";if(f){U+='<div class="ui-datepicker-group';if(o[1]>1)switch(I){case 0:U+=" ui-datepicker-group-first",R=" ui-corner-"+(n?"right":"left");break;case o[1]-1:U+=" ui-datepicker-group-last",R=" ui-corner-"+(n?"left":"right");break;default:U+=" ui-datepicker-group-middle",R=""}U+='">'}U+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+R+'">'+(/all|left/.test(R)&&j==0?n?b:g:"")+(/all|right/.test(R)&&j==0?n?g:b:"")+this._generateMonthYearHeader(e,p,d,c,h,j>0||I>0,A,O)+'</div><table class="ui-datepicker-calendar"><thead>'+"<tr>";var z=N?'<th class="ui-datepicker-week-col">'+this._get(e,"weekHeader")+"</th>":"";for(var W=0;W<7;W++){var X=(W+T)%7;z+="<th"+((W+T+6)%7>=5?' class="ui-datepicker-week-end"':"")+">"+'<span title="'+C[X]+'">'+L[X]+"</span></th>"}U+=z+"</tr></thead><tbody>";var V=this._getDaysInMonth(d,p);d==e.selectedYear&&p==e.selectedMonth&&(e.selectedDay=Math.min(e.selectedDay,V));var J=(this._getFirstDayOfMonth(d,p)-T+7)%7,K=Math.ceil((J+V)/7),Q=f?this.maxRows>K?this.maxRows:K:K;this.maxRows=Q;var G=this._daylightSavingAdjust(new Date(d,p,1-J));for(var Y=0;Y<Q;Y++){U+="<tr>";var Z=N?'<td class="ui-datepicker-week-col">'+this._get(e,"calculateWeek")(G)+"</td>":"";for(var W=0;W<7;W++){var et=M?M.apply(e.input?e.input[0]:null,[G]):[!0,""],tt=G.getMonth()!=p,nt=tt&&!D||!et[0]||c&&G<c||h&&G>h;Z+='<td class="'+((W+T+6)%7>=5?" ui-datepicker-week-end":"")+(tt?" ui-datepicker-other-month":"")+(G.getTime()==q.getTime()&&p==e.selectedMonth&&e._keyEvent||H.getTime()==G.getTime()&&H.getTime()==q.getTime()?" "+this._dayOverClass:"")+(nt?" "+this._unselectableClass+" ui-state-disabled":"")+(tt&&!_?"":" "+et[1]+(G.getTime()==l.getTime()?" "+this._currentClass:"")+(G.getTime()==t.getTime()?" ui-datepicker-today":""))+'"'+((!tt||_)&&et[2]?' title="'+et[2]+'"':"")+(nt?"":' data-handler="selectDay" data-event="click" data-month="'+G.getMonth()+'" data-year="'+G.getFullYear()+'"')+">"+(tt&&!_?"&#xa0;":nt?'<span class="ui-state-default">'+G.getDate()+"</span>":'<a class="ui-state-default'+(G.getTime()==t.getTime()?" ui-state-highlight":"")+(G.getTime()==l.getTime()?" ui-state-active":"")+(tt?" ui-priority-secondary":"")+'" href="#">'+G.getDate()+"</a>")+"</td>",G.setDate(G.getDate()+1),G=this._daylightSavingAdjust(G)}U+=Z+"</tr>"}p++,p>11&&(p=0,d++),U+="</tbody></table>"+(f?"</div>"+(o[0]>0&&I==o[1]-1?'<div class="ui-datepicker-row-break"></div>':""):""),F+=U}B+=F}return B+=x+($.browser.msie&&parseInt($.browser.version,10)<7&&!e.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':""),e._keyEvent=!1,B},_generateMonthYearHeader:function(e,t,n,r,i,s,o,u){var a=this._get(e,"changeMonth"),f=this._get(e,"changeYear"),l=this._get(e,"showMonthAfterYear"),c='<div class="ui-datepicker-title">',h="";if(s||!a)h+='<span class="ui-datepicker-month">'+o[t]+"</span>";else{var p=r&&r.getFullYear()==n,d=i&&i.getFullYear()==n;h+='<select class="ui-datepicker-month" data-handler="selectMonth" data-event="change">';for(var v=0;v<12;v++)(!p||v>=r.getMonth())&&(!d||v<=i.getMonth())&&(h+='<option value="'+v+'"'+(v==t?' selected="selected"':"")+">"+u[v]+"</option>");h+="</select>"}l||(c+=h+(s||!a||!f?"&#xa0;":""));if(!e.yearshtml){e.yearshtml="";if(s||!f)c+='<span class="ui-datepicker-year">'+n+"</span>";else{var m=this._get(e,"yearRange").split(":"),g=(new Date).getFullYear(),y=function(e){var t=e.match(/c[+-].*/)?n+parseInt(e.substring(1),10):e.match(/[+-].*/)?g+parseInt(e,10):parseInt(e,10);return isNaN(t)?g:t},b=y(m[0]),w=Math.max(b,y(m[1]||""));b=r?Math.max(b,r.getFullYear()):b,w=i?Math.min(w,i.getFullYear()):w,e.yearshtml+='<select class="ui-datepicker-year" data-handler="selectYear" data-event="change">';for(;b<=w;b++)e.yearshtml+='<option value="'+b+'"'+(b==n?' selected="selected"':"")+">"+b+"</option>";e.yearshtml+="</select>",c+=e.yearshtml,e.yearshtml=null}}return c+=this._get(e,"yearSuffix"),l&&(c+=(s||!a||!f?"&#xa0;":"")+h),c+="</div>",c},_adjustInstDate:function(e,t,n){var r=e.drawYear+(n=="Y"?t:0),i=e.drawMonth+(n=="M"?t:0),s=Math.min(e.selectedDay,this._getDaysInMonth(r,i))+(n=="D"?t:0),o=this._restrictMinMax(e,this._daylightSavingAdjust(new Date(r,i,s)));e.selectedDay=o.getDate(),e.drawMonth=e.selectedMonth=o.getMonth(),e.drawYear=e.selectedYear=o.getFullYear(),(n=="M"||n=="Y")&&this._notifyChange(e)},_restrictMinMax:function(e,t){var n=this._getMinMaxDate(e,"min"),r=this._getMinMaxDate(e,"max"),i=n&&t<n?n:t;return i=r&&i>r?r:i,i},_notifyChange:function(e){var t=this._get(e,"onChangeMonthYear");t&&t.apply(e.input?e.input[0]:null,[e.selectedYear,e.selectedMonth+1,e])},_getNumberOfMonths:function(e){var t=this._get(e,"numberOfMonths");return t==null?[1,1]:typeof t=="number"?[1,t]:t},_getMinMaxDate:function(e,t){return this._determineDate(e,this._get(e,t+"Date"),null)},_getDaysInMonth:function(e,t){return 32-this._daylightSavingAdjust(new Date(e,t,32)).getDate()},_getFirstDayOfMonth:function(e,t){return(new Date(e,t,1)).getDay()},_canAdjustMonth:function(e,t,n,r){var i=this._getNumberOfMonths(e),s=this._daylightSavingAdjust(new Date(n,r+(t<0?t:i[0]*i[1]),1));return t<0&&s.setDate(this._getDaysInMonth(s.getFullYear(),s.getMonth())),this._isInRange(e,s)},_isInRange:function(e,t){var n=this._getMinMaxDate(e,"min"),r=this._getMinMaxDate(e,"max");return(!n||t.getTime()>=n.getTime())&&(!r||t.getTime()<=r.getTime())},_getFormatConfig:function(e){var t=this._get(e,"shortYearCutoff");return t=typeof t!="string"?t:(new Date).getFullYear()%100+parseInt(t,10),{shortYearCutoff:t,dayNamesShort:this._get(e,"dayNamesShort"),dayNames:this._get(e,"dayNames"),monthNamesShort:this._get(e,"monthNamesShort"),monthNames:this._get(e,"monthNames")}},_formatDate:function(e,t,n,r){t||(e.currentDay=e.selectedDay,e.currentMonth=e.selectedMonth,e.currentYear=e.selectedYear);var i=t?typeof t=="object"?t:this._daylightSavingAdjust(new Date(r,n,t)):this._daylightSavingAdjust(new Date(e.currentYear,e.currentMonth,e.currentDay));return this.formatDate(this._get(e,"dateFormat"),i,this._getFormatConfig(e))}}),$.fn.datepicker=function(e){if(!this.length)return this;$.datepicker.initialized||($(document).mousedown($.datepicker._checkExternalClick).find(document.body).append($.datepicker.dpDiv),$.datepicker.initialized=!0);var t=Array.prototype.slice.call(arguments,1);return typeof e!="string"||e!="isDisabled"&&e!="getDate"&&e!="widget"?e=="option"&&arguments.length==2&&typeof arguments[1]=="string"?$.datepicker["_"+e+"Datepicker"].apply($.datepicker,[this[0]].concat(t)):this.each(function(){typeof e=="string"?$.datepicker["_"+e+"Datepicker"].apply($.datepicker,[this].concat(t)):$.datepicker._attachDatepicker(this,e)}):$.datepicker["_"+e+"Datepicker"].apply($.datepicker,[this[0]].concat(t))},$.datepicker=new Datepicker,$.datepicker.initialized=!1,$.datepicker.uuid=(new Date).getTime(),$.datepicker.version="1.9.0",window["DP_jQuery_"+dpuuid]=$})(jQuery);(function(e,t){var n="ui-dialog ui-widget ui-widget-content ui-corner-all ",r={buttons:!0,height:!0,maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0,width:!0},i={maxHeight:!0,maxWidth:!0,minHeight:!0,minWidth:!0};e.widget("ui.dialog",{version:"1.9.0",options:{autoOpen:!0,buttons:{},closeOnEscape:!0,closeText:"close",dialogClass:"",draggable:!0,hide:null,height:"auto",maxHeight:!1,maxWidth:!1,minHeight:150,minWidth:150,modal:!1,position:{my:"center",at:"center",of:window,collision:"fit",using:function(t){var n=e(this).css(t).offset().top;n<0&&e(this).css("top",t.top-n)}},resizable:!0,show:null,stack:!0,title:"",width:300,zIndex:1e3},_create:function(){this.originalTitle=this.element.attr("title"),typeof this.originalTitle!="string"&&(this.originalTitle=""),this.oldPosition={parent:this.element.parent(),index:this.element.parent().children().index(this.element)},this.options.title=this.options.title||this.originalTitle;var t=this,r=this.options,i=r.title||"&#160;",s=(this.uiDialog=e("<div>")).addClass(n+r.dialogClass).css({display:"none",outline:0,zIndex:r.zIndex}).attr("tabIndex",-1).keydown(function(n){r.closeOnEscape&&!n.isDefaultPrevented()&&n.keyCode&&n.keyCode===e.ui.keyCode.ESCAPE&&(t.close(n),n.preventDefault())}).mousedown(function(e){t.moveToTop(!1,e)}).appendTo("body"),o=this.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(s),u=(this.uiDialogTitlebar=e("<div>")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(s),a=e("<a href='#'></a>").addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").click(function(e){e.preventDefault(),t.close(e)}).appendTo(u),f=(this.uiDialogTitlebarCloseText=e("<span>")).addClass("ui-icon ui-icon-closethick").text(r.closeText).appendTo(a),l=e("<span>").uniqueId().addClass("ui-dialog-title").html(i).prependTo(u),c=(this.uiDialogButtonPane=e("<div>")).addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),h=(this.uiButtonSet=e("<div>")).addClass("ui-dialog-buttonset").appendTo(c);s.attr({role:"dialog","aria-labelledby":l.attr("id")}),u.find("*").add(u).disableSelection(),this._hoverable(a),this._focusable(a),r.draggable&&e.fn.draggable&&this._makeDraggable(),r.resizable&&e.fn.resizable&&this._makeResizable(),this._createButtons(r.buttons),this._isOpen=!1,e.fn.bgiframe&&s.bgiframe(),this._on(s,{keydown:function(t){if(!r.modal||t.keyCode!==e.ui.keyCode.TAB)return;var n=e(":tabbable",s),i=n.filter(":first"),o=n.filter(":last");if(t.target===o[0]&&!t.shiftKey)return i.focus(1),!1;if(t.target===i[0]&&t.shiftKey)return o.focus(1),!1}})},_init:function(){this.options.autoOpen&&this.open()},_destroy:function(){var e,t=this.oldPosition;this.overlay&&this.overlay.destroy(),this.uiDialog.hide(),this.element.removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body"),this.uiDialog.remove(),this.originalTitle&&this.element.attr("title",this.originalTitle),e=t.parent.children().eq(t.index),e.length&&e[0]!==this.element[0]?e.before(this.element):t.parent.append(this.element)},widget:function(){return this.uiDialog},close:function(t){var n=this,r,i;if(!this._isOpen)return;if(!1===this._trigger("beforeClose",t))return;return this._isOpen=!1,this.overlay&&this.overlay.destroy(),this.options.hide?this.uiDialog.hide(this.options.hide,function(){n._trigger("close",t)}):(this.uiDialog.hide(),this._trigger("close",t)),e.ui.dialog.overlay.resize(),this.options.modal&&(r=0,e(".ui-dialog").each(function(){this!==n.uiDialog[0]&&(i=e(this).css("z-index"),isNaN(i)||(r=Math.max(r,i)))}),e.ui.dialog.maxZ=r),this},isOpen:function(){return this._isOpen},moveToTop:function(t,n){var r=this.options,i;return r.modal&&!t||!r.stack&&!r.modal?this._trigger("focus",n):(r.zIndex>e.ui.dialog.maxZ&&(e.ui.dialog.maxZ=r.zIndex),this.overlay&&(e.ui.dialog.maxZ+=1,e.ui.dialog.overlay.maxZ=e.ui.dialog.maxZ,this.overlay.$el.css("z-index",e.ui.dialog.overlay.maxZ)),i={scrollTop:this.element.scrollTop(),scrollLeft:this.element.scrollLeft()},e.ui.dialog.maxZ+=1,this.uiDialog.css("z-index",e.ui.dialog.maxZ),this.element.attr(i),this._trigger("focus",n),this)},open:function(){if(this._isOpen)return;var t,n=this.options,r=this.uiDialog;return this._size(),this._position(n.position),r.show(n.show),this.overlay=n.modal?new e.ui.dialog.overlay(this):null,this.moveToTop(!0),t=this.element.find(":tabbable"),t.length||(t=this.uiDialogButtonPane.find(":tabbable"),t.length||(t=r)),t.eq(0).focus(),this._isOpen=!0,this._trigger("open"),this},_createButtons:function(t){var n,r,i=this,s=!1;this.uiDialogButtonPane.remove(),this.uiButtonSet.empty(),typeof t=="object"&&t!==null&&e.each(t,function(){return!(s=!0)}),s?(e.each(t,function(t,n){n=e.isFunction(n)?{click:n,text:t}:n;var r=e("<button type='button'>").attr(n,!0).unbind("click").click(function(){n.click.apply(i.element[0],arguments)}).appendTo(i.uiButtonSet);e.fn.button&&r.button()}),this.uiDialog.addClass("ui-dialog-buttons"),this.uiDialogButtonPane.appendTo(this.uiDialog)):this.uiDialog.removeClass("ui-dialog-buttons")},_makeDraggable:function(){function r(e){return{position:e.position,offset:e.offset}}var t=this,n=this.options;this.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(n,i){e(this).addClass("ui-dialog-dragging"),t._trigger("dragStart",n,r(i))},drag:function(e,n){t._trigger("drag",e,r(n))},stop:function(i,s){n.position=[s.position.left-t.document.scrollLeft(),s.position.top-t.document.scrollTop()],e(this).removeClass("ui-dialog-dragging"),t._trigger("dragStop",i,r(s)),e.ui.dialog.overlay.resize()}})},_makeResizable:function(n){function u(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}n=n===t?this.options.resizable:n;var r=this,i=this.options,s=this.uiDialog.css("position"),o=typeof n=="string"?n:"n,e,s,w,se,sw,ne,nw";this.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:this.element,maxWidth:i.maxWidth,maxHeight:i.maxHeight,minWidth:i.minWidth,minHeight:this._minHeight(),handles:o,start:function(t,n){e(this).addClass("ui-dialog-resizing"),r._trigger("resizeStart",t,u(n))},resize:function(e,t){r._trigger("resize",e,u(t))},stop:function(t,n){e(this).removeClass("ui-dialog-resizing"),i.height=e(this).height(),i.width=e(this).width(),r._trigger("resizeStop",t,u(n)),e.ui.dialog.overlay.resize()}}).css("position",s).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var e=this.options;return e.height==="auto"?e.minHeight:Math.min(e.minHeight,e.height)},_position:function(t){var n=[],r=[0,0],i;if(t){if(typeof t=="string"||typeof t=="object"&&"0"in t)n=t.split?t.split(" "):[t[0],t[1]],n.length===1&&(n[1]=n[0]),e.each(["left","top"],function(e,t){+n[e]===n[e]&&(r[e]=n[e],n[e]=t)}),t={my:n.join(" "),at:n.join(" "),offset:r.join(" ")};t=e.extend({},e.ui.dialog.prototype.options.position,t)}else t=e.ui.dialog.prototype.options.position;i=this.uiDialog.is(":visible"),i||this.uiDialog.show(),this.uiDialog.position(t),i||this.uiDialog.hide()},_setOptions:function(t){var n=this,s={},o=!1;e.each(t,function(e,t){n._setOption(e,t),e in r&&(o=!0),e in i&&(s[e]=t)}),o&&this._size(),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option",s)},_setOption:function(t,r){var i,s,o=this.uiDialog;switch(t){case"buttons":this._createButtons(r);break;case"closeText":this.uiDialogTitlebarCloseText.text(""+r);break;case"dialogClass":o.removeClass(this.options.dialogClass).addClass(n+r);break;case"disabled":r?o.addClass("ui-dialog-disabled"):o.removeClass("ui-dialog-disabled");break;case"draggable":i=o.is(":data(draggable)"),i&&!r&&o.draggable("destroy"),!i&&r&&this._makeDraggable();break;case"position":this._position(r);break;case"resizable":s=o.is(":data(resizable)"),s&&!r&&o.resizable("destroy"),s&&typeof r=="string"&&o.resizable("option","handles",r),!s&&r!==!1&&this._makeResizable(r);break;case"title":e(".ui-dialog-title",this.uiDialogTitlebar).html(""+(r||"&#160;"))}this._super(t,r)},_size:function(){var t,n,r,i=this.options,s=this.uiDialog.is(":visible");this.element.show().css({width:"auto",minHeight:0,height:0}),i.minWidth>i.width&&(i.width=i.minWidth),t=this.uiDialog.css({height:"auto",width:i.width}).outerHeight(),n=Math.max(0,i.minHeight-t),i.height==="auto"?e.support.minHeight?this.element.css({minHeight:n,height:"auto"}):(this.uiDialog.show(),r=this.element.css("height","auto").height(),s||this.uiDialog.hide(),this.element.height(Math.max(r,n))):this.element.height(Math.max(i.height-t,0)),this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}}),e.extend(e.ui.dialog,{uuid:0,maxZ:0,getTitleId:function(e){var t=e.attr("id");return t||(this.uuid+=1,t=this.uuid),"ui-dialog-title-"+t},overlay:function(t){this.$el=e.ui.dialog.overlay.create(t)}}),e.extend(e.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:e.map("focus,mousedown,mouseup,keydown,keypress,click".split(","),function(e){return e+".dialog-overlay"}).join(" "),create:function(t){this.instances.length===0&&(setTimeout(function(){e.ui.dialog.overlay.instances.length&&e(document).bind(e.ui.dialog.overlay.events,function(t){if(e(t.target).zIndex()<e.ui.dialog.overlay.maxZ)return!1})},1),e(window).bind("resize.dialog-overlay",e.ui.dialog.overlay.resize));var n=this.oldInstances.pop()||e("<div>").addClass("ui-widget-overlay");return e(document).bind("keydown.dialog-overlay",function(r){var i=e.ui.dialog.overlay.instances;i.length!==0&&i[i.length-1]===n&&t.options.closeOnEscape&&!r.isDefaultPrevented()&&r.keyCode&&r.keyCode===e.ui.keyCode.ESCAPE&&(t.close(r),r.preventDefault())}),n.appendTo(document.body).css({width:this.width(),height:this.height()}),e.fn.bgiframe&&n.bgiframe(),this.instances.push(n),n},destroy:function(t){var n=e.inArray(t,this.instances),r=0;n!==-1&&this.oldInstances.push(this.instances.splice(n,1)[0]),this.instances.length===0&&e([document,window]).unbind(".dialog-overlay"),t.height(0).width(0).remove(),e.each(this.instances,function(){r=Math.max(r,this.css("z-index"))}),this.maxZ=r},height:function(){var t,n;return e.browser.msie?(t=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight),n=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight),t<n?e(window).height()+"px":t+"px"):e(document).height()+"px"},width:function(){var t,n;return e.browser.msie?(t=Math.max(document.documentElement.scrollWidth,document.body.scrollWidth),n=Math.max(document.documentElement.offsetWidth,document.body.offsetWidth),t<n?e(window).width()+"px":t+"px"):e(document).width()+"px"},resize:function(){var t=e([]);e.each(e.ui.dialog.overlay.instances,function(){t=t.add(this)}),t.css({width:0,height:0}).css({width:e.ui.dialog.overlay.width(),height:e.ui.dialog.overlay.height()})}}),e.extend(e.ui.dialog.overlay.prototype,{destroy:function(){e.ui.dialog.overlay.destroy(this.$el)}})})(jQuery);(function(e,t){e.widget("ui.draggable",e.ui.mouse,{version:"1.9.0",widgetEventPrefix:"drag",options:{addClasses:!0,appendTo:"parent",axis:!1,connectToSortable:!1,containment:!1,cursor:"auto",cursorAt:!1,grid:!1,handle:!1,helper:"original",iframeFix:!1,opacity:!1,refreshPositions:!1,revert:!1,revertDuration:500,scope:"default",scroll:!0,scrollSensitivity:20,scrollSpeed:20,snap:!1,snapMode:"both",snapTolerance:20,stack:!1,zIndex:!1},_create:function(){this.options.helper=="original"&&!/^(?:r|a|f)/.test(this.element.css("position"))&&(this.element[0].style.position="relative"),this.options.addClasses&&this.element.addClass("ui-draggable"),this.options.disabled&&this.element.addClass("ui-draggable-disabled"),this._mouseInit()},_destroy:function(){this.element.removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled"),this._mouseDestroy()},_mouseCapture:function(t){var n=this.options;return this.helper||n.disabled||e(t.target).is(".ui-resizable-handle")?!1:(this.handle=this._getHandle(t),this.handle?(e(n.iframeFix===!0?"iframe":n.iframeFix).each(function(){e('<div class="ui-draggable-iframeFix" style="background: #fff;"></div>').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1e3}).css(e(this).offset()).appendTo("body")}),!0):!1)},_mouseStart:function(t){var n=this.options;return this.helper=this._createHelper(t),this.helper.addClass("ui-draggable-dragging"),this._cacheHelperProportions(),e.ui.ddmanager&&(e.ui.ddmanager.current=this),this._cacheMargins(),this.cssPosition=this.helper.css("position"),this.scrollParent=this.helper.scrollParent(),this.offset=this.positionAbs=this.element.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.originalPosition=this.position=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,n.cursorAt&&this._adjustOffsetFromHelper(n.cursorAt),n.containment&&this._setContainment(),this._trigger("start",t)===!1?(this._clear(),!1):(this._cacheHelperProportions(),e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this._mouseDrag(t,!0),e.ui.ddmanager&&e.ui.ddmanager.dragStart(this,t),!0)},_mouseDrag:function(t,n){this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute");if(!n){var r=this._uiHash();if(this._trigger("drag",t,r)===!1)return this._mouseUp({}),!1;this.position=r.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";return e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),!1},_mouseStop:function(t){var n=!1;e.ui.ddmanager&&!this.options.dropBehaviour&&(n=e.ui.ddmanager.drop(this,t)),this.dropped&&(n=this.dropped,this.dropped=!1);var r=this.element[0],i=!1;while(r&&(r=r.parentNode))r==document&&(i=!0);if(!i&&this.options.helper==="original")return!1;if(this.options.revert=="invalid"&&!n||this.options.revert=="valid"&&n||this.options.revert===!0||e.isFunction(this.options.revert)&&this.options.revert.call(this.element,n)){var s=this;e(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){s._trigger("stop",t)!==!1&&s._clear()})}else this._trigger("stop",t)!==!1&&this._clear();return!1},_mouseUp:function(t){return e("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)}),e.ui.ddmanager&&e.ui.ddmanager.dragStop(this,t),e.ui.mouse.prototype._mouseUp.call(this,t)},cancel:function(){return this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear(),this},_getHandle:function(t){var n=!this.options.handle||!e(this.options.handle,this.element).length?!0:!1;return e(this.options.handle,this.element).find("*").andSelf().each(function(){this==t.target&&(n=!0)}),n},_createHelper:function(t){var n=this.options,r=e.isFunction(n.helper)?e(n.helper.apply(this.element[0],[t])):n.helper=="clone"?this.element.clone().removeAttr("id"):this.element;return r.parents("body").length||r.appendTo(n.appendTo=="parent"?this.element[0].parentNode:n.appendTo),r[0]!=this.element[0]&&!/(fixed|absolute)/.test(r.css("position"))&&r.css("position","absolute"),r},_adjustOffsetFromHelper:function(t){typeof t=="string"&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&e.browser.msie)t={top:0,left:0};return{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var e=this.element.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0,right:parseInt(this.element.css("marginRight"),10)||0,bottom:parseInt(this.element.css("marginBottom"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t=this.options;t.containment=="parent"&&(t.containment=this.helper[0].parentNode);if(t.containment=="document"||t.containment=="window")this.containment=[t.containment=="document"?0:e(window).scrollLeft()-this.offset.relative.left-this.offset.parent.left,t.containment=="document"?0:e(window).scrollTop()-this.offset.relative.top-this.offset.parent.top,(t.containment=="document"?0:e(window).scrollLeft())+e(t.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(t.containment=="document"?0:e(window).scrollTop())+(e(t.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(t.containment)&&t.containment.constructor!=Array){var n=e(t.containment),r=n[0];if(!r)return;var i=n.offset(),s=e(r).css("overflow")!="hidden";this.containment=[(parseInt(e(r).css("borderLeftWidth"),10)||0)+(parseInt(e(r).css("paddingLeft"),10)||0),(parseInt(e(r).css("borderTopWidth"),10)||0)+(parseInt(e(r).css("paddingTop"),10)||0),(s?Math.max(r.scrollWidth,r.offsetWidth):r.offsetWidth)-(parseInt(e(r).css("borderLeftWidth"),10)||0)-(parseInt(e(r).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left-this.margins.right,(s?Math.max(r.scrollHeight,r.offsetHeight):r.offsetHeight)-(parseInt(e(r).css("borderTopWidth"),10)||0)-(parseInt(e(r).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top-this.margins.bottom],this.relative_container=n}else t.containment.constructor==Array&&(this.containment=t.containment)},_convertPositionTo:function(t,n){n||(n=this.position);var r=t=="absolute"?1:-1,i=this.options,s=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(s[0].tagName);return{top:n.top+this.offset.relative.top*r+this.offset.parent.top*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():o?0:s.scrollTop())*r,left:n.left+this.offset.relative.left*r+this.offset.parent.left*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():o?0:s.scrollLeft())*r}},_generatePosition:function(t){var n=this.options,r=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,i=/(html|body)/i.test(r[0].tagName),s=t.pageX,o=t.pageY;if(this.originalPosition){var u;if(this.containment){if(this.relative_container){var a=this.relative_container.offset();u=[this.containment[0]+a.left,this.containment[1]+a.top,this.containment[2]+a.left,this.containment[3]+a.top]}else u=this.containment;t.pageX-this.offset.click.left<u[0]&&(s=u[0]+this.offset.click.left),t.pageY-this.offset.click.top<u[1]&&(o=u[1]+this.offset.click.top),t.pageX-this.offset.click.left>u[2]&&(s=u[2]+this.offset.click.left),t.pageY-this.offset.click.top>u[3]&&(o=u[3]+this.offset.click.top)}if(n.grid){var f=n.grid[1]?this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1]:this.originalPageY;o=u?f-this.offset.click.top<u[1]||f-this.offset.click.top>u[3]?f-this.offset.click.top<u[1]?f+n.grid[1]:f-n.grid[1]:f:f;var l=n.grid[0]?this.originalPageX+Math.round((s-this.originalPageX)/n.grid[0])*n.grid[0]:this.originalPageX;s=u?l-this.offset.click.left<u[0]||l-this.offset.click.left>u[2]?l-this.offset.click.left<u[0]?l+n.grid[0]:l-n.grid[0]:l:l}}return{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():i?0:r.scrollTop()),left:s-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:r.scrollLeft())}},_clear:function(){this.helper.removeClass("ui-draggable-dragging"),this.helper[0]!=this.element[0]&&!this.cancelHelperRemoval&&this.helper.remove(),this.helper=null,this.cancelHelperRemoval=!1},_trigger:function(t,n,r){return r=r||this._uiHash(),e.ui.plugin.call(this,t,[n,r]),t=="drag"&&(this.positionAbs=this._convertPositionTo("absolute")),e.Widget.prototype._trigger.call(this,t,n,r)},plugins:{},_uiHash:function(e){return{helper:this.helper,position:this.position,originalPosition:this.originalPosition,offset:this.positionAbs}}}),e.ui.plugin.add("draggable","connectToSortable",{start:function(t,n){var r=e(this).data("draggable"),i=r.options,s=e.extend({},n,{item:r.element});r.sortables=[],e(i.connectToSortable).each(function(){var n=e.data(this,"sortable");n&&!n.options.disabled&&(r.sortables.push({instance:n,shouldRevert:n.options.revert}),n.refreshPositions(),n._trigger("activate",t,s))})},stop:function(t,n){var r=e(this).data("draggable"),i=e.extend({},n,{item:r.element});e.each(r.sortables,function(){this.instance.isOver?(this.instance.isOver=0,r.cancelHelperRemoval=!0,this.instance.cancelHelperRemoval=!1,this.shouldRevert&&(this.instance.options.revert=!0),this.instance._mouseStop(t),this.instance.options.helper=this.instance.options._helper,r.options.helper=="original"&&this.instance.currentItem.css({top:"auto",left:"auto"})):(this.instance.cancelHelperRemoval=!1,this.instance._trigger("deactivate",t,i))})},drag:function(t,n){var r=e(this).data("draggable"),i=this,s=function(t){var n=this.offset.click.top,r=this.offset.click.left,i=this.positionAbs.top,s=this.positionAbs.left,o=t.height,u=t.width,a=t.top,f=t.left;return e.ui.isOver(i+n,s+r,a,f,o,u)};e.each(r.sortables,function(s){this.instance.positionAbs=r.positionAbs,this.instance.helperProportions=r.helperProportions,this.instance.offset.click=r.offset.click,this.instance._intersectsWith(this.instance.containerCache)?(this.instance.isOver||(this.instance.isOver=1,this.instance.currentItem=e(i).clone().removeAttr("id").appendTo(this.instance.element).data("sortable-item",!0),this.instance.options._helper=this.instance.options.helper,this.instance.options.helper=function(){return n.helper[0]},t.target=this.instance.currentItem[0],this.instance._mouseCapture(t,!0),this.instance._mouseStart(t,!0,!0),this.instance.offset.click.top=r.offset.click.top,this.instance.offset.click.left=r.offset.click.left,this.instance.offset.parent.left-=r.offset.parent.left-this.instance.offset.parent.left,this.instance.offset.parent.top-=r.offset.parent.top-this.instance.offset.parent.top,r._trigger("toSortable",t),r.dropped=this.instance.element,r.currentItem=r.element,this.instance.fromOutside=r),this.instance.currentItem&&this.instance._mouseDrag(t)):this.instance.isOver&&(this.instance.isOver=0,this.instance.cancelHelperRemoval=!0,this.instance.options.revert=!1,this.instance._trigger("out",t,this.instance._uiHash(this.instance)),this.instance._mouseStop(t,!0),this.instance.options.helper=this.instance.options._helper,this.instance.currentItem.remove(),this.instance.placeholder&&this.instance.placeholder.remove(),r._trigger("fromSortable",t),r.dropped=!1)})}}),e.ui.plugin.add("draggable","cursor",{start:function(t,n){var r=e("body"),i=e(this).data("draggable").options;r.css("cursor")&&(i._cursor=r.css("cursor")),r.css("cursor",i.cursor)},stop:function(t,n){var r=e(this).data("draggable").options;r._cursor&&e("body").css("cursor",r._cursor)}}),e.ui.plugin.add("draggable","opacity",{start:function(t,n){var r=e(n.helper),i=e(this).data("draggable").options;r.css("opacity")&&(i._opacity=r.css("opacity")),r.css("opacity",i.opacity)},stop:function(t,n){var r=e(this).data("draggable").options;r._opacity&&e(n.helper).css("opacity",r._opacity)}}),e.ui.plugin.add("draggable","scroll",{start:function(t,n){var r=e(this).data("draggable");r.scrollParent[0]!=document&&r.scrollParent[0].tagName!="HTML"&&(r.overflowOffset=r.scrollParent.offset())},drag:function(t,n){var r=e(this).data("draggable"),i=r.options,s=!1;if(r.scrollParent[0]!=document&&r.scrollParent[0].tagName!="HTML"){if(!i.axis||i.axis!="x")r.overflowOffset.top+r.scrollParent[0].offsetHeight-t.pageY<i.scrollSensitivity?r.scrollParent[0].scrollTop=s=r.scrollParent[0].scrollTop+i.scrollSpeed:t.pageY-r.overflowOffset.top<i.scrollSensitivity&&(r.scrollParent[0].scrollTop=s=r.scrollParent[0].scrollTop-i.scrollSpeed);if(!i.axis||i.axis!="y")r.overflowOffset.left+r.scrollParent[0].offsetWidth-t.pageX<i.scrollSensitivity?r.scrollParent[0].scrollLeft=s=r.scrollParent[0].scrollLeft+i.scrollSpeed:t.pageX-r.overflowOffset.left<i.scrollSensitivity&&(r.scrollParent[0].scrollLeft=s=r.scrollParent[0].scrollLeft-i.scrollSpeed)}else{if(!i.axis||i.axis!="x")t.pageY-e(document).scrollTop()<i.scrollSensitivity?s=e(document).scrollTop(e(document).scrollTop()-i.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<i.scrollSensitivity&&(s=e(document).scrollTop(e(document).scrollTop()+i.scrollSpeed));if(!i.axis||i.axis!="y")t.pageX-e(document).scrollLeft()<i.scrollSensitivity?s=e(document).scrollLeft(e(document).scrollLeft()-i.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<i.scrollSensitivity&&(s=e(document).scrollLeft(e(document).scrollLeft()+i.scrollSpeed))}s!==!1&&e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(r,t)}}),e.ui.plugin.add("draggable","snap",{start:function(t,n){var r=e(this).data("draggable"),i=r.options;r.snapElements=[],e(i.snap.constructor!=String?i.snap.items||":data(draggable)":i.snap).each(function(){var t=e(this),n=t.offset();this!=r.element[0]&&r.snapElements.push({item:this,width:t.outerWidth(),height:t.outerHeight(),top:n.top,left:n.left})})},drag:function(t,n){var r=e(this).data("draggable"),i=r.options,s=i.snapTolerance,o=n.offset.left,u=o+r.helperProportions.width,a=n.offset.top,f=a+r.helperProportions.height;for(var l=r.snapElements.length-1;l>=0;l--){var c=r.snapElements[l].left,h=c+r.snapElements[l].width,p=r.snapElements[l].top,d=p+r.snapElements[l].height;if(!(c-s<o&&o<h+s&&p-s<a&&a<d+s||c-s<o&&o<h+s&&p-s<f&&f<d+s||c-s<u&&u<h+s&&p-s<a&&a<d+s||c-s<u&&u<h+s&&p-s<f&&f<d+s)){r.snapElements[l].snapping&&r.options.snap.release&&r.options.snap.release.call(r.element,t,e.extend(r._uiHash(),{snapItem:r.snapElements[l].item})),r.snapElements[l].snapping=!1;continue}if(i.snapMode!="inner"){var v=Math.abs(p-f)<=s,m=Math.abs(d-a)<=s,g=Math.abs(c-u)<=s,y=Math.abs(h-o)<=s;v&&(n.position.top=r._convertPositionTo("relative",{top:p-r.helperProportions.height,left:0}).top-r.margins.top),m&&(n.position.top=r._convertPositionTo("relative",{top:d,left:0}).top-r.margins.top),g&&(n.position.left=r._convertPositionTo("relative",{top:0,left:c-r.helperProportions.width}).left-r.margins.left),y&&(n.position.left=r._convertPositionTo("relative",{top:0,left:h}).left-r.margins.left)}var b=v||m||g||y;if(i.snapMode!="outer"){var v=Math.abs(p-a)<=s,m=Math.abs(d-f)<=s,g=Math.abs(c-o)<=s,y=Math.abs(h-u)<=s;v&&(n.position.top=r._convertPositionTo("relative",{top:p,left:0}).top-r.margins.top),m&&(n.position.top=r._convertPositionTo("relative",{top:d-r.helperProportions.height,left:0}).top-r.margins.top),g&&(n.position.left=r._convertPositionTo("relative",{top:0,left:c}).left-r.margins.left),y&&(n.position.left=r._convertPositionTo("relative",{top:0,left:h-r.helperProportions.width}).left-r.margins.left)}!r.snapElements[l].snapping&&(v||m||g||y||b)&&r.options.snap.snap&&r.options.snap.snap.call(r.element,t,e.extend(r._uiHash(),{snapItem:r.snapElements[l].item})),r.snapElements[l].snapping=v||m||g||y||b}}}),e.ui.plugin.add("draggable","stack",{start:function(t,n){var r=e(this).data("draggable").options,i=e.makeArray(e(r.stack)).sort(function(t,n){return(parseInt(e(t).css("zIndex"),10)||0)-(parseInt(e(n).css("zIndex"),10)||0)});if(!i.length)return;var s=parseInt(i[0].style.zIndex)||0;e(i).each(function(e){this.style.zIndex=s+e}),this[0].style.zIndex=s+i.length}}),e.ui.plugin.add("draggable","zIndex",{start:function(t,n){var r=e(n.helper),i=e(this).data("draggable").options;r.css("zIndex")&&(i._zIndex=r.css("zIndex")),r.css("zIndex",i.zIndex)},stop:function(t,n){var r=e(this).data("draggable").options;r._zIndex&&e(n.helper).css("zIndex",r._zIndex)}})})(jQuery);(function(e,t){e.widget("ui.droppable",{version:"1.9.0",widgetEventPrefix:"drop",options:{accept:"*",activeClass:!1,addClasses:!0,greedy:!1,hoverClass:!1,scope:"default",tolerance:"intersect"},_create:function(){var t=this.options,n=t.accept;this.isover=0,this.isout=1,this.accept=e.isFunction(n)?n:function(e){return e.is(n)},this.proportions={width:this.element[0].offsetWidth,height:this.element[0].offsetHeight},e.ui.ddmanager.droppables[t.scope]=e.ui.ddmanager.droppables[t.scope]||[],e.ui.ddmanager.droppables[t.scope].push(this),t.addClasses&&this.element.addClass("ui-droppable")},_destroy:function(){var t=e.ui.ddmanager.droppables[this.options.scope];for(var n=0;n<t.length;n++)t[n]==this&&t.splice(n,1);this.element.removeClass("ui-droppable ui-droppable-disabled")},_setOption:function(t,n){t=="accept"&&(this.accept=e.isFunction(n)?n:function(e){return e.is(n)}),e.Widget.prototype._setOption.apply(this,arguments)},_activate:function(t){var n=e.ui.ddmanager.current;this.options.activeClass&&this.element.addClass(this.options.activeClass),n&&this._trigger("activate",t,this.ui(n))},_deactivate:function(t){var n=e.ui.ddmanager.current;this.options.activeClass&&this.element.removeClass(this.options.activeClass),n&&this._trigger("deactivate",t,this.ui(n))},_over:function(t){var n=e.ui.ddmanager.current;if(!n||(n.currentItem||n.element)[0]==this.element[0])return;this.accept.call(this.element[0],n.currentItem||n.element)&&(this.options.hoverClass&&this.element.addClass(this.options.hoverClass),this._trigger("over",t,this.ui(n)))},_out:function(t){var n=e.ui.ddmanager.current;if(!n||(n.currentItem||n.element)[0]==this.element[0])return;this.accept.call(this.element[0],n.currentItem||n.element)&&(this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("out",t,this.ui(n)))},_drop:function(t,n){var r=n||e.ui.ddmanager.current;if(!r||(r.currentItem||r.element)[0]==this.element[0])return!1;var i=!1;return this.element.find(":data(droppable)").not(".ui-draggable-dragging").each(function(){var t=e.data(this,"droppable");if(t.options.greedy&&!t.options.disabled&&t.options.scope==r.options.scope&&t.accept.call(t.element[0],r.currentItem||r.element)&&e.ui.intersect(r,e.extend(t,{offset:t.element.offset()}),t.options.tolerance))return i=!0,!1}),i?!1:this.accept.call(this.element[0],r.currentItem||r.element)?(this.options.activeClass&&this.element.removeClass(this.options.activeClass),this.options.hoverClass&&this.element.removeClass(this.options.hoverClass),this._trigger("drop",t,this.ui(r)),this.element):!1},ui:function(e){return{draggable:e.currentItem||e.element,helper:e.helper,position:e.position,offset:e.positionAbs}}}),e.ui.intersect=function(t,n,r){if(!n.offset)return!1;var i=(t.positionAbs||t.position.absolute).left,s=i+t.helperProportions.width,o=(t.positionAbs||t.position.absolute).top,u=o+t.helperProportions.height,a=n.offset.left,f=a+n.proportions.width,l=n.offset.top,c=l+n.proportions.height;switch(r){case"fit":return a<=i&&s<=f&&l<=o&&u<=c;case"intersect":return a<i+t.helperProportions.width/2&&s-t.helperProportions.width/2<f&&l<o+t.helperProportions.height/2&&u-t.helperProportions.height/2<c;case"pointer":var h=(t.positionAbs||t.position.absolute).left+(t.clickOffset||t.offset.click).left,p=(t.positionAbs||t.position.absolute).top+(t.clickOffset||t.offset.click).top,d=e.ui.isOver(p,h,l,a,n.proportions.height,n.proportions.width);return d;case"touch":return(o>=l&&o<=c||u>=l&&u<=c||o<l&&u>c)&&(i>=a&&i<=f||s>=a&&s<=f||i<a&&s>f);default:return!1}},e.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(t,n){var r=e.ui.ddmanager.droppables[t.options.scope]||[],i=n?n.type:null,s=(t.currentItem||t.element).find(":data(droppable)").andSelf();e:for(var o=0;o<r.length;o++){if(r[o].options.disabled||t&&!r[o].accept.call(r[o].element[0],t.currentItem||t.element))continue;for(var u=0;u<s.length;u++)if(s[u]==r[o].element[0]){r[o].proportions.height=0;continue e}r[o].visible=r[o].element.css("display")!="none";if(!r[o].visible)continue;i=="mousedown"&&r[o]._activate.call(r[o],n),r[o].offset=r[o].element.offset(),r[o].proportions={width:r[o].element[0].offsetWidth,height:r[o].element[0].offsetHeight}}},drop:function(t,n){var r=!1;return e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(!this.options)return;!this.options.disabled&&this.visible&&e.ui.intersect(t,this,this.options.tolerance)&&(r=this._drop.call(this,n)||r),!this.options.disabled&&this.visible&&this.accept.call(this.element[0],t.currentItem||t.element)&&(this.isout=1,this.isover=0,this._deactivate.call(this,n))}),r},dragStart:function(t,n){t.element.parentsUntil("body").bind("scroll.droppable",function(){t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,n)})},drag:function(t,n){t.options.refreshPositions&&e.ui.ddmanager.prepareOffsets(t,n),e.each(e.ui.ddmanager.droppables[t.options.scope]||[],function(){if(this.options.disabled||this.greedyChild||!this.visible)return;var r=e.ui.intersect(t,this,this.options.tolerance),i=!r&&this.isover==1?"isout":r&&this.isover==0?"isover":null;if(!i)return;var s;if(this.options.greedy){var o=this.options.scope,u=this.element.parents(":data(droppable)").filter(function(){return e.data(this,"droppable").options.scope===o});u.length&&(s=e.data(u[0],"droppable"),s.greedyChild=i=="isover"?1:0)}s&&i=="isover"&&(s.isover=0,s.isout=1,s._out.call(s,n)),this[i]=1,this[i=="isout"?"isover":"isout"]=0,this[i=="isover"?"_over":"_out"].call(this,n),s&&i=="isout"&&(s.isout=0,s.isover=1,s._over.call(s,n))})},dragStop:function(t,n){t.element.parentsUntil("body").unbind("scroll.droppable"),t.options.refreshPositions||e.ui.ddmanager.prepareOffsets(t,n)}}})(jQuery);jQuery.effects||function(e,t){var n=e.uiBackCompat!==!1,r="ui-effects-";e.effects={effect:{}},function(t,n){function p(e,t,n){var r=a[t.type]||{};return e==null?n||!t.def?null:t.def:(e=r.floor?~~e:parseFloat(e),isNaN(e)?t.def:r.mod?(e+r.mod)%r.mod:0>e?0:r.max<e?r.max:e)}function d(e){var n=o(),r=n._rgba=[];return e=e.toLowerCase(),h(s,function(t,i){var s,o=i.re.exec(e),a=o&&i.parse(o),f=i.space||"rgba";if(a)return s=n[f](a),n[u[f].cache]=s[u[f].cache],r=n._rgba=s._rgba,!1}),r.length?(r.join()==="0,0,0,0"&&t.extend(r,c.transparent),n):c[e]}function v(e,t,n){return n=(n+1)%1,n*6<1?e+(t-e)*n*6:n*2<1?t:n*3<2?e+(t-e)*(2/3-n)*6:e}var r="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor".split(" "),i=/^([\-+])=\s*(\d+\.?\d*)/,s=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1]*2.55,e[2]*2.55,e[3]*2.55,e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d+(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],o=t.Color=function(e,n,r,i){return new t.Color.fn.parse(e,n,r,i)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},a={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},f=o.support={},l=t("<p>")[0],c,h=t.each;l.style.cssText="background-color:rgba(1,1,1,.5)",f.rgba=l.style.backgroundColor.indexOf("rgba")>-1,h(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),o.fn=t.extend(o.prototype,{parse:function(r,i,s,a){if(r===n)return this._rgba=[null,null,null,null],this;if(r.jquery||r.nodeType)r=t(r).css(i),i=n;var f=this,l=t.type(r),v=this._rgba=[],m;i!==n&&(r=[r,i,s,a],l="array");if(l==="string")return this.parse(d(r)||c._default);if(l==="array")return h(u.rgba.props,function(e,t){v[t.idx]=p(r[t.idx],t)}),this;if(l==="object")return r instanceof o?h(u,function(e,t){r[t.cache]&&(f[t.cache]=r[t.cache].slice())}):h(u,function(t,n){var i=n.cache;h(n.props,function(e,t){if(!f[i]&&n.to){if(e==="alpha"||r[e]==null)return;f[i]=n.to(f._rgba)}f[i][t.idx]=p(r[e],t,!0)}),f[i]&&e.inArray(null,f[i].slice(0,3))<0&&(f[i][3]=1,n.from&&(f._rgba=n.from(f[i])))}),this},is:function(e){var t=o(e),n=!0,r=this;return h(u,function(e,i){var s,o=t[i.cache];return o&&(s=r[i.cache]||i.to&&i.to(r._rgba)||[],h(i.props,function(e,t){if(o[t.idx]!=null)return n=o[t.idx]===s[t.idx],n})),n}),n},_space:function(){var e=[],t=this;return h(u,function(n,r){t[r.cache]&&e.push(n)}),e.pop()},transition:function(e,t){var n=o(e),r=n._space(),i=u[r],s=this.alpha()===0?o("transparent"):this,f=s[i.cache]||i.to(s._rgba),l=f.slice();return n=n[i.cache],h(i.props,function(e,r){var i=r.idx,s=f[i],o=n[i],u=a[r.type]||{};if(o===null)return;s===null?l[i]=o:(u.mod&&(o-s>u.mod/2?s+=u.mod:s-o>u.mod/2&&(s-=u.mod)),l[i]=p((o-s)*t+s,r))}),this[r](l)},blend:function(e){if(this._rgba[3]===1)return this;var n=this._rgba.slice(),r=n.pop(),i=o(e)._rgba;return o(t.map(n,function(e,t){return(1-r)*i[t]+r*e}))},toRgbaString:function(){var e="rgba(",n=t.map(this._rgba,function(e,t){return e==null?t>2?1:0:e});return n[3]===1&&(n.pop(),e="rgb("),e+n.join()+")"},toHslaString:function(){var e="hsla(",n=t.map(this.hsla(),function(e,t){return e==null&&(e=t>2?1:0),t&&t<3&&(e=Math.round(e*100)+"%"),e});return n[3]===1&&(n.pop(),e="hsl("),e+n.join()+")"},toHexString:function(e){var n=this._rgba.slice(),r=n.pop();return e&&n.push(~~(r*255)),"#"+t.map(n,function(e,t){return e=(e||0).toString(16),e.length===1?"0"+e:e}).join("")},toString:function(){return this._rgba[3]===0?"transparent":this.toRgbaString()}}),o.fn.parse.prototype=o.fn,u.hsla.to=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/255,n=e[1]/255,r=e[2]/255,i=e[3],s=Math.max(t,n,r),o=Math.min(t,n,r),u=s-o,a=s+o,f=a*.5,l,c;return o===s?l=0:t===s?l=60*(n-r)/u+360:n===s?l=60*(r-t)/u+120:l=60*(t-n)/u+240,f===0||f===1?c=f:f<=.5?c=u/a:c=u/(2-a),[Math.round(l)%360,c,f,i==null?1:i]},u.hsla.from=function(e){if(e[0]==null||e[1]==null||e[2]==null)return[null,null,null,e[3]];var t=e[0]/360,n=e[1],r=e[2],i=e[3],s=r<=.5?r*(1+n):r+n-r*n,o=2*r-s,u,a,f;return[Math.round(v(o,s,t+1/3)*255),Math.round(v(o,s,t)*255),Math.round(v(o,s,t-1/3)*255),i]},h(u,function(e,r){var s=r.props,u=r.cache,a=r.to,f=r.from;o.fn[e]=function(e){a&&!this[u]&&(this[u]=a(this._rgba));if(e===n)return this[u].slice();var r,i=t.type(e),l=i==="array"||i==="object"?e:arguments,c=this[u].slice();return h(s,function(e,t){var n=l[i==="object"?e:t.idx];n==null&&(n=c[t.idx]),c[t.idx]=p(n,t)}),f?(r=o(f(c)),r[u]=c,r):o(c)},h(s,function(n,r){if(o.fn[n])return;o.fn[n]=function(s){var o=t.type(s),u=n==="alpha"?this._hsla?"hsla":"rgba":e,a=this[u](),f=a[r.idx],l;return o==="undefined"?f:(o==="function"&&(s=s.call(this,f),o=t.type(s)),s==null&&r.empty?this:(o==="string"&&(l=i.exec(s),l&&(s=f+parseFloat(l[2])*(l[1]==="+"?1:-1))),a[r.idx]=s,this[u](a)))}})}),h(r,function(e,n){t.cssHooks[n]={set:function(e,r){var i,s,u="";if(t.type(r)!=="string"||(i=d(r))){r=o(i||r);if(!f.rgba&&r._rgba[3]!==1){s=n==="backgroundColor"?e.parentNode:e;while((u===""||u==="transparent")&&s&&s.style)try{u=t.css(s,"backgroundColor"),s=s.parentNode}catch(a){}r=r.blend(u&&u!=="transparent"?u:"_default")}r=r.toRgbaString()}try{e.style[n]=r}catch(r){}}},t.fx.step[n]=function(e){e.colorInit||(e.start=o(e.elem,n),e.end=o(e.end),e.colorInit=!0),t.cssHooks[n].set(e.elem,e.start.transition(e.end,e.pos))}}),t.cssHooks.borderColor={expand:function(e){var t={};return h(["Top","Right","Bottom","Left"],function(n,r){t["border"+r+"Color"]=e}),t}},c=t.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(){var t=this.ownerDocument.defaultView?this.ownerDocument.defaultView.getComputedStyle(this,null):this.currentStyle,n={},r,i,s;if(t&&t.length&&t[0]&&t[t[0]]){s=t.length;while(s--)r=t[s],typeof t[r]=="string"&&(n[e.camelCase(r)]=t[r])}else for(r in t)typeof t[r]=="string"&&(n[r]=t[r]);return n}function s(t,n){var i={},s,o;for(s in n)o=n[s],t[s]!==o&&!r[s]&&(e.fx.step[s]||!isNaN(parseFloat(o)))&&(i[s]=o);return i}var n=["add","remove","toggle"],r={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,n){e.fx.step[n]=function(e){if(e.end!=="none"&&!e.setAttr||e.pos===1&&!e.setAttr)jQuery.style(e.elem,n,e.end),e.setAttr=!0}}),e.effects.animateClass=function(t,r,o,u){var a=e.speed(r,o,u);return this.queue(function(){var r=e(this),o=r.attr("class")||"",u,f=a.children?r.find("*").andSelf():r;f=f.map(function(){var t=e(this);return{el:t,start:i.call(this)}}),u=function(){e.each(n,function(e,n){t[n]&&r[n+"Class"](t[n])})},u(),f=f.map(function(){return this.end=i.call(this.el[0]),this.diff=s(this.start,this.end),this}),r.attr("class",o),f=f.map(function(){var t=this,n=e.Deferred(),r=jQuery.extend({},a,{queue:!1,complete:function(){n.resolve(t)}});return this.el.animate(this.diff,r),n.promise()}),e.when.apply(e,f.get()).done(function(){u(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),a.complete.call(r[0])})})},e.fn.extend({_addClass:e.fn.addClass,addClass:function(t,n,r,i){return n?e.effects.animateClass.call(this,{add:t},n,r,i):this._addClass(t)},_removeClass:e.fn.removeClass,removeClass:function(t,n,r,i){return n?e.effects.animateClass.call(this,{remove:t},n,r,i):this._removeClass(t)},_toggleClass:e.fn.toggleClass,toggleClass:function(n,r,i,s,o){return typeof r=="boolean"||r===t?i?e.effects.animateClass.call(this,r?{add:n}:{remove:n},i,s,o):this._toggleClass(n,r):e.effects.animateClass.call(this,{toggle:n},r,i,s)},switchClass:function(t,n,r,i,s){return e.effects.animateClass.call(this,{add:n,remove:t},r,i,s)}})}(),function(){function i(n,r,i,s){e.isPlainObject(n)&&(r=n,n=n.effect),n={effect:n},r===t&&(r={}),e.isFunction(r)&&(s=r,i=null,r={});if(typeof r=="number"||e.fx.speeds[r])s=i,i=r,r={};return e.isFunction(i)&&(s=i,i=null),r&&e.extend(n,r),i=i||r.duration,n.duration=e.fx.off?0:typeof i=="number"?i:i in e.fx.speeds?e.fx.speeds[i]:e.fx.speeds._default,n.complete=s||r.complete,n}function s(t){return!t||typeof t=="number"||e.fx.speeds[t]?!0:typeof t=="string"&&!e.effects.effect[t]?n&&e.effects[t]?!1:!0:!1}e.extend(e.effects,{version:"1.9.0",save:function(e,t){for(var n=0;n<t.length;n++)t[n]!==null&&e.data(r+t[n],e[0].style[t[n]])},restore:function(e,n){var i,s;for(s=0;s<n.length;s++)n[s]!==null&&(i=e.data(r+n[s]),i===t&&(i=""),e.css(n[s],i))},setMode:function(e,t){return t==="toggle"&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var n,r;switch(e[0]){case"top":n=0;break;case"middle":n=.5;break;case"bottom":n=1;break;default:n=e[0]/t.height}switch(e[1]){case"left":r=0;break;case"center":r=.5;break;case"right":r=1;break;default:r=e[1]/t.width}return{x:r,y:n}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var n={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},r=e("<div></div>").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),i={width:t.width(),height:t.height()},s=document.activeElement;try{s.id}catch(o){s=document.body}return t.wrap(r),(t[0]===s||e.contains(t[0],s))&&e(s).focus(),r=t.parent(),t.css("position")==="static"?(r.css({position:"relative"}),t.css({position:"relative"})):(e.extend(n,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,r){n[r]=t.css(r),isNaN(parseInt(n[r],10))&&(n[r]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(i),r.css(n).show()},removeWrapper:function(t){var n=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===n||e.contains(t[0],n))&&e(n).focus()),t},setTransition:function(t,n,r,i){return i=i||{},e.each(n,function(e,n){var s=t.cssUnit(n);s[0]>0&&(i[n]=s[0]*r+s[1])}),i}}),e.fn.extend({effect:function(t,r,s,o){function h(t){function s(){e.isFunction(r)&&r.call(n[0]),e.isFunction(t)&&t()}var n=e(this),r=u.complete,i=u.mode;(n.is(":hidden")?i==="hide":i==="show")?s():l.call(n[0],u,s)}var u=i.apply(this,arguments),a=u.mode,f=u.queue,l=e.effects.effect[u.effect],c=!l&&n&&e.effects[u.effect];return e.fx.off||!l&&!c?a?this[a](u.duration,u.complete):this.each(function(){u.complete&&u.complete.call(this)}):l?f===!1?this.each(h):this.queue(f||"fx",h):c.call(this,{options:u,duration:u.duration,callback:u.complete,mode:u.mode})},_show:e.fn.show,show:function(e){if(s(e))return this._show.apply(this,arguments);var t=i.apply(this,arguments);return t.mode="show",this.effect.call(this,t)},_hide:e.fn.hide,hide:function(e){if(s(e))return this._hide.apply(this,arguments);var t=i.apply(this,arguments);return t.mode="hide",this.effect.call(this,t)},__toggle:e.fn.toggle,toggle:function(t){if(s(t)||typeof t=="boolean"||e.isFunction(t))return this.__toggle.apply(this,arguments);var n=i.apply(this,arguments);return n.mode="toggle",this.effect.call(this,n)},cssUnit:function(t){var n=this.css(t),r=[];return e.each(["em","px","%","pt"],function(e,t){n.indexOf(t)>0&&(r=[parseFloat(n),t])}),r}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,n){t[n]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return e===0||e===1?e:-Math.pow(2,8*(e-1))*Math.sin(((e-1)*80-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){var t,n=4;while(e<((t=Math.pow(2,--n))-1)/11);return 1/Math.pow(4,3-n)-7.5625*Math.pow((t*3-2)/22-e,2)}}),e.each(t,function(t,n){e.easing["easeIn"+t]=n,e.easing["easeOut"+t]=function(e){return 1-n(1-e)},e.easing["easeInOut"+t]=function(e){return e<.5?n(e*2)/2:1-n(e*-2+2)/2}})}()}(jQuery);(function(e,t){var n=/up|down|vertical/,r=/up|left|vertical|horizontal/;e.effects.effect.blind=function(t,i){var s=e(this),o=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(s,t.mode||"hide"),a=t.direction||"up",f=n.test(a),l=f?"height":"width",c=f?"top":"left",h=r.test(a),p={},d=u==="show",v,m,g;s.parent().is(".ui-effects-wrapper")?e.effects.save(s.parent(),o):e.effects.save(s,o),s.show(),v=e.effects.createWrapper(s).css({overflow:"hidden"}),m=v[l](),g=parseFloat(v.css(c))||0,p[l]=d?m:0,h||(s.css(f?"bottom":"right",0).css(f?"top":"left","auto").css({position:"absolute"}),p[c]=d?g:m+g),d&&(v.css(l,0),h||v.css(c,g+m)),v.animate(p,{duration:t.duration,easing:t.easing,queue:!1,complete:function(){u==="hide"&&s.hide(),e.effects.restore(s,o),e.effects.removeWrapper(s),i()}})}})(jQuery);(function(e,t){e.effects.effect.bounce=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"effect"),o=s==="hide",u=s==="show",a=t.direction||"up",f=t.distance,l=t.times||5,c=l*2+(u||o?1:0),h=t.duration/c,p=t.easing,d=a==="up"||a==="down"?"top":"left",v=a==="up"||a==="left",m,g,y,b=r.queue(),w=b.length;(u||o)&&i.push("opacity"),e.effects.save(r,i),r.show(),e.effects.createWrapper(r),f||(f=r[d==="top"?"outerHeight":"outerWidth"]()/3),u&&(y={opacity:1},y[d]=0,r.css("opacity",0).css(d,v?-f*2:f*2).animate(y,h,p)),o&&(f/=Math.pow(2,l-1)),y={},y[d]=0;for(m=0;m<l;m++)g={},g[d]=(v?"-=":"+=")+f,r.animate(g,h,p).animate(y,h,p),f=o?f*2:f/2;o&&(g={opacity:0},g[d]=(v?"-=":"+=")+f,r.animate(g,h,p)),r.queue(function(){o&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}),w>1&&b.splice.apply(b,[1,0].concat(b.splice(w,c+1))),r.dequeue()}})(jQuery);(function(e,t){e.effects.effect.clip=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=t.direction||"vertical",a=u==="vertical",f=a?"height":"width",l=a?"top":"left",c={},h,p,d;e.effects.save(r,i),r.show(),h=e.effects.createWrapper(r).css({overflow:"hidden"}),p=r[0].tagName==="IMG"?h:r,d=p[f](),o&&(p.css(f,0),p.css(l,d/2)),c[f]=o?d:0,c[l]=o?0:d/2,p.animate(c,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){o||r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.drop=function(t,n){var r=e(this),i=["position","top","bottom","left","right","opacity","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=t.direction||"left",a=u==="up"||u==="down"?"top":"left",f=u==="up"||u==="left"?"pos":"neg",l={opacity:o?1:0},c;e.effects.save(r,i),r.show(),e.effects.createWrapper(r),c=t.distance||r[a==="top"?"outerHeight":"outerWidth"](!0)/2,o&&r.css("opacity",0).css(a,f==="pos"?-c:c),l[a]=(o?f==="pos"?"+=":"-=":f==="pos"?"-=":"+=")+c,r.animate(l,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.explode=function(t,n){function y(){c.push(this),c.length===r*i&&b()}function b(){s.css({visibility:"visible"}),e(c).remove(),u||s.hide(),n()}var r=t.pieces?Math.round(Math.sqrt(t.pieces)):3,i=r,s=e(this),o=e.effects.setMode(s,t.mode||"hide"),u=o==="show",a=s.show().css("visibility","hidden").offset(),f=Math.ceil(s.outerWidth()/i),l=Math.ceil(s.outerHeight()/r),c=[],h,p,d,v,m,g;for(h=0;h<r;h++){v=a.top+h*l,g=h-(r-1)/2;for(p=0;p<i;p++)d=a.left+p*f,m=p-(i-1)/2,s.clone().appendTo("body").wrap("<div></div>").css({position:"absolute",visibility:"visible",left:-p*f,top:-h*l}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:f,height:l,left:d+(u?m*f:0),top:v+(u?g*l:0),opacity:u?0:1}).animate({left:d+(u?0:m*f),top:v+(u?0:g*l),opacity:u?1:0},t.duration||500,t.easing,y)}}})(jQuery);(function(e,t){e.effects.effect.fade=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"toggle");r.animate({opacity:i},{queue:!1,duration:t.duration,easing:t.easing,complete:n})}})(jQuery);(function(e,t){e.effects.effect.fold=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"hide"),o=s==="show",u=s==="hide",a=t.size||15,f=/([0-9]+)%/.exec(a),l=!!t.horizFirst,c=o!==l,h=c?["width","height"]:["height","width"],p=t.duration/2,d,v,m={},g={};e.effects.save(r,i),r.show(),d=e.effects.createWrapper(r).css({overflow:"hidden"}),v=c?[d.width(),d.height()]:[d.height(),d.width()],f&&(a=parseInt(f[1],10)/100*v[u?0:1]),o&&d.css(l?{height:0,width:a}:{height:a,width:0}),m[h[0]]=o?v[0]:a,g[h[1]]=o?v[1]:0,d.animate(m,p,t.easing).animate(g,p,t.easing,function(){u&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()})}})(jQuery);(function(e,t){e.effects.effect.highlight=function(t,n){var r=e(this),i=["backgroundImage","backgroundColor","opacity"],s=e.effects.setMode(r,t.mode||"show"),o={backgroundColor:r.css("backgroundColor")};s==="hide"&&(o.opacity=0),e.effects.save(r,i),r.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(o,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),n()}})}})(jQuery);(function(e,t){e.effects.effect.pulsate=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"show"),s=i==="show",o=i==="hide",u=s||i==="hide",a=(t.times||5)*2+(u?1:0),f=t.duration/a,l=0,c=r.queue(),h=c.length,p;if(s||!r.is(":visible"))r.css("opacity",0).show(),l=1;for(p=1;p<a;p++)r.animate({opacity:l},f,t.easing),l=1-l;r.animate({opacity:l},f,t.easing),r.queue(function(){o&&r.hide(),n()}),h>1&&c.splice.apply(c,[1,0].concat(c.splice(h,a+1))),r.dequeue()}})(jQuery);(function(e,t){e.effects.effect.puff=function(t,n){var r=e(this),i=e.effects.setMode(r,t.mode||"hide"),s=i==="hide",o=parseInt(t.percent,10)||150,u=o/100,a={height:r.height(),width:r.width()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:i,complete:n,percent:s?o:100,from:s?a:{height:a.height*u,width:a.width*u}}),r.effect(t)},e.effects.effect.scale=function(t,n){var r=e(this),i=e.extend(!0,{},t),s=e.effects.setMode(r,t.mode||"effect"),o=parseInt(t.percent,10)||(parseInt(t.percent,10)===0?0:s==="hide"?0:100),u=t.direction||"both",a=t.origin,f={height:r.height(),width:r.width(),outerHeight:r.outerHeight(),outerWidth:r.outerWidth()},l={y:u!=="horizontal"?o/100:1,x:u!=="vertical"?o/100:1};i.effect="size",i.queue=!1,i.complete=n,s!=="effect"&&(i.origin=a||["middle","center"],i.restore=!0),i.from=t.from||(s==="show"?{height:0,width:0}:f),i.to={height:f.height*l.y,width:f.width*l.x,outerHeight:f.outerHeight*l.y,outerWidth:f.outerWidth*l.x},i.fade&&(s==="show"&&(i.from.opacity=0,i.to.opacity=1),s==="hide"&&(i.from.opacity=1,i.to.opacity=0)),r.effect(i)},e.effects.effect.size=function(t,n){var r=e(this),i=["position","top","bottom","left","right","width","height","overflow","opacity"],s=["position","top","bottom","left","right","overflow","opacity"],o=["width","height","overflow"],u=["fontSize"],a=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],f=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],l=e.effects.setMode(r,t.mode||"effect"),c=t.restore||l!=="effect",h=t.scale||"both",p=t.origin||["middle","center"],d,v,m,g=r.css("position");l==="show"&&r.show(),d={height:r.height(),width:r.width(),outerHeight:r.outerHeight(),outerWidth:r.outerWidth()},r.from=t.from||d,r.to=t.to||d,m={from:{y:r.from.height/d.height,x:r.from.width/d.width},to:{y:r.to.height/d.height,x:r.to.width/d.width}};if(h==="box"||h==="both")m.from.y!==m.to.y&&(i=i.concat(a),r.from=e.effects.setTransition(r,a,m.from.y,r.from),r.to=e.effects.setTransition(r,a,m.to.y,r.to)),m.from.x!==m.to.x&&(i=i.concat(f),r.from=e.effects.setTransition(r,f,m.from.x,r.from),r.to=e.effects.setTransition(r,f,m.to.x,r.to));(h==="content"||h==="both")&&m.from.y!==m.to.y&&(i=i.concat(u),r.from=e.effects.setTransition(r,u,m.from.y,r.from),r.to=e.effects.setTransition(r,u,m.to.y,r.to)),e.effects.save(r,c?i:s),r.show(),e.effects.createWrapper(r),r.css("overflow","hidden").css(r.from),p&&(v=e.effects.getBaseline(p,d),r.from.top=(d.outerHeight-r.outerHeight())*v.y,r.from.left=(d.outerWidth-r.outerWidth())*v.x,r.to.top=(d.outerHeight-r.to.outerHeight)*v.y,r.to.left=(d.outerWidth-r.to.outerWidth)*v.x),r.css(r.from);if(h==="content"||h==="both")a=a.concat(["marginTop","marginBottom"]).concat(u),f=f.concat(["marginLeft","marginRight"]),o=i.concat(a).concat(f),r.find("*[width]").each(function(){var n=e(this),r={height:n.height(),width:n.width()};c&&e.effects.save(n,o),n.from={height:r.height*m.from.y,width:r.width*m.from.x},n.to={height:r.height*m.to.y,width:r.width*m.to.x},m.from.y!==m.to.y&&(n.from=e.effects.setTransition(n,a,m.from.y,n.from),n.to=e.effects.setTransition(n,a,m.to.y,n.to)),m.from.x!==m.to.x&&(n.from=e.effects.setTransition(n,f,m.from.x,n.from),n.to=e.effects.setTransition(n,f,m.to.x,n.to)),n.css(n.from),n.animate(n.to,t.duration,t.easing,function(){c&&e.effects.restore(n,o)})});r.animate(r.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){r.to.opacity===0&&r.css("opacity",r.from.opacity),l==="hide"&&r.hide(),e.effects.restore(r,c?i:s),c||(g==="static"?r.css({position:"relative",top:r.to.top,left:r.to.left}):e.each(["top","left"],function(e,t){r.css(t,function(t,n){var i=parseInt(n,10),s=e?r.to.left:r.to.top;return n==="auto"?s+"px":i+s+"px"})})),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.shake=function(t,n){var r=e(this),i=["position","top","bottom","left","right","height","width"],s=e.effects.setMode(r,t.mode||"effect"),o=t.direction||"left",u=t.distance||20,a=t.times||3,f=a*2+1,l=Math.round(t.duration/f),c=o==="up"||o==="down"?"top":"left",h=o==="up"||o==="left",p={},d={},v={},m,g=r.queue(),y=g.length;e.effects.save(r,i),r.show(),e.effects.createWrapper(r),p[c]=(h?"-=":"+=")+u,d[c]=(h?"+=":"-=")+u*2,v[c]=(h?"-=":"+=")+u*2,r.animate(p,l,t.easing);for(m=1;m<a;m++)r.animate(d,l,t.easing).animate(v,l,t.easing);r.animate(d,l,t.easing).animate(p,l/2,t.easing).queue(function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}),y>1&&g.splice.apply(g,[1,0].concat(g.splice(y,f+1))),r.dequeue()}})(jQuery);(function(e,t){e.effects.effect.slide=function(t,n){var r=e(this),i=["position","top","bottom","left","right","width","height"],s=e.effects.setMode(r,t.mode||"show"),o=s==="show",u=t.direction||"left",a=u==="up"||u==="down"?"top":"left",f=u==="up"||u==="left",l,c={};e.effects.save(r,i),r.show(),l=t.distance||r[a==="top"?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(r).css({overflow:"hidden"}),o&&r.css(a,f?isNaN(l)?"-"+l:-l:l),c[a]=(o?f?"+=":"-=":f?"-=":"+=")+l,r.animate(c,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){s==="hide"&&r.hide(),e.effects.restore(r,i),e.effects.removeWrapper(r),n()}})}})(jQuery);(function(e,t){e.effects.effect.transfer=function(t,n){var r=e(this),i=e(t.to),s=i.css("position")==="fixed",o=e("body"),u=s?o.scrollTop():0,a=s?o.scrollLeft():0,f=i.offset(),l={top:f.top-u,left:f.left-a,height:i.innerHeight(),width:i.innerWidth()},c=r.offset(),h=e('<div class="ui-effects-transfer"></div>').appendTo(document.body).addClass(t.className).css({top:c.top-u,left:c.left-a,height:r.innerHeight(),width:r.innerWidth(),position:s?"fixed":"absolute"}).animate(l,t.duration,t.easing,function(){h.remove(),n()})}})(jQuery);(function(e,t){var n=!1;e.widget("ui.menu",{version:"1.9.0",defaultElement:"<ul>",delay:300,options:{icons:{submenu:"ui-icon-carat-1-e"},menus:"ul",position:{my:"left top",at:"right top"},role:"menu",blur:null,focus:null,select:null},_create:function(){this.activeMenu=this.element,this.element.uniqueId().addClass("ui-menu ui-widget ui-widget-content ui-corner-all").toggleClass("ui-menu-icons",!!this.element.find(".ui-icon").length).attr({role:this.options.role,tabIndex:0}).bind("click"+this.eventNamespace,e.proxy(function(e){this.options.disabled&&e.preventDefault()},this)),this.options.disabled&&this.element.addClass("ui-state-disabled").attr("aria-disabled","true"),this._on({"mousedown .ui-menu-item > a":function(e){e.preventDefault()},"click .ui-state-disabled > a":function(e){e.preventDefault()},"click .ui-menu-item:has(a)":function(t){var r=e(t.target).closest(".ui-menu-item");!n&&r.not(".ui-state-disabled").length&&(n=!0,this.select(t),r.has(".ui-menu").length?this.expand(t):this.element.is(":focus")||(this.element.trigger("focus",[!0]),this.active&&this.active.parents(".ui-menu").length===1&&clearTimeout(this.timer)))},"mouseenter .ui-menu-item":function(t){var n=e(t.currentTarget);n.siblings().children(".ui-state-active").removeClass("ui-state-active"),this.focus(t,n)},mouseleave:"collapseAll","mouseleave .ui-menu":"collapseAll",focus:function(e,t){var n=this.active||this.element.children(".ui-menu-item").eq(0);t||this.focus(e,n)},blur:function(t){this._delay(function(){e.contains(this.element[0],this.document[0].activeElement)||this.collapseAll(t)})},keydown:"_keydown"}),this.refresh(),this._on(this.document,{click:function(t){e(t.target).closest(".ui-menu").length||this.collapseAll(t),n=!1}})},_destroy:function(){this.element.removeAttr("aria-activedescendant").find(".ui-menu").andSelf().removeClass("ui-menu ui-widget ui-widget-content ui-corner-all ui-menu-icons").removeAttr("role").removeAttr("tabIndex").removeAttr("aria-labelledby").removeAttr("aria-expanded").removeAttr("aria-hidden").removeAttr("aria-disabled").removeUniqueId().show(),this.element.find(".ui-menu-item").removeClass("ui-menu-item").removeAttr("role").removeAttr("aria-disabled").children("a").removeUniqueId().removeClass("ui-corner-all ui-state-hover").removeAttr("tabIndex").removeAttr("role").removeAttr("aria-haspopup").children().each(function(){var t=e(this);t.data("ui-menu-submenu-carat")&&t.remove()}),this.element.find(".ui-menu-divider").removeClass("ui-menu-divider ui-widget-content")},_keydown:function(t){function a(e){return e.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g,"\\$&")}var n,r,i,s,o,u=!0;switch(t.keyCode){case e.ui.keyCode.PAGE_UP:this.previousPage(t);break;case e.ui.keyCode.PAGE_DOWN:this.nextPage(t);break;case e.ui.keyCode.HOME:this._move("first","first",t);break;case e.ui.keyCode.END:this._move("last","last",t);break;case e.ui.keyCode.UP:this.previous(t);break;case e.ui.keyCode.DOWN:this.next(t);break;case e.ui.keyCode.LEFT:this.collapse(t);break;case e.ui.keyCode.RIGHT:this.active&&!this.active.is(".ui-state-disabled")&&this.expand(t);break;case e.ui.keyCode.ENTER:case e.ui.keyCode.SPACE:this._activate(t);break;case e.ui.keyCode.ESCAPE:this.collapse(t);break;default:u=!1,r=this.previousFilter||"",i=String.fromCharCode(t.keyCode),s=!1,clearTimeout(this.filterTimer),i===r?s=!0:i=r+i,o=new RegExp("^"+a(i),"i"),n=this.activeMenu.children(".ui-menu-item").filter(function(){return o.test(e(this).children("a").text())}),n=s&&n.index(this.active.next())!==-1?this.active.nextAll(".ui-menu-item"):n,n.length||(i=String.fromCharCode(t.keyCode),o=new RegExp("^"+a(i),"i"),n=this.activeMenu.children(".ui-menu-item").filter(function(){return o.test(e(this).children("a").text())})),n.length?(this.focus(t,n),n.length>1?(this.previousFilter=i,this.filterTimer=this._delay(function(){delete this.previousFilter},1e3)):delete this.previousFilter):delete this.previousFilter}u&&t.preventDefault()},_activate:function(e){this.active.is(".ui-state-disabled")||(this.active.children("a[aria-haspopup='true']").length?this.expand(e):this.select(e))},refresh:function(){var t,n=this.options.icons.submenu,r=this.element.find(this.options.menus+":not(.ui-menu)").addClass("ui-menu ui-widget ui-widget-content ui-corner-all").hide().attr({role:this.options.role,"aria-hidden":"true","aria-expanded":"false"});t=r.add(this.element),t.children(":not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","presentation").children("a").uniqueId().addClass("ui-corner-all").attr({tabIndex:-1,role:this._itemRole()}),t.children(":not(.ui-menu-item)").each(function(){var t=e(this);/[^\-—–\s]/.test(t.text())||t.addClass("ui-widget-content ui-menu-divider")}),t.children(".ui-state-disabled").attr("aria-disabled","true"),r.each(function(){var t=e(this),r=t.prev("a"),i=e("<span>").addClass("ui-menu-icon ui-icon "+n).data("ui-menu-submenu-carat",!0);r.attr("aria-haspopup","true").prepend(i),t.attr("aria-labelledby",r.attr("id"))}),this.active&&!e.contains(this.element[0],this.active[0])&&this.blur()},_itemRole:function(){return{menu:"menuitem",listbox:"option"}[this.options.role]},focus:function(e,t){var n,r;this.blur(e,e&&e.type==="focus"),this._scrollIntoView(t),this.active=t.first(),r=this.active.children("a").addClass("ui-state-focus"),this.options.role&&this.element.attr("aria-activedescendant",r.attr("id")),this.active.parent().closest(".ui-menu-item").children("a:first").addClass("ui-state-active"),e&&e.type==="keydown"?this._close():this.timer=this._delay(function(){this._close()},this.delay),n=t.children(".ui-menu"),n.length&&/^mouse/.test(e.type)&&this._startOpening(n),this.activeMenu=t.parent(),this._trigger("focus",e,{item:t})},_scrollIntoView:function(t){var n,r,i,s,o,u;this._hasScroll()&&(n=parseFloat(e.css(this.activeMenu[0],"borderTopWidth"))||0,r=parseFloat(e.css(this.activeMenu[0],"paddingTop"))||0,i=t.offset().top-this.activeMenu.offset().top-n-r,s=this.activeMenu.scrollTop(),o=this.activeMenu.height(),u=t.height(),i<0?this.activeMenu.scrollTop(s+i):i+u>o&&this.activeMenu.scrollTop(s+i-o+u))},blur:function(e,t){t||clearTimeout(this.timer);if(!this.active)return;this.active.children("a").removeClass("ui-state-focus"),this.active=null,this._trigger("blur",e,{item:this.active})},_startOpening:function(e){clearTimeout(this.timer);if(e.attr("aria-hidden")!=="true")return;this.timer=this._delay(function(){this._close(),this._open(e)},this.delay)},_open:function(t){var n=e.extend({of:this.active},this.options.position);clearTimeout(this.timer),this.element.find(".ui-menu").not(t.parents(".ui-menu")).hide().attr("aria-hidden","true"),t.show().removeAttr("aria-hidden").attr("aria-expanded","true").position(n)},collapseAll:function(t,n){clearTimeout(this.timer),this.timer=this._delay(function(){var r=n?this.element:e(t&&t.target).closest(this.element.find(".ui-menu"));r.length||(r=this.element),this._close(r),this.blur(t),this.activeMenu=r},this.delay)},_close:function(e){e||(e=this.active?this.active.parent():this.element),e.find(".ui-menu").hide().attr("aria-hidden","true").attr("aria-expanded","false").end().find("a.ui-state-active").removeClass("ui-state-active")},collapse:function(e){var t=this.active&&this.active.parent().closest(".ui-menu-item",this.element);t&&t.length&&(this._close(),this.focus(e,t))},expand:function(e){var t=this.active&&this.active.children(".ui-menu ").children(".ui-menu-item").first();t&&t.length&&(this._open(t.parent()),this._delay(function(){this.focus(e,t)}))},next:function(e){this._move("next","first",e)},previous:function(e){this._move("prev","last",e)},isFirstItem:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},isLastItem:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},_move:function(e,t,n){var r;this.active&&(e==="first"||e==="last"?r=this.active[e==="first"?"prevAll":"nextAll"](".ui-menu-item").eq(-1):r=this.active[e+"All"](".ui-menu-item").eq(0));if(!r||!r.length||!this.active)r=this.activeMenu.children(".ui-menu-item")[t]();this.focus(n,r)},nextPage:function(t){var n,r,i;if(!this.active){this.next(t);return}if(this.isLastItem())return;this._hasScroll()?(r=this.active.offset().top,i=this.element.height(),this.active.nextAll(".ui-menu-item").each(function(){return n=e(this),n.offset().top-r-i<0}),this.focus(t,n)):this.focus(t,this.activeMenu.children(".ui-menu-item")[this.active?"last":"first"]())},previousPage:function(t){var n,r,i;if(!this.active){this.next(t);return}if(this.isFirstItem())return;this._hasScroll()?(r=this.active.offset().top,i=this.element.height(),this.active.prevAll(".ui-menu-item").each(function(){return n=e(this),n.offset().top-r+i>0}),this.focus(t,n)):this.focus(t,this.activeMenu.children(".ui-menu-item").first())},_hasScroll:function(){return this.element.outerHeight()<this.element.prop("scrollHeight")},select:function(t){this.active=this.active||e(t.target).closest(".ui-menu-item");var n={item:this.active};this.active.has(".ui-menu").length||this.collapseAll(t,!0),this._trigger("select",t,n)}})})(jQuery);(function(e,t){e.widget("ui.progressbar",{version:"1.9.0",options:{value:0,max:100},min:0,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.options.max,"aria-valuenow":this._value()}),this.valueDiv=e("<div class='ui-progressbar-value ui-widget-header ui-corner-left'></div>").appendTo(this.element),this.oldValue=this._value(),this._refreshValue()},_destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.valueDiv.remove()},value:function(e){return e===t?this._value():(this._setOption("value",e),this)},_setOption:function(e,t){e==="value"&&(this.options.value=t,this._refreshValue(),this._value()===this.options.max&&this._trigger("complete")),this._super(e,t)},_value:function(){var e=this.options.value;return typeof e!="number"&&(e=0),Math.min(this.options.max,Math.max(this.min,e))},_percentage:function(){return 100*this._value()/this.options.max},_refreshValue:function(){var e=this.value(),t=this._percentage();this.oldValue!==e&&(this.oldValue=e,this._trigger("change")),this.valueDiv.toggle(e>this.min).toggleClass("ui-corner-right",e===this.options.max).width(t.toFixed(0)+"%"),this.element.attr("aria-valuenow",e)}})})(jQuery);(function(e,t){e.widget("ui.resizable",e.ui.mouse,{version:"1.9.0",widgetEventPrefix:"resize",options:{alsoResize:!1,animate:!1,animateDuration:"slow",animateEasing:"swing",aspectRatio:!1,autoHide:!1,containment:!1,ghost:!1,grid:!1,handles:"e,s,se",helper:!1,maxHeight:null,maxWidth:null,minHeight:10,minWidth:10,zIndex:1e3},_create:function(){var t=this,n=this.options;this.element.addClass("ui-resizable"),e.extend(this,{_aspectRatio:!!n.aspectRatio,aspectRatio:n.aspectRatio,originalElement:this.element,_proportionallyResizeElements:[],_helper:n.helper||n.ghost||n.animate?n.helper||"ui-resizable-helper":null}),this.element[0].nodeName.match(/canvas|textarea|input|select|button|img/i)&&(this.element.wrap(e('<div class="ui-wrapper" style="overflow: hidden;"></div>').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("resizable",this.element.data("resizable")),this.elementIsWrapper=!0,this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")}),this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0}),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css({margin:this.originalElement.css("margin")}),this._proportionallyResize()),this.handles=n.handles||(e(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se");if(this.handles.constructor==String){this.handles=="all"&&(this.handles="n,e,s,w,se,sw,ne,nw");var r=this.handles.split(",");this.handles={};for(var i=0;i<r.length;i++){var s=e.trim(r[i]),o="ui-resizable-"+s,u=e('<div class="ui-resizable-handle '+o+'"></div>');u.css({zIndex:n.zIndex}),"se"==s&&u.addClass("ui-icon ui-icon-gripsmall-diagonal-se"),this.handles[s]=".ui-resizable-"+s,this.element.append(u)}}this._renderAxis=function(t){t=t||this.element;for(var n in this.handles){this.handles[n].constructor==String&&(this.handles[n]=e(this.handles[n],this.element).show());if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var r=e(this.handles[n],this.element),i=0;i=/sw|ne|nw|se|n|s/.test(n)?r.outerHeight():r.outerWidth();var s=["padding",/ne|nw|n/.test(n)?"Top":/se|sw|s/.test(n)?"Bottom":/^e$/.test(n)?"Right":"Left"].join("");t.css(s,i),this._proportionallyResize()}if(!e(this.handles[n]).length)continue}},this._renderAxis(this.element),this._handles=e(".ui-resizable-handle",this.element).disableSelection(),this._handles.mouseover(function(){if(!t.resizing){if(this.className)var e=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);t.axis=e&&e[1]?e[1]:"se"}}),n.autoHide&&(this._handles.hide(),e(this.element).addClass("ui-resizable-autohide").mouseenter(function(){if(n.disabled)return;e(this).removeClass("ui-resizable-autohide"),t._handles.show()}).mouseleave(function(){if(n.disabled)return;t.resizing||(e(this).addClass("ui-resizable-autohide"),t._handles.hide())})),this._mouseInit()},_destroy:function(){this._mouseDestroy();var t=function(t){e(t).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").removeData("ui-resizable").unbind(".resizable").find(".ui-resizable-handle").remove()};if(this.elementIsWrapper){t(this.element);var n=this.element;n.after(this.originalElement.css({position:n.css("position"),width:n.outerWidth(),height:n.outerHeight(),top:n.css("top"),left:n.css("left")})).remove()}return this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_mouseCapture:function(t){var n=!1;for(var r in this.handles)e(this.handles[r])[0]==t.target&&(n=!0);return!this.options.disabled&&n},_mouseStart:function(t){var r=this.options,i=this.element.position(),s=this.element;this.resizing=!0,this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()},(s.is(".ui-draggable")||/absolute/.test(s.css("position")))&&s.css({position:"absolute",top:i.top,left:i.left}),this._renderProxy();var o=n(this.helper.css("left")),u=n(this.helper.css("top"));r.containment&&(o+=e(r.containment).scrollLeft()||0,u+=e(r.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:o,top:u},this.size=this._helper?{width:s.outerWidth(),height:s.outerHeight()}:{width:s.width(),height:s.height()},this.originalSize=this._helper?{width:s.outerWidth(),height:s.outerHeight()}:{width:s.width(),height:s.height()},this.originalPosition={left:o,top:u},this.sizeDiff={width:s.outerWidth()-s.width(),height:s.outerHeight()-s.height()},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio=typeof r.aspectRatio=="number"?r.aspectRatio:this.originalSize.width/this.originalSize.height||1;var a=e(".ui-resizable-"+this.axis).css("cursor");return e("body").css("cursor",a=="auto"?this.axis+"-resize":a),s.addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(e){var t=this.helper,n=this.options,r={},i=this,s=this.originalMousePosition,o=this.axis,u=e.pageX-s.left||0,a=e.pageY-s.top||0,f=this._change[o];if(!f)return!1;var l=f.apply(this,[e,u,a]);this._updateVirtualBoundaries(e.shiftKey);if(this._aspectRatio||e.shiftKey)l=this._updateRatio(l,e);return l=this._respectSize(l,e),this._propagate("resize",e),t.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"}),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),this._updateCache(l),this._trigger("resize",e,this.ui()),!1},_mouseStop:function(t){this.resizing=!1;var n=this.options,r=this;if(this._helper){var i=this._proportionallyResizeElements,s=i.length&&/textarea/i.test(i[0].nodeName),o=s&&e.ui.hasScroll(i[0],"left")?0:r.sizeDiff.height,u=s?0:r.sizeDiff.width,a={width:r.helper.width()-u,height:r.helper.height()-o},f=parseInt(r.element.css("left"),10)+(r.position.left-r.originalPosition.left)||null,l=parseInt(r.element.css("top"),10)+(r.position.top-r.originalPosition.top)||null;n.animate||this.element.css(e.extend(a,{top:l,left:f})),r.helper.height(r.size.height),r.helper.width(r.size.width),this._helper&&!n.animate&&this._proportionallyResize()}return e("body").css("cursor","auto"),this.element.removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updateVirtualBoundaries:function(e){var t=this.options,n,i,s,o,u;u={minWidth:r(t.minWidth)?t.minWidth:0,maxWidth:r(t.maxWidth)?t.maxWidth:Infinity,minHeight:r(t.minHeight)?t.minHeight:0,maxHeight:r(t.maxHeight)?t.maxHeight:Infinity};if(this._aspectRatio||e)n=u.minHeight*this.aspectRatio,s=u.minWidth/this.aspectRatio,i=u.maxHeight*this.aspectRatio,o=u.maxWidth/this.aspectRatio,n>u.minWidth&&(u.minWidth=n),s>u.minHeight&&(u.minHeight=s),i<u.maxWidth&&(u.maxWidth=i),o<u.maxHeight&&(u.maxHeight=o);this._vBoundaries=u},_updateCache:function(e){var t=this.options;this.offset=this.helper.offset(),r(e.left)&&(this.position.left=e.left),r(e.top)&&(this.position.top=e.top),r(e.height)&&(this.size.height=e.height),r(e.width)&&(this.size.width=e.width)},_updateRatio:function(e,t){var n=this.options,i=this.position,s=this.size,o=this.axis;return r(e.height)?e.width=e.height*this.aspectRatio:r(e.width)&&(e.height=e.width/this.aspectRatio),o=="sw"&&(e.left=i.left+(s.width-e.width),e.top=null),o=="nw"&&(e.top=i.top+(s.height-e.height),e.left=i.left+(s.width-e.width)),e},_respectSize:function(e,t){var n=this.helper,i=this._vBoundaries,s=this._aspectRatio||t.shiftKey,o=this.axis,u=r(e.width)&&i.maxWidth&&i.maxWidth<e.width,a=r(e.height)&&i.maxHeight&&i.maxHeight<e.height,f=r(e.width)&&i.minWidth&&i.minWidth>e.width,l=r(e.height)&&i.minHeight&&i.minHeight>e.height;f&&(e.width=i.minWidth),l&&(e.height=i.minHeight),u&&(e.width=i.maxWidth),a&&(e.height=i.maxHeight);var c=this.originalPosition.left+this.originalSize.width,h=this.position.top+this.size.height,p=/sw|nw|w/.test(o),d=/nw|ne|n/.test(o);f&&p&&(e.left=c-i.minWidth),u&&p&&(e.left=c-i.maxWidth),l&&d&&(e.top=h-i.minHeight),a&&d&&(e.top=h-i.maxHeight);var v=!e.width&&!e.height;return v&&!e.left&&e.top?e.top=null:v&&!e.top&&e.left&&(e.left=null),e},_proportionallyResize:function(){var t=this.options;if(!this._proportionallyResizeElements.length)return;var n=this.helper||this.element;for(var r=0;r<this._proportionallyResizeElements.length;r++){var i=this._proportionallyResizeElements[r];if(!this.borderDif){var s=[i.css("borderTopWidth"),i.css("borderRightWidth"),i.css("borderBottomWidth"),i.css("borderLeftWidth")],o=[i.css("paddingTop"),i.css("paddingRight"),i.css("paddingBottom"),i.css("paddingLeft")];this.borderDif=e.map(s,function(e,t){var n=parseInt(e,10)||0,r=parseInt(o[t],10)||0;return n+r})}i.css({height:n.height()-this.borderDif[0]-this.borderDif[2]||0,width:n.width()-this.borderDif[1]-this.borderDif[3]||0})}},_renderProxy:function(){var t=this.element,n=this.options;this.elementOffset=t.offset();if(this._helper){this.helper=this.helper||e('<div style="overflow:hidden;"></div>');var r=e.browser.msie&&e.browser.version<7,i=r?1:0,s=r?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+s,height:this.element.outerHeight()+s,position:"absolute",left:this.elementOffset.left-i+"px",top:this.elementOffset.top-i+"px",zIndex:++n.zIndex}),this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(e,t,n){return{width:this.originalSize.width+t}},w:function(e,t,n){var r=this.options,i=this.originalSize,s=this.originalPosition;return{left:s.left+t,width:i.width-t}},n:function(e,t,n){var r=this.options,i=this.originalSize,s=this.originalPosition;return{top:s.top+n,height:i.height-n}},s:function(e,t,n){return{height:this.originalSize.height+n}},se:function(t,n,r){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,n,r]))},sw:function(t,n,r){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,n,r]))},ne:function(t,n,r){return e.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,n,r]))},nw:function(t,n,r){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,n,r]))}},_propagate:function(t,n){e.ui.plugin.call(this,t,[n,this.ui()]),t!="resize"&&this._trigger(t,n,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),e.ui.plugin.add("resizable","alsoResize",{start:function(t,n){var r=e(this).data("resizable"),i=r.options,s=function(t){e(t).each(function(){var t=e(this);t.data("resizable-alsoresize",{width:parseInt(t.width(),10),height:parseInt(t.height(),10),left:parseInt(t.css("left"),10),top:parseInt(t.css("top"),10)})})};typeof i.alsoResize=="object"&&!i.alsoResize.parentNode?i.alsoResize.length?(i.alsoResize=i.alsoResize[0],s(i.alsoResize)):e.each(i.alsoResize,function(e){s(e)}):s(i.alsoResize)},resize:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.originalSize,o=r.originalPosition,u={height:r.size.height-s.height||0,width:r.size.width-s.width||0,top:r.position.top-o.top||0,left:r.position.left-o.left||0},a=function(t,r){e(t).each(function(){var t=e(this),i=e(this).data("resizable-alsoresize"),s={},o=r&&r.length?r:t.parents(n.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(o,function(e,t){var n=(i[t]||0)+(u[t]||0);n&&n>=0&&(s[t]=n||null)}),t.css(s)})};typeof i.alsoResize=="object"&&!i.alsoResize.nodeType?e.each(i.alsoResize,function(e,t){a(e,t)}):a(i.alsoResize)},stop:function(t,n){e(this).removeData("resizable-alsoresize")}}),e.ui.plugin.add("resizable","animate",{stop:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r._proportionallyResizeElements,o=s.length&&/textarea/i.test(s[0].nodeName),u=o&&e.ui.hasScroll(s[0],"left")?0:r.sizeDiff.height,a=o?0:r.sizeDiff.width,f={width:r.size.width-a,height:r.size.height-u},l=parseInt(r.element.css("left"),10)+(r.position.left-r.originalPosition.left)||null,c=parseInt(r.element.css("top"),10)+(r.position.top-r.originalPosition.top)||null;r.element.animate(e.extend(f,c&&l?{top:c,left:l}:{}),{duration:i.animateDuration,easing:i.animateEasing,step:function(){var n={width:parseInt(r.element.css("width"),10),height:parseInt(r.element.css("height"),10),top:parseInt(r.element.css("top"),10),left:parseInt(r.element.css("left"),10)};s&&s.length&&e(s[0]).css({width:n.width,height:n.height}),r._updateCache(n),r._propagate("resize",t)}})}}),e.ui.plugin.add("resizable","containment",{start:function(t,r){var i=e(this).data("resizable"),s=i.options,o=i.element,u=s.containment,a=u instanceof e?u.get(0):/parent/.test(u)?o.parent().get(0):u;if(!a)return;i.containerElement=e(a);if(/document/.test(u)||u==document)i.containerOffset={left:0,top:0},i.containerPosition={left:0,top:0},i.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight};else{var f=e(a),l=[];e(["Top","Right","Left","Bottom"]).each(function(e,t){l[e]=n(f.css("padding"+t))}),i.containerOffset=f.offset(),i.containerPosition=f.position(),i.containerSize={height:f.innerHeight()-l[3],width:f.innerWidth()-l[1]};var c=i.containerOffset,h=i.containerSize.height,p=i.containerSize.width,d=e.ui.hasScroll(a,"left")?a.scrollWidth:p,v=e.ui.hasScroll(a)?a.scrollHeight:h;i.parentData={element:a,left:c.left,top:c.top,width:d,height:v}}},resize:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.containerSize,o=r.containerOffset,u=r.size,a=r.position,f=r._aspectRatio||t.shiftKey,l={top:0,left:0},c=r.containerElement;c[0]!=document&&/static/.test(c.css("position"))&&(l=o),a.left<(r._helper?o.left:0)&&(r.size.width=r.size.width+(r._helper?r.position.left-o.left:r.position.left-l.left),f&&(r.size.height=r.size.width/r.aspectRatio),r.position.left=i.helper?o.left:0),a.top<(r._helper?o.top:0)&&(r.size.height=r.size.height+(r._helper?r.position.top-o.top:r.position.top),f&&(r.size.width=r.size.height*r.aspectRatio),r.position.top=r._helper?o.top:0),r.offset.left=r.parentData.left+r.position.left,r.offset.top=r.parentData.top+r.position.top;var h=Math.abs((r._helper?r.offset.left-l.left:r.offset.left-l.left)+r.sizeDiff.width),p=Math.abs((r._helper?r.offset.top-l.top:r.offset.top-o.top)+r.sizeDiff.height),d=r.containerElement.get(0)==r.element.parent().get(0),v=/relative|absolute/.test(r.containerElement.css("position"));d&&v&&(h-=r.parentData.left),h+r.size.width>=r.parentData.width&&(r.size.width=r.parentData.width-h,f&&(r.size.height=r.size.width/r.aspectRatio)),p+r.size.height>=r.parentData.height&&(r.size.height=r.parentData.height-p,f&&(r.size.width=r.size.height*r.aspectRatio))},stop:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.position,o=r.containerOffset,u=r.containerPosition,a=r.containerElement,f=e(r.helper),l=f.offset(),c=f.outerWidth()-r.sizeDiff.width,h=f.outerHeight()-r.sizeDiff.height;r._helper&&!i.animate&&/relative/.test(a.css("position"))&&e(this).css({left:l.left-u.left-o.left,width:c,height:h}),r._helper&&!i.animate&&/static/.test(a.css("position"))&&e(this).css({left:l.left-u.left-o.left,width:c,height:h})}}),e.ui.plugin.add("resizable","ghost",{start:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.size;r.ghost=r.originalElement.clone(),r.ghost.css({opacity:.25,display:"block",position:"relative",height:s.height,width:s.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof i.ghost=="string"?i.ghost:""),r.ghost.appendTo(r.helper)},resize:function(t,n){var r=e(this).data("resizable"),i=r.options;r.ghost&&r.ghost.css({position:"relative",height:r.size.height,width:r.size.width})},stop:function(t,n){var r=e(this).data("resizable"),i=r.options;r.ghost&&r.helper&&r.helper.get(0).removeChild(r.ghost.get(0))}}),e.ui.plugin.add("resizable","grid",{resize:function(t,n){var r=e(this).data("resizable"),i=r.options,s=r.size,o=r.originalSize,u=r.originalPosition,a=r.axis,f=i._aspectRatio||t.shiftKey;i.grid=typeof i.grid=="number"?[i.grid,i.grid]:i.grid;var l=Math.round((s.width-o.width)/(i.grid[0]||1))*(i.grid[0]||1),c=Math.round((s.height-o.height)/(i.grid[1]||1))*(i.grid[1]||1);/^(se|s|e)$/.test(a)?(r.size.width=o.width+l,r.size.height=o.height+c):/^(ne)$/.test(a)?(r.size.width=o.width+l,r.size.height=o.height+c,r.position.top=u.top-c):/^(sw)$/.test(a)?(r.size.width=o.width+l,r.size.height=o.height+c,r.position.left=u.left-l):(r.size.width=o.width+l,r.size.height=o.height+c,r.position.top=u.top-c,r.position.left=u.left-l)}});var n=function(e){return parseInt(e,10)||0},r=function(e){return!isNaN(parseInt(e,10))}})(jQuery);(function(e,t){e.widget("ui.selectable",e.ui.mouse,{version:"1.9.0",options:{appendTo:"body",autoRefresh:!0,distance:0,filter:"*",tolerance:"touch"},_create:function(){var t=this;this.element.addClass("ui-selectable"),this.dragged=!1;var n;this.refresh=function(){n=e(t.options.filter,t.element[0]),n.addClass("ui-selectee"),n.each(function(){var t=e(this),n=t.offset();e.data(this,"selectable-item",{element:this,$element:t,left:n.left,top:n.top,right:n.left+t.outerWidth(),bottom:n.top+t.outerHeight(),startselected:!1,selected:t.hasClass("ui-selected"),selecting:t.hasClass("ui-selecting"),unselecting:t.hasClass("ui-unselecting")})})},this.refresh(),this.selectees=n.addClass("ui-selectee"),this._mouseInit(),this.helper=e("<div class='ui-selectable-helper'></div>")},_destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item"),this.element.removeClass("ui-selectable ui-selectable-disabled"),this._mouseDestroy()},_mouseStart:function(t){var n=this;this.opos=[t.pageX,t.pageY];if(this.options.disabled)return;var r=this.options;this.selectees=e(r.filter,this.element[0]),this._trigger("start",t),e(r.appendTo).append(this.helper),this.helper.css({left:t.clientX,top:t.clientY,width:0,height:0}),r.autoRefresh&&this.refresh(),this.selectees.filter(".ui-selected").each(function(){var r=e.data(this,"selectable-item");r.startselected=!0,!t.metaKey&&!t.ctrlKey&&(r.$element.removeClass("ui-selected"),r.selected=!1,r.$element.addClass("ui-unselecting"),r.unselecting=!0,n._trigger("unselecting",t,{unselecting:r.element}))}),e(t.target).parents().andSelf().each(function(){var r=e.data(this,"selectable-item");if(r){var i=!t.metaKey&&!t.ctrlKey||!r.$element.hasClass("ui-selected");return r.$element.removeClass(i?"ui-unselecting":"ui-selected").addClass(i?"ui-selecting":"ui-unselecting"),r.unselecting=!i,r.selecting=i,r.selected=i,i?n._trigger("selecting",t,{selecting:r.element}):n._trigger("unselecting",t,{unselecting:r.element}),!1}})},_mouseDrag:function(t){var n=this;this.dragged=!0;if(this.options.disabled)return;var r=this.options,i=this.opos[0],s=this.opos[1],o=t.pageX,u=t.pageY;if(i>o){var a=o;o=i,i=a}if(s>u){var a=u;u=s,s=a}return this.helper.css({left:i,top:s,width:o-i,height:u-s}),this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!a||a.element==n.element[0])return;var f=!1;r.tolerance=="touch"?f=!(a.left>o||a.right<i||a.top>u||a.bottom<s):r.tolerance=="fit"&&(f=a.left>i&&a.right<o&&a.top>s&&a.bottom<u),f?(a.selected&&(a.$element.removeClass("ui-selected"),a.selected=!1),a.unselecting&&(a.$element.removeClass("ui-unselecting"),a.unselecting=!1),a.selecting||(a.$element.addClass("ui-selecting"),a.selecting=!0,n._trigger("selecting",t,{selecting:a.element}))):(a.selecting&&((t.metaKey||t.ctrlKey)&&a.startselected?(a.$element.removeClass("ui-selecting"),a.selecting=!1,a.$element.addClass("ui-selected"),a.selected=!0):(a.$element.removeClass("ui-selecting"),a.selecting=!1,a.startselected&&(a.$element.addClass("ui-unselecting"),a.unselecting=!0),n._trigger("unselecting",t,{unselecting:a.element}))),a.selected&&!t.metaKey&&!t.ctrlKey&&!a.startselected&&(a.$element.removeClass("ui-selected"),a.selected=!1,a.$element.addClass("ui-unselecting"),a.unselecting=!0,n._trigger("unselecting",t,{unselecting:a.element})))}),!1},_mouseStop:function(t){var n=this;this.dragged=!1;var r=this.options;return e(".ui-unselecting",this.element[0]).each(function(){var r=e.data(this,"selectable-item");r.$element.removeClass("ui-unselecting"),r.unselecting=!1,r.startselected=!1,n._trigger("unselected",t,{unselected:r.element})}),e(".ui-selecting",this.element[0]).each(function(){var r=e.data(this,"selectable-item");r.$element.removeClass("ui-selecting").addClass("ui-selected"),r.selecting=!1,r.selected=!0,r.startselected=!0,n._trigger("selected",t,{selected:r.element})}),this._trigger("stop",t),this.helper.remove(),!1}})})(jQuery);(function(e,t){var n=5;e.widget("ui.slider",e.ui.mouse,{version:"1.9.0",widgetEventPrefix:"slide",options:{animate:!1,distance:0,max:100,min:0,orientation:"horizontal",range:!1,step:1,value:0,values:null},_create:function(){var t,r=this.options,i=this.element.find(".ui-slider-handle").addClass("ui-state-default ui-corner-all"),s="<a class='ui-slider-handle ui-state-default ui-corner-all' href='#'></a>",o=r.values&&r.values.length||1,u=[];this._keySliding=!1,this._mouseSliding=!1,this._animateOff=!0,this._handleIndex=null,this._detectOrientation(),this._mouseInit(),this.element.addClass("ui-slider ui-slider-"+this.orientation+" ui-widget"+" ui-widget-content"+" ui-corner-all"+(r.disabled?" ui-slider-disabled ui-disabled":"")),this.range=e([]),r.range&&(r.range===!0&&(r.values||(r.values=[this._valueMin(),this._valueMin()]),r.values.length&&r.values.length!==2&&(r.values=[r.values[0],r.values[0]])),this.range=e("<div></div>").appendTo(this.element).addClass("ui-slider-range ui-widget-header"+(r.range==="min"||r.range==="max"?" ui-slider-range-"+r.range:"")));for(t=i.length;t<o;t++)u.push(s);this.handles=i.add(e(u.join("")).appendTo(this.element)),this.handle=this.handles.eq(0),this.handles.add(this.range).filter("a").click(function(e){e.preventDefault()}).mouseenter(function(){r.disabled||e(this).addClass("ui-state-hover")}).mouseleave(function(){e(this).removeClass("ui-state-hover")}).focus(function(){r.disabled?e(this).blur():(e(".ui-slider .ui-state-focus").removeClass("ui-state-focus"),e(this).addClass("ui-state-focus"))}).blur(function(){e(this).removeClass("ui-state-focus")}),this.handles.each(function(t){e(this).data("ui-slider-handle-index",t)}),this._on(this.handles,{keydown:function(t){var r,i,s,o,u=e(t.target).data("ui-slider-handle-index");switch(t.keyCode){case e.ui.keyCode.HOME:case e.ui.keyCode.END:case e.ui.keyCode.PAGE_UP:case e.ui.keyCode.PAGE_DOWN:case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:t.preventDefault();if(!this._keySliding){this._keySliding=!0,e(t.target).addClass("ui-state-active"),r=this._start(t,u);if(r===!1)return}}o=this.options.step,this.options.values&&this.options.values.length?i=s=this.values(u):i=s=this.value();switch(t.keyCode){case e.ui.keyCode.HOME:s=this._valueMin();break;case e.ui.keyCode.END:s=this._valueMax();break;case e.ui.keyCode.PAGE_UP:s=this._trimAlignValue(i+(this._valueMax()-this._valueMin())/n);break;case e.ui.keyCode.PAGE_DOWN:s=this._trimAlignValue(i-(this._valueMax()-this._valueMin())/n);break;case e.ui.keyCode.UP:case e.ui.keyCode.RIGHT:if(i===this._valueMax())return;s=this._trimAlignValue(i+o);break;case e.ui.keyCode.DOWN:case e.ui.keyCode.LEFT:if(i===this._valueMin())return;s=this._trimAlignValue(i-o)}this._slide(t,u,s)},keyup:function(t){var n=e(t.target).data("ui-slider-handle-index");this._keySliding&&(this._keySliding=!1,this._stop(t,n),this._change(t,n),e(t.target).removeClass("ui-state-active"))}}),this._refreshValue(),this._animateOff=!1},_destroy:function(){this.handles.remove(),this.range.remove(),this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all"),this._mouseDestroy()},_mouseCapture:function(t){var n,r,i,s,o,u,a,f,l=this,c=this.options;return c.disabled?!1:(this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()},this.elementOffset=this.element.offset(),n={x:t.pageX,y:t.pageY},r=this._normValueFromMouse(n),i=this._valueMax()-this._valueMin()+1,this.handles.each(function(t){var n=Math.abs(r-l.values(t));i>n&&(i=n,s=e(this),o=t)}),c.range===!0&&this.values(1)===c.min&&(o+=1,s=e(this.handles[o])),u=this._start(t,o),u===!1?!1:(this._mouseSliding=!0,this._handleIndex=o,s.addClass("ui-state-active").focus(),a=s.offset(),f=!e(t.target).parents().andSelf().is(".ui-slider-handle"),this._clickOffset=f?{left:0,top:0}:{left:t.pageX-a.left-s.width()/2,top:t.pageY-a.top-s.height()/2-(parseInt(s.css("borderTopWidth"),10)||0)-(parseInt(s.css("borderBottomWidth"),10)||0)+(parseInt(s.css("marginTop"),10)||0)},this.handles.hasClass("ui-state-hover")||this._slide(t,o,r),this._animateOff=!0,!0))},_mouseStart:function(e){return!0},_mouseDrag:function(e){var t={x:e.pageX,y:e.pageY},n=this._normValueFromMouse(t);return this._slide(e,this._handleIndex,n),!1},_mouseStop:function(e){return this.handles.removeClass("ui-state-active"),this._mouseSliding=!1,this._stop(e,this._handleIndex),this._change(e,this._handleIndex),this._handleIndex=null,this._clickOffset=null,this._animateOff=!1,!1},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(e){var t,n,r,i,s;return this.orientation==="horizontal"?(t=this.elementSize.width,n=e.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)):(t=this.elementSize.height,n=e.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)),r=n/t,r>1&&(r=1),r<0&&(r=0),this.orientation==="vertical"&&(r=1-r),i=this._valueMax()-this._valueMin(),s=this._valueMin()+r*i,this._trimAlignValue(s)},_start:function(e,t){var n={handle:this.handles[t],value:this.value()};return this.options.values&&this.options.values.length&&(n.value=this.values(t),n.values=this.values()),this._trigger("start",e,n)},_slide:function(e,t,n){var r,i,s;this.options.values&&this.options.values.length?(r=this.values(t?0:1),this.options.values.length===2&&this.options.range===!0&&(t===0&&n>r||t===1&&n<r)&&(n=r),n!==this.values(t)&&(i=this.values(),i[t]=n,s=this._trigger("slide",e,{handle:this.handles[t],value:n,values:i}),r=this.values(t?0:1),s!==!1&&this.values(t,n,!0))):n!==this.value()&&(s=this._trigger("slide",e,{handle:this.handles[t],value:n}),s!==!1&&this.value(n))},_stop:function(e,t){var n={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(n.value=this.values(t),n.values=this.values()),this._trigger("stop",e,n)},_change:function(e,t){if(!this._keySliding&&!this._mouseSliding){var n={handle:this.handles[t],value:this.value()};this.options.values&&this.options.values.length&&(n.value=this.values(t),n.values=this.values()),this._trigger("change",e,n)}},value:function(e){if(arguments.length){this.options.value=this._trimAlignValue(e),this._refreshValue(),this._change(null,0);return}return this._value()},values:function(t,n){var r,i,s;if(arguments.length>1){this.options.values[t]=this._trimAlignValue(n),this._refreshValue(),this._change(null,t);return}if(!arguments.length)return this._values();if(!e.isArray(arguments[0]))return this.options.values&&this.options.values.length?this._values(t):this.value();r=this.options.values,i=arguments[0];for(s=0;s<r.length;s+=1)r[s]=this._trimAlignValue(i[s]),this._change(null,s);this._refreshValue()},_setOption:function(t,n){var r,i=0;e.isArray(this.options.values)&&(i=this.options.values.length),e.Widget.prototype._setOption.apply(this,arguments);switch(t){case"disabled":n?(this.handles.filter(".ui-state-focus").blur(),this.handles.removeClass("ui-state-hover"),this.handles.prop("disabled",!0),this.element.addClass("ui-disabled")):(this.handles.prop("disabled",!1),this.element.removeClass("ui-disabled"));break;case"orientation":this._detectOrientation(),this.element.removeClass("ui-slider-horizontal ui-slider-vertical").addClass("ui-slider-"+this.orientation),this._refreshValue();break;case"value":this._animateOff=!0,this._refreshValue(),this._change(null,0),this._animateOff=!1;break;case"values":this._animateOff=!0,this._refreshValue();for(r=0;r<i;r+=1)this._change(null,r);this._animateOff=!1}},_value:function(){var e=this.options.value;return e=this._trimAlignValue(e),e},_values:function(e){var t,n,r;if(arguments.length)return t=this.options.values[e],t=this._trimAlignValue(t),t;n=this.options.values.slice();for(r=0;r<n.length;r+=1)n[r]=this._trimAlignValue(n[r]);return n},_trimAlignValue:function(e){if(e<=this._valueMin())return this._valueMin();if(e>=this._valueMax())return this._valueMax();var t=this.options.step>0?this.options.step:1,n=(e-this._valueMin())%t,r=e-n;return Math.abs(n)*2>=t&&(r+=n>0?t:-t),parseFloat(r.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var t,n,r,i,s,o=this.options.range,u=this.options,a=this,f=this._animateOff?!1:u.animate,l={};this.options.values&&this.options.values.length?this.handles.each(function(r,i){n=(a.values(r)-a._valueMin())/(a._valueMax()-a._valueMin())*100,l[a.orientation==="horizontal"?"left":"bottom"]=n+"%",e(this).stop(1,1)[f?"animate":"css"](l,u.animate),a.options.range===!0&&(a.orientation==="horizontal"?(r===0&&a.range.stop(1,1)[f?"animate":"css"]({left:n+"%"},u.animate),r===1&&a.range[f?"animate":"css"]({width:n-t+"%"},{queue:!1,duration:u.animate})):(r===0&&a.range.stop(1,1)[f?"animate":"css"]({bottom:n+"%"},u.animate),r===1&&a.range[f?"animate":"css"]({height:n-t+"%"},{queue:!1,duration:u.animate}))),t=n}):(r=this.value(),i=this._valueMin(),s=this._valueMax(),n=s!==i?(r-i)/(s-i)*100:0,l[this.orientation==="horizontal"?"left":"bottom"]=n+"%",this.handle.stop(1,1)[f?"animate":"css"](l,u.animate),o==="min"&&this.orientation==="horizontal"&&this.range.stop(1,1)[f?"animate":"css"]({width:n+"%"},u.animate),o==="max"&&this.orientation==="horizontal"&&this.range[f?"animate":"css"]({width:100-n+"%"},{queue:!1,duration:u.animate}),o==="min"&&this.orientation==="vertical"&&this.range.stop(1,1)[f?"animate":"css"]({height:n+"%"},u.animate),o==="max"&&this.orientation==="vertical"&&this.range[f?"animate":"css"]({height:100-n+"%"},{queue:!1,duration:u.animate}))}})})(jQuery);(function(e,t){e.widget("ui.sortable",e.ui.mouse,{version:"1.9.0",widgetEventPrefix:"sort",ready:!1,options:{appendTo:"parent",axis:!1,connectWith:!1,containment:!1,cursor:"auto",cursorAt:!1,dropOnEmpty:!0,forcePlaceholderSize:!1,forceHelperSize:!1,grid:!1,handle:!1,helper:"original",items:"> *",opacity:!1,placeholder:!1,revert:!1,scroll:!0,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1e3},_create:function(){var e=this.options;this.containerCache={},this.element.addClass("ui-sortable"),this.refresh(),this.floating=this.items.length?e.axis==="x"||/left|right/.test(this.items[0].item.css("float"))||/inline|table-cell/.test(this.items[0].item.css("display")):!1,this.offset=this.element.offset(),this._mouseInit(),this.ready=!0},_destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled"),this._mouseDestroy();for(var e=this.items.length-1;e>=0;e--)this.items[e].item.removeData(this.widgetName+"-item");return this},_setOption:function(t,n){t==="disabled"?(this.options[t]=n,this.widget().toggleClass("ui-sortable-disabled",!!n)):e.Widget.prototype._setOption.apply(this,arguments)},_mouseCapture:function(t,n){var r=this;if(this.reverting)return!1;if(this.options.disabled||this.options.type=="static")return!1;this._refreshItems(t);var i=null,s=e(t.target).parents().each(function(){if(e.data(this,r.widgetName+"-item")==r)return i=e(this),!1});e.data(t.target,r.widgetName+"-item")==r&&(i=e(t.target));if(!i)return!1;if(this.options.handle&&!n){var o=!1;e(this.options.handle,i).find("*").andSelf().each(function(){this==t.target&&(o=!0)});if(!o)return!1}return this.currentItem=i,this._removeCurrentsFromItems(),!0},_mouseStart:function(t,n,r){var i=this.options;this.currentContainer=this,this.refreshPositions(),this.helper=this._createHelper(t),this._cacheHelperProportions(),this._cacheMargins(),this.scrollParent=this.helper.scrollParent(),this.offset=this.currentItem.offset(),this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left},e.extend(this.offset,{click:{left:t.pageX-this.offset.left,top:t.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()}),this.helper.css("position","absolute"),this.cssPosition=this.helper.css("position"),this.originalPosition=this._generatePosition(t),this.originalPageX=t.pageX,this.originalPageY=t.pageY,i.cursorAt&&this._adjustOffsetFromHelper(i.cursorAt),this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]},this.helper[0]!=this.currentItem[0]&&this.currentItem.hide(),this._createPlaceholder(),i.containment&&this._setContainment(),i.cursor&&(e("body").css("cursor")&&(this._storedCursor=e("body").css("cursor")),e("body").css("cursor",i.cursor)),i.opacity&&(this.helper.css("opacity")&&(this._storedOpacity=this.helper.css("opacity")),this.helper.css("opacity",i.opacity)),i.zIndex&&(this.helper.css("zIndex")&&(this._storedZIndex=this.helper.css("zIndex")),this.helper.css("zIndex",i.zIndex)),this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"&&(this.overflowOffset=this.scrollParent.offset()),this._trigger("start",t,this._uiHash()),this._preserveHelperProportions||this._cacheHelperProportions();if(!r)for(var s=this.containers.length-1;s>=0;s--)this.containers[s]._trigger("activate",t,this._uiHash(this));return e.ui.ddmanager&&(e.ui.ddmanager.current=this),e.ui.ddmanager&&!i.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t),this.dragging=!0,this.helper.addClass("ui-sortable-helper"),this._mouseDrag(t),!0},_mouseDrag:function(t){this.position=this._generatePosition(t),this.positionAbs=this._convertPositionTo("absolute"),this.lastPositionAbs||(this.lastPositionAbs=this.positionAbs);if(this.options.scroll){var n=this.options,r=!1;this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"?(this.overflowOffset.top+this.scrollParent[0].offsetHeight-t.pageY<n.scrollSensitivity?this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop+n.scrollSpeed:t.pageY-this.overflowOffset.top<n.scrollSensitivity&&(this.scrollParent[0].scrollTop=r=this.scrollParent[0].scrollTop-n.scrollSpeed),this.overflowOffset.left+this.scrollParent[0].offsetWidth-t.pageX<n.scrollSensitivity?this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft+n.scrollSpeed:t.pageX-this.overflowOffset.left<n.scrollSensitivity&&(this.scrollParent[0].scrollLeft=r=this.scrollParent[0].scrollLeft-n.scrollSpeed)):(t.pageY-e(document).scrollTop()<n.scrollSensitivity?r=e(document).scrollTop(e(document).scrollTop()-n.scrollSpeed):e(window).height()-(t.pageY-e(document).scrollTop())<n.scrollSensitivity&&(r=e(document).scrollTop(e(document).scrollTop()+n.scrollSpeed)),t.pageX-e(document).scrollLeft()<n.scrollSensitivity?r=e(document).scrollLeft(e(document).scrollLeft()-n.scrollSpeed):e(window).width()-(t.pageX-e(document).scrollLeft())<n.scrollSensitivity&&(r=e(document).scrollLeft(e(document).scrollLeft()+n.scrollSpeed))),r!==!1&&e.ui.ddmanager&&!n.dropBehaviour&&e.ui.ddmanager.prepareOffsets(this,t)}this.positionAbs=this._convertPositionTo("absolute");if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis||this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";for(var i=this.items.length-1;i>=0;i--){var s=this.items[i],o=s.item[0],u=this._intersectsWithPointer(s);if(!u)continue;if(s.instance!==this.currentContainer)continue;if(o!=this.currentItem[0]&&this.placeholder[u==1?"next":"prev"]()[0]!=o&&!e.contains(this.placeholder[0],o)&&(this.options.type=="semi-dynamic"?!e.contains(this.element[0],o):!0)){this.direction=u==1?"down":"up";if(this.options.tolerance!="pointer"&&!this._intersectsWithSides(s))break;this._rearrange(t,s),this._trigger("change",t,this._uiHash());break}}return this._contactContainers(t),e.ui.ddmanager&&e.ui.ddmanager.drag(this,t),this._trigger("sort",t,this._uiHash()),this.lastPositionAbs=this.positionAbs,!1},_mouseStop:function(t,n){if(!t)return;e.ui.ddmanager&&!this.options.dropBehaviour&&e.ui.ddmanager.drop(this,t);if(this.options.revert){var r=this,i=this.placeholder.offset();this.reverting=!0,e(this.helper).animate({left:i.left-this.offset.parent.left-this.margins.left+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollLeft),top:i.top-this.offset.parent.top-this.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){r._clear(t)})}else this._clear(t,n);return!1},cancel:function(){if(this.dragging){this._mouseUp({target:null}),this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var t=this.containers.length-1;t>=0;t--)this.containers[t]._trigger("deactivate",null,this._uiHash(this)),this.containers[t].containerCache.over&&(this.containers[t]._trigger("out",null,this._uiHash(this)),this.containers[t].containerCache.over=0)}return this.placeholder&&(this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove(),e.extend(this,{helper:null,dragging:!1,reverting:!1,_noFinalSort:null}),this.domPosition.prev?e(this.domPosition.prev).after(this.currentItem):e(this.domPosition.parent).prepend(this.currentItem)),this},serialize:function(t){var n=this._getItemsAsjQuery(t&&t.connected),r=[];return t=t||{},e(n).each(function(){var n=(e(t.item||this).attr(t.attribute||"id")||"").match(t.expression||/(.+)[-=_](.+)/);n&&r.push((t.key||n[1]+"[]")+"="+(t.key&&t.expression?n[1]:n[2]))}),!r.length&&t.key&&r.push(t.key+"="),r.join("&")},toArray:function(t){var n=this._getItemsAsjQuery(t&&t.connected),r=[];return t=t||{},n.each(function(){r.push(e(t.item||this).attr(t.attribute||"id")||"")}),r},_intersectsWith:function(e){var t=this.positionAbs.left,n=t+this.helperProportions.width,r=this.positionAbs.top,i=r+this.helperProportions.height,s=e.left,o=s+e.width,u=e.top,a=u+e.height,f=this.offset.click.top,l=this.offset.click.left,c=r+f>u&&r+f<a&&t+l>s&&t+l<o;return this.options.tolerance=="pointer"||this.options.forcePointerForContainers||this.options.tolerance!="pointer"&&this.helperProportions[this.floating?"width":"height"]>e[this.floating?"width":"height"]?c:s<t+this.helperProportions.width/2&&n-this.helperProportions.width/2<o&&u<r+this.helperProportions.height/2&&i-this.helperProportions.height/2<a},_intersectsWithPointer:function(t){var n=this.options.axis==="x"||e.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,t.top,t.height),r=this.options.axis==="y"||e.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,t.left,t.width),i=n&&r,s=this._getDragVerticalDirection(),o=this._getDragHorizontalDirection();return i?this.floating?o&&o=="right"||s=="down"?2:1:s&&(s=="down"?2:1):!1},_intersectsWithSides:function(t){var n=e.ui.isOverAxis(this.positionAbs.top+this.offset.click.top,t.top+t.height/2,t.height),r=e.ui.isOverAxis(this.positionAbs.left+this.offset.click.left,t.left+t.width/2,t.width),i=this._getDragVerticalDirection(),s=this._getDragHorizontalDirection();return this.floating&&s?s=="right"&&r||s=="left"&&!r:i&&(i=="down"&&n||i=="up"&&!n)},_getDragVerticalDirection:function(){var e=this.positionAbs.top-this.lastPositionAbs.top;return e!=0&&(e>0?"down":"up")},_getDragHorizontalDirection:function(){var e=this.positionAbs.left-this.lastPositionAbs.left;return e!=0&&(e>0?"right":"left")},refresh:function(e){return this._refreshItems(e),this.refreshPositions(),this},_connectWith:function(){var e=this.options;return e.connectWith.constructor==String?[e.connectWith]:e.connectWith},_getItemsAsjQuery:function(t){var n=[],r=[],i=this._connectWith();if(i&&t)for(var s=i.length-1;s>=0;s--){var o=e(i[s]);for(var u=o.length-1;u>=0;u--){var a=e.data(o[u],this.widgetName);a&&a!=this&&!a.options.disabled&&r.push([e.isFunction(a.options.items)?a.options.items.call(a.element):e(a.options.items,a.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),a])}}r.push([e.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):e(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(var s=r.length-1;s>=0;s--)r[s][0].each(function(){n.push(this)});return e(n)},_removeCurrentsFromItems:function(){var e=this.currentItem.find(":data("+this.widgetName+"-item)");for(var t=0;t<this.items.length;t++)for(var n=0;n<e.length;n++)e[n]==this.items[t].item[0]&&this.items.splice(t,1)},_refreshItems:function(t){this.items=[],this.containers=[this];var n=this.items,r=[[e.isFunction(this.options.items)?this.options.items.call(this.element[0],t,{item:this.currentItem}):e(this.options.items,this.element),this]],i=this._connectWith();if(i&&this.ready)for(var s=i.length-1;s>=0;s--){var o=e(i[s]);for(var u=o.length-1;u>=0;u--){var a=e.data(o[u],this.widgetName);a&&a!=this&&!a.options.disabled&&(r.push([e.isFunction(a.options.items)?a.options.items.call(a.element[0],t,{item:this.currentItem}):e(a.options.items,a.element),a]),this.containers.push(a))}}for(var s=r.length-1;s>=0;s--){var f=r[s][1],l=r[s][0];for(var u=0,c=l.length;u<c;u++){var h=e(l[u]);h.data(this.widgetName+"-item",f),n.push({item:h,instance:f,width:0,height:0,left:0,top:0})}}},refreshPositions:function(t){this.offsetParent&&this.helper&&(this.offset.parent=this._getParentOffset());for(var n=this.items.length-1;n>=0;n--){var r=this.items[n];if(r.instance!=this.currentContainer&&this.currentContainer&&r.item[0]!=this.currentItem[0])continue;var i=this.options.toleranceElement?e(this.options.toleranceElement,r.item):r.item;t||(r.width=i.outerWidth(),r.height=i.outerHeight());var s=i.offset();r.left=s.left,r.top=s.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(var n=this.containers.length-1;n>=0;n--){var s=this.containers[n].element.offset();this.containers[n].containerCache.left=s.left,this.containers[n].containerCache.top=s.top,this.containers[n].containerCache.width=this.containers[n].element.outerWidth(),this.containers[n].containerCache.height=this.containers[n].element.outerHeight()}return this},_createPlaceholder:function(t){t=t||this;var n=t.options;if(!n.placeholder||n.placeholder.constructor==String){var r=n.placeholder;n.placeholder={element:function(){var n=e(document.createElement(t.currentItem[0].nodeName)).addClass(r||t.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];return r||(n.style.visibility="hidden"),n},update:function(e,i){if(r&&!n.forcePlaceholderSize)return;i.height()||i.height(t.currentItem.innerHeight()-parseInt(t.currentItem.css("paddingTop")||0,10)-parseInt(t.currentItem.css("paddingBottom")||0,10)),i.width()||i.width(t.currentItem.innerWidth()-parseInt(t.currentItem.css("paddingLeft")||0,10)-parseInt(t.currentItem.css("paddingRight")||0,10))}}}t.placeholder=e(n.placeholder.element.call(t.element,t.currentItem)),t.currentItem.after(t.placeholder),n.placeholder.update(t,t.placeholder)},_contactContainers:function(t){var n=null,r=null;for(var i=this.containers.length-1;i>=0;i--){if(e.contains(this.currentItem[0],this.containers[i].element[0]))continue;if(this._intersectsWith(this.containers[i].containerCache)){if(n&&e.contains(this.containers[i].element[0],n.element[0]))continue;n=this.containers[i],r=i}else this.containers[i].containerCache.over&&(this.containers[i]._trigger("out",t,this._uiHash(this)),this.containers[i].containerCache.over=0)}if(!n)return;if(this.containers.length===1)this.containers[r]._trigger("over",t,this._uiHash(this)),this.containers[r].containerCache.over=1;else if(this.currentContainer!=this.containers[r]){var s=1e4,o=null,u=this.positionAbs[this.containers[r].floating?"left":"top"];for(var a=this.items.length-1;a>=0;a--){if(!e.contains(this.containers[r].element[0],this.items[a].item[0]))continue;var f=this.containers[r].floating?this.items[a].item.offset().left:this.items[a].item.offset().top;Math.abs(f-u)<s&&(s=Math.abs(f-u),o=this.items[a],this.direction=f-u>0?"down":"up")}if(!o&&!this.options.dropOnEmpty)return;this.currentContainer=this.containers[r],o?this._rearrange(t,o,null,!0):this._rearrange(t,null,this.containers[r].element,!0),this._trigger("change",t,this._uiHash()),this.containers[r]._trigger("change",t,this._uiHash(this)),this.options.placeholder.update(this.currentContainer,this.placeholder),this.containers[r]._trigger("over",t,this._uiHash(this)),this.containers[r].containerCache.over=1}},_createHelper:function(t){var n=this.options,r=e.isFunction(n.helper)?e(n.helper.apply(this.element[0],[t,this.currentItem])):n.helper=="clone"?this.currentItem.clone():this.currentItem;return r.parents("body").length||e(n.appendTo!="parent"?n.appendTo:this.currentItem[0].parentNode)[0].appendChild(r[0]),r[0]==this.currentItem[0]&&(this._storedCSS={width:this.currentItem[0].style.width,height:this.currentItem[0].style.height,position:this.currentItem.css("position"),top:this.currentItem.css("top"),left:this.currentItem.css("left")}),(r[0].style.width==""||n.forceHelperSize)&&r.width(this.currentItem.width()),(r[0].style.height==""||n.forceHelperSize)&&r.height(this.currentItem.height()),r},_adjustOffsetFromHelper:function(t){typeof t=="string"&&(t=t.split(" ")),e.isArray(t)&&(t={left:+t[0],top:+t[1]||0}),"left"in t&&(this.offset.click.left=t.left+this.margins.left),"right"in t&&(this.offset.click.left=this.helperProportions.width-t.right+this.margins.left),"top"in t&&(this.offset.click.top=t.top+this.margins.top),"bottom"in t&&(this.offset.click.top=this.helperProportions.height-t.bottom+this.margins.top)},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var t=this.offsetParent.offset();this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&e.contains(this.scrollParent[0],this.offsetParent[0])&&(t.left+=this.scrollParent.scrollLeft(),t.top+=this.scrollParent.scrollTop());if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&e.browser.msie)t={top:0,left:0};return{top:t.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:t.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var e=this.currentItem.position();return{top:e.top-(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:e.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.currentItem.css("marginLeft"),10)||0,top:parseInt(this.currentItem.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var t=this.options;t.containment=="parent"&&(t.containment=this.helper[0].parentNode);if(t.containment=="document"||t.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,e(t.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(e(t.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(t.containment)){var n=e(t.containment)[0],r=e(t.containment).offset(),i=e(n).css("overflow")!="hidden";this.containment=[r.left+(parseInt(e(n).css("borderLeftWidth"),10)||0)+(parseInt(e(n).css("paddingLeft"),10)||0)-this.margins.left,r.top+(parseInt(e(n).css("borderTopWidth"),10)||0)+(parseInt(e(n).css("paddingTop"),10)||0)-this.margins.top,r.left+(i?Math.max(n.scrollWidth,n.offsetWidth):n.offsetWidth)-(parseInt(e(n).css("borderLeftWidth"),10)||0)-(parseInt(e(n).css("paddingRight"),10)||0)-this.helperProportions.width-this.margins.left,r.top+(i?Math.max(n.scrollHeight,n.offsetHeight):n.offsetHeight)-(parseInt(e(n).css("borderTopWidth"),10)||0)-(parseInt(e(n).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}},_convertPositionTo:function(t,n){n||(n=this.position);var r=t=="absolute"?1:-1,i=this.options,s=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,o=/(html|body)/i.test(s[0].tagName);return{top:n.top+this.offset.relative.top*r+this.offset.parent.top*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():o?0:s.scrollTop())*r,left:n.left+this.offset.relative.left*r+this.offset.parent.left*r-(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():o?0:s.scrollLeft())*r}},_generatePosition:function(t){var n=this.options,r=this.cssPosition!="absolute"||this.scrollParent[0]!=document&&!!e.contains(this.scrollParent[0],this.offsetParent[0])?this.scrollParent:this.offsetParent,i=/(html|body)/i.test(r[0].tagName);this.cssPosition=="relative"&&(this.scrollParent[0]==document||this.scrollParent[0]==this.offsetParent[0])&&(this.offset.relative=this._getRelativeOffset());var s=t.pageX,o=t.pageY;if(this.originalPosition){this.containment&&(t.pageX-this.offset.click.left<this.containment[0]&&(s=this.containment[0]+this.offset.click.left),t.pageY-this.offset.click.top<this.containment[1]&&(o=this.containment[1]+this.offset.click.top),t.pageX-this.offset.click.left>this.containment[2]&&(s=this.containment[2]+this.offset.click.left),t.pageY-this.offset.click.top>this.containment[3]&&(o=this.containment[3]+this.offset.click.top));if(n.grid){var u=this.originalPageY+Math.round((o-this.originalPageY)/n.grid[1])*n.grid[1];o=this.containment?u-this.offset.click.top<this.containment[1]||u-this.offset.click.top>this.containment[3]?u-this.offset.click.top<this.containment[1]?u+n.grid[1]:u-n.grid[1]:u:u;var a=this.originalPageX+Math.round((s-this.originalPageX)/n.grid[0])*n.grid[0];s=this.containment?a-this.offset.click.left<this.containment[0]||a-this.offset.click.left>this.containment[2]?a-this.offset.click.left<this.containment[0]?a+n.grid[0]:a-n.grid[0]:a:a}}return{top:o-this.offset.click.top-this.offset.relative.top-this.offset.parent.top+(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():i?0:r.scrollTop()),left:s-this.offset.click.left-this.offset.relative.left-this.offset.parent.left+(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft():i?0:r.scrollLeft())}},_rearrange:function(e,t,n,r){n?n[0].appendChild(this.placeholder[0]):t.item[0].parentNode.insertBefore(this.placeholder[0],this.direction=="down"?t.item[0]:t.item[0].nextSibling),this.counter=this.counter?++this.counter:1;var i=this.counter;this._delay(function(){i==this.counter&&this.refreshPositions(!r)})},_clear:function(t,n){this.reverting=!1;var r=[];!this._noFinalSort&&this.currentItem.parent().length&&this.placeholder.before(this.currentItem),this._noFinalSort=null;if(this.helper[0]==this.currentItem[0]){for(var i in this._storedCSS)if(this._storedCSS[i]=="auto"||this._storedCSS[i]=="static")this._storedCSS[i]="";this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper")}else this.currentItem.show();this.fromOutside&&!n&&r.push(function(e){this._trigger("receive",e,this._uiHash(this.fromOutside))}),(this.fromOutside||this.domPosition.prev!=this.currentItem.prev().not(".ui-sortable-helper")[0]||this.domPosition.parent!=this.currentItem.parent()[0])&&!n&&r.push(function(e){this._trigger("update",e,this._uiHash())}),this!==this.currentContainer&&(n||(r.push(function(e){this._trigger("remove",e,this._uiHash())}),r.push(function(e){return function(t){e._trigger("receive",t,this._uiHash(this))}}.call(this,this.currentContainer)),r.push(function(e){return function(t){e._trigger("update",t,this._uiHash(this))}}.call(this,this.currentContainer))));for(var i=this.containers.length-1;i>=0;i--)n||r.push(function(e){return function(t){e._trigger("deactivate",t,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over&&(r.push(function(e){return function(t){e._trigger("out",t,this._uiHash(this))}}.call(this,this.containers[i])),this.containers[i].containerCache.over=0);this._storedCursor&&e("body").css("cursor",this._storedCursor),this._storedOpacity&&this.helper.css("opacity",this._storedOpacity),this._storedZIndex&&this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex),this.dragging=!1;if(this.cancelHelperRemoval){if(!n){this._trigger("beforeStop",t,this._uiHash());for(var i=0;i<r.length;i++)r[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!1}n||this._trigger("beforeStop",t,this._uiHash()),this.placeholder[0].parentNode.removeChild(this.placeholder[0]),this.helper[0]!=this.currentItem[0]&&this.helper.remove(),this.helper=null;if(!n){for(var i=0;i<r.length;i++)r[i].call(this,t);this._trigger("stop",t,this._uiHash())}return this.fromOutside=!1,!0},_trigger:function(){e.Widget.prototype._trigger.apply(this,arguments)===!1&&this.cancel()},_uiHash:function(t){var n=t||this;return{helper:n.helper,placeholder:n.placeholder||e([]),position:n.position,originalPosition:n.originalPosition,offset:n.positionAbs,item:n.currentItem,sender:t?t.element:null}}})})(jQuery);(function(e){function t(e){return function(){var t=this.element.val();e.apply(this,arguments),this._refresh(),t!==this.element.val()&&this._trigger("change")}}e.widget("ui.spinner",{version:"1.9.0",defaultElement:"<input>",widgetEventPrefix:"spin",options:{culture:null,icons:{down:"ui-icon-triangle-1-s",up:"ui-icon-triangle-1-n"},incremental:!0,max:null,min:null,numberFormat:null,page:10,step:1,change:null,spin:null,start:null,stop:null},_create:function(){this._setOption("max",this.options.max),this._setOption("min",this.options.min),this._setOption("step",this.options.step),this._value(this.element.val(),!0),this._draw(),this._on(this._events),this._refresh(),this._on(this.window,{beforeunload:function(){this.element.removeAttr("autocomplete")}})},_getCreateOptions:function(){var t={},n=this.element;return e.each(["min","max","step"],function(e,r){var i=n.attr(r);i!==undefined&&i.length&&(t[r]=i)}),t},_events:{keydown:function(e){this._start(e)&&this._keydown(e)&&e.preventDefault()},keyup:"_stop",focus:function(){this.uiSpinner.addClass("ui-state-active"),this.previous=this.element.val()},blur:function(e){if(this.cancelBlur){delete this.cancelBlur;return}this._refresh(),this.uiSpinner.removeClass("ui-state-active"),this.previous!==this.element.val()&&this._trigger("change",e)},mousewheel:function(e,t){if(!t)return;if(!this.spinning&&!this._start(e))return!1;this._spin((t>0?1:-1)*this.options.step,e),clearTimeout(this.mousewheelTimer),this.mousewheelTimer=this._delay(function(){this.spinning&&this._stop(e)},100),e.preventDefault()},"mousedown .ui-spinner-button":function(t){function r(){var e=this.element[0]===this.document[0].activeElement;e||(this.element.focus(),this.previous=n,this._delay(function(){this.previous=n}))}var n;n=this.element[0]===this.document[0].activeElement?this.previous:this.element.val(),t.preventDefault(),r.call(this),this.cancelBlur=!0,this._delay(function(){delete this.cancelBlur,r.call(this)});if(this._start(t)===!1)return;this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseup .ui-spinner-button":"_stop","mouseenter .ui-spinner-button":function(t){if(!e(t.currentTarget).hasClass("ui-state-active"))return;if(this._start(t)===!1)return!1;this._repeat(null,e(t.currentTarget).hasClass("ui-spinner-up")?1:-1,t)},"mouseleave .ui-spinner-button":"_stop"},_draw:function(){var e=this.uiSpinner=this.element.addClass("ui-spinner-input").attr("autocomplete","off").wrap(this._uiSpinnerHtml()).parent().append(this._buttonHtml());this._hoverable(e),this.element.attr("role","spinbutton"),this.buttons=e.find(".ui-spinner-button").attr("tabIndex",-1).button().removeClass("ui-corner-all"),this.buttons.height()>Math.ceil(e.height()*.5)&&e.height()>0&&e.height(e.height()),this.options.disabled&&this.disable()},_keydown:function(t){var n=this.options,r=e.ui.keyCode;switch(t.keyCode){case r.UP:return this._repeat(null,1,t),!0;case r.DOWN:return this._repeat(null,-1,t),!0;case r.PAGE_UP:return this._repeat(null,n.page,t),!0;case r.PAGE_DOWN:return this._repeat(null,-n.page,t),!0}return!1},_uiSpinnerHtml:function(){return"<span class='ui-spinner ui-state-default ui-widget ui-widget-content ui-corner-all'></span>"},_buttonHtml:function(){return"<a class='ui-spinner-button ui-spinner-up ui-corner-tr'><span class='ui-icon "+this.options.icons.up+"'>&#9650;</span>"+"</a>"+"<a class='ui-spinner-button ui-spinner-down ui-corner-br'>"+"<span class='ui-icon "+this.options.icons.down+"'>&#9660;</span>"+"</a>"},_start:function(e){return!this.spinning&&this._trigger("start",e)===!1?!1:(this.counter||(this.counter=1),this.spinning=!0,!0)},_repeat:function(e,t,n){e=e||500,clearTimeout(this.timer),this.timer=this._delay(function(){this._repeat(40,t,n)},e),this._spin(t*this.options.step,n)},_spin:function(e,t){var n=this.value()||0;this.counter||(this.counter=1),n=this._adjustValue(n+e*this._increment(this.counter));if(!this.spinning||this._trigger("spin",t,{value:n})!==!1)this._value(n),this.counter++},_increment:function(t){var n=this.options.incremental;return n?e.isFunction(n)?n(t):Math.floor(t*t*t/5e4-t*t/500+17*t/200+1):1},_precision:function(){var e=this._precisionOf(this.options.step);return this.options.min!==null&&(e=Math.max(e,this._precisionOf(this.options.min))),e},_precisionOf:function(e){var t=e.toString(),n=t.indexOf(".");return n===-1?0:t.length-n-1},_adjustValue:function(e){var t,n,r=this.options;return t=r.min!==null?r.min:0,n=e-t,n=Math.round(n/r.step)*r.step,e=t+n,e=parseFloat(e.toFixed(this._precision())),r.max!==null&&e>r.max?r.max:r.min!==null&&e<r.min?r.min:e},_stop:function(e){if(!this.spinning)return;clearTimeout(this.timer),clearTimeout(this.mousewheelTimer),this.counter=0,this.spinning=!1,this._trigger("stop",e)},_setOption:function(e,t){if(e==="culture"||e==="numberFormat"){var n=this._parse(this.element.val());this.options[e]=t,this.element.val(this._format(n));return}(e==="max"||e==="min"||e==="step")&&typeof t=="string"&&(t=this._parse(t)),this._super(e,t),e==="disabled"&&(t?(this.element.prop("disabled",!0),this.buttons.button("disable")):(this.element.prop("disabled",!1),this.buttons.button("enable")))},_setOptions:t(function(e){this._super(e),this._value(this.element.val())}),_parse:function(e){return typeof e=="string"&&e!==""&&(e=window.Globalize&&this.options.numberFormat?Globalize.parseFloat(e,10,this.options.culture):+e),e===""||isNaN(e)?null:e},_format:function(e){return e===""?"":window.Globalize&&this.options.numberFormat?Globalize.format(e,this.options.numberFormat,this.options.culture):e},_refresh:function(){this.element.attr({"aria-valuemin":this.options.min,"aria-valuemax":this.options.max,"aria-valuenow":this._parse(this.element.val())})},_value:function(e,t){var n;e!==""&&(n=this._parse(e),n!==null&&(t||(n=this._adjustValue(n)),e=this._format(n))),this.element.val(e),this._refresh()},_destroy:function(){this.element.removeClass("ui-spinner-input").prop("disabled",!1).removeAttr("autocomplete").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"),this.uiSpinner.replaceWith(this.element)},stepUp:t(function(e){this._stepUp(e)}),_stepUp:function(e){this._spin((e||1)*this.options.step)},stepDown:t(function(e){this._stepDown(e)}),_stepDown:function(e){this._spin((e||1)*-this.options.step)},pageUp:t(function(e){this._stepUp((e||1)*this.options.page)}),pageDown:t(function(e){this._stepDown((e||1)*this.options.page)}),value:function(e){if(!arguments.length)return this._parse(this.element.val());t(this._value).call(this,e)},widget:function(){return this.uiSpinner}})})(jQuery);(function(e,t){function i(){return++n}function s(e){return e=e.cloneNode(!1),e.hash.length>1&&e.href.replace(r,"")===location.href.replace(r,"")}var n=0,r=/#.*$/;e.widget("ui.tabs",{version:"1.9.0",delay:300,options:{active:null,collapsible:!1,event:"click",heightStyle:"content",hide:null,show:null,activate:null,beforeActivate:null,beforeLoad:null,load:null},_create:function(){var t,n=this,r=this.options,i=r.active;this.running=!1,this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all").toggleClass("ui-tabs-collapsible",r.collapsible).delegate(".ui-tabs-nav > li","mousedown"+this.eventNamespace,function(t){e(this).is(".ui-state-disabled")&&t.preventDefault()}).delegate(".ui-tabs-anchor","focus"+this.eventNamespace,function(){e(this).closest("li").is(".ui-state-disabled")&&this.blur()}),this._processTabs();if(i===null){location.hash&&this.anchors.each(function(e,t){if(t.hash===location.hash)return i=e,!1}),i===null&&(i=this.tabs.filter(".ui-tabs-active").index());if(i===null||i===-1)i=this.tabs.length?0:!1}i!==!1&&(i=this.tabs.index(this.tabs.eq(i)),i===-1&&(i=r.collapsible?!1:0)),r.active=i,!r.collapsible&&r.active===!1&&this.anchors.length&&(r.active=0),e.isArray(r.disabled)&&(r.disabled=e.unique(r.disabled.concat(e.map(this.tabs.filter(".ui-state-disabled"),function(e){return n.tabs.index(e)}))).sort()),this.options.active!==!1&&this.anchors.length?this.active=this._findActive(this.options.active):this.active=e(),this._refresh(),this.active.length&&this.load(r.active)},_getCreateEventData:function(){return{tab:this.active,panel:this.active.length?this._getPanelForTab(this.active):e()}},_tabKeydown:function(t){var n=e(this.document[0].activeElement).closest("li"),r=this.tabs.index(n),i=!0;if(this._handlePageNav(t))return;switch(t.keyCode){case e.ui.keyCode.RIGHT:case e.ui.keyCode.DOWN:r++;break;case e.ui.keyCode.UP:case e.ui.keyCode.LEFT:i=!1,r--;break;case e.ui.keyCode.END:r=this.anchors.length-1;break;case e.ui.keyCode.HOME:r=0;break;case e.ui.keyCode.SPACE:t.preventDefault(),clearTimeout(this.activating),this._activate(r);return;case e.ui.keyCode.ENTER:t.preventDefault(),clearTimeout(this.activating),this._activate(r===this.options.active?!1:r);return;default:return}t.preventDefault(),clearTimeout(this.activating),r=this._focusNextTab(r,i),t.ctrlKey||(n.attr("aria-selected","false"),this.tabs.eq(r).attr("aria-selected","true"),this.activating=this._delay(function(){this.option("active",r)},this.delay))},_panelKeydown:function(t){if(this._handlePageNav(t))return;t.ctrlKey&&t.keyCode===e.ui.keyCode.UP&&(t.preventDefault(),this.active.focus())},_handlePageNav:function(t){if(t.altKey&&t.keyCode===e.ui.keyCode.PAGE_UP)return this._activate(this._focusNextTab(this.options.active-1,!1)),!0;if(t.altKey&&t.keyCode===e.ui.keyCode.PAGE_DOWN)return this._activate(this._focusNextTab(this.options.active+1,!0)),!0},_findNextTab:function(t,n){function i(){return t>r&&(t=0),t<0&&(t=r),t}var r=this.tabs.length-1;while(e.inArray(i(),this.options.disabled)!==-1)t=n?t+1:t-1;return t},_focusNextTab:function(e,t){return e=this._findNextTab(e,t),this.tabs.eq(e).focus(),e},_setOption:function(e,t){if(e==="active"){this._activate(t);return}if(e==="disabled"){this._setupDisabled(t);return}this._super(e,t),e==="collapsible"&&(this.element.toggleClass("ui-tabs-collapsible",t),!t&&this.options.active===!1&&this._activate(0)),e==="event"&&this._setupEvents(t),e==="heightStyle"&&this._setupHeightStyle(t)},_tabId:function(e){return e.attr("aria-controls")||"ui-tabs-"+i()},_sanitizeSelector:function(e){return e?e.replace(/[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g,"\\$&"):""},refresh:function(){var t,n=this.options,r=this.tablist.children(":has(a[href])");n.disabled=e.map(r.filter(".ui-state-disabled"),function(e){return r.index(e)}),this._processTabs(),n.active===!1||!this.anchors.length?(n.active=!1,this.active=e()):this.active.length&&!e.contains(this.tablist[0],this.active[0])?this.tabs.length===n.disabled.length?(n.active=!1,this.active=e()):this._activate(this._findNextTab(Math.max(0,n.active-1),!1)):n.active=this.tabs.index(this.active),this._refresh()},_refresh:function(){this._setupDisabled(this.options.disabled),this._setupEvents(this.options.event),this._setupHeightStyle(this.options.heightStyle),this.tabs.not(this.active).attr({"aria-selected":"false",tabIndex:-1}),this.panels.not(this._getPanelForTab(this.active)).hide().attr({"aria-expanded":"false","aria-hidden":"true"}),this.active.length?(this.active.addClass("ui-tabs-active ui-state-active").attr({"aria-selected":"true",tabIndex:0}),this._getPanelForTab(this.active).show().attr({"aria-expanded":"true","aria-hidden":"false"})):this.tabs.eq(0).attr("tabIndex",0)},_processTabs:function(){var t=this;this.tablist=this._getList().addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").attr("role","tablist"),this.tabs=this.tablist.find("> li:has(a[href])").addClass("ui-state-default ui-corner-top").attr({role:"tab",tabIndex:-1}),this.anchors=this.tabs.map(function(){return e("a",this)[0]}).addClass("ui-tabs-anchor").attr({role:"presentation",tabIndex:-1}),this.panels=e(),this.anchors.each(function(n,r){var i,o,u,a=e(r).uniqueId().attr("id"),f=e(r).closest("li"),l=f.attr("aria-controls");s(r)?(i=r.hash,o=t.element.find(t._sanitizeSelector(i))):(u=t._tabId(f),i="#"+u,o=t.element.find(i),o.length||(o=t._createPanel(u),o.insertAfter(t.panels[n-1]||t.tablist)),o.attr("aria-live","polite")),o.length&&(t.panels=t.panels.add(o)),l&&f.data("ui-tabs-aria-controls",l),f.attr({"aria-controls":i.substring(1),"aria-labelledby":a}),o.attr("aria-labelledby",a)}),this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").attr("role","tabpanel")},_getList:function(){return this.element.find("ol,ul").eq(0)},_createPanel:function(t){return e("<div>").attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)},_setupDisabled:function(t){e.isArray(t)&&(t.length?t.length===this.anchors.length&&(t=!0):t=!1);for(var n=0,r;r=this.tabs[n];n++)t===!0||e.inArray(n,t)!==-1?e(r).addClass("ui-state-disabled").attr("aria-disabled","true"):e(r).removeClass("ui-state-disabled").removeAttr("aria-disabled");this.options.disabled=t},_setupEvents:function(t){var n={click:function(e){e.preventDefault()}};t&&e.each(t.split(" "),function(e,t){n[t]="_eventHandler"}),this._off(this.anchors.add(this.tabs).add(this.panels)),this._on(this.anchors,n),this._on(this.tabs,{keydown:"_tabKeydown"}),this._on(this.panels,{keydown:"_panelKeydown"}),this._focusable(this.tabs),this._hoverable(this.tabs)},_setupHeightStyle:function(t){var n,r,i=this.element.parent();t==="fill"?(e.support.minHeight||(r=i.css("overflow"),i.css("overflow","hidden")),n=i.height(),this.element.siblings(":visible").each(function(){var t=e(this),r=t.css("position");if(r==="absolute"||r==="fixed")return;n-=t.outerHeight(!0)}),r&&i.css("overflow",r),this.element.children().not(this.panels).each(function(){n-=e(this).outerHeight(!0)}),this.panels.each(function(){e(this).height(Math.max(0,n-e(this).innerHeight()+e(this).height()))}).css("overflow","auto")):t==="auto"&&(n=0,this.panels.each(function(){n=Math.max(n,e(this).height("").height())}).height(n))},_eventHandler:function(t){var n=this.options,r=this.active,i=e(t.currentTarget),s=i.closest("li"),o=s[0]===r[0],u=o&&n.collapsible,a=u?e():this._getPanelForTab(s),f=r.length?this._getPanelForTab(r):e(),l={oldTab:r,oldPanel:f,newTab:u?e():s,newPanel:a};t.preventDefault();if(s.hasClass("ui-state-disabled")||s.hasClass("ui-tabs-loading")||this.running||o&&!n.collapsible||this._trigger("beforeActivate",t,l)===!1)return;n.active=u?!1:this.tabs.index(s),this.active=o?e():s,this.xhr&&this.xhr.abort(),!f.length&&!a.length&&e.error("jQuery UI Tabs: Mismatching fragment identifier."),a.length&&this.load(this.tabs.index(s),t),this._toggle(t,l)},_toggle:function(t,n){function o(){r.running=!1,r._trigger("activate",t,n)}function u(){n.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),i.length&&r.options.show?r._show(i,r.options.show,o):(i.show(),o())}var r=this,i=n.newPanel,s=n.oldPanel;this.running=!0,s.length&&this.options.hide?this._hide(s,this.options.hide,function(){n.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),u()}):(n.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),s.hide(),u()),s.attr({"aria-expanded":"false","aria-hidden":"true"}),n.oldTab.attr("aria-selected","false"),i.length&&s.length?n.oldTab.attr("tabIndex",-1):i.length&&this.tabs.filter(function(){return e(this).attr("tabIndex")===0}).attr("tabIndex",-1),i.attr({"aria-expanded":"true","aria-hidden":"false"}),n.newTab.attr({"aria-selected":"true",tabIndex:0})},_activate:function(t){var n,r=this._findActive(t);if(r[0]===this.active[0])return;r.length||(r=this.active),n=r.find(".ui-tabs-anchor")[0],this._eventHandler({target:n,currentTarget:n,preventDefault:e.noop})},_findActive:function(t){return t===!1?e():this.tabs.eq(t)},_getIndex:function(e){return typeof e=="string"&&(e=this.anchors.index(this.anchors.filter("[href$='"+e+"']"))),e},_destroy:function(){this.xhr&&this.xhr.abort(),this.element.removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible"),this.tablist.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all").removeAttr("role"),this.anchors.removeClass("ui-tabs-anchor").removeAttr("role").removeAttr("tabIndex").removeData("href.tabs").removeData("load.tabs").removeUniqueId(),this.tabs.add(this.panels).each(function(){e.data(this,"ui-tabs-destroy")?e(this).remove():e(this).removeClass("ui-state-default ui-state-active ui-state-disabled ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel").removeAttr("tabIndex").removeAttr("aria-live").removeAttr("aria-busy").removeAttr("aria-selected").removeAttr("aria-labelledby").removeAttr("aria-hidden").removeAttr("aria-expanded").removeAttr("role")}),this.tabs.each(function(){var t=e(this),n=t.data("ui-tabs-aria-controls");n?t.attr("aria-controls",n):t.removeAttr("aria-controls")}),this.options.heightStyle!=="content"&&this.panels.css("height","")},enable:function(n){var r=this.options.disabled;if(r===!1)return;n===t?r=!1:(n=this._getIndex(n),e.isArray(r)?r=e.map(r,function(e){return e!==n?e:null}):r=e.map(this.tabs,function(e,t){return t!==n?t:null})),this._setupDisabled(r)},disable:function(n){var r=this.options.disabled;if(r===!0)return;if(n===t)r=!0;else{n=this._getIndex(n);if(e.inArray(n,r)!==-1)return;e.isArray(r)?r=e.merge([n],r).sort():r=[n]}this._setupDisabled(r)},load:function(t,n){t=this._getIndex(t);var r=this,i=this.tabs.eq(t),o=i.find(".ui-tabs-anchor"),u=this._getPanelForTab(i),a={tab:i,panel:u};if(s(o[0]))return;this.xhr=e.ajax(this._ajaxSettings(o,n,a)),this.xhr&&this.xhr.statusText!=="canceled"&&(i.addClass("ui-tabs-loading"),u.attr("aria-busy","true"),this.xhr.success(function(e){setTimeout(function(){u.html(e),r._trigger("load",n,a)},1)}).complete(function(e,t){setTimeout(function(){t==="abort"&&r.panels.stop(!1,!0),i.removeClass("ui-tabs-loading"),u.removeAttr("aria-busy"),e===r.xhr&&delete r.xhr},1)}))},_ajaxSettings:function(t,n,r){var i=this;return{url:t.attr("href"),beforeSend:function(t,s){return i._trigger("beforeLoad",n,e.extend({jqXHR:t,ajaxSettings:s},r))}}},_getPanelForTab:function(t){var n=e(t).attr("aria-controls");return this.element.find(this._sanitizeSelector("#"+n))}}),e.uiBackCompat!==!1&&(e.ui.tabs.prototype._ui=function(e,t){return{tab:e,panel:t,index:this.anchors.index(e)}},e.widget("ui.tabs",e.ui.tabs,{url:function(e,t){this.anchors.eq(e).attr("href",t)}}),e.widget("ui.tabs",e.ui.tabs,{options:{ajaxOptions:null,cache:!1},_create:function(){this._super();var t=this;this._on({tabsbeforeload:function(n,r){if(e.data(r.tab[0],"cache.tabs")){n.preventDefault();return}r.jqXHR.success(function(){t.options.cache&&e.data(r.tab[0],"cache.tabs",!0)})}})},_ajaxSettings:function(t,n,r){var i=this.options.ajaxOptions;return e.extend({},i,{error:function(e,t,n){try{i.error(e,t,r.tab.closest("li").index(),r.tab[0])}catch(n){}}},this._superApply(arguments))},_setOption:function(e,t){e==="cache"&&t===!1&&this.anchors.removeData("cache.tabs"),this._super(e,t)},_destroy:function(){this.anchors.removeData("cache.tabs"),this._super()},url:function(e,t){this.anchors.eq(e).removeData("cache.tabs"),this._superApply(arguments)}}),e.widget("ui.tabs",e.ui.tabs,{abort:function(){this.xhr&&this.xhr.abort()}}),e.widget("ui.tabs",e.ui.tabs,{options:{spinner:"<em>Loading&#8230;</em>"},_create:function(){this._super(),this._on({tabsbeforeload:function(e,t){if(e.target!==this.element[0]||!this.options.spinner)return;var n=t.tab.find("span"),r=n.html();n.html(this.options.spinner),t.jqXHR.complete(function(){n.html(r)})}})}}),e.widget("ui.tabs",e.ui.tabs,{options:{enable:null,disable:null},enable:function(t){var n=this.options,r;if(t&&n.disabled===!0||e.isArray(n.disabled)&&e.inArray(t,n.disabled)!==-1)r=!0;this._superApply(arguments),r&&this._trigger("enable",null,this._ui(this.anchors[t],this.panels[t]))},disable:function(t){var n=this.options,r;if(t&&n.disabled===!1||e.isArray(n.disabled)&&e.inArray(t,n.disabled)===-1)r=!0;this._superApply(arguments),r&&this._trigger("disable",null,this._ui(this.anchors[t],this.panels[t]))}}),e.widget("ui.tabs",e.ui.tabs,{options:{add:null,remove:null,tabTemplate:"<li><a href='#{href}'><span>#{label}</span></a></li>"},add:function(n,r,i){i===t&&(i=this.anchors.length);var s,o,u=this.options,a=e(u.tabTemplate.replace(/#\{href\}/g,n).replace(/#\{label\}/g,r)),f=n.indexOf("#")?this._tabId(a):n.replace("#","");return a.addClass("ui-state-default ui-corner-top").data("ui-tabs-destroy",!0),a.attr("aria-controls",f),s=i>=this.tabs.length,o=this.element.find("#"+f),o.length||(o=this._createPanel(f),s?i>0?o.insertAfter(this.panels.eq(-1)):o.appendTo(this.element):o.insertBefore(this.panels[i])),o.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").hide(),s?a.appendTo(this.tablist):a.insertBefore(this.tabs[i]),u.disabled=e.map(u.disabled,function(e){return e>=i?++e:e}),this.refresh(),this.tabs.length===1&&u.active===!1&&this.option("active",0),this._trigger("add",null,this._ui(this.anchors[i],this.panels[i])),this},remove:function(t){t=this._getIndex(t);var n=this.options,r=this.tabs.eq(t).remove(),i=this._getPanelForTab(r).remove();return r.hasClass("ui-tabs-active")&&this.anchors.length>2&&this._activate(t+(t+1<this.anchors.length?1:-1)),n.disabled=e.map(e.grep(n.disabled,function(e){return e!==t}),function(e){return e>=t?--e:e}),this.refresh(),this._trigger("remove",null,this._ui(r.find("a")[0],i[0])),this}}),e.widget("ui.tabs",e.ui.tabs,{length:function(){return this.anchors.length}}),e.widget("ui.tabs",e.ui.tabs,{options:{idPrefix:"ui-tabs-"},_tabId:function(t){var n=t.is("li")?t.find("a[href]"):t;return n=n[0],e(n).closest("li").attr("aria-controls")||n.title&&n.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF\-]/g,"")||this.options.idPrefix+i()}}),e.widget("ui.tabs",e.ui.tabs,{options:{panelTemplate:"<div></div>"},_createPanel:function(t){return e(this.options.panelTemplate).attr("id",t).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").data("ui-tabs-destroy",!0)}}),e.widget("ui.tabs",e.ui.tabs,{_create:function(){var e=this.options;e.active===null&&e.selected!==t&&(e.active=e.selected===-1?!1:e.selected),this._super(),e.selected=e.active,e.selected===!1&&(e.selected=-1)},_setOption:function(e,t){if(e!=="selected")return this._super(e,t);var n=this.options;this._super("active",t===-1?!1:t),n.selected=n.active,n.selected===!1&&(n.selected=-1)},_eventHandler:function(e){this._superApply(arguments),this.options.selected=this.options.active,this.options.selected===!1&&(this.options.selected=-1)}}),e.widget("ui.tabs",e.ui.tabs,{options:{show:null,select:null},_create:function(){this._super(),this.options.active!==!1&&this._trigger("show",null,this._ui(this.active.find(".ui-tabs-anchor")[0],this._getPanelForTab(this.active)[0]))},_trigger:function(e,t,n){var r=this._superApply(arguments);return r?(e==="beforeActivate"&&n.newTab.length?r=this._super("select",t,{tab:n.newTab.find(".ui-tabs-anchor")[0],panel:n.newPanel[0],index:n.newTab.closest("li").index()}):e==="activate"&&n.newTab.length&&(r=this._super("show",t,{tab:n.newTab.find(".ui-tabs-anchor")[0],panel:n.newPanel[0],index:n.newTab.closest("li").index()})),r):!1}}),e.widget("ui.tabs",e.ui.tabs,{select:function(e){e=this._getIndex(e);if(e===-1){if(!this.options.collapsible||this.options.selected===-1)return;e=this.options.selected}this.anchors.eq(e).trigger(this.options.event+this.eventNamespace)}}),function(){var t=0;e.widget("ui.tabs",e.ui.tabs,{options:{cookie:null},_create:function(){var e=this.options,t;e.active==null&&e.cookie&&(t=parseInt(this._cookie(),10),t===-1&&(t=!1),e.active=t),this._super()},_cookie:function(n){var r=[this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+ ++t)];return arguments.length&&(r.push(n===!1?-1:n),r.push(this.options.cookie)),e.cookie.apply(null,r)},_refresh:function(){this._super(),this.options.cookie&&this._cookie(this.options.active,this.options.cookie)},_eventHandler:function(e){this._superApply(arguments),this.options.cookie&&this._cookie(this.options.active,this.options.cookie)},_destroy:function(){this._super(),this.options.cookie&&this._cookie(null,this.options.cookie)}})}(),e.widget("ui.tabs",e.ui.tabs,{_trigger:function(t,n,r){var i=e.extend({},r);return t==="load"&&(i.panel=i.panel[0],i.tab=i.tab.find(".ui-tabs-anchor")[0]),this._super(t,n,i)}}),e.widget("ui.tabs",e.ui.tabs,{options:{fx:null},_getFx:function(){var t,n,r=this.options.fx;return r&&(e.isArray(r)?(t=r[0],n=r[1]):t=n=r),r?{show:n,hide:t}:null},_toggle:function(e,t){function o(){n.running=!1,n._trigger("activate",e,t)}function u(){t.newTab.closest("li").addClass("ui-tabs-active ui-state-active"),r.length&&s.show?r.animate(s.show,s.show.duration,function(){o()}):(r.show(),o())}var n=this,r=t.newPanel,i=t.oldPanel,s=this._getFx();if(!s)return this._super(e,t);n.running=!0,i.length&&s.hide?i.animate(s.hide,s.hide.duration,function(){t.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),u()}):(t.oldTab.closest("li").removeClass("ui-tabs-active ui-state-active"),i.hide(),u())}}))})(jQuery);(function(e){function n(t,n){var r=(t.attr("aria-describedby")||"").split(/\s+/);r.push(n),t.data("ui-tooltip-id",n).attr("aria-describedby",e.trim(r.join(" ")))}function r(t){var n=t.data("ui-tooltip-id"),r=(t.attr("aria-describedby")||"").split(/\s+/),i=e.inArray(n,r);i!==-1&&r.splice(i,1),t.removeData("ui-tooltip-id"),r=e.trim(r.join(" ")),r?t.attr("aria-describedby",r):t.removeAttr("aria-describedby")}var t=0;e.widget("ui.tooltip",{version:"1.9.0",options:{content:function(){return e(this).attr("title")},hide:!0,items:"[title]",position:{my:"left+15 center",at:"right center",collision:"flipfit flipfit"},show:!0,tooltipClass:null,track:!1,close:null,open:null},_create:function(){this._on({mouseover:"open",focusin:"open"}),this.tooltips={}},_setOption:function(t,n){var r=this;if(t==="disabled"){this[n?"_disable":"_enable"](),this.options[t]=n;return}this._super(t,n),t==="content"&&e.each(this.tooltips,function(e,t){r._updateContent(t)})},_disable:function(){var t=this;e.each(this.tooltips,function(n,r){var i=e.Event("blur");i.target=i.currentTarget=r[0],t.close(i,!0)}),this.element.find(this.options.items).andSelf().each(function(){var t=e(this);t.is("[title]")&&t.data("ui-tooltip-title",t.attr("title")).attr("title","")})},_enable:function(){this.element.find(this.options.items).andSelf().each(function(){var t=e(this);t.data("ui-tooltip-title")&&t.attr("title",t.data("ui-tooltip-title"))})},open:function(t){var n=e(t?t.target:this.element).closest(this.options.items);if(!n.length)return;if(this.options.track&&n.data("ui-tooltip-id")){this._find(n).position(e.extend({of:n},this.options.position)),this._off(this.document,"mousemove");return}n.attr("title")&&n.data("ui-tooltip-title",n.attr("title")),n.data("tooltip-open",!0),this._updateContent(n,t)},_updateContent:function(e,t){var n,r=this.options.content,i=this;if(typeof r=="string")return this._open(t,e,r);n=r.call(e[0],function(n){if(!e.data("tooltip-open"))return;i._delay(function(){this._open(t,e,n)})}),n&&this._open(t,e,n)},_open:function(t,r,i){function u(e){o.of=e,s.position(o)}var s,o;if(!i)return;s=this._find(r);if(s.length){s.find(".ui-tooltip-content").html(i);return}r.is("[title]")&&(t&&t.type==="mouseover"?r.attr("title",""):r.removeAttr("title")),s=this._tooltip(r),n(r,s.attr("id")),s.find(".ui-tooltip-content").html(i),this.options.track&&t&&/^mouse/.test(t.originalEvent.type)?(o=e.extend({},this.options.position),this._on(this.document,{mousemove:u}),u(t)):s.position(e.extend({of:r},this.options.position)),s.hide(),this._show(s,this.options.show),this._trigger("open",t,{tooltip:s}),this._on(r,{mouseleave:"close",focusout:"close",keyup:function(t){if(t.keyCode===e.ui.keyCode.ESCAPE){var n=e.Event(t);n.currentTarget=r[0],this.close(n,!0)}}})},close:function(t,n){var i=this,s=e(t?t.currentTarget:this.element),o=this._find(s);if(this.closing)return;if(!n&&t&&t.type!=="focusout"&&this.document[0].activeElement===s[0])return;s.data("ui-tooltip-title")&&s.attr("title",s.data("ui-tooltip-title")),r(s),o.stop(!0),this._hide(o,this.options.hide,function(){e(this).remove(),delete i.tooltips[this.id]}),s.removeData("tooltip-open"),this._off(s,"mouseleave focusout keyup"),this._off(this.document,"mousemove"),this.closing=!0,this._trigger("close",t,{tooltip:o}),this.closing=!1},_tooltip:function(n){var r="ui-tooltip-"+t++,i=e("<div>").attr({id:r,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));return e("<div>").addClass("ui-tooltip-content").appendTo(i),i.appendTo(this.document[0].body),e.fn.bgiframe&&i.bgiframe(),this.tooltips[r]=n,i},_find:function(t){var n=t.data("ui-tooltip-id");return n?e("#"+n):e()},_destroy:function(){var t=this;e.each(this.tooltips,function(n,r){var i=e.Event("blur");i.target=i.currentTarget=r[0],t.close(i,!0),e("#"+n).remove(),r.data("ui-tooltip-title")&&(r.attr("title",r.data("ui-tooltip-title")),r.removeData("ui-tooltip-title"))})}})})(jQuery); \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.js
new file mode 100644
index 0000000000..bc3fbc81b2
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.js
@@ -0,0 +1,2 @@
+/*! jQuery v1.8.2 jquery.com | jquery.org/license */
+(function(a,b){function G(a){var b=F[a]={};return p.each(a.split(s),function(a,c){b[c]=!0}),b}function J(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(I,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:+d+""===d?+d:H.test(d)?p.parseJSON(d):d}catch(f){}p.data(a,c,d)}else d=b}return d}function K(a){var b;for(b in a){if(b==="data"&&p.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function ba(){return!1}function bb(){return!0}function bh(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function bi(a,b){do a=a[b];while(a&&a.nodeType!==1);return a}function bj(a,b,c){b=b||0;if(p.isFunction(b))return p.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return p.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=p.grep(a,function(a){return a.nodeType===1});if(be.test(b))return p.filter(b,d,!c);b=p.filter(b,d)}return p.grep(a,function(a,d){return p.inArray(a,b)>=0===c})}function bk(a){var b=bl.split("|"),c=a.createDocumentFragment();if(c.createElement)while(b.length)c.createElement(b.pop());return c}function bC(a,b){return a.getElementsByTagName(b)[0]||a.appendChild(a.ownerDocument.createElement(b))}function bD(a,b){if(b.nodeType!==1||!p.hasData(a))return;var c,d,e,f=p._data(a),g=p._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;d<e;d++)p.event.add(b,c,h[c][d])}g.data&&(g.data=p.extend({},g.data))}function bE(a,b){var c;if(b.nodeType!==1)return;b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase(),c==="object"?(b.parentNode&&(b.outerHTML=a.outerHTML),p.support.html5Clone&&a.innerHTML&&!p.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):c==="input"&&bv.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):c==="option"?b.selected=a.defaultSelected:c==="input"||c==="textarea"?b.defaultValue=a.defaultValue:c==="script"&&b.text!==a.text&&(b.text=a.text),b.removeAttribute(p.expando)}function bF(a){return typeof a.getElementsByTagName!="undefined"?a.getElementsByTagName("*"):typeof a.querySelectorAll!="undefined"?a.querySelectorAll("*"):[]}function bG(a){bv.test(a.type)&&(a.defaultChecked=a.checked)}function bY(a,b){if(b in a)return b;var c=b.charAt(0).toUpperCase()+b.slice(1),d=b,e=bW.length;while(e--){b=bW[e]+c;if(b in a)return b}return d}function bZ(a,b){return a=b||a,p.css(a,"display")==="none"||!p.contains(a.ownerDocument,a)}function b$(a,b){var c,d,e=[],f=0,g=a.length;for(;f<g;f++){c=a[f];if(!c.style)continue;e[f]=p._data(c,"olddisplay"),b?(!e[f]&&c.style.display==="none"&&(c.style.display=""),c.style.display===""&&bZ(c)&&(e[f]=p._data(c,"olddisplay",cc(c.nodeName)))):(d=bH(c,"display"),!e[f]&&d!=="none"&&p._data(c,"olddisplay",d))}for(f=0;f<g;f++){c=a[f];if(!c.style)continue;if(!b||c.style.display==="none"||c.style.display==="")c.style.display=b?e[f]||"":"none"}return a}function b_(a,b,c){var d=bP.exec(b);return d?Math.max(0,d[1]-(c||0))+(d[2]||"px"):b}function ca(a,b,c,d){var e=c===(d?"border":"content")?4:b==="width"?1:0,f=0;for(;e<4;e+=2)c==="margin"&&(f+=p.css(a,c+bV[e],!0)),d?(c==="content"&&(f-=parseFloat(bH(a,"padding"+bV[e]))||0),c!=="margin"&&(f-=parseFloat(bH(a,"border"+bV[e]+"Width"))||0)):(f+=parseFloat(bH(a,"padding"+bV[e]))||0,c!=="padding"&&(f+=parseFloat(bH(a,"border"+bV[e]+"Width"))||0));return f}function cb(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=!0,f=p.support.boxSizing&&p.css(a,"boxSizing")==="border-box";if(d<=0||d==null){d=bH(a,b);if(d<0||d==null)d=a.style[b];if(bQ.test(d))return d;e=f&&(p.support.boxSizingReliable||d===a.style[b]),d=parseFloat(d)||0}return d+ca(a,b,c||(f?"border":"content"),e)+"px"}function cc(a){if(bS[a])return bS[a];var b=p("<"+a+">").appendTo(e.body),c=b.css("display");b.remove();if(c==="none"||c===""){bI=e.body.appendChild(bI||p.extend(e.createElement("iframe"),{frameBorder:0,width:0,height:0}));if(!bJ||!bI.createElement)bJ=(bI.contentWindow||bI.contentDocument).document,bJ.write("<!doctype html><html><body>"),bJ.close();b=bJ.body.appendChild(bJ.createElement(a)),c=bH(b,"display"),e.body.removeChild(bI)}return bS[a]=c,c}function ci(a,b,c,d){var e;if(p.isArray(b))p.each(b,function(b,e){c||ce.test(a)?d(a,e):ci(a+"["+(typeof e=="object"?b:"")+"]",e,c,d)});else if(!c&&p.type(b)==="object")for(e in b)ci(a+"["+e+"]",b[e],c,d);else d(a,b)}function cz(a){return function(b,c){typeof b!="string"&&(c=b,b="*");var d,e,f,g=b.toLowerCase().split(s),h=0,i=g.length;if(p.isFunction(c))for(;h<i;h++)d=g[h],f=/^\+/.test(d),f&&(d=d.substr(1)||"*"),e=a[d]=a[d]||[],e[f?"unshift":"push"](c)}}function cA(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h,i=a[f],j=0,k=i?i.length:0,l=a===cv;for(;j<k&&(l||!h);j++)h=i[j](c,d,e),typeof h=="string"&&(!l||g[h]?h=b:(c.dataTypes.unshift(h),h=cA(a,c,d,e,h,g)));return(l||!h)&&!g["*"]&&(h=cA(a,c,d,e,"*",g)),h}function cB(a,c){var d,e,f=p.ajaxSettings.flatOptions||{};for(d in c)c[d]!==b&&((f[d]?a:e||(e={}))[d]=c[d]);e&&p.extend(!0,a,e)}function cC(a,c,d){var e,f,g,h,i=a.contents,j=a.dataTypes,k=a.responseFields;for(f in k)f in d&&(c[k[f]]=d[f]);while(j[0]==="*")j.shift(),e===b&&(e=a.mimeType||c.getResponseHeader("content-type"));if(e)for(f in i)if(i[f]&&i[f].test(e)){j.unshift(f);break}if(j[0]in d)g=j[0];else{for(f in d){if(!j[0]||a.converters[f+" "+j[0]]){g=f;break}h||(h=f)}g=g||h}if(g)return g!==j[0]&&j.unshift(g),d[g]}function cD(a,b){var c,d,e,f,g=a.dataTypes.slice(),h=g[0],i={},j=0;a.dataFilter&&(b=a.dataFilter(b,a.dataType));if(g[1])for(c in a.converters)i[c.toLowerCase()]=a.converters[c];for(;e=g[++j];)if(e!=="*"){if(h!=="*"&&h!==e){c=i[h+" "+e]||i["* "+e];if(!c)for(d in i){f=d.split(" ");if(f[1]===e){c=i[h+" "+f[0]]||i["* "+f[0]];if(c){c===!0?c=i[d]:i[d]!==!0&&(e=f[0],g.splice(j--,0,e));break}}}if(c!==!0)if(c&&a["throws"])b=c(b);else try{b=c(b)}catch(k){return{state:"parsererror",error:c?k:"No conversion from "+h+" to "+e}}}h=e}return{state:"success",data:b}}function cL(){try{return new a.XMLHttpRequest}catch(b){}}function cM(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function cU(){return setTimeout(function(){cN=b},0),cN=p.now()}function cV(a,b){p.each(b,function(b,c){var d=(cT[b]||[]).concat(cT["*"]),e=0,f=d.length;for(;e<f;e++)if(d[e].call(a,b,c))return})}function cW(a,b,c){var d,e=0,f=0,g=cS.length,h=p.Deferred().always(function(){delete i.elem}),i=function(){var b=cN||cU(),c=Math.max(0,j.startTime+j.duration-b),d=1-(c/j.duration||0),e=0,f=j.tweens.length;for(;e<f;e++)j.tweens[e].run(d);return h.notifyWith(a,[j,d,c]),d<1&&f?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:p.extend({},b),opts:p.extend(!0,{specialEasing:{}},c),originalProperties:b,originalOptions:c,startTime:cN||cU(),duration:c.duration,tweens:[],createTween:function(b,c,d){var e=p.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(e),e},stop:function(b){var c=0,d=b?j.tweens.length:0;for(;c<d;c++)j.tweens[c].run(1);return b?h.resolveWith(a,[j,b]):h.rejectWith(a,[j,b]),this}}),k=j.props;cX(k,j.opts.specialEasing);for(;e<g;e++){d=cS[e].call(j,a,k,j.opts);if(d)return d}return cV(j,k),p.isFunction(j.opts.start)&&j.opts.start.call(a,j),p.fx.timer(p.extend(i,{anim:j,queue:j.opts.queue,elem:a})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}function cX(a,b){var c,d,e,f,g;for(c in a){d=p.camelCase(c),e=b[d],f=a[c],p.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=p.cssHooks[d];if(g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}}function cY(a,b,c){var d,e,f,g,h,i,j,k,l=this,m=a.style,n={},o=[],q=a.nodeType&&bZ(a);c.queue||(j=p._queueHooks(a,"fx"),j.unqueued==null&&(j.unqueued=0,k=j.empty.fire,j.empty.fire=function(){j.unqueued||k()}),j.unqueued++,l.always(function(){l.always(function(){j.unqueued--,p.queue(a,"fx").length||j.empty.fire()})})),a.nodeType===1&&("height"in b||"width"in b)&&(c.overflow=[m.overflow,m.overflowX,m.overflowY],p.css(a,"display")==="inline"&&p.css(a,"float")==="none"&&(!p.support.inlineBlockNeedsLayout||cc(a.nodeName)==="inline"?m.display="inline-block":m.zoom=1)),c.overflow&&(m.overflow="hidden",p.support.shrinkWrapBlocks||l.done(function(){m.overflow=c.overflow[0],m.overflowX=c.overflow[1],m.overflowY=c.overflow[2]}));for(d in b){f=b[d];if(cP.exec(f)){delete b[d];if(f===(q?"hide":"show"))continue;o.push(d)}}g=o.length;if(g){h=p._data(a,"fxshow")||p._data(a,"fxshow",{}),q?p(a).show():l.done(function(){p(a).hide()}),l.done(function(){var b;p.removeData(a,"fxshow",!0);for(b in n)p.style(a,b,n[b])});for(d=0;d<g;d++)e=o[d],i=l.createTween(e,q?h[e]:0),n[e]=h[e]||p.style(a,e),e in h||(h[e]=i.start,q&&(i.end=i.start,i.start=e==="width"||e==="height"?1:0))}}function cZ(a,b,c,d,e){return new cZ.prototype.init(a,b,c,d,e)}function c$(a,b){var c,d={height:a},e=0;b=b?1:0;for(;e<4;e+=2-b)c=bV[e],d["margin"+c]=d["padding"+c]=a;return b&&(d.opacity=d.width=a),d}function da(a){return p.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}var c,d,e=a.document,f=a.location,g=a.navigator,h=a.jQuery,i=a.$,j=Array.prototype.push,k=Array.prototype.slice,l=Array.prototype.indexOf,m=Object.prototype.toString,n=Object.prototype.hasOwnProperty,o=String.prototype.trim,p=function(a,b){return new p.fn.init(a,b,c)},q=/[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,r=/\S/,s=/\s+/,t=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,u=/^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^[\],:{}\s]*$/,x=/(?:^|:|,)(?:\s*\[)+/g,y=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,z=/"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,A=/^-ms-/,B=/-([\da-z])/gi,C=function(a,b){return(b+"").toUpperCase()},D=function(){e.addEventListener?(e.removeEventListener("DOMContentLoaded",D,!1),p.ready()):e.readyState==="complete"&&(e.detachEvent("onreadystatechange",D),p.ready())},E={};p.fn=p.prototype={constructor:p,init:function(a,c,d){var f,g,h,i;if(!a)return this;if(a.nodeType)return this.context=this[0]=a,this.length=1,this;if(typeof a=="string"){a.charAt(0)==="<"&&a.charAt(a.length-1)===">"&&a.length>=3?f=[null,a,null]:f=u.exec(a);if(f&&(f[1]||!c)){if(f[1])return c=c instanceof p?c[0]:c,i=c&&c.nodeType?c.ownerDocument||c:e,a=p.parseHTML(f[1],i,!0),v.test(f[1])&&p.isPlainObject(c)&&this.attr.call(a,c,!0),p.merge(this,a);g=e.getElementById(f[2]);if(g&&g.parentNode){if(g.id!==f[2])return d.find(a);this.length=1,this[0]=g}return this.context=e,this.selector=a,this}return!c||c.jquery?(c||d).find(a):this.constructor(c).find(a)}return p.isFunction(a)?d.ready(a):(a.selector!==b&&(this.selector=a.selector,this.context=a.context),p.makeArray(a,this))},selector:"",jquery:"1.8.2",length:0,size:function(){return this.length},toArray:function(){return k.call(this)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=p.merge(this.constructor(),a);return d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")"),d},each:function(a,b){return p.each(this,a,b)},ready:function(a){return p.ready.promise().done(a),this},eq:function(a){return a=+a,a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(k.apply(this,arguments),"slice",k.call(arguments).join(","))},map:function(a){return this.pushStack(p.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:j,sort:[].sort,splice:[].splice},p.fn.init.prototype=p.fn,p.extend=p.fn.extend=function(){var a,c,d,e,f,g,h=arguments[0]||{},i=1,j=arguments.length,k=!1;typeof h=="boolean"&&(k=h,h=arguments[1]||{},i=2),typeof h!="object"&&!p.isFunction(h)&&(h={}),j===i&&(h=this,--i);for(;i<j;i++)if((a=arguments[i])!=null)for(c in a){d=h[c],e=a[c];if(h===e)continue;k&&e&&(p.isPlainObject(e)||(f=p.isArray(e)))?(f?(f=!1,g=d&&p.isArray(d)?d:[]):g=d&&p.isPlainObject(d)?d:{},h[c]=p.extend(k,g,e)):e!==b&&(h[c]=e)}return h},p.extend({noConflict:function(b){return a.$===p&&(a.$=i),b&&a.jQuery===p&&(a.jQuery=h),p},isReady:!1,readyWait:1,holdReady:function(a){a?p.readyWait++:p.ready(!0)},ready:function(a){if(a===!0?--p.readyWait:p.isReady)return;if(!e.body)return setTimeout(p.ready,1);p.isReady=!0;if(a!==!0&&--p.readyWait>0)return;d.resolveWith(e,[p]),p.fn.trigger&&p(e).trigger("ready").off("ready")},isFunction:function(a){return p.type(a)==="function"},isArray:Array.isArray||function(a){return p.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):E[m.call(a)]||"object"},isPlainObject:function(a){if(!a||p.type(a)!=="object"||a.nodeType||p.isWindow(a))return!1;try{if(a.constructor&&!n.call(a,"constructor")&&!n.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||n.call(a,d)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},error:function(a){throw new Error(a)},parseHTML:function(a,b,c){var d;return!a||typeof a!="string"?null:(typeof b=="boolean"&&(c=b,b=0),b=b||e,(d=v.exec(a))?[b.createElement(d[1])]:(d=p.buildFragment([a],b,c?null:[]),p.merge([],(d.cacheable?p.clone(d.fragment):d.fragment).childNodes)))},parseJSON:function(b){if(!b||typeof b!="string")return null;b=p.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(w.test(b.replace(y,"@").replace(z,"]").replace(x,"")))return(new Function("return "+b))();p.error("Invalid JSON: "+b)},parseXML:function(c){var d,e;if(!c||typeof c!="string")return null;try{a.DOMParser?(e=new DOMParser,d=e.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(f){d=b}return(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&p.error("Invalid XML: "+c),d},noop:function(){},globalEval:function(b){b&&r.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(A,"ms-").replace(B,C)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,c,d){var e,f=0,g=a.length,h=g===b||p.isFunction(a);if(d){if(h){for(e in a)if(c.apply(a[e],d)===!1)break}else for(;f<g;)if(c.apply(a[f++],d)===!1)break}else if(h){for(e in a)if(c.call(a[e],e,a[e])===!1)break}else for(;f<g;)if(c.call(a[f],f,a[f++])===!1)break;return a},trim:o&&!o.call(" ")?function(a){return a==null?"":o.call(a)}:function(a){return a==null?"":(a+"").replace(t,"")},makeArray:function(a,b){var c,d=b||[];return a!=null&&(c=p.type(a),a.length==null||c==="string"||c==="function"||c==="regexp"||p.isWindow(a)?j.call(d,a):p.merge(d,a)),d},inArray:function(a,b,c){var d;if(b){if(l)return l.call(b,a,c);d=b.length,c=c?c<0?Math.max(0,d+c):c:0;for(;c<d;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,c){var d=c.length,e=a.length,f=0;if(typeof d=="number")for(;f<d;f++)a[e++]=c[f];else while(c[f]!==b)a[e++]=c[f++];return a.length=e,a},grep:function(a,b,c){var d,e=[],f=0,g=a.length;c=!!c;for(;f<g;f++)d=!!b(a[f],f),c!==d&&e.push(a[f]);return e},map:function(a,c,d){var e,f,g=[],h=0,i=a.length,j=a instanceof p||i!==b&&typeof i=="number"&&(i>0&&a[0]&&a[i-1]||i===0||p.isArray(a));if(j)for(;h<i;h++)e=c(a[h],h,d),e!=null&&(g[g.length]=e);else for(f in a)e=c(a[f],f,d),e!=null&&(g[g.length]=e);return g.concat.apply([],g)},guid:1,proxy:function(a,c){var d,e,f;return typeof c=="string"&&(d=a[c],c=a,a=d),p.isFunction(a)?(e=k.call(arguments,2),f=function(){return a.apply(c,e.concat(k.call(arguments)))},f.guid=a.guid=a.guid||p.guid++,f):b},access:function(a,c,d,e,f,g,h){var i,j=d==null,k=0,l=a.length;if(d&&typeof d=="object"){for(k in d)p.access(a,c,k,d[k],1,g,e);f=1}else if(e!==b){i=h===b&&p.isFunction(e),j&&(i?(i=c,c=function(a,b,c){return i.call(p(a),c)}):(c.call(a,e),c=null));if(c)for(;k<l;k++)c(a[k],d,i?e.call(a[k],k,c(a[k],d)):e,h);f=1}return f?a:j?c.call(a):l?c(a[0],d):g},now:function(){return(new Date).getTime()}}),p.ready.promise=function(b){if(!d){d=p.Deferred();if(e.readyState==="complete")setTimeout(p.ready,1);else if(e.addEventListener)e.addEventListener("DOMContentLoaded",D,!1),a.addEventListener("load",p.ready,!1);else{e.attachEvent("onreadystatechange",D),a.attachEvent("onload",p.ready);var c=!1;try{c=a.frameElement==null&&e.documentElement}catch(f){}c&&c.doScroll&&function g(){if(!p.isReady){try{c.doScroll("left")}catch(a){return setTimeout(g,50)}p.ready()}}()}}return d.promise(b)},p.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){E["[object "+b+"]"]=b.toLowerCase()}),c=p(e);var F={};p.Callbacks=function(a){a=typeof a=="string"?F[a]||G(a):p.extend({},a);var c,d,e,f,g,h,i=[],j=!a.once&&[],k=function(b){c=a.memory&&b,d=!0,h=f||0,f=0,g=i.length,e=!0;for(;i&&h<g;h++)if(i[h].apply(b[0],b[1])===!1&&a.stopOnFalse){c=!1;break}e=!1,i&&(j?j.length&&k(j.shift()):c?i=[]:l.disable())},l={add:function(){if(i){var b=i.length;(function d(b){p.each(b,function(b,c){var e=p.type(c);e==="function"&&(!a.unique||!l.has(c))?i.push(c):c&&c.length&&e!=="string"&&d(c)})})(arguments),e?g=i.length:c&&(f=b,k(c))}return this},remove:function(){return i&&p.each(arguments,function(a,b){var c;while((c=p.inArray(b,i,c))>-1)i.splice(c,1),e&&(c<=g&&g--,c<=h&&h--)}),this},has:function(a){return p.inArray(a,i)>-1},empty:function(){return i=[],this},disable:function(){return i=j=c=b,this},disabled:function(){return!i},lock:function(){return j=b,c||l.disable(),this},locked:function(){return!j},fireWith:function(a,b){return b=b||[],b=[a,b.slice?b.slice():b],i&&(!d||j)&&(e?j.push(b):k(b)),this},fire:function(){return l.fireWith(this,arguments),this},fired:function(){return!!d}};return l},p.extend({Deferred:function(a){var b=[["resolve","done",p.Callbacks("once memory"),"resolved"],["reject","fail",p.Callbacks("once memory"),"rejected"],["notify","progress",p.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return p.Deferred(function(c){p.each(b,function(b,d){var f=d[0],g=a[b];e[d[1]](p.isFunction(g)?function(){var a=g.apply(this,arguments);a&&p.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f+"With"](this===e?c:this,[a])}:c[f])}),a=null}).promise()},promise:function(a){return a!=null?p.extend(a,d):d}},e={};return d.pipe=d.then,p.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[a^1][2].disable,b[2][2].lock),e[f[0]]=g.fire,e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=k.call(arguments),d=c.length,e=d!==1||a&&p.isFunction(a.promise)?d:0,f=e===1?a:p.Deferred(),g=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?k.call(arguments):d,c===h?f.notifyWith(b,c):--e||f.resolveWith(b,c)}},h,i,j;if(d>1){h=new Array(d),i=new Array(d),j=new Array(d);for(;b<d;b++)c[b]&&p.isFunction(c[b].promise)?c[b].promise().done(g(b,j,c)).fail(f.reject).progress(g(b,i,h)):--e}return e||f.resolveWith(j,c),f.promise()}}),p.support=function(){var b,c,d,f,g,h,i,j,k,l,m,n=e.createElement("div");n.setAttribute("className","t"),n.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",c=n.getElementsByTagName("*"),d=n.getElementsByTagName("a")[0],d.style.cssText="top:1px;float:left;opacity:.5";if(!c||!c.length)return{};f=e.createElement("select"),g=f.appendChild(e.createElement("option")),h=n.getElementsByTagName("input")[0],b={leadingWhitespace:n.firstChild.nodeType===3,tbody:!n.getElementsByTagName("tbody").length,htmlSerialize:!!n.getElementsByTagName("link").length,style:/top/.test(d.getAttribute("style")),hrefNormalized:d.getAttribute("href")==="/a",opacity:/^0.5/.test(d.style.opacity),cssFloat:!!d.style.cssFloat,checkOn:h.value==="on",optSelected:g.selected,getSetAttribute:n.className!=="t",enctype:!!e.createElement("form").enctype,html5Clone:e.createElement("nav").cloneNode(!0).outerHTML!=="<:nav></:nav>",boxModel:e.compatMode==="CSS1Compat",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},h.checked=!0,b.noCloneChecked=h.cloneNode(!0).checked,f.disabled=!0,b.optDisabled=!g.disabled;try{delete n.test}catch(o){b.deleteExpando=!1}!n.addEventListener&&n.attachEvent&&n.fireEvent&&(n.attachEvent("onclick",m=function(){b.noCloneEvent=!1}),n.cloneNode(!0).fireEvent("onclick"),n.detachEvent("onclick",m)),h=e.createElement("input"),h.value="t",h.setAttribute("type","radio"),b.radioValue=h.value==="t",h.setAttribute("checked","checked"),h.setAttribute("name","t"),n.appendChild(h),i=e.createDocumentFragment(),i.appendChild(n.lastChild),b.checkClone=i.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=h.checked,i.removeChild(h),i.appendChild(n);if(n.attachEvent)for(k in{submit:!0,change:!0,focusin:!0})j="on"+k,l=j in n,l||(n.setAttribute(j,"return;"),l=typeof n[j]=="function"),b[k+"Bubbles"]=l;return p(function(){var c,d,f,g,h="padding:0;margin:0;border:0;display:block;overflow:hidden;",i=e.getElementsByTagName("body")[0];if(!i)return;c=e.createElement("div"),c.style.cssText="visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px",i.insertBefore(c,i.firstChild),d=e.createElement("div"),c.appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",f=d.getElementsByTagName("td"),f[0].style.cssText="padding:0;margin:0;border:0;display:none",l=f[0].offsetHeight===0,f[0].style.display="",f[1].style.display="none",b.reliableHiddenOffsets=l&&f[0].offsetHeight===0,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",b.boxSizing=d.offsetWidth===4,b.doesNotIncludeMarginInBodyOffset=i.offsetTop!==1,a.getComputedStyle&&(b.pixelPosition=(a.getComputedStyle(d,null)||{}).top!=="1%",b.boxSizingReliable=(a.getComputedStyle(d,null)||{width:"4px"}).width==="4px",g=e.createElement("div"),g.style.cssText=d.style.cssText=h,g.style.marginRight=g.style.width="0",d.style.width="1px",d.appendChild(g),b.reliableMarginRight=!parseFloat((a.getComputedStyle(g,null)||{}).marginRight)),typeof d.style.zoom!="undefined"&&(d.innerHTML="",d.style.cssText=h+"width:1px;padding:1px;display:inline;zoom:1",b.inlineBlockNeedsLayout=d.offsetWidth===3,d.style.display="block",d.style.overflow="visible",d.innerHTML="<div></div>",d.firstChild.style.width="5px",b.shrinkWrapBlocks=d.offsetWidth!==3,c.style.zoom=1),i.removeChild(c),c=d=f=g=null}),i.removeChild(n),c=d=f=g=h=i=n=null,b}();var H=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,I=/([A-Z])/g;p.extend({cache:{},deletedIds:[],uuid:0,expando:"jQuery"+(p.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){return a=a.nodeType?p.cache[a[p.expando]]:a[p.expando],!!a&&!K(a)},data:function(a,c,d,e){if(!p.acceptData(a))return;var f,g,h=p.expando,i=typeof c=="string",j=a.nodeType,k=j?p.cache:a,l=j?a[h]:a[h]&&h;if((!l||!k[l]||!e&&!k[l].data)&&i&&d===b)return;l||(j?a[h]=l=p.deletedIds.pop()||p.guid++:l=h),k[l]||(k[l]={},j||(k[l].toJSON=p.noop));if(typeof c=="object"||typeof c=="function")e?k[l]=p.extend(k[l],c):k[l].data=p.extend(k[l].data,c);return f=k[l],e||(f.data||(f.data={}),f=f.data),d!==b&&(f[p.camelCase(c)]=d),i?(g=f[c],g==null&&(g=f[p.camelCase(c)])):g=f,g},removeData:function(a,b,c){if(!p.acceptData(a))return;var d,e,f,g=a.nodeType,h=g?p.cache:a,i=g?a[p.expando]:p.expando;if(!h[i])return;if(b){d=c?h[i]:h[i].data;if(d){p.isArray(b)||(b in d?b=[b]:(b=p.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,f=b.length;e<f;e++)delete d[b[e]];if(!(c?K:p.isEmptyObject)(d))return}}if(!c){delete h[i].data;if(!K(h[i]))return}g?p.cleanData([a],!0):p.support.deleteExpando||h!=h.window?delete h[i]:h[i]=null},_data:function(a,b,c){return p.data(a,b,c,!0)},acceptData:function(a){var b=a.nodeName&&p.noData[a.nodeName.toLowerCase()];return!b||b!==!0&&a.getAttribute("classid")===b}}),p.fn.extend({data:function(a,c){var d,e,f,g,h,i=this[0],j=0,k=null;if(a===b){if(this.length){k=p.data(i);if(i.nodeType===1&&!p._data(i,"parsedAttrs")){f=i.attributes;for(h=f.length;j<h;j++)g=f[j].name,g.indexOf("data-")||(g=p.camelCase(g.substring(5)),J(i,g,k[g]));p._data(i,"parsedAttrs",!0)}}return k}return typeof a=="object"?this.each(function(){p.data(this,a)}):(d=a.split(".",2),d[1]=d[1]?"."+d[1]:"",e=d[1]+"!",p.access(this,function(c){if(c===b)return k=this.triggerHandler("getData"+e,[d[0]]),k===b&&i&&(k=p.data(i,a),k=J(i,a,k)),k===b&&d[1]?this.data(d[0]):k;d[1]=c,this.each(function(){var b=p(this);b.triggerHandler("setData"+e,d),p.data(this,a,c),b.triggerHandler("changeData"+e,d)})},null,c,arguments.length>1,null,!1))},removeData:function(a){return this.each(function(){p.removeData(this,a)})}}),p.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=p._data(a,b),c&&(!d||p.isArray(c)?d=p._data(a,b,p.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=p.queue(a,b),d=c.length,e=c.shift(),f=p._queueHooks(a,b),g=function(){p.dequeue(a,b)};e==="inprogress"&&(e=c.shift(),d--),e&&(b==="fx"&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return p._data(a,c)||p._data(a,c,{empty:p.Callbacks("once memory").add(function(){p.removeData(a,b+"queue",!0),p.removeData(a,c,!0)})})}}),p.fn.extend({queue:function(a,c){var d=2;return typeof a!="string"&&(c=a,a="fx",d--),arguments.length<d?p.queue(this[0],a):c===b?this:this.each(function(){var b=p.queue(this,a,c);p._queueHooks(this,a),a==="fx"&&b[0]!=="inprogress"&&p.dequeue(this,a)})},dequeue:function(a){return this.each(function(){p.dequeue(this,a)})},delay:function(a,b){return a=p.fx?p.fx.speeds[a]||a:a,b=b||"fx",this.queue(b,function(b,c){var d=setTimeout(b,a);c.stop=function(){clearTimeout(d)}})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){var d,e=1,f=p.Deferred(),g=this,h=this.length,i=function(){--e||f.resolveWith(g,[g])};typeof a!="string"&&(c=a,a=b),a=a||"fx";while(h--)d=p._data(g[h],a+"queueHooks"),d&&d.empty&&(e++,d.empty.add(i));return i(),f.promise(c)}});var L,M,N,O=/[\t\r\n]/g,P=/\r/g,Q=/^(?:button|input)$/i,R=/^(?:button|input|object|select|textarea)$/i,S=/^a(?:rea|)$/i,T=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,U=p.support.getSetAttribute;p.fn.extend({attr:function(a,b){return p.access(this,p.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){p.removeAttr(this,a)})},prop:function(a,b){return p.access(this,p.prop,a,b,arguments.length>1)},removeProp:function(a){return a=p.propFix[a]||a,this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,f,g,h;if(p.isFunction(a))return this.each(function(b){p(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(s);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{f=" "+e.className+" ";for(g=0,h=b.length;g<h;g++)f.indexOf(" "+b[g]+" ")<0&&(f+=b[g]+" ");e.className=p.trim(f)}}}return this},removeClass:function(a){var c,d,e,f,g,h,i;if(p.isFunction(a))return this.each(function(b){p(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(s);for(h=0,i=this.length;h<i;h++){e=this[h];if(e.nodeType===1&&e.className){d=(" "+e.className+" ").replace(O," ");for(f=0,g=c.length;f<g;f++)while(d.indexOf(" "+c[f]+" ")>=0)d=d.replace(" "+c[f]+" "," ");e.className=a?p.trim(d):""}}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";return p.isFunction(a)?this.each(function(c){p(this).toggleClass(a.call(this,c,this.className,b),b)}):this.each(function(){if(c==="string"){var e,f=0,g=p(this),h=b,i=a.split(s);while(e=i[f++])h=d?h:!g.hasClass(e),g[h?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&p._data(this,"__className__",this.className),this.className=this.className||a===!1?"":p._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ",c=0,d=this.length;for(;c<d;c++)if(this[c].nodeType===1&&(" "+this[c].className+" ").replace(O," ").indexOf(b)>=0)return!0;return!1},val:function(a){var c,d,e,f=this[0];if(!arguments.length){if(f)return c=p.valHooks[f.type]||p.valHooks[f.nodeName.toLowerCase()],c&&"get"in c&&(d=c.get(f,"value"))!==b?d:(d=f.value,typeof d=="string"?d.replace(P,""):d==null?"":d);return}return e=p.isFunction(a),this.each(function(d){var f,g=p(this);if(this.nodeType!==1)return;e?f=a.call(this,d,g.val()):f=a,f==null?f="":typeof f=="number"?f+="":p.isArray(f)&&(f=p.map(f,function(a){return a==null?"":a+""})),c=p.valHooks[this.type]||p.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,f,"value")===b)this.value=f})}}),p.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,f=a.selectedIndex,g=[],h=a.options,i=a.type==="select-one";if(f<0)return null;c=i?f:0,d=i?f+1:h.length;for(;c<d;c++){e=h[c];if(e.selected&&(p.support.optDisabled?!e.disabled:e.getAttribute("disabled")===null)&&(!e.parentNode.disabled||!p.nodeName(e.parentNode,"optgroup"))){b=p(e).val();if(i)return b;g.push(b)}}return i&&!g.length&&h.length?p(h[f]).val():g},set:function(a,b){var c=p.makeArray(b);return p(a).find("option").each(function(){this.selected=p.inArray(p(this).val(),c)>=0}),c.length||(a.selectedIndex=-1),c}}},attrFn:{},attr:function(a,c,d,e){var f,g,h,i=a.nodeType;if(!a||i===3||i===8||i===2)return;if(e&&p.isFunction(p.fn[c]))return p(a)[c](d);if(typeof a.getAttribute=="undefined")return p.prop(a,c,d);h=i!==1||!p.isXMLDoc(a),h&&(c=c.toLowerCase(),g=p.attrHooks[c]||(T.test(c)?M:L));if(d!==b){if(d===null){p.removeAttr(a,c);return}return g&&"set"in g&&h&&(f=g.set(a,d,c))!==b?f:(a.setAttribute(c,d+""),d)}return g&&"get"in g&&h&&(f=g.get(a,c))!==null?f:(f=a.getAttribute(c),f===null?b:f)},removeAttr:function(a,b){var c,d,e,f,g=0;if(b&&a.nodeType===1){d=b.split(s);for(;g<d.length;g++)e=d[g],e&&(c=p.propFix[e]||e,f=T.test(e),f||p.attr(a,e,""),a.removeAttribute(U?e:c),f&&c in a&&(a[c]=!1))}},attrHooks:{type:{set:function(a,b){if(Q.test(a.nodeName)&&a.parentNode)p.error("type property can't be changed");else if(!p.support.radioValue&&b==="radio"&&p.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}},value:{get:function(a,b){return L&&p.nodeName(a,"button")?L.get(a,b):b in a?a.value:null},set:function(a,b,c){if(L&&p.nodeName(a,"button"))return L.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e,f,g,h=a.nodeType;if(!a||h===3||h===8||h===2)return;return g=h!==1||!p.isXMLDoc(a),g&&(c=p.propFix[c]||c,f=p.propHooks[c]),d!==b?f&&"set"in f&&(e=f.set(a,d,c))!==b?e:a[c]=d:f&&"get"in f&&(e=f.get(a,c))!==null?e:a[c]},propHooks:{tabIndex:{get:function(a){var c=a.getAttributeNode("tabindex");return c&&c.specified?parseInt(c.value,10):R.test(a.nodeName)||S.test(a.nodeName)&&a.href?0:b}}}}),M={get:function(a,c){var d,e=p.prop(a,c);return e===!0||typeof e!="boolean"&&(d=a.getAttributeNode(c))&&d.nodeValue!==!1?c.toLowerCase():b},set:function(a,b,c){var d;return b===!1?p.removeAttr(a,c):(d=p.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase())),c}},U||(N={name:!0,id:!0,coords:!0},L=p.valHooks.button={get:function(a,c){var d;return d=a.getAttributeNode(c),d&&(N[c]?d.value!=="":d.specified)?d.value:b},set:function(a,b,c){var d=a.getAttributeNode(c);return d||(d=e.createAttribute(c),a.setAttributeNode(d)),d.value=b+""}},p.each(["width","height"],function(a,b){p.attrHooks[b]=p.extend(p.attrHooks[b],{set:function(a,c){if(c==="")return a.setAttribute(b,"auto"),c}})}),p.attrHooks.contenteditable={get:L.get,set:function(a,b,c){b===""&&(b="false"),L.set(a,b,c)}}),p.support.hrefNormalized||p.each(["href","src","width","height"],function(a,c){p.attrHooks[c]=p.extend(p.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),p.support.style||(p.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=b+""}}),p.support.optSelected||(p.propHooks.selected=p.extend(p.propHooks.selected,{get:function(a){var b=a.parentNode;return b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex),null}})),p.support.enctype||(p.propFix.enctype="encoding"),p.support.checkOn||p.each(["radio","checkbox"],function(){p.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),p.each(["radio","checkbox"],function(){p.valHooks[this]=p.extend(p.valHooks[this],{set:function(a,b){if(p.isArray(b))return a.checked=p.inArray(p(a).val(),b)>=0}})});var V=/^(?:textarea|input|select)$/i,W=/^([^\.]*|)(?:\.(.+)|)$/,X=/(?:^|\s)hover(\.\S+|)\b/,Y=/^key/,Z=/^(?:mouse|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=function(a){return p.event.special.hover?a:a.replace(X,"mouseenter$1 mouseleave$1")};p.event={add:function(a,c,d,e,f){var g,h,i,j,k,l,m,n,o,q,r;if(a.nodeType===3||a.nodeType===8||!c||!d||!(g=p._data(a)))return;d.handler&&(o=d,d=o.handler,f=o.selector),d.guid||(d.guid=p.guid++),i=g.events,i||(g.events=i={}),h=g.handle,h||(g.handle=h=function(a){return typeof p!="undefined"&&(!a||p.event.triggered!==a.type)?p.event.dispatch.apply(h.elem,arguments):b},h.elem=a),c=p.trim(_(c)).split(" ");for(j=0;j<c.length;j++){k=W.exec(c[j])||[],l=k[1],m=(k[2]||"").split(".").sort(),r=p.event.special[l]||{},l=(f?r.delegateType:r.bindType)||l,r=p.event.special[l]||{},n=p.extend({type:l,origType:k[1],data:e,handler:d,guid:d.guid,selector:f,needsContext:f&&p.expr.match.needsContext.test(f),namespace:m.join(".")},o),q=i[l];if(!q){q=i[l]=[],q.delegateCount=0;if(!r.setup||r.setup.call(a,e,m,h)===!1)a.addEventListener?a.addEventListener(l,h,!1):a.attachEvent&&a.attachEvent("on"+l,h)}r.add&&(r.add.call(a,n),n.handler.guid||(n.handler.guid=d.guid)),f?q.splice(q.delegateCount++,0,n):q.push(n),p.event.global[l]=!0}a=null},global:{},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,q,r=p.hasData(a)&&p._data(a);if(!r||!(m=r.events))return;b=p.trim(_(b||"")).split(" ");for(f=0;f<b.length;f++){g=W.exec(b[f])||[],h=i=g[1],j=g[2];if(!h){for(h in m)p.event.remove(a,h+b[f],c,d,!0);continue}n=p.event.special[h]||{},h=(d?n.delegateType:n.bindType)||h,o=m[h]||[],k=o.length,j=j?new RegExp("(^|\\.)"+j.split(".").sort().join("\\.(?:.*\\.|)")+"(\\.|$)"):null;for(l=0;l<o.length;l++)q=o[l],(e||i===q.origType)&&(!c||c.guid===q.guid)&&(!j||j.test(q.namespace))&&(!d||d===q.selector||d==="**"&&q.selector)&&(o.splice(l--,1),q.selector&&o.delegateCount--,n.remove&&n.remove.call(a,q));o.length===0&&k!==o.length&&((!n.teardown||n.teardown.call(a,j,r.handle)===!1)&&p.removeEvent(a,h,r.handle),delete m[h])}p.isEmptyObject(m)&&(delete r.handle,p.removeData(a,"events",!0))},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,f,g){if(!f||f.nodeType!==3&&f.nodeType!==8){var h,i,j,k,l,m,n,o,q,r,s=c.type||c,t=[];if($.test(s+p.event.triggered))return;s.indexOf("!")>=0&&(s=s.slice(0,-1),i=!0),s.indexOf(".")>=0&&(t=s.split("."),s=t.shift(),t.sort());if((!f||p.event.customEvent[s])&&!p.event.global[s])return;c=typeof c=="object"?c[p.expando]?c:new p.Event(s,c):new p.Event(s),c.type=s,c.isTrigger=!0,c.exclusive=i,c.namespace=t.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+t.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,m=s.indexOf(":")<0?"on"+s:"";if(!f){h=p.cache;for(j in h)h[j].events&&h[j].events[s]&&p.event.trigger(c,d,h[j].handle.elem,!0);return}c.result=b,c.target||(c.target=f),d=d!=null?p.makeArray(d):[],d.unshift(c),n=p.event.special[s]||{};if(n.trigger&&n.trigger.apply(f,d)===!1)return;q=[[f,n.bindType||s]];if(!g&&!n.noBubble&&!p.isWindow(f)){r=n.delegateType||s,k=$.test(r+s)?f:f.parentNode;for(l=f;k;k=k.parentNode)q.push([k,r]),l=k;l===(f.ownerDocument||e)&&q.push([l.defaultView||l.parentWindow||a,r])}for(j=0;j<q.length&&!c.isPropagationStopped();j++)k=q[j][0],c.type=q[j][1],o=(p._data(k,"events")||{})[c.type]&&p._data(k,"handle"),o&&o.apply(k,d),o=m&&k[m],o&&p.acceptData(k)&&o.apply&&o.apply(k,d)===!1&&c.preventDefault();return c.type=s,!g&&!c.isDefaultPrevented()&&(!n._default||n._default.apply(f.ownerDocument,d)===!1)&&(s!=="click"||!p.nodeName(f,"a"))&&p.acceptData(f)&&m&&f[s]&&(s!=="focus"&&s!=="blur"||c.target.offsetWidth!==0)&&!p.isWindow(f)&&(l=f[m],l&&(f[m]=null),p.event.triggered=s,f[s](),p.event.triggered=b,l&&(f[m]=l)),c.result}return},dispatch:function(c){c=p.event.fix(c||a.event);var d,e,f,g,h,i,j,l,m,n,o=(p._data(this,"events")||{})[c.type]||[],q=o.delegateCount,r=k.call(arguments),s=!c.exclusive&&!c.namespace,t=p.event.special[c.type]||{},u=[];r[0]=c,c.delegateTarget=this;if(t.preDispatch&&t.preDispatch.call(this,c)===!1)return;if(q&&(!c.button||c.type!=="click"))for(f=c.target;f!=this;f=f.parentNode||this)if(f.disabled!==!0||c.type!=="click"){h={},j=[];for(d=0;d<q;d++)l=o[d],m=l.selector,h[m]===b&&(h[m]=l.needsContext?p(m,this).index(f)>=0:p.find(m,this,null,[f]).length),h[m]&&j.push(l);j.length&&u.push({elem:f,matches:j})}o.length>q&&u.push({elem:this,matches:o.slice(q)});for(d=0;d<u.length&&!c.isPropagationStopped();d++){i=u[d],c.currentTarget=i.elem;for(e=0;e<i.matches.length&&!c.isImmediatePropagationStopped();e++){l=i.matches[e];if(s||!c.namespace&&!l.namespace||c.namespace_re&&c.namespace_re.test(l.namespace))c.data=l.data,c.handleObj=l,g=((p.event.special[l.origType]||{}).handle||l.handler).apply(i.elem,r),g!==b&&(c.result=g,g===!1&&(c.preventDefault(),c.stopPropagation()))}}return t.postDispatch&&t.postDispatch.call(this,c),c.result},props:"attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(a,b){return a.which==null&&(a.which=b.charCode!=null?b.charCode:b.keyCode),a}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(a,c){var d,f,g,h=c.button,i=c.fromElement;return a.pageX==null&&c.clientX!=null&&(d=a.target.ownerDocument||e,f=d.documentElement,g=d.body,a.pageX=c.clientX+(f&&f.scrollLeft||g&&g.scrollLeft||0)-(f&&f.clientLeft||g&&g.clientLeft||0),a.pageY=c.clientY+(f&&f.scrollTop||g&&g.scrollTop||0)-(f&&f.clientTop||g&&g.clientTop||0)),!a.relatedTarget&&i&&(a.relatedTarget=i===a.target?c.toElement:i),!a.which&&h!==b&&(a.which=h&1?1:h&2?3:h&4?2:0),a}},fix:function(a){if(a[p.expando])return a;var b,c,d=a,f=p.event.fixHooks[a.type]||{},g=f.props?this.props.concat(f.props):this.props;a=p.Event(d);for(b=g.length;b;)c=g[--b],a[c]=d[c];return a.target||(a.target=d.srcElement||e),a.target.nodeType===3&&(a.target=a.target.parentNode),a.metaKey=!!a.metaKey,f.filter?f.filter(a,d):a},special:{load:{noBubble:!0},focus:{delegateType:"focusin"},blur:{delegateType:"focusout"},beforeunload:{setup:function(a,b,c){p.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}},simulate:function(a,b,c,d){var e=p.extend(new p.Event,c,{type:a,isSimulated:!0,originalEvent:{}});d?p.event.trigger(e,null,b):p.event.dispatch.call(b,e),e.isDefaultPrevented()&&c.preventDefault()}},p.event.handle=p.event.dispatch,p.removeEvent=e.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){var d="on"+b;a.detachEvent&&(typeof a[d]=="undefined"&&(a[d]=null),a.detachEvent(d,c))},p.Event=function(a,b){if(this instanceof p.Event)a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?bb:ba):this.type=a,b&&p.extend(this,b),this.timeStamp=a&&a.timeStamp||p.now(),this[p.expando]=!0;else return new p.Event(a,b)},p.Event.prototype={preventDefault:function(){this.isDefaultPrevented=bb;var a=this.originalEvent;if(!a)return;a.preventDefault?a.preventDefault():a.returnValue=!1},stopPropagation:function(){this.isPropagationStopped=bb;var a=this.originalEvent;if(!a)return;a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=bb,this.stopPropagation()},isDefaultPrevented:ba,isPropagationStopped:ba,isImmediatePropagationStopped:ba},p.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){p.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj,g=f.selector;if(!e||e!==d&&!p.contains(d,e))a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b;return c}}}),p.support.submitBubbles||(p.event.special.submit={setup:function(){if(p.nodeName(this,"form"))return!1;p.event.add(this,"click._submit keypress._submit",function(a){var c=a.target,d=p.nodeName(c,"input")||p.nodeName(c,"button")?c.form:b;d&&!p._data(d,"_submit_attached")&&(p.event.add(d,"submit._submit",function(a){a._submit_bubble=!0}),p._data(d,"_submit_attached",!0))})},postDispatch:function(a){a._submit_bubble&&(delete a._submit_bubble,this.parentNode&&!a.isTrigger&&p.event.simulate("submit",this.parentNode,a,!0))},teardown:function(){if(p.nodeName(this,"form"))return!1;p.event.remove(this,"._submit")}}),p.support.changeBubbles||(p.event.special.change={setup:function(){if(V.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio")p.event.add(this,"propertychange._change",function(a){a.originalEvent.propertyName==="checked"&&(this._just_changed=!0)}),p.event.add(this,"click._change",function(a){this._just_changed&&!a.isTrigger&&(this._just_changed=!1),p.event.simulate("change",this,a,!0)});return!1}p.event.add(this,"beforeactivate._change",function(a){var b=a.target;V.test(b.nodeName)&&!p._data(b,"_change_attached")&&(p.event.add(b,"change._change",function(a){this.parentNode&&!a.isSimulated&&!a.isTrigger&&p.event.simulate("change",this.parentNode,a,!0)}),p._data(b,"_change_attached",!0))})},handle:function(a){var b=a.target;if(this!==b||a.isSimulated||a.isTrigger||b.type!=="radio"&&b.type!=="checkbox")return a.handleObj.handler.apply(this,arguments)},teardown:function(){return p.event.remove(this,"._change"),!V.test(this.nodeName)}}),p.support.focusinBubbles||p.each({focus:"focusin",blur:"focusout"},function(a,b){var c=0,d=function(a){p.event.simulate(b,a.target,p.event.fix(a),!0)};p.event.special[b]={setup:function(){c++===0&&e.addEventListener(a,d,!0)},teardown:function(){--c===0&&e.removeEventListener(a,d,!0)}}}),p.fn.extend({on:function(a,c,d,e,f){var g,h;if(typeof a=="object"){typeof c!="string"&&(d=d||c,c=b);for(h in a)this.on(h,c,d,a[h],f);return this}d==null&&e==null?(e=c,d=c=b):e==null&&(typeof c=="string"?(e=d,d=b):(e=d,d=c,c=b));if(e===!1)e=ba;else if(!e)return this;return f===1&&(g=e,e=function(a){return p().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=p.guid++)),this.each(function(){p.event.add(this,a,e,d,c)})},one:function(a,b,c,d){return this.on(a,b,c,d,1)},off:function(a,c,d){var e,f;if(a&&a.preventDefault&&a.handleObj)return e=a.handleObj,p(a.delegateTarget).off(e.namespace?e.origType+"."+e.namespace:e.origType,e.selector,e.handler),this;if(typeof a=="object"){for(f in a)this.off(f,c,a[f]);return this}if(c===!1||typeof c=="function")d=c,c=b;return d===!1&&(d=ba),this.each(function(){p.event.remove(this,a,d,c)})},bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},live:function(a,b,c){return p(this.context).on(a,this.selector,b,c),this},die:function(a,b){return p(this.context).off(a,this.selector||"**",b),this},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return arguments.length===1?this.off(a,"**"):this.off(b,a||"**",c)},trigger:function(a,b){return this.each(function(){p.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return p.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||p.guid++,d=0,e=function(c){var e=(p._data(this,"lastToggle"+a.guid)||0)%d;return p._data(this,"lastToggle"+a.guid,e+1),c.preventDefault(),b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),p.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(a,b){p.fn[b]=function(a,c){return c==null&&(c=a,a=null),arguments.length>0?this.on(b,null,a,c):this.trigger(b)},Y.test(b)&&(p.event.fixHooks[b]=p.event.keyHooks),Z.test(b)&&(p.event.fixHooks[b]=p.event.mouseHooks)}),function(a,b){function bc(a,b,c,d){c=c||[],b=b||r;var e,f,i,j,k=b.nodeType;if(!a||typeof a!="string")return c;if(k!==1&&k!==9)return[];i=g(b);if(!i&&!d)if(e=P.exec(a))if(j=e[1]){if(k===9){f=b.getElementById(j);if(!f||!f.parentNode)return c;if(f.id===j)return c.push(f),c}else if(b.ownerDocument&&(f=b.ownerDocument.getElementById(j))&&h(b,f)&&f.id===j)return c.push(f),c}else{if(e[2])return w.apply(c,x.call(b.getElementsByTagName(a),0)),c;if((j=e[3])&&_&&b.getElementsByClassName)return w.apply(c,x.call(b.getElementsByClassName(j),0)),c}return bp(a.replace(L,"$1"),b,c,d,i)}function bd(a){return function(b){var c=b.nodeName.toLowerCase();return c==="input"&&b.type===a}}function be(a){return function(b){var c=b.nodeName.toLowerCase();return(c==="input"||c==="button")&&b.type===a}}function bf(a){return z(function(b){return b=+b,z(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function bg(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}function bh(a,b){var c,d,f,g,h,i,j,k=C[o][a];if(k)return b?0:k.slice(0);h=a,i=[],j=e.preFilter;while(h){if(!c||(d=M.exec(h)))d&&(h=h.slice(d[0].length)),i.push(f=[]);c=!1;if(d=N.exec(h))f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=d[0].replace(L," ");for(g in e.filter)(d=W[g].exec(h))&&(!j[g]||(d=j[g](d,r,!0)))&&(f.push(c=new q(d.shift())),h=h.slice(c.length),c.type=g,c.matches=d);if(!c)break}return b?h.length:h?bc.error(a):C(a,i).slice(0)}function bi(a,b,d){var e=b.dir,f=d&&b.dir==="parentNode",g=u++;return b.first?function(b,c,d){while(b=b[e])if(f||b.nodeType===1)return a(b,c,d)}:function(b,d,h){if(!h){var i,j=t+" "+g+" ",k=j+c;while(b=b[e])if(f||b.nodeType===1){if((i=b[o])===k)return b.sizset;if(typeof i=="string"&&i.indexOf(j)===0){if(b.sizset)return b}else{b[o]=k;if(a(b,d,h))return b.sizset=!0,b;b.sizset=!1}}}else while(b=b[e])if(f||b.nodeType===1)if(a(b,d,h))return b}}function bj(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function bk(a,b,c,d,e){var f,g=[],h=0,i=a.length,j=b!=null;for(;h<i;h++)if(f=a[h])if(!c||c(f,d,e))g.push(f),j&&b.push(h);return g}function bl(a,b,c,d,e,f){return d&&!d[o]&&(d=bl(d)),e&&!e[o]&&(e=bl(e,f)),z(function(f,g,h,i){if(f&&e)return;var j,k,l,m=[],n=[],o=g.length,p=f||bo(b||"*",h.nodeType?[h]:h,[],f),q=a&&(f||!b)?bk(p,m,a,h,i):p,r=c?e||(f?a:o||d)?[]:g:q;c&&c(q,r,h,i);if(d){l=bk(r,n),d(l,[],h,i),j=l.length;while(j--)if(k=l[j])r[n[j]]=!(q[n[j]]=k)}if(f){j=a&&r.length;while(j--)if(k=r[j])f[m[j]]=!(g[m[j]]=k)}else r=bk(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):w.apply(g,r)})}function bm(a){var b,c,d,f=a.length,g=e.relative[a[0].type],h=g||e.relative[" "],i=g?1:0,j=bi(function(a){return a===b},h,!0),k=bi(function(a){return y.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==l)||((b=c).nodeType?j(a,c,d):k(a,c,d))}];for(;i<f;i++)if(c=e.relative[a[i].type])m=[bi(bj(m),c)];else{c=e.filter[a[i].type].apply(null,a[i].matches);if(c[o]){d=++i;for(;d<f;d++)if(e.relative[a[d].type])break;return bl(i>1&&bj(m),i>1&&a.slice(0,i-1).join("").replace(L,"$1"),c,i<d&&bm(a.slice(i,d)),d<f&&bm(a=a.slice(d)),d<f&&a.join(""))}m.push(c)}return bj(m)}function bn(a,b){var d=b.length>0,f=a.length>0,g=function(h,i,j,k,m){var n,o,p,q=[],s=0,u="0",x=h&&[],y=m!=null,z=l,A=h||f&&e.find.TAG("*",m&&i.parentNode||i),B=t+=z==null?1:Math.E;y&&(l=i!==r&&i,c=g.el);for(;(n=A[u])!=null;u++){if(f&&n){for(o=0;p=a[o];o++)if(p(n,i,j)){k.push(n);break}y&&(t=B,c=++g.el)}d&&((n=!p&&n)&&s--,h&&x.push(n))}s+=u;if(d&&u!==s){for(o=0;p=b[o];o++)p(x,q,i,j);if(h){if(s>0)while(u--)!x[u]&&!q[u]&&(q[u]=v.call(k));q=bk(q)}w.apply(k,q),y&&!h&&q.length>0&&s+b.length>1&&bc.uniqueSort(k)}return y&&(t=B,l=z),x};return g.el=0,d?z(g):g}function bo(a,b,c,d){var e=0,f=b.length;for(;e<f;e++)bc(a,b[e],c,d);return c}function bp(a,b,c,d,f){var g,h,j,k,l,m=bh(a),n=m.length;if(!d&&m.length===1){h=m[0]=m[0].slice(0);if(h.length>2&&(j=h[0]).type==="ID"&&b.nodeType===9&&!f&&e.relative[h[1].type]){b=e.find.ID(j.matches[0].replace(V,""),b,f)[0];if(!b)return c;a=a.slice(h.shift().length)}for(g=W.POS.test(a)?-1:h.length-1;g>=0;g--){j=h[g];if(e.relative[k=j.type])break;if(l=e.find[k])if(d=l(j.matches[0].replace(V,""),R.test(h[0].type)&&b.parentNode||b,f)){h.splice(g,1),a=d.length&&h.join("");if(!a)return w.apply(c,x.call(d,0)),c;break}}}return i(a,m)(d,b,f,c,R.test(a)),c}function bq(){}var c,d,e,f,g,h,i,j,k,l,m=!0,n="undefined",o=("sizcache"+Math.random()).replace(".",""),q=String,r=a.document,s=r.documentElement,t=0,u=0,v=[].pop,w=[].push,x=[].slice,y=[].indexOf||function(a){var b=0,c=this.length;for(;b<c;b++)if(this[b]===a)return b;return-1},z=function(a,b){return a[o]=b==null||b,a},A=function(){var a={},b=[];return z(function(c,d){return b.push(c)>e.cacheLength&&delete a[b.shift()],a[c]=d},a)},B=A(),C=A(),D=A(),E="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",G=F.replace("w","w#"),H="([*^$|!~]?=)",I="\\["+E+"*("+F+")"+E+"*(?:"+H+E+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+G+")|)|)"+E+"*\\]",J=":("+F+")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:"+I+")|[^:]|\\\\.)*|.*))\\)|)",K=":(even|odd|eq|gt|lt|nth|first|last)(?:\\("+E+"*((?:-\\d)?\\d*)"+E+"*\\)|)(?=[^-]|$)",L=new RegExp("^"+E+"+|((?:^|[^\\\\])(?:\\\\.)*)"+E+"+$","g"),M=new RegExp("^"+E+"*,"+E+"*"),N=new RegExp("^"+E+"*([\\x20\\t\\r\\n\\f>+~])"+E+"*"),O=new RegExp(J),P=/^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,Q=/^:not/,R=/[\x20\t\r\n\f]*[+~]/,S=/:not\($/,T=/h\d/i,U=/input|select|textarea|button/i,V=/\\(?!\\)/g,W={ID:new RegExp("^#("+F+")"),CLASS:new RegExp("^\\.("+F+")"),NAME:new RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:new RegExp("^("+F.replace("w","w*")+")"),ATTR:new RegExp("^"+I),PSEUDO:new RegExp("^"+J),POS:new RegExp(K,"i"),CHILD:new RegExp("^:(only|nth|first|last)-child(?:\\("+E+"*(even|odd|(([+-]|)(\\d*)n|)"+E+"*(?:([+-]|)"+E+"*(\\d+)|))"+E+"*\\)|)","i"),needsContext:new RegExp("^"+E+"*[>+~]|"+K,"i")},X=function(a){var b=r.createElement("div");try{return a(b)}catch(c){return!1}finally{b=null}},Y=X(function(a){return a.appendChild(r.createComment("")),!a.getElementsByTagName("*").length}),Z=X(function(a){return a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!==n&&a.firstChild.getAttribute("href")==="#"}),$=X(function(a){a.innerHTML="<select></select>";var b=typeof a.lastChild.getAttribute("multiple");return b!=="boolean"&&b!=="string"}),_=X(function(a){return a.innerHTML="<div class='hidden e'></div><div class='hidden'></div>",!a.getElementsByClassName||!a.getElementsByClassName("e").length?!1:(a.lastChild.className="e",a.getElementsByClassName("e").length===2)}),ba=X(function(a){a.id=o+0,a.innerHTML="<a name='"+o+"'></a><div name='"+o+"'></div>",s.insertBefore(a,s.firstChild);var b=r.getElementsByName&&r.getElementsByName(o).length===2+r.getElementsByName(o+0).length;return d=!r.getElementById(o),s.removeChild(a),b});try{x.call(s.childNodes,0)[0].nodeType}catch(bb){x=function(a){var b,c=[];for(;b=this[a];a++)c.push(b);return c}}bc.matches=function(a,b){return bc(a,null,null,b)},bc.matchesSelector=function(a,b){return bc(b,null,null,[a]).length>0},f=bc.getText=function(a){var b,c="",d=0,e=a.nodeType;if(e){if(e===1||e===9||e===11){if(typeof a.textContent=="string")return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=f(a)}else if(e===3||e===4)return a.nodeValue}else for(;b=a[d];d++)c+=f(b);return c},g=bc.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?b.nodeName!=="HTML":!1},h=bc.contains=s.contains?function(a,b){var c=a.nodeType===9?a.documentElement:a,d=b&&b.parentNode;return a===d||!!(d&&d.nodeType===1&&c.contains&&c.contains(d))}:s.compareDocumentPosition?function(a,b){return b&&!!(a.compareDocumentPosition(b)&16)}:function(a,b){while(b=b.parentNode)if(b===a)return!0;return!1},bc.attr=function(a,b){var c,d=g(a);return d||(b=b.toLowerCase()),(c=e.attrHandle[b])?c(a):d||$?a.getAttribute(b):(c=a.getAttributeNode(b),c?typeof a[b]=="boolean"?a[b]?b:null:c.specified?c.value:null:null)},e=bc.selectors={cacheLength:50,createPseudo:z,match:W,attrHandle:Z?{}:{href:function(a){return a.getAttribute("href",2)},type:function(a){return a.getAttribute("type")}},find:{ID:d?function(a,b,c){if(typeof b.getElementById!==n&&!c){var d=b.getElementById(a);return d&&d.parentNode?[d]:[]}}:function(a,c,d){if(typeof c.getElementById!==n&&!d){var e=c.getElementById(a);return e?e.id===a||typeof e.getAttributeNode!==n&&e.getAttributeNode("id").value===a?[e]:b:[]}},TAG:Y?function(a,b){if(typeof b.getElementsByTagName!==n)return b.getElementsByTagName(a)}:function(a,b){var c=b.getElementsByTagName(a);if(a==="*"){var d,e=[],f=0;for(;d=c[f];f++)d.nodeType===1&&e.push(d);return e}return c},NAME:ba&&function(a,b){if(typeof b.getElementsByName!==n)return b.getElementsByName(name)},CLASS:_&&function(a,b,c){if(typeof b.getElementsByClassName!==n&&!c)return b.getElementsByClassName(a)}},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(V,""),a[3]=(a[4]||a[5]||"").replace(V,""),a[2]==="~="&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),a[1]==="nth"?(a[2]||bc.error(a[0]),a[3]=+(a[3]?a[4]+(a[5]||1):2*(a[2]==="even"||a[2]==="odd")),a[4]=+(a[6]+a[7]||a[2]==="odd")):a[2]&&bc.error(a[0]),a},PSEUDO:function(a){var b,c;if(W.CHILD.test(a[0]))return null;if(a[3])a[2]=a[3];else if(b=a[4])O.test(b)&&(c=bh(b,!0))&&(c=b.indexOf(")",b.length-c)-b.length)&&(b=b.slice(0,c),a[0]=a[0].slice(0,c)),a[2]=b;return a.slice(0,3)}},filter:{ID:d?function(a){return a=a.replace(V,""),function(b){return b.getAttribute("id")===a}}:function(a){return a=a.replace(V,""),function(b){var c=typeof b.getAttributeNode!==n&&b.getAttributeNode("id");return c&&c.value===a}},TAG:function(a){return a==="*"?function(){return!0}:(a=a.replace(V,"").toLowerCase(),function(b){return b.nodeName&&b.nodeName.toLowerCase()===a})},CLASS:function(a){var b=B[o][a];return b||(b=B(a,new RegExp("(^|"+E+")"+a+"("+E+"|$)"))),function(a){return b.test(a.className||typeof a.getAttribute!==n&&a.getAttribute("class")||"")}},ATTR:function(a,b,c){return function(d,e){var f=bc.attr(d,a);return f==null?b==="!=":b?(f+="",b==="="?f===c:b==="!="?f!==c:b==="^="?c&&f.indexOf(c)===0:b==="*="?c&&f.indexOf(c)>-1:b==="$="?c&&f.substr(f.length-c.length)===c:b==="~="?(" "+f+" ").indexOf(c)>-1:b==="|="?f===c||f.substr(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d){return a==="nth"?function(a){var b,e,f=a.parentNode;if(c===1&&d===0)return!0;if(f){e=0;for(b=f.firstChild;b;b=b.nextSibling)if(b.nodeType===1){e++;if(a===b)break}}return e-=d,e===c||e%c===0&&e/c>=0}:function(b){var c=b;switch(a){case"only":case"first":while(c=c.previousSibling)if(c.nodeType===1)return!1;if(a==="first")return!0;c=b;case"last":while(c=c.nextSibling)if(c.nodeType===1)return!1;return!0}}},PSEUDO:function(a,b){var c,d=e.pseudos[a]||e.setFilters[a.toLowerCase()]||bc.error("unsupported pseudo: "+a);return d[o]?d(b):d.length>1?(c=[a,a,"",b],e.setFilters.hasOwnProperty(a.toLowerCase())?z(function(a,c){var e,f=d(a,b),g=f.length;while(g--)e=y.call(a,f[g]),a[e]=!(c[e]=f[g])}):function(a){return d(a,0,c)}):d}},pseudos:{not:z(function(a){var b=[],c=[],d=i(a.replace(L,"$1"));return d[o]?z(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)if(f=g[h])a[h]=!(b[h]=f)}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:z(function(a){return function(b){return bc(a,b).length>0}}),contains:z(function(a){return function(b){return(b.textContent||b.innerText||f(b)).indexOf(a)>-1}}),enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&!!a.checked||b==="option"&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},parent:function(a){return!e.pseudos.empty(a)},empty:function(a){var b;a=a.firstChild;while(a){if(a.nodeName>"@"||(b=a.nodeType)===3||b===4)return!1;a=a.nextSibling}return!0},header:function(a){return T.test(a.nodeName)},text:function(a){var b,c;return a.nodeName.toLowerCase()==="input"&&(b=a.type)==="text"&&((c=a.getAttribute("type"))==null||c.toLowerCase()===b)},radio:bd("radio"),checkbox:bd("checkbox"),file:bd("file"),password:bd("password"),image:bd("image"),submit:be("submit"),reset:be("reset"),button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&a.type==="button"||b==="button"},input:function(a){return U.test(a.nodeName)},focus:function(a){var b=a.ownerDocument;return a===b.activeElement&&(!b.hasFocus||b.hasFocus())&&(!!a.type||!!a.href)},active:function(a){return a===a.ownerDocument.activeElement},first:bf(function(a,b,c){return[0]}),last:bf(function(a,b,c){return[b-1]}),eq:bf(function(a,b,c){return[c<0?c+b:c]}),even:bf(function(a,b,c){for(var d=0;d<b;d+=2)a.push(d);return a}),odd:bf(function(a,b,c){for(var d=1;d<b;d+=2)a.push(d);return a}),lt:bf(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:bf(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},j=s.compareDocumentPosition?function(a,b){return a===b?(k=!0,0):(!a.compareDocumentPosition||!b.compareDocumentPosition?a.compareDocumentPosition:a.compareDocumentPosition(b)&4)?-1:1}:function(a,b){if(a===b)return k=!0,0;if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],g=a.parentNode,h=b.parentNode,i=g;if(g===h)return bg(a,b);if(!g)return-1;if(!h)return 1;while(i)e.unshift(i),i=i.parentNode;i=h;while(i)f.unshift(i),i=i.parentNode;c=e.length,d=f.length;for(var j=0;j<c&&j<d;j++)if(e[j]!==f[j])return bg(e[j],f[j]);return j===c?bg(a,f[j],-1):bg(e[j],b,1)},[0,0].sort(j),m=!k,bc.uniqueSort=function(a){var b,c=1;k=m,a.sort(j);if(k)for(;b=a[c];c++)b===a[c-1]&&a.splice(c--,1);return a},bc.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},i=bc.compile=function(a,b){var c,d=[],e=[],f=D[o][a];if(!f){b||(b=bh(a)),c=b.length;while(c--)f=bm(b[c]),f[o]?d.push(f):e.push(f);f=D(a,bn(e,d))}return f},r.querySelectorAll&&function(){var a,b=bp,c=/'|\\/g,d=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,e=[":focus"],f=[":active",":focus"],h=s.matchesSelector||s.mozMatchesSelector||s.webkitMatchesSelector||s.oMatchesSelector||s.msMatchesSelector;X(function(a){a.innerHTML="<select><option selected=''></option></select>",a.querySelectorAll("[selected]").length||e.push("\\["+E+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),a.querySelectorAll(":checked").length||e.push(":checked")}),X(function(a){a.innerHTML="<p test=''></p>",a.querySelectorAll("[test^='']").length&&e.push("[*^$]="+E+"*(?:\"\"|'')"),a.innerHTML="<input type='hidden'/>",a.querySelectorAll(":enabled").length||e.push(":enabled",":disabled")}),e=new RegExp(e.join("|")),bp=function(a,d,f,g,h){if(!g&&!h&&(!e||!e.test(a))){var i,j,k=!0,l=o,m=d,n=d.nodeType===9&&a;if(d.nodeType===1&&d.nodeName.toLowerCase()!=="object"){i=bh(a),(k=d.getAttribute("id"))?l=k.replace(c,"\\$&"):d.setAttribute("id",l),l="[id='"+l+"'] ",j=i.length;while(j--)i[j]=l+i[j].join("");m=R.test(a)&&d.parentNode||d,n=i.join(",")}if(n)try{return w.apply(f,x.call(m.querySelectorAll(n),0)),f}catch(p){}finally{k||d.removeAttribute("id")}}return b(a,d,f,g,h)},h&&(X(function(b){a=h.call(b,"div");try{h.call(b,"[test!='']:sizzle"),f.push("!=",J)}catch(c){}}),f=new RegExp(f.join("|")),bc.matchesSelector=function(b,c){c=c.replace(d,"='$1']");if(!g(b)&&!f.test(c)&&(!e||!e.test(c)))try{var i=h.call(b,c);if(i||a||b.document&&b.document.nodeType!==11)return i}catch(j){}return bc(c,null,null,[b]).length>0})}(),e.pseudos.nth=e.pseudos.eq,e.filters=bq.prototype=e.pseudos,e.setFilters=new bq,bc.attr=p.attr,p.find=bc,p.expr=bc.selectors,p.expr[":"]=p.expr.pseudos,p.unique=bc.uniqueSort,p.text=bc.getText,p.isXMLDoc=bc.isXML,p.contains=bc.contains}(a);var bc=/Until$/,bd=/^(?:parents|prev(?:Until|All))/,be=/^.[^:#\[\.,]*$/,bf=p.expr.match.needsContext,bg={children:!0,contents:!0,next:!0,prev:!0};p.fn.extend({find:function(a){var b,c,d,e,f,g,h=this;if(typeof a!="string")return p(a).filter(function(){for(b=0,c=h.length;b<c;b++)if(p.contains(h[b],this))return!0});g=this.pushStack("","find",a);for(b=0,c=this.length;b<c;b++){d=g.length,p.find(a,this[b],g);if(b>0)for(e=d;e<g.length;e++)for(f=0;f<d;f++)if(g[f]===g[e]){g.splice(e--,1);break}}return g},has:function(a){var b,c=p(a,this),d=c.length;return this.filter(function(){for(b=0;b<d;b++)if(p.contains(this,c[b]))return!0})},not:function(a){return this.pushStack(bj(this,a,!1),"not",a)},filter:function(a){return this.pushStack(bj(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?bf.test(a)?p(a,this.context).index(this[0])>=0:p.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c,d=0,e=this.length,f=[],g=bf.test(a)||typeof a!="string"?p(a,b||this.context):0;for(;d<e;d++){c=this[d];while(c&&c.ownerDocument&&c!==b&&c.nodeType!==11){if(g?g.index(c)>-1:p.find.matchesSelector(c,a)){f.push(c);break}c=c.parentNode}}return f=f.length>1?p.unique(f):f,this.pushStack(f,"closest",a)},index:function(a){return a?typeof a=="string"?p.inArray(this[0],p(a)):p.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.prevAll().length:-1},add:function(a,b){var c=typeof a=="string"?p(a,b):p.makeArray(a&&a.nodeType?[a]:a),d=p.merge(this.get(),c);return this.pushStack(bh(c[0])||bh(d[0])?d:p.unique(d))},addBack:function(a){return this.add(a==null?this.prevObject:this.prevObject.filter(a))}}),p.fn.andSelf=p.fn.addBack,p.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return p.dir(a,"parentNode")},parentsUntil:function(a,b,c){return p.dir(a,"parentNode",c)},next:function(a){return bi(a,"nextSibling")},prev:function(a){return bi(a,"previousSibling")},nextAll:function(a){return p.dir(a,"nextSibling")},prevAll:function(a){return p.dir(a,"previousSibling")},nextUntil:function(a,b,c){return p.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return p.dir(a,"previousSibling",c)},siblings:function(a){return p.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return p.sibling(a.firstChild)},contents:function(a){return p.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:p.merge([],a.childNodes)}},function(a,b){p.fn[a]=function(c,d){var e=p.map(this,b,c);return bc.test(a)||(d=c),d&&typeof d=="string"&&(e=p.filter(d,e)),e=this.length>1&&!bg[a]?p.unique(e):e,this.length>1&&bd.test(a)&&(e=e.reverse()),this.pushStack(e,a,k.call(arguments).join(","))}}),p.extend({filter:function(a,b,c){return c&&(a=":not("+a+")"),b.length===1?p.find.matchesSelector(b[0],a)?[b[0]]:[]:p.find.matches(a,b)},dir:function(a,c,d){var e=[],f=a[c];while(f&&f.nodeType!==9&&(d===b||f.nodeType!==1||!p(f).is(d)))f.nodeType===1&&e.push(f),f=f[c];return e},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var bl="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",bm=/ jQuery\d+="(?:null|\d+)"/g,bn=/^\s+/,bo=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bp=/<([\w:]+)/,bq=/<tbody/i,br=/<|&#?\w+;/,bs=/<(?:script|style|link)/i,bt=/<(?:script|object|embed|option|style)/i,bu=new RegExp("<(?:"+bl+")[\\s/>]","i"),bv=/^(?:checkbox|radio)$/,bw=/checked\s*(?:[^=]|=\s*.checked.)/i,bx=/\/(java|ecma)script/i,by=/^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,bz={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]},bA=bk(e),bB=bA.appendChild(e.createElement("div"));bz.optgroup=bz.option,bz.tbody=bz.tfoot=bz.colgroup=bz.caption=bz.thead,bz.th=bz.td,p.support.htmlSerialize||(bz._default=[1,"X<div>","</div>"]),p.fn.extend({text:function(a){return p.access(this,function(a){return a===b?p.text(this):this.empty().append((this[0]&&this[0].ownerDocument||e).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(p.isFunction(a))return this.each(function(b){p(this).wrapAll(a.call(this,b))});if(this[0]){var b=p(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){return p.isFunction(a)?this.each(function(b){p(this).wrapInner(a.call(this,b))}):this.each(function(){var b=p(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=p.isFunction(a);return this.each(function(c){p(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){p.nodeName(this,"body")||p(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){(this.nodeType===1||this.nodeType===11)&&this.insertBefore(a,this.firstChild)})},before:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(a,this),"before",this.selector)}},after:function(){if(!bh(this[0]))return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=p.clean(arguments);return this.pushStack(p.merge(this,a),"after",this.selector)}},remove:function(a,b){var c,d=0;for(;(c=this[d])!=null;d++)if(!a||p.filter(a,[c]).length)!b&&c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),p.cleanData([c])),c.parentNode&&c.parentNode.removeChild(c);return this},empty:function(){var a,b=0;for(;(a=this[b])!=null;b++){a.nodeType===1&&p.cleanData(a.getElementsByTagName("*"));while(a.firstChild)a.removeChild(a.firstChild)}return this},clone:function(a,b){return a=a==null?!1:a,b=b==null?a:b,this.map(function(){return p.clone(this,a,b)})},html:function(a){return p.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(bm,""):b;if(typeof a=="string"&&!bs.test(a)&&(p.support.htmlSerialize||!bu.test(a))&&(p.support.leadingWhitespace||!bn.test(a))&&!bz[(bp.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(bo,"<$1></$2>");try{for(;d<e;d++)c=this[d]||{},c.nodeType===1&&(p.cleanData(c.getElementsByTagName("*")),c.innerHTML=a);c=0}catch(f){}}c&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(a){return bh(this[0])?this.length?this.pushStack(p(p.isFunction(a)?a():a),"replaceWith",a):this:p.isFunction(a)?this.each(function(b){var c=p(this),d=c.html();c.replaceWith(a.call(this,b,d))}):(typeof a!="string"&&(a=p(a).detach()),this.each(function(){var b=this.nextSibling,c=this.parentNode;p(this).remove(),b?p(b).before(a):p(c).append(a)}))},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){a=[].concat.apply([],a);var e,f,g,h,i=0,j=a[0],k=[],l=this.length;if(!p.support.checkClone&&l>1&&typeof j=="string"&&bw.test(j))return this.each(function(){p(this).domManip(a,c,d)});if(p.isFunction(j))return this.each(function(e){var f=p(this);a[0]=j.call(this,e,c?f.html():b),f.domManip(a,c,d)});if(this[0]){e=p.buildFragment(a,this,k),g=e.fragment,f=g.firstChild,g.childNodes.length===1&&(g=f);if(f){c=c&&p.nodeName(f,"tr");for(h=e.cacheable||l-1;i<l;i++)d.call(c&&p.nodeName(this[i],"table")?bC(this[i],"tbody"):this[i],i===h?g:p.clone(g,!0,!0))}g=f=null,k.length&&p.each(k,function(a,b){b.src?p.ajax?p.ajax({url:b.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):p.error("no ajax"):p.globalEval((b.text||b.textContent||b.innerHTML||"").replace(by,"")),b.parentNode&&b.parentNode.removeChild(b)})}return this}}),p.buildFragment=function(a,c,d){var f,g,h,i=a[0];return c=c||e,c=!c.nodeType&&c[0]||c,c=c.ownerDocument||c,a.length===1&&typeof i=="string"&&i.length<512&&c===e&&i.charAt(0)==="<"&&!bt.test(i)&&(p.support.checkClone||!bw.test(i))&&(p.support.html5Clone||!bu.test(i))&&(g=!0,f=p.fragments[i],h=f!==b),f||(f=c.createDocumentFragment(),p.clean(a,c,f,d),g&&(p.fragments[i]=h&&f)),{fragment:f,cacheable:g}},p.fragments={},p.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){p.fn[a]=function(c){var d,e=0,f=[],g=p(c),h=g.length,i=this.length===1&&this[0].parentNode;if((i==null||i&&i.nodeType===11&&i.childNodes.length===1)&&h===1)return g[b](this[0]),this;for(;e<h;e++)d=(e>0?this.clone(!0):this).get(),p(g[e])[b](d),f=f.concat(d);return this.pushStack(f,a,g.selector)}}),p.extend({clone:function(a,b,c){var d,e,f,g;p.support.html5Clone||p.isXMLDoc(a)||!bu.test("<"+a.nodeName+">")?g=a.cloneNode(!0):(bB.innerHTML=a.outerHTML,bB.removeChild(g=bB.firstChild));if((!p.support.noCloneEvent||!p.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!p.isXMLDoc(a)){bE(a,g),d=bF(a),e=bF(g);for(f=0;d[f];++f)e[f]&&bE(d[f],e[f])}if(b){bD(a,g);if(c){d=bF(a),e=bF(g);for(f=0;d[f];++f)bD(d[f],e[f])}}return d=e=null,g},clean:function(a,b,c,d){var f,g,h,i,j,k,l,m,n,o,q,r,s=b===e&&bA,t=[];if(!b||typeof b.createDocumentFragment=="undefined")b=e;for(f=0;(h=a[f])!=null;f++){typeof h=="number"&&(h+="");if(!h)continue;if(typeof h=="string")if(!br.test(h))h=b.createTextNode(h);else{s=s||bk(b),l=b.createElement("div"),s.appendChild(l),h=h.replace(bo,"<$1></$2>"),i=(bp.exec(h)||["",""])[1].toLowerCase(),j=bz[i]||bz._default,k=j[0],l.innerHTML=j[1]+h+j[2];while(k--)l=l.lastChild;if(!p.support.tbody){m=bq.test(h),n=i==="table"&&!m?l.firstChild&&l.firstChild.childNodes:j[1]==="<table>"&&!m?l.childNodes:[];for(g=n.length-1;g>=0;--g)p.nodeName(n[g],"tbody")&&!n[g].childNodes.length&&n[g].parentNode.removeChild(n[g])}!p.support.leadingWhitespace&&bn.test(h)&&l.insertBefore(b.createTextNode(bn.exec(h)[0]),l.firstChild),h=l.childNodes,l.parentNode.removeChild(l)}h.nodeType?t.push(h):p.merge(t,h)}l&&(h=l=s=null);if(!p.support.appendChecked)for(f=0;(h=t[f])!=null;f++)p.nodeName(h,"input")?bG(h):typeof h.getElementsByTagName!="undefined"&&p.grep(h.getElementsByTagName("input"),bG);if(c){q=function(a){if(!a.type||bx.test(a.type))return d?d.push(a.parentNode?a.parentNode.removeChild(a):a):c.appendChild(a)};for(f=0;(h=t[f])!=null;f++)if(!p.nodeName(h,"script")||!q(h))c.appendChild(h),typeof h.getElementsByTagName!="undefined"&&(r=p.grep(p.merge([],h.getElementsByTagName("script")),q),t.splice.apply(t,[f+1,0].concat(r)),f+=r.length)}return t},cleanData:function(a,b){var c,d,e,f,g=0,h=p.expando,i=p.cache,j=p.support.deleteExpando,k=p.event.special;for(;(e=a[g])!=null;g++)if(b||p.acceptData(e)){d=e[h],c=d&&i[d];if(c){if(c.events)for(f in c.events)k[f]?p.event.remove(e,f):p.removeEvent(e,f,c.handle);i[d]&&(delete i[d],j?delete e[h]:e.removeAttribute?e.removeAttribute(h):e[h]=null,p.deletedIds.push(d))}}}}),function(){var a,b;p.uaMatch=function(a){a=a.toLowerCase();var b=/(chrome)[ \/]([\w.]+)/.exec(a)||/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||a.indexOf("compatible")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},a=p.uaMatch(g.userAgent),b={},a.browser&&(b[a.browser]=!0,b.version=a.version),b.chrome?b.webkit=!0:b.webkit&&(b.safari=!0),p.browser=b,p.sub=function(){function a(b,c){return new a.fn.init(b,c)}p.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function c(c,d){return d&&d instanceof p&&!(d instanceof a)&&(d=a(d)),p.fn.init.call(this,c,d,b)},a.fn.init.prototype=a.fn;var b=a(e);return a}}();var bH,bI,bJ,bK=/alpha\([^)]*\)/i,bL=/opacity=([^)]*)/,bM=/^(top|right|bottom|left)$/,bN=/^(none|table(?!-c[ea]).+)/,bO=/^margin/,bP=new RegExp("^("+q+")(.*)$","i"),bQ=new RegExp("^("+q+")(?!px)[a-z%]+$","i"),bR=new RegExp("^([-+])=("+q+")","i"),bS={},bT={position:"absolute",visibility:"hidden",display:"block"},bU={letterSpacing:0,fontWeight:400},bV=["Top","Right","Bottom","Left"],bW=["Webkit","O","Moz","ms"],bX=p.fn.toggle;p.fn.extend({css:function(a,c){return p.access(this,function(a,c,d){return d!==b?p.style(a,c,d):p.css(a,c)},a,c,arguments.length>1)},show:function(){return b$(this,!0)},hide:function(){return b$(this)},toggle:function(a,b){var c=typeof a=="boolean";return p.isFunction(a)&&p.isFunction(b)?bX.apply(this,arguments):this.each(function(){(c?a:bZ(this))?p(this).show():p(this).hide()})}}),p.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bH(a,"opacity");return c===""?"1":c}}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":p.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!a||a.nodeType===3||a.nodeType===8||!a.style)return;var f,g,h,i=p.camelCase(c),j=a.style;c=p.cssProps[i]||(p.cssProps[i]=bY(j,i)),h=p.cssHooks[c]||p.cssHooks[i];if(d===b)return h&&"get"in h&&(f=h.get(a,!1,e))!==b?f:j[c];g=typeof d,g==="string"&&(f=bR.exec(d))&&(d=(f[1]+1)*f[2]+parseFloat(p.css(a,c)),g="number");if(d==null||g==="number"&&isNaN(d))return;g==="number"&&!p.cssNumber[i]&&(d+="px");if(!h||!("set"in h)||(d=h.set(a,d,e))!==b)try{j[c]=d}catch(k){}},css:function(a,c,d,e){var f,g,h,i=p.camelCase(c);return c=p.cssProps[i]||(p.cssProps[i]=bY(a.style,i)),h=p.cssHooks[c]||p.cssHooks[i],h&&"get"in h&&(f=h.get(a,!0,e)),f===b&&(f=bH(a,c)),f==="normal"&&c in bU&&(f=bU[c]),d||e!==b?(g=parseFloat(f),d||p.isNumeric(g)?g||0:f):f},swap:function(a,b,c){var d,e,f={};for(e in b)f[e]=a.style[e],a.style[e]=b[e];d=c.call(a);for(e in b)a.style[e]=f[e];return d}}),a.getComputedStyle?bH=function(b,c){var d,e,f,g,h=a.getComputedStyle(b,null),i=b.style;return h&&(d=h[c],d===""&&!p.contains(b.ownerDocument,b)&&(d=p.style(b,c)),bQ.test(d)&&bO.test(c)&&(e=i.width,f=i.minWidth,g=i.maxWidth,i.minWidth=i.maxWidth=i.width=d,d=h.width,i.width=e,i.minWidth=f,i.maxWidth=g)),d}:e.documentElement.currentStyle&&(bH=function(a,b){var c,d,e=a.currentStyle&&a.currentStyle[b],f=a.style;return e==null&&f&&f[b]&&(e=f[b]),bQ.test(e)&&!bM.test(b)&&(c=f.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":e,e=f.pixelLeft+"px",f.left=c,d&&(a.runtimeStyle.left=d)),e===""?"auto":e}),p.each(["height","width"],function(a,b){p.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth===0&&bN.test(bH(a,"display"))?p.swap(a,bT,function(){return cb(a,b,d)}):cb(a,b,d)},set:function(a,c,d){return b_(a,c,d?ca(a,b,d,p.support.boxSizing&&p.css(a,"boxSizing")==="border-box"):0)}}}),p.support.opacity||(p.cssHooks.opacity={get:function(a,b){return bL.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=p.isNumeric(b)?"alpha(opacity="+b*100+")":"",f=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&p.trim(f.replace(bK,""))===""&&c.removeAttribute){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bK.test(f)?f.replace(bK,e):f+" "+e}}),p(function(){p.support.reliableMarginRight||(p.cssHooks.marginRight={get:function(a,b){return p.swap(a,{display:"inline-block"},function(){if(b)return bH(a,"marginRight")})}}),!p.support.pixelPosition&&p.fn.position&&p.each(["top","left"],function(a,b){p.cssHooks[b]={get:function(a,c){if(c){var d=bH(a,b);return bQ.test(d)?p(a).position()[b]+"px":d}}}})}),p.expr&&p.expr.filters&&(p.expr.filters.hidden=function(a){return a.offsetWidth===0&&a.offsetHeight===0||!p.support.reliableHiddenOffsets&&(a.style&&a.style.display||bH(a,"display"))==="none"},p.expr.filters.visible=function(a){return!p.expr.filters.hidden(a)}),p.each({margin:"",padding:"",border:"Width"},function(a,b){p.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bV[d]+b]=e[d]||e[d-2]||e[0];return f}},bO.test(a)||(p.cssHooks[a+b].set=b_)});var cd=/%20/g,ce=/\[\]$/,cf=/\r?\n/g,cg=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,ch=/^(?:select|textarea)/i;p.fn.extend({serialize:function(){return p.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?p.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ch.test(this.nodeName)||cg.test(this.type))}).map(function(a,b){var c=p(this).val();return c==null?null:p.isArray(c)?p.map(c,function(a,c){return{name:b.name,value:a.replace(cf,"\r\n")}}):{name:b.name,value:c.replace(cf,"\r\n")}}).get()}}),p.param=function(a,c){var d,e=[],f=function(a,b){b=p.isFunction(b)?b():b==null?"":b,e[e.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=p.ajaxSettings&&p.ajaxSettings.traditional);if(p.isArray(a)||a.jquery&&!p.isPlainObject(a))p.each(a,function(){f(this.name,this.value)});else for(d in a)ci(d,a[d],c,f);return e.join("&").replace(cd,"+")};var cj,ck,cl=/#.*$/,cm=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,cn=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,co=/^(?:GET|HEAD)$/,cp=/^\/\//,cq=/\?/,cr=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,cs=/([?&])_=[^&]*/,ct=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,cu=p.fn.load,cv={},cw={},cx=["*/"]+["*"];try{ck=f.href}catch(cy){ck=e.createElement("a"),ck.href="",ck=ck.href}cj=ct.exec(ck.toLowerCase())||[],p.fn.load=function(a,c,d){if(typeof a!="string"&&cu)return cu.apply(this,arguments);if(!this.length)return this;var e,f,g,h=this,i=a.indexOf(" ");return i>=0&&(e=a.slice(i,a.length),a=a.slice(0,i)),p.isFunction(c)?(d=c,c=b):c&&typeof c=="object"&&(f="POST"),p.ajax({url:a,type:f,dataType:"html",data:c,complete:function(a,b){d&&h.each(d,g||[a.responseText,b,a])}}).done(function(a){g=arguments,h.html(e?p("<div>").append(a.replace(cr,"")).find(e):a)}),this},p.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){p.fn[b]=function(a){return this.on(b,a)}}),p.each(["get","post"],function(a,c){p[c]=function(a,d,e,f){return p.isFunction(d)&&(f=f||e,e=d,d=b),p.ajax({type:c,url:a,data:d,success:e,dataType:f})}}),p.extend({getScript:function(a,c){return p.get(a,b,c,"script")},getJSON:function(a,b,c){return p.get(a,b,c,"json")},ajaxSetup:function(a,b){return b?cB(a,p.ajaxSettings):(b=a,a=p.ajaxSettings),cB(a,b),a},ajaxSettings:{url:ck,isLocal:cn.test(cj[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":cx},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":p.parseJSON,"text xml":p.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:cz(cv),ajaxTransport:cz(cw),ajax:function(a,c){function y(a,c,f,i){var k,s,t,u,w,y=c;if(v===2)return;v=2,h&&clearTimeout(h),g=b,e=i||"",x.readyState=a>0?4:0,f&&(u=cC(l,x,f));if(a>=200&&a<300||a===304)l.ifModified&&(w=x.getResponseHeader("Last-Modified"),w&&(p.lastModified[d]=w),w=x.getResponseHeader("Etag"),w&&(p.etag[d]=w)),a===304?(y="notmodified",k=!0):(k=cD(l,u),y=k.state,s=k.data,t=k.error,k=!t);else{t=y;if(!y||a)y="error",a<0&&(a=0)}x.status=a,x.statusText=(c||y)+"",k?o.resolveWith(m,[s,y,x]):o.rejectWith(m,[x,y,t]),x.statusCode(r),r=b,j&&n.trigger("ajax"+(k?"Success":"Error"),[x,l,k?s:t]),q.fireWith(m,[x,y]),j&&(n.trigger("ajaxComplete",[x,l]),--p.active||p.event.trigger("ajaxStop"))}typeof a=="object"&&(c=a,a=b),c=c||{};var d,e,f,g,h,i,j,k,l=p.ajaxSetup({},c),m=l.context||l,n=m!==l&&(m.nodeType||m instanceof p)?p(m):p.event,o=p.Deferred(),q=p.Callbacks("once memory"),r=l.statusCode||{},t={},u={},v=0,w="canceled",x={readyState:0,setRequestHeader:function(a,b){if(!v){var c=a.toLowerCase();a=u[c]=u[c]||a,t[a]=b}return this},getAllResponseHeaders:function(){return v===2?e:null},getResponseHeader:function(a){var c;if(v===2){if(!f){f={};while(c=cm.exec(e))f[c[1].toLowerCase()]=c[2]}c=f[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){return v||(l.mimeType=a),this},abort:function(a){return a=a||w,g&&g.abort(a),y(0,a),this}};o.promise(x),x.success=x.done,x.error=x.fail,x.complete=q.add,x.statusCode=function(a){if(a){var b;if(v<2)for(b in a)r[b]=[r[b],a[b]];else b=a[x.status],x.always(b)}return this},l.url=((a||l.url)+"").replace(cl,"").replace(cp,cj[1]+"//"),l.dataTypes=p.trim(l.dataType||"*").toLowerCase().split(s),l.crossDomain==null&&(i=ct.exec(l.url.toLowerCase())||!1,l.crossDomain=i&&i.join(":")+(i[3]?"":i[1]==="http:"?80:443)!==cj.join(":")+(cj[3]?"":cj[1]==="http:"?80:443)),l.data&&l.processData&&typeof l.data!="string"&&(l.data=p.param(l.data,l.traditional)),cA(cv,l,c,x);if(v===2)return x;j=l.global,l.type=l.type.toUpperCase(),l.hasContent=!co.test(l.type),j&&p.active++===0&&p.event.trigger("ajaxStart");if(!l.hasContent){l.data&&(l.url+=(cq.test(l.url)?"&":"?")+l.data,delete l.data),d=l.url;if(l.cache===!1){var z=p.now(),A=l.url.replace(cs,"$1_="+z);l.url=A+(A===l.url?(cq.test(l.url)?"&":"?")+"_="+z:"")}}(l.data&&l.hasContent&&l.contentType!==!1||c.contentType)&&x.setRequestHeader("Content-Type",l.contentType),l.ifModified&&(d=d||l.url,p.lastModified[d]&&x.setRequestHeader("If-Modified-Since",p.lastModified[d]),p.etag[d]&&x.setRequestHeader("If-None-Match",p.etag[d])),x.setRequestHeader("Accept",l.dataTypes[0]&&l.accepts[l.dataTypes[0]]?l.accepts[l.dataTypes[0]]+(l.dataTypes[0]!=="*"?", "+cx+"; q=0.01":""):l.accepts["*"]);for(k in l.headers)x.setRequestHeader(k,l.headers[k]);if(!l.beforeSend||l.beforeSend.call(m,x,l)!==!1&&v!==2){w="abort";for(k in{success:1,error:1,complete:1})x[k](l[k]);g=cA(cw,l,c,x);if(!g)y(-1,"No Transport");else{x.readyState=1,j&&n.trigger("ajaxSend",[x,l]),l.async&&l.timeout>0&&(h=setTimeout(function(){x.abort("timeout")},l.timeout));try{v=1,g.send(t,y)}catch(B){if(v<2)y(-1,B);else throw B}}return x}return x.abort()},active:0,lastModified:{},etag:{}});var cE=[],cF=/\?/,cG=/(=)\?(?=&|$)|\?\?/,cH=p.now();p.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=cE.pop()||p.expando+"_"+cH++;return this[a]=!0,a}}),p.ajaxPrefilter("json jsonp",function(c,d,e){var f,g,h,i=c.data,j=c.url,k=c.jsonp!==!1,l=k&&cG.test(j),m=k&&!l&&typeof i=="string"&&!(c.contentType||"").indexOf("application/x-www-form-urlencoded")&&cG.test(i);if(c.dataTypes[0]==="jsonp"||l||m)return f=c.jsonpCallback=p.isFunction(c.jsonpCallback)?c.jsonpCallback():c.jsonpCallback,g=a[f],l?c.url=j.replace(cG,"$1"+f):m?c.data=i.replace(cG,"$1"+f):k&&(c.url+=(cF.test(j)?"&":"?")+c.jsonp+"="+f),c.converters["script json"]=function(){return h||p.error(f+" was not called"),h[0]},c.dataTypes[0]="json",a[f]=function(){h=arguments},e.always(function(){a[f]=g,c[f]&&(c.jsonpCallback=d.jsonpCallback,cE.push(f)),h&&p.isFunction(g)&&g(h[0]),h=g=b}),"script"}),p.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){return p.globalEval(a),a}}}),p.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),p.ajaxTransport("script",function(a){if(a.crossDomain){var c,d=e.head||e.getElementsByTagName("head")[0]||e.documentElement;return{send:function(f,g){c=e.createElement("script"),c.async="async",a.scriptCharset&&(c.charset=a.scriptCharset),c.src=a.url,c.onload=c.onreadystatechange=function(a,e){if(e||!c.readyState||/loaded|complete/.test(c.readyState))c.onload=c.onreadystatechange=null,d&&c.parentNode&&d.removeChild(c),c=b,e||g(200,"success")},d.insertBefore(c,d.firstChild)},abort:function(){c&&c.onload(0,1)}}}});var cI,cJ=a.ActiveXObject?function(){for(var a in cI)cI[a](0,1)}:!1,cK=0;p.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&cL()||cM()}:cL,function(a){p.extend(p.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(p.ajaxSettings.xhr()),p.support.ajax&&p.ajaxTransport(function(c){if(!c.crossDomain||p.support.cors){var d;return{send:function(e,f){var g,h,i=c.xhr();c.username?i.open(c.type,c.url,c.async,c.username,c.password):i.open(c.type,c.url,c.async);if(c.xhrFields)for(h in c.xhrFields)i[h]=c.xhrFields[h];c.mimeType&&i.overrideMimeType&&i.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(h in e)i.setRequestHeader(h,e[h])}catch(j){}i.send(c.hasContent&&c.data||null),d=function(a,e){var h,j,k,l,m;try{if(d&&(e||i.readyState===4)){d=b,g&&(i.onreadystatechange=p.noop,cJ&&delete cI[g]);if(e)i.readyState!==4&&i.abort();else{h=i.status,k=i.getAllResponseHeaders(),l={},m=i.responseXML,m&&m.documentElement&&(l.xml=m);try{l.text=i.responseText}catch(a){}try{j=i.statusText}catch(n){j=""}!h&&c.isLocal&&!c.crossDomain?h=l.text?200:404:h===1223&&(h=204)}}}catch(o){e||f(-1,o)}l&&f(h,j,l,k)},c.async?i.readyState===4?setTimeout(d,0):(g=++cK,cJ&&(cI||(cI={},p(a).unload(cJ)),cI[g]=d),i.onreadystatechange=d):d()},abort:function(){d&&d(0,1)}}}});var cN,cO,cP=/^(?:toggle|show|hide)$/,cQ=new RegExp("^(?:([-+])=|)("+q+")([a-z%]*)$","i"),cR=/queueHooks$/,cS=[cY],cT={"*":[function(a,b){var c,d,e=this.createTween(a,b),f=cQ.exec(b),g=e.cur(),h=+g||0,i=1,j=20;if(f){c=+f[2],d=f[3]||(p.cssNumber[a]?"":"px");if(d!=="px"&&h){h=p.css(e.elem,a,!0)||c||1;do i=i||".5",h=h/i,p.style(e.elem,a,h+d);while(i!==(i=e.cur()/g)&&i!==1&&--j)}e.unit=d,e.start=h,e.end=f[1]?h+(f[1]+1)*c:c}return e}]};p.Animation=p.extend(cW,{tweener:function(a,b){p.isFunction(a)?(b=a,a=["*"]):a=a.split(" ");var c,d=0,e=a.length;for(;d<e;d++)c=a[d],cT[c]=cT[c]||[],cT[c].unshift(b)},prefilter:function(a,b){b?cS.unshift(a):cS.push(a)}}),p.Tween=cZ,cZ.prototype={constructor:cZ,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||"swing",this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(p.cssNumber[c]?"":"px")},cur:function(){var a=cZ.propHooks[this.prop];return a&&a.get?a.get(this):cZ.propHooks._default.get(this)},run:function(a){var b,c=cZ.propHooks[this.prop];return this.options.duration?this.pos=b=p.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):cZ.propHooks._default.set(this),this}},cZ.prototype.init.prototype=cZ.prototype,cZ.propHooks={_default:{get:function(a){var b;return a.elem[a.prop]==null||!!a.elem.style&&a.elem.style[a.prop]!=null?(b=p.css(a.elem,a.prop,!1,""),!b||b==="auto"?0:b):a.elem[a.prop]},set:function(a){p.fx.step[a.prop]?p.fx.step[a.prop](a):a.elem.style&&(a.elem.style[p.cssProps[a.prop]]!=null||p.cssHooks[a.prop])?p.style(a.elem,a.prop,a.now+a.unit):a.elem[a.prop]=a.now}}},cZ.propHooks.scrollTop=cZ.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},p.each(["toggle","show","hide"],function(a,b){var c=p.fn[b];p.fn[b]=function(d,e,f){return d==null||typeof d=="boolean"||!a&&p.isFunction(d)&&p.isFunction(e)?c.apply(this,arguments):this.animate(c$(b,!0),d,e,f)}}),p.fn.extend({fadeTo:function(a,b,c,d){return this.filter(bZ).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=p.isEmptyObject(a),f=p.speed(b,c,d),g=function(){var b=cW(this,p.extend({},a),f);e&&b.stop(!0)};return e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,c,d){var e=function(a){var b=a.stop;delete a.stop,b(d)};return typeof a!="string"&&(d=c,c=a,a=b),c&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,c=a!=null&&a+"queueHooks",f=p.timers,g=p._data(this);if(c)g[c]&&g[c].stop&&e(g[c]);else for(c in g)g[c]&&g[c].stop&&cR.test(c)&&e(g[c]);for(c=f.length;c--;)f[c].elem===this&&(a==null||f[c].queue===a)&&(f[c].anim.stop(d),b=!1,f.splice(c,1));(b||!d)&&p.dequeue(this,a)})}}),p.each({slideDown:c$("show"),slideUp:c$("hide"),slideToggle:c$("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){p.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),p.speed=function(a,b,c){var d=a&&typeof a=="object"?p.extend({},a):{complete:c||!c&&b||p.isFunction(a)&&a,duration:a,easing:c&&b||b&&!p.isFunction(b)&&b};d.duration=p.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in p.fx.speeds?p.fx.speeds[d.duration]:p.fx.speeds._default;if(d.queue==null||d.queue===!0)d.queue="fx";return d.old=d.complete,d.complete=function(){p.isFunction(d.old)&&d.old.call(this),d.queue&&p.dequeue(this,d.queue)},d},p.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2}},p.timers=[],p.fx=cZ.prototype.init,p.fx.tick=function(){var a,b=p.timers,c=0;for(;c<b.length;c++)a=b[c],!a()&&b[c]===a&&b.splice(c--,1);b.length||p.fx.stop()},p.fx.timer=function(a){a()&&p.timers.push(a)&&!cO&&(cO=setInterval(p.fx.tick,p.fx.interval))},p.fx.interval=13,p.fx.stop=function(){clearInterval(cO),cO=null},p.fx.speeds={slow:600,fast:200,_default:400},p.fx.step={},p.expr&&p.expr.filters&&(p.expr.filters.animated=function(a){return p.grep(p.timers,function(b){return a===b.elem}).length});var c_=/^(?:body|html)$/i;p.fn.offset=function(a){if(arguments.length)return a===b?this:this.each(function(b){p.offset.setOffset(this,a,b)});var c,d,e,f,g,h,i,j={top:0,left:0},k=this[0],l=k&&k.ownerDocument;if(!l)return;return(d=l.body)===k?p.offset.bodyOffset(k):(c=l.documentElement,p.contains(c,k)?(typeof k.getBoundingClientRect!="undefined"&&(j=k.getBoundingClientRect()),e=da(l),f=c.clientTop||d.clientTop||0,g=c.clientLeft||d.clientLeft||0,h=e.pageYOffset||c.scrollTop,i=e.pageXOffset||c.scrollLeft,{top:j.top+h-f,left:j.left+i-g}):j)},p.offset={bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;return p.support.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(p.css(a,"marginTop"))||0,c+=parseFloat(p.css(a,"marginLeft"))||0),{top:b,left:c}},setOffset:function(a,b,c){var d=p.css(a,"position");d==="static"&&(a.style.position="relative");var e=p(a),f=e.offset(),g=p.css(a,"top"),h=p.css(a,"left"),i=(d==="absolute"||d==="fixed")&&p.inArray("auto",[g,h])>-1,j={},k={},l,m;i?(k=e.position(),l=k.top,m=k.left):(l=parseFloat(g)||0,m=parseFloat(h)||0),p.isFunction(b)&&(b=b.call(a,c,f)),b.top!=null&&(j.top=b.top-f.top+l),b.left!=null&&(j.left=b.left-f.left+m),"using"in b?b.using.call(a,j):e.css(j)}},p.fn.extend({position:function(){if(!this[0])return;var a=this[0],b=this.offsetParent(),c=this.offset(),d=c_.test(b[0].nodeName)?{top:0,left:0}:b.offset();return c.top-=parseFloat(p.css(a,"marginTop"))||0,c.left-=parseFloat(p.css(a,"marginLeft"))||0,d.top+=parseFloat(p.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(p.css(b[0],"borderLeftWidth"))||0,{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||e.body;while(a&&!c_.test(a.nodeName)&&p.css(a,"position")==="static")a=a.offsetParent;return a||e.body})}}),p.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);p.fn[a]=function(e){return p.access(this,function(a,e,f){var g=da(a);if(f===b)return g?c in g?g[c]:g.document.documentElement[e]:a[e];g?g.scrollTo(d?p(g).scrollLeft():f,d?f:p(g).scrollTop()):a[e]=f},a,e,arguments.length,null)}}),p.each({Height:"height",Width:"width"},function(a,c){p.each({padding:"inner"+a,content:c,"":"outer"+a},function(d,e){p.fn[e]=function(e,f){var g=arguments.length&&(d||typeof e!="boolean"),h=d||(e===!0||f===!0?"margin":"border");return p.access(this,function(c,d,e){var f;return p.isWindow(c)?c.document.documentElement["client"+a]:c.nodeType===9?(f=c.documentElement,Math.max(c.body["scroll"+a],f["scroll"+a],c.body["offset"+a],f["offset"+a],f["client"+a])):e===b?p.css(c,d,e,h):p.style(c,d,e,h)},c,g?e:b,g,null)}})}),a.jQuery=a.$=p,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return p})})(window); \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js
new file mode 100644
index 0000000000..4dd48675b7
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js
@@ -0,0 +1,5486 @@
+/**
+ * @preserve jquery.layout 1.3.0 - Release Candidate 30.62
+ * $Date: 2012-08-04 08:00:00 (Thu, 23 Aug 2012) $
+ * $Rev: 303006 $
+ *
+ * Copyright (c) 2012
+ * Fabrizio Balliano (http://www.fabrizioballiano.net)
+ * Kevin Dalman (http://allpro.net)
+ *
+ * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
+ * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
+ *
+ * Changelog: http://layout.jquery-dev.net/changelog.cfm#1.3.0.rc30.62
+ * NOTE: This is a short-term release to patch a couple of bugs.
+ * These bugs are listed as officially fixed in RC30.7, which will be released shortly.
+ *
+ * Docs: http://layout.jquery-dev.net/documentation.html
+ * Tips: http://layout.jquery-dev.net/tips.html
+ * Help: http://groups.google.com/group/jquery-ui-layout
+ */
+
+/* JavaDoc Info: http://code.google.com/closure/compiler/docs/js-for-compiler.html
+ * {!Object} non-nullable type (never NULL)
+ * {?string} nullable type (sometimes NULL) - default for {Object}
+ * {number=} optional parameter
+ * {*} ALL types
+ */
+
+// NOTE: For best readability, view with a fixed-width font and tabs equal to 4-chars
+
+;(function ($) {
+
+// alias Math methods - used a lot!
+var min = Math.min
+, max = Math.max
+, round = Math.floor
+
+, isStr = function (v) { return $.type(v) === "string"; }
+
+, runPluginCallbacks = function (Instance, a_fn) {
+ if ($.isArray(a_fn))
+ for (var i=0, c=a_fn.length; i<c; i++) {
+ var fn = a_fn[i];
+ try {
+ if (isStr(fn)) // 'name' of a function
+ fn = eval(fn);
+ if ($.isFunction(fn))
+ fn( Instance );
+ } catch (ex) {}
+ }
+ }
+
+;
+
+
+/*
+ * GENERIC $.layout METHODS - used by all layouts
+ */
+$.layout = {
+
+ version: "1.3.rc30.62"
+, revision: 0.033006 // 1.3.0 final = 1.0300 - major(n+).minor(nn)+patch(nn+)
+
+ // can update code here if $.browser is phased out
+, browser: {
+ mozilla: !!$.browser.mozilla
+ , webkit: !!$.browser.webkit || !!$.browser.safari // webkit = jQ 1.4
+ , msie: !!$.browser.msie
+ , isIE6: $.browser.msie && $.browser.version == 6
+ , boxModel: $.support.boxModel !== false || !$.browser.msie // ONLY IE reverts to old box-model - update for older jQ onReady
+ , version: $.browser.version // not used in Layout core, but may be used by plugins
+ }
+
+ // *PREDEFINED* EFFECTS & DEFAULTS
+ // MUST list effect here - OR MUST set an fxSettings option (can be an empty hash: {})
+, effects: {
+
+ // Pane Open/Close Animations
+ slide: {
+ all: { duration: "fast" } // eg: duration: 1000, easing: "easeOutBounce"
+ , north: { direction: "up" }
+ , south: { direction: "down" }
+ , east: { direction: "right"}
+ , west: { direction: "left" }
+ }
+ , drop: {
+ all: { duration: "slow" }
+ , north: { direction: "up" }
+ , south: { direction: "down" }
+ , east: { direction: "right"}
+ , west: { direction: "left" }
+ }
+ , scale: {
+ all: { duration: "fast" }
+ }
+ // these are not recommended, but can be used
+ , blind: {}
+ , clip: {}
+ , explode: {}
+ , fade: {}
+ , fold: {}
+ , puff: {}
+
+ // Pane Resize Animations
+ , size: {
+ all: { easing: "swing" }
+ }
+ }
+
+ // INTERNAL CONFIG DATA - DO NOT CHANGE THIS!
+, config: {
+ optionRootKeys: "effects,panes,north,south,west,east,center".split(",")
+ , allPanes: "north,south,west,east,center".split(",")
+ , borderPanes: "north,south,west,east".split(",")
+ , oppositeEdge: {
+ north: "south"
+ , south: "north"
+ , east: "west"
+ , west: "east"
+ }
+ // offscreen data
+ , offscreenCSS: { left: "-99999px", right: "auto" } // used by hide/close if useOffscreenClose=true
+ , offscreenReset: "offscreenReset" // key used for data
+ // CSS used in multiple places
+ , hidden: { visibility: "hidden" }
+ , visible: { visibility: "visible" }
+ // layout element settings
+ , resizers: {
+ cssReq: {
+ position: "absolute"
+ , padding: 0
+ , margin: 0
+ , fontSize: "1px"
+ , textAlign: "left" // to counter-act "center" alignment!
+ , overflow: "hidden" // prevent toggler-button from overflowing
+ // SEE $.layout.defaults.zIndexes.resizer_normal
+ }
+ , cssDemo: { // DEMO CSS - applied if: options.PANE.applyDemoStyles=true
+ background: "#DDD"
+ , border: "none"
+ }
+ }
+ , togglers: {
+ cssReq: {
+ position: "absolute"
+ , display: "block"
+ , padding: 0
+ , margin: 0
+ , overflow: "hidden"
+ , textAlign: "center"
+ , fontSize: "1px"
+ , cursor: "pointer"
+ , zIndex: 1
+ }
+ , cssDemo: { // DEMO CSS - applied if: options.PANE.applyDemoStyles=true
+ background: "#AAA"
+ }
+ }
+ , content: {
+ cssReq: {
+ position: "relative" /* contain floated or positioned elements */
+ }
+ , cssDemo: { // DEMO CSS - applied if: options.PANE.applyDemoStyles=true
+ overflow: "auto"
+ , padding: "10px"
+ }
+ , cssDemoPane: { // DEMO CSS - REMOVE scrolling from 'pane' when it has a content-div
+ overflow: "hidden"
+ , padding: 0
+ }
+ }
+ , panes: { // defaults for ALL panes - overridden by 'per-pane settings' below
+ cssReq: {
+ position: "absolute"
+ , margin: 0
+ // $.layout.defaults.zIndexes.pane_normal
+ }
+ , cssDemo: { // DEMO CSS - applied if: options.PANE.applyDemoStyles=true
+ padding: "10px"
+ , background: "#FFF"
+ , border: "1px solid #BBB"
+ , overflow: "auto"
+ }
+ }
+ , north: {
+ side: "Top"
+ , sizeType: "Height"
+ , dir: "horz"
+ , cssReq: {
+ top: 0
+ , bottom: "auto"
+ , left: 0
+ , right: 0
+ , width: "auto"
+ // height: DYNAMIC
+ }
+ }
+ , south: {
+ side: "Bottom"
+ , sizeType: "Height"
+ , dir: "horz"
+ , cssReq: {
+ top: "auto"
+ , bottom: 0
+ , left: 0
+ , right: 0
+ , width: "auto"
+ // height: DYNAMIC
+ }
+ }
+ , east: {
+ side: "Right"
+ , sizeType: "Width"
+ , dir: "vert"
+ , cssReq: {
+ left: "auto"
+ , right: 0
+ , top: "auto" // DYNAMIC
+ , bottom: "auto" // DYNAMIC
+ , height: "auto"
+ // width: DYNAMIC
+ }
+ }
+ , west: {
+ side: "Left"
+ , sizeType: "Width"
+ , dir: "vert"
+ , cssReq: {
+ left: 0
+ , right: "auto"
+ , top: "auto" // DYNAMIC
+ , bottom: "auto" // DYNAMIC
+ , height: "auto"
+ // width: DYNAMIC
+ }
+ }
+ , center: {
+ dir: "center"
+ , cssReq: {
+ left: "auto" // DYNAMIC
+ , right: "auto" // DYNAMIC
+ , top: "auto" // DYNAMIC
+ , bottom: "auto" // DYNAMIC
+ , height: "auto"
+ , width: "auto"
+ }
+ }
+ }
+
+ // CALLBACK FUNCTION NAMESPACE - used to store reusable callback functions
+, callbacks: {}
+
+, getParentPaneElem: function (el) {
+ // must pass either a container or pane element
+ var $el = $(el)
+ , layout = $el.data("layout") || $el.data("parentLayout");
+ if (layout) {
+ var $cont = layout.container;
+ // see if this container is directly-nested inside an outer-pane
+ if ($cont.data("layoutPane")) return $cont;
+ var $pane = $cont.closest("."+ $.layout.defaults.panes.paneClass);
+ // if a pane was found, return it
+ if ($pane.data("layoutPane")) return $pane;
+ }
+ return null;
+ }
+
+, getParentPaneInstance: function (el) {
+ // must pass either a container or pane element
+ var $pane = $.layout.getParentPaneElem(el);
+ return $pane ? $pane.data("layoutPane") : null;
+ }
+
+, getParentLayoutInstance: function (el) {
+ // must pass either a container or pane element
+ var $pane = $.layout.getParentPaneElem(el);
+ return $pane ? $pane.data("parentLayout") : null;
+ }
+
+, getEventObject: function (evt) {
+ return typeof evt === "object" && evt.stopPropagation ? evt : null;
+ }
+, parsePaneName: function (evt_or_pane) {
+ // getEventObject() automatically calls .stopPropagation(), WHICH MUST BE DONE!
+ var evt = $.layout.getEventObject( evt_or_pane );
+ if (evt) {
+ // ALWAYS stop propagation of events triggered in Layout!
+ evt.stopPropagation();
+ return $(this).data("layoutEdge");
+ }
+ else
+ return evt_or_pane;
+ }
+
+
+ // LAYOUT-PLUGIN REGISTRATION
+ // more plugins can added beyond this default list
+, plugins: {
+ draggable: !!$.fn.draggable // resizing
+ , effects: {
+ core: !!$.effects // animimations (specific effects tested by initOptions)
+ , slide: $.effects && $.effects.slide // default effect
+ }
+ }
+
+// arrays of plugin or other methods to be triggered for events in *each layout* - will be passed 'Instance'
+, onCreate: [] // runs when layout is just starting to be created - right after options are set
+, onLoad: [] // runs after layout container and global events init, but before initPanes is called
+, onReady: [] // runs after initialization *completes* - ie, after initPanes completes successfully
+, onDestroy: [] // runs after layout is destroyed
+, onUnload: [] // runs after layout is destroyed OR when page unloads
+, afterOpen: [] // runs after setAsOpen() completes
+, afterClose: [] // runs after setAsClosed() completes
+
+ /*
+ * GENERIC UTILITY METHODS
+ */
+
+ // calculate and return the scrollbar width, as an integer
+, scrollbarWidth: function () { return window.scrollbarWidth || $.layout.getScrollbarSize('width'); }
+, scrollbarHeight: function () { return window.scrollbarHeight || $.layout.getScrollbarSize('height'); }
+, getScrollbarSize: function (dim) {
+ var $c = $('<div style="position: absolute; top: -10000px; left: -10000px; width: 100px; height: 100px; overflow: scroll;"></div>').appendTo("body");
+ var d = { width: $c.width() - $c[0].clientWidth, height: $c.height() - $c[0].clientHeight };
+ $c.remove();
+ window.scrollbarWidth = d.width;
+ window.scrollbarHeight = d.height;
+ return dim.match(/^(width|height)$/) ? d[dim] : d;
+ }
+
+
+ /**
+ * Returns hash container 'display' and 'visibility'
+ *
+ * @see $.swap() - swaps CSS, runs callback, resets CSS
+ */
+, showInvisibly: function ($E, force) {
+ if ($E && $E.length && (force || $E.css('display') === "none")) { // only if not *already hidden*
+ var s = $E[0].style
+ // save ONLY the 'style' props because that is what we must restore
+ , CSS = { display: s.display || '', visibility: s.visibility || '' };
+ // show element 'invisibly' so can be measured
+ $E.css({ display: "block", visibility: "hidden" });
+ return CSS;
+ }
+ return {};
+ }
+
+ /**
+ * Returns data for setting size of an element (container or a pane).
+ *
+ * @see _create(), onWindowResize() for container, plus others for pane
+ * @return JSON Returns a hash of all dimensions: top, bottom, left, right, outerWidth, innerHeight, etc
+ */
+, getElementDimensions: function ($E) {
+ var
+ d = {} // dimensions hash
+ , x = d.css = {} // CSS hash
+ , i = {} // TEMP insets
+ , b, p // TEMP border, padding
+ , N = $.layout.cssNum
+ , off = $E.offset()
+ ;
+ d.offsetLeft = off.left;
+ d.offsetTop = off.top;
+
+ $.each("Left,Right,Top,Bottom".split(","), function (idx, e) { // e = edge
+ b = x["border" + e] = $.layout.borderWidth($E, e);
+ p = x["padding"+ e] = $.layout.cssNum($E, "padding"+e);
+ i[e] = b + p; // total offset of content from outer side
+ d["inset"+ e] = p; // eg: insetLeft = paddingLeft
+ });
+
+ d.offsetWidth = $E.innerWidth(); // offsetWidth is used in calc when doing manual resize
+ d.offsetHeight = $E.innerHeight(); // ditto
+ d.outerWidth = $E.outerWidth();
+ d.outerHeight = $E.outerHeight();
+ d.innerWidth = max(0, d.outerWidth - i.Left - i.Right);
+ d.innerHeight = max(0, d.outerHeight - i.Top - i.Bottom);
+
+ x.width = $E.width();
+ x.height = $E.height();
+ x.top = N($E,"top",true);
+ x.bottom = N($E,"bottom",true);
+ x.left = N($E,"left",true);
+ x.right = N($E,"right",true);
+
+ //d.visible = $E.is(":visible");// && x.width > 0 && x.height > 0;
+
+ return d;
+ }
+
+, getElementCSS: function ($E, list) {
+ var
+ CSS = {}
+ , style = $E[0].style
+ , props = list.split(",")
+ , sides = "Top,Bottom,Left,Right".split(",")
+ , attrs = "Color,Style,Width".split(",")
+ , p, s, a, i, j, k
+ ;
+ for (i=0; i < props.length; i++) {
+ p = props[i];
+ if (p.match(/(border|padding|margin)$/))
+ for (j=0; j < 4; j++) {
+ s = sides[j];
+ if (p === "border")
+ for (k=0; k < 3; k++) {
+ a = attrs[k];
+ CSS[p+s+a] = style[p+s+a];
+ }
+ else
+ CSS[p+s] = style[p+s];
+ }
+ else
+ CSS[p] = style[p];
+ };
+ return CSS
+ }
+
+ /**
+ * Return the innerWidth for the current browser/doctype
+ *
+ * @see initPanes(), sizeMidPanes(), initHandles(), sizeHandles()
+ * @param {Array.<Object>} $E Must pass a jQuery object - first element is processed
+ * @param {number=} outerWidth (optional) Can pass a width, allowing calculations BEFORE element is resized
+ * @return {number} Returns the innerWidth of the elem by subtracting padding and borders
+ */
+, cssWidth: function ($E, outerWidth) {
+ // a 'calculated' outerHeight can be passed so borders and/or padding are removed if needed
+ if (outerWidth <= 0) return 0;
+
+ if (!$.layout.browser.boxModel) return outerWidth;
+
+ // strip border and padding from outerWidth to get CSS Width
+ var b = $.layout.borderWidth
+ , n = $.layout.cssNum
+ , W = outerWidth
+ - b($E, "Left")
+ - b($E, "Right")
+ - n($E, "paddingLeft")
+ - n($E, "paddingRight");
+
+ return max(0,W);
+ }
+
+ /**
+ * Return the innerHeight for the current browser/doctype
+ *
+ * @see initPanes(), sizeMidPanes(), initHandles(), sizeHandles()
+ * @param {Array.<Object>} $E Must pass a jQuery object - first element is processed
+ * @param {number=} outerHeight (optional) Can pass a width, allowing calculations BEFORE element is resized
+ * @return {number} Returns the innerHeight of the elem by subtracting padding and borders
+ */
+, cssHeight: function ($E, outerHeight) {
+ // a 'calculated' outerHeight can be passed so borders and/or padding are removed if needed
+ if (outerHeight <= 0) return 0;
+
+ if (!$.layout.browser.boxModel) return outerHeight;
+
+ // strip border and padding from outerHeight to get CSS Height
+ var b = $.layout.borderWidth
+ , n = $.layout.cssNum
+ , H = outerHeight
+ - b($E, "Top")
+ - b($E, "Bottom")
+ - n($E, "paddingTop")
+ - n($E, "paddingBottom");
+
+ return max(0,H);
+ }
+
+ /**
+ * Returns the 'current CSS numeric value' for a CSS property - 0 if property does not exist
+ *
+ * @see Called by many methods
+ * @param {Array.<Object>} $E Must pass a jQuery object - first element is processed
+ * @param {string} prop The name of the CSS property, eg: top, width, etc.
+ * @param {boolean=} [allowAuto=false] true = return 'auto' if that is value; false = return 0
+ * @return {(string|number)} Usually used to get an integer value for position (top, left) or size (height, width)
+ */
+, cssNum: function ($E, prop, allowAuto) {
+ if (!$E.jquery) $E = $($E);
+ var CSS = $.layout.showInvisibly($E)
+ , p = $.css($E[0], prop, true)
+ , v = allowAuto && p=="auto" ? p : (parseInt(p, 10) || 0);
+ $E.css( CSS ); // RESET
+ return v;
+ }
+
+, borderWidth: function (el, side) {
+ if (el.jquery) el = el[0];
+ var b = "border"+ side.substr(0,1).toUpperCase() + side.substr(1); // left => Left
+ return $.css(el, b+"Style", true) === "none" ? 0 : (parseInt($.css(el, b+"Width", true), 10) || 0);
+ }
+
+ /**
+ * Mouse-tracking utility - FUTURE REFERENCE
+ *
+ * init: if (!window.mouse) {
+ * window.mouse = { x: 0, y: 0 };
+ * $(document).mousemove( $.layout.trackMouse );
+ * }
+ *
+ * @param {Object} evt
+ *
+, trackMouse: function (evt) {
+ window.mouse = { x: evt.clientX, y: evt.clientY };
+ }
+ */
+
+ /**
+ * SUBROUTINE for preventPrematureSlideClose option
+ *
+ * @param {Object} evt
+ * @param {Object=} el
+ */
+, isMouseOverElem: function (evt, el) {
+ var
+ $E = $(el || this)
+ , d = $E.offset()
+ , T = d.top
+ , L = d.left
+ , R = L + $E.outerWidth()
+ , B = T + $E.outerHeight()
+ , x = evt.pageX // evt.clientX ?
+ , y = evt.pageY // evt.clientY ?
+ ;
+ // if X & Y are < 0, probably means is over an open SELECT
+ return ($.layout.browser.msie && x < 0 && y < 0) || ((x >= L && x <= R) && (y >= T && y <= B));
+ }
+
+ /**
+ * Message/Logging Utility
+ *
+ * @example $.layout.msg("My message"); // log text
+ * @example $.layout.msg("My message", true); // alert text
+ * @example $.layout.msg({ foo: "bar" }, "Title"); // log hash-data, with custom title
+ * @example $.layout.msg({ foo: "bar" }, true, "Title", { sort: false }); -OR-
+ * @example $.layout.msg({ foo: "bar" }, "Title", { sort: false, display: true }); // alert hash-data
+ *
+ * @param {(Object|string)} info String message OR Hash/Array
+ * @param {(Boolean|string|Object)=} [popup=false] True means alert-box - can be skipped
+ * @param {(Object|string)=} [debugTitle=""] Title for Hash data - can be skipped
+ * @param {Object=} [debugOpts] Extra options for debug output
+ */
+, msg: function (info, popup, debugTitle, debugOpts) {
+ if ($.isPlainObject(info) && window.debugData) {
+ if (typeof popup === "string") {
+ debugOpts = debugTitle;
+ debugTitle = popup;
+ }
+ else if (typeof debugTitle === "object") {
+ debugOpts = debugTitle;
+ debugTitle = null;
+ }
+ var t = debugTitle || "log( <object> )"
+ , o = $.extend({ sort: false, returnHTML: false, display: false }, debugOpts);
+ if (popup === true || o.display)
+ debugData( info, t, o );
+ else if (window.console)
+ console.log(debugData( info, t, o ));
+ }
+ else if (popup)
+ alert(info);
+ else if (window.console)
+ console.log(info);
+ else {
+ var id = "#layoutLogger"
+ , $l = $(id);
+ if (!$l.length)
+ $l = createLog();
+ $l.children("ul").append('<li style="padding: 4px 10px; margin: 0; border-top: 1px solid #CCC;">'+ info.replace(/\</g,"&lt;").replace(/\>/g,"&gt;") +'</li>');
+ }
+
+ function createLog () {
+ var pos = $.support.fixedPosition ? 'fixed' : 'absolute'
+ , $e = $('<div id="layoutLogger" style="position: '+ pos +'; top: 5px; z-index: 999999; max-width: 25%; overflow: hidden; border: 1px solid #000; border-radius: 5px; background: #FBFBFB; box-shadow: 0 2px 10px rgba(0,0,0,0.3);">'
+ + '<div style="font-size: 13px; font-weight: bold; padding: 5px 10px; background: #F6F6F6; border-radius: 5px 5px 0 0; cursor: move;">'
+ + '<span style="float: right; padding-left: 7px; cursor: pointer;" title="Remove Console" onclick="$(this).closest(\'#layoutLogger\').remove()">X</span>Layout console.log</div>'
+ + '<ul style="font-size: 13px; font-weight: none; list-style: none; margin: 0; padding: 0 0 2px;"></ul>'
+ + '</div>'
+ ).appendTo("body");
+ $e.css('left', $(window).width() - $e.outerWidth() - 5)
+ if ($.ui.draggable) $e.draggable({ handle: ':first-child' });
+ return $e;
+ };
+ }
+
+};
+
+// DEFAULT OPTIONS
+$.layout.defaults = {
+/*
+ * LAYOUT & LAYOUT-CONTAINER OPTIONS
+ * - none of these options are applicable to individual panes
+ */
+ name: "" // Not required, but useful for buttons and used for the state-cookie
+, containerSelector: "" // ONLY used when specifying a childOptions - to find container-element that is NOT directly-nested
+, containerClass: "ui-layout-container" // layout-container element
+, scrollToBookmarkOnLoad: true // after creating a layout, scroll to bookmark in URL (.../page.htm#myBookmark)
+, resizeWithWindow: true // bind thisLayout.resizeAll() to the window.resize event
+, resizeWithWindowDelay: 200 // delay calling resizeAll because makes window resizing very jerky
+, resizeWithWindowMaxDelay: 0 // 0 = none - force resize every XX ms while window is being resized
+, onresizeall_start: null // CALLBACK when resizeAll() STARTS - NOT pane-specific
+, onresizeall_end: null // CALLBACK when resizeAll() ENDS - NOT pane-specific
+, onload_start: null // CALLBACK when Layout inits - after options initialized, but before elements
+, onload_end: null // CALLBACK when Layout inits - after EVERYTHING has been initialized
+, onunload_start: null // CALLBACK when Layout is destroyed OR onWindowUnload
+, onunload_end: null // CALLBACK when Layout is destroyed OR onWindowUnload
+, initPanes: true // false = DO NOT initialize the panes onLoad - will init later
+, showErrorMessages: true // enables fatal error messages to warn developers of common errors
+, showDebugMessages: false // display console-and-alert debug msgs - IF this Layout version _has_ debugging code!
+// Changing this zIndex value will cause other zIndex values to automatically change
+, zIndex: null // the PANE zIndex - resizers and masks will be +1
+// DO NOT CHANGE the zIndex values below unless you clearly understand their relationships
+, zIndexes: { // set _default_ z-index values here...
+ pane_normal: 0 // normal z-index for panes
+ , content_mask: 1 // applied to overlays used to mask content INSIDE panes during resizing
+ , resizer_normal: 2 // normal z-index for resizer-bars
+ , pane_sliding: 100 // applied to *BOTH* the pane and its resizer when a pane is 'slid open'
+ , pane_animate: 1000 // applied to the pane when being animated - not applied to the resizer
+ , resizer_drag: 10000 // applied to the CLONED resizer-bar when being 'dragged'
+ }
+, errors: {
+ pane: "pane" // description of "layout pane element" - used only in error messages
+ , selector: "selector" // description of "jQuery-selector" - used only in error messages
+ , addButtonError: "Error Adding Button \n\nInvalid "
+ , containerMissing: "UI Layout Initialization Error\n\nThe specified layout-container does not exist."
+ , centerPaneMissing: "UI Layout Initialization Error\n\nThe center-pane element does not exist.\n\nThe center-pane is a required element."
+ , noContainerHeight: "UI Layout Initialization Warning\n\nThe layout-container \"CONTAINER\" has no height.\n\nTherefore the layout is 0-height and hence 'invisible'!"
+ , callbackError: "UI Layout Callback Error\n\nThe EVENT callback is not a valid function."
+ }
+/*
+ * PANE DEFAULT SETTINGS
+ * - settings under the 'panes' key become the default settings for *all panes*
+ * - ALL pane-options can also be set specifically for each panes, which will override these 'default values'
+ */
+, panes: { // default options for 'all panes' - will be overridden by 'per-pane settings'
+ applyDemoStyles: false // NOTE: renamed from applyDefaultStyles for clarity
+ , closable: true // pane can open & close
+ , resizable: true // when open, pane can be resized
+ , slidable: true // when closed, pane can 'slide open' over other panes - closes on mouse-out
+ , initClosed: false // true = init pane as 'closed'
+ , initHidden: false // true = init pane as 'hidden' - no resizer-bar/spacing
+ // SELECTORS
+ //, paneSelector: "" // MUST be pane-specific - jQuery selector for pane
+ , contentSelector: ".ui-layout-content" // INNER div/element to auto-size so only it scrolls, not the entire pane!
+ , contentIgnoreSelector: ".ui-layout-ignore" // element(s) to 'ignore' when measuring 'content'
+ , findNestedContent: false // true = $P.find(contentSelector), false = $P.children(contentSelector)
+ // GENERIC ROOT-CLASSES - for auto-generated classNames
+ , paneClass: "ui-layout-pane" // Layout Pane
+ , resizerClass: "ui-layout-resizer" // Resizer Bar
+ , togglerClass: "ui-layout-toggler" // Toggler Button
+ , buttonClass: "ui-layout-button" // CUSTOM Buttons - eg: '[ui-layout-button]-toggle/-open/-close/-pin'
+ // ELEMENT SIZE & SPACING
+ //, size: 100 // MUST be pane-specific -initial size of pane
+ , minSize: 0 // when manually resizing a pane
+ , maxSize: 0 // ditto, 0 = no limit
+ , spacing_open: 6 // space between pane and adjacent panes - when pane is 'open'
+ , spacing_closed: 6 // ditto - when pane is 'closed'
+ , togglerLength_open: 50 // Length = WIDTH of toggler button on north/south sides - HEIGHT on east/west sides
+ , togglerLength_closed: 50 // 100% OR -1 means 'full height/width of resizer bar' - 0 means 'hidden'
+ , togglerAlign_open: "center" // top/left, bottom/right, center, OR...
+ , togglerAlign_closed: "center" // 1 => nn = offset from top/left, -1 => -nn == offset from bottom/right
+ , togglerContent_open: "" // text or HTML to put INSIDE the toggler
+ , togglerContent_closed: "" // ditto
+ // RESIZING OPTIONS
+ , resizerDblClickToggle: true //
+ , autoResize: true // IF size is 'auto' or a percentage, then recalc 'pixel size' whenever the layout resizes
+ , autoReopen: true // IF a pane was auto-closed due to noRoom, reopen it when there is room? False = leave it closed
+ , resizerDragOpacity: 1 // option for ui.draggable
+ //, resizerCursor: "" // MUST be pane-specific - cursor when over resizer-bar
+ , maskContents: false // true = add DIV-mask over-or-inside this pane so can 'drag' over IFRAMES
+ , maskObjects: false // true = add IFRAME-mask over-or-inside this pane to cover objects/applets - content-mask will overlay this mask
+ , maskZindex: null // will override zIndexes.content_mask if specified - not applicable to iframe-panes
+ , resizingGrid: false // grid size that the resizers will snap-to during resizing, eg: [20,20]
+ , livePaneResizing: false // true = LIVE Resizing as resizer is dragged
+ , liveContentResizing: false // true = re-measure header/footer heights as resizer is dragged
+ , liveResizingTolerance: 1 // how many px change before pane resizes, to control performance
+ // SLIDING OPTIONS
+ , sliderCursor: "pointer" // cursor when resizer-bar will trigger 'sliding'
+ , slideTrigger_open: "click" // click, dblclick, mouseenter
+ , slideTrigger_close: "mouseleave"// click, mouseleave
+ , slideDelay_open: 300 // applies only for mouseenter event - 0 = instant open
+ , slideDelay_close: 300 // applies only for mouseleave event (300ms is the minimum!)
+ , hideTogglerOnSlide: false // when pane is slid-open, should the toggler show?
+ , preventQuickSlideClose: $.layout.browser.webkit // Chrome triggers slideClosed as it is opening
+ , preventPrematureSlideClose: false // handle incorrect mouseleave trigger, like when over a SELECT-list in IE
+ // PANE-SPECIFIC TIPS & MESSAGES
+ , tips: {
+ Open: "Open" // eg: "Open Pane"
+ , Close: "Close"
+ , Resize: "Resize"
+ , Slide: "Slide Open"
+ , Pin: "Pin"
+ , Unpin: "Un-Pin"
+ , noRoomToOpen: "Not enough room to show this panel." // alert if user tries to open a pane that cannot
+ , minSizeWarning: "Panel has reached its minimum size" // displays in browser statusbar
+ , maxSizeWarning: "Panel has reached its maximum size" // ditto
+ }
+ // HOT-KEYS & MISC
+ , showOverflowOnHover: false // will bind allowOverflow() utility to pane.onMouseOver
+ , enableCursorHotkey: true // enabled 'cursor' hotkeys
+ //, customHotkey: "" // MUST be pane-specific - EITHER a charCode OR a character
+ , customHotkeyModifier: "SHIFT" // either 'SHIFT', 'CTRL' or 'CTRL+SHIFT' - NOT 'ALT'
+ // PANE ANIMATION
+ // NOTE: fxSss_open, fxSss_close & fxSss_size options (eg: fxName_open) are auto-generated if not passed
+ , fxName: "slide" // ('none' or blank), slide, drop, scale -- only relevant to 'open' & 'close', NOT 'size'
+ , fxSpeed: null // slow, normal, fast, 200, nnn - if passed, will OVERRIDE fxSettings.duration
+ , fxSettings: {} // can be passed, eg: { easing: "easeOutBounce", duration: 1500 }
+ , fxOpacityFix: true // tries to fix opacity in IE to restore anti-aliasing after animation
+ , animatePaneSizing: false // true = animate resizing after dragging resizer-bar OR sizePane() is called
+ /* NOTE: Action-specific FX options are auto-generated from the options above if not specifically set:
+ fxName_open: "slide" // 'Open' pane animation
+ fnName_close: "slide" // 'Close' pane animation
+ fxName_size: "slide" // 'Size' pane animation - when animatePaneSizing = true
+ fxSpeed_open: null
+ fxSpeed_close: null
+ fxSpeed_size: null
+ fxSettings_open: {}
+ fxSettings_close: {}
+ fxSettings_size: {}
+ */
+ // CHILD/NESTED LAYOUTS
+ , childOptions: null // Layout-options for nested/child layout - even {} is valid as options
+ , initChildLayout: true // true = child layout will be created as soon as _this_ layout completes initialization
+ , destroyChildLayout: true // true = destroy child-layout if this pane is destroyed
+ , resizeChildLayout: true // true = trigger child-layout.resizeAll() when this pane is resized
+ // EVENT TRIGGERING
+ , triggerEventsOnLoad: false // true = trigger onopen OR onclose callbacks when layout initializes
+ , triggerEventsDuringLiveResize: true // true = trigger onresize callback REPEATEDLY if livePaneResizing==true
+ // PANE CALLBACKS
+ , onshow_start: null // CALLBACK when pane STARTS to Show - BEFORE onopen/onhide_start
+ , onshow_end: null // CALLBACK when pane ENDS being Shown - AFTER onopen/onhide_end
+ , onhide_start: null // CALLBACK when pane STARTS to Close - BEFORE onclose_start
+ , onhide_end: null // CALLBACK when pane ENDS being Closed - AFTER onclose_end
+ , onopen_start: null // CALLBACK when pane STARTS to Open
+ , onopen_end: null // CALLBACK when pane ENDS being Opened
+ , onclose_start: null // CALLBACK when pane STARTS to Close
+ , onclose_end: null // CALLBACK when pane ENDS being Closed
+ , onresize_start: null // CALLBACK when pane STARTS being Resized ***FOR ANY REASON***
+ , onresize_end: null // CALLBACK when pane ENDS being Resized ***FOR ANY REASON***
+ , onsizecontent_start: null // CALLBACK when sizing of content-element STARTS
+ , onsizecontent_end: null // CALLBACK when sizing of content-element ENDS
+ , onswap_start: null // CALLBACK when pane STARTS to Swap
+ , onswap_end: null // CALLBACK when pane ENDS being Swapped
+ , ondrag_start: null // CALLBACK when pane STARTS being ***MANUALLY*** Resized
+ , ondrag_end: null // CALLBACK when pane ENDS being ***MANUALLY*** Resized
+ }
+/*
+ * PANE-SPECIFIC SETTINGS
+ * - options listed below MUST be specified per-pane - they CANNOT be set under 'panes'
+ * - all options under the 'panes' key can also be set specifically for any pane
+ * - most options under the 'panes' key apply only to 'border-panes' - NOT the the center-pane
+ */
+, north: {
+ paneSelector: ".ui-layout-north"
+ , size: "auto" // eg: "auto", "30%", .30, 200
+ , resizerCursor: "n-resize" // custom = url(myCursor.cur)
+ , customHotkey: "" // EITHER a charCode (43) OR a character ("o")
+ }
+, south: {
+ paneSelector: ".ui-layout-south"
+ , size: "auto"
+ , resizerCursor: "s-resize"
+ , customHotkey: ""
+ }
+, east: {
+ paneSelector: ".ui-layout-east"
+ , size: 200
+ , resizerCursor: "e-resize"
+ , customHotkey: ""
+ }
+, west: {
+ paneSelector: ".ui-layout-west"
+ , size: 200
+ , resizerCursor: "w-resize"
+ , customHotkey: ""
+ }
+, center: {
+ paneSelector: ".ui-layout-center"
+ , minWidth: 0
+ , minHeight: 0
+ }
+};
+
+$.layout.optionsMap = {
+ // layout/global options - NOT pane-options
+ layout: ("stateManagement,effects,zIndexes,errors,"
+ + "name,zIndex,scrollToBookmarkOnLoad,showErrorMessages,"
+ + "resizeWithWindow,resizeWithWindowDelay,resizeWithWindowMaxDelay,"
+ + "onresizeall,onresizeall_start,onresizeall_end,onload,onunload").split(",")
+// borderPanes: [ ALL options that are NOT specified as 'layout' ]
+ // default.panes options that apply to the center-pane (most options apply _only_ to border-panes)
+, center: ("paneClass,contentSelector,contentIgnoreSelector,findNestedContent,applyDemoStyles,triggerEventsOnLoad,"
+ + "showOverflowOnHover,maskContents,maskObjects,liveContentResizing,"
+ + "childOptions,initChildLayout,resizeChildLayout,destroyChildLayout,"
+ + "onresize,onresize_start,onresize_end,onsizecontent,onsizecontent_start,onsizecontent_end").split(",")
+ // options that MUST be specifically set 'per-pane' - CANNOT set in the panes (defaults) key
+, noDefault: ("paneSelector,resizerCursor,customHotkey").split(",")
+};
+
+/**
+ * Processes options passed in converts flat-format data into subkey (JSON) format
+ * In flat-format, subkeys are _currently_ separated with 2 underscores, like north__optName
+ * Plugins may also call this method so they can transform their own data
+ *
+ * @param {!Object} hash Data/options passed by user - may be a single level or nested levels
+ * @return {Object} Returns hash of minWidth & minHeight
+ */
+$.layout.transformData = function (hash) {
+ var json = { panes: {}, center: {} } // init return object
+ , data, branch, optKey, keys, key, val, i, c;
+
+ if (typeof hash !== "object") return json; // no options passed
+
+ // convert all 'flat-keys' to 'sub-key' format
+ for (optKey in hash) {
+ branch = json;
+ data = $.layout.optionsMap.layout;
+ val = hash[ optKey ];
+ keys = optKey.split("__"); // eg: west__size or north__fxSettings__duration
+ c = keys.length - 1;
+ // convert underscore-delimited to subkeys
+ for (i=0; i <= c; i++) {
+ key = keys[i];
+ if (i === c)
+ branch[key] = val;
+ else if (!branch[key])
+ branch[key] = {}; // create the subkey
+ // recurse to sub-key for next loop - if not done
+ branch = branch[key];
+ }
+ }
+
+ return json;
+};
+
+// INTERNAL CONFIG DATA - DO NOT CHANGE THIS!
+$.layout.backwardCompatibility = {
+ // data used by renameOldOptions()
+ map: {
+ // OLD Option Name: NEW Option Name
+ applyDefaultStyles: "applyDemoStyles"
+ , resizeNestedLayout: "resizeChildLayout"
+ , resizeWhileDragging: "livePaneResizing"
+ , resizeContentWhileDragging: "liveContentResizing"
+ , triggerEventsWhileDragging: "triggerEventsDuringLiveResize"
+ , maskIframesOnResize: "maskContents"
+ , useStateCookie: "stateManagement.enabled"
+ , "cookie.autoLoad": "stateManagement.autoLoad"
+ , "cookie.autoSave": "stateManagement.autoSave"
+ , "cookie.keys": "stateManagement.stateKeys"
+ , "cookie.name": "stateManagement.cookie.name"
+ , "cookie.domain": "stateManagement.cookie.domain"
+ , "cookie.path": "stateManagement.cookie.path"
+ , "cookie.expires": "stateManagement.cookie.expires"
+ , "cookie.secure": "stateManagement.cookie.secure"
+ // OLD Language options
+ , noRoomToOpenTip: "tips.noRoomToOpen"
+ , togglerTip_open: "tips.Close" // open = Close
+ , togglerTip_closed: "tips.Open" // closed = Open
+ , resizerTip: "tips.Resize"
+ , sliderTip: "tips.Slide"
+ }
+
+/**
+* @param {Object} opts
+*/
+, renameOptions: function (opts) {
+ var map = $.layout.backwardCompatibility.map
+ , oldData, newData, value
+ ;
+ for (var itemPath in map) {
+ oldData = getBranch( itemPath );
+ value = oldData.branch[ oldData.key ];
+ if (value !== undefined) {
+ newData = getBranch( map[itemPath], true );
+ newData.branch[ newData.key ] = value;
+ delete oldData.branch[ oldData.key ];
+ }
+ }
+
+ /**
+ * @param {string} path
+ * @param {boolean=} [create=false] Create path if does not exist
+ */
+ function getBranch (path, create) {
+ var a = path.split(".") // split keys into array
+ , c = a.length - 1
+ , D = { branch: opts, key: a[c] } // init branch at top & set key (last item)
+ , i = 0, k, undef;
+ for (; i<c; i++) { // skip the last key (data)
+ k = a[i];
+ if (D.branch[ k ] == undefined) { // child-key does not exist
+ if (create) {
+ D.branch = D.branch[ k ] = {}; // create child-branch
+ }
+ else // can't go any farther
+ D.branch = {}; // branch is undefined
+ }
+ else
+ D.branch = D.branch[ k ]; // get child-branch
+ }
+ return D;
+ };
+ }
+
+/**
+* @param {Object} opts
+*/
+, renameAllOptions: function (opts) {
+ var ren = $.layout.backwardCompatibility.renameOptions;
+ // rename root (layout) options
+ ren( opts );
+ // rename 'defaults' to 'panes'
+ if (opts.defaults) {
+ if (typeof opts.panes !== "object")
+ opts.panes = {};
+ $.extend(true, opts.panes, opts.defaults);
+ delete opts.defaults;
+ }
+ // rename options in the the options.panes key
+ if (opts.panes) ren( opts.panes );
+ // rename options inside *each pane key*, eg: options.west
+ $.each($.layout.config.allPanes, function (i, pane) {
+ if (opts[pane]) ren( opts[pane] );
+ });
+ return opts;
+ }
+};
+
+
+
+
+/* ============================================================
+ * BEGIN WIDGET: $( selector ).layout( {options} );
+ * ============================================================
+ */
+$.fn.layout = function (opts) {
+ var
+
+ // local aliases to global data
+ browser = $.layout.browser
+, _c = $.layout.config
+
+ // local aliases to utlity methods
+, cssW = $.layout.cssWidth
+, cssH = $.layout.cssHeight
+, elDims = $.layout.getElementDimensions
+, elCSS = $.layout.getElementCSS
+, evtObj = $.layout.getEventObject
+, evtPane = $.layout.parsePaneName
+
+/**
+ * options - populated by initOptions()
+ */
+, options = $.extend(true, {}, $.layout.defaults)
+, effects = options.effects = $.extend(true, {}, $.layout.effects)
+
+/**
+ * layout-state object
+ */
+, state = {
+ // generate unique ID to use for event.namespace so can unbind only events added by 'this layout'
+ id: "layout"+ $.now() // code uses alias: sID
+ , initialized: false
+ , container: {} // init all keys
+ , north: {}
+ , south: {}
+ , east: {}
+ , west: {}
+ , center: {}
+ }
+
+/**
+ * parent/child-layout pointers
+ */
+//, hasParentLayout = false - exists ONLY inside Instance so can be set externally
+, children = {
+ north: null
+ , south: null
+ , east: null
+ , west: null
+ , center: null
+ }
+
+/*
+ * ###########################
+ * INTERNAL HELPER FUNCTIONS
+ * ###########################
+ */
+
+ /**
+ * Manages all internal timers
+ */
+, timer = {
+ data: {}
+ , set: function (s, fn, ms) { timer.clear(s); timer.data[s] = setTimeout(fn, ms); }
+ , clear: function (s) { var t=timer.data; if (t[s]) {clearTimeout(t[s]); delete t[s];} }
+ }
+
+ /**
+ * Alert or console.log a message - IF option is enabled.
+ *
+ * @param {(string|!Object)} msg Message (or debug-data) to display
+ * @param {?boolean} popup True by default, means 'alert', false means use console.log
+ * @param {?boolean} debug True means is a widget debugging message
+ */
+, _log = function (msg, popup, debug) {
+ var o = options;
+ if ((o.showErrorMessages && !debug) || (debug && o.showDebugMessages))
+ $.layout.msg( o.name +' / '+ msg, (popup !== false) );
+ return false;
+ }
+
+ /**
+ * Executes a Callback function after a trigger event, like resize, open or close
+ *
+ * @param {string} evtName Name of the layout callback, eg "onresize_start"
+ * @param {?string} pane This is passed only so we can pass the 'pane object' to the callback
+ * @param {?string|?boolean} skipBoundEvents True = do not run events bound to the elements - only the callbacks set in options
+ */
+, _runCallbacks = function (evtName, pane, skipBoundEvents) {
+ var paneCB = pane && isStr(pane)
+ , s = paneCB ? state[pane] : state
+ , o = paneCB ? options[pane] : options
+ , lName = options.name
+ // names like onopen and onopen_end separate are interchangeable in options...
+ , lng = evtName + (evtName.match(/_/) ? "" : "_end")
+ , shrt = lng.match(/_end$/) ? lng.substr(0, lng.length - 4) : ""
+ , fn = o[lng] || o[shrt]
+ , retVal = "NC" // NC = No Callback
+ , args = []
+ , $P
+ ;
+ if ( !paneCB && $.type(skipBoundEvents) !== 'boolean' )
+ skipBoundEvents = pane; // allow pane param to be skipped for Layout callback
+
+ // first trigger the callback set in the options
+ if (fn) {
+ try {
+ // convert function name (string) to function object
+ if (isStr( fn )) {
+ if (fn.match(/,/)) {
+ // function name cannot contain a comma,
+ // so must be a function name AND a parameter to pass
+ args = fn.split(",")
+ , fn = eval(args[0]);
+ }
+ else // just the name of an external function?
+ fn = eval(fn);
+ }
+ // execute the callback, if exists
+ if ($.isFunction( fn )) {
+ if (args.length)
+ retVal = fn(args[1]); // pass the argument parsed from 'list'
+ else if ( paneCB )
+ // pass data: pane-name, pane-element, pane-state, pane-options, and layout-name
+ retVal = fn( pane, $Ps[pane], s, o, lName );
+ else // must be a layout/container callback - pass suitable info
+ retVal = fn( Instance, s, o, lName );
+ }
+ }
+ catch (ex) {
+ _log( options.errors.callbackError.replace(/EVENT/, $.trim(pane +" "+ lng)), false );
+ }
+ }
+
+ // trigger additional events bound directly to the pane
+ if (!skipBoundEvents && retVal !== false) {
+ if ( paneCB ) { // PANE events can be bound to each pane-elements
+ $P = $Ps[pane];
+ o = options[pane];
+ s = state[pane];
+ $P.triggerHandler('layoutpane'+ lng, [ pane, $P, s, o, lName ]);
+ if (shrt)
+ $P.triggerHandler('layoutpane'+ shrt, [ pane, $P, s, o, lName ]);
+ }
+ else { // LAYOUT events can be bound to the container-element
+ $N.triggerHandler('layout'+ lng, [ Instance, s, o, lName ]);
+ if (shrt)
+ $N.triggerHandler('layout'+ shrt, [ Instance, s, o, lName ]);
+ }
+ }
+
+ // ALWAYS resizeChildLayout after a resize event - even during initialization
+ if (evtName === "onresize_end" || evtName === "onsizecontent_end")
+ resizeChildLayout(pane);
+
+ return retVal;
+ }
+
+
+ /**
+ * cure iframe display issues in IE & other browsers
+ */
+, _fixIframe = function (pane) {
+ if (browser.mozilla) return; // skip FireFox - it auto-refreshes iframes onShow
+ var $P = $Ps[pane];
+ // if the 'pane' is an iframe, do it
+ if (state[pane].tagName === "IFRAME")
+ $P.css(_c.hidden).css(_c.visible);
+ else // ditto for any iframes INSIDE the pane
+ $P.find('IFRAME').css(_c.hidden).css(_c.visible);
+ }
+
+ /**
+ * @param {string} pane Can accept ONLY a 'pane' (east, west, etc)
+ * @param {number=} outerSize (optional) Can pass a width, allowing calculations BEFORE element is resized
+ * @return {number} Returns the innerHeight/Width of el by subtracting padding and borders
+ */
+, cssSize = function (pane, outerSize) {
+ var fn = _c[pane].dir=="horz" ? cssH : cssW;
+ return fn($Ps[pane], outerSize);
+ }
+
+ /**
+ * @param {string} pane Can accept ONLY a 'pane' (east, west, etc)
+ * @return {Object} Returns hash of minWidth & minHeight
+ */
+, cssMinDims = function (pane) {
+ // minWidth/Height means CSS width/height = 1px
+ var $P = $Ps[pane]
+ , dir = _c[pane].dir
+ , d = {
+ minWidth: 1001 - cssW($P, 1000)
+ , minHeight: 1001 - cssH($P, 1000)
+ }
+ ;
+ if (dir === "horz") d.minSize = d.minHeight;
+ if (dir === "vert") d.minSize = d.minWidth;
+ return d;
+ }
+
+ // TODO: see if these methods can be made more useful...
+ // TODO: *maybe* return cssW/H from these so caller can use this info
+
+ /**
+ * @param {(string|!Object)} el
+ * @param {number=} outerWidth
+ * @param {boolean=} [autoHide=false]
+ */
+, setOuterWidth = function (el, outerWidth, autoHide) {
+ var $E = el, w;
+ if (isStr(el)) $E = $Ps[el]; // west
+ else if (!el.jquery) $E = $(el);
+ w = cssW($E, outerWidth);
+ $E.css({ width: w });
+ if (w > 0) {
+ if (autoHide && $E.data('autoHidden') && $E.innerHeight() > 0) {
+ $E.show().data('autoHidden', false);
+ if (!browser.mozilla) // FireFox refreshes iframes - IE does not
+ // make hidden, then visible to 'refresh' display after animation
+ $E.css(_c.hidden).css(_c.visible);
+ }
+ }
+ else if (autoHide && !$E.data('autoHidden'))
+ $E.hide().data('autoHidden', true);
+ }
+
+ /**
+ * @param {(string|!Object)} el
+ * @param {number=} outerHeight
+ * @param {boolean=} [autoHide=false]
+ */
+, setOuterHeight = function (el, outerHeight, autoHide) {
+ var $E = el, h;
+ if (isStr(el)) $E = $Ps[el]; // west
+ else if (!el.jquery) $E = $(el);
+ h = cssH($E, outerHeight);
+ $E.css({ height: h, visibility: "visible" }); // may have been 'hidden' by sizeContent
+ if (h > 0 && $E.innerWidth() > 0) {
+ if (autoHide && $E.data('autoHidden')) {
+ $E.show().data('autoHidden', false);
+ if (!browser.mozilla) // FireFox refreshes iframes - IE does not
+ $E.css(_c.hidden).css(_c.visible);
+ }
+ }
+ else if (autoHide && !$E.data('autoHidden'))
+ $E.hide().data('autoHidden', true);
+ }
+
+ /**
+ * @param {(string|!Object)} el
+ * @param {number=} outerSize
+ * @param {boolean=} [autoHide=false]
+ */
+, setOuterSize = function (el, outerSize, autoHide) {
+ if (_c[pane].dir=="horz") // pane = north or south
+ setOuterHeight(el, outerSize, autoHide);
+ else // pane = east or west
+ setOuterWidth(el, outerSize, autoHide);
+ }
+
+
+ /**
+ * Converts any 'size' params to a pixel/integer size, if not already
+ * If 'auto' or a decimal/percentage is passed as 'size', a pixel-size is calculated
+ *
+ /**
+ * @param {string} pane
+ * @param {(string|number)=} size
+ * @param {string=} [dir]
+ * @return {number}
+ */
+, _parseSize = function (pane, size, dir) {
+ if (!dir) dir = _c[pane].dir;
+
+ if (isStr(size) && size.match(/%/))
+ size = (size === '100%') ? -1 : parseInt(size, 10) / 100; // convert % to decimal
+
+ if (size === 0)
+ return 0;
+ else if (size >= 1)
+ return parseInt(size, 10);
+
+ var o = options, avail = 0;
+ if (dir=="horz") // north or south or center.minHeight
+ avail = sC.innerHeight - ($Ps.north ? o.north.spacing_open : 0) - ($Ps.south ? o.south.spacing_open : 0);
+ else if (dir=="vert") // east or west or center.minWidth
+ avail = sC.innerWidth - ($Ps.west ? o.west.spacing_open : 0) - ($Ps.east ? o.east.spacing_open : 0);
+
+ if (size === -1) // -1 == 100%
+ return avail;
+ else if (size > 0) // percentage, eg: .25
+ return round(avail * size);
+ else if (pane=="center")
+ return 0;
+ else { // size < 0 || size=='auto' || size==Missing || size==Invalid
+ // auto-size the pane
+ var dim = (dir === "horz" ? "height" : "width")
+ , $P = $Ps[pane]
+ , $C = dim === 'height' ? $Cs[pane] : false
+ , vis = $.layout.showInvisibly($P) // show pane invisibly if hidden
+ , szP = $P.css(dim) // SAVE current pane size
+ , szC = $C ? $C.css(dim) : 0 // SAVE current content size
+ ;
+ $P.css(dim, "auto");
+ if ($C) $C.css(dim, "auto");
+ size = (dim === "height") ? $P.outerHeight() : $P.outerWidth(); // MEASURE
+ $P.css(dim, szP).css(vis); // RESET size & visibility
+ if ($C) $C.css(dim, szC);
+ return size;
+ }
+ }
+
+ /**
+ * Calculates current 'size' (outer-width or outer-height) of a border-pane - optionally with 'pane-spacing' added
+ *
+ * @param {(string|!Object)} pane
+ * @param {boolean=} [inclSpace=false]
+ * @return {number} Returns EITHER Width for east/west panes OR Height for north/south panes
+ */
+, getPaneSize = function (pane, inclSpace) {
+ var
+ $P = $Ps[pane]
+ , o = options[pane]
+ , s = state[pane]
+ , oSp = (inclSpace ? o.spacing_open : 0)
+ , cSp = (inclSpace ? o.spacing_closed : 0)
+ ;
+ if (!$P || s.isHidden)
+ return 0;
+ else if (s.isClosed || (s.isSliding && inclSpace))
+ return cSp;
+ else if (_c[pane].dir === "horz")
+ return $P.outerHeight() + oSp;
+ else // dir === "vert"
+ return $P.outerWidth() + oSp;
+ }
+
+ /**
+ * Calculate min/max pane dimensions and limits for resizing
+ *
+ * @param {string} pane
+ * @param {boolean=} [slide=false]
+ */
+, setSizeLimits = function (pane, slide) {
+ if (!isInitialized()) return;
+ var
+ o = options[pane]
+ , s = state[pane]
+ , c = _c[pane]
+ , dir = c.dir
+ , side = c.side.toLowerCase()
+ , type = c.sizeType.toLowerCase()
+ , isSliding = (slide != undefined ? slide : s.isSliding) // only open() passes 'slide' param
+ , $P = $Ps[pane]
+ , paneSpacing = o.spacing_open
+ // measure the pane on the *opposite side* from this pane
+ , altPane = _c.oppositeEdge[pane]
+ , altS = state[altPane]
+ , $altP = $Ps[altPane]
+ , altPaneSize = (!$altP || altS.isVisible===false || altS.isSliding ? 0 : (dir=="horz" ? $altP.outerHeight() : $altP.outerWidth()))
+ , altPaneSpacing = ((!$altP || altS.isHidden ? 0 : options[altPane][ altS.isClosed !== false ? "spacing_closed" : "spacing_open" ]) || 0)
+ // limitSize prevents this pane from 'overlapping' opposite pane
+ , containerSize = (dir=="horz" ? sC.innerHeight : sC.innerWidth)
+ , minCenterDims = cssMinDims("center")
+ , minCenterSize = dir=="horz" ? max(options.center.minHeight, minCenterDims.minHeight) : max(options.center.minWidth, minCenterDims.minWidth)
+ // if pane is 'sliding', then ignore center and alt-pane sizes - because 'overlays' them
+ , limitSize = (containerSize - paneSpacing - (isSliding ? 0 : (_parseSize("center", minCenterSize, dir) + altPaneSize + altPaneSpacing)))
+ , minSize = s.minSize = max( _parseSize(pane, o.minSize), cssMinDims(pane).minSize )
+ , maxSize = s.maxSize = min( (o.maxSize ? _parseSize(pane, o.maxSize) : 100000), limitSize )
+ , r = s.resizerPosition = {} // used to set resizing limits
+ , top = sC.insetTop
+ , left = sC.insetLeft
+ , W = sC.innerWidth
+ , H = sC.innerHeight
+ , rW = o.spacing_open // subtract resizer-width to get top/left position for south/east
+ ;
+ switch (pane) {
+ case "north": r.min = top + minSize;
+ r.max = top + maxSize;
+ break;
+ case "west": r.min = left + minSize;
+ r.max = left + maxSize;
+ break;
+ case "south": r.min = top + H - maxSize - rW;
+ r.max = top + H - minSize - rW;
+ break;
+ case "east": r.min = left + W - maxSize - rW;
+ r.max = left + W - minSize - rW;
+ break;
+ };
+ }
+
+ /**
+ * Returns data for setting the size/position of center pane. Also used to set Height for east/west panes
+ *
+ * @return JSON Returns a hash of all dimensions: top, bottom, left, right, (outer) width and (outer) height
+ */
+, calcNewCenterPaneDims = function () {
+ var d = {
+ top: getPaneSize("north", true) // true = include 'spacing' value for pane
+ , bottom: getPaneSize("south", true)
+ , left: getPaneSize("west", true)
+ , right: getPaneSize("east", true)
+ , width: 0
+ , height: 0
+ };
+
+ // NOTE: sC = state.container
+ // calc center-pane outer dimensions
+ d.width = sC.innerWidth - d.left - d.right; // outerWidth
+ d.height = sC.innerHeight - d.bottom - d.top; // outerHeight
+ // add the 'container border/padding' to get final positions relative to the container
+ d.top += sC.insetTop;
+ d.bottom += sC.insetBottom;
+ d.left += sC.insetLeft;
+ d.right += sC.insetRight;
+
+ return d;
+ }
+
+
+ /**
+ * @param {!Object} el
+ * @param {boolean=} [allStates=false]
+ */
+, getHoverClasses = function (el, allStates) {
+ var
+ $El = $(el)
+ , type = $El.data("layoutRole")
+ , pane = $El.data("layoutEdge")
+ , o = options[pane]
+ , root = o[type +"Class"]
+ , _pane = "-"+ pane // eg: "-west"
+ , _open = "-open"
+ , _closed = "-closed"
+ , _slide = "-sliding"
+ , _hover = "-hover " // NOTE the trailing space
+ , _state = $El.hasClass(root+_closed) ? _closed : _open
+ , _alt = _state === _closed ? _open : _closed
+ , classes = (root+_hover) + (root+_pane+_hover) + (root+_state+_hover) + (root+_pane+_state+_hover)
+ ;
+ if (allStates) // when 'removing' classes, also remove alternate-state classes
+ classes += (root+_alt+_hover) + (root+_pane+_alt+_hover);
+
+ if (type=="resizer" && $El.hasClass(root+_slide))
+ classes += (root+_slide+_hover) + (root+_pane+_slide+_hover);
+
+ return $.trim(classes);
+ }
+, addHover = function (evt, el) {
+ var $E = $(el || this);
+ if (evt && $E.data("layoutRole") === "toggler")
+ evt.stopPropagation(); // prevent triggering 'slide' on Resizer-bar
+ $E.addClass( getHoverClasses($E) );
+ }
+, removeHover = function (evt, el) {
+ var $E = $(el || this);
+ $E.removeClass( getHoverClasses($E, true) );
+ }
+
+, onResizerEnter = function (evt) { // ALSO called by toggler.mouseenter
+ if ($.fn.disableSelection)
+ $("body").disableSelection();
+ }
+, onResizerLeave = function (evt, el) {
+ var
+ e = el || this // el is only passed when called by the timer
+ , pane = $(e).data("layoutEdge")
+ , name = pane +"ResizerLeave"
+ ;
+ timer.clear(pane+"_openSlider"); // cancel slideOpen timer, if set
+ timer.clear(name); // cancel enableSelection timer - may re/set below
+ // this method calls itself on a timer because it needs to allow
+ // enough time for dragging to kick-in and set the isResizing flag
+ // dragging has a 100ms delay set, so this delay must be >100
+ if (!el) // 1st call - mouseleave event
+ timer.set(name, function(){ onResizerLeave(evt, e); }, 200);
+ // if user is resizing, then dragStop will enableSelection(), so can skip it here
+ else if (!state[pane].isResizing && $.fn.enableSelection) // 2nd call - by timer
+ $("body").enableSelection();
+ }
+
+/*
+ * ###########################
+ * INITIALIZATION METHODS
+ * ###########################
+ */
+
+ /**
+ * Initialize the layout - called automatically whenever an instance of layout is created
+ *
+ * @see none - triggered onInit
+ * @return mixed true = fully initialized | false = panes not initialized (yet) | 'cancel' = abort
+ */
+, _create = function () {
+ // initialize config/options
+ initOptions();
+ var o = options;
+
+ // TEMP state so isInitialized returns true during init process
+ state.creatingLayout = true;
+
+ // init plugins for this layout, if there are any (eg: stateManagement)
+ runPluginCallbacks( Instance, $.layout.onCreate );
+
+ // options & state have been initialized, so now run beforeLoad callback
+ // onload will CANCEL layout creation if it returns false
+ if (false === _runCallbacks("onload_start"))
+ return 'cancel';
+
+ // initialize the container element
+ _initContainer();
+
+ // bind hotkey function - keyDown - if required
+ initHotkeys();
+
+ // bind window.onunload
+ $(window).bind("unload."+ sID, unload);
+
+ // init plugins for this layout, if there are any (eg: customButtons)
+ runPluginCallbacks( Instance, $.layout.onLoad );
+
+ // if layout elements are hidden, then layout WILL NOT complete initialization!
+ // initLayoutElements will set initialized=true and run the onload callback IF successful
+ if (o.initPanes) _initLayoutElements();
+
+ delete state.creatingLayout;
+
+ return state.initialized;
+ }
+
+ /**
+ * Initialize the layout IF not already
+ *
+ * @see All methods in Instance run this test
+ * @return boolean true = layoutElements have been initialized | false = panes are not initialized (yet)
+ */
+, isInitialized = function () {
+ if (state.initialized || state.creatingLayout) return true; // already initialized
+ else return _initLayoutElements(); // try to init panes NOW
+ }
+
+ /**
+ * Initialize the layout - called automatically whenever an instance of layout is created
+ *
+ * @see _create() & isInitialized
+ * @return An object pointer to the instance created
+ */
+, _initLayoutElements = function (retry) {
+ // initialize config/options
+ var o = options;
+
+ // CANNOT init panes inside a hidden container!
+ if (!$N.is(":visible")) {
+ // handle Chrome bug where popup window 'has no height'
+ // if layout is BODY element, try again in 50ms
+ // SEE: http://layout.jquery-dev.net/samples/test_popup_window.html
+ if ( !retry && browser.webkit && $N[0].tagName === "BODY" )
+ setTimeout(function(){ _initLayoutElements(true); }, 50);
+ return false;
+ }
+
+ // a center pane is required, so make sure it exists
+ if (!getPane("center").length) {
+ return _log( o.errors.centerPaneMissing );
+ }
+
+ // TEMP state so isInitialized returns true during init process
+ state.creatingLayout = true;
+
+ // update Container dims
+ $.extend(sC, elDims( $N ));
+
+ // initialize all layout elements
+ initPanes(); // size & position panes - calls initHandles() - which calls initResizable()
+
+ if (o.scrollToBookmarkOnLoad) {
+ var l = self.location;
+ if (l.hash) l.replace( l.hash ); // scrollTo Bookmark
+ }
+
+ // check to see if this layout 'nested' inside a pane
+ if (Instance.hasParentLayout)
+ o.resizeWithWindow = false;
+ // bind resizeAll() for 'this layout instance' to window.resize event
+ else if (o.resizeWithWindow)
+ $(window).bind("resize."+ sID, windowResize);
+
+ delete state.creatingLayout;
+ state.initialized = true;
+
+ // init plugins for this layout, if there are any
+ runPluginCallbacks( Instance, $.layout.onReady );
+
+ // now run the onload callback, if exists
+ _runCallbacks("onload_end");
+
+ return true; // elements initialized successfully
+ }
+
+ /**
+ * Initialize nested layouts - called when _initLayoutElements completes
+ *
+ * NOT CURRENTLY USED
+ *
+ * @see _initLayoutElements
+ * @return An object pointer to the instance created
+ */
+, _initChildLayouts = function () {
+ $.each(_c.allPanes, function (idx, pane) {
+ if (options[pane].initChildLayout)
+ createChildLayout( pane );
+ });
+ }
+
+ /**
+ * Initialize nested layouts for a specific pane - can optionally pass layout-options
+ *
+ * @see _initChildLayouts
+ * @param {string|Object} evt_or_pane The pane being opened, ie: north, south, east, or west
+ * @param {Object=} [opts] Layout-options - if passed, will OVERRRIDE options[pane].childOptions
+ * @return An object pointer to the layout instance created - or null
+ */
+, createChildLayout = function (evt_or_pane, opts) {
+ var pane = evtPane.call(this, evt_or_pane)
+ , $P = $Ps[pane]
+ , C = children
+ ;
+ if ($P) {
+ var $C = $Cs[pane]
+ , o = opts || options[pane].childOptions
+ , d = "layout"
+ // determine which element is supposed to be the 'child container'
+ // if pane has a 'containerSelector' OR a 'content-div', use those instead of the pane
+ , $Cont = o.containerSelector ? $P.find( o.containerSelector ) : ($C || $P)
+ , containerFound = $Cont.length
+ // see if a child-layout ALREADY exists on this element
+ , child = containerFound ? (C[pane] = $Cont.data(d) || null) : null
+ ;
+ // if no layout exists, but childOptions are set, try to create the layout now
+ if (!child && containerFound && o)
+ child = C[pane] = $Cont.eq(0).layout(o) || null;
+ if (child)
+ child.hasParentLayout = true; // set parent-flag in child
+ }
+ Instance[pane].child = C[pane]; // ALWAYS set pane-object pointer, even if null
+ }
+
+, windowResize = function () {
+ var delay = Number(options.resizeWithWindowDelay);
+ if (delay < 10) delay = 100; // MUST have a delay!
+ // resizing uses a delay-loop because the resize event fires repeatly - except in FF, but delay anyway
+ timer.clear("winResize"); // if already running
+ timer.set("winResize", function(){
+ timer.clear("winResize");
+ timer.clear("winResizeRepeater");
+ var dims = elDims( $N );
+ // only trigger resizeAll() if container has changed size
+ if (dims.innerWidth !== sC.innerWidth || dims.innerHeight !== sC.innerHeight)
+ resizeAll();
+ }, delay);
+ // ALSO set fixed-delay timer, if not already running
+ if (!timer.data["winResizeRepeater"]) setWindowResizeRepeater();
+ }
+
+, setWindowResizeRepeater = function () {
+ var delay = Number(options.resizeWithWindowMaxDelay);
+ if (delay > 0)
+ timer.set("winResizeRepeater", function(){ setWindowResizeRepeater(); resizeAll(); }, delay);
+ }
+
+, unload = function () {
+ var o = options;
+
+ _runCallbacks("onunload_start");
+
+ // trigger plugin callabacks for this layout (eg: stateManagement)
+ runPluginCallbacks( Instance, $.layout.onUnload );
+
+ _runCallbacks("onunload_end");
+ }
+
+ /**
+ * Validate and initialize container CSS and events
+ *
+ * @see _create()
+ */
+, _initContainer = function () {
+ var
+ N = $N[0]
+ , tag = sC.tagName = N.tagName
+ , id = sC.id = N.id
+ , cls = sC.className = N.className
+ , o = options
+ , name = o.name
+ , fullPage= (tag === "BODY")
+ , props = "overflow,position,margin,padding,border"
+ , css = "layoutCSS"
+ , CSS = {}
+ , hid = "hidden" // used A LOT!
+ // see if this container is a 'pane' inside an outer-layout
+ , parent = $N.data("parentLayout") // parent-layout Instance
+ , pane = $N.data("layoutEdge") // pane-name in parent-layout
+ , isChild = parent && pane
+ ;
+ // sC -> state.container
+ sC.selector = $N.selector.split(".slice")[0];
+ sC.ref = (o.name ? o.name +' layout / ' : '') + tag + (id ? "#"+id : cls ? '.['+cls+']' : ''); // used in messages
+
+ $N .data({
+ layout: Instance
+ , layoutContainer: sID // FLAG to indicate this is a layout-container - contains unique internal ID
+ })
+ .addClass(o.containerClass)
+ ;
+ var layoutMethods = {
+ destroy: ''
+ , initPanes: ''
+ , resizeAll: 'resizeAll'
+ , resize: 'resizeAll'
+ };
+ // loop hash and bind all methods - include layoutID namespacing
+ for (name in layoutMethods) {
+ $N.bind("layout"+ name.toLowerCase() +"."+ sID, Instance[ layoutMethods[name] || name ]);
+ }
+
+ // if this container is another layout's 'pane', then set child/parent pointers
+ if (isChild) {
+ // update parent flag
+ Instance.hasParentLayout = true;
+ // set pointers to THIS child-layout (Instance) in parent-layout
+ // NOTE: parent.PANE.child is an ALIAS to parent.children.PANE
+ parent[pane].child = parent.children[pane] = $N.data("layout");
+ }
+
+ // SAVE original container CSS for use in destroy()
+ if (!$N.data(css)) {
+ // handle props like overflow different for BODY & HTML - has 'system default' values
+ if (fullPage) {
+ CSS = $.extend( elCSS($N, props), {
+ height: $N.css("height")
+ , overflow: $N.css("overflow")
+ , overflowX: $N.css("overflowX")
+ , overflowY: $N.css("overflowY")
+ });
+ // ALSO SAVE <HTML> CSS
+ var $H = $("html");
+ $H.data(css, {
+ height: "auto" // FF would return a fixed px-size!
+ , overflow: $H.css("overflow")
+ , overflowX: $H.css("overflowX")
+ , overflowY: $H.css("overflowY")
+ });
+ }
+ else // handle props normally for non-body elements
+ CSS = elCSS($N, props+",top,bottom,left,right,width,height,overflow,overflowX,overflowY");
+
+ $N.data(css, CSS);
+ }
+
+ try { // format html/body if this is a full page layout
+ if (fullPage) {
+ $("html").css({
+ height: "100%"
+ , overflow: hid
+ , overflowX: hid
+ , overflowY: hid
+ });
+ $("body").css({
+ position: "relative"
+ , height: "100%"
+ , overflow: hid
+ , overflowX: hid
+ , overflowY: hid
+ , margin: 0
+ , padding: 0 // TODO: test whether body-padding could be handled?
+ , border: "none" // a body-border creates problems because it cannot be measured!
+ });
+
+ // set current layout-container dimensions
+ $.extend(sC, elDims( $N ));
+ }
+ else { // set required CSS for overflow and position
+ // ENSURE container will not 'scroll'
+ CSS = { overflow: hid, overflowX: hid, overflowY: hid }
+ var
+ p = $N.css("position")
+ , h = $N.css("height")
+ ;
+ // if this is a NESTED layout, then container/outer-pane ALREADY has position and height
+ if (!isChild) {
+ if (!p || !p.match(/fixed|absolute|relative/))
+ CSS.position = "relative"; // container MUST have a 'position'
+ /*
+ if (!h || h=="auto")
+ CSS.height = "100%"; // container MUST have a 'height'
+ */
+ }
+ $N.css( CSS );
+
+ // set current layout-container dimensions
+ if ( $N.is(":visible") ) {
+ $.extend(sC, elDims( $N ));
+ if (sC.innerHeight < 1)
+ _log( o.errors.noContainerHeight.replace(/CONTAINER/, sC.ref) );
+ }
+ }
+ } catch (ex) {}
+ }
+
+ /**
+ * Bind layout hotkeys - if options enabled
+ *
+ * @see _create() and addPane()
+ * @param {string=} [panes=""] The edge(s) to process
+ */
+, initHotkeys = function (panes) {
+ panes = panes ? panes.split(",") : _c.borderPanes;
+ // bind keyDown to capture hotkeys, if option enabled for ANY pane
+ $.each(panes, function (i, pane) {
+ var o = options[pane];
+ if (o.enableCursorHotkey || o.customHotkey) {
+ $(document).bind("keydown."+ sID, keyDown); // only need to bind this ONCE
+ return false; // BREAK - binding was done
+ }
+ });
+ }
+
+ /**
+ * Build final OPTIONS data
+ *
+ * @see _create()
+ */
+, initOptions = function () {
+ var data, d, pane, key, val, i, c, o;
+
+ // reprocess user's layout-options to have correct options sub-key structure
+ opts = $.layout.transformData( opts ); // panes = default subkey
+
+ // auto-rename old options for backward compatibility
+ opts = $.layout.backwardCompatibility.renameAllOptions( opts );
+
+ // if user-options has 'panes' key (pane-defaults), clean it...
+ if (!$.isEmptyObject(opts.panes)) {
+ // REMOVE any pane-defaults that MUST be set per-pane
+ data = $.layout.optionsMap.noDefault;
+ for (i=0, c=data.length; i<c; i++) {
+ key = data[i];
+ delete opts.panes[key]; // OK if does not exist
+ }
+ // REMOVE any layout-options specified under opts.panes
+ data = $.layout.optionsMap.layout;
+ for (i=0, c=data.length; i<c; i++) {
+ key = data[i];
+ delete opts.panes[key]; // OK if does not exist
+ }
+ }
+
+ // MOVE any NON-layout-options from opts-root to opts.panes
+ data = $.layout.optionsMap.layout;
+ var rootKeys = $.layout.config.optionRootKeys;
+ for (key in opts) {
+ val = opts[key];
+ if ($.inArray(key, rootKeys) < 0 && $.inArray(key, data) < 0) {
+ if (!opts.panes[key])
+ opts.panes[key] = $.isPlainObject(val) ? $.extend(true, {}, val) : val;
+ delete opts[key]
+ }
+ }
+
+ // START by updating ALL options from opts
+ $.extend(true, options, opts);
+
+ // CREATE final options (and config) for EACH pane
+ $.each(_c.allPanes, function (i, pane) {
+
+ // apply 'pane-defaults' to CONFIG.[PANE]
+ _c[pane] = $.extend(true, {}, _c.panes, _c[pane]);
+
+ d = options.panes;
+ o = options[pane];
+
+ // center-pane uses SOME keys in defaults.panes branch
+ if (pane === 'center') {
+ // ONLY copy keys from opts.panes listed in: $.layout.optionsMap.center
+ data = $.layout.optionsMap.center; // list of 'center-pane keys'
+ for (i=0, c=data.length; i<c; i++) { // loop the list...
+ key = data[i];
+ // only need to use pane-default if pane-specific value not set
+ if (!opts.center[key] && (opts.panes[key] || !o[key]))
+ o[key] = d[key]; // pane-default
+ }
+ }
+ else {
+ // border-panes use ALL keys in defaults.panes branch
+ o = options[pane] = $.extend(true, {}, d, o); // re-apply pane-specific opts AFTER pane-defaults
+ createFxOptions( pane );
+ // ensure all border-pane-specific base-classes exist
+ if (!o.resizerClass) o.resizerClass = "ui-layout-resizer";
+ if (!o.togglerClass) o.togglerClass = "ui-layout-toggler";
+ }
+ // ensure we have base pane-class (ALL panes)
+ if (!o.paneClass) o.paneClass = "ui-layout-pane";
+ });
+
+ // update options.zIndexes if a zIndex-option specified
+ var zo = opts.zIndex
+ , z = options.zIndexes;
+ if (zo > 0) {
+ z.pane_normal = zo;
+ z.content_mask = max(zo+1, z.content_mask); // MIN = +1
+ z.resizer_normal = max(zo+2, z.resizer_normal); // MIN = +2
+ }
+
+ // DELETE 'panes' key now that we are done - values were copied to EACH pane
+ delete options.panes;
+
+
+ function createFxOptions ( pane ) {
+ var o = options[pane]
+ , d = options.panes;
+ // ensure fxSettings key to avoid errors
+ if (!o.fxSettings) o.fxSettings = {};
+ if (!d.fxSettings) d.fxSettings = {};
+
+ $.each(["_open","_close","_size"], function (i,n) {
+ var
+ sName = "fxName"+ n
+ , sSpeed = "fxSpeed"+ n
+ , sSettings = "fxSettings"+ n
+ // recalculate fxName according to specificity rules
+ , fxName = o[sName] =
+ o[sName] // options.west.fxName_open
+ || d[sName] // options.panes.fxName_open
+ || o.fxName // options.west.fxName
+ || d.fxName // options.panes.fxName
+ || "none" // MEANS $.layout.defaults.panes.fxName == "" || false || null || 0
+ ;
+ // validate fxName to ensure is valid effect - MUST have effect-config data in options.effects
+ if (fxName === "none" || !$.effects || !$.effects[fxName] || !options.effects[fxName])
+ fxName = o[sName] = "none"; // effect not loaded OR unrecognized fxName
+
+ // set vars for effects subkeys to simplify logic
+ var fx = options.effects[fxName] || {} // effects.slide
+ , fx_all = fx.all || null // effects.slide.all
+ , fx_pane = fx[pane] || null // effects.slide.west
+ ;
+ // create fxSpeed[_open|_close|_size]
+ o[sSpeed] =
+ o[sSpeed] // options.west.fxSpeed_open
+ || d[sSpeed] // options.west.fxSpeed_open
+ || o.fxSpeed // options.west.fxSpeed
+ || d.fxSpeed // options.panes.fxSpeed
+ || null // DEFAULT - let fxSetting.duration control speed
+ ;
+ // create fxSettings[_open|_close|_size]
+ o[sSettings] = $.extend(
+ true
+ , {}
+ , fx_all // effects.slide.all
+ , fx_pane // effects.slide.west
+ , d.fxSettings // options.panes.fxSettings
+ , o.fxSettings // options.west.fxSettings
+ , d[sSettings] // options.panes.fxSettings_open
+ , o[sSettings] // options.west.fxSettings_open
+ );
+ });
+
+ // DONE creating action-specific-settings for this pane,
+ // so DELETE generic options - are no longer meaningful
+ delete o.fxName;
+ delete o.fxSpeed;
+ delete o.fxSettings;
+ }
+ }
+
+ /**
+ * Initialize module objects, styling, size and position for all panes
+ *
+ * @see _initElements()
+ * @param {string} pane The pane to process
+ */
+, getPane = function (pane) {
+ var sel = options[pane].paneSelector
+ if (sel.substr(0,1)==="#") // ID selector
+ // NOTE: elements selected 'by ID' DO NOT have to be 'children'
+ return $N.find(sel).eq(0);
+ else { // class or other selector
+ var $P = $N.children(sel).eq(0);
+ // look for the pane nested inside a 'form' element
+ return $P.length ? $P : $N.children("form:first").children(sel).eq(0);
+ }
+ }
+
+, initPanes = function (evt) {
+ // stopPropagation if called by trigger("layoutinitpanes") - use evtPane utility
+ evtPane(evt);
+
+ // NOTE: do north & south FIRST so we can measure their height - do center LAST
+ $.each(_c.allPanes, function (idx, pane) {
+ addPane( pane, true );
+ });
+
+ // init the pane-handles NOW in case we have to hide or close the pane below
+ initHandles();
+
+ // now that all panes have been initialized and initially-sized,
+ // make sure there is really enough space available for each pane
+ $.each(_c.borderPanes, function (i, pane) {
+ if ($Ps[pane] && state[pane].isVisible) { // pane is OPEN
+ setSizeLimits(pane);
+ makePaneFit(pane); // pane may be Closed, Hidden or Resized by makePaneFit()
+ }
+ });
+ // size center-pane AGAIN in case we 'closed' a border-pane in loop above
+ sizeMidPanes("center");
+
+ // Chrome/Webkit sometimes fires callbacks BEFORE it completes resizing!
+ // Before RC30.3, there was a 10ms delay here, but that caused layout
+ // to load asynchrously, which is BAD, so try skipping delay for now
+
+ // process pane contents and callbacks, and init/resize child-layout if exists
+ $.each(_c.allPanes, function (i, pane) {
+ var o = options[pane];
+ if ($Ps[pane]) {
+ if (state[pane].isVisible) { // pane is OPEN
+ sizeContent(pane);
+ // trigger pane.onResize if triggerEventsOnLoad = true
+ if (o.triggerEventsOnLoad)
+ _runCallbacks("onresize_end", pane);
+ else // automatic if onresize called, otherwise call it specifically
+ // resize child - IF inner-layout already exists (created before this layout)
+ resizeChildLayout(pane);
+ }
+ // init childLayout - even if pane is not visible
+ if (o.initChildLayout && o.childOptions)
+ createChildLayout(pane);
+ }
+ });
+ }
+
+ /**
+ * Add a pane to the layout - subroutine of initPanes()
+ *
+ * @see initPanes()
+ * @param {string} pane The pane to process
+ * @param {boolean=} [force=false] Size content after init
+ */
+, addPane = function (pane, force) {
+ if (!force && !isInitialized()) return;
+ var
+ o = options[pane]
+ , s = state[pane]
+ , c = _c[pane]
+ , fx = s.fx
+ , dir = c.dir
+ , spacing = o.spacing_open || 0
+ , isCenter = (pane === "center")
+ , CSS = {}
+ , $P = $Ps[pane]
+ , size, minSize, maxSize
+ ;
+ // if pane-pointer already exists, remove the old one first
+ if ($P)
+ removePane( pane, false, true, false );
+ else
+ $Cs[pane] = false; // init
+
+ $P = $Ps[pane] = getPane(pane);
+ if (!$P.length) {
+ $Ps[pane] = false; // logic
+ return;
+ }
+
+ // SAVE original Pane CSS
+ if (!$P.data("layoutCSS")) {
+ var props = "position,top,left,bottom,right,width,height,overflow,zIndex,display,backgroundColor,padding,margin,border";
+ $P.data("layoutCSS", elCSS($P, props));
+ }
+
+ // create alias for pane data in Instance - initHandles will add more
+ Instance[pane] = { name: pane, pane: $Ps[pane], content: $Cs[pane], options: options[pane], state: state[pane], child: children[pane] };
+
+ // add classes, attributes & events
+ $P .data({
+ parentLayout: Instance // pointer to Layout Instance
+ , layoutPane: Instance[pane] // NEW pointer to pane-alias-object
+ , layoutEdge: pane
+ , layoutRole: "pane"
+ })
+ .css(c.cssReq).css("zIndex", options.zIndexes.pane_normal)
+ .css(o.applyDemoStyles ? c.cssDemo : {}) // demo styles
+ .addClass( o.paneClass +" "+ o.paneClass+"-"+pane ) // default = "ui-layout-pane ui-layout-pane-west" - may be a dupe of 'paneSelector'
+ .bind("mouseenter."+ sID, addHover )
+ .bind("mouseleave."+ sID, removeHover )
+ ;
+ var paneMethods = {
+ hide: ''
+ , show: ''
+ , toggle: ''
+ , close: ''
+ , open: ''
+ , slideOpen: ''
+ , slideClose: ''
+ , slideToggle: ''
+ , size: 'sizePane'
+ , sizePane: 'sizePane'
+ , sizeContent: ''
+ , sizeHandles: ''
+ , enableClosable: ''
+ , disableClosable: ''
+ , enableSlideable: ''
+ , disableSlideable: ''
+ , enableResizable: ''
+ , disableResizable: ''
+ , swapPanes: 'swapPanes'
+ , swap: 'swapPanes'
+ , move: 'swapPanes'
+ , removePane: 'removePane'
+ , remove: 'removePane'
+ , createChildLayout: ''
+ , resizeChildLayout: ''
+ , resizeAll: 'resizeAll'
+ , resizeLayout: 'resizeAll'
+ }
+ , name;
+ // loop hash and bind all methods - include layoutID namespacing
+ for (name in paneMethods) {
+ $P.bind("layoutpane"+ name.toLowerCase() +"."+ sID, Instance[ paneMethods[name] || name ]);
+ }
+
+ // see if this pane has a 'scrolling-content element'
+ initContent(pane, false); // false = do NOT sizeContent() - called later
+
+ if (!isCenter) {
+ // call _parseSize AFTER applying pane classes & styles - but before making visible (if hidden)
+ // if o.size is auto or not valid, then MEASURE the pane and use that as its 'size'
+ size = s.size = _parseSize(pane, o.size);
+ minSize = _parseSize(pane,o.minSize) || 1;
+ maxSize = _parseSize(pane,o.maxSize) || 100000;
+ if (size > 0) size = max(min(size, maxSize), minSize);
+
+ // state for border-panes
+ s.isClosed = false; // true = pane is closed
+ s.isSliding = false; // true = pane is currently open by 'sliding' over adjacent panes
+ s.isResizing= false; // true = pane is in process of being resized
+ s.isHidden = false; // true = pane is hidden - no spacing, resizer or toggler is visible!
+
+ // array for 'pin buttons' whose classNames are auto-updated on pane-open/-close
+ if (!s.pins) s.pins = [];
+ }
+ // states common to ALL panes
+ s.tagName = $P[0].tagName;
+ s.edge = pane; // useful if pane is (or about to be) 'swapped' - easy find out where it is (or is going)
+ s.noRoom = false; // true = pane 'automatically' hidden due to insufficient room - will unhide automatically
+ s.isVisible = true; // false = pane is invisible - closed OR hidden - simplify logic
+
+ // set css-position to account for container borders & padding
+ switch (pane) {
+ case "north": CSS.top = sC.insetTop;
+ CSS.left = sC.insetLeft;
+ CSS.right = sC.insetRight;
+ break;
+ case "south": CSS.bottom = sC.insetBottom;
+ CSS.left = sC.insetLeft;
+ CSS.right = sC.insetRight;
+ break;
+ case "west": CSS.left = sC.insetLeft; // top, bottom & height set by sizeMidPanes()
+ break;
+ case "east": CSS.right = sC.insetRight; // ditto
+ break;
+ case "center": // top, left, width & height set by sizeMidPanes()
+ }
+
+ if (dir === "horz") // north or south pane
+ CSS.height = cssH($P, size);
+ else if (dir === "vert") // east or west pane
+ CSS.width = cssW($P, size);
+ //else if (isCenter) {}
+
+ $P.css(CSS); // apply size -- top, bottom & height will be set by sizeMidPanes
+ if (dir != "horz") sizeMidPanes(pane, true); // true = skipCallback
+
+ // close or hide the pane if specified in settings
+ if (o.initClosed && o.closable && !o.initHidden)
+ close(pane, true, true); // true, true = force, noAnimation
+ else if (o.initHidden || o.initClosed)
+ hide(pane); // will be completely invisible - no resizer or spacing
+ else if (!s.noRoom)
+ // make the pane visible - in case was initially hidden
+ $P.css("display","block");
+ // ELSE setAsOpen() - called later by initHandles()
+
+ // RESET visibility now - pane will appear IF display:block
+ $P.css("visibility","visible");
+
+ // check option for auto-handling of pop-ups & drop-downs
+ if (o.showOverflowOnHover)
+ $P.hover( allowOverflow, resetOverflow );
+
+ // if manually adding a pane AFTER layout initialization, then...
+ if (state.initialized) {
+ initHandles( pane );
+ initHotkeys( pane );
+ resizeAll(); // will sizeContent if pane is visible
+ if (s.isVisible) { // pane is OPEN
+ if (o.triggerEventsOnLoad)
+ _runCallbacks("onresize_end", pane);
+ else // automatic if onresize called, otherwise call it specifically
+ // resize child - IF inner-layout already exists (created before this layout)
+ resizeChildLayout(pane); // a previously existing childLayout
+ }
+ if (o.initChildLayout && o.childOptions)
+ createChildLayout(pane);
+ }
+ }
+
+ /**
+ * Initialize module objects, styling, size and position for all resize bars and toggler buttons
+ *
+ * @see _create()
+ * @param {string=} [panes=""] The edge(s) to process
+ */
+, initHandles = function (panes) {
+ panes = panes ? panes.split(",") : _c.borderPanes;
+
+ // create toggler DIVs for each pane, and set object pointers for them, eg: $R.north = north toggler DIV
+ $.each(panes, function (i, pane) {
+ var $P = $Ps[pane];
+ $Rs[pane] = false; // INIT
+ $Ts[pane] = false;
+ if (!$P) return; // pane does not exist - skip
+
+ var
+ o = options[pane]
+ , s = state[pane]
+ , c = _c[pane]
+ , paneId = o.paneSelector.substr(0,1) === "#" ? o.paneSelector.substr(1) : ""
+ , rClass = o.resizerClass
+ , tClass = o.togglerClass
+ , side = c.side.toLowerCase()
+ , spacing = (s.isVisible ? o.spacing_open : o.spacing_closed)
+ , _pane = "-"+ pane // used for classNames
+ , _state = (s.isVisible ? "-open" : "-closed") // used for classNames
+ , I = Instance[pane]
+ // INIT RESIZER BAR
+ , $R = I.resizer = $Rs[pane] = $("<div></div>")
+ // INIT TOGGLER BUTTON
+ , $T = I.toggler = (o.closable ? $Ts[pane] = $("<div></div>") : false)
+ ;
+
+ //if (s.isVisible && o.resizable) ... handled by initResizable
+ if (!s.isVisible && o.slidable)
+ $R.attr("title", o.tips.Slide).css("cursor", o.sliderCursor);
+
+ $R // if paneSelector is an ID, then create a matching ID for the resizer, eg: "#paneLeft" => "paneLeft-resizer"
+ .attr("id", paneId ? paneId +"-resizer" : "" )
+ .data({
+ parentLayout: Instance
+ , layoutPane: Instance[pane] // NEW pointer to pane-alias-object
+ , layoutEdge: pane
+ , layoutRole: "resizer"
+ })
+ .css(_c.resizers.cssReq).css("zIndex", options.zIndexes.resizer_normal)
+ .css(o.applyDemoStyles ? _c.resizers.cssDemo : {}) // add demo styles
+ .addClass(rClass +" "+ rClass+_pane)
+ .hover(addHover, removeHover) // ALWAYS add hover-classes, even if resizing is not enabled - handle with CSS instead
+ .hover(onResizerEnter, onResizerLeave) // ALWAYS NEED resizer.mouseleave to balance toggler.mouseenter
+ .appendTo($N) // append DIV to container
+ ;
+
+ if ($T) {
+ $T // if paneSelector is an ID, then create a matching ID for the resizer, eg: "#paneLeft" => "#paneLeft-toggler"
+ .attr("id", paneId ? paneId +"-toggler" : "" )
+ .data({
+ parentLayout: Instance
+ , layoutPane: Instance[pane] // NEW pointer to pane-alias-object
+ , layoutEdge: pane
+ , layoutRole: "toggler"
+ })
+ .css(_c.togglers.cssReq) // add base/required styles
+ .css(o.applyDemoStyles ? _c.togglers.cssDemo : {}) // add demo styles
+ .addClass(tClass +" "+ tClass+_pane)
+ .hover(addHover, removeHover) // ALWAYS add hover-classes, even if toggling is not enabled - handle with CSS instead
+ .bind("mouseenter", onResizerEnter) // NEED toggler.mouseenter because mouseenter MAY NOT fire on resizer
+ .appendTo($R) // append SPAN to resizer DIV
+ ;
+ // ADD INNER-SPANS TO TOGGLER
+ if (o.togglerContent_open) // ui-layout-open
+ $("<span>"+ o.togglerContent_open +"</span>")
+ .data({
+ layoutEdge: pane
+ , layoutRole: "togglerContent"
+ })
+ .data("layoutRole", "togglerContent")
+ .data("layoutEdge", pane)
+ .addClass("content content-open")
+ .css("display","none")
+ .appendTo( $T )
+ //.hover( addHover, removeHover ) // use ui-layout-toggler-west-hover .content-open instead!
+ ;
+ if (o.togglerContent_closed) // ui-layout-closed
+ $("<span>"+ o.togglerContent_closed +"</span>")
+ .data({
+ layoutEdge: pane
+ , layoutRole: "togglerContent"
+ })
+ .addClass("content content-closed")
+ .css("display","none")
+ .appendTo( $T )
+ //.hover( addHover, removeHover ) // use ui-layout-toggler-west-hover .content-closed instead!
+ ;
+ // ADD TOGGLER.click/.hover
+ enableClosable(pane);
+ }
+
+ // add Draggable events
+ initResizable(pane);
+
+ // ADD CLASSNAMES & SLIDE-BINDINGS - eg: class="resizer resizer-west resizer-open"
+ if (s.isVisible)
+ setAsOpen(pane); // onOpen will be called, but NOT onResize
+ else {
+ setAsClosed(pane); // onClose will be called
+ bindStartSlidingEvent(pane, true); // will enable events IF option is set
+ }
+
+ });
+
+ // SET ALL HANDLE DIMENSIONS
+ sizeHandles();
+ }
+
+
+ /**
+ * Initialize scrolling ui-layout-content div - if exists
+ *
+ * @see initPane() - or externally after an Ajax injection
+ * @param {string} [pane] The pane to process
+ * @param {boolean=} [resize=true] Size content after init
+ */
+, initContent = function (pane, resize) {
+ if (!isInitialized()) return;
+ var
+ o = options[pane]
+ , sel = o.contentSelector
+ , I = Instance[pane]
+ , $P = $Ps[pane]
+ , $C
+ ;
+ if (sel) $C = I.content = $Cs[pane] = (o.findNestedContent)
+ ? $P.find(sel).eq(0) // match 1-element only
+ : $P.children(sel).eq(0)
+ ;
+ if ($C && $C.length) {
+ $C.data("layoutRole", "content");
+ // SAVE original Pane CSS
+ if (!$C.data("layoutCSS"))
+ $C.data("layoutCSS", elCSS($C, "height"));
+ $C.css( _c.content.cssReq );
+ if (o.applyDemoStyles) {
+ $C.css( _c.content.cssDemo ); // add padding & overflow: auto to content-div
+ $P.css( _c.content.cssDemoPane ); // REMOVE padding/scrolling from pane
+ }
+ state[pane].content = {}; // init content state
+ if (resize !== false) sizeContent(pane);
+ // sizeContent() is called AFTER init of all elements
+ }
+ else
+ I.content = $Cs[pane] = false;
+ }
+
+
+ /**
+ * Add resize-bars to all panes that specify it in options
+ * -dependancy: $.fn.resizable - will skip if not found
+ *
+ * @see _create()
+ * @param {string=} [panes=""] The edge(s) to process
+ */
+, initResizable = function (panes) {
+ var draggingAvailable = $.layout.plugins.draggable
+ , side // set in start()
+ ;
+ panes = panes ? panes.split(",") : _c.borderPanes;
+
+ $.each(panes, function (idx, pane) {
+ var o = options[pane];
+ if (!draggingAvailable || !$Ps[pane] || !o.resizable) {
+ o.resizable = false;
+ return true; // skip to next
+ }
+
+ var s = state[pane]
+ , z = options.zIndexes
+ , c = _c[pane]
+ , side = c.dir=="horz" ? "top" : "left"
+ , opEdge = _c.oppositeEdge[pane]
+ , masks = pane +",center,"+ opEdge + (c.dir=="horz" ? ",west,east" : "")
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , base = o.resizerClass
+ , lastPos = 0 // used when live-resizing
+ , r, live // set in start because may change
+ // 'drag' classes are applied to the ORIGINAL resizer-bar while dragging is in process
+ , resizerClass = base+"-drag" // resizer-drag
+ , resizerPaneClass = base+"-"+pane+"-drag" // resizer-north-drag
+ // 'helper' class is applied to the CLONED resizer-bar while it is being dragged
+ , helperClass = base+"-dragging" // resizer-dragging
+ , helperPaneClass = base+"-"+pane+"-dragging" // resizer-north-dragging
+ , helperLimitClass = base+"-dragging-limit" // resizer-drag
+ , helperPaneLimitClass = base+"-"+pane+"-dragging-limit" // resizer-north-drag
+ , helperClassesSet = false // logic var
+ ;
+
+ if (!s.isClosed)
+ $R.attr("title", o.tips.Resize)
+ .css("cursor", o.resizerCursor); // n-resize, s-resize, etc
+
+ $R.draggable({
+ containment: $N[0] // limit resizing to layout container
+ , axis: (c.dir=="horz" ? "y" : "x") // limit resizing to horz or vert axis
+ , delay: 0
+ , distance: 1
+ , grid: o.resizingGrid
+ // basic format for helper - style it using class: .ui-draggable-dragging
+ , helper: "clone"
+ , opacity: o.resizerDragOpacity
+ , addClasses: false // avoid ui-state-disabled class when disabled
+ //, iframeFix: o.draggableIframeFix // TODO: consider using when bug is fixed
+ , zIndex: z.resizer_drag
+
+ , start: function (e, ui) {
+ // REFRESH options & state pointers in case we used swapPanes
+ o = options[pane];
+ s = state[pane];
+ // re-read options
+ live = o.livePaneResizing;
+
+ // ondrag_start callback - will CANCEL hide if returns false
+ // TODO: dragging CANNOT be cancelled like this, so see if there is a way?
+ if (false === _runCallbacks("ondrag_start", pane)) return false;
+
+ s.isResizing = true; // prevent pane from closing while resizing
+ timer.clear(pane+"_closeSlider"); // just in case already triggered
+
+ // SET RESIZER LIMITS - used in drag()
+ setSizeLimits(pane); // update pane/resizer state
+ r = s.resizerPosition;
+ lastPos = ui.position[ side ]
+
+ $R.addClass( resizerClass +" "+ resizerPaneClass ); // add drag classes
+ helperClassesSet = false; // reset logic var - see drag()
+
+ // DISABLE TEXT SELECTION (probably already done by resizer.mouseOver)
+ $('body').disableSelection();
+
+ // MASK PANES CONTAINING IFRAMES, APPLETS OR OTHER TROUBLESOME ELEMENTS
+ showMasks( masks );
+ }
+
+ , drag: function (e, ui) {
+ if (!helperClassesSet) { // can only add classes after clone has been added to the DOM
+ //$(".ui-draggable-dragging")
+ ui.helper
+ .addClass( helperClass +" "+ helperPaneClass ) // add helper classes
+ .css({ right: "auto", bottom: "auto" }) // fix dir="rtl" issue
+ .children().css("visibility","hidden") // hide toggler inside dragged resizer-bar
+ ;
+ helperClassesSet = true;
+ // draggable bug!? RE-SET zIndex to prevent E/W resize-bar showing through N/S pane!
+ if (s.isSliding) $Ps[pane].css("zIndex", z.pane_sliding);
+ }
+ // CONTAIN RESIZER-BAR TO RESIZING LIMITS
+ var limit = 0;
+ if (ui.position[side] < r.min) {
+ ui.position[side] = r.min;
+ limit = -1;
+ }
+ else if (ui.position[side] > r.max) {
+ ui.position[side] = r.max;
+ limit = 1;
+ }
+ // ADD/REMOVE dragging-limit CLASS
+ if (limit) {
+ ui.helper.addClass( helperLimitClass +" "+ helperPaneLimitClass ); // at dragging-limit
+ window.defaultStatus = (limit>0 && pane.match(/(north|west)/)) || (limit<0 && pane.match(/(south|east)/)) ? o.tips.maxSizeWarning : o.tips.minSizeWarning;
+ }
+ else {
+ ui.helper.removeClass( helperLimitClass +" "+ helperPaneLimitClass ); // not at dragging-limit
+ window.defaultStatus = "";
+ }
+ // DYNAMICALLY RESIZE PANES IF OPTION ENABLED
+ // won't trigger unless resizer has actually moved!
+ if (live && Math.abs(ui.position[side] - lastPos) >= o.liveResizingTolerance) {
+ lastPos = ui.position[side];
+ resizePanes(e, ui, pane)
+ }
+ }
+
+ , stop: function (e, ui) {
+ $('body').enableSelection(); // RE-ENABLE TEXT SELECTION
+ window.defaultStatus = ""; // clear 'resizing limit' message from statusbar
+ $R.removeClass( resizerClass +" "+ resizerPaneClass ); // remove drag classes from Resizer
+ s.isResizing = false;
+ resizePanes(e, ui, pane, true, masks); // true = resizingDone
+ }
+
+ });
+ });
+
+ /**
+ * resizePanes
+ *
+ * Sub-routine called from stop() - and drag() if livePaneResizing
+ *
+ * @param {!Object} evt
+ * @param {!Object} ui
+ * @param {string} pane
+ * @param {boolean=} [resizingDone=false]
+ */
+ var resizePanes = function (evt, ui, pane, resizingDone, masks) {
+ var dragPos = ui.position
+ , c = _c[pane]
+ , o = options[pane]
+ , s = state[pane]
+ , resizerPos
+ ;
+ switch (pane) {
+ case "north": resizerPos = dragPos.top; break;
+ case "west": resizerPos = dragPos.left; break;
+ case "south": resizerPos = sC.offsetHeight - dragPos.top - o.spacing_open; break;
+ case "east": resizerPos = sC.offsetWidth - dragPos.left - o.spacing_open; break;
+ };
+ // remove container margin from resizer position to get the pane size
+ var newSize = resizerPos - sC["inset"+ c.side];
+
+ // Disable OR Resize Mask(s) created in drag.start
+ if (!resizingDone) {
+ // ensure we meet liveResizingTolerance criteria
+ if (Math.abs(newSize - s.size) < o.liveResizingTolerance)
+ return; // SKIP resize this time
+ // resize the pane
+ manualSizePane(pane, newSize, false, true); // true = noAnimation
+ sizeMasks(); // resize all visible masks
+ }
+ else { // resizingDone
+ // ondrag_end callback
+ if (false !== _runCallbacks("ondrag_end", pane))
+ manualSizePane(pane, newSize, false, true); // true = noAnimation
+ hideMasks(); // hide all masks, which include panes with 'content/iframe-masks'
+ if (s.isSliding && masks) // RE-SHOW only 'object-masks' so objects won't show through sliding pane
+ showMasks( masks, true ); // true = onlyForObjects
+ }
+ };
+ }
+
+ /**
+ * sizeMask
+ *
+ * Needed to overlay a DIV over an IFRAME-pane because mask CANNOT be *inside* the pane
+ * Called when mask created, and during livePaneResizing
+ */
+, sizeMask = function () {
+ var $M = $(this)
+ , pane = $M.data("layoutMask") // eg: "west"
+ , s = state[pane]
+ ;
+ // only masks over an IFRAME-pane need manual resizing
+ if (s.tagName == "IFRAME" && s.isVisible) // no need to mask closed/hidden panes
+ $M.css({
+ top: s.offsetTop
+ , left: s.offsetLeft
+ , width: s.outerWidth
+ , height: s.outerHeight
+ });
+ /* ALT Method...
+ var $P = $Ps[pane];
+ $M.css( $P.position() ).css({ width: $P[0].offsetWidth, height: $P[0].offsetHeight });
+ */
+ }
+, sizeMasks = function () {
+ $Ms.each( sizeMask ); // resize all 'visible' masks
+ }
+
+, showMasks = function (panes, onlyForObjects) {
+ var a = panes ? panes.split(",") : $.layout.config.allPanes
+ , z = options.zIndexes
+ , o, s;
+ $.each(a, function(i,p){
+ s = state[p];
+ o = options[p];
+ if (s.isVisible && ( (!onlyForObjects && o.maskContents) || o.maskObjects )) {
+ getMasks(p).each(function(){
+ sizeMask.call(this);
+ this.style.zIndex = s.isSliding ? z.pane_sliding+1 : z.pane_normal+1
+ this.style.display = "block";
+ });
+ }
+ });
+ }
+
+, hideMasks = function () {
+ // ensure no pane is resizing - could be a timing issue
+ var skip;
+ $.each( $.layout.config.borderPanes, function(i,p){
+ if (state[p].isResizing) {
+ skip = true;
+ return false; // BREAK
+ }
+ });
+ if (!skip)
+ $Ms.hide(); // hide ALL masks
+ }
+
+, getMasks = function (pane) {
+ var $Masks = $([])
+ , $M, i = 0, c = $Ms.length
+ ;
+ for (; i<c; i++) {
+ $M = $Ms.eq(i);
+ if ($M.data("layoutMask") === pane)
+ $Masks = $Masks.add( $M );
+ }
+ if ($Masks.length)
+ return $Masks;
+ else
+ return createMasks(pane);
+ }
+
+ /**
+ * createMasks
+ *
+ * Generates both DIV (ALWAYS used) and IFRAME (optional) elements as masks
+ * An IFRAME mask is created *under* the DIV when maskObjects=true, because a DIV cannot mask an applet
+ */
+, createMasks = function (pane) {
+ var
+ $P = $Ps[pane]
+ , s = state[pane]
+ , o = options[pane]
+ , z = options.zIndexes
+ //, objMask = o.maskObjects && s.tagName != "IFRAME" // check for option
+ , $Masks = $([])
+ , isIframe, el, $M, css, i
+ ;
+ if (!o.maskContents && !o.maskObjects) return $Masks;
+ // if o.maskObjects=true, then loop TWICE to create BOTH kinds of mask, else only create a DIV
+ for (i=0; i < (o.maskObjects ? 2 : 1); i++) {
+ isIframe = o.maskObjects && i==0;
+ el = document.createElement( isIframe ? "iframe" : "div" );
+ $M = $(el).data("layoutMask", pane); // add data to relate mask to pane
+ el.className = "ui-layout-mask ui-layout-mask-"+ pane; // for user styling
+ css = el.style;
+ // styles common to both DIVs and IFRAMES
+ css.display = "block";
+ css.position = "absolute";
+ if (isIframe) { // IFRAME-only props
+ el.frameborder = 0;
+ el.src = "about:blank";
+ css.opacity = 0;
+ css.filter = "Alpha(Opacity='0')";
+ css.border = 0;
+ }
+ // if pane is an IFRAME, then must mask the pane itself
+ if (s.tagName == "IFRAME") {
+ // NOTE sizing done by a subroutine so can be called during live-resizing
+ css.zIndex = z.pane_normal+1; // 1-higher than pane
+ $N.append( el ); // append to LAYOUT CONTAINER
+ }
+ // otherwise put masks *inside the pane* to mask its contents
+ else {
+ $M.addClass("ui-layout-mask-inside-pane");
+ css.zIndex = o.maskZindex || z.content_mask; // usually 1, but customizable
+ css.top = 0;
+ css.left = 0;
+ css.width = "100%";
+ css.height = "100%";
+ $P.append( el ); // append INSIDE pane element
+ }
+ // add to return object
+ $Masks = $Masks.add( el );
+ // add Mask to cached array so can be resized & reused
+ $Ms = $Ms.add( el );
+ }
+ return $Masks;
+ }
+
+
+ /**
+ * Destroy this layout and reset all elements
+ *
+ * @param {boolean=} [destroyChildren=false] Destory Child-Layouts first?
+ */
+, destroy = function (evt_or_destroyChildren, destroyChildren) {
+ // UNBIND layout events and remove global object
+ $(window).unbind("."+ sID); // resize & unload
+ $(document).unbind("."+ sID); // keyDown (hotkeys)
+
+ if (typeof evt_or_destroyChildren === "object")
+ // stopPropagation if called by trigger("layoutdestroy") - use evtPane utility
+ evtPane(evt_or_destroyChildren);
+ else // no event, so transfer 1st param to destroyChildren param
+ destroyChildren = evt_or_destroyChildren;
+
+ // need to look for parent layout BEFORE we remove the container data, else skips a level
+ //var parentPane = Instance.hasParentLayout ? $.layout.getParentPaneInstance( $N ) : null;
+
+ // reset layout-container
+ $N .clearQueue()
+ .removeData("layout")
+ .removeData("layoutContainer")
+ .removeClass(options.containerClass)
+ .unbind("."+ sID) // remove ALL Layout events
+ ;
+
+ // remove all mask elements that have been created
+ $Ms.remove();
+
+ // loop all panes to remove layout classes, attributes and bindings
+ $.each(_c.allPanes, function (i, pane) {
+ removePane( pane, false, true, destroyChildren ); // true = skipResize
+ });
+
+ // do NOT reset container CSS if is a 'pane' (or 'content') in an outer-layout - ie, THIS layout is 'nested'
+ var css = "layoutCSS";
+ if ($N.data(css) && !$N.data("layoutRole")) // RESET CSS
+ $N.css( $N.data(css) ).removeData(css);
+
+ // for full-page layouts, also reset the <HTML> CSS
+ if (sC.tagName === "BODY" && ($N = $("html")).data(css)) // RESET <HTML> CSS
+ $N.css( $N.data(css) ).removeData(css);
+
+ // trigger plugins for this layout, if there are any
+ runPluginCallbacks( Instance, $.layout.onDestroy );
+
+ // trigger state-management and onunload callback
+ unload();
+
+ // clear the Instance of everything except for container & options (so could recreate)
+ // RE-CREATE: myLayout = myLayout.container.layout( myLayout.options );
+ for (n in Instance)
+ if (!n.match(/^(container|options)$/)) delete Instance[ n ];
+ // add a 'destroyed' flag to make it easy to check
+ Instance.destroyed = true;
+
+ // if this is a child layout, CLEAR the child-pointer in the parent
+ /* for now the pointer REMAINS, but with only container, options and destroyed keys
+ if (parentPane) {
+ var layout = parentPane.pane.data("parentLayout");
+ parentPane.child = layout.children[ parentPane.name ] = null;
+ }
+ */
+
+ return Instance; // for coding convenience
+ }
+
+ /**
+ * Remove a pane from the layout - subroutine of destroy()
+ *
+ * @see destroy()
+ * @param {string|Object} evt_or_pane The pane to process
+ * @param {boolean=} [remove=false] Remove the DOM element?
+ * @param {boolean=} [skipResize=false] Skip calling resizeAll()?
+ * @param {boolean=} [destroyChild=true] Destroy Child-layouts? If not passed, obeys options setting
+ */
+, removePane = function (evt_or_pane, remove, skipResize, destroyChild) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , $P = $Ps[pane]
+ , $C = $Cs[pane]
+ , $R = $Rs[pane]
+ , $T = $Ts[pane]
+ ;
+ // NOTE: elements can still exist even after remove()
+ // so check for missing data(), which is cleared by removed()
+ if ($P && $.isEmptyObject( $P.data() )) $P = false;
+ if ($C && $.isEmptyObject( $C.data() )) $C = false;
+ if ($R && $.isEmptyObject( $R.data() )) $R = false;
+ if ($T && $.isEmptyObject( $T.data() )) $T = false;
+
+ if ($P) $P.stop(true, true);
+
+ // check for a child layout
+ var o = options[pane]
+ , s = state[pane]
+ , d = "layout"
+ , css = "layoutCSS"
+ , child = children[pane] || ($P ? $P.data(d) : 0) || ($C ? $C.data(d) : 0) || null
+ , destroy = destroyChild !== undefined ? destroyChild : o.destroyChildLayout
+ ;
+
+ // FIRST destroy the child-layout(s)
+ if (destroy && child && !child.destroyed) {
+ child.destroy(true); // tell child-layout to destroy ALL its child-layouts too
+ if (child.destroyed) // destroy was successful
+ child = null; // clear pointer for logic below
+ }
+
+ if ($P && remove && !child)
+ $P.remove();
+ else if ($P && $P[0]) {
+ // create list of ALL pane-classes that need to be removed
+ var root = o.paneClass // default="ui-layout-pane"
+ , pRoot = root +"-"+ pane // eg: "ui-layout-pane-west"
+ , _open = "-open"
+ , _sliding= "-sliding"
+ , _closed = "-closed"
+ , classes = [ root, root+_open, root+_closed, root+_sliding, // generic classes
+ pRoot, pRoot+_open, pRoot+_closed, pRoot+_sliding ] // pane-specific classes
+ ;
+ $.merge(classes, getHoverClasses($P, true)); // ADD hover-classes
+ // remove all Layout classes from pane-element
+ $P .removeClass( classes.join(" ") ) // remove ALL pane-classes
+ .removeData("parentLayout")
+ .removeData("layoutPane")
+ .removeData("layoutRole")
+ .removeData("layoutEdge")
+ .removeData("autoHidden") // in case set
+ .unbind("."+ sID) // remove ALL Layout events
+ // TODO: remove these extra unbind commands when jQuery is fixed
+ //.unbind("mouseenter"+ sID)
+ //.unbind("mouseleave"+ sID)
+ ;
+ // do NOT reset CSS if this pane/content is STILL the container of a nested layout!
+ // the nested layout will reset its 'container' CSS when/if it is destroyed
+ if ($C && $C.data(d)) {
+ // a content-div may not have a specific width, so give it one to contain the Layout
+ $C.width( $C.width() );
+ child.resizeAll(); // now resize the Layout
+ }
+ else if ($C)
+ $C.css( $C.data(css) ).removeData(css).removeData("layoutRole");
+ // remove pane AFTER content in case there was a nested layout
+ if (!$P.data(d))
+ $P.css( $P.data(css) ).removeData(css);
+ }
+
+ // REMOVE pane resizer and toggler elements
+ if ($T) $T.remove();
+ if ($R) $R.remove();
+
+ // CLEAR all pointers and state data
+ Instance[pane] = $Ps[pane] = $Cs[pane] = $Rs[pane] = $Ts[pane] = children[pane] = false;
+ s = { removed: true };
+
+ if (!skipResize)
+ resizeAll();
+ }
+
+
+/*
+ * ###########################
+ * ACTION METHODS
+ * ###########################
+ */
+
+, _hidePane = function (pane) {
+ var $P = $Ps[pane]
+ , o = options[pane]
+ , s = $P[0].style
+ ;
+ if (o.useOffscreenClose) {
+ if (!$P.data(_c.offscreenReset))
+ $P.data(_c.offscreenReset, { left: s.left, right: s.right });
+ $P.css( _c.offscreenCSS );
+ }
+ else
+ $P.hide().removeData(_c.offscreenReset);
+ }
+
+, _showPane = function (pane) {
+ var $P = $Ps[pane]
+ , o = options[pane]
+ , off = _c.offscreenCSS
+ , old = $P.data(_c.offscreenReset)
+ , s = $P[0].style
+ ;
+ $P .show() // ALWAYS show, just in case
+ .removeData(_c.offscreenReset);
+ if (o.useOffscreenClose && old) {
+ if (s.left == off.left)
+ s.left = old.left;
+ if (s.right == off.right)
+ s.right = old.right;
+ }
+ }
+
+
+ /**
+ * Completely 'hides' a pane, including its spacing - as if it does not exist
+ * The pane is not actually 'removed' from the source, so can use 'show' to un-hide it
+ *
+ * @param {string|Object} evt_or_pane The pane being hidden, ie: north, south, east, or west
+ * @param {boolean=} [noAnimation=false]
+ */
+, hide = function (evt_or_pane, noAnimation) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , o = options[pane]
+ , s = state[pane]
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ ;
+ if (!$P || s.isHidden) return; // pane does not exist OR is already hidden
+
+ // onhide_start callback - will CANCEL hide if returns false
+ if (state.initialized && false === _runCallbacks("onhide_start", pane)) return;
+
+ s.isSliding = false; // just in case
+
+ // now hide the elements
+ if ($R) $R.hide(); // hide resizer-bar
+ if (!state.initialized || s.isClosed) {
+ s.isClosed = true; // to trigger open-animation on show()
+ s.isHidden = true;
+ s.isVisible = false;
+ if (!state.initialized)
+ _hidePane(pane); // no animation when loading page
+ sizeMidPanes(_c[pane].dir === "horz" ? "" : "center");
+ if (state.initialized || o.triggerEventsOnLoad)
+ _runCallbacks("onhide_end", pane);
+ }
+ else {
+ s.isHiding = true; // used by onclose
+ close(pane, false, noAnimation); // adjust all panes to fit
+ }
+ }
+
+ /**
+ * Show a hidden pane - show as 'closed' by default unless openPane = true
+ *
+ * @param {string|Object} evt_or_pane The pane being opened, ie: north, south, east, or west
+ * @param {boolean=} [openPane=false]
+ * @param {boolean=} [noAnimation=false]
+ * @param {boolean=} [noAlert=false]
+ */
+, show = function (evt_or_pane, openPane, noAnimation, noAlert) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , o = options[pane]
+ , s = state[pane]
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ ;
+ if (!$P || !s.isHidden) return; // pane does not exist OR is not hidden
+
+ // onshow_start callback - will CANCEL show if returns false
+ if (false === _runCallbacks("onshow_start", pane)) return;
+
+ s.isSliding = false; // just in case
+ s.isShowing = true; // used by onopen/onclose
+ //s.isHidden = false; - will be set by open/close - if not cancelled
+
+ // now show the elements
+ //if ($R) $R.show(); - will be shown by open/close
+ if (openPane === false)
+ close(pane, true); // true = force
+ else
+ open(pane, false, noAnimation, noAlert); // adjust all panes to fit
+ }
+
+
+ /**
+ * Toggles a pane open/closed by calling either open or close
+ *
+ * @param {string|Object} evt_or_pane The pane being toggled, ie: north, south, east, or west
+ * @param {boolean=} [slide=false]
+ */
+, toggle = function (evt_or_pane, slide) {
+ if (!isInitialized()) return;
+ var evt = evtObj(evt_or_pane)
+ , pane = evtPane.call(this, evt_or_pane)
+ , s = state[pane]
+ ;
+ if (evt) // called from to $R.dblclick OR triggerPaneEvent
+ evt.stopImmediatePropagation();
+ if (s.isHidden)
+ show(pane); // will call 'open' after unhiding it
+ else if (s.isClosed)
+ open(pane, !!slide);
+ else
+ close(pane);
+ }
+
+
+ /**
+ * Utility method used during init or other auto-processes
+ *
+ * @param {string} pane The pane being closed
+ * @param {boolean=} [setHandles=false]
+ */
+, _closePane = function (pane, setHandles) {
+ var
+ $P = $Ps[pane]
+ , s = state[pane]
+ ;
+ _hidePane(pane);
+ s.isClosed = true;
+ s.isVisible = false;
+ // UNUSED: if (setHandles) setAsClosed(pane, true); // true = force
+ }
+
+ /**
+ * Close the specified pane (animation optional), and resize all other panes as needed
+ *
+ * @param {string|Object} evt_or_pane The pane being closed, ie: north, south, east, or west
+ * @param {boolean=} [force=false]
+ * @param {boolean=} [noAnimation=false]
+ * @param {boolean=} [skipCallback=false]
+ */
+, close = function (evt_or_pane, force, noAnimation, skipCallback) {
+ var pane = evtPane.call(this, evt_or_pane);
+ // if pane has been initialized, but NOT the complete layout, close pane instantly
+ if (!state.initialized && $Ps[pane]) {
+ _closePane(pane); // INIT pane as closed
+ return;
+ }
+ if (!isInitialized()) return;
+
+ var
+ $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , $T = $Ts[pane]
+ , o = options[pane]
+ , s = state[pane]
+ , c = _c[pane]
+ , doFX, isShowing, isHiding, wasSliding;
+
+ // QUEUE in case another action/animation is in progress
+ $N.queue(function( queueNext ){
+
+ if ( !$P
+ || (!o.closable && !s.isShowing && !s.isHiding) // invalid request // (!o.resizable && !o.closable) ???
+ || (!force && s.isClosed && !s.isShowing) // already closed
+ ) return queueNext();
+
+ // onclose_start callback - will CANCEL hide if returns false
+ // SKIP if just 'showing' a hidden pane as 'closed'
+ var abort = !s.isShowing && false === _runCallbacks("onclose_start", pane);
+
+ // transfer logic vars to temp vars
+ isShowing = s.isShowing;
+ isHiding = s.isHiding;
+ wasSliding = s.isSliding;
+ // now clear the logic vars (REQUIRED before aborting)
+ delete s.isShowing;
+ delete s.isHiding;
+
+ if (abort) return queueNext();
+
+ doFX = !noAnimation && !s.isClosed && (o.fxName_close != "none");
+ s.isMoving = true;
+ s.isClosed = true;
+ s.isVisible = false;
+ // update isHidden BEFORE sizing panes
+ if (isHiding) s.isHidden = true;
+ else if (isShowing) s.isHidden = false;
+
+ if (s.isSliding) // pane is being closed, so UNBIND trigger events
+ bindStopSlidingEvents(pane, false); // will set isSliding=false
+ else // resize panes adjacent to this one
+ sizeMidPanes(_c[pane].dir === "horz" ? "" : "center", false); // false = NOT skipCallback
+
+ // if this pane has a resizer bar, move it NOW - before animation
+ setAsClosed(pane);
+
+ // CLOSE THE PANE
+ if (doFX) { // animate the close
+ // mask panes with objects
+ var masks = "center"+ (c.dir=="horz" ? ",west,east" : "");
+ showMasks( masks, true ); // true = ONLY mask panes with maskObjects=true
+ lockPaneForFX(pane, true); // need to set left/top so animation will work
+ $P.hide( o.fxName_close, o.fxSettings_close, o.fxSpeed_close, function () {
+ lockPaneForFX(pane, false); // undo
+ if (s.isClosed) close_2();
+ queueNext();
+ });
+ }
+ else { // hide the pane without animation
+ _hidePane(pane);
+ close_2();
+ queueNext();
+ };
+ });
+
+ // SUBROUTINE
+ function close_2 () {
+ s.isMoving = false;
+ bindStartSlidingEvent(pane, true); // will enable if o.slidable = true
+
+ // if opposite-pane was autoClosed, see if it can be autoOpened now
+ var altPane = _c.oppositeEdge[pane];
+ if (state[ altPane ].noRoom) {
+ setSizeLimits( altPane );
+ makePaneFit( altPane );
+ }
+
+ // hide any masks shown while closing
+ hideMasks();
+
+ if (!skipCallback && (state.initialized || o.triggerEventsOnLoad)) {
+ // onclose callback - UNLESS just 'showing' a hidden pane as 'closed'
+ if (!isShowing) _runCallbacks("onclose_end", pane);
+ // onhide OR onshow callback
+ if (isShowing) _runCallbacks("onshow_end", pane);
+ if (isHiding) _runCallbacks("onhide_end", pane);
+ }
+ }
+ }
+
+ /**
+ * @param {string} pane The pane just closed, ie: north, south, east, or west
+ */
+, setAsClosed = function (pane) {
+ var
+ $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , $T = $Ts[pane]
+ , o = options[pane]
+ , s = state[pane]
+ , side = _c[pane].side.toLowerCase()
+ , inset = "inset"+ _c[pane].side
+ , rClass = o.resizerClass
+ , tClass = o.togglerClass
+ , _pane = "-"+ pane // used for classNames
+ , _open = "-open"
+ , _sliding= "-sliding"
+ , _closed = "-closed"
+ ;
+ $R
+ .css(side, sC[inset]) // move the resizer
+ .removeClass( rClass+_open +" "+ rClass+_pane+_open )
+ .removeClass( rClass+_sliding +" "+ rClass+_pane+_sliding )
+ .addClass( rClass+_closed +" "+ rClass+_pane+_closed )
+ .unbind("dblclick."+ sID)
+ ;
+ // DISABLE 'resizing' when closed - do this BEFORE bindStartSlidingEvent?
+ if (o.resizable && $.layout.plugins.draggable)
+ $R
+ .draggable("disable")
+ .removeClass("ui-state-disabled") // do NOT apply disabled styling - not suitable here
+ .css("cursor", "default")
+ .attr("title","")
+ ;
+
+ // if pane has a toggler button, adjust that too
+ if ($T) {
+ $T
+ .removeClass( tClass+_open +" "+ tClass+_pane+_open )
+ .addClass( tClass+_closed +" "+ tClass+_pane+_closed )
+ .attr("title", o.tips.Open) // may be blank
+ ;
+ // toggler-content - if exists
+ $T.children(".content-open").hide();
+ $T.children(".content-closed").css("display","block");
+ }
+
+ // sync any 'pin buttons'
+ syncPinBtns(pane, false);
+
+ if (state.initialized) {
+ // resize 'length' and position togglers for adjacent panes
+ sizeHandles();
+ }
+ }
+
+ /**
+ * Open the specified pane (animation optional), and resize all other panes as needed
+ *
+ * @param {string|Object} evt_or_pane The pane being opened, ie: north, south, east, or west
+ * @param {boolean=} [slide=false]
+ * @param {boolean=} [noAnimation=false]
+ * @param {boolean=} [noAlert=false]
+ */
+, open = function (evt_or_pane, slide, noAnimation, noAlert) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , $T = $Ts[pane]
+ , o = options[pane]
+ , s = state[pane]
+ , c = _c[pane]
+ , doFX, isShowing
+ ;
+ // QUEUE in case another action/animation is in progress
+ $N.queue(function( queueNext ){
+
+ if ( !$P
+ || (!o.resizable && !o.closable && !s.isShowing) // invalid request
+ || (s.isVisible && !s.isSliding) // already open
+ ) return queueNext();
+
+ // pane can ALSO be unhidden by just calling show(), so handle this scenario
+ if (s.isHidden && !s.isShowing) {
+ queueNext(); // call before show() because it needs the queue free
+ show(pane, true);
+ return;
+ }
+
+ if (o.autoResize && s.size != o.size) // resize pane to original size set in options
+ sizePane(pane, o.size, true, true, true); // true=skipCallback/forceResize/noAnimation
+ else
+ // make sure there is enough space available to open the pane
+ setSizeLimits(pane, slide);
+
+ // onopen_start callback - will CANCEL open if returns false
+ var cbReturn = _runCallbacks("onopen_start", pane);
+
+ if (cbReturn === "abort")
+ return queueNext();
+
+ // update pane-state again in case options were changed in onopen_start
+ if (cbReturn !== "NC") // NC = "No Callback"
+ setSizeLimits(pane, slide);
+
+ if (s.minSize > s.maxSize) { // INSUFFICIENT ROOM FOR PANE TO OPEN!
+ syncPinBtns(pane, false); // make sure pin-buttons are reset
+ if (!noAlert && o.tips.noRoomToOpen)
+ alert(o.tips.noRoomToOpen);
+ return queueNext(); // ABORT
+ }
+
+ if (slide) // START Sliding - will set isSliding=true
+ bindStopSlidingEvents(pane, true); // BIND trigger events to close sliding-pane
+ else if (s.isSliding) // PIN PANE (stop sliding) - open pane 'normally' instead
+ bindStopSlidingEvents(pane, false); // UNBIND trigger events - will set isSliding=false
+ else if (o.slidable)
+ bindStartSlidingEvent(pane, false); // UNBIND trigger events
+
+ s.noRoom = false; // will be reset by makePaneFit if 'noRoom'
+ makePaneFit(pane);
+
+ // transfer logic var to temp var
+ isShowing = s.isShowing;
+ // now clear the logic var
+ delete s.isShowing;
+
+ doFX = !noAnimation && s.isClosed && (o.fxName_open != "none");
+ s.isMoving = true;
+ s.isVisible = true;
+ s.isClosed = false;
+ // update isHidden BEFORE sizing panes - WHY??? Old?
+ if (isShowing) s.isHidden = false;
+
+ if (doFX) { // ANIMATE
+ // mask panes with objects
+ var masks = "center"+ (c.dir=="horz" ? ",west,east" : "");
+ if (s.isSliding) masks += ","+ _c.oppositeEdge[pane];
+ showMasks( masks, true ); // true = ONLY mask panes with maskObjects=true
+ lockPaneForFX(pane, true); // need to set left/top so animation will work
+ $P.show( o.fxName_open, o.fxSettings_open, o.fxSpeed_open, function() {
+ lockPaneForFX(pane, false); // undo
+ if (s.isVisible) open_2(); // continue
+ queueNext();
+ });
+ }
+ else { // no animation
+ _showPane(pane);// just show pane and...
+ open_2(); // continue
+ queueNext();
+ };
+ });
+
+ // SUBROUTINE
+ function open_2 () {
+ s.isMoving = false;
+
+ // cure iframe display issues
+ _fixIframe(pane);
+
+ // NOTE: if isSliding, then other panes are NOT 'resized'
+ if (!s.isSliding) { // resize all panes adjacent to this one
+ hideMasks(); // remove any masks shown while opening
+ sizeMidPanes(_c[pane].dir=="vert" ? "center" : "", false); // false = NOT skipCallback
+ }
+
+ // set classes, position handles and execute callbacks...
+ setAsOpen(pane);
+ };
+
+ }
+
+ /**
+ * @param {string} pane The pane just opened, ie: north, south, east, or west
+ * @param {boolean=} [skipCallback=false]
+ */
+, setAsOpen = function (pane, skipCallback) {
+ var
+ $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , $T = $Ts[pane]
+ , o = options[pane]
+ , s = state[pane]
+ , side = _c[pane].side.toLowerCase()
+ , inset = "inset"+ _c[pane].side
+ , rClass = o.resizerClass
+ , tClass = o.togglerClass
+ , _pane = "-"+ pane // used for classNames
+ , _open = "-open"
+ , _closed = "-closed"
+ , _sliding= "-sliding"
+ ;
+ $R
+ .css(side, sC[inset] + getPaneSize(pane)) // move the resizer
+ .removeClass( rClass+_closed +" "+ rClass+_pane+_closed )
+ .addClass( rClass+_open +" "+ rClass+_pane+_open )
+ ;
+ if (s.isSliding)
+ $R.addClass( rClass+_sliding +" "+ rClass+_pane+_sliding )
+ else // in case 'was sliding'
+ $R.removeClass( rClass+_sliding +" "+ rClass+_pane+_sliding )
+
+ if (o.resizerDblClickToggle)
+ $R.bind("dblclick", toggle );
+ removeHover( 0, $R ); // remove hover classes
+ if (o.resizable && $.layout.plugins.draggable)
+ $R .draggable("enable")
+ .css("cursor", o.resizerCursor)
+ .attr("title", o.tips.Resize);
+ else if (!s.isSliding)
+ $R.css("cursor", "default"); // n-resize, s-resize, etc
+
+ // if pane also has a toggler button, adjust that too
+ if ($T) {
+ $T .removeClass( tClass+_closed +" "+ tClass+_pane+_closed )
+ .addClass( tClass+_open +" "+ tClass+_pane+_open )
+ .attr("title", o.tips.Close); // may be blank
+ removeHover( 0, $T ); // remove hover classes
+ // toggler-content - if exists
+ $T.children(".content-closed").hide();
+ $T.children(".content-open").css("display","block");
+ }
+
+ // sync any 'pin buttons'
+ syncPinBtns(pane, !s.isSliding);
+
+ // update pane-state dimensions - BEFORE resizing content
+ $.extend(s, elDims($P));
+
+ if (state.initialized) {
+ // resize resizer & toggler sizes for all panes
+ sizeHandles();
+ // resize content every time pane opens - to be sure
+ sizeContent(pane, true); // true = remeasure headers/footers, even if 'pane.isMoving'
+ }
+
+ if (!skipCallback && (state.initialized || o.triggerEventsOnLoad) && $P.is(":visible")) {
+ // onopen callback
+ _runCallbacks("onopen_end", pane);
+ // onshow callback - TODO: should this be here?
+ if (s.isShowing) _runCallbacks("onshow_end", pane);
+
+ // ALSO call onresize because layout-size *may* have changed while pane was closed
+ if (state.initialized)
+ _runCallbacks("onresize_end", pane);
+ }
+
+ // TODO: Somehow sizePane("north") is being called after this point???
+ }
+
+
+ /**
+ * slideOpen / slideClose / slideToggle
+ *
+ * Pass-though methods for sliding
+ */
+, slideOpen = function (evt_or_pane) {
+ if (!isInitialized()) return;
+ var evt = evtObj(evt_or_pane)
+ , pane = evtPane.call(this, evt_or_pane)
+ , s = state[pane]
+ , delay = options[pane].slideDelay_open
+ ;
+ // prevent event from triggering on NEW resizer binding created below
+ if (evt) evt.stopImmediatePropagation();
+
+ if (s.isClosed && evt && evt.type === "mouseenter" && delay > 0)
+ // trigger = mouseenter - use a delay
+ timer.set(pane+"_openSlider", open_NOW, delay);
+ else
+ open_NOW(); // will unbind events if is already open
+
+ /**
+ * SUBROUTINE for timed open
+ */
+ function open_NOW () {
+ if (!s.isClosed) // skip if no longer closed!
+ bindStopSlidingEvents(pane, true); // BIND trigger events to close sliding-pane
+ else if (!s.isMoving)
+ open(pane, true); // true = slide - open() will handle binding
+ };
+ }
+
+, slideClose = function (evt_or_pane) {
+ if (!isInitialized()) return;
+ var evt = evtObj(evt_or_pane)
+ , pane = evtPane.call(this, evt_or_pane)
+ , o = options[pane]
+ , s = state[pane]
+ , delay = s.isMoving ? 1000 : 300 // MINIMUM delay - option may override
+ ;
+ if (s.isClosed || s.isResizing)
+ return; // skip if already closed OR in process of resizing
+ else if (o.slideTrigger_close === "click")
+ close_NOW(); // close immediately onClick
+ else if (o.preventQuickSlideClose && s.isMoving)
+ return; // handle Chrome quick-close on slide-open
+ else if (o.preventPrematureSlideClose && evt && $.layout.isMouseOverElem(evt, $Ps[pane]))
+ return; // handle incorrect mouseleave trigger, like when over a SELECT-list in IE
+ else if (evt) // trigger = mouseleave - use a delay
+ // 1 sec delay if 'opening', else .3 sec
+ timer.set(pane+"_closeSlider", close_NOW, max(o.slideDelay_close, delay));
+ else // called programically
+ close_NOW();
+
+ /**
+ * SUBROUTINE for timed close
+ */
+ function close_NOW () {
+ if (s.isClosed) // skip 'close' if already closed!
+ bindStopSlidingEvents(pane, false); // UNBIND trigger events - TODO: is this needed here?
+ else if (!s.isMoving)
+ close(pane); // close will handle unbinding
+ };
+ }
+
+ /**
+ * @param {string|Object} evt_or_pane The pane being opened, ie: north, south, east, or west
+ */
+, slideToggle = function (evt_or_pane) {
+ var pane = evtPane.call(this, evt_or_pane);
+ toggle(pane, true);
+ }
+
+
+ /**
+ * Must set left/top on East/South panes so animation will work properly
+ *
+ * @param {string} pane The pane to lock, 'east' or 'south' - any other is ignored!
+ * @param {boolean} doLock true = set left/top, false = remove
+ */
+, lockPaneForFX = function (pane, doLock) {
+ var $P = $Ps[pane]
+ , s = state[pane]
+ , o = options[pane]
+ , z = options.zIndexes
+ ;
+ if (doLock) {
+ $P.css({ zIndex: z.pane_animate }); // overlay all elements during animation
+ if (pane=="south")
+ $P.css({ top: sC.insetTop + sC.innerHeight - $P.outerHeight() });
+ else if (pane=="east")
+ $P.css({ left: sC.insetLeft + sC.innerWidth - $P.outerWidth() });
+ }
+ else { // animation DONE - RESET CSS
+ // TODO: see if this can be deleted. It causes a quick-close when sliding in Chrome
+ $P.css({ zIndex: (s.isSliding ? z.pane_sliding : z.pane_normal) });
+ if (pane=="south")
+ $P.css({ top: "auto" });
+ // if pane is positioned 'off-screen', then DO NOT screw with it!
+ else if (pane=="east" && !$P.css("left").match(/\-99999/))
+ $P.css({ left: "auto" });
+ // fix anti-aliasing in IE - only needed for animations that change opacity
+ if (browser.msie && o.fxOpacityFix && o.fxName_open != "slide" && $P.css("filter") && $P.css("opacity") == 1)
+ $P[0].style.removeAttribute('filter');
+ }
+ }
+
+
+ /**
+ * Toggle sliding functionality of a specific pane on/off by adding removing 'slide open' trigger
+ *
+ * @see open(), close()
+ * @param {string} pane The pane to enable/disable, 'north', 'south', etc.
+ * @param {boolean} enable Enable or Disable sliding?
+ */
+, bindStartSlidingEvent = function (pane, enable) {
+ var o = options[pane]
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , evtName = o.slideTrigger_open.toLowerCase()
+ ;
+ if (!$R || (enable && !o.slidable)) return;
+
+ // make sure we have a valid event
+ if (evtName.match(/mouseover/))
+ evtName = o.slideTrigger_open = "mouseenter";
+ else if (!evtName.match(/(click|dblclick|mouseenter)/))
+ evtName = o.slideTrigger_open = "click";
+
+ $R
+ // add or remove event
+ [enable ? "bind" : "unbind"](evtName +'.'+ sID, slideOpen)
+ // set the appropriate cursor & title/tip
+ .css("cursor", enable ? o.sliderCursor : "default")
+ .attr("title", enable ? o.tips.Slide : "")
+ ;
+ }
+
+ /**
+ * Add or remove 'mouseleave' events to 'slide close' when pane is 'sliding' open or closed
+ * Also increases zIndex when pane is sliding open
+ * See bindStartSlidingEvent for code to control 'slide open'
+ *
+ * @see slideOpen(), slideClose()
+ * @param {string} pane The pane to process, 'north', 'south', etc.
+ * @param {boolean} enable Enable or Disable events?
+ */
+, bindStopSlidingEvents = function (pane, enable) {
+ var o = options[pane]
+ , s = state[pane]
+ , c = _c[pane]
+ , z = options.zIndexes
+ , evtName = o.slideTrigger_close.toLowerCase()
+ , action = (enable ? "bind" : "unbind")
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ ;
+ s.isSliding = enable; // logic
+ timer.clear(pane+"_closeSlider"); // just in case
+
+ // remove 'slideOpen' event from resizer
+ // ALSO will raise the zIndex of the pane & resizer
+ if (enable) bindStartSlidingEvent(pane, false);
+
+ // RE/SET zIndex - increases when pane is sliding-open, resets to normal when not
+ $P.css("zIndex", enable ? z.pane_sliding : z.pane_normal);
+ $R.css("zIndex", enable ? z.pane_sliding+2 : z.resizer_normal); // NOTE: mask = pane_sliding+1
+
+ // make sure we have a valid event
+ if (!evtName.match(/(click|mouseleave)/))
+ evtName = o.slideTrigger_close = "mouseleave"; // also catches 'mouseout'
+
+ // add/remove slide triggers
+ $R[action](evtName, slideClose); // base event on resize
+ // need extra events for mouseleave
+ if (evtName === "mouseleave") {
+ // also close on pane.mouseleave
+ $P[action]("mouseleave."+ sID, slideClose);
+ // cancel timer when mouse moves between 'pane' and 'resizer'
+ $R[action]("mouseenter."+ sID, cancelMouseOut);
+ $P[action]("mouseenter."+ sID, cancelMouseOut);
+ }
+
+ if (!enable)
+ timer.clear(pane+"_closeSlider");
+ else if (evtName === "click" && !o.resizable) {
+ // IF pane is not resizable (which already has a cursor and tip)
+ // then set the a cursor & title/tip on resizer when sliding
+ $R.css("cursor", enable ? o.sliderCursor : "default");
+ $R.attr("title", enable ? o.tips.Close : ""); // use Toggler-tip, eg: "Close Pane"
+ }
+
+ // SUBROUTINE for mouseleave timer clearing
+ function cancelMouseOut (evt) {
+ timer.clear(pane+"_closeSlider");
+ evt.stopPropagation();
+ }
+ }
+
+
+ /**
+ * Hides/closes a pane if there is insufficient room - reverses this when there is room again
+ * MUST have already called setSizeLimits() before calling this method
+ *
+ * @param {string} pane The pane being resized
+ * @param {boolean=} [isOpening=false] Called from onOpen?
+ * @param {boolean=} [skipCallback=false] Should the onresize callback be run?
+ * @param {boolean=} [force=false]
+ */
+, makePaneFit = function (pane, isOpening, skipCallback, force) {
+ var
+ o = options[pane]
+ , s = state[pane]
+ , c = _c[pane]
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , isSidePane = c.dir==="vert"
+ , hasRoom = false
+ ;
+ // special handling for center & east/west panes
+ if (pane === "center" || (isSidePane && s.noVerticalRoom)) {
+ // see if there is enough room to display the pane
+ // ERROR: hasRoom = s.minHeight <= s.maxHeight && (isSidePane || s.minWidth <= s.maxWidth);
+ hasRoom = (s.maxHeight >= 0);
+ if (hasRoom && s.noRoom) { // previously hidden due to noRoom, so show now
+ _showPane(pane);
+ if ($R) $R.show();
+ s.isVisible = true;
+ s.noRoom = false;
+ if (isSidePane) s.noVerticalRoom = false;
+ _fixIframe(pane);
+ }
+ else if (!hasRoom && !s.noRoom) { // not currently hidden, so hide now
+ _hidePane(pane);
+ if ($R) $R.hide();
+ s.isVisible = false;
+ s.noRoom = true;
+ }
+ }
+
+ // see if there is enough room to fit the border-pane
+ if (pane === "center") {
+ // ignore center in this block
+ }
+ else if (s.minSize <= s.maxSize) { // pane CAN fit
+ hasRoom = true;
+ if (s.size > s.maxSize) // pane is too big - shrink it
+ sizePane(pane, s.maxSize, skipCallback, force, true); // true = noAnimation
+ else if (s.size < s.minSize) // pane is too small - enlarge it
+ sizePane(pane, s.minSize, skipCallback, force, true);
+ // need s.isVisible because new pseudoClose method keeps pane visible, but off-screen
+ else if ($R && s.isVisible && $P.is(":visible")) {
+ // make sure resizer-bar is positioned correctly
+ // handles situation where nested layout was 'hidden' when initialized
+ var side = c.side.toLowerCase()
+ , pos = s.size + sC["inset"+ c.side]
+ ;
+ if ($.layout.cssNum($R, side) != pos) $R.css( side, pos );
+ }
+
+ // if was previously hidden due to noRoom, then RESET because NOW there is room
+ if (s.noRoom) {
+ // s.noRoom state will be set by open or show
+ if (s.wasOpen && o.closable) {
+ if (o.autoReopen)
+ open(pane, false, true, true); // true = noAnimation, true = noAlert
+ else // leave the pane closed, so just update state
+ s.noRoom = false;
+ }
+ else
+ show(pane, s.wasOpen, true, true); // true = noAnimation, true = noAlert
+ }
+ }
+ else { // !hasRoom - pane CANNOT fit
+ if (!s.noRoom) { // pane not set as noRoom yet, so hide or close it now...
+ s.noRoom = true; // update state
+ s.wasOpen = !s.isClosed && !s.isSliding;
+ if (s.isClosed){} // SKIP
+ else if (o.closable) // 'close' if possible
+ close(pane, true, true); // true = force, true = noAnimation
+ else // 'hide' pane if cannot just be closed
+ hide(pane, true); // true = noAnimation
+ }
+ }
+ }
+
+
+ /**
+ * sizePane / manualSizePane
+ * sizePane is called only by internal methods whenever a pane needs to be resized
+ * manualSizePane is an exposed flow-through method allowing extra code when pane is 'manually resized'
+ *
+ * @param {string|Object} evt_or_pane The pane being resized
+ * @param {number} size The *desired* new size for this pane - will be validated
+ * @param {boolean=} [skipCallback=false] Should the onresize callback be run?
+ * @param {boolean=} [noAnimation=false]
+ */
+, manualSizePane = function (evt_or_pane, size, skipCallback, noAnimation) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , o = options[pane]
+ , s = state[pane]
+ // if resizing callbacks have been delayed and resizing is now DONE, force resizing to complete...
+ , forceResize = o.livePaneResizing && !s.isResizing
+ ;
+ // ANY call to manualSizePane disables autoResize - ie, percentage sizing
+ o.autoResize = false;
+ // flow-through...
+ sizePane(pane, size, skipCallback, forceResize, noAnimation); // will animate resize if option enabled
+ }
+
+ /**
+ * @param {string|Object} evt_or_pane The pane being resized
+ * @param {number} size The *desired* new size for this pane - will be validated
+ * @param {boolean=} [skipCallback=false] Should the onresize callback be run?
+ * @param {boolean=} [force=false] Force resizing even if does not seem necessary
+ * @param {boolean=} [noAnimation=false]
+ */
+, sizePane = function (evt_or_pane, size, skipCallback, force, noAnimation) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane) // probably NEVER called from event?
+ , o = options[pane]
+ , s = state[pane]
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , side = _c[pane].side.toLowerCase()
+ , dimName = _c[pane].sizeType.toLowerCase()
+ , inset = "inset"+ _c[pane].side
+ , skipResizeWhileDragging = s.isResizing && !o.triggerEventsDuringLiveResize
+ , doFX = noAnimation !== true && o.animatePaneSizing
+ , oldSize, newSize
+ ;
+ // QUEUE in case another action/animation is in progress
+ $N.queue(function( queueNext ){
+ // calculate 'current' min/max sizes
+ setSizeLimits(pane); // update pane-state
+ oldSize = s.size;
+ size = _parseSize(pane, size); // handle percentages & auto
+ size = max(size, _parseSize(pane, o.minSize));
+ size = min(size, s.maxSize);
+ if (size < s.minSize) { // not enough room for pane!
+ queueNext(); // call before makePaneFit() because it needs the queue free
+ makePaneFit(pane, false, skipCallback); // will hide or close pane
+ return;
+ }
+
+ // IF newSize is same as oldSize, then nothing to do - abort
+ if (!force && size === oldSize)
+ return queueNext();
+
+ // onresize_start callback CANNOT cancel resizing because this would break the layout!
+ if (!skipCallback && state.initialized && s.isVisible)
+ _runCallbacks("onresize_start", pane);
+
+ // resize the pane, and make sure its visible
+ newSize = cssSize(pane, size);
+
+ if (doFX && $P.is(":visible")) { // ANIMATE
+ var fx = $.layout.effects.size[pane] || $.layout.effects.size.all
+ , easing = o.fxSettings_size.easing || fx.easing
+ , z = options.zIndexes
+ , props = {};
+ props[ dimName ] = newSize +'px';
+ s.isMoving = true;
+ // overlay all elements during animation
+ $P.css({ zIndex: z.pane_animate })
+ .show().animate( props, o.fxSpeed_size, easing, function(){
+ // reset zIndex after animation
+ $P.css({ zIndex: (s.isSliding ? z.pane_sliding : z.pane_normal) });
+ s.isMoving = false;
+ sizePane_2(); // continue
+ queueNext();
+ });
+ }
+ else { // no animation
+ $P.css( dimName, newSize ); // resize pane
+ // if pane is visible, then
+ if ($P.is(":visible"))
+ sizePane_2(); // continue
+ else {
+ // pane is NOT VISIBLE, so just update state data...
+ // when pane is *next opened*, it will have the new size
+ s.size = size; // update state.size
+ $.extend(s, elDims($P)); // update state dimensions
+ }
+ queueNext();
+ };
+
+ });
+
+ // SUBROUTINE
+ function sizePane_2 () {
+ /* Panes are sometimes not sized precisely in some browsers!?
+ * This code will resize the pane up to 3 times to nudge the pane to the correct size
+ */
+ var actual = dimName==='width' ? $P.outerWidth() : $P.outerHeight()
+ , tries = [{
+ pane: pane
+ , count: 1
+ , target: size
+ , actual: actual
+ , correct: (size === actual)
+ , attempt: size
+ , cssSize: newSize
+ }]
+ , lastTry = tries[0]
+ , thisTry = {}
+ , msg = 'Inaccurate size after resizing the '+ pane +'-pane.'
+ ;
+ while ( !lastTry.correct ) {
+ thisTry = { pane: pane, count: lastTry.count+1, target: size };
+
+ if (lastTry.actual > size)
+ thisTry.attempt = max(0, lastTry.attempt - (lastTry.actual - size));
+ else // lastTry.actual < size
+ thisTry.attempt = max(0, lastTry.attempt + (size - lastTry.actual));
+
+ thisTry.cssSize = cssSize(pane, thisTry.attempt);
+ $P.css( dimName, thisTry.cssSize );
+
+ thisTry.actual = dimName=='width' ? $P.outerWidth() : $P.outerHeight();
+ thisTry.correct = (size === thisTry.actual);
+
+ // log attempts and alert the user of this *non-fatal error* (if showDebugMessages)
+ if ( tries.length === 1) {
+ _log(msg, false, true);
+ _log(lastTry, false, true);
+ }
+ _log(thisTry, false, true);
+ // after 4 tries, is as close as its gonna get!
+ if (tries.length > 3) break;
+
+ tries.push( thisTry );
+ lastTry = tries[ tries.length - 1 ];
+ }
+ // END TESTING CODE
+
+ // update pane-state dimensions
+ s.size = size;
+ $.extend(s, elDims($P));
+
+ if (s.isVisible && $P.is(":visible")) {
+ // reposition the resizer-bar
+ if ($R) $R.css( side, size + sC[inset] );
+ // resize the content-div
+ sizeContent(pane);
+ }
+
+ if (!skipCallback && !skipResizeWhileDragging && state.initialized && s.isVisible)
+ _runCallbacks("onresize_end", pane);
+
+ // resize all the adjacent panes, and adjust their toggler buttons
+ // when skipCallback passed, it means the controlling method will handle 'other panes'
+ if (!skipCallback) {
+ // also no callback if live-resize is in progress and NOT triggerEventsDuringLiveResize
+ if (!s.isSliding) sizeMidPanes(_c[pane].dir=="horz" ? "" : "center", skipResizeWhileDragging, force);
+ sizeHandles();
+ }
+
+ // if opposite-pane was autoClosed, see if it can be autoOpened now
+ var altPane = _c.oppositeEdge[pane];
+ if (size < oldSize && state[ altPane ].noRoom) {
+ setSizeLimits( altPane );
+ makePaneFit( altPane, false, skipCallback );
+ }
+
+ // DEBUG - ALERT user/developer so they know there was a sizing problem
+ if (tries.length > 1)
+ _log(msg +'\nSee the Error Console for details.', true, true);
+ }
+ }
+
+ /**
+ * @see initPanes(), sizePane(), resizeAll(), open(), close(), hide()
+ * @param {Array.<string>|string} panes The pane(s) being resized, comma-delmited string
+ * @param {boolean=} [skipCallback=false] Should the onresize callback be run?
+ * @param {boolean=} [force=false]
+ */
+, sizeMidPanes = function (panes, skipCallback, force) {
+ panes = (panes ? panes : "east,west,center").split(",");
+
+ $.each(panes, function (i, pane) {
+ if (!$Ps[pane]) return; // NO PANE - skip
+ var
+ o = options[pane]
+ , s = state[pane]
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , isCenter= (pane=="center")
+ , hasRoom = true
+ , CSS = {}
+ , newCenter = calcNewCenterPaneDims()
+ ;
+ // update pane-state dimensions
+ $.extend(s, elDims($P));
+
+ if (pane === "center") {
+ if (!force && s.isVisible && newCenter.width === s.outerWidth && newCenter.height === s.outerHeight)
+ return true; // SKIP - pane already the correct size
+ // set state for makePaneFit() logic
+ $.extend(s, cssMinDims(pane), {
+ maxWidth: newCenter.width
+ , maxHeight: newCenter.height
+ });
+ CSS = newCenter;
+ // convert OUTER width/height to CSS width/height
+ CSS.width = cssW($P, CSS.width);
+ // NEW - allow pane to extend 'below' visible area rather than hide it
+ CSS.height = cssH($P, CSS.height);
+ hasRoom = CSS.width >= 0 && CSS.height >= 0; // height >= 0 = ALWAYS TRUE NOW
+ // during layout init, try to shrink east/west panes to make room for center
+ if (!state.initialized && o.minWidth > s.outerWidth) {
+ var
+ reqPx = o.minWidth - s.outerWidth
+ , minE = options.east.minSize || 0
+ , minW = options.west.minSize || 0
+ , sizeE = state.east.size
+ , sizeW = state.west.size
+ , newE = sizeE
+ , newW = sizeW
+ ;
+ if (reqPx > 0 && state.east.isVisible && sizeE > minE) {
+ newE = max( sizeE-minE, sizeE-reqPx );
+ reqPx -= sizeE-newE;
+ }
+ if (reqPx > 0 && state.west.isVisible && sizeW > minW) {
+ newW = max( sizeW-minW, sizeW-reqPx );
+ reqPx -= sizeW-newW;
+ }
+ // IF we found enough extra space, then resize the border panes as calculated
+ if (reqPx === 0) {
+ if (sizeE && sizeE != minE)
+ sizePane('east', newE, true, force, true); // true = skipCallback/noAnimation - initPanes will handle when done
+ if (sizeW && sizeW != minW)
+ sizePane('west', newW, true, force, true);
+ // now start over!
+ sizeMidPanes('center', skipCallback, force);
+ return; // abort this loop
+ }
+ }
+ }
+ else { // for east and west, set only the height, which is same as center height
+ // set state.min/maxWidth/Height for makePaneFit() logic
+ if (s.isVisible && !s.noVerticalRoom)
+ $.extend(s, elDims($P), cssMinDims(pane))
+ if (!force && !s.noVerticalRoom && newCenter.height === s.outerHeight)
+ return true; // SKIP - pane already the correct size
+ // east/west have same top, bottom & height as center
+ CSS.top = newCenter.top;
+ CSS.bottom = newCenter.bottom;
+ // NEW - allow pane to extend 'below' visible area rather than hide it
+ CSS.height = cssH($P, newCenter.height);
+ s.maxHeight = CSS.height;
+ hasRoom = (s.maxHeight >= 0); // ALWAYS TRUE NOW
+ if (!hasRoom) s.noVerticalRoom = true; // makePaneFit() logic
+ }
+
+ if (hasRoom) {
+ // resizeAll passes skipCallback because it triggers callbacks after ALL panes are resized
+ if (!skipCallback && state.initialized)
+ _runCallbacks("onresize_start", pane);
+
+ $P.css(CSS); // apply the CSS to pane
+ if (pane !== "center")
+ sizeHandles(pane); // also update resizer length
+ if (s.noRoom && !s.isClosed && !s.isHidden)
+ makePaneFit(pane); // will re-open/show auto-closed/hidden pane
+ if (s.isVisible) {
+ $.extend(s, elDims($P)); // update pane dimensions
+ if (state.initialized) sizeContent(pane); // also resize the contents, if exists
+ }
+ }
+ else if (!s.noRoom && s.isVisible) // no room for pane
+ makePaneFit(pane); // will hide or close pane
+
+ if (!s.isVisible)
+ return true; // DONE - next pane
+
+ /*
+ * Extra CSS for IE6 or IE7 in Quirks-mode - add 'width' to NORTH/SOUTH panes
+ * Normally these panes have only 'left' & 'right' positions so pane auto-sizes
+ * ALSO required when pane is an IFRAME because will NOT default to 'full width'
+ * TODO: Can I use width:100% for a north/south iframe?
+ * TODO: Sounds like a job for $P.outerWidth( sC.innerWidth ) SETTER METHOD
+ */
+ if (pane === "center") { // finished processing midPanes
+ var fix = browser.isIE6 || !browser.boxModel;
+ if ($Ps.north && (fix || state.north.tagName=="IFRAME"))
+ $Ps.north.css("width", cssW($Ps.north, sC.innerWidth));
+ if ($Ps.south && (fix || state.south.tagName=="IFRAME"))
+ $Ps.south.css("width", cssW($Ps.south, sC.innerWidth));
+ }
+
+ // resizeAll passes skipCallback because it triggers callbacks after ALL panes are resized
+ if (!skipCallback && state.initialized)
+ _runCallbacks("onresize_end", pane);
+ });
+ }
+
+
+ /**
+ * @see window.onresize(), callbacks or custom code
+ */
+, resizeAll = function (evt) {
+ // stopPropagation if called by trigger("layoutdestroy") - use evtPane utility
+ evtPane(evt);
+
+ if (!state.initialized) {
+ _initLayoutElements();
+ return; // no need to resize since we just initialized!
+ }
+ var oldW = sC.innerWidth
+ , oldH = sC.innerHeight
+ ;
+ // cannot size layout when 'container' is hidden or collapsed
+ if (!$N.is(":visible") ) return;
+ $.extend(state.container, elDims( $N )); // UPDATE container dimensions
+ if (!sC.outerHeight) return;
+
+ // onresizeall_start will CANCEL resizing if returns false
+ // state.container has already been set, so user can access this info for calcuations
+ if (false === _runCallbacks("onresizeall_start")) return false;
+
+ var // see if container is now 'smaller' than before
+ shrunkH = (sC.innerHeight < oldH)
+ , shrunkW = (sC.innerWidth < oldW)
+ , $P, o, s, dir
+ ;
+ // NOTE special order for sizing: S-N-E-W
+ $.each(["south","north","east","west"], function (i, pane) {
+ if (!$Ps[pane]) return; // no pane - SKIP
+ s = state[pane];
+ o = options[pane];
+ dir = _c[pane].dir;
+
+ if (o.autoResize && s.size != o.size) // resize pane to original size set in options
+ sizePane(pane, o.size, true, true, true); // true=skipCallback/forceResize/noAnimation
+ else {
+ setSizeLimits(pane);
+ makePaneFit(pane, false, true, true); // true=skipCallback/forceResize
+ }
+ });
+
+ sizeMidPanes("", true, true); // true=skipCallback, true=forceResize
+ sizeHandles(); // reposition the toggler elements
+
+ // trigger all individual pane callbacks AFTER layout has finished resizing
+ o = options; // reuse alias
+ $.each(_c.allPanes, function (i, pane) {
+ $P = $Ps[pane];
+ if (!$P) return; // SKIP
+ if (state[pane].isVisible) // undefined for non-existent panes
+ _runCallbacks("onresize_end", pane); // callback - if exists
+ });
+
+ _runCallbacks("onresizeall_end");
+ //_triggerLayoutEvent(pane, 'resizeall');
+ }
+
+ /**
+ * Whenever a pane resizes or opens that has a nested layout, trigger resizeAll
+ *
+ * @param {string|Object} evt_or_pane The pane just resized or opened
+ */
+, resizeChildLayout = function (evt_or_pane) {
+ var pane = evtPane.call(this, evt_or_pane);
+ if (!options[pane].resizeChildLayout) return;
+ var $P = $Ps[pane]
+ , $C = $Cs[pane]
+ , d = "layout"
+ , P = Instance[pane]
+ , L = children[pane]
+ ;
+ // user may have manually set EITHER instance pointer, so handle that
+ if (P.child && !L) {
+ // have to reverse the pointers!
+ var el = P.child.container;
+ L = children[pane] = (el ? el.data(d) : 0) || null; // set pointer _directly_ to layout instance
+ }
+
+ // if a layout-pointer exists, see if child has been destroyed
+ if (L && L.destroyed)
+ L = children[pane] = null; // clear child pointers
+ // no child layout pointer is set - see if there is a child layout NOW
+ if (!L) L = children[pane] = $P.data(d) || ($C ? $C.data(d) : 0) || null; // set/update child pointers
+
+ // ALWAYS refresh the pane.child alias
+ P.child = children[pane];
+
+ if (L) L.resizeAll();
+ }
+
+
+ /**
+ * IF pane has a content-div, then resize all elements inside pane to fit pane-height
+ *
+ * @param {string|Object} evt_or_panes The pane(s) being resized
+ * @param {boolean=} [remeasure=false] Should the content (header/footer) be remeasured?
+ */
+, sizeContent = function (evt_or_panes, remeasure) {
+ if (!isInitialized()) return;
+
+ var panes = evtPane.call(this, evt_or_panes);
+ panes = panes ? panes.split(",") : _c.allPanes;
+
+ $.each(panes, function (idx, pane) {
+ var
+ $P = $Ps[pane]
+ , $C = $Cs[pane]
+ , o = options[pane]
+ , s = state[pane]
+ , m = s.content // m = measurements
+ ;
+ if (!$P || !$C || !$P.is(":visible")) return true; // NOT VISIBLE - skip
+
+ // if content-element was REMOVED, update OR remove the pointer
+ if (!$C.length) {
+ initContent(pane, false); // false = do NOT sizeContent() - already there!
+ if (!$C) return; // no replacement element found - pointer have been removed
+ }
+
+ // onsizecontent_start will CANCEL resizing if returns false
+ if (false === _runCallbacks("onsizecontent_start", pane)) return;
+
+ // skip re-measuring offsets if live-resizing
+ if ((!s.isMoving && !s.isResizing) || o.liveContentResizing || remeasure || m.top == undefined) {
+ _measure();
+ // if any footers are below pane-bottom, they may not measure correctly,
+ // so allow pane overflow and re-measure
+ if (m.hiddenFooters > 0 && $P.css("overflow") === "hidden") {
+ $P.css("overflow", "visible");
+ _measure(); // remeasure while overflowing
+ $P.css("overflow", "hidden");
+ }
+ }
+ // NOTE: spaceAbove/Below *includes* the pane paddingTop/Bottom, but not pane.borders
+ var newH = s.innerHeight - (m.spaceAbove - s.css.paddingTop) - (m.spaceBelow - s.css.paddingBottom);
+
+ if (!$C.is(":visible") || m.height != newH) {
+ // size the Content element to fit new pane-size - will autoHide if not enough room
+ setOuterHeight($C, newH, true); // true=autoHide
+ m.height = newH; // save new height
+ };
+
+ if (state.initialized)
+ _runCallbacks("onsizecontent_end", pane);
+
+ function _below ($E) {
+ return max(s.css.paddingBottom, (parseInt($E.css("marginBottom"), 10) || 0));
+ };
+
+ function _measure () {
+ var
+ ignore = options[pane].contentIgnoreSelector
+ , $Fs = $C.nextAll().not(ignore || ':lt(0)') // not :lt(0) = ALL
+ , $Fs_vis = $Fs.filter(':visible')
+ , $F = $Fs_vis.filter(':last')
+ ;
+ m = {
+ top: $C[0].offsetTop
+ , height: $C.outerHeight()
+ , numFooters: $Fs.length
+ , hiddenFooters: $Fs.length - $Fs_vis.length
+ , spaceBelow: 0 // correct if no content footer ($E)
+ }
+ m.spaceAbove = m.top; // just for state - not used in calc
+ m.bottom = m.top + m.height;
+ if ($F.length)
+ //spaceBelow = (LastFooter.top + LastFooter.height) [footerBottom] - Content.bottom + max(LastFooter.marginBottom, pane.paddingBotom)
+ m.spaceBelow = ($F[0].offsetTop + $F.outerHeight()) - m.bottom + _below($F);
+ else // no footer - check marginBottom on Content element itself
+ m.spaceBelow = _below($C);
+ };
+ });
+ }
+
+
+ /**
+ * Called every time a pane is opened, closed, or resized to slide the togglers to 'center' and adjust their length if necessary
+ *
+ * @see initHandles(), open(), close(), resizeAll()
+ * @param {string|Object} evt_or_panes The pane(s) being resized
+ */
+, sizeHandles = function (evt_or_panes) {
+ var panes = evtPane.call(this, evt_or_panes)
+ panes = panes ? panes.split(",") : _c.borderPanes;
+
+ $.each(panes, function (i, pane) {
+ var
+ o = options[pane]
+ , s = state[pane]
+ , $P = $Ps[pane]
+ , $R = $Rs[pane]
+ , $T = $Ts[pane]
+ , $TC
+ ;
+ if (!$P || !$R) return;
+
+ var
+ dir = _c[pane].dir
+ , _state = (s.isClosed ? "_closed" : "_open")
+ , spacing = o["spacing"+ _state]
+ , togAlign = o["togglerAlign"+ _state]
+ , togLen = o["togglerLength"+ _state]
+ , paneLen
+ , left
+ , offset
+ , CSS = {}
+ ;
+
+ if (spacing === 0) {
+ $R.hide();
+ return;
+ }
+ else if (!s.noRoom && !s.isHidden) // skip if resizer was hidden for any reason
+ $R.show(); // in case was previously hidden
+
+ // Resizer Bar is ALWAYS same width/height of pane it is attached to
+ if (dir === "horz") { // north/south
+ //paneLen = $P.outerWidth(); // s.outerWidth ||
+ paneLen = sC.innerWidth; // handle offscreen-panes
+ s.resizerLength = paneLen;
+ left = $.layout.cssNum($P, "left")
+ $R.css({
+ width: cssW($R, paneLen) // account for borders & padding
+ , height: cssH($R, spacing) // ditto
+ , left: left > -9999 ? left : sC.insetLeft // handle offscreen-panes
+ });
+ }
+ else { // east/west
+ paneLen = $P.outerHeight(); // s.outerHeight ||
+ s.resizerLength = paneLen;
+ $R.css({
+ height: cssH($R, paneLen) // account for borders & padding
+ , width: cssW($R, spacing) // ditto
+ , top: sC.insetTop + getPaneSize("north", true) // TODO: what if no North pane?
+ //, top: $.layout.cssNum($Ps["center"], "top")
+ });
+ }
+
+ // remove hover classes
+ removeHover( o, $R );
+
+ if ($T) {
+ if (togLen === 0 || (s.isSliding && o.hideTogglerOnSlide)) {
+ $T.hide(); // always HIDE the toggler when 'sliding'
+ return;
+ }
+ else
+ $T.show(); // in case was previously hidden
+
+ if (!(togLen > 0) || togLen === "100%" || togLen > paneLen) {
+ togLen = paneLen;
+ offset = 0;
+ }
+ else { // calculate 'offset' based on options.PANE.togglerAlign_open/closed
+ if (isStr(togAlign)) {
+ switch (togAlign) {
+ case "top":
+ case "left": offset = 0;
+ break;
+ case "bottom":
+ case "right": offset = paneLen - togLen;
+ break;
+ case "middle":
+ case "center":
+ default: offset = round((paneLen - togLen) / 2); // 'default' catches typos
+ }
+ }
+ else { // togAlign = number
+ var x = parseInt(togAlign, 10); //
+ if (togAlign >= 0) offset = x;
+ else offset = paneLen - togLen + x; // NOTE: x is negative!
+ }
+ }
+
+ if (dir === "horz") { // north/south
+ var width = cssW($T, togLen);
+ $T.css({
+ width: width // account for borders & padding
+ , height: cssH($T, spacing) // ditto
+ , left: offset // TODO: VERIFY that toggler positions correctly for ALL values
+ , top: 0
+ });
+ // CENTER the toggler content SPAN
+ $T.children(".content").each(function(){
+ $TC = $(this);
+ $TC.css("marginLeft", round((width-$TC.outerWidth())/2)); // could be negative
+ });
+ }
+ else { // east/west
+ var height = cssH($T, togLen);
+ $T.css({
+ height: height // account for borders & padding
+ , width: cssW($T, spacing) // ditto
+ , top: offset // POSITION the toggler
+ , left: 0
+ });
+ // CENTER the toggler content SPAN
+ $T.children(".content").each(function(){
+ $TC = $(this);
+ $TC.css("marginTop", round((height-$TC.outerHeight())/2)); // could be negative
+ });
+ }
+
+ // remove ALL hover classes
+ removeHover( 0, $T );
+ }
+
+ // DONE measuring and sizing this resizer/toggler, so can be 'hidden' now
+ if (!state.initialized && (o.initHidden || s.noRoom)) {
+ $R.hide();
+ if ($T) $T.hide();
+ }
+ });
+ }
+
+
+ /**
+ * @param {string|Object} evt_or_pane
+ */
+, enableClosable = function (evt_or_pane) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , $T = $Ts[pane]
+ , o = options[pane]
+ ;
+ if (!$T) return;
+ o.closable = true;
+ $T .bind("click."+ sID, function(evt){ evt.stopPropagation(); toggle(pane); })
+ .css("visibility", "visible")
+ .css("cursor", "pointer")
+ .attr("title", state[pane].isClosed ? o.tips.Open : o.tips.Close) // may be blank
+ .show();
+ }
+ /**
+ * @param {string|Object} evt_or_pane
+ * @param {boolean=} [hide=false]
+ */
+, disableClosable = function (evt_or_pane, hide) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , $T = $Ts[pane]
+ ;
+ if (!$T) return;
+ options[pane].closable = false;
+ // is closable is disable, then pane MUST be open!
+ if (state[pane].isClosed) open(pane, false, true);
+ $T .unbind("."+ sID)
+ .css("visibility", hide ? "hidden" : "visible") // instead of hide(), which creates logic issues
+ .css("cursor", "default")
+ .attr("title", "");
+ }
+
+
+ /**
+ * @param {string|Object} evt_or_pane
+ */
+, enableSlidable = function (evt_or_pane) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , $R = $Rs[pane]
+ ;
+ if (!$R || !$R.data('draggable')) return;
+ options[pane].slidable = true;
+ if (state[pane].isClosed)
+ bindStartSlidingEvent(pane, true);
+ }
+ /**
+ * @param {string|Object} evt_or_pane
+ */
+, disableSlidable = function (evt_or_pane) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , $R = $Rs[pane]
+ ;
+ if (!$R) return;
+ options[pane].slidable = false;
+ if (state[pane].isSliding)
+ close(pane, false, true);
+ else {
+ bindStartSlidingEvent(pane, false);
+ $R .css("cursor", "default")
+ .attr("title", "");
+ removeHover(null, $R[0]); // in case currently hovered
+ }
+ }
+
+
+ /**
+ * @param {string|Object} evt_or_pane
+ */
+, enableResizable = function (evt_or_pane) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , $R = $Rs[pane]
+ , o = options[pane]
+ ;
+ if (!$R || !$R.data('draggable')) return;
+ o.resizable = true;
+ $R.draggable("enable");
+ if (!state[pane].isClosed)
+ $R .css("cursor", o.resizerCursor)
+ .attr("title", o.tips.Resize);
+ }
+ /**
+ * @param {string|Object} evt_or_pane
+ */
+, disableResizable = function (evt_or_pane) {
+ if (!isInitialized()) return;
+ var pane = evtPane.call(this, evt_or_pane)
+ , $R = $Rs[pane]
+ ;
+ if (!$R || !$R.data('draggable')) return;
+ options[pane].resizable = false;
+ $R .draggable("disable")
+ .css("cursor", "default")
+ .attr("title", "");
+ removeHover(null, $R[0]); // in case currently hovered
+ }
+
+
+ /**
+ * Move a pane from source-side (eg, west) to target-side (eg, east)
+ * If pane exists on target-side, move that to source-side, ie, 'swap' the panes
+ *
+ * @param {string|Object} evt_or_pane1 The pane/edge being swapped
+ * @param {string} pane2 ditto
+ */
+, swapPanes = function (evt_or_pane1, pane2) {
+ if (!isInitialized()) return;
+ var pane1 = evtPane.call(this, evt_or_pane1);
+ // change state.edge NOW so callbacks can know where pane is headed...
+ state[pane1].edge = pane2;
+ state[pane2].edge = pane1;
+ // run these even if NOT state.initialized
+ if (false === _runCallbacks("onswap_start", pane1)
+ || false === _runCallbacks("onswap_start", pane2)
+ ) {
+ state[pane1].edge = pane1; // reset
+ state[pane2].edge = pane2;
+ return;
+ }
+
+ var
+ oPane1 = copy( pane1 )
+ , oPane2 = copy( pane2 )
+ , sizes = {}
+ ;
+ sizes[pane1] = oPane1 ? oPane1.state.size : 0;
+ sizes[pane2] = oPane2 ? oPane2.state.size : 0;
+
+ // clear pointers & state
+ $Ps[pane1] = false;
+ $Ps[pane2] = false;
+ state[pane1] = {};
+ state[pane2] = {};
+
+ // ALWAYS remove the resizer & toggler elements
+ if ($Ts[pane1]) $Ts[pane1].remove();
+ if ($Ts[pane2]) $Ts[pane2].remove();
+ if ($Rs[pane1]) $Rs[pane1].remove();
+ if ($Rs[pane2]) $Rs[pane2].remove();
+ $Rs[pane1] = $Rs[pane2] = $Ts[pane1] = $Ts[pane2] = false;
+
+ // transfer element pointers and data to NEW Layout keys
+ move( oPane1, pane2 );
+ move( oPane2, pane1 );
+
+ // cleanup objects
+ oPane1 = oPane2 = sizes = null;
+
+ // make panes 'visible' again
+ if ($Ps[pane1]) $Ps[pane1].css(_c.visible);
+ if ($Ps[pane2]) $Ps[pane2].css(_c.visible);
+
+ // fix any size discrepancies caused by swap
+ resizeAll();
+
+ // run these even if NOT state.initialized
+ _runCallbacks("onswap_end", pane1);
+ _runCallbacks("onswap_end", pane2);
+
+ return;
+
+ function copy (n) { // n = pane
+ var
+ $P = $Ps[n]
+ , $C = $Cs[n]
+ ;
+ return !$P ? false : {
+ pane: n
+ , P: $P ? $P[0] : false
+ , C: $C ? $C[0] : false
+ , state: $.extend(true, {}, state[n])
+ , options: $.extend(true, {}, options[n])
+ }
+ };
+
+ function move (oPane, pane) {
+ if (!oPane) return;
+ var
+ P = oPane.P
+ , C = oPane.C
+ , oldPane = oPane.pane
+ , c = _c[pane]
+ , side = c.side.toLowerCase()
+ , inset = "inset"+ c.side
+ // save pane-options that should be retained
+ , s = $.extend(true, {}, state[pane])
+ , o = options[pane]
+ // RETAIN side-specific FX Settings - more below
+ , fx = { resizerCursor: o.resizerCursor }
+ , re, size, pos
+ ;
+ $.each("fxName,fxSpeed,fxSettings".split(","), function (i, k) {
+ fx[k +"_open"] = o[k +"_open"];
+ fx[k +"_close"] = o[k +"_close"];
+ fx[k +"_size"] = o[k +"_size"];
+ });
+
+ // update object pointers and attributes
+ $Ps[pane] = $(P)
+ .data({
+ layoutPane: Instance[pane] // NEW pointer to pane-alias-object
+ , layoutEdge: pane
+ })
+ .css(_c.hidden)
+ .css(c.cssReq)
+ ;
+ $Cs[pane] = C ? $(C) : false;
+
+ // set options and state
+ options[pane] = $.extend(true, {}, oPane.options, fx);
+ state[pane] = $.extend(true, {}, oPane.state);
+
+ // change classNames on the pane, eg: ui-layout-pane-east ==> ui-layout-pane-west
+ re = new RegExp(o.paneClass +"-"+ oldPane, "g");
+ P.className = P.className.replace(re, o.paneClass +"-"+ pane);
+
+ // ALWAYS regenerate the resizer & toggler elements
+ initHandles(pane); // create the required resizer & toggler
+
+ // if moving to different orientation, then keep 'target' pane size
+ if (c.dir != _c[oldPane].dir) {
+ size = sizes[pane] || 0;
+ setSizeLimits(pane); // update pane-state
+ size = max(size, state[pane].minSize);
+ // use manualSizePane to disable autoResize - not useful after panes are swapped
+ manualSizePane(pane, size, true, true); // true/true = skipCallback/noAnimation
+ }
+ else // move the resizer here
+ $Rs[pane].css(side, sC[inset] + (state[pane].isVisible ? getPaneSize(pane) : 0));
+
+
+ // ADD CLASSNAMES & SLIDE-BINDINGS
+ if (oPane.state.isVisible && !s.isVisible)
+ setAsOpen(pane, true); // true = skipCallback
+ else {
+ setAsClosed(pane);
+ bindStartSlidingEvent(pane, true); // will enable events IF option is set
+ }
+
+ // DESTROY the object
+ oPane = null;
+ };
+ }
+
+
+ /**
+ * INTERNAL method to sync pin-buttons when pane is opened or closed
+ * Unpinned means the pane is 'sliding' - ie, over-top of the adjacent panes
+ *
+ * @see open(), setAsOpen(), setAsClosed()
+ * @param {string} pane These are the params returned to callbacks by layout()
+ * @param {boolean} doPin True means set the pin 'down', False means 'up'
+ */
+, syncPinBtns = function (pane, doPin) {
+ if ($.layout.plugins.buttons)
+ $.each(state[pane].pins, function (i, selector) {
+ $.layout.buttons.setPinState(Instance, $(selector), pane, doPin);
+ });
+ }
+
+; // END var DECLARATIONS
+
+ /**
+ * Capture keys when enableCursorHotkey - toggle pane if hotkey pressed
+ *
+ * @see document.keydown()
+ */
+ function keyDown (evt) {
+ if (!evt) return true;
+ var code = evt.keyCode;
+ if (code < 33) return true; // ignore special keys: ENTER, TAB, etc
+
+ var
+ PANE = {
+ 38: "north" // Up Cursor - $.ui.keyCode.UP
+ , 40: "south" // Down Cursor - $.ui.keyCode.DOWN
+ , 37: "west" // Left Cursor - $.ui.keyCode.LEFT
+ , 39: "east" // Right Cursor - $.ui.keyCode.RIGHT
+ }
+ , ALT = evt.altKey // no worky!
+ , SHIFT = evt.shiftKey
+ , CTRL = evt.ctrlKey
+ , CURSOR = (CTRL && code >= 37 && code <= 40)
+ , o, k, m, pane
+ ;
+
+ if (CURSOR && options[PANE[code]].enableCursorHotkey) // valid cursor-hotkey
+ pane = PANE[code];
+ else if (CTRL || SHIFT) // check to see if this matches a custom-hotkey
+ $.each(_c.borderPanes, function (i, p) { // loop each pane to check its hotkey
+ o = options[p];
+ k = o.customHotkey;
+ m = o.customHotkeyModifier; // if missing or invalid, treated as "CTRL+SHIFT"
+ if ((SHIFT && m=="SHIFT") || (CTRL && m=="CTRL") || (CTRL && SHIFT)) { // Modifier matches
+ if (k && code === (isNaN(k) || k <= 9 ? k.toUpperCase().charCodeAt(0) : k)) { // Key matches
+ pane = p;
+ return false; // BREAK
+ }
+ }
+ });
+
+ // validate pane
+ if (!pane || !$Ps[pane] || !options[pane].closable || state[pane].isHidden)
+ return true;
+
+ toggle(pane);
+
+ evt.stopPropagation();
+ evt.returnValue = false; // CANCEL key
+ return false;
+ };
+
+
+/*
+ * ######################################
+ * UTILITY METHODS
+ * called externally or by initButtons
+ * ######################################
+ */
+
+ /**
+ * Change/reset a pane overflow setting & zIndex to allow popups/drop-downs to work
+ *
+ * @param {Object=} [el] (optional) Can also be 'bound' to a click, mouseOver, or other event
+ */
+ function allowOverflow (el) {
+ if (!isInitialized()) return;
+ if (this && this.tagName) el = this; // BOUND to element
+ var $P;
+ if (isStr(el))
+ $P = $Ps[el];
+ else if ($(el).data("layoutRole"))
+ $P = $(el);
+ else
+ $(el).parents().each(function(){
+ if ($(this).data("layoutRole")) {
+ $P = $(this);
+ return false; // BREAK
+ }
+ });
+ if (!$P || !$P.length) return; // INVALID
+
+ var
+ pane = $P.data("layoutEdge")
+ , s = state[pane]
+ ;
+
+ // if pane is already raised, then reset it before doing it again!
+ // this would happen if allowOverflow is attached to BOTH the pane and an element
+ if (s.cssSaved)
+ resetOverflow(pane); // reset previous CSS before continuing
+
+ // if pane is raised by sliding or resizing, or its closed, then abort
+ if (s.isSliding || s.isResizing || s.isClosed) {
+ s.cssSaved = false;
+ return;
+ }
+
+ var
+ newCSS = { zIndex: (options.zIndexes.resizer_normal + 1) }
+ , curCSS = {}
+ , of = $P.css("overflow")
+ , ofX = $P.css("overflowX")
+ , ofY = $P.css("overflowY")
+ ;
+ // determine which, if any, overflow settings need to be changed
+ if (of != "visible") {
+ curCSS.overflow = of;
+ newCSS.overflow = "visible";
+ }
+ if (ofX && !ofX.match(/(visible|auto)/)) {
+ curCSS.overflowX = ofX;
+ newCSS.overflowX = "visible";
+ }
+ if (ofY && !ofY.match(/(visible|auto)/)) {
+ curCSS.overflowY = ofX;
+ newCSS.overflowY = "visible";
+ }
+
+ // save the current overflow settings - even if blank!
+ s.cssSaved = curCSS;
+
+ // apply new CSS to raise zIndex and, if necessary, make overflow 'visible'
+ $P.css( newCSS );
+
+ // make sure the zIndex of all other panes is normal
+ $.each(_c.allPanes, function(i, p) {
+ if (p != pane) resetOverflow(p);
+ });
+
+ };
+ /**
+ * @param {Object=} [el] (optional) Can also be 'bound' to a click, mouseOver, or other event
+ */
+ function resetOverflow (el) {
+ if (!isInitialized()) return;
+ if (this && this.tagName) el = this; // BOUND to element
+ var $P;
+ if (isStr(el))
+ $P = $Ps[el];
+ else if ($(el).data("layoutRole"))
+ $P = $(el);
+ else
+ $(el).parents().each(function(){
+ if ($(this).data("layoutRole")) {
+ $P = $(this);
+ return false; // BREAK
+ }
+ });
+ if (!$P || !$P.length) return; // INVALID
+
+ var
+ pane = $P.data("layoutEdge")
+ , s = state[pane]
+ , CSS = s.cssSaved || {}
+ ;
+ // reset the zIndex
+ if (!s.isSliding && !s.isResizing)
+ $P.css("zIndex", options.zIndexes.pane_normal);
+
+ // reset Overflow - if necessary
+ $P.css( CSS );
+
+ // clear var
+ s.cssSaved = false;
+ };
+
+/*
+ * #####################
+ * CREATE/RETURN LAYOUT
+ * #####################
+ */
+
+ // validate that container exists
+ var $N = $(this).eq(0); // FIRST matching Container element
+ if (!$N.length) {
+ return _log( options.errors.containerMissing );
+ };
+
+ // Users retrieve Instance of a layout with: $N.layout() OR $N.data("layout")
+ // return the Instance-pointer if layout has already been initialized
+ if ($N.data("layoutContainer") && $N.data("layout"))
+ return $N.data("layout"); // cached pointer
+
+ // init global vars
+ var
+ $Ps = {} // Panes x5 - set in initPanes()
+ , $Cs = {} // Content x5 - set in initPanes()
+ , $Rs = {} // Resizers x4 - set in initHandles()
+ , $Ts = {} // Togglers x4 - set in initHandles()
+ , $Ms = $([]) // Masks - up to 2 masks per pane (IFRAME + DIV)
+ // aliases for code brevity
+ , sC = state.container // alias for easy access to 'container dimensions'
+ , sID = state.id // alias for unique layout ID/namespace - eg: "layout435"
+ ;
+
+ // create Instance object to expose data & option Properties, and primary action Methods
+ var Instance = {
+ // layout data
+ options: options // property - options hash
+ , state: state // property - dimensions hash
+ // object pointers
+ , container: $N // property - object pointers for layout container
+ , panes: $Ps // property - object pointers for ALL Panes: panes.north, panes.center
+ , contents: $Cs // property - object pointers for ALL Content: contents.north, contents.center
+ , resizers: $Rs // property - object pointers for ALL Resizers, eg: resizers.north
+ , togglers: $Ts // property - object pointers for ALL Togglers, eg: togglers.north
+ // border-pane open/close
+ , hide: hide // method - ditto
+ , show: show // method - ditto
+ , toggle: toggle // method - pass a 'pane' ("north", "west", etc)
+ , open: open // method - ditto
+ , close: close // method - ditto
+ , slideOpen: slideOpen // method - ditto
+ , slideClose: slideClose // method - ditto
+ , slideToggle: slideToggle // method - ditto
+ // pane actions
+ , setSizeLimits: setSizeLimits // method - pass a 'pane' - update state min/max data
+ , _sizePane: sizePane // method -intended for user by plugins only!
+ , sizePane: manualSizePane // method - pass a 'pane' AND an 'outer-size' in pixels or percent, or 'auto'
+ , sizeContent: sizeContent // method - pass a 'pane'
+ , swapPanes: swapPanes // method - pass TWO 'panes' - will swap them
+ , showMasks: showMasks // method - pass a 'pane' OR list of panes - default = all panes with mask option set
+ , hideMasks: hideMasks // method - ditto'
+ // pane element methods
+ , initContent: initContent // method - ditto
+ , addPane: addPane // method - pass a 'pane'
+ , removePane: removePane // method - pass a 'pane' to remove from layout, add 'true' to delete the pane-elem
+ , createChildLayout: createChildLayout// method - pass a 'pane' and (optional) layout-options (OVERRIDES options[pane].childOptions
+ // special pane option setting
+ , enableClosable: enableClosable // method - pass a 'pane'
+ , disableClosable: disableClosable // method - ditto
+ , enableSlidable: enableSlidable // method - ditto
+ , disableSlidable: disableSlidable // method - ditto
+ , enableResizable: enableResizable // method - ditto
+ , disableResizable: disableResizable// method - ditto
+ // utility methods for panes
+ , allowOverflow: allowOverflow // utility - pass calling element (this)
+ , resetOverflow: resetOverflow // utility - ditto
+ // layout control
+ , destroy: destroy // method - no parameters
+ , initPanes: isInitialized // method - no parameters
+ , resizeAll: resizeAll // method - no parameters
+ // callback triggering
+ , runCallbacks: _runCallbacks // method - pass evtName & pane (if a pane-event), eg: trigger("onopen", "west")
+ // alias collections of options, state and children - created in addPane and extended elsewhere
+ , hasParentLayout: false // set by initContainer()
+ , children: children // pointers to child-layouts, eg: Instance.children["west"]
+ , north: false // alias group: { name: pane, pane: $Ps[pane], options: options[pane], state: state[pane], child: children[pane] }
+ , south: false // ditto
+ , west: false // ditto
+ , east: false // ditto
+ , center: false // ditto
+ };
+
+ // create the border layout NOW
+ if (_create() === 'cancel') // onload_start callback returned false to CANCEL layout creation
+ return null;
+ else // true OR false -- if layout-elements did NOT init (hidden or do not exist), can auto-init later
+ return Instance; // return the Instance object
+
+}
+
+
+/* OLD versions of jQuery only set $.support.boxModel after page is loaded
+ * so if this is IE, use support.boxModel to test for quirks-mode (ONLY IE changes boxModel).
+ */
+$(function(){
+ var b = $.layout.browser;
+ if (b.msie) b.boxModel = $.support.boxModel;
+});
+
+
+/**
+ * jquery.layout.state 1.0
+ * $Date: 2011-07-16 08:00:00 (Sat, 16 July 2011) $
+ *
+ * Copyright (c) 2010
+ * Kevin Dalman (http://allpro.net)
+ *
+ * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
+ * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
+ *
+ * @dependancies: UI Layout 1.3.0.rc30.1 or higher
+ * @dependancies: $.ui.cookie (above)
+ *
+ * @support: http://groups.google.com/group/jquery-ui-layout
+ */
+/*
+ * State-management options stored in options.stateManagement, which includes a .cookie hash
+ * Default options saves ALL KEYS for ALL PANES, ie: pane.size, pane.isClosed, pane.isHidden
+ *
+ * // STATE/COOKIE OPTIONS
+ * @example $(el).layout({
+ stateManagement: {
+ enabled: true
+ , stateKeys: "east.size,west.size,east.isClosed,west.isClosed"
+ , cookie: { name: "appLayout", path: "/" }
+ }
+ })
+ * @example $(el).layout({ stateManagement__enabled: true }) // enable auto-state-management using cookies
+ * @example $(el).layout({ stateManagement__cookie: { name: "appLayout", path: "/" } })
+ * @example $(el).layout({ stateManagement__cookie__name: "appLayout", stateManagement__cookie__path: "/" })
+ *
+ * // STATE/COOKIE METHODS
+ * @example myLayout.saveCookie( "west.isClosed,north.size,south.isHidden", {expires: 7} );
+ * @example myLayout.loadCookie();
+ * @example myLayout.deleteCookie();
+ * @example var JSON = myLayout.readState(); // CURRENT Layout State
+ * @example var JSON = myLayout.readCookie(); // SAVED Layout State (from cookie)
+ * @example var JSON = myLayout.state.stateData; // LAST LOADED Layout State (cookie saved in layout.state hash)
+ *
+ * CUSTOM STATE-MANAGEMENT (eg, saved in a database)
+ * @example var JSON = myLayout.readState( "west.isClosed,north.size,south.isHidden" );
+ * @example myLayout.loadState( JSON );
+ */
+
+/**
+ * UI COOKIE UTILITY
+ *
+ * A $.cookie OR $.ui.cookie namespace *should be standard*, but until then...
+ * This creates $.ui.cookie so Layout does not need the cookie.jquery.js plugin
+ * NOTE: This utility is REQUIRED by the layout.state plugin
+ *
+ * Cookie methods in Layout are created as part of State Management
+ */
+if (!$.ui) $.ui = {};
+$.ui.cookie = {
+
+ // cookieEnabled is not in DOM specs, but DOES works in all browsers,including IE6
+ acceptsCookies: !!navigator.cookieEnabled
+
+, read: function (name) {
+ var
+ c = document.cookie
+ , cs = c ? c.split(';') : []
+ , pair // loop var
+ ;
+ for (var i=0, n=cs.length; i < n; i++) {
+ pair = $.trim(cs[i]).split('='); // name=value pair
+ if (pair[0] == name) // found the layout cookie
+ return decodeURIComponent(pair[1]);
+
+ }
+ return null;
+ }
+
+, write: function (name, val, cookieOpts) {
+ var
+ params = ''
+ , date = ''
+ , clear = false
+ , o = cookieOpts || {}
+ , x = o.expires
+ ;
+ if (x && x.toUTCString)
+ date = x;
+ else if (x === null || typeof x === 'number') {
+ date = new Date();
+ if (x > 0)
+ date.setDate(date.getDate() + x);
+ else {
+ date.setFullYear(1970);
+ clear = true;
+ }
+ }
+ if (date) params += ';expires='+ date.toUTCString();
+ if (o.path) params += ';path='+ o.path;
+ if (o.domain) params += ';domain='+ o.domain;
+ if (o.secure) params += ';secure';
+ document.cookie = name +'='+ (clear ? "" : encodeURIComponent( val )) + params; // write or clear cookie
+ }
+
+, clear: function (name) {
+ $.ui.cookie.write(name, '', {expires: -1});
+ }
+
+};
+// if cookie.jquery.js is not loaded, create an alias to replicate it
+// this may be useful to other plugins or code dependent on that plugin
+if (!$.cookie) $.cookie = function (k, v, o) {
+ var C = $.ui.cookie;
+ if (v === null)
+ C.clear(k);
+ else if (v === undefined)
+ return C.read(k);
+ else
+ C.write(k, v, o);
+};
+
+
+// tell Layout that the state plugin is available
+$.layout.plugins.stateManagement = true;
+
+// Add State-Management options to layout.defaults
+$.layout.config.optionRootKeys.push("stateManagement");
+$.layout.defaults.stateManagement = {
+ enabled: false // true = enable state-management, even if not using cookies
+, autoSave: true // Save a state-cookie when page exits?
+, autoLoad: true // Load the state-cookie when Layout inits?
+ // List state-data to save - must be pane-specific
+, stateKeys: "north.size,south.size,east.size,west.size,"+
+ "north.isClosed,south.isClosed,east.isClosed,west.isClosed,"+
+ "north.isHidden,south.isHidden,east.isHidden,west.isHidden"
+, cookie: {
+ name: "" // If not specified, will use Layout.name, else just "Layout"
+ , domain: "" // blank = current domain
+ , path: "" // blank = current page, '/' = entire website
+ , expires: "" // 'days' to keep cookie - leave blank for 'session cookie'
+ , secure: false
+ }
+};
+// Set stateManagement as a layout-option, NOT a pane-option
+$.layout.optionsMap.layout.push("stateManagement");
+
+/*
+ * State Management methods
+ */
+$.layout.state = {
+
+ /**
+ * Get the current layout state and save it to a cookie
+ *
+ * myLayout.saveCookie( keys, cookieOpts )
+ *
+ * @param {Object} inst
+ * @param {(string|Array)=} keys
+ * @param {Object=} cookieOpts
+ */
+ saveCookie: function (inst, keys, cookieOpts) {
+ var o = inst.options
+ , oS = o.stateManagement
+ , oC = $.extend(true, {}, oS.cookie, cookieOpts || null)
+ , data = inst.state.stateData = inst.readState( keys || oS.stateKeys ) // read current panes-state
+ ;
+ $.ui.cookie.write( oC.name || o.name || "Layout", $.layout.state.encodeJSON(data), oC );
+ return $.extend(true, {}, data); // return COPY of state.stateData data
+ }
+
+ /**
+ * Remove the state cookie
+ *
+ * @param {Object} inst
+ */
+, deleteCookie: function (inst) {
+ var o = inst.options;
+ $.ui.cookie.clear( o.stateManagement.cookie.name || o.name || "Layout" );
+ }
+
+ /**
+ * Read & return data from the cookie - as JSON
+ *
+ * @param {Object} inst
+ */
+, readCookie: function (inst) {
+ var o = inst.options;
+ var c = $.ui.cookie.read( o.stateManagement.cookie.name || o.name || "Layout" );
+ // convert cookie string back to a hash and return it
+ return c ? $.layout.state.decodeJSON(c) : {};
+ }
+
+ /**
+ * Get data from the cookie and USE IT to loadState
+ *
+ * @param {Object} inst
+ */
+, loadCookie: function (inst) {
+ var c = $.layout.state.readCookie(inst); // READ the cookie
+ if (c) {
+ inst.state.stateData = $.extend(true, {}, c); // SET state.stateData
+ inst.loadState(c); // LOAD the retrieved state
+ }
+ return c;
+ }
+
+ /**
+ * Update layout options from the cookie, if one exists
+ *
+ * @param {Object} inst
+ * @param {Object=} stateData
+ * @param {boolean=} animate
+ */
+, loadState: function (inst, stateData, animate) {
+ stateData = $.layout.transformData( stateData ); // panes = default subkey
+ if ($.isEmptyObject( stateData )) return;
+ $.extend(true, inst.options, stateData); // update layout options
+ // if layout has already been initialized, then UPDATE layout state
+ if (inst.state.initialized) {
+ var pane, vis, o, s, h, c
+ , noAnimate = (animate===false)
+ ;
+ $.each($.layout.config.borderPanes, function (idx, pane) {
+ state = inst.state[pane];
+ o = stateData[ pane ];
+ if (typeof o != 'object') return; // no key, continue
+ s = o.size;
+ c = o.initClosed;
+ h = o.initHidden;
+ vis = state.isVisible;
+ // resize BEFORE opening
+ if (!vis)
+ inst.sizePane(pane, s, false, false);
+ if (h === true) inst.hide(pane, noAnimate);
+ else if (c === false) inst.open (pane, false, noAnimate);
+ else if (c === true) inst.close(pane, false, noAnimate);
+ else if (h === false) inst.show (pane, false, noAnimate);
+ // resize AFTER any other actions
+ if (vis)
+ inst.sizePane(pane, s, false, noAnimate); // animate resize if option passed
+ });
+ };
+ }
+
+ /**
+ * Get the *current layout state* and return it as a hash
+ *
+ * @param {Object=} inst
+ * @param {(string|Array)=} keys
+ */
+, readState: function (inst, keys) {
+ var
+ data = {}
+ , alt = { isClosed: 'initClosed', isHidden: 'initHidden' }
+ , state = inst.state
+ , panes = $.layout.config.allPanes
+ , pair, pane, key, val
+ ;
+ if (!keys) keys = inst.options.stateManagement.stateKeys; // if called by user
+ if ($.isArray(keys)) keys = keys.join(",");
+ // convert keys to an array and change delimiters from '__' to '.'
+ keys = keys.replace(/__/g, ".").split(',');
+ // loop keys and create a data hash
+ for (var i=0, n=keys.length; i < n; i++) {
+ pair = keys[i].split(".");
+ pane = pair[0];
+ key = pair[1];
+ if ($.inArray(pane, panes) < 0) continue; // bad pane!
+ val = state[ pane ][ key ];
+ if (val == undefined) continue;
+ if (key=="isClosed" && state[pane]["isSliding"])
+ val = true; // if sliding, then *really* isClosed
+ ( data[pane] || (data[pane]={}) )[ alt[key] ? alt[key] : key ] = val;
+ }
+ return data;
+ }
+
+ /**
+ * Stringify a JSON hash so can save in a cookie or db-field
+ */
+, encodeJSON: function (JSON) {
+ return parse(JSON);
+ function parse (h) {
+ var D=[], i=0, k, v, t; // k = key, v = value
+ for (k in h) {
+ v = h[k];
+ t = typeof v;
+ if (t == 'string') // STRING - add quotes
+ v = '"'+ v +'"';
+ else if (t == 'object') // SUB-KEY - recurse into it
+ v = parse(v);
+ D[i++] = '"'+ k +'":'+ v;
+ }
+ return '{'+ D.join(',') +'}';
+ };
+ }
+
+ /**
+ * Convert stringified JSON back to a hash object
+ * @see $.parseJSON(), adding in jQuery 1.4.1
+ */
+, decodeJSON: function (str) {
+ try { return $.parseJSON ? $.parseJSON(str) : window["eval"]("("+ str +")") || {}; }
+ catch (e) { return {}; }
+ }
+
+
+, _create: function (inst) {
+ var _ = $.layout.state;
+ // ADD State-Management plugin methods to inst
+ $.extend( inst, {
+ // readCookie - update options from cookie - returns hash of cookie data
+ readCookie: function () { return _.readCookie(inst); }
+ // deleteCookie
+ , deleteCookie: function () { _.deleteCookie(inst); }
+ // saveCookie - optionally pass keys-list and cookie-options (hash)
+ , saveCookie: function (keys, cookieOpts) { return _.saveCookie(inst, keys, cookieOpts); }
+ // loadCookie - readCookie and use to loadState() - returns hash of cookie data
+ , loadCookie: function () { return _.loadCookie(inst); }
+ // loadState - pass a hash of state to use to update options
+ , loadState: function (stateData, animate) { _.loadState(inst, stateData, animate); }
+ // readState - returns hash of current layout-state
+ , readState: function (keys) { return _.readState(inst, keys); }
+ // add JSON utility methods too...
+ , encodeJSON: _.encodeJSON
+ , decodeJSON: _.decodeJSON
+ });
+
+ // init state.stateData key, even if plugin is initially disabled
+ inst.state.stateData = {};
+
+ // read and load cookie-data per options
+ var oS = inst.options.stateManagement;
+ if (oS.enabled) {
+ if (oS.autoLoad) // update the options from the cookie
+ inst.loadCookie();
+ else // don't modify options - just store cookie data in state.stateData
+ inst.state.stateData = inst.readCookie();
+ }
+ }
+
+, _unload: function (inst) {
+ var oS = inst.options.stateManagement;
+ if (oS.enabled) {
+ if (oS.autoSave) // save a state-cookie automatically
+ inst.saveCookie();
+ else // don't save a cookie, but do store state-data in state.stateData key
+ inst.state.stateData = inst.readState();
+ }
+ }
+
+};
+
+// add state initialization method to Layout's onCreate array of functions
+$.layout.onCreate.push( $.layout.state._create );
+$.layout.onUnload.push( $.layout.state._unload );
+
+
+
+
+/**
+ * jquery.layout.buttons 1.0
+ * $Date: 2011-07-16 08:00:00 (Sat, 16 July 2011) $
+ *
+ * Copyright (c) 2010
+ * Kevin Dalman (http://allpro.net)
+ *
+ * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
+ * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
+ *
+ * @dependancies: UI Layout 1.3.0.rc30.1 or higher
+ *
+ * @support: http://groups.google.com/group/jquery-ui-layout
+ *
+ * Docs: [ to come ]
+ * Tips: [ to come ]
+ */
+
+// tell Layout that the state plugin is available
+$.layout.plugins.buttons = true;
+
+// Add buttons options to layout.defaults
+$.layout.defaults.autoBindCustomButtons = false;
+// Specify autoBindCustomButtons as a layout-option, NOT a pane-option
+$.layout.optionsMap.layout.push("autoBindCustomButtons");
+
+/*
+ * Button methods
+ */
+$.layout.buttons = {
+
+ /**
+ * Searches for .ui-layout-button-xxx elements and auto-binds them as layout-buttons
+ *
+ * @see _create()
+ *
+ * @param {Object} inst Layout Instance object
+ */
+ init: function (inst) {
+ var pre = "ui-layout-button-"
+ , layout = inst.options.name || ""
+ , name;
+ $.each("toggle,open,close,pin,toggle-slide,open-slide".split(","), function (i, action) {
+ $.each($.layout.config.borderPanes, function (ii, pane) {
+ $("."+pre+action+"-"+pane).each(function(){
+ // if button was previously 'bound', data.layoutName was set, but is blank if layout has no 'name'
+ name = $(this).data("layoutName") || $(this).attr("layoutName");
+ if (name == undefined || name === layout)
+ inst.bindButton(this, action, pane);
+ });
+ });
+ });
+ }
+
+ /**
+ * Helper function to validate params received by addButton utilities
+ *
+ * Two classes are added to the element, based on the buttonClass...
+ * The type of button is appended to create the 2nd className:
+ * - ui-layout-button-pin // action btnClass
+ * - ui-layout-button-pin-west // action btnClass + pane
+ * - ui-layout-button-toggle
+ * - ui-layout-button-open
+ * - ui-layout-button-close
+ *
+ * @param {Object} inst Layout Instance object
+ * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
+ * @param {string} pane Name of the pane the button is for: 'north', 'south', etc.
+ *
+ * @return {Array.<Object>} If both params valid, the element matching 'selector' in a jQuery wrapper - otherwise returns null
+ */
+, get: function (inst, selector, pane, action) {
+ var $E = $(selector)
+ , o = inst.options
+ , err = o.errors.addButtonError
+ ;
+ if (!$E.length) { // element not found
+ $.layout.msg(err +" "+ o.errors.selector +": "+ selector, true);
+ }
+ else if ($.inArray(pane, $.layout.config.borderPanes) < 0) { // invalid 'pane' sepecified
+ $.layout.msg(err +" "+ o.errors.pane +": "+ pane, true);
+ $E = $(""); // NO BUTTON
+ }
+ else { // VALID
+ var btn = o[pane].buttonClass +"-"+ action;
+ $E .addClass( btn +" "+ btn +"-"+ pane )
+ .data("layoutName", o.name); // add layout identifier - even if blank!
+ }
+ return $E;
+ }
+
+
+ /**
+ * NEW syntax for binding layout-buttons - will eventually replace addToggle, addOpen, etc.
+ *
+ * @param {Object} inst Layout Instance object
+ * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
+ * @param {string} action
+ * @param {string} pane
+ */
+, bind: function (inst, selector, action, pane) {
+ var _ = $.layout.buttons;
+ switch (action.toLowerCase()) {
+ case "toggle": _.addToggle (inst, selector, pane); break;
+ case "open": _.addOpen (inst, selector, pane); break;
+ case "close": _.addClose (inst, selector, pane); break;
+ case "pin": _.addPin (inst, selector, pane); break;
+ case "toggle-slide": _.addToggle (inst, selector, pane, true); break;
+ case "open-slide": _.addOpen (inst, selector, pane, true); break;
+ }
+ return inst;
+ }
+
+ /**
+ * Add a custom Toggler button for a pane
+ *
+ * @param {Object} inst Layout Instance object
+ * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
+ * @param {string} pane Name of the pane the button is for: 'north', 'south', etc.
+ * @param {boolean=} slide true = slide-open, false = pin-open
+ */
+, addToggle: function (inst, selector, pane, slide) {
+ $.layout.buttons.get(inst, selector, pane, "toggle")
+ .click(function(evt){
+ inst.toggle(pane, !!slide);
+ evt.stopPropagation();
+ });
+ return inst;
+ }
+
+ /**
+ * Add a custom Open button for a pane
+ *
+ * @param {Object} inst Layout Instance object
+ * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
+ * @param {string} pane Name of the pane the button is for: 'north', 'south', etc.
+ * @param {boolean=} slide true = slide-open, false = pin-open
+ */
+, addOpen: function (inst, selector, pane, slide) {
+ $.layout.buttons.get(inst, selector, pane, "open")
+ .attr("title", inst.options[pane].tips.Open)
+ .click(function (evt) {
+ inst.open(pane, !!slide);
+ evt.stopPropagation();
+ });
+ return inst;
+ }
+
+ /**
+ * Add a custom Close button for a pane
+ *
+ * @param {Object} inst Layout Instance object
+ * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
+ * @param {string} pane Name of the pane the button is for: 'north', 'south', etc.
+ */
+, addClose: function (inst, selector, pane) {
+ $.layout.buttons.get(inst, selector, pane, "close")
+ .attr("title", inst.options[pane].tips.Close)
+ .click(function (evt) {
+ inst.close(pane);
+ evt.stopPropagation();
+ });
+ return inst;
+ }
+
+ /**
+ * Add a custom Pin button for a pane
+ *
+ * Four classes are added to the element, based on the paneClass for the associated pane...
+ * Assuming the default paneClass and the pin is 'up', these classes are added for a west-pane pin:
+ * - ui-layout-pane-pin
+ * - ui-layout-pane-west-pin
+ * - ui-layout-pane-pin-up
+ * - ui-layout-pane-west-pin-up
+ *
+ * @param {Object} inst Layout Instance object
+ * @param {(string|!Object)} selector jQuery selector (or element) for button, eg: ".ui-layout-north .toggle-button"
+ * @param {string} pane Name of the pane the pin is for: 'north', 'south', etc.
+ */
+, addPin: function (inst, selector, pane) {
+ var _ = $.layout.buttons
+ , $E = _.get(inst, selector, pane, "pin");
+ if ($E.length) {
+ var s = inst.state[pane];
+ $E.click(function (evt) {
+ _.setPinState(inst, $(this), pane, (s.isSliding || s.isClosed));
+ if (s.isSliding || s.isClosed) inst.open( pane ); // change from sliding to open
+ else inst.close( pane ); // slide-closed
+ evt.stopPropagation();
+ });
+ // add up/down pin attributes and classes
+ _.setPinState(inst, $E, pane, (!s.isClosed && !s.isSliding));
+ // add this pin to the pane data so we can 'sync it' automatically
+ // PANE.pins key is an array so we can store multiple pins for each pane
+ s.pins.push( selector ); // just save the selector string
+ }
+ return inst;
+ }
+
+ /**
+ * Change the class of the pin button to make it look 'up' or 'down'
+ *
+ * @see addPin(), syncPins()
+ *
+ * @param {Object} inst Layout Instance object
+ * @param {Array.<Object>} $Pin The pin-span element in a jQuery wrapper
+ * @param {string} pane These are the params returned to callbacks by layout()
+ * @param {boolean} doPin true = set the pin 'down', false = set it 'up'
+ */
+, setPinState: function (inst, $Pin, pane, doPin) {
+ var updown = $Pin.attr("pin");
+ if (updown && doPin === (updown=="down")) return; // already in correct state
+ var
+ o = inst.options[pane]
+ , pin = o.buttonClass +"-pin"
+ , side = pin +"-"+ pane
+ , UP = pin +"-up "+ side +"-up"
+ , DN = pin +"-down "+side +"-down"
+ ;
+ $Pin
+ .attr("pin", doPin ? "down" : "up") // logic
+ .attr("title", doPin ? o.tips.Unpin : o.tips.Pin)
+ .removeClass( doPin ? UP : DN )
+ .addClass( doPin ? DN : UP )
+ ;
+ }
+
+ /**
+ * INTERNAL function to sync 'pin buttons' when pane is opened or closed
+ * Unpinned means the pane is 'sliding' - ie, over-top of the adjacent panes
+ *
+ * @see open(), close()
+ *
+ * @param {Object} inst Layout Instance object
+ * @param {string} pane These are the params returned to callbacks by layout()
+ * @param {boolean} doPin True means set the pin 'down', False means 'up'
+ */
+, syncPinBtns: function (inst, pane, doPin) {
+ // REAL METHOD IS _INSIDE_ LAYOUT - THIS IS HERE JUST FOR REFERENCE
+ $.each(inst.state[pane].pins, function (i, selector) {
+ $.layout.buttons.setPinState(inst, $(selector), pane, doPin);
+ });
+ }
+
+
+, _load: function (inst) {
+ var _ = $.layout.buttons;
+ // ADD Button methods to Layout Instance
+ // Note: sel = jQuery Selector string
+ $.extend( inst, {
+ bindButton: function (sel, action, pane) { return _.bind(inst, sel, action, pane); }
+ // DEPRECATED METHODS
+ , addToggleBtn: function (sel, pane, slide) { return _.addToggle(inst, sel, pane, slide); }
+ , addOpenBtn: function (sel, pane, slide) { return _.addOpen(inst, sel, pane, slide); }
+ , addCloseBtn: function (sel, pane) { return _.addClose(inst, sel, pane); }
+ , addPinBtn: function (sel, pane) { return _.addPin(inst, sel, pane); }
+ });
+
+ // init state array to hold pin-buttons
+ for (var i=0; i<4; i++) {
+ var pane = $.layout.config.borderPanes[i];
+ inst.state[pane].pins = [];
+ }
+
+ // auto-init buttons onLoad if option is enabled
+ if ( inst.options.autoBindCustomButtons )
+ _.init(inst);
+ }
+
+, _unload: function (inst) {
+ // TODO: unbind all buttons???
+ }
+
+};
+
+// add initialization method to Layout's onLoad array of functions
+$.layout.onLoad.push( $.layout.buttons._load );
+//$.layout.onUnload.push( $.layout.buttons._unload );
+
+
+
+/**
+ * jquery.layout.browserZoom 1.0
+ * $Date: 2011-12-29 08:00:00 (Thu, 29 Dec 2011) $
+ *
+ * Copyright (c) 2012
+ * Kevin Dalman (http://allpro.net)
+ *
+ * Dual licensed under the GPL (http://www.gnu.org/licenses/gpl.html)
+ * and MIT (http://www.opensource.org/licenses/mit-license.php) licenses.
+ *
+ * @dependancies: UI Layout 1.3.0.rc30.1 or higher
+ *
+ * @support: http://groups.google.com/group/jquery-ui-layout
+ *
+ * @todo: Extend logic to handle other problematic zooming in browsers
+ * @todo: Add hotkey/mousewheel bindings to _instantly_ respond to these zoom event
+ */
+
+// tell Layout that the plugin is available
+$.layout.plugins.browserZoom = true;
+
+$.layout.defaults.browserZoomCheckInterval = 1000;
+$.layout.optionsMap.layout.push("browserZoomCheckInterval");
+
+/*
+ * browserZoom methods
+ */
+$.layout.browserZoom = {
+
+ _init: function (inst) {
+ // abort if browser does not need this check
+ if ($.layout.browserZoom.ratio() !== false)
+ $.layout.browserZoom._setTimer(inst);
+ }
+
+, _setTimer: function (inst) {
+ // abort if layout destroyed or browser does not need this check
+ if (inst.destroyed) return;
+ var o = inst.options
+ , s = inst.state
+ // don't need check if inst has parentLayout, but check occassionally in case parent destroyed!
+ // MINIMUM 100ms interval, for performance
+ , ms = inst.hasParentLayout ? 5000 : Math.max( o.browserZoomCheckInterval, 100 )
+ ;
+ // set the timer
+ setTimeout(function(){
+ if (inst.destroyed || !o.resizeWithWindow) return;
+ var d = $.layout.browserZoom.ratio();
+ if (d !== s.browserZoom) {
+ s.browserZoom = d;
+ inst.resizeAll();
+ }
+ // set a NEW timeout
+ $.layout.browserZoom._setTimer(inst);
+ }
+ , ms );
+ }
+
+, ratio: function () {
+ var w = window
+ , s = screen
+ , d = document
+ , dE = d.documentElement || d.body
+ , b = $.layout.browser
+ , v = b.version
+ , r, sW, cW
+ ;
+ // we can ignore all browsers that fire window.resize event onZoom
+ if ((b.msie && v > 8)
+ || !b.msie
+ ) return false; // don't need to track zoom
+
+ if (s.deviceXDPI)
+ return calc(s.deviceXDPI, s.systemXDPI);
+ // everything below is just for future reference!
+ if (b.webkit && (r = d.body.getBoundingClientRect))
+ return calc((r.left - r.right), d.body.offsetWidth);
+ if (b.webkit && (sW = w.outerWidth))
+ return calc(sW, w.innerWidth);
+ if ((sW = s.width) && (cW = dE.clientWidth))
+ return calc(sW, cW);
+ return false; // no match, so cannot - or don't need to - track zoom
+
+ function calc (x,y) { return (parseInt(x,10) / parseInt(y,10) * 100).toFixed(); }
+ }
+
+};
+// add initialization method to Layout's onLoad array of functions
+$.layout.onReady.push( $.layout.browserZoom._init );
+
+
+
+})( jQuery ); \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js
new file mode 100644
index 0000000000..4688d633fe
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js
@@ -0,0 +1,4 @@
+/* Modernizr 2.5.3 (Custom Build) | MIT & BSD
+ * Build: http://www.modernizr.com/download/#-inlinesvg
+ */
+;window.Modernizr=function(a,b,c){function u(a){i.cssText=a}function v(a,b){return u(prefixes.join(a+";")+(b||""))}function w(a,b){return typeof a===b}function x(a,b){return!!~(""+a).indexOf(b)}function y(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:w(f,"function")?f.bind(d||b):f}return!1}var d="2.5.3",e={},f=b.documentElement,g="modernizr",h=b.createElement(g),i=h.style,j,k={}.toString,l={svg:"http://www.w3.org/2000/svg"},m={},n={},o={},p=[],q=p.slice,r,s={}.hasOwnProperty,t;!w(s,"undefined")&&!w(s.call,"undefined")?t=function(a,b){return s.call(a,b)}:t=function(a,b){return b in a&&w(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=q.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(q.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(q.call(arguments)))};return e}),m.inlinesvg=function(){var a=b.createElement("div");return a.innerHTML="<svg/>",(a.firstChild&&a.firstChild.namespaceURI)==l.svg};for(var z in m)t(m,z)&&(r=z.toLowerCase(),e[r]=m[z](),p.push((e[r]?"":"no-")+r));return u(""),h=j=null,e._version=d,e}(this,this.document); \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/navigation-li-a.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/navigation-li-a.png
new file mode 100644
index 0000000000..9b32288e04
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/navigation-li-a.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/navigation-li.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/navigation-li.png
new file mode 100644
index 0000000000..fd0ad06e81
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/navigation-li.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object.png
new file mode 100644
index 0000000000..ad312793ea
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_big.png
new file mode 100644
index 0000000000..67ffca79de
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_diagram.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_diagram.png
new file mode 100644
index 0000000000..6e9f2f743f
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_diagram.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_class_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_class_big.png
new file mode 100644
index 0000000000..7502942eb6
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_class_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_trait_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_trait_big.png
new file mode 100644
index 0000000000..c777bfce8d
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_trait_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_type_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_type_big.png
new file mode 100644
index 0000000000..7502942eb6
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/object_to_type_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownderbg2.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownderbg2.gif
new file mode 100644
index 0000000000..848dd5963a
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownderbg2.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownerbg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownerbg.gif
new file mode 100644
index 0000000000..34a04249ee
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownerbg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownerbg2.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownerbg2.gif
new file mode 100644
index 0000000000..2ed33b0aa4
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ownerbg2.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/package.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/package.png
new file mode 100644
index 0000000000..6ea17ac320
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/package.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/package_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/package_big.png
new file mode 100644
index 0000000000..529aa93188
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/package_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/packagesbg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/packagesbg.gif
new file mode 100644
index 0000000000..00c3378a2a
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/packagesbg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/raphael-min.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/raphael-min.js
new file mode 100644
index 0000000000..d30dbad858
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/raphael-min.js
@@ -0,0 +1,10 @@
+// ┌────────────────────────────────────────────────────────────────────┠\\
+// │ Raphaël 2.1.0 - JavaScript Vector Library │ \\
+// ├────────────────────────────────────────────────────────────────────┤ \\
+// │ Copyright © 2008-2012 Dmitry Baranovskiy (http://raphaeljs.com) │ \\
+// │ Copyright © 2008-2012 Sencha Labs (http://sencha.com) │ \\
+// ├────────────────────────────────────────────────────────────────────┤ \\
+// │ Licensed under the MIT (http://raphaeljs.com/license.html) license.│ \\
+// └────────────────────────────────────────────────────────────────────┘ \\
+
+(function(a){var b="0.3.4",c="hasOwnProperty",d=/[\.\/]/,e="*",f=function(){},g=function(a,b){return a-b},h,i,j={n:{}},k=function(a,b){var c=j,d=i,e=Array.prototype.slice.call(arguments,2),f=k.listeners(a),l=0,m=!1,n,o=[],p={},q=[],r=h,s=[];h=a,i=0;for(var t=0,u=f.length;t<u;t++)"zIndex"in f[t]&&(o.push(f[t].zIndex),f[t].zIndex<0&&(p[f[t].zIndex]=f[t]));o.sort(g);while(o[l]<0){n=p[o[l++]],q.push(n.apply(b,e));if(i){i=d;return q}}for(t=0;t<u;t++){n=f[t];if("zIndex"in n)if(n.zIndex==o[l]){q.push(n.apply(b,e));if(i)break;do{l++,n=p[o[l]],n&&q.push(n.apply(b,e));if(i)break}while(n)}else p[n.zIndex]=n;else{q.push(n.apply(b,e));if(i)break}}i=d,h=r;return q.length?q:null};k.listeners=function(a){var b=a.split(d),c=j,f,g,h,i,k,l,m,n,o=[c],p=[];for(i=0,k=b.length;i<k;i++){n=[];for(l=0,m=o.length;l<m;l++){c=o[l].n,g=[c[b[i]],c[e]],h=2;while(h--)f=g[h],f&&(n.push(f),p=p.concat(f.f||[]))}o=n}return p},k.on=function(a,b){var c=a.split(d),e=j;for(var g=0,h=c.length;g<h;g++)e=e.n,!e[c[g]]&&(e[c[g]]={n:{}}),e=e[c[g]];e.f=e.f||[];for(g=0,h=e.f.length;g<h;g++)if(e.f[g]==b)return f;e.f.push(b);return function(a){+a==+a&&(b.zIndex=+a)}},k.stop=function(){i=1},k.nt=function(a){if(a)return(new RegExp("(?:\\.|\\/|^)"+a+"(?:\\.|\\/|$)")).test(h);return h},k.off=k.unbind=function(a,b){var f=a.split(d),g,h,i,k,l,m,n,o=[j];for(k=0,l=f.length;k<l;k++)for(m=0;m<o.length;m+=i.length-2){i=[m,1],g=o[m].n;if(f[k]!=e)g[f[k]]&&i.push(g[f[k]]);else for(h in g)g[c](h)&&i.push(g[h]);o.splice.apply(o,i)}for(k=0,l=o.length;k<l;k++){g=o[k];while(g.n){if(b){if(g.f){for(m=0,n=g.f.length;m<n;m++)if(g.f[m]==b){g.f.splice(m,1);break}!g.f.length&&delete g.f}for(h in g.n)if(g.n[c](h)&&g.n[h].f){var p=g.n[h].f;for(m=0,n=p.length;m<n;m++)if(p[m]==b){p.splice(m,1);break}!p.length&&delete g.n[h].f}}else{delete g.f;for(h in g.n)g.n[c](h)&&g.n[h].f&&delete g.n[h].f}g=g.n}}},k.once=function(a,b){var c=function(){var d=b.apply(this,arguments);k.unbind(a,c);return d};return k.on(a,c)},k.version=b,k.toString=function(){return"You are running Eve "+b},typeof module!="undefined"&&module.exports?module.exports=k:typeof define!="undefined"?define("eve",[],function(){return k}):a.eve=k})(this),function(){function cF(a){for(var b=0;b<cy.length;b++)cy[b].el.paper==a&&cy.splice(b--,1)}function cE(b,d,e,f,h,i){e=Q(e);var j,k,l,m=[],o,p,q,t=b.ms,u={},v={},w={};if(f)for(y=0,z=cy.length;y<z;y++){var x=cy[y];if(x.el.id==d.id&&x.anim==b){x.percent!=e?(cy.splice(y,1),l=1):k=x,d.attr(x.totalOrigin);break}}else f=+v;for(var y=0,z=b.percents.length;y<z;y++){if(b.percents[y]==e||b.percents[y]>f*b.top){e=b.percents[y],p=b.percents[y-1]||0,t=t/b.top*(e-p),o=b.percents[y+1],j=b.anim[e];break}f&&d.attr(b.anim[b.percents[y]])}if(!!j){if(!k){for(var A in j)if(j[g](A))if(U[g](A)||d.paper.customAttributes[g](A)){u[A]=d.attr(A),u[A]==null&&(u[A]=T[A]),v[A]=j[A];switch(U[A]){case C:w[A]=(v[A]-u[A])/t;break;case"colour":u[A]=a.getRGB(u[A]);var B=a.getRGB(v[A]);w[A]={r:(B.r-u[A].r)/t,g:(B.g-u[A].g)/t,b:(B.b-u[A].b)/t};break;case"path":var D=bR(u[A],v[A]),E=D[1];u[A]=D[0],w[A]=[];for(y=0,z=u[A].length;y<z;y++){w[A][y]=[0];for(var F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(E[y][F]-u[A][y][F])/t}break;case"transform":var H=d._,I=ca(H[A],v[A]);if(I){u[A]=I.from,v[A]=I.to,w[A]=[],w[A].real=!0;for(y=0,z=u[A].length;y<z;y++){w[A][y]=[u[A][y][0]];for(F=1,G=u[A][y].length;F<G;F++)w[A][y][F]=(v[A][y][F]-u[A][y][F])/t}}else{var J=d.matrix||new cb,K={_:{transform:H.transform},getBBox:function(){return d.getBBox(1)}};u[A]=[J.a,J.b,J.c,J.d,J.e,J.f],b$(K,v[A]),v[A]=K._.transform,w[A]=[(K.matrix.a-J.a)/t,(K.matrix.b-J.b)/t,(K.matrix.c-J.c)/t,(K.matrix.d-J.d)/t,(K.matrix.e-J.e)/t,(K.matrix.f-J.f)/t]}break;case"csv":var L=r(j[A])[s](c),M=r(u[A])[s](c);if(A=="clip-rect"){u[A]=M,w[A]=[],y=M.length;while(y--)w[A][y]=(L[y]-u[A][y])/t}v[A]=L;break;default:L=[][n](j[A]),M=[][n](u[A]),w[A]=[],y=d.paper.customAttributes[A].length;while(y--)w[A][y]=((L[y]||0)-(M[y]||0))/t}}var O=j.easing,P=a.easing_formulas[O];if(!P){P=r(O).match(N);if(P&&P.length==5){var R=P;P=function(a){return cC(a,+R[1],+R[2],+R[3],+R[4],t)}}else P=bf}q=j.start||b.start||+(new Date),x={anim:b,percent:e,timestamp:q,start:q+(b.del||0),status:0,initstatus:f||0,stop:!1,ms:t,easing:P,from:u,diff:w,to:v,el:d,callback:j.callback,prev:p,next:o,repeat:i||b.times,origin:d.attr(),totalOrigin:h},cy.push(x);if(f&&!k&&!l){x.stop=!0,x.start=new Date-t*f;if(cy.length==1)return cA()}l&&(x.start=new Date-x.ms*f),cy.length==1&&cz(cA)}else k.initstatus=f,k.start=new Date-k.ms*f;eve("raphael.anim.start."+d.id,d,b)}}function cD(a,b){var c=[],d={};this.ms=b,this.times=1;if(a){for(var e in a)a[g](e)&&(d[Q(e)]=a[e],c.push(Q(e)));c.sort(bd)}this.anim=d,this.top=c[c.length-1],this.percents=c}function cC(a,b,c,d,e,f){function o(a,b){var c,d,e,f,j,k;for(e=a,k=0;k<8;k++){f=m(e)-a;if(z(f)<b)return e;j=(3*i*e+2*h)*e+g;if(z(j)<1e-6)break;e=e-f/j}c=0,d=1,e=a;if(e<c)return c;if(e>d)return d;while(c<d){f=m(e);if(z(f-a)<b)return e;a>f?c=e:d=e,e=(d-c)/2+c}return e}function n(a,b){var c=o(a,b);return((l*c+k)*c+j)*c}function m(a){return((i*a+h)*a+g)*a}var g=3*b,h=3*(d-b)-g,i=1-g-h,j=3*c,k=3*(e-c)-j,l=1-j-k;return n(a,1/(200*f))}function cq(){return this.x+q+this.y+q+this.width+" × "+this.height}function cp(){return this.x+q+this.y}function cb(a,b,c,d,e,f){a!=null?(this.a=+a,this.b=+b,this.c=+c,this.d=+d,this.e=+e,this.f=+f):(this.a=1,this.b=0,this.c=0,this.d=1,this.e=0,this.f=0)}function bH(b,c,d){b=a._path2curve(b),c=a._path2curve(c);var e,f,g,h,i,j,k,l,m,n,o=d?0:[];for(var p=0,q=b.length;p<q;p++){var r=b[p];if(r[0]=="M")e=i=r[1],f=j=r[2];else{r[0]=="C"?(m=[e,f].concat(r.slice(1)),e=m[6],f=m[7]):(m=[e,f,e,f,i,j,i,j],e=i,f=j);for(var s=0,t=c.length;s<t;s++){var u=c[s];if(u[0]=="M")g=k=u[1],h=l=u[2];else{u[0]=="C"?(n=[g,h].concat(u.slice(1)),g=n[6],h=n[7]):(n=[g,h,g,h,k,l,k,l],g=k,h=l);var v=bG(m,n,d);if(d)o+=v;else{for(var w=0,x=v.length;w<x;w++)v[w].segment1=p,v[w].segment2=s,v[w].bez1=m,v[w].bez2=n;o=o.concat(v)}}}}}return o}function bG(b,c,d){var e=a.bezierBBox(b),f=a.bezierBBox(c);if(!a.isBBoxIntersect(e,f))return d?0:[];var g=bB.apply(0,b),h=bB.apply(0,c),i=~~(g/5),j=~~(h/5),k=[],l=[],m={},n=d?0:[];for(var o=0;o<i+1;o++){var p=a.findDotsAtSegment.apply(a,b.concat(o/i));k.push({x:p.x,y:p.y,t:o/i})}for(o=0;o<j+1;o++)p=a.findDotsAtSegment.apply(a,c.concat(o/j)),l.push({x:p.x,y:p.y,t:o/j});for(o=0;o<i;o++)for(var q=0;q<j;q++){var r=k[o],s=k[o+1],t=l[q],u=l[q+1],v=z(s.x-r.x)<.001?"y":"x",w=z(u.x-t.x)<.001?"y":"x",x=bD(r.x,r.y,s.x,s.y,t.x,t.y,u.x,u.y);if(x){if(m[x.x.toFixed(4)]==x.y.toFixed(4))continue;m[x.x.toFixed(4)]=x.y.toFixed(4);var y=r.t+z((x[v]-r[v])/(s[v]-r[v]))*(s.t-r.t),A=t.t+z((x[w]-t[w])/(u[w]-t[w]))*(u.t-t.t);y>=0&&y<=1&&A>=0&&A<=1&&(d?n++:n.push({x:x.x,y:x.y,t1:y,t2:A}))}}return n}function bF(a,b){return bG(a,b,1)}function bE(a,b){return bG(a,b)}function bD(a,b,c,d,e,f,g,h){if(!(x(a,c)<y(e,g)||y(a,c)>x(e,g)||x(b,d)<y(f,h)||y(b,d)>x(f,h))){var i=(a*d-b*c)*(e-g)-(a-c)*(e*h-f*g),j=(a*d-b*c)*(f-h)-(b-d)*(e*h-f*g),k=(a-c)*(f-h)-(b-d)*(e-g);if(!k)return;var l=i/k,m=j/k,n=+l.toFixed(2),o=+m.toFixed(2);if(n<+y(a,c).toFixed(2)||n>+x(a,c).toFixed(2)||n<+y(e,g).toFixed(2)||n>+x(e,g).toFixed(2)||o<+y(b,d).toFixed(2)||o>+x(b,d).toFixed(2)||o<+y(f,h).toFixed(2)||o>+x(f,h).toFixed(2))return;return{x:l,y:m}}}function bC(a,b,c,d,e,f,g,h,i){if(!(i<0||bB(a,b,c,d,e,f,g,h)<i)){var j=1,k=j/2,l=j-k,m,n=.01;m=bB(a,b,c,d,e,f,g,h,l);while(z(m-i)>n)k/=2,l+=(m<i?1:-1)*k,m=bB(a,b,c,d,e,f,g,h,l);return l}}function bB(a,b,c,d,e,f,g,h,i){i==null&&(i=1),i=i>1?1:i<0?0:i;var j=i/2,k=12,l=[-0.1252,.1252,-0.3678,.3678,-0.5873,.5873,-0.7699,.7699,-0.9041,.9041,-0.9816,.9816],m=[.2491,.2491,.2335,.2335,.2032,.2032,.1601,.1601,.1069,.1069,.0472,.0472],n=0;for(var o=0;o<k;o++){var p=j*l[o]+j,q=bA(p,a,c,e,g),r=bA(p,b,d,f,h),s=q*q+r*r;n+=m[o]*w.sqrt(s)}return j*n}function bA(a,b,c,d,e){var f=-3*b+9*c-9*d+3*e,g=a*f+6*b-12*c+6*d;return a*g-3*b+3*c}function by(a,b){var c=[];for(var d=0,e=a.length;e-2*!b>d;d+=2){var f=[{x:+a[d-2],y:+a[d-1]},{x:+a[d],y:+a[d+1]},{x:+a[d+2],y:+a[d+3]},{x:+a[d+4],y:+a[d+5]}];b?d?e-4==d?f[3]={x:+a[0],y:+a[1]}:e-2==d&&(f[2]={x:+a[0],y:+a[1]},f[3]={x:+a[2],y:+a[3]}):f[0]={x:+a[e-2],y:+a[e-1]}:e-4==d?f[3]=f[2]:d||(f[0]={x:+a[d],y:+a[d+1]}),c.push(["C",(-f[0].x+6*f[1].x+f[2].x)/6,(-f[0].y+6*f[1].y+f[2].y)/6,(f[1].x+6*f[2].x-f[3].x)/6,(f[1].y+6*f[2].y-f[3].y)/6,f[2].x,f[2].y])}return c}function bx(){return this.hex}function bv(a,b,c){function d(){var e=Array.prototype.slice.call(arguments,0),f=e.join("â€"),h=d.cache=d.cache||{},i=d.count=d.count||[];if(h[g](f)){bu(i,f);return c?c(h[f]):h[f]}i.length>=1e3&&delete h[i.shift()],i.push(f),h[f]=a[m](b,e);return c?c(h[f]):h[f]}return d}function bu(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return a.push(a.splice(c,1)[0])}function bm(a){if(Object(a)!==a)return a;var b=new a.constructor;for(var c in a)a[g](c)&&(b[c]=bm(a[c]));return b}function a(c){if(a.is(c,"function"))return b?c():eve.on("raphael.DOMload",c);if(a.is(c,E))return a._engine.create[m](a,c.splice(0,3+a.is(c[0],C))).add(c);var d=Array.prototype.slice.call(arguments,0);if(a.is(d[d.length-1],"function")){var e=d.pop();return b?e.call(a._engine.create[m](a,d)):eve.on("raphael.DOMload",function(){e.call(a._engine.create[m](a,d))})}return a._engine.create[m](a,arguments)}a.version="2.1.0",a.eve=eve;var b,c=/[, ]+/,d={circle:1,rect:1,path:1,ellipse:1,text:1,image:1},e=/\{(\d+)\}/g,f="prototype",g="hasOwnProperty",h={doc:document,win:window},i={was:Object.prototype[g].call(h.win,"Raphael"),is:h.win.Raphael},j=function(){this.ca=this.customAttributes={}},k,l="appendChild",m="apply",n="concat",o="createTouch"in h.doc,p="",q=" ",r=String,s="split",t="click dblclick mousedown mousemove mouseout mouseover mouseup touchstart touchmove touchend touchcancel"[s](q),u={mousedown:"touchstart",mousemove:"touchmove",mouseup:"touchend"},v=r.prototype.toLowerCase,w=Math,x=w.max,y=w.min,z=w.abs,A=w.pow,B=w.PI,C="number",D="string",E="array",F="toString",G="fill",H=Object.prototype.toString,I={},J="push",K=a._ISURL=/^url\(['"]?([^\)]+?)['"]?\)$/i,L=/^\s*((#[a-f\d]{6})|(#[a-f\d]{3})|rgba?\(\s*([\d\.]+%?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+%?(?:\s*,\s*[\d\.]+%?)?)\s*\)|hsba?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\)|hsla?\(\s*([\d\.]+(?:deg|\xb0|%)?\s*,\s*[\d\.]+%?\s*,\s*[\d\.]+(?:%?\s*,\s*[\d\.]+)?)%?\s*\))\s*$/i,M={NaN:1,Infinity:1,"-Infinity":1},N=/^(?:cubic-)?bezier\(([^,]+),([^,]+),([^,]+),([^\)]+)\)/,O=w.round,P="setAttribute",Q=parseFloat,R=parseInt,S=r.prototype.toUpperCase,T=a._availableAttrs={"arrow-end":"none","arrow-start":"none",blur:0,"clip-rect":"0 0 1e9 1e9",cursor:"default",cx:0,cy:0,fill:"#fff","fill-opacity":1,font:'10px "Arial"',"font-family":'"Arial"',"font-size":"10","font-style":"normal","font-weight":400,gradient:0,height:0,href:"http://raphaeljs.com/","letter-spacing":0,opacity:1,path:"M0,0",r:0,rx:0,ry:0,src:"",stroke:"#000","stroke-dasharray":"","stroke-linecap":"butt","stroke-linejoin":"butt","stroke-miterlimit":0,"stroke-opacity":1,"stroke-width":1,target:"_blank","text-anchor":"middle",title:"Raphael",transform:"",width:0,x:0,y:0},U=a._availableAnimAttrs={blur:C,"clip-rect":"csv",cx:C,cy:C,fill:"colour","fill-opacity":C,"font-size":C,height:C,opacity:C,path:"path",r:C,rx:C,ry:C,stroke:"colour","stroke-opacity":C,"stroke-width":C,transform:"transform",width:C,x:C,y:C},V=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]/g,W=/[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/,X={hs:1,rg:1},Y=/,?([achlmqrstvxz]),?/gi,Z=/([achlmrqstvz])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,$=/([rstm])[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029,]*((-?\d*\.?\d*(?:e[\-+]?\d+)?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*)+)/ig,_=/(-?\d*\.?\d*(?:e[\-+]?\d+)?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,?[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*/ig,ba=a._radial_gradient=/^r(?:\(([^,]+?)[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*,[\x09\x0a\x0b\x0c\x0d\x20\xa0\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000\u2028\u2029]*([^\)]+?)\))?/,bb={},bc=function(a,b){return a.key-b.key},bd=function(a,b){return Q(a)-Q(b)},be=function(){},bf=function(a){return a},bg=a._rectPath=function(a,b,c,d,e){if(e)return[["M",a+e,b],["l",c-e*2,0],["a",e,e,0,0,1,e,e],["l",0,d-e*2],["a",e,e,0,0,1,-e,e],["l",e*2-c,0],["a",e,e,0,0,1,-e,-e],["l",0,e*2-d],["a",e,e,0,0,1,e,-e],["z"]];return[["M",a,b],["l",c,0],["l",0,d],["l",-c,0],["z"]]},bh=function(a,b,c,d){d==null&&(d=c);return[["M",a,b],["m",0,-d],["a",c,d,0,1,1,0,2*d],["a",c,d,0,1,1,0,-2*d],["z"]]},bi=a._getPath={path:function(a){return a.attr("path")},circle:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.r)},ellipse:function(a){var b=a.attrs;return bh(b.cx,b.cy,b.rx,b.ry)},rect:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height,b.r)},image:function(a){var b=a.attrs;return bg(b.x,b.y,b.width,b.height)},text:function(a){var b=a._getBBox();return bg(b.x,b.y,b.width,b.height)}},bj=a.mapPath=function(a,b){if(!b)return a;var c,d,e,f,g,h,i;a=bR(a);for(e=0,g=a.length;e<g;e++){i=a[e];for(f=1,h=i.length;f<h;f+=2)c=b.x(i[f],i[f+1]),d=b.y(i[f],i[f+1]),i[f]=c,i[f+1]=d}return a};a._g=h,a.type=h.win.SVGAngle||h.doc.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure","1.1")?"SVG":"VML";if(a.type=="VML"){var bk=h.doc.createElement("div"),bl;bk.innerHTML='<v:shape adj="1"/>',bl=bk.firstChild,bl.style.behavior="url(#default#VML)";if(!bl||typeof bl.adj!="object")return a.type=p;bk=null}a.svg=!(a.vml=a.type=="VML"),a._Paper=j,a.fn=k=j.prototype=a.prototype,a._id=0,a._oid=0,a.is=function(a,b){b=v.call(b);if(b=="finite")return!M[g](+a);if(b=="array")return a instanceof Array;return b=="null"&&a===null||b==typeof a&&a!==null||b=="object"&&a===Object(a)||b=="array"&&Array.isArray&&Array.isArray(a)||H.call(a).slice(8,-1).toLowerCase()==b},a.angle=function(b,c,d,e,f,g){if(f==null){var h=b-d,i=c-e;if(!h&&!i)return 0;return(180+w.atan2(-i,-h)*180/B+360)%360}return a.angle(b,c,f,g)-a.angle(d,e,f,g)},a.rad=function(a){return a%360*B/180},a.deg=function(a){return a*180/B%360},a.snapTo=function(b,c,d){d=a.is(d,"finite")?d:10;if(a.is(b,E)){var e=b.length;while(e--)if(z(b[e]-c)<=d)return b[e]}else{b=+b;var f=c%b;if(f<d)return c-f;if(f>b-d)return c-f+b}return c};var bn=a.createUUID=function(a,b){return function(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(a,b).toUpperCase()}}(/[xy]/g,function(a){var b=w.random()*16|0,c=a=="x"?b:b&3|8;return c.toString(16)});a.setWindow=function(b){eve("raphael.setWindow",a,h.win,b),h.win=b,h.doc=h.win.document,a._engine.initWin&&a._engine.initWin(h.win)};var bo=function(b){if(a.vml){var c=/^\s+|\s+$/g,d;try{var e=new ActiveXObject("htmlfile");e.write("<body>"),e.close(),d=e.body}catch(f){d=createPopup().document.body}var g=d.createTextRange();bo=bv(function(a){try{d.style.color=r(a).replace(c,p);var b=g.queryCommandValue("ForeColor");b=(b&255)<<16|b&65280|(b&16711680)>>>16;return"#"+("000000"+b.toString(16)).slice(-6)}catch(e){return"none"}})}else{var i=h.doc.createElement("i");i.title="Raphaël Colour Picker",i.style.display="none",h.doc.body.appendChild(i),bo=bv(function(a){i.style.color=a;return h.doc.defaultView.getComputedStyle(i,p).getPropertyValue("color")})}return bo(b)},bp=function(){return"hsb("+[this.h,this.s,this.b]+")"},bq=function(){return"hsl("+[this.h,this.s,this.l]+")"},br=function(){return this.hex},bs=function(b,c,d){c==null&&a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b&&(d=b.b,c=b.g,b=b.r);if(c==null&&a.is(b,D)){var e=a.getRGB(b);b=e.r,c=e.g,d=e.b}if(b>1||c>1||d>1)b/=255,c/=255,d/=255;return[b,c,d]},bt=function(b,c,d,e){b*=255,c*=255,d*=255;var f={r:b,g:c,b:d,hex:a.rgb(b,c,d),toString:br};a.is(e,"finite")&&(f.opacity=e);return f};a.color=function(b){var c;a.is(b,"object")&&"h"in b&&"s"in b&&"b"in b?(c=a.hsb2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):a.is(b,"object")&&"h"in b&&"s"in b&&"l"in b?(c=a.hsl2rgb(b),b.r=c.r,b.g=c.g,b.b=c.b,b.hex=c.hex):(a.is(b,"string")&&(b=a.getRGB(b)),a.is(b,"object")&&"r"in b&&"g"in b&&"b"in b?(c=a.rgb2hsl(b),b.h=c.h,b.s=c.s,b.l=c.l,c=a.rgb2hsb(b),b.v=c.b):(b={hex:"none"},b.r=b.g=b.b=b.h=b.s=b.v=b.l=-1)),b.toString=br;return b},a.hsb2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"b"in a&&(c=a.b,b=a.s,a=a.h,d=a.o),a*=360;var e,f,g,h,i;a=a%360/60,i=c*b,h=i*(1-z(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.hsl2rgb=function(a,b,c,d){this.is(a,"object")&&"h"in a&&"s"in a&&"l"in a&&(c=a.l,b=a.s,a=a.h);if(a>1||b>1||c>1)a/=360,b/=100,c/=100;a*=360;var e,f,g,h,i;a=a%360/60,i=2*b*(c<.5?c:1-c),h=i*(1-z(a%2-1)),e=f=g=c-i/2,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a];return bt(e,f,g,d)},a.rgb2hsb=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g;f=x(a,b,c),g=f-y(a,b,c),d=g==0?null:f==a?(b-c)/g:f==b?(c-a)/g+2:(a-b)/g+4,d=(d+360)%6*60/360,e=g==0?0:g/f;return{h:d,s:e,b:f,toString:bp}},a.rgb2hsl=function(a,b,c){c=bs(a,b,c),a=c[0],b=c[1],c=c[2];var d,e,f,g,h,i;g=x(a,b,c),h=y(a,b,c),i=g-h,d=i==0?null:g==a?(b-c)/i:g==b?(c-a)/i+2:(a-b)/i+4,d=(d+360)%6*60/360,f=(g+h)/2,e=i==0?0:f<.5?i/(2*f):i/(2-2*f);return{h:d,s:e,l:f,toString:bq}},a._path2string=function(){return this.join(",").replace(Y,"$1")};var bw=a._preload=function(a,b){var c=h.doc.createElement("img");c.style.cssText="position:absolute;left:-9999em;top:-9999em",c.onload=function(){b.call(this),this.onload=null,h.doc.body.removeChild(this)},c.onerror=function(){h.doc.body.removeChild(this)},h.doc.body.appendChild(c),c.src=a};a.getRGB=bv(function(b){if(!b||!!((b=r(b)).indexOf("-")+1))return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx};if(b=="none")return{r:-1,g:-1,b:-1,hex:"none",toString:bx};!X[g](b.toLowerCase().substring(0,2))&&b.charAt()!="#"&&(b=bo(b));var c,d,e,f,h,i,j,k=b.match(L);if(k){k[2]&&(f=R(k[2].substring(5),16),e=R(k[2].substring(3,5),16),d=R(k[2].substring(1,3),16)),k[3]&&(f=R((i=k[3].charAt(3))+i,16),e=R((i=k[3].charAt(2))+i,16),d=R((i=k[3].charAt(1))+i,16)),k[4]&&(j=k[4][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),k[1].toLowerCase().slice(0,4)=="rgba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100));if(k[5]){j=k[5][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsba"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsb2rgb(d,e,f,h)}if(k[6]){j=k[6][s](W),d=Q(j[0]),j[0].slice(-1)=="%"&&(d*=2.55),e=Q(j[1]),j[1].slice(-1)=="%"&&(e*=2.55),f=Q(j[2]),j[2].slice(-1)=="%"&&(f*=2.55),(j[0].slice(-3)=="deg"||j[0].slice(-1)=="°")&&(d/=360),k[1].toLowerCase().slice(0,4)=="hsla"&&(h=Q(j[3])),j[3]&&j[3].slice(-1)=="%"&&(h/=100);return a.hsl2rgb(d,e,f,h)}k={r:d,g:e,b:f,toString:bx},k.hex="#"+(16777216|f|e<<8|d<<16).toString(16).slice(1),a.is(h,"finite")&&(k.opacity=h);return k}return{r:-1,g:-1,b:-1,hex:"none",error:1,toString:bx}},a),a.hsb=bv(function(b,c,d){return a.hsb2rgb(b,c,d).hex}),a.hsl=bv(function(b,c,d){return a.hsl2rgb(b,c,d).hex}),a.rgb=bv(function(a,b,c){return"#"+(16777216|c|b<<8|a<<16).toString(16).slice(1)}),a.getColor=function(a){var b=this.getColor.start=this.getColor.start||{h:0,s:1,b:a||.75},c=this.hsb2rgb(b.h,b.s,b.b);b.h+=.075,b.h>1&&(b.h=0,b.s-=.2,b.s<=0&&(this.getColor.start={h:0,s:1,b:b.b}));return c.hex},a.getColor.reset=function(){delete this.start},a.parsePathString=function(b){if(!b)return null;var c=bz(b);if(c.arr)return bJ(c.arr);var d={a:7,c:6,h:1,l:2,m:2,r:4,q:4,s:4,t:2,v:1,z:0},e=[];a.is(b,E)&&a.is(b[0],E)&&(e=bJ(b)),e.length||r(b).replace(Z,function(a,b,c){var f=[],g=b.toLowerCase();c.replace(_,function(a,b){b&&f.push(+b)}),g=="m"&&f.length>2&&(e.push([b][n](f.splice(0,2))),g="l",b=b=="m"?"l":"L");if(g=="r")e.push([b][n](f));else while(f.length>=d[g]){e.push([b][n](f.splice(0,d[g])));if(!d[g])break}}),e.toString=a._path2string,c.arr=bJ(e);return e},a.parseTransformString=bv(function(b){if(!b)return null;var c={r:3,s:4,t:2,m:6},d=[];a.is(b,E)&&a.is(b[0],E)&&(d=bJ(b)),d.length||r(b).replace($,function(a,b,c){var e=[],f=v.call(b);c.replace(_,function(a,b){b&&e.push(+b)}),d.push([b][n](e))}),d.toString=a._path2string;return d});var bz=function(a){var b=bz.ps=bz.ps||{};b[a]?b[a].sleep=100:b[a]={sleep:100},setTimeout(function(){for(var c in b)b[g](c)&&c!=a&&(b[c].sleep--,!b[c].sleep&&delete b[c])});return b[a]};a.findDotsAtSegment=function(a,b,c,d,e,f,g,h,i){var j=1-i,k=A(j,3),l=A(j,2),m=i*i,n=m*i,o=k*a+l*3*i*c+j*3*i*i*e+n*g,p=k*b+l*3*i*d+j*3*i*i*f+n*h,q=a+2*i*(c-a)+m*(e-2*c+a),r=b+2*i*(d-b)+m*(f-2*d+b),s=c+2*i*(e-c)+m*(g-2*e+c),t=d+2*i*(f-d)+m*(h-2*f+d),u=j*a+i*c,v=j*b+i*d,x=j*e+i*g,y=j*f+i*h,z=90-w.atan2(q-s,r-t)*180/B;(q>s||r<t)&&(z+=180);return{x:o,y:p,m:{x:q,y:r},n:{x:s,y:t},start:{x:u,y:v},end:{x:x,y:y},alpha:z}},a.bezierBBox=function(b,c,d,e,f,g,h,i){a.is(b,"array")||(b=[b,c,d,e,f,g,h,i]);var j=bQ.apply(null,b);return{x:j.min.x,y:j.min.y,x2:j.max.x,y2:j.max.y,width:j.max.x-j.min.x,height:j.max.y-j.min.y}},a.isPointInsideBBox=function(a,b,c){return b>=a.x&&b<=a.x2&&c>=a.y&&c<=a.y2},a.isBBoxIntersect=function(b,c){var d=a.isPointInsideBBox;return d(c,b.x,b.y)||d(c,b.x2,b.y)||d(c,b.x,b.y2)||d(c,b.x2,b.y2)||d(b,c.x,c.y)||d(b,c.x2,c.y)||d(b,c.x,c.y2)||d(b,c.x2,c.y2)||(b.x<c.x2&&b.x>c.x||c.x<b.x2&&c.x>b.x)&&(b.y<c.y2&&b.y>c.y||c.y<b.y2&&c.y>b.y)},a.pathIntersection=function(a,b){return bH(a,b)},a.pathIntersectionNumber=function(a,b){return bH(a,b,1)},a.isPointInsidePath=function(b,c,d){var e=a.pathBBox(b);return a.isPointInsideBBox(e,c,d)&&bH(b,[["M",c,d],["H",e.x2+10]],1)%2==1},a._removedFactory=function(a){return function(){eve("raphael.log",null,"Raphaël: you are calling to method “"+a+"†of removed object",a)}};var bI=a.pathBBox=function(a){var b=bz(a);if(b.bbox)return b.bbox;if(!a)return{x:0,y:0,width:0,height:0,x2:0,y2:0};a=bR(a);var c=0,d=0,e=[],f=[],g;for(var h=0,i=a.length;h<i;h++){g=a[h];if(g[0]=="M")c=g[1],d=g[2],e.push(c),f.push(d);else{var j=bQ(c,d,g[1],g[2],g[3],g[4],g[5],g[6]);e=e[n](j.min.x,j.max.x),f=f[n](j.min.y,j.max.y),c=g[5],d=g[6]}}var k=y[m](0,e),l=y[m](0,f),o=x[m](0,e),p=x[m](0,f),q={x:k,y:l,x2:o,y2:p,width:o-k,height:p-l};b.bbox=bm(q);return q},bJ=function(b){var c=bm(b);c.toString=a._path2string;return c},bK=a._pathToRelative=function(b){var c=bz(b);if(c.rel)return bJ(c.rel);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=b[0][1],f=b[0][2],g=e,h=f,i++,d.push(["M",e,f]));for(var j=i,k=b.length;j<k;j++){var l=d[j]=[],m=b[j];if(m[0]!=v.call(m[0])){l[0]=v.call(m[0]);switch(l[0]){case"a":l[1]=m[1],l[2]=m[2],l[3]=m[3],l[4]=m[4],l[5]=m[5],l[6]=+(m[6]-e).toFixed(3),l[7]=+(m[7]-f).toFixed(3);break;case"v":l[1]=+(m[1]-f).toFixed(3);break;case"m":g=m[1],h=m[2];default:for(var n=1,o=m.length;n<o;n++)l[n]=+(m[n]-(n%2?e:f)).toFixed(3)}}else{l=d[j]=[],m[0]=="m"&&(g=m[1]+e,h=m[2]+f);for(var p=0,q=m.length;p<q;p++)d[j][p]=m[p]}var r=d[j].length;switch(d[j][0]){case"z":e=g,f=h;break;case"h":e+=+d[j][r-1];break;case"v":f+=+d[j][r-1];break;default:e+=+d[j][r-2],f+=+d[j][r-1]}}d.toString=a._path2string,c.rel=bJ(d);return d},bL=a._pathToAbsolute=function(b){var c=bz(b);if(c.abs)return bJ(c.abs);if(!a.is(b,E)||!a.is(b&&b[0],E))b=a.parsePathString(b);if(!b||!b.length)return[["M",0,0]];var d=[],e=0,f=0,g=0,h=0,i=0;b[0][0]=="M"&&(e=+b[0][1],f=+b[0][2],g=e,h=f,i++,d[0]=["M",e,f]);var j=b.length==3&&b[0][0]=="M"&&b[1][0].toUpperCase()=="R"&&b[2][0].toUpperCase()=="Z";for(var k,l,m=i,o=b.length;m<o;m++){d.push(k=[]),l=b[m];if(l[0]!=S.call(l[0])){k[0]=S.call(l[0]);switch(k[0]){case"A":k[1]=l[1],k[2]=l[2],k[3]=l[3],k[4]=l[4],k[5]=l[5],k[6]=+(l[6]+e),k[7]=+(l[7]+f);break;case"V":k[1]=+l[1]+f;break;case"H":k[1]=+l[1]+e;break;case"R":var p=[e,f][n](l.slice(1));for(var q=2,r=p.length;q<r;q++)p[q]=+p[q]+e,p[++q]=+p[q]+f;d.pop(),d=d[n](by(p,j));break;case"M":g=+l[1]+e,h=+l[2]+f;default:for(q=1,r=l.length;q<r;q++)k[q]=+l[q]+(q%2?e:f)}}else if(l[0]=="R")p=[e,f][n](l.slice(1)),d.pop(),d=d[n](by(p,j)),k=["R"][n](l.slice(-2));else for(var s=0,t=l.length;s<t;s++)k[s]=l[s];switch(k[0]){case"Z":e=g,f=h;break;case"H":e=k[1];break;case"V":f=k[1];break;case"M":g=k[k.length-2],h=k[k.length-1];default:e=k[k.length-2],f=k[k.length-1]}}d.toString=a._path2string,c.abs=bJ(d);return d},bM=function(a,b,c,d){return[a,b,c,d,c,d]},bN=function(a,b,c,d,e,f){var g=1/3,h=2/3;return[g*a+h*c,g*b+h*d,g*e+h*c,g*f+h*d,e,f]},bO=function(a,b,c,d,e,f,g,h,i,j){var k=B*120/180,l=B/180*(+e||0),m=[],o,p=bv(function(a,b,c){var d=a*w.cos(c)-b*w.sin(c),e=a*w.sin(c)+b*w.cos(c);return{x:d,y:e}});if(!j){o=p(a,b,-l),a=o.x,b=o.y,o=p(h,i,-l),h=o.x,i=o.y;var q=w.cos(B/180*e),r=w.sin(B/180*e),t=(a-h)/2,u=(b-i)/2,v=t*t/(c*c)+u*u/(d*d);v>1&&(v=w.sqrt(v),c=v*c,d=v*d);var x=c*c,y=d*d,A=(f==g?-1:1)*w.sqrt(z((x*y-x*u*u-y*t*t)/(x*u*u+y*t*t))),C=A*c*u/d+(a+h)/2,D=A*-d*t/c+(b+i)/2,E=w.asin(((b-D)/d).toFixed(9)),F=w.asin(((i-D)/d).toFixed(9));E=a<C?B-E:E,F=h<C?B-F:F,E<0&&(E=B*2+E),F<0&&(F=B*2+F),g&&E>F&&(E=E-B*2),!g&&F>E&&(F=F-B*2)}else E=j[0],F=j[1],C=j[2],D=j[3];var G=F-E;if(z(G)>k){var H=F,I=h,J=i;F=E+k*(g&&F>E?1:-1),h=C+c*w.cos(F),i=D+d*w.sin(F),m=bO(h,i,c,d,e,0,g,I,J,[F,H,C,D])}G=F-E;var K=w.cos(E),L=w.sin(E),M=w.cos(F),N=w.sin(F),O=w.tan(G/4),P=4/3*c*O,Q=4/3*d*O,R=[a,b],S=[a+P*L,b-Q*K],T=[h+P*N,i-Q*M],U=[h,i];S[0]=2*R[0]-S[0],S[1]=2*R[1]-S[1];if(j)return[S,T,U][n](m);m=[S,T,U][n](m).join()[s](",");var V=[];for(var W=0,X=m.length;W<X;W++)V[W]=W%2?p(m[W-1],m[W],l).y:p(m[W],m[W+1],l).x;return V},bP=function(a,b,c,d,e,f,g,h,i){var j=1-i;return{x:A(j,3)*a+A(j,2)*3*i*c+j*3*i*i*e+A(i,3)*g,y:A(j,3)*b+A(j,2)*3*i*d+j*3*i*i*f+A(i,3)*h}},bQ=bv(function(a,b,c,d,e,f,g,h){var i=e-2*c+a-(g-2*e+c),j=2*(c-a)-2*(e-c),k=a-c,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,o=[b,h],p=[a,g],q;z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y)),i=f-2*d+b-(h-2*f+d),j=2*(d-b)-2*(f-d),k=b-d,l=(-j+w.sqrt(j*j-4*i*k))/2/i,n=(-j-w.sqrt(j*j-4*i*k))/2/i,z(l)>"1e12"&&(l=.5),z(n)>"1e12"&&(n=.5),l>0&&l<1&&(q=bP(a,b,c,d,e,f,g,h,l),p.push(q.x),o.push(q.y)),n>0&&n<1&&(q=bP(a,b,c,d,e,f,g,h,n),p.push(q.x),o.push(q.y));return{min:{x:y[m](0,p),y:y[m](0,o)},max:{x:x[m](0,p),y:x[m](0,o)}}}),bR=a._path2curve=bv(function(a,b){var c=!b&&bz(a);if(!b&&c.curve)return bJ(c.curve);var d=bL(a),e=b&&bL(b),f={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},g={x:0,y:0,bx:0,by:0,X:0,Y:0,qx:null,qy:null},h=function(a,b){var c,d;if(!a)return["C",b.x,b.y,b.x,b.y,b.x,b.y];!(a[0]in{T:1,Q:1})&&(b.qx=b.qy=null);switch(a[0]){case"M":b.X=a[1],b.Y=a[2];break;case"A":a=["C"][n](bO[m](0,[b.x,b.y][n](a.slice(1))));break;case"S":c=b.x+(b.x-(b.bx||b.x)),d=b.y+(b.y-(b.by||b.y)),a=["C",c,d][n](a.slice(1));break;case"T":b.qx=b.x+(b.x-(b.qx||b.x)),b.qy=b.y+(b.y-(b.qy||b.y)),a=["C"][n](bN(b.x,b.y,b.qx,b.qy,a[1],a[2]));break;case"Q":b.qx=a[1],b.qy=a[2],a=["C"][n](bN(b.x,b.y,a[1],a[2],a[3],a[4]));break;case"L":a=["C"][n](bM(b.x,b.y,a[1],a[2]));break;case"H":a=["C"][n](bM(b.x,b.y,a[1],b.y));break;case"V":a=["C"][n](bM(b.x,b.y,b.x,a[1]));break;case"Z":a=["C"][n](bM(b.x,b.y,b.X,b.Y))}return a},i=function(a,b){if(a[b].length>7){a[b].shift();var c=a[b];while(c.length)a.splice(b++,0,["C"][n](c.splice(0,6)));a.splice(b,1),l=x(d.length,e&&e.length||0)}},j=function(a,b,c,f,g){a&&b&&a[g][0]=="M"&&b[g][0]!="M"&&(b.splice(g,0,["M",f.x,f.y]),c.bx=0,c.by=0,c.x=a[g][1],c.y=a[g][2],l=x(d.length,e&&e.length||0))};for(var k=0,l=x(d.length,e&&e.length||0);k<l;k++){d[k]=h(d[k],f),i(d,k),e&&(e[k]=h(e[k],g)),e&&i(e,k),j(d,e,f,g,k),j(e,d,g,f,k);var o=d[k],p=e&&e[k],q=o.length,r=e&&p.length;f.x=o[q-2],f.y=o[q-1],f.bx=Q(o[q-4])||f.x,f.by=Q(o[q-3])||f.y,g.bx=e&&(Q(p[r-4])||g.x),g.by=e&&(Q(p[r-3])||g.y),g.x=e&&p[r-2],g.y=e&&p[r-1]}e||(c.curve=bJ(d));return e?[d,e]:d},null,bJ),bS=a._parseDots=bv(function(b){var c=[];for(var d=0,e=b.length;d<e;d++){var f={},g=b[d].match(/^([^:]*):?([\d\.]*)/);f.color=a.getRGB(g[1]);if(f.color.error)return null;f.color=f.color.hex,g[2]&&(f.offset=g[2]+"%"),c.push(f)}for(d=1,e=c.length-1;d<e;d++)if(!c[d].offset){var h=Q(c[d-1].offset||0),i=0;for(var j=d+1;j<e;j++)if(c[j].offset){i=c[j].offset;break}i||(i=100,j=e),i=Q(i);var k=(i-h)/(j-d+1);for(;d<j;d++)h+=k,c[d].offset=h+"%"}return c}),bT=a._tear=function(a,b){a==b.top&&(b.top=a.prev),a==b.bottom&&(b.bottom=a.next),a.next&&(a.next.prev=a.prev),a.prev&&(a.prev.next=a.next)},bU=a._tofront=function(a,b){b.top!==a&&(bT(a,b),a.next=null,a.prev=b.top,b.top.next=a,b.top=a)},bV=a._toback=function(a,b){b.bottom!==a&&(bT(a,b),a.next=b.bottom,a.prev=null,b.bottom.prev=a,b.bottom=a)},bW=a._insertafter=function(a,b,c){bT(a,c),b==c.top&&(c.top=a),b.next&&(b.next.prev=a),a.next=b.next,a.prev=b,b.next=a},bX=a._insertbefore=function(a,b,c){bT(a,c),b==c.bottom&&(c.bottom=a),b.prev&&(b.prev.next=a),a.prev=b.prev,b.prev=a,a.next=b},bY=a.toMatrix=function(a,b){var c=bI(a),d={_:{transform:p},getBBox:function(){return c}};b$(d,b);return d.matrix},bZ=a.transformPath=function(a,b){return bj(a,bY(a,b))},b$=a._extractTransform=function(b,c){if(c==null)return b._.transform;c=r(c).replace(/\.{3}|\u2026/g,b._.transform||p);var d=a.parseTransformString(c),e=0,f=0,g=0,h=1,i=1,j=b._,k=new cb;j.transform=d||[];if(d)for(var l=0,m=d.length;l<m;l++){var n=d[l],o=n.length,q=r(n[0]).toLowerCase(),s=n[0]!=q,t=s?k.invert():0,u,v,w,x,y;q=="t"&&o==3?s?(u=t.x(0,0),v=t.y(0,0),w=t.x(n[1],n[2]),x=t.y(n[1],n[2]),k.translate(w-u,x-v)):k.translate(n[1],n[2]):q=="r"?o==2?(y=y||b.getBBox(1),k.rotate(n[1],y.x+y.width/2,y.y+y.height/2),e+=n[1]):o==4&&(s?(w=t.x(n[2],n[3]),x=t.y(n[2],n[3]),k.rotate(n[1],w,x)):k.rotate(n[1],n[2],n[3]),e+=n[1]):q=="s"?o==2||o==3?(y=y||b.getBBox(1),k.scale(n[1],n[o-1],y.x+y.width/2,y.y+y.height/2),h*=n[1],i*=n[o-1]):o==5&&(s?(w=t.x(n[3],n[4]),x=t.y(n[3],n[4]),k.scale(n[1],n[2],w,x)):k.scale(n[1],n[2],n[3],n[4]),h*=n[1],i*=n[2]):q=="m"&&o==7&&k.add(n[1],n[2],n[3],n[4],n[5],n[6]),j.dirtyT=1,b.matrix=k}b.matrix=k,j.sx=h,j.sy=i,j.deg=e,j.dx=f=k.e,j.dy=g=k.f,h==1&&i==1&&!e&&j.bbox?(j.bbox.x+=+f,j.bbox.y+=+g):j.dirtyT=1},b_=function(a){var b=a[0];switch(b.toLowerCase()){case"t":return[b,0,0];case"m":return[b,1,0,0,1,0,0];case"r":return a.length==4?[b,0,a[2],a[3]]:[b,0];case"s":return a.length==5?[b,1,1,a[3],a[4]]:a.length==3?[b,1,1]:[b,1]}},ca=a._equaliseTransform=function(b,c){c=r(c).replace(/\.{3}|\u2026/g,b),b=a.parseTransformString(b)||[],c=a.parseTransformString(c)||[];var d=x(b.length,c.length),e=[],f=[],g=0,h,i,j,k;for(;g<d;g++){j=b[g]||b_(c[g]),k=c[g]||b_(j);if(j[0]!=k[0]||j[0].toLowerCase()=="r"&&(j[2]!=k[2]||j[3]!=k[3])||j[0].toLowerCase()=="s"&&(j[3]!=k[3]||j[4]!=k[4]))return;e[g]=[],f[g]=[];for(h=0,i=x(j.length,k.length);h<i;h++)h in j&&(e[g][h]=j[h]),h in k&&(f[g][h]=k[h])}return{from:e,to:f}};a._getContainer=function(b,c,d,e){var f;f=e==null&&!a.is(b,"object")?h.doc.getElementById(b):b;if(f!=null){if(f.tagName)return c==null?{container:f,width:f.style.pixelWidth||f.offsetWidth,height:f.style.pixelHeight||f.offsetHeight}:{container:f,width:c,height:d};return{container:1,x:b,y:c,width:d,height:e}}},a.pathToRelative=bK,a._engine={},a.path2curve=bR,a.matrix=function(a,b,c,d,e,f){return new cb(a,b,c,d,e,f)},function(b){function d(a){var b=w.sqrt(c(a));a[0]&&(a[0]/=b),a[1]&&(a[1]/=b)}function c(a){return a[0]*a[0]+a[1]*a[1]}b.add=function(a,b,c,d,e,f){var g=[[],[],[]],h=[[this.a,this.c,this.e],[this.b,this.d,this.f],[0,0,1]],i=[[a,c,e],[b,d,f],[0,0,1]],j,k,l,m;a&&a instanceof cb&&(i=[[a.a,a.c,a.e],[a.b,a.d,a.f],[0,0,1]]);for(j=0;j<3;j++)for(k=0;k<3;k++){m=0;for(l=0;l<3;l++)m+=h[j][l]*i[l][k];g[j][k]=m}this.a=g[0][0],this.b=g[1][0],this.c=g[0][1],this.d=g[1][1],this.e=g[0][2],this.f=g[1][2]},b.invert=function(){var a=this,b=a.a*a.d-a.b*a.c;return new cb(a.d/b,-a.b/b,-a.c/b,a.a/b,(a.c*a.f-a.d*a.e)/b,(a.b*a.e-a.a*a.f)/b)},b.clone=function(){return new cb(this.a,this.b,this.c,this.d,this.e,this.f)},b.translate=function(a,b){this.add(1,0,0,1,a,b)},b.scale=function(a,b,c,d){b==null&&(b=a),(c||d)&&this.add(1,0,0,1,c,d),this.add(a,0,0,b,0,0),(c||d)&&this.add(1,0,0,1,-c,-d)},b.rotate=function(b,c,d){b=a.rad(b),c=c||0,d=d||0;var e=+w.cos(b).toFixed(9),f=+w.sin(b).toFixed(9);this.add(e,f,-f,e,c,d),this.add(1,0,0,1,-c,-d)},b.x=function(a,b){return a*this.a+b*this.c+this.e},b.y=function(a,b){return a*this.b+b*this.d+this.f},b.get=function(a){return+this[r.fromCharCode(97+a)].toFixed(4)},b.toString=function(){return a.svg?"matrix("+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)].join()+")":[this.get(0),this.get(2),this.get(1),this.get(3),0,0].join()},b.toFilter=function(){return"progid:DXImageTransform.Microsoft.Matrix(M11="+this.get(0)+", M12="+this.get(2)+", M21="+this.get(1)+", M22="+this.get(3)+", Dx="+this.get(4)+", Dy="+this.get(5)+", sizingmethod='auto expand')"},b.offset=function(){return[this.e.toFixed(4),this.f.toFixed(4)]},b.split=function(){var b={};b.dx=this.e,b.dy=this.f;var e=[[this.a,this.c],[this.b,this.d]];b.scalex=w.sqrt(c(e[0])),d(e[0]),b.shear=e[0][0]*e[1][0]+e[0][1]*e[1][1],e[1]=[e[1][0]-e[0][0]*b.shear,e[1][1]-e[0][1]*b.shear],b.scaley=w.sqrt(c(e[1])),d(e[1]),b.shear/=b.scaley;var f=-e[0][1],g=e[1][1];g<0?(b.rotate=a.deg(w.acos(g)),f<0&&(b.rotate=360-b.rotate)):b.rotate=a.deg(w.asin(f)),b.isSimple=!+b.shear.toFixed(9)&&(b.scalex.toFixed(9)==b.scaley.toFixed(9)||!b.rotate),b.isSuperSimple=!+b.shear.toFixed(9)&&b.scalex.toFixed(9)==b.scaley.toFixed(9)&&!b.rotate,b.noRotation=!+b.shear.toFixed(9)&&!b.rotate;return b},b.toTransformString=function(a){var b=a||this[s]();if(b.isSimple){b.scalex=+b.scalex.toFixed(4),b.scaley=+b.scaley.toFixed(4),b.rotate=+b.rotate.toFixed(4);return(b.dx||b.dy?"t"+[b.dx,b.dy]:p)+(b.scalex!=1||b.scaley!=1?"s"+[b.scalex,b.scaley,0,0]:p)+(b.rotate?"r"+[b.rotate,0,0]:p)}return"m"+[this.get(0),this.get(1),this.get(2),this.get(3),this.get(4),this.get(5)]}}(cb.prototype);var cc=navigator.userAgent.match(/Version\/(.*?)\s/)||navigator.userAgent.match(/Chrome\/(\d+)/);navigator.vendor=="Apple Computer, Inc."&&(cc&&cc[1]<4||navigator.platform.slice(0,2)=="iP")||navigator.vendor=="Google Inc."&&cc&&cc[1]<8?k.safari=function(){var a=this.rect(-99,-99,this.width+99,this.height+99).attr({stroke:"none"});setTimeout(function(){a.remove()})}:k.safari=be;var cd=function(){this.returnValue=!1},ce=function(){return this.originalEvent.preventDefault()},cf=function(){this.cancelBubble=!0},cg=function(){return this.originalEvent.stopPropagation()},ch=function(){if(h.doc.addEventListener)return function(a,b,c,d){var e=o&&u[b]?u[b]:b,f=function(e){var f=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,i=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,j=e.clientX+i,k=e.clientY+f;if(o&&u[g](b))for(var l=0,m=e.targetTouches&&e.targetTouches.length;l<m;l++)if(e.targetTouches[l].target==a){var n=e;e=e.targetTouches[l],e.originalEvent=n,e.preventDefault=ce,e.stopPropagation=cg;break}return c.call(d,e,j,k)};a.addEventListener(e,f,!1);return function(){a.removeEventListener(e,f,!1);return!0}};if(h.doc.attachEvent)return function(a,b,c,d){var e=function(a){a=a||h.win.event;var b=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f=a.clientX+e,g=a.clientY+b;a.preventDefault=a.preventDefault||cd,a.stopPropagation=a.stopPropagation||cf;return c.call(d,a,f,g)};a.attachEvent("on"+b,e);var f=function(){a.detachEvent("on"+b,e);return!0};return f}}(),ci=[],cj=function(a){var b=a.clientX,c=a.clientY,d=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,e=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft,f,g=ci.length;while(g--){f=ci[g];if(o){var i=a.touches.length,j;while(i--){j=a.touches[i];if(j.identifier==f.el._drag.id){b=j.clientX,c=j.clientY,(a.originalEvent?a.originalEvent:a).preventDefault();break}}}else a.preventDefault();var k=f.el.node,l,m=k.nextSibling,n=k.parentNode,p=k.style.display;h.win.opera&&n.removeChild(k),k.style.display="none",l=f.el.paper.getElementByPoint(b,c),k.style.display=p,h.win.opera&&(m?n.insertBefore(k,m):n.appendChild(k)),l&&eve("raphael.drag.over."+f.el.id,f.el,l),b+=e,c+=d,eve("raphael.drag.move."+f.el.id,f.move_scope||f.el,b-f.el._drag.x,c-f.el._drag.y,b,c,a)}},ck=function(b){a.unmousemove(cj).unmouseup(ck);var c=ci.length,d;while(c--)d=ci[c],d.el._drag={},eve("raphael.drag.end."+d.el.id,d.end_scope||d.start_scope||d.move_scope||d.el,b);ci=[]},cl=a.el={};for(var cm=t.length;cm--;)(function(b){a[b]=cl[b]=function(c,d){a.is(c,"function")&&(this.events=this.events||[],this.events.push({name:b,f:c,unbind:ch(this.shape||this.node||h.doc,b,c,d||this)}));return this},a["un"+b]=cl["un"+b]=function(a){var c=this.events||[],d=c.length;while(d--)if(c[d].name==b&&c[d].f==a){c[d].unbind(),c.splice(d,1),!c.length&&delete this.events;return this}return this}})(t[cm]);cl.data=function(b,c){var d=bb[this.id]=bb[this.id]||{};if(arguments.length==1){if(a.is(b,"object")){for(var e in b)b[g](e)&&this.data(e,b[e]);return this}eve("raphael.data.get."+this.id,this,d[b],b);return d[b]}d[b]=c,eve("raphael.data.set."+this.id,this,c,b);return this},cl.removeData=function(a){a==null?bb[this.id]={}:bb[this.id]&&delete bb[this.id][a];return this},cl.hover=function(a,b,c,d){return this.mouseover(a,c).mouseout(b,d||c)},cl.unhover=function(a,b){return this.unmouseover(a).unmouseout(b)};var cn=[];cl.drag=function(b,c,d,e,f,g){function i(i){(i.originalEvent||i).preventDefault();var j=h.doc.documentElement.scrollTop||h.doc.body.scrollTop,k=h.doc.documentElement.scrollLeft||h.doc.body.scrollLeft;this._drag.x=i.clientX+k,this._drag.y=i.clientY+j,this._drag.id=i.identifier,!ci.length&&a.mousemove(cj).mouseup(ck),ci.push({el:this,move_scope:e,start_scope:f,end_scope:g}),c&&eve.on("raphael.drag.start."+this.id,c),b&&eve.on("raphael.drag.move."+this.id,b),d&&eve.on("raphael.drag.end."+this.id,d),eve("raphael.drag.start."+this.id,f||e||this,i.clientX+k,i.clientY+j,i)}this._drag={},cn.push({el:this,start:i}),this.mousedown(i);return this},cl.onDragOver=function(a){a?eve.on("raphael.drag.over."+this.id,a):eve.unbind("raphael.drag.over."+this.id)},cl.undrag=function(){var b=cn.length;while(b--)cn[b].el==this&&(this.unmousedown(cn[b].start),cn.splice(b,1),eve.unbind("raphael.drag.*."+this.id));!cn.length&&a.unmousemove(cj).unmouseup(ck)},k.circle=function(b,c,d){var e=a._engine.circle(this,b||0,c||0,d||0);this.__set__&&this.__set__.push(e);return e},k.rect=function(b,c,d,e,f){var g=a._engine.rect(this,b||0,c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.ellipse=function(b,c,d,e){var f=a._engine.ellipse(this,b||0,c||0,d||0,e||0);this.__set__&&this.__set__.push(f);return f},k.path=function(b){b&&!a.is(b,D)&&!a.is(b[0],E)&&(b+=p);var c=a._engine.path(a.format[m](a,arguments),this);this.__set__&&this.__set__.push(c);return c},k.image=function(b,c,d,e,f){var g=a._engine.image(this,b||"about:blank",c||0,d||0,e||0,f||0);this.__set__&&this.__set__.push(g);return g},k.text=function(b,c,d){var e=a._engine.text(this,b||0,c||0,r(d));this.__set__&&this.__set__.push(e);return e},k.set=function(b){!a.is(b,"array")&&(b=Array.prototype.splice.call(arguments,0,arguments.length));var c=new cG(b);this.__set__&&this.__set__.push(c);return c},k.setStart=function(a){this.__set__=a||this.set()},k.setFinish=function(a){var b=this.__set__;delete this.__set__;return b},k.setSize=function(b,c){return a._engine.setSize.call(this,b,c)},k.setViewBox=function(b,c,d,e,f){return a._engine.setViewBox.call(this,b,c,d,e,f)},k.top=k.bottom=null,k.raphael=a;var co=function(a){var b=a.getBoundingClientRect(),c=a.ownerDocument,d=c.body,e=c.documentElement,f=e.clientTop||d.clientTop||0,g=e.clientLeft||d.clientLeft||0,i=b.top+(h.win.pageYOffset||e.scrollTop||d.scrollTop)-f,j=b.left+(h.win.pageXOffset||e.scrollLeft||d.scrollLeft)-g;return{y:i,x:j}};k.getElementByPoint=function(a,b){var c=this,d=c.canvas,e=h.doc.elementFromPoint(a,b);if(h.win.opera&&e.tagName=="svg"){var f=co(d),g=d.createSVGRect();g.x=a-f.x,g.y=b-f.y,g.width=g.height=1;var i=d.getIntersectionList(g,null);i.length&&(e=i[i.length-1])}if(!e)return null;while(e.parentNode&&e!=d.parentNode&&!e.raphael)e=e.parentNode;e==c.canvas.parentNode&&(e=d),e=e&&e.raphael?c.getById(e.raphaelid):null;return e},k.getById=function(a){var b=this.bottom;while(b){if(b.id==a)return b;b=b.next}return null},k.forEach=function(a,b){var c=this.bottom;while(c){if(a.call(b,c)===!1)return this;c=c.next}return this},k.getElementsByPoint=function(a,b){var c=this.set();this.forEach(function(d){d.isPointInside(a,b)&&c.push(d)});return c},cl.isPointInside=function(b,c){var d=this.realPath=this.realPath||bi[this.type](this);return a.isPointInsidePath(d,b,c)},cl.getBBox=function(a){if(this.removed)return{};var b=this._;if(a){if(b.dirty||!b.bboxwt)this.realPath=bi[this.type](this),b.bboxwt=bI(this.realPath),b.bboxwt.toString=cq,b.dirty=0;return b.bboxwt}if(b.dirty||b.dirtyT||!b.bbox){if(b.dirty||!this.realPath)b.bboxwt=0,this.realPath=bi[this.type](this);b.bbox=bI(bj(this.realPath,this.matrix)),b.bbox.toString=cq,b.dirty=b.dirtyT=0}return b.bbox},cl.clone=function(){if(this.removed)return null;var a=this.paper[this.type]().attr(this.attr());this.__set__&&this.__set__.push(a);return a},cl.glow=function(a){if(this.type=="text")return null;a=a||{};var b={width:(a.width||10)+(+this.attr("stroke-width")||1),fill:a.fill||!1,opacity:a.opacity||.5,offsetx:a.offsetx||0,offsety:a.offsety||0,color:a.color||"#000"},c=b.width/2,d=this.paper,e=d.set(),f=this.realPath||bi[this.type](this);f=this.matrix?bj(f,this.matrix):f;for(var g=1;g<c+1;g++)e.push(d.path(f).attr({stroke:b.color,fill:b.fill?b.color:"none","stroke-linejoin":"round","stroke-linecap":"round","stroke-width":+(b.width/c*g).toFixed(3),opacity:+(b.opacity/c).toFixed(3)}));return e.insertBefore(this).translate(b.offsetx,b.offsety)};var cr={},cs=function(b,c,d,e,f,g,h,i,j){return j==null?bB(b,c,d,e,f,g,h,i):a.findDotsAtSegment(b,c,d,e,f,g,h,i,bC(b,c,d,e,f,g,h,i,j))},ct=function(b,c){return function(d,e,f){d=bR(d);var g,h,i,j,k="",l={},m,n=0;for(var o=0,p=d.length;o<p;o++){i=d[o];if(i[0]=="M")g=+i[1],h=+i[2];else{j=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6]);if(n+j>e){if(c&&!l.start){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n),k+=["C"+m.start.x,m.start.y,m.m.x,m.m.y,m.x,m.y];if(f)return k;l.start=k,k=["M"+m.x,m.y+"C"+m.n.x,m.n.y,m.end.x,m.end.y,i[5],i[6]].join(),n+=j,g=+i[5],h=+i[6];continue}if(!b&&!c){m=cs(g,h,i[1],i[2],i[3],i[4],i[5],i[6],e-n);return{x:m.x,y:m.y,alpha:m.alpha}}}n+=j,g=+i[5],h=+i[6]}k+=i.shift()+i}l.end=k,m=b?n:c?l:a.findDotsAtSegment(g,h,i[0],i[1],i[2],i[3],i[4],i[5],1),m.alpha&&(m={x:m.x,y:m.y,alpha:m.alpha});return m}},cu=ct(1),cv=ct(),cw=ct(0,1);a.getTotalLength=cu,a.getPointAtLength=cv,a.getSubpath=function(a,b,c){if(this.getTotalLength(a)-c<1e-6)return cw(a,b).end;var d=cw(a,c,1);return b?cw(d,b).end:d},cl.getTotalLength=function(){if(this.type=="path"){if(this.node.getTotalLength)return this.node.getTotalLength();return cu(this.attrs.path)}},cl.getPointAtLength=function(a){if(this.type=="path")return cv(this.attrs.path,a)},cl.getSubpath=function(b,c){if(this.type=="path")return a.getSubpath(this.attrs.path,b,c)};var cx=a.easing_formulas={linear:function(a){return a},"<":function(a){return A(a,1.7)},">":function(a){return A(a,.48)},"<>":function(a){var b=.48-a/1.04,c=w.sqrt(.1734+b*b),d=c-b,e=A(z(d),1/3)*(d<0?-1:1),f=-c-b,g=A(z(f),1/3)*(f<0?-1:1),h=e+g+.5;return(1-h)*3*h*h+h*h*h},backIn:function(a){var b=1.70158;return a*a*((b+1)*a-b)},backOut:function(a){a=a-1;var b=1.70158;return a*a*((b+1)*a+b)+1},elastic:function(a){if(a==!!a)return a;return A(2,-10*a)*w.sin((a-.075)*2*B/.3)+1},bounce:function(a){var b=7.5625,c=2.75,d;a<1/c?d=b*a*a:a<2/c?(a-=1.5/c,d=b*a*a+.75):a<2.5/c?(a-=2.25/c,d=b*a*a+.9375):(a-=2.625/c,d=b*a*a+.984375);return d}};cx.easeIn=cx["ease-in"]=cx["<"],cx.easeOut=cx["ease-out"]=cx[">"],cx.easeInOut=cx["ease-in-out"]=cx["<>"],cx["back-in"]=cx.backIn,cx["back-out"]=cx.backOut;var cy=[],cz=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(a){setTimeout(a,16)},cA=function(){var b=+(new Date),c=0;for(;c<cy.length;c++){var d=cy[c];if(d.el.removed||d.paused)continue;var e=b-d.start,f=d.ms,h=d.easing,i=d.from,j=d.diff,k=d.to,l=d.t,m=d.el,o={},p,r={},s;d.initstatus?(e=(d.initstatus*d.anim.top-d.prev)/(d.percent-d.prev)*f,d.status=d.initstatus,delete d.initstatus,d.stop&&cy.splice(c--,1)):d.status=(d.prev+(d.percent-d.prev)*(e/f))/d.anim.top;if(e<0)continue;if(e<f){var t=h(e/f);for(var u in i)if(i[g](u)){switch(U[u]){case C:p=+i[u]+t*f*j[u];break;case"colour":p="rgb("+[cB(O(i[u].r+t*f*j[u].r)),cB(O(i[u].g+t*f*j[u].g)),cB(O(i[u].b+t*f*j[u].b))].join(",")+")";break;case"path":p=[];for(var v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(var x=1,y=i[u][v].length;x<y;x++)p[v][x]=+i[u][v][x]+t*f*j[u][v][x];p[v]=p[v].join(q)}p=p.join(q);break;case"transform":if(j[u].real){p=[];for(v=0,w=i[u].length;v<w;v++){p[v]=[i[u][v][0]];for(x=1,y=i[u][v].length;x<y;x++)p[v][x]=i[u][v][x]+t*f*j[u][v][x]}}else{var z=function(a){return+i[u][a]+t*f*j[u][a]};p=[["m",z(0),z(1),z(2),z(3),z(4),z(5)]]}break;case"csv":if(u=="clip-rect"){p=[],v=4;while(v--)p[v]=+i[u][v]+t*f*j[u][v]}break;default:var A=[][n](i[u]);p=[],v=m.paper.customAttributes[u].length;while(v--)p[v]=+A[v]+t*f*j[u][v]}o[u]=p}m.attr(o),function(a,b,c){setTimeout(function(){eve("raphael.anim.frame."+a,b,c)})}(m.id,m,d.anim)}else{(function(b,c,d){setTimeout(function(){eve("raphael.anim.frame."+c.id,c,d),eve("raphael.anim.finish."+c.id,c,d),a.is(b,"function")&&b.call(c)})})(d.callback,m,d.anim),m.attr(k),cy.splice(c--,1);if(d.repeat>1&&!d.next){for(s in k)k[g](s)&&(r[s]=d.totalOrigin[s]);d.el.attr(r),cE(d.anim,d.el,d.anim.percents[0],null,d.totalOrigin,d.repeat-1)}d.next&&!d.stop&&cE(d.anim,d.el,d.next,null,d.totalOrigin,d.repeat)}}a.svg&&m&&m.paper&&m.paper.safari(),cy.length&&cz(cA)},cB=function(a){return a>255?255:a<0?0:a};cl.animateWith=function(b,c,d,e,f,g){var h=this;if(h.removed){g&&g.call(h);return h}var i=d instanceof cD?d:a.animation(d,e,f,g),j,k;cE(i,h,i.percents[0],null,h.attr());for(var l=0,m=cy.length;l<m;l++)if(cy[l].anim==c&&cy[l].el==b){cy[m-1].start=cy[l].start;break}return h},cl.onAnimation=function(a){a?eve.on("raphael.anim.frame."+this.id,a):eve.unbind("raphael.anim.frame."+this.id);return this},cD.prototype.delay=function(a){var b=new cD(this.anim,this.ms);b.times=this.times,b.del=+a||0;return b},cD.prototype.repeat=function(a){var b=new cD(this.anim,this.ms);b.del=this.del,b.times=w.floor(x(a,0))||1;return b},a.animation=function(b,c,d,e){if(b instanceof cD)return b;if(a.is(d,"function")||!d)e=e||d||null,d=null;b=Object(b),c=+c||0;var f={},h,i;for(i in b)b[g](i)&&Q(i)!=i&&Q(i)+"%"!=i&&(h=!0,f[i]=b[i]);if(!h)return new cD(b,c);d&&(f.easing=d),e&&(f.callback=e);return new cD({100:f},c)},cl.animate=function(b,c,d,e){var f=this;if(f.removed){e&&e.call(f);return f}var g=b instanceof cD?b:a.animation(b,c,d,e);cE(g,f,g.percents[0],null,f.attr());return f},cl.setTime=function(a,b){a&&b!=null&&this.status(a,y(b,a.ms)/a.ms);return this},cl.status=function(a,b){var c=[],d=0,e,f;if(b!=null){cE(a,this,-1,y(b,1));return this}e=cy.length;for(;d<e;d++){f=cy[d];if(f.el.id==this.id&&(!a||f.anim==a)){if(a)return f.status;c.push({anim:f.anim,status:f.status})}}if(a)return 0;return c},cl.pause=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.pause."+this.id,this,cy[b].anim)!==!1&&(cy[b].paused=!0);return this},cl.resume=function(a){for(var b=0;b<cy.length;b++)if(cy[b].el.id==this.id&&(!a||cy[b].anim==a)){var c=cy[b];eve("raphael.anim.resume."+this.id,this,c.anim)!==!1&&(delete c.paused,this.status(c.anim,c.status))}return this},cl.stop=function(a){for(var b=0;b<cy.length;b++)cy[b].el.id==this.id&&(!a||cy[b].anim==a)&&eve("raphael.anim.stop."+this.id,this,cy[b].anim)!==!1&&cy.splice(b--,1);return this},eve.on("raphael.remove",cF),eve.on("raphael.clear",cF),cl.toString=function(){return"Raphaël’s object"};var cG=function(a){this.items=[],this.length=0,this.type="set";if(a)for(var b=0,c=a.length;b<c;b++)a[b]&&(a[b].constructor==cl.constructor||a[b].constructor==cG)&&(this[this.items.length]=this.items[this.items.length]=a[b],this.length++)},cH=cG.prototype;cH.push=function(){var a,b;for(var c=0,d=arguments.length;c<d;c++)a=arguments[c],a&&(a.constructor==cl.constructor||a.constructor==cG)&&(b=this.items.length,this[b]=this.items[b]=a,this.length++);return this},cH.pop=function(){this.length&&delete this[this.length--];return this.items.pop()},cH.forEach=function(a,b){for(var c=0,d=this.items.length;c<d;c++)if(a.call(b,this.items[c],c)===!1)return this;return this};for(var cI in cl)cl[g](cI)&&(cH[cI]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a][m](c,b)})}}(cI));cH.attr=function(b,c){if(b&&a.is(b,E)&&a.is(b[0],"object"))for(var d=0,e=b.length;d<e;d++)this.items[d].attr(b[d]);else for(var f=0,g=this.items.length;f<g;f++)this.items[f].attr(b,c);return this},cH.clear=function(){while(this.length)this.pop()},cH.splice=function(a,b,c){a=a<0?x(this.length+a,0):a,b=x(0,y(this.length-a,b));var d=[],e=[],f=[],g;for(g=2;g<arguments.length;g++)f.push(arguments[g]);for(g=0;g<b;g++)e.push(this[a+g]);for(;g<this.length-a;g++)d.push(this[a+g]);var h=f.length;for(g=0;g<h+d.length;g++)this.items[a+g]=this[a+g]=g<h?f[g]:d[g-h];g=this.items.length=this.length-=b-h;while(this[g])delete this[g++];return new cG(e)},cH.exclude=function(a){for(var b=0,c=this.length;b<c;b++)if(this[b]==a){this.splice(b,1);return!0}},cH.animate=function(b,c,d,e){(a.is(d,"function")||!d)&&(e=d||null);var f=this.items.length,g=f,h,i=this,j;if(!f)return this;e&&(j=function(){!--f&&e.call(i)}),d=a.is(d,D)?d:j;var k=a.animation(b,c,d,j);h=this.items[--g].animate(k);while(g--)this.items[g]&&!this.items[g].removed&&this.items[g].animateWith(h,k,k);return this},cH.insertAfter=function(a){var b=this.items.length;while(b--)this.items[b].insertAfter(a);return this},cH.getBBox=function(){var a=[],b=[],c=[],d=[];for(var e=this.items.length;e--;)if(!this.items[e].removed){var f=this.items[e].getBBox();a.push(f.x),b.push(f.y),c.push(f.x+f.width),d.push(f.y+f.height)}a=y[m](0,a),b=y[m](0,b),c=x[m](0,c),d=x[m](0,d);return{x:a,y:b,x2:c,y2:d,width:c-a,height:d-b}},cH.clone=function(a){a=new cG;for(var b=0,c=this.items.length;b<c;b++)a.push(this.items[b].clone());return a},cH.toString=function(){return"Raphaël‘s set"},a.registerFont=function(a){if(!a.face)return a;this.fonts=this.fonts||{};var b={w:a.w,face:{},glyphs:{}},c=a.face["font-family"];for(var d in a.face)a.face[g](d)&&(b.face[d]=a.face[d]);this.fonts[c]?this.fonts[c].push(b):this.fonts[c]=[b];if(!a.svg){b.face["units-per-em"]=R(a.face["units-per-em"],10);for(var e in a.glyphs)if(a.glyphs[g](e)){var f=a.glyphs[e];b.glyphs[e]={w:f.w,k:{},d:f.d&&"M"+f.d.replace(/[mlcxtrv]/g,function(a){return{l:"L",c:"C",x:"z",t:"m",r:"l",v:"c"}[a]||"M"})+"z"};if(f.k)for(var h in f.k)f[g](h)&&(b.glyphs[e].k[h]=f.k[h])}}return a},k.getFont=function(b,c,d,e){e=e||"normal",d=d||"normal",c=+c||{normal:400,bold:700,lighter:300,bolder:800}[c]||400;if(!!a.fonts){var f=a.fonts[b];if(!f){var h=new RegExp("(^|\\s)"+b.replace(/[^\w\d\s+!~.:_-]/g,p)+"(\\s|$)","i");for(var i in a.fonts)if(a.fonts[g](i)&&h.test(i)){f=a.fonts[i];break}}var j;if(f)for(var k=0,l=f.length;k<l;k++){j=f[k];if(j.face["font-weight"]==c&&(j.face["font-style"]==d||!j.face["font-style"])&&j.face["font-stretch"]==e)break}return j}},k.print=function(b,d,e,f,g,h,i){h=h||"middle",i=x(y(i||0,1),-1);var j=r(e)[s](p),k=0,l=0,m=p,n;a.is(f,e)&&(f=this.getFont(f));if(f){n=(g||16)/f.face["units-per-em"];var o=f.face.bbox[s](c),q=+o[0],t=o[3]-o[1],u=0,v=+o[1]+(h=="baseline"?t+ +f.face.descent:t/2);for(var w=0,z=j.length;w<z;w++){if(j[w]=="\n")k=0,B=0,l=0,u+=t;else{var A=l&&f.glyphs[j[w-1]]||{},B=f.glyphs[j[w]];k+=l?(A.w||f.w)+(A.k&&A.k[j[w]]||0)+f.w*i:0,l=1}B&&B.d&&(m+=a.transformPath(B.d,["t",k*n,u*n,"s",n,n,q,v,"t",(b-q)/n,(d-v)/n]))}}return this.path(m).attr({fill:"#000",stroke:"none"})},k.add=function(b){if(a.is(b,"array")){var c=this.set(),e=0,f=b.length,h;for(;e<f;e++)h=b[e]||{},d[g](h.type)&&c.push(this[h.type]().attr(h))}return c},a.format=function(b,c){var d=a.is(c,E)?[0][n](c):arguments;b&&a.is(b,D)&&d.length-1&&(b=b.replace(e,function(a,b){return d[++b]==null?p:d[b]}));return b||p},a.fullfill=function(){var a=/\{([^\}]+)\}/g,b=/(?:(?:^|\.)(.+?)(?=\[|\.|$|\()|\[('|")(.+?)\2\])(\(\))?/g,c=function(a,c,d){var e=d;c.replace(b,function(a,b,c,d,f){b=b||d,e&&(b in e&&(e=e[b]),typeof e=="function"&&f&&(e=e()))}),e=(e==null||e==d?a:e)+"";return e};return function(b,d){return String(b).replace(a,function(a,b){return c(a,b,d)})}}(),a.ninja=function(){i.was?h.win.Raphael=i.is:delete Raphael;return a},a.st=cH,function(b,c,d){function e(){/in/.test(b.readyState)?setTimeout(e,9):a.eve("raphael.DOMload")}b.readyState==null&&b.addEventListener&&(b.addEventListener(c,d=function(){b.removeEventListener(c,d,!1),b.readyState="complete"},!1),b.readyState="loading"),e()}(document,"DOMContentLoaded"),i.was?h.win.Raphael=a:Raphael=a,eve.on("raphael.DOMload",function(){b=!0})}(),window.Raphael.svg&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=parseInt,f=Math,g=f.max,h=f.abs,i=f.pow,j=/[, ]+/,k=a.eve,l="",m=" ",n="http://www.w3.org/1999/xlink",o={block:"M5,0 0,2.5 5,5z",classic:"M5,0 0,2.5 5,5 3.5,3 3.5,2z",diamond:"M2.5,0 5,2.5 2.5,5 0,2.5z",open:"M6,1 1,3.5 6,6",oval:"M2.5,0A2.5,2.5,0,0,1,2.5,5 2.5,2.5,0,0,1,2.5,0z"},p={};a.toString=function(){return"Your browser supports SVG.\nYou are running Raphaël "+this.version};var q=function(d,e){if(e){typeof d=="string"&&(d=q(d));for(var f in e)e[b](f)&&(f.substring(0,6)=="xlink:"?d.setAttributeNS(n,f.substring(6),c(e[f])):d.setAttribute(f,c(e[f])))}else d=a._g.doc.createElementNS("http://www.w3.org/2000/svg",d),d.style&&(d.style.webkitTapHighlightColor="rgba(0,0,0,0)");return d},r=function(b,e){var j="linear",k=b.id+e,m=.5,n=.5,o=b.node,p=b.paper,r=o.style,s=a._g.doc.getElementById(k);if(!s){e=c(e).replace(a._radial_gradient,function(a,b,c){j="radial";if(b&&c){m=d(b),n=d(c);var e=(n>.5)*2-1;i(m-.5,2)+i(n-.5,2)>.25&&(n=f.sqrt(.25-i(m-.5,2))*e+.5)&&n!=.5&&(n=n.toFixed(5)-1e-5*e)}return l}),e=e.split(/\s*\-\s*/);if(j=="linear"){var t=e.shift();t=-d(t);if(isNaN(t))return null;var u=[0,0,f.cos(a.rad(t)),f.sin(a.rad(t))],v=1/(g(h(u[2]),h(u[3]))||1);u[2]*=v,u[3]*=v,u[2]<0&&(u[0]=-u[2],u[2]=0),u[3]<0&&(u[1]=-u[3],u[3]=0)}var w=a._parseDots(e);if(!w)return null;k=k.replace(/[\(\)\s,\xb0#]/g,"_"),b.gradient&&k!=b.gradient.id&&(p.defs.removeChild(b.gradient),delete b.gradient);if(!b.gradient){s=q(j+"Gradient",{id:k}),b.gradient=s,q(s,j=="radial"?{fx:m,fy:n}:{x1:u[0],y1:u[1],x2:u[2],y2:u[3],gradientTransform:b.matrix.invert()}),p.defs.appendChild(s);for(var x=0,y=w.length;x<y;x++)s.appendChild(q("stop",{offset:w[x].offset?w[x].offset:x?"100%":"0%","stop-color":w[x].color||"#fff"}))}}q(o,{fill:"url(#"+k+")",opacity:1,"fill-opacity":1}),r.fill=l,r.opacity=1,r.fillOpacity=1;return 1},s=function(a){var b=a.getBBox(1);q(a.pattern,{patternTransform:a.matrix.invert()+" translate("+b.x+","+b.y+")"})},t=function(d,e,f){if(d.type=="path"){var g=c(e).toLowerCase().split("-"),h=d.paper,i=f?"end":"start",j=d.node,k=d.attrs,m=k["stroke-width"],n=g.length,r="classic",s,t,u,v,w,x=3,y=3,z=5;while(n--)switch(g[n]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":r=g[n];break;case"wide":y=5;break;case"narrow":y=2;break;case"long":x=5;break;case"short":x=2}r=="open"?(x+=2,y+=2,z+=2,u=1,v=f?4:1,w={fill:"none",stroke:k.stroke}):(v=u=x/2,w={fill:k.stroke,stroke:"none"}),d._.arrows?f?(d._.arrows.endPath&&p[d._.arrows.endPath]--,d._.arrows.endMarker&&p[d._.arrows.endMarker]--):(d._.arrows.startPath&&p[d._.arrows.startPath]--,d._.arrows.startMarker&&p[d._.arrows.startMarker]--):d._.arrows={};if(r!="none"){var A="raphael-marker-"+r,B="raphael-marker-"+i+r+x+y;a._g.doc.getElementById(A)?p[A]++:(h.defs.appendChild(q(q("path"),{"stroke-linecap":"round",d:o[r],id:A})),p[A]=1);var C=a._g.doc.getElementById(B),D;C?(p[B]++,D=C.getElementsByTagName("use")[0]):(C=q(q("marker"),{id:B,markerHeight:y,markerWidth:x,orient:"auto",refX:v,refY:y/2}),D=q(q("use"),{"xlink:href":"#"+A,transform:(f?"rotate(180 "+x/2+" "+y/2+") ":l)+"scale("+x/z+","+y/z+")","stroke-width":(1/((x/z+y/z)/2)).toFixed(4)}),C.appendChild(D),h.defs.appendChild(C),p[B]=1),q(D,w);var F=u*(r!="diamond"&&r!="oval");f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-F*m):(s=F*m,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),w={},w["marker-"+i]="url(#"+B+")";if(t||s)w.d=Raphael.getSubpath(k.path,s,t);q(j,w),d._.arrows[i+"Path"]=A,d._.arrows[i+"Marker"]=B,d._.arrows[i+"dx"]=F,d._.arrows[i+"Type"]=r,d._.arrows[i+"String"]=e}else f?(s=d._.arrows.startdx*m||0,t=a.getTotalLength(k.path)-s):(s=0,t=a.getTotalLength(k.path)-(d._.arrows.enddx*m||0)),d._.arrows[i+"Path"]&&q(j,{d:Raphael.getSubpath(k.path,s,t)}),delete d._.arrows[i+"Path"],delete d._.arrows[i+"Marker"],delete d._.arrows[i+"dx"],delete d._.arrows[i+"Type"],delete d._.arrows[i+"String"];for(w in p)if(p[b](w)&&!p[w]){var G=a._g.doc.getElementById(w);G&&G.parentNode.removeChild(G)}}},u={"":[0],none:[0],"-":[3,1],".":[1,1],"-.":[3,1,1,1],"-..":[3,1,1,1,1,1],". ":[1,3],"- ":[4,3],"--":[8,3],"- .":[4,3,1,3],"--.":[8,3,1,3],"--..":[8,3,1,3,1,3]},v=function(a,b,d){b=u[c(b).toLowerCase()];if(b){var e=a.attrs["stroke-width"]||"1",f={round:e,square:e,butt:0}[a.attrs["stroke-linecap"]||d["stroke-linecap"]]||0,g=[],h=b.length;while(h--)g[h]=b[h]*e+(h%2?1:-1)*f;q(a.node,{"stroke-dasharray":g.join(",")})}},w=function(d,f){var i=d.node,k=d.attrs,m=i.style.visibility;i.style.visibility="hidden";for(var o in f)if(f[b](o)){if(!a._availableAttrs[b](o))continue;var p=f[o];k[o]=p;switch(o){case"blur":d.blur(p);break;case"href":case"title":case"target":var u=i.parentNode;if(u.tagName.toLowerCase()!="a"){var w=q("a");u.insertBefore(w,i),w.appendChild(i),u=w}o=="target"?u.setAttributeNS(n,"show",p=="blank"?"new":p):u.setAttributeNS(n,o,p);break;case"cursor":i.style.cursor=p;break;case"transform":d.transform(p);break;case"arrow-start":t(d,p);break;case"arrow-end":t(d,p,1);break;case"clip-rect":var x=c(p).split(j);if(x.length==4){d.clip&&d.clip.parentNode.parentNode.removeChild(d.clip.parentNode);var z=q("clipPath"),A=q("rect");z.id=a.createUUID(),q(A,{x:x[0],y:x[1],width:x[2],height:x[3]}),z.appendChild(A),d.paper.defs.appendChild(z),q(i,{"clip-path":"url(#"+z.id+")"}),d.clip=A}if(!p){var B=i.getAttribute("clip-path");if(B){var C=a._g.doc.getElementById(B.replace(/(^url\(#|\)$)/g,l));C&&C.parentNode.removeChild(C),q(i,{"clip-path":l}),delete d.clip}}break;case"path":d.type=="path"&&(q(i,{d:p?k.path=a._pathToAbsolute(p):"M0,0"}),d._.dirty=1,d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1)));break;case"width":i.setAttribute(o,p),d._.dirty=1;if(k.fx)o="x",p=k.x;else break;case"x":k.fx&&(p=-k.x-(k.width||0));case"rx":if(o=="rx"&&d.type=="rect")break;case"cx":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"height":i.setAttribute(o,p),d._.dirty=1;if(k.fy)o="y",p=k.y;else break;case"y":k.fy&&(p=-k.y-(k.height||0));case"ry":if(o=="ry"&&d.type=="rect")break;case"cy":i.setAttribute(o,p),d.pattern&&s(d),d._.dirty=1;break;case"r":d.type=="rect"?q(i,{rx:p,ry:p}):i.setAttribute(o,p),d._.dirty=1;break;case"src":d.type=="image"&&i.setAttributeNS(n,"href",p);break;case"stroke-width":if(d._.sx!=1||d._.sy!=1)p/=g(h(d._.sx),h(d._.sy))||1;d.paper._vbSize&&(p*=d.paper._vbSize),i.setAttribute(o,p),k["stroke-dasharray"]&&v(d,k["stroke-dasharray"],f),d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"stroke-dasharray":v(d,p,f);break;case"fill":var D=c(p).match(a._ISURL);if(D){z=q("pattern");var F=q("image");z.id=a.createUUID(),q(z,{x:0,y:0,patternUnits:"userSpaceOnUse",height:1,width:1}),q(F,{x:0,y:0,"xlink:href":D[1]}),z.appendChild(F),function(b){a._preload(D[1],function(){var a=this.offsetWidth,c=this.offsetHeight;q(b,{width:a,height:c}),q(F,{width:a,height:c}),d.paper.safari()})}(z),d.paper.defs.appendChild(z),q(i,{fill:"url(#"+z.id+")"}),d.pattern=z,d.pattern&&s(d);break}var G=a.getRGB(p);if(!G.error)delete f.gradient,delete k.gradient,!a.is(k.opacity,"undefined")&&a.is(f.opacity,"undefined")&&q(i,{opacity:k.opacity}),!a.is(k["fill-opacity"],"undefined")&&a.is(f["fill-opacity"],"undefined")&&q(i,{"fill-opacity":k["fill-opacity"]});else if((d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p)){if("opacity"in k||"fill-opacity"in k){var H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l));if(H){var I=H.getElementsByTagName("stop");q(I[I.length-1],{"stop-opacity":("opacity"in k?k.opacity:1)*("fill-opacity"in k?k["fill-opacity"]:1)})}}k.gradient=p,k.fill="none";break}G[b]("opacity")&&q(i,{"fill-opacity":G.opacity>1?G.opacity/100:G.opacity});case"stroke":G=a.getRGB(p),i.setAttribute(o,G.hex),o=="stroke"&&G[b]("opacity")&&q(i,{"stroke-opacity":G.opacity>1?G.opacity/100:G.opacity}),o=="stroke"&&d._.arrows&&("startString"in d._.arrows&&t(d,d._.arrows.startString),"endString"in d._.arrows&&t(d,d._.arrows.endString,1));break;case"gradient":(d.type=="circle"||d.type=="ellipse"||c(p).charAt()!="r")&&r(d,p);break;case"opacity":k.gradient&&!k[b]("stroke-opacity")&&q(i,{"stroke-opacity":p>1?p/100:p});case"fill-opacity":if(k.gradient){H=a._g.doc.getElementById(i.getAttribute("fill").replace(/^url\(#|\)$/g,l)),H&&(I=H.getElementsByTagName("stop"),q(I[I.length-1],{"stop-opacity":p}));break};default:o=="font-size"&&(p=e(p,10)+"px");var J=o.replace(/(\-.)/g,function(a){return a.substring(1).toUpperCase()});i.style[J]=p,d._.dirty=1,i.setAttribute(o,p)}}y(d,f),i.style.visibility=m},x=1.2,y=function(d,f){if(d.type=="text"&&!!(f[b]("text")||f[b]("font")||f[b]("font-size")||f[b]("x")||f[b]("y"))){var g=d.attrs,h=d.node,i=h.firstChild?e(a._g.doc.defaultView.getComputedStyle(h.firstChild,l).getPropertyValue("font-size"),10):10;if(f[b]("text")){g.text=f.text;while(h.firstChild)h.removeChild(h.firstChild);var j=c(f.text).split("\n"),k=[],m;for(var n=0,o=j.length;n<o;n++)m=q("tspan"),n&&q(m,{dy:i*x,x:g.x}),m.appendChild(a._g.doc.createTextNode(j[n])),h.appendChild(m),k[n]=m}else{k=h.getElementsByTagName("tspan");for(n=0,o=k.length;n<o;n++)n?q(k[n],{dy:i*x,x:g.x}):q(k[0],{dy:0})}q(h,{x:g.x,y:g.y}),d._.dirty=1;var p=d._getBBox(),r=g.y-(p.y+p.height/2);r&&a.is(r,"finite")&&q(k[0],{dy:r})}},z=function(b,c){var d=0,e=0;this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.matrix=a.matrix(),this.realPath=null,this.paper=c,this.attrs=this.attrs||{},this._={transform:[],sx:1,sy:1,deg:0,dx:0,dy:0,dirty:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},A=a.el;z.prototype=A,A.constructor=z,a._engine.path=function(a,b){var c=q("path");b.canvas&&b.canvas.appendChild(c);var d=new z(c,b);d.type="path",w(d,{fill:"none",stroke:"#000",path:a});return d},A.rotate=function(a,b,e){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this.transform(this._.transform.concat([["r",a,b,e]]));return this},A.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3])),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]]));return this},A.translate=function(a,b){if(this.removed)return this;a=c(a).split(j),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this.transform(this._.transform.concat([["t",a,b]]));return this},A.transform=function(c){var d=this._;if(c==null)return d.transform;a._extractTransform(this,c),this.clip&&q(this.clip,{transform:this.matrix.invert()}),this.pattern&&s(this),this.node&&q(this.node,{transform:this.matrix});if(d.sx!=1||d.sy!=1){var e=this.attrs[b]("stroke-width")?this.attrs["stroke-width"]:1;this.attr({"stroke-width":e})}return this},A.hide=function(){!this.removed&&this.paper.safari(this.node.style.display="none");return this},A.show=function(){!this.removed&&this.paper.safari(this.node.style.display="");return this},A.remove=function(){if(!this.removed&&!!this.node.parentNode){var b=this.paper;b.__set__&&b.__set__.exclude(this),k.unbind("raphael.*.*."+this.id),this.gradient&&b.defs.removeChild(this.gradient),a._tear(this,b),this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.removeChild(this.node.parentNode):this.node.parentNode.removeChild(this.node);for(var c in this)this[c]=typeof this[c]=="function"?a._removedFactory(c):null;this.removed=!0}},A._getBBox=function(){if(this.node.style.display=="none"){this.show();var a=!0}var b={};try{b=this.node.getBBox()}catch(c){}finally{b=b||{}}a&&this.hide();return b},A.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c=="fill"&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;if(c=="transform")return this._.transform;var g=c.split(j),h={};for(var i=0,l=g.length;i<l;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return l-1?h:h[g[0]]}if(d==null&&a.is(c,"array")){h={};for(i=0,l=c.length;i<l;i++)h[c[i]]=this.attr(c[i]);return h}if(d!=null){var m={};m[c]=d}else c!=null&&a.is(c,"object")&&(m=c);for(var n in m)k("raphael.attr."+n+"."+this.id,this,m[n]);for(n in this.paper.customAttributes)if(this.paper.customAttributes[b](n)&&m[b](n)&&a.is(this.paper.customAttributes[n],"function")){var o=this.paper.customAttributes[n].apply(this,[].concat(m[n]));this.attrs[n]=m[n];for(var p in o)o[b](p)&&(m[p]=o[p])}w(this,m);return this},A.toFront=function(){if(this.removed)return this;this.node.parentNode.tagName.toLowerCase()=="a"?this.node.parentNode.parentNode.appendChild(this.node.parentNode):this.node.parentNode.appendChild(this.node);var b=this.paper;b.top!=this&&a._tofront(this,b);return this},A.toBack=function(){if(this.removed)return this;var b=this.node.parentNode;b.tagName.toLowerCase()=="a"?b.parentNode.insertBefore(this.node.parentNode,this.node.parentNode.parentNode.firstChild):b.firstChild!=this.node&&b.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper);var c=this.paper;return this},A.insertAfter=function(b){if(this.removed)return this;var c=b.node||b[b.length-1].node;c.nextSibling?c.parentNode.insertBefore(this.node,c.nextSibling):c.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},A.insertBefore=function(b){if(this.removed)return this;var c=b.node||b[0].node;c.parentNode.insertBefore(this.node,c),a._insertbefore(this,b,this.paper);return this},A.blur=function(b){var c=this;if(+b!==0){var d=q("filter"),e=q("feGaussianBlur");c.attrs.blur=b,d.id=a.createUUID(),q(e,{stdDeviation:+b||1.5}),d.appendChild(e),c.paper.defs.appendChild(d),c._blur=d,q(c.node,{filter:"url(#"+d.id+")"})}else c._blur&&(c._blur.parentNode.removeChild(c._blur),delete c._blur,delete c.attrs.blur),c.node.removeAttribute("filter")},a._engine.circle=function(a,b,c,d){var e=q("circle");a.canvas&&a.canvas.appendChild(e);var f=new z(e,a);f.attrs={cx:b,cy:c,r:d,fill:"none",stroke:"#000"},f.type="circle",q(e,f.attrs);return f},a._engine.rect=function(a,b,c,d,e,f){var g=q("rect");a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:b,y:c,width:d,height:e,r:f||0,rx:f||0,ry:f||0,fill:"none",stroke:"#000"},h.type="rect",q(g,h.attrs);return h},a._engine.ellipse=function(a,b,c,d,e){var f=q("ellipse");a.canvas&&a.canvas.appendChild(f);var g=new z(f,a);g.attrs={cx:b,cy:c,rx:d,ry:e,fill:"none",stroke:"#000"},g.type="ellipse",q(f,g.attrs);return g},a._engine.image=function(a,b,c,d,e,f){var g=q("image");q(g,{x:c,y:d,width:e,height:f,preserveAspectRatio:"none"}),g.setAttributeNS(n,"href",b),a.canvas&&a.canvas.appendChild(g);var h=new z(g,a);h.attrs={x:c,y:d,width:e,height:f,src:b},h.type="image";return h},a._engine.text=function(b,c,d,e){var f=q("text");b.canvas&&b.canvas.appendChild(f);var g=new z(f,b);g.attrs={x:c,y:d,"text-anchor":"middle",text:e,font:a._availableAttrs.font,stroke:"none",fill:"#000"},g.type="text",w(g,g.attrs);return g},a._engine.setSize=function(a,b){this.width=a||this.width,this.height=b||this.height,this.canvas.setAttribute("width",this.width),this.canvas.setAttribute("height",this.height),this._viewBox&&this.setViewBox.apply(this,this._viewBox);return this},a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b&&b.container,d=b.x,e=b.y,f=b.width,g=b.height;if(!c)throw new Error("SVG container not found.");var h=q("svg"),i="overflow:hidden;",j;d=d||0,e=e||0,f=f||512,g=g||342,q(h,{height:g,version:1.1,width:f,xmlns:"http://www.w3.org/2000/svg"}),c==1?(h.style.cssText=i+"position:absolute;left:"+d+"px;top:"+e+"px",a._g.doc.body.appendChild(h),j=1):(h.style.cssText=i+"position:relative",c.firstChild?c.insertBefore(h,c.firstChild):c.appendChild(h)),c=new a._Paper,c.width=f,c.height=g,c.canvas=h,c.clear(),c._left=c._top=0,j&&(c.renderfix=function(){}),c.renderfix();return c},a._engine.setViewBox=function(a,b,c,d,e){k("raphael.setViewBox",this,this._viewBox,[a,b,c,d,e]);var f=g(c/this.width,d/this.height),h=this.top,i=e?"meet":"xMinYMin",j,l;a==null?(this._vbSize&&(f=1),delete this._vbSize,j="0 0 "+this.width+m+this.height):(this._vbSize=f,j=a+m+b+m+c+m+d),q(this.canvas,{viewBox:j,preserveAspectRatio:i});while(f&&h)l="stroke-width"in h.attrs?h.attrs["stroke-width"]:1,h.attr({"stroke-width":l}),h._.dirty=1,h._.dirtyT=1,h=h.prev;this._viewBox=[a,b,c,d,!!e];return this},a.prototype.renderfix=function(){var a=this.canvas,b=a.style,c;try{c=a.getScreenCTM()||a.createSVGMatrix()}catch(d){c=a.createSVGMatrix()}var e=-c.e%1,f=-c.f%1;if(e||f)e&&(this._left=(this._left+e)%1,b.left=this._left+"px"),f&&(this._top=(this._top+f)%1,b.top=this._top+"px")},a.prototype.clear=function(){a.eve("raphael.clear",this);var b=this.canvas;while(b.firstChild)b.removeChild(b.firstChild);this.bottom=this.top=null,(this.desc=q("desc")).appendChild(a._g.doc.createTextNode("Created with Raphaël "+a.version)),b.appendChild(this.desc),b.appendChild(this.defs=q("defs"))},a.prototype.remove=function(){k("raphael.remove",this),this.canvas.parentNode&&this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null};var B=a.st;for(var C in A)A[b](C)&&!B[b](C)&&(B[C]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(C))}(window.Raphael),window.Raphael.vml&&function(a){var b="hasOwnProperty",c=String,d=parseFloat,e=Math,f=e.round,g=e.max,h=e.min,i=e.abs,j="fill",k=/[, ]+/,l=a.eve,m=" progid:DXImageTransform.Microsoft",n=" ",o="",p={M:"m",L:"l",C:"c",Z:"x",m:"t",l:"r",c:"v",z:"x"},q=/([clmz]),?([^clmz]*)/gi,r=/ progid:\S+Blur\([^\)]+\)/g,s=/-?[^,\s-]+/g,t="position:absolute;left:0;top:0;width:1px;height:1px",u=21600,v={path:1,rect:1,image:1},w={circle:1,ellipse:1},x=function(b){var d=/[ahqstv]/ig,e=a._pathToAbsolute;c(b).match(d)&&(e=a._path2curve),d=/[clmz]/g;if(e==a._pathToAbsolute&&!c(b).match(d)){var g=c(b).replace(q,function(a,b,c){var d=[],e=b.toLowerCase()=="m",g=p[b];c.replace(s,function(a){e&&d.length==2&&(g+=d+p[b=="m"?"l":"L"],d=[]),d.push(f(a*u))});return g+d});return g}var h=e(b),i,j;g=[];for(var k=0,l=h.length;k<l;k++){i=h[k],j=h[k][0].toLowerCase(),j=="z"&&(j="x");for(var m=1,r=i.length;m<r;m++)j+=f(i[m]*u)+(m!=r-1?",":o);g.push(j)}return g.join(n)},y=function(b,c,d){var e=a.matrix();e.rotate(-b,.5,.5);return{dx:e.x(c,d),dy:e.y(c,d)}},z=function(a,b,c,d,e,f){var g=a._,h=a.matrix,k=g.fillpos,l=a.node,m=l.style,o=1,p="",q,r=u/b,s=u/c;m.visibility="hidden";if(!!b&&!!c){l.coordsize=i(r)+n+i(s),m.rotation=f*(b*c<0?-1:1);if(f){var t=y(f,d,e);d=t.dx,e=t.dy}b<0&&(p+="x"),c<0&&(p+=" y")&&(o=-1),m.flip=p,l.coordorigin=d*-r+n+e*-s;if(k||g.fillsize){var v=l.getElementsByTagName(j);v=v&&v[0],l.removeChild(v),k&&(t=y(f,h.x(k[0],k[1]),h.y(k[0],k[1])),v.position=t.dx*o+n+t.dy*o),g.fillsize&&(v.size=g.fillsize[0]*i(b)+n+g.fillsize[1]*i(c)),l.appendChild(v)}m.visibility="visible"}};a.toString=function(){return"Your browser doesn’t support SVG. Falling down to VML.\nYou are running Raphaël "+this.version};var A=function(a,b,d){var e=c(b).toLowerCase().split("-"),f=d?"end":"start",g=e.length,h="classic",i="medium",j="medium";while(g--)switch(e[g]){case"block":case"classic":case"oval":case"diamond":case"open":case"none":h=e[g];break;case"wide":case"narrow":j=e[g];break;case"long":case"short":i=e[g]}var k=a.node.getElementsByTagName("stroke")[0];k[f+"arrow"]=h,k[f+"arrowlength"]=i,k[f+"arrowwidth"]=j},B=function(e,i){e.attrs=e.attrs||{};var l=e.node,m=e.attrs,p=l.style,q,r=v[e.type]&&(i.x!=m.x||i.y!=m.y||i.width!=m.width||i.height!=m.height||i.cx!=m.cx||i.cy!=m.cy||i.rx!=m.rx||i.ry!=m.ry||i.r!=m.r),s=w[e.type]&&(m.cx!=i.cx||m.cy!=i.cy||m.r!=i.r||m.rx!=i.rx||m.ry!=i.ry),t=e;for(var y in i)i[b](y)&&(m[y]=i[y]);r&&(m.path=a._getPath[e.type](e),e._.dirty=1),i.href&&(l.href=i.href),i.title&&(l.title=i.title),i.target&&(l.target=i.target),i.cursor&&(p.cursor=i.cursor),"blur"in i&&e.blur(i.blur);if(i.path&&e.type=="path"||r)l.path=x(~c(m.path).toLowerCase().indexOf("r")?a._pathToAbsolute(m.path):m.path),e.type=="image"&&(e._.fillpos=[m.x,m.y],e._.fillsize=[m.width,m.height],z(e,1,1,0,0,0));"transform"in i&&e.transform(i.transform);if(s){var B=+m.cx,D=+m.cy,E=+m.rx||+m.r||0,G=+m.ry||+m.r||0;l.path=a.format("ar{0},{1},{2},{3},{4},{1},{4},{1}x",f((B-E)*u),f((D-G)*u),f((B+E)*u),f((D+G)*u),f(B*u))}if("clip-rect"in i){var H=c(i["clip-rect"]).split(k);if(H.length==4){H[2]=+H[2]+ +H[0],H[3]=+H[3]+ +H[1];var I=l.clipRect||a._g.doc.createElement("div"),J=I.style;J.clip=a.format("rect({1}px {2}px {3}px {0}px)",H),l.clipRect||(J.position="absolute",J.top=0,J.left=0,J.width=e.paper.width+"px",J.height=e.paper.height+"px",l.parentNode.insertBefore(I,l),I.appendChild(l),l.clipRect=I)}i["clip-rect"]||l.clipRect&&(l.clipRect.style.clip="auto")}if(e.textpath){var K=e.textpath.style;i.font&&(K.font=i.font),i["font-family"]&&(K.fontFamily='"'+i["font-family"].split(",")[0].replace(/^['"]+|['"]+$/g,o)+'"'),i["font-size"]&&(K.fontSize=i["font-size"]),i["font-weight"]&&(K.fontWeight=i["font-weight"]),i["font-style"]&&(K.fontStyle=i["font-style"])}"arrow-start"in i&&A(t,i["arrow-start"]),"arrow-end"in i&&A(t,i["arrow-end"],1);if(i.opacity!=null||i["stroke-width"]!=null||i.fill!=null||i.src!=null||i.stroke!=null||i["stroke-width"]!=null||i["stroke-opacity"]!=null||i["fill-opacity"]!=null||i["stroke-dasharray"]!=null||i["stroke-miterlimit"]!=null||i["stroke-linejoin"]!=null||i["stroke-linecap"]!=null){var L=l.getElementsByTagName(j),M=!1;L=L&&L[0],!L&&(M=L=F(j)),e.type=="image"&&i.src&&(L.src=i.src),i.fill&&(L.on=!0);if(L.on==null||i.fill=="none"||i.fill===null)L.on=!1;if(L.on&&i.fill){var N=c(i.fill).match(a._ISURL);if(N){L.parentNode==l&&l.removeChild(L),L.rotate=!0,L.src=N[1],L.type="tile";var O=e.getBBox(1);L.position=O.x+n+O.y,e._.fillpos=[O.x,O.y],a._preload(N[1],function(){e._.fillsize=[this.offsetWidth,this.offsetHeight]})}else L.color=a.getRGB(i.fill).hex,L.src=o,L.type="solid",a.getRGB(i.fill).error&&(t.type in{circle:1,ellipse:1}||c(i.fill).charAt()!="r")&&C(t,i.fill,L)&&(m.fill="none",m.gradient=i.fill,L.rotate=!1)}if("fill-opacity"in i||"opacity"in i){var P=((+m["fill-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+a.getRGB(i.fill).o+1||2)-1);P=h(g(P,0),1),L.opacity=P,L.src&&(L.color="none")}l.appendChild(L);var Q=l.getElementsByTagName("stroke")&&l.getElementsByTagName("stroke")[0],T=!1;!Q&&(T=Q=F("stroke"));if(i.stroke&&i.stroke!="none"||i["stroke-width"]||i["stroke-opacity"]!=null||i["stroke-dasharray"]||i["stroke-miterlimit"]||i["stroke-linejoin"]||i["stroke-linecap"])Q.on=!0;(i.stroke=="none"||i.stroke===null||Q.on==null||i.stroke==0||i["stroke-width"]==0)&&(Q.on=!1);var U=a.getRGB(i.stroke);Q.on&&i.stroke&&(Q.color=U.hex),P=((+m["stroke-opacity"]+1||2)-1)*((+m.opacity+1||2)-1)*((+U.o+1||2)-1);var V=(d(i["stroke-width"])||1)*.75;P=h(g(P,0),1),i["stroke-width"]==null&&(V=m["stroke-width"]),i["stroke-width"]&&(Q.weight=V),V&&V<1&&(P*=V)&&(Q.weight=1),Q.opacity=P,i["stroke-linejoin"]&&(Q.joinstyle=i["stroke-linejoin"]||"miter"),Q.miterlimit=i["stroke-miterlimit"]||8,i["stroke-linecap"]&&(Q.endcap=i["stroke-linecap"]=="butt"?"flat":i["stroke-linecap"]=="square"?"square":"round");if(i["stroke-dasharray"]){var W={"-":"shortdash",".":"shortdot","-.":"shortdashdot","-..":"shortdashdotdot",". ":"dot","- ":"dash","--":"longdash","- .":"dashdot","--.":"longdashdot","--..":"longdashdotdot"};Q.dashstyle=W[b](i["stroke-dasharray"])?W[i["stroke-dasharray"]]:o}T&&l.appendChild(Q)}if(t.type=="text"){t.paper.canvas.style.display=o;var X=t.paper.span,Y=100,Z=m.font&&m.font.match(/\d+(?:\.\d*)?(?=px)/);p=X.style,m.font&&(p.font=m.font),m["font-family"]&&(p.fontFamily=m["font-family"]),m["font-weight"]&&(p.fontWeight=m["font-weight"]),m["font-style"]&&(p.fontStyle=m["font-style"]),Z=d(m["font-size"]||Z&&Z[0])||10,p.fontSize=Z*Y+"px",t.textpath.string&&(X.innerHTML=c(t.textpath.string).replace(/</g,"&#60;").replace(/&/g,"&#38;").replace(/\n/g,"<br>"));var $=X.getBoundingClientRect();t.W=m.w=($.right-$.left)/Y,t.H=m.h=($.bottom-$.top)/Y,t.X=m.x,t.Y=m.y+t.H/2,("x"in i||"y"in i)&&(t.path.v=a.format("m{0},{1}l{2},{1}",f(m.x*u),f(m.y*u),f(m.x*u)+1));var _=["x","y","text","font","font-family","font-weight","font-style","font-size"];for(var ba=0,bb=_.length;ba<bb;ba++)if(_[ba]in i){t._.dirty=1;break}switch(m["text-anchor"]){case"start":t.textpath.style["v-text-align"]="left",t.bbx=t.W/2;break;case"end":t.textpath.style["v-text-align"]="right",t.bbx=-t.W/2;break;default:t.textpath.style["v-text-align"]="center",t.bbx=0}t.textpath.style["v-text-kern"]=!0}},C=function(b,f,g){b.attrs=b.attrs||{};var h=b.attrs,i=Math.pow,j,k,l="linear",m=".5 .5";b.attrs.gradient=f,f=c(f).replace(a._radial_gradient,function(a,b,c){l="radial",b&&c&&(b=d(b),c=d(c),i(b-.5,2)+i(c-.5,2)>.25&&(c=e.sqrt(.25-i(b-.5,2))*((c>.5)*2-1)+.5),m=b+n+c);return o}),f=f.split(/\s*\-\s*/);if(l=="linear"){var p=f.shift();p=-d(p);if(isNaN(p))return null}var q=a._parseDots(f);if(!q)return null;b=b.shape||b.node;if(q.length){b.removeChild(g),g.on=!0,g.method="none",g.color=q[0].color,g.color2=q[q.length-1].color;var r=[];for(var s=0,t=q.length;s<t;s++)q[s].offset&&r.push(q[s].offset+n+q[s].color);g.colors=r.length?r.join():"0% "+g.color,l=="radial"?(g.type="gradientTitle",g.focus="100%",g.focussize="0 0",g.focusposition=m,g.angle=0):(g.type="gradient",g.angle=(270-p)%360),b.appendChild(g)}return 1},D=function(b,c){this[0]=this.node=b,b.raphael=!0,this.id=a._oid++,b.raphaelid=this.id,this.X=0,this.Y=0,this.attrs={},this.paper=c,this.matrix=a.matrix(),this._={transform:[],sx:1,sy:1,dx:0,dy:0,deg:0,dirty:1,dirtyT:1},!c.bottom&&(c.bottom=this),this.prev=c.top,c.top&&(c.top.next=this),c.top=this,this.next=null},E=a.el;D.prototype=E,E.constructor=D,E.transform=function(b){if(b==null)return this._.transform;var d=this.paper._viewBoxShift,e=d?"s"+[d.scale,d.scale]+"-1-1t"+[d.dx,d.dy]:o,f;d&&(f=b=c(b).replace(/\.{3}|\u2026/g,this._.transform||o)),a._extractTransform(this,e+b);var g=this.matrix.clone(),h=this.skew,i=this.node,j,k=~c(this.attrs.fill).indexOf("-"),l=!c(this.attrs.fill).indexOf("url(");g.translate(-0.5,-0.5);if(l||k||this.type=="image"){h.matrix="1 0 0 1",h.offset="0 0",j=g.split();if(k&&j.noRotation||!j.isSimple){i.style.filter=g.toFilter();var m=this.getBBox(),p=this.getBBox(1),q=m.x-p.x,r=m.y-p.y;i.coordorigin=q*-u+n+r*-u,z(this,1,1,q,r,0)}else i.style.filter=o,z(this,j.scalex,j.scaley,j.dx,j.dy,j.rotate)}else i.style.filter=o,h.matrix=c(g),h.offset=g.offset();f&&(this._.transform=f);return this},E.rotate=function(a,b,e){if(this.removed)return this;if(a!=null){a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2])),a=d(a[0]),e==null&&(b=e);if(b==null||e==null){var f=this.getBBox(1);b=f.x+f.width/2,e=f.y+f.height/2}this._.dirtyT=1,this.transform(this._.transform.concat([["r",a,b,e]]));return this}},E.translate=function(a,b){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1])),a=d(a[0])||0,b=+b||0,this._.bbox&&(this._.bbox.x+=a,this._.bbox.y+=b),this.transform(this._.transform.concat([["t",a,b]]));return this},E.scale=function(a,b,e,f){if(this.removed)return this;a=c(a).split(k),a.length-1&&(b=d(a[1]),e=d(a[2]),f=d(a[3]),isNaN(e)&&(e=null),isNaN(f)&&(f=null)),a=d(a[0]),b==null&&(b=a),f==null&&(e=f);if(e==null||f==null)var g=this.getBBox(1);e=e==null?g.x+g.width/2:e,f=f==null?g.y+g.height/2:f,this.transform(this._.transform.concat([["s",a,b,e,f]])),this._.dirtyT=1;return this},E.hide=function(){!this.removed&&(this.node.style.display="none");return this},E.show=function(){!this.removed&&(this.node.style.display=o);return this},E._getBBox=function(){if(this.removed)return{};return{x:this.X+(this.bbx||0)-this.W/2,y:this.Y-this.H,width:this.W,height:this.H}},E.remove=function(){if(!this.removed&&!!this.node.parentNode){this.paper.__set__&&this.paper.__set__.exclude(this),a.eve.unbind("raphael.*.*."+this.id),a._tear(this,this.paper),this.node.parentNode.removeChild(this.node),this.shape&&this.shape.parentNode.removeChild(this.shape);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;this.removed=!0}},E.attr=function(c,d){if(this.removed)return this;if(c==null){var e={};for(var f in this.attrs)this.attrs[b](f)&&(e[f]=this.attrs[f]);e.gradient&&e.fill=="none"&&(e.fill=e.gradient)&&delete e.gradient,e.transform=this._.transform;return e}if(d==null&&a.is(c,"string")){if(c==j&&this.attrs.fill=="none"&&this.attrs.gradient)return this.attrs.gradient;var g=c.split(k),h={};for(var i=0,m=g.length;i<m;i++)c=g[i],c in this.attrs?h[c]=this.attrs[c]:a.is(this.paper.customAttributes[c],"function")?h[c]=this.paper.customAttributes[c].def:h[c]=a._availableAttrs[c];return m-1?h:h[g[0]]}if(this.attrs&&d==null&&a.is(c,"array")){h={};for(i=0,m=c.length;i<m;i++)h[c[i]]=this.attr(c[i]);return h}var n;d!=null&&(n={},n[c]=d),d==null&&a.is(c,"object")&&(n=c);for(var o in n)l("raphael.attr."+o+"."+this.id,this,n[o]);if(n){for(o in this.paper.customAttributes)if(this.paper.customAttributes[b](o)&&n[b](o)&&a.is(this.paper.customAttributes[o],"function")){var p=this.paper.customAttributes[o].apply(this,[].concat(n[o]));this.attrs[o]=n[o];for(var q in p)p[b](q)&&(n[q]=p[q])}n.text&&this.type=="text"&&(this.textpath.string=n.text),B(this,n)}return this},E.toFront=function(){!this.removed&&this.node.parentNode.appendChild(this.node),this.paper&&this.paper.top!=this&&a._tofront(this,this.paper);return this},E.toBack=function(){if(this.removed)return this;this.node.parentNode.firstChild!=this.node&&(this.node.parentNode.insertBefore(this.node,this.node.parentNode.firstChild),a._toback(this,this.paper));return this},E.insertAfter=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[b.length-1]),b.node.nextSibling?b.node.parentNode.insertBefore(this.node,b.node.nextSibling):b.node.parentNode.appendChild(this.node),a._insertafter(this,b,this.paper);return this},E.insertBefore=function(b){if(this.removed)return this;b.constructor==a.st.constructor&&(b=b[0]),b.node.parentNode.insertBefore(this.node,b.node),a._insertbefore(this,b,this.paper);return this},E.blur=function(b){var c=this.node.runtimeStyle,d=c.filter;d=d.replace(r,o),+b!==0?(this.attrs.blur=b,c.filter=d+n+m+".Blur(pixelradius="+(+b||1.5)+")",c.margin=a.format("-{0}px 0 0 -{0}px",f(+b||1.5))):(c.filter=d,c.margin=0,delete this.attrs.blur)},a._engine.path=function(a,b){var c=F("shape");c.style.cssText=t,c.coordsize=u+n+u,c.coordorigin=b.coordorigin;var d=new D(c,b),e={fill:"none",stroke:"#000"};a&&(e.path=a),d.type="path",d.path=[],d.Path=o,B(d,e),b.canvas.appendChild(c);var f=F("skew");f.on=!0,c.appendChild(f),d.skew=f,d.transform(o);return d},a._engine.rect=function(b,c,d,e,f,g){var h=a._rectPath(c,d,e,f,g),i=b.path(h),j=i.attrs;i.X=j.x=c,i.Y=j.y=d,i.W=j.width=e,i.H=j.height=f,j.r=g,j.path=h,i.type="rect";return i},a._engine.ellipse=function(a,b,c,d,e){var f=a.path(),g=f.attrs;f.X=b-d,f.Y=c-e,f.W=d*2,f.H=e*2,f.type="ellipse",B(f,{cx:b,cy:c,rx:d,ry:e});return f},a._engine.circle=function(a,b,c,d){var e=a.path(),f=e.attrs;e.X=b-d,e.Y=c-d,e.W=e.H=d*2,e.type="circle",B(e,{cx:b,cy:c,r:d});return e},a._engine.image=function(b,c,d,e,f,g){var h=a._rectPath(d,e,f,g),i=b.path(h).attr({stroke:"none"}),k=i.attrs,l=i.node,m=l.getElementsByTagName(j)[0];k.src=c,i.X=k.x=d,i.Y=k.y=e,i.W=k.width=f,i.H=k.height=g,k.path=h,i.type="image",m.parentNode==l&&l.removeChild(m),m.rotate=!0,m.src=c,m.type="tile",i._.fillpos=[d,e],i._.fillsize=[f,g],l.appendChild(m),z(i,1,1,0,0,0);return i},a._engine.text=function(b,d,e,g){var h=F("shape"),i=F("path"),j=F("textpath");d=d||0,e=e||0,g=g||"",i.v=a.format("m{0},{1}l{2},{1}",f(d*u),f(e*u),f(d*u)+1),i.textpathok=!0,j.string=c(g),j.on=!0,h.style.cssText=t,h.coordsize=u+n+u,h.coordorigin="0 0";var k=new D(h,b),l={fill:"#000",stroke:"none",font:a._availableAttrs.font,text:g};k.shape=h,k.path=i,k.textpath=j,k.type="text",k.attrs.text=c(g),k.attrs.x=d,k.attrs.y=e,k.attrs.w=1,k.attrs.h=1,B(k,l),h.appendChild(j),h.appendChild(i),b.canvas.appendChild(h);var m=F("skew");m.on=!0,h.appendChild(m),k.skew=m,k.transform(o);return k},a._engine.setSize=function(b,c){var d=this.canvas.style;this.width=b,this.height=c,b==+b&&(b+="px"),c==+c&&(c+="px"),d.width=b,d.height=c,d.clip="rect(0 "+b+" "+c+" 0)",this._viewBox&&a._engine.setViewBox.apply(this,this._viewBox);return this},a._engine.setViewBox=function(b,c,d,e,f){a.eve("raphael.setViewBox",this,this._viewBox,[b,c,d,e,f]);var h=this.width,i=this.height,j=1/g(d/h,e/i),k,l;f&&(k=i/e,l=h/d,d*k<h&&(b-=(h-d*k)/2/k),e*l<i&&(c-=(i-e*l)/2/l)),this._viewBox=[b,c,d,e,!!f],this._viewBoxShift={dx:-b,dy:-c,scale:j},this.forEach(function(a){a.transform("...")});return this};var F;a._engine.initWin=function(a){var b=a.document;b.createStyleSheet().addRule(".rvml","behavior:url(#default#VML)");try{!b.namespaces.rvml&&b.namespaces.add("rvml","urn:schemas-microsoft-com:vml"),F=function(a){return b.createElement("<rvml:"+a+' class="rvml">')}}catch(c){F=function(a){return b.createElement("<"+a+' xmlns="urn:schemas-microsoft.com:vml" class="rvml">')}}},a._engine.initWin(a._g.win),a._engine.create=function(){var b=a._getContainer.apply(0,arguments),c=b.container,d=b.height,e,f=b.width,g=b.x,h=b.y;if(!c)throw new Error("VML container not found.");var i=new a._Paper,j=i.canvas=a._g.doc.createElement("div"),k=j.style;g=g||0,h=h||0,f=f||512,d=d||342,i.width=f,i.height=d,f==+f&&(f+="px"),d==+d&&(d+="px"),i.coordsize=u*1e3+n+u*1e3,i.coordorigin="0 0",i.span=a._g.doc.createElement("span"),i.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;",j.appendChild(i.span),k.cssText=a.format("top:0;left:0;width:{0};height:{1};display:inline-block;position:relative;clip:rect(0 {0} {1} 0);overflow:hidden",f,d),c==1?(a._g.doc.body.appendChild(j),k.left=g+"px",k.top=h+"px",k.position="absolute"):c.firstChild?c.insertBefore(j,c.firstChild):c.appendChild(j),i.renderfix=function(){};return i},a.prototype.clear=function(){a.eve("raphael.clear",this),this.canvas.innerHTML=o,this.span=a._g.doc.createElement("span"),this.span.style.cssText="position:absolute;left:-9999em;top:-9999em;padding:0;margin:0;line-height:1;display:inline;",this.canvas.appendChild(this.span),this.bottom=this.top=null},a.prototype.remove=function(){a.eve("raphael.remove",this),this.canvas.parentNode.removeChild(this.canvas);for(var b in this)this[b]=typeof this[b]=="function"?a._removedFactory(b):null;return!0};var G=a.st;for(var H in E)E[b](H)&&!G[b](H)&&(G[H]=function(a){return function(){var b=arguments;return this.forEach(function(c){c[a].apply(c,b)})}}(H))}(window.Raphael) \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ref-index.css b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ref-index.css
new file mode 100755
index 0000000000..7d64b9c5c5
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/ref-index.css
@@ -0,0 +1,30 @@
+body {
+ font-size: 10pt;
+ font-family: Arial, sans-serif;
+}
+
+a {
+ color:#315479;
+}
+
+.letters {
+ width:100%;
+ text-align:center;
+ margin:0.6em;
+ padding:0.1em;
+ border-bottom:1px solid gray;
+}
+
+.entry {
+ border-bottom: 1px solid lightgray;
+ padding: 5px 0 8px;
+}
+
+.name {
+ /* background-color:#E5E5E5; */
+}
+
+.occurrences {
+ margin-left: 1em;
+ margin-top: 5px;
+} \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/remove.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/remove.png
new file mode 100644
index 0000000000..4625f9df74
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/remove.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/remove.psd b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/remove.psd
new file mode 100644
index 0000000000..3764f82ccb
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/remove.psd
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/scheduler.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/scheduler.js
new file mode 100644
index 0000000000..4417f5b438
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/scheduler.js
@@ -0,0 +1,71 @@
+// © 2010 EPFL/LAMP
+// code by Gilles Dubochet
+
+function Scheduler() {
+ var scheduler = this;
+ var resolution = 0;
+ this.timeout = undefined;
+ this.queues = new Array(0); // an array of work pacakges indexed by index in the labels table.
+ this.labels = new Array(0); // an indexed array of labels indexed by priority. This should be short.
+ this.label = function(name, priority) {
+ this.name = name;
+ this.priority = priority;
+ }
+ this.work = function(fn, self, args) {
+ this.fn = fn;
+ this.self = self;
+ this.args = args;
+ }
+ this.addLabel = function(name, priority) {
+ var idx = 0;
+ while (idx < scheduler.queues.length && scheduler.labels[idx].priority <= priority) { idx = idx + 1; }
+ scheduler.labels.splice(idx, 0, new scheduler.label(name, priority));
+ scheduler.queues.splice(idx, 0, new Array(0));
+ }
+ this.clearLabel = function(name) {
+ var idx = 0;
+ while (idx < scheduler.queues.length && scheduler.labels[idx].name != name) { idx = idx + 1; }
+ if (idx < scheduler.queues.length && scheduler.labels[i].name == name) {
+ scheduler.labels.splice(idx, 1);
+ scheduler.queues.splice(idx, 1);
+ }
+ }
+ this.nextWork = function() {
+ var fn = undefined;
+ var idx = 0;
+ while (idx < scheduler.queues.length && scheduler.queues[idx].length == 0) { idx = idx + 1; }
+ if (idx < scheduler.queues.length && scheduler.queues[idx].length > 0) {
+ var fn = scheduler.queues[idx].shift();
+ }
+ return fn;
+ }
+ this.add = function(labelName, fn, self, args) {
+ var doWork = function() {
+ scheduler.timeout = setTimeout(function() {
+ var work = scheduler.nextWork();
+ if (work != undefined) {
+ if (work.args == undefined) { work.args = new Array(0); }
+ work.fn.apply(work.self, work.args);
+ doWork();
+ }
+ else {
+ scheduler.timeout = undefined;
+ }
+ }, resolution);
+ }
+ var idx = 0;
+ while (idx < scheduler.labels.length && scheduler.labels[idx].name != labelName) { idx = idx + 1; }
+ if (idx < scheduler.queues.length && scheduler.labels[idx].name == labelName) {
+ scheduler.queues[idx].push(new scheduler.work(fn, self, args));
+ if (scheduler.timeout == undefined) doWork();
+ }
+ else throw("queue for add is non existant");
+ }
+ this.clear = function(labelName) {
+ var idx = 0;
+ while (idx < scheduler.labels.length && scheduler.labels[idx].name != labelName) { idx = idx + 1; }
+ if (idx < scheduler.queues.length && scheduler.labels[idx].name == labelName) {
+ scheduler.queues[idx] = new Array();
+ }
+ }
+};
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-implicits.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-implicits.png
new file mode 100644
index 0000000000..bc29efb3e6
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-implicits.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-right-implicits.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-right-implicits.png
new file mode 100644
index 0000000000..8313f4975b
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-right-implicits.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-right.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-right.png
new file mode 100644
index 0000000000..04eda2f307
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected-right.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected.png
new file mode 100644
index 0000000000..c89765239e
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected2-right.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected2-right.png
new file mode 100644
index 0000000000..bf984ef0ba
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected2-right.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected2.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected2.png
new file mode 100644
index 0000000000..a790bb1169
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/selected2.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/signaturebg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/signaturebg.gif
new file mode 100644
index 0000000000..b6ac4415e4
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/signaturebg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/signaturebg2.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/signaturebg2.gif
new file mode 100644
index 0000000000..9aae5ba0aa
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/signaturebg2.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.css b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.css
new file mode 100644
index 0000000000..b066027f04
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.css
@@ -0,0 +1,848 @@
+/* Reset */
+
+html, body, div, span, object, iframe,
+h1, h2, h3, h4, h5, h6, p, blockquote, pre,
+a, abbr, acronym, address, code, pre,
+del, dfn, em, img, q, dl, dt, dd, ol, ul, li,
+fieldset, form, label, legend, input,
+table, caption, tbody, tfoot, thead, tr, th, td {
+ margin: 0;
+ padding: 0;
+ border: 0;
+ font-weight: inherit;
+ font-style: inherit;
+ font-size: 100%;
+ font-family: inherit;
+ vertical-align: baseline;
+}
+
+table { border-collapse: separate; border-spacing: 0; }
+caption, th, td { text-align: left; font-weight: normal; }
+table, td, th { vertical-align: middle; }
+
+blockquote:before, blockquote:after, q:before, q:after { content: ""; }
+blockquote, q { quotes: none; }
+
+a img { border: none; }
+
+input { border-width: 0px; }
+
+/* Page */
+
+body {
+ font-family: Arial, sans-serif;
+ font-size: 10pt;
+}
+
+#footer {
+ font-size: 9pt;
+ text-align: center;
+ color: #858484;
+ bottom: 0;
+ width: 100%;
+ height: 20px;
+}
+
+a[href] {
+ text-decoration: underline;
+ color: #315479;
+}
+
+a[href]:hover {
+ text-decoration: none;
+}
+
+#types ol li > p {
+ margin-top: 5px;
+}
+
+#types ol li:last-child {
+ margin-bottom: 5px;
+}
+
+/*
+#definition {
+ padding: 6px 0 6px 6px;
+ min-height: 59px;
+ color: white;
+}
+*/
+
+#definition {
+ display: block-inline;
+ padding: 5px 0px;
+ height: 61px;
+}
+
+#definition > img {
+ float: left;
+ padding-right: 6px;
+ padding-left: 5px;
+}
+
+#definition > a > img {
+ float: left;
+ padding-right: 6px;
+ padding-left: 5px;
+}
+
+#definition p + h1 {
+ margin-top: 3px;
+}
+
+#definition > h1 {
+/* padding: 12px 0 12px 6px;*/
+ color: white;
+ text-shadow: 3px black;
+ text-shadow: black 0px 2px 0px;
+ font-size: 24pt;
+ display: inline-block;
+ overflow: hidden;
+ margin-top: 10px;
+}
+
+#definition h1 > a {
+ color: #ffffff;
+ font-size: 24pt;
+ text-shadow: black 0px 2px 0px;
+/* text-shadow: black 0px 0px 0px;*/
+text-decoration: none;
+}
+
+#definition #owner {
+ color: #ffffff;
+ margin-top: 4px;
+ font-size: 10pt;
+ overflow: hidden;
+}
+
+#definition #owner > a {
+ color: #ffffff;
+}
+
+#definition #owner > a:hover {
+ text-decoration: none;
+}
+
+#signature {
+ background-image:url('signaturebg2.gif');
+ background-color: #d7d7d7;
+ min-height: 18px;
+ background-repeat:repeat-x;
+ font-size: 11.5pt;
+/* margin-bottom: 10px;*/
+ padding: 8px;
+}
+
+#signature > span.modifier_kind {
+ display: inline;
+ float: left;
+ text-align: left;
+ width: auto;
+ position: static;
+ text-shadow: 2px white;
+ text-shadow: white 0px 1px 0px;
+}
+
+#signature > span.symbol {
+ text-align: left;
+ display: inline;
+ padding-left: 0.7em;
+ text-shadow: 2px white;
+ text-shadow: white 0px 1px 0px;
+}
+
+/* Linear super types and known subclasses */
+.hiddenContent {
+ display: none;
+}
+
+.toggleContainer .toggle {
+ cursor: pointer;
+ padding-left: 15px;
+ background: url("arrow-right.png") no-repeat 0 3px transparent;
+}
+
+.toggleContainer .toggle.open {
+ background: url("arrow-down.png") no-repeat 0 3px transparent;
+}
+
+.toggleContainer .hiddenContent {
+ margin-top: 5px;
+}
+
+.value #definition {
+ background-color: #2C475C; /* blue */
+ background-image:url('defbg-blue.gif');
+ background-repeat:repeat-x;
+}
+
+.type #definition {
+ background-color: #316555; /* green */
+ background-image:url('defbg-green.gif');
+ background-repeat:repeat-x;
+}
+
+#template {
+ margin-bottom: 50px;
+}
+
+h3 {
+ color: white;
+ padding: 5px 10px;
+ font-size: 12pt;
+ font-weight: bold;
+ text-shadow: black 1px 1px 0px;
+}
+
+dl.attributes > dt {
+ display: block;
+ float: left;
+ font-style: italic;
+}
+
+dl.attributes > dt.implicit {
+ font-weight: bold;
+ color: darkgreen;
+}
+
+dl.attributes > dd {
+ display: block;
+ padding-left: 10em;
+ margin-bottom: 5px;
+}
+
+#template .values > h3 {
+ background: #2C475C url("valuemembersbg.gif") repeat-x bottom left; /* grayish blue */
+ height: 18px;
+}
+
+#values ol li:last-child {
+ margin-bottom: 5px;
+}
+
+#template .types > h3 {
+ background: #316555 url("typebg.gif") repeat-x bottom left; /* green */
+ height: 18px;
+}
+
+#constructors > h3 {
+ background: #4f504f url("constructorsbg.gif") repeat-x bottom left; /* gray */
+ height: 18px;
+}
+
+#inheritedMembers > div.parent > h3 {
+ background: #dadada url("constructorsbg.gif") repeat-x bottom left; /* gray */
+ height: 17px;
+ font-style: italic;
+ font-size: 12pt;
+}
+
+#inheritedMembers > div.parent > h3 * {
+ color: white;
+}
+
+#inheritedMembers > div.conversion > h3 {
+ background: #dadada url("conversionbg.gif") repeat-x bottom left; /* gray */
+ height: 17px;
+ font-style: italic;
+ font-size: 12pt;
+}
+
+#inheritedMembers > div.conversion > h3 * {
+ color: white;
+}
+
+#groupedMembers > div.group > h3 {
+ background: #dadada url("typebg.gif") repeat-x bottom left; /* green */
+ height: 17px;
+ font-size: 12pt;
+}
+
+#groupedMembers > div.group > h3 * {
+ color: white;
+}
+
+
+/* Member cells */
+
+div.members > ol {
+ background-color: white;
+ list-style: none
+}
+
+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 */
+
+#tooltip {
+ background: #EFD5B5;
+ border: 1px solid gray;
+ color: black;
+ display: none;
+ padding: 5px;
+ position: absolute;
+}
+
+.signature {
+ font-family: monospace;
+ font-size: 10pt;
+ line-height: 18px;
+ clear: both;
+ display: block;
+ text-shadow: 2px white;
+ text-shadow: white 0px 1px 0px;
+}
+
+.signature .modifier_kind {
+ position: absolute;
+ text-align: right;
+ width: 14em;
+}
+
+.signature > a > .symbol > .name {
+ text-decoration: underline;
+}
+
+.signature > a:hover > .symbol > .name {
+ text-decoration: none;
+}
+
+.signature > a {
+ text-decoration: none;
+}
+
+.signature > .symbol {
+ display: block;
+ padding-left: 14.7em;
+}
+
+.signature .name {
+ display: inline-block;
+ font-weight: bold;
+}
+
+.signature .symbol > .implicit {
+ display: inline-block;
+ font-weight: bold;
+ text-decoration: underline;
+ color: darkgreen;
+}
+
+.signature .symbol .shadowed {
+ color: darkseagreen;
+}
+
+.signature .symbol .params > .implicit {
+ font-style: italic;
+}
+
+.signature .symbol .deprecated {
+ text-decoration: line-through;
+}
+
+.signature .symbol .params .default {
+ 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: darkblue;
+}
+
+#template .types .signature .name {
+ color: darkgreen;
+}
+
+.full-signature-usecase h4 span {
+ font-size: 10pt;
+}
+
+.full-signature-usecase > #signature {
+ padding-top: 0px;
+}
+
+#template .full-signature-usecase > .signature.closed {
+ background: none;
+}
+
+#template .full-signature-usecase > .signature.opened {
+ background: none;
+}
+
+.full-signature-block {
+ padding: 5px 0 0;
+ border-top: 1px solid #EBEBEB;
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+
+/* Comments text formating */
+
+.cmt {}
+
+.cmt p {
+ margin: 0.7em 0;
+}
+
+.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;
+}
+
+.cmt h3 {
+ font-size: 14pt;
+}
+
+.cmt h4 {
+ font-size: 13pt;
+}
+
+.cmt h5 {
+ font-size: 12pt;
+}
+
+.cmt h6 {
+ font-size: 11pt;
+}
+
+.cmt pre {
+ padding: 5px;
+ border: 1px solid #ddd;
+ background-color: #eee;
+ margin: 5px 0;
+ display: block;
+ font-family: monospace;
+}
+
+.cmt pre span.ano {
+ color: blue;
+}
+
+.cmt pre span.cmt {
+ color: green;
+}
+
+.cmt pre span.kw {
+ font-weight: bold;
+}
+
+.cmt pre span.lit {
+ color: #c71585;
+}
+
+.cmt pre span.num {
+ color: #1e90ff; /* dodgerblue */
+}
+
+.cmt pre span.std {
+ color: #008080; /* teal */
+}
+
+.cmt ul {
+ display: block;
+ list-style: circle;
+ padding-left: 20px;
+}
+
+.cmt ol {
+ display: block;
+ padding-left:20px;
+}
+
+.cmt ol.decimal {
+ list-style: decimal;
+}
+
+.cmt ol.lowerAlpha {
+ list-style: lower-alpha;
+}
+
+.cmt ol.upperAlpha {
+ list-style: upper-alpha;
+}
+
+.cmt ol.lowerRoman {
+ list-style: lower-roman;
+}
+
+.cmt ol.upperRoman {
+ list-style: upper-roman;
+}
+
+.cmt li {
+ display: list-item;
+}
+
+.cmt code {
+ font-family: monospace;
+}
+
+.cmt a {
+ font-style: bold;
+}
+
+.cmt em, .cmt i {
+ font-style: italic;
+}
+
+.cmt strong, .cmt b {
+ font-weight: bold;
+}
+
+/* Comments structured layout */
+
+.group > div.comment {
+ padding-top: 5px;
+ padding-bottom: 5px;
+ padding-right: 5px;
+ padding-left: 5px;
+ border: 1px solid #ddd;
+ background-color: #eeeee;
+ margin-top:5px;
+ margin-bottom:5px;
+ margin-right:5px;
+ margin-left:5px;
+ display: block;
+}
+
+p.comment {
+ display: block;
+ margin-left: 14.7em;
+ margin-top: 5px;
+}
+
+.shortcomment {
+ display: block;
+ margin: 5px 10px;
+}
+
+div.fullcommenttop {
+ padding: 10px 10px;
+ background-image:url('fullcommenttopbg.gif');
+ background-repeat:repeat-x;
+}
+
+div.fullcomment {
+ margin: 5px 10px;
+}
+
+#template div.fullcommenttop,
+#template div.fullcomment {
+ display:none;
+ margin: 5px 0 0 14.7em;
+}
+
+#template .shortcomment {
+ margin: 5px 0 0 14.7em;
+ padding: 0;
+}
+
+div.fullcomment .block {
+ padding: 5px 0 0;
+ border-top: 1px solid #EBEBEB;
+ margin-top: 5px;
+ overflow: hidden;
+}
+
+div.fullcommenttop .block {
+ padding: 5px 0 0;
+ border-top: 1px solid #EBEBEB;
+ margin-top: 5px;
+ margin-bottom: 5px
+}
+
+div.fullcomment div.block ol li p,
+div.fullcomment div.block ol li {
+ display:inline
+}
+
+div.fullcomment .block > h5 {
+ font-style: italic;
+ font-weight: normal;
+ display: inline-block;
+}
+
+div.fullcomment .comment {
+ margin: 5px 0 10px;
+}
+
+div.fullcommenttop .comment:last-child,
+div.fullcomment .comment:last-child {
+ margin-bottom: 0;
+}
+
+div.fullcommenttop dl.paramcmts {
+ margin-bottom: 0.8em;
+ padding-bottom: 0.8em;
+}
+
+div.fullcommenttop dl.paramcmts > dt,
+div.fullcomment dl.paramcmts > dt {
+ display: block;
+ float: left;
+ font-weight: bold;
+ min-width: 70px;
+}
+
+div.fullcommenttop dl.paramcmts > dd,
+div.fullcomment dl.paramcmts > dd {
+ display: block;
+ padding-left: 10px;
+ margin-bottom: 5px;
+ margin-left: 70px;
+}
+
+/* Members filter tool */
+
+#textfilter {
+ position: relative;
+ display: block;
+ height: 20px;
+ margin-bottom: 5px;
+}
+
+#textfilter > .pre {
+ display: block;
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 23px;
+ width: 21px;
+ background: url("filter_box_left.png");
+}
+
+#textfilter > .input {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 20px;
+ left: 20px;
+}
+
+#textfilter > .input > input {
+ height: 20px;
+ padding: 1px;
+ font-weight: bold;
+ color: #000000;
+ background: #ffffff url("filterboxbarbg.png") repeat-x top left;
+ width: 100%;
+}
+
+#textfilter > .post {
+ display: block;
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 23px;
+ width: 21px;
+ background: url("filter_box_right.png");
+}
+
+#mbrsel {
+ padding: 5px 10px;
+ background-color: #ededee; /* light gray */
+ background-image:url('filterboxbg.gif');
+ background-repeat:repeat-x;
+ font-size: 9.5pt;
+ display: block;
+ margin-top: 1em;
+/* margin-bottom: 1em; */
+}
+
+#mbrsel > div {
+ margin-bottom: 5px;
+}
+
+#mbrsel > div:last-child {
+ margin-bottom: 0;
+}
+
+#mbrsel > div > span.filtertype {
+ padding: 4px;
+ margin-right: 5px;
+ float: left;
+ display: inline-block;
+ color: #000000;
+ font-weight: bold;
+ text-shadow: white 0px 1px 0px;
+ width: 4.5em;
+}
+
+#mbrsel > div > ol {
+ display: inline-block;
+}
+
+#mbrsel > div > a {
+ position:relative;
+ top: -8px;
+ font-size: 11px;
+ text-shadow: #ffffff 0 1px 0;
+}
+
+#mbrsel > div > ol#linearization {
+ display: table;
+ margin-left: 70px;
+}
+
+#mbrsel > div > ol#linearization > li.in {
+ text-decoration: none;
+ float: left;
+ padding-right: 10px;
+ margin-right: 5px;
+ background: url(selected-right.png) no-repeat;
+ background-position: right 0px;
+}
+
+#mbrsel > div > ol#linearization > li.in > span{
+ color: #404040;
+ float: left;
+ padding: 1px 0 1px 10px;
+ background: url(selected.png) no-repeat;
+ background-position: 0px 0px;
+ text-shadow: #ffffff 0 1px 0;
+}
+
+#mbrsel > div > ol#implicits {
+ display: table;
+ margin-left: 70px;
+}
+
+#mbrsel > div > ol#implicits > li.in {
+ text-decoration: none;
+ float: left;
+ padding-right: 10px;
+ margin-right: 5px;
+ background: url(selected-right-implicits.png) no-repeat;
+ background-position: right 0px;
+}
+
+#mbrsel > div > ol#implicits > li.in > span{
+ color: #404040;
+ float: left;
+ padding: 1px 0 1px 10px;
+ background: url(selected-implicits.png) no-repeat;
+ background-position: 0px 0px;
+ text-shadow: #ffffff 0 1px 0;
+}
+
+#mbrsel > div > ol > li {
+/* padding: 3px 10px;*/
+ line-height: 16pt;
+ display: inline-block;
+ cursor: pointer;
+}
+
+#mbrsel > div > ol > li.in {
+ text-decoration: none;
+ float: left;
+ padding-right: 10px;
+ margin-right: 5px;
+ background: url(selected-right.png) no-repeat;
+ background-position: right 0px;
+}
+
+#mbrsel > div > ol > li.in > span{
+ color: #404040;
+ float: left;
+ padding: 1px 0 1px 10px;
+ background: url(selected.png) no-repeat;
+ background-position: 0px 0px;
+ text-shadow: #ffffff 0 1px 0;
+}
+
+#mbrsel > div > ol > li.out {
+ text-decoration: none;
+ float: left;
+ padding-right: 10px;
+ margin-right: 5px;
+}
+
+#mbrsel > div > ol > li.out > span{
+ color: #747474;
+/* background-color: #999; */
+ float: left;
+ padding: 1px 0 1px 10px;
+/* background: url(unselected.png) no-repeat;*/
+ background-position: 0px -1px;
+ text-shadow: #ffffff 0 1px 0;
+}
+/*
+#mbrsel .hideall {
+ color: #4C4C4C;
+ line-height: 16px;
+ font-weight: bold;
+}
+
+#mbrsel .hideall span {
+ color: #4C4C4C;
+ font-weight: bold;
+}
+
+#mbrsel .showall {
+ color: #4C4C4C;
+ line-height: 16px;
+ font-weight: bold;
+}
+
+#mbrsel .showall span {
+ color: #4C4C4C;
+ font-weight: bold;
+}*/
+
+.badge {
+ display: inline-block;
+ padding: 2px 4px;
+ font-size: 11.844px;
+ font-weight: bold;
+ line-height: 14px;
+ color: #ffffff;
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+ white-space: nowrap;
+ vertical-align: baseline;
+ background-color: #999999;
+ padding-right: 9px;
+ padding-left: 9px;
+ -webkit-border-radius: 9px;
+ -moz-border-radius: 9px;
+ border-radius: 9px;
+}
+
+.badge-red {
+ background-color: #b94a48;
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.js
new file mode 100644
index 0000000000..6d1caf6d50
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/template.js
@@ -0,0 +1,466 @@
+// © 2009–2010 EPFL/LAMP
+// code by Gilles Dubochet with contributions by Pedro Furlanetto
+
+$(document).ready(function(){
+
+ // Escapes special characters and returns a valid jQuery selector
+ function escapeJquery(str){
+ return str.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1');
+ }
+
+ // highlight and jump to selected member
+ if (window.location.hash) {
+ var temp = window.location.hash.replace('#', '');
+ var elem = '#'+escapeJquery(temp);
+
+ window.scrollTo(0, 0);
+ $(elem).parent().effect("highlight", {color: "#FFCC85"}, 3000);
+ $('html,body').animate({scrollTop:$(elem).parent().offset().top}, 1000);
+ }
+
+ var isHiddenClass = function (name) {
+ return name == 'scala.Any' ||
+ name == 'scala.AnyRef';
+ };
+
+ var isHidden = function (elem) {
+ return $(elem).attr("data-hidden") == 'true';
+ };
+
+ $("#linearization li:gt(0)").filter(function(){
+ return isHiddenClass($(this).attr("name"));
+ }).removeClass("in").addClass("out");
+
+ $("#implicits li").filter(function(){
+ return isHidden(this);
+ }).removeClass("in").addClass("out");
+
+ // Pre-filter members
+ filter();
+
+ // Member filter box
+ var input = $("#textfilter input");
+ input.bind("keyup", function(event) {
+
+ switch ( event.keyCode ) {
+
+ case 27: // escape key
+ input.val("");
+ filter(true);
+ break;
+
+ case 38: // up
+ input.val("");
+ filter(false);
+ window.scrollTo(0, $("body").offset().top);
+ input.focus();
+ break;
+
+ case 33: //page up
+ input.val("");
+ filter(false);
+ break;
+
+ case 34: //page down
+ input.val("");
+ filter(false);
+ break;
+
+ default:
+ window.scrollTo(0, $("#mbrsel").offset().top);
+ filter(true);
+ break;
+
+ }
+ });
+ input.focus(function(event) {
+ input.select();
+ });
+ $("#textfilter > .post").click(function() {
+ $("#textfilter input").attr("value", "");
+ filter();
+ });
+ $(document).keydown(function(event) {
+
+ if (event.keyCode == 9) { // tab
+ $("#index-input", window.parent.document).focus();
+ input.attr("value", "");
+ return false;
+ }
+ });
+
+ $("#linearization li").click(function(){
+ if ($(this).hasClass("in")) {
+ $(this).removeClass("in");
+ $(this).addClass("out");
+ }
+ else if ($(this).hasClass("out")) {
+ $(this).removeClass("out");
+ $(this).addClass("in");
+ };
+ filter();
+ });
+
+ $("#implicits li").click(function(){
+ if ($(this).hasClass("in")) {
+ $(this).removeClass("in");
+ $(this).addClass("out");
+ }
+ else if ($(this).hasClass("out")) {
+ $(this).removeClass("out");
+ $(this).addClass("in");
+ };
+ filter();
+ });
+
+ $("#mbrsel > div[id=ancestors] > ol > li.hideall").click(function() {
+ $("#linearization li.in").removeClass("in").addClass("out");
+ $("#linearization li:first").removeClass("out").addClass("in");
+ $("#implicits li.in").removeClass("in").addClass("out");
+
+ if ($(this).hasClass("out") && $("#mbrsel > div[id=ancestors] > ol > li.showall").hasClass("in")) {
+ $(this).removeClass("out").addClass("in");
+ $("#mbrsel > div[id=ancestors] > ol > li.showall").removeClass("in").addClass("out");
+ }
+
+ filter();
+ })
+ $("#mbrsel > div[id=ancestors] > ol > li.showall").click(function() {
+ var filteredLinearization =
+ $("#linearization li.out").filter(function() {
+ return ! isHiddenClass($(this).attr("name"));
+ });
+ filteredLinearization.removeClass("out").addClass("in");
+
+ var filteredImplicits =
+ $("#implicits li.out").filter(function() {
+ return ! isHidden(this);
+ });
+ filteredImplicits.removeClass("out").addClass("in");
+
+ if ($(this).hasClass("out") && $("#mbrsel > div[id=ancestors] > ol > li.hideall").hasClass("in")) {
+ $(this).removeClass("out").addClass("in");
+ $("#mbrsel > div[id=ancestors] > ol > li.hideall").removeClass("in").addClass("out");
+ }
+
+ filter();
+ });
+ $("#visbl > ol > li.public").click(function() {
+ if ($(this).hasClass("out")) {
+ $(this).removeClass("out").addClass("in");
+ $("#visbl > ol > li.all").removeClass("in").addClass("out");
+ filter();
+ };
+ })
+ $("#visbl > ol > li.all").click(function() {
+ if ($(this).hasClass("out")) {
+ $(this).removeClass("out").addClass("in");
+ $("#visbl > ol > li.public").removeClass("in").addClass("out");
+ filter();
+ };
+ });
+ $("#order > ol > li.alpha").click(function() {
+ if ($(this).hasClass("out")) {
+ orderAlpha();
+ };
+ })
+ $("#order > ol > li.inherit").click(function() {
+ if ($(this).hasClass("out")) {
+ orderInherit();
+ };
+ });
+ $("#order > ol > li.group").click(function() {
+ if ($(this).hasClass("out")) {
+ orderGroup();
+ };
+ });
+ $("#groupedMembers").hide();
+
+ initInherit();
+
+ // Create tooltips
+ $(".extype").add(".defval").tooltip({
+ tip: "#tooltip",
+ position:"top center",
+ predelay: 500,
+ onBeforeShow: function(ev) {
+ $(this.getTip()).text(this.getTrigger().attr("name"));
+ }
+ });
+
+ /* Add toggle arrows */
+ //var docAllSigs = $("#template li").has(".fullcomment").find(".signature");
+ // trying to speed things up a little bit
+ var docAllSigs = $("#template li[fullComment=yes] .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);
+ }
+ };
+ docAllSigs.addClass("closed");
+ docAllSigs.click(function() {
+ commentToggleFct($(this));
+ });
+
+ /* Linear super types and known subclasses */
+ function toggleShowContentFct(e){
+ e.toggleClass("open");
+ var content = $(".hiddenContent", e.parent().get(0));
+ if (content.is(':visible')) {
+ content.slideUp(100);
+ }
+ else {
+ content.slideDown(100);
+ }
+ };
+
+ $(".toggle:not(.diagram-link)").click(function() {
+ toggleShowContentFct($(this));
+ });
+
+ // Set parent window title
+ windowTitle();
+
+ if ($("#order > ol > li.group").length == 1) { orderGroup(); };
+});
+
+function orderAlpha() {
+ $("#order > ol > li.alpha").removeClass("out").addClass("in");
+ $("#order > ol > li.inherit").removeClass("in").addClass("out");
+ $("#order > ol > li.group").removeClass("in").addClass("out");
+ $("#template > div.parent").hide();
+ $("#template > div.conversion").hide();
+ $("#mbrsel > div[id=ancestors]").show();
+ filter();
+};
+
+function orderInherit() {
+ $("#order > ol > li.inherit").removeClass("out").addClass("in");
+ $("#order > ol > li.alpha").removeClass("in").addClass("out");
+ $("#order > ol > li.group").removeClass("in").addClass("out");
+ $("#template > div.parent").show();
+ $("#template > div.conversion").show();
+ $("#mbrsel > div[id=ancestors]").hide();
+ filter();
+};
+
+function orderGroup() {
+ $("#order > ol > li.group").removeClass("out").addClass("in");
+ $("#order > ol > li.alpha").removeClass("in").addClass("out");
+ $("#order > ol > li.inherit").removeClass("in").addClass("out");
+ $("#template > div.parent").hide();
+ $("#template > div.conversion").hide();
+ $("#mbrsel > div[id=ancestors]").show();
+ filter();
+};
+
+/** Prepares the DOM for inheritance-based display. To do so it will:
+ * - hide all statically-generated parents headings;
+ * - copy all members from the value and type members lists (flat members) to corresponding lists nested below the
+ * parent headings (inheritance-grouped members);
+ * - initialises a control variable used by the filter method to control whether filtering happens on flat members
+ * or on inheritance-grouped members. */
+function initInherit() {
+ // inheritParents is a map from fully-qualified names to the DOM node of parent headings.
+ var inheritParents = new Object();
+ var groupParents = new Object();
+ $("#inheritedMembers > div.parent").each(function(){
+ inheritParents[$(this).attr("name")] = $(this);
+ });
+ $("#inheritedMembers > div.conversion").each(function(){
+ inheritParents[$(this).attr("name")] = $(this);
+ });
+ $("#groupedMembers > div.group").each(function(){
+ groupParents[$(this).attr("name")] = $(this);
+ });
+
+ $("#types > ol > li").each(function(){
+ var mbr = $(this);
+ this.mbrText = mbr.find("> .fullcomment .cmt").text();
+ var qualName = mbr.attr("name");
+ var owner = qualName.slice(0, qualName.indexOf("#"));
+ var name = qualName.slice(qualName.indexOf("#") + 1);
+ var inheritParent = inheritParents[owner];
+ if (inheritParent != undefined) {
+ var types = $("> .types > ol", inheritParent);
+ if (types.length == 0) {
+ inheritParent.append("<div class='types members'><h3>Type Members</h3><ol></ol></div>");
+ types = $("> .types > ol", inheritParent);
+ }
+ var clone = mbr.clone();
+ clone[0].mbrText = this.mbrText;
+ types.append(clone);
+ }
+ var group = mbr.attr("group")
+ var groupParent = groupParents[group];
+ if (groupParent != undefined) {
+ var types = $("> .types > ol", groupParent);
+ if (types.length == 0) {
+ groupParent.append("<div class='types members'><ol></ol></div>");
+ types = $("> .types > ol", groupParent);
+ }
+ var clone = mbr.clone();
+ clone[0].mbrText = this.mbrText;
+ types.append(clone);
+ }
+ });
+
+ $("#values > ol > li").each(function(){
+ var mbr = $(this);
+ this.mbrText = mbr.find("> .fullcomment .cmt").text();
+ var qualName = mbr.attr("name");
+ var owner = qualName.slice(0, qualName.indexOf("#"));
+ var name = qualName.slice(qualName.indexOf("#") + 1);
+ var inheritParent = inheritParents[owner];
+ if (inheritParent != undefined) {
+ var values = $("> .values > ol", inheritParent);
+ if (values.length == 0) {
+ inheritParent.append("<div class='values members'><h3>Value Members</h3><ol></ol></div>");
+ values = $("> .values > ol", inheritParent);
+ }
+ var clone = mbr.clone();
+ clone[0].mbrText = this.mbrText;
+ values.append(clone);
+ }
+ var group = mbr.attr("group")
+ var groupParent = groupParents[group];
+ if (groupParent != undefined) {
+ var values = $("> .values > ol", groupParent);
+ if (values.length == 0) {
+ groupParent.append("<div class='values members'><ol></ol></div>");
+ values = $("> .values > ol", groupParent);
+ }
+ var clone = mbr.clone();
+ clone[0].mbrText = this.mbrText;
+ values.append(clone);
+ }
+ });
+ $("#inheritedMembers > div.parent").each(function() {
+ if ($("> div.members", this).length == 0) { $(this).remove(); };
+ });
+ $("#inheritedMembers > div.conversion").each(function() {
+ if ($("> div.members", this).length == 0) { $(this).remove(); };
+ });
+ $("#groupedMembers > div.group").each(function() {
+ if ($("> div.members", this).length == 0) { $(this).remove(); };
+ });
+};
+
+/* filter used to take boolean scrollToMember */
+function filter() {
+ var query = $.trim($("#textfilter input").val()).toLowerCase();
+ query = query.replace(/[-[\]{}()*+?.,\\^$|#]/g, "\\$&").replace(/\s+/g, "|");
+ var queryRegExp = new RegExp(query, "i");
+ var privateMembersHidden = $("#visbl > ol > li.public").hasClass("in");
+ var orderingAlphabetic = $("#order > ol > li.alpha").hasClass("in");
+ var orderingInheritance = $("#order > ol > li.inherit").hasClass("in");
+ var orderingGroups = $("#order > ol > li.group").hasClass("in");
+ var hiddenSuperclassElementsLinearization = orderingInheritance ? $("#linearization > li:gt(0)") : $("#linearization > li.out");
+ var hiddenSuperclassesLinearization = hiddenSuperclassElementsLinearization.map(function() {
+ return $(this).attr("name");
+ }).get();
+ var hiddenSuperclassElementsImplicits = orderingInheritance ? $("#implicits > li") : $("#implicits > li.out");
+ var hiddenSuperclassesImplicits = hiddenSuperclassElementsImplicits.map(function() {
+ return $(this).attr("name");
+ }).get();
+
+ var hideInheritedMembers;
+
+ if (orderingAlphabetic) {
+ $("#allMembers").show();
+ $("#inheritedMembers").hide();
+ $("#groupedMembers").hide();
+ hideInheritedMembers = true;
+ $("#allMembers > .members").each(filterFunc);
+ } else if (orderingGroups) {
+ $("#groupedMembers").show();
+ $("#inheritedMembers").hide();
+ $("#allMembers").hide();
+ hideInheritedMembers = true;
+ $("#groupedMembers > .group > .members").each(filterFunc);
+ $("#groupedMembers > div.group").each(function() {
+ $(this).show();
+ if ($("> div.members", this).not(":hidden").length == 0) {
+ $(this).hide();
+ } else {
+ $(this).show();
+ }
+ });
+ } else if (orderingInheritance) {
+ $("#inheritedMembers").show();
+ $("#groupedMembers").hide();
+ $("#allMembers").hide();
+ hideInheritedMembers = false;
+ $("#inheritedMembers > .parent > .members").each(filterFunc);
+ $("#inheritedMembers > .conversion > .members").each(filterFunc);
+ }
+
+
+ function filterFunc() {
+ var membersVisible = false;
+ var members = $(this);
+ members.find("> ol > li").each(function() {
+ var mbr = $(this);
+ if (privateMembersHidden && mbr.attr("visbl") == "prt") {
+ mbr.hide();
+ return;
+ }
+ var name = mbr.attr("name");
+ // Owner filtering must not happen in "inherited from" member lists
+ if (hideInheritedMembers) {
+ var ownerIndex = name.indexOf("#");
+ if (ownerIndex < 0) {
+ ownerIndex = name.lastIndexOf(".");
+ }
+ var owner = name.slice(0, ownerIndex);
+ for (var i = 0; i < hiddenSuperclassesLinearization.length; i++) {
+ if (hiddenSuperclassesLinearization[i] == owner) {
+ mbr.hide();
+ return;
+ }
+ };
+ for (var i = 0; i < hiddenSuperclassesImplicits.length; i++) {
+ if (hiddenSuperclassesImplicits[i] == owner) {
+ mbr.hide();
+ return;
+ }
+ };
+ }
+ if (query && !(queryRegExp.test(name) || queryRegExp.test(this.mbrText))) {
+ mbr.hide();
+ return;
+ }
+ mbr.show();
+ membersVisible = true;
+ });
+
+ if (membersVisible)
+ members.show();
+ else
+ members.hide();
+ };
+
+ return false;
+};
+
+function windowTitle()
+{
+ try {
+ parent.document.title=document.title;
+ }
+ catch(e) {
+ // Chrome doesn't allow settings the parent's title when
+ // used on the local file system.
+ }
+};
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/tools.tooltip.js b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/tools.tooltip.js
new file mode 100644
index 0000000000..0af34eca4c
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/tools.tooltip.js
@@ -0,0 +1,14 @@
+/*
+ * tools.tooltip 1.1.3 - Tooltips done right.
+ *
+ * Copyright (c) 2009 Tero Piirainen
+ * http://flowplayer.org/tools/tooltip.html
+ *
+ * Dual licensed under MIT and GPL 2+ licenses
+ * http://www.opensource.org/licenses
+ *
+ * Launch : November 2008
+ * Date: ${date}
+ * Revision: ${revision}
+ */
+(function(c){var d=[];c.tools=c.tools||{};c.tools.tooltip={version:"1.1.3",conf:{effect:"toggle",fadeOutSpeed:"fast",tip:null,predelay:0,delay:30,opacity:1,lazy:undefined,position:["top","center"],offset:[0,0],cancelDefault:true,relative:false,oneInstance:true,events:{def:"mouseover,mouseout",input:"focus,blur",widget:"focus mouseover,blur mouseout",tooltip:"mouseover,mouseout"},api:false},addEffect:function(e,g,f){b[e]=[g,f]}};var b={toggle:[function(e){var f=this.getConf(),g=this.getTip(),h=f.opacity;if(h<1){g.css({opacity:h})}g.show();e.call()},function(e){this.getTip().hide();e.call()}],fade:[function(e){this.getTip().fadeIn(this.getConf().fadeInSpeed,e)},function(e){this.getTip().fadeOut(this.getConf().fadeOutSpeed,e)}]};function a(f,g){var p=this,k=c(this);f.data("tooltip",p);var l=f.next();if(g.tip){l=c(g.tip);if(l.length>1){l=f.nextAll(g.tip).eq(0);if(!l.length){l=f.parent().nextAll(g.tip).eq(0)}}}function o(u){var t=g.relative?f.position().top:f.offset().top,s=g.relative?f.position().left:f.offset().left,v=g.position[0];t-=l.outerHeight()-g.offset[0];s+=f.outerWidth()+g.offset[1];var q=l.outerHeight()+f.outerHeight();if(v=="center"){t+=q/2}if(v=="bottom"){t+=q}v=g.position[1];var r=l.outerWidth()+f.outerWidth();if(v=="center"){s-=r/2}if(v=="left"){s-=r}return{top:t,left:s}}var i=f.is(":input"),e=i&&f.is(":checkbox, :radio, select, :button"),h=f.attr("type"),n=g.events[h]||g.events[i?(e?"widget":"input"):"def"];n=n.split(/,\s*/);if(n.length!=2){throw"Tooltip: bad events configuration for "+h}f.bind(n[0],function(r){if(g.oneInstance){c.each(d,function(){this.hide()})}var q=l.data("trigger");if(q&&q[0]!=this){l.hide().stop(true,true)}r.target=this;p.show(r);n=g.events.tooltip.split(/,\s*/);l.bind(n[0],function(){p.show(r)});if(n[1]){l.bind(n[1],function(){p.hide(r)})}});f.bind(n[1],function(q){p.hide(q)});if(!c.browser.msie&&!i&&!g.predelay){f.mousemove(function(){if(!p.isShown()){f.triggerHandler("mouseover")}})}if(g.opacity<1){l.css("opacity",g.opacity)}var m=0,j=f.attr("title");if(j&&g.cancelDefault){f.removeAttr("title");f.data("title",j)}c.extend(p,{show:function(r){if(r){f=c(r.target)}clearTimeout(l.data("timer"));if(l.is(":animated")||l.is(":visible")){return p}function q(){l.data("trigger",f);var t=o(r);if(g.tip&&j){l.html(f.data("title"))}r=r||c.Event();r.type="onBeforeShow";k.trigger(r,[t]);if(r.isDefaultPrevented()){return p}t=o(r);l.css({position:"absolute",top:t.top,left:t.left});var s=b[g.effect];if(!s){throw'Nonexistent effect "'+g.effect+'"'}s[0].call(p,function(){r.type="onShow";k.trigger(r)})}if(g.predelay){clearTimeout(m);m=setTimeout(q,g.predelay)}else{q()}return p},hide:function(r){clearTimeout(l.data("timer"));clearTimeout(m);if(!l.is(":visible")){return}function q(){r=r||c.Event();r.type="onBeforeHide";k.trigger(r);if(r.isDefaultPrevented()){return}b[g.effect][1].call(p,function(){r.type="onHide";k.trigger(r)})}if(g.delay&&r){l.data("timer",setTimeout(q,g.delay))}else{q()}return p},isShown:function(){return l.is(":visible, :animated")},getConf:function(){return g},getTip:function(){return l},getTrigger:function(){return f},bind:function(q,r){k.bind(q,r);return p},onHide:function(q){return this.bind("onHide",q)},onBeforeShow:function(q){return this.bind("onBeforeShow",q)},onShow:function(q){return this.bind("onShow",q)},onBeforeHide:function(q){return this.bind("onBeforeHide",q)},unbind:function(q){k.unbind(q);return p}});c.each(g,function(q,r){if(c.isFunction(r)){p.bind(q,r)}})}c.prototype.tooltip=function(e){var f=this.eq(typeof e=="number"?e:0).data("tooltip");if(f){return f}var g=c.extend(true,{},c.tools.tooltip.conf);if(c.isFunction(e)){e={onBeforeShow:e}}else{if(typeof e=="string"){e={tip:e}}}e=c.extend(true,g,e);if(typeof e.position=="string"){e.position=e.position.split(/,?\s/)}if(e.lazy!==false&&(e.lazy===true||this.length>20)){this.one("mouseover",function(h){f=new a(c(this),e);f.show(h);d.push(f)})}else{this.each(function(){f=new a(c(this),e);d.push(f)})}return e.api?f:this}})(jQuery); \ No newline at end of file
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait.png
new file mode 100644
index 0000000000..fb961a2eda
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_big.png
new file mode 100644
index 0000000000..625d9251cb
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_diagram.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_diagram.png
new file mode 100644
index 0000000000..88983254ce
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_diagram.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_to_object_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_to_object_big.png
new file mode 100644
index 0000000000..d0cd7fd512
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/trait_to_object_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type.png
new file mode 100644
index 0000000000..6c6e1fe2f5
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_big.png
new file mode 100644
index 0000000000..04c8794e92
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_diagram.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_diagram.png
new file mode 100644
index 0000000000..d8152529fd
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_diagram.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_tags.ai b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_tags.ai
new file mode 100644
index 0000000000..3b5c47c9e3
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_tags.ai
@@ -0,0 +1,6376 @@
+%PDF-1.5 %âãÏÓ
+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 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/">
+ <dc:format>application/pdf</dc:format>
+ <dc:title>
+ <rdf:Alt>
+ <rdf:li xml:lang="x-default">Print</rdf:li>
+ </rdf:Alt>
+ </dc:title>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ 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">
+ <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>
+ </xmp:Thumbnails>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/"
+ xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#">
+ <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>
+ </xmpMM:DerivedFrom>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/">
+ <illustrator:Type>Document</illustrator:Type>
+ <illustrator:StartupProfile>Print</illustrator:StartupProfile>
+ </rdf:Description>
+ <rdf:Description rdf:about=""
+ 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: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>
+ </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.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>
+ </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>
+ </xmpTPg:PlateNames>
+ <xmpTPg:SwatchGroups>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Default Swatch Group</xmpG:groupName>
+ <xmpG:groupType>0</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Print Color Group</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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>
+ </xmpG:Colorants>
+ </rdf:li>
+ <rdf:li rdf:parseType="Resource">
+ <xmpG:groupName>Grayscale</xmpG:groupName>
+ <xmpG:groupType>1</xmpG:groupType>
+ <xmpG:Colorants>
+ <rdf:Seq>
+ <rdf:li rdf:parseType="Resource">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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">
+ <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>
+ </xmpG:Colorants>
+ </rdf:li>
+ </rdf:Seq>
+ </xmpTPg:SwatchGroups>
+ </rdf:Description>
+ </rdf:RDF>
+</x:xmpmeta>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+<?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
+6.607 0.011 12.01 -5.392 11.999 -11.999 c
+12.01 -18.606 6.607 -24.009 0 -23.998 c
+-6.607 -24.009 -12.01 -18.606 -11.999 -11.999 c
+-12.01 -5.392 -6.607 0.011 0 0 c
+f
+Q
+q
+0 g
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+ 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
+0.544 0.003 0.995 -0.445 0.994 -1.003 c
+0.997 -1.549 0.546 -1.999 0 -1.997 c
+-0.55 -2 -1.007 -1.543 -1.003 -1.003 c
+-1.005 -0.451 -0.549 0.003 0 0 c
+f
+Q
+q
+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 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
+6.607 0.011 12.01 -5.392 11.999 -11.999 c
+12.008 -18.614 6.61 -24.008 0 -23.998 c
+-6.61 -24.008 -12.008 -18.614 -11.999 -11.999 c
+-12.01 -5.392 -6.607 0.011 0 0 c
+f
+Q
+q
+0 g
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+ 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
+0.55 0.003 1.007 -0.454 1.003 -0.994 c
+1.008 -1.537 0.543 -2.002 0 -1.997 c
+-0.543 -2.002 -1.008 -1.537 -1.003 -0.994 c
+-1.007 -0.454 -0.55 0.003 0 0 c
+f
+Q
+q
+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 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
+/GS0 gs
+q 1 0 0 1 323.6699 445.7744 cm
+0 0 m
+6.607 0.011 12.01 -5.392 11.999 -11.999 c
+12.01 -18.606 6.607 -24.009 0 -23.998 c
+-6.615 -24.007 -12.009 -18.609 -11.999 -11.999 c
+-12.009 -5.389 -6.615 0.009 0 0 c
+f
+Q
+q
+0 g
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+ 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
+/GS0 gs
+q 1 0 0 1 315.165 487.2754 cm
+0 0 m
+0.548 0.003 1.005 -0.451 1.003 -1.003 c
+1.007 -1.542 0.55 -2 0 -1.997 c
+-0.546 -2 -0.997 -1.549 -0.994 -1.003 c
+-0.995 -0.445 -0.544 0.003 0 0 c
+f
+Q
+q
+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 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
+/GS0 gs
+q 1 0 0 1 184.8359 446.2783 cm
+0 0 m
+6.607 0.011 12.01 -5.392 11.999 -11.999 c
+12.008 -18.617 6.606 -24.018 0 -24.007 c
+-6.606 -24.018 -12.008 -18.617 -11.999 -11.999 c
+-12.01 -5.392 -6.607 0.011 0 0 c
+f
+Q
+q
+0 g
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+ 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
+/GS0 gs
+q 1 0 0 1 189.876 496.0234 cm
+0 0 m
+0.55 0.003 1.007 -0.455 1.003 -0.994 c
+1.005 -1.546 0.548 -2 0 -1.997 c
+-0.548 -2 -1.005 -1.546 -1.003 -0.994 c
+-1.007 -0.455 -0.55 0.003 0 0 c
+f
+Q
+q
+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 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
+193.188 501.023 195.879 498.341 195.879 495.029 c
+195.879 491.708 193.188 489.026 189.876 489.026 c
+186.564 489.026 183.873 491.708 183.873 495.029 c
+183.873 498.341 186.564 501.023 189.876 501.023 c
+189.876 496.023 l
+189.326 496.026 188.869 495.569 188.873 495.029 c
+188.871 494.478 189.328 494.023 189.876 494.026 c
+190.424 494.023 190.881 494.478 190.879 495.029 c
+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
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+Q
+ 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
+/GS0 gs
+q 1 0 0 1 189.876 496.0234 cm
+0 0 m
+0 5 l
+3.312 5 6.003 2.318 6.003 -0.994 c
+6.003 -4.315 3.312 -6.997 0 -6.997 c
+-3.312 -6.997 -6.003 -4.315 -6.003 -0.994 c
+-6.003 2.318 -3.312 5 0 5 c
+0 0 l
+-0.55 0.003 -1.007 -0.455 -1.003 -0.994 c
+-1.005 -1.546 -0.548 -2 0 -1.997 c
+0.548 -2 1.005 -1.546 1.003 -0.994 c
+1.007 -0.455 0.55 0.003 0 0 c
+f
+Q
+q 1 0 0 1 189.876 496.9482 cm
+0 0 m
+-0.013 -0.041 -0.073 -0.074 -0.083 -0.116 c
+-0.111 -0.248 -0.02 -0.426 0 -0.56 c
+0 -0.925 l
+-0.55 -0.922 -1.007 -1.379 -1.003 -1.919 c
+-1.005 -2.471 -0.548 -2.925 0 -2.922 c
+0.548 -2.925 1.005 -2.471 1.003 -1.919 c
+1.007 -1.379 0.55 -0.922 0 -0.925 c
+0 -0.56 l
+0.034 -0.557 0.079 -0.553 0.113 -0.55 c
+0.142 -0.55 0.184 -0.537 0.21 -0.549 c
+1.046 -1.473 l
+1.442 -2.154 1.79 -2.107 1.805 -2.105 c
+2.057 -2.065 3.182 -0.618 1.901 0.191 c
+1.598 0.383 1.274 0.41 1.132 0.395 c
+0 0 l
+0 4.075 l
+3.312 4.075 6.003 1.393 6.003 -1.919 c
+6.003 -5.24 3.312 -7.922 0 -7.922 c
+-3.312 -7.922 -6.003 -5.24 -6.003 -1.919 c
+-6.003 1.393 -3.312 4.075 0 4.075 c
+0 0 l
+f
+Q
+0.196 0.318 0.612 scn
+q 1 0 0 1 189.876 497.0903 cm
+0 0 m
+-0.03 -0.092 -0.164 -0.17 -0.185 -0.265 c
+-0.222 -0.433 -0.125 -0.678 -0.188 -0.838 c
+-0.188 -0.839 -0.237 -0.941 -0.403 -1.05 c
+-1.156 -1.54 -1.044 -2.156 -0.992 -2.333 c
+-0.807 -2.959 -0.146 -3.264 0.451 -2.999 c
+0.651 -2.909 0.79 -2.772 0.872 -2.69 c
+1.143 -2.422 1.548 -2.621 1.836 -2.412 c
+2.433 -1.979 2.576 -1.57 2.629 -1.416 c
+2.85 -0.785 2.461 0.134 1.628 0.371 c
+0.853 0.591 0.002 0.007 0 0 c
+0 3.933 l
+3.312 3.933 6.003 1.251 6.003 -2.061 c
+6.003 -5.382 3.312 -8.064 0 -8.064 c
+-3.312 -8.064 -6.003 -5.382 -6.003 -2.061 c
+-6.003 1.251 -3.312 3.933 0 3.933 c
+0 0 l
+f
+Q
+0.192 0.31 0.596 scn
+q 1 0 0 1 189.876 497.231 cm
+0 0 m
+-0.294 -0.832 -1.296 -1.347 -1.079 -2.407 c
+-0.939 -3.088 -0.171 -3.557 0.648 -3.165 c
+2.592 -2.234 2.592 -2.234 2.763 -1.674 c
+3.159 -0.375 2.125 0.263 1.731 0.384 c
+0.831 0.661 0.003 0.008 0 0 c
+0 3.792 l
+3.312 3.792 6.003 1.11 6.003 -2.202 c
+6.003 -5.522 3.312 -8.205 0 -8.205 c
+-3.312 -8.205 -6.003 -5.522 -6.003 -2.202 c
+-6.003 1.11 -3.312 3.792 0 3.792 c
+0 0 l
+f
+Q
+0.188 0.302 0.58 scn
+q 1 0 0 1 189.876 497.3701 cm
+0 0 m
+-0.353 -0.867 -1.383 -1.429 -1.146 -2.56 c
+-1.024 -3.139 -0.35 -3.806 0.712 -3.399 c
+2.444 -2.735 2.625 -2.666 2.946 -1.778 c
+2.952 -1.763 3.406 -0.235 2.053 0.316 c
+0.838 0.812 0.004 0.01 0 0 c
+0 3.653 l
+3.312 3.653 6.003 0.971 6.003 -2.341 c
+6.003 -5.662 3.312 -8.344 0 -8.344 c
+-3.312 -8.344 -6.003 -5.662 -6.003 -2.341 c
+-6.003 0.971 -3.312 3.653 0 3.653 c
+0 0 l
+f
+Q
+0.18 0.294 0.569 scn
+q 1 0 0 1 189.876 497.5073 cm
+0 0 m
+-0.193 -0.417 -0.585 -0.692 -0.795 -1.098 c
+-1.093 -1.708 l
+-1.262 -2.107 -1.291 -2.435 -1.188 -2.804 c
+-1.126 -3.032 -0.727 -4.136 0.984 -3.565 c
+4.73 -2.315 2.784 0.034 2.453 0.247 c
+1.442 0.896 0.101 0.218 0 0 c
+0 3.516 l
+3.312 3.516 6.003 0.834 6.003 -2.478 c
+6.003 -5.799 3.312 -8.481 0 -8.481 c
+-3.312 -8.481 -6.003 -5.799 -6.003 -2.478 c
+-6.003 0.834 -3.312 3.516 0 3.516 c
+0 0 l
+f
+Q
+0.176 0.286 0.553 scn
+q 1 0 0 1 189.876 497.6602 cm
+0 0 m
+-0.013 -0.025 -0.053 -0.04 -0.076 -0.058 c
+-0.365 -0.276 -0.692 -0.523 -1.173 -1.803 c
+-1.244 -1.989 -1.457 -2.557 -1.185 -3.151 c
+-0.782 -4.034 0.179 -4.205 1.672 -3.658 c
+3.872 -2.853 3.987 -0.377 2.341 0.401 c
+1.366 0.863 0.123 0.247 0 0 c
+0 3.363 l
+3.312 3.363 6.003 0.681 6.003 -2.631 c
+6.003 -5.952 3.312 -8.634 0 -8.634 c
+-3.312 -8.634 -6.003 -5.952 -6.003 -2.631 c
+-6.003 0.681 -3.312 3.363 0 3.363 c
+0 0 l
+f
+Q
+0.173 0.278 0.541 scn
+q 1 0 0 1 189.876 497.8516 cm
+0 0 m
+-0.034 -0.067 -0.142 -0.105 -0.203 -0.15 c
+-0.741 -0.551 -1.014 -1.287 -1.254 -1.937 c
+-1.386 -2.294 -1.492 -2.833 -1.246 -3.37 c
+-0.614 -4.746 1.248 -4.148 1.804 -3.932 c
+4.133 -3.027 4.261 -0.305 2.51 0.419 c
+1.108 0.999 0.006 0.012 0 0 c
+0 3.172 l
+3.312 3.172 6.003 0.49 6.003 -2.822 c
+6.003 -6.143 3.312 -8.825 0 -8.825 c
+-3.312 -8.825 -6.003 -6.143 -6.003 -2.822 c
+-6.003 0.49 -3.312 3.172 0 3.172 c
+0 0 l
+f
+Q
+0.169 0.275 0.525 scn
+q 1 0 0 1 189.876 498.0396 cm
+0 0 m
+-0.037 -0.07 -0.152 -0.104 -0.217 -0.148 c
+-0.223 -0.151 -0.766 -0.542 -1.153 -1.542 c
+-1.498 -2.429 -1.549 -2.937 -1.35 -3.481 c
+-1.145 -4.045 -0.491 -4.904 1.578 -4.323 c
+4.082 -3.621 4.629 -0.761 2.993 0.316 c
+1.701 1.166 0.079 0.148 0 0 c
+0 2.984 l
+3.312 2.984 6.003 0.302 6.003 -3.01 c
+6.003 -6.331 3.312 -9.013 0 -9.013 c
+-3.312 -9.013 -6.003 -6.331 -6.003 -3.01 c
+-6.003 0.302 -3.312 2.984 0 2.984 c
+0 0 l
+f
+Q
+0.165 0.267 0.51 scn
+q 1 0 0 1 189.876 498.2236 cm
+0 0 m
+-0.175 -0.317 -0.542 -0.437 -0.748 -0.722 c
+-1.027 -1.109 -1.128 -1.336 -1.241 -1.614 c
+-1.322 -1.817 -1.715 -2.863 -1.448 -3.592 c
+-0.849 -5.223 1.105 -4.776 1.689 -4.601 c
+4.425 -3.778 5.003 -0.758 3.22 0.385 c
+1.946 1.2 0.234 0.423 0 0 c
+0 2.8 l
+3.312 2.8 6.003 0.118 6.003 -3.194 c
+6.003 -6.515 3.312 -9.197 0 -9.197 c
+-3.312 -9.197 -6.003 -6.515 -6.003 -3.194 c
+-6.003 0.118 -3.312 2.8 0 2.8 c
+0 0 l
+f
+Q
+0.161 0.259 0.498 scn
+q 1 0 0 1 189.876 498.4546 cm
+0 0 m
+-0.06 -0.132 -0.265 -0.21 -0.386 -0.291 c
+-0.759 -0.542 -1.229 -1.473 -1.327 -1.735 c
+-1.444 -2.049 -1.803 -3.137 -1.475 -3.94 c
+-0.715 -5.801 1.956 -4.866 1.983 -4.856 c
+5.297 -3.576 5.172 -0.368 3.116 0.573 c
+1.411 1.354 0.007 0.017 0 0 c
+0 2.569 l
+3.312 2.569 6.003 -0.113 6.003 -3.425 c
+6.003 -6.746 3.312 -9.428 0 -9.428 c
+-3.312 -9.428 -6.003 -6.746 -6.003 -3.425 c
+-6.003 -0.113 -3.312 2.569 0 2.569 c
+0 0 l
+f
+Q
+0.153 0.251 0.482 scn
+q 1 0 0 1 189.876 498.7373 cm
+0 0 m
+-0.04 -0.083 -0.167 -0.135 -0.239 -0.193 c
+-0.737 -0.595 -1.131 -1.172 -1.412 -1.908 c
+-1.719 -2.716 -1.736 -3.696 -1.576 -4.141 c
+-0.861 -6.127 1.881 -5.307 1.908 -5.298 c
+5.872 -3.968 5.348 -0.494 3.424 0.518 c
+1.628 1.463 0.058 0.121 0 0 c
+0 2.286 l
+3.312 2.286 6.003 -0.396 6.003 -3.708 c
+6.003 -7.029 3.312 -9.711 0 -9.711 c
+-3.312 -9.711 -6.003 -7.029 -6.003 -3.708 c
+-6.003 -0.396 -3.312 2.286 0 2.286 c
+0 0 l
+f
+Q
+0.149 0.243 0.467 scn
+q 1 0 0 1 189.876 499.0234 cm
+0 0 m
+-0.045 -0.106 -0.21 -0.167 -0.302 -0.236 c
+-0.488 -0.374 -1.13 -0.939 -1.627 -2.442 c
+-1.764 -2.855 -1.88 -3.934 -1.545 -4.673 c
+-1.028 -5.816 0.793 -6.212 2.513 -5.554 c
+6.321 -4.099 5.738 -0.283 3.153 0.723 c
+1.353 1.423 0.007 0.017 0 0 c
+0 2 l
+3.312 2 6.003 -0.682 6.003 -3.994 c
+6.003 -7.315 3.312 -9.997 0 -9.997 c
+-3.312 -9.997 -6.003 -7.315 -6.003 -3.994 c
+-6.003 -0.682 -3.312 2 0 2 c
+0 0 l
+f
+Q
+0.145 0.235 0.455 scn
+q 1 0 0 1 189.876 499.4067 cm
+0 0 m
+-0.163 -0.362 -0.542 -0.515 -0.779 -0.805 c
+-0.948 -1.011 -1.049 -1.26 -1.205 -1.475 c
+-1.361 -1.69 -1.461 -1.951 -1.723 -2.734 c
+-2.048 -3.705 -1.823 -4.543 -1.66 -4.957 c
+-1.17 -6.199 0.623 -6.718 2.422 -6.139 c
+7.03 -4.656 5.827 -0.75 3.286 0.539 c
+1.422 1.485 0.008 0.018 0 0 c
+0 1.617 l
+3.312 1.617 6.003 -1.065 6.003 -4.377 c
+6.003 -7.698 3.312 -10.38 0 -10.38 c
+-3.312 -10.38 -6.003 -7.698 -6.003 -4.377 c
+-6.003 -1.065 -3.312 1.617 0 1.617 c
+0 0 l
+f
+Q
+0.141 0.227 0.439 scn
+q 1 0 0 1 189.876 499.8311 cm
+0 0 m
+-0.128 -0.296 -0.442 -0.404 -0.638 -0.631 c
+-0.788 -0.804 -0.893 -1.009 -1.031 -1.191 c
+-1.148 -1.346 -1.62 -2.354 -1.623 -2.361 c
+-2.171 -3.896 -2.053 -4.61 -1.842 -5.154 c
+-0.963 -7.425 1.653 -7.025 2.586 -6.68 c
+3.893 -6.196 6.611 -5.189 5.553 -2.521 c
+5.843 -3.224 6.003 -3.994 6.003 -4.802 c
+6.003 -8.123 3.312 -10.805 0 -10.805 c
+-3.312 -10.805 -6.003 -8.123 -6.003 -4.802 c
+-6.003 -1.49 -3.312 1.192 0 1.192 c
+0 0 l
+f
+Q
+0.137 0.22 0.427 scn
+q 1 0 0 1 189.876 500.2959 cm
+0 0 m
+-0.037 -0.078 -0.154 -0.129 -0.22 -0.184 c
+-1.238 -1.037 -1.832 -2.884 -1.837 -2.903 c
+-2.426 -4.762 -2.011 -5.635 -1.875 -5.921 c
+-0.599 -8.601 3.356 -7.148 3.396 -7.133 c
+4.442 -6.725 6.193 -6.042 5.899 -4.15 c
+5.967 -4.512 6.003 -4.885 6.003 -5.267 c
+6.003 -8.587 3.312 -11.27 0 -11.27 c
+-3.312 -11.27 -6.003 -8.587 -6.003 -5.267 c
+-6.003 -1.955 -3.312 0.728 0 0.728 c
+0 0 l
+f
+Q
+0.133 0.216 0.412 scn
+q 1 0 0 1 189.876 500.7388 cm
+0 0 m
+-0.038 -0.067 -0.155 -0.091 -0.221 -0.129 c
+-1.151 -0.674 -1.646 -2.172 -2.007 -3.267 c
+-2.012 -3.284 -2.546 -5.066 -2.073 -6.279 c
+-1.012 -9 2.932 -7.99 3.099 -7.945 c
+4.318 -7.622 5.989 -7.18 6.001 -5.577 c
+6.002 -5.621 6.003 -5.665 6.003 -5.709 c
+6.003 -9.03 3.312 -11.712 0 -11.712 c
+-3.312 -11.712 -6.003 -9.03 -6.003 -5.709 c
+-6.003 -2.397 -3.312 0.285 0 0.285 c
+0 0 l
+f
+Q
+0.125 0.208 0.396 scn
+q 1 0 0 1 189.876 501.0112 cm
+0 0 m
+-0.043 -0.052 -0.154 -0.029 -0.221 -0.042 c
+-0.696 -0.132 -1.348 -0.689 -1.732 -1.731 c
+-2.576 -4.014 -2.459 -5.548 -2.314 -6.26 c
+-1.78 -8.88 1.72 -8.614 1.755 -8.611 c
+4.215 -8.371 5.7 -8.227 5.951 -6.778 c
+5.561 -9.721 3.043 -11.985 0 -11.985 c
+-3.312 -11.985 -6.003 -9.303 -6.003 -5.982 c
+-6.003 -2.67 -3.312 0.012 0 0.012 c
+0 0 l
+f
+Q
+0.122 0.2 0.384 scn
+q 1 0 0 1 188.9707 500.9468 cm
+0 0 m
+-1.737 -0.589 -1.75 -4.504 -1.75 -4.544 c
+-1.745 -7.052 -0.74 -7.832 0.016 -8.2 c
+1.799 -9.068 6.088 -9.359 6.659 -7.635 c
+5.92 -10.116 3.622 -11.92 0.905 -11.92 c
+-2.407 -11.92 -5.098 -9.238 -5.098 -5.917 c
+-5.098 -2.856 -2.799 -0.333 0.165 0.031 c
+0.115 0.022 0.049 0.013 0 0 c
+f
+Q
+0.118 0.192 0.369 scn
+q 1 0 0 1 187.6411 500.5234 cm
+0 0 m
+-1.064 -0.939 -0.813 -4.868 -0.54 -5.601 c
+0.43 -8.206 2.406 -8.584 3.21 -8.625 c
+4.273 -8.681 5.3 -9.068 6.38 -8.967 c
+6.693 -8.938 7.267 -8.802 7.587 -8.217 c
+6.594 -10.165 4.569 -11.497 2.235 -11.497 c
+-1.077 -11.497 -3.768 -8.815 -3.768 -5.494 c
+-3.768 -2.81 -2 -0.54 0.432 0.225 c
+0.372 0.201 0.292 0.168 0.231 0.144 c
+0.162 0.102 0.062 0.054 0 0 c
+f
+Q
+0.204 0.333 0.639 scn
+q 1 0 0 1 191.4565 495.208 cm
+0 0 m
+-0.097 0.069 -0.097 0.069 -0.519 0.587 c
+-0.662 0.762 -0.835 0.91 -0.974 1.089 c
+-1.125 1.285 -1.232 1.593 y
+-1.227 1.612 -0.03 2.438 0.591 1.363 c
+1.026 0.61 0.244 -0.13 0.233 -0.131 c
+0.153 -0.143 0.065 -0.046 0 0 c
+f
+Q
+0.141 0.227 0.439 scn
+q 1 0 0 1 192.4463 500.4146 cm
+0 0 m
+-1.295 0.463 -2.255 -0.325 -2.57 -0.583 c
+-2.57 0.609 l
+-1.402 0.609 -0.312 0.275 0.611 -0.302 c
+0.521 -0.251 0.401 -0.185 0.312 -0.135 c
+0.218 -0.094 0.096 -0.034 0 0 c
+f
+Q
+0.208 0.337 0.655 scn
+q 1 0 0 1 191.4961 495.46 cm
+0 0 m
+-0.335 0.354 l
+-0.472 0.524 -0.626 0.679 -0.757 0.854 c
+-0.976 1.148 -1.021 1.268 -1.02 1.273 c
+-1.015 1.287 -0.029 1.7 0.33 0.953 c
+0.59 0.409 0.174 -0.12 0.167 -0.121 c
+0.106 -0.131 0.048 -0.04 0 0 c
+f
+Q
+0.137 0.22 0.427 scn
+q 1 0 0 1 191.6431 500.7461 cm
+0 0 m
+-0.651 0.121 -1.163 -0.01 -1.767 -0.45 c
+-1.767 0.277 l
+-1.038 0.277 -0.339 0.147 0.307 -0.09 c
+0.224 -0.065 0.112 -0.032 0.029 -0.006 c
+0.02 -0.004 0.009 -0.001 0 0 c
+f
+Q
+0.216 0.345 0.667 scn
+q 1 0 0 1 191.5 495.7261 cm
+0 0 m
+-0.004 0.004 -0.533 0.573 -0.71 0.862 c
+-0.568 0.875 -0.482 0.883 -0.264 0.809 c
+-0.18 0.781 -0.083 0.699 -0.025 0.631 c
+0.033 0.563 0.091 0.45 0.104 0.362 c
+0.135 0.141 0.099 0.019 0.074 -0.062 c
+0.052 -0.043 0.021 -0.021 0 0 c
+f
+Q
+0.133 0.216 0.412 scn
+q 1 0 0 1 190.7813 500.9458 cm
+0 0 m
+-0.314 -0.005 -0.487 -0.009 -0.905 -0.207 c
+-0.905 0.078 l
+-0.519 0.078 -0.142 0.041 0.225 -0.028 c
+0.157 -0.02 0.067 -0.003 0 0 c
+f
+Q
+0.125 0.208 0.396 scn
+q 1 0 0 1 189.876 501.0112 cm
+0 0 m
+0 0.012 l
+0.072 0.012 0.144 0.011 0.215 0.008 c
+0.15 0.006 0.046 -0.044 0 0 c
+f
+Q
+ 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
+200.298 462.278 212.835 449.741 212.835 434.279 c
+212.835 418.809 200.298 406.271 184.836 406.271 c
+169.374 406.271 156.837 418.809 156.837 434.279 c
+156.837 449.741 169.374 462.278 184.836 462.278 c
+184.836 446.278 l
+178.229 446.289 172.826 440.887 172.837 434.279 c
+172.828 427.661 178.229 422.261 184.836 422.271 c
+191.442 422.261 196.844 427.661 196.835 434.279 c
+196.846 440.887 191.443 446.289 184.836 446.278 c
+W n
+q
+/GS0 gs
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+Q
+ 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
+/GS0 gs
+q 1 0 0 1 184.8359 446.2783 cm
+0 0 m
+0 16 l
+15.462 16 27.999 3.463 27.999 -11.999 c
+27.999 -27.47 15.462 -40.007 0 -40.007 c
+-15.462 -40.007 -27.999 -27.47 -27.999 -11.999 c
+-27.999 3.463 -15.462 16 0 16 c
+0 0 l
+-6.607 0.011 -12.01 -5.392 -11.999 -11.999 c
+-12.008 -18.617 -6.606 -24.018 0 -24.007 c
+6.606 -24.018 12.008 -18.617 11.999 -11.999 c
+12.01 -5.392 6.607 0.011 0 0 c
+f
+Q
+q 1 0 0 1 184.8359 451.4419 cm
+0 0 m
+0 -0.468 l
+0 -5.164 l
+-6.607 -5.153 -12.01 -10.555 -11.999 -17.163 c
+-12.008 -23.781 -6.606 -29.181 0 -29.17 c
+6.606 -29.181 12.008 -23.781 11.999 -17.163 c
+12.01 -10.555 6.607 -5.153 0 -5.164 c
+0 -0.468 l
+0.316 -0.694 0.738 -0.997 1.055 -1.223 c
+3.817 -3.661 7.459 -4.869 10 -7.617 c
+12.018 -9.8 13.458 -12.461 14.279 -15.528 c
+15.076 -18.507 16.901 -19.346 16.917 -19.348 c
+18.874 -19.542 24.735 -10.485 17.857 -2.241 c
+10.879 6.124 0.769 1.958 0 0 c
+0 10.836 l
+15.462 10.836 27.999 -1.701 27.999 -17.163 c
+27.999 -32.633 15.462 -45.17 0 -45.17 c
+-15.462 -45.17 -27.999 -32.633 -27.999 -17.163 c
+-27.999 -1.701 -15.462 10.836 0 10.836 c
+0 0 l
+f
+Q
+0.204 0.333 0.639 scn
+q 1 0 0 1 184.8359 453.2891 cm
+0 0 m
+-0.296 -0.712 -1.487 -1.168 -1.735 -1.898 c
+-1.987 -2.638 -2.003 -3.873 -1.53 -4.494 c
+-1.227 -4.893 -0.45 -4.945 0 -5.167 c
+0 -7.011 l
+-6.607 -7 -12.01 -12.402 -11.999 -19.01 c
+-12.008 -25.628 -6.606 -31.028 0 -31.018 c
+6.606 -31.028 12.008 -25.628 11.999 -19.01 c
+12.01 -12.402 6.607 -7 0 -7.011 c
+0 -5.167 l
+0.338 -5.201 0.788 -5.245 1.126 -5.278 c
+2.249 -5.476 12.144 -7.557 13.761 -19.538 c
+13.765 -19.565 14.171 -22.516 14.171 -22.516 c
+14.636 -23.09 15.724 -23.507 16.459 -23.43 c
+20.584 -22.993 26.416 -9.568 15.896 -1.312 c
+7.943 4.929 0.035 0.084 0 0 c
+0 8.989 l
+15.462 8.989 27.999 -3.548 27.999 -19.01 c
+27.999 -34.48 15.462 -47.018 0 -47.018 c
+-15.462 -47.018 -27.999 -34.48 -27.999 -19.01 c
+-27.999 -3.548 -15.462 8.989 0 8.989 c
+0 0 l
+f
+Q
+0.2 0.325 0.624 scn
+q 1 0 0 1 184.8359 454.4082 cm
+0 0 m
+-0.627 -1.109 -1.866 -1.525 -2.708 -2.391 c
+-4.764 -4.503 -4.447 -6.209 -4.44 -6.223 c
+-4.355 -6.386 -4.355 -6.386 0 -7.408 c
+0 -8.13 l
+-6.607 -8.119 -12.01 -13.521 -11.999 -20.129 c
+-12.008 -26.747 -6.606 -32.147 0 -32.137 c
+6.606 -32.147 12.008 -26.747 11.999 -20.129 c
+12.01 -13.521 6.607 -8.119 0 -8.13 c
+0 -7.408 l
+0.312 -7.428 0.727 -7.455 1.039 -7.475 c
+5.587 -8.118 13.156 -12.018 12.674 -22.551 c
+12.559 -25.065 12.662 -26.483 12.98 -26.764 c
+14.309 -27.938 23.357 -23.699 22.629 -14.042 c
+21.269 4.004 1.142 2.019 0 0 c
+0 7.87 l
+15.462 7.87 27.999 -4.667 27.999 -20.129 c
+27.999 -35.6 15.462 -48.137 0 -48.137 c
+-15.462 -48.137 -27.999 -35.6 -27.999 -20.129 c
+-27.999 -4.667 -15.462 7.87 0 7.87 c
+0 0 l
+f
+Q
+0.196 0.318 0.612 scn
+q 1 0 0 1 184.8359 455.3335 cm
+0 0 m
+-0.223 -0.377 -0.896 -0.494 -1.279 -0.706 c
+-3.984 -2.198 -4.352 -2.882 -7.218 -8.204 c
+-10.977 -15.407 l
+-12.034 -17.649 -12.409 -19.973 -12.123 -22.512 c
+-11.368 -29.209 -4.441 -35.048 3.701 -32.84 c
+16.505 -28.457 l
+19.639 -26.39 21.523 -23.894 22.614 -20.364 c
+24.61 -13.907 21.812 -4.74 13.674 -0.575 c
+6.26 3.219 0.029 0.049 0 0 c
+0 6.945 l
+15.462 6.945 27.999 -5.592 27.999 -21.054 c
+27.999 -36.525 15.462 -49.062 0 -49.062 c
+-15.462 -49.062 -27.999 -36.525 -27.999 -21.054 c
+-27.999 -5.592 -15.462 6.945 0 6.945 c
+0 0 l
+f
+Q
+0.192 0.31 0.596 scn
+q 1 0 0 1 184.8359 456.1333 cm
+0 0 m
+-0.174 -0.267 -0.682 -0.3 -0.974 -0.428 c
+-3.27 -1.438 -6.363 -4.313 -7.593 -6.58 c
+-13.39 -17.263 -12.999 -20.654 -12.686 -23.38 c
+-12.044 -28.948 -6.307 -36.34 3.975 -34.525 c
+32.478 -29.493 24.483 -7.887 15.417 -1.844 c
+7.621 3.352 0.038 0.059 0 0 c
+0 6.145 l
+15.462 6.145 27.999 -6.392 27.999 -21.854 c
+27.999 -37.325 15.462 -49.862 0 -49.862 c
+-15.462 -49.862 -27.999 -37.325 -27.999 -21.854 c
+-27.999 -6.392 -15.462 6.145 0 6.145 c
+0 0 l
+f
+Q
+0.188 0.302 0.58 scn
+q 1 0 0 1 184.8359 456.834 cm
+0 0 m
+-0.26 -0.393 -1.01 -0.429 -1.443 -0.612 c
+-4.281 -1.817 -7.531 -4.969 -9.346 -8.278 c
+-13.498 -15.848 -13.757 -21.086 -13.243 -24.147 c
+-12.335 -29.562 -7.257 -38.122 6.017 -35.862 c
+29.657 -31.837 27.572 -10.232 15.691 -2.188 c
+7.725 3.206 0.039 0.058 0 0 c
+0 5.444 l
+15.462 5.444 27.999 -7.093 27.999 -22.555 c
+27.999 -38.025 15.462 -50.563 0 -50.563 c
+-15.462 -50.563 -27.999 -38.025 -27.999 -22.555 c
+-27.999 -7.093 -15.462 5.444 0 5.444 c
+0 0 l
+f
+Q
+0.18 0.294 0.569 scn
+q 1 0 0 1 184.8359 457.5 cm
+0 0 m
+-0.27 -0.397 -1.042 -0.411 -1.488 -0.586 c
+-3.111 -1.225 -7.25 -3.37 -10.633 -9.471 c
+-11.685 -11.368 -15.021 -18.085 -13.796 -24.879 c
+-12.453 -32.328 -5.461 -39.37 6.714 -37.227 c
+28.951 -33.313 28.976 -11.259 15.609 -2.301 c
+7.856 2.895 0.038 0.056 0 0 c
+0 4.778 l
+15.462 4.778 27.999 -7.759 27.999 -23.221 c
+27.999 -38.691 15.462 -51.229 0 -51.229 c
+-15.462 -51.229 -27.999 -38.691 -27.999 -23.221 c
+-27.999 -7.759 -15.462 4.778 0 4.778 c
+0 0 l
+f
+Q
+0.176 0.286 0.553 scn
+q 1 0 0 1 184.8359 458.1108 cm
+0 0 m
+-0.285 -0.403 -1.085 -0.384 -1.55 -0.549 c
+-2.14 -0.758 -7.426 -2.783 -11.14 -9.4 c
+-12.536 -11.888 -15.643 -18.441 -14.343 -25.555 c
+-13.275 -31.4 -7.567 -40.72 7.05 -38.576 c
+28.069 -35.492 30.907 -13.131 16.17 -2.838 c
+7.979 2.883 0.04 0.057 0 0 c
+0 4.167 l
+15.462 4.167 27.999 -8.37 27.999 -23.832 c
+27.999 -39.302 15.462 -51.839 0 -51.839 c
+-15.462 -51.839 -27.999 -39.302 -27.999 -23.832 c
+-27.999 -8.37 -15.462 4.167 0 4.167 c
+0 0 l
+f
+Q
+0.173 0.278 0.541 scn
+q 1 0 0 1 184.8359 458.6836 cm
+0 0 m
+-0.294 -0.407 -1.113 -0.365 -1.59 -0.521 c
+-3.037 -0.996 -8.057 -3.068 -11.887 -9.807 c
+-12.95 -11.676 -16.305 -18.381 -14.886 -26.192 c
+-13.691 -32.767 -6.813 -41.832 7.241 -39.858 c
+28.692 -36.845 31.476 -13.851 16.374 -3.144 c
+8.08 2.736 0.041 0.056 0 0 c
+0 3.595 l
+15.462 3.595 27.999 -8.942 27.999 -24.404 c
+27.999 -39.875 15.462 -52.412 0 -52.412 c
+-15.462 -52.412 -27.999 -39.875 -27.999 -24.404 c
+-27.999 -8.942 -15.462 3.595 0 3.595 c
+0 0 l
+f
+Q
+0.169 0.275 0.525 scn
+q 1 0 0 1 184.8359 459.2207 cm
+0 0 m
+-0.327 -0.44 -1.224 -0.37 -1.749 -0.528 c
+-5.52 -1.667 -9.766 -5.26 -12.073 -9.267 c
+-15.394 -15.036 -16.522 -20.933 -15.426 -26.792 c
+-13.856 -35.181 -5.227 -43.019 7.675 -41.021 c
+29.387 -37.659 31.678 -13.959 16.092 -3.122 c
+8.188 2.374 0.041 0.052 0 0 c
+0 3.058 l
+15.462 3.058 27.999 -9.479 27.999 -24.941 c
+27.999 -40.412 15.462 -52.949 0 -52.949 c
+-15.462 -52.949 -27.999 -40.412 -27.999 -24.941 c
+-27.999 -9.479 -15.462 3.058 0 3.058 c
+0 0 l
+f
+Q
+0.165 0.267 0.51 scn
+q 1 0 0 1 184.8359 459.7354 cm
+0 0 m
+-0.315 -0.413 -1.169 -0.321 -1.671 -0.458 c
+-5.628 -1.543 -10.186 -5.222 -12.509 -9.206 c
+-13.794 -11.411 -17.706 -18.119 -15.958 -27.37 c
+-14.312 -36.089 -5.369 -44.235 7.962 -42.157 c
+29.829 -38.748 32.261 -15.07 16.713 -3.752 c
+8.241 2.415 0.041 0.054 0 0 c
+0 2.543 l
+15.462 2.543 27.999 -9.994 27.999 -25.456 c
+27.999 -40.927 15.462 -53.464 0 -53.464 c
+-15.462 -53.464 -27.999 -40.927 -27.999 -25.456 c
+-27.999 -9.994 -15.462 2.543 0 2.543 c
+0 0 l
+f
+Q
+0.161 0.259 0.498 scn
+q 1 0 0 1 184.8359 460.208 cm
+0 0 m
+-0.326 -0.417 -1.197 -0.297 -1.71 -0.424 c
+-5.005 -1.241 -10.022 -4.174 -13.317 -9.752 c
+-16.642 -15.38 -17.707 -21.488 -16.484 -27.905 c
+-14.771 -36.893 -5.522 -45.319 8.241 -43.229 c
+29.819 -39.954 32.248 -15.425 16.845 -4.05 c
+8.507 2.107 0.042 0.053 0 0 c
+0 2.07 l
+15.462 2.07 27.999 -10.467 27.999 -25.929 c
+27.999 -41.399 15.462 -53.937 0 -53.937 c
+-15.462 -53.937 -27.999 -41.399 -27.999 -25.929 c
+-27.999 -10.467 -15.462 2.07 0 2.07 c
+0 0 l
+f
+Q
+0.153 0.251 0.482 scn
+q 1 0 0 1 184.8359 460.6479 cm
+0 0 m
+-0.165 -0.201 -0.596 -0.119 -0.852 -0.169 c
+-6.63 -1.321 -11.086 -5.48 -13.33 -8.99 c
+-17.823 -16.018 -17.959 -22.68 -17.283 -27.032 c
+-15.528 -38.313 -5.353 -45.642 6.913 -44.456 c
+29.058 -42.316 33.217 -18.568 18.588 -5.674 c
+9.722 2.142 0.051 0.062 0 0 c
+0 1.63 l
+15.462 1.63 27.999 -10.907 27.999 -26.369 c
+27.999 -41.839 15.462 -54.376 0 -54.376 c
+-15.462 -54.376 -27.999 -41.839 -27.999 -26.369 c
+-27.999 -10.907 -15.462 1.63 0 1.63 c
+0 0 l
+f
+Q
+0.149 0.243 0.467 scn
+q 1 0 0 1 184.8359 461.0591 cm
+0 0 m
+-0.345 -0.419 -1.243 -0.245 -1.775 -0.35 c
+-5.333 -1.052 -10.598 -4.013 -13.752 -8.857 c
+-18.474 -16.108 -18.606 -22.979 -17.885 -27.466 c
+-16.272 -37.507 -7.1 -46.929 7.31 -45.507 c
+29.58 -43.31 33.524 -19.12 18.666 -5.999 c
+9.679 1.938 0.05 0.061 0 0 c
+0 1.219 l
+15.462 1.219 27.999 -11.318 27.999 -26.78 c
+27.999 -42.25 15.462 -54.788 0 -54.788 c
+-15.462 -54.788 -27.999 -42.25 -27.999 -26.78 c
+-27.999 -11.318 -15.462 1.219 0 1.219 c
+0 0 l
+f
+Q
+0.145 0.235 0.455 scn
+q 1 0 0 1 184.8359 461.4141 cm
+0 0 m
+-0.359 -0.424 -1.279 -0.213 -1.827 -0.305 c
+-2.571 -0.429 -9.239 -1.713 -14.035 -8.521 c
+-19.337 -16.049 -19.04 -23.602 -18.666 -26.5 c
+-16.79 -41.041 -4.557 -47.127 6.015 -46.629 c
+29.242 -45.535 34.043 -19.97 18.705 -6.311 c
+9.693 1.714 0.05 0.059 0 0 c
+0 0.864 l
+15.462 0.864 27.999 -11.673 27.999 -27.135 c
+27.999 -42.605 15.462 -55.143 0 -55.143 c
+-15.462 -55.143 -27.999 -42.605 -27.999 -27.135 c
+-27.999 -11.673 -15.462 0.864 0 0.864 c
+0 0 l
+f
+Q
+0.141 0.227 0.439 scn
+q 1 0 0 1 184.8359 461.7397 cm
+0 0 m
+-0.366 -0.422 -1.29 -0.183 -1.842 -0.262 c
+-5.616 -0.798 -11.203 -3.577 -14.553 -8.414 c
+-20.526 -17.037 -19.484 -25.015 -19.142 -27.636 c
+-17.325 -41.551 -4.721 -48.305 6.215 -47.597 c
+22.827 -46.52 31.839 -32.415 25.896 -16.796 c
+27.251 -20.083 27.999 -23.685 27.999 -27.46 c
+27.999 -42.931 15.462 -55.468 0 -55.468 c
+-15.462 -55.468 -27.999 -42.931 -27.999 -27.46 c
+-27.999 -11.999 -15.462 0.539 0 0.539 c
+0 0 l
+f
+Q
+0.137 0.22 0.427 scn
+q 1 0 0 1 184.8359 461.9951 cm
+0 0 m
+-0.38 -0.425 -1.322 -0.147 -1.889 -0.211 c
+-3.74 -0.417 -10.183 -1.633 -15.334 -8.604 c
+-20.12 -15.08 -20.496 -23.225 -19.964 -27.016 c
+-18.071 -40.504 -7.311 -49.146 6.811 -48.521 c
+13.567 -48.222 30.459 -42.962 27.513 -22.495 c
+27.832 -24.187 27.999 -25.932 27.999 -27.716 c
+27.999 -43.187 15.462 -55.724 0 -55.724 c
+-15.462 -55.724 -27.999 -43.187 -27.999 -27.716 c
+-27.999 -12.254 -15.462 0.283 0 0.283 c
+0 0 l
+f
+Q
+0.133 0.216 0.412 scn
+q 1 0 0 1 184.8359 462.186 cm
+0 0 m
+-0.389 -0.421 -1.333 -0.109 -1.905 -0.156 c
+-5.862 -0.48 -11.762 -2.986 -15.367 -7.721 c
+-21.456 -15.72 -21.121 -23.999 -20.694 -27.186 c
+-18.877 -40.772 -7.134 -50.361 6.621 -49.493 c
+16.365 -48.877 27.809 -42.692 27.992 -27.284 c
+27.997 -27.491 27.999 -27.699 27.999 -27.907 c
+27.999 -43.377 15.462 -55.915 0 -55.915 c
+-15.462 -55.915 -27.999 -43.377 -27.999 -27.907 c
+-27.999 -12.445 -15.462 0.092 0 0.092 c
+0 0 l
+f
+Q
+0.125 0.208 0.396 scn
+q 1 0 0 1 184.8359 462.2749 cm
+0 0 m
+-0.403 -0.423 -1.362 -0.067 -1.945 -0.096 c
+-5.653 -0.278 -11.171 -1.795 -16.407 -7.987 c
+-19.42 -11.549 -22.258 -18.906 -21.583 -25.522 c
+-19.025 -50.599 4.157 -50.427 5.143 -50.408 c
+17.394 -50.165 25.848 -43.174 27.755 -31.708 c
+25.94 -45.423 14.204 -56.003 0 -56.003 c
+-15.462 -56.003 -27.999 -43.466 -27.999 -27.996 c
+-27.999 -12.534 -15.462 0.003 0 0.003 c
+0 0 l
+f
+Q
+0.122 0.2 0.384 scn
+q 1 0 0 1 180.605 461.958 cm
+0 0 m
+-22.531 -4.551 -23.529 -35.032 -6.329 -46.266 c
+6.848 -54.872 25.64 -52.177 31.068 -35.689 c
+27.624 -47.255 16.911 -55.687 4.231 -55.687 c
+-11.231 -55.687 -23.768 -43.149 -23.768 -27.679 c
+-23.768 -13.386 -13.055 -1.592 0.778 0.109 c
+0.544 0.077 0.232 0.04 0 0 c
+f
+Q
+0.118 0.192 0.369 scn
+q 1 0 0 1 172.812 459.498 cm
+0 0 m
+-16.566 -9.064 -17.348 -40.201 9.316 -48.722 c
+16.64 -51.062 30.628 -50.199 36.986 -37.919 c
+32.357 -47.005 22.916 -53.227 12.024 -53.227 c
+-3.438 -53.227 -15.975 -40.689 -15.975 -25.219 c
+-15.975 -12.683 -7.734 -2.069 3.625 1.499 c
+3.1 1.309 2.399 1.057 1.873 0.867 c
+1.31 0.61 0.543 0.297 0 0 c
+f
+Q
+0.216 0.345 0.667 scn
+q 1 0 0 1 200.7622 436.103 cm
+0 0 m
+-1.706 2.422 -2.871 5.192 -4.806 7.466 c
+-5.581 8.375 -6.334 9.141 -7.046 9.74 c
+-7.103 9.788 -12.699 14.577 -12.706 14.929 c
+-12.708 15.035 -10.925 16.753 -10.74 16.825 c
+-10.058 17.086 -7.544 17.231 -6.875 17.166 c
+-5.111 16.992 -2.438 16.241 0.275 13.649 c
+3.79 10.293 4.269 6.382 4.332 5.263 c
+4.608 0.362 1.816 -1.552 1.125 -1.426 c
+0.589 -1.328 0.314 -0.445 0 0 c
+f
+Q
+0.22 0.353 0.682 scn
+q 1 0 0 1 200.8965 438.5967 cm
+0 0 m
+-1.97 2.883 -3.056 4.472 -4.87 6.595 c
+-5.072 6.832 -5.375 7.116 -5.591 7.34 c
+-5.844 7.601 -6.16 7.969 -6.419 8.224 c
+-6.913 8.711 -7.551 9.382 -8.074 9.839 c
+-9.724 11.281 -9.908 11.547 -9.911 11.595 c
+-9.914 11.655 -8.389 13.369 -8.295 13.411 c
+-7.711 13.674 -6.801 13.346 -6.164 13.276 c
+-2.962 12.927 -1.156 11.212 -0.476 10.566 c
+2.531 7.709 2.783 5.143 2.904 3.909 c
+2.938 3.565 2.929 0.875 2.709 0.41 c
+2.675 0.337 0.707 -0.875 0.645 -0.861 c
+0.33 -0.793 0.182 -0.267 0 0 c
+f
+Q
+0.224 0.361 0.694 scn
+q 1 0 0 1 199.9814 442.126 cm
+0 0 m
+-0.737 0.235 -1.076 1.45 -1.576 2.04 c
+-3.148 3.895 -3.148 3.895 -3.897 4.678 c
+-4.212 5.008 -4.84 5.354 -4.922 5.803 c
+-4.014 7.981 l
+-3.953 8.007 -1.427 7.15 0.33 5.083 c
+1.631 3.552 2.397 0.755 2.281 0.574 c
+1.906 -0.01 0.699 -0.197 0.037 0.011 c
+0.026 0.014 0.011 -0.003 0 0 c
+f
+Q
+0.141 0.227 0.439 scn
+q 1 0 0 1 196.8853 459.5508 cm
+0 0 m
+-5.275 2.417 -9.403 2.407 -12.049 2.189 c
+-12.049 2.728 l
+-6.604 2.728 -1.522 1.173 2.777 -1.517 c
+2.232 -1.205 1.506 -0.789 0.961 -0.477 c
+0.673 -0.334 0.292 -0.134 0 0 c
+f
+Q
+0.137 0.22 0.427 scn
+q 1 0 0 1 193.0991 461.0352 cm
+0 0 m
+-3.078 0.794 -4.478 1.111 -8.263 0.96 c
+-8.263 1.243 l
+-4.866 1.243 -1.61 0.638 1.402 -0.47 c
+0.981 -0.329 0.425 -0.126 0 0 c
+f
+Q
+0.133 0.216 0.412 scn
+q 1 0 0 1 189.0669 461.958 cm
+0 0 m
+-2.557 0.263 -2.657 0.273 -4.231 0.228 c
+-4.231 0.32 l
+-2.431 0.32 -0.671 0.15 1.035 -0.174 c
+0.724 -0.122 0.312 -0.042 0 0 c
+f
+Q
+0.125 0.208 0.396 scn
+q 1 0 0 1 184.8359 462.2749 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 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
+318.477 492.275 321.168 489.593 321.168 486.272 c
+321.168 482.96 318.477 480.278 315.165 480.278 c
+311.853 480.278 309.171 482.96 309.171 486.272 c
+309.171 489.593 311.853 492.275 315.165 492.275 c
+315.165 487.275 l
+314.621 487.278 314.17 486.83 314.171 486.272 c
+314.168 485.727 314.619 485.276 315.165 485.278 c
+315.715 485.275 316.172 485.733 316.168 486.272 c
+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
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+Q
+ 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
+/GS0 gs
+q 1 0 0 1 315.165 487.2754 cm
+0 0 m
+0 5 l
+3.312 5 6.003 2.318 6.003 -1.003 c
+6.003 -4.315 3.312 -6.997 0 -6.997 c
+-3.312 -6.997 -5.994 -4.315 -5.994 -1.003 c
+-5.994 2.318 -3.312 5 0 5 c
+0 0 l
+-0.544 0.003 -0.995 -0.445 -0.994 -1.003 c
+-0.997 -1.549 -0.546 -2 0 -1.997 c
+0.55 -2 1.007 -1.542 1.003 -1.003 c
+1.005 -0.451 0.548 0.003 0 0 c
+f
+Q
+q 1 0 0 1 315.165 488.1997 cm
+0 0 m
+-0.013 -0.041 -0.073 -0.074 -0.082 -0.115 c
+-0.11 -0.248 -0.02 -0.425 0 -0.559 c
+0 -0.924 l
+-0.544 -0.921 -0.995 -1.37 -0.994 -1.927 c
+-0.997 -2.473 -0.546 -2.924 0 -2.921 c
+0.55 -2.924 1.007 -2.467 1.003 -1.927 c
+1.005 -1.375 0.548 -0.921 0 -0.924 c
+0 -0.559 l
+0.034 -0.556 0.079 -0.552 0.113 -0.549 c
+0.142 -0.549 0.183 -0.536 0.209 -0.548 c
+1.045 -1.475 l
+1.44 -2.16 1.79 -2.114 1.805 -2.112 c
+2.058 -2.072 3.187 -0.623 1.901 0.191 c
+1.597 0.384 1.274 0.411 1.13 0.396 c
+0 0 l
+0 4.076 l
+3.312 4.076 6.003 1.394 6.003 -1.927 c
+6.003 -5.239 3.312 -7.921 0 -7.921 c
+-3.312 -7.921 -5.994 -5.239 -5.994 -1.927 c
+-5.994 1.394 -3.312 4.076 0 4.076 c
+0 0 l
+f
+Q
+0.196 0.318 0.612 scn
+q 1 0 0 1 315.165 488.3418 cm
+0 0 m
+-0.03 -0.092 -0.163 -0.17 -0.184 -0.265 c
+-0.221 -0.432 -0.125 -0.677 -0.186 -0.837 c
+-0.186 -0.838 -0.235 -0.941 -0.399 -1.048 c
+-1.15 -1.539 -1.036 -2.16 -0.983 -2.339 c
+-0.8 -2.96 -0.143 -3.262 0.452 -2.998 c
+0.652 -2.908 0.791 -2.771 0.873 -2.69 c
+1.144 -2.423 1.548 -2.625 1.836 -2.417 c
+2.431 -1.985 2.564 -1.604 2.628 -1.42 c
+2.85 -0.787 2.46 0.134 1.627 0.371 c
+0.853 0.592 0.002 0.008 0 0 c
+0 3.934 l
+3.312 3.934 6.003 1.251 6.003 -2.069 c
+6.003 -5.381 3.312 -8.063 0 -8.063 c
+-3.312 -8.063 -5.994 -5.381 -5.994 -2.069 c
+-5.994 1.251 -3.312 3.934 0 3.934 c
+0 0 l
+f
+Q
+0.192 0.31 0.596 scn
+q 1 0 0 1 315.165 488.4824 cm
+0 0 m
+-0.294 -0.832 -1.287 -1.354 -1.07 -2.414 c
+-0.931 -3.09 -0.167 -3.555 0.649 -3.164 c
+1.049 -2.972 1.516 -2.957 1.889 -2.695 c
+2.243 -2.445 2.625 -2.13 2.762 -1.679 c
+3.159 -0.375 2.125 0.264 1.73 0.385 c
+0.831 0.662 0.003 0.008 0 0 c
+0 3.793 l
+3.312 3.793 6.003 1.111 6.003 -2.21 c
+6.003 -5.522 3.312 -8.204 0 -8.204 c
+-3.312 -8.204 -5.994 -5.522 -5.994 -2.21 c
+-5.994 1.111 -3.312 3.793 0 3.793 c
+0 0 l
+f
+Q
+0.188 0.302 0.58 scn
+q 1 0 0 1 315.165 488.6216 cm
+0 0 m
+-0.352 -0.867 -1.375 -1.438 -1.138 -2.566 c
+-1.017 -3.142 -0.345 -3.804 0.713 -3.398 c
+2.483 -2.719 2.628 -2.663 2.945 -1.783 c
+2.951 -1.768 3.406 -0.235 2.053 0.317 c
+0.863 0.802 0.004 0.01 0 0 c
+0 3.654 l
+3.312 3.654 6.003 0.972 6.003 -2.349 c
+6.003 -5.661 3.312 -8.343 0 -8.343 c
+-3.312 -8.343 -5.994 -5.661 -5.994 -2.349 c
+-5.994 0.972 -3.312 3.654 0 3.654 c
+0 0 l
+f
+Q
+0.18 0.294 0.569 scn
+q 1 0 0 1 315.165 488.7588 cm
+0 0 m
+-0.192 -0.416 -0.582 -0.691 -0.789 -1.097 c
+-0.793 -1.105 -1.082 -1.703 -1.083 -1.706 c
+-1.253 -2.111 -1.282 -2.441 -1.181 -2.81 c
+-1.118 -3.036 -0.72 -4.135 0.985 -3.564 c
+5.022 -2.213 2.486 0.225 2.452 0.247 c
+1.442 0.897 0.101 0.219 0 0 c
+0 3.517 l
+3.312 3.517 6.003 0.834 6.003 -2.486 c
+6.003 -5.798 3.312 -8.48 0 -8.48 c
+-3.312 -8.48 -5.994 -5.798 -5.994 -2.486 c
+-5.994 0.834 -3.312 3.517 0 3.517 c
+0 0 l
+f
+Q
+0.176 0.286 0.553 scn
+q 1 0 0 1 315.165 488.9116 cm
+0 0 m
+-0.013 -0.025 -0.053 -0.04 -0.076 -0.057 c
+-0.432 -0.327 -0.719 -0.611 -1.164 -1.801 c
+-1.234 -1.99 -1.448 -2.564 -1.178 -3.156 c
+-0.778 -4.031 0.18 -4.2 1.671 -3.658 c
+3.876 -2.856 3.991 -0.38 2.341 0.402 c
+1.366 0.864 0.123 0.248 0 0 c
+0 3.364 l
+3.312 3.364 6.003 0.682 6.003 -2.639 c
+6.003 -5.951 3.312 -8.633 0 -8.633 c
+-3.312 -8.633 -5.994 -5.951 -5.994 -2.639 c
+-5.994 0.682 -3.312 3.364 0 3.364 c
+0 0 l
+f
+Q
+0.173 0.278 0.541 scn
+q 1 0 0 1 315.165 489.1035 cm
+0 0 m
+-0.034 -0.068 -0.142 -0.105 -0.202 -0.15 c
+-0.734 -0.546 -0.993 -1.253 -1.244 -1.936 c
+-1.353 -2.232 -1.496 -2.812 -1.238 -3.374 c
+-0.612 -4.739 1.248 -4.146 1.803 -3.932 c
+4.138 -3.031 4.265 -0.308 2.51 0.419 c
+1.108 1 0.006 0.012 0 0 c
+0 3.172 l
+3.312 3.172 6.003 0.49 6.003 -2.831 c
+6.003 -6.143 3.312 -8.825 0 -8.825 c
+-3.312 -8.825 -5.994 -6.143 -5.994 -2.831 c
+-5.994 0.49 -3.312 3.172 0 3.172 c
+0 0 l
+f
+Q
+0.169 0.275 0.525 scn
+q 1 0 0 1 315.165 489.291 cm
+0 0 m
+-0.037 -0.069 -0.152 -0.103 -0.217 -0.147 c
+-0.48 -0.327 -0.918 -0.951 -1.084 -1.383 c
+-1.402 -2.209 -1.592 -2.802 -1.342 -3.486 c
+-1.138 -4.046 -0.487 -4.899 1.578 -4.322 c
+4.081 -3.623 4.628 -0.763 2.992 0.316 c
+1.701 1.167 0.079 0.149 0 0 c
+0 2.984 l
+3.312 2.984 6.003 0.302 6.003 -3.019 c
+6.003 -6.331 3.312 -9.013 0 -9.013 c
+-3.312 -9.013 -5.994 -6.331 -5.994 -3.019 c
+-5.994 0.302 -3.312 2.984 0 2.984 c
+0 0 l
+f
+Q
+0.165 0.267 0.51 scn
+q 1 0 0 1 315.165 489.4751 cm
+0 0 m
+-0.175 -0.316 -0.541 -0.436 -0.745 -0.721 c
+-1.04 -1.133 -1.134 -1.367 -1.233 -1.614 c
+-1.283 -1.739 -1.712 -2.854 -1.439 -3.598 c
+-0.844 -5.219 1.105 -4.774 1.689 -4.6 c
+4.424 -3.78 5.002 -0.76 3.22 0.385 c
+1.946 1.202 0.234 0.424 0 0 c
+0 2.8 l
+3.312 2.8 6.003 0.118 6.003 -3.203 c
+6.003 -6.515 3.312 -9.197 0 -9.197 c
+-3.312 -9.197 -5.994 -6.515 -5.994 -3.203 c
+-5.994 0.118 -3.312 2.8 0 2.8 c
+0 0 l
+f
+Q
+0.161 0.259 0.498 scn
+q 1 0 0 1 315.165 489.7065 cm
+0 0 m
+-0.06 -0.132 -0.265 -0.21 -0.385 -0.291 c
+-0.751 -0.537 -1.207 -1.436 -1.319 -1.735 c
+-1.402 -1.96 -1.802 -3.124 -1.467 -3.945 c
+-0.712 -5.795 1.956 -4.866 1.982 -4.855 c
+5.299 -3.58 5.174 -0.371 3.116 0.573 c
+1.411 1.355 0.007 0.017 0 0 c
+0 2.569 l
+3.312 2.569 6.003 -0.113 6.003 -3.434 c
+6.003 -6.746 3.312 -9.428 0 -9.428 c
+-3.312 -9.428 -5.994 -6.746 -5.994 -3.434 c
+-5.994 -0.113 -3.312 2.569 0 2.569 c
+0 0 l
+f
+Q
+0.153 0.251 0.482 scn
+q 1 0 0 1 315.165 489.9888 cm
+0 0 m
+-0.04 -0.083 -0.167 -0.135 -0.239 -0.193 c
+-0.739 -0.597 -1.12 -1.159 -1.404 -1.909 c
+-1.678 -2.633 -1.751 -3.637 -1.568 -4.146 c
+-0.856 -6.124 1.88 -5.306 1.908 -5.297 c
+5.872 -3.969 5.347 -0.495 3.422 0.519 c
+1.628 1.464 0.058 0.122 0 0 c
+0 2.287 l
+3.312 2.287 6.003 -0.396 6.003 -3.716 c
+6.003 -7.028 3.312 -9.71 0 -9.71 c
+-3.312 -9.71 -5.994 -7.028 -5.994 -3.716 c
+-5.994 -0.396 -3.312 2.287 0 2.287 c
+0 0 l
+f
+Q
+0.149 0.243 0.467 scn
+q 1 0 0 1 315.165 490.2749 cm
+0 0 m
+-0.045 -0.106 -0.209 -0.167 -0.302 -0.235 c
+-0.485 -0.372 -1.122 -0.935 -1.618 -2.443 c
+-1.723 -2.761 -1.897 -3.881 -1.538 -4.677 c
+-1.024 -5.812 0.792 -6.206 2.512 -5.554 c
+6.336 -4.105 5.75 -0.288 3.153 0.723 c
+1.353 1.423 0.007 0.017 0 0 c
+0 2 l
+3.312 2 6.003 -0.682 6.003 -4.002 c
+6.003 -7.314 3.312 -9.997 0 -9.997 c
+-3.312 -9.997 -5.994 -7.314 -5.994 -4.002 c
+-5.994 -0.682 -3.312 2 0 2 c
+0 0 l
+f
+Q
+0.145 0.235 0.455 scn
+q 1 0 0 1 315.165 490.6582 cm
+0 0 m
+-0.163 -0.361 -0.541 -0.515 -0.777 -0.805 c
+-0.945 -1.011 -1.046 -1.259 -1.201 -1.474 c
+-1.269 -1.568 -1.409 -1.763 -1.714 -2.734 c
+-2.048 -3.798 -1.784 -4.665 -1.597 -5.087 c
+-1.005 -6.421 1.188 -6.695 2.68 -6.041 c
+8.251 -3.594 4.333 0.165 2.965 0.677 c
+1.252 1.319 0.007 0.016 0 0 c
+0 1.617 l
+3.312 1.617 6.003 -1.065 6.003 -4.386 c
+6.003 -7.698 3.312 -10.38 0 -10.38 c
+-3.312 -10.38 -5.994 -7.698 -5.994 -4.386 c
+-5.994 -1.065 -3.312 1.617 0 1.617 c
+0 0 l
+f
+Q
+0.141 0.227 0.439 scn
+q 1 0 0 1 315.165 491.083 cm
+0 0 m
+-0.128 -0.296 -0.441 -0.404 -0.637 -0.631 c
+-0.787 -0.804 -0.891 -1.009 -1.028 -1.191 c
+-1.149 -1.351 -1.614 -2.354 -1.616 -2.362 c
+-2.165 -3.906 -2.034 -4.643 -1.834 -5.161 c
+-0.959 -7.42 1.653 -7.023 2.585 -6.679 c
+3.892 -6.198 6.61 -5.196 5.552 -2.522 c
+5.843 -3.227 6.003 -4 6.003 -4.811 c
+6.003 -8.123 3.312 -10.805 0 -10.805 c
+-3.312 -10.805 -5.994 -8.123 -5.994 -4.811 c
+-5.994 -1.49 -3.312 1.192 0 1.192 c
+0 0 l
+f
+Q
+0.137 0.22 0.427 scn
+q 1 0 0 1 315.165 491.5479 cm
+0 0 m
+-0.037 -0.078 -0.154 -0.129 -0.22 -0.185 c
+-1.232 -1.033 -1.806 -2.828 -1.83 -2.904 c
+-2.22 -4.142 -2.232 -5.159 -1.867 -5.927 c
+-0.58 -8.633 3.354 -7.149 3.394 -7.134 c
+4.44 -6.729 6.193 -6.052 5.898 -4.154 c
+5.967 -4.518 6.003 -4.892 6.003 -5.275 c
+6.003 -8.587 3.312 -11.27 0 -11.27 c
+-3.312 -11.27 -5.994 -8.587 -5.994 -5.275 c
+-5.994 -1.955 -3.312 0.728 0 0.728 c
+0 0 l
+f
+Q
+0.133 0.216 0.412 scn
+q 1 0 0 1 315.165 491.9907 cm
+0 0 m
+-0.038 -0.067 -0.155 -0.091 -0.221 -0.13 c
+-1.146 -0.672 -1.618 -2.109 -1.997 -3.263 c
+-2.003 -3.281 -2.538 -5.073 -2.065 -6.285 c
+-1.01 -8.991 2.93 -7.989 3.097 -7.945 c
+4.317 -7.624 5.989 -7.184 6.001 -5.584 c
+6.002 -5.628 6.003 -5.673 6.003 -5.718 c
+6.003 -9.03 3.312 -11.712 0 -11.712 c
+-3.312 -11.712 -5.994 -9.03 -5.994 -5.718 c
+-5.994 -2.397 -3.312 0.285 0 0.285 c
+0 0 l
+f
+Q
+0.125 0.208 0.396 scn
+q 1 0 0 1 315.165 492.2632 cm
+0 0 m
+-0.043 -0.052 -0.154 -0.029 -0.221 -0.042 c
+-0.695 -0.132 -1.346 -0.69 -1.729 -1.732 c
+-2.601 -4.102 -2.422 -5.693 -2.305 -6.268 c
+-1.773 -8.88 1.72 -8.614 1.755 -8.61 c
+4.215 -8.37 5.7 -8.226 5.951 -6.783 c
+5.562 -9.72 3.043 -11.985 0 -11.985 c
+-3.312 -11.985 -5.994 -9.303 -5.994 -5.991 c
+-5.994 -2.67 -3.312 0.012 0 0.012 c
+0 0 l
+f
+Q
+0.122 0.2 0.384 scn
+q 1 0 0 1 314.2603 492.1987 cm
+0 0 m
+-1.727 -0.587 -1.739 -4.385 -1.738 -4.546 c
+-1.734 -6.483 -1.193 -7.61 0.017 -8.2 c
+1.798 -9.069 6.085 -9.361 6.66 -7.637 c
+5.921 -10.115 3.622 -11.92 0.905 -11.92 c
+-2.407 -11.92 -5.089 -9.238 -5.089 -5.926 c
+-5.089 -2.857 -2.798 -0.333 0.165 0.032 c
+0.115 0.022 0.048 0.013 0 0 c
+f
+Q
+0.118 0.192 0.369 scn
+q 1 0 0 1 312.9341 491.7764 cm
+0 0 m
+-1.086 -0.961 -0.817 -4.853 -0.535 -5.61 c
+0.431 -8.208 2.403 -8.585 3.207 -8.626 c
+4.27 -8.681 5.298 -9.068 6.378 -8.967 c
+6.691 -8.938 7.264 -8.802 7.584 -8.218 c
+6.592 -10.165 4.566 -11.498 2.231 -11.498 c
+-1.081 -11.498 -3.763 -8.816 -3.763 -5.504 c
+-3.763 -2.812 -2 -0.54 0.432 0.225 c
+0.372 0.2 0.292 0.168 0.231 0.144 c
+0.161 0.102 0.062 0.054 0 0 c
+f
+Q
+0.204 0.333 0.639 scn
+q 1 0 0 1 316.7451 486.4531 cm
+0 0 m
+-0.091 0.065 -0.091 0.065 -0.52 0.593 c
+-0.662 0.769 -0.836 0.916 -0.974 1.096 c
+-1.233 1.432 -1.232 1.599 -1.232 1.6 c
+-1.226 1.62 -0.028 2.446 0.591 1.368 c
+1.026 0.611 0.245 -0.132 0.233 -0.134 c
+0.153 -0.145 0.065 -0.047 0 0 c
+f
+Q
+0.141 0.227 0.439 scn
+q 1 0 0 1 317.7354 491.6665 cm
+0 0 m
+-1.294 0.462 -2.254 -0.325 -2.57 -0.583 c
+-2.57 0.609 l
+-1.403 0.609 -0.313 0.276 0.609 -0.301 c
+0.52 -0.251 0.4 -0.185 0.31 -0.134 c
+0.217 -0.094 0.095 -0.034 0 0 c
+f
+Q
+0.208 0.337 0.655 scn
+q 1 0 0 1 316.7852 486.708 cm
+0 0 m
+-0.336 0.357 l
+-0.473 0.528 -0.628 0.683 -0.758 0.858 c
+-0.977 1.152 -1.021 1.271 -1.02 1.277 c
+-1.015 1.292 -0.028 1.706 0.328 0.955 c
+0.588 0.409 0.173 -0.121 0.167 -0.122 c
+0.106 -0.133 0.047 -0.04 0 0 c
+f
+Q
+0.137 0.22 0.427 scn
+q 1 0 0 1 316.9321 491.998 cm
+0 0 m
+-0.649 0.12 -1.161 -0.01 -1.767 -0.45 c
+-1.767 0.277 l
+-1.039 0.277 -0.34 0.147 0.306 -0.09 c
+0.223 -0.065 0.111 -0.031 0.028 -0.006 c
+0.02 -0.004 0.008 -0.001 0 0 c
+f
+Q
+0.216 0.345 0.667 scn
+q 1 0 0 1 316.7891 486.9756 cm
+0 0 m
+-0.004 0.004 -0.536 0.578 -0.712 0.865 c
+-0.569 0.878 -0.483 0.886 -0.265 0.812 c
+-0.18 0.784 -0.084 0.701 -0.026 0.633 c
+0.032 0.564 0.089 0.451 0.102 0.362 c
+0.133 0.142 0.096 0.015 0.073 -0.061 c
+0.051 -0.042 0.021 -0.02 0 0 c
+f
+Q
+0.133 0.216 0.412 scn
+q 1 0 0 1 316.0703 492.1978 cm
+0 0 m
+-0.314 -0.005 -0.486 -0.009 -0.905 -0.207 c
+-0.905 0.078 l
+-0.519 0.078 -0.142 0.041 0.224 -0.028 c
+0.157 -0.02 0.067 -0.003 0 0 c
+f
+Q
+0.125 0.208 0.396 scn
+q 1 0 0 1 315.165 492.2632 cm
+0 0 m
+0 0.012 l
+0.072 0.012 0.144 0.011 0.215 0.008 c
+0.15 0.006 0.046 -0.044 0 0 c
+f
+Q
+ 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
+339.132 461.774 351.669 449.237 351.669 433.775 c
+351.669 418.313 339.132 405.776 323.67 405.776 c
+308.199 405.776 295.671 418.313 295.671 433.775 c
+295.671 449.237 308.199 461.774 323.67 461.774 c
+323.67 445.774 l
+317.055 445.784 311.661 440.386 311.671 433.775 c
+311.661 427.165 317.055 421.767 323.67 421.776 c
+330.277 421.766 335.68 427.168 335.669 433.775 c
+335.68 440.383 330.277 445.785 323.67 445.774 c
+W n
+q
+/GS0 gs
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+Q
+ 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
+/GS0 gs
+q 1 0 0 1 323.6699 445.7744 cm
+0 0 m
+0 16 l
+15.462 16 27.999 3.463 27.999 -11.999 c
+27.999 -27.461 15.462 -39.998 0 -39.998 c
+-15.471 -39.998 -27.999 -27.461 -27.999 -11.999 c
+-27.999 3.463 -15.471 16 0 16 c
+0 0 l
+-6.615 0.009 -12.009 -5.389 -11.999 -11.999 c
+-12.009 -18.609 -6.615 -24.007 0 -23.998 c
+6.607 -24.009 12.01 -18.606 11.999 -11.999 c
+12.01 -5.392 6.607 0.011 0 0 c
+f
+Q
+q 1 0 0 1 323.6699 450.936 cm
+0 0 m
+0 -0.46 l
+0 -5.162 l
+-6.615 -5.152 -12.009 -10.55 -11.999 -17.161 c
+-12.009 -23.771 -6.615 -29.169 0 -29.16 c
+6.607 -29.17 12.01 -23.768 11.999 -17.161 c
+12.01 -10.553 6.607 -5.151 0 -5.162 c
+0 -0.46 l
+0.316 -0.687 0.738 -0.99 1.054 -1.216 c
+3.814 -3.66 7.459 -4.866 10 -7.615 c
+12.018 -9.799 13.458 -12.46 14.279 -15.526 c
+15.091 -18.561 16.901 -19.341 16.918 -19.343 c
+18.873 -19.537 24.733 -10.481 17.857 -2.239 c
+10.881 6.124 0.77 1.958 0 0 c
+0 10.838 l
+15.462 10.838 27.999 -1.699 27.999 -17.161 c
+27.999 -32.623 15.462 -45.16 0 -45.16 c
+-15.471 -45.16 -27.999 -32.623 -27.999 -17.161 c
+-27.999 -1.699 -15.471 10.838 0 10.838 c
+0 0 l
+f
+Q
+0.204 0.333 0.639 scn
+q 1 0 0 1 323.6699 452.7832 cm
+0 0 m
+-0.297 -0.712 -1.488 -1.167 -1.738 -1.898 c
+-1.989 -2.637 -2.005 -3.871 -1.531 -4.492 c
+-1.227 -4.891 -0.45 -4.943 0 -5.165 c
+0 -7.009 l
+-6.615 -7 -12.009 -12.397 -11.999 -19.008 c
+-12.009 -25.618 -6.615 -31.016 0 -31.007 c
+6.607 -31.018 12.01 -25.615 11.999 -19.008 c
+12.01 -12.4 6.607 -6.998 0 -7.009 c
+0 -5.165 l
+0.338 -5.198 0.788 -5.242 1.126 -5.275 c
+2.249 -5.474 12.142 -7.557 13.761 -19.535 c
+14.172 -22.508 l
+14.637 -23.083 15.725 -23.499 16.46 -23.421 c
+20.584 -22.986 26.414 -9.565 15.896 -1.31 c
+7.945 4.929 0.035 0.084 0 0 c
+0 8.991 l
+15.462 8.991 27.999 -3.546 27.999 -19.008 c
+27.999 -34.47 15.462 -47.007 0 -47.007 c
+-15.471 -47.007 -27.999 -34.47 -27.999 -19.008 c
+-27.999 -3.546 -15.471 8.991 0 8.991 c
+0 0 l
+f
+Q
+0.2 0.325 0.624 scn
+q 1 0 0 1 323.6699 453.9038 cm
+0 0 m
+-0.627 -1.11 -1.868 -1.524 -2.71 -2.39 c
+-4.768 -4.502 -4.451 -6.209 -4.444 -6.223 c
+-4.359 -6.387 -4.359 -6.387 0 -7.407 c
+0 -8.129 l
+-6.615 -8.12 -12.009 -13.518 -11.999 -20.128 c
+-12.009 -26.739 -6.615 -32.137 0 -32.127 c
+6.607 -32.138 12.01 -26.736 11.999 -20.128 c
+12.01 -13.521 6.607 -8.119 0 -8.129 c
+0 -7.407 l
+0.312 -7.427 0.727 -7.454 1.039 -7.474 c
+5.586 -8.118 13.154 -12.018 12.674 -22.547 c
+12.56 -25.06 12.663 -26.477 12.982 -26.758 c
+14.311 -27.928 23.356 -23.682 22.629 -14.041 c
+21.27 3.998 1.142 2.018 0 0 c
+0 7.871 l
+15.462 7.871 27.999 -4.667 27.999 -20.128 c
+27.999 -35.59 15.462 -48.127 0 -48.127 c
+-15.471 -48.127 -27.999 -35.59 -27.999 -20.128 c
+-27.999 -4.667 -15.471 7.871 0 7.871 c
+0 0 l
+f
+Q
+0.196 0.318 0.612 scn
+q 1 0 0 1 323.6699 454.8291 cm
+0 0 m
+-0.223 -0.378 -0.896 -0.494 -1.28 -0.706 c
+-3.988 -2.198 -4.356 -2.882 -7.222 -8.202 c
+-10.979 -15.406 l
+-12.035 -17.648 -12.409 -19.972 -12.123 -22.51 c
+-11.368 -29.204 -4.441 -35.039 3.701 -32.831 c
+16.504 -28.45 l
+19.64 -26.383 21.524 -23.889 22.614 -20.364 c
+24.61 -13.907 21.812 -4.74 13.674 -0.575 c
+6.261 3.219 0.029 0.049 0 0 c
+0 6.945 l
+15.462 6.945 27.999 -5.592 27.999 -21.054 c
+27.999 -36.516 15.462 -49.053 0 -49.053 c
+-15.471 -49.053 -27.999 -36.516 -27.999 -21.054 c
+-27.999 -5.592 -15.471 6.945 0 6.945 c
+0 0 l
+f
+Q
+0.192 0.31 0.596 scn
+q 1 0 0 1 323.6699 455.6289 cm
+0 0 m
+-11.795 -5.181 -18.994 -27.783 -4.636 -33.729 c
+5.806 -38.053 30.469 -28.935 22.345 -10.09 c
+19.107 -2.58 10.176 3.509 0 0 c
+0 6.146 l
+15.462 6.146 27.999 -6.392 27.999 -21.854 c
+27.999 -37.315 15.462 -49.853 0 -49.853 c
+-15.471 -49.853 -27.999 -37.315 -27.999 -21.854 c
+-27.999 -6.392 -15.471 6.146 0 6.146 c
+0 0 l
+f
+Q
+0.188 0.302 0.58 scn
+q 1 0 0 1 323.6699 456.3296 cm
+0 0 m
+-0.26 -0.393 -1.011 -0.429 -1.444 -0.612 c
+-4.284 -1.815 -7.534 -4.967 -9.349 -8.277 c
+-13.499 -15.843 -13.758 -21.083 -13.244 -24.145 c
+-12.335 -29.557 -7.256 -38.113 6.018 -35.852 c
+29.65 -31.827 27.567 -10.229 15.691 -2.187 c
+7.726 3.206 0.039 0.058 0 0 c
+0 5.445 l
+15.462 5.445 27.999 -7.092 27.999 -22.554 c
+27.999 -38.016 15.462 -50.553 0 -50.553 c
+-15.471 -50.553 -27.999 -38.016 -27.999 -22.554 c
+-27.999 -7.092 -15.471 5.445 0 5.445 c
+0 0 l
+f
+Q
+0.18 0.294 0.569 scn
+q 1 0 0 1 323.6699 456.9956 cm
+0 0 m
+-0.271 -0.397 -1.043 -0.41 -1.49 -0.586 c
+-3.112 -1.224 -7.251 -3.368 -10.636 -9.471 c
+-11.688 -11.366 -15.022 -18.08 -13.796 -24.877 c
+-12.453 -32.323 -5.461 -39.361 6.714 -37.217 c
+28.943 -33.303 28.97 -11.254 15.609 -2.3 c
+7.857 2.895 0.038 0.056 0 0 c
+0 4.779 l
+15.462 4.779 27.999 -7.758 27.999 -23.22 c
+27.999 -38.682 15.462 -51.219 0 -51.219 c
+-15.471 -51.219 -27.999 -38.682 -27.999 -23.22 c
+-27.999 -7.758 -15.471 4.779 0 4.779 c
+0 0 l
+f
+Q
+0.176 0.286 0.553 scn
+q 1 0 0 1 323.6699 457.6064 cm
+0 0 m
+-0.285 -0.403 -1.086 -0.384 -1.551 -0.549 c
+-2.515 -0.89 -7.505 -2.918 -11.143 -9.4 c
+-12.539 -11.886 -15.644 -18.437 -14.343 -25.553 c
+-13.275 -31.396 -7.567 -40.711 7.05 -38.566 c
+28.064 -35.482 30.902 -13.127 16.17 -2.838 c
+7.979 2.883 0.04 0.057 0 0 c
+0 4.168 l
+15.462 4.168 27.999 -8.369 27.999 -23.831 c
+27.999 -39.293 15.462 -51.83 0 -51.83 c
+-15.471 -51.83 -27.999 -39.293 -27.999 -23.831 c
+-27.999 -8.369 -15.471 4.168 0 4.168 c
+0 0 l
+f
+Q
+0.173 0.278 0.541 scn
+q 1 0 0 1 323.6699 458.1792 cm
+0 0 m
+-0.295 -0.407 -1.114 -0.365 -1.591 -0.521 c
+-3.039 -0.995 -8.059 -3.066 -11.891 -9.807 c
+-12.952 -11.675 -16.307 -18.377 -14.887 -26.189 c
+-13.692 -32.762 -6.813 -41.823 7.243 -39.848 c
+28.687 -36.834 31.471 -13.847 16.374 -3.144 c
+8.08 2.737 0.041 0.056 0 0 c
+0 3.595 l
+15.462 3.595 27.999 -8.942 27.999 -24.404 c
+27.999 -39.866 15.462 -52.403 0 -52.403 c
+-15.471 -52.403 -27.999 -39.866 -27.999 -24.404 c
+-27.999 -8.942 -15.471 3.595 0 3.595 c
+0 0 l
+f
+Q
+0.169 0.275 0.525 scn
+q 1 0 0 1 323.6699 458.7163 cm
+0 0 m
+-0.327 -0.44 -1.225 -0.369 -1.749 -0.527 c
+-5.521 -1.665 -9.768 -5.259 -12.076 -9.267 c
+-15.396 -15.033 -16.523 -20.929 -15.426 -26.791 c
+-13.856 -35.175 -5.227 -43.009 7.675 -41.011 c
+29.382 -37.65 31.673 -13.956 16.092 -3.122 c
+8.188 2.374 0.041 0.052 0 0 c
+0 3.058 l
+15.462 3.058 27.999 -9.479 27.999 -24.941 c
+27.999 -40.403 15.462 -52.94 0 -52.94 c
+-15.471 -52.94 -27.999 -40.403 -27.999 -24.941 c
+-27.999 -9.479 -15.471 3.058 0 3.058 c
+0 0 l
+f
+Q
+0.165 0.267 0.51 scn
+q 1 0 0 1 323.6699 459.2314 cm
+0 0 m
+-0.315 -0.414 -1.17 -0.321 -1.672 -0.458 c
+-5.63 -1.542 -10.189 -5.222 -12.512 -9.206 c
+-13.797 -11.409 -17.707 -18.115 -15.958 -27.369 c
+-14.312 -36.085 -5.369 -44.227 7.962 -42.147 c
+29.823 -38.738 32.256 -15.066 16.713 -3.752 c
+8.241 2.415 0.041 0.054 0 0 c
+0 2.543 l
+15.462 2.543 27.999 -9.994 27.999 -25.456 c
+27.999 -40.918 15.462 -53.455 0 -53.455 c
+-15.471 -53.455 -27.999 -40.918 -27.999 -25.456 c
+-27.999 -9.994 -15.471 2.543 0 2.543 c
+0 0 l
+f
+Q
+0.161 0.259 0.498 scn
+q 1 0 0 1 323.6699 459.7041 cm
+0 0 m
+-0.326 -0.417 -1.198 -0.297 -1.711 -0.424 c
+-5.006 -1.24 -10.024 -4.173 -13.32 -9.752 c
+-16.644 -15.378 -17.708 -21.484 -16.484 -27.903 c
+-14.771 -36.889 -5.522 -45.311 8.242 -43.22 c
+29.813 -39.944 32.242 -15.421 16.845 -4.05 c
+8.507 2.107 0.042 0.053 0 0 c
+0 2.07 l
+15.462 2.07 27.999 -10.467 27.999 -25.929 c
+27.999 -41.391 15.462 -53.928 0 -53.928 c
+-15.471 -53.928 -27.999 -41.391 -27.999 -25.929 c
+-27.999 -10.467 -15.471 2.07 0 2.07 c
+0 0 l
+f
+Q
+0.153 0.251 0.482 scn
+q 1 0 0 1 323.6699 460.144 cm
+0 0 m
+-0.165 -0.201 -0.596 -0.119 -0.852 -0.169 c
+-6.632 -1.32 -11.089 -5.48 -13.333 -8.99 c
+-17.824 -16.015 -17.96 -22.678 -17.283 -27.031 c
+-15.529 -38.309 -5.353 -45.633 6.914 -44.447 c
+29.053 -42.307 33.213 -18.564 18.588 -5.674 c
+9.722 2.142 0.051 0.062 0 0 c
+0 1.63 l
+15.462 1.63 27.999 -10.907 27.999 -26.369 c
+27.999 -41.831 15.462 -54.368 0 -54.368 c
+-15.471 -54.368 -27.999 -41.831 -27.999 -26.369 c
+-27.999 -10.907 -15.471 1.63 0 1.63 c
+0 0 l
+f
+Q
+0.149 0.243 0.467 scn
+q 1 0 0 1 323.6699 460.5547 cm
+0 0 m
+-0.345 -0.419 -1.243 -0.245 -1.776 -0.35 c
+-5.454 -1.074 -10.584 -3.985 -13.756 -8.856 c
+-18.476 -16.104 -18.606 -22.976 -17.885 -27.465 c
+-16.272 -37.503 -7.101 -46.92 7.31 -45.498 c
+29.575 -43.3 33.52 -19.115 18.666 -5.998 c
+9.679 1.938 0.05 0.061 0 0 c
+0 1.22 l
+15.462 1.22 27.999 -11.317 27.999 -26.779 c
+27.999 -42.241 15.462 -54.778 0 -54.778 c
+-15.471 -54.778 -27.999 -42.241 -27.999 -26.779 c
+-27.999 -11.317 -15.471 1.22 0 1.22 c
+0 0 l
+f
+Q
+0.145 0.235 0.455 scn
+q 1 0 0 1 323.6699 460.9102 cm
+0 0 m
+-0.359 -0.424 -1.28 -0.213 -1.828 -0.305 c
+-2.573 -0.429 -9.242 -1.712 -14.038 -8.521 c
+-19.338 -16.045 -19.04 -23.601 -18.666 -26.5 c
+-16.79 -41.035 -4.557 -47.119 6.015 -46.621 c
+29.237 -45.525 34.039 -19.966 18.705 -6.311 c
+9.693 1.714 0.05 0.059 0 0 c
+0 0.864 l
+15.462 0.864 27.999 -11.673 27.999 -27.135 c
+27.999 -42.597 15.462 -55.134 0 -55.134 c
+-15.471 -55.134 -27.999 -42.597 -27.999 -27.135 c
+-27.999 -11.673 -15.471 0.864 0 0.864 c
+0 0 l
+f
+Q
+0.141 0.227 0.439 scn
+q 1 0 0 1 323.6699 461.2358 cm
+0 0 m
+-0.366 -0.422 -1.291 -0.183 -1.844 -0.262 c
+-5.618 -0.797 -11.206 -3.577 -14.557 -8.414 c
+-20.527 -17.033 -19.484 -25.013 -19.142 -27.635 c
+-17.325 -41.544 -4.721 -48.297 6.215 -47.587 c
+22.825 -46.511 31.838 -32.41 25.896 -16.796 c
+27.251 -20.083 27.999 -23.685 27.999 -27.46 c
+27.999 -42.922 15.462 -55.459 0 -55.459 c
+-15.471 -55.459 -27.999 -42.922 -27.999 -27.46 c
+-27.999 -11.999 -15.471 0.539 0 0.539 c
+0 0 l
+f
+Q
+0.137 0.22 0.427 scn
+q 1 0 0 1 323.6699 461.4912 cm
+0 0 m
+-0.38 -0.425 -1.323 -0.147 -1.89 -0.211 c
+-3.742 -0.417 -10.186 -1.632 -15.337 -8.604 c
+-20.121 -15.077 -20.496 -23.224 -19.964 -27.016 c
+-18.071 -40.5 -7.311 -49.138 6.811 -48.512 c
+13.567 -48.212 30.458 -42.954 27.513 -22.495 c
+27.832 -24.187 27.999 -25.932 27.999 -27.716 c
+27.999 -43.178 15.462 -55.715 0 -55.715 c
+-15.471 -55.715 -27.999 -43.178 -27.999 -27.716 c
+-27.999 -12.254 -15.471 0.283 0 0.283 c
+0 0 l
+f
+Q
+0.133 0.216 0.412 scn
+q 1 0 0 1 323.6699 461.6821 cm
+0 0 m
+-0.389 -0.422 -1.334 -0.109 -1.906 -0.156 c
+-5.864 -0.48 -11.765 -2.986 -15.37 -7.721 c
+-21.457 -15.717 -21.121 -23.997 -20.694 -27.186 c
+-18.848 -40.99 -7.359 -50.367 6.621 -49.484 c
+16.365 -48.868 27.809 -42.685 27.992 -27.284 c
+27.997 -27.491 27.999 -27.699 27.999 -27.907 c
+27.999 -43.369 15.462 -55.906 0 -55.906 c
+-15.471 -55.906 -27.999 -43.369 -27.999 -27.907 c
+-27.999 -12.445 -15.471 0.092 0 0.092 c
+0 0 l
+f
+Q
+0.125 0.208 0.396 scn
+q 1 0 0 1 323.6699 461.771 cm
+0 0 m
+-0.403 -0.423 -1.362 -0.067 -1.946 -0.096 c
+-5.655 -0.278 -11.174 -1.795 -16.41 -7.986 c
+-19.422 -11.547 -22.258 -18.903 -21.583 -25.522 c
+-19.025 -50.59 4.157 -50.418 5.143 -50.399 c
+17.394 -50.156 25.847 -43.167 27.756 -31.704 c
+25.941 -45.413 14.205 -55.995 0 -55.995 c
+-15.471 -55.995 -27.999 -43.458 -27.999 -27.996 c
+-27.999 -12.534 -15.471 0.003 0 0.003 c
+0 0 l
+f
+Q
+0.122 0.2 0.384 scn
+q 1 0 0 1 319.437 461.4541 cm
+0 0 m
+-22.531 -4.549 -23.531 -35.025 -6.331 -46.258 c
+6.847 -54.864 25.642 -52.17 31.071 -35.682 c
+27.627 -47.245 16.914 -55.678 4.233 -55.678 c
+-11.238 -55.678 -23.766 -43.141 -23.766 -27.679 c
+-23.766 -13.386 -13.062 -1.593 0.777 0.109 c
+0.544 0.077 0.232 0.04 0 0 c
+f
+Q
+0.118 0.192 0.369 scn
+q 1 0 0 1 311.6421 458.9941 cm
+0 0 m
+-16.565 -9.064 -17.346 -40.196 9.317 -48.713 c
+16.643 -51.053 30.634 -50.189 36.991 -37.91 c
+32.363 -46.995 22.921 -53.218 12.028 -53.218 c
+-3.443 -53.218 -15.971 -40.681 -15.971 -25.219 c
+-15.971 -12.684 -7.737 -2.07 3.624 1.498 c
+3.099 1.309 2.397 1.056 1.872 0.866 c
+1.309 0.609 0.542 0.297 0 0 c
+f
+Q
+0.216 0.345 0.667 scn
+q 1 0 0 1 339.5962 435.5991 cm
+0 0 m
+-1.706 2.422 -2.871 5.192 -4.806 7.466 c
+-5.581 8.375 -6.334 9.141 -7.046 9.74 c
+-7.103 9.788 -12.699 14.577 -12.705 14.929 c
+-12.707 15.035 -10.925 16.753 -10.74 16.825 c
+-10.058 17.086 -7.544 17.231 -6.875 17.166 c
+-5.111 16.992 -2.438 16.241 0.275 13.649 c
+3.79 10.293 4.269 6.382 4.332 5.263 c
+4.608 0.362 1.816 -1.553 1.125 -1.426 c
+0.589 -1.328 0.314 -0.445 0 0 c
+f
+Q
+0.22 0.353 0.682 scn
+q 1 0 0 1 339.7305 438.0928 cm
+0 0 m
+-1.97 2.883 -3.055 4.471 -4.87 6.595 c
+-5.072 6.832 -5.375 7.116 -5.591 7.34 c
+-5.844 7.601 -6.16 7.969 -6.419 8.224 c
+-6.913 8.711 -7.551 9.382 -8.074 9.839 c
+-9.724 11.281 -9.908 11.547 -9.911 11.595 c
+-9.914 11.657 -8.495 13.252 -8.295 13.411 c
+-8.132 13.541 -7.808 13.456 -7.601 13.433 c
+-5.32 13.184 -2.962 12.927 -0.476 10.566 c
+2.531 7.709 2.783 5.143 2.904 3.909 c
+2.938 3.565 2.929 0.875 2.709 0.41 c
+2.675 0.337 0.707 -0.875 0.645 -0.861 c
+0.33 -0.793 0.182 -0.267 0 0 c
+f
+Q
+0.224 0.361 0.694 scn
+q 1 0 0 1 338.8154 441.6221 cm
+0 0 m
+-0.737 0.235 -1.076 1.45 -1.576 2.04 c
+-3.148 3.894 -3.148 3.894 -3.897 4.678 c
+-4.212 5.008 -4.84 5.354 -4.922 5.803 c
+-4.014 7.981 l
+-3.953 8.007 -1.427 7.15 0.33 5.083 c
+1.631 3.552 2.397 0.755 2.281 0.574 c
+1.906 -0.01 0.699 -0.197 0.037 0.011 c
+0.026 0.014 0.011 -0.003 0 0 c
+f
+Q
+0.141 0.227 0.439 scn
+q 1 0 0 1 335.7192 459.0469 cm
+0 0 m
+-5.275 2.417 -9.403 2.407 -12.049 2.189 c
+-12.049 2.728 l
+-6.604 2.728 -1.522 1.173 2.777 -1.517 c
+2.232 -1.205 1.506 -0.789 0.961 -0.477 c
+0.673 -0.334 0.292 -0.134 0 0 c
+f
+Q
+0.137 0.22 0.427 scn
+q 1 0 0 1 331.9331 460.5313 cm
+0 0 m
+-3.078 0.794 -4.478 1.111 -8.263 0.96 c
+-8.263 1.243 l
+-4.866 1.243 -1.61 0.638 1.402 -0.47 c
+0.981 -0.329 0.425 -0.126 0 0 c
+f
+Q
+0.133 0.216 0.412 scn
+q 1 0 0 1 327.9009 461.4541 cm
+0 0 m
+-1.314 0.178 -2.48 0.278 -4.231 0.228 c
+-4.231 0.32 l
+-2.431 0.32 -0.671 0.15 1.035 -0.174 c
+0.724 -0.122 0.312 -0.042 0 0 c
+f
+Q
+0.125 0.208 0.396 scn
+q 1 0 0 1 323.6699 461.771 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 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
+331.311 217.271 334.002 214.59 334.002 211.277 c
+334.002 207.966 331.311 205.274 327.999 205.274 c
+324.687 205.274 321.996 207.966 321.996 211.277 c
+321.996 214.59 324.687 217.271 327.999 217.271 c
+327.999 212.271 l
+327.449 212.274 326.992 211.817 326.996 211.277 c
+326.991 210.734 327.456 210.27 327.999 210.274 c
+328.542 210.27 329.007 210.734 329.002 211.277 c
+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
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+Q
+ 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
+0 5 l
+3.312 5 6.003 2.318 6.003 -0.994 c
+6.003 -4.306 3.312 -6.997 0 -6.997 c
+-3.312 -6.997 -6.003 -4.306 -6.003 -0.994 c
+-6.003 2.318 -3.312 5 0 5 c
+0 0 l
+-0.55 0.003 -1.007 -0.454 -1.003 -0.994 c
+-1.008 -1.537 -0.543 -2.002 0 -1.997 c
+0.543 -2.002 1.008 -1.537 1.003 -0.994 c
+1.007 -0.454 0.55 0.003 0 0 c
+f
+Q
+q 1 0 0 1 327.999 213.1963 cm
+0 0 m
+-0.013 -0.041 -0.073 -0.074 -0.083 -0.115 c
+-0.111 -0.248 -0.02 -0.426 0 -0.56 c
+0 -0.925 l
+-0.55 -0.922 -1.007 -1.379 -1.003 -1.919 c
+-1.008 -2.462 -0.543 -2.927 0 -2.922 c
+0.543 -2.927 1.008 -2.462 1.003 -1.919 c
+1.007 -1.379 0.55 -0.922 0 -0.925 c
+0 -0.56 l
+0.034 -0.557 0.079 -0.553 0.113 -0.55 c
+0.142 -0.55 0.184 -0.536 0.21 -0.549 c
+1.046 -1.473 l
+1.441 -2.153 1.79 -2.106 1.805 -2.104 c
+2.057 -2.064 3.185 -0.619 1.901 0.191 c
+1.598 0.383 1.275 0.409 1.132 0.396 c
+0 0 l
+0 4.075 l
+3.312 4.075 6.003 1.394 6.003 -1.919 c
+6.003 -5.23 3.312 -7.922 0 -7.922 c
+-3.312 -7.922 -6.003 -5.23 -6.003 -1.919 c
+-6.003 1.394 -3.312 4.075 0 4.075 c
+0 0 l
+f
+Q
+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
+-0.222 -0.433 -0.125 -0.678 -0.188 -0.838 c
+-0.188 -0.839 -0.237 -0.941 -0.404 -1.049 c
+-1.156 -1.538 -1.044 -2.153 -0.992 -2.33 c
+-0.81 -2.948 -0.137 -3.26 0.449 -2.997 c
+0.649 -2.907 0.789 -2.769 0.872 -2.687 c
+1.143 -2.418 1.548 -2.618 1.836 -2.409 c
+2.434 -1.976 2.571 -1.584 2.629 -1.416 c
+2.851 -0.784 2.461 0.135 1.628 0.371 c
+0.853 0.591 0.002 0.008 0 0 c
+0 3.934 l
+3.312 3.934 6.003 1.252 6.003 -2.061 c
+6.003 -5.372 3.312 -8.063 0 -8.063 c
+-3.312 -8.063 -6.003 -5.372 -6.003 -2.061 c
+-6.003 1.252 -3.312 3.934 0 3.934 c
+0 0 l
+f
+Q
+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
+-0.955 -3.01 -0.239 -3.591 0.647 -3.163 c
+1.047 -2.97 1.515 -2.951 1.888 -2.688 c
+2.104 -2.536 2.607 -2.182 2.763 -1.673 c
+3.16 -0.374 2.125 0.264 1.731 0.385 c
+0.831 0.661 0.003 0.009 0 0 c
+0 3.793 l
+3.312 3.793 6.003 1.111 6.003 -2.201 c
+6.003 -5.513 3.312 -8.204 0 -8.204 c
+-3.312 -8.204 -6.003 -5.513 -6.003 -2.201 c
+-6.003 1.111 -3.312 3.793 0 3.793 c
+0 0 l
+f
+Q
+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
+-1.025 -3.14 -0.35 -3.809 0.711 -3.398 c
+2.484 -2.712 2.629 -2.655 2.946 -1.777 c
+2.952 -1.763 3.406 -0.234 2.053 0.316 c
+0.838 0.812 0.004 0.01 0 0 c
+0 3.653 l
+3.312 3.653 6.003 0.972 6.003 -2.341 c
+6.003 -5.652 3.312 -8.344 0 -8.344 c
+-3.312 -8.344 -6.003 -5.652 -6.003 -2.341 c
+-6.003 0.972 -3.312 3.653 0 3.653 c
+0 0 l
+f
+Q
+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
+-1.093 -1.707 l
+-1.262 -2.105 -1.291 -2.433 -1.189 -2.801 c
+-1.126 -3.029 -0.725 -4.141 0.983 -3.563 c
+5.011 -2.2 2.486 0.226 2.453 0.247 c
+1.442 0.896 0.101 0.219 0 0 c
+0 3.517 l
+3.312 3.517 6.003 0.835 6.003 -2.478 c
+6.003 -5.789 3.312 -8.48 0 -8.48 c
+-3.312 -8.48 -6.003 -5.789 -6.003 -2.478 c
+-6.003 0.835 -3.312 3.517 0 3.517 c
+0 0 l
+f
+Q
+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
+-0.364 -0.275 -0.691 -0.521 -1.173 -1.803 c
+-1.243 -1.988 -1.457 -2.555 -1.186 -3.148 c
+-0.781 -4.033 0.18 -4.204 1.671 -3.654 c
+3.863 -2.846 3.98 -0.373 2.341 0.401 c
+1.366 0.862 0.123 0.247 0 0 c
+0 3.363 l
+3.312 3.363 6.003 0.682 6.003 -2.631 c
+6.003 -5.942 3.312 -8.634 0 -8.634 c
+-3.312 -8.634 -6.003 -5.942 -6.003 -2.631 c
+-6.003 0.682 -3.312 3.363 0 3.363 c
+0 0 l
+f
+Q
+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
+-0.702 -0.521 -0.962 -1.182 -1.171 -1.711 c
+-1.281 -1.991 -1.54 -2.648 -1.288 -3.269 c
+-0.891 -4.246 0.088 -4.488 1.621 -3.988 c
+4.051 -3.195 4.189 -0.578 2.798 0.287 c
+1.588 1.039 0.134 0.266 0 0 c
+0 3.172 l
+3.312 3.172 6.003 0.49 6.003 -2.822 c
+6.003 -6.134 3.312 -8.825 0 -8.825 c
+-3.312 -8.825 -6.003 -6.134 -6.003 -2.822 c
+-6.003 0.49 -3.312 3.172 0 3.172 c
+0 0 l
+f
+Q
+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
+-0.454 -0.309 -0.887 -0.883 -1.091 -1.383 c
+-1.28 -1.846 -1.632 -2.707 -1.384 -3.387 c
+-0.994 -4.454 0.002 -4.769 1.578 -4.319 c
+4.069 -3.61 4.619 -0.754 2.993 0.316 c
+1.701 1.166 0.079 0.148 0 0 c
+0 2.984 l
+3.312 2.984 6.003 0.303 6.003 -3.01 c
+6.003 -6.321 3.312 -9.013 0 -9.013 c
+-3.312 -9.013 -6.003 -6.321 -6.003 -3.01 c
+-6.003 0.303 -3.312 2.984 0 2.984 c
+0 0 l
+f
+Q
+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
+-1.049 -1.139 -1.146 -1.381 -1.241 -1.614 c
+-1.291 -1.738 -1.721 -2.847 -1.448 -3.589 c
+-0.846 -5.228 1.105 -4.775 1.689 -4.598 c
+4.413 -3.769 4.993 -0.751 3.22 0.385 c
+1.946 1.2 0.234 0.423 0 0 c
+0 2.8 l
+3.312 2.8 6.003 0.118 6.003 -3.194 c
+6.003 -6.506 3.312 -9.197 0 -9.197 c
+-3.312 -9.197 -6.003 -6.506 -6.003 -3.194 c
+-6.003 0.118 -3.312 2.8 0 2.8 c
+0 0 l
+f
+Q
+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
+-0.759 -0.541 -1.229 -1.474 -1.327 -1.735 c
+-1.444 -2.049 -1.803 -3.136 -1.475 -3.938 c
+-0.713 -5.804 1.956 -4.863 1.982 -4.853 c
+5.283 -3.568 5.162 -0.364 3.116 0.573 c
+1.411 1.354 0.007 0.017 0 0 c
+0 2.568 l
+3.312 2.568 6.003 -0.113 6.003 -3.426 c
+6.003 -6.737 3.312 -9.429 0 -9.429 c
+-3.312 -9.429 -6.003 -6.737 -6.003 -3.426 c
+-6.003 -0.113 -3.312 2.568 0 2.568 c
+0 0 l
+f
+Q
+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
+-0.736 -0.594 -1.131 -1.171 -1.412 -1.908 c
+-1.719 -2.715 -1.736 -3.694 -1.577 -4.139 c
+-0.858 -6.132 1.881 -5.304 1.908 -5.295 c
+5.598 -4.044 5.76 -0.555 3.075 0.691 c
+1.838 1.266 0.163 0.34 0 0 c
+0 2.286 l
+3.312 2.286 6.003 -0.396 6.003 -3.708 c
+6.003 -7.02 3.312 -9.711 0 -9.711 c
+-3.312 -9.711 -6.003 -7.02 -6.003 -3.708 c
+-6.003 -0.396 -3.312 2.286 0 2.286 c
+0 0 l
+f
+Q
+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
+-0.487 -0.373 -1.13 -0.938 -1.627 -2.442 c
+-1.764 -2.854 -1.88 -3.932 -1.545 -4.67 c
+-1.027 -5.814 0.793 -6.21 2.513 -5.55 c
+6.314 -4.092 5.733 -0.28 3.153 0.723 c
+1.353 1.422 0.007 0.017 0 0 c
+0 2 l
+3.312 2 6.003 -0.682 6.003 -3.994 c
+6.003 -7.306 3.312 -9.997 0 -9.997 c
+-3.312 -9.997 -6.003 -7.306 -6.003 -3.994 c
+-6.003 -0.682 -3.312 2 0 2 c
+0 0 l
+f
+Q
+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
+-0.948 -1.011 -1.05 -1.26 -1.205 -1.475 c
+-1.369 -1.701 -1.472 -1.983 -1.723 -2.733 c
+-2.048 -3.703 -1.823 -4.541 -1.66 -4.953 c
+-1.229 -6.046 0.416 -6.786 2.422 -6.135 c
+7.014 -4.645 5.816 -0.744 3.286 0.54 c
+1.422 1.485 0.008 0.019 0 0 c
+0 1.617 l
+3.312 1.617 6.003 -1.064 6.003 -4.377 c
+6.003 -7.688 3.312 -10.38 0 -10.38 c
+-3.312 -10.38 -6.003 -7.688 -6.003 -4.377 c
+-6.003 -1.064 -3.312 1.617 0 1.617 c
+0 0 l
+f
+Q
+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
+-0.788 -0.804 -0.893 -1.01 -1.031 -1.191 c
+-1.148 -1.346 -1.62 -2.353 -1.623 -2.36 c
+-2.172 -3.895 -2.053 -4.608 -1.843 -5.151 c
+-0.961 -7.428 1.653 -7.023 2.586 -6.676 c
+3.891 -6.189 6.606 -5.178 5.553 -2.521 c
+5.843 -3.224 6.003 -3.994 6.003 -4.802 c
+6.003 -8.113 3.312 -10.805 0 -10.805 c
+-3.312 -10.805 -6.003 -8.113 -6.003 -4.802 c
+-6.003 -1.489 -3.312 1.192 0 1.192 c
+0 0 l
+f
+Q
+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
+-1.238 -1.037 -1.832 -2.884 -1.837 -2.902 c
+-2.426 -4.76 -2.011 -5.632 -1.875 -5.918 c
+-0.597 -8.6 3.355 -7.144 3.396 -7.129 c
+4.441 -6.72 6.192 -6.035 5.899 -4.15 c
+5.967 -4.512 6.003 -4.885 6.003 -5.267 c
+6.003 -8.578 3.312 -11.27 0 -11.27 c
+-3.312 -11.27 -6.003 -8.578 -6.003 -5.267 c
+-6.003 -1.954 -3.312 0.728 0 0.728 c
+0 0 l
+f
+Q
+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
+-1.15 -0.674 -1.646 -2.172 -2.007 -3.267 c
+-2.013 -3.283 -2.546 -5.064 -2.073 -6.276 c
+-1.009 -9.004 3.058 -7.952 3.099 -7.941 c
+4.318 -7.615 5.989 -7.169 6.001 -5.576 c
+6.002 -5.62 6.003 -5.664 6.003 -5.709 c
+6.003 -9.021 3.312 -11.712 0 -11.712 c
+-3.312 -11.712 -6.003 -9.021 -6.003 -5.709 c
+-6.003 -2.396 -3.312 0.285 0 0.285 c
+0 0 l
+f
+Q
+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
+-0.696 -0.133 -1.348 -0.689 -1.732 -1.73 c
+-2.577 -4.014 -2.459 -5.548 -2.314 -6.259 c
+-1.864 -8.468 0.843 -8.703 1.755 -8.611 c
+4.299 -8.355 5.7 -8.214 5.951 -6.775 c
+5.562 -9.713 3.043 -11.985 0 -11.985 c
+-3.312 -11.985 -6.003 -9.294 -6.003 -5.982 c
+-6.003 -2.67 -3.312 0.012 0 0.012 c
+0 0 l
+f
+Q
+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
+-1.745 -7.049 -0.739 -7.83 0.017 -8.199 c
+1.798 -9.07 6.085 -9.361 6.66 -7.631 c
+5.921 -10.109 3.622 -11.921 0.905 -11.921 c
+-2.407 -11.921 -5.098 -9.229 -5.098 -5.918 c
+-5.098 -2.856 -2.799 -0.334 0.165 0.031 c
+0.115 0.021 0.049 0.013 0 0 c
+f
+Q
+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
+0.429 -8.205 2.405 -8.584 3.209 -8.627 c
+4.272 -8.682 5.299 -9.067 6.379 -8.965 c
+6.692 -8.936 7.266 -8.798 7.587 -8.212 c
+6.594 -10.16 4.569 -11.497 2.235 -11.497 c
+-1.077 -11.497 -3.768 -8.806 -3.768 -5.494 c
+-3.768 -2.81 -2.001 -0.54 0.432 0.225 c
+0.372 0.2 0.292 0.168 0.231 0.144 c
+0.161 0.102 0.061 0.054 0 0 c
+f
+Q
+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
+-0.661 0.762 -0.834 0.909 -0.973 1.089 c
+-1.125 1.286 -1.231 1.594 y
+-1.226 1.612 -0.029 2.438 0.592 1.362 c
+1.027 0.609 0.245 -0.131 0.233 -0.133 c
+0.153 -0.144 0.065 -0.047 0 0 c
+f
+Q
+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
+-2.57 0.608 l
+-1.402 0.608 -0.311 0.274 0.612 -0.302 c
+0.522 -0.252 0.402 -0.186 0.312 -0.136 c
+0.219 -0.095 0.096 -0.034 0 0 c
+f
+Q
+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
+-0.472 0.524 -0.626 0.68 -0.757 0.854 c
+-0.976 1.148 -1.021 1.268 -1.019 1.272 c
+-1.014 1.287 -0.028 1.7 0.33 0.952 c
+0.591 0.409 0.174 -0.12 0.167 -0.121 c
+0.106 -0.131 0.048 -0.039 0 0 c
+f
+Q
+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
+-1.767 0.277 l
+-1.038 0.277 -0.339 0.147 0.307 -0.091 c
+0.224 -0.065 0.112 -0.031 0.029 -0.007 c
+0.02 -0.005 0.009 -0.002 0 0 c
+f
+Q
+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
+-0.568 0.874 -0.482 0.883 -0.264 0.809 c
+-0.18 0.78 -0.083 0.699 -0.025 0.631 c
+0.033 0.563 0.091 0.45 0.104 0.361 c
+0.135 0.141 0.099 0.019 0.074 -0.063 c
+0.052 -0.044 0.021 -0.021 0 0 c
+f
+Q
+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
+-0.905 0.077 l
+-0.519 0.077 -0.142 0.041 0.225 -0.029 c
+0.157 -0.021 0.068 -0.004 0 0 c
+f
+Q
+0.137 0.4 0.506 scn
+q 1 0 0 1 327.999 217.2598 cm
+0 0 m
+0 0.012 l
+0.072 0.012 0.144 0.011 0.215 0.008 c
+0.15 0.006 0.046 -0.045 0 0 c
+f
+Q
+ 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
+349.464 319.277 362.001 306.74 362.001 291.278 c
+362.001 275.808 349.464 263.279 334.002 263.279 c
+318.54 263.279 306.003 275.808 306.003 291.278 c
+306.003 306.74 318.54 319.277 334.002 319.277 c
+334.002 303.277 l
+327.395 303.288 321.992 297.886 322.003 291.278 c
+321.994 284.663 327.392 279.27 334.002 279.279 c
+340.612 279.27 346.01 284.663 346.001 291.278 c
+346.012 297.886 340.609 303.288 334.002 303.277 c
+W n
+q
+/GS0 gs
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+Q
+ 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
+0 16 l
+15.462 16 27.999 3.463 27.999 -11.999 c
+27.999 -27.47 15.462 -39.998 0 -39.998 c
+-15.462 -39.998 -27.999 -27.47 -27.999 -11.999 c
+-27.999 3.463 -15.462 16 0 16 c
+0 0 l
+-6.607 0.011 -12.01 -5.392 -11.999 -11.999 c
+-12.008 -18.614 -6.61 -24.008 0 -23.998 c
+6.61 -24.008 12.008 -18.614 11.999 -11.999 c
+12.01 -5.392 6.607 0.011 0 0 c
+f
+Q
+q 1 0 0 1 334.002 308.4409 cm
+0 0 m
+0 -0.468 l
+0 -5.164 l
+-6.607 -5.153 -12.01 -10.555 -11.999 -17.163 c
+-12.008 -23.778 -6.61 -29.171 0 -29.162 c
+6.61 -29.171 12.008 -23.778 11.999 -17.163 c
+12.01 -10.555 6.607 -5.153 0 -5.164 c
+0 -0.468 l
+0.316 -0.694 0.738 -0.996 1.055 -1.223 c
+3.817 -3.661 7.459 -4.869 10 -7.617 c
+12.018 -9.8 13.458 -12.461 14.279 -15.528 c
+15.076 -18.506 16.901 -19.345 16.917 -19.347 c
+18.874 -19.542 24.734 -10.485 17.857 -2.241 c
+10.879 6.124 0.769 1.958 0 0 c
+0 10.836 l
+15.462 10.836 27.999 -1.701 27.999 -17.163 c
+27.999 -32.633 15.462 -45.162 0 -45.162 c
+-15.462 -45.162 -27.999 -32.633 -27.999 -17.163 c
+-27.999 -1.701 -15.462 10.836 0 10.836 c
+0 0 l
+f
+Q
+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
+-1.987 -2.638 -2.003 -3.873 -1.53 -4.494 c
+-1.227 -4.893 -0.45 -4.945 0 -5.167 c
+0 -7.011 l
+-6.607 -7 -12.01 -12.402 -11.999 -19.01 c
+-12.008 -25.625 -6.61 -31.019 0 -31.009 c
+6.61 -31.019 12.008 -25.625 11.999 -19.01 c
+12.01 -12.402 6.607 -7 0 -7.011 c
+0 -5.167 l
+0.338 -5.201 0.788 -5.245 1.126 -5.278 c
+2.249 -5.476 12.144 -7.557 13.761 -19.537 c
+14.171 -22.514 l
+14.636 -23.089 15.724 -23.505 16.459 -23.428 c
+20.584 -22.992 26.416 -9.568 15.896 -1.312 c
+7.943 4.929 0.035 0.084 0 0 c
+0 8.989 l
+15.462 8.989 27.999 -3.548 27.999 -19.01 c
+27.999 -34.48 15.462 -47.009 0 -47.009 c
+-15.462 -47.009 -27.999 -34.48 -27.999 -19.01 c
+-27.999 -3.548 -15.462 8.989 0 8.989 c
+0 0 l
+f
+Q
+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
+-4.764 -4.503 -4.447 -6.209 -4.44 -6.223 c
+-4.355 -6.386 -4.355 -6.386 0 -7.408 c
+0 -8.13 l
+-6.607 -8.119 -12.01 -13.521 -11.999 -20.129 c
+-12.008 -26.744 -6.61 -32.138 0 -32.128 c
+6.61 -32.138 12.008 -26.744 11.999 -20.129 c
+12.01 -13.521 6.607 -8.119 0 -8.13 c
+0 -7.408 l
+0.312 -7.428 0.727 -7.455 1.039 -7.475 c
+5.587 -8.118 13.155 -12.018 12.674 -22.55 c
+12.559 -25.063 12.663 -26.479 12.981 -26.762 c
+14.31 -27.933 23.356 -23.69 22.629 -14.042 c
+21.27 4.006 1.142 2.02 0 0 c
+0 7.87 l
+15.462 7.87 27.999 -4.667 27.999 -20.129 c
+27.999 -35.6 15.462 -48.128 0 -48.128 c
+-15.462 -48.128 -27.999 -35.6 -27.999 -20.129 c
+-27.999 -4.667 -15.462 7.87 0 7.87 c
+0 0 l
+f
+Q
+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
+-3.984 -2.198 -4.352 -2.882 -7.218 -8.204 c
+-10.978 -15.407 l
+-12.034 -17.649 -12.409 -19.973 -12.123 -22.511 c
+-11.368 -29.203 -4.44 -35.038 3.702 -32.832 c
+16.504 -28.455 l
+19.639 -26.388 21.523 -23.893 22.614 -20.364 c
+24.61 -13.908 21.812 -4.74 13.674 -0.575 c
+6.26 3.219 0.029 0.049 0 0 c
+0 6.945 l
+15.462 6.945 27.999 -5.592 27.999 -21.054 c
+27.999 -36.525 15.462 -49.053 0 -49.053 c
+-15.462 -49.053 -27.999 -36.525 -27.999 -21.054 c
+-27.999 -5.592 -15.462 6.945 0 6.945 c
+0 0 l
+f
+Q
+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
+-3.27 -1.438 -6.363 -4.313 -7.593 -6.58 c
+-13.39 -17.263 -13 -20.654 -12.686 -23.379 c
+-12.044 -28.943 -6.306 -36.331 3.976 -34.516 c
+34.376 -29.152 23.202 -7.033 15.417 -1.844 c
+7.621 3.352 0.038 0.059 0 0 c
+0 6.145 l
+15.462 6.145 27.999 -6.392 27.999 -21.854 c
+27.999 -37.325 15.462 -49.853 0 -49.853 c
+-15.462 -49.853 -27.999 -37.325 -27.999 -21.854 c
+-27.999 -6.392 -15.462 6.145 0 6.145 c
+0 0 l
+f
+Q
+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
+-4.281 -1.817 -7.531 -4.969 -9.346 -8.278 c
+-13.499 -15.849 -13.757 -21.087 -13.243 -24.146 c
+-12.334 -29.559 -7.254 -38.113 6.021 -35.853 c
+29.652 -31.827 27.567 -10.229 15.691 -2.188 c
+7.725 3.206 0.039 0.058 0 0 c
+0 5.444 l
+15.462 5.444 27.999 -7.093 27.999 -22.555 c
+27.999 -38.025 15.462 -50.554 0 -50.554 c
+-15.462 -50.554 -27.999 -38.025 -27.999 -22.555 c
+-27.999 -7.093 -15.462 5.444 0 5.444 c
+0 0 l
+f
+Q
+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
+-3.111 -1.225 -7.25 -3.37 -10.633 -9.471 c
+-11.685 -11.368 -15.021 -18.085 -13.796 -24.878 c
+-12.453 -32.322 -5.461 -39.359 6.715 -37.218 c
+28.949 -33.308 28.975 -11.258 15.609 -2.301 c
+7.856 2.895 0.038 0.056 0 0 c
+0 4.778 l
+15.462 4.778 27.999 -7.759 27.999 -23.221 c
+27.999 -38.691 15.462 -51.22 0 -51.22 c
+-15.462 -51.22 -27.999 -38.691 -27.999 -23.221 c
+-27.999 -7.759 -15.462 4.778 0 4.778 c
+0 0 l
+f
+Q
+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
+-2.14 -0.758 -7.426 -2.783 -11.14 -9.4 c
+-12.536 -11.888 -15.643 -18.441 -14.343 -25.554 c
+-13.275 -31.396 -7.567 -40.71 7.05 -38.567 c
+28.067 -35.485 30.905 -13.13 16.17 -2.838 c
+7.979 2.883 0.04 0.057 0 0 c
+0 4.167 l
+15.462 4.167 27.999 -8.37 27.999 -23.832 c
+27.999 -39.302 15.462 -51.831 0 -51.831 c
+-15.462 -51.831 -27.999 -39.302 -27.999 -23.832 c
+-27.999 -8.37 -15.462 4.167 0 4.167 c
+0 0 l
+f
+Q
+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
+-3.037 -0.996 -8.057 -3.068 -11.887 -9.807 c
+-12.95 -11.677 -16.306 -18.383 -14.886 -26.191 c
+-13.691 -32.763 -6.811 -41.823 7.247 -39.848 c
+28.69 -36.835 31.472 -13.848 16.374 -3.144 c
+8.08 2.736 0.041 0.056 0 0 c
+0 3.595 l
+15.462 3.595 27.999 -8.942 27.999 -24.404 c
+27.999 -39.875 15.462 -52.403 0 -52.403 c
+-15.462 -52.403 -27.999 -39.875 -27.999 -24.404 c
+-27.999 -8.942 -15.462 3.595 0 3.595 c
+0 0 l
+f
+Q
+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
+-5.52 -1.667 -9.766 -5.26 -12.073 -9.267 c
+-15.394 -15.036 -16.522 -20.933 -15.426 -26.792 c
+-13.857 -35.175 -5.228 -43.007 7.675 -41.012 c
+29.388 -37.654 31.678 -13.959 16.092 -3.122 c
+8.188 2.374 0.041 0.052 0 0 c
+0 3.058 l
+15.462 3.058 27.999 -9.479 27.999 -24.941 c
+27.999 -40.412 15.462 -52.94 0 -52.94 c
+-15.462 -52.94 -27.999 -40.412 -27.999 -24.941 c
+-27.999 -9.479 -15.462 3.058 0 3.058 c
+0 0 l
+f
+Q
+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
+-5.628 -1.543 -10.186 -5.222 -12.509 -9.206 c
+-13.794 -11.411 -17.706 -18.119 -15.958 -27.369 c
+-14.312 -36.083 -5.369 -44.225 7.962 -42.147 c
+29.829 -38.742 32.261 -15.07 16.713 -3.752 c
+8.241 2.415 0.041 0.054 0 0 c
+0 2.543 l
+15.462 2.543 27.999 -9.994 27.999 -25.456 c
+27.999 -40.927 15.462 -53.455 0 -53.455 c
+-15.462 -53.455 -27.999 -40.927 -27.999 -25.456 c
+-27.999 -9.994 -15.462 2.543 0 2.543 c
+0 0 l
+f
+Q
+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
+-5.005 -1.241 -10.022 -4.174 -13.317 -9.752 c
+-16.642 -15.38 -17.708 -21.487 -16.484 -27.904 c
+-14.771 -36.888 -5.523 -45.309 8.242 -43.221 c
+29.817 -39.947 32.246 -15.423 16.845 -4.05 c
+8.507 2.107 0.042 0.053 0 0 c
+0 2.07 l
+15.462 2.07 27.999 -10.467 27.999 -25.929 c
+27.999 -41.399 15.462 -53.928 0 -53.928 c
+-15.462 -53.928 -27.999 -41.399 -27.999 -25.929 c
+-27.999 -10.467 -15.462 2.07 0 2.07 c
+0 0 l
+f
+Q
+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
+-6.63 -1.321 -11.086 -5.48 -13.33 -8.99 c
+-17.824 -16.019 -17.96 -22.681 -17.283 -27.032 c
+-15.528 -38.307 -5.35 -45.631 6.918 -44.447 c
+29.057 -42.308 33.214 -18.565 18.588 -5.674 c
+9.722 2.142 0.051 0.062 0 0 c
+0 1.63 l
+15.462 1.63 27.999 -10.907 27.999 -26.369 c
+27.999 -41.839 15.462 -54.368 0 -54.368 c
+-15.462 -54.368 -27.999 -41.839 -27.999 -26.369 c
+-27.999 -10.907 -15.462 1.63 0 1.63 c
+0 0 l
+f
+Q
+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
+-5.333 -1.052 -10.598 -4.013 -13.752 -8.857 c
+-18.474 -16.108 -18.606 -22.979 -17.885 -27.466 c
+-16.272 -37.501 -7.101 -46.918 7.31 -45.498 c
+29.578 -43.303 33.522 -19.118 18.666 -5.999 c
+9.679 1.938 0.05 0.061 0 0 c
+0 1.219 l
+15.462 1.219 27.999 -11.318 27.999 -26.78 c
+27.999 -42.25 15.462 -54.779 0 -54.779 c
+-15.462 -54.779 -27.999 -42.25 -27.999 -26.78 c
+-27.999 -11.318 -15.462 1.219 0 1.219 c
+0 0 l
+f
+Q
+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
+-2.571 -0.429 -9.239 -1.713 -14.035 -8.521 c
+-19.337 -16.049 -19.04 -23.602 -18.666 -26.5 c
+-16.791 -41.034 -4.557 -47.118 6.016 -46.62 c
+29.239 -45.526 34.04 -19.967 18.705 -6.311 c
+9.693 1.714 0.05 0.059 0 0 c
+0 0.864 l
+15.462 0.864 27.999 -11.673 27.999 -27.135 c
+27.999 -42.605 15.462 -55.134 0 -55.134 c
+-15.462 -55.134 -27.999 -42.605 -27.999 -27.135 c
+-27.999 -11.673 -15.462 0.864 0 0.864 c
+0 0 l
+f
+Q
+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
+-5.616 -0.798 -11.203 -3.577 -14.553 -8.414 c
+-20.526 -17.037 -19.484 -25.014 -19.142 -27.636 c
+-17.325 -41.544 -4.721 -48.295 6.216 -47.587 c
+22.826 -46.511 31.838 -32.411 25.896 -16.796 c
+27.251 -20.083 27.999 -23.685 27.999 -27.46 c
+27.999 -42.931 15.462 -55.459 0 -55.459 c
+-15.462 -55.459 -27.999 -42.931 -27.999 -27.46 c
+-27.999 -11.999 -15.462 0.539 0 0.539 c
+0 0 l
+f
+Q
+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
+-3.74 -0.417 -10.183 -1.633 -15.334 -8.604 c
+-20.121 -15.081 -20.497 -23.226 -19.964 -27.017 c
+-18.07 -40.5 -7.309 -49.138 6.814 -48.512 c
+13.57 -48.212 30.458 -42.954 27.513 -22.495 c
+27.832 -24.187 27.999 -25.932 27.999 -27.716 c
+27.999 -43.187 15.462 -55.715 0 -55.715 c
+-15.462 -55.715 -27.999 -43.187 -27.999 -27.716 c
+-27.999 -12.254 -15.462 0.283 0 0.283 c
+0 0 l
+f
+Q
+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
+-5.862 -0.48 -11.762 -2.986 -15.367 -7.721 c
+-21.456 -15.721 -21.121 -23.999 -20.694 -27.186 c
+-18.848 -40.988 -7.36 -50.366 6.622 -49.484 c
+16.365 -48.869 27.809 -42.686 27.992 -27.284 c
+27.997 -27.491 27.999 -27.699 27.999 -27.907 c
+27.999 -43.377 15.462 -55.906 0 -55.906 c
+-15.462 -55.906 -27.999 -43.377 -27.999 -27.907 c
+-27.999 -12.445 -15.462 0.092 0 0.092 c
+0 0 l
+f
+Q
+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
+-5.653 -0.278 -11.171 -1.795 -16.407 -7.987 c
+-19.42 -11.549 -22.258 -18.906 -21.583 -25.522 c
+-19.025 -50.59 4.157 -50.418 5.143 -50.399 c
+17.395 -50.155 25.849 -43.167 27.755 -31.707 c
+25.94 -45.421 14.205 -55.995 0 -55.995 c
+-15.462 -55.995 -27.999 -43.466 -27.999 -27.996 c
+-27.999 -12.534 -15.462 0.003 0 0.003 c
+0 0 l
+f
+Q
+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
+6.848 -54.863 25.642 -52.17 31.069 -35.688 c
+27.625 -47.252 16.911 -55.678 4.231 -55.678 c
+-11.231 -55.678 -23.768 -43.149 -23.768 -27.679 c
+-23.768 -13.386 -13.055 -1.592 0.778 0.109 c
+0.544 0.077 0.232 0.04 0 0 c
+f
+Q
+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
+16.64 -51.053 30.632 -50.191 36.987 -37.914 c
+32.359 -46.999 22.917 -53.218 12.024 -53.218 c
+-3.438 -53.218 -15.975 -40.689 -15.975 -25.219 c
+-15.975 -12.683 -7.734 -2.069 3.625 1.499 c
+3.1 1.309 2.399 1.057 1.873 0.867 c
+1.31 0.61 0.543 0.297 0 0 c
+f
+Q
+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
+-5.58 8.375 -6.333 9.14 -7.046 9.739 c
+-7.103 9.787 -12.7 14.578 -12.706 14.928 c
+-12.708 15.034 -10.925 16.753 -10.74 16.824 c
+-10.058 17.085 -7.544 17.231 -6.875 17.165 c
+-5.111 16.991 -2.438 16.24 0.275 13.649 c
+3.79 10.292 4.269 6.381 4.332 5.263 c
+4.608 0.361 1.816 -1.553 1.125 -1.426 c
+0.589 -1.328 0.314 -0.446 0 0 c
+f
+Q
+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
+-5.072 6.832 -5.375 7.116 -5.591 7.34 c
+-5.844 7.601 -6.16 7.969 -6.419 8.224 c
+-6.913 8.711 -7.551 9.382 -8.074 9.839 c
+-9.724 11.281 -9.908 11.547 -9.911 11.595 c
+-9.914 11.655 -8.389 13.369 -8.295 13.411 c
+-7.711 13.674 -6.801 13.346 -6.164 13.276 c
+-2.962 12.927 -1.156 11.212 -0.476 10.566 c
+2.531 7.709 2.783 5.143 2.904 3.909 c
+2.938 3.565 2.929 0.875 2.709 0.41 c
+2.675 0.337 0.707 -0.874 0.645 -0.861 c
+0.33 -0.793 0.182 -0.267 0 0 c
+f
+Q
+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
+-3.148 3.894 -3.148 3.894 -3.897 4.678 c
+-4.212 5.008 -4.84 5.354 -4.922 5.803 c
+-4.014 7.981 l
+-3.953 8.007 -1.427 7.15 0.33 5.083 c
+1.631 3.552 2.397 0.755 2.281 0.574 c
+1.906 -0.01 0.699 -0.197 0.037 0.011 c
+0.026 0.014 0.011 -0.003 0 0 c
+f
+Q
+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
+-12.049 2.728 l
+-6.604 2.728 -1.522 1.173 2.777 -1.517 c
+2.232 -1.205 1.506 -0.789 0.961 -0.477 c
+0.673 -0.334 0.292 -0.134 0 0 c
+f
+Q
+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
+-8.263 1.243 l
+-4.866 1.243 -1.61 0.638 1.402 -0.47 c
+0.981 -0.329 0.425 -0.126 0 0 c
+f
+Q
+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
+-4.231 0.32 l
+-2.431 0.32 -0.671 0.15 1.035 -0.174 c
+0.724 -0.122 0.312 -0.042 0 0 c
+f
+Q
+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 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
+189.939 223.274 192.621 220.593 192.621 217.271 c
+192.621 213.959 189.939 211.277 186.627 211.277 c
+183.315 211.277 180.624 213.959 180.624 217.271 c
+180.624 220.593 183.315 223.274 186.627 223.274 c
+186.627 218.274 l
+186.078 218.277 185.622 217.823 185.624 217.271 c
+185.62 216.731 186.077 216.274 186.627 216.277 c
+187.173 216.275 187.624 216.726 187.621 217.271 c
+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
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+Q
+ 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
+0 5 l
+3.312 5 5.994 2.318 5.994 -1.003 c
+5.994 -4.315 3.312 -6.997 0 -6.997 c
+-3.312 -6.997 -6.003 -4.315 -6.003 -1.003 c
+-6.003 2.318 -3.312 5 0 5 c
+0 0 l
+-0.549 0.003 -1.005 -0.451 -1.003 -1.003 c
+-1.007 -1.543 -0.55 -2 0 -1.997 c
+0.546 -1.999 0.997 -1.549 0.994 -1.003 c
+0.995 -0.445 0.544 0.003 0 0 c
+f
+Q
+q 1 0 0 1 186.627 219.1992 cm
+0 0 m
+-0.013 -0.041 -0.073 -0.074 -0.083 -0.115 c
+-0.111 -0.248 -0.02 -0.426 0 -0.561 c
+0 -0.925 l
+-0.549 -0.922 -1.005 -1.376 -1.003 -1.928 c
+-1.007 -2.468 -0.55 -2.925 0 -2.922 c
+0.546 -2.924 0.997 -2.474 0.994 -1.928 c
+0.995 -1.37 0.544 -0.922 0 -0.925 c
+0 -0.561 l
+0.034 -0.558 0.078 -0.553 0.112 -0.55 c
+0.141 -0.55 0.182 -0.536 0.208 -0.549 c
+1.037 -1.473 l
+1.432 -2.162 1.781 -2.116 1.796 -2.113 c
+2.048 -2.073 3.175 -0.62 1.896 0.192 c
+1.594 0.385 1.27 0.411 1.126 0.396 c
+0 0 l
+0 4.075 l
+3.312 4.075 5.994 1.394 5.994 -1.928 c
+5.994 -5.24 3.312 -7.922 0 -7.922 c
+-3.312 -7.922 -6.003 -5.24 -6.003 -1.928 c
+-6.003 1.394 -3.312 4.075 0 4.075 c
+0 0 l
+f
+Q
+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
+-0.222 -0.434 -0.125 -0.678 -0.187 -0.838 c
+-0.188 -0.839 -0.237 -0.941 -0.403 -1.05 c
+-1.157 -1.54 -1.045 -2.159 -0.993 -2.338 c
+-0.812 -2.951 -0.139 -3.261 0.448 -2.999 c
+0.646 -2.911 0.784 -2.775 0.866 -2.694 c
+1.137 -2.427 1.542 -2.629 1.829 -2.42 c
+2.42 -1.988 2.555 -1.604 2.619 -1.418 c
+2.84 -0.784 2.454 0.136 1.624 0.372 c
+0.851 0.592 0.002 0.007 0 0 c
+0 3.933 l
+3.312 3.933 5.994 1.251 5.994 -2.07 c
+5.994 -5.383 3.312 -8.064 0 -8.064 c
+-3.312 -8.064 -6.003 -5.383 -6.003 -2.07 c
+-6.003 1.251 -3.312 3.933 0 3.933 c
+0 0 l
+f
+Q
+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
+-0.941 -3.092 -0.175 -3.558 0.645 -3.166 c
+2.581 -2.241 2.581 -2.241 2.752 -1.679 c
+3.15 -0.374 2.119 0.265 1.727 0.386 c
+0.83 0.662 0.003 0.008 0 0 c
+0 3.792 l
+3.312 3.792 5.994 1.11 5.994 -2.211 c
+5.994 -5.523 3.312 -8.205 0 -8.205 c
+-3.312 -8.205 -6.003 -5.523 -6.003 -2.211 c
+-6.003 1.11 -3.312 3.792 0 3.792 c
+0 0 l
+f
+Q
+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
+-1.026 -3.142 -0.354 -3.806 0.709 -3.4 c
+2.435 -2.741 2.615 -2.673 2.848 -2.025 c
+3.232 -0.958 2.919 -0.038 2.048 0.318 c
+0.863 0.804 0.004 0.01 0 0 c
+0 3.653 l
+3.312 3.653 5.994 0.972 5.994 -2.35 c
+5.994 -5.662 3.312 -8.344 0 -8.344 c
+-3.312 -8.344 -6.003 -5.662 -6.003 -2.35 c
+-6.003 0.972 -3.312 3.653 0 3.653 c
+0 0 l
+f
+Q
+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
+-1.091 -1.709 l
+-1.261 -2.111 -1.291 -2.44 -1.189 -2.809 c
+-1.127 -3.035 -0.731 -4.134 0.979 -3.567 c
+4.729 -2.327 2.779 0.033 2.448 0.247 c
+1.441 0.897 0.102 0.218 0 0 c
+0 3.516 l
+3.312 3.516 5.994 0.834 5.994 -2.487 c
+5.994 -5.8 3.312 -8.481 0 -8.481 c
+-3.312 -8.481 -6.003 -5.8 -6.003 -2.487 c
+-6.003 0.834 -3.312 3.516 0 3.516 c
+0 0 l
+f
+Q
+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
+-0.436 -0.329 -0.724 -0.613 -1.172 -1.804 c
+-1.294 -2.128 -1.428 -2.622 -1.186 -3.154 c
+-0.786 -4.034 0.174 -4.205 1.666 -3.662 c
+3.819 -2.879 3.945 -0.361 2.337 0.402 c
+1.364 0.864 0.123 0.248 0 0 c
+0 3.363 l
+3.312 3.363 5.994 0.682 5.994 -2.64 c
+5.994 -5.952 3.312 -8.634 0 -8.634 c
+-3.312 -8.634 -6.003 -5.952 -6.003 -2.64 c
+-6.003 0.682 -3.312 3.363 0 3.363 c
+0 0 l
+f
+Q
+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
+-0.738 -0.548 -1 -1.255 -1.252 -1.938 c
+-1.385 -2.296 -1.491 -2.836 -1.247 -3.372 c
+-0.62 -4.745 1.243 -4.15 1.798 -3.936 c
+4.073 -3.057 4.215 -0.289 2.506 0.421 c
+1.109 1.002 0.006 0.013 0 0 c
+0 3.172 l
+3.312 3.172 5.994 0.49 5.994 -2.831 c
+5.994 -6.144 3.312 -8.825 0 -8.825 c
+-3.312 -8.825 -6.003 -6.144 -6.003 -2.831 c
+-6.003 0.49 -3.312 3.172 0 3.172 c
+0 0 l
+f
+Q
+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
+-0.425 -0.29 -0.869 -0.842 -1.09 -1.384 c
+-1.279 -1.849 -1.632 -2.713 -1.384 -3.395 c
+-1 -4.452 -0.005 -4.766 1.573 -4.327 c
+4.077 -3.63 4.625 -0.767 2.988 0.316 c
+1.701 1.168 0.079 0.148 0 0 c
+0 2.983 l
+3.312 2.983 5.994 0.302 5.994 -3.02 c
+5.994 -6.332 3.312 -9.014 0 -9.014 c
+-3.312 -9.014 -6.003 -6.332 -6.003 -3.02 c
+-6.003 0.302 -3.312 2.983 0 2.983 c
+0 0 l
+f
+Q
+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
+-1.047 -1.138 -1.145 -1.38 -1.239 -1.615 c
+-1.289 -1.739 -1.721 -2.852 -1.448 -3.597 c
+-0.854 -5.222 1.1 -4.778 1.685 -4.604 c
+4.42 -3.787 4.999 -0.764 3.215 0.386 c
+1.946 1.203 0.235 0.424 0 0 c
+0 2.8 l
+3.312 2.8 5.994 0.118 5.994 -3.203 c
+5.994 -6.516 3.312 -9.197 0 -9.197 c
+-3.312 -9.197 -6.003 -6.516 -6.003 -3.203 c
+-6.003 0.118 -3.312 2.8 0 2.8 c
+0 0 l
+f
+Q
+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
+-0.737 -0.526 -1.203 -1.41 -1.325 -1.736 c
+-1.409 -1.96 -1.811 -3.121 -1.476 -3.944 c
+-0.72 -5.801 1.951 -4.87 1.978 -4.859 c
+5.294 -3.584 5.17 -0.372 3.113 0.574 c
+1.411 1.356 0.007 0.017 0 0 c
+0 2.568 l
+3.312 2.568 5.994 -0.113 5.994 -3.435 c
+5.994 -6.747 3.312 -9.429 0 -9.429 c
+-3.312 -9.429 -6.003 -6.747 -6.003 -3.435 c
+-6.003 -0.113 -3.312 2.568 0 2.568 c
+0 0 l
+f
+Q
+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
+-0.735 -0.593 -1.129 -1.17 -1.41 -1.909 c
+-1.685 -2.632 -1.76 -3.635 -1.577 -4.146 c
+-0.866 -6.126 1.876 -5.311 1.903 -5.301 c
+5.874 -3.976 5.345 -0.496 3.416 0.521 c
+1.627 1.465 0.058 0.121 0 0 c
+0 2.286 l
+3.312 2.286 5.994 -0.396 5.994 -3.717 c
+5.994 -7.029 3.312 -9.711 0 -9.711 c
+-3.312 -9.711 -6.003 -7.029 -6.003 -3.717 c
+-6.003 -0.396 -3.312 2.286 0 2.286 c
+0 0 l
+f
+Q
+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
+-0.487 -0.373 -1.127 -0.938 -1.625 -2.443 c
+-1.73 -2.761 -1.906 -3.878 -1.546 -4.676 c
+-1.031 -5.818 0.788 -6.214 2.508 -5.559 c
+6.319 -4.105 5.737 -0.286 3.15 0.724 c
+1.354 1.425 0.007 0.017 0 0 c
+0 2 l
+3.312 2 5.994 -0.682 5.994 -4.003 c
+5.994 -7.315 3.312 -9.997 0 -9.997 c
+-3.312 -9.997 -6.003 -7.315 -6.003 -4.003 c
+-6.003 -0.682 -3.312 2 0 2 c
+0 0 l
+f
+Q
+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
+-0.947 -1.012 -1.049 -1.261 -1.205 -1.476 c
+-1.367 -1.7 -1.47 -1.983 -1.721 -2.735 c
+-2.06 -3.745 -1.792 -4.628 -1.661 -4.961 c
+-1.172 -6.201 0.619 -6.721 2.417 -6.144 c
+7.025 -4.662 5.824 -0.754 3.284 0.539 c
+1.422 1.486 0.008 0.018 0 0 c
+0 1.616 l
+3.312 1.616 5.994 -1.065 5.994 -4.387 c
+5.994 -7.699 3.312 -10.381 0 -10.381 c
+-3.312 -10.381 -6.003 -7.699 -6.003 -4.387 c
+-6.003 -1.065 -3.312 1.616 0 1.616 c
+0 0 l
+f
+Q
+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
+-0.788 -0.804 -0.893 -1.01 -1.031 -1.191 c
+-1.147 -1.346 -1.619 -2.354 -1.622 -2.361 c
+-2.173 -3.904 -2.042 -4.642 -1.843 -5.159 c
+-0.967 -7.426 1.647 -7.027 2.581 -6.683 c
+3.886 -6.201 6.602 -5.198 5.542 -2.518 c
+5.833 -3.224 5.994 -3.998 5.994 -4.811 c
+5.994 -8.123 3.312 -10.805 0 -10.805 c
+-3.312 -10.805 -6.003 -8.123 -6.003 -4.811 c
+-6.003 -1.489 -3.312 1.192 0 1.192 c
+0 0 l
+f
+Q
+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
+-1.236 -1.035 -1.83 -2.885 -1.836 -2.903 c
+-2.227 -4.14 -2.24 -5.156 -1.875 -5.925 c
+-0.602 -8.604 3.351 -7.152 3.39 -7.137 c
+4.435 -6.729 6.183 -6.049 5.89 -4.151 c
+5.958 -4.516 5.994 -4.891 5.994 -5.275 c
+5.994 -8.588 3.312 -11.27 0 -11.27 c
+-3.312 -11.27 -6.003 -8.588 -6.003 -5.275 c
+-6.003 -1.954 -3.312 0.728 0 0.728 c
+0 0 l
+f
+Q
+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
+-1.149 -0.673 -1.644 -2.171 -2.005 -3.266 c
+-2.01 -3.282 -2.546 -5.07 -2.073 -6.283 c
+-1.016 -9.001 3.053 -7.959 3.094 -7.948 c
+4.312 -7.626 5.98 -7.185 5.993 -5.583 c
+5.994 -5.628 5.994 -5.673 5.994 -5.718 c
+5.994 -9.03 3.312 -11.712 0 -11.712 c
+-3.312 -11.712 -6.003 -9.03 -6.003 -5.718 c
+-6.003 -2.396 -3.312 0.285 0 0.285 c
+0 0 l
+f
+Q
+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
+-0.696 -0.133 -1.347 -0.689 -1.732 -1.731 c
+-2.576 -4.018 -2.459 -5.555 -2.314 -6.268 c
+-1.868 -8.458 0.839 -8.7 1.752 -8.612 c
+4.209 -8.376 5.692 -8.233 5.942 -6.786 c
+5.553 -9.723 3.042 -11.985 0 -11.985 c
+-3.312 -11.985 -6.003 -9.304 -6.003 -5.991 c
+-6.003 -2.67 -3.312 0.012 0 0.012 c
+0 0 l
+f
+Q
+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
+-1.744 -6.481 -1.201 -7.607 0.015 -8.199 c
+1.797 -9.066 6.081 -9.359 6.651 -7.642 c
+5.914 -10.117 3.621 -11.92 0.905 -11.92 c
+-2.407 -11.92 -5.098 -9.238 -5.098 -5.926 c
+-5.098 -2.855 -2.799 -0.333 0.165 0.032 c
+0.115 0.022 0.049 0.014 0 0 c
+f
+Q
+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
+0.425 -8.204 2.403 -8.583 3.208 -8.626 c
+4.27 -8.682 5.294 -9.071 6.373 -8.972 c
+6.625 -8.948 7.249 -8.828 7.579 -8.222 c
+6.588 -10.166 4.567 -11.497 2.234 -11.497 c
+-1.078 -11.497 -3.769 -8.815 -3.769 -5.503 c
+-3.769 -2.812 -2.001 -0.54 0.432 0.225 c
+0.372 0.2 0.292 0.168 0.231 0.144 c
+0.161 0.103 0.062 0.054 0 0 c
+f
+Q
+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
+-0.66 0.77 -0.832 0.916 -0.969 1.096 c
+-1.153 1.336 -1.228 1.588 -1.225 1.6 c
+-1.219 1.619 -0.023 2.449 0.592 1.369 c
+1.023 0.611 0.244 -0.132 0.233 -0.134 c
+0.153 -0.145 0.065 -0.047 0 0 c
+f
+Q
+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
+-2.568 0.608 l
+-1.402 0.608 -0.314 0.276 0.606 -0.3 c
+0.517 -0.25 0.397 -0.184 0.307 -0.133 c
+0.215 -0.093 0.095 -0.034 0 0 c
+f
+Q
+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
+-0.471 0.528 -0.626 0.683 -0.755 0.857 c
+-0.971 1.148 -1.017 1.271 -1.015 1.275 c
+-1.01 1.29 -0.025 1.71 0.328 0.955 c
+0.583 0.408 0.172 -0.12 0.166 -0.121 c
+0.105 -0.132 0.047 -0.039 0 0 c
+f
+Q
+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
+-1.766 0.277 l
+-1.038 0.277 -0.341 0.147 0.305 -0.09 c
+0.221 -0.064 0.11 -0.031 0.027 -0.006 c
+0.019 -0.004 0.008 -0.001 0 0 c
+f
+Q
+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
+-0.562 0.878 -0.481 0.886 -0.263 0.812 c
+-0.178 0.783 -0.083 0.7 -0.026 0.632 c
+0.032 0.563 0.087 0.449 0.1 0.36 c
+0.13 0.142 0.09 0.006 0.071 -0.06 c
+0.049 -0.041 0.02 -0.02 0 0 c
+f
+Q
+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
+-0.905 0.077 l
+-0.519 0.077 -0.142 0.041 0.224 -0.029 c
+0.157 -0.021 0.068 -0.004 0 0 c
+f
+Q
+0.114 0.337 0.224 scn
+q 1 0 0 1 186.627 223.2627 cm
+0 0 m
+0 0.012 l
+0.072 0.012 0.144 0.011 0.215 0.008 c
+0.15 0.006 0.046 -0.045 0 0 c
+f
+Q
+ 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
+198.462 324.272 210.999 311.735 210.999 296.273 c
+210.999 280.812 198.462 268.274 183 268.274 c
+167.538 268.274 155.001 280.812 155.001 296.273 c
+155.001 311.735 167.538 324.272 183 324.272 c
+183 308.272 l
+176.393 308.283 170.99 302.881 171.001 296.273 c
+170.99 289.666 176.393 284.264 183 284.274 c
+189.607 284.264 195.01 289.666 194.999 296.273 c
+195.01 302.881 189.607 308.283 183 308.272 c
+W n
+q
+/GS0 gs
+0 Tc 0 Tw 0 Ts 100 Tz 0 Tr /Fm0 Do
+Q
+Q
+ 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
+0 16 l
+15.462 16 27.999 3.463 27.999 -11.999 c
+27.999 -27.461 15.462 -39.998 0 -39.998 c
+-15.462 -39.998 -27.999 -27.461 -27.999 -11.999 c
+-27.999 3.463 -15.462 16 0 16 c
+0 0 l
+-6.607 0.011 -12.01 -5.392 -11.999 -11.999 c
+-12.01 -18.606 -6.607 -24.009 0 -23.998 c
+6.607 -24.009 12.01 -18.606 11.999 -11.999 c
+12.01 -5.392 6.607 0.011 0 0 c
+f
+Q
+q 1 0 0 1 183 313.436 cm
+0 0 m
+0 -0.468 l
+0 -5.164 l
+-6.607 -5.153 -12.01 -10.555 -11.999 -17.163 c
+-12.01 -23.77 -6.607 -29.172 0 -29.162 c
+6.607 -29.172 12.01 -23.77 11.999 -17.163 c
+12.01 -10.555 6.607 -5.153 0 -5.164 c
+0 -0.468 l
+0.316 -0.694 0.738 -0.997 1.055 -1.223 c
+3.817 -3.661 7.459 -4.869 10 -7.617 c
+12.018 -9.8 13.458 -12.461 14.279 -15.528 c
+15.091 -18.562 16.901 -19.343 16.918 -19.345 c
+18.873 -19.539 24.733 -10.483 17.857 -2.241 c
+10.879 6.124 0.769 1.958 0 0 c
+0 10.836 l
+15.462 10.836 27.999 -1.701 27.999 -17.163 c
+27.999 -32.625 15.462 -45.162 0 -45.162 c
+-15.462 -45.162 -27.999 -32.625 -27.999 -17.163 c
+-27.999 -1.701 -15.462 10.836 0 10.836 c
+0 0 l
+f
+Q
+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
+-1.987 -2.638 -2.003 -3.873 -1.53 -4.494 c
+-1.227 -4.893 -0.45 -4.945 0 -5.167 c
+0 -7.011 l
+-6.607 -7 -12.01 -12.402 -11.999 -19.01 c
+-12.01 -25.617 -6.607 -31.02 0 -31.009 c
+6.607 -31.02 12.01 -25.617 11.999 -19.01 c
+12.01 -12.402 6.607 -7 0 -7.011 c
+0 -5.167 l
+0.338 -5.201 0.788 -5.245 1.126 -5.278 c
+2.249 -5.476 12.142 -7.556 13.761 -19.537 c
+14.172 -22.51 l
+14.637 -23.085 15.725 -23.501 16.46 -23.424 c
+20.584 -22.987 26.414 -9.567 15.896 -1.312 c
+7.943 4.929 0.035 0.084 0 0 c
+0 8.989 l
+15.462 8.989 27.999 -3.548 27.999 -19.01 c
+27.999 -34.472 15.462 -47.009 0 -47.009 c
+-15.462 -47.009 -27.999 -34.472 -27.999 -19.01 c
+-27.999 -3.548 -15.462 8.989 0 8.989 c
+0 0 l
+f
+Q
+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
+-4.764 -4.503 -4.447 -6.209 -4.44 -6.223 c
+-4.355 -6.386 -4.355 -6.386 0 -7.408 c
+0 -8.13 l
+-6.607 -8.119 -12.01 -13.521 -11.999 -20.129 c
+-12.01 -26.736 -6.607 -32.139 0 -32.128 c
+6.607 -32.139 12.01 -26.736 11.999 -20.129 c
+12.01 -13.521 6.607 -8.119 0 -8.13 c
+0 -7.408 l
+0.312 -7.428 0.727 -7.455 1.039 -7.475 c
+5.586 -8.118 13.155 -12.017 12.674 -22.548 c
+12.56 -25.061 12.663 -26.477 12.982 -26.758 c
+14.311 -27.929 23.356 -23.684 22.629 -14.042 c
+21.269 4.004 1.142 2.019 0 0 c
+0 7.87 l
+15.462 7.87 27.999 -4.667 27.999 -20.129 c
+27.999 -35.591 15.462 -48.128 0 -48.128 c
+-15.462 -48.128 -27.999 -35.591 -27.999 -20.129 c
+-27.999 -4.667 -15.462 7.87 0 7.87 c
+0 0 l
+f
+Q
+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
+-3.983 -2.198 -4.352 -2.882 -7.218 -8.204 c
+-10.977 -15.407 l
+-12.034 -17.649 -12.409 -19.973 -12.123 -22.51 c
+-11.368 -29.204 -4.441 -35.04 3.701 -32.832 c
+16.504 -28.451 l
+19.64 -26.383 21.524 -23.889 22.614 -20.364 c
+24.61 -13.908 21.812 -4.74 13.674 -0.575 c
+6.26 3.219 0.029 0.049 0 0 c
+0 6.945 l
+15.462 6.945 27.999 -5.592 27.999 -21.054 c
+27.999 -36.516 15.462 -49.053 0 -49.053 c
+-15.462 -49.053 -27.999 -36.516 -27.999 -21.054 c
+-27.999 -5.592 -15.462 6.945 0 6.945 c
+0 0 l
+f
+Q
+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
+-3.27 -1.438 -6.363 -4.313 -7.593 -6.58 c
+-13.39 -17.262 -13 -20.653 -12.686 -23.377 c
+-12.045 -28.943 -6.307 -36.332 3.975 -34.516 c
+34.372 -29.149 23.201 -7.033 15.417 -1.844 c
+7.621 3.352 0.038 0.059 0 0 c
+0 6.145 l
+15.462 6.145 27.999 -6.392 27.999 -21.854 c
+27.999 -37.316 15.462 -49.853 0 -49.853 c
+-15.462 -49.853 -27.999 -37.316 -27.999 -21.854 c
+-27.999 -6.392 -15.462 6.145 0 6.145 c
+0 0 l
+f
+Q
+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
+-4.281 -1.816 -7.531 -4.969 -9.346 -8.278 c
+-13.498 -15.848 -13.757 -21.085 -13.244 -24.146 c
+-12.335 -29.558 -7.256 -38.113 6.018 -35.853 c
+29.65 -31.827 27.567 -10.229 15.691 -2.188 c
+7.725 3.206 0.039 0.058 0 0 c
+0 5.444 l
+15.462 5.444 27.999 -7.093 27.999 -22.555 c
+27.999 -38.017 15.462 -50.554 0 -50.554 c
+-15.462 -50.554 -27.999 -38.017 -27.999 -22.555 c
+-27.999 -7.093 -15.462 5.444 0 5.444 c
+0 0 l
+f
+Q
+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
+-3.111 -1.225 -7.249 -3.37 -10.633 -9.471 c
+-11.685 -11.368 -15.021 -18.084 -13.796 -24.877 c
+-12.453 -32.323 -5.461 -39.362 6.714 -37.218 c
+28.943 -33.304 28.97 -11.255 15.609 -2.301 c
+7.856 2.895 0.038 0.056 0 0 c
+0 4.778 l
+15.462 4.778 27.999 -7.759 27.999 -23.221 c
+27.999 -38.683 15.462 -51.22 0 -51.22 c
+-15.462 -51.22 -27.999 -38.683 -27.999 -23.221 c
+-27.999 -7.759 -15.462 4.778 0 4.778 c
+0 0 l
+f
+Q
+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
+-2.14 -0.758 -7.426 -2.783 -11.14 -9.4 c
+-12.536 -11.888 -15.643 -18.441 -14.343 -25.552 c
+-13.349 -30.994 -7.597 -40.716 7.05 -38.567 c
+28.064 -35.482 30.902 -13.127 16.17 -2.838 c
+7.979 2.883 0.04 0.057 0 0 c
+0 4.167 l
+15.462 4.167 27.999 -8.37 27.999 -23.832 c
+27.999 -39.293 15.462 -51.831 0 -51.831 c
+-15.462 -51.831 -27.999 -39.293 -27.999 -23.832 c
+-27.999 -8.37 -15.462 4.167 0 4.167 c
+0 0 l
+f
+Q
+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
+-3.037 -0.996 -8.057 -3.068 -11.887 -9.807 c
+-12.95 -11.676 -16.306 -18.381 -14.886 -26.189 c
+-13.692 -32.763 -6.813 -41.824 7.243 -39.849 c
+28.687 -36.835 31.471 -13.847 16.374 -3.144 c
+8.08 2.736 0.041 0.056 0 0 c
+0 3.595 l
+15.462 3.595 27.999 -8.942 27.999 -24.404 c
+27.999 -39.866 15.462 -52.403 0 -52.403 c
+-15.462 -52.403 -27.999 -39.866 -27.999 -24.404 c
+-27.999 -8.942 -15.462 3.595 0 3.595 c
+0 0 l
+f
+Q
+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
+-5.52 -1.667 -9.765 -5.26 -12.073 -9.267 c
+-15.394 -15.036 -16.522 -20.932 -15.426 -26.791 c
+-13.856 -35.176 -5.227 -43.01 7.675 -41.012 c
+29.382 -37.65 31.673 -13.956 16.092 -3.122 c
+8.188 2.374 0.041 0.052 0 0 c
+0 3.058 l
+15.462 3.058 27.999 -9.479 27.999 -24.941 c
+27.999 -40.403 15.462 -52.94 0 -52.94 c
+-15.462 -52.94 -27.999 -40.403 -27.999 -24.941 c
+-27.999 -9.479 -15.462 3.058 0 3.058 c
+0 0 l
+f
+Q
+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
+-5.628 -1.543 -10.186 -5.222 -12.509 -9.206 c
+-13.794 -11.411 -17.706 -18.119 -15.958 -27.368 c
+-14.312 -36.085 -5.369 -44.227 7.962 -42.147 c
+29.823 -38.738 32.256 -15.066 16.713 -3.752 c
+8.241 2.415 0.041 0.054 0 0 c
+0 2.543 l
+15.462 2.543 27.999 -9.994 27.999 -25.456 c
+27.999 -40.918 15.462 -53.455 0 -53.455 c
+-15.462 -53.455 -27.999 -40.918 -27.999 -25.456 c
+-27.999 -9.994 -15.462 2.543 0 2.543 c
+0 0 l
+f
+Q
+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
+-5.005 -1.241 -10.021 -4.174 -13.317 -9.752 c
+-16.642 -15.38 -17.708 -21.487 -16.484 -27.902 c
+-14.771 -36.889 -5.522 -45.311 8.242 -43.22 c
+29.813 -39.944 32.242 -15.421 16.845 -4.05 c
+8.507 2.107 0.042 0.053 0 0 c
+0 2.07 l
+15.462 2.07 27.999 -10.467 27.999 -25.929 c
+27.999 -41.391 15.462 -53.928 0 -53.928 c
+-15.462 -53.928 -27.999 -41.391 -27.999 -25.929 c
+-27.999 -10.467 -15.462 2.07 0 2.07 c
+0 0 l
+f
+Q
+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
+-6.63 -1.321 -11.086 -5.48 -13.33 -8.99 c
+-17.823 -16.018 -17.96 -22.68 -17.283 -27.031 c
+-15.529 -38.308 -5.353 -45.633 6.914 -44.447 c
+29.053 -42.307 33.213 -18.564 18.588 -5.674 c
+9.722 2.142 0.051 0.062 0 0 c
+0 1.63 l
+15.462 1.63 27.999 -10.907 27.999 -26.369 c
+27.999 -41.831 15.462 -54.368 0 -54.368 c
+-15.462 -54.368 -27.999 -41.831 -27.999 -26.369 c
+-27.999 -10.907 -15.462 1.63 0 1.63 c
+0 0 l
+f
+Q
+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
+-5.333 -1.052 -10.598 -4.013 -13.752 -8.857 c
+-18.474 -16.108 -18.606 -22.979 -17.885 -27.465 c
+-16.272 -37.503 -7.101 -46.92 7.31 -45.499 c
+29.575 -43.3 33.52 -19.116 18.666 -5.999 c
+9.679 1.938 0.05 0.061 0 0 c
+0 1.219 l
+15.462 1.219 27.999 -11.318 27.999 -26.78 c
+27.999 -42.242 15.462 -54.779 0 -54.779 c
+-15.462 -54.779 -27.999 -42.242 -27.999 -26.78 c
+-27.999 -11.318 -15.462 1.219 0 1.219 c
+0 0 l
+f
+Q
+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
+-2.571 -0.429 -9.239 -1.713 -14.035 -8.521 c
+-19.337 -16.049 -19.04 -23.602 -18.666 -26.5 c
+-16.791 -41.035 -4.557 -47.119 6.015 -46.62 c
+29.237 -45.525 34.039 -19.966 18.705 -6.311 c
+9.693 1.714 0.05 0.059 0 0 c
+0 0.864 l
+15.462 0.864 27.999 -11.673 27.999 -27.135 c
+27.999 -42.597 15.462 -55.134 0 -55.134 c
+-15.462 -55.134 -27.999 -42.597 -27.999 -27.135 c
+-27.999 -11.673 -15.462 0.864 0 0.864 c
+0 0 l
+f
+Q
+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
+-5.616 -0.798 -11.203 -3.577 -14.553 -8.414 c
+-20.526 -17.037 -19.484 -25.015 -19.142 -27.636 c
+-17.325 -41.545 -4.721 -48.296 6.215 -47.587 c
+22.825 -46.511 31.838 -32.41 25.896 -16.796 c
+27.251 -20.083 27.999 -23.685 27.999 -27.46 c
+27.999 -42.922 15.462 -55.459 0 -55.459 c
+-15.462 -55.459 -27.999 -42.922 -27.999 -27.46 c
+-27.999 -11.999 -15.462 0.539 0 0.539 c
+0 0 l
+f
+Q
+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
+-3.74 -0.417 -10.183 -1.633 -15.334 -8.604 c
+-20.12 -15.081 -20.496 -23.225 -19.964 -27.016 c
+-18.071 -40.5 -7.311 -49.139 6.811 -48.512 c
+13.567 -48.212 30.458 -42.954 27.513 -22.495 c
+27.832 -24.187 27.999 -25.932 27.999 -27.716 c
+27.999 -43.178 15.462 -55.715 0 -55.715 c
+-15.462 -55.715 -27.999 -43.178 -27.999 -27.716 c
+-27.999 -12.254 -15.462 0.283 0 0.283 c
+0 0 l
+f
+Q
+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
+-5.862 -0.48 -11.762 -2.986 -15.367 -7.721 c
+-21.456 -15.72 -21.121 -23.999 -20.694 -27.186 c
+-18.877 -40.767 -7.134 -50.353 6.621 -49.484 c
+16.365 -48.869 27.809 -42.685 27.992 -27.284 c
+27.997 -27.491 27.999 -27.699 27.999 -27.907 c
+27.999 -43.369 15.462 -55.906 0 -55.906 c
+-15.462 -55.906 -27.999 -43.369 -27.999 -27.907 c
+-27.999 -12.445 -15.462 0.092 0 0.092 c
+0 0 l
+f
+Q
+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
+-5.653 -0.278 -11.171 -1.795 -16.407 -7.987 c
+-19.42 -11.549 -22.258 -18.906 -21.583 -25.522 c
+-19.025 -50.59 4.157 -50.418 5.143 -50.399 c
+17.394 -50.156 25.847 -43.167 27.756 -31.704 c
+25.941 -45.414 14.205 -55.995 0 -55.995 c
+-15.462 -55.995 -27.999 -43.458 -27.999 -27.996 c
+-27.999 -12.534 -15.462 0.003 0 0.003 c
+0 0 l
+f
+Q
+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
+6.848 -54.862 25.641 -52.169 31.069 -35.683 c
+27.625 -47.245 16.912 -55.678 4.231 -55.678 c
+-11.231 -55.678 -23.768 -43.141 -23.768 -27.679 c
+-23.768 -13.386 -13.055 -1.592 0.778 0.109 c
+0.544 0.077 0.232 0.04 0 0 c
+f
+Q
+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
+16.64 -51.054 30.629 -50.189 36.987 -37.91 c
+32.359 -46.995 22.917 -53.218 12.024 -53.218 c
+-3.438 -53.218 -15.975 -40.681 -15.975 -25.219 c
+-15.975 -12.683 -7.734 -2.069 3.625 1.499 c
+3.1 1.309 2.399 1.057 1.873 0.867 c
+1.31 0.61 0.543 0.297 0 0 c
+f
+Q
+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
+-5.58 8.375 -6.333 9.14 -7.046 9.74 c
+-7.103 9.788 -12.7 14.579 -12.706 14.929 c
+-12.708 15.035 -10.925 16.753 -10.74 16.825 c
+-10.058 17.086 -7.544 17.231 -6.875 17.166 c
+-5.111 16.992 -2.438 16.241 0.275 13.649 c
+3.79 10.293 4.269 6.382 4.332 5.263 c
+4.608 0.362 1.816 -1.553 1.125 -1.426 c
+0.589 -1.328 0.314 -0.445 0 0 c
+f
+Q
+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
+-5.072 6.832 -5.375 7.116 -5.591 7.34 c
+-5.844 7.601 -6.16 7.969 -6.419 8.224 c
+-6.913 8.711 -7.551 9.382 -8.074 9.839 c
+-9.724 11.281 -9.908 11.547 -9.911 11.595 c
+-9.914 11.655 -8.389 13.369 -8.295 13.411 c
+-7.711 13.674 -6.801 13.346 -6.164 13.276 c
+-2.962 12.927 -1.156 11.212 -0.476 10.566 c
+2.531 7.709 2.783 5.143 2.904 3.909 c
+2.938 3.565 2.929 0.875 2.709 0.41 c
+2.675 0.337 0.707 -0.875 0.645 -0.861 c
+0.33 -0.793 0.182 -0.267 0 0 c
+f
+Q
+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
+-3.148 3.894 -3.148 3.894 -3.897 4.678 c
+-4.212 5.008 -4.84 5.354 -4.922 5.803 c
+-4.014 7.981 l
+-3.953 8.007 -1.427 7.15 0.33 5.083 c
+1.631 3.552 2.397 0.755 2.281 0.574 c
+1.906 -0.01 0.699 -0.197 0.037 0.011 c
+0.026 0.014 0.011 -0.003 0 0 c
+f
+Q
+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
+-12.049 2.728 l
+-6.604 2.728 -1.522 1.173 2.777 -1.517 c
+2.232 -1.205 1.506 -0.789 0.961 -0.477 c
+0.673 -0.334 0.292 -0.134 0 0 c
+f
+Q
+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
+-8.263 1.243 l
+-4.866 1.243 -1.61 0.638 1.402 -0.47 c
+0.981 -0.329 0.425 -0.126 0 0 c
+f
+Q
+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
+-4.231 0.32 l
+-2.431 0.32 -0.671 0.15 1.035 -0.174 c
+0.724 -0.122 0.312 -0.042 0 0 c
+f
+Q
+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 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
+¾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 #ƒ.
+
+×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
+
+Ç`) •ø!|‹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
+0000046044 00000 n
+0000000004 00000 f
+0000000006 00000 f
+0000046095 00000 n
+0000000007 00000 f
+0000000008 00000 f
+0000000009 00000 f
+0000000010 00000 f
+0000000011 00000 f
+0000000012 00000 f
+0000000013 00000 f
+0000000014 00000 f
+0000000018 00000 f
+0000359516 00000 n
+0000372837 00000 n
+0000372868 00000 n
+0000000019 00000 f
+0000000020 00000 f
+0000000021 00000 f
+0000000022 00000 f
+0000000023 00000 f
+0000000024 00000 f
+0000000025 00000 f
+0000000026 00000 f
+0000000030 00000 f
+0000359585 00000 n
+0000372721 00000 n
+0000372752 00000 n
+0000000031 00000 f
+0000000032 00000 f
+0000000033 00000 f
+0000000034 00000 f
+0000000035 00000 f
+0000000036 00000 f
+0000000040 00000 f
+0000359656 00000 n
+0000372605 00000 n
+0000372636 00000 n
+0000000041 00000 f
+0000000042 00000 f
+0000000043 00000 f
+0000000044 00000 f
+0000000045 00000 f
+0000000046 00000 f
+0000000047 00000 f
+0000000048 00000 f
+0000000049 00000 f
+0000000050 00000 f
+0000000051 00000 f
+0000000052 00000 f
+0000000053 00000 f
+0000000054 00000 f
+0000000055 00000 f
+0000000056 00000 f
+0000000057 00000 f
+0000000058 00000 f
+0000000059 00000 f
+0000000060 00000 f
+0000000061 00000 f
+0000000062 00000 f
+0000000063 00000 f
+0000000064 00000 f
+0000000068 00000 f
+0000359726 00000 n
+0000372489 00000 n
+0000372520 00000 n
+0000000069 00000 f
+0000000070 00000 f
+0000000071 00000 f
+0000000072 00000 f
+0000000073 00000 f
+0000000074 00000 f
+0000000075 00000 f
+0000000076 00000 f
+0000000077 00000 f
+0000000081 00000 f
+0000359795 00000 n
+0000372373 00000 n
+0000372404 00000 n
+0000000082 00000 f
+0000000083 00000 f
+0000000084 00000 f
+0000000085 00000 f
+0000000086 00000 f
+0000000087 00000 f
+0000000088 00000 f
+0000000089 00000 f
+0000000093 00000 f
+0000359866 00000 n
+0000372257 00000 n
+0000372288 00000 n
+0000000094 00000 f
+0000000095 00000 f
+0000000096 00000 f
+0000000097 00000 f
+0000000098 00000 f
+0000000099 00000 f
+0000000100 00000 f
+0000000101 00000 f
+0000000102 00000 f
+0000000103 00000 f
+0000000104 00000 f
+0000000105 00000 f
+0000000106 00000 f
+0000000107 00000 f
+0000000108 00000 f
+0000000109 00000 f
+0000000110 00000 f
+0000000111 00000 f
+0000000112 00000 f
+0000000113 00000 f
+0000000114 00000 f
+0000000115 00000 f
+0000000119 00000 f
+0000359936 00000 n
+0000372139 00000 n
+0000372171 00000 n
+0000000120 00000 f
+0000000121 00000 f
+0000000122 00000 f
+0000000123 00000 f
+0000000124 00000 f
+0000000125 00000 f
+0000000126 00000 f
+0000000127 00000 f
+0000000128 00000 f
+0000000132 00000 f
+0000360008 00000 n
+0000372021 00000 n
+0000372053 00000 n
+0000000133 00000 f
+0000000134 00000 f
+0000000135 00000 f
+0000000136 00000 f
+0000000137 00000 f
+0000000138 00000 f
+0000000139 00000 f
+0000000140 00000 f
+0000000144 00000 f
+0000360082 00000 n
+0000371903 00000 n
+0000371935 00000 n
+0000000145 00000 f
+0000000146 00000 f
+0000000147 00000 f
+0000000148 00000 f
+0000000149 00000 f
+0000000150 00000 f
+0000000151 00000 f
+0000000152 00000 f
+0000000153 00000 f
+0000000154 00000 f
+0000000155 00000 f
+0000000156 00000 f
+0000000157 00000 f
+0000000158 00000 f
+0000000159 00000 f
+0000000160 00000 f
+0000000161 00000 f
+0000000162 00000 f
+0000000163 00000 f
+0000000164 00000 f
+0000000165 00000 f
+0000000166 00000 f
+0000000170 00000 f
+0000360155 00000 n
+0000371785 00000 n
+0000371817 00000 n
+0000000171 00000 f
+0000000172 00000 f
+0000000173 00000 f
+0000000174 00000 f
+0000000175 00000 f
+0000000176 00000 f
+0000000177 00000 f
+0000000178 00000 f
+0000000179 00000 f
+0000000183 00000 f
+0000360227 00000 n
+0000371667 00000 n
+0000371699 00000 n
+0000000184 00000 f
+0000000185 00000 f
+0000000186 00000 f
+0000000187 00000 f
+0000000188 00000 f
+0000000189 00000 f
+0000000190 00000 f
+0000000191 00000 f
+0000000195 00000 f
+0000360301 00000 n
+0000371549 00000 n
+0000371581 00000 n
+0000000196 00000 f
+0000000197 00000 f
+0000000198 00000 f
+0000000199 00000 f
+0000000200 00000 f
+0000000201 00000 f
+0000000202 00000 f
+0000000203 00000 f
+0000000204 00000 f
+0000000205 00000 f
+0000000206 00000 f
+0000000207 00000 f
+0000000208 00000 f
+0000000209 00000 f
+0000000210 00000 f
+0000000211 00000 f
+0000000212 00000 f
+0000000213 00000 f
+0000000214 00000 f
+0000000215 00000 f
+0000000216 00000 f
+0000000217 00000 f
+0000000221 00000 f
+0000360374 00000 n
+0000371431 00000 n
+0000371463 00000 n
+0000000222 00000 f
+0000000223 00000 f
+0000000224 00000 f
+0000000225 00000 f
+0000000226 00000 f
+0000000227 00000 f
+0000000228 00000 f
+0000000229 00000 f
+0000000230 00000 f
+0000000231 00000 f
+0000000232 00000 f
+0000000233 00000 f
+0000000234 00000 f
+0000000235 00000 f
+0000000236 00000 f
+0000000240 00000 f
+0000360446 00000 n
+0000371313 00000 n
+0000371345 00000 n
+0000000241 00000 f
+0000000242 00000 f
+0000000243 00000 f
+0000000244 00000 f
+0000000245 00000 f
+0000000246 00000 f
+0000000247 00000 f
+0000000248 00000 f
+0000000249 00000 f
+0000000250 00000 f
+0000000251 00000 f
+0000000252 00000 f
+0000000253 00000 f
+0000000254 00000 f
+0000000258 00000 f
+0000360520 00000 n
+0000371195 00000 n
+0000371227 00000 n
+0000000259 00000 f
+0000000260 00000 f
+0000000261 00000 f
+0000000262 00000 f
+0000000263 00000 f
+0000000264 00000 f
+0000000265 00000 f
+0000000266 00000 f
+0000000267 00000 f
+0000000268 00000 f
+0000000269 00000 f
+0000000270 00000 f
+0000000271 00000 f
+0000000272 00000 f
+0000000273 00000 f
+0000000274 00000 f
+0000000275 00000 f
+0000000276 00000 f
+0000000277 00000 f
+0000000278 00000 f
+0000000279 00000 f
+0000000280 00000 f
+0000000281 00000 f
+0000000282 00000 f
+0000000283 00000 f
+0000000284 00000 f
+0000000285 00000 f
+0000000286 00000 f
+0000000290 00000 f
+0000360593 00000 n
+0000371077 00000 n
+0000371109 00000 n
+0000000291 00000 f
+0000000292 00000 f
+0000000293 00000 f
+0000000294 00000 f
+0000000295 00000 f
+0000000296 00000 f
+0000000297 00000 f
+0000000298 00000 f
+0000000299 00000 f
+0000000300 00000 f
+0000000301 00000 f
+0000000302 00000 f
+0000000303 00000 f
+0000000304 00000 f
+0000000305 00000 f
+0000000309 00000 f
+0000360665 00000 n
+0000370959 00000 n
+0000370991 00000 n
+0000000310 00000 f
+0000000311 00000 f
+0000000312 00000 f
+0000000313 00000 f
+0000000314 00000 f
+0000000315 00000 f
+0000000316 00000 f
+0000000317 00000 f
+0000000318 00000 f
+0000000319 00000 f
+0000000320 00000 f
+0000000321 00000 f
+0000000322 00000 f
+0000000323 00000 f
+0000000327 00000 f
+0000360739 00000 n
+0000370841 00000 n
+0000370873 00000 n
+0000000328 00000 f
+0000000329 00000 f
+0000000330 00000 f
+0000000331 00000 f
+0000000332 00000 f
+0000000333 00000 f
+0000000334 00000 f
+0000000335 00000 f
+0000000336 00000 f
+0000000337 00000 f
+0000000338 00000 f
+0000000339 00000 f
+0000000340 00000 f
+0000000341 00000 f
+0000000342 00000 f
+0000000343 00000 f
+0000000344 00000 f
+0000000345 00000 f
+0000000346 00000 f
+0000000347 00000 f
+0000000348 00000 f
+0000000349 00000 f
+0000000350 00000 f
+0000000351 00000 f
+0000000352 00000 f
+0000000353 00000 f
+0000000354 00000 f
+0000000355 00000 f
+0000000359 00000 f
+0000360812 00000 n
+0000370723 00000 n
+0000370755 00000 n
+0000000360 00000 f
+0000000361 00000 f
+0000000362 00000 f
+0000000363 00000 f
+0000000364 00000 f
+0000000365 00000 f
+0000000366 00000 f
+0000000367 00000 f
+0000000368 00000 f
+0000000369 00000 f
+0000000370 00000 f
+0000000371 00000 f
+0000000372 00000 f
+0000000373 00000 f
+0000000374 00000 f
+0000000378 00000 f
+0000360884 00000 n
+0000370605 00000 n
+0000370637 00000 n
+0000000379 00000 f
+0000000380 00000 f
+0000000381 00000 f
+0000000382 00000 f
+0000000383 00000 f
+0000000384 00000 f
+0000000385 00000 f
+0000000386 00000 f
+0000000387 00000 f
+0000000388 00000 f
+0000000389 00000 f
+0000000390 00000 f
+0000000391 00000 f
+0000000392 00000 f
+0000000396 00000 f
+0000360958 00000 n
+0000370487 00000 n
+0000370519 00000 n
+0000000397 00000 f
+0000000398 00000 f
+0000000399 00000 f
+0000000400 00000 f
+0000000401 00000 f
+0000000402 00000 f
+0000000403 00000 f
+0000000404 00000 f
+0000000405 00000 f
+0000000406 00000 f
+0000000407 00000 f
+0000000408 00000 f
+0000000409 00000 f
+0000000410 00000 f
+0000000411 00000 f
+0000000412 00000 f
+0000000413 00000 f
+0000000414 00000 f
+0000000415 00000 f
+0000000416 00000 f
+0000000417 00000 f
+0000000418 00000 f
+0000000419 00000 f
+0000000420 00000 f
+0000000421 00000 f
+0000000422 00000 f
+0000000423 00000 f
+0000000424 00000 f
+0000000428 00000 f
+0000361031 00000 n
+0000370369 00000 n
+0000370401 00000 n
+0000000429 00000 f
+0000000430 00000 f
+0000000431 00000 f
+0000000432 00000 f
+0000000433 00000 f
+0000000434 00000 f
+0000000435 00000 f
+0000000436 00000 f
+0000000437 00000 f
+0000000438 00000 f
+0000000439 00000 f
+0000000440 00000 f
+0000000441 00000 f
+0000000442 00000 f
+0000000443 00000 f
+0000000447 00000 f
+0000361103 00000 n
+0000370251 00000 n
+0000370283 00000 n
+0000000448 00000 f
+0000000449 00000 f
+0000000450 00000 f
+0000000451 00000 f
+0000000452 00000 f
+0000000453 00000 f
+0000000454 00000 f
+0000000455 00000 f
+0000000456 00000 f
+0000000457 00000 f
+0000000458 00000 f
+0000000459 00000 f
+0000000460 00000 f
+0000000461 00000 f
+0000000465 00000 f
+0000361175 00000 n
+0000370133 00000 n
+0000370165 00000 n
+0000000466 00000 f
+0000000467 00000 f
+0000000468 00000 f
+0000000469 00000 f
+0000000470 00000 f
+0000000471 00000 f
+0000000472 00000 f
+0000000473 00000 f
+0000000474 00000 f
+0000000475 00000 f
+0000000476 00000 f
+0000000477 00000 f
+0000000478 00000 f
+0000000479 00000 f
+0000000483 00000 f
+0000361249 00000 n
+0000370015 00000 n
+0000370047 00000 n
+0000000484 00000 f
+0000000485 00000 f
+0000000486 00000 f
+0000000487 00000 f
+0000000488 00000 f
+0000000489 00000 f
+0000000490 00000 f
+0000000491 00000 f
+0000000492 00000 f
+0000000493 00000 f
+0000000494 00000 f
+0000000495 00000 f
+0000000496 00000 f
+0000000497 00000 f
+0000000498 00000 f
+0000000499 00000 f
+0000000500 00000 f
+0000000501 00000 f
+0000000502 00000 f
+0000000503 00000 f
+0000000504 00000 f
+0000000505 00000 f
+0000000506 00000 f
+0000000507 00000 f
+0000000508 00000 f
+0000000509 00000 f
+0000000510 00000 f
+0000000511 00000 f
+0000000512 00000 f
+0000000513 00000 f
+0000000514 00000 f
+0000000518 00000 f
+0000361322 00000 n
+0000369897 00000 n
+0000369929 00000 n
+0000000519 00000 f
+0000000520 00000 f
+0000000521 00000 f
+0000000522 00000 f
+0000000523 00000 f
+0000000524 00000 f
+0000000525 00000 f
+0000000526 00000 f
+0000000527 00000 f
+0000000528 00000 f
+0000000529 00000 f
+0000000530 00000 f
+0000000531 00000 f
+0000000532 00000 f
+0000000533 00000 f
+0000000537 00000 f
+0000361394 00000 n
+0000369779 00000 n
+0000369811 00000 n
+0000000538 00000 f
+0000000539 00000 f
+0000000540 00000 f
+0000000541 00000 f
+0000000542 00000 f
+0000000543 00000 f
+0000000544 00000 f
+0000000545 00000 f
+0000000546 00000 f
+0000000547 00000 f
+0000000548 00000 f
+0000000549 00000 f
+0000000550 00000 f
+0000000551 00000 f
+0000000555 00000 f
+0000361466 00000 n
+0000369661 00000 n
+0000369693 00000 n
+0000000556 00000 f
+0000000557 00000 f
+0000000558 00000 f
+0000000559 00000 f
+0000000560 00000 f
+0000000561 00000 f
+0000000562 00000 f
+0000000563 00000 f
+0000000564 00000 f
+0000000565 00000 f
+0000000566 00000 f
+0000000567 00000 f
+0000000568 00000 f
+0000000569 00000 f
+0000000573 00000 f
+0000361540 00000 n
+0000369543 00000 n
+0000369575 00000 n
+0000000574 00000 f
+0000000575 00000 f
+0000000576 00000 f
+0000000577 00000 f
+0000000578 00000 f
+0000000579 00000 f
+0000000580 00000 f
+0000000581 00000 f
+0000000582 00000 f
+0000000583 00000 f
+0000000584 00000 f
+0000000585 00000 f
+0000000586 00000 f
+0000000587 00000 f
+0000000588 00000 f
+0000000589 00000 f
+0000000590 00000 f
+0000000591 00000 f
+0000000592 00000 f
+0000000593 00000 f
+0000000594 00000 f
+0000000595 00000 f
+0000000596 00000 f
+0000000597 00000 f
+0000000598 00000 f
+0000000599 00000 f
+0000000600 00000 f
+0000000601 00000 f
+0000000602 00000 f
+0000000603 00000 f
+0000000604 00000 f
+0000000608 00000 f
+0000361613 00000 n
+0000369425 00000 n
+0000369457 00000 n
+0000000609 00000 f
+0000000610 00000 f
+0000000611 00000 f
+0000000612 00000 f
+0000000613 00000 f
+0000000614 00000 f
+0000000615 00000 f
+0000000616 00000 f
+0000000617 00000 f
+0000000618 00000 f
+0000000619 00000 f
+0000000620 00000 f
+0000000621 00000 f
+0000000622 00000 f
+0000000623 00000 f
+0000000627 00000 f
+0000361685 00000 n
+0000369307 00000 n
+0000369339 00000 n
+0000000628 00000 f
+0000000629 00000 f
+0000000630 00000 f
+0000000631 00000 f
+0000000632 00000 f
+0000000633 00000 f
+0000000634 00000 f
+0000000635 00000 f
+0000000636 00000 f
+0000000637 00000 f
+0000000638 00000 f
+0000000639 00000 f
+0000000640 00000 f
+0000000641 00000 f
+0000000645 00000 f
+0000361757 00000 n
+0000369189 00000 n
+0000369221 00000 n
+0000000646 00000 f
+0000000647 00000 f
+0000000648 00000 f
+0000000649 00000 f
+0000000650 00000 f
+0000000651 00000 f
+0000000652 00000 f
+0000000653 00000 f
+0000000654 00000 f
+0000000655 00000 f
+0000000656 00000 f
+0000000657 00000 f
+0000000658 00000 f
+0000000659 00000 f
+0000000663 00000 f
+0000361831 00000 n
+0000369071 00000 n
+0000369103 00000 n
+0000000664 00000 f
+0000000665 00000 f
+0000000666 00000 f
+0000000667 00000 f
+0000000668 00000 f
+0000000669 00000 f
+0000000670 00000 f
+0000000671 00000 f
+0000000672 00000 f
+0000000673 00000 f
+0000000674 00000 f
+0000000675 00000 f
+0000000676 00000 f
+0000000677 00000 f
+0000000678 00000 f
+0000000679 00000 f
+0000000680 00000 f
+0000000681 00000 f
+0000000682 00000 f
+0000000683 00000 f
+0000000684 00000 f
+0000000685 00000 f
+0000000686 00000 f
+0000000687 00000 f
+0000000688 00000 f
+0000000689 00000 f
+0000000690 00000 f
+0000000691 00000 f
+0000000692 00000 f
+0000000693 00000 f
+0000000694 00000 f
+0000000698 00000 f
+0000361904 00000 n
+0000368953 00000 n
+0000368985 00000 n
+0000000702 00000 f
+0000361975 00000 n
+0000368835 00000 n
+0000368867 00000 n
+0000000703 00000 f
+0000000704 00000 f
+0000000705 00000 f
+0000000706 00000 f
+0000000707 00000 f
+0000000708 00000 f
+0000000709 00000 f
+0000000710 00000 f
+0000000711 00000 f
+0000000712 00000 f
+0000000713 00000 f
+0000000714 00000 f
+0000000715 00000 f
+0000000716 00000 f
+0000000717 00000 f
+0000000721 00000 f
+0000362047 00000 n
+0000368717 00000 n
+0000368749 00000 n
+0000000722 00000 f
+0000000723 00000 f
+0000000724 00000 f
+0000000725 00000 f
+0000000726 00000 f
+0000000727 00000 f
+0000000728 00000 f
+0000000729 00000 f
+0000000730 00000 f
+0000000731 00000 f
+0000000732 00000 f
+0000000733 00000 f
+0000000734 00000 f
+0000000738 00000 f
+0000362119 00000 n
+0000368599 00000 n
+0000368631 00000 n
+0000000739 00000 f
+0000000740 00000 f
+0000000741 00000 f
+0000000742 00000 f
+0000000743 00000 f
+0000000744 00000 f
+0000000745 00000 f
+0000000746 00000 f
+0000000747 00000 f
+0000000748 00000 f
+0000000749 00000 f
+0000000750 00000 f
+0000000751 00000 f
+0000000752 00000 f
+0000000756 00000 f
+0000362193 00000 n
+0000368481 00000 n
+0000368513 00000 n
+0000000757 00000 f
+0000000758 00000 f
+0000000759 00000 f
+0000000760 00000 f
+0000000761 00000 f
+0000000762 00000 f
+0000000763 00000 f
+0000000764 00000 f
+0000000765 00000 f
+0000000766 00000 f
+0000000767 00000 f
+0000000768 00000 f
+0000000769 00000 f
+0000000770 00000 f
+0000000771 00000 f
+0000000772 00000 f
+0000000773 00000 f
+0000000774 00000 f
+0000000775 00000 f
+0000000776 00000 f
+0000000777 00000 f
+0000000778 00000 f
+0000000779 00000 f
+0000000780 00000 f
+0000000781 00000 f
+0000000782 00000 f
+0000000783 00000 f
+0000000784 00000 f
+0000000788 00000 f
+0000362266 00000 n
+0000368363 00000 n
+0000368395 00000 n
+0000000792 00000 f
+0000362337 00000 n
+0000368245 00000 n
+0000368277 00000 n
+0000000793 00000 f
+0000000794 00000 f
+0000000795 00000 f
+0000000796 00000 f
+0000000797 00000 f
+0000000798 00000 f
+0000000799 00000 f
+0000000800 00000 f
+0000000801 00000 f
+0000000802 00000 f
+0000000803 00000 f
+0000000804 00000 f
+0000000805 00000 f
+0000000806 00000 f
+0000000807 00000 f
+0000000811 00000 f
+0000362409 00000 n
+0000368127 00000 n
+0000368159 00000 n
+0000000812 00000 f
+0000000813 00000 f
+0000000814 00000 f
+0000000815 00000 f
+0000000816 00000 f
+0000000817 00000 f
+0000000818 00000 f
+0000000819 00000 f
+0000000820 00000 f
+0000000821 00000 f
+0000000822 00000 f
+0000000823 00000 f
+0000000824 00000 f
+0000000828 00000 f
+0000362481 00000 n
+0000368009 00000 n
+0000368041 00000 n
+0000000829 00000 f
+0000000830 00000 f
+0000000831 00000 f
+0000000832 00000 f
+0000000833 00000 f
+0000000834 00000 f
+0000000835 00000 f
+0000000836 00000 f
+0000000837 00000 f
+0000000838 00000 f
+0000000839 00000 f
+0000000840 00000 f
+0000000841 00000 f
+0000000842 00000 f
+0000000846 00000 f
+0000362555 00000 n
+0000367891 00000 n
+0000367923 00000 n
+0000000847 00000 f
+0000000848 00000 f
+0000000849 00000 f
+0000000850 00000 f
+0000000851 00000 f
+0000000852 00000 f
+0000000853 00000 f
+0000000854 00000 f
+0000000855 00000 f
+0000000856 00000 f
+0000000857 00000 f
+0000000858 00000 f
+0000000859 00000 f
+0000000860 00000 f
+0000000861 00000 f
+0000000862 00000 f
+0000000863 00000 f
+0000000864 00000 f
+0000000865 00000 f
+0000000866 00000 f
+0000000867 00000 f
+0000000868 00000 f
+0000000869 00000 f
+0000000870 00000 f
+0000000871 00000 f
+0000000872 00000 f
+0000000873 00000 f
+0000000874 00000 f
+0000000875 00000 f
+0000000876 00000 f
+0000000877 00000 f
+0000000881 00000 f
+0000362628 00000 n
+0000367773 00000 n
+0000367805 00000 n
+0000000885 00000 f
+0000362699 00000 n
+0000367655 00000 n
+0000367687 00000 n
+0000000886 00000 f
+0000000887 00000 f
+0000000888 00000 f
+0000000889 00000 f
+0000000890 00000 f
+0000000891 00000 f
+0000000892 00000 f
+0000000893 00000 f
+0000000894 00000 f
+0000000895 00000 f
+0000000896 00000 f
+0000000897 00000 f
+0000000898 00000 f
+0000000899 00000 f
+0000000900 00000 f
+0000000904 00000 f
+0000362771 00000 n
+0000367537 00000 n
+0000367569 00000 n
+0000000905 00000 f
+0000000906 00000 f
+0000000907 00000 f
+0000000908 00000 f
+0000000909 00000 f
+0000000910 00000 f
+0000000911 00000 f
+0000000912 00000 f
+0000000913 00000 f
+0000000914 00000 f
+0000000915 00000 f
+0000000916 00000 f
+0000000917 00000 f
+0000000921 00000 f
+0000362843 00000 n
+0000367419 00000 n
+0000367451 00000 n
+0000000922 00000 f
+0000000923 00000 f
+0000000924 00000 f
+0000000925 00000 f
+0000000926 00000 f
+0000000927 00000 f
+0000000928 00000 f
+0000000929 00000 f
+0000000930 00000 f
+0000000931 00000 f
+0000000932 00000 f
+0000000933 00000 f
+0000000934 00000 f
+0000000935 00000 f
+0000000939 00000 f
+0000362917 00000 n
+0000367301 00000 n
+0000367333 00000 n
+0000000940 00000 f
+0000000941 00000 f
+0000000942 00000 f
+0000000943 00000 f
+0000000944 00000 f
+0000000945 00000 f
+0000000946 00000 f
+0000000947 00000 f
+0000000948 00000 f
+0000000949 00000 f
+0000000950 00000 f
+0000000951 00000 f
+0000000952 00000 f
+0000000953 00000 f
+0000000954 00000 f
+0000000955 00000 f
+0000000956 00000 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
+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
+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/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_to_object_big.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_to_object_big.png
new file mode 100644
index 0000000000..ef2615bacc
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/type_to_object_big.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/typebg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/typebg.gif
new file mode 100644
index 0000000000..2fcc77b2e8
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/typebg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/unselected.png b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/unselected.png
new file mode 100644
index 0000000000..d5ac639405
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/unselected.png
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/valuemembersbg.gif b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/valuemembersbg.gif
new file mode 100644
index 0000000000..2a949311d7
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/valuemembersbg.gif
Binary files differ
diff --git a/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/versions.txt b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/versions.txt
new file mode 100644
index 0000000000..17d1caeb66
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/html/resource/lib/versions.txt
@@ -0,0 +1 @@
+jquery=1.4.2
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/CommentFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/CommentFactory.scala
new file mode 100644
index 0000000000..4e06e5bd16
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/CommentFactory.scala
@@ -0,0 +1,100 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc
+package doc
+package model
+
+import base.comment._
+
+import reporters.Reporter
+import scala.collection._
+import scala.reflect.internal.util.{NoPosition, Position}
+import scala.language.postfixOps
+
+/** The comment parser transforms raw comment strings into `Comment` objects.
+ * Call `parse` to run the parser. Note that the parser is stateless and
+ * should only be built once for a given Scaladoc run.
+ *
+ * @author Manohar Jonnalagedda
+ * @author Gilles Dubochet */
+trait CommentFactory extends base.CommentFactoryBase {
+ thisFactory: ModelFactory with CommentFactory with MemberLookup =>
+
+ val global: Global
+ import global.{ reporter, definitions, Symbol, NoSymbol }
+
+ protected val commentCache = mutable.HashMap.empty[(Symbol, DocTemplateImpl), Option[Comment]]
+
+ def comment(sym: Symbol, linkTarget: DocTemplateImpl, inTpl: DocTemplateImpl): Option[Comment] =
+ commentCache.getOrElseUpdate((sym, inTpl), {
+ defineComment(sym, linkTarget, inTpl)
+ })
+
+ /** A comment is usualy created by the parser, however for some special
+ * cases we have to give some `inTpl` comments (parent class for example)
+ * to the comment of the symbol.
+ * This function manages some of those cases : Param accessor and Primary constructor */
+ def defineComment(sym: Symbol, linkTarget: DocTemplateImpl, inTpl: DocTemplateImpl):Option[Comment] = {
+
+ //param accessor case
+ // We just need the @param argument, we put it into the body
+ if( sym.isParamAccessor &&
+ inTpl.comment.isDefined &&
+ inTpl.comment.get.valueParams.isDefinedAt(sym.encodedName)) {
+ val comContent = Some(inTpl.comment.get.valueParams(sym.encodedName))
+ Some(createComment(body0 = comContent))
+ }
+
+ // Primary constructor case
+ // We need some content of the class definition : @constructor for the body,
+ // @param and @deprecated, we can add some more if necessary
+ else if (sym.isPrimaryConstructor && inTpl.comment.isDefined ) {
+ val tplComment = inTpl.comment.get
+ // If there is nothing to put into the comment there is no need to create it
+ if(tplComment.constructor.isDefined ||
+ tplComment.throws != Map.empty ||
+ tplComment.valueParams != Map.empty ||
+ tplComment.typeParams != Map.empty ||
+ tplComment.deprecated.isDefined
+ )
+ Some(createComment( body0 = tplComment.constructor,
+ throws0 = tplComment.throws,
+ valueParams0 = tplComment.valueParams,
+ typeParams0 = tplComment.typeParams,
+ deprecated0 = tplComment.deprecated
+ ))
+ else None
+ }
+
+ //other comment cases
+ // parse function will make the comment
+ else {
+ val rawComment = global.expandedDocComment(sym, inTpl.sym).trim
+ if (rawComment != "") {
+ val c = parse(rawComment, global.rawDocComment(sym), global.docCommentPos(sym), linkTarget)
+ Some(c)
+ }
+ else None
+ }
+
+ }
+
+ protected def parse(comment: String, src: String, pos: Position, linkTarget: DocTemplateImpl): Comment = {
+ val sym = if (linkTarget eq null) NoSymbol else linkTarget.sym
+ parseAtSymbol(comment, src, pos, sym)
+ }
+
+ /** Parses a string containing wiki syntax into a `Comment` object.
+ * Note that the string is assumed to be clean:
+ * - Removed Scaladoc start and end markers.
+ * - Removed start-of-line star and one whitespace afterwards (if present).
+ * - Removed all end-of-line whitespace.
+ * - Only `endOfLine` is used to mark line endings. */
+ def parseWiki(string: String, pos: Position, inTpl: DocTemplateImpl): Body = {
+ val sym = if (inTpl eq null) NoSymbol else inTpl.sym
+ parseWikiAtSymbol(string,pos, sym)
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/Entity.scala b/src/scaladoc/scala/tools/nsc/doc/model/Entity.scala
new file mode 100644
index 0000000000..6932f01e9a
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/Entity.scala
@@ -0,0 +1,597 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Manohar Jonnalagedda
+ * @author Gilles Dubochet
+ */
+
+package scala.tools.nsc
+package doc
+package model
+
+import scala.collection._
+import base.comment._
+import diagram._
+
+/** An entity in a Scaladoc universe. Entities are declarations in the program and correspond to symbols in the
+ * compiler. Entities model the following Scala concepts:
+ * - classes and traits;
+ * - objects and package;
+ * - constructors;
+ * - methods;
+ * - values, lazy values, and variables;
+ * - abstract type members and type aliases;
+ * - type and value parameters;
+ * - annotations. */
+trait Entity {
+ /** The name of the entity. Note that the name does not qualify this entity uniquely; use its `qualifiedName`
+ * instead. */
+ def name : String
+
+ /** The qualified name of the entity. This is this entity's name preceded by the qualified name of the template
+ * of which this entity is a member. The qualified name is unique to this entity. */
+ def qualifiedName: String
+
+ /** The template of which this entity is a member. */
+ def inTemplate: TemplateEntity
+
+ /** The list of entities such that each is a member of the entity that follows it; the first entity is always this
+ * entity, the last the root package entity. */
+ def toRoot: List[Entity]
+
+ /** The qualified name of this entity. */
+ override def toString = qualifiedName
+
+ /** The Scaladoc universe of which this entity is a member. */
+ def universe: Universe
+
+ /** The annotations attached to this entity, if any. */
+ def annotations: List[Annotation]
+
+ /** The kind of the entity */
+ def kind: String
+
+ /** Whether or not the template was defined in a package object */
+ def inPackageObject: Boolean
+
+ /** Indicates whether this entity lives in the types namespace (classes, traits, abstract/alias types) */
+ def isType: Boolean
+}
+
+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
+ * [scala.tools.nsc.doc.model.DocTemplateEntity]. */
+trait TemplateEntity extends Entity {
+
+ /** Whether this template is a package (including the root package). */
+ def isPackage: Boolean
+
+ /** Whether this template is the root package. */
+ def isRootPackage: Boolean
+
+ /** Whether this template is a trait. */
+ def isTrait: Boolean
+
+ /** Whether this template is a class. */
+ def isClass: Boolean
+
+ /** Whether this template is an object. */
+ def isObject: Boolean
+
+ /** Whether documentation is available for this template. */
+ def isDocTemplate: Boolean
+
+ /** Whether this template is a case class. */
+ def isCaseClass: Boolean
+
+ /** The self-type of this template, if it differs from the template type. */
+ def selfType : Option[TypeEntity]
+}
+
+
+/** An entity that is a member of a template. All entities, including templates, are member of another entity
+ * except for parameters and annotations. Note that all members of a template are modelled, including those that are
+ * inherited and not declared locally. */
+trait MemberEntity extends Entity {
+
+ /** The comment attached to this member, if any. */
+ def comment: Option[Comment]
+
+ /** The group this member is from */
+ def group: String
+
+ /** The template of which this entity is a member. */
+ def inTemplate: DocTemplateEntity
+
+ /** The list of entities such that each is a member of the entity that follows it; the first entity is always this
+ * member, the last the root package entity. */
+ def toRoot: List[MemberEntity]
+
+ /** The templates in which this member has been declared. The first element of the list is the template that contains
+ * the currently active declaration of this member, subsequent elements are declarations that have been overriden. If
+ * the first element is equal to `inTemplate`, the member is declared locally, if not, it has been inherited. All
+ * elements of this list are in the linearization of `inTemplate`. */
+ def inDefinitionTemplates: List[TemplateEntity]
+
+ /** The qualified name of the member in its currently active declaration template. */
+ def definitionName: String
+
+ /** The visibility of this member. Note that members with restricted visibility may not be modeled in some
+ * universes. */
+ def visibility: Visibility
+
+ /** The flags that have been set for this entity. The following flags are supported: `implicit`, `sealed`, `abstract`,
+ * and `final`. */
+ def flags: List[Paragraph]
+
+ /** Some deprecation message if this member is deprecated, or none otherwise. */
+ def deprecation: Option[Body]
+
+ /** Some migration warning if this member has a migration annotation, or none otherwise. */
+ def migration: Option[Body]
+
+ /** For members representing values: the type of the value returned by this member; for members
+ * representing types: the type itself. */
+ def resultType: TypeEntity
+
+ /** Whether this member is a method. */
+ def isDef: Boolean
+
+ /** Whether this member is a value (this excludes lazy values). */
+ def isVal: Boolean
+
+ /** Whether this member is a lazy value. */
+ def isLazyVal: Boolean
+
+ /** Whether this member is a variable. */
+ def isVar: Boolean
+
+ /** Whether this member is a constructor. */
+ def isConstructor: Boolean
+
+ /** Whether this member is an alias type. */
+ def isAliasType: Boolean
+
+ /** Whether this member is an abstract type. */
+ def isAbstractType: Boolean
+
+ /** Whether this member is abstract. */
+ def isAbstract: Boolean
+
+ /** If this symbol is a use case, the useCaseOf will contain the member it was derived from, containing the full
+ * signature and the complete parameter descriptions. */
+ def useCaseOf: Option[MemberEntity]
+
+ /** If this member originates from an implicit conversion, we set the implicit information to the correct origin */
+ def byConversion: Option[ImplicitConversion]
+
+ /** The identity of this member, used for linking */
+ def signature: String
+
+ /** Compatibility signature, will be removed from future versions */
+ def signatureCompat: String
+
+ /** Indicates whether the member is inherited by implicit conversion */
+ def isImplicitlyInherited: Boolean
+
+ /** Indicates whether there is another member with the same name in the template that will take precendence */
+ def isShadowedImplicit: Boolean
+
+ /** Indicates whether there are other implicitly inherited members that have similar signatures (and thus they all
+ * become ambiguous) */
+ def isAmbiguousImplicit: Boolean
+
+ /** Indicates whether the implicitly inherited member is shadowed or ambiguous in its template */
+ def isShadowedOrAmbiguousImplicit: 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 {
+
+ /** The type parameters of this entity. */
+ def typeParams: List[TypeParam]
+}
+
+
+/** A template (class, trait, object or package) which is referenced in the universe, but for which no further
+ * documentation is available. Only templates for which a source file is given are documented by Scaladoc. */
+trait NoDocTemplate extends TemplateEntity {
+ def kind =
+ if (isClass) "class"
+ else if (isTrait) "trait"
+ else if (isObject) "object"
+ else ""
+}
+
+/** An inherited template that was not documented in its original owner - example:
+ * in classpath: trait T { class C } -- T (and implicitly C) are not documented
+ * in the source: trait U extends T -- C appears in U as a MemberTemplateImpl
+ * -- that is, U has a member for it but C doesn't get its own page */
+trait MemberTemplateEntity extends TemplateEntity with MemberEntity with HigherKinded {
+
+ /** The value parameters of this case class, or an empty list if this class is not a case class. As case class value
+ * parameters cannot be curried, the outer list has exactly one element. */
+ def valueParams: List[List[ValueParam]]
+
+ /** The direct super-type of this template
+ e.g: {{{class A extends B[C[Int]] with D[E]}}} will have two direct parents: class B and D
+ NOTE: we are dropping the refinement here! */
+ def parentTypes: List[(TemplateEntity, TypeEntity)]
+}
+
+/** A template (class, trait, object or package) for which documentation is available. Only templates for which
+ * a source file is given are documented by Scaladoc. */
+trait DocTemplateEntity extends MemberTemplateEntity {
+
+ /** The list of templates such that each is a member of the template that follows it; the first template is always
+ * this template, the last the root package entity. */
+ def toRoot: List[DocTemplateEntity]
+
+ /** The source file in which the current template is defined and the line where the definition starts, if they exist.
+ * A source file exists for all templates, except for those that are generated synthetically by Scaladoc. */
+ def inSource: Option[(io.AbstractFile, Int)]
+
+ /** An HTTP address at which the source of this template is available, if it is available. An address is available
+ * only if the `docsourceurl` setting has been set. */
+ def sourceUrl: Option[java.net.URL]
+
+ /** All class, trait and object templates which are part of this template's linearization, in lineratization order.
+ * This template's linearization contains all of its direct and indirect super-classes and super-traits. */
+ def linearizationTemplates: List[TemplateEntity]
+
+ /** All instantiated types which are part of this template's linearization, in lineratization order.
+ * This template's linearization contains all of its direct and indirect super-types. */
+ def linearizationTypes: List[TypeEntity]
+
+ /** All class, trait and object templates for which this template is a *direct* super-class or super-trait.
+ * Only templates for which documentation is available in the universe (`DocTemplateEntity`) are listed. */
+ def directSubClasses: List[DocTemplateEntity]
+
+ /** All members of this template. If this template is a package, only templates for which documentation is available
+ * in the universe (`DocTemplateEntity`) are listed. */
+ def members: List[MemberEntity]
+
+ /** All templates that are members of this template. If this template is a package, only templates for which
+ * documentation is available in the universe (`DocTemplateEntity`) are listed. */
+ def templates: List[TemplateEntity with MemberEntity]
+
+ /** All methods that are members of this template. */
+ def methods: List[Def]
+
+ /** All values, lazy values and variables that are members of this template. */
+ def values: List[Val]
+
+ /** All abstract types that are members of this template. */
+ def abstractTypes: List[AbstractType]
+
+ /** All type aliases that are members of this template. */
+ def aliasTypes: List[AliasType]
+
+ /** The primary constructor of this class, if it has been defined. */
+ def primaryConstructor: Option[Constructor]
+
+ /** All constructors of this class, including the primary constructor. */
+ def constructors: List[Constructor]
+
+ /** The companion of this template, or none. If a class and an object are defined as a pair of the same name, the
+ * other entity of the pair is the companion. */
+ def companion: Option[DocTemplateEntity]
+
+ /** The implicit conversions this template (class or trait, objects and packages are not affected) */
+ def conversions: List[ImplicitConversion]
+
+ /** The shadowing information for the implicitly added members */
+ def implicitsShadowing: Map[MemberEntity, ImplicitMemberShadowing]
+
+ /** Classes that can be implcitly converted to this class */
+ def incomingImplicitlyConvertedClasses: List[(DocTemplateEntity, ImplicitConversion)]
+
+ /** Classes to which this class can be implicitly converted to
+ NOTE: Some classes might not be included in the scaladoc run so they will be NoDocTemplateEntities */
+ def outgoingImplicitlyConvertedClasses: List[(TemplateEntity, TypeEntity, ImplicitConversion)]
+
+ /** If this template takes place in inheritance and implicit conversion relations, it will be shown in this diagram */
+ def inheritanceDiagram: Option[Diagram]
+
+ /** If this template contains other templates, such as classes and traits, they will be shown in this diagram */
+ def contentDiagram: Option[Diagram]
+
+ /** Returns the group description taken either from this template or its linearizationTypes */
+ def groupDescription(group: String): Option[Body]
+
+ /** Returns the group description taken either from this template or its linearizationTypes */
+ def groupPriority(group: String): Int
+
+ /** Returns the group description taken either from this template or its linearizationTypes */
+ def groupName(group: String): String
+}
+
+/** A trait template. */
+trait Trait extends MemberTemplateEntity {
+ def kind = "trait"
+}
+
+/** A class template. */
+trait Class extends MemberTemplateEntity {
+ override def kind = "class"
+}
+
+/** An object template. */
+trait Object extends MemberTemplateEntity {
+ def kind = "object"
+}
+
+/** A package template. A package is in the universe if it is declared as a package object, or if it
+ * contains at least one template. */
+trait Package extends DocTemplateEntity {
+
+ /** The package of which this package is a member. */
+ def inTemplate: Package
+
+ /** The package such that each is a member of the package that follows it; the first package is always this
+ * package, the last the root package. */
+ def toRoot: List[Package]
+
+ /** All packages that are member of this package. */
+ def packages: List[Package]
+
+ override def kind = "package"
+}
+
+
+/** The root package, which contains directly or indirectly all members in the universe. A universe
+ * contains exactly one root package. */
+trait RootPackage extends Package
+
+
+/** A non-template member (method, value, lazy value, variable, constructor, alias type, and abstract type). */
+trait NonTemplateMemberEntity extends MemberEntity {
+ /** Whether this member is a use case. A use case is a member which does not exist in the documented code.
+ * It corresponds to a real member, and provides a simplified, yet compatible signature for that member. */
+ def isUseCase: Boolean
+}
+
+
+/** A method (`def`) of a template. */
+trait Def extends NonTemplateMemberEntity with HigherKinded {
+
+ /** The value parameters of this method. Each parameter block of a curried method is an element of the list.
+ * Each parameter block is a list of value parameters. */
+ def valueParams : List[List[ValueParam]]
+
+ def kind = "method"
+}
+
+
+/** A constructor of a class. */
+trait Constructor extends NonTemplateMemberEntity {
+
+ /** Whether this is the primary constructor of a class. The primary constructor is defined syntactically as part of
+ * the declaration of the class. */
+ def isPrimary: Boolean
+
+ /** The value parameters of this constructor. As constructors cannot be curried, the outer list has exactly one
+ * element. */
+ def valueParams : List[List[ValueParam]]
+
+ def kind = "constructor"
+}
+
+
+/** A value (`val`), lazy val (`lazy val`) or variable (`var`) of a template. */
+trait Val extends NonTemplateMemberEntity {
+ def kind = "[lazy] value/variable"
+}
+
+
+/** An abstract type member of a template. */
+trait AbstractType extends MemberTemplateEntity with HigherKinded {
+
+ /** The lower bound for this abstract type, if it has been defined. */
+ def lo: Option[TypeEntity]
+
+ /** The upper bound for this abstract type, if it has been defined. */
+ def hi: Option[TypeEntity]
+
+ def kind = "abstract type"
+}
+
+
+/** An type alias of a template. */
+trait AliasType extends MemberTemplateEntity with HigherKinded {
+
+ /** The type aliased by this type alias. */
+ def alias: TypeEntity
+
+ def kind = "type alias"
+}
+
+
+/** A parameter to an entity. */
+trait ParameterEntity {
+
+ def name: String
+}
+
+
+/** A type parameter to a class, trait, or method. */
+trait TypeParam extends ParameterEntity with HigherKinded {
+
+ /** The variance of this type parameter. Valid values are "+", "-", and the empty string. */
+ def variance: String
+
+ /** The lower bound for this type parameter, if it has been defined. */
+ def lo: Option[TypeEntity]
+
+ /** The upper bound for this type parameter, if it has been defined. */
+ def hi: Option[TypeEntity]
+}
+
+
+/** A value parameter to a constructor or method. */
+trait ValueParam extends ParameterEntity {
+
+ /** The type of this value parameter. */
+ def resultType: TypeEntity
+
+ /** The devault value of this value parameter, if it has been defined. */
+ def defaultValue: Option[TreeEntity]
+
+ /** Whether this value parameter is implicit. */
+ def isImplicit: Boolean
+}
+
+
+/** An annotation to an entity. */
+trait Annotation extends Entity {
+
+ /** The class of this annotation. */
+ def annotationClass: TemplateEntity
+
+ /** The arguments passed to the constructor of the annotation class. */
+ def arguments: List[ValueArgument]
+
+ def kind = "annotation"
+}
+
+/** A trait that signals the member results from an implicit conversion */
+trait ImplicitConversion {
+
+ /** The source of the implicit conversion*/
+ def source: DocTemplateEntity
+
+ /** The result type after the conversion */
+ def targetType: TypeEntity
+
+ /** The components of the implicit conversion type parents */
+ def targetTypeComponents: List[(TemplateEntity, TypeEntity)]
+
+ /** The entity for the method that performed the conversion, if it's documented (or just its name, otherwise) */
+ def convertorMethod: Either[MemberEntity, String]
+
+ /** A short name of the convertion */
+ def conversionShortName: String
+
+ /** A qualified name uniquely identifying the convertion (currently: the conversion method's qualified name) */
+ def conversionQualifiedName: String
+
+ /** The entity that performed the conversion */
+ def convertorOwner: TemplateEntity
+
+ /** The constraints that the transformations puts on the type parameters */
+ def constraints: List[Constraint]
+
+ /** The members inherited by this implicit conversion */
+ def members: List[MemberEntity]
+
+ /** Is this a hidden implicit conversion (as specified in the settings) */
+ def isHiddenConversion: Boolean
+}
+
+/** Shadowing captures the information that the member is shadowed by some other members
+ * There are two cases of implicitly added member shadowing:
+ * 1) shadowing from a original class member (the class already has that member)
+ * in this case, it won't be possible to call the member directly, the type checker will fail attempting to adapt
+ * the call arguments (or if they fit it will call the original class' method)
+ * 2) shadowing from other possible implicit conversions ()
+ * this will result in an ambiguous implicit converion error
+ */
+trait ImplicitMemberShadowing {
+ /** The members that shadow the current entry use .inTemplate to get to the template name */
+ def shadowingMembers: List[MemberEntity]
+
+ /** The members that ambiguate this implicit conversion
+ Note: for ambiguatingMembers you have the following invariant:
+ assert(ambiguatingMembers.foreach(_.byConversion.isDefined) */
+ def ambiguatingMembers: List[MemberEntity]
+
+ def isShadowed: Boolean = !shadowingMembers.isEmpty
+ def isAmbiguous: Boolean = !ambiguatingMembers.isEmpty
+}
+
+/** A trait that encapsulates a constraint necessary for implicit conversion */
+trait Constraint
+
+/** A constraint involving a type parameter which must be in scope */
+trait ImplicitInScopeConstraint extends Constraint {
+ /** The type of the implicit value required */
+ def implicitType: TypeEntity
+
+ /** toString for debugging */
+ override def toString = "an implicit _: " + implicitType.name + " must be in scope"
+}
+
+trait TypeClassConstraint extends ImplicitInScopeConstraint with TypeParamConstraint {
+ /** Type class name */
+ def typeClassEntity: TemplateEntity
+
+ /** toString for debugging */
+ override def toString = typeParamName + " is a class of type " + typeClassEntity.qualifiedName + " (" +
+ typeParamName + ": " + typeClassEntity.name + ")"
+}
+
+trait KnownTypeClassConstraint extends TypeClassConstraint {
+ /** Type explanation, takes the type parameter name and generates the explanation */
+ def typeExplanation: (String) => String
+
+ /** toString for debugging */
+ override def toString = typeExplanation(typeParamName) + " (" + typeParamName + ": " + typeClassEntity.name + ")"
+}
+
+/** A constraint involving a type parameter */
+trait TypeParamConstraint extends Constraint {
+ /** The type parameter involved */
+ def typeParamName: String
+}
+
+trait EqualTypeParamConstraint extends TypeParamConstraint {
+ /** The rhs */
+ def rhs: TypeEntity
+ /** toString for debugging */
+ override def toString = typeParamName + " is " + rhs.name + " (" + typeParamName + " =:= " + rhs.name + ")"
+}
+
+trait BoundedTypeParamConstraint extends TypeParamConstraint {
+ /** The lower bound */
+ def lowerBound: TypeEntity
+
+ /** The upper bound */
+ def upperBound: TypeEntity
+
+ /** toString for debugging */
+ override def toString = typeParamName + " is a superclass of " + lowerBound.name + " and a subclass of " +
+ upperBound.name + " (" + typeParamName + " >: " + lowerBound.name + " <: " + upperBound.name + ")"
+}
+
+trait LowerBoundedTypeParamConstraint extends TypeParamConstraint {
+ /** The lower bound */
+ def lowerBound: TypeEntity
+
+ /** toString for debugging */
+ override def toString = typeParamName + " is a superclass of " + lowerBound.name + " (" + typeParamName + " >: " +
+ lowerBound.name + ")"
+}
+
+trait UpperBoundedTypeParamConstraint extends TypeParamConstraint {
+ /** The lower bound */
+ def upperBound: TypeEntity
+
+ /** toString for debugging */
+ override def toString = typeParamName + " is a subclass of " + upperBound.name + " (" + typeParamName + " <: " +
+ upperBound.name + ")"
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala
new file mode 100755
index 0000000000..53410fd4ad
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/IndexModelFactory.scala
@@ -0,0 +1,59 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Pedro Furlanetto
+ */
+
+package scala
+package tools.nsc
+package doc
+package model
+
+import scala.collection._
+
+object IndexModelFactory {
+
+ def makeIndex(universe: Universe): Index = new Index {
+
+ lazy val firstLetterIndex: Map[Char, SymbolMap] = {
+
+ object result extends mutable.HashMap[Char,SymbolMap] {
+
+ /* symbol name ordering */
+ implicit def orderingMap = math.Ordering.String
+
+ def addMember(d: MemberEntity) = {
+ val firstLetter = {
+ val ch = d.name.head.toLower
+ if(ch.isLetterOrDigit) ch else '_'
+ }
+ val letter = this.get(firstLetter).getOrElse {
+ immutable.SortedMap[String, SortedSet[MemberEntity]]()
+ }
+ val members = letter.get(d.name).getOrElse {
+ SortedSet.empty[MemberEntity](Ordering.by { _.toString })
+ } + d
+ this(firstLetter) = letter + (d.name -> members)
+ }
+ }
+
+ //@scala.annotation.tailrec // TODO
+ def gather(owner: DocTemplateEntity): Unit =
+ for(m <- owner.members if m.inDefinitionTemplates.isEmpty || m.inDefinitionTemplates.head == owner)
+ m match {
+ case tpl: DocTemplateEntity =>
+ result.addMember(tpl)
+ gather(tpl)
+ case non: MemberEntity if !non.isConstructor =>
+ result.addMember(non)
+ case x @ _ =>
+ }
+
+ gather(universe.rootPackage)
+
+ result.toMap
+
+ }
+
+ }
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/MemberLookup.scala b/src/scaladoc/scala/tools/nsc/doc/model/MemberLookup.scala
new file mode 100644
index 0000000000..339129bdbc
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/MemberLookup.scala
@@ -0,0 +1,56 @@
+package scala.tools.nsc
+package doc
+package model
+
+import base._
+
+/** This trait extracts all required information for documentation from compilation units */
+trait MemberLookup extends base.MemberLookupBase {
+ thisFactory: ModelFactory =>
+
+ import global._
+ import definitions.{ NothingClass, AnyClass, AnyValClass, AnyRefClass, ListClass }
+
+ override def internalLink(sym: Symbol, site: Symbol): Option[LinkTo] =
+ findTemplateMaybe(sym) match {
+ case Some(tpl) => Some(LinkToTpl(tpl))
+ case None =>
+ findTemplateMaybe(site) flatMap { inTpl =>
+ inTpl.members find (_.asInstanceOf[EntityImpl].sym == sym) map (LinkToMember(_, inTpl))
+ }
+ }
+
+ override def chooseLink(links: List[LinkTo]): LinkTo = {
+ val mbrs = links.collect {
+ case lm@LinkToMember(mbr: MemberEntity, _) => (mbr, lm)
+ }
+ if (mbrs.isEmpty)
+ links.head
+ else
+ mbrs.min(Ordering[MemberEntity].on[(MemberEntity, LinkTo)](_._1))._2
+ }
+
+ override def toString(link: LinkTo) = link match {
+ case LinkToTpl(tpl: EntityImpl) => tpl.sym.toString
+ case LinkToMember(mbr: EntityImpl, inTpl: EntityImpl) =>
+ mbr.sym.signatureString + " in " + inTpl.sym.toString
+ case _ => link.toString
+ }
+
+ override def findExternalLink(sym: Symbol, name: String): Option[LinkToExternal] = {
+ val sym1 =
+ if (sym == AnyClass || sym == AnyRefClass || sym == AnyValClass || sym == NothingClass) ListClass
+ else if (sym.isPackage)
+ /* Get package object which has associatedFile ne null */
+ sym.info.member(newTermName("package"))
+ else sym
+ Option(sym1.associatedFile) flatMap (_.underlyingSource) flatMap { src =>
+ val path = src.path
+ settings.extUrlMapping get path map { url =>
+ LinkToExternal(name, url + "#" + name)
+ }
+ }
+ }
+
+ override def warnNoLink = !settings.docNoLinkWarnings.value
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactory.scala
new file mode 100644
index 0000000000..c4e3c115be
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactory.scala
@@ -0,0 +1,1023 @@
+/* NSC -- new Scala compiler -- Copyright 2007-2013 LAMP/EPFL */
+
+package scala
+package tools.nsc
+package doc
+package model
+
+import base.comment._
+import diagram._
+
+import scala.collection._
+import scala.util.matching.Regex
+import symtab.Flags
+
+import io._
+import model.{ RootPackage => RootPackageEntity }
+
+/** This trait extracts all required information for documentation from compilation units */
+class ModelFactory(val global: Global, val settings: doc.Settings) {
+ thisFactory: ModelFactory
+ with ModelFactoryImplicitSupport
+ with ModelFactoryTypeSupport
+ with DiagramFactory
+ with CommentFactory
+ with TreeFactory
+ with MemberLookup =>
+
+ import global._
+ import definitions.{ ObjectClass, NothingClass, AnyClass, AnyValClass, AnyRefClass, ListClass }
+ import rootMirror.{ RootPackage, RootClass, EmptyPackage }
+
+ // Defaults for member grouping, that may be overridden by the template
+ val defaultGroup = "Ungrouped"
+ val defaultGroupName = "Ungrouped"
+ val defaultGroupDesc = None
+ val defaultGroupPriority = 1000
+
+ def templatesCount = docTemplatesCache.count(_._2.isDocTemplate) - droppedPackages.size
+
+ private var _modelFinished = false
+ def modelFinished: Boolean = _modelFinished
+ private var universe: Universe = null
+
+ def makeModel: Option[Universe] = {
+ val universe = new Universe { thisUniverse =>
+ thisFactory.universe = thisUniverse
+ val settings = thisFactory.settings
+ val rootPackage = modelCreation.createRootPackage
+ }
+ _modelFinished = true
+ // complete the links between model entities, everthing that couldn't have been done before
+ universe.rootPackage.completeModel()
+
+ Some(universe) filter (_.rootPackage != null)
+ }
+
+ // state:
+ var ids = 0
+ private val droppedPackages = mutable.Set[PackageImpl]()
+ protected val docTemplatesCache = new mutable.LinkedHashMap[Symbol, DocTemplateImpl]
+ protected val noDocTemplatesCache = new mutable.LinkedHashMap[Symbol, NoDocTemplateImpl]
+ def packageDropped(tpl: DocTemplateImpl) = tpl match {
+ case p: PackageImpl => droppedPackages(p)
+ case _ => false
+ }
+
+ def optimize(str: String): String =
+ if (str.length < 16) str.intern else str
+
+ /* ============== IMPLEMENTATION PROVIDING ENTITY TYPES ============== */
+
+ abstract class EntityImpl(val sym: Symbol, val inTpl: TemplateImpl) extends Entity {
+ val name = optimize(sym.nameString)
+ val universe = thisFactory.universe
+
+ // Debugging:
+ // assert(id != 36, sym + " " + sym.getClass)
+ //println("Creating entity #" + id + " [" + kind + " " + qualifiedName + "] for sym " + sym.kindString + " " + sym.ownerChain.reverse.map(_.name).mkString("."))
+
+ def inTemplate: TemplateImpl = inTpl
+ def toRoot: List[EntityImpl] = this :: inTpl.toRoot
+ def qualifiedName = name
+ def annotations = sym.annotations.map(makeAnnotation)
+ def inPackageObject: Boolean = sym.owner.isModuleClass && sym.owner.sourceModule.isPackageObject
+ def isType = sym.name.isTypeName
+ }
+
+ trait TemplateImpl extends EntityImpl with TemplateEntity {
+ override def qualifiedName: String =
+ if (inTemplate == null || inTemplate.isRootPackage) name else optimize(inTemplate.qualifiedName + "." + name)
+ def isPackage = sym.isPackage
+ def isTrait = sym.isTrait
+ def isClass = sym.isClass && !sym.isTrait
+ def isObject = sym.isModule && !sym.isPackage
+ def isCaseClass = sym.isCaseClass
+ def isRootPackage = false
+ def selfType = if (sym.thisSym eq sym) None else Some(makeType(sym.thisSym.typeOfThis, this))
+ }
+
+ abstract class MemberImpl(sym: Symbol, inTpl: DocTemplateImpl) extends EntityImpl(sym, inTpl) with MemberEntity {
+ // If the current tpl is a DocTemplate, we consider itself as the root for resolving link targets (instead of the
+ // package the class is in) -- so people can refer to methods directly [[foo]], instead of using [[MyClass.foo]]
+ // in the doc comment of MyClass
+ def linkTarget: DocTemplateImpl = inTpl
+
+ lazy val comment = {
+ val documented = if (sym.hasAccessorFlag) sym.accessed else sym
+ thisFactory.comment(documented, linkTarget, inTpl)
+ }
+ def group = comment flatMap (_.group) getOrElse defaultGroup
+ override def inTemplate = inTpl
+ override def toRoot: List[MemberImpl] = this :: inTpl.toRoot
+ def inDefinitionTemplates =
+ if (inTpl == null)
+ docTemplatesCache(RootPackage) :: Nil
+ else
+ makeTemplate(sym.owner)::(sym.allOverriddenSymbols map { inhSym => makeTemplate(inhSym.owner) })
+ def visibility = {
+ if (sym.isPrivateLocal) PrivateInInstance()
+ else if (sym.isProtectedLocal) ProtectedInInstance()
+ else {
+ val qual =
+ if (sym.hasAccessBoundary)
+ Some(makeTemplate(sym.privateWithin))
+ else None
+ if (sym.isPrivate) PrivateInTemplate(inTpl)
+ else if (sym.isProtected) ProtectedInTemplate(qual getOrElse inTpl)
+ else qual match {
+ case Some(q) => PrivateInTemplate(q)
+ case None => Public()
+ }
+ }
+ }
+ def flags = {
+ val fgs = mutable.ListBuffer.empty[Paragraph]
+ if (sym.isImplicit) fgs += Paragraph(Text("implicit"))
+ if (sym.isSealed) fgs += Paragraph(Text("sealed"))
+ if (!sym.isTrait && (sym hasFlag Flags.ABSTRACT)) fgs += Paragraph(Text("abstract"))
+ /* Resetting the DEFERRED flag is a little trick here for refined types: (example from scala.collections)
+ * {{{
+ * implicit def traversable2ops[T](t: scala.collection.GenTraversableOnce[T]) = new TraversableOps[T] {
+ * def isParallel = ...
+ * }}}
+ * the type the method returns is TraversableOps, which has all-abstract symbols. But in reality, it couldn't have
+ * any abstract terms, otherwise it would fail compilation. So we reset the DEFERRED flag. */
+ if (!sym.isTrait && (sym hasFlag Flags.DEFERRED) && (!isImplicitlyInherited)) fgs += Paragraph(Text("abstract"))
+ if (!sym.isModule && (sym hasFlag Flags.FINAL)) fgs += Paragraph(Text("final"))
+ fgs.toList
+ }
+ def deprecation =
+ if (sym.isDeprecated)
+ Some((sym.deprecationMessage, sym.deprecationVersion) match {
+ case (Some(msg), Some(ver)) => parseWiki("''(Since version " + ver + ")'' " + msg, NoPosition, inTpl)
+ case (Some(msg), None) => parseWiki(msg, NoPosition, inTpl)
+ case (None, Some(ver)) => parseWiki("''(Since version " + ver + ")''", NoPosition, inTpl)
+ case (None, None) => Body(Nil)
+ })
+ else
+ comment flatMap { _.deprecated }
+ def migration =
+ if(sym.hasMigrationAnnotation)
+ Some((sym.migrationMessage, sym.migrationVersion) match {
+ case (Some(msg), Some(ver)) => parseWiki("''(Changed in version " + ver + ")'' " + msg, NoPosition, inTpl)
+ case (Some(msg), None) => parseWiki(msg, NoPosition, inTpl)
+ case (None, Some(ver)) => parseWiki("''(Changed in version " + ver + ")''", NoPosition, inTpl)
+ case (None, None) => Body(Nil)
+ })
+ else
+ None
+
+ def resultType = {
+ def resultTpe(tpe: Type): Type = tpe match { // similar to finalResultType, except that it leaves singleton types alone
+ case PolyType(_, res) => resultTpe(res)
+ case MethodType(_, res) => resultTpe(res)
+ case NullaryMethodType(res) => resultTpe(res)
+ case _ => tpe
+ }
+ val tpe = byConversion.fold(sym.tpe) (_.toType memberInfo sym)
+ makeTypeInTemplateContext(resultTpe(tpe), inTemplate, sym)
+ }
+ def isDef = false
+ def isVal = false
+ def isLazyVal = false
+ def isVar = false
+ def isConstructor = false
+ def isAliasType = false
+ def isAbstractType = false
+ def isAbstract =
+ // for the explanation of conversion == null see comment on flags
+ ((!sym.isTrait && ((sym hasFlag Flags.ABSTRACT) || (sym hasFlag Flags.DEFERRED)) && (!isImplicitlyInherited)) ||
+ sym.isAbstractClass || sym.isAbstractType) && !sym.isSynthetic
+
+ def signature = externalSignature(sym)
+ lazy val signatureCompat = {
+
+ def defParams(mbr: Any): String = mbr match {
+ case d: MemberEntity with Def =>
+ val paramLists: List[String] =
+ if (d.valueParams.isEmpty) Nil
+ else d.valueParams map (ps => ps map (_.resultType.name) mkString ("(",",",")"))
+ paramLists.mkString
+ case _ => ""
+ }
+
+ def tParams(mbr: Any): String = mbr match {
+ case hk: HigherKinded if !hk.typeParams.isEmpty =>
+ def boundsToString(hi: Option[TypeEntity], lo: Option[TypeEntity]): String = {
+ def bound0(bnd: Option[TypeEntity], pre: String): String = bnd match {
+ case None => ""
+ case Some(tpe) => pre ++ tpe.toString
+ }
+ bound0(hi, "<:") ++ bound0(lo, ">:")
+ }
+ "[" + hk.typeParams.map(tp => tp.variance + tp.name + tParams(tp) + boundsToString(tp.hi, tp.lo)).mkString(", ") + "]"
+ case _ => ""
+ }
+
+ (name + tParams(this) + defParams(this) +":"+ resultType.name).replaceAll("\\s","") // no spaces allowed, they break links
+ }
+ // these only apply for NonTemplateMemberEntities
+ def useCaseOf: Option[MemberImpl] = None
+ def byConversion: Option[ImplicitConversionImpl] = None
+ def isImplicitlyInherited = false
+ def isShadowedImplicit = false
+ def isAmbiguousImplicit = false
+ def isShadowedOrAmbiguousImplicit = false
+ }
+
+ /** A template that is not documented at all. The class is instantiated during lookups, to indicate that the class
+ * exists, but should not be documented (either it's not included in the source or it's not visible)
+ */
+ class NoDocTemplateImpl(sym: Symbol, inTpl: TemplateImpl) extends EntityImpl(sym, inTpl) with TemplateImpl with HigherKindedImpl with NoDocTemplate {
+ assert(modelFinished, this)
+ assert(!(noDocTemplatesCache isDefinedAt sym), (sym, noDocTemplatesCache(sym)))
+ noDocTemplatesCache += (sym -> this)
+ def isDocTemplate = false
+ }
+
+ /** An inherited template that was not documented in its original owner - example:
+ * in classpath: trait T { class C } -- T (and implicitly C) are not documented
+ * in the source: trait U extends T -- C appears in U as a MemberTemplateImpl -- that is, U has a member for it
+ * but C doesn't get its own page
+ */
+ abstract class MemberTemplateImpl(sym: Symbol, inTpl: DocTemplateImpl) extends MemberImpl(sym, inTpl) with TemplateImpl with HigherKindedImpl with MemberTemplateEntity {
+ // no templates cache for this class, each owner gets its own instance
+ def isDocTemplate = false
+ lazy val definitionName = optimize(inDefinitionTemplates.head.qualifiedName + "." + name)
+ def valueParams: List[List[ValueParam]] = Nil /** TODO, these are now only computed for DocTemplates */
+
+ def parentTypes =
+ if (sym.isPackage || sym == AnyClass) List() else {
+ val tps = (this match {
+ case a: AliasType => sym.tpe.dealias.parents
+ case a: AbstractType => sym.info.bounds match {
+ case TypeBounds(lo, RefinedType(parents, decls)) => parents
+ case TypeBounds(lo, hi) => hi :: Nil
+ case _ => Nil
+ }
+ case _ => sym.tpe.parents
+ }) map { _.asSeenFrom(sym.thisType, sym) }
+ makeParentTypes(RefinedType(tps, EmptyScope), Some(this), inTpl)
+ }
+ }
+
+ /** The instantiation of `TemplateImpl` triggers the creation of the following entities:
+ * All ancestors of the template and all non-package members.
+ */
+ abstract class DocTemplateImpl(sym: Symbol, inTpl: DocTemplateImpl) extends MemberTemplateImpl(sym, inTpl) with DocTemplateEntity {
+ assert(!modelFinished, (sym, inTpl))
+ assert(!(docTemplatesCache isDefinedAt sym), sym)
+ docTemplatesCache += (sym -> this)
+
+ if (settings.verbose)
+ inform("Creating doc template for " + sym)
+
+ override def linkTarget: DocTemplateImpl = this
+ override def toRoot: List[DocTemplateImpl] = this :: inTpl.toRoot
+
+ protected def reprSymbol: Symbol = sym
+
+ def inSource =
+ if (reprSymbol.sourceFile != null && ! reprSymbol.isSynthetic)
+ Some((reprSymbol.sourceFile, reprSymbol.pos.line))
+ else
+ None
+
+ def sourceUrl = {
+ def fixPath(s: String) = s.replaceAll("\\" + java.io.File.separator, "/")
+ val assumedSourceRoot = fixPath(settings.sourcepath.value) stripSuffix "/"
+
+ if (!settings.docsourceurl.isDefault)
+ inSource map { case (file, _) =>
+ val filePath = fixPath(file.path).replaceFirst("^" + assumedSourceRoot, "").stripSuffix(".scala")
+ val tplOwner = this.inTemplate.qualifiedName
+ val tplName = this.name
+ val patches = new Regex("""€\{(FILE_PATH|TPL_OWNER|TPL_NAME)\}""")
+ def substitute(name: String): String = name match {
+ case "FILE_PATH" => filePath
+ case "TPL_OWNER" => tplOwner
+ case "TPL_NAME" => tplName
+ }
+ val patchedString = patches.replaceAllIn(settings.docsourceurl.value, m => java.util.regex.Matcher.quoteReplacement(substitute(m.group(1))) )
+ new java.net.URL(patchedString)
+ }
+ else None
+ }
+
+ lazy val (linearizationTemplates, linearizationTypes) =
+ reprSymbol.ancestors map { ancestor =>
+ (makeTemplate(ancestor), makeType(reprSymbol.info.baseType(ancestor), this))
+ } unzip
+
+ /* Subclass cache */
+ private lazy val subClassesCache = (
+ if (sym == AnyRefClass) null
+ else mutable.ListBuffer[DocTemplateEntity]()
+ )
+ def registerSubClass(sc: DocTemplateEntity): Unit = {
+ if (subClassesCache != null)
+ subClassesCache += sc
+ }
+ def directSubClasses = if (subClassesCache == null) Nil else subClassesCache.toList
+
+ /* Implcitly convertible class cache */
+ private var implicitlyConvertibleClassesCache: mutable.ListBuffer[(DocTemplateImpl, ImplicitConversionImpl)] = null
+ def registerImplicitlyConvertibleClass(dtpl: DocTemplateImpl, conv: ImplicitConversionImpl): Unit = {
+ if (implicitlyConvertibleClassesCache == null)
+ implicitlyConvertibleClassesCache = mutable.ListBuffer[(DocTemplateImpl, ImplicitConversionImpl)]()
+ implicitlyConvertibleClassesCache += ((dtpl, conv))
+ }
+
+ def incomingImplicitlyConvertedClasses: List[(DocTemplateImpl, ImplicitConversionImpl)] =
+ if (implicitlyConvertibleClassesCache == null)
+ List()
+ else
+ implicitlyConvertibleClassesCache.toList
+
+ // the implicit conversions are generated eagerly, but the members generated by implicit conversions are added
+ // lazily, on completeModel
+ val conversions: List[ImplicitConversionImpl] =
+ if (settings.docImplicits) makeImplicitConversions(sym, this) else Nil
+
+ // members as given by the compiler
+ lazy val memberSyms = sym.info.members.filter(s => membersShouldDocument(s, this)).toList
+
+ // the inherited templates (classes, traits or objects)
+ val memberSymsLazy = memberSyms.filter(t => templateShouldDocument(t, this) && !inOriginalOwner(t, this))
+ // the direct members (methods, values, vars, types and directly contained templates)
+ val memberSymsEager = memberSyms.filter(!memberSymsLazy.contains(_))
+ // the members generated by the symbols in memberSymsEager
+ val ownMembers = (memberSymsEager.flatMap(makeMember(_, None, this)))
+
+ // all the members that are documentented PLUS the members inherited by implicit conversions
+ var members: List[MemberImpl] = ownMembers
+
+ def templates = members collect { case c: TemplateEntity with MemberEntity => c }
+ def methods = members collect { case d: Def => d }
+ def values = members collect { case v: Val => v }
+ def abstractTypes = members collect { case t: AbstractType => t }
+ def aliasTypes = members collect { case t: AliasType => t }
+
+ /**
+ * This is the final point in the core model creation: no DocTemplates are created after the model has finished, but
+ * inherited templates and implicit members are added to the members at this point.
+ */
+ def completeModel(): Unit = {
+ // DFS completion
+ // since alias types and abstract types have no own members, there's no reason for them to call completeModel
+ if (!sym.isAliasType && !sym.isAbstractType)
+ for (member <- members)
+ member match {
+ case d: DocTemplateImpl => d.completeModel()
+ case _ =>
+ }
+
+ members :::= memberSymsLazy.map(modelCreation.createLazyTemplateMember(_, this))
+
+ outgoingImplicitlyConvertedClasses
+
+ for (pt <- sym.info.parents; parentTemplate <- findTemplateMaybe(pt.typeSymbol)) parentTemplate registerSubClass this
+
+ // the members generated by the symbols in memberSymsEager PLUS the members from the usecases
+ val allMembers = ownMembers ::: ownMembers.flatMap(_.useCaseOf).distinct
+ implicitsShadowing = makeShadowingTable(allMembers, conversions, this)
+ // finally, add the members generated by implicit conversions
+ members :::= conversions.flatMap(_.memberImpls)
+ }
+
+ var implicitsShadowing = Map[MemberEntity, ImplicitMemberShadowing]()
+
+ lazy val outgoingImplicitlyConvertedClasses: List[(TemplateEntity, TypeEntity, ImplicitConversionImpl)] =
+ conversions flatMap (conv =>
+ if (!implicitExcluded(conv.conversionQualifiedName))
+ conv.targetTypeComponents map {
+ case (template, tpe) =>
+ template match {
+ case d: DocTemplateImpl if (d != this) => d.registerImplicitlyConvertibleClass(this, conv)
+ case _ => // nothing
+ }
+ (template, tpe, conv)
+ }
+ else List()
+ )
+
+ override def isDocTemplate = true
+ private[this] lazy val companionSymbol =
+ if (sym.isAliasType || sym.isAbstractType) {
+ inTpl.sym.info.member(sym.name.toTermName) match {
+ case NoSymbol => NoSymbol
+ case s =>
+ s.info match {
+ case ot: OverloadedType =>
+ NoSymbol
+ case _ =>
+ // that's to navigate from val Foo: FooExtractor to FooExtractor :)
+ s.info.resultType.typeSymbol
+ }
+ }
+ }
+ else
+ sym.companionSymbol
+
+ def companion =
+ companionSymbol match {
+ case NoSymbol => None
+ case comSym if !isEmptyJavaObject(comSym) && (comSym.isClass || comSym.isModule) =>
+ makeTemplate(comSym) match {
+ case d: DocTemplateImpl => Some(d)
+ case _ => None
+ }
+ case _ => None
+ }
+
+ def constructors: List[MemberImpl with Constructor] = if (isClass) members collect { case d: Constructor => d } else Nil
+ def primaryConstructor: Option[MemberImpl with Constructor] = if (isClass) constructors find { _.isPrimary } else None
+ override def valueParams =
+ // we don't want params on a class (non case class) signature
+ if (isCaseClass) primaryConstructor match {
+ case Some(const) => const.sym.paramss map (_ map (makeValueParam(_, this)))
+ case None => List()
+ }
+ else List.empty
+
+ // These are generated on-demand, make sure you don't call them more than once
+ def inheritanceDiagram = makeInheritanceDiagram(this)
+ def contentDiagram = makeContentDiagram(this)
+
+ def groupSearch[T](extractor: Comment => Option[T]): Option[T] = {
+ val comments = comment +: linearizationTemplates.collect { case dtpl: DocTemplateImpl => dtpl.comment }
+ comments.flatten.map(extractor).flatten.headOption orElse {
+ Option(inTpl) flatMap (_.groupSearch(extractor))
+ }
+ }
+
+ def groupDescription(group: String): Option[Body] = groupSearch(_.groupDesc.get(group)) orElse { if (group == defaultGroup) defaultGroupDesc else None }
+ def groupPriority(group: String): Int = groupSearch(_.groupPrio.get(group)) getOrElse { if (group == defaultGroup) defaultGroupPriority else 0 }
+ def groupName(group: String): String = groupSearch(_.groupNames.get(group)) getOrElse { if (group == defaultGroup) defaultGroupName else group }
+ }
+
+ abstract class PackageImpl(sym: Symbol, inTpl: PackageImpl) extends DocTemplateImpl(sym, inTpl) with Package {
+ override def inTemplate = inTpl
+ override def toRoot: List[PackageImpl] = this :: inTpl.toRoot
+ override def reprSymbol = sym.info.members.find (_.isPackageObject) getOrElse sym
+
+ def packages = members collect { case p: PackageImpl if !(droppedPackages contains p) => p }
+ }
+
+ abstract class RootPackageImpl(sym: Symbol) extends PackageImpl(sym, null) with RootPackageEntity
+
+ abstract class NonTemplateMemberImpl(sym: Symbol, conversion: Option[ImplicitConversionImpl],
+ override val useCaseOf: Option[MemberImpl], inTpl: DocTemplateImpl)
+ extends MemberImpl(sym, inTpl) with NonTemplateMemberEntity {
+ override lazy val comment = {
+ def nonRootTemplate(sym: Symbol): Option[DocTemplateImpl] =
+ if (sym eq RootPackage) None else findTemplateMaybe(sym)
+ /* Variable precendence order for implicitly added members: Take the variable defifinitions from ...
+ * 1. the target of the implicit conversion
+ * 2. the definition template (owner)
+ * 3. the current template
+ */
+ val inRealTpl = conversion.flatMap { conv =>
+ nonRootTemplate(conv.toType.typeSymbol)
+ } orElse nonRootTemplate(sym.owner) orElse Option(inTpl)
+ inRealTpl flatMap { tpl =>
+ thisFactory.comment(sym, tpl, tpl)
+ }
+ }
+
+ override def inDefinitionTemplates = useCaseOf.fold(super.inDefinitionTemplates)(_.inDefinitionTemplates)
+
+ override def qualifiedName = optimize(inTemplate.qualifiedName + "#" + name)
+ lazy val definitionName = {
+ val qualifiedName = conversion.fold(inDefinitionTemplates.head.qualifiedName)(_.conversionQualifiedName)
+ optimize(qualifiedName + "#" + name)
+ }
+ def isUseCase = useCaseOf.isDefined
+ override def byConversion: Option[ImplicitConversionImpl] = conversion
+ override def isImplicitlyInherited = { assert(modelFinished); conversion.isDefined }
+ override def isShadowedImplicit = isImplicitlyInherited && inTpl.implicitsShadowing.get(this).map(_.isShadowed).getOrElse(false)
+ override def isAmbiguousImplicit = isImplicitlyInherited && inTpl.implicitsShadowing.get(this).map(_.isAmbiguous).getOrElse(false)
+ override def isShadowedOrAmbiguousImplicit = isShadowedImplicit || isAmbiguousImplicit
+ }
+
+ abstract class NonTemplateParamMemberImpl(sym: Symbol, conversion: Option[ImplicitConversionImpl],
+ useCaseOf: Option[MemberImpl], inTpl: DocTemplateImpl)
+ extends NonTemplateMemberImpl(sym, conversion, useCaseOf, inTpl) {
+ def valueParams = {
+ val info = conversion.fold(sym.info)(_.toType memberInfo sym)
+ info.paramss map { ps => (ps.zipWithIndex) map { case (p, i) =>
+ if (p.nameString contains "$") makeValueParam(p, inTpl, optimize("arg" + i)) else makeValueParam(p, inTpl)
+ }}
+ }
+ }
+
+ abstract class ParameterImpl(val sym: Symbol, val inTpl: TemplateImpl) extends ParameterEntity {
+ val name = optimize(sym.nameString)
+ }
+
+ private trait AliasImpl {
+ def sym: Symbol
+ def inTpl: TemplateImpl
+ def alias = makeTypeInTemplateContext(sym.tpe.dealias, inTpl, sym)
+ }
+
+ private trait TypeBoundsImpl {
+ def sym: Symbol
+ def inTpl: TemplateImpl
+ def lo = sym.info.bounds match {
+ case TypeBounds(lo, hi) if lo.typeSymbol != NothingClass =>
+ Some(makeTypeInTemplateContext(appliedType(lo, sym.info.typeParams map {_.tpe}), inTpl, sym))
+ case _ => None
+ }
+ def hi = sym.info.bounds match {
+ case TypeBounds(lo, hi) if hi.typeSymbol != AnyClass =>
+ Some(makeTypeInTemplateContext(appliedType(hi, sym.info.typeParams map {_.tpe}), inTpl, sym))
+ case _ => None
+ }
+ }
+
+ trait HigherKindedImpl extends HigherKinded {
+ def sym: Symbol
+ def inTpl: TemplateImpl
+ def typeParams =
+ sym.typeParams map (makeTypeParam(_, inTpl))
+ }
+ /* ============== MAKER METHODS ============== */
+
+ /** This method makes it easier to work with the different kinds of symbols created by scalac by stripping down the
+ * package object abstraction and placing members directly in the package.
+ *
+ * Here's the explanation of what we do. The code:
+ *
+ * package foo {
+ * object `package` {
+ * class Bar
+ * }
+ * }
+ *
+ * will yield this Symbol structure:
+ * +---------+ (2)
+ * | |
+ * +---------------+ +---------- v ------- | ---+ +--------+ (2)
+ * | package foo#1 <---(1)---- module class foo#2 | | | |
+ * +---------------+ | +------------------ | -+ | +------------------- v ---+ |
+ * | | package object foo#3 <-----(1)---- module class package#4 | |
+ * | +----------------------+ | | +---------------------+ | |
+ * +--------------------------+ | | class package$Bar#5 | | |
+ * | +----------------- | -+ | |
+ * +------------------- | ---+ |
+ * | |
+ * +--------+
+ * (1) sourceModule
+ * (2) you get out of owners with .owner
+ *
+ * and normalizeTemplate(Bar.owner) will get us the package, instead of the module class of the package object.
+ */
+ def normalizeTemplate(aSym: Symbol): Symbol = aSym match {
+ case null | rootMirror.EmptyPackage | NoSymbol =>
+ normalizeTemplate(RootPackage)
+ case ObjectClass =>
+ normalizeTemplate(AnyRefClass)
+ case _ if aSym.isPackageObject =>
+ normalizeTemplate(aSym.owner)
+ case _ if aSym.isModuleClass =>
+ normalizeTemplate(aSym.sourceModule)
+ case _ =>
+ aSym
+ }
+
+ /**
+ * These are all model construction methods. Please do not use them directly, they are calling each other recursively
+ * starting from makeModel. On the other hand, makeTemplate, makeAnnotation, makeMember, makeType should only be used
+ * after the model was created (modelFinished=true) otherwise assertions will start failing.
+ */
+ object modelCreation {
+
+ def createRootPackage: PackageImpl = docTemplatesCache.get(RootPackage) match {
+ case Some(root: PackageImpl) => root
+ case _ => modelCreation.createTemplate(RootPackage, null) match {
+ case Some(root: PackageImpl) => root
+ case _ => sys.error("Scaladoc: Unable to create root package!")
+ }
+ }
+
+ /**
+ * Create a template, either a package, class, trait or object
+ */
+ def createTemplate(aSym: Symbol, inTpl: DocTemplateImpl): Option[MemberImpl] = {
+ // don't call this after the model finished!
+ assert(!modelFinished, (aSym, inTpl))
+
+ def createRootPackageComment: Option[Comment] =
+ if(settings.docRootContent.isDefault) None
+ else {
+ import Streamable._
+ Path(settings.docRootContent.value) match {
+ case f : File => {
+ val rootComment = closing(f.inputStream())(is => parse(slurp(is), "", NoPosition, inTpl))
+ Some(rootComment)
+ }
+ case _ => None
+ }
+ }
+
+ def createDocTemplate(bSym: Symbol, inTpl: DocTemplateImpl): DocTemplateImpl = {
+ assert(!modelFinished, (bSym, inTpl)) // only created BEFORE the model is finished
+ if (bSym.isAliasType && bSym != AnyRefClass)
+ new DocTemplateImpl(bSym, inTpl) with AliasImpl with AliasType { override def isAliasType = true }
+ else if (bSym.isAbstractType)
+ new DocTemplateImpl(bSym, inTpl) with TypeBoundsImpl with AbstractType { override def isAbstractType = true }
+ else if (bSym.isModule)
+ new DocTemplateImpl(bSym, inTpl) with Object {}
+ else if (bSym.isTrait)
+ new DocTemplateImpl(bSym, inTpl) with Trait {}
+ else if (bSym.isClass || bSym == AnyRefClass)
+ new DocTemplateImpl(bSym, inTpl) with Class {}
+ else
+ sys.error("'" + bSym + "' isn't a class, trait or object thus cannot be built as a documentable template.")
+ }
+
+ val bSym = normalizeTemplate(aSym)
+ if (docTemplatesCache isDefinedAt bSym)
+ return Some(docTemplatesCache(bSym))
+
+ /* Three cases of templates:
+ * (1) root package -- special cased for bootstrapping
+ * (2) package
+ * (3) class/object/trait
+ */
+ if (bSym == RootPackage) // (1)
+ Some(new RootPackageImpl(bSym) {
+ override lazy val comment = createRootPackageComment
+ override val name = "root"
+ override def inTemplate = this
+ override def toRoot = this :: Nil
+ override def qualifiedName = "_root_"
+ override def isRootPackage = true
+ override lazy val memberSyms =
+ (bSym.info.members ++ EmptyPackage.info.members).toList filter { s =>
+ s != EmptyPackage && s != RootPackage
+ }
+ })
+ else if (bSym.isPackage) // (2)
+ if (settings.skipPackage(makeQualifiedName(bSym)))
+ None
+ else
+ inTpl match {
+ case inPkg: PackageImpl =>
+ val pack = new PackageImpl(bSym, inPkg) {}
+ // Used to check package pruning works:
+ //println(pack.qualifiedName)
+ if (pack.templates.filter(_.isDocTemplate).isEmpty && pack.memberSymsLazy.isEmpty) {
+ droppedPackages += pack
+ None
+ } else
+ Some(pack)
+ case _ =>
+ sys.error("'" + bSym + "' must be in a package")
+ }
+ else {
+ // no class inheritance at this point
+ assert(inOriginalOwner(bSym, inTpl), bSym + " in " + inTpl)
+ Some(createDocTemplate(bSym, inTpl))
+ }
+ }
+
+ /**
+ * After the model is completed, no more DocTemplateEntities are created.
+ * Therefore any symbol that still appears is:
+ * - MemberTemplateEntity (created here)
+ * - NoDocTemplateEntity (created in makeTemplate)
+ */
+ def createLazyTemplateMember(aSym: Symbol, inTpl: DocTemplateImpl): MemberImpl = {
+
+ // Code is duplicate because the anonymous classes are created statically
+ def createNoDocMemberTemplate(bSym: Symbol, inTpl: DocTemplateImpl): MemberTemplateImpl = {
+ assert(modelFinished) // only created AFTER the model is finished
+ if (bSym.isModule || (bSym.isAliasType && bSym.tpe.typeSymbol.isModule))
+ new MemberTemplateImpl(bSym, inTpl) with Object {}
+ else if (bSym.isTrait || (bSym.isAliasType && bSym.tpe.typeSymbol.isTrait))
+ new MemberTemplateImpl(bSym, inTpl) with Trait {}
+ else if (bSym.isClass || (bSym.isAliasType && bSym.tpe.typeSymbol.isClass))
+ new MemberTemplateImpl(bSym, inTpl) with Class {}
+ else
+ sys.error("'" + bSym + "' isn't a class, trait or object thus cannot be built as a member template.")
+ }
+
+ assert(modelFinished)
+ val bSym = normalizeTemplate(aSym)
+
+ if (docTemplatesCache isDefinedAt bSym)
+ docTemplatesCache(bSym)
+ else
+ docTemplatesCache.get(bSym.owner) match {
+ case Some(inTpl) =>
+ val mbrs = inTpl.members.collect({ case mbr: MemberImpl if mbr.sym == bSym => mbr })
+ assert(mbrs.length == 1)
+ mbrs.head
+ case _ =>
+ // move the class completely to the new location
+ createNoDocMemberTemplate(bSym, inTpl)
+ }
+ }
+ }
+
+ // TODO: Should be able to override the type
+ def makeMember(aSym: Symbol, conversion: Option[ImplicitConversionImpl], inTpl: DocTemplateImpl): List[MemberImpl] = {
+
+ def makeMember0(bSym: Symbol, useCaseOf: Option[MemberImpl]): Option[MemberImpl] = {
+ if (bSym.isGetter && bSym.isLazy)
+ Some(new NonTemplateMemberImpl(bSym, conversion, useCaseOf, inTpl) with Val {
+ override def isLazyVal = true
+ })
+ else if (bSym.isGetter && bSym.accessed.isMutable)
+ Some(new NonTemplateMemberImpl(bSym, conversion, useCaseOf, inTpl) with Val {
+ override def isVar = true
+ })
+ else if (bSym.isMethod && !bSym.hasAccessorFlag && !bSym.isConstructor && !bSym.isModule) {
+ val cSym = { // This unsightly hack closes issue #4086.
+ if (bSym == definitions.Object_synchronized) {
+ val cSymInfo = (bSym.info: @unchecked) match {
+ case PolyType(ts, MethodType(List(bp), mt)) =>
+ val cp = bp.cloneSymbol.setPos(bp.pos).setInfo(definitions.byNameType(bp.info))
+ PolyType(ts, MethodType(List(cp), mt))
+ }
+ bSym.cloneSymbol.setPos(bSym.pos).setInfo(cSymInfo)
+ }
+ else bSym
+ }
+ Some(new NonTemplateParamMemberImpl(cSym, conversion, useCaseOf, inTpl) with HigherKindedImpl with Def {
+ override def isDef = true
+ })
+ }
+ else if (bSym.isConstructor)
+ if (conversion.isDefined)
+ None // don't list constructors inherted by implicit conversion
+ else
+ Some(new NonTemplateParamMemberImpl(bSym, conversion, useCaseOf, inTpl) with Constructor {
+ override def isConstructor = true
+ def isPrimary = sym.isPrimaryConstructor
+ })
+ else if (bSym.isGetter) // Scala field accessor or Java field
+ Some(new NonTemplateMemberImpl(bSym, conversion, useCaseOf, inTpl) with Val {
+ override def isVal = true
+ })
+ else if (bSym.isAbstractType && !typeShouldDocument(bSym, inTpl))
+ Some(new MemberTemplateImpl(bSym, inTpl) with TypeBoundsImpl with AbstractType {
+ override def isAbstractType = true
+ })
+ else if (bSym.isAliasType && !typeShouldDocument(bSym, inTpl))
+ Some(new MemberTemplateImpl(bSym, inTpl) with AliasImpl with AliasType {
+ override def isAliasType = true
+ })
+ else if (!modelFinished && (bSym.isPackage || templateShouldDocument(bSym, inTpl)))
+ modelCreation.createTemplate(bSym, inTpl)
+ else
+ None
+ }
+
+ if (!localShouldDocument(aSym) || aSym.isModuleClass || aSym.isPackageObject || aSym.isMixinConstructor)
+ Nil
+ else {
+ val allSyms = useCases(aSym, inTpl.sym) map { case (bSym, bComment, bPos) =>
+ docComments.put(bSym, DocComment(bComment, bPos)) // put the comment in the list, don't parse it yet, closes SI-4898
+ bSym
+ }
+
+ val member = makeMember0(aSym, None)
+ if (allSyms.isEmpty)
+ member.toList
+ else
+ // Use cases replace the original definitions - SI-5054
+ allSyms flatMap { makeMember0(_, member) }
+ }
+ }
+
+ def findMember(aSym: Symbol, inTpl: DocTemplateImpl): Option[MemberImpl] = {
+ normalizeTemplate(aSym.owner)
+ inTpl.members.find(_.sym == aSym)
+ }
+
+ def findTemplateMaybe(aSym: Symbol): Option[DocTemplateImpl] = {
+ assert(modelFinished)
+ docTemplatesCache.get(normalizeTemplate(aSym)).filterNot(packageDropped(_))
+ }
+
+ def makeTemplate(aSym: Symbol): TemplateImpl = makeTemplate(aSym, None)
+
+ def makeTemplate(aSym: Symbol, inTpl: Option[TemplateImpl]): TemplateImpl = {
+ assert(modelFinished)
+
+ def makeNoDocTemplate(aSym: Symbol, inTpl: TemplateImpl): NoDocTemplateImpl =
+ noDocTemplatesCache getOrElse (aSym, new NoDocTemplateImpl(aSym, inTpl))
+
+ findTemplateMaybe(aSym) getOrElse {
+ val bSym = normalizeTemplate(aSym)
+ makeNoDocTemplate(bSym, inTpl getOrElse makeTemplate(bSym.owner))
+ }
+ }
+
+ def makeAnnotation(annot: AnnotationInfo): scala.tools.nsc.doc.model.Annotation = {
+ val aSym = annot.symbol
+ new EntityImpl(aSym, makeTemplate(aSym.owner)) with scala.tools.nsc.doc.model.Annotation {
+ lazy val annotationClass =
+ makeTemplate(annot.symbol)
+ val arguments = {
+ val paramsOpt: Option[List[ValueParam]] = annotationClass match {
+ case aClass: DocTemplateEntity with Class =>
+ val constr = aClass.constructors collectFirst {
+ case c: MemberImpl if c.sym == annot.original.symbol => c
+ }
+ constr flatMap (_.valueParams.headOption)
+ case _ => None
+ }
+ val argTrees = annot.args map makeTree
+ paramsOpt match {
+ case Some (params) =>
+ params zip argTrees map { case (param, tree) =>
+ new ValueArgument {
+ def parameter = Some(param)
+ def value = tree
+ }
+ }
+ case None =>
+ argTrees map { tree =>
+ new ValueArgument {
+ def parameter = None
+ def value = tree
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /** */
+ def makeTypeParam(aSym: Symbol, inTpl: TemplateImpl): TypeParam =
+ new ParameterImpl(aSym, inTpl) with TypeBoundsImpl with HigherKindedImpl with TypeParam {
+ def variance: String = {
+ if (sym hasFlag Flags.COVARIANT) "+"
+ else if (sym hasFlag Flags.CONTRAVARIANT) "-"
+ else ""
+ }
+ }
+
+ /** */
+ def makeValueParam(aSym: Symbol, inTpl: DocTemplateImpl): ValueParam = {
+ makeValueParam(aSym, inTpl, aSym.nameString)
+ }
+
+
+ /** */
+ def makeValueParam(aSym: Symbol, inTpl: DocTemplateImpl, newName: String): ValueParam =
+ new ParameterImpl(aSym, inTpl) with ValueParam {
+ override val name = newName
+ def defaultValue =
+ if (aSym.hasDefault) {
+ // units.filter should return only one element
+ (currentRun.units filter (_.source.file == aSym.sourceFile)).toList match {
+ case List(unit) =>
+ // SI-4922 `sym == aSym` is insufficent if `aSym` is a clone of symbol
+ // of the parameter in the tree, as can happen with type parametric methods.
+ def isCorrespondingParam(sym: Symbol) = (
+ sym != null &&
+ sym != NoSymbol &&
+ sym.owner == aSym.owner &&
+ sym.name == aSym.name &&
+ sym.isParamWithDefault
+ )
+ unit.body find (t => isCorrespondingParam(t.symbol)) collect {
+ case ValDef(_,_,_,rhs) if rhs ne EmptyTree => makeTree(rhs)
+ }
+ case _ => None
+ }
+ }
+ else None
+ def resultType =
+ makeTypeInTemplateContext(aSym.tpe, inTpl, aSym)
+ def isImplicit = aSym.isImplicit
+ }
+
+ /** */
+ def makeTypeInTemplateContext(aType: Type, inTpl: TemplateImpl, dclSym: Symbol): TypeEntity = {
+ def ownerTpl(sym: Symbol): Symbol =
+ if (sym.isClass || sym.isModule || sym == NoSymbol) sym else ownerTpl(sym.owner)
+ val tpe =
+ if (thisFactory.settings.useStupidTypes) aType else {
+ def ownerTpl(sym: Symbol): Symbol =
+ if (sym.isClass || sym.isModule || sym == NoSymbol) sym else ownerTpl(sym.owner)
+ val fixedSym = if (inTpl.sym.isModule) inTpl.sym.moduleClass else inTpl.sym
+ aType.asSeenFrom(fixedSym.thisType, ownerTpl(dclSym))
+ }
+ makeType(tpe, inTpl)
+ }
+
+ /** Get the types of the parents of the current class, ignoring the refinements */
+ def makeParentTypes(aType: Type, tpl: Option[MemberTemplateImpl], inTpl: TemplateImpl): List[(TemplateEntity, TypeEntity)] = aType match {
+ case RefinedType(parents, defs) =>
+ val ignoreParents = Set[Symbol](AnyClass, AnyRefClass, ObjectClass)
+ val filtParents =
+ // we don't want to expose too many links to AnyRef, that will just be redundant information
+ tpl match {
+ case Some(tpl) if (!tpl.sym.isModule && parents.length < 2) || (tpl.sym == AnyValClass) || (tpl.sym == AnyRefClass) || (tpl.sym == AnyClass) => parents
+ case _ => parents.filterNot((p: Type) => ignoreParents(p.typeSymbol))
+ }
+
+ /** Returns:
+ * - a DocTemplate if the type's symbol is documented
+ * - a NoDocTemplateMember if the type's symbol is not documented in its parent but in another template
+ * - a NoDocTemplate if the type's symbol is not documented at all */
+ def makeTemplateOrMemberTemplate(parent: Type): TemplateImpl = {
+ def noDocTemplate = makeTemplate(parent.typeSymbol)
+ findTemplateMaybe(parent.typeSymbol) match {
+ case Some(tpl) => tpl
+ case None => parent match {
+ case TypeRef(pre, sym, args) =>
+ findTemplateMaybe(pre.typeSymbol) match {
+ case Some(tpl) => findMember(parent.typeSymbol, tpl).collect({case t: TemplateImpl => t}).getOrElse(noDocTemplate)
+ case None => noDocTemplate
+ }
+ case _ => noDocTemplate
+ }
+ }
+ }
+
+ filtParents.map(parent => {
+ val templateEntity = makeTemplateOrMemberTemplate(parent)
+ val typeEntity = makeType(parent, inTpl)
+ (templateEntity, typeEntity)
+ })
+ case _ =>
+ List((makeTemplate(aType.typeSymbol), makeType(aType, inTpl)))
+ }
+
+ def makeQualifiedName(sym: Symbol, relativeTo: Option[Symbol] = None): String = {
+ val stop = relativeTo map (_.ownerChain.toSet) getOrElse Set[Symbol]()
+ var sym1 = sym
+ val path = new StringBuilder()
+ // var path = List[Symbol]()
+
+ while ((sym1 != NoSymbol) && (path.isEmpty || !stop(sym1))) {
+ val sym1Norm = normalizeTemplate(sym1)
+ if (!sym1.sourceModule.isPackageObject && sym1Norm != RootPackage) {
+ if (path.length != 0)
+ path.insert(0, ".")
+ path.insert(0, sym1Norm.nameString)
+ // path::= sym1Norm
+ }
+ sym1 = sym1.owner
+ }
+
+ optimize(path.toString)
+ //path.mkString(".")
+ }
+
+ def inOriginalOwner(aSym: Symbol, inTpl: TemplateImpl): Boolean =
+ normalizeTemplate(aSym.owner) == normalizeTemplate(inTpl.sym)
+
+ def templateShouldDocument(aSym: Symbol, inTpl: DocTemplateImpl): Boolean =
+ (aSym.isTrait || aSym.isClass || aSym.isModule || typeShouldDocument(aSym, inTpl)) &&
+ localShouldDocument(aSym) &&
+ !isEmptyJavaObject(aSym) &&
+ // either it's inside the original owner or we can document it later:
+ (!inOriginalOwner(aSym, inTpl) || (aSym.isPackageClass || (aSym.sourceFile != null)))
+
+ def membersShouldDocument(sym: Symbol, inTpl: TemplateImpl) = {
+ // pruning modules that shouldn't be documented
+ // Why Symbol.isInitialized? Well, because we need to avoid exploring all the space available to scaladoc
+ // from the classpath -- scaladoc is a hog, it will explore everything starting from the root package unless we
+ // somehow prune the tree. And isInitialized is a good heuristic for prunning -- if the package was not explored
+ // during typer and refchecks, it's not necessary for the current application and there's no need to explore it.
+ (!sym.isModule || sym.moduleClass.isInitialized) &&
+ // documenting only public and protected members
+ localShouldDocument(sym) &&
+ // Only this class's constructors are part of its members, inherited constructors are not.
+ (!sym.isConstructor || sym.owner == inTpl.sym) &&
+ // If the @bridge annotation overrides a normal member, show it
+ !isPureBridge(sym)
+ }
+
+ def isEmptyJavaObject(aSym: Symbol): Boolean =
+ aSym.isModule && aSym.isJavaDefined &&
+ aSym.info.members.exists(s => localShouldDocument(s) && (!s.isConstructor || s.owner == aSym))
+
+ def localShouldDocument(aSym: Symbol): Boolean =
+ !aSym.isPrivate && (aSym.isProtected || aSym.privateWithin == NoSymbol) && !aSym.isSynthetic
+
+ /** Filter '@bridge' methods only if *they don't override non-bridge methods*. See SI-5373 for details */
+ def isPureBridge(sym: Symbol) = sym.isBridge && sym.allOverriddenSymbols.forall(_.isBridge)
+
+ // the classes that are excluded from the index should also be excluded from the diagrams
+ def classExcluded(clazz: TemplateEntity): Boolean = settings.hardcoded.isExcluded(clazz.qualifiedName)
+
+ // the implicit conversions that are excluded from the pages should not appear in the diagram
+ def implicitExcluded(convertorMethod: String): Boolean = settings.hiddenImplicits(convertorMethod)
+
+ // whether or not to create a page for an {abstract,alias} type
+ def typeShouldDocument(bSym: Symbol, inTpl: DocTemplateImpl) =
+ (settings.docExpandAllTypes && (bSym.sourceFile != null)) ||
+ (bSym.isAliasType || bSym.isAbstractType) &&
+ { val rawComment = global.expandedDocComment(bSym, inTpl.sym)
+ rawComment.contains("@template") || rawComment.contains("@documentable") }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala
new file mode 100644
index 0000000000..4fd8fd4270
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala
@@ -0,0 +1,575 @@
+/* NSC -- new Scala compiler -- Copyright 2007-2013 LAMP/EPFL
+ *
+ * This trait finds implicit conversions for a class in the default scope and creates scaladoc entries for each of them.
+ *
+ * @author Vlad Ureche
+ * @author Adriaan Moors
+ */
+
+package scala.tools.nsc
+package doc
+package model
+
+import scala.collection._
+import symtab.Flags
+
+/**
+ * This trait finds implicit conversions for a class in the default scope and creates scaladoc entries for each of them.
+ *
+ * Let's take this as an example:
+ * {{{
+ * object Test {
+ * class A
+ *
+ * class B {
+ * def foo = 1
+ * }
+ *
+ * class C extends B {
+ * def bar = 2
+ * class implicit
+ * }
+ *
+ * D def conv(a: A) = new C
+ * }
+ * }}}
+ *
+ * Overview:
+ * - scaladoc-ing the above classes, `A` will get two more methods: foo and bar, over its default methods
+ * - the nested classes (specifically `D` above), abstract types, type aliases and constructor members are not added to
+ * `A` (see makeMember0 in ModelFactory, last 3 cases)
+ * - the members added by implicit conversion are always listed under the implicit conversion, not under the class they
+ * actually come from (`foo` will be listed as coming from the implicit conversion to `C` instead of `B`) - see
+ * `definitionName` in MemberImpl
+ *
+ * Internals:
+ * TODO: Give an overview here
+ */
+trait ModelFactoryImplicitSupport {
+ thisFactory: ModelFactory with ModelFactoryTypeSupport with CommentFactory with TreeFactory =>
+
+ import global._
+ import global.analyzer._
+ import global.definitions._
+ import settings.hardcoded
+
+ // debugging:
+ val DEBUG: Boolean = settings.docImplicitsDebug.value
+ val ERROR: Boolean = true // currently we show all errors
+ @inline final def debug(msg: => String) = if (DEBUG) settings.printMsg(msg)
+ @inline final def error(msg: => String) = if (ERROR) settings.printMsg(msg)
+
+ /** This is a flag that indicates whether to eliminate implicits that cannot be satisfied within the current scope.
+ * For example, if an implicit conversion requires that there is a Numeric[T] in scope:
+ * {{{
+ * class A[T]
+ * class B extends A[Int]
+ * class C extends A[String]
+ * implicit def enrichA[T: Numeric](a: A[T]): D
+ * }}}
+ * For B, no constraints are generated as Numeric[Int] is already in the default scope. On the other hand, for the
+ * conversion from C to D, depending on -implicits-show-all, the conversion can:
+ * - not be generated at all, since there's no Numeric[String] in scope (if ran without -implicits-show-all)
+ * - generated with a *weird* constraint, Numeric[String] as the user might add it by hand (if flag is enabled)
+ */
+ class ImplicitNotFound(tpe: Type) extends Exception("No implicit of type " + tpe + " found in scope.")
+
+ /* ============== MAKER METHODS ============== */
+
+ /**
+ * Make the implicit conversion objects
+ *
+ * A word about the scope of the implicit conversions: currently we look at a very basic context composed of the
+ * default Scala imports (Predef._ for example) and the companion object of the current class, if one exists. In the
+ * future we might want to extend this to more complex scopes.
+ */
+ def makeImplicitConversions(sym: Symbol, inTpl: DocTemplateImpl): List[ImplicitConversionImpl] =
+ // Nothing and Null are somewhat special -- they can be transformed by any implicit conversion available in scope.
+ // But we don't want that, so we'll simply refuse to find implicit conversions on for Nothing and Null
+ if (!(sym.isClass || sym.isTrait || sym == AnyRefClass) || sym == NothingClass || sym == NullClass) Nil
+ else {
+ val context: global.analyzer.Context = global.analyzer.rootContext(NoCompilationUnit)
+
+ val results = global.analyzer.allViewsFrom(sym.tpe_*, context, sym.typeParams)
+ var conversions = results.flatMap(result => makeImplicitConversion(sym, result._1, result._2, context, inTpl))
+ // also keep empty conversions, so they appear in diagrams
+ // conversions = conversions.filter(!_.members.isEmpty)
+
+ // Filter out specialized conversions from array
+ if (sym == ArrayClass)
+ conversions = conversions.filterNot((conv: ImplicitConversionImpl) =>
+ hardcoded.arraySkipConversions.contains(conv.conversionQualifiedName))
+
+ // Filter out non-sensical conversions from value types
+ if (isPrimitiveValueType(sym.tpe_*))
+ conversions = conversions.filter((ic: ImplicitConversionImpl) =>
+ hardcoded.valueClassFilter(sym.nameString, ic.conversionQualifiedName))
+
+ // Put the visible conversions in front
+ val (ownConversions, commonConversions) =
+ conversions.partition(!_.isHiddenConversion)
+
+ ownConversions ::: commonConversions
+ }
+
+ /** makeImplicitConversion performs the heavier lifting to get the implicit listing:
+ * - for each possible conversion function (also called view)
+ * * figures out the final result of the view (to what is our class transformed?)
+ * * figures out the necessary constraints on the type parameters (such as T <: Int) and the context (such as Numeric[T])
+ * * lists all inherited members
+ *
+ * What? in details:
+ * - say we start from a class A[T1, T2, T3, T4]
+ * - we have an implicit function (view) in scope:
+ * def enrichA[T3 <: Long, T4](a: A[Int, Foo[Bar[X]], T3, T4])(implicit ev1: TypeTag[T4], ev2: Numeric[T4]): EnrichedA
+ * - A is converted to EnrichedA ONLY if a couple of constraints are satisfied:
+ * * T1 must be equal to Int
+ * * T2 must be equal to Foo[Bar[X]]
+ * * T3 must be upper bounded by Long
+ * * there must be evidence of Numeric[T4] and a TypeTag[T4] within scope
+ * - the final type is EnrichedA and A therefore inherits a couple of members from enrichA
+ *
+ * How?
+ * some notes:
+ * - Scala's type inference will want to solve all type parameters down to actual types, but we only want constraints
+ * to maintain generality
+ * - therefore, allViewsFrom wraps type parameters into "untouchable" type variables that only gather constraints,
+ * but are never solved down to a type
+ * - these must be reverted back to the type parameters and the constraints must be extracted and simplified (this is
+ * done by the uniteConstraints and boundedTParamsConstraints. Be sure to check them out
+ * - we also need to transform implicit parameters in the view's signature into constraints, such that Numeric[T4]
+ * appears as a constraint
+ */
+ def makeImplicitConversion(sym: Symbol, result: SearchResult, constrs: List[TypeConstraint], context: Context, inTpl: DocTemplateImpl): List[ImplicitConversionImpl] =
+ if (result.tree == EmptyTree) Nil
+ else {
+ // `result` will contain the type of the view (= implicit conversion method)
+ // the search introduces untouchable type variables, but we want to get back to type parameters
+ val viewFullType = result.tree.tpe
+ // set the previously implicit parameters to being explicit
+
+ val (viewSimplifiedType, viewImplicitTypes) = removeImplicitParameters(viewFullType)
+
+ // TODO: Isolate this corner case :) - Predef.<%< and put it in the testsuite
+ if (viewSimplifiedType.params.length != 1) {
+ // This is known to be caused by the `<%<` object in Predef:
+ // {{{
+ // sealed abstract class <%<[-From, +To] extends (From => To) with Serializable
+ // object <%< {
+ // implicit def conformsOrViewsAs[A <% B, B]: A <%< B = new (A <%< B) {def apply(x: A) = x}
+ // }
+ // }}}
+ // so we just won't generate an implicit conversion for implicit methods that only take implicit parameters
+ return Nil
+ }
+
+ // type the view application so we get the exact type of the result (not the formal type)
+ val viewTree = result.tree.setType(viewSimplifiedType)
+ val appliedTree = new ApplyImplicitView(viewTree, List(Ident("<argument>") setType viewTree.tpe.paramTypes.head))
+ val appliedTreeTyped: Tree = {
+ val newContext = context.makeImplicit(context.ambiguousErrors)
+ newContext.macrosEnabled = false
+ val newTyper = global.analyzer.newTyper(newContext)
+ newTyper.silent(_.typed(appliedTree, EXPRmode, WildcardType), reportAmbiguousErrors = false) match {
+
+ case global.analyzer.SilentResultValue(t: Tree) => t
+ case global.analyzer.SilentTypeError(err) =>
+ global.reporter.warning(sym.pos, err.toString)
+ return Nil
+ }
+ }
+
+ // now we have the final type:
+ val toType = wildcardToNothing(typeVarToOriginOrWildcard(appliedTreeTyped.tpe.finalResultType))
+
+ try {
+ // Transform bound constraints into scaladoc constraints
+ val implParamConstraints = makeImplicitConstraints(viewImplicitTypes, sym, context, inTpl)
+ val boundsConstraints = makeBoundedConstraints(sym.typeParams, constrs, inTpl)
+ // TODO: no substitution constraints appear in the library and compiler scaladoc. Maybe they can be removed?
+ val substConstraints = makeSubstitutionConstraints(result.subst, inTpl)
+ val constraints = implParamConstraints ::: boundsConstraints ::: substConstraints
+
+ List(new ImplicitConversionImpl(sym, result.tree.symbol, toType, constraints, inTpl))
+ } catch {
+ case i: ImplicitNotFound =>
+ //println(" Eliminating: " + toType)
+ Nil
+ }
+ }
+
+ def makeImplicitConstraints(types: List[Type], sym: Symbol, context: Context, inTpl: DocTemplateImpl): List[Constraint] =
+ types.flatMap((tpe:Type) => {
+ // TODO: Before creating constraints, map typeVarToOriginOrWildcard on the implicitTypes
+ val implType = typeVarToOriginOrWildcard(tpe)
+ val qualifiedName = makeQualifiedName(implType.typeSymbol)
+
+ var available: Option[Boolean] = None
+
+ // see: https://groups.google.com/forum/?hl=en&fromgroups#!topic/scala-internals/gm_fr0RKzC4
+ //
+ // println(implType + " => " + implType.isTrivial)
+ // var tpes: List[Type] = List(implType)
+ // while (!tpes.isEmpty) {
+ // val tpe = tpes.head
+ // tpes = tpes.tail
+ // tpe match {
+ // case TypeRef(pre, sym, args) =>
+ // tpes = pre :: args ::: tpes
+ // println(tpe + " => " + tpe.isTrivial)
+ // case _ =>
+ // println(tpe + " (of type" + tpe.getClass + ") => " + tpe.isTrivial)
+ // }
+ // }
+ // println("\n")
+
+ // look for type variables in the type. If there are none, we can decide if the implicit is there or not
+ if (implType.isTrivial) {
+ try {
+ // TODO: Not sure if `owner = sym.owner` is the right thing to do -- seems similar to what scalac should be doing
+ val silentContext = context.make(owner = sym.owner).makeSilent(reportAmbiguousErrors = false)
+ val search = inferImplicit(EmptyTree, tpe, false, false, silentContext, false)
+ available = Some(search.tree != EmptyTree)
+ } catch {
+ case _: TypeError =>
+ }
+ }
+
+ available match {
+ case Some(true) =>
+ Nil
+ case Some(false) if !settings.docImplicitsShowAll =>
+ // if -implicits-show-all is not set, we get rid of impossible conversions (such as Numeric[String])
+ throw new ImplicitNotFound(implType)
+ case _ =>
+ val typeParamNames = sym.typeParams.map(_.name)
+
+ // TODO: This is maybe the worst hack I ever did - it's as dirty as hell, but it seems to work, so until I
+ // learn more about symbols, it'll have to do.
+ implType match {
+ case TypeRef(pre, sym, List(TypeRef(NoPrefix, targ, Nil))) if (typeParamNames contains targ.name) =>
+ hardcoded.knownTypeClasses.get(qualifiedName) match {
+ case Some(explanation) =>
+ List(new KnownTypeClassConstraint {
+ val typeParamName = targ.nameString
+ lazy val typeExplanation = explanation
+ lazy val typeClassEntity = makeTemplate(sym)
+ lazy val implicitType: TypeEntity = makeType(implType, inTpl)
+ })
+ case None =>
+ List(new TypeClassConstraint {
+ val typeParamName = targ.nameString
+ lazy val typeClassEntity = makeTemplate(sym)
+ lazy val implicitType: TypeEntity = makeType(implType, inTpl)
+ })
+ }
+ case _ =>
+ List(new ImplicitInScopeConstraint{
+ lazy val implicitType: TypeEntity = makeType(implType, inTpl)
+ })
+ }
+ }
+ })
+
+ def makeSubstitutionConstraints(subst: TreeTypeSubstituter, inTpl: DocTemplateImpl): List[Constraint] =
+ (subst.from zip subst.to) map {
+ case (from, to) =>
+ new EqualTypeParamConstraint {
+ error("Scaladoc implicits: Unexpected type substitution constraint from: " + from + " to: " + to)
+ val typeParamName = from.toString
+ val rhs = makeType(to, inTpl)
+ }
+ }
+
+ def makeBoundedConstraints(tparams: List[Symbol], constrs: List[TypeConstraint], inTpl: DocTemplateImpl): List[Constraint] =
+ (tparams zip constrs) flatMap {
+ case (tparam, constr) => {
+ uniteConstraints(constr) match {
+ case (loBounds, upBounds) => (loBounds filter (_ != NothingClass.tpe), upBounds filter (_ != AnyClass.tpe)) match {
+ case (Nil, Nil) =>
+ Nil
+ case (List(lo), List(up)) if (lo == up) =>
+ List(new EqualTypeParamConstraint {
+ val typeParamName = tparam.nameString
+ lazy val rhs = makeType(lo, inTpl)
+ })
+ case (List(lo), List(up)) =>
+ List(new BoundedTypeParamConstraint {
+ val typeParamName = tparam.nameString
+ lazy val lowerBound = makeType(lo, inTpl)
+ lazy val upperBound = makeType(up, inTpl)
+ })
+ case (List(lo), Nil) =>
+ List(new LowerBoundedTypeParamConstraint {
+ val typeParamName = tparam.nameString
+ lazy val lowerBound = makeType(lo, inTpl)
+ })
+ case (Nil, List(up)) =>
+ List(new UpperBoundedTypeParamConstraint {
+ val typeParamName = tparam.nameString
+ lazy val upperBound = makeType(up, inTpl)
+ })
+ case other =>
+ // this is likely an error on the lub/glb side
+ error("Scaladoc implicits: Error computing lub/glb for: " + ((tparam, constr)) + ":\n" + other)
+ Nil
+ }
+ }
+ }
+ }
+
+ /* ============== IMPLEMENTATION PROVIDING ENTITY TYPES ============== */
+
+ class ImplicitConversionImpl(
+ val sym: Symbol,
+ val convSym: Symbol,
+ val toType: Type,
+ val constrs: List[Constraint],
+ inTpl: DocTemplateImpl)
+ extends ImplicitConversion {
+
+ def source: DocTemplateEntity = inTpl
+
+ def targetType: TypeEntity = makeType(toType, inTpl)
+
+ def convertorOwner: TemplateEntity = {
+ if (convSym eq NoSymbol)
+ error("Scaladoc implicits: " + toString + " = NoSymbol!")
+
+ makeTemplate(convSym.owner)
+ }
+
+ def targetTypeComponents: List[(TemplateEntity, TypeEntity)] = makeParentTypes(toType, None, inTpl)
+
+ def convertorMethod: Either[MemberEntity, String] = {
+ var convertor: MemberEntity = null
+
+ convertorOwner match {
+ case doc: DocTemplateImpl =>
+ val convertors = members.collect { case m: MemberImpl if m.sym == convSym => m }
+ if (convertors.length == 1)
+ convertor = convertors.head
+ case _ =>
+ }
+ if (convertor ne null)
+ Left(convertor)
+ else
+ Right(convSym.nameString)
+ }
+
+ def conversionShortName = convSym.nameString
+
+ def conversionQualifiedName = makeQualifiedName(convSym)
+
+ lazy val constraints: List[Constraint] = constrs
+
+ lazy val memberImpls: List[MemberImpl] = {
+ // Obtain the members inherited by the implicit conversion
+ val memberSyms = toType.members.filter(implicitShouldDocument(_)).toList
+
+ // Debugging part :)
+ debug(sym.nameString + "\n" + "=" * sym.nameString.length())
+ debug(" * conversion " + convSym + " from " + sym.tpe + " to " + toType)
+
+ debug(" -> full type: " + toType)
+ if (constraints.length != 0) {
+ debug(" -> constraints: ")
+ constraints foreach { constr => debug(" - " + constr) }
+ }
+ debug(" -> members:")
+ memberSyms foreach (sym => debug(" - "+ sym.decodedName +" : " + sym.info))
+ debug("")
+
+ memberSyms.flatMap({ aSym =>
+ // we can't just pick up nodes from the original template, although that would be very convenient:
+ // they need the byConversion field to be attached to themselves and the types to be transformed by
+ // asSeenFrom
+
+ // at the same time, the member itself is in the inTpl, not in the new template -- but should pick up
+ // variables from the old template. Ugly huh? We'll always create the member inTpl, but it will change
+ // the template when expanding variables in the comment :)
+ makeMember(aSym, Some(this), inTpl)
+ })
+ }
+
+ lazy val members: List[MemberEntity] = memberImpls
+
+ def isHiddenConversion = settings.hiddenImplicits(conversionQualifiedName)
+
+ override def toString = "Implcit conversion from " + sym.tpe + " to " + toType + " done by " + convSym
+ }
+
+ /* ========================= HELPER METHODS ========================== */
+ /**
+ * Computes the shadowing table for all the members in the implicit conversions
+ * @param members All template's members, including usecases and full signature members
+ * @param convs All the conversions the template takes part in
+ * @param inTpl the usual :)
+ */
+ def makeShadowingTable(members: List[MemberImpl],
+ convs: List[ImplicitConversionImpl],
+ inTpl: DocTemplateImpl): Map[MemberEntity, ImplicitMemberShadowing] = {
+ assert(modelFinished)
+
+ val shadowingTable = mutable.Map[MemberEntity, ImplicitMemberShadowing]()
+ val membersByName: Map[Name, List[MemberImpl]] = members.groupBy(_.sym.name)
+ val convsByMember = (Map.empty[MemberImpl, ImplicitConversionImpl] /: convs) {
+ case (map, conv) => map ++ conv.memberImpls.map (_ -> conv)
+ }
+
+ for (conv <- convs) {
+ val otherConvMembers: Map[Name, List[MemberImpl]] = convs filterNot (_ == conv) flatMap (_.memberImpls) groupBy (_.sym.name)
+
+ for (member <- conv.memberImpls) {
+ val sym1 = member.sym
+ val tpe1 = conv.toType.memberInfo(sym1)
+
+ // check if it's shadowed by a member in the original class.
+ val shadowed = membersByName.get(sym1.name).toList.flatten filter { other =>
+ !settings.docImplicitsSoundShadowing.value || !isDistinguishableFrom(tpe1, inTpl.sym.info.memberInfo(other.sym))
+ }
+
+ // check if it's shadowed by another conversion.
+ val ambiguous = otherConvMembers.get(sym1.name).toList.flatten filter { other =>
+ val tpe2 = convsByMember(other).toType.memberInfo(other.sym)
+ !isDistinguishableFrom(tpe1, tpe2) || !isDistinguishableFrom(tpe2, tpe1)
+ }
+
+ // we finally have the shadowing info
+ if (!shadowed.isEmpty || !ambiguous.isEmpty) {
+ val shadowing = new ImplicitMemberShadowing {
+ def shadowingMembers: List[MemberEntity] = shadowed
+ def ambiguatingMembers: List[MemberEntity] = ambiguous
+ }
+
+ shadowingTable += (member -> shadowing)
+ }
+ }
+ }
+
+ shadowingTable.toMap
+ }
+
+
+ /**
+ * uniteConstraints takes a TypeConstraint instance and simplifies the constraints inside
+ *
+ * Normally TypeConstraint contains multiple lower and upper bounds, and we want to reduce this to a lower and an
+ * upper bound. Here are a couple of catches we need to be aware of:
+ * - before finding a view (implicit method in scope that maps class A[T1,T2,.. Tn] to something else) the type
+ * parameters are transformed into "untouchable" type variables so that type inference does not attempt to
+ * fully solve them down to a type but rather constrains them on both sides just enough for the view to be
+ * applicable -- now, we want to transform those type variables back to the original type parameters
+ * - some of the bounds fail type inference and therefore refer to Nothing => when performing unification (lub, glb)
+ * they start looking ugly => we (unsoundly) transform Nothing to WildcardType so we fool the unification algorithms
+ * into thinking there's nothing there
+ * - we don't want the wildcard types surviving the unification so we replace them back to Nothings
+ */
+ def uniteConstraints(constr: TypeConstraint): (List[Type], List[Type]) =
+ try {
+ (List(wildcardToNothing(lub(constr.loBounds map typeVarToOriginOrWildcard))),
+ List(wildcardToNothing(glb(constr.hiBounds map typeVarToOriginOrWildcard))))
+ } catch {
+ // does this actually ever happen? (probably when type vars occur in the bounds)
+ case x: Throwable => (constr.loBounds.distinct, constr.hiBounds.distinct)
+ }
+
+ /**
+ * Make implicits explicit - Not used curently
+ */
+ // object implicitToExplicit extends TypeMap {
+ // def apply(tp: Type): Type = mapOver(tp) match {
+ // case MethodType(params, resultType) =>
+ // MethodType(params.map(param => if (param.isImplicit) param.cloneSymbol.resetFlag(Flags.IMPLICIT) else param), resultType)
+ // case other =>
+ // other
+ // }
+ // }
+
+ /**
+ * removeImplicitParameters transforms implicit parameters from the view result type into constraints and
+ * returns the simplified type of the view
+ *
+ * for the example view:
+ * implicit def enrichMyClass[T](a: MyClass[T])(implicit ev: Numeric[T]): EnrichedMyClass[T]
+ * the implicit view result type is:
+ * (a: MyClass[T])(implicit ev: Numeric[T]): EnrichedMyClass[T]
+ * and the simplified type will be:
+ * MyClass[T] => EnrichedMyClass[T]
+ */
+ def removeImplicitParameters(viewType: Type): (Type, List[Type]) = {
+
+ val params = viewType.paramss.flatten
+ val (normalParams, implParams) = params.partition(!_.isImplicit)
+ val simplifiedType = MethodType(normalParams, viewType.finalResultType)
+ val implicitTypes = implParams.map(_.tpe)
+
+ (simplifiedType, implicitTypes)
+ }
+
+ /**
+ * typeVarsToOriginOrWildcard transforms the "untouchable" type variables into either their origins (the original
+ * type parameters) or into wildcard types if nothing matches
+ */
+ object typeVarToOriginOrWildcard extends TypeMap {
+ def apply(tp: Type): Type = mapOver(tp) match {
+ case tv: TypeVar =>
+ if (tv.constr.inst.typeSymbol == NothingClass)
+ WildcardType
+ else
+ tv.origin //appliedType(tv.origin.typeConstructor, tv.typeArgs map this)
+ case other =>
+ if (other.typeSymbol == NothingClass)
+ WildcardType
+ else
+ other
+ }
+ }
+
+ /**
+ * wildcardToNothing transforms wildcard types back to Nothing
+ */
+ object wildcardToNothing extends TypeMap {
+ def apply(tp: Type): Type = mapOver(tp) match {
+ case WildcardType =>
+ NothingClass.tpe
+ case other =>
+ other
+ }
+ }
+
+ /** implicitShouldDocument decides whether a member inherited by implicit conversion should be documented */
+ def implicitShouldDocument(aSym: Symbol): Boolean = {
+ // We shouldn't document:
+ // - constructors
+ // - common methods (in Any, AnyRef, Object) as they are automatically removed
+ // - private and protected members (not accessible following an implicit conversion)
+ // - members starting with _ (usually reserved for internal stuff)
+ localShouldDocument(aSym) && (!aSym.isConstructor) && (aSym.owner != AnyValClass) &&
+ (aSym.owner != AnyClass) && (aSym.owner != ObjectClass) &&
+ (!aSym.isProtected) && (!aSym.isPrivate) && (!aSym.name.startsWith("_")) &&
+ (aSym.isMethod || aSym.isGetter || aSym.isSetter) &&
+ (aSym.nameString != "getClass")
+ }
+
+ /* To put it very bluntly: checks if you can call implicitly added method with t1 when t2 is already there in the
+ * class. We suppose the name of the two members coincides
+ *
+ * The trick here is that the resultType does not matter - the condition for removal it that paramss have the same
+ * structure (A => B => C may not override (A, B) => C) and that all the types involved are
+ * of the implcit conversion's member are subtypes of the parent members' parameters */
+ def isDistinguishableFrom(t1: Type, t2: Type): Boolean = {
+ // Vlad: I tried using matches but it's not exactly what we need:
+ // (p: AnyRef)AnyRef matches ((t: String)AnyRef returns false -- but we want that to be true
+ // !(t1 matches t2)
+ if (t1.paramss.map(_.length) == t2.paramss.map(_.length)) {
+ for ((t1p, t2p) <- t1.paramss.flatten zip t2.paramss.flatten)
+ if (!isSubType(t1 memberInfo t1p, t2 memberInfo t2p))
+ return true // if on the corresponding parameter you give a type that is in t1 but not in t2
+ // def foo(a: Either[Int, Double]): Int = 3
+ // def foo(b: Left[T1]): Int = 6
+ // a.foo(Right(4.5d)) prints out 3 :)
+ false
+ } else true // the member structure is different foo(3, 5) vs foo(3)(5)
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala
new file mode 100644
index 0000000000..d5048dcfa3
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala
@@ -0,0 +1,315 @@
+/* NSC -- new Scala compiler -- Copyright 2007-2013 LAMP/EPFL */
+
+package scala.tools.nsc
+package doc
+package model
+
+import base._
+import diagram._
+
+import scala.collection._
+
+/** This trait extracts all required information for documentation from compilation units */
+trait ModelFactoryTypeSupport {
+ thisFactory: ModelFactory
+ with ModelFactoryImplicitSupport
+ with ModelFactoryTypeSupport
+ with DiagramFactory
+ with CommentFactory
+ with TreeFactory
+ with MemberLookup =>
+
+ import global._
+ import definitions.{ ObjectClass, NothingClass, AnyClass, AnyValClass, AnyRefClass }
+
+ protected val typeCache = new mutable.LinkedHashMap[Type, TypeEntity]
+
+ /** */
+ def makeType(aType: Type, inTpl: TemplateImpl): TypeEntity = {
+ def createTypeEntity = new TypeEntity {
+ private var nameBuffer = new StringBuilder
+ private var refBuffer = new immutable.TreeMap[Int, (LinkTo, Int)]
+ private def appendTypes0(types: List[Type], sep: String): Unit = types match {
+ case Nil =>
+ case tp :: Nil =>
+ appendType0(tp)
+ case tp :: tps =>
+ appendType0(tp)
+ nameBuffer append sep
+ appendTypes0(tps, sep)
+ }
+
+ private def appendType0(tpe: Type): Unit = tpe match {
+ /* Type refs */
+ case tp: TypeRef if definitions.isFunctionType(tp) =>
+ val args = tp.normalize.typeArgs
+ nameBuffer append '('
+ appendTypes0(args.init, ", ")
+ nameBuffer append ") ⇒ "
+ appendType0(args.last)
+ case tp: TypeRef if definitions.isScalaRepeatedParamType(tp) =>
+ appendType0(tp.args.head)
+ nameBuffer append '*'
+ case tp: TypeRef if definitions.isByNameParamType(tp) =>
+ nameBuffer append "⇒ "
+ appendType0(tp.args.head)
+ case tp: TypeRef if definitions.isTupleType(tp) =>
+ val args = tp.normalize.typeArgs
+ nameBuffer append '('
+ appendTypes0(args, ", ")
+ nameBuffer append ')'
+ case TypeRef(pre, aSym, targs) =>
+ val preSym = pre.widen.typeSymbol
+
+ // SI-3314/SI-4888: Classes, Traits and Types can be inherited from a template to another:
+ // class Enum { abstract class Value }
+ // class Day extends Enum { object Mon extends Value /*...*/ }
+ // ===> in such cases we have two options:
+ // (0) if there's no inheritance taking place (Enum#Value) we can link to the template directly
+ // (1) if we generate the doc template for Day, we can link to the correct member
+ // (2) If the symbol comes from an external library for which we know the documentation URL, point to it.
+ // (3) if we don't generate the doc template, we should at least indicate the correct prefix in the tooltip
+ val bSym = normalizeTemplate(aSym)
+ val owner =
+ if ((preSym != NoSymbol) && /* it needs a prefix */
+ (preSym != bSym.owner) && /* prefix is different from owner */
+ (aSym == bSym)) /* normalization doesn't play tricks on us */
+ preSym
+ else
+ bSym.owner
+
+ val link =
+ findTemplateMaybe(bSym) match {
+ case Some(bTpl) if owner == bSym.owner =>
+ // (0) the owner's class is linked AND has a template - lovely
+ bTpl match {
+ case dtpl: DocTemplateEntity => new LinkToTpl(dtpl)
+ case _ => new Tooltip(bTpl.qualifiedName)
+ }
+ case _ =>
+ val oTpl = findTemplateMaybe(owner)
+ (oTpl, oTpl flatMap (findMember(bSym, _))) match {
+ case (Some(oTpl), Some(bMbr)) =>
+ // (1) the owner's class
+ LinkToMember(bMbr, oTpl)
+ case _ =>
+ val name = makeQualifiedName(bSym)
+ if (!bSym.owner.isPackage)
+ Tooltip(name)
+ else
+ findExternalLink(bSym, name).getOrElse (
+ // (3) if we couldn't find neither the owner nor external URL to link to, show a tooltip with the qualified name
+ Tooltip(name)
+ )
+ }
+ }
+
+ // SI-4360 Showing prefixes when necessary
+ // We check whether there's any directly accessible type with the same name in the current template OR if the
+ // type is inherited from one template to another. There may be multiple symbols with the same name in scope,
+ // but we won't show the prefix if our symbol is among them, only if *it's not* -- that's equal to showing
+ // the prefix only for ambiguous references, not for overloaded ones.
+ def needsPrefix: Boolean = {
+ if ((owner != bSym.owner || preSym.isRefinementClass) && (normalizeTemplate(owner) != inTpl.sym))
+ return true
+ // don't get tricked into prefixng method type params and existentials:
+ // I tried several tricks BUT adding the method for which I'm creating the type => that simply won't scale,
+ // as ValueParams are independent of their parent member, and I really don't want to add this information to
+ // all terms, as we're already over the allowed memory footprint
+ if (aSym.isTypeParameterOrSkolem || aSym.isExistentiallyBound /* existential or existential skolem */)
+ return false
+
+ for (tpl <- inTpl.sym.ownerChain) {
+ tpl.info.member(bSym.name) match {
+ case NoSymbol =>
+ // No syms with that name, look further inside the owner chain
+ case sym =>
+ // Symbol found -- either the correct symbol, another one OR an overloaded alternative
+ if (sym == bSym)
+ return false
+ else sym.info match {
+ case OverloadedType(owner, alternatives) =>
+ return alternatives.contains(bSym)
+ case _ =>
+ return true
+ }
+ }
+ }
+ // if it's not found in the owner chain, we can safely leave out the prefix
+ false
+ }
+
+ val prefix =
+ if (!settings.docNoPrefixes && needsPrefix && (bSym != AnyRefClass /* which we normalize */)) {
+ if (!owner.isRefinementClass) {
+ val qName = makeQualifiedName(owner, Some(inTpl.sym))
+ if (qName != "") qName + "." else ""
+ }
+ else {
+ nameBuffer append "("
+ appendType0(pre)
+ nameBuffer append ")#"
+ "" // we already appended the prefix
+ }
+ } else ""
+
+ //DEBUGGING:
+ //if (makeQualifiedName(bSym) == "pack1.A") println("needsPrefix(" + bSym + ", " + owner + ", " + inTpl.qualifiedName + ") => " + needsPrefix + " and prefix=" + prefix)
+
+ val name = prefix + bSym.nameString
+ val pos0 = nameBuffer.length
+ refBuffer += pos0 -> ((link, name.length))
+ nameBuffer append name
+
+ if (!targs.isEmpty) {
+ nameBuffer append '['
+ appendTypes0(targs, ", ")
+ nameBuffer append ']'
+ }
+ /* Refined types */
+ case RefinedType(parents, defs) =>
+ val ignoreParents = Set[Symbol](AnyClass, ObjectClass)
+ val filtParents = parents filterNot (x => ignoreParents(x.typeSymbol)) match {
+ case Nil => parents
+ case ps => ps
+ }
+ appendTypes0(filtParents, " with ")
+ // 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) =>
+ nameBuffer append '⇒'
+ appendType0(result)
+
+ /* Polymorphic types */
+ case PolyType(tparams, result) => assert(tparams.nonEmpty)
+ def typeParamsToString(tps: List[Symbol]): String = if (tps.isEmpty) "" else
+ tps.map{tparam =>
+ tparam.varianceString + tparam.name + typeParamsToString(tparam.typeParams)
+ }.mkString("[", ", ", "]")
+ nameBuffer append typeParamsToString(tparams)
+ appendType0(result)
+
+ case et@ExistentialType(quantified, underlying) =>
+
+ def appendInfoStringReduced(sym: Symbol, tp: Type): Unit = {
+ if (sym.isType && !sym.isAliasType && !sym.isClass) {
+ tp match {
+ case PolyType(tparams, _) =>
+ nameBuffer append "["
+ appendTypes0(tparams.map(_.tpe), ", ")
+ nameBuffer append "]"
+ case _ =>
+ }
+ tp.resultType match {
+ case rt @ TypeBounds(_, _) =>
+ appendType0(rt)
+ case rt =>
+ nameBuffer append " <: "
+ appendType0(rt)
+ }
+ } else {
+ // fallback to the Symbol infoString
+ nameBuffer append sym.infoString(tp)
+ }
+ }
+
+ def appendClauses = {
+ nameBuffer append " forSome {"
+ var first = true
+ for (sym <- quantified) {
+ if (!first) { nameBuffer append ", " } else first = false
+ if (sym.isSingletonExistential) {
+ nameBuffer append "val "
+ nameBuffer append tpnme.dropSingletonName(sym.name)
+ nameBuffer append ": "
+ appendType0(dropSingletonType(sym.info.bounds.hi))
+ } else {
+ if (sym.flagString != "") nameBuffer append (sym.flagString + " ")
+ if (sym.keyString != "") nameBuffer append (sym.keyString + " ")
+ nameBuffer append sym.varianceString
+ nameBuffer append sym.nameString
+ appendInfoStringReduced(sym, sym.info)
+ }
+ }
+ nameBuffer append "}"
+ }
+
+ underlying match {
+ case TypeRef(pre, sym, args) if et.isRepresentableWithWildcards =>
+ appendType0(typeRef(pre, sym, Nil))
+ nameBuffer append "["
+ var first = true
+ val qset = quantified.toSet
+ for (arg <- args) {
+ if (!first) { nameBuffer append ", " } else first = false
+ arg match {
+ case TypeRef(_, sym, _) if (qset contains sym) =>
+ nameBuffer append "_"
+ appendInfoStringReduced(sym, sym.info)
+ case arg =>
+ appendType0(arg)
+ }
+ }
+ nameBuffer append "]"
+ case MethodType(_, _) | NullaryMethodType(_) | PolyType(_, _) =>
+ nameBuffer append "("
+ appendType0(underlying)
+ nameBuffer append ")"
+ appendClauses
+ case _ =>
+ appendType0(underlying)
+ appendClauses
+ }
+
+ case tb@TypeBounds(lo, hi) =>
+ if (tb.lo != TypeBounds.empty.lo) {
+ nameBuffer append " >: "
+ appendType0(lo)
+ }
+ if (tb.hi != TypeBounds.empty.hi) {
+ nameBuffer append " <: "
+ appendType0(hi)
+ }
+ // case tpen: ThisType | SingleType | SuperType =>
+ // if (tpen.isInstanceOf[ThisType] && tpen.asInstanceOf[ThisType].sym.isEffectiveRoot) {
+ // appendType0 typeRef(NoPrefix, sym, Nil)
+ // } else {
+ // val underlying =
+ // val pre = underlying.typeSymbol.skipPackageObject
+ // if (pre.isOmittablePrefix) pre.fullName + ".type"
+ // else prefixString + "type"
+ case tpen@ThisType(sym) =>
+ appendType0(typeRef(NoPrefix, sym, Nil))
+ nameBuffer append ".this"
+ if (!tpen.underlying.typeSymbol.skipPackageObject.isOmittablePrefix) nameBuffer append ".type"
+ case tpen@SuperType(thistpe, supertpe) =>
+ nameBuffer append "super["
+ appendType0(supertpe)
+ nameBuffer append "]"
+ case tpen@SingleType(pre, sym) =>
+ appendType0(typeRef(pre, sym, Nil))
+ if (!tpen.underlying.typeSymbol.skipPackageObject.isOmittablePrefix) nameBuffer append ".type"
+ case tpen =>
+ nameBuffer append tpen.toString
+ }
+ appendType0(aType)
+ val refEntity = refBuffer
+ val name = optimize(nameBuffer.toString)
+ nameBuffer = null
+ }
+
+ // SI-4360: Entity caching depends on both the type AND the template it's in, as the prefixes might change for the
+ // same type based on the template the type is shown in.
+ if (settings.docNoPrefixes)
+ typeCache.getOrElseUpdate(aType, createTypeEntity)
+ else createTypeEntity
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/TreeEntity.scala b/src/scaladoc/scala/tools/nsc/doc/model/TreeEntity.scala
new file mode 100644
index 0000000000..5b4ec4a40b
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/TreeEntity.scala
@@ -0,0 +1,27 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Chris James
+ */
+
+package scala.tools.nsc
+package doc
+package model
+
+import scala.collection._
+
+
+/** A fragment of code. */
+abstract class TreeEntity {
+
+ /** The human-readable representation of this abstract syntax tree. */
+ def expression: String
+
+ /** Maps which parts of this syntax tree's name reference entities. The map is indexed by the position of the first
+ * character that reference some entity, and contains the entity and the position of the last referenced
+ * character. The referenced character ranges do not to overlap or nest. The map is sorted by position. */
+ def refEntity: SortedMap[Int, (Entity, Int)]
+
+ /** The human-readable representation of this abstract syntax tree. */
+ override def toString = expression
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/TreeFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/TreeFactory.scala
new file mode 100755
index 0000000000..b381176b17
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/TreeFactory.scala
@@ -0,0 +1,95 @@
+package scala.tools.nsc
+package doc
+package model
+
+import scala.collection._
+import scala.reflect.internal.util.{RangePosition, OffsetPosition, SourceFile}
+
+/** The goal of this trait is , using makeTree,
+ * to browse a tree to
+ * 1- have the String of the complete tree (tree.expression)
+ * 2- fill references to create hyperLinks later in html.pageTemplate
+ *
+ * It is applied in ModelFactory => makeTree
+ *
+ */
+
+trait TreeFactory { thisTreeFactory: ModelFactory with TreeFactory =>
+
+ val global: Global
+ import global._
+
+ def makeTree(rhs: Tree): TreeEntity = {
+
+ val expr = new StringBuilder
+ var refs = new immutable.TreeMap[Int, (Entity, Int)] // start, (Entity to be linked to , end)
+
+ rhs.pos match {
+ case pos: RangePosition => {
+ val source: SourceFile = pos.source
+ val firstIndex = pos.startOrPoint
+ val lastIndex = pos.endOrPoint
+
+ assert(firstIndex < lastIndex, "Invalid position indices for tree " + rhs + " (" + firstIndex + ", " + lastIndex + ")")
+ expr.appendAll(source.content, firstIndex, lastIndex - firstIndex)
+
+ val traverser = new Traverser {
+
+ /** Finds the Entity on which we will later create a link on,
+ * stores it in tree.refs with its position
+ */
+ def makeLink(rhs: Tree){
+ val start = pos.startOrPoint - firstIndex
+ val end = pos.endOrPoint - firstIndex
+ if(start != end) {
+ var asym = rhs.symbol
+ if (asym.isClass) makeTemplate(asym) match{
+ case docTmpl: DocTemplateImpl =>
+ refs += ((start, (docTmpl,end)))
+ case _ =>
+ }
+ else if (asym.isTerm && asym.owner.isClass){
+ if (asym.isSetter) asym = asym.getter(asym.owner)
+ makeTemplate(asym.owner) match {
+ case docTmpl: DocTemplateImpl =>
+ val mbrs: Option[MemberImpl] = findMember(asym, docTmpl)
+ mbrs foreach { mbr => refs += ((start, (mbr,end))) }
+ case _ =>
+ }
+ }
+ }
+ }
+ /**
+ * Goes through the tree and makes links when a Select occurs,
+ * The case of New(_) is ignored because the object we want to create a link on
+ * will be reached with recursivity and we don't want a link on the "new" string
+ * If a link is not created, its case is probably not defined in here
+ */
+ override def traverse(tree: Tree) = tree match {
+ case Select(qualifier, name) =>
+ qualifier match {
+ case New(_) =>
+ case _ => makeLink(tree)
+ }
+ traverse(qualifier)
+ case Ident(_) => makeLink(tree)
+ case _ =>
+ super.traverse(tree)
+ }
+ }
+
+ traverser.traverse(rhs)
+
+ new TreeEntity {
+ val expression = expr.toString
+ val refEntity = refs
+ }
+ }
+ case _ =>
+ new TreeEntity {
+ val expression = rhs.toString
+ val refEntity = new immutable.TreeMap[Int, (Entity, Int)]
+ }
+ }
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/TypeEntity.scala b/src/scaladoc/scala/tools/nsc/doc/model/TypeEntity.scala
new file mode 100644
index 0000000000..cf5c1fb3fb
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/TypeEntity.scala
@@ -0,0 +1,27 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Manohar Jonnalagedda
+ */
+
+package scala.tools.nsc
+package doc
+package model
+
+import scala.collection._
+
+/** A type. Note that types and templates contain the same information only for the simplest types. For example, a type
+ * defines how a template's type parameters are instantiated (as in `List[Cow]`), what the template's prefix is
+ * (as in `johnsFarm.Cow`), and supports compound or structural types. */
+abstract class TypeEntity {
+
+ /** The human-readable representation of this type. */
+ def name: String
+
+ /** Maps which parts of this type's name reference entities. The map is indexed by the position of the first
+ * character that reference some entity, and contains the entity and the position of the last referenced
+ * character. The referenced character ranges do not to overlap or nest. The map is sorted by position. */
+ def refEntity: SortedMap[Int, (base.LinkTo, Int)]
+
+ /** The human-readable representation of this type. */
+ override def toString = name
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/ValueArgument.scala b/src/scaladoc/scala/tools/nsc/doc/model/ValueArgument.scala
new file mode 100644
index 0000000000..f712869a4b
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/ValueArgument.scala
@@ -0,0 +1,20 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Gilles Dubochet
+ */
+
+package scala.tools.nsc
+package doc
+package model
+
+
+/** A value that is passed as an argument to a value parameter. */
+trait ValueArgument {
+
+ /** The parameter as argument to which this value is passed, if it is known. */
+ def parameter: Option[ValueParam]
+
+ /** The expression that calculates the value. */
+ def value: TreeEntity
+
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/Visibility.scala b/src/scaladoc/scala/tools/nsc/doc/model/Visibility.scala
new file mode 100644
index 0000000000..22580805aa
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/Visibility.scala
@@ -0,0 +1,39 @@
+/* NSC -- new Scala compiler
+ * Copyright 2007-2013 LAMP/EPFL
+ * @author Gilles Dubochet
+ */
+
+package scala.tools.nsc
+package doc
+package model
+
+/** An type that represents visibility of members. */
+sealed trait Visibility {
+ def isProtected: Boolean = false
+ def isPublic: Boolean = false
+}
+
+/** The visibility of `private[this]` members. */
+case class PrivateInInstance() extends Visibility
+
+/** The visibility of `protected[this]` members. */
+case class ProtectedInInstance() extends Visibility {
+ override def isProtected = true
+}
+
+/** The visibility of `private[owner]` members. An unqualified private members
+ * is encoded with `owner` equal to the members's `inTemplate`. */
+case class PrivateInTemplate(owner: TemplateEntity) extends Visibility
+
+/** The visibility of `protected[owner]` members. An unqualified protected
+ * members is encoded with `owner` equal to the members's `inTemplate`.
+ * Note that whilst the member is visible in any template owned by `owner`,
+ * it is only visible in subclasses of the member's `inTemplate`. */
+case class ProtectedInTemplate(owner: TemplateEntity) extends Visibility {
+ override def isProtected = true
+}
+
+/** The visibility of public members. */
+case class Public() extends Visibility {
+ override def isPublic = true
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/diagram/Diagram.scala b/src/scaladoc/scala/tools/nsc/doc/model/diagram/Diagram.scala
new file mode 100644
index 0000000000..150b293b81
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/diagram/Diagram.scala
@@ -0,0 +1,137 @@
+package scala.tools.nsc.doc
+package model
+package diagram
+
+import model._
+
+/**
+ * The diagram base classes
+ *
+ * @author Damien Obrist
+ * @author Vlad Ureche
+ */
+abstract class Diagram {
+ def nodes: List[Node]
+ def edges: List[(Node, List[Node])]
+ def isContentDiagram = false // Implemented by ContentDiagram
+ def isInheritanceDiagram = false // Implemented by InheritanceDiagram
+ def depthInfo: DepthInfo
+}
+
+case class ContentDiagram(nodes:List[/*Class*/Node], edges:List[(Node, List[Node])]) extends Diagram {
+ override def isContentDiagram = true
+ lazy val depthInfo = new ContentDiagramDepth(this)
+}
+
+/** A class diagram */
+case class InheritanceDiagram(thisNode: ThisNode,
+ superClasses: List[/*Class*/Node],
+ subClasses: List[/*Class*/Node],
+ incomingImplicits: List[ImplicitNode],
+ outgoingImplicits: List[ImplicitNode]) extends Diagram {
+ def nodes = thisNode :: superClasses ::: subClasses ::: incomingImplicits ::: outgoingImplicits
+ def edges = (thisNode -> (superClasses ::: outgoingImplicits)) ::
+ (subClasses ::: incomingImplicits).map(_ -> List(thisNode))
+
+ override def isInheritanceDiagram = true
+ lazy val depthInfo = new DepthInfo {
+ def maxDepth = 3
+ }
+}
+
+trait DepthInfo {
+ /** Gives the maximum depth */
+ def maxDepth: Int
+}
+
+abstract class Node {
+ def name = tpe.name
+ def tpe: TypeEntity
+ def tpl: Option[TemplateEntity]
+ /** shortcut to get a DocTemplateEntity */
+ def doctpl: Option[DocTemplateEntity] = tpl match {
+ case Some(tpl) => tpl match {
+ case d: DocTemplateEntity => Some(d)
+ case _ => None
+ }
+ case _ => None
+ }
+ /* shortcuts to find the node type without matching */
+ def isThisNode = false
+ def isNormalNode = false
+ def isClassNode = if (tpl.isDefined) (tpl.get.isClass || tpl.get.qualifiedName == "scala.AnyRef") else false
+ def isTraitNode = if (tpl.isDefined) tpl.get.isTrait else false
+ def isObjectNode= if (tpl.isDefined) tpl.get.isObject else false
+ def isTypeNode = if (doctpl.isDefined) doctpl.get.isAbstractType || doctpl.get.isAliasType else false
+ def isOtherNode = !(isClassNode || isTraitNode || isObjectNode || isTypeNode)
+ def isImplicitNode = false
+ def isOutsideNode = false
+ def tooltip: Option[String]
+}
+
+// different matchers, allowing you to use the pattern matcher against any node
+// NOTE: A ThisNode or ImplicitNode can at the same time be ClassNode/TraitNode/OtherNode, not exactly according to
+// case class specification -- thus a complete match would be:
+// node match {
+// case ThisNode(tpe, _) => /* case for this node, you can still use .isClass, .isTrait and .isOther */
+// case ImplicitNode(tpe, _) => /* case for an implicit node, you can still use .isClass, .isTrait and .isOther */
+// case _ => node match {
+// case ClassNode(tpe, _) => /* case for a non-this, non-implicit Class node */
+// case TraitNode(tpe, _) => /* case for a non-this, non-implicit Trait node */
+// case OtherNode(tpe, _) => /* case for a non-this, non-implicit Other node */
+// }
+// }
+object Node { def unapply(n: Node): Option[(TypeEntity, Option[TemplateEntity])] = Some((n.tpe, n.tpl)) }
+object ClassNode { def unapply(n: Node): Option[(TypeEntity, Option[TemplateEntity])] = if (n.isClassNode) Some((n.tpe, n.tpl)) else None }
+object TraitNode { def unapply(n: Node): Option[(TypeEntity, Option[TemplateEntity])] = if (n.isTraitNode) Some((n.tpe, n.tpl)) else None }
+object TypeNode { def unapply(n: Node): Option[(TypeEntity, Option[TemplateEntity])] = if (n.isTypeNode) Some((n.tpe, n.tpl)) else None }
+object ObjectNode { def unapply(n: Node): Option[(TypeEntity, Option[TemplateEntity])] = if (n.isObjectNode) Some((n.tpe, n.tpl)) else None }
+object OutsideNode { def unapply(n: Node): Option[(TypeEntity, Option[TemplateEntity])] = if (n.isOutsideNode) Some((n.tpe, n.tpl)) else None }
+object OtherNode { def unapply(n: Node): Option[(TypeEntity, Option[TemplateEntity])] = if (n.isOtherNode) Some((n.tpe, n.tpl)) else None }
+
+
+
+/** The node for the current class */
+case class ThisNode(tpe: TypeEntity, tpl: Option[TemplateEntity])(val tooltip: Option[String] = None) extends Node { override def isThisNode = true }
+
+/** The usual node */
+case class NormalNode(tpe: TypeEntity, tpl: Option[TemplateEntity])(val tooltip: Option[String] = None) extends Node { override def isNormalNode = true }
+
+/** A class or trait the thisnode can be converted to by an implicit conversion
+ * TODO: I think it makes more sense to use the tpe links to templates instead of the TemplateEntity for implicit nodes
+ * since some implicit conversions convert the class to complex types that cannot be represented as a single tmeplate
+ */
+case class ImplicitNode(tpe: TypeEntity, tpl: Option[TemplateEntity])(val tooltip: Option[String] = None) extends Node { override def isImplicitNode = true }
+
+/** An outside node is shown in packages when a class from a different package makes it to the package diagram due to
+ * its relation to a class in the template (see @contentDiagram hideInheritedNodes annotation) */
+case class OutsideNode(tpe: TypeEntity, tpl: Option[TemplateEntity])(val tooltip: Option[String] = None) extends Node { override def isOutsideNode = true }
+
+
+// Computing and offering node depth information
+class ContentDiagramDepth(pack: ContentDiagram) extends DepthInfo {
+ private[this] var _maxDepth = 0
+ private[this] var _nodeDepth = Map[Node, Int]()
+ private[this] var seedNodes = Set[Node]()
+ private[this] val invertedEdges: Map[Node, List[Node]] =
+ pack.edges.flatMap({case (node: Node, outgoing: List[Node]) => outgoing.map((_, node))}).groupBy(_._1).map({case (k, values) => (k, values.map(_._2))}).withDefaultValue(Nil)
+ private[this] val directEdges: Map[Node, List[Node]] = pack.edges.toMap.withDefaultValue(Nil)
+
+ // seed base nodes, to minimize noise - they can't all have parents, else there would only be cycles
+ seedNodes ++= pack.nodes.filter(directEdges(_).isEmpty)
+
+ while (!seedNodes.isEmpty) {
+ var newSeedNodes = Set[Node]()
+ for (node <- seedNodes) {
+ val depth = 1 + (-1 :: directEdges(node).map(_nodeDepth.getOrElse(_, -1))).max
+ if (depth != _nodeDepth.getOrElse(node, -1)) {
+ _nodeDepth += (node -> depth)
+ newSeedNodes ++= invertedEdges(node)
+ if (depth > _maxDepth) _maxDepth = depth
+ }
+ }
+ seedNodes = newSeedNodes
+ }
+
+ val maxDepth = _maxDepth
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramDirectiveParser.scala b/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramDirectiveParser.scala
new file mode 100644
index 0000000000..44d8886e4e
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramDirectiveParser.scala
@@ -0,0 +1,257 @@
+package scala.tools.nsc.doc
+package model
+package diagram
+
+import model._
+import java.util.regex.{Pattern, Matcher}
+import scala.util.matching.Regex
+
+/**
+ * This trait takes care of parsing @{inheritance, content}Diagram annotations
+ *
+ * @author Damien Obrist
+ * @author Vlad Ureche
+ */
+trait DiagramDirectiveParser {
+ this: ModelFactory with DiagramFactory with CommentFactory with TreeFactory =>
+
+ import this.global.definitions.AnyRefClass
+
+ ///// DIAGRAM FILTERS //////////////////////////////////////////////////////////////////////////////////////////////
+
+ /**
+ * The DiagramFilter trait directs the diagram engine about the way the diagram should be displayed
+ *
+ * Vlad: There's an explanation I owe to people using diagrams and not finding a way to hide a specific class from
+ * all diagrams at once. So why did I choose to allow you to only control the diagrams at class level? So, the
+ * reason is you would break the separate scaladoc compilation:
+ * If you have an "@diagram hideMyClass" annotation in class A and you run scaladoc on it along with its subclass B
+ * A will not appear in B's diagram. But if you scaladoc only on B, A's comment will not be parsed and the
+ * instructions to hide class A from all diagrams will not be available. Thus I prefer to force you to control the
+ * diagrams of each class locally. The problem does not appear with scalac, as scalac stores all its necessary
+ * information (like scala signatures) serialized in the .class file. But we couldn't store doc comments in the class
+ * file, could we? (Turns out we could, but that's another story)
+ *
+ * Any flaming for this decision should go to scala-internals@googlegroups.com
+ */
+ trait DiagramFilter {
+ /** A flag to hide the diagram completely */
+ def hideDiagram: Boolean
+ /** Hide incoming implicit conversions (for type hierarchy diagrams) */
+ def hideIncomingImplicits: Boolean
+ /** Hide outgoing implicit conversions (for type hierarchy diagrams) */
+ def hideOutgoingImplicits: Boolean
+ /** Hide superclasses (for type hierarchy diagrams) */
+ def hideSuperclasses: Boolean
+ /** Hide subclasses (for type hierarchy diagrams) */
+ def hideSubclasses: Boolean
+ /** Show related classes from other objects/traits/packages (for content diagrams) */
+ def hideInheritedNodes: Boolean
+ /** Hide a node from the diagram */
+ def hideNode(clazz: Node): Boolean
+ /** Hide an edge from the diagram */
+ def hideEdge(clazz1: Node, clazz2: Node): Boolean
+ }
+
+ /** Main entry point into this trait: generate the filter for inheritance diagrams */
+ def makeInheritanceDiagramFilter(template: DocTemplateImpl): DiagramFilter = {
+
+ val defaultFilter =
+ if (template.isClass || template.isTrait || template.sym == AnyRefClass)
+ FullDiagram
+ else
+ NoDiagramAtAll
+
+ if (template.comment.isDefined)
+ makeDiagramFilter(template, template.comment.get.inheritDiagram, defaultFilter, isInheritanceDiagram = true)
+ else
+ defaultFilter
+ }
+
+ /** Main entry point into this trait: generate the filter for content diagrams */
+ def makeContentDiagramFilter(template: DocTemplateImpl): DiagramFilter = {
+ val defaultFilter = if (template.isPackage || template.isObject) FullDiagram else NoDiagramAtAll
+ if (template.comment.isDefined)
+ makeDiagramFilter(template, template.comment.get.contentDiagram, defaultFilter, isInheritanceDiagram = false)
+ else
+ defaultFilter
+ }
+
+ protected var tFilter = 0l
+ protected var tModel = 0l
+
+ /** Show the entire diagram, no filtering */
+ case object FullDiagram extends DiagramFilter {
+ val hideDiagram: Boolean = false
+ val hideIncomingImplicits: Boolean = false
+ val hideOutgoingImplicits: Boolean = false
+ val hideSuperclasses: Boolean = false
+ val hideSubclasses: Boolean = false
+ val hideInheritedNodes: Boolean = false
+ def hideNode(clazz: Node): Boolean = false
+ def hideEdge(clazz1: Node, clazz2: Node): Boolean = false
+ }
+
+ /** Hide the diagram completely, no need for special filtering */
+ case object NoDiagramAtAll extends DiagramFilter {
+ val hideDiagram: Boolean = true
+ val hideIncomingImplicits: Boolean = true
+ val hideOutgoingImplicits: Boolean = true
+ val hideSuperclasses: Boolean = true
+ val hideSubclasses: Boolean = true
+ val hideInheritedNodes: Boolean = true
+ def hideNode(clazz: Node): Boolean = true
+ def hideEdge(clazz1: Node, clazz2: Node): Boolean = true
+ }
+
+ /** The AnnotationDiagramFilter trait directs the diagram engine according to an annotation
+ * TODO: Should document the annotation, for now see parseDiagramAnnotation in ModelFactory.scala */
+ case class AnnotationDiagramFilter(hideDiagram: Boolean,
+ hideIncomingImplicits: Boolean,
+ hideOutgoingImplicits: Boolean,
+ hideSuperclasses: Boolean,
+ hideSubclasses: Boolean,
+ hideInheritedNodes: Boolean,
+ hideNodesFilter: List[Pattern],
+ hideEdgesFilter: List[(Pattern, Pattern)]) extends DiagramFilter {
+
+ private[this] def getName(n: Node): String =
+ if (n.tpl.isDefined)
+ n.tpl.get.qualifiedName
+ else
+ n.name
+
+ def hideNode(clazz: Node): Boolean = {
+ val qualifiedName = getName(clazz)
+ for (hideFilter <- hideNodesFilter)
+ if (hideFilter.matcher(qualifiedName).matches) {
+ // println(hideFilter + ".matcher(" + qualifiedName + ").matches = " + hideFilter.matcher(qualifiedName).matches)
+ return true
+ }
+ false
+ }
+
+ def hideEdge(clazz1: Node, clazz2: Node): Boolean = {
+ val clazz1Name = getName(clazz1)
+ val clazz2Name = getName(clazz2)
+ for ((clazz1Filter, clazz2Filter) <- hideEdgesFilter) {
+ if (clazz1Filter.matcher(clazz1Name).matches &&
+ clazz2Filter.matcher(clazz2Name).matches) {
+ // println(clazz1Filter + ".matcher(" + clazz1Name + ").matches = " + clazz1Filter.matcher(clazz1Name).matches)
+ // println(clazz2Filter + ".matcher(" + clazz2Name + ").matches = " + clazz2Filter.matcher(clazz2Name).matches)
+ return true
+ }
+ }
+ false
+ }
+ }
+
+ // TODO: This could certainly be improved -- right now the only regex is *, but there's no way to match a single identifier
+ private val NodeSpecRegex = "\\\"[A-Za-z\\*][A-Za-z\\.\\*]*\\\""
+ private val NodeSpecPattern = Pattern.compile(NodeSpecRegex)
+ private val EdgeSpecRegex = "\\(" + NodeSpecRegex + "\\s*\\->\\s*" + NodeSpecRegex + "\\)"
+ // And the composed regexes:
+ private val HideNodesRegex = new Regex("^hideNodes(\\s*" + NodeSpecRegex + ")+$")
+ private val HideEdgesRegex = new Regex("^hideEdges(\\s*" + EdgeSpecRegex + ")+$")
+
+ private def makeDiagramFilter(template: DocTemplateImpl,
+ directives: List[String],
+ defaultFilter: DiagramFilter,
+ isInheritanceDiagram: Boolean): DiagramFilter = directives match {
+
+ // if there are no specific diagram directives, return the default filter (either FullDiagram or NoDiagramAtAll)
+ case Nil =>
+ defaultFilter
+
+ // compute the exact filters. By including the annotation, the diagram is autmatically added
+ case _ =>
+ tFilter -= System.currentTimeMillis
+ var hideDiagram0: Boolean = false
+ var hideIncomingImplicits0: Boolean = false
+ var hideOutgoingImplicits0: Boolean = false
+ var hideSuperclasses0: Boolean = false
+ var hideSubclasses0: Boolean = false
+ var hideInheritedNodes0: Boolean = false
+ var hideNodesFilter0: List[Pattern] = Nil
+ var hideEdgesFilter0: List[(Pattern, Pattern)] = Nil
+
+ def warning(message: String) = {
+ // we need the position from the package object (well, ideally its comment, but yeah ...)
+ val sym = if (template.sym.isPackage) template.sym.info.member(global.nme.PACKAGE) else template.sym
+ assert((sym != global.NoSymbol) || (sym == global.rootMirror.RootPackage))
+ global.reporter.warning(sym.pos, message)
+ }
+
+ def preparePattern(className: String) =
+ "^" + className.stripPrefix("\"").stripSuffix("\"").replaceAll("\\.", "\\\\.").replaceAll("\\*", ".*") + "$"
+
+ // separate entries:
+ val entries = directives.foldRight("")(_ + " " + _).split(",").map(_.trim)
+ for (entry <- entries)
+ entry match {
+ case "hideDiagram" =>
+ hideDiagram0 = true
+ case "hideIncomingImplicits" if isInheritanceDiagram =>
+ hideIncomingImplicits0 = true
+ case "hideOutgoingImplicits" if isInheritanceDiagram =>
+ hideOutgoingImplicits0 = true
+ case "hideSuperclasses" if isInheritanceDiagram =>
+ hideSuperclasses0 = true
+ case "hideSubclasses" if isInheritanceDiagram =>
+ hideSubclasses0 = true
+ case "hideInheritedNodes" if !isInheritanceDiagram =>
+ hideInheritedNodes0 = true
+ case HideNodesRegex(last) =>
+ val matcher = NodeSpecPattern.matcher(entry)
+ while (matcher.find()) {
+ val classPattern = Pattern.compile(preparePattern(matcher.group()))
+ hideNodesFilter0 ::= classPattern
+ }
+ case HideEdgesRegex(last) =>
+ val matcher = NodeSpecPattern.matcher(entry)
+ while (matcher.find()) {
+ val class1Pattern = Pattern.compile(preparePattern(matcher.group()))
+ assert(matcher.find()) // it's got to be there, just matched it!
+ val class2Pattern = Pattern.compile(preparePattern(matcher.group()))
+ hideEdgesFilter0 ::= ((class1Pattern, class2Pattern))
+ }
+ case "" =>
+ // don't need to do anything about it
+ case _ =>
+ warning("Could not understand diagram annotation in " + template.kind + " " + template.qualifiedName +
+ ": unmatched entry \"" + entry + "\".\n" +
+ " This could be because:\n" +
+ " - you forgot to separate entries by commas\n" +
+ " - you used a tag that is not allowed in the current context (like @contentDiagram hideSuperclasses)\n"+
+ " - you did not use one of the allowed tags (see docs.scala-lang.org for scaladoc annotations)")
+ }
+ val result =
+ if (hideDiagram0)
+ NoDiagramAtAll
+ else if ((hideNodesFilter0.isEmpty) &&
+ (hideEdgesFilter0.isEmpty) &&
+ (hideIncomingImplicits0 == false) &&
+ (hideOutgoingImplicits0 == false) &&
+ (hideSuperclasses0 == false) &&
+ (hideSubclasses0 == false) &&
+ (hideInheritedNodes0 == false) &&
+ (hideDiagram0 == false))
+ FullDiagram
+ else
+ AnnotationDiagramFilter(
+ hideDiagram = hideDiagram0,
+ hideIncomingImplicits = hideIncomingImplicits0,
+ hideOutgoingImplicits = hideOutgoingImplicits0,
+ hideSuperclasses = hideSuperclasses0,
+ hideSubclasses = hideSubclasses0,
+ hideInheritedNodes = hideInheritedNodes0,
+ hideNodesFilter = hideNodesFilter0,
+ hideEdgesFilter = hideEdgesFilter0)
+
+ if (settings.docDiagramsDebug && result != NoDiagramAtAll && result != FullDiagram)
+ settings.printMsg(template.kind + " " + template.qualifiedName + " filter: " + result)
+ tFilter += System.currentTimeMillis
+
+ result
+ }
+}
diff --git a/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala b/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala
new file mode 100644
index 0000000000..ebac25bbe4
--- /dev/null
+++ b/src/scaladoc/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala
@@ -0,0 +1,254 @@
+package scala.tools.nsc.doc
+package model
+package diagram
+
+import model._
+
+// statistics
+import html.page.diagram.DiagramStats
+
+import scala.collection.immutable.SortedMap
+
+/**
+ * This trait takes care of generating the diagram for classes and packages
+ *
+ * @author Damien Obrist
+ * @author Vlad Ureche
+ */
+trait DiagramFactory extends DiagramDirectiveParser {
+ this: ModelFactory with ModelFactoryTypeSupport with DiagramFactory with CommentFactory with TreeFactory =>
+
+ import this.global.definitions._
+ import this.global._
+
+ // the following can used for hardcoding different relations into the diagram, for bootstrapping purposes
+ def aggregationNode(text: String) =
+ NormalNode(new TypeEntity { val name = text; val refEntity = SortedMap[Int, (base.LinkTo, Int)]() }, None)()
+
+ /** Create the inheritance diagram for this template */
+ def makeInheritanceDiagram(tpl: DocTemplateImpl): Option[Diagram] = {
+
+ tFilter = 0
+ tModel = -System.currentTimeMillis
+
+ // the diagram filter
+ val diagramFilter = makeInheritanceDiagramFilter(tpl)
+
+ def implicitTooltip(from: DocTemplateEntity, to: TemplateEntity, conv: ImplicitConversion) =
+ Some(from.qualifiedName + " can be implicitly converted to " + conv.targetType + " by the implicit method "
+ + conv.conversionShortName + " in " + conv.convertorOwner.kind + " " + conv.convertorOwner.qualifiedName)
+
+ val result =
+ if (diagramFilter == NoDiagramAtAll)
+ None
+ else {
+ // the main node
+ val thisNode = ThisNode(tpl.resultType, Some(tpl))(Some(tpl.qualifiedName + " (this " + tpl.kind + ")"))
+
+ // superclasses
+ val superclasses: List[Node] =
+ tpl.parentTypes.collect {
+ case p: (TemplateEntity, TypeEntity) if !classExcluded(p._1) => NormalNode(p._2, Some(p._1))()
+ }.reverse
+
+ // incoming implcit conversions
+ lazy val incomingImplicitNodes = tpl.incomingImplicitlyConvertedClasses.map {
+ case (incomingTpl, conv) =>
+ ImplicitNode(makeType(incomingTpl.sym.tpe, tpl), Some(incomingTpl))(implicitTooltip(from=incomingTpl, to=tpl, conv=conv))
+ }
+
+ // subclasses
+ var subclasses: List[Node] =
+ tpl.directSubClasses.collect {
+ case d: TemplateImpl if !classExcluded(d) => NormalNode(makeType(d.sym.tpe, tpl), Some(d))()
+ }.sortBy(_.tpl.get.name)(implicitly[Ordering[String]].reverse)
+
+ // outgoing implicit coversions
+ lazy val outgoingImplicitNodes = tpl.outgoingImplicitlyConvertedClasses.map {
+ case (outgoingTpl, outgoingType, conv) =>
+ ImplicitNode(outgoingType, Some(outgoingTpl))(implicitTooltip(from=tpl, to=tpl, conv=conv))
+ }
+
+ // TODO: Everyone should be able to use the @{inherit,content}Diagram annotation to change the diagrams.
+ // Currently, it's possible to leave nodes and edges out, but there's no way to create new nodes and edges
+ // The implementation would need to add the annotations and the logic to select nodes (or create new ones)
+ // and add edges to the diagram -- I bet it wouldn't take too long for someone to do it (one or two days
+ // at most) and it would be a great add to the diagrams.
+ if (tpl.sym == AnyRefClass)
+ subclasses = List(aggregationNode("All user-defined classes and traits"))
+
+ val filteredSuperclasses = if (diagramFilter.hideSuperclasses) Nil else superclasses
+ val filteredIncomingImplicits = if (diagramFilter.hideIncomingImplicits) Nil else incomingImplicitNodes
+ val filteredSubclasses = if (diagramFilter.hideSubclasses) Nil else subclasses
+ val filteredImplicitOutgoingNodes = if (diagramFilter.hideOutgoingImplicits) Nil else outgoingImplicitNodes
+
+ // final diagram filter
+ filterDiagram(InheritanceDiagram(thisNode, filteredSuperclasses.reverse, filteredSubclasses.reverse, filteredIncomingImplicits, filteredImplicitOutgoingNodes), diagramFilter)
+ }
+
+ tModel += System.currentTimeMillis
+ DiagramStats.addFilterTime(tFilter)
+ DiagramStats.addModelTime(tModel-tFilter)
+
+ result
+ }
+
+ /** Create the content diagram for this template */
+ def makeContentDiagram(pack: DocTemplateImpl): Option[Diagram] = {
+
+ tFilter = 0
+ tModel = -System.currentTimeMillis
+
+ // the diagram filter
+ val diagramFilter = makeContentDiagramFilter(pack)
+
+ val result =
+ if (diagramFilter == NoDiagramAtAll)
+ None
+ else {
+ var mapNodes = Map[TemplateEntity, Node]()
+ var nodesShown = Set[TemplateEntity]()
+ var edgesAll = List[(TemplateEntity, List[TemplateEntity])]()
+
+ // classes is the entire set of classes and traits in the package, they are the superset of nodes in the diagram
+ // we collect classes, traits and objects without a companion, which are usually used as values(e.g. scala.None)
+ val nodesAll = pack.members collect {
+ case d: TemplateEntity if ((!diagramFilter.hideInheritedNodes) || (d.inTemplate == pack)) => d
+ }
+
+ // for each node, add its subclasses
+ for (node <- nodesAll if !classExcluded(node)) {
+ node match {
+ case dnode: MemberTemplateImpl =>
+ var superClasses = dnode.parentTypes.map(_._1).filter(nodesAll.contains(_))
+
+ // TODO: Everyone should be able to use the @{inherit,content}Diagram annotation to add nodes to diagrams.
+ if (pack.sym == ScalaPackage)
+ if (dnode.sym == NullClass)
+ superClasses = List(makeTemplate(AnyRefClass))
+ else if (dnode.sym == NothingClass)
+ superClasses = (List(NullClass) ::: ScalaValueClasses).map(makeTemplate(_))
+
+ if (!superClasses.isEmpty) {
+ nodesShown += dnode
+ nodesShown ++= superClasses
+ }
+ edgesAll ::= dnode -> superClasses
+ case _ =>
+ }
+
+ mapNodes += node -> (
+ if (node.inTemplate == pack && (node.isDocTemplate || node.isAbstractType || node.isAliasType))
+ NormalNode(node.resultType, Some(node))()
+ else
+ OutsideNode(node.resultType, Some(node))()
+ )
+ }
+
+ if (nodesShown.isEmpty)
+ None
+ else {
+ val nodes = nodesAll.filter(nodesShown.contains(_)).flatMap(mapNodes.get(_))
+ val edges = edgesAll.map(pair => (mapNodes(pair._1), pair._2.map(mapNodes(_)))).filterNot(pair => pair._2.isEmpty)
+ val diagram =
+ // TODO: Everyone should be able to use the @{inherit,content}Diagram annotation to change the diagrams.
+ if (pack.sym == ScalaPackage) {
+ // Tried it, but it doesn't look good:
+ // var anyRefSubtypes: List[Node] = List(mapNodes(makeTemplate(AnyRefClass)))
+ // var dirty = true
+ // do {
+ // val length = anyRefSubtypes.length
+ // anyRefSubtypes :::= edges.collect { case p: (Node, List[Node]) if p._2.exists(anyRefSubtypes.contains(_)) => p._1 }
+ // anyRefSubtypes = anyRefSubtypes.distinct
+ // dirty = (anyRefSubtypes.length != length)
+ // } while (dirty)
+ // println(anyRefSubtypes)
+ val anyRefSubtypes = Nil
+ val allAnyRefTypes = aggregationNode("All AnyRef subtypes")
+ val nullTemplate = makeTemplate(NullClass)
+ if (nullTemplate.isDocTemplate)
+ ContentDiagram(allAnyRefTypes::nodes, (mapNodes(nullTemplate), allAnyRefTypes::anyRefSubtypes)::edges.filterNot(_._1.tpl == Some(nullTemplate)))
+ else
+ ContentDiagram(nodes, edges)
+ } else
+ ContentDiagram(nodes, edges)
+
+ filterDiagram(diagram, diagramFilter)
+ }
+ }
+
+ tModel += System.currentTimeMillis
+ DiagramStats.addFilterTime(tFilter)
+ DiagramStats.addModelTime(tModel-tFilter)
+
+ result
+ }
+
+ /** Diagram filtering logic */
+ private def filterDiagram(diagram: Diagram, diagramFilter: DiagramFilter): Option[Diagram] = {
+ tFilter -= System.currentTimeMillis
+
+ val result =
+ if (diagramFilter == FullDiagram)
+ Some(diagram)
+ else if (diagramFilter == NoDiagramAtAll)
+ None
+ else {
+ // Final diagram, with the filtered nodes and edges
+ diagram match {
+ case InheritanceDiagram(thisNode, _, _, _, _) if diagramFilter.hideNode(thisNode) =>
+ None
+
+ case InheritanceDiagram(thisNode, superClasses, subClasses, incomingImplicits, outgoingImplicits) =>
+
+ def hideIncoming(node: Node): Boolean =
+ diagramFilter.hideNode(node) || diagramFilter.hideEdge(node, thisNode)
+
+ def hideOutgoing(node: Node): Boolean =
+ diagramFilter.hideNode(node) || diagramFilter.hideEdge(thisNode, node)
+
+ // println(thisNode)
+ // println(superClasses.map(cl => "super: " + cl + " " + hideOutgoing(cl)).mkString("\n"))
+ // println(subClasses.map(cl => "sub: " + cl + " " + hideIncoming(cl)).mkString("\n"))
+ Some(InheritanceDiagram(thisNode,
+ superClasses.filterNot(hideOutgoing(_)),
+ subClasses.filterNot(hideIncoming(_)),
+ incomingImplicits.filterNot(hideIncoming(_)),
+ outgoingImplicits.filterNot(hideOutgoing(_))))
+
+ case ContentDiagram(nodes0, edges0) =>
+ // Filter out all edges that:
+ // (1) are sources of hidden classes
+ // (2) are manually hidden by the user
+ // (3) are destinations of hidden classes
+ val edges: List[(Node, List[Node])] =
+ diagram.edges.flatMap({
+ case (source, dests) if !diagramFilter.hideNode(source) =>
+ val dests2 = dests.collect({ case dest if (!(diagramFilter.hideEdge(source, dest) || diagramFilter.hideNode(dest))) => dest })
+ if (dests2 != Nil)
+ List((source, dests2))
+ else
+ Nil
+ case _ => Nil
+ })
+
+ // Only show the the non-isolated nodes
+ // TODO: Decide if we really want to hide package members, I'm not sure that's a good idea (!!!)
+ // TODO: Does .distinct cause any stability issues?
+ val sourceNodes = edges.map(_._1)
+ val sinkNodes = edges.map(_._2).flatten
+ val nodes = (sourceNodes ::: sinkNodes).distinct
+ Some(ContentDiagram(nodes, edges))
+ }
+ }
+
+ tFilter += System.currentTimeMillis
+
+ // eliminate all empty diagrams
+ if (result.isDefined && result.get.edges.forall(_._2.isEmpty))
+ None
+ else
+ result
+ }
+
+}
diff --git a/src/scaladoc/scala/tools/partest/ScaladocModelTest.scala b/src/scaladoc/scala/tools/partest/ScaladocModelTest.scala
new file mode 100644
index 0000000000..f0a9caac15
--- /dev/null
+++ b/src/scaladoc/scala/tools/partest/ScaladocModelTest.scala
@@ -0,0 +1,203 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author Vlad Ureche
+ */
+
+package scala.tools.partest
+
+import scala.tools.nsc
+import scala.tools.nsc._
+import scala.tools.nsc.util.CommandLineParser
+import scala.tools.nsc.doc.{ DocFactory, Universe }
+import scala.tools.nsc.doc.model._
+import scala.tools.nsc.doc.model.diagram._
+import scala.tools.nsc.doc.base.comment._
+import scala.tools.nsc.reporters.ConsoleReporter
+
+/** A class for testing scaladoc model generation
+ * - you need to specify the code in the `code` method
+ * - you need to override the testModel method to test the model
+ * - you may specify extra parameters to send to scaladoc in `scaladocSettings`
+ * {{{
+ import scala.tools.nsc.doc.model._
+ import scala.tools.partest.ScaladocModelTest
+
+ object Test extends ScaladocModelTest {
+
+ override def code = """ ... """ // or override def resourceFile = "<file>.scala" (from test/scaladoc/resources)
+ def scaladocSettings = " ... "
+ def testModel(rootPackage: Package) = {
+ // get the quick access implicit defs in scope (_package(s), _class(es), _trait(s), object(s) _method(s), _value(s))
+ import access._
+
+ // just need to check the member exists, access methods will throw an error if there's a problem
+ rootPackage._package("scala")._package("test")._class("C")._method("foo")
+ }
+ }
+ * }}}
+ */
+abstract class ScaladocModelTest extends DirectTest {
+
+ /** Override this to give scaladoc command line parameters */
+ def scaladocSettings: String
+
+ /** Override this to test the model */
+ def testModel(root: Package): Unit
+
+ /** Override to feed a file in resources to scaladoc*/
+ def resourceFile: String = null
+
+ /** Override to feed code into scaladoc */
+ override def code =
+ if (resourceFile ne null)
+ io.File(resourcePath + "/" + resourceFile).slurp()
+ else
+ sys.error("Scaladoc Model Test: You need to give a file or some code to feed to scaladoc!")
+
+ def resourcePath = io.Directory(sys.props("partest.cwd") + "/../resources")
+
+ // Implementation follows:
+ override def extraSettings: String = "-usejavacp"
+
+ override def show(): Unit = {
+ // redirect err to out, for logging
+ val prevErr = System.err
+ System.setErr(System.out)
+
+ try {
+ // 1 - compile with scaladoc and get the model out
+ val universe = model.getOrElse({sys.error("Scaladoc Model Test ERROR: No universe generated!")})
+ // 2 - check the model generated
+ testModel(universe.rootPackage)
+ println("Done.")
+ } catch {
+ case e: Exception =>
+ println(e)
+ e.printStackTrace
+ }
+ // set err back to the real err handler
+ System.setErr(prevErr)
+ }
+
+ private[this] var settings: doc.Settings = null
+
+ // create a new scaladoc compiler
+ private[this] def newDocFactory: DocFactory = {
+ settings = new doc.Settings(_ => ())
+ settings.scaladocQuietRun = true // yaay, no more "model contains X documentable templates"!
+ val args = extraSettings + " " + scaladocSettings
+ new ScalaDoc.Command((CommandLineParser tokenize (args)), settings) // side-effecting, I think
+ val docFact = new DocFactory(new ConsoleReporter(settings), settings)
+ docFact
+ }
+
+ // compile with scaladoc and output the result
+ def model: Option[Universe] = newDocFactory.makeUniverse(Right(code))
+
+ // so we don't get the newSettings warning
+ override def isDebug = false
+
+ // finally, enable easy navigation inside the entities
+ object access {
+
+ implicit class TemplateAccess(tpl: DocTemplateEntity) {
+ def _class(name: String): DocTemplateEntity = getTheFirst(_classes(name), tpl.qualifiedName + ".class(" + name + ")")
+ def _classes(name: String): List[DocTemplateEntity] = tpl.templates.filter(_.name == name).collect({ case c: DocTemplateEntity with Class => c})
+
+ def _classMbr(name: String): MemberTemplateEntity = getTheFirst(_classesMbr(name), tpl.qualifiedName + ".classMember(" + name + ")")
+ def _classesMbr(name: String): List[MemberTemplateEntity] = tpl.templates.filter(_.name == name).collect({ case c: MemberTemplateEntity if c.isClass => c})
+
+ def _trait(name: String): DocTemplateEntity = getTheFirst(_traits(name), tpl.qualifiedName + ".trait(" + name + ")")
+ def _traits(name: String): List[DocTemplateEntity] = tpl.templates.filter(_.name == name).collect({ case t: DocTemplateEntity with Trait => t})
+
+ def _traitMbr(name: String): MemberTemplateEntity = getTheFirst(_traitsMbr(name), tpl.qualifiedName + ".traitMember(" + name + ")")
+ def _traitsMbr(name: String): List[MemberTemplateEntity] = tpl.templates.filter(_.name == name).collect({ case t: MemberTemplateEntity if t.isTrait => t})
+
+ def _object(name: String): DocTemplateEntity = getTheFirst(_objects(name), tpl.qualifiedName + ".object(" + name + ")")
+ def _objects(name: String): List[DocTemplateEntity] = tpl.templates.filter(_.name == name).collect({ case o: DocTemplateEntity with Object => o})
+
+ def _objectMbr(name: String): MemberTemplateEntity = getTheFirst(_objectsMbr(name), tpl.qualifiedName + ".objectMember(" + name + ")")
+ def _objectsMbr(name: String): List[MemberTemplateEntity] = tpl.templates.filter(_.name == name).collect({ case o: MemberTemplateEntity if o.isObject => o})
+
+ def _method(name: String): Def = getTheFirst(_methods(name), tpl.qualifiedName + ".method(" + name + ")")
+ def _methods(name: String): List[Def] = tpl.methods.filter(_.name == name)
+
+ def _value(name: String): Val = getTheFirst(_values(name), tpl.qualifiedName + ".value(" + name + ")")
+ def _values(name: String): List[Val] = tpl.values.filter(_.name == name)
+
+ def _conversion(name: String): ImplicitConversion = getTheFirst(_conversions(name), tpl.qualifiedName + ".conversion(" + name + ")")
+ def _conversions(name: String): List[ImplicitConversion] = tpl.conversions.filter(_.conversionQualifiedName == name)
+
+ def _absType(name: String): MemberEntity = getTheFirst(_absTypes(name), tpl.qualifiedName + ".abstractType(" + name + ")")
+ def _absTypes(name: String): List[MemberEntity] = tpl.members.filter(mbr => mbr.name == name && mbr.isAbstractType)
+
+ def _absTypeTpl(name: String): DocTemplateEntity = getTheFirst(_absTypeTpls(name), tpl.qualifiedName + ".abstractType(" + name + ")")
+ def _absTypeTpls(name: String): List[DocTemplateEntity] = tpl.members.collect({ case dtpl: DocTemplateEntity with AbstractType if dtpl.name == name => dtpl })
+
+ def _aliasType(name: String): MemberEntity = getTheFirst(_aliasTypes(name), tpl.qualifiedName + ".aliasType(" + name + ")")
+ def _aliasTypes(name: String): List[MemberEntity] = tpl.members.filter(mbr => mbr.name == name && mbr.isAliasType)
+
+ def _aliasTypeTpl(name: String): DocTemplateEntity = getTheFirst(_aliasTypeTpls(name), tpl.qualifiedName + ".aliasType(" + name + ")")
+ def _aliasTypeTpls(name: String): List[DocTemplateEntity] = tpl.members.collect({ case dtpl: DocTemplateEntity with AliasType if dtpl.name == name => dtpl })
+ }
+
+ trait WithMembers {
+ def members: List[MemberEntity]
+ def _member(name: String): MemberEntity = getTheFirst(_members(name), this.toString + ".member(" + name + ")")
+ def _members(name: String): List[MemberEntity] = members.filter(_.name == name)
+ }
+ implicit class PackageAccess(pack: Package) extends TemplateAccess(pack) {
+ def _package(name: String): Package = getTheFirst(_packages(name), pack.qualifiedName + ".package(" + name + ")")
+ def _packages(name: String): List[Package] = pack.packages.filter(_.name == name)
+ }
+ implicit class DocTemplateEntityMembers(val underlying: DocTemplateEntity) extends WithMembers {
+ def members = underlying.members
+ }
+ implicit class ImplicitConversionMembers(val underlying: ImplicitConversion) extends WithMembers {
+ def members = underlying.members
+ }
+
+ def getTheFirst[T](list: List[T], expl: String): T = list.length match {
+ case 1 => list.head
+ case 0 => sys.error("Error getting " + expl + ": No such element.")
+ case _ => sys.error("Error getting " + expl + ": " + list.length + " elements with this name. " +
+ "All elements in list: [" + list.map({
+ case ent: Entity => ent.kind + " " + ent.qualifiedName
+ case other => other.toString
+ }).mkString(", ") + "]")
+ }
+
+ def extractCommentText(c: Any) = {
+ def extractText(body: Any): String = body match {
+ case s: String => s
+ case s: Seq[_] => s.toList.map(extractText(_)).mkString
+ case p: Product => p.productIterator.toList.map(extractText(_)).mkString
+ case _ => ""
+ }
+ c match {
+ case c: Comment =>
+ extractText(c.body)
+ case b: Body =>
+ extractText(b)
+ }
+ }
+
+ def countLinks(c: Comment, p: EntityLink => Boolean) = {
+ def countLinks(body: Any): Int = body match {
+ case el: EntityLink if p(el) => 1
+ case s: Seq[_] => s.toList.map(countLinks(_)).sum
+ case p: Product => p.productIterator.toList.map(countLinks(_)).sum
+ case _ => 0
+ }
+ countLinks(c.body)
+ }
+
+ def testDiagram(doc: DocTemplateEntity, diag: Option[Diagram], nodes: Int, edges: Int) = {
+ assert(diag.isDefined, doc.qualifiedName + " diagram missing")
+ assert(diag.get.nodes.length == nodes,
+ doc.qualifiedName + "'s diagram: node count " + diag.get.nodes.length + " == " + nodes)
+ assert(diag.get.edges.map(_._2.length).sum == edges,
+ doc.qualifiedName + "'s diagram: edge count " + diag.get.edges.length + " == " + edges)
+ }
+ }
+}