summaryrefslogtreecommitdiff
path: root/src/compiler
diff options
context:
space:
mode:
Diffstat (limited to 'src/compiler')
-rw-r--r--src/compiler/scala/reflect/reify/Errors.scala5
-rw-r--r--src/compiler/scala/reflect/reify/phases/Reshape.scala1
-rw-r--r--src/compiler/scala/tools/ant/Same.scala2
-rw-r--r--src/compiler/scala/tools/ant/Scaladoc.scala695
-rw-r--r--src/compiler/scala/tools/ant/antlib.xml2
-rw-r--r--src/compiler/scala/tools/nsc/Global.scala26
-rw-r--r--src/compiler/scala/tools/nsc/Interpreter.scala12
-rw-r--r--src/compiler/scala/tools/nsc/InterpreterLoop.scala12
-rw-r--r--src/compiler/scala/tools/nsc/MainGenericRunner.scala106
-rw-r--r--src/compiler/scala/tools/nsc/ScalaDoc.scala72
-rw-r--r--src/compiler/scala/tools/nsc/ast/TreeGen.scala12
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Parsers.scala41
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/Scanners.scala184
-rw-r--r--src/compiler/scala/tools/nsc/ast/parser/SyntaxAnalyzer.scala4
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala30
-rw-r--r--src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala59
-rw-r--r--src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala622
-rw-r--r--src/compiler/scala/tools/nsc/doc/DocFactory.scala132
-rw-r--r--src/compiler/scala/tools/nsc/doc/DocParser.scala69
-rw-r--r--src/compiler/scala/tools/nsc/doc/Index.scala17
-rw-r--r--src/compiler/scala/tools/nsc/doc/ScaladocGlobal.scala106
-rw-r--r--src/compiler/scala/tools/nsc/doc/Settings.scala368
-rw-r--r--src/compiler/scala/tools/nsc/doc/Uncompilable.scala51
-rw-r--r--src/compiler/scala/tools/nsc/doc/Universe.scala16
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/base/CommentFactoryBase.scala936
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/base/LinkTo.scala15
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/base/MemberLookupBase.scala206
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/base/comment/Body.scala89
-rw-r--r--src/compiler/scala/tools/nsc/doc/base/comment/Comment.scala131
-rw-r--r--src/compiler/scala/tools/nsc/doc/doclet/Generator.scala30
-rw-r--r--src/compiler/scala/tools/nsc/doc/doclet/Indexer.scala21
-rw-r--r--src/compiler/scala/tools/nsc/doc/doclet/Universer.scala21
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/Doclet.scala19
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala152
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala224
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/Page.scala102
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/SyntaxHigh.scala286
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/Index.scala133
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/IndexScript.scala69
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/html/page/ReferenceIndex.scala58
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/Source.scala127
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/Template.scala967
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/diagram/DiagramGenerator.scala53
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala66
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala506
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala225
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.pngbin6232 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.pngbin6220 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/class.pngbin3357 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.pngbin7516 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/class_diagram.pngbin3910 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/class_to_object_big.pngbin9006 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/constructorsbg.gifbin1206 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/conversionbg.gifbin167 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/defbg-blue.gifbin1544 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/defbg-green.gifbin1341 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/diagrams.css143
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/diagrams.js324
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left.pngbin1692 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left.psdbin30823 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left2.gifbin1462 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_right.pngbin1803 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_right.psdbin31295 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/filterbg.gifbin1324 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.gifbin1104 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.pngbin965 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbg.gifbin1366 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/fullcommenttopbg.gifbin1115 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css338
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js533
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/html/resource/lib/jquery-ui.js6
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/jquery.js2
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js5486
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js4
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/navigation-li-a.pngbin1198 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/navigation-li.pngbin2441 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object.pngbin3356 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.pngbin7653 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object_diagram.pngbin3903 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_class_big.pngbin9158 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_trait_big.pngbin9200 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_type_big.pngbin9158 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/ownderbg2.gifbin1145 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/ownerbg.gifbin1118 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/ownerbg2.gifbin1145 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/package.pngbin3335 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.pngbin7312 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/packagesbg.gifbin1201 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/raphael-min.js10
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css30
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/remove.pngbin3186 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/remove.psdbin28904 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/scheduler.js71
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-implicits.pngbin1150 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-right-implicits.pngbin646 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-right.pngbin1380 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/selected.pngbin1864 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/selected2-right.pngbin1434 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/selected2.pngbin1965 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/signaturebg.gifbin1214 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/signaturebg2.gifbin1209 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css848
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js466
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/tools.tooltip.js14
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.pngbin3374 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.pngbin7410 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_diagram.pngbin3882 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_to_object_big.pngbin8967 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/type.pngbin1445 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/type_big.pngbin4236 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/type_diagram.pngbin1841 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai6376
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/type_to_object_big.pngbin4969 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/typebg.gifbin1206 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/unselected.pngbin1879 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/valuemembersbg.gifbin1206 -> 0 bytes
-rw-r--r--src/compiler/scala/tools/nsc/doc/html/resource/lib/versions.txt1
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/CommentFactory.scala112
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/Entity.scala601
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala58
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/MemberLookup.scala63
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala1045
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala579
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala315
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/TreeEntity.scala27
-rwxr-xr-xsrc/compiler/scala/tools/nsc/doc/model/TreeFactory.scala96
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/TypeEntity.scala27
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/ValueArgument.scala20
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/Visibility.scala39
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/diagram/Diagram.scala137
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/diagram/DiagramDirectiveParser.scala257
-rw-r--r--src/compiler/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala254
-rw-r--r--src/compiler/scala/tools/nsc/interactive/CompilerControl.scala470
-rw-r--r--src/compiler/scala/tools/nsc/interactive/ContextTrees.scala149
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Global.scala1139
-rw-r--r--src/compiler/scala/tools/nsc/interactive/InteractiveReporter.scala47
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Picklers.scala189
-rw-r--r--src/compiler/scala/tools/nsc/interactive/PresentationCompilerThread.scala51
-rw-r--r--src/compiler/scala/tools/nsc/interactive/REPL.scala218
-rw-r--r--src/compiler/scala/tools/nsc/interactive/RangePositions.scala13
-rw-r--r--src/compiler/scala/tools/nsc/interactive/Response.scala105
-rw-r--r--src/compiler/scala/tools/nsc/interactive/RichCompilationUnits.scala58
-rw-r--r--src/compiler/scala/tools/nsc/interactive/ScratchPadMaker.scala200
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/InteractiveTest.scala123
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/InteractiveTestSettings.scala69
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/Tester.scala208
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/AskCommand.scala109
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala100
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerInstance.scala34
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerRequestsWorkingMode.scala62
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerTestDef.scala18
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/Reporter.scala15
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/SourcesCollector.scala20
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/TestMarker.scala27
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/TestResources.scala12
-rw-r--r--src/compiler/scala/tools/nsc/interactive/tests/core/TestSettings.scala19
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/AbstractOrMissingHandler.scala41
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ByteCode.scala42
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/CommandLine.scala13
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Completion.scala49
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/CompletionAware.scala53
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/CompletionOutput.scala85
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala63
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Delimited.scala41
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ExprTyper.scala99
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Formatting.scala35
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ILoop.scala749
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/IMain.scala1121
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ISettings.scala54
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Imports.scala181
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala49
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala352
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/JLineReader.scala68
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Logger.scala14
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala86
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala219
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/NamedParam.scala45
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Naming.scala105
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Parsed.scala60
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Pasted.scala101
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Phased.scala143
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Power.scala326
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala49
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplDir.scala48
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplGlobal.scala56
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplProps.scala27
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplReporter.scala34
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala32
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/ReplVals.scala82
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/Results.scala22
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/RichClass.scala36
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/SimpleReader.scala40
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/package.scala157
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/session/FileBackedHistory.scala84
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/session/History.scala22
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/session/JLineHistory.scala49
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/session/SimpleHistory.scala58
-rw-r--r--src/compiler/scala/tools/nsc/interpreter/session/package.scala23
-rw-r--r--src/compiler/scala/tools/nsc/io/Lexer.scala2
-rw-r--r--src/compiler/scala/tools/nsc/javac/JavaScanners.scala53
-rw-r--r--src/compiler/scala/tools/nsc/settings/MutableSettings.scala4
-rw-r--r--src/compiler/scala/tools/nsc/settings/ScalaSettings.scala5
-rw-r--r--src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala1
-rw-r--r--src/compiler/scala/tools/nsc/settings/Warnings.scala12
-rw-r--r--src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala30
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala2
-rw-r--r--src/compiler/scala/tools/nsc/transform/Constructors.scala35
-rw-r--r--src/compiler/scala/tools/nsc/transform/Mixin.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala18
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Implicits.scala24
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Infer.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Macros.scala23
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Namers.scala80
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala23
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/RefChecks.scala2
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala12
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/TypeStrings.scala (renamed from src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala)18
-rw-r--r--src/compiler/scala/tools/nsc/typechecker/Typers.scala105
-rw-r--r--src/compiler/scala/tools/nsc/util/AbstractFileClassLoader.scala (renamed from src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala)18
-rw-r--r--src/compiler/scala/tools/nsc/util/ClassPath.scala8
-rw-r--r--src/compiler/scala/tools/nsc/util/ShowPickled.scala4
-rw-r--r--src/compiler/scala/tools/reflect/StdTags.scala4
-rw-r--r--src/compiler/scala/tools/reflect/ToolBoxFactory.scala4
-rw-r--r--src/compiler/scala/tools/util/Javap.scala694
-rw-r--r--src/compiler/scala/tools/util/PathResolver.scala2
226 files changed, 1004 insertions, 34015 deletions
diff --git a/src/compiler/scala/reflect/reify/Errors.scala b/src/compiler/scala/reflect/reify/Errors.scala
index 3a68794c97..860dfd72b2 100644
--- a/src/compiler/scala/reflect/reify/Errors.scala
+++ b/src/compiler/scala/reflect/reify/Errors.scala
@@ -21,6 +21,11 @@ trait Errors {
throw new ReificationException(defaultErrorPosition, msg)
}
+ def CannotReifyCompoundTypeTreeWithNonEmptyBody(ctt: CompoundTypeTree) = {
+ val msg = "implementation restriction: cannot reify refinement type trees with non-empty bodies"
+ throw new ReificationException(ctt.pos, msg)
+ }
+
def CannotReifyWeakType(details: Any) = {
val msg = "cannot create a TypeTag" + details + ": use WeakTypeTag instead"
throw new ReificationException(defaultErrorPosition, msg)
diff --git a/src/compiler/scala/reflect/reify/phases/Reshape.scala b/src/compiler/scala/reflect/reify/phases/Reshape.scala
index 50ee379c2e..bb5cb53d7d 100644
--- a/src/compiler/scala/reflect/reify/phases/Reshape.scala
+++ b/src/compiler/scala/reflect/reify/phases/Reshape.scala
@@ -180,6 +180,7 @@ trait Reshape {
private def toPreTyperCompoundTypeTree(ctt: CompoundTypeTree): Tree = {
val CompoundTypeTree(tmpl @ Template(parents, self, stats)) = ctt
+ if (stats.nonEmpty) CannotReifyCompoundTypeTreeWithNonEmptyBody(ctt)
assert(self eq emptyValDef, self)
val att = tmpl.attachments.get[CompoundTypeTreeOriginalAttachment]
val CompoundTypeTreeOriginalAttachment(parents1, stats1) = att.getOrElse(CompoundTypeTreeOriginalAttachment(parents, stats))
diff --git a/src/compiler/scala/tools/ant/Same.scala b/src/compiler/scala/tools/ant/Same.scala
index a1f0cda662..6362d28580 100644
--- a/src/compiler/scala/tools/ant/Same.scala
+++ b/src/compiler/scala/tools/ant/Same.scala
@@ -32,7 +32,7 @@ import org.apache.tools.ant.types.Mapper
*
* @author Gilles Dubochet
* @version 1.0 */
-class Same extends ScalaMatchingTask {
+@deprecated("Use diff", "2.11.0") class Same extends ScalaMatchingTask {
/*============================================================================*\
** Ant user-properties **
\*============================================================================*/
diff --git a/src/compiler/scala/tools/ant/Scaladoc.scala b/src/compiler/scala/tools/ant/Scaladoc.scala
deleted file mode 100644
index fd6d637212..0000000000
--- a/src/compiler/scala/tools/ant/Scaladoc.scala
+++ /dev/null
@@ -1,695 +0,0 @@
-/* __ *\
-** ________ ___ / / ___ 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/compiler/scala/tools/ant/antlib.xml b/src/compiler/scala/tools/ant/antlib.xml
index 78159e6d10..7885534689 100644
--- a/src/compiler/scala/tools/ant/antlib.xml
+++ b/src/compiler/scala/tools/ant/antlib.xml
@@ -11,8 +11,6 @@
classname="scala.tools.ant.Scaladoc"/>
<taskdef name="scalatool"
classname="scala.tools.ant.ScalaTool"/>
- <taskdef name="same"
- classname="scala.tools.ant.Same"/>
<taskdef name="pack200"
classname="scala.tools.ant.Pack200Task"/>
</antlib>
diff --git a/src/compiler/scala/tools/nsc/Global.scala b/src/compiler/scala/tools/nsc/Global.scala
index 51fa8f0ab9..67c2b99475 100644
--- a/src/compiler/scala/tools/nsc/Global.scala
+++ b/src/compiler/scala/tools/nsc/Global.scala
@@ -25,7 +25,7 @@ import transform._
import backend.icode.{ ICodes, GenICode, ICodeCheckers }
import backend.{ ScalaPrimitives, Platform, JavaPlatform }
import backend.jvm.GenASM
-import backend.opt.{ Inliners, InlineExceptionHandlers, ClosureElimination, DeadCodeElimination }
+import backend.opt.{ Inliners, InlineExceptionHandlers, ConstantOptimization, ClosureElimination, DeadCodeElimination }
import backend.icode.analysis._
import scala.language.postfixOps
@@ -425,12 +425,14 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
val printInfers = settings.Yinferdebug.value
// phaseName = "parser"
- object syntaxAnalyzer extends {
+ lazy val syntaxAnalyzer = new {
val global: Global.this.type = Global.this
val runsAfter = List[String]()
val runsRightAfter = None
} with SyntaxAnalyzer
+ import syntaxAnalyzer.{ UnitScanner, UnitParser }
+
// !!! I think we're overdue for all these phase objects being lazy vals.
// There's no way for a Global subclass to provide a custom typer
// despite the existence of a "def newTyper(context: Context): Typer"
@@ -592,6 +594,13 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
val runsRightAfter = None
} with ClosureElimination
+ // phaseName = "constopt"
+ object constantOptimization extends {
+ val global: Global.this.type = Global.this
+ val runsAfter = List("closelim")
+ val runsRightAfter = None
+ } with ConstantOptimization
+
// phaseName = "dce"
object deadCode extends {
val global: Global.this.type = Global.this
@@ -676,6 +685,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
inliner -> "optimization: do inlining",
inlineExceptionHandlers -> "optimization: inline exception handlers",
closureElimination -> "optimization: eliminate uncalled closures",
+ constantOptimization -> "optimization: optimize null and other constants",
deadCode -> "optimization: eliminate dead code",
terminal -> "The last phase in the compiler chain"
)
@@ -997,7 +1007,7 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
object typeDeconstruct extends {
val global: Global.this.type = Global.this
- } with interpreter.StructuredTypeStrings
+ } with typechecker.StructuredTypeStrings
/** There are common error conditions where when the exception hits
* here, currentRun.currentUnit is null. This robs us of the knowledge
@@ -1120,9 +1130,11 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
warning("there were %d %s warning(s); re-run with %s for details".format(warnings.size, what, option.name))
}
- def newUnitParser(code: String) = new syntaxAnalyzer.UnitParser(newCompilationUnit(code))
- def newCompilationUnit(code: String) = new CompilationUnit(newSourceFile(code))
- def newSourceFile(code: String) = new BatchSourceFile("<console>", code)
+ def newCompilationUnit(code: String) = new CompilationUnit(newSourceFile(code))
+ def newSourceFile(code: String) = new BatchSourceFile("<console>", code)
+ def newUnitScanner(unit: CompilationUnit): UnitScanner = new UnitScanner(unit)
+ def newUnitParser(unit: CompilationUnit): UnitParser = new UnitParser(unit)
+ def newUnitParser(code: String): UnitParser = newUnitParser(newCompilationUnit(code))
/** A Run is a single execution of the compiler on a sets of units
*/
@@ -1692,8 +1704,6 @@ class Global(var currentSettings: Settings, var reporter: Reporter)
}
})
}
- def forInteractive = false
- def forScaladoc = false
def createJavadoc = false
}
diff --git a/src/compiler/scala/tools/nsc/Interpreter.scala b/src/compiler/scala/tools/nsc/Interpreter.scala
deleted file mode 100644
index 434f19f21b..0000000000
--- a/src/compiler/scala/tools/nsc/Interpreter.scala
+++ /dev/null
@@ -1,12 +0,0 @@
-package scala.tools.nsc
-
-import interpreter._
-import java.io._
-
-/** A compatibility stub.
- */
-@deprecated("Use a class in the scala.tools.nsc.interpreter package.", "2.9.0")
-class Interpreter(settings: Settings, out: PrintWriter) extends IMain(settings, out) {
- def this(settings: Settings) = this(settings, new NewLinePrintWriter(new ConsoleWriter, true))
- def this() = this(new Settings())
-} \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/InterpreterLoop.scala b/src/compiler/scala/tools/nsc/InterpreterLoop.scala
deleted file mode 100644
index a0be3f4fdb..0000000000
--- a/src/compiler/scala/tools/nsc/InterpreterLoop.scala
+++ /dev/null
@@ -1,12 +0,0 @@
-package scala.tools.nsc
-
-import interpreter._
-import java.io._
-
-/** A compatibility stub.
- */
-@deprecated("Use a class in the scala.tools.nsc.interpreter package.", "2.9.0")
-class InterpreterLoop(in0: Option[BufferedReader], out: PrintWriter) extends ILoop(in0, out) {
- def this(in0: BufferedReader, out: PrintWriter) = this(Some(in0), out)
- def this() = this(None, new PrintWriter(scala.Console.out))
-}
diff --git a/src/compiler/scala/tools/nsc/MainGenericRunner.scala b/src/compiler/scala/tools/nsc/MainGenericRunner.scala
deleted file mode 100644
index adb03ca374..0000000000
--- a/src/compiler/scala/tools/nsc/MainGenericRunner.scala
+++ /dev/null
@@ -1,106 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2006-2013 LAMP/EPFL
- * @author Lex Spoon
- */
-
-package scala.tools.nsc
-
-import io.{ File }
-import util.{ ClassPath, ScalaClassLoader }
-import Properties.{ versionString, copyrightString }
-import interpreter.{ ILoop }
-import GenericRunnerCommand._
-
-object JarRunner extends CommonRunner {
- def runJar(settings: GenericRunnerSettings, jarPath: String, arguments: Seq[String]): Either[Throwable, Boolean] = {
- val jar = new io.Jar(jarPath)
- val mainClass = jar.mainClass getOrElse sys.error("Cannot find main class for jar: " + jarPath)
- val jarURLs = ClassPath expandManifestPath jarPath
- val urls = if (jarURLs.isEmpty) File(jarPath).toURL +: settings.classpathURLs else jarURLs
-
- if (settings.Ylogcp.value) {
- Console.err.println("Running jar with these URLs as the classpath:")
- urls foreach println
- }
-
- runAndCatch(urls, mainClass, arguments)
- }
-}
-
-/** An object that runs Scala code. It has three possible
- * sources for the code to run: pre-compiled code, a script file,
- * or interactive entry.
- */
-class MainGenericRunner {
- def errorFn(ex: Throwable): Boolean = {
- ex.printStackTrace()
- false
- }
- def errorFn(str: String): Boolean = {
- Console.err println str
- false
- }
-
- def process(args: Array[String]): Boolean = {
- val command = new GenericRunnerCommand(args.toList, (x: String) => errorFn(x))
- import command.{ settings, howToRun, thingToRun }
- def sampleCompiler = new Global(settings) // def so its not created unless needed
-
- if (!command.ok) return errorFn("\n" + command.shortUsageMsg)
- else if (settings.version.value) return errorFn("Scala code runner %s -- %s".format(versionString, copyrightString))
- else if (command.shouldStopWithInfo) return errorFn(command getInfoMessage sampleCompiler)
-
- def isE = !settings.execute.isDefault
- def dashe = settings.execute.value
-
- def isI = !settings.loadfiles.isDefault
- def dashi = settings.loadfiles.value
-
- // Deadlocks on startup under -i unless we disable async.
- if (isI)
- settings.Yreplsync.value = true
-
- def combinedCode = {
- val files = if (isI) dashi map (file => File(file).slurp()) else Nil
- val str = if (isE) List(dashe) else Nil
-
- files ++ str mkString "\n\n"
- }
-
- def runTarget(): Either[Throwable, Boolean] = howToRun match {
- case AsObject =>
- ObjectRunner.runAndCatch(settings.classpathURLs, thingToRun, command.arguments)
- case AsScript =>
- ScriptRunner.runScriptAndCatch(settings, thingToRun, command.arguments)
- case AsJar =>
- JarRunner.runJar(settings, thingToRun, command.arguments)
- case Error =>
- Right(false)
- case _ =>
- // We start the repl when no arguments are given.
- Right(new ILoop process settings)
- }
-
- /** If -e and -i were both given, we want to execute the -e code after the
- * -i files have been included, so they are read into strings and prepended to
- * the code given in -e. The -i option is documented to only make sense
- * interactively so this is a pretty reasonable assumption.
- *
- * This all needs a rewrite though.
- */
- if (isE) {
- ScriptRunner.runCommand(settings, combinedCode, thingToRun +: command.arguments)
- }
- else runTarget() match {
- case Left(ex) => errorFn(ex)
- case Right(b) => b
- }
- }
-}
-
-object MainGenericRunner extends MainGenericRunner {
- def main(args: Array[String]) {
- if (!process(args))
- sys.exit(1)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/ScalaDoc.scala b/src/compiler/scala/tools/nsc/ScalaDoc.scala
deleted file mode 100644
index 52a0c20a11..0000000000
--- a/src/compiler/scala/tools/nsc/ScalaDoc.scala
+++ /dev/null
@@ -1,72 +0,0 @@
-/* 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/compiler/scala/tools/nsc/ast/TreeGen.scala b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
index b9eb511a9a..692afbac66 100644
--- a/src/compiler/scala/tools/nsc/ast/TreeGen.scala
+++ b/src/compiler/scala/tools/nsc/ast/TreeGen.scala
@@ -19,18 +19,6 @@ abstract class TreeGen extends scala.reflect.internal.TreeGen with TreeDSL {
import global._
import definitions._
- def mkCheckInit(tree: Tree): Tree = {
- val tpe =
- if (tree.tpe != null || !tree.hasSymbolField) tree.tpe
- else tree.symbol.tpe
-
- if (!global.phase.erasedTypes && settings.warnSelectNullable.value &&
- tpe <:< NotNullClass.tpe && !tpe.isNotNull)
- mkRuntimeCall(nme.checkInitialized, List(tree))
- else
- tree
- }
-
/** Builds a fully attributed wildcard import node.
*/
def mkWildcardImport(pkg: Symbol): Import = {
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
index 08a6adfded..9218ad3330 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Parsers.scala
@@ -142,9 +142,9 @@ self =>
if (source.isSelfContained) () => compilationUnit()
else () => scriptBody()
- def newScanner = new SourceFileScanner(source)
+ def newScanner(): Scanner = new SourceFileScanner(source)
- val in = newScanner
+ val in = newScanner()
in.init()
private val globalFresh = new FreshNameCreator.Default
@@ -196,10 +196,9 @@ self =>
}
class UnitParser(val unit: global.CompilationUnit, patches: List[BracePatch]) extends SourceFileParser(unit.source) {
+ def this(unit: global.CompilationUnit) = this(unit, Nil)
- def this(unit: global.CompilationUnit) = this(unit, List())
-
- override def newScanner = new UnitScanner(unit, patches)
+ override def newScanner() = new UnitScanner(unit, patches)
override def freshTermName(prefix: String): TermName = unit.freshTermName(prefix)
override def freshTypeName(prefix: String): TypeName = unit.freshTypeName(prefix)
@@ -219,6 +218,7 @@ self =>
try body
finally smartParsing = saved
}
+ def withPatches(patches: List[BracePatch]): UnitParser = new UnitParser(unit, patches)
val syntaxErrors = new ListBuffer[(Int, String)]
def showSyntaxErrors() =
@@ -244,7 +244,7 @@ self =>
if (syntaxErrors.isEmpty) firstTry
else in.healBraces() match {
case Nil => showSyntaxErrors() ; firstTry
- case patches => new UnitParser(unit, patches).parse()
+ case patches => (this withPatches patches).parse()
}
}
}
@@ -650,31 +650,10 @@ self =>
/* --------- COMMENT AND ATTRIBUTE COLLECTION ----------------------------- */
- /** Join the comment associated with a definition. */
- def joinComment(trees: => List[Tree]): List[Tree] = {
- val doc = in.flushDoc
- if ((doc ne null) && doc.raw.length > 0) {
- 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
- }
+ /** A hook for joining the comment associated with a definition.
+ * Overridden by scaladoc.
+ */
+ def joinComment(trees: => List[Tree]): List[Tree] = trees
/* ---------- TREE CONSTRUCTION ------------------------------------------- */
diff --git a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
index 19cf1b5093..6ad1c50075 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/Scanners.scala
@@ -9,7 +9,7 @@ import scala.tools.nsc.util.CharArrayReader
import scala.reflect.internal.util._
import scala.reflect.internal.Chars._
import Tokens._
-import scala.annotation.switch
+import scala.annotation.{ switch, tailrec }
import scala.collection.{ mutable, immutable }
import mutable.{ ListBuffer, ArrayBuffer }
import scala.xml.Utility.{ isNameStart }
@@ -83,6 +83,69 @@ trait Scanners extends ScannersCommon {
abstract class Scanner extends CharArrayReader with TokenData with ScannerCommon {
private def isDigit(c: Char) = java.lang.Character isDigit c
+ private var openComments = 0
+ protected def putCommentChar(): Unit = nextChar()
+
+ @tailrec private def skipLineComment(): Unit = ch match {
+ case SU | CR | LF =>
+ case _ => nextChar() ; skipLineComment()
+ }
+ private def maybeOpen() {
+ putCommentChar()
+ if (ch == '*') {
+ putCommentChar()
+ openComments += 1
+ }
+ }
+ private def maybeClose(): Boolean = {
+ putCommentChar()
+ (ch == '/') && {
+ putCommentChar()
+ openComments -= 1
+ openComments == 0
+ }
+ }
+ @tailrec final def skipNestedComments(): Unit = ch match {
+ case '/' => maybeOpen() ; skipNestedComments()
+ case '*' => if (!maybeClose()) skipNestedComments()
+ case SU => incompleteInputError("unclosed comment")
+ case _ => putCommentChar() ; skipNestedComments()
+ }
+ def skipDocComment(): Unit = skipNestedComments()
+ def skipBlockComment(): Unit = skipNestedComments()
+
+ private def skipToCommentEnd(isLineComment: Boolean) {
+ nextChar()
+ if (isLineComment) skipLineComment()
+ else {
+ openComments = 1
+ val isDocComment = (ch == '*') && { nextChar(); true }
+ if (isDocComment) {
+ // Check for the amazing corner case of /**/
+ if (ch == '/')
+ nextChar()
+ else
+ skipDocComment()
+ }
+ else skipBlockComment()
+ }
+ }
+
+ /** @pre ch == '/'
+ * Returns true if a comment was skipped.
+ */
+ def skipComment(): Boolean = ch match {
+ case '/' | '*' => skipToCommentEnd(isLineComment = ch == '/') ; true
+ case _ => false
+ }
+ def flushDoc(): DocComment = null
+
+ /** To prevent doc comments attached to expressions from leaking out of scope
+ * onto the next documentable entity, they are discarded upon passing a right
+ * brace, bracket, or parenthesis.
+ */
+ def discardDocBuffer(): Unit = ()
+
def isAtEnd = charOffset >= buf.length
def resume(lastCode: Int) = {
@@ -130,22 +193,6 @@ trait Scanners extends ScannersCommon {
cbuf.clear()
}
- /** Should doc comments be built? */
- def buildDocs: Boolean = forScaladoc
-
- /** holder for the documentation comment
- */
- var docComment: DocComment = null
-
- def flushDoc: DocComment = {
- val ret = docComment
- docComment = null
- ret
- }
-
- protected def foundComment(value: String, start: Int, end: Int) = ()
- protected def foundDocComment(value: String, start: Int, end: Int) = ()
-
private class TokenData0 extends TokenData
/** we need one token lookahead and one token history
@@ -218,12 +265,15 @@ trait Scanners extends ScannersCommon {
case RBRACE =>
while (!sepRegions.isEmpty && sepRegions.head != RBRACE)
sepRegions = sepRegions.tail
- if (!sepRegions.isEmpty) sepRegions = sepRegions.tail
- docComment = null
+ if (!sepRegions.isEmpty)
+ sepRegions = sepRegions.tail
+
+ discardDocBuffer()
case RBRACKET | RPAREN =>
if (!sepRegions.isEmpty && sepRegions.head == lastToken)
sepRegions = sepRegions.tail
- docComment = null
+
+ discardDocBuffer()
case ARROW =>
if (!sepRegions.isEmpty && sepRegions.head == lastToken)
sepRegions = sepRegions.tail
@@ -516,62 +566,6 @@ trait Scanners extends ScannersCommon {
}
}
- private def skipComment(): Boolean = {
-
- if (ch == '/' || ch == '*') {
-
- val comment = new StringBuilder("/")
- def appendToComment() = comment.append(ch)
-
- if (ch == '/') {
- do {
- appendToComment()
- nextChar()
- } while ((ch != CR) && (ch != LF) && (ch != SU))
- } else {
- docComment = null
- var openComments = 1
- appendToComment()
- nextChar()
- appendToComment()
- var buildingDocComment = false
- if (ch == '*' && buildDocs) {
- buildingDocComment = true
- }
- while (openComments > 0) {
- do {
- do {
- if (ch == '/') {
- nextChar(); appendToComment()
- if (ch == '*') {
- nextChar(); appendToComment()
- openComments += 1
- }
- }
- if (ch != '*' && ch != SU) {
- nextChar(); appendToComment()
- }
- } while (ch != '*' && ch != SU)
- while (ch == '*') {
- nextChar(); appendToComment()
- }
- } while (ch != '/' && ch != SU)
- if (ch == '/') nextChar()
- else incompleteInputError("unclosed comment")
- openComments -= 1
- }
-
- if (buildingDocComment)
- foundDocComment(comment.toString, offset, charOffset - 2)
- }
-
- foundComment(comment.toString, offset, charOffset - 2)
- true
- } else {
- false
- }
- }
-
/** Can token start a statement? */
def inFirstOfStat(token: Int) = token match {
case EOF | CATCH | ELSE | EXTENDS | FINALLY | FORSOME | MATCH | WITH | YIELD |
@@ -1233,7 +1227,7 @@ trait Scanners extends ScannersCommon {
/** A scanner over a given compilation unit
*/
- class UnitScanner(unit: CompilationUnit, patches: List[BracePatch]) extends SourceFileScanner(unit.source) {
+ class UnitScanner(val unit: CompilationUnit, patches: List[BracePatch]) extends SourceFileScanner(unit.source) {
def this(unit: CompilationUnit) = this(unit, List())
override def deprecationWarning(off: Offset, msg: String) = unit.deprecationWarning(unit.position(off), msg)
@@ -1281,17 +1275,6 @@ trait Scanners extends ScannersCommon {
}
}
}
-
- override def foundComment(value: String, start: Int, end: Int) {
- val pos = new RangePosition(unit.source, start, start, end)
- unit.comment(pos, value)
- }
-
- override def foundDocComment(value: String, start: Int, end: Int) {
- val docPos = new RangePosition(unit.source, start, start, end)
- docComment = new DocComment(value, docPos)
- unit.comment(docPos, value)
- }
}
class ParensAnalyzer(unit: CompilationUnit, patches: List[BracePatch]) extends UnitScanner(unit, patches) {
@@ -1382,17 +1365,24 @@ trait Scanners extends ScannersCommon {
bpbuf += current
}
}
+ def bracePairString(bp: BracePair, indent: Int): String = {
+ val rangeString = {
+ import bp._
+ val lline = line(loff)
+ val rline = line(roff)
+ val tokens = List(lline, lindent, rline, rindent) map (n => if (n < 0) "??" else "" + n)
+ "%s:%s to %s:%s".format(tokens: _*)
+ }
+ val outer = (" " * indent) + rangeString
+ val inners = bp.nested map (bracePairString(_, indent + 2))
- def printBP(bp: BracePair, indent: Int) {
- println(" "*indent+line(bp.loff)+":"+bp.lindent+" to "+line(bp.roff)+":"+bp.rindent)
- if (bp.nested.nonEmpty)
- for (bp1 <- bp.nested) {
- printBP(bp1, indent + 2)
- }
+ if (inners.isEmpty) outer
+ else inners.mkString(outer + "\n", "\n", "")
}
-// println("lineStart = "+lineStart)//DEBUG
-// println("bracepairs = ")
-// for (bp <- bpbuf.toList) printBP(bp, 0)
+ def bpString = bpbuf.toList map ("\n" + bracePairString(_, 0)) mkString ""
+ def startString = lineStart.mkString("line starts: [", ", ", "]")
+
+ log(s"\n$startString\n$bpString")
bpbuf.toList
}
diff --git a/src/compiler/scala/tools/nsc/ast/parser/SyntaxAnalyzer.scala b/src/compiler/scala/tools/nsc/ast/parser/SyntaxAnalyzer.scala
index f1bf590ebf..7cf5a07291 100644
--- a/src/compiler/scala/tools/nsc/ast/parser/SyntaxAnalyzer.scala
+++ b/src/compiler/scala/tools/nsc/ast/parser/SyntaxAnalyzer.scala
@@ -28,8 +28,8 @@ abstract class SyntaxAnalyzer extends SubComponent with Parsers with MarkupParse
if (unit.body == EmptyTree) {
unit.body =
if (unit.isJava) new JavaUnitParser(unit).parse()
- else if (reporter.incompleteHandled) new UnitParser(unit).parse()
- else new UnitParser(unit).smartParse()
+ else if (reporter.incompleteHandled) newUnitParser(unit).parse()
+ else newUnitParser(unit).smartParse()
}
if (settings.Yrangepos.value && !reporter.hasErrors)
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala b/src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala
index 941ccd9a2d..c1cd3204e0 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/BytecodeWriters.scala
@@ -9,7 +9,6 @@ package backend.jvm
import java.io.{ DataOutputStream, FileOutputStream, OutputStream, File => JFile }
import scala.tools.nsc.io._
import scala.tools.nsc.util.ScalaClassLoader
-import scala.tools.util.{ Javap, JavapClass }
import java.util.jar.Attributes.Name
import scala.language.postfixOps
@@ -59,35 +58,6 @@ trait BytecodeWriters {
override def close() = writer.close()
}
- /** To be mixed-in with the BytecodeWriter that generates
- * the class file to be disassembled.
- */
- trait JavapBytecodeWriter extends BytecodeWriter {
- val baseDir = Directory(settings.Ygenjavap.value).createDirectory()
- val cl = ScalaClassLoader.appLoader
-
- def emitJavap(classFile: AbstractFile, javapFile: File) {
- val pw = javapFile.printWriter()
- try {
- val javap = new JavapClass(cl, pw) {
- override def findBytes(path: String): Array[Byte] = classFile.toByteArray
- }
- javap(Seq("-verbose", "-protected", classFile.name)) foreach (_.show())
- } finally pw.close()
- }
- abstract override def writeClass(label: String, jclassName: String, jclassBytes: Array[Byte], sym: Symbol) {
- super.writeClass(label, jclassName, jclassBytes, sym)
-
- val classFile = getFile(sym, jclassName, ".class")
- val segments = jclassName.split("[./]")
- val javapFile = segments.foldLeft(baseDir: Path)(_ / _) changeExtension "javap" toFile;
- javapFile.parent.createDirectory()
-
- if (Javap.isAvailable(cl)) emitJavap(classFile, javapFile)
- else warning("No javap on classpath, skipping javap output.")
- }
- }
-
trait ClassBytecodeWriter extends BytecodeWriter {
def writeClass(label: String, jclassName: String, jclassBytes: Array[Byte], sym: Symbol) {
val outfile = getFile(sym, jclassName, ".class")
diff --git a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
index 388efb4625..4a3d1805d9 100644
--- a/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
+++ b/src/compiler/scala/tools/nsc/backend/jvm/GenASM.scala
@@ -72,19 +72,10 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
new DirectToJarfileWriter(f.file)
case _ =>
- import scala.tools.util.Javap
- if (settings.Ygenjavap.isDefault) {
- if(settings.Ydumpclasses.isDefault)
- new ClassBytecodeWriter { }
- else
- new ClassBytecodeWriter with DumpBytecodeWriter { }
- }
- else if (Javap.isAvailable()) new ClassBytecodeWriter with JavapBytecodeWriter { }
- else {
- warning("No javap on classpath, skipping javap output.")
+ if (settings.Ydumpclasses.isDefault)
new ClassBytecodeWriter { }
- }
-
+ else
+ new ClassBytecodeWriter with DumpBytecodeWriter { }
// TODO A ScalapBytecodeWriter could take asm.util.Textifier as starting point.
// Three areas where javap ouput is less than ideal (e.g. when comparing versions of the same classfile) are:
// (a) unreadable pickle;
@@ -2519,7 +2510,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
if (nextBlock != whereto)
jcode goTo labels(whereto)
// SI-6102: Determine whether eliding this JUMP results in an empty range being covered by some EH.
- // If so, emit a NOP in place of the elided JUMP, to avoid "java.lang.ClassFormatError: Illegal exception table range"
+ // If so, emit a NOP in place of the elided JUMP, to avoid "java.lang.ClassFormatError: Illegal exception table range"
else if (newNormal.isJumpOnly(b) && m.exh.exists(eh => eh.covers(b))) {
debugwarn("Had a jump only block that wasn't collapsed")
emit(asm.Opcodes.NOP)
@@ -3084,7 +3075,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
assert(nonICode.hasNext, "empty block")
nonICode.next.isInstanceOf[JUMP]
}
-
+
/**
* Returns the list of instructions in a block that follow all ICode only instructions,
* where an ICode only instruction is one that won't make it to the JVM
@@ -3101,7 +3092,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
* Returns the target of a block that is "jump only" which is defined
* as being a block that consists only of 0 or more instructions that
* won't make it to the JVM followed by a JUMP.
- *
+ *
* @param b The basic block to examine
* @return Some(target) if b is a "jump only" block or None if it's not
*/
@@ -3150,12 +3141,12 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
def rephraseGotos(detour: mutable.Map[BasicBlock, BasicBlock]) {
def lookup(b: BasicBlock) = detour.getOrElse(b, b)
-
+
m.code.startBlock = lookup(m.code.startBlock)
-
+
for(eh <- m.exh)
eh.setStartBlock(lookup(eh.startBlock))
-
+
for (b <- m.blocks) {
def replaceLastInstruction(i: Instruction) = {
if (b.lastInstruction != i) {
@@ -3164,18 +3155,18 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
b.replaceInstruction(idxLast, i)
}
}
-
+
b.lastInstruction match {
case JUMP(whereto) =>
replaceLastInstruction(JUMP(lookup(whereto)))
case CJUMP(succ, fail, cond, kind) =>
replaceLastInstruction(CJUMP(lookup(succ), lookup(fail), cond, kind))
- case CZJUMP(succ, fail, cond, kind) =>
+ case CZJUMP(succ, fail, cond, kind) =>
replaceLastInstruction(CZJUMP(lookup(succ), lookup(fail), cond, kind))
case SWITCH(tags, labels) =>
val newLabels = (labels map lookup)
replaceLastInstruction(SWITCH(tags, newLabels))
- case _ => ()
+ case _ => ()
}
}
}
@@ -3203,7 +3194,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
// blocks
for (key <- detour.keySet) {
// we use the Robert Floyd's classic Tortoise and Hare algorithm
- @tailrec
+ @tailrec
def findDestination(tortoise: BasicBlock, hare: BasicBlock): BasicBlock = {
if (tortoise == hare)
// cycle detected, map key to key
@@ -3227,7 +3218,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
}
detour
}
-
+
val detour = computeDetour
rephraseGotos(detour)
@@ -3235,33 +3226,33 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
val (remappings, cycles) = detour partition {case (source, target) => source != target}
for ((source, target) <- remappings) {
debuglog(s"Will elide jump only block $source because it can be jumped around to get to $target.")
- if (m.startBlock == source) debugwarn("startBlock should have been re-wired by now")
+ if (m.startBlock == source) debugwarn("startBlock should have been re-wired by now")
}
val sources = remappings.keySet
val targets = remappings.values.toSet
val intersection = sources intersect targets
-
+
if (intersection.nonEmpty) debugwarn(s"contradiction: we seem to have some source and target overlap in blocks ${intersection.mkString}. Map was ${detour.mkString}")
-
+
for ((source, _) <- cycles) {
debuglog(s"Block $source is in a do-nothing infinite loop. Did the user write 'while(true){}'?")
}
}
}
-
+
/**
* Removes all blocks that are unreachable in a method using a standard reachability analysis.
*/
def elimUnreachableBlocks(m: IMethod) {
- assert(m.hasCode, "code-less method")
-
+ assert(m.hasCode, "code-less method")
+
// assume nothing is reachable until we prove it can be reached
val reachable = mutable.Set[BasicBlock]()
-
+
// the set of blocks that we know are reachable but have
// yet to be marked reachable, initially only the start block
val worklist = mutable.Set(m.startBlock)
-
+
while (worklist.nonEmpty) {
val block = worklist.head
worklist remove block
@@ -3271,7 +3262,7 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
// think are unreachable
worklist ++= (block.successors filterNot reachable)
}
-
+
// exception handlers need to be told not to cover unreachable blocks
// and exception handlers that no longer cover any blocks need to be
// removed entirely
@@ -3282,9 +3273,9 @@ abstract class GenASM extends SubComponent with BytecodeWriters with GenJVMASM {
unusedExceptionHandlers += exh
}
}
-
+
// remove the unusued exception handler references
- if (settings.debug.value)
+ if (settings.debug.value)
for (exh <- unusedExceptionHandlers) debuglog(s"eliding exception handler $exh because it does not cover any reachable blocks")
m.exh = m.exh filterNot unusedExceptionHandlers
diff --git a/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala b/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
new file mode 100644
index 0000000000..b80acc2324
--- /dev/null
+++ b/src/compiler/scala/tools/nsc/backend/opt/ConstantOptimization.scala
@@ -0,0 +1,622 @@
+/* NSC -- new Scala compiler
+ * Copyright 2005-2013 LAMP/EPFL
+ * @author James Iry
+ */
+
+package scala.tools.nsc
+package backend.opt
+
+import scala.tools.nsc.backend.icode.analysis.LubException
+import scala.annotation.tailrec
+
+/**
+ * ConstantOptimization uses abstract interpretation to approximate for
+ * each instruction what constants a variable or stack slot might hold
+ * or cannot hold. From this it will eliminate unreachable conditionals
+ * where only one branch is reachable, e.g. to eliminate unnecessary
+ * null checks.
+ *
+ * With some more work it could be extended to
+ * - cache stable values (final fields, modules) in locals
+ * - replace the copy propagation in ClosureElilmination
+ * - fold constants
+ * - eliminate unnecessary stores and loads
+ * - propagate knowledge gathered from conditionals for further optimization
+ */
+abstract class ConstantOptimization extends SubComponent {
+ import global._
+ import icodes._
+ import icodes.opcodes._
+
+ val phaseName = "constopt"
+
+ /** Create a new phase */
+ override def newPhase(p: Phase) = new ConstantOptimizationPhase(p)
+
+ /**
+ * The constant optimization phase.
+ */
+ class ConstantOptimizationPhase(prev: Phase) extends ICodePhase(prev) {
+
+ def name = phaseName
+
+ override def apply(c: IClass) {
+ if (settings.YconstOptimization.value) {
+ val analyzer = new ConstantOptimizer
+ analyzer optimizeClass c
+ }
+ }
+ }
+
+ class ConstantOptimizer {
+ def optimizeClass(cls: IClass) {
+ log(s"Analyzing ${cls.methods.size} methods in $cls.")
+ cls.methods foreach { m =>
+ optimizeMethod(m)
+ }
+ }
+
+ def optimizeMethod(m: IMethod) {
+ if (m.hasCode) {
+ log(s"Analyzing ${m.symbol}")
+ val replacementInstructions = interpretMethod(m)
+ for (block <- m.blocks) {
+ if (replacementInstructions contains block) {
+ val instructions = replacementInstructions(block)
+ block.replaceInstruction(block.lastInstruction, instructions)
+ }
+ }
+ }
+ }
+
+ /**
+ * A single possible (or impossible) datum that can be held in Contents
+ */
+ private sealed abstract class Datum
+ /**
+ * A constant datum
+ */
+ private case class Const(c: Constant) extends Datum {
+ def isIntAssignable = c.tag >= BooleanTag && c.tag <= IntTag
+ def toInt = c.tag match {
+ case BooleanTag => if (c.booleanValue) 1 else 0
+ case _ => c.intValue
+ }
+
+ /**
+ * True if this constant would compare to other as true under primitive eq
+ */
+ override def equals(other: Any) = other match {
+ case oc @ Const(o) => (this eq oc) || (if (this.isIntAssignable && oc.isIntAssignable) this.toInt == oc.toInt else c.value == o.value)
+ case _ => false
+ }
+
+ /**
+ * Hash code consistent with equals
+ */
+ override def hashCode = if (this.isIntAssignable) this.toInt else c.hashCode
+
+ }
+ /**
+ * A datum that has been Boxed via a BOX instruction
+ */
+ private case class Boxed(c: Datum) extends Datum
+
+ /**
+ * The knowledge we have about the abstract state of one location in terms
+ * of what constants it might or cannot hold. Forms a lower
+ * lattice where lower elements in the lattice indicate less knowledge.
+ *
+ * With the following partial ordering (where '>' indicates more precise knowledge)
+ *
+ * Possible(xs) > Possible(xs + y)
+ * Possible(xs) > Impossible(ys)
+ * Impossible(xs + y) > Impossible(xs)
+ *
+ * and the following merges, which indicate merging knowledge from two paths through
+ * the code,
+ *
+ * // left must be 1 or 2, right must be 2 or 3 then we must have a 1, 2 or 3
+ * Possible(xs) merge Possible(ys) => Possible(xs union ys)
+ *
+ * // Left says can't be 2 or 3, right says can't be 3 or 4
+ * // then it's not 3 (it could be 2 from the right or 4 from the left)
+ * Impossible(xs) merge Impossible(ys) => Impossible(xs intersect ys)
+ *
+ * // Left says it can't be 2 or 3, right says it must be 3 or 4, then
+ * // it can't be 2 (left rules out 4 and right says 3 is possible)
+ * Impossible(xs) merge Possible(ys) => Impossible(xs -- ys)
+ *
+ * Intuitively, Possible(empty) says that a location can't hold anything,
+ * it's uninitialized. However, Possible(empty) never appears in the code.
+ *
+ * Conversely, Impossible(empty) says nothing is impossible, it could be
+ * anything. Impossible(empty) is given a synonym UNKNOWN and is used
+ * for, e.g., the result of an arbitrary method call.
+ */
+ private sealed abstract class Contents {
+ /**
+ * Join this Contents with another coming from another path. Join enforces
+ * the lattice structure. It is symmetrical and never moves upward in the
+ * lattice
+ */
+ final def merge(other: Contents): Contents = if (this eq other) this else (this, other) match {
+ case (Possible(possible1), Possible(possible2)) =>
+ Possible(possible1 union possible2)
+ case (Impossible(impossible1), Impossible(impossible2)) =>
+ Impossible(impossible1 intersect impossible2)
+ case (Impossible(impossible), Possible(possible)) =>
+ Impossible(impossible -- possible)
+ case (Possible(possible), Impossible(impossible)) =>
+ Impossible(impossible -- possible)
+ }
+ // TODO we could have more fine-grained knowledge, e.g. know that 0 < x < 3. But for now equality/inequality is a good start.
+ def mightEqual(other: Contents): Boolean
+ def mightNotEqual(other: Contents): Boolean
+ }
+ private def SingleImpossible(x: Datum) = new Impossible(Set(x))
+
+ /**
+ * The location is known to have one of a set of values.
+ */
+ private case class Possible(possible: Set[Datum]) extends Contents {
+ assert(possible.nonEmpty, "Contradiction: had an empty possible set indicating an uninitialized location")
+ def mightEqual(other: Contents): Boolean = (this eq other) || (other match {
+ // two Possibles might be equal if they have any possible members in common
+ case Possible(possible2) => (possible intersect possible2).nonEmpty
+ // a possible can be equal to an impossible if the impossible doesn't rule
+ // out all the possibilities
+ case Impossible(possible2) => (possible -- possible2).nonEmpty
+ })
+ def mightNotEqual(other: Contents): Boolean = (this ne other) && (other match {
+ // two Possibles might not be equal if either has possible members that the other doesn't
+ case Possible(possible2) => (possible -- possible2).nonEmpty || (possible2 -- possible).nonEmpty
+ case Impossible(_) => true
+ })
+ }
+ private def SinglePossible(x: Datum) = new Possible(Set(x))
+
+ /**
+ * The location is known to not have any of a set of values value (e.g null).
+ */
+ private case class Impossible(impossible: Set[Datum]) extends Contents {
+ def mightEqual(other: Contents): Boolean = (this eq other) || (other match {
+ case Possible(_) => other mightEqual this
+ case _ => true
+ })
+ def mightNotEqual(other: Contents): Boolean = (this eq other) || (other match {
+ case Possible(_) => other mightNotEqual this
+ case _ => true
+ })
+ }
+
+ /**
+ * Our entire knowledge about the contents of all variables and the stack. It forms
+ * a lattice primarily driven by the lattice structure of Contents.
+ *
+ * In addition to the rules of contents, State has the following properties:
+ * - The merge of two sets of locals holds the merges of locals found in the intersection
+ * of the two sets of locals. Locals not found in a
+ * locals map are thus possibly uninitialized and attempting to load them results
+ * in an error.
+ * - The stack heights of two states must match otherwise it's an error to merge them
+ *
+ * State is immutable in order to aid in structure sharing of local maps and stacks
+ */
+ private case class State(locals: Map[Local, Contents], stack: List[Contents]) {
+ def mergeLocals(olocals: Map[Local, Contents]): Map[Local, Contents] = if (locals eq olocals) locals else Map((for {
+ key <- (locals.keySet intersect olocals.keySet).toSeq
+ } yield (key, locals(key) merge olocals(key))): _*)
+
+ def merge(other: State): State = if (this eq other) this else {
+ @tailrec def mergeStacks(l: List[Contents], r: List[Contents], out: List[Contents]): List[Contents] = (l, r) match {
+ case (Nil, Nil) => out.reverse
+ case (l, r) if l eq r => out.reverse ++ l
+ case (lhead :: ltail, rhead :: rtail) => mergeStacks(ltail, rtail, (lhead merge rhead) :: out)
+ case _ => sys.error("Mismatched stack heights")
+ }
+
+ val newLocals = mergeLocals(other.locals)
+
+ val newStack = if (stack eq other.stack) stack else mergeStacks(stack, other.stack, Nil)
+ State(newLocals, newStack)
+ }
+
+ /**
+ * Peek at the top of the stack without modifying it. Error if the stack is empty
+ */
+ def peek(n: Int): Contents = stack(n)
+ /**
+ * Push contents onto a stack
+ */
+ def push(contents: Contents): State = this copy (stack = contents :: stack)
+ /**
+ * Drop n elements from the stack
+ */
+ def drop(number: Int): State = this copy (stack = stack drop number)
+ /**
+ * Store the top of the stack into the specified local. An error if the stack
+ * is empty
+ */
+ def store(variable: Local): State = {
+ val contents = stack.head
+ val newVariables = locals + ((variable, contents))
+ new State(newVariables, stack.tail)
+ }
+ /**
+ * Load the specified local onto the top of the stack. An error the the local is uninitialized.
+ */
+ def load(variable: Local): State = {
+ val contents: Contents = locals.getOrElse(variable, sys.error(s"$variable is not initialized"))
+ push(contents)
+ }
+ /**
+ * A copy of this State with an empty stack
+ */
+ def cleanStack: State = if (stack.isEmpty) this else this copy (stack = Nil)
+ }
+
+ // some precomputed constants
+ private val NULL = Const(Constant(null: Any))
+ private val UNKNOWN = Impossible(Set.empty)
+ private val NOT_NULL = SingleImpossible(NULL)
+ private val CONST_UNIT = SinglePossible(Const(Constant(())))
+ private val CONST_FALSE = SinglePossible(Const(Constant(false)))
+ private val CONST_ZERO_BYTE = SinglePossible(Const(Constant(0: Byte)))
+ private val CONST_ZERO_SHORT = SinglePossible(Const(Constant(0: Short)))
+ private val CONST_ZERO_CHAR = SinglePossible(Const(Constant(0: Char)))
+ private val CONST_ZERO_INT = SinglePossible(Const(Constant(0: Int)))
+ private val CONST_ZERO_LONG = SinglePossible(Const(Constant(0: Long)))
+ private val CONST_ZERO_FLOAT = SinglePossible(Const(Constant(0.0f)))
+ private val CONST_ZERO_DOUBLE = SinglePossible(Const(Constant(0.0d)))
+ private val CONST_NULL = SinglePossible(NULL)
+
+ /**
+ * Given a TypeKind, figure out what '0' for it means in order to interpret CZJUMP
+ */
+ private def getZeroOf(k: TypeKind): Contents = k match {
+ case UNIT => CONST_UNIT
+ case BOOL => CONST_FALSE
+ case BYTE => CONST_ZERO_BYTE
+ case SHORT => CONST_ZERO_SHORT
+ case CHAR => CONST_ZERO_CHAR
+ case INT => CONST_ZERO_INT
+ case LONG => CONST_ZERO_LONG
+ case FLOAT => CONST_ZERO_FLOAT
+ case DOUBLE => CONST_ZERO_DOUBLE
+ case REFERENCE(_) => CONST_NULL
+ case ARRAY(_) => CONST_NULL
+ case BOXED(_) => CONST_NULL
+ case ConcatClass => abort("no zero of ConcatClass")
+ }
+
+ // normal locals can't be null, so we use null to mean the magic 'this' local
+ private val THIS_LOCAL: Local = null
+
+ /**
+ * interpret a single instruction to find its impact on the abstract state
+ */
+ private def interpretInst(in: State, inst: Instruction): State = {
+ // pop the consumed number of values off the `in` state's stack, producing a new state
+ def dropConsumed: State = in drop inst.consumed
+
+ inst match {
+ case THIS(_) =>
+ in load THIS_LOCAL
+
+ case CONSTANT(k) =>
+ // treat NaN as UNKNOWN because NaN must never equal NaN
+ val const = if (k.isNaN) UNKNOWN
+ else SinglePossible(Const(k))
+ in push const
+
+ case LOAD_ARRAY_ITEM(_) | LOAD_FIELD(_, _) | CALL_PRIMITIVE(_) =>
+ dropConsumed push UNKNOWN
+
+ case LOAD_LOCAL(local) =>
+ // TODO if a local is known to hold a constant then we can replace this instruction with a push of that constant
+ in load local
+
+ case STORE_LOCAL(local) =>
+ in store local
+
+ case STORE_THIS(_) =>
+ // if a local is already known to have a constant and we're replacing with the same constant then we can
+ // replace this with a drop
+ in store THIS_LOCAL
+
+ case CALL_METHOD(_, _) =>
+ // TODO we could special case implementations of equals that are known, e.g. String#equals
+ // We could turn Possible(string constants).equals(Possible(string constants) into an eq check
+ // We could turn nonConstantString.equals(constantString) into constantString.equals(nonConstantString)
+ // and eliminate the null check that likely precedes this call
+ val initial = dropConsumed
+ (0 until inst.produced).foldLeft(initial) { case (know, _) => know push UNKNOWN }
+
+ case BOX(_) =>
+ val value = in peek 0
+ // we simulate boxing by, um, boxing the possible/impossible contents
+ // so if we have Possible(1,2) originally then we'll end up with
+ // a Possible(Boxed(1), Boxed(2))
+ // Similarly, if we know the input is not a 0 then we'll know the
+ // output is not a Boxed(0)
+ val newValue = value match {
+ case Possible(values) => Possible(values map Boxed)
+ case Impossible(values) => Impossible(values map Boxed)
+ }
+ dropConsumed push newValue
+
+ case UNBOX(_) =>
+ val value = in peek 0
+ val newValue = value match {
+ // if we have a Possible, then all the possibilities
+ // should themselves be Boxes. In that
+ // case we can merge them to figure out what the UNBOX will produce
+ case Possible(inners) =>
+ assert(inners.nonEmpty, "Empty possible set indicating an uninitialized location")
+ val sanitized: Set[Contents] = (inners map {
+ case Boxed(content) => SinglePossible(content)
+ case _ => UNKNOWN
+ })
+ sanitized reduce (_ merge _)
+ // if we have an impossible then the thing that's impossible
+ // should be a box. We'll unbox that to see what we get
+ case unknown@Impossible(inners) =>
+ if (inners.isEmpty) {
+ unknown
+ } else {
+ val sanitized: Set[Contents] = (inners map {
+ case Boxed(content) => SingleImpossible(content)
+ case _ => UNKNOWN
+ })
+ sanitized reduce (_ merge _)
+ }
+ }
+ dropConsumed push newValue
+
+ case LOAD_MODULE(_) | NEW(_) | LOAD_EXCEPTION(_) =>
+ in push NOT_NULL
+
+ case CREATE_ARRAY(_, _) =>
+ dropConsumed push NOT_NULL
+
+ case IS_INSTANCE(_) =>
+ // TODO IS_INSTANCE is going to be followed by a C(Z)JUMP
+ // and if IS_INSTANCE/C(Z)JUMP the branch for "true" can
+ // know that whatever was checked was not a null
+ // see the TODO on CJUMP for more information about propagating null
+ // information
+ // TODO if the top of stack is guaranteed null then we can eliminate this IS_INSTANCE check and
+ // replace with a constant false, but how often is a knowable null checked for instanceof?
+ // TODO we could track type information and statically know to eliminate IS_INSTANCE
+ // which might be a nice win under specialization
+ dropConsumed push UNKNOWN // it's actually a Possible(true, false) but since the following instruction
+ // will be a conditional jump comparing to true or false there
+ // nothing to be gained by being more precise
+
+ case CHECK_CAST(_) =>
+ // TODO we could track type information and statically know to eliminate CHECK_CAST
+ // but that's probably not a huge win
+ in
+
+ case DUP(_) =>
+ val value = in peek 0
+ in push value
+
+ case DROP(_) | MONITOR_ENTER() | MONITOR_EXIT() | STORE_ARRAY_ITEM(_) | STORE_FIELD(_, _) =>
+ dropConsumed
+
+ case SCOPE_ENTER(_) | SCOPE_EXIT(_) =>
+ in
+
+ case JUMP(_) | CJUMP(_, _, _, _) | CZJUMP(_, _, _, _) | RETURN(_) | THROW(_) | SWITCH(_, _) =>
+ dumpClassesAndAbort("Unexpected block ending instruction: " + inst)
+ }
+ }
+ /**
+ * interpret the last instruction of a block which will be jump, a conditional branch, a throw, or a return.
+ * It will result in a map from target blocks to the input state computed for that block. It
+ * also computes a replacement list of instructions
+ */
+ private def interpretLast(in: State, inst: Instruction): (Map[BasicBlock, State], List[Instruction]) = {
+ def canSwitch(in1: Contents, tagSet: List[Int]) = {
+ in1 mightEqual Possible(tagSet.toSet map { tag: Int => Const(Constant(tag)) })
+ }
+
+ /**
+ * common code for interpreting CJUMP and CZJUMP
+ */
+ def interpretConditional(kind: TypeKind, val1: Contents, val2: Contents, success: BasicBlock, failure: BasicBlock, cond: TestOp): (Map[BasicBlock, State], List[Instruction]) = {
+ // TODO use reaching analysis to update the state in the two branches
+ // e.g. if the comparison was checking null equality on local x
+ // then the in the success branch we know x is null and
+ // on the failure branch we know it is not
+ // in fact, with copy propagation we could propagate that knowledge
+ // back through a chain of locations
+ //
+ // TODO if we do all that we need to be careful in the
+ // case that success and failure are the same target block
+ // because we're using a Map and don't want one possible state to clobber the other
+ // alternative mayb we should just replace the conditional with a jump if both targets are the same
+
+ def mightEqual = val1 mightEqual val2
+ def mightNotEqual = val1 mightNotEqual val2
+ def guaranteedEqual = mightEqual && !mightNotEqual
+
+ def succPossible = cond match {
+ case EQ => mightEqual
+ case NE => mightNotEqual
+ case LT | GT => !guaranteedEqual // if the two are guaranteed to be equal then they can't be LT/GT
+ case LE | GE => true
+ }
+
+ def failPossible = cond match {
+ case EQ => mightNotEqual
+ case NE => mightEqual
+ case LT | GT => true
+ case LE | GE => !guaranteedEqual // if the two are guaranteed to be equal then they must be LE/GE
+ }
+
+ val out = in drop inst.consumed
+
+ var result = Map[BasicBlock, State]()
+ if (succPossible) {
+ result += ((success, out))
+ }
+
+ if (failPossible) {
+ result += ((failure, out))
+ }
+
+ val replacements = if (result.size == 1) List.fill(inst.consumed)(DROP(kind)) :+ JUMP(result.keySet.head)
+ else inst :: Nil
+
+ (result, replacements)
+ }
+
+ inst match {
+ case JUMP(whereto) =>
+ (Map((whereto, in)), inst :: Nil)
+
+ case CJUMP(success, failure, cond, kind) =>
+ val in1 = in peek 0
+ val in2 = in peek 1
+ interpretConditional(kind, in1, in2, success, failure, cond)
+
+ case CZJUMP(success, failure, cond, kind) =>
+ val in1 = in peek 0
+ val in2 = getZeroOf(kind)
+ interpretConditional(kind, in1, in2, success, failure, cond)
+
+ case SWITCH(tags, labels) =>
+ val in1 = in peek 0
+ val newStuff = tags zip labels filter { case (tagSet, _) => canSwitch(in1, tagSet) }
+ val (reachableTags, reachableNormalLabels) = (tags zip labels filter { case (tagSet, _) => canSwitch(in1, tagSet) }).unzip
+ val reachableLabels = if (labels.lengthCompare(tags.length) > 0) {
+ // if we've got an extra label then it's the default
+ val defaultLabel = labels.last
+ // see if the default is reachable by seeing if the input might be out of the set
+ // of all tags
+ val allTags = Possible(tags.flatten.toSet map { tag: Int => Const(Constant(tag)) })
+ if (in1 mightNotEqual allTags) {
+ reachableNormalLabels :+ defaultLabel
+ } else {
+ reachableNormalLabels
+ }
+ } else {
+ reachableNormalLabels
+ }
+ // TODO similar to the comment in interpretConditional, we should update our the State going into each
+ // branch based on which tag is being matched. Also, just like interpretConditional, if target blocks
+ // are the same we need to merge State rather than clobber
+
+ // alternative, maybe we should simplify the SWITCH to not have same target labels
+ val newState = in drop inst.consumed
+ val result = Map(reachableLabels map { label => (label, newState) }: _*)
+ if (reachableLabels.size == 1) (result, DROP(INT) :: JUMP(reachableLabels.head) :: Nil)
+ else (result, inst :: Nil)
+
+ // these instructions don't have target blocks
+ // (exceptions are assumed to be reachable from all instructions)
+ case RETURN(_) | THROW(_) =>
+ (Map.empty, inst :: Nil)
+
+ case _ =>
+ dumpClassesAndAbort("Unexpected non-block ending instruction: " + inst)
+ }
+ }
+
+ /**
+ * Analyze a single block to find how it transforms an input state into a states for its successor blocks
+ * Also computes a list of instructions to be used to replace its last instruction
+ */
+ private def interpretBlock(in: State, block: BasicBlock): (Map[BasicBlock, State], Map[BasicBlock, State], List[Instruction]) = {
+ debuglog(s"interpreting block $block")
+ // number of instructions excluding the last one
+ val normalCount = block.size - 1
+
+ var exceptionState = in.cleanStack
+ var normalExitState = in
+ var idx = 0
+ while (idx < normalCount) {
+ val inst = block(idx)
+ normalExitState = interpretInst(normalExitState, inst)
+ if (normalExitState.locals ne exceptionState.locals)
+ exceptionState.copy(locals = exceptionState mergeLocals normalExitState.locals)
+ idx += 1
+ }
+
+ val pairs = block.exceptionSuccessors map { b => (b, exceptionState) }
+ val exceptionMap = Map(pairs: _*)
+
+ val (normalExitMap, newInstructions) = interpretLast(normalExitState, block.lastInstruction)
+
+ (normalExitMap, exceptionMap, newInstructions)
+ }
+
+ /**
+ * Analyze a single method to find replacement instructions
+ */
+ private def interpretMethod(m: IMethod): Map[BasicBlock, List[Instruction]] = {
+ import scala.collection.mutable.{ Set => MSet, Map => MMap }
+
+ debuglog(s"interpreting method $m")
+ var iterations = 0
+
+ // initially we know that 'this' is not null and the params are initialized to some unknown value
+ val initThis: Iterator[(Local, Contents)] = if (m.isStatic) Iterator.empty else Iterator.single((THIS_LOCAL, NOT_NULL))
+ val initOtherLocals: Iterator[(Local, Contents)] = m.params.iterator map { param => (param, UNKNOWN) }
+ val initialLocals: Map[Local, Contents] = Map((initThis ++ initOtherLocals).toSeq: _*)
+ val initialState = State(initialLocals, Nil)
+
+ // worklist of basic blocks to process, initially the start block
+ val worklist = MSet(m.startBlock)
+ // worklist of exception basic blocks. They're kept in a separate set so they can be
+ // processed after normal flow basic blocks. That's because exception basic blocks
+ // are more likely to have multiple predecessors and queueing them for later
+ // increases the chances that they'll only need to be interpreted once
+ val exceptionlist = MSet[BasicBlock]()
+ // our current best guess at what the input state is for each block
+ // initially we only know about the start block
+ val inputState = MMap[BasicBlock, State]((m.startBlock, initialState))
+
+ // update the inputState map based on new information from interpreting a block
+ // When the input state of a block changes, add it back to the work list to be
+ // reinterpreted
+ def updateInputStates(outputStates: Map[BasicBlock, State], worklist: MSet[BasicBlock]) {
+ for ((block, newState) <- outputStates) {
+ val oldState = inputState get block
+ val updatedState = oldState map (x => x merge newState) getOrElse newState
+ if (oldState != Some(updatedState)) {
+ worklist add block
+ inputState(block) = updatedState
+ }
+ }
+ }
+
+ // the instructions to be used as the last instructions on each block
+ val replacements = MMap[BasicBlock, List[Instruction]]()
+
+ while (worklist.nonEmpty || exceptionlist.nonEmpty) {
+ if (worklist.isEmpty) {
+ // once the worklist is empty, start processing exception blocks
+ val block = exceptionlist.head
+ exceptionlist remove block
+ worklist add block
+ } else {
+ iterations += 1
+ val block = worklist.head
+ worklist remove block
+ val (normalExitMap, exceptionMap, newInstructions) = interpretBlock(inputState(block), block)
+
+ updateInputStates(normalExitMap, worklist)
+ updateInputStates(exceptionMap, exceptionlist)
+ replacements(block) = newInstructions
+ }
+ }
+
+ debuglog(s"method $m with ${m.blocks.size} reached fixpoint in $iterations iterations")
+ replacements.toMap
+ }
+ }
+}
diff --git a/src/compiler/scala/tools/nsc/doc/DocFactory.scala b/src/compiler/scala/tools/nsc/doc/DocFactory.scala
deleted file mode 100644
index b4d2adaad4..0000000000
--- a/src/compiler/scala/tools/nsc/doc/DocFactory.scala
+++ /dev/null
@@ -1,132 +0,0 @@
-/* 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.value)
- println(msg)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/doc/DocParser.scala b/src/compiler/scala/tools/nsc/doc/DocParser.scala
deleted file mode 100644
index b753e84426..0000000000
--- a/src/compiler/scala/tools/nsc/doc/DocParser.scala
+++ /dev/null
@@ -1,69 +0,0 @@
-/* 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 = new syntaxAnalyzer.UnitParser(unit)
-
- scanner.compilationUnit()
- }
-}
-
-/** Since the DocParser's whole reason for existing involves trashing a
- * global, it is designed to bottle up general `Global#Tree` types rather
- * than path dependent ones. The recipient will have to deal.
- */
-object DocParser {
- type Tree = Global#Tree
- type DefTree = Global#DefTree
- type DocDef = Global#DocDef
- type Name = Global#Name
-
- class Parsed(val enclosing: List[Tree], val docDef: DocDef) {
- def nameChain: List[Name] = (enclosing :+ docDef.definition) collect { case x: DefTree => x.name }
- def raw: String = docDef.comment.raw
-
- override def toString = (
- nameChain.init.map(x => if (x.isTypeName) x + "#" else x + ".").mkString + nameChain.last
- )
- }
-}
diff --git a/src/compiler/scala/tools/nsc/doc/Index.scala b/src/compiler/scala/tools/nsc/doc/Index.scala
deleted file mode 100644
index f9b9eecdb3..0000000000
--- a/src/compiler/scala/tools/nsc/doc/Index.scala
+++ /dev/null
@@ -1,17 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/ScaladocGlobal.scala b/src/compiler/scala/tools/nsc/doc/ScaladocGlobal.scala
deleted file mode 100644
index 021e59a879..0000000000
--- a/src/compiler/scala/tools/nsc/doc/ScaladocGlobal.scala
+++ /dev/null
@@ -1,106 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2007-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package doc
-
-import scala.util.control.ControlThrowable
-import reporters.Reporter
-import typechecker.Analyzer
-import scala.reflect.internal.util.BatchSourceFile
-
-trait ScaladocAnalyzer extends Analyzer {
- val global : Global // generally, a ScaladocGlobal
- import global._
-
- override def newTyper(context: Context): ScaladocTyper = new ScaladocTyper(context)
-
- class ScaladocTyper(context0: Context) extends Typer(context0) {
- private def unit = context.unit
-
- 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
- fillDocComment(sym, comment)
- 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)
- }
- }
- val unit = new CompilationUnit(file)
- new syntaxAnalyzer.UnitParser(unit)
- }
-
- 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.value)
- useCase.defined foreach (sym => println("defined use cases: %s:%s".format(sym, sym.tpe)))
-
- useCase.defined
- }
- }
-}
-
-class ScaladocGlobal(settings: doc.Settings, reporter: Reporter) extends {
- override val useOffsetPositions = false
-} with Global(settings, reporter) {
- 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/compiler/scala/tools/nsc/doc/Settings.scala b/src/compiler/scala/tools/nsc/doc/Settings.scala
deleted file mode 100644
index 90b94e1336..0000000000
--- a/src/compiler/scala/tools/nsc/doc/Settings.scala
+++ /dev/null
@@ -1,368 +0,0 @@
-/* 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 docExternalUrls = MultiStringSetting (
- "-external-urls",
- "externalUrl(s)",
- "(deprecated) comma-separated list of package_names=doc_URL for external dependencies, where package names are ':'-separated"
- )
-
- val docGroups = BooleanSetting (
- "-groups",
- "Group similar functions together (based on the @group annotation)"
- )
-
- // Somewhere slightly before r18708 scaladoc stopped building unless the
- // self-type check was suppressed. I hijacked the slotted-for-removal-anyway
- // suppress-vt-warnings option and renamed it for this purpose.
- noSelfCheck.value = true
-
- // For improved help output.
- def scaladocSpecific = Set[Settings#Setting](
- docformat, doctitle, 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
- }
-
- // Deprecated together with 'docExternalUrls' option.
- lazy val extUrlPackageMapping: Map[String, String] = (Map.empty[String, String] /: docExternalUrls.value) {
- case (map, binding) =>
- val idx = binding indexOf "="
- val pkgs = binding substring (0, idx) split ":"
- val url = appendIndex(binding substring (idx + 1))
- map ++ (pkgs map (_ -> url))
- }
-
- 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/compiler/scala/tools/nsc/doc/Uncompilable.scala b/src/compiler/scala/tools/nsc/doc/Uncompilable.scala
deleted file mode 100644
index 9447e36610..0000000000
--- a/src/compiler/scala/tools/nsc/doc/Uncompilable.scala
+++ /dev/null
@@ -1,51 +0,0 @@
-/* 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.value)
- inform("Found %d doc comments in parse-only file %s: %s".format(comments.size, f, comments.map(_._1).mkString(", ")))
-
- comments
- }
- def files = settings.uncompilableFiles
- def symbols = pairs map (_._1)
- def templates = symbols filter (x => x.isClass || x.isTrait || x == AnyRefClass/* which is now a type alias */) toSet
- def comments = {
- if (settings.debug.value || settings.verbose.value)
- inform("Found %d uncompilable files: %s".format(files.size, files mkString ", "))
-
- if (pairs.isEmpty)
- warning("no doc comments read from " + settings.docUncompilable.value)
-
- pairs
- }
- override def toString = pairs.size + " uncompilable symbols:\n" + (
- symbols filterNot (_ == NoSymbol) map (x => " " + x.owner.fullName + " " + x.defString) mkString "\n"
- )
-}
diff --git a/src/compiler/scala/tools/nsc/doc/Universe.scala b/src/compiler/scala/tools/nsc/doc/Universe.scala
deleted file mode 100644
index 11520c810e..0000000000
--- a/src/compiler/scala/tools/nsc/doc/Universe.scala
+++ /dev/null
@@ -1,16 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/base/CommentFactoryBase.scala b/src/compiler/scala/tools/nsc/doc/base/CommentFactoryBase.scala
deleted file mode 100755
index 2064d86860..0000000000
--- a/src/compiler/scala/tools/nsc/doc/base/CommentFactoryBase.scala
+++ /dev/null
@@ -1,936 +0,0 @@
-/* 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 }
-
- /* 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, siteOpt: Option[Symbol] = None): 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, siteOpt))} 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, siteOpt)),
- 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, siteOpt: Option[Symbol]): Body = new WikiParser(string, pos, siteOpt).document()
-
- /** TODO
- *
- * @author Ingo Maier
- * @author Manohar Jonnalagedda
- * @author Gilles Dubochet */
- protected final class WikiParser(val buffer: String, pos: Position, siteOpt: Option[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 start = "[" * parens
- 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, siteOpt)
- }
- }
-
- /* 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/compiler/scala/tools/nsc/doc/base/LinkTo.scala b/src/compiler/scala/tools/nsc/doc/base/LinkTo.scala
deleted file mode 100755
index c11179800c..0000000000
--- a/src/compiler/scala/tools/nsc/doc/base/LinkTo.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2007-2013 LAMP/EPFL
- */
-
-package scala.tools.nsc
-package doc
-package base
-
-import scala.collection._
-
-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/compiler/scala/tools/nsc/doc/base/MemberLookupBase.scala b/src/compiler/scala/tools/nsc/doc/base/MemberLookupBase.scala
deleted file mode 100755
index 8d80333195..0000000000
--- a/src/compiler/scala/tools/nsc/doc/base/MemberLookupBase.scala
+++ /dev/null
@@ -1,206 +0,0 @@
-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.isRootSymbol || s.isEmptyPackage || s.isEmptyPackageClass
-
- def makeEntityLink(title: Inline, pos: Position, query: String, siteOpt: Option[Symbol]) =
- new EntityLink(title) { lazy val link = memberLookup(pos, query, siteOpt) }
-
- 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, siteOpt: Option[Symbol]): LinkTo = {
- var 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 = siteOpt.fold(Stream.empty[Symbol]) { s =>
- Stream.iterate(s)(_.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/compiler/scala/tools/nsc/doc/base/comment/Body.scala b/src/compiler/scala/tools/nsc/doc/base/comment/Body.scala
deleted file mode 100755
index 2a07547de2..0000000000
--- a/src/compiler/scala/tools/nsc/doc/base/comment/Body.scala
+++ /dev/null
@@ -1,89 +0,0 @@
-/* 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 {
- def canClose(open: HtmlTag) = {
- open.data.stripPrefix("<") == data.stripPrefix("</")
- }
-
- def close = {
- if (data.indexOf("</") == -1)
- Some(HtmlTag("</" + data.stripPrefix("<")))
- else
- None
- }
-}
-
-/** 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/compiler/scala/tools/nsc/doc/base/comment/Comment.scala b/src/compiler/scala/tools/nsc/doc/base/comment/Comment.scala
deleted file mode 100644
index a3d05ae50b..0000000000
--- a/src/compiler/scala/tools/nsc/doc/base/comment/Comment.scala
+++ /dev/null
@@ -1,131 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/doclet/Generator.scala b/src/compiler/scala/tools/nsc/doc/doclet/Generator.scala
deleted file mode 100644
index 42b56aa927..0000000000
--- a/src/compiler/scala/tools/nsc/doc/doclet/Generator.scala
+++ /dev/null
@@ -1,30 +0,0 @@
-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/compiler/scala/tools/nsc/doc/doclet/Indexer.scala b/src/compiler/scala/tools/nsc/doc/doclet/Indexer.scala
deleted file mode 100644
index 0cdd47182f..0000000000
--- a/src/compiler/scala/tools/nsc/doc/doclet/Indexer.scala
+++ /dev/null
@@ -1,21 +0,0 @@
-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/compiler/scala/tools/nsc/doc/doclet/Universer.scala b/src/compiler/scala/tools/nsc/doc/doclet/Universer.scala
deleted file mode 100644
index ee8b7809e5..0000000000
--- a/src/compiler/scala/tools/nsc/doc/doclet/Universer.scala
+++ /dev/null
@@ -1,21 +0,0 @@
-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/compiler/scala/tools/nsc/doc/html/Doclet.scala b/src/compiler/scala/tools/nsc/doc/html/Doclet.scala
deleted file mode 100644
index 21c5f6bb67..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/Doclet.scala
+++ /dev/null
@@ -1,19 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala b/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
deleted file mode 100644
index d721a96ad7..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/HtmlFactory.scala
+++ /dev/null
@@ -1,152 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/html/HtmlPage.scala b/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala
deleted file mode 100644
index 229e26d699..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/HtmlPage.scala
+++ /dev/null
@@ -1,224 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2007-2013 LAMP/EPFL
- * @author David Bernard, Manohar Jonnalagedda
- */
-
-package scala.tools.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.value)
- 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/compiler/scala/tools/nsc/doc/html/Page.scala b/src/compiler/scala/tools/nsc/doc/html/Page.scala
deleted file mode 100644
index 91939cf3de..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/Page.scala
+++ /dev/null
@@ -1,102 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2007-2013 LAMP/EPFL
- * @author David Bernard, Manohar Jonnalagedda
- */
-
-package scala.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/compiler/scala/tools/nsc/doc/html/SyntaxHigh.scala b/src/compiler/scala/tools/nsc/doc/html/SyntaxHigh.scala
deleted file mode 100644
index 5781e680dd..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/SyntaxHigh.scala
+++ /dev/null
@@ -1,286 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2010-2013 LAMP/EPFL
- * @author Stephane Micheloud
- */
-
-package scala.tools.nsc.doc.html
-
-import scala.xml.NodeSeq
-
-/** 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
- }
-
- def parse(pre: String, i: Int): Int = {
- out append pre
- if (i == buf.length) return i
- 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)
- }
- i
- }
-
- parse("", 0)
- scala.xml.Unparsed(out.toString)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/doc/html/page/Index.scala b/src/compiler/scala/tools/nsc/doc/html/page/Index.scala
deleted file mode 100644
index c034647320..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/page/Index.scala
+++ /dev/null
@@ -1,133 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/html/page/IndexScript.scala b/src/compiler/scala/tools/nsc/doc/html/page/IndexScript.scala
deleted file mode 100644
index e3c94505ab..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/page/IndexScript.scala
+++ /dev/null
@@ -1,69 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/html/page/ReferenceIndex.scala b/src/compiler/scala/tools/nsc/doc/html/page/ReferenceIndex.scala
deleted file mode 100755
index a74c2eedbd..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/page/ReferenceIndex.scala
+++ /dev/null
@@ -1,58 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2007-2013 LAMP/EPFL
- * @author Pedro Furlanetto
- */
-
-package scala.tools.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/compiler/scala/tools/nsc/doc/html/page/Source.scala b/src/compiler/scala/tools/nsc/doc/html/page/Source.scala
deleted file mode 100644
index 37145756d9..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/page/Source.scala
+++ /dev/null
@@ -1,127 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/html/page/Template.scala b/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
deleted file mode 100644
index 63509de4b5..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/page/Template.scala
+++ /dev/null
@@ -1,967 +0,0 @@
-/* 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 base._
-import base.comment._
-
-import model._
-import model.diagram._
-import scala.xml.{ NodeSeq, Text, UnprefixedAttribute }
-import scala.language.postfixOps
-
-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 && dtpl.allSubClasses.nonEmpty =>
- <div class="toggleContainer block">
- <span class="toggle">Known Subclasses</span>
- <div class="subClasses hiddenContent">{
- templatesToHtml(dtpl.allSubClasses.sortBy(_.name), scala.xml.Text(", "))
- }</div>
- </div>
- 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/compiler/scala/tools/nsc/doc/html/page/diagram/DiagramGenerator.scala b/src/compiler/scala/tools/nsc/doc/html/page/diagram/DiagramGenerator.scala
deleted file mode 100644
index 61c1819d11..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/page/diagram/DiagramGenerator.scala
+++ /dev/null
@@ -1,53 +0,0 @@
-/**
- * @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/compiler/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala b/src/compiler/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala
deleted file mode 100644
index ec00cace75..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/page/diagram/DiagramStats.scala
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * @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.value) {
- 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
-} \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala b/src/compiler/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala
deleted file mode 100644
index 837d9e6f21..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/page/diagram/DotDiagramGenerator.scala
+++ /dev/null
@@ -1,506 +0,0 @@
-/**
- * @author Damien Obrist
- * @author Vlad Ureche
- */
-package scala.tools.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.value) {
- 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/compiler/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala b/src/compiler/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala
deleted file mode 100644
index 2fa1bf62f3..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/page/diagram/DotRunner.scala
+++ /dev/null
@@ -1,225 +0,0 @@
-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/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png
deleted file mode 100644
index 7229603ae5..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-down.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png
deleted file mode 100644
index b2f2935dc9..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/arrow-right.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png
deleted file mode 100644
index 97edbd49db..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png
deleted file mode 100644
index cb1f638a58..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_diagram.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_diagram.png
deleted file mode 100644
index 9d7aec792b..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_diagram.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_to_object_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_to_object_big.png
deleted file mode 100644
index 5dd6e38d2e..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/class_to_object_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/constructorsbg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/constructorsbg.gif
deleted file mode 100644
index 2e3f5ea530..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/constructorsbg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/conversionbg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/conversionbg.gif
deleted file mode 100644
index 4be145d0af..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/conversionbg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/defbg-blue.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/defbg-blue.gif
deleted file mode 100644
index 69038337a7..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/defbg-blue.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/defbg-green.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/defbg-green.gif
deleted file mode 100644
index 36c43be3a2..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/defbg-green.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/diagrams.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/diagrams.css
deleted file mode 100644
index 5fe33f72f5..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/diagrams.css
+++ /dev/null
@@ -1,143 +0,0 @@
-.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/compiler/scala/tools/nsc/doc/html/resource/lib/diagrams.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/diagrams.js
deleted file mode 100644
index 478f2e38ac..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/diagrams.js
+++ /dev/null
@@ -1,324 +0,0 @@
-/**
- * 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/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left.png
deleted file mode 100644
index 0e8c893315..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left.psd b/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left.psd
deleted file mode 100644
index 4d740f3b17..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left.psd
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left2.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left2.gif
deleted file mode 100644
index b9b49076a6..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_left2.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_right.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_right.png
deleted file mode 100644
index f127e35b48..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_right.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_right.psd b/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_right.psd
deleted file mode 100644
index 63a1ae8349..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filter_box_right.psd
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterbg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterbg.gif
deleted file mode 100644
index 542ba4aa5a..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterbg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.gif
deleted file mode 100644
index b5075c16cd..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.png
deleted file mode 100644
index d613cf5633..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbarbg.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbg.gif
deleted file mode 100644
index ae2f85823b..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/filterboxbg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/fullcommenttopbg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/fullcommenttopbg.gif
deleted file mode 100644
index a0d93f4844..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/fullcommenttopbg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css
deleted file mode 100644
index 55fb370a41..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.css
+++ /dev/null
@@ -1,338 +0,0 @@
-* {
- 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/compiler/scala/tools/nsc/doc/html/resource/lib/index.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js
deleted file mode 100644
index 70073b272a..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/index.js
+++ /dev/null
@@ -1,533 +0,0 @@
-// © 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 == 9) { // tab
- $("#template").contents().find("#mbrsel-input").focus();
- input.attr("value", "");
- return false;
- }
- if (event.keyCode == 40) { // down arrow
- $(window).unbind("keydown");
- keyboardScrolldownLeftPane();
- 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/compiler/scala/tools/nsc/doc/html/resource/lib/jquery-ui.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/jquery-ui.js
deleted file mode 100755
index faab0cf1a3..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/jquery-ui.js
+++ /dev/null
@@ -1,6 +0,0 @@
-/*! 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/compiler/scala/tools/nsc/doc/html/resource/lib/jquery.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/jquery.js
deleted file mode 100644
index bc3fbc81b2..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/jquery.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! 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/compiler/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js
deleted file mode 100644
index 4dd48675b7..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/jquery.layout.js
+++ /dev/null
@@ -1,5486 +0,0 @@
-/**
- * @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/compiler/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js
deleted file mode 100644
index 4688d633fe..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/modernizr.custom.js
+++ /dev/null
@@ -1,4 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/html/resource/lib/navigation-li-a.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/navigation-li-a.png
deleted file mode 100644
index 9b32288e04..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/navigation-li-a.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/navigation-li.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/navigation-li.png
deleted file mode 100644
index fd0ad06e81..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/navigation-li.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png
deleted file mode 100644
index ad312793ea..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png
deleted file mode 100644
index 67ffca79de..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_diagram.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_diagram.png
deleted file mode 100644
index 6e9f2f743f..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_diagram.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_class_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_class_big.png
deleted file mode 100644
index 7502942eb6..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_class_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_trait_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_trait_big.png
deleted file mode 100644
index c777bfce8d..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_trait_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_type_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_type_big.png
deleted file mode 100644
index 7502942eb6..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/object_to_type_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ownderbg2.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ownderbg2.gif
deleted file mode 100644
index 848dd5963a..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ownderbg2.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ownerbg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ownerbg.gif
deleted file mode 100644
index 34a04249ee..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ownerbg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ownerbg2.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ownerbg2.gif
deleted file mode 100644
index 2ed33b0aa4..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ownerbg2.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png
deleted file mode 100644
index 6ea17ac320..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png
deleted file mode 100644
index 529aa93188..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/package_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/packagesbg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/packagesbg.gif
deleted file mode 100644
index 00c3378a2a..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/packagesbg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/raphael-min.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/raphael-min.js
deleted file mode 100644
index d30dbad858..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/raphael-min.js
+++ /dev/null
@@ -1,10 +0,0 @@
-// ┌────────────────────────────────────────────────────────────────────┠\\
-// │ 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/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css
deleted file mode 100755
index 7d64b9c5c5..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/ref-index.css
+++ /dev/null
@@ -1,30 +0,0 @@
-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/compiler/scala/tools/nsc/doc/html/resource/lib/remove.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/remove.png
deleted file mode 100644
index 4625f9df74..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/remove.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/remove.psd b/src/compiler/scala/tools/nsc/doc/html/resource/lib/remove.psd
deleted file mode 100644
index 3764f82ccb..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/remove.psd
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/scheduler.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/scheduler.js
deleted file mode 100644
index 4417f5b438..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/scheduler.js
+++ /dev/null
@@ -1,71 +0,0 @@
-// © 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/compiler/scala/tools/nsc/doc/html/resource/lib/selected-implicits.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-implicits.png
deleted file mode 100644
index bc29efb3e6..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-implicits.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-right-implicits.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-right-implicits.png
deleted file mode 100644
index 8313f4975b..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-right-implicits.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-right.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-right.png
deleted file mode 100644
index 04eda2f307..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected-right.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected.png
deleted file mode 100644
index c89765239e..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected2-right.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected2-right.png
deleted file mode 100644
index bf984ef0ba..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected2-right.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected2.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected2.png
deleted file mode 100644
index a790bb1169..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/selected2.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/signaturebg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/signaturebg.gif
deleted file mode 100644
index b6ac4415e4..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/signaturebg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/signaturebg2.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/signaturebg2.gif
deleted file mode 100644
index 9aae5ba0aa..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/signaturebg2.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css
deleted file mode 100644
index b066027f04..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.css
+++ /dev/null
@@ -1,848 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/html/resource/lib/template.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js
deleted file mode 100644
index 6d1caf6d50..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/template.js
+++ /dev/null
@@ -1,466 +0,0 @@
-// © 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/compiler/scala/tools/nsc/doc/html/resource/lib/tools.tooltip.js b/src/compiler/scala/tools/nsc/doc/html/resource/lib/tools.tooltip.js
deleted file mode 100644
index 0af34eca4c..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/tools.tooltip.js
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * 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/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png
deleted file mode 100644
index fb961a2eda..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png
deleted file mode 100644
index 625d9251cb..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_diagram.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_diagram.png
deleted file mode 100644
index 88983254ce..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_diagram.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_to_object_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_to_object_big.png
deleted file mode 100644
index d0cd7fd512..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/trait_to_object_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type.png
deleted file mode 100644
index 6c6e1fe2f5..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_big.png
deleted file mode 100644
index 04c8794e92..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_diagram.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_diagram.png
deleted file mode 100644
index d8152529fd..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_diagram.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai
deleted file mode 100644
index 3b5c47c9e3..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_tags.ai
+++ /dev/null
@@ -1,6376 +0,0 @@
-%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/compiler/scala/tools/nsc/doc/html/resource/lib/type_to_object_big.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_to_object_big.png
deleted file mode 100644
index ef2615bacc..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/type_to_object_big.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/typebg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/typebg.gif
deleted file mode 100644
index 2fcc77b2e8..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/typebg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/unselected.png b/src/compiler/scala/tools/nsc/doc/html/resource/lib/unselected.png
deleted file mode 100644
index d5ac639405..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/unselected.png
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/valuemembersbg.gif b/src/compiler/scala/tools/nsc/doc/html/resource/lib/valuemembersbg.gif
deleted file mode 100644
index 2a949311d7..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/valuemembersbg.gif
+++ /dev/null
Binary files differ
diff --git a/src/compiler/scala/tools/nsc/doc/html/resource/lib/versions.txt b/src/compiler/scala/tools/nsc/doc/html/resource/lib/versions.txt
deleted file mode 100644
index 17d1caeb66..0000000000
--- a/src/compiler/scala/tools/nsc/doc/html/resource/lib/versions.txt
+++ /dev/null
@@ -1 +0,0 @@
-jquery=1.4.2
diff --git a/src/compiler/scala/tools/nsc/doc/model/CommentFactory.scala b/src/compiler/scala/tools/nsc/doc/model/CommentFactory.scala
deleted file mode 100644
index 574d6b04f8..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/CommentFactory.scala
+++ /dev/null
@@ -1,112 +0,0 @@
-/* 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 }
-
- protected val commentCache = mutable.HashMap.empty[(Symbol, TemplateImpl), Comment]
-
- def addCommentBody(sym: Symbol, inTpl: TemplateImpl, docStr: String, docPos: global.Position): Symbol = {
- commentCache += (sym, inTpl) -> parse(docStr, docStr, docPos, None)
- sym
- }
-
- def comment(sym: Symbol, currentTpl: Option[DocTemplateImpl], inTpl: DocTemplateImpl): Option[Comment] = {
- val key = (sym, inTpl)
- if (commentCache isDefinedAt key)
- Some(commentCache(key))
- else {
- val c = defineComment(sym, currentTpl, inTpl)
- if (c isDefined) commentCache += (sym, inTpl) -> c.get
- c
- }
- }
-
- /** 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, currentTpl: Option[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 tplOpt = if (currentTpl.isDefined) currentTpl else Some(inTpl)
- val c = parse(rawComment, global.rawDocComment(sym), global.docCommentPos(sym), tplOpt)
- Some(c)
- }
- else None
- }
-
- }
-
- protected def parse(comment: String, src: String, pos: Position, inTplOpt: Option[DocTemplateImpl] = None): Comment = {
- assert(!inTplOpt.isDefined || inTplOpt.get != null)
- parseAtSymbol(comment, src, pos, inTplOpt map (_.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, inTplOpt: Option[DocTemplateImpl]): Body = {
- assert(!inTplOpt.isDefined || inTplOpt.get != null)
- parseWikiAtSymbol(string,pos, inTplOpt map (_.sym))
- }
-}
diff --git a/src/compiler/scala/tools/nsc/doc/model/Entity.scala b/src/compiler/scala/tools/nsc/doc/model/Entity.scala
deleted file mode 100644
index 924f203a59..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/Entity.scala
+++ /dev/null
@@ -1,601 +0,0 @@
-/* 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 or indirect super-class or super-trait.
- * Only templates for which documentation is available in the universe (`DocTemplateEntity`) are listed. */
- def allSubClasses: List[DocTemplateEntity]
-
- /** 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/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala
deleted file mode 100755
index 1272906df5..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/IndexModelFactory.scala
+++ /dev/null
@@ -1,58 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2007-2013 LAMP/EPFL
- * @author Pedro Furlanetto
- */
-
-package scala.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/compiler/scala/tools/nsc/doc/model/MemberLookup.scala b/src/compiler/scala/tools/nsc/doc/model/MemberLookup.scala
deleted file mode 100644
index 23259a4ae8..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/MemberLookup.scala
+++ /dev/null
@@ -1,63 +0,0 @@
-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)
- }
- } orElse {
- // Deprecated option.
- settings.extUrlPackageMapping find {
- case (pkg, _) => name startsWith pkg
- } map {
- case (_, url) => LinkToExternal(name, url + "#" + name)
- }
- }
- }
-
- override def warnNoLink = !settings.docNoLinkWarnings.value
-}
diff --git a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
deleted file mode 100644
index 1df725636a..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/ModelFactory.scala
+++ /dev/null
@@ -1,1045 +0,0 @@
-/* NSC -- new Scala compiler -- Copyright 2007-2013 LAMP/EPFL */
-
-package scala.tools.nsc
-package doc
-package model
-
-import base._
-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 {
- lazy val comment = {
- // 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
- val thisTpl = this match {
- case d: DocTemplateImpl => Some(d)
- case _ => None
- }
- if (inTpl != null) thisFactory.comment(sym, thisTpl, inTpl) else None
- }
- def group = comment flatMap (_.group) getOrElse defaultGroup
- override def inTemplate = inTpl
- override def toRoot: List[MemberImpl] = this :: inTpl.toRoot
- def inDefinitionTemplates =
- if (inTpl == null)
- List(makeRootPackage)
- 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, Some(inTpl))
- case (Some(msg), None) => parseWiki(msg, NoPosition, Some(inTpl))
- case (None, Some(ver)) => parseWiki("''(Since version " + ver + ")''", NoPosition, Some(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, Some(inTpl))
- case (Some(msg), None) => parseWiki(msg, NoPosition, Some(inTpl))
- case (None, Some(ver)) => parseWiki("''(Changed in version " + ver + ")''", NoPosition, Some(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[MemberEntity] = 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.value)
- inform("Creating doc template for " + sym)
-
- override def toRoot: List[DocTemplateImpl] = this :: inTpl.toRoot
-
- protected def inSourceFromSymbol(symbol: Symbol) =
- if (symbol.sourceFile != null && ! symbol.isSynthetic)
- Some((symbol.sourceFile, symbol.pos.line))
- else
- None
-
- def inSource = inSourceFromSymbol(sym)
-
- 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
- }
-
- protected def linearizationFromSymbol(symbol: Symbol): List[(TemplateEntity, TypeEntity)] = {
- symbol.ancestors map { ancestor =>
- val typeEntity = makeType(symbol.info.baseType(ancestor), this)
- val tmplEntity = makeTemplate(ancestor) match {
- case tmpl: DocTemplateImpl => tmpl registerSubClass this ; tmpl
- case tmpl => tmpl
- }
- (tmplEntity, typeEntity)
- }
- }
-
- lazy val linearization = linearizationFromSymbol(sym)
- def linearizationTemplates = linearization map { _._1 }
- def linearizationTypes = linearization map { _._2 }
-
- /* 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 allSubClasses = if (subClassesCache == null) Nil else subClassesCache.toList
- def directSubClasses = allSubClasses.filter(_.parentTypes.map(_._1).contains(this))
-
- /* 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.value) 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))
-
- // compute linearization to register subclasses
- linearization
- outgoingImplicitlyConvertedClasses
-
- // the members generated by the symbols in memberSymsEager PLUS the members from the usecases
- val allMembers = ownMembers ::: ownMembers.flatMap(_.useCaseOf.map(_.asInstanceOf[MemberImpl])).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 lazy val (inSource, linearization) = {
- val representive = sym.info.members.find {
- s => s.isPackageObject
- } getOrElse sym
- (inSourceFromSymbol(representive), linearizationFromSymbol(representive))
- }
- 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[MemberEntity], inTpl: DocTemplateImpl)
- extends MemberImpl(sym, inTpl) with NonTemplateMemberEntity {
- override lazy val comment = {
- val inRealTpl =
- conversion.fold(Option(inTpl)) { conv =>
- /* 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
- */
- findTemplateMaybe(conv.toType.typeSymbol) filterNot (_ == makeRootPackage) orElse (
- findTemplateMaybe(sym.owner) filterNot (_ == makeRootPackage) orElse Option(inTpl)
- )
- }
- inRealTpl flatMap (thisFactory.comment(sym, None, _))
- }
-
- 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[MemberEntity], 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, Option(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)
- }
- }
- }
-
- def makeRootPackage: PackageImpl = docTemplatesCache(RootPackage).asInstanceOf[PackageImpl]
-
- // 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 lazy val comment = // The analyser does not duplicate the lazy val's DocDef when it introduces its accessor.
- thisFactory.comment(bSym.accessed, None, inTpl.asInstanceOf[DocTemplateImpl]) // This hack should be removed after analyser is fixed.
- 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 = { // lazy
- def annotArgs = annot.args match {
- case Nil => annot.assocs collect { case (_, LiteralAnnotArg(const)) => Literal(const) }
- case xs => xs
- }
- def noParams = annotArgs map (_ => None)
-
- val params: List[Option[ValueParam]] = annotationClass match {
- case aClass: DocTemplateEntity with Class =>
- (aClass.primaryConstructor map { _.valueParams.head }) match {
- case Some(vps) => vps map { Some(_) }
- case _ => noParams
- }
- case _ => noParams
- }
- assert(params.length == annotArgs.length, (params, annotArgs))
-
- params zip annotArgs flatMap { case (param, arg) =>
- makeTree(arg) map { tree =>
- new ValueArgument {
- def parameter = param
- 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))) match {
- case Some(ValDef(_,_,_,rhs)) => makeTree(rhs)
- case _ => None
- }
- 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.value) 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.value && (bSym.sourceFile != null)) ||
- (bSym.isAliasType || bSym.isAbstractType) &&
- { val rawComment = global.expandedDocComment(bSym, inTpl.sym)
- rawComment.contains("@template") || rawComment.contains("@documentable") }
-}
-
diff --git a/src/compiler/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala
deleted file mode 100644
index 868c2fc3a4..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/ModelFactoryImplicitSupport.scala
+++ /dev/null
@@ -1,579 +0,0 @@
-/* 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 {
- context.flushBuffer() /* any errors here should not prevent future findings */
- // TODO: Not sure this is the right thing to do -- seems similar to what scalac should be doing
- val context2 = context.make(context.unit, context.tree, sym.owner, context.scope, context.imports)
- val search = inferImplicit(EmptyTree, tpe, false, false, context2, false)
- context.flushBuffer() /* any errors here should not prevent future findings */
-
- available = Some(search.tree != EmptyTree)
- } catch {
- case _: TypeError =>
- }
- }
-
- available match {
- case Some(true) =>
- Nil
- case Some(false) if (!settings.docImplicitsShowAll.value) =>
- // 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 != NoSymbol)
- makeTemplate(convSym.owner)
- else {
- error("Scaladoc implicits: " + toString + " = NoSymbol!")
- makeRootPackage
- }
-
- 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/compiler/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala b/src/compiler/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala
deleted file mode 100644
index 99e9059d79..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/ModelFactoryTypeSupport.scala
+++ /dev/null
@@ -1,315 +0,0 @@
-/* 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.value && 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.value)
- typeCache.getOrElseUpdate(aType, createTypeEntity)
- else createTypeEntity
- }
-}
diff --git a/src/compiler/scala/tools/nsc/doc/model/TreeEntity.scala b/src/compiler/scala/tools/nsc/doc/model/TreeEntity.scala
deleted file mode 100644
index 5b4ec4a40b..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/TreeEntity.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/model/TreeFactory.scala b/src/compiler/scala/tools/nsc/doc/model/TreeFactory.scala
deleted file mode 100755
index b972649194..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/TreeFactory.scala
+++ /dev/null
@@ -1,96 +0,0 @@
-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): Option[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)
-
- Some(new TreeEntity {
- val expression = expr.toString
- val refEntity = refs
- })
- }
- case pos: OffsetPosition =>
- Some(new TreeEntity {
- val expression = rhs.toString
- val refEntity = new immutable.TreeMap[Int, (Entity, Int)]
- })
- case _ => None
- }
- }
-}
diff --git a/src/compiler/scala/tools/nsc/doc/model/TypeEntity.scala b/src/compiler/scala/tools/nsc/doc/model/TypeEntity.scala
deleted file mode 100644
index cf5c1fb3fb..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/TypeEntity.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/model/ValueArgument.scala b/src/compiler/scala/tools/nsc/doc/model/ValueArgument.scala
deleted file mode 100644
index f712869a4b..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/ValueArgument.scala
+++ /dev/null
@@ -1,20 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/model/Visibility.scala b/src/compiler/scala/tools/nsc/doc/model/Visibility.scala
deleted file mode 100644
index 22580805aa..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/Visibility.scala
+++ /dev/null
@@ -1,39 +0,0 @@
-/* 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/compiler/scala/tools/nsc/doc/model/diagram/Diagram.scala b/src/compiler/scala/tools/nsc/doc/model/diagram/Diagram.scala
deleted file mode 100644
index 150b293b81..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/diagram/Diagram.scala
+++ /dev/null
@@ -1,137 +0,0 @@
-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/compiler/scala/tools/nsc/doc/model/diagram/DiagramDirectiveParser.scala b/src/compiler/scala/tools/nsc/doc/model/diagram/DiagramDirectiveParser.scala
deleted file mode 100644
index 6395446d3b..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/diagram/DiagramDirectiveParser.scala
+++ /dev/null
@@ -1,257 +0,0 @@
-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.value && result != NoDiagramAtAll && result != FullDiagram)
- settings.printMsg(template.kind + " " + template.qualifiedName + " filter: " + result)
- tFilter += System.currentTimeMillis
-
- result
- }
-}
diff --git a/src/compiler/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala b/src/compiler/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala
deleted file mode 100644
index ebac25bbe4..0000000000
--- a/src/compiler/scala/tools/nsc/doc/model/diagram/DiagramFactory.scala
+++ /dev/null
@@ -1,254 +0,0 @@
-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/compiler/scala/tools/nsc/interactive/CompilerControl.scala b/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
deleted file mode 100644
index 523e0d57b7..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/CompilerControl.scala
+++ /dev/null
@@ -1,470 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-
-import scala.util.control.ControlThrowable
-import scala.tools.nsc.io.AbstractFile
-import scala.tools.nsc.util.FailedInterrupt
-import scala.tools.nsc.util.EmptyAction
-import scala.tools.nsc.util.WorkScheduler
-import scala.reflect.internal.util.{SourceFile, Position}
-import scala.tools.nsc.util.InterruptReq
-
-/** Interface of interactive compiler to a client such as an IDE
- * The model the presentation compiler consists of the following parts:
- *
- * unitOfFile: The map from sourcefiles to loaded units. A sourcefile/unit is loaded if it occurs in that map.
- *
- * manipulated by: removeUnitOf, reloadSources.
- *
- * A call to reloadSources will add the given sources to the loaded units, and
- * start a new background compiler pass to compile all loaded units (with the indicated sources first).
- * Each background compiler pass has its own typer run.
- * The background compiler thread can be interrupted each time an AST node is
- * completely typechecked in the following ways:
-
- * 1. by a new call to reloadSources. This starts a new background compiler pass with a new typer run.
- * 2. by a call to askTypeTree. This starts a new typer run if the forceReload parameter = true
- * 3. by a call to askTypeAt, askTypeCompletion, askScopeCompletion, askToDoFirst, askLinkPos, askLastType.
- * 4. by raising an exception in the scheduler.
- * 5. by passing a high-priority action wrapped in ask { ... }.
- *
- * Actions under 1-3 can themselves be interrupted if they involve typechecking
- * AST nodes. High-priority actions under 5 cannot; they always run to completion.
- * So these high-priority actions should to be short.
- *
- * Normally, an interrupted action continues after the interrupting action is finished.
- * However, if the interrupting action created a new typer run, the interrupted
- * action is aborted. If there's an outstanding response, it will be set to
- * a Right value with a FreshRunReq exception.
- */
-trait CompilerControl { self: Global =>
-
- import syntaxAnalyzer.UnitParser
-
- type Response[T] = scala.tools.nsc.interactive.Response[T]
-
- /** The scheduler by which client and compiler communicate
- * Must be initialized before starting compilerRunner
- */
- @volatile protected[interactive] var scheduler = new WorkScheduler
-
- /** Return the compilation unit attached to a source file, or None
- * if source is not loaded.
- */
- def getUnitOf(s: SourceFile): Option[RichCompilationUnit] = getUnit(s)
-
- /** Run operation `op` on a compilation unit associated with given `source`.
- * If source has a loaded compilation unit, this one is passed to `op`.
- * Otherwise a new compilation unit is created, but not added to the set of loaded units.
- */
- def onUnitOf[T](source: SourceFile)(op: RichCompilationUnit => T): T =
- op(unitOfFile.getOrElse(source.file, new RichCompilationUnit(source)))
-
- /** The compilation unit corresponding to a source file
- * if it does not yet exist create a new one atomically
- * Note: We want to get roid of this operation as it messes compiler invariants.
- */
- @deprecated("use getUnitOf(s) or onUnitOf(s) instead", "2.10.0")
- def unitOf(s: SourceFile): RichCompilationUnit = getOrCreateUnitOf(s)
-
- /** The compilation unit corresponding to a position */
- @deprecated("use getUnitOf(pos.source) or onUnitOf(pos.source) instead", "2.10.0")
- def unitOf(pos: Position): RichCompilationUnit = getOrCreateUnitOf(pos.source)
-
- /** Removes the CompilationUnit corresponding to the given SourceFile
- * from consideration for recompilation.
- */
- def removeUnitOf(s: SourceFile): Option[RichCompilationUnit] = { toBeRemoved += s.file; unitOfFile get s.file }
-
- /** Returns the top level classes and objects that were deleted
- * in the editor since last time recentlyDeleted() was called.
- */
- def recentlyDeleted(): List[Symbol] = deletedTopLevelSyms.synchronized {
- val result = deletedTopLevelSyms
- deletedTopLevelSyms.clear()
- result.toList
- }
-
- /** Locate smallest tree that encloses position
- * @pre Position must be loaded
- */
- def locateTree(pos: Position): Tree = onUnitOf(pos.source) { unit => new Locator(pos) locateIn unit.body }
-
- /** Locates smallest context that encloses position as an optional value.
- */
- def locateContext(pos: Position): Option[Context] =
- for (unit <- getUnit(pos.source); cx <- locateContext(unit.contexts, pos)) yield cx
-
- /** Returns the smallest context that contains given `pos`, throws FatalError if none exists.
- */
- def doLocateContext(pos: Position): Context = locateContext(pos) getOrElse {
- throw new FatalError("no context found for "+pos)
- }
-
- private def postWorkItem(item: WorkItem) =
- if (item.onCompilerThread) item() else scheduler.postWorkItem(item)
-
- /** Makes sure a set of compilation units is loaded and parsed.
- * Returns () to syncvar `response` on completion.
- * Afterwards a new background compiler run is started with
- * the given sources at the head of the list of to-be-compiled sources.
- */
- def askReload(sources: List[SourceFile], response: Response[Unit]) = {
- val superseeded = scheduler.dequeueAll {
- case ri: ReloadItem if ri.sources == sources => Some(ri)
- case _ => None
- }
- superseeded.foreach(_.response.set())
- postWorkItem(new ReloadItem(sources, response))
- }
-
- /** Removes source files and toplevel symbols, and issues a new typer run.
- * Returns () to syncvar `response` on completion.
- */
- def askFilesDeleted(sources: List[SourceFile], response: Response[Unit]) = {
- postWorkItem(new FilesDeletedItem(sources, response))
- }
-
- /** Sets sync var `response` to the smallest fully attributed tree that encloses position `pos`.
- * Note: Unlike for most other ask... operations, the source file belonging to `pos` needs not be loaded.
- */
- def askTypeAt(pos: Position, response: Response[Tree]) =
- postWorkItem(new AskTypeAtItem(pos, response))
-
- /** Sets sync var `response` to the fully attributed & typechecked tree contained in `source`.
- * @pre `source` needs to be loaded.
- * @note Deprecated because of race conditions in the typechecker when the background compiler
- * is interrupted while typing the same `source`.
- * @see SI-6578
- */
- @deprecated("Use `askLoadedTyped` instead to avoid race conditions in the typechecker", "2.10.1")
- def askType(source: SourceFile, forceReload: Boolean, response: Response[Tree]) =
- postWorkItem(new AskTypeItem(source, forceReload, response))
-
- /** Sets sync var `response` to the position of the definition of the given link in
- * the given sourcefile.
- *
- * @param sym The symbol referenced by the link (might come from a classfile)
- * @param source The source file that's supposed to contain the definition
- * @param response A response that will be set to the following:
- * If `source` contains a definition that is referenced by the given link
- * the position of that definition, otherwise NoPosition.
- * Note: This operation does not automatically load `source`. If `source`
- * is unloaded, it stays that way.
- */
- def askLinkPos(sym: Symbol, source: SourceFile, response: Response[Position]) =
- postWorkItem(new AskLinkPosItem(sym, source, response))
-
- /** Sets sync var `response` to doc comment information for a given symbol.
- *
- * @param sym The symbol whose doc comment should be retrieved (might come from a classfile)
- * @param source The source file that's supposed to contain the definition
- * @param site The symbol where 'sym' is observed
- * @param fragments All symbols that can contribute to the generated documentation
- * together with their source files.
- * @param response A response that will be set to the following:
- * If `source` contains a definition of a given symbol that has a doc comment,
- * the (expanded, raw, position) triplet for a comment, otherwise ("", "", NoPosition).
- * Note: This operation does not automatically load sources that are not yet loaded.
- */
- def askDocComment(sym: Symbol, source: SourceFile, site: Symbol, fragments: List[(Symbol,SourceFile)], response: Response[(String, String, Position)]): Unit =
- postWorkItem(new AskDocCommentItem(sym, source, site, fragments, response))
-
- @deprecated("Use method that accepts fragments", "2.10.2")
- def askDocComment(sym: Symbol, site: Symbol, source: SourceFile, response: Response[(String, String, Position)]): Unit =
- askDocComment(sym, source, site, (sym,source)::Nil, response)
-
- /** Sets sync var `response` to list of members that are visible
- * as members of the tree enclosing `pos`, possibly reachable by an implicit.
- * @pre source is loaded
- */
- def askTypeCompletion(pos: Position, response: Response[List[Member]]) =
- postWorkItem(new AskTypeCompletionItem(pos, response))
-
- /** Sets sync var `response` to list of members that are visible
- * as members of the scope enclosing `pos`.
- * @pre source is loaded
- */
- def askScopeCompletion(pos: Position, response: Response[List[Member]]) =
- postWorkItem(new AskScopeCompletionItem(pos, response))
-
- /** Asks to do unit corresponding to given source file on present and subsequent type checking passes.
- * If the file is in the 'crashedFiles' ignore list it is removed and typechecked normally.
- */
- def askToDoFirst(source: SourceFile) =
- postWorkItem(new AskToDoFirstItem(source))
-
- /** If source is not yet loaded, loads it, and starts a new run, otherwise
- * continues with current pass.
- * Waits until source is fully type checked and returns body in response.
- * @param source The source file that needs to be fully typed.
- * @param response The response, which is set to the fully attributed tree of `source`.
- * If the unit corresponding to `source` has been removed in the meantime
- * the a NoSuchUnitError is raised in the response.
- */
- def askLoadedTyped(source: SourceFile, response: Response[Tree]) =
- postWorkItem(new AskLoadedTypedItem(source, response))
-
- /** If source if not yet loaded, get an outline view with askParseEntered.
- * If source is loaded, wait for it to be typechecked.
- * In both cases, set response to parsed (and possibly typechecked) tree.
- * @param keepSrcLoaded If set to `true`, source file will be kept as a loaded unit afterwards.
- */
- def askStructure(keepSrcLoaded: Boolean)(source: SourceFile, response: Response[Tree]) = {
- getUnit(source) match {
- case Some(_) => askLoadedTyped(source, response)
- case None => askParsedEntered(source, keepSrcLoaded, response)
- }
- }
-
- /** Set sync var `response` to the parse tree of `source` with all top-level symbols entered.
- * @param source The source file to be analyzed
- * @param keepLoaded If set to `true`, source file will be kept as a loaded unit afterwards.
- * If keepLoaded is `false` the operation is run at low priority, only after
- * everything is brought up to date in a regular type checker run.
- * @param response The response.
- */
- def askParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree]) =
- postWorkItem(new AskParsedEnteredItem(source, keepLoaded, response))
-
- /** Set sync var `response` to a pair consisting of
- * - the fully qualified name of the first top-level object definition in the file.
- * or "" if there are no object definitions.
- * - the text of the instrumented program which, when run,
- * prints its output and all defined values in a comment column.
- *
- * @param source The source file to be analyzed
- * @param response The response.
- */
- @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0")
- def askInstrumented(source: SourceFile, line: Int, response: Response[(String, Array[Char])]) =
- postWorkItem(new AskInstrumentedItem(source, line, response))
-
- /** Cancels current compiler run and start a fresh one where everything will be re-typechecked
- * (but not re-loaded).
- */
- def askReset() = scheduler raise (new FreshRunReq)
-
- /** Tells the compile server to shutdown, and not to restart again */
- def askShutdown() = scheduler raise ShutdownReq
-
- @deprecated("use parseTree(source) instead", "2.10.0") // deleted 2nd parameter, as this has to run on 2.8 also.
- def askParse(source: SourceFile, response: Response[Tree]) = respond(response) {
- parseTree(source)
- }
-
- /** Returns parse tree for source `source`. No symbols are entered. Syntax errors are reported.
- *
- * This method is thread-safe and as such can safely run outside of the presentation
- * compiler thread.
- */
- def parseTree(source: SourceFile): Tree = {
- new UnitParser(new CompilationUnit(source)).parse()
- }
-
- /** Asks for a computation to be done quickly on the presentation compiler thread */
- def ask[A](op: () => A): A = if (self.onCompilerThread) op() else scheduler doQuickly op
-
- /** Asks for a computation to be done on presentation compiler thread, returning
- * a response with the result or an exception
- */
- def askForResponse[A](op: () => A): Response[A] = {
- val r = new Response[A]
- if (self.onCompilerThread) {
- try { r set op() }
- catch { case exc: Throwable => r raise exc }
- r
- } else {
- val ir = scheduler askDoQuickly op
- ir onComplete {
- case Left(result) => r set result
- case Right(exc) => r raise exc
- }
- r
- }
- }
-
- def onCompilerThread = Thread.currentThread == compileRunner
-
- /** Info given for every member found by completion
- */
- abstract class Member {
- val sym: Symbol
- val tpe: Type
- val accessible: Boolean
- def implicitlyAdded = false
- }
-
- case class TypeMember(
- sym: Symbol,
- tpe: Type,
- accessible: Boolean,
- inherited: Boolean,
- viaView: Symbol) extends Member {
- override def implicitlyAdded = viaView != NoSymbol
- }
-
- case class ScopeMember(
- sym: Symbol,
- tpe: Type,
- accessible: Boolean,
- viaImport: Tree) extends Member
-
- // items that get sent to scheduler
-
- abstract class WorkItem extends (() => Unit) {
- val onCompilerThread = self.onCompilerThread
-
- /** Raise a MissingReponse, if the work item carries a response. */
- def raiseMissing(): Unit
- }
-
- case class ReloadItem(sources: List[SourceFile], response: Response[Unit]) extends WorkItem {
- def apply() = reload(sources, response)
- override def toString = "reload "+sources
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- case class FilesDeletedItem(sources: List[SourceFile], response: Response[Unit]) extends WorkItem {
- def apply() = filesDeleted(sources, response)
- override def toString = "files deleted "+sources
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- case class AskTypeAtItem(pos: Position, response: Response[Tree]) extends WorkItem {
- def apply() = self.getTypedTreeAt(pos, response)
- override def toString = "typeat "+pos.source+" "+pos.show
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- case class AskTypeItem(source: SourceFile, forceReload: Boolean, response: Response[Tree]) extends WorkItem {
- def apply() = self.getTypedTree(source, forceReload, response)
- override def toString = "typecheck"
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- case class AskTypeCompletionItem(pos: Position, response: Response[List[Member]]) extends WorkItem {
- def apply() = self.getTypeCompletion(pos, response)
- override def toString = "type completion "+pos.source+" "+pos.show
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- case class AskScopeCompletionItem(pos: Position, response: Response[List[Member]]) extends WorkItem {
- def apply() = self.getScopeCompletion(pos, response)
- override def toString = "scope completion "+pos.source+" "+pos.show
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- class AskToDoFirstItem(val source: SourceFile) extends WorkItem {
- def apply() = {
- moveToFront(List(source))
- enableIgnoredFile(source.file)
- }
- override def toString = "dofirst "+source
-
- def raiseMissing() = ()
- }
-
- case class AskLinkPosItem(sym: Symbol, source: SourceFile, response: Response[Position]) extends WorkItem {
- def apply() = self.getLinkPos(sym, source, response)
- override def toString = "linkpos "+sym+" in "+source
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- case class AskDocCommentItem(sym: Symbol, source: SourceFile, site: Symbol, fragments: List[(Symbol,SourceFile)], response: Response[(String, String, Position)]) extends WorkItem {
- def apply() = self.getDocComment(sym, source, site, fragments, response)
- override def toString = "doc comment "+sym+" in "+source+" with fragments:"+fragments.mkString("(", ",", ")")
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- case class AskLoadedTypedItem(source: SourceFile, response: Response[Tree]) extends WorkItem {
- def apply() = self.waitLoadedTyped(source, response, this.onCompilerThread)
- override def toString = "wait loaded & typed "+source
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- case class AskParsedEnteredItem(source: SourceFile, keepLoaded: Boolean, response: Response[Tree]) extends WorkItem {
- def apply() = self.getParsedEntered(source, keepLoaded, response, this.onCompilerThread)
- override def toString = "getParsedEntered "+source+", keepLoaded = "+keepLoaded
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0")
- case class AskInstrumentedItem(source: SourceFile, line: Int, response: Response[(String, Array[Char])]) extends WorkItem {
- def apply() = self.getInstrumented(source, line, response)
- override def toString = "getInstrumented "+source
-
- def raiseMissing() =
- response raise new MissingResponse
- }
-
- /** A do-nothing work scheduler that responds immediately with MissingResponse.
- *
- * Used during compiler shutdown.
- */
- class NoWorkScheduler extends WorkScheduler {
-
- override def postWorkItem(action: Action) = synchronized {
- action match {
- case w: WorkItem => w.raiseMissing()
- case e: EmptyAction => // do nothing
- case _ => println("don't know what to do with this " + action.getClass)
- }
- }
-
- override def doQuickly[A](op: () => A): A = {
- throw new FailedInterrupt(new Exception("Posted a work item to a compiler that's shutting down"))
- }
-
- override def askDoQuickly[A](op: () => A): InterruptReq { type R = A } = {
- val ir = new InterruptReq {
- type R = A
- val todo = () => throw new MissingResponse
- }
- ir.execute()
- ir
- }
-
- }
-
-}
-
- // ---------------- Interpreted exceptions -------------------
-
-/** Signals a request for a fresh background compiler run.
- * Note: The object has to stay top-level so that the PresentationCompilerThread may access it.
- */
-class FreshRunReq extends ControlThrowable
-
-/** Signals a request for a shutdown of the presentation compiler.
- * Note: The object has to stay top-level so that the PresentationCompilerThread may access it.
- */
-object ShutdownReq extends ControlThrowable
-
-class NoSuchUnitError(file: AbstractFile) extends Exception("no unit found for file "+file)
-
-class MissingResponse extends Exception("response missing")
diff --git a/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala b/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala
deleted file mode 100644
index 93ef4c4d6c..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/ContextTrees.scala
+++ /dev/null
@@ -1,149 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-
-import scala.collection.mutable.ArrayBuffer
-
-trait ContextTrees { self: Global =>
-
- type Context = analyzer.Context
- lazy val NoContext = analyzer.NoContext
- type Contexts = ArrayBuffer[ContextTree]
-
- /** A context tree contains contexts that are indexed by positions.
- * It satisfies the following properties:
- * 1. All context come from compiling the same unit.
- * 2. Child contexts have parent contexts in their outer chain.
- * 3. The `pos` field of a context is the same as `context.tree.pos`, unless that
- * position is transparent. In that case, `pos` equals the position of
- * one of the solid descendants of `context.tree`.
- * 4. Children of a context have non-overlapping increasing positions.
- * 5. No context in the tree has a transparent position.
- */
- class ContextTree(val pos: Position, val context: Context, val children: ArrayBuffer[ContextTree]) {
- def this(pos: Position, context: Context) = this(pos, context, new ArrayBuffer[ContextTree])
- override def toString = "ContextTree("+pos+", "+children+")"
- }
-
- /** Optionally returns the smallest context that contains given `pos`, or None if none exists.
- */
- def locateContext(contexts: Contexts, pos: Position): Option[Context] = synchronized {
- def locateNearestContextTree(contexts: Contexts, pos: Position, recent: Array[ContextTree]): Option[ContextTree] = {
- locateContextTree(contexts, pos) match {
- case Some(x) =>
- recent(0) = x
- locateNearestContextTree(x.children, pos, recent)
- case None => recent(0) match {
- case null => None
- case x => Some(x)
- }
- }
- }
- locateNearestContextTree(contexts, pos, new Array[ContextTree](1)) map (_.context)
- }
-
- def locateContextTree(contexts: Contexts, pos: Position): Option[ContextTree] = {
- if (contexts.isEmpty) None
- else {
- val hi = contexts.length - 1
- if ((contexts(hi).pos properlyPrecedes pos) || (pos properlyPrecedes contexts(0).pos)) None
- else {
- def loop(lo: Int, hi: Int): Option[ContextTree] = {
- val mid = (lo + hi) / 2
- val midpos = contexts(mid).pos
- if ((pos precedes midpos) && (mid < hi))
- loop(lo, mid)
- else if ((midpos precedes pos) && (lo < mid))
- loop(mid, hi)
- else if (midpos includes pos)
- Some(contexts(mid))
- else if (contexts(mid+1).pos includes pos)
- Some(contexts(mid+1))
- else None
- }
- loop(0, hi)
- }
- }
- }
-
- /** Insert a context at correct position into a buffer of context trees.
- * If the `context` has a transparent position, add it multiple times
- * at the positions of all its solid descendant trees.
- */
- def addContext(contexts: Contexts, context: Context): Unit = {
- val cpos = context.tree.pos
- if (cpos.isTransparent)
- for (t <- context.tree.children flatMap solidDescendants)
- addContext(contexts, context, t.pos)
- else
- addContext(contexts, context, cpos)
- }
-
- /** Insert a context with non-transparent position `cpos`
- * at correct position into a buffer of context trees.
- */
- def addContext(contexts: Contexts, context: Context, cpos: Position): Unit = synchronized {
- try {
- if (!cpos.isRange) {}
- else if (contexts.isEmpty) contexts += new ContextTree(cpos, context)
- else {
- val hi = contexts.length - 1
- if (contexts(hi).pos precedes cpos)
- contexts += new ContextTree(cpos, context)
- else if (contexts(hi).pos properlyIncludes cpos) // fast path w/o search
- addContext(contexts(hi).children, context, cpos)
- else if (cpos precedes contexts(0).pos)
- new ContextTree(cpos, context) +=: contexts
- else {
- def insertAt(idx: Int): Boolean = {
- val oldpos = contexts(idx).pos
- if (oldpos sameRange cpos) {
- contexts(idx) = new ContextTree(cpos, context, contexts(idx).children)
- true
- } else if (oldpos includes cpos) {
- addContext(contexts(idx).children, context, cpos)
- true
- } else if (cpos includes oldpos) {
- val start = contexts.indexWhere(cpos includes _.pos)
- val last = contexts.lastIndexWhere(cpos includes _.pos)
- contexts(start) = new ContextTree(cpos, context, contexts.slice(start, last + 1))
- contexts.remove(start + 1, last - start)
- true
- } else false
- }
- def loop(lo: Int, hi: Int) {
- if (hi - lo > 1) {
- val mid = (lo + hi) / 2
- val midpos = contexts(mid).pos
- if (cpos precedes midpos)
- loop(lo, mid)
- else if (midpos precedes cpos)
- loop(mid, hi)
- else
- addContext(contexts(mid).children, context, cpos)
- } else if (!insertAt(lo) && !insertAt(hi)) {
- val lopos = contexts(lo).pos
- val hipos = contexts(hi).pos
- if ((lopos precedes cpos) && (cpos precedes hipos))
- contexts.insert(hi, new ContextTree(cpos, context))
- else
- inform("internal error? skewed positions: "+lopos+" !< "+cpos+" !< "+hipos)
- }
- }
- loop(0, hi)
- }
- }
- } catch {
- case ex: Throwable =>
- println(ex)
- ex.printStackTrace()
- println("failure inserting "+cpos+" into "+contexts+"/"+contexts(contexts.length - 1).pos+"/"+
- (contexts(contexts.length - 1).pos includes cpos))
- throw ex
- }
- }
-}
-
diff --git a/src/compiler/scala/tools/nsc/interactive/Global.scala b/src/compiler/scala/tools/nsc/interactive/Global.scala
deleted file mode 100644
index 33b10d1a9a..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/Global.scala
+++ /dev/null
@@ -1,1139 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-
-import java.io.{ PrintWriter, StringWriter, FileReader, FileWriter }
-import scala.collection.mutable
-import mutable.{LinkedHashMap, SynchronizedMap, HashSet, SynchronizedSet}
-import scala.util.control.ControlThrowable
-import scala.tools.nsc.io.{ AbstractFile, LogReplay, Logger, NullLogger, Replayer }
-import scala.tools.nsc.util.MultiHashMap
-import scala.reflect.internal.util.{ SourceFile, BatchSourceFile, Position, NoPosition }
-import scala.tools.nsc.reporters._
-import scala.tools.nsc.symtab._
-import scala.tools.nsc.typechecker.DivergentImplicit
-import symtab.Flags.{ACCESSOR, PARAMACCESSOR}
-import scala.annotation.elidable
-import scala.language.implicitConversions
-
-/** The main class of the presentation compiler in an interactive environment such as an IDE
- */
-class Global(settings: Settings, _reporter: Reporter, projectName: String = "") extends {
- /* Is the compiler initializing? Early def, so that the field is true during the
- * execution of the super constructor.
- */
- private var initializing = true
- override val useOffsetPositions = false
-} with scala.tools.nsc.Global(settings, _reporter)
- with CompilerControl
- with ContextTrees
- with RichCompilationUnits
- with ScratchPadMaker
- with Picklers {
-
- import definitions._
-
- val debugIDE: Boolean = settings.YpresentationDebug.value
- val verboseIDE: Boolean = settings.YpresentationVerbose.value
-
- private def replayName = settings.YpresentationReplay.value
- private def logName = settings.YpresentationLog.value
- private def afterTypeDelay = settings.YpresentationDelay.value
- private final val SleepTime = 10
-
- val log =
- if (replayName != "") new Replayer(new FileReader(replayName))
- else if (logName != "") new Logger(new FileWriter(logName))
- else NullLogger
-
- import log.logreplay
- debugLog("logger: " + log.getClass + " writing to " + (new java.io.File(logName)).getAbsolutePath)
- debugLog("classpath: "+classPath)
-
- private var curTime = System.nanoTime
- private def timeStep = {
- val last = curTime
- curTime = System.nanoTime
- ", delay = " + (curTime - last) / 1000000 + "ms"
- }
-
- /** Print msg only when debugIDE is true. */
- @inline final def debugLog(msg: => String) =
- if (debugIDE) println("[%s] %s".format(projectName, msg))
-
- /** Inform with msg only when verboseIDE is true. */
- @inline final def informIDE(msg: => String) =
- if (verboseIDE) println("[%s][%s]".format(projectName, msg))
-
- override def forInteractive = true
-
- /** A map of all loaded files to the rich compilation units that correspond to them.
- */
- val unitOfFile = new LinkedHashMap[AbstractFile, RichCompilationUnit] with
- SynchronizedMap[AbstractFile, RichCompilationUnit] {
- override def put(key: AbstractFile, value: RichCompilationUnit) = {
- val r = super.put(key, value)
- if (r.isEmpty) debugLog("added unit for "+key)
- r
- }
- override def remove(key: AbstractFile) = {
- val r = super.remove(key)
- if (r.nonEmpty) debugLog("removed unit for "+key)
- r
- }
- }
-
- /** A set containing all those files that need to be removed
- * Units are removed by getUnit, typically once a unit is finished compiled.
- */
- protected val toBeRemoved: mutable.Set[AbstractFile] =
- new HashSet[AbstractFile] with SynchronizedSet[AbstractFile]
-
- /** A set containing all those files that need to be removed after a full background compiler run
- */
- protected val toBeRemovedAfterRun: mutable.Set[AbstractFile] =
- new HashSet[AbstractFile] with SynchronizedSet[AbstractFile]
-
- class ResponseMap extends MultiHashMap[SourceFile, Response[Tree]] {
- override def += (binding: (SourceFile, Set[Response[Tree]])) = {
- assert(interruptsEnabled, "delayed operation within an ask")
- super.+=(binding)
- }
- }
-
- /** A map that associates with each abstract file the set of responses that are waiting
- * (via waitLoadedTyped) for the unit associated with the abstract file to be loaded and completely typechecked.
- */
- protected val waitLoadedTypeResponses = new ResponseMap
-
- /** A map that associates with each abstract file the set of responses that ware waiting
- * (via build) for the unit associated with the abstract file to be parsed and entered
- */
- protected var getParsedEnteredResponses = new ResponseMap
-
- private def cleanResponses(rmap: ResponseMap): Unit = {
- for ((source, rs) <- rmap.toList) {
- for (r <- rs) {
- if (getUnit(source).isEmpty)
- r raise new NoSuchUnitError(source.file)
- if (r.isComplete)
- rmap(source) -= r
- }
- if (rmap(source).isEmpty)
- rmap -= source
- }
- }
-
- private def cleanAllResponses() {
- cleanResponses(waitLoadedTypeResponses)
- cleanResponses(getParsedEnteredResponses)
- }
-
- private def checkNoOutstanding(rmap: ResponseMap): Unit =
- for ((_, rs) <- rmap.toList; r <- rs) {
- debugLog("ERROR: missing response, request will be discarded")
- r raise new MissingResponse
- }
-
- def checkNoResponsesOutstanding() {
- checkNoOutstanding(waitLoadedTypeResponses)
- checkNoOutstanding(getParsedEnteredResponses)
- }
-
- /** The compilation unit corresponding to a source file
- * if it does not yet exist create a new one atomically
- * Note: We want to remove this.
- */
- protected[interactive] def getOrCreateUnitOf(source: SourceFile): RichCompilationUnit =
- unitOfFile.getOrElse(source.file, { println("precondition violated: "+source+" is not loaded"); new Exception().printStackTrace(); new RichCompilationUnit(source) })
-
- /** Work through toBeRemoved list to remove any units.
- * Then return optionally unit associated with given source.
- */
- protected[interactive] def getUnit(s: SourceFile): Option[RichCompilationUnit] = {
- toBeRemoved.synchronized {
- for (f <- toBeRemoved) {
- informIDE("removed: "+s)
- unitOfFile -= f
- allSources = allSources filter (_.file != f)
- }
- toBeRemoved.clear()
- }
- unitOfFile get s.file
- }
-
- /** A list giving all files to be typechecked in the order they should be checked.
- */
- protected var allSources: List[SourceFile] = List()
-
- private var lastException: Option[Throwable] = None
-
- /** A list of files that crashed the compiler. They will be ignored during background
- * compilation until they are removed from this list.
- */
- private var ignoredFiles: Set[AbstractFile] = Set()
-
- /** Flush the buffer of sources that are ignored during background compilation. */
- def clearIgnoredFiles() {
- ignoredFiles = Set()
- }
-
- /** Remove a crashed file from the ignore buffer. Background compilation will take it into account
- * and errors will be reported against it. */
- def enableIgnoredFile(file: AbstractFile) {
- ignoredFiles -= file
- debugLog("Removed crashed file %s. Still in the ignored buffer: %s".format(file, ignoredFiles))
- }
-
- /** The currently active typer run */
- private var currentTyperRun: TyperRun = _
- newTyperRun()
-
- /** Is a background compiler run needed?
- * Note: outOfDate is true as long as there is a background compile scheduled or going on.
- */
- private var outOfDate = false
-
- def isOutOfDate: Boolean = outOfDate
-
- def demandNewCompilerRun() = {
- if (outOfDate) throw new FreshRunReq // cancel background compile
- else outOfDate = true // proceed normally and enable new background compile
- }
-
- protected[interactive] var minRunId = 1
-
- private[interactive] var interruptsEnabled = true
-
- private val NoResponse: Response[_] = new Response[Any]
-
- /** The response that is currently pending, i.e. the compiler
- * is working on providing an asnwer for it.
- */
- private var pendingResponse: Response[_] = NoResponse
-
- // ----------- Overriding hooks in nsc.Global -----------------------
-
- /** Called from parser, which signals hereby that a method definition has been parsed.
- */
- override def signalParseProgress(pos: Position) {
- // We only want to be interruptible when running on the PC thread.
- if(onCompilerThread) {
- checkForMoreWork(pos)
- }
- }
-
- /** Called from typechecker, which signals hereby that a node has been completely typechecked.
- * If the node includes unit.targetPos, abandons run and returns newly attributed tree.
- * Otherwise, if there's some higher priority work to be done, also abandons run with a FreshRunReq.
- * @param context The context that typechecked the node
- * @param old The original node
- * @param result The transformed node
- */
- override def signalDone(context: Context, old: Tree, result: Tree) {
- if (interruptsEnabled && analyzer.lockedCount == 0) {
- if (context.unit.exists &&
- result.pos.isOpaqueRange &&
- (result.pos includes context.unit.targetPos)) {
- var located = new TypedLocator(context.unit.targetPos) locateIn result
- if (located == EmptyTree) {
- println("something's wrong: no "+context.unit+" in "+result+result.pos)
- located = result
- }
- throw new TyperResult(located)
- }
- try {
- checkForMoreWork(old.pos)
- } catch {
- case ex: ValidateException => // Ignore, this will have been reported elsewhere
- debugLog("validate exception caught: "+ex)
- case ex: Throwable =>
- log.flush()
- throw ex
- }
- }
- }
-
- /** Called from typechecker every time a context is created.
- * Registers the context in a context tree
- */
- override def registerContext(c: Context) = c.unit match {
- case u: RichCompilationUnit => addContext(u.contexts, c)
- case _ =>
- }
-
- /** The top level classes and objects currently seen in the presentation compiler
- */
- private val currentTopLevelSyms = new mutable.LinkedHashSet[Symbol]
-
- /** The top level classes and objects no longer seen in the presentation compiler
- */
- val deletedTopLevelSyms = new mutable.LinkedHashSet[Symbol] with mutable.SynchronizedSet[Symbol]
-
- /** Called from typechecker every time a top-level class or object is entered.
- */
- override def registerTopLevelSym(sym: Symbol) { currentTopLevelSyms += sym }
-
- /** Symbol loaders in the IDE parse all source files loaded from a package for
- * top-level idents. Therefore, we can detect top-level symbols that have a name
- * different from their source file
- */
- override lazy val loaders = new BrowsingLoaders {
- val global: Global.this.type = Global.this
- }
-
- // ----------------- Polling ---------------------------------------
-
- case class WorkEvent(atNode: Int, atMillis: Long)
-
- private var moreWorkAtNode: Int = -1
- private var nodesSeen = 0
- private var lastWasReload = false
-
- /** The number of pollForWorks after which the presentation compiler yields.
- * Yielding improves responsiveness on systems with few cores because it
- * gives the UI thread a chance to get new tasks and interrupt the presentation
- * compiler with them.
- */
- private final val yieldPeriod = 10
-
- /** Called from runner thread and signalDone:
- * Poll for interrupts and execute them immediately.
- * Then, poll for exceptions and execute them.
- * Then, poll for work reload/typedTreeAt/doFirst commands during background checking.
- * @param pos The position of the tree if polling while typechecking, NoPosition otherwise
- *
- */
- private[interactive] def pollForWork(pos: Position) {
- if (!interruptsEnabled) return
- if (pos == NoPosition || nodesSeen % yieldPeriod == 0)
- Thread.`yield`()
-
- def nodeWithWork(): Option[WorkEvent] =
- if (scheduler.moreWork || pendingResponse.isCancelled) Some(new WorkEvent(nodesSeen, System.currentTimeMillis))
- else None
-
- nodesSeen += 1
- logreplay("atnode", nodeWithWork()) match {
- case Some(WorkEvent(id, _)) =>
- debugLog("some work at node "+id+" current = "+nodesSeen)
-// assert(id >= nodesSeen)
- moreWorkAtNode = id
- case None =>
- }
-
- if (nodesSeen >= moreWorkAtNode) {
-
- logreplay("asked", scheduler.pollInterrupt()) match {
- case Some(ir) =>
- try {
- interruptsEnabled = false
- debugLog("ask started"+timeStep)
- ir.execute()
- } finally {
- debugLog("ask finished"+timeStep)
- interruptsEnabled = true
- }
- pollForWork(pos)
- case _ =>
- }
-
- if (logreplay("cancelled", pendingResponse.isCancelled)) {
- throw CancelException
- }
-
- logreplay("exception thrown", scheduler.pollThrowable()) match {
- case Some(ex: FreshRunReq) =>
- newTyperRun()
- minRunId = currentRunId
- demandNewCompilerRun()
-
- case Some(ShutdownReq) =>
- scheduler.synchronized { // lock the work queue so no more items are posted while we clean it up
- val units = scheduler.dequeueAll {
- case item: WorkItem => Some(item.raiseMissing())
- case _ => Some(())
- }
-
- // don't forget to service interrupt requests
- scheduler.dequeueAllInterrupts(_.execute())
-
- debugLog("ShutdownReq: cleaning work queue (%d items)".format(units.size))
- debugLog("Cleanup up responses (%d loadedType pending, %d parsedEntered pending)"
- .format(waitLoadedTypeResponses.size, getParsedEnteredResponses.size))
- checkNoResponsesOutstanding()
-
- log.flush()
- scheduler = new NoWorkScheduler
- throw ShutdownReq
- }
-
- case Some(ex: Throwable) => log.flush(); throw ex
- case _ =>
- }
-
- lastWasReload = false
-
- logreplay("workitem", scheduler.nextWorkItem()) match {
- case Some(action) =>
- try {
- debugLog("picked up work item at "+pos+": "+action+timeStep)
- action()
- debugLog("done with work item: "+action)
- } finally {
- debugLog("quitting work item: "+action+timeStep)
- }
- case None =>
- }
- }
- }
-
- protected def checkForMoreWork(pos: Position) {
- val typerRun = currentTyperRun
- pollForWork(pos)
- if (typerRun != currentTyperRun) demandNewCompilerRun()
- }
-
- // ----------------- The Background Runner Thread -----------------------
-
- private var threadId = 0
-
- /** The current presentation compiler runner */
- @volatile private[interactive] var compileRunner: Thread = newRunnerThread()
-
- /** Check that the currenyly executing thread is the presentation compiler thread.
- *
- * Compiler initialization may happen on a different thread (signalled by globalPhase being NoPhase)
- */
- @elidable(elidable.WARNING)
- override def assertCorrectThread() {
- assert(initializing || onCompilerThread,
- "Race condition detected: You are running a presentation compiler method outside the PC thread.[phase: %s]".format(globalPhase) +
- " Please file a ticket with the current stack trace at https://www.assembla.com/spaces/scala-ide/support/tickets")
- }
-
- /** Create a new presentation compiler runner.
- */
- private def newRunnerThread(): Thread = {
- threadId += 1
- compileRunner = new PresentationCompilerThread(this, projectName)
- compileRunner.setDaemon(true)
- compileRunner.start()
- compileRunner
- }
-
- private def ensureUpToDate(unit: RichCompilationUnit) =
- if (!unit.isUpToDate && unit.status != JustParsed) reset(unit) // reparse previously typechecked units.
-
- /** Compile all loaded source files in the order given by `allSources`.
- */
- private[interactive] final def backgroundCompile() {
- informIDE("Starting new presentation compiler type checking pass")
- reporter.reset()
-
- // remove any files in first that are no longer maintained by presentation compiler (i.e. closed)
- allSources = allSources filter (s => unitOfFile contains (s.file))
-
- // ensure all loaded units are parsed
- for (s <- allSources; unit <- getUnit(s)) {
- // checkForMoreWork(NoPosition) // disabled, as any work done here would be in an inconsistent state
- ensureUpToDate(unit)
- parseAndEnter(unit)
- serviceParsedEntered()
- }
-
- // sleep window
- if (afterTypeDelay > 0 && lastWasReload) {
- val limit = System.currentTimeMillis() + afterTypeDelay
- while (System.currentTimeMillis() < limit) {
- Thread.sleep(SleepTime)
- checkForMoreWork(NoPosition)
- }
- }
-
- // ensure all loaded units are typechecked
- for (s <- allSources; if !ignoredFiles(s.file); unit <- getUnit(s)) {
- try {
- if (!unit.isUpToDate)
- if (unit.problems.isEmpty || !settings.YpresentationStrict.value)
- typeCheck(unit)
- else debugLog("%s has syntax errors. Skipped typechecking".format(unit))
- else debugLog("already up to date: "+unit)
- for (r <- waitLoadedTypeResponses(unit.source))
- r set unit.body
- serviceParsedEntered()
- } catch {
- case ex: FreshRunReq => throw ex // propagate a new run request
- case ShutdownReq => throw ShutdownReq // propagate a shutdown request
- case ex: ControlThrowable => throw ex
- case ex: Throwable =>
- println("[%s]: exception during background compile: ".format(unit.source) + ex)
- ex.printStackTrace()
- for (r <- waitLoadedTypeResponses(unit.source)) {
- r.raise(ex)
- }
- serviceParsedEntered()
-
- lastException = Some(ex)
- ignoredFiles += unit.source.file
- println("[%s] marking unit as crashed (crashedFiles: %s)".format(unit, ignoredFiles))
-
- reporter.error(unit.body.pos, "Presentation compiler crashed while type checking this file: %s".format(ex.toString()))
- }
- }
-
- // move units removable after this run to the "to-be-removed" buffer
- toBeRemoved ++= toBeRemovedAfterRun
-
- // clean out stale waiting responses
- cleanAllResponses()
-
- // wind down
- if (waitLoadedTypeResponses.nonEmpty || getParsedEnteredResponses.nonEmpty) {
- // need another cycle to treat those
- newTyperRun()
- backgroundCompile()
- } else {
- outOfDate = false
- informIDE("Everything is now up to date")
- }
- }
-
- /** Service all pending getParsedEntered requests
- */
- private def serviceParsedEntered() {
- var atOldRun = true
- for ((source, rs) <- getParsedEnteredResponses; r <- rs) {
- if (atOldRun) { newTyperRun(); atOldRun = false }
- getParsedEnteredNow(source, r)
- }
- getParsedEnteredResponses.clear()
- }
-
- /** Reset unit to unloaded state */
- private def reset(unit: RichCompilationUnit): Unit = {
- unit.depends.clear()
- unit.defined.clear()
- unit.synthetics.clear()
- unit.toCheck.clear()
- unit.checkedFeatures = Set()
- unit.targetPos = NoPosition
- unit.contexts.clear()
- unit.problems.clear()
- unit.body = EmptyTree
- unit.status = NotLoaded
- }
-
- /** Parse unit and create a name index, unless this has already been done before */
- private def parseAndEnter(unit: RichCompilationUnit): Unit =
- if (unit.status == NotLoaded) {
- debugLog("parsing: "+unit)
- currentTyperRun.compileLate(unit)
- if (debugIDE && !reporter.hasErrors) validatePositions(unit.body)
- if (!unit.isJava) syncTopLevelSyms(unit)
- unit.status = JustParsed
- }
-
- /** Make sure unit is typechecked
- */
- private def typeCheck(unit: RichCompilationUnit) {
- debugLog("type checking: "+unit)
- parseAndEnter(unit)
- unit.status = PartiallyChecked
- currentTyperRun.typeCheck(unit)
- unit.lastBody = unit.body
- unit.status = currentRunId
- }
-
- /** Update deleted and current top-level symbols sets */
- def syncTopLevelSyms(unit: RichCompilationUnit) {
- val deleted = currentTopLevelSyms filter { sym =>
- /** We sync after namer phase and it resets all the top-level symbols
- * that survive the new parsing
- * round to NoPeriod.
- */
- sym.sourceFile == unit.source.file &&
- sym.validTo != NoPeriod &&
- runId(sym.validTo) < currentRunId
- }
- for (d <- deleted) {
- d.owner.info.decls unlink d
- deletedTopLevelSyms += d
- currentTopLevelSyms -= d
- }
- }
-
- /** Move list of files to front of allSources */
- def moveToFront(fs: List[SourceFile]) {
- allSources = fs ::: (allSources diff fs)
- }
-
- // ----------------- Implementations of client commands -----------------------
-
- def respond[T](result: Response[T])(op: => T): Unit =
- respondGradually(result)(Stream(op))
-
- def respondGradually[T](response: Response[T])(op: => Stream[T]): Unit = {
- val prevResponse = pendingResponse
- try {
- pendingResponse = response
- if (!response.isCancelled) {
- var results = op
- while (!response.isCancelled && results.nonEmpty) {
- val result = results.head
- results = results.tail
- if (results.isEmpty) {
- response set result
- debugLog("responded"+timeStep)
- } else response setProvisionally result
- }
- }
- } catch {
- case CancelException =>
- debugLog("cancelled")
- case ex: FreshRunReq =>
- if (debugIDE) {
- println("FreshRunReq thrown during response")
- ex.printStackTrace()
- }
- response raise ex
- throw ex
-
- case ex @ ShutdownReq =>
- if (debugIDE) {
- println("ShutdownReq thrown during response")
- ex.printStackTrace()
- }
- response raise ex
- throw ex
-
- case ex: Throwable =>
- if (debugIDE) {
- println("exception thrown during response: "+ex)
- ex.printStackTrace()
- }
- response raise ex
- } finally {
- pendingResponse = prevResponse
- }
- }
-
- private def reloadSource(source: SourceFile) {
- val unit = new RichCompilationUnit(source)
- unitOfFile(source.file) = unit
- toBeRemoved -= source.file
- toBeRemovedAfterRun -= source.file
- reset(unit)
- //parseAndEnter(unit)
- }
-
- /** Make sure a set of compilation units is loaded and parsed */
- private def reloadSources(sources: List[SourceFile]) {
- newTyperRun()
- minRunId = currentRunId
- sources foreach reloadSource
- moveToFront(sources)
- }
-
- /** Make sure a set of compilation units is loaded and parsed */
- private[interactive] def reload(sources: List[SourceFile], response: Response[Unit]) {
- informIDE("reload: " + sources)
- lastWasReload = true
- respond(response)(reloadSources(sources))
- demandNewCompilerRun()
- }
-
- private[interactive] def filesDeleted(sources: List[SourceFile], response: Response[Unit]) {
- informIDE("files deleted: " + sources)
- val deletedFiles = sources.map(_.file).toSet
- val deletedSyms = currentTopLevelSyms filter {sym => deletedFiles contains sym.sourceFile}
- for (d <- deletedSyms) {
- d.owner.info.decls unlink d
- deletedTopLevelSyms += d
- currentTopLevelSyms -= d
- }
- sources foreach (removeUnitOf(_))
- minRunId = currentRunId
- respond(response)(())
- demandNewCompilerRun()
- }
-
- /** Arrange for unit to be removed after run, to give a chance to typecheck the unit fully.
- * If we do just removeUnit, some problems with default parameters can ensue.
- * Calls to this method could probably be replaced by removeUnit once default parameters are handled more robustly.
- */
- private def afterRunRemoveUnitsOf(sources: List[SourceFile]) {
- toBeRemovedAfterRun ++= sources map (_.file)
- }
-
- /** A fully attributed tree located at position `pos` */
- private def typedTreeAt(pos: Position): Tree = getUnit(pos.source) match {
- case None =>
- reloadSources(List(pos.source))
- try typedTreeAt(pos)
- finally afterRunRemoveUnitsOf(List(pos.source))
- case Some(unit) =>
- informIDE("typedTreeAt " + pos)
- parseAndEnter(unit)
- val tree = locateTree(pos)
- debugLog("at pos "+pos+" was found: "+tree.getClass+" "+tree.pos.show)
- tree match {
- case Import(expr, _) =>
- debugLog("import found"+expr.tpe+(if (expr.tpe == null) "" else " "+expr.tpe.members))
- case _ =>
- }
- if (stabilizedType(tree) ne null) {
- debugLog("already attributed: "+tree.symbol+" "+tree.tpe)
- tree
- } else {
- unit.targetPos = pos
- try {
- debugLog("starting targeted type check")
- typeCheck(unit)
-// println("tree not found at "+pos)
- EmptyTree
- } catch {
- case ex: TyperResult => new Locator(pos) locateIn ex.tree
- } finally {
- unit.targetPos = NoPosition
- }
- }
- }
-
- /** A fully attributed tree corresponding to the entire compilation unit */
- private[interactive] def typedTree(source: SourceFile, forceReload: Boolean): Tree = {
- informIDE("typedTree " + source + " forceReload: " + forceReload)
- val unit = getOrCreateUnitOf(source)
- if (forceReload) reset(unit)
- parseAndEnter(unit)
- if (unit.status <= PartiallyChecked) typeCheck(unit)
- unit.body
- }
-
- /** Set sync var `response` to a fully attributed tree located at position `pos` */
- private[interactive] def getTypedTreeAt(pos: Position, response: Response[Tree]) {
- respond(response)(typedTreeAt(pos))
- }
-
- /** Set sync var `response` to a fully attributed tree corresponding to the
- * entire compilation unit */
- private[interactive] def getTypedTree(source: SourceFile, forceReload: Boolean, response: Response[Tree]) {
- respond(response)(typedTree(source, forceReload))
- }
-
- private def withTempUnits[T](sources: List[SourceFile])(f: (SourceFile => RichCompilationUnit) => T): T = {
- val unitOfSrc: SourceFile => RichCompilationUnit = src => unitOfFile(src.file)
- sources filterNot (getUnit(_).isDefined) match {
- case Nil =>
- f(unitOfSrc)
- case unknown =>
- reloadSources(unknown)
- try {
- f(unitOfSrc)
- } finally
- afterRunRemoveUnitsOf(unknown)
- }
- }
-
- private def withTempUnit[T](source: SourceFile)(f: RichCompilationUnit => T): T =
- withTempUnits(List(source)){ srcToUnit =>
- f(srcToUnit(source))
- }
-
- /** Find a 'mirror' of symbol `sym` in unit `unit`. Pre: `unit is loaded. */
- private def findMirrorSymbol(sym: Symbol, unit: RichCompilationUnit): Symbol = {
- val originalTypeParams = sym.owner.typeParams
- ensureUpToDate(unit)
- parseAndEnter(unit)
- val pre = adaptToNewRunMap(ThisType(sym.owner))
- val rawsym = pre.typeSymbol.info.decl(sym.name)
- val newsym = rawsym filter { alt =>
- sym.isType || {
- try {
- val tp1 = pre.memberType(alt) onTypeError NoType
- val tp2 = adaptToNewRunMap(sym.tpe) substSym (originalTypeParams, sym.owner.typeParams)
- matchesType(tp1, tp2, alwaysMatchSimple = false) || {
- debugLog(s"findMirrorSymbol matchesType($tp1, $tp2) failed")
- val tp3 = adaptToNewRunMap(sym.tpe) substSym (originalTypeParams, alt.owner.typeParams)
- matchesType(tp1, tp3, alwaysMatchSimple = false) || {
- debugLog(s"findMirrorSymbol fallback matchesType($tp1, $tp3) failed")
- false
- }
- }
- }
- catch {
- case ex: ControlThrowable => throw ex
- case ex: Throwable =>
- debugLog("error in findMirrorSymbol: " + ex)
- ex.printStackTrace()
- false
- }
- }
- }
- if (newsym == NoSymbol) {
- if (rawsym.exists && !rawsym.isOverloaded) rawsym
- else {
- debugLog("mirror not found " + sym + " " + unit.source + " " + pre)
- NoSymbol
- }
- } else if (newsym.isOverloaded) {
- settings.uniqid.value = true
- debugLog("mirror ambiguous " + sym + " " + unit.source + " " + pre + " " + newsym.alternatives)
- NoSymbol
- } else {
- debugLog("mirror found for " + newsym + ": " + newsym.pos)
- newsym
- }
- }
-
- /** Implements CompilerControl.askLinkPos */
- private[interactive] def getLinkPos(sym: Symbol, source: SourceFile, response: Response[Position]) {
- informIDE("getLinkPos "+sym+" "+source)
- respond(response) {
- if (sym.owner.isClass) {
- withTempUnit(source){ u =>
- findMirrorSymbol(sym, u).pos
- }
- } else {
- debugLog("link not in class "+sym+" "+source+" "+sym.owner)
- NoPosition
- }
- }
- }
-
- private def forceDocComment(sym: Symbol, unit: RichCompilationUnit) {
- unit.body foreachPartial {
- case DocDef(comment, defn) if defn.symbol == sym =>
- fillDocComment(defn.symbol, comment)
- EmptyTree
- case _: ValOrDefDef =>
- EmptyTree
- }
- }
-
- /** Implements CompilerControl.askDocComment */
- private[interactive] def getDocComment(sym: Symbol, source: SourceFile, site: Symbol, fragments: List[(Symbol,SourceFile)],
- response: Response[(String, String, Position)]) {
- informIDE(s"getDocComment $sym at $source site $site")
- respond(response) {
- withTempUnits(fragments.toList.unzip._2){ units =>
- for((sym, src) <- fragments) {
- val mirror = findMirrorSymbol(sym, units(src))
- if (mirror ne NoSymbol) forceDocComment(mirror, units(src))
- }
- val mirror = findMirrorSymbol(sym, units(source))
- if (mirror eq NoSymbol)
- ("", "", NoPosition)
- else {
- (expandedDocComment(mirror, site), rawDocComment(mirror), docCommentPos(mirror))
- }
- }
- }
- }
-
- def stabilizedType(tree: Tree): Type = tree match {
- case Ident(_) if tree.symbol.isStable =>
- singleType(NoPrefix, tree.symbol)
- case Select(qual, _) if qual.tpe != null && tree.symbol.isStable =>
- singleType(qual.tpe, tree.symbol)
- case Import(expr, selectors) =>
- tree.symbol.info match {
- case analyzer.ImportType(expr) => expr match {
- case s@Select(qual, name) => singleType(qual.tpe, s.symbol)
- case i : Ident => i.tpe
- case _ => tree.tpe
- }
- case _ => tree.tpe
- }
-
- case _ => tree.tpe
- }
-
- import analyzer.{SearchResult, ImplicitSearch}
-
- private[interactive] def getScopeCompletion(pos: Position, response: Response[List[Member]]) {
- informIDE("getScopeCompletion" + pos)
- respond(response) { scopeMembers(pos) }
- }
-
- private class Members[M <: Member] extends LinkedHashMap[Name, Set[M]] {
- override def default(key: Name) = Set()
-
- private def matching(sym: Symbol, symtpe: Type, ms: Set[M]): Option[M] = ms.find { m =>
- (m.sym.name == sym.name) && (m.sym.isType || (m.tpe matches symtpe))
- }
-
- private def keepSecond(m: M, sym: Symbol, implicitlyAdded: Boolean): Boolean =
- m.sym.hasFlag(ACCESSOR | PARAMACCESSOR) &&
- !sym.hasFlag(ACCESSOR | PARAMACCESSOR) &&
- (!implicitlyAdded || m.implicitlyAdded)
-
- def add(sym: Symbol, pre: Type, implicitlyAdded: Boolean)(toMember: (Symbol, Type) => M) {
- if ((sym.isGetter || sym.isSetter) && sym.accessed != NoSymbol) {
- add(sym.accessed, pre, implicitlyAdded)(toMember)
- } else if (!sym.name.decodedName.containsName("$") && !sym.isSynthetic && sym.hasRawInfo) {
- val symtpe = pre.memberType(sym) onTypeError ErrorType
- matching(sym, symtpe, this(sym.name)) match {
- case Some(m) =>
- if (keepSecond(m, sym, implicitlyAdded)) {
- //print(" -+ "+sym.name)
- this(sym.name) = this(sym.name) - m + toMember(sym, symtpe)
- }
- case None =>
- //print(" + "+sym.name)
- this(sym.name) = this(sym.name) + toMember(sym, symtpe)
- }
- }
- }
-
- def addNonShadowed(other: Members[M]) = {
- for ((name, ms) <- other)
- if (ms.nonEmpty && this(name).isEmpty) this(name) = ms
- }
-
- def allMembers: List[M] = values.toList.flatten
- }
-
- /** Return all members visible without prefix in context enclosing `pos`. */
- private def scopeMembers(pos: Position): List[ScopeMember] = {
- typedTreeAt(pos) // to make sure context is entered
- val context = doLocateContext(pos)
- val locals = new Members[ScopeMember]
- val enclosing = new Members[ScopeMember]
- def addScopeMember(sym: Symbol, pre: Type, viaImport: Tree) =
- locals.add(sym, pre, implicitlyAdded = false) { (s, st) =>
- new ScopeMember(s, st, context.isAccessible(s, pre, superAccess = false), viaImport)
- }
- def localsToEnclosing() = {
- enclosing.addNonShadowed(locals)
- locals.clear()
- }
- //print("add scope members")
- var cx = context
- while (cx != NoContext) {
- for (sym <- cx.scope)
- addScopeMember(sym, NoPrefix, EmptyTree)
- localsToEnclosing()
- if (cx == cx.enclClass) {
- val pre = cx.prefix
- for (sym <- pre.members)
- addScopeMember(sym, pre, EmptyTree)
- localsToEnclosing()
- }
- cx = cx.outer
- }
- //print("\nadd imported members")
- for (imp <- context.imports) {
- val pre = imp.qual.tpe
- for (sym <- imp.allImportedSymbols)
- addScopeMember(sym, pre, imp.qual)
- localsToEnclosing()
- }
- // println()
- val result = enclosing.allMembers
-// if (debugIDE) for (m <- result) println(m)
- result
- }
-
- private[interactive] def getTypeCompletion(pos: Position, response: Response[List[Member]]) {
- informIDE("getTypeCompletion " + pos)
- respondGradually(response) { typeMembers(pos) }
- //if (debugIDE) typeMembers(pos)
- }
-
- private def typeMembers(pos: Position): Stream[List[TypeMember]] = {
- var tree = typedTreeAt(pos)
-
- // if tree consists of just x. or x.fo where fo is not yet a full member name
- // ignore the selection and look in just x.
- tree match {
- case Select(qual, name) if tree.tpe == ErrorType => tree = qual
- case _ =>
- }
-
- val context = doLocateContext(pos)
-
- if (tree.tpe == null)
- // TODO: guard with try/catch to deal with ill-typed qualifiers.
- tree = analyzer.newTyper(context).typedQualifier(tree)
-
- debugLog("typeMembers at "+tree+" "+tree.tpe)
-
- val superAccess = tree.isInstanceOf[Super]
- val members = new Members[TypeMember]
-
- def addTypeMember(sym: Symbol, pre: Type, inherited: Boolean, viaView: Symbol) = {
- val implicitlyAdded = viaView != NoSymbol
- members.add(sym, pre, implicitlyAdded) { (s, st) =>
- new TypeMember(s, st,
- context.isAccessible(if (s.hasGetter) s.getter(s.owner) else s, pre, superAccess && !implicitlyAdded),
- inherited,
- viaView)
- }
- }
-
- /** Create a function application of a given view function to `tree` and typechecked it.
- */
- def viewApply(view: SearchResult): Tree = {
- assert(view.tree != EmptyTree)
- analyzer.newTyper(context.makeImplicit(reportAmbiguousErrors = false))
- .typed(Apply(view.tree, List(tree)) setPos tree.pos)
- .onTypeError(EmptyTree)
- }
-
- val pre = stabilizedType(tree)
-
- val ownerTpe = tree.tpe match {
- case analyzer.ImportType(expr) => expr.tpe
- case null => pre
- case MethodType(List(), rtpe) => rtpe
- case _ => tree.tpe
- }
-
- //print("add members")
- for (sym <- ownerTpe.members)
- addTypeMember(sym, pre, sym.owner != ownerTpe.typeSymbol, NoSymbol)
- members.allMembers #:: {
- //print("\nadd enrichment")
- val applicableViews: List[SearchResult] =
- if (ownerTpe.isErroneous) List()
- else new ImplicitSearch(
- tree, functionType(List(ownerTpe), AnyClass.tpe), isView = true,
- context0 = context.makeImplicit(reportAmbiguousErrors = false)).allImplicits
- for (view <- applicableViews) {
- val vtree = viewApply(view)
- val vpre = stabilizedType(vtree)
- for (sym <- vtree.tpe.members) {
- addTypeMember(sym, vpre, inherited = false, view.tree.symbol)
- }
- }
- //println()
- Stream(members.allMembers)
- }
- }
-
- /** Implements CompilerControl.askLoadedTyped */
- private[interactive] def waitLoadedTyped(source: SourceFile, response: Response[Tree], onSameThread: Boolean = true) {
- getUnit(source) match {
- case Some(unit) =>
- if (unit.isUpToDate) {
- debugLog("already typed")
- response set unit.body
- } else if (ignoredFiles(source.file)) {
- response.raise(lastException.getOrElse(CancelException))
- } else if (onSameThread) {
- getTypedTree(source, forceReload = false, response)
- } else {
- debugLog("wait for later")
- outOfDate = true
- waitLoadedTypeResponses(source) += response
- }
- case None =>
- debugLog("load unit and type")
- try reloadSources(List(source))
- finally waitLoadedTyped(source, response, onSameThread)
- }
- }
-
- /** Implements CompilerControl.askParsedEntered */
- private[interactive] def getParsedEntered(source: SourceFile, keepLoaded: Boolean, response: Response[Tree], onSameThread: Boolean = true) {
- getUnit(source) match {
- case Some(unit) =>
- getParsedEnteredNow(source, response)
- case None =>
- try {
- if (keepLoaded || outOfDate && onSameThread)
- reloadSources(List(source))
- } finally {
- if (keepLoaded || !outOfDate || onSameThread)
- getParsedEnteredNow(source, response)
- else
- getParsedEnteredResponses(source) += response
- }
- }
- }
-
- /** Parses and enters given source file, stroring parse tree in response */
- private def getParsedEnteredNow(source: SourceFile, response: Response[Tree]) {
- respond(response) {
- onUnitOf(source) { unit =>
- parseAndEnter(unit)
- unit.body
- }
- }
- }
-
- @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0")
- def getInstrumented(source: SourceFile, line: Int, response: Response[(String, Array[Char])]) {
- try {
- interruptsEnabled = false
- respond(response) {
- instrument(source, line)
- }
- } finally {
- interruptsEnabled = true
- }
- }
-
- // ---------------- Helper classes ---------------------------
-
- /** The typer run */
- class TyperRun extends Run {
- // units is always empty
-
- /** canRedefine is used to detect double declarations of classes and objects
- * in multiple source files.
- * Since the IDE rechecks units several times in the same run, these tests
- * are disabled by always returning true here.
- */
- override def canRedefine(sym: Symbol) = true
-
- def typeCheck(unit: CompilationUnit): Unit = {
- applyPhase(typerPhase, unit)
- }
-
- /** Apply a phase to a compilation unit
- * @return true iff typechecked correctly
- */
- private def applyPhase(phase: Phase, unit: CompilationUnit) {
- enteringPhase(phase) { phase.asInstanceOf[GlobalPhase] applyPhase unit }
- }
- }
-
- def newTyperRun() {
- currentTyperRun = new TyperRun
- }
-
- class TyperResult(val tree: Tree) extends ControlThrowable
-
- assert(globalPhase.id == 0)
-
- implicit def addOnTypeError[T](x: => T): OnTypeError[T] = new OnTypeError(x)
-
- // OnTypeError should still catch TypeError because of cyclic references,
- // but DivergentImplicit shouldn't leak anymore here
- class OnTypeError[T](op: => T) {
- def onTypeError(alt: => T) = try {
- op
- } catch {
- case ex: TypeError =>
- debugLog("type error caught: "+ex)
- alt
- case ex: DivergentImplicit =>
- debugLog("divergent implicit caught: "+ex)
- alt
- }
- }
-
- /** The compiler has been initialized. Constructors are evaluated in textual order,
- * so this is set to true only after all super constructors and the primary constructor
- * have been executed.
- */
- initializing = false
-}
-
-object CancelException extends Exception
-
diff --git a/src/compiler/scala/tools/nsc/interactive/InteractiveReporter.scala b/src/compiler/scala/tools/nsc/interactive/InteractiveReporter.scala
deleted file mode 100644
index 013b152e96..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/InteractiveReporter.scala
+++ /dev/null
@@ -1,47 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-
-import scala.collection.mutable.ArrayBuffer
-import scala.reflect.internal.util.Position
-import reporters.Reporter
-
-case class Problem(pos: Position, msg: String, severityLevel: Int)
-
-abstract class InteractiveReporter extends Reporter {
-
- def compiler: Global
-
- val otherProblems = new ArrayBuffer[Problem]
-
- override def info0(pos: Position, msg: String, severity: Severity, force: Boolean): Unit = try {
- severity.count += 1
- val problems =
- if (compiler eq null) {
- otherProblems
- } else if (pos.isDefined) {
- compiler.getUnit(pos.source) match {
- case Some(unit) =>
- compiler.debugLog(pos.source.file.name + ":" + pos.line + ": " + msg)
- unit.problems
- case None =>
- compiler.debugLog(pos.source.file.name + "[not loaded] :" + pos.line + ": " + msg)
- otherProblems
- }
- } else {
- compiler.debugLog("[no position] :" + msg)
- otherProblems
- }
- problems += Problem(pos, msg, severity.id)
- } catch {
- case ex: UnsupportedOperationException =>
- }
-
- override def reset() {
- super.reset()
- otherProblems.clear()
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/Picklers.scala b/src/compiler/scala/tools/nsc/interactive/Picklers.scala
deleted file mode 100644
index b184afd0f5..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/Picklers.scala
+++ /dev/null
@@ -1,189 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-
-import util.InterruptReq
-import scala.reflect.internal.util.{ SourceFile, BatchSourceFile }
-import io.{ AbstractFile, PlainFile, Pickler, CondPickler }
-import util.EmptyAction
-import scala.reflect.internal.util.{ RangePosition, OffsetPosition, TransparentPosition }
-import io.Pickler._
-import scala.collection.mutable
-import mutable.ListBuffer
-
-trait Picklers { self: Global =>
-
- lazy val freshRunReq =
- unitPickler
- .wrapped { _ => new FreshRunReq } { x => () }
- .labelled ("FreshRunReq")
- .cond (_.isInstanceOf[FreshRunReq])
-
- lazy val shutdownReq = singletonPickler(ShutdownReq)
-
- def defaultThrowable[T <: Throwable]: CondPickler[T] = javaInstancePickler[T] cond { _ => true }
-
- implicit lazy val throwable: Pickler[Throwable] =
- freshRunReq | shutdownReq | defaultThrowable
-
- implicit def abstractFile: Pickler[AbstractFile] =
- pkl[String]
- .wrapped[AbstractFile] { new PlainFile(_) } { _.path }
- .asClass (classOf[PlainFile])
-
- private val sourceFilesSeen = new mutable.HashMap[AbstractFile, Array[Char]] {
- override def default(key: AbstractFile) = Array()
- }
-
- type Diff = (Int /*start*/, Int /*end*/, String /*replacement*/)
-
- def delta(f: AbstractFile, cs: Array[Char]): Diff = {
- val bs = sourceFilesSeen(f)
- var start = 0
- while (start < bs.length && start < cs.length && bs(start) == cs(start)) start += 1
- var end = bs.length
- var end2 = cs.length
- while (end > start && end2 > start && bs(end - 1) == cs(end2 - 1)) { end -= 1; end2 -= 1 }
- sourceFilesSeen(f) = cs
- (start, end, cs.slice(start, end2).mkString(""))
- }
-
- def patch(f: AbstractFile, d: Diff): Array[Char] = {
- val (start, end, replacement) = d
- val patched = sourceFilesSeen(f).patch(start, replacement, end - start)
- sourceFilesSeen(f) = patched
- patched
- }
-
- implicit lazy val sourceFile: Pickler[SourceFile] =
- (pkl[AbstractFile] ~ pkl[Diff]).wrapped[SourceFile] {
- case f ~ d => new BatchSourceFile(f, patch(f, d))
- } {
- f => f.file ~ delta(f.file, f.content)
- }.asClass (classOf[BatchSourceFile])
-
- lazy val offsetPosition: CondPickler[OffsetPosition] =
- (pkl[SourceFile] ~ pkl[Int])
- .wrapped { case x ~ y => new OffsetPosition(x, y) } { p => p.source ~ p.point }
- .asClass (classOf[OffsetPosition])
-
- lazy val rangePosition: CondPickler[RangePosition] =
- (pkl[SourceFile] ~ pkl[Int] ~ pkl[Int] ~ pkl[Int])
- .wrapped { case source ~ start ~ point ~ end => new RangePosition(source, start, point, end) } { p => p.source ~ p.start ~ p.point ~ p.end }
- .asClass (classOf[RangePosition])
-
- lazy val transparentPosition: CondPickler[TransparentPosition] =
- (pkl[SourceFile] ~ pkl[Int] ~ pkl[Int] ~ pkl[Int])
- .wrapped { case source ~ start ~ point ~ end => new TransparentPosition(source, start, point, end) } { p => p.source ~ p.start ~ p.point ~ p.end }
- .asClass (classOf[TransparentPosition])
-
- lazy val noPosition = singletonPickler(NoPosition)
-
- implicit lazy val position: Pickler[Position] = transparentPosition | rangePosition | offsetPosition | noPosition
-
- implicit lazy val namePickler: Pickler[Name] =
- pkl[String] .wrapped[Name] {
- str => if ((str.length > 1) && (str endsWith "!")) newTypeName(str.init) else newTermName(str)
- } {
- name => if (name.isTypeName) name.toString+"!" else name.toString
- }
-
- implicit lazy val symPickler: Pickler[Symbol] = {
- def ownerNames(sym: Symbol, buf: ListBuffer[Name]): ListBuffer[Name] = {
- if (!sym.isRoot) {
- ownerNames(sym.owner, buf)
- buf += (if (sym.isModuleClass) sym.sourceModule else sym).name
- if (!sym.isType && !sym.isStable) {
- val sym1 = sym.owner.info.decl(sym.name)
- if (sym1.isOverloaded) {
- val index = sym1.alternatives.indexOf(sym)
- assert(index >= 0, sym1+" not found in alternatives "+sym1.alternatives)
- buf += newTermName(index.toString)
- }
- }
- }
- buf
- }
- def makeSymbol(root: Symbol, names: List[Name]): Symbol = names match {
- case List() =>
- root
- case name :: rest =>
- val sym = root.info.decl(name)
- if (sym.isOverloaded) makeSymbol(sym.alternatives(rest.head.toString.toInt), rest.tail)
- else makeSymbol(sym, rest)
- }
- pkl[List[Name]] .wrapped { makeSymbol(rootMirror.RootClass, _) } { ownerNames(_, new ListBuffer).toList }
- }
-
- implicit def workEvent: Pickler[WorkEvent] = {
- (pkl[Int] ~ pkl[Long])
- .wrapped { case id ~ ms => WorkEvent(id, ms) } { w => w.atNode ~ w.atMillis }
- }
-
- implicit def interruptReq: Pickler[InterruptReq] = {
- val emptyIR: InterruptReq = new InterruptReq { type R = Unit; val todo = () => () }
- pkl[Unit] .wrapped { _ => emptyIR } { _ => () }
- }
-
- implicit def reloadItem: CondPickler[ReloadItem] =
- pkl[List[SourceFile]]
- .wrapped { ReloadItem(_, new Response) } { _.sources }
- .asClass (classOf[ReloadItem])
-
- implicit def askTypeAtItem: CondPickler[AskTypeAtItem] =
- pkl[Position]
- .wrapped { new AskTypeAtItem(_, new Response) } { _.pos }
- .asClass (classOf[AskTypeAtItem])
-
- implicit def askTypeItem: CondPickler[AskTypeItem] =
- (pkl[SourceFile] ~ pkl[Boolean])
- .wrapped { case source ~ forceReload => new AskTypeItem(source, forceReload, new Response) } { w => w.source ~ w.forceReload }
- .asClass (classOf[AskTypeItem])
-
- implicit def askTypeCompletionItem: CondPickler[AskTypeCompletionItem] =
- pkl[Position]
- .wrapped { new AskTypeCompletionItem(_, new Response) } { _.pos }
- .asClass (classOf[AskTypeCompletionItem])
-
- implicit def askScopeCompletionItem: CondPickler[AskScopeCompletionItem] =
- pkl[Position]
- .wrapped { new AskScopeCompletionItem(_, new Response) } { _.pos }
- .asClass (classOf[AskScopeCompletionItem])
-
- implicit def askToDoFirstItem: CondPickler[AskToDoFirstItem] =
- pkl[SourceFile]
- .wrapped { new AskToDoFirstItem(_) } { _.source }
- .asClass (classOf[AskToDoFirstItem])
-
- implicit def askLinkPosItem: CondPickler[AskLinkPosItem] =
- (pkl[Symbol] ~ pkl[SourceFile])
- .wrapped { case sym ~ source => new AskLinkPosItem(sym, source, new Response) } { item => item.sym ~ item.source }
- .asClass (classOf[AskLinkPosItem])
-
- implicit def askDocCommentItem: CondPickler[AskDocCommentItem] =
- (pkl[Symbol] ~ pkl[SourceFile] ~ pkl[Symbol] ~ pkl[List[(Symbol,SourceFile)]])
- .wrapped { case sym ~ source ~ site ~ fragments => new AskDocCommentItem(sym, source, site, fragments, new Response) } { item => item.sym ~ item.source ~ item.site ~ item.fragments }
- .asClass (classOf[AskDocCommentItem])
-
- implicit def askLoadedTypedItem: CondPickler[AskLoadedTypedItem] =
- pkl[SourceFile]
- .wrapped { source => new AskLoadedTypedItem(source, new Response) } { _.source }
- .asClass (classOf[AskLoadedTypedItem])
-
- implicit def askParsedEnteredItem: CondPickler[AskParsedEnteredItem] =
- (pkl[SourceFile] ~ pkl[Boolean])
- .wrapped { case source ~ keepLoaded => new AskParsedEnteredItem(source, keepLoaded, new Response) } { w => w.source ~ w.keepLoaded }
- .asClass (classOf[AskParsedEnteredItem])
-
- implicit def emptyAction: CondPickler[EmptyAction] =
- pkl[Unit]
- .wrapped { _ => new EmptyAction } { _ => () }
- .asClass (classOf[EmptyAction])
-
- implicit def action: Pickler[() => Unit] =
- reloadItem | askTypeAtItem | askTypeItem | askTypeCompletionItem | askScopeCompletionItem |
- askToDoFirstItem | askLinkPosItem | askDocCommentItem | askLoadedTypedItem | askParsedEnteredItem | emptyAction
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/PresentationCompilerThread.scala b/src/compiler/scala/tools/nsc/interactive/PresentationCompilerThread.scala
deleted file mode 100644
index a2d8e5d49a..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/PresentationCompilerThread.scala
+++ /dev/null
@@ -1,51 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- * @author Iulian Dragos
- */
-package scala.tools.nsc.interactive
-
-/** A presentation compiler thread. This is a lightweight class, delegating most
- * of its functionality to the compiler instance.
- *
- */
-final class PresentationCompilerThread(var compiler: Global, name: String = "")
- extends Thread("Scala Presentation Compiler [" + name + "]") {
-
- /** The presentation compiler loop.
- */
- override def run() {
- compiler.debugLog("starting new runner thread")
- while (compiler ne null) try {
- compiler.checkNoResponsesOutstanding()
- compiler.log.logreplay("wait for more work", { compiler.scheduler.waitForMoreWork(); true })
- compiler.pollForWork(compiler.NoPosition)
- while (compiler.isOutOfDate) {
- try {
- compiler.backgroundCompile()
- } catch {
- case ex: FreshRunReq =>
- compiler.debugLog("fresh run req caught, starting new pass")
- }
- compiler.log.flush()
- }
- } catch {
- case ex @ ShutdownReq =>
- compiler.debugLog("exiting presentation compiler")
- compiler.log.close()
-
- // make sure we don't keep around stale instances
- compiler = null
- case ex: Throwable =>
- compiler.log.flush()
-
- ex match {
- case ex: FreshRunReq =>
- compiler.debugLog("fresh run req caught outside presentation compiler loop; ignored") // This shouldn't be reported
- case _ : Global#ValidateException => // This will have been reported elsewhere
- compiler.debugLog("validate exception caught outside presentation compiler loop; ignored")
- case _ => ex.printStackTrace(); compiler.informIDE("Fatal Error: "+ex)
- }
- }
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/REPL.scala b/src/compiler/scala/tools/nsc/interactive/REPL.scala
deleted file mode 100644
index 04c06b9357..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/REPL.scala
+++ /dev/null
@@ -1,218 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-
-import scala.reflect.internal.util._
-import scala.tools.nsc.reporters._
-import scala.tools.nsc.io._
-import scala.tools.nsc.scratchpad.SourceInserter
-import java.io.FileWriter
-
-/** Interface of interactive compiler to a client such as an IDE
- */
-object REPL {
-
- val versionMsg = "Scala compiler " +
- Properties.versionString + " -- " +
- Properties.copyrightString
-
- val prompt = "> "
-
- var reporter: ConsoleReporter = _
-
- private def replError(msg: String) {
- reporter.error(/*new Position */FakePos("scalac"),
- msg + "\n scalac -help gives more information")
- }
-
- def process(args: Array[String]) {
- val settings = new Settings(replError)
- reporter = new ConsoleReporter(settings)
- val command = new CompilerCommand(args.toList, settings)
- if (command.settings.version.value)
- reporter.echo(versionMsg)
- else {
- try {
- object compiler extends Global(command.settings, reporter) {
-// printTypings = true
- }
- if (reporter.hasErrors) {
- reporter.flush()
- return
- }
- if (command.shouldStopWithInfo) {
- reporter.echo(command.getInfoMessage(compiler))
- } else {
- run(compiler)
- }
- } catch {
- case ex @ FatalError(msg) =>
- if (true || command.settings.debug.value) // !!!
- ex.printStackTrace()
- reporter.error(null, "fatal error: " + msg)
- }
- }
- }
-
- def main(args: Array[String]) {
- process(args)
- sys.exit(if (reporter.hasErrors) 1 else 0)
- }
-
- def loop(action: (String) => Unit) {
- Console.print(prompt)
- try {
- val line = Console.readLine()
- if (line.length() > 0) {
- action(line)
- }
- loop(action)
- }
- catch {
- case _: java.io.EOFException => //nop
- }
- }
-
- /** Commands:
- *
- * reload file1 ... fileN
- * typeat file off1 off2?
- * complete file off1 off2?
- */
- def run(comp: Global) {
- val reloadResult = new Response[Unit]
- val typeatResult = new Response[comp.Tree]
- val completeResult = new Response[List[comp.Member]]
- val typedResult = new Response[comp.Tree]
- val structureResult = new Response[comp.Tree]
- @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0")
- val instrumentedResult = new Response[(String, Array[Char])]
-
- def makePos(file: String, off1: String, off2: String) = {
- val source = toSourceFile(file)
- comp.rangePos(source, off1.toInt, off1.toInt, off2.toInt)
- }
-
- def doTypeAt(pos: Position) {
- comp.askTypeAt(pos, typeatResult)
- show(typeatResult)
- }
-
- def doComplete(pos: Position) {
- comp.askTypeCompletion(pos, completeResult)
- show(completeResult)
- }
-
- def doStructure(file: String) {
- comp.askParsedEntered(toSourceFile(file), keepLoaded = false, structureResult)
- show(structureResult)
- }
-
- /** Write instrumented source file to disk.
- * @param iFullName The full name of the first top-level object in source
- * @param iContents An Array[Char] containing the instrumented source
- * @return The name of the instrumented source file
- */
- @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0")
- def writeInstrumented(iFullName: String, suffix: String, iContents: Array[Char]): String = {
- val iSimpleName = iFullName drop ((iFullName lastIndexOf '.') + 1)
- val iSourceName = iSimpleName + suffix
- val ifile = new FileWriter(iSourceName)
- ifile.write(iContents)
- ifile.close()
- iSourceName
- }
-
- /** The method for implementing worksheet functionality.
- * @param arguments a file name, followed by optional command line arguments that are passed
- * to the compiler that processes the instrumented source.
- * @param line A line number that controls uop to which line results should be produced
- * If line = -1, results are produced for all expressions in the worksheet.
- * @return The generated file content containing original source in the left column
- * and outputs in the right column, or None if the presentation compiler
- * does not respond to askInstrumented.
- */
- @deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0")
- def instrument(arguments: List[String], line: Int): Option[(String, String)] = {
- val source = toSourceFile(arguments.head)
- // strip right hand side comment column and any trailing spaces from all lines
- val strippedContents = SourceInserter.stripRight(source.content)
- val strippedSource = new BatchSourceFile(source.file, strippedContents)
- println("stripped source = "+strippedSource+":"+strippedContents.mkString)
- comp.askReload(List(strippedSource), reloadResult)
- comp.askInstrumented(strippedSource, line, instrumentedResult)
- using(instrumentedResult) {
- case (iFullName, iContents) =>
- println(s"instrumented source $iFullName = ${iContents.mkString}")
- val iSourceName = writeInstrumented(iFullName, "$instrumented.scala", iContents)
- val sSourceName = writeInstrumented(iFullName, "$stripped.scala", strippedContents)
- (iSourceName, sSourceName)
-/*
- * val vdirOpt = compileInstrumented(iSourceName, arguments.tail)
- runInstrumented(vdirOpt, iFullName, strippedSource.content)
- */
- }
- }
-
- loop { line =>
- (line split " ").toList match {
- case "reload" :: args =>
- comp.askReload(args map toSourceFile, reloadResult)
- show(reloadResult)
- case "reloadAndAskType" :: file :: millis :: Nil =>
- comp.askReload(List(toSourceFile(file)), reloadResult)
- Thread.sleep(millis.toInt)
- println("ask type now")
- comp.askLoadedTyped(toSourceFile(file), typedResult)
- typedResult.get
- case List("typeat", file, off1, off2) =>
- doTypeAt(makePos(file, off1, off2))
- case List("typeat", file, off1) =>
- doTypeAt(makePos(file, off1, off1))
- case List("complete", file, off1, off2) =>
- doComplete(makePos(file, off1, off2))
- case List("complete", file, off1) =>
- doComplete(makePos(file, off1, off1))
- case "instrument" :: arguments =>
- println(instrument(arguments, -1))
- case "instrumentTo" :: line :: arguments =>
- println(instrument(arguments, line.toInt))
- case List("quit") =>
- comp.askShutdown()
- sys.exit(1)
- case List("structure", file) =>
- doStructure(file)
- case _ =>
- print("""Available commands:
- | reload <file_1> ... <file_n>
- | reloadAndAskType <file> <sleep-ms>
- | typed <file>
- | typeat <file> <start-pos> <end-pos>
- | typeat <file> <pos>
- | complete <file> <start-pos> <end-pos>
- | compile <file> <pos>
- | instrument <file> <arg>*
- | instrumentTo <line-num> <file> <arg>*
- | structure <file>
- | quit
- |""".stripMargin)
- }
- }
- }
-
- def toSourceFile(name: String) = new BatchSourceFile(new PlainFile(new java.io.File(name)))
-
- def using[T, U](svar: Response[T])(op: T => U): Option[U] = {
- val res = svar.get match {
- case Left(result) => Some(op(result))
- case Right(exc) => exc.printStackTrace; println("ERROR: "+exc); None
- }
- svar.clear()
- res
- }
-
- def show[T](svar: Response[T]) = using(svar)(res => println("==> "+res))
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/RangePositions.scala b/src/compiler/scala/tools/nsc/interactive/RangePositions.scala
deleted file mode 100644
index 6288400629..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/RangePositions.scala
+++ /dev/null
@@ -1,13 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-
-package scala.tools.nsc
-package interactive
-
-@deprecated("Use scala.reflect.internal.Positions", "2.11.0")
-trait RangePositions extends scala.reflect.internal.Positions with ast.Trees with ast.Positions {
- self: scala.tools.nsc.Global =>
-
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/Response.scala b/src/compiler/scala/tools/nsc/interactive/Response.scala
deleted file mode 100644
index f36f769ec9..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/Response.scala
+++ /dev/null
@@ -1,105 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-
-/** Typical interaction, given a predicate <user-input>, a function <display>,
- * and an exception handler <handle>:
- *
- * val TIMEOUT = 100 // (milliseconds) or something like that
- * val r = new Response()
- * while (!r.isComplete && !r.isCancelled) {
- * if (<user-input>) r.cancel()
- * else r.get(TIMEOUT) match {
- * case Some(Left(data)) => <display>(data)
- * case Some(Right(exc)) => <handle>(exc)
- * case None =>
- * }
- * }
- */
-class Response[T] {
-
- private var data: Option[Either[T, Throwable]] = None
- private var complete = false
- private var cancelled = false
-
- /** Set provisional data, more to come
- */
- def setProvisionally(x: T) = synchronized {
- data = Some(Left(x))
- }
-
- /** Set final data, and mark response as complete.
- */
- def set(x: T) = synchronized {
- data = Some(Left(x))
- complete = true
- notifyAll()
- }
-
- /** Store raised exception in data, and mark response as complete.
- */
- def raise(exc: Throwable) = synchronized {
- data = Some(Right(exc))
- complete = true
- notifyAll()
- }
-
- /** Get final data, wait as long as necessary.
- * When interrupted will return with Right(InterruptedException)
- */
- def get: Either[T, Throwable] = synchronized {
- while (!complete) {
- try {
- wait()
- } catch {
- case exc: InterruptedException => raise(exc)
- }
- }
- data.get
- }
-
- /** Optionally get data within `timeout` milliseconds.
- * When interrupted will return with Some(Right(InterruptedException))
- * When timeout ends, will return last stored provisional result,
- * or else None if no provisional result was stored.
- */
- def get(timeout: Long): Option[Either[T, Throwable]] = synchronized {
- val start = System.currentTimeMillis
- var current = start
- while (!complete && start + timeout > current) {
- try {
- wait(timeout - (current - start))
- } catch {
- case exc: InterruptedException => raise(exc)
- }
- current = System.currentTimeMillis
- }
- data
- }
-
- /** Final data set was stored
- */
- def isComplete = synchronized { complete }
-
- /** Cancel action computing this response (Only the
- * party that calls get on a response may cancel).
- */
- def cancel() = synchronized { cancelled = true }
-
- /** A cancel request for this response has been issued
- */
- def isCancelled = synchronized { cancelled }
-
- def clear() = synchronized {
- data = None
- complete = false
- cancelled = false
- }
-}
-
-
-
-
diff --git a/src/compiler/scala/tools/nsc/interactive/RichCompilationUnits.scala b/src/compiler/scala/tools/nsc/interactive/RichCompilationUnits.scala
deleted file mode 100644
index b83c2cd095..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/RichCompilationUnits.scala
+++ /dev/null
@@ -1,58 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-
-import scala.reflect.internal.util.{SourceFile, Position, NoPosition}
-import scala.collection.mutable.ArrayBuffer
-
-trait RichCompilationUnits { self: Global =>
-
- /** The status value of a unit that has not yet been loaded */
- final val NotLoaded = -2
-
- /** The status value of a unit that has not yet been typechecked */
- final val JustParsed = -1
-
- /** The status value of a unit that has been partially typechecked */
- final val PartiallyChecked = 0
-
- class RichCompilationUnit(source: SourceFile) extends CompilationUnit(source) {
-
- /** The runid of the latest compiler run that typechecked this unit,
- * or else @see NotLoaded, JustParsed
- */
- var status: Int = NotLoaded
-
- /** Unit has been parsed */
- def isParsed: Boolean = status >= JustParsed
-
- /** Unit has been typechecked, but maybe not in latest runs */
- def isTypeChecked: Boolean = status > JustParsed
-
- /** Unit has been typechecked and is up to date */
- def isUpToDate: Boolean = status >= minRunId
-
- /** the current edit point offset */
- var editPoint: Int = -1
-
- /** The problems reported for this unit */
- val problems = new ArrayBuffer[Problem]
-
- /** The position of a targeted type check
- * If this is different from NoPosition, the type checking
- * will stop once a tree that contains this position range
- * is fully attributed.
- */
- var _targetPos: Position = NoPosition
- override def targetPos: Position = _targetPos
- def targetPos_=(p: Position) { _targetPos = p }
-
- var contexts: Contexts = new Contexts
-
- /** The last fully type-checked body of this unit */
- var lastBody: Tree = EmptyTree
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/ScratchPadMaker.scala b/src/compiler/scala/tools/nsc/interactive/ScratchPadMaker.scala
deleted file mode 100644
index 7af9174704..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/ScratchPadMaker.scala
+++ /dev/null
@@ -1,200 +0,0 @@
-package scala.tools.nsc
-package interactive
-
-import scala.reflect.internal.util.{SourceFile, BatchSourceFile, RangePosition}
-import scala.collection.mutable.ArrayBuffer
-import scala.reflect.internal.Chars.{isLineBreakChar, isWhitespace}
-import ast.parser.Tokens._
-
-@deprecated("SI-6458: Instrumentation logic will be moved out of the compiler.","2.10.0")
-trait ScratchPadMaker { self: Global =>
-
- import definitions._
-
- private case class Patch(offset: Int, text: String)
-
- private class Patcher(contents: Array[Char], lex: LexicalStructure, endOffset: Int) extends Traverser {
- var objectName: String = ""
-
- private val patches = new ArrayBuffer[Patch]
- private val toPrint = new ArrayBuffer[String]
- private var skipped = 0
- private var resNum: Int = -1
-
- private def nextRes(): String = {
- resNum += 1
- "res$"+resNum
- }
-
- private def nameType(name: String, tpe: Type): String = {
- // if name ends in symbol character, add a space to separate it from the following ':'
- val pad = if (Character.isLetter(name.last) || Character.isDigit(name.last)) "" else " "
- name+pad+": "+tpe
- }
-
- private def nameType(sym: Symbol): String = nameType(sym.name.decoded, sym.tpe)
-
- private def literal(str: String) = "\"\"\""+str+"\"\"\""
-
- private val prologue = ";import scala.runtime.WorksheetSupport._; def main(args: Array[String])=$execute{"
-
- private val epilogue = "}"
-
- private def applyPendingPatches(offset: Int) = {
- if (skipped == 0) patches += Patch(offset, prologue)
- for (msg <- toPrint) patches += Patch(offset, ";System.out.println("+msg+")")
- toPrint.clear()
- }
-
- /** The position where to insert an instrumentation statement in front of giuven statement.
- * This is at the latest `stat.pos.start`. But in order not to mess with column numbers
- * in position we try to insert it at the end of the previous token instead.
- * Furthermore, `(' tokens have to be skipped because they do not show up
- * in statement range positions.
- */
- private def instrumentPos(start: Int): Int = {
- val (prevToken, prevStart, prevEnd) = lex.locate(start - 1)
- if (prevStart >= start) start
- else if (prevToken == LPAREN) instrumentPos(prevStart)
- else prevEnd
- }
-
- private def addSkip(stat: Tree): Unit = {
- val ipos = instrumentPos(stat.pos.start)
- if (stat.pos.start > skipped) applyPendingPatches(ipos)
- if (stat.pos.start >= endOffset)
- patches += Patch(ipos, ";$stop()")
- var end = stat.pos.end
- if (end > skipped) {
- while (end < contents.length && !isLineBreakChar(contents(end))) end += 1
- patches += Patch(ipos, ";$skip("+(end-skipped)+"); ")
- skipped = end
- }
- }
-
- private def addSandbox(expr: Tree) = {}
-// patches += (Patch(expr.pos.start, "sandbox("), Patch(expr.pos.end, ")"))
-
- private def resultString(prefix: String, expr: String) =
- literal(prefix + " = ") + " + $show(" + expr + ")"
-
- private def traverseStat(stat: Tree) =
- if (stat.pos.isInstanceOf[RangePosition]) {
- stat match {
- case ValDef(_, _, _, rhs) =>
- addSkip(stat)
- if (stat.symbol.isLazy)
- toPrint += literal(nameType(stat.symbol) + " = <lazy>")
- else if (!stat.symbol.isSynthetic) {
- addSandbox(rhs)
- toPrint += resultString(nameType(stat.symbol), stat.symbol.name.toString)
- }
- case DefDef(_, _, _, _, _, _) =>
- addSkip(stat)
- toPrint += literal(nameType(stat.symbol))
- case Annotated(_, arg) =>
- traverse(arg)
- case DocDef(_, defn) =>
- traverse(defn)
- case _ =>
- if (stat.isTerm) {
- addSkip(stat)
- if (stat.tpe.typeSymbol == UnitClass) {
- addSandbox(stat)
- } else {
- val resName = nextRes()
- val dispResName = resName filter ('$' != _)
- val offset = instrumentPos(stat.pos.start)
- patches += Patch(offset, "val " + resName + " = ")
- addSandbox(stat)
- toPrint += resultString(nameType(dispResName, stat.tpe), resName)
- }
- }
- }
- }
-
- override def traverse(tree: Tree): Unit = tree match {
- case PackageDef(_, _) =>
- super.traverse(tree)
- case ModuleDef(_, name, Template(_, _, body)) =>
- val topLevel = objectName.isEmpty
- if (topLevel) {
- objectName = tree.symbol.fullName
- body foreach traverseStat
- if (skipped != 0) { // don't issue prologue and epilogue if there are no instrumented statements
- applyPendingPatches(skipped)
- patches += Patch(skipped, epilogue)
- }
- }
- case _ =>
- }
-
- /** The patched text.
- * @require traverse is run first
- */
- def result: Array[Char] = {
- val reslen = contents.length + (patches map (_.text.length)).sum
- val res = Array.ofDim[Char](reslen)
- var lastOffset = 0
- var from = 0
- var to = 0
- for (Patch(offset, text) <- patches) {
- val delta = offset - lastOffset
- assert(delta >= 0)
- Array.copy(contents, from, res, to, delta)
- from += delta
- to += delta
- lastOffset = offset
- text.copyToArray(res, to)
- to += text.length
- }
- assert(contents.length - from == reslen - to)
- Array.copy(contents, from, res, to, contents.length - from)
- res
- }
- }
-
- class LexicalStructure(source: SourceFile) {
- val token = new ArrayBuffer[Int]
- val startOffset = new ArrayBuffer[Int]
- val endOffset = new ArrayBuffer[Int]
- private val scanner = new syntaxAnalyzer.UnitScanner(new CompilationUnit(source))
- scanner.init()
- while (scanner.token != EOF) {
- startOffset += scanner.offset
- token += scanner.token
- scanner.nextToken()
- endOffset += scanner.lastOffset
- }
-
- /** @return token that starts before or at offset, its startOffset, its endOffset
- */
- def locate(offset: Int): (Int, Int, Int) = {
- var lo = 0
- var hi = token.length - 1
- while (lo < hi) {
- val mid = (lo + hi + 1) / 2
- if (startOffset(mid) <= offset) lo = mid
- else hi = mid - 1
- }
- (token(lo), startOffset(lo), endOffset(lo))
- }
- }
-
- /** Compute an instrumented version of a sourcefile.
- * @param source The given sourcefile.
- * @param line The line up to which results should be printed, -1 = whole document.
- * @return A pair consisting of
- * - the fully qualified name of the first top-level object definition in the file.
- * or "" if there are no object definitions.
- * - the text of the instrumented program which, when run,
- * prints its output and all defined values in a comment column.
- */
- protected def instrument(source: SourceFile, line: Int): (String, Array[Char]) = {
- val tree = typedTree(source, forceReload = true)
- val endOffset = if (line < 0) source.length else source.lineToOffset(line + 1)
- val patcher = new Patcher(source.content, new LexicalStructure(source), endOffset)
- patcher.traverse(tree)
- (patcher.objectName, patcher.result)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/InteractiveTest.scala b/src/compiler/scala/tools/nsc/interactive/tests/InteractiveTest.scala
deleted file mode 100644
index a4a2de9b51..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/InteractiveTest.scala
+++ /dev/null
@@ -1,123 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-package tests
-
-import core._
-import scala.collection.mutable.ListBuffer
-
-/** A base class for writing interactive compiler tests.
- *
- * This class tries to cover common functionality needed when testing the presentation
- * compiler: instantiation source files, reloading, creating positions, instantiating
- * the presentation compiler, random stress testing.
- *
- * By default, this class loads all scala and java classes found under `src/`, going
- * recursively into subfolders. Loaded classes are found in `sourceFiles`. trait `TestResources`
- * The presentation compiler is available through `compiler`.
- *
- * It is easy to test member completion, type and hyperlinking at a given position. Source
- * files are searched for `TextMarkers`. By default, the completion marker is `/*!*/`, the
- * typedAt marker is `/*?*/` and the hyperlinking marker is `/*#*/`. Place these markers in
- * your source files, and the test framework will automatically pick them up and test the
- * corresponding actions. Sources are reloaded by `askReload(sourceFiles)` (blocking
- * call). All ask operations are placed on the work queue without waiting for each one to
- * complete before asking the next. After all asks, it waits for each response in turn and
- * prints the result. The default timeout is 1 second per operation.
- *
- * To define a custom operation you have to:
- *
- * (1) Define a new marker by extending `TestMarker`
- * (2) Provide an implementation for the operation you want to check by extending `PresentationCompilerTestDef`
- * (3) Add the class defined in (1) to the set of executed test actions by calling `++` on `InteractiveTest`.
- *
- * Then you can simply use the new defined `marker` in your test sources and the testing
- * framework will automatically pick it up.
- *
- * @see Check existing tests under test/files/presentation
- *
- * @author Iulian Dragos
- * @author Mirco Dotta
- */
-abstract class InteractiveTest
- extends AskParse
- with AskShutdown
- with AskReload
- with AskLoadedTyped
- with PresentationCompilerInstance
- with CoreTestDefs
- with InteractiveTestSettings { self =>
-
- protected val runRandomTests = false
-
- /** Should askAllSources wait for each ask to finish before issuing the next? */
- override protected val synchronousRequests = true
-
- /** The core set of test actions that are executed during each test run are
- * `CompletionAction`, `TypeAction` and `HyperlinkAction`.
- * Override this member if you need to change the default set of executed test actions.
- */
- protected lazy val testActions: ListBuffer[PresentationCompilerTestDef] = {
- ListBuffer(new CompletionAction(compiler), new TypeAction(compiler), new HyperlinkAction(compiler))
- }
-
- /** Add new presentation compiler actions to test. Presentation compiler's test
- * need to extends trait `PresentationCompilerTestDef`.
- */
- protected def ++(tests: PresentationCompilerTestDef*) {
- testActions ++= tests
- }
-
- /** Test's entry point */
- def main(args: Array[String]) {
- try execute()
- finally shutdown()
- }
-
- protected def execute(): Unit = {
- loadSources()
- runDefaultTests()
- }
-
- /** Load all sources before executing the test. */
- protected def loadSources() {
- // ask the presentation compiler to track all sources. We do
- // not wait for the file to be entirely typed because we do want
- // to exercise the presentation compiler on scoped type requests.
- askReload(sourceFiles)
- // make sure all sources are parsed before running the test. This
- // is because test may depend on the sources having been parsed at
- // least once
- askParse(sourceFiles)
- }
-
- /** Run all defined `PresentationCompilerTestDef` */
- protected def runDefaultTests() {
- //TODO: integrate random tests!, i.e.: if (runRandomTests) randomTests(20, sourceFiles)
- testActions.foreach(_.runTest())
- }
-
- /** Perform n random tests with random changes. */
- /****
- private def randomTests(n: Int, files: Array[SourceFile]) {
- val tester = new Tester(n, files, settings) {
- override val compiler = self.compiler
- override val reporter = new reporters.StoreReporter
- }
- tester.run()
- }
- ****/
-
- /** shutdown the presentation compiler. */
- protected def shutdown() {
- askShutdown()
-
- // this is actually needed to force exit on test completion.
- // Note: May be a bug on either the testing framework or (less likely)
- // the presentation compiler
- sys.exit(0)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/InteractiveTestSettings.scala b/src/compiler/scala/tools/nsc/interactive/tests/InteractiveTestSettings.scala
deleted file mode 100644
index ad5c61b2b0..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/InteractiveTestSettings.scala
+++ /dev/null
@@ -1,69 +0,0 @@
-package scala.tools.nsc
-package interactive
-package tests
-
-import java.io.File.pathSeparatorChar
-import java.io.File.separatorChar
-import scala.tools.nsc.interactive.tests.core.PresentationCompilerInstance
-import scala.tools.nsc.io.{File,Path}
-import core.Reporter
-import core.TestSettings
-
-trait InteractiveTestSettings extends TestSettings with PresentationCompilerInstance {
- /** Character delimiter for comments in .opts file */
- private final val CommentStartDelimiter = "#"
-
- private final val TestOptionsFileExtension = "flags"
-
- /** Prepare the settings object. Load the .opts file and adjust all paths from the
- * Unix-like syntax to the platform specific syntax. This is necessary so that a
- * single .opts file can be used on all platforms.
- *
- * @note Bootclasspath is treated specially. If there is a -bootclasspath option in
- * the file, the 'usejavacp' setting is set to false. This ensures that the
- * bootclasspath takes precedence over the scala-library used to run the current
- * test.
- */
- override protected def prepareSettings(settings: Settings) {
- def adjustPaths(paths: settings.PathSetting*) {
- for (p <- paths if argsString.contains(p.name)) p.value = p.value.map {
- case '/' => separatorChar
- case ':' => pathSeparatorChar
- case c => c
- }
- }
-
- // need this so that the classpath comes from what partest
- // instead of scala.home
- settings.usejavacp.value = !argsString.contains("-bootclasspath")
-
- // pass any options coming from outside
- settings.processArgumentString(argsString) match {
- case (false, rest) =>
- println("error processing arguments (unprocessed: %s)".format(rest))
- case _ => ()
- }
-
- // Make the --sourcepath path provided in the .flags file (if any) relative to the test's base directory
- if(settings.sourcepath.isSetByUser)
- settings.sourcepath.value = (baseDir / Path(settings.sourcepath.value)).path
-
- adjustPaths(settings.bootclasspath, settings.classpath, settings.javabootclasspath, settings.sourcepath)
- }
-
- /** If there's a file ending in .opts, read it and parse it for cmd line arguments. */
- protected val argsString = {
- val optsFile = outDir / "%s.%s".format(System.getProperty("partest.testname"), TestOptionsFileExtension)
- val str = try File(optsFile).slurp() catch {
- case e: java.io.IOException => ""
- }
- str.lines.filter(!_.startsWith(CommentStartDelimiter)).mkString(" ")
- }
-
- override protected def printClassPath(implicit reporter: Reporter) {
- reporter.println("\toutDir: %s".format(outDir.path))
- reporter.println("\tbaseDir: %s".format(baseDir.path))
- reporter.println("\targsString: %s".format(argsString))
- super.printClassPath(reporter)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/Tester.scala b/src/compiler/scala/tools/nsc/interactive/tests/Tester.scala
deleted file mode 100644
index 9382d5890f..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/Tester.scala
+++ /dev/null
@@ -1,208 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-package tests
-
-import scala.reflect.internal.util._
-import reporters._
-import io.AbstractFile
-import scala.collection.mutable.ArrayBuffer
-
-class Tester(ntests: Int, inputs: Array[SourceFile], settings: Settings) {
-
- val reporter = new StoreReporter
- val compiler = new Global(settings, reporter)
-
- def askAndListen[T, U](msg: String, arg: T, op: (T, Response[U]) => Unit) {
- if (settings.verbose.value) print(msg+" "+arg+": ")
- val TIMEOUT = 10 // ms
- val limit = System.currentTimeMillis() + randomDelayMillis
- val res = new Response[U]
- op(arg, res)
- while (!res.isComplete && !res.isCancelled) {
- if (System.currentTimeMillis() > limit) {
- print("c"); res.cancel()
- } else res.get(TIMEOUT) match {
- case Some(Left(t)) =>
- /**/
- if (settings.verbose.value) println(t)
- case Some(Right(ex)) =>
- ex.printStackTrace()
- println(ex)
- case None =>
- }
- }
- }
-
- def askReload(sfs: SourceFile*) = askAndListen("reload", sfs.toList, compiler.askReload)
- def askTypeAt(pos: Position) = askAndListen("type at", pos, compiler.askTypeAt)
- def askTypeCompletion(pos: Position) = askAndListen("type at", pos, compiler.askTypeCompletion)
- def askScopeCompletion(pos: Position) = askAndListen("type at", pos, compiler.askScopeCompletion)
-
- val rand = new java.util.Random()
-
- private def randomInverse(n: Int) = n / (rand.nextInt(n) + 1)
-
- private def randomDecreasing(n: Int) = {
- var r = rand.nextInt((1 to n).sum)
- var limit = n
- var result = 0
- while (r > limit) {
- result += 1
- r -= limit
- limit -= 1
- }
- result
- }
-
- def randomSourceFileIdx() = rand.nextInt(inputs.length)
-
- def randomBatchesPerSourceFile(): Int = randomDecreasing(100)
-
- def randomChangesPerBatch(): Int = randomInverse(50)
-
- def randomPositionIn(sf: SourceFile) = rand.nextInt(sf.content.length)
-
- def randomNumChars() = randomInverse(100)
-
- def randomDelayMillis = randomInverse(10000)
-
- class Change(sfidx: Int, start: Int, nchars: Int, toLeft: Boolean) {
-
- private var pos = start
- private var deleted: List[Char] = List()
-
- override def toString =
- "In "+inputs(sfidx)+" at "+start+" take "+nchars+" to "+
- (if (toLeft) "left" else "right")
-
- def deleteOne() {
- val sf = inputs(sfidx)
- deleted = sf.content(pos) :: deleted
- val sf1 = new BatchSourceFile(sf.file, sf.content.take(pos) ++ sf.content.drop(pos + 1))
- inputs(sfidx) = sf1
- askReload(sf1)
- }
-
- def deleteAll() {
- print("/"+nchars)
- for (i <- 0 until nchars) {
- if (toLeft) {
- if (pos > 0 && pos <= inputs(sfidx).length) {
- pos -= 1
- deleteOne()
- }
- } else {
- if (pos < inputs(sfidx).length) {
- deleteOne()
- }
- }
- }
- }
-
- def insertAll() {
- for (chr <- if (toLeft) deleted else deleted.reverse) {
- val sf = inputs(sfidx)
- val (pre, post) = sf./**/content splitAt pos
- pos += 1
- val sf1 = new BatchSourceFile(sf.file, pre ++ (chr +: post))
- inputs(sfidx) = sf1
- askReload(sf1)
- }
- }
- }
-
- val testComment = "/**/"
-
- def testFileChanges(sfidx: Int) = {
- lazy val testPositions: Seq[Int] = {
- val sf = inputs(sfidx)
- val buf = new ArrayBuffer[Int]
- var pos = sf.content.indexOfSlice(testComment)
- while (pos > 0) {
- buf += pos
- pos = sf.content.indexOfSlice(testComment, pos + 1)
- }
- buf
- }
- def otherTest() {
- if (testPositions.nonEmpty) {
- val pos = new OffsetPosition(inputs(sfidx), rand.nextInt(testPositions.length))
- rand.nextInt(3) match {
- case 0 => askTypeAt(pos)
- case 1 => askTypeCompletion(pos)
- case 2 => askScopeCompletion(pos)
- }
- }
- }
- for (i <- 0 until randomBatchesPerSourceFile()) {
- val changes = Vector.fill(/**/randomChangesPerBatch()) {
- /**/
- new Change(sfidx, randomPositionIn(inputs(sfidx)), randomNumChars(), rand.nextBoolean())
- }
- doTest(sfidx, changes, testPositions, otherTest) match {
- case Some(errortrace) =>
- println(errortrace)
- minimize(errortrace)
- case None =>
- }
- }
- }
-
- def doTest(sfidx: Int, changes: Seq[Change], testPositions: Seq[Int], otherTest: () => Unit): Option[ErrorTrace] = {
- print("new round with "+changes.length+" changes:")
- changes foreach (_.deleteAll())
- otherTest()
- def errorCount() = compiler.ask(() => reporter.ERROR.count)
-// println("\nhalf test round: "+errorCount())
- changes.view.reverse foreach (_.insertAll())
- otherTest()
- println("done test round: "+errorCount())
- if (errorCount() != 0)
- Some(ErrorTrace(sfidx, changes, reporter.infos, inputs(sfidx).content))
- else
- None
- }
-
- case class ErrorTrace(
- sfidx: Int, changes: Seq[Change], infos: scala.collection.Set[reporter.Info], content: Array[Char]) {
- override def toString =
- "Sourcefile: "+inputs(sfidx)+
- "\nChanges:\n "+changes.mkString("\n ")+
- "\nErrors:\n "+infos.mkString("\n ")+
- "\nContents:\n"+content.mkString
- }
-
- def minimize(etrace: ErrorTrace) {}
-
- /**/
- def run() {
- askReload(inputs: _*)
- for (i <- 0 until ntests)
- testFileChanges(randomSourceFileIdx())
- }
-}
-
-/* A program to do presentation compiler stress tests.
- * Usage:
- *
- * scala scala.tools.nsc.interactive.test.Tester <n> <files>
- *
- * where <n> is the number os tests to be run and <files> is the set of files to test.
- * This will do random deletions and re-insertions in any of the files.
- * At places where an empty comment /**/ appears it will in addition randomly
- * do ask-types, type-completions, or scope-completions.
- */
-object Tester {
- def main(args: Array[String]) {
- val settings = new Settings()
- val (_, filenames) = settings.processArguments(args.toList.tail, processAll = true)
- println("filenames = "+filenames)
- val files = filenames.toArray map (str => new BatchSourceFile(AbstractFile.getFile(str)): SourceFile)
- new Tester(args(0).toInt, files, settings).run()
- sys.exit(0)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/AskCommand.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/AskCommand.scala
deleted file mode 100644
index 8d446cbbf8..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/AskCommand.scala
+++ /dev/null
@@ -1,109 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2009-2013 Typesafe/Scala Solutions and LAMP/EPFL
- * @author Martin Odersky
- */
-package scala.tools.nsc
-package interactive
-package tests.core
-
-import scala.tools.nsc.interactive.Response
-import scala.reflect.internal.util.Position
-import scala.reflect.internal.util.SourceFile
-
-/**
- * A trait for defining commands that can be queried to the
- * presentation compiler.
- * */
-trait AskCommand {
-
- /** presentation compiler's instance. */
- protected val compiler: Global
-
- /**
- * Presentation compiler's `askXXX` actions work by doing side-effects
- * on a `Response` instance passed as an argument during the `askXXX`
- * call.
- * The defined method `ask` is meant to encapsulate this behavior.
- * */
- protected def ask[T](op: Response[T] => Unit): Response[T] = {
- val r = new Response[T]
- op(r)
- r
- }
-}
-
-/** Ask the presentation compiler to shut-down. */
-trait AskShutdown extends AskCommand {
- def askShutdown() = compiler.askShutdown()
-}
-
-/** Ask the presentation compiler to parse a sequence of `sources` */
-trait AskParse extends AskCommand {
- import compiler.Tree
-
- /** `sources` need to be entirely parsed before running the test
- * (else commands such as `AskCompletionAt` may fail simply because
- * the source's AST is not yet loaded).
- */
- def askParse(sources: Seq[SourceFile]) {
- val responses = sources map (askParse(_))
- responses.foreach(_.get) // force source files parsing
- }
-
- private def askParse(src: SourceFile, keepLoaded: Boolean = true): Response[Tree] = {
- ask {
- compiler.askParsedEntered(src, keepLoaded, _)
- }
- }
-}
-
-/** Ask the presentation compiler to reload a sequence of `sources` */
-trait AskReload extends AskCommand {
-
- /** Reload the given source files and wait for them to be reloaded. */
- protected def askReload(sources: Seq[SourceFile])(implicit reporter: Reporter): Response[Unit] = {
- val sortedSources = (sources map (_.file.name)).sorted
- reporter.println("reload: " + sortedSources.mkString(", "))
-
- ask {
- compiler.askReload(sources.toList, _)
- }
- }
-}
-
-/** Ask the presentation compiler for completion at a given position. */
-trait AskCompletionAt extends AskCommand {
- import compiler.Member
-
- private[tests] def askCompletionAt(pos: Position)(implicit reporter: Reporter): Response[List[Member]] = {
- reporter.println("\naskTypeCompletion at " + pos.source.file.name + ((pos.line, pos.column)))
-
- ask {
- compiler.askTypeCompletion(pos, _)
- }
- }
-}
-
-/** Ask the presentation compiler for type info at a given position. */
-trait AskTypeAt extends AskCommand {
- import compiler.Tree
-
- private[tests] def askTypeAt(pos: Position)(implicit reporter: Reporter): Response[Tree] = {
- reporter.println("\naskType at " + pos.source.file.name + ((pos.line, pos.column)))
-
- ask {
- compiler.askTypeAt(pos, _)
- }
- }
-}
-
-trait AskLoadedTyped extends AskCommand {
- import compiler.Tree
-
- protected def askLoadedTyped(source: SourceFile)(implicit reporter: Reporter): Response[Tree] = {
- ask {
- compiler.askLoadedTyped(source, _)
- }
- }
-
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala
deleted file mode 100644
index 9085eb56e6..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/CoreTestDefs.scala
+++ /dev/null
@@ -1,100 +0,0 @@
-package scala.tools.nsc
-package interactive
-package tests.core
-
-import scala.reflect.internal.util.Position
-
-/** Set of core test definitions that are executed for each test run. */
-private[tests] trait CoreTestDefs
- extends PresentationCompilerRequestsWorkingMode {
-
- import scala.tools.nsc.interactive.Global
-
- /** Ask the presentation compiler for completion at all locations
- * (in all sources) where the defined `marker` is found. */
- class CompletionAction(override val compiler: Global)
- extends PresentationCompilerTestDef
- with AskCompletionAt {
-
- def memberPrinter(member: compiler.Member): String =
- "[accessible: %5s] ".format(member.accessible) + "`" + (member.sym.toString() + member.tpe.toString()).trim() + "`"
-
- override def runTest() {
- askAllSources(CompletionMarker) { pos =>
- askCompletionAt(pos)
- } { (pos, members) =>
- withResponseDelimiter {
- reporter.println("[response] aksTypeCompletion at " + format(pos))
- // we skip getClass because it changed signature between 1.5 and 1.6, so there is no
- // universal check file that we can provide for this to work
- reporter.println("retrieved %d members".format(members.size))
- compiler ask { () =>
- val filtered = members.filterNot(member => member.sym.name.toString == "getClass" || member.sym.isConstructor)
- reporter.println(filtered.map(memberPrinter).sortBy(_.toString()).mkString("\n"))
- }
- }
- }
- }
- }
-
- /** Ask the presentation compiler for type info at all locations
- * (in all sources) where the defined `marker` is found. */
- class TypeAction(override val compiler: Global)
- extends PresentationCompilerTestDef
- with AskTypeAt {
-
- override def runTest() {
- askAllSources(TypeMarker) { pos =>
- askTypeAt(pos)
- } { (pos, tree) =>
- withResponseDelimiter {
- reporter.println("[response] askTypeAt at " + format(pos))
- compiler.ask(() => reporter.println(tree))
- }
- }
- }
- }
-
- /** Ask the presentation compiler for hyperlink at all locations
- * (in all sources) where the defined `marker` is found. */
- class HyperlinkAction(override val compiler: Global)
- extends PresentationCompilerTestDef
- with AskTypeAt
- with AskCompletionAt {
-
- override def runTest() {
- askAllSources(HyperlinkMarker) { pos =>
- askTypeAt(pos)(NullReporter)
- } { (pos, tree) =>
- if(tree.symbol == compiler.NoSymbol) {
- reporter.println("\nNo symbol is associated with tree: "+tree)
- }
- else {
- reporter.println("\naskHyperlinkPos for `" + tree.symbol.name + "` at " + format(pos) + " " + pos.source.file.name)
- val r = new Response[Position]
- // `tree.symbol.sourceFile` was discovered to be null when testing using virtpatmat on the akka presentation test, where a position had shifted to point to `Int`
- // askHyperlinkPos for `Int` at (73,19) pi.scala --> class Int in package scala has null sourceFile!
- val treePath = if (tree.symbol.sourceFile ne null) tree.symbol.sourceFile.path else null
- val treeName = if (tree.symbol.sourceFile ne null) tree.symbol.sourceFile.name else null
-
- sourceFiles.find(_.path == treePath) match {
- case Some(source) =>
- compiler.askLinkPos(tree.symbol, source, r)
- r.get match {
- case Left(pos) =>
- val resolvedPos = if (tree.symbol.pos.isDefined) tree.symbol.pos else pos
- withResponseDelimiter {
- reporter.println("[response] found askHyperlinkPos for `" + tree.symbol.name + "` at " + format(resolvedPos) + " " + tree.symbol.sourceFile.name)
- }
- case Right(ex) =>
- ex.printStackTrace()
- }
- case None =>
- reporter.println("[error] could not locate sourcefile `" + treeName + "`." +
- "Hint: Does the looked up definition come form a binary?")
- }
- }
- }
- }
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerInstance.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerInstance.scala
deleted file mode 100644
index 5cda0e53fb..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerInstance.scala
+++ /dev/null
@@ -1,34 +0,0 @@
-package scala.tools.nsc
-package interactive
-package tests.core
-
-import reporters.{Reporter => CompilerReporter}
-
-/** Trait encapsulating the creation of a presentation compiler's instance.*/
-private[tests] trait PresentationCompilerInstance extends TestSettings {
- protected val settings = new Settings
- protected val withDocComments = false
-
- protected val compilerReporter: CompilerReporter = new InteractiveReporter {
- override def compiler = PresentationCompilerInstance.this.compiler
- }
-
- protected lazy val compiler: Global = {
- prepareSettings(settings)
- new Global(settings, compilerReporter) {
- override def forScaladoc = withDocComments
- }
- }
-
- /**
- * Called before instantiating the presentation compiler's instance.
- * You should provide an implementation of this method if you need
- * to customize the `settings` used to instantiate the presentation compiler.
- * */
- protected def prepareSettings(settings: Settings) {}
-
- protected def printClassPath(implicit reporter: Reporter) {
- reporter.println("\tbootClassPath: %s".format(settings.bootclasspath.value))
- reporter.println("\tverbose: %b".format(settings.verbose.value))
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerRequestsWorkingMode.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerRequestsWorkingMode.scala
deleted file mode 100644
index b5ae5f2d75..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerRequestsWorkingMode.scala
+++ /dev/null
@@ -1,62 +0,0 @@
-package scala.tools.nsc
-package interactive
-package tests.core
-
-import scala.reflect.internal.util.Position
-import scala.reflect.internal.util.SourceFile
-
-trait PresentationCompilerRequestsWorkingMode extends TestResources {
-
- protected def synchronousRequests: Boolean
-
- protected def askAllSources[T] = if (synchronousRequests) askAllSourcesSync[T] _ else askAllSourcesAsync[T] _
-
- /** Perform an operation on all sources at all positions that match the given
- * `marker`. For instance, askAllSources(TypeMarker)(askTypeAt)(println) would
- * ask the type at all positions marked with `TypeMarker.marker` and println the result.
- */
- private def askAllSourcesAsync[T](marker: TestMarker)(askAt: Position => Response[T])(f: (Position, T) => Unit) {
- val positions = allPositionsOf(str = marker.marker)
- val responses = for (pos <- positions) yield askAt(pos)
-
- for ((pos, r) <- positions zip responses) withResponse(pos, r)(f)
- }
-
- /** Synchronous version of askAllSources. Each position is treated in turn, waiting for the
- * response before going to the next one.
- */
- private def askAllSourcesSync[T](marker: TestMarker)(askAt: Position => Response[T])(f: (Position, T) => Unit) {
- val positions = allPositionsOf(str = marker.marker)
- for (pos <- positions) withResponse(pos, askAt(pos))(f)
- }
-
- /** All positions of the given string in all source files. */
- private def allPositionsOf(srcs: Seq[SourceFile] = sourceFiles, str: String): Seq[Position] =
- for (s <- srcs; p <- positionsOf(s, str)) yield p
-
- /** Return all positions of the given str in the given source file. */
- private def positionsOf(source: SourceFile, str: String): Seq[Position] = {
- val buf = new scala.collection.mutable.ListBuffer[Position]
- var pos = source.content.indexOfSlice(str)
- while (pos >= 0) {
- buf += source.position(pos - 1) // we need the position before the first character of this marker
- pos = source.content.indexOfSlice(str, pos + 1)
- }
- buf.toList
- }
-
- private def withResponse[T](pos: Position, response: Response[T])(f: (Position, T) => Unit) {
- /** Return the filename:line:col version of this position. */
- def showPos(pos: Position): String =
- "%s:%d:%d".format(pos.source.file.name, pos.line, pos.column)
-
- response.get(TIMEOUT) match {
- case Some(Left(t)) =>
- f(pos, t)
- case None =>
- println("TIMEOUT: " + showPos(pos))
- case Some(r) =>
- println("ERROR: " + r)
- }
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerTestDef.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerTestDef.scala
deleted file mode 100644
index 4d5b4e1129..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/PresentationCompilerTestDef.scala
+++ /dev/null
@@ -1,18 +0,0 @@
-package scala.tools.nsc.interactive.tests.core
-
-import scala.reflect.internal.util.Position
-
-trait PresentationCompilerTestDef {
-
- private[tests] def runTest(): Unit
-
- protected def withResponseDelimiter(block: => Unit)(implicit reporter: Reporter) {
- def printDelimiter() = reporter.println("=" * 80)
- printDelimiter()
- block
- printDelimiter()
- }
-
- protected def format(pos: Position): String =
- (if(pos.isDefined) "(%d,%d)".format(pos.line, pos.column) else "<no position>")
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/Reporter.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/Reporter.scala
deleted file mode 100644
index 631504cda5..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/Reporter.scala
+++ /dev/null
@@ -1,15 +0,0 @@
-package scala.tools.nsc.interactive.tests.core
-
-private[tests] trait Reporter {
- def println(msg: Any): Unit
-}
-
-/** Reporter that simply prints all messages in the standard output.*/
-private[tests] object ConsoleReporter extends Reporter {
- def println(msg: Any) { Console.println(msg) }
-}
-
-/** Reporter that swallows all passed message. */
-private[tests] object NullReporter extends Reporter {
- def println(msg: Any) {}
-} \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/SourcesCollector.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/SourcesCollector.scala
deleted file mode 100644
index 676feeba8a..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/SourcesCollector.scala
+++ /dev/null
@@ -1,20 +0,0 @@
-package scala.tools.nsc.interactive.tests.core
-
-import scala.reflect.internal.util.{SourceFile,BatchSourceFile}
-import scala.tools.nsc.io.{AbstractFile,Path}
-
-private[tests] object SourcesCollector {
- type SourceFilter = Path => Boolean
-
- /**
- * All files below `base` directory that pass the `filter`.
- * With the default `filter` only .scala and .java files are collected.
- * */
- def apply(base: Path, filter: SourceFilter): Array[SourceFile] = {
- assert(base.isDirectory)
- base.walk.filter(filter).map(source).toList.toArray.sortBy(_.file.name)
- }
-
- private def source(file: Path): SourceFile = source(AbstractFile.getFile(file.toFile))
- private def source(file: AbstractFile): SourceFile = new BatchSourceFile(file)
-}
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/TestMarker.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/TestMarker.scala
deleted file mode 100644
index a5c228a549..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/TestMarker.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-package scala.tools.nsc.interactive.tests.core
-
-case class DuplicateTestMarker(msg: String) extends Exception(msg)
-
-object TestMarker {
- import scala.collection.mutable.Map
- private val markers: Map[String, TestMarker] = Map.empty
-
- private def checkForDuplicate(marker: TestMarker) {
- markers.get(marker.marker) match {
- case None => markers(marker.marker) = marker
- case Some(otherMarker) =>
- val msg = "Marker `%s` is already used by %s. Please choose a different marker for %s".format(marker.marker, marker, otherMarker)
- throw new DuplicateTestMarker(msg)
- }
- }
-}
-
-abstract case class TestMarker(marker: String) {
- TestMarker.checkForDuplicate(this)
-}
-
-object CompletionMarker extends TestMarker("/*!*/")
-
-object TypeMarker extends TestMarker("/*?*/")
-
-object HyperlinkMarker extends TestMarker("/*#*/")
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/TestResources.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/TestResources.scala
deleted file mode 100644
index 887c3cf29b..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/TestResources.scala
+++ /dev/null
@@ -1,12 +0,0 @@
-package scala.tools.nsc.interactive.tests.core
-
-import scala.tools.nsc.io.Path
-import scala.reflect.internal.util.SourceFile
-
-/** Resources used by the test. */
-private[tests] trait TestResources extends TestSettings {
- /** collected source files that are to be used by the test runner */
- protected lazy val sourceFiles: Array[SourceFile] = SourcesCollector(baseDir / sourceDir, isScalaOrJavaSource)
-
- private def isScalaOrJavaSource(file: Path): Boolean = file.extension == "scala" | file.extension == "java"
-} \ No newline at end of file
diff --git a/src/compiler/scala/tools/nsc/interactive/tests/core/TestSettings.scala b/src/compiler/scala/tools/nsc/interactive/tests/core/TestSettings.scala
deleted file mode 100644
index 681204172b..0000000000
--- a/src/compiler/scala/tools/nsc/interactive/tests/core/TestSettings.scala
+++ /dev/null
@@ -1,19 +0,0 @@
-package scala.tools.nsc.interactive.tests.core
-
-import scala.tools.nsc.io.Path
-
-/** Common settings for the test. */
-private[tests] trait TestSettings {
- protected final val TIMEOUT = 10000 // timeout in milliseconds
-
- /** The root directory for this test suite, usually the test kind ("test/files/presentation"). */
- protected val outDir = Path(Option(System.getProperty("partest.cwd")).getOrElse("."))
-
- /** The base directory for this test, usually a subdirectory of "test/files/presentation/" */
- protected val baseDir = Option(System.getProperty("partest.testname")).map(outDir / _).getOrElse(Path("."))
-
- /** Where source files are placed. */
- protected val sourceDir = "src"
-
- protected implicit val reporter: Reporter = ConsoleReporter
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/AbstractOrMissingHandler.scala b/src/compiler/scala/tools/nsc/interpreter/AbstractOrMissingHandler.scala
deleted file mode 100644
index e66e4eff29..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/AbstractOrMissingHandler.scala
+++ /dev/null
@@ -1,41 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-class AbstractOrMissingHandler[T](onError: String => Unit, value: T) extends PartialFunction[Throwable, T] {
- def isDefinedAt(t: Throwable) = t match {
- case _: AbstractMethodError => true
- case _: NoSuchMethodError => true
- case _: MissingRequirementError => true
- case _: NoClassDefFoundError => true
- case _ => false
- }
- def apply(t: Throwable) = t match {
- case x @ (_: AbstractMethodError | _: NoSuchMethodError | _: NoClassDefFoundError) =>
- onError("""
- |Failed to initialize compiler: %s.
- |This is most often remedied by a full clean and recompile.
- |Otherwise, your classpath may continue bytecode compiled by
- |different and incompatible versions of scala.
- |""".stripMargin.format(x.getClass.getName split '.' last)
- )
- x.printStackTrace()
- value
- case x: MissingRequirementError =>
- onError("""
- |Failed to initialize compiler: %s not found.
- |** Note that as of 2.8 scala does not assume use of the java classpath.
- |** For the old behavior pass -usejavacp to scala, or if using a Settings
- |** object programatically, settings.usejavacp.value = true.""".stripMargin.format(x.req)
- )
- value
- }
-}
-
-object AbstractOrMissingHandler {
- def apply[T]() = new AbstractOrMissingHandler[T](Console println _, null.asInstanceOf[T])
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala b/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala
deleted file mode 100644
index 48890a21c6..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ByteCode.scala
+++ /dev/null
@@ -1,42 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import java.lang.reflect
-import util.ScalaClassLoader
-import ScalaClassLoader.appLoader
-import scala.reflect.NameTransformer._
-
-object ByteCode {
- /** Until I figure out why I can't get scalap onto the classpath such
- * that the compiler will bootstrap, we have to use reflection.
- */
- private lazy val DECODER: Option[AnyRef] =
- for (clazz <- appLoader.tryToLoadClass[AnyRef]("scala.tools.scalap.Decode$")) yield
- clazz.getField(MODULE_INSTANCE_NAME).get(null)
-
- private def decoderMethod(name: String, args: JClass*): Option[reflect.Method] = {
- for (decoder <- DECODER ; m <- Option(decoder.getClass.getMethod(name, args: _*))) yield m
- }
-
- private lazy val aliasMap = {
- for (module <- DECODER ; method <- decoderMethod("typeAliases", classOf[String])) yield
- method.invoke(module, _: String).asInstanceOf[Option[Map[String, String]]]
- }
-
- /** Scala sig bytes.
- */
- def scalaSigBytesForPath(path: String) =
- for {
- module <- DECODER
- method <- decoderMethod("scalaSigAnnotationBytes", classOf[String])
- names <- method.invoke(module, path).asInstanceOf[Option[Array[Byte]]]
- }
- yield names
-
- def aliasesForPackage(pkg: String) = aliasMap flatMap (_(pkg))
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala b/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala
deleted file mode 100644
index 0ab92ab769..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/CommandLine.scala
+++ /dev/null
@@ -1,13 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Lex Spoon
- */
-
-package scala.tools.nsc
-package interpreter
-
-/** A command line for the interpreter.
- */
-class CommandLine(arguments: List[String], error: String => Unit) extends CompilerCommand(arguments, error) {
- override def cmdName = "scala"
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Completion.scala b/src/compiler/scala/tools/nsc/interpreter/Completion.scala
deleted file mode 100644
index 84a5cb49ae..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Completion.scala
+++ /dev/null
@@ -1,49 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import Completion._
-
-/** An implementation-agnostic completion interface which makes no
- * reference to the jline classes.
- */
-trait Completion {
- type ExecResult
- def resetVerbosity(): Unit
- def completer(): ScalaCompleter
-}
-object NoCompletion extends Completion {
- type ExecResult = Nothing
- def resetVerbosity() = ()
- def completer() = NullCompleter
-}
-
-object Completion {
- case class Candidates(cursor: Int, candidates: List[String]) { }
- val NoCandidates = Candidates(-1, Nil)
-
- object NullCompleter extends ScalaCompleter {
- def complete(buffer: String, cursor: Int): Candidates = NoCandidates
- }
- trait ScalaCompleter {
- def complete(buffer: String, cursor: Int): Candidates
- }
-
- def looksLikeInvocation(code: String) = (
- (code != null)
- && (code startsWith ".")
- && !(code == ".")
- && !(code startsWith "./")
- && !(code startsWith "..")
- )
- object Forwarder {
- def apply(forwardTo: () => Option[CompletionAware]): CompletionAware = new CompletionAware {
- def completions(verbosity: Int) = forwardTo() map (_ completions verbosity) getOrElse Nil
- override def follow(s: String) = forwardTo() flatMap (_ follow s)
- }
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/CompletionAware.scala b/src/compiler/scala/tools/nsc/interpreter/CompletionAware.scala
deleted file mode 100644
index 3dd5d93390..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/CompletionAware.scala
+++ /dev/null
@@ -1,53 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-/** An interface for objects which are aware of tab completion and
- * will supply their own candidates and resolve their own paths.
- */
-trait CompletionAware {
- /** The complete list of unqualified Strings to which this
- * object will complete.
- */
- def completions(verbosity: Int): List[String]
-
- /** The next completor in the chain.
- */
- def follow(id: String): Option[CompletionAware] = None
-
- /** A list of useful information regarding a specific uniquely
- * identified completion. This is specifically written for the
- * following situation, but should be useful elsewhere too:
- *
- * x.y.z.methodName<tab>
- *
- * If "methodName" is among z's completions, and verbosity > 0
- * indicating tab has been pressed twice consecutively, then we
- * call alternativesFor and show a list of overloaded method
- * signatures.
- */
- def alternativesFor(id: String): List[String] = Nil
-
- /** Given string 'buf', return a list of all the strings
- * to which it can complete. This may involve delegating
- * to other CompletionAware objects.
- */
- def completionsFor(parsed: Parsed): List[String] = {
- import parsed.{ buffer, verbosity }
- val comps = completions(verbosity) filter (_ startsWith buffer)
- val exact = comps contains buffer
-
- val results =
- if (parsed.isEmpty) comps
- else if (parsed.isUnqualified && !parsed.isLastDelimiter)
- if (verbosity > 0 && exact) alternativesFor(buffer)
- else comps
- else follow(parsed.bufferHead) map (_ completionsFor parsed.bufferTail) getOrElse Nil
-
- results.sorted
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/CompletionOutput.scala b/src/compiler/scala/tools/nsc/interpreter/CompletionOutput.scala
deleted file mode 100644
index d24ad60974..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/CompletionOutput.scala
+++ /dev/null
@@ -1,85 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-/** This has a lot of duplication with other methods in Symbols and Types,
- * but repl completion utility is very sensitive to precise output. Best
- * thing would be to abstract an interface for how such things are printed,
- * as is also in progress with error messages.
- */
-trait CompletionOutput {
- val global: Global
-
- import global._
- import definitions.{ isTupleType, isFunctionType, isRepeatedParamType }
-
- /** Reducing fully qualified noise for some common packages.
- */
- val typeTransforms = List(
- "java.lang." -> "",
- "scala.collection.immutable." -> "immutable.",
- "scala.collection.mutable." -> "mutable.",
- "scala.collection.generic." -> "generic."
- )
-
- def quietString(tp: String): String =
- typeTransforms.foldLeft(tp) {
- case (str, (prefix, replacement)) =>
- if (str startsWith prefix) replacement + (str stripPrefix prefix)
- else str
- }
-
- class MethodSymbolOutput(method: Symbol) {
- val pkg = method.ownerChain find (_.isPackageClass) map (_.fullName) getOrElse ""
-
- def relativize(str: String): String = quietString(str stripPrefix (pkg + "."))
- def relativize(tp: Type): String = relativize(tp.dealiasWiden.toString)
-
- def braceList(tparams: List[String]) = if (tparams.isEmpty) "" else (tparams map relativize).mkString("[", ", ", "]")
- def parenList(params: List[Any]) = params.mkString("(", ", ", ")")
-
- def methodTypeToString(mt: MethodType) =
- (mt.paramss map paramsString mkString "") + ": " + relativize(mt.finalResultType)
-
- def typeToString(tp: Type): String = relativize(
- tp match {
- case x if isFunctionType(x) => functionString(x)
- case x if isTupleType(x) => tupleString(x)
- case x if isRepeatedParamType(x) => typeToString(x.typeArgs.head) + "*"
- case mt @ MethodType(_, _) => methodTypeToString(mt)
- case x => x.toString
- }
- )
-
- def tupleString(tp: Type) = parenList(tp.dealiasWiden.typeArgs map relativize)
- def functionString(tp: Type) = tp.dealiasWiden.typeArgs match {
- case List(t, r) => t + " => " + r
- case xs => parenList(xs.init) + " => " + xs.last
- }
-
- def tparamsString(tparams: List[Symbol]) = braceList(tparams map (_.defString))
- def paramsString(params: List[Symbol]) = {
- def paramNameString(sym: Symbol) = if (sym.isSynthetic) "" else sym.nameString + ": "
- def paramString(sym: Symbol) = paramNameString(sym) + typeToString(sym.info.dealiasWiden)
-
- val isImplicit = params.nonEmpty && params.head.isImplicit
- val strs = (params map paramString) match {
- case x :: xs if isImplicit => ("implicit " + x) :: xs
- case xs => xs
- }
- parenList(strs)
- }
-
- def methodString() =
- method.keyString + " " + method.nameString + (method.info.dealiasWiden match {
- case NullaryMethodType(resType) => ": " + typeToString(resType)
- case PolyType(tparams, resType) => tparamsString(tparams) + typeToString(resType)
- case mt @ MethodType(_, _) => methodTypeToString(mt)
- case x => x.toString
- })
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala b/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala
deleted file mode 100644
index 48af261937..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ConsoleReaderHelper.scala
+++ /dev/null
@@ -1,63 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.tools.jline.console.{ ConsoleReader, CursorBuffer }
-
-trait ConsoleReaderHelper extends ConsoleReader {
- def terminal = getTerminal()
- def width = terminal.getWidth()
- def height = terminal.getHeight()
-
- def readOneKey(prompt: String): Int
- def eraseLine(): Unit
-
- private val marginSize = 3
- private def morePrompt = "--More--"
- private def emulateMore(): Int = {
- val key = readOneKey(morePrompt)
- try key match {
- case '\r' | '\n' => 1
- case 'q' => -1
- case _ => height - 1
- }
- finally {
- eraseLine()
- // TODO: still not quite managing to erase --More-- and get
- // back to a scala prompt without another keypress.
- if (key == 'q') {
- putString(getPrompt())
- redrawLine()
- flush()
- }
- }
- }
-
- override def printColumns(items: JCollection[_ <: CharSequence]): Unit =
- printColumns(items: List[String])
-
- def printColumns(items: List[String]): Unit = {
- if (items forall (_ == ""))
- return
-
- val longest = items map (_.length) max
- var linesLeft = if (isPaginationEnabled()) height - 1 else Int.MaxValue
- val columnSize = longest + marginSize
- val padded = items map ("%-" + columnSize + "s" format _)
- val groupSize = 1 max (width / columnSize) // make sure it doesn't divide to 0
-
- padded grouped groupSize foreach { xs =>
- println(xs.mkString)
- linesLeft -= 1
- if (linesLeft <= 0) {
- linesLeft = emulateMore()
- if (linesLeft < 0)
- return
- }
- }
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Delimited.scala b/src/compiler/scala/tools/nsc/interpreter/Delimited.scala
deleted file mode 100644
index e88a044931..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Delimited.scala
+++ /dev/null
@@ -1,41 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.tools.jline.console.completer.ArgumentCompleter.{ ArgumentDelimiter, ArgumentList }
-
-class JLineDelimiter extends ArgumentDelimiter {
- def toJLine(args: List[String], cursor: Int) = args match {
- case Nil => new ArgumentList(new Array[String](0), 0, 0, cursor)
- case xs => new ArgumentList(xs.toArray, xs.size - 1, xs.last.length, cursor)
- }
-
- def delimit(buffer: CharSequence, cursor: Int) = {
- val p = Parsed(buffer.toString, cursor)
- toJLine(p.args, cursor)
- }
- def isDelimiter(buffer: CharSequence, cursor: Int) = Parsed(buffer.toString, cursor).isDelimiter
-}
-
-trait Delimited {
- self: Parsed =>
-
- def delimited: Char => Boolean
- def escapeChars: List[Char] = List('\\')
-
- /** Break String into args based on delimiting function.
- */
- protected def toArgs(s: String): List[String] =
- if (s == "") Nil
- else (s indexWhere isDelimiterChar) match {
- case -1 => List(s)
- case idx => (s take idx) :: toArgs(s drop (idx + 1))
- }
-
- def isDelimiterChar(ch: Char) = delimited(ch)
- def isEscapeChar(ch: Char): Boolean = escapeChars contains ch
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ExprTyper.scala b/src/compiler/scala/tools/nsc/interpreter/ExprTyper.scala
deleted file mode 100644
index 9edd54b939..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ExprTyper.scala
+++ /dev/null
@@ -1,99 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.tools.nsc.ast.parser.Tokens.EOF
-
-trait ExprTyper {
- val repl: IMain
-
- import repl._
- import global.{ reporter => _, Import => _, _ }
- import definitions._
- import syntaxAnalyzer.UnitParser
- import naming.freshInternalVarName
-
- object codeParser {
- val global: repl.global.type = repl.global
- def applyRule[T](code: String, rule: UnitParser => T): T = {
- reporter.reset()
- val scanner = newUnitParser(code)
- val result = rule(scanner)
-
- if (!reporter.hasErrors)
- scanner.accept(EOF)
-
- result
- }
- def stmts(code: String) = applyRule(code, _.templateStats())
- }
-
- /** Parse a line into a sequence of trees. Returns None if the input is incomplete. */
- def parse(line: String): Option[List[Tree]] = debugging(s"""parse("$line")""") {
- var isIncomplete = false
- reporter.withIncompleteHandler((_, _) => isIncomplete = true) {
- val trees = codeParser.stmts(line)
- if (reporter.hasErrors) Some(Nil)
- else if (isIncomplete) None
- else Some(trees)
- }
- }
-
- def symbolOfLine(code: String): Symbol = {
- def asExpr(): Symbol = {
- val name = freshInternalVarName()
- // Typing it with a lazy val would give us the right type, but runs
- // into compiler bugs with things like existentials, so we compile it
- // behind a def and strip the NullaryMethodType which wraps the expr.
- val line = "def " + name + " = " + code
-
- interpretSynthetic(line) match {
- case IR.Success =>
- val sym0 = symbolOfTerm(name)
- // drop NullaryMethodType
- sym0.cloneSymbol setInfo exitingTyper(sym0.info.finalResultType)
- case _ => NoSymbol
- }
- }
- def asDefn(): Symbol = {
- val old = repl.definedSymbolList.toSet
-
- interpretSynthetic(code) match {
- case IR.Success =>
- repl.definedSymbolList filterNot old match {
- case Nil => NoSymbol
- case sym :: Nil => sym
- case syms => NoSymbol.newOverloaded(NoPrefix, syms)
- }
- case _ => NoSymbol
- }
- }
- def asError(): Symbol = {
- interpretSynthetic(code)
- NoSymbol
- }
- beSilentDuring(asExpr()) orElse beSilentDuring(asDefn()) orElse asError()
- }
-
- private var typeOfExpressionDepth = 0
- def typeOfExpression(expr: String, silent: Boolean = true): Type = {
- if (typeOfExpressionDepth > 2) {
- repldbg("Terminating typeOfExpression recursion for expression: " + expr)
- return NoType
- }
- typeOfExpressionDepth += 1
- // Don't presently have a good way to suppress undesirable success output
- // while letting errors through, so it is first trying it silently: if there
- // is an error, and errors are desired, then it re-evaluates non-silently
- // to induce the error message.
- try beSilentDuring(symbolOfLine(expr).tpe) match {
- case NoType if !silent => symbolOfLine(expr).tpe // generate error
- case tpe => tpe
- }
- finally typeOfExpressionDepth -= 1
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Formatting.scala b/src/compiler/scala/tools/nsc/interpreter/Formatting.scala
deleted file mode 100644
index 43e653edfd..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Formatting.scala
+++ /dev/null
@@ -1,35 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import util.stringFromWriter
-
-trait Formatting {
- def prompt: String
-
- def spaces(code: String): String = {
- /** Heuristic to avoid indenting and thereby corrupting """-strings and XML literals. */
- val tokens = List("\"\"\"", "</", "/>")
- val noIndent = (code contains "\n") && (tokens exists code.contains)
-
- if (noIndent) ""
- else prompt drop 1 map (_ => ' ')
- }
- /** Indent some code by the width of the scala> prompt.
- * This way, compiler error messages read better.
- */
- def indentCode(code: String) = {
- val indent = spaces(code)
- stringFromWriter(str =>
- for (line <- code.lines) {
- str print indent
- str print (line + "\n")
- str.flush()
- }
- )
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala b/src/compiler/scala/tools/nsc/interpreter/ILoop.scala
deleted file mode 100644
index 2ea255319d..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ILoop.scala
+++ /dev/null
@@ -1,749 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Alexander Spoon
- */
-
-package scala.tools.nsc
-package interpreter
-
-import Predef.{ println => _, _ }
-import java.io.{ BufferedReader, FileReader }
-import session._
-import scala.annotation.tailrec
-import scala.util.Properties.{ jdkHome, javaVersion, versionString, javaVmName }
-import scala.tools.util.{ Javap }
-import util.{ ClassPath, Exceptional, stringFromWriter, stringFromStream }
-import io.{ File, Directory }
-import util.ScalaClassLoader
-import ScalaClassLoader._
-import scala.tools.util._
-import scala.language.{implicitConversions, existentials}
-import scala.reflect.classTag
-import scala.tools.reflect.StdRuntimeTags._
-import scala.concurrent.{ ExecutionContext, Await, Future, future }
-import ExecutionContext.Implicits._
-
-/** The Scala interactive shell. It provides a read-eval-print loop
- * around the Interpreter class.
- * After instantiation, clients should call the main() method.
- *
- * If no in0 is specified, then input will come from the console, and
- * the class will attempt to provide input editing feature such as
- * input history.
- *
- * @author Moez A. Abdel-Gawad
- * @author Lex Spoon
- * @version 1.2
- */
-class ILoop(in0: Option[BufferedReader], protected val out: JPrintWriter)
- extends AnyRef
- with LoopCommands
-{
- def this(in0: BufferedReader, out: JPrintWriter) = this(Some(in0), out)
- def this() = this(None, new JPrintWriter(Console.out, true))
-
- @deprecated("Use `intp` instead.", "2.9.0") def interpreter = intp
- @deprecated("Use `intp` instead.", "2.9.0") def interpreter_= (i: Interpreter): Unit = intp = i
-
- var in: InteractiveReader = _ // the input stream from which commands come
- var settings: Settings = _
- var intp: IMain = _
-
- private var globalFuture: Future[Boolean] = _
-
- /** Print a welcome message */
- def printWelcome() {
- echo(s"""
- |Welcome to Scala $versionString ($javaVmName, Java $javaVersion).
- |Type in expressions to have them evaluated.
- |Type :help for more information.""".trim.stripMargin
- )
- replinfo("[info] started at " + new java.util.Date)
- }
-
- protected def asyncMessage(msg: String) {
- if (isReplInfo || isReplPower)
- echoAndRefresh(msg)
- }
-
- override def echoCommandMessage(msg: String) {
- intp.reporter printUntruncatedMessage msg
- }
-
- lazy val power = new Power(intp, new StdReplVals(this))(tagOfStdReplVals, classTag[StdReplVals])
- def history = in.history
-
- // classpath entries added via :cp
- var addedClasspath: String = ""
-
- /** A reverse list of commands to replay if the user requests a :replay */
- var replayCommandStack: List[String] = Nil
-
- /** A list of commands to replay if the user requests a :replay */
- def replayCommands = replayCommandStack.reverse
-
- /** Record a command for replay should the user request a :replay */
- def addReplay(cmd: String) = replayCommandStack ::= cmd
-
- def savingReplayStack[T](body: => T): T = {
- val saved = replayCommandStack
- try body
- finally replayCommandStack = saved
- }
- def savingReader[T](body: => T): T = {
- val saved = in
- try body
- finally in = saved
- }
-
- /** Close the interpreter and set the var to null. */
- def closeInterpreter() {
- if (intp ne null) {
- intp.close()
- intp = null
- }
- }
-
- class ILoopInterpreter extends IMain(settings, out) {
- outer =>
-
- override lazy val formatting = new Formatting {
- def prompt = ILoop.this.prompt
- }
- override protected def parentClassLoader =
- settings.explicitParentLoader.getOrElse( classOf[ILoop].getClassLoader )
- }
-
- /** Create a new interpreter. */
- def createInterpreter() {
- if (addedClasspath != "")
- settings.classpath append addedClasspath
-
- intp = new ILoopInterpreter
- }
-
- /** print a friendly help message */
- def helpCommand(line: String): Result = {
- if (line == "") helpSummary()
- else uniqueCommand(line) match {
- case Some(lc) => echo("\n" + lc.help)
- case _ => ambiguousError(line)
- }
- }
- private def helpSummary() = {
- val usageWidth = commands map (_.usageMsg.length) max
- val formatStr = "%-" + usageWidth + "s %s"
-
- echo("All commands can be abbreviated, e.g. :he instead of :help.")
-
- commands foreach { cmd =>
- echo(formatStr.format(cmd.usageMsg, cmd.help))
- }
- }
- private def ambiguousError(cmd: String): Result = {
- matchingCommands(cmd) match {
- case Nil => echo(cmd + ": no such command. Type :help for help.")
- case xs => echo(cmd + " is ambiguous: did you mean " + xs.map(":" + _.name).mkString(" or ") + "?")
- }
- Result(keepRunning = true, None)
- }
- private def matchingCommands(cmd: String) = commands filter (_.name startsWith cmd)
- private def uniqueCommand(cmd: String): Option[LoopCommand] = {
- // this lets us add commands willy-nilly and only requires enough command to disambiguate
- matchingCommands(cmd) match {
- case List(x) => Some(x)
- // exact match OK even if otherwise appears ambiguous
- case xs => xs find (_.name == cmd)
- }
- }
-
- /** Show the history */
- lazy val historyCommand = new LoopCommand("history", "show the history (optional num is commands to show)") {
- override def usage = "[num]"
- def defaultLines = 20
-
- def apply(line: String): Result = {
- if (history eq NoHistory)
- return "No history available."
-
- val xs = words(line)
- val current = history.index
- val count = try xs.head.toInt catch { case _: Exception => defaultLines }
- val lines = history.asStrings takeRight count
- val offset = current - lines.size + 1
-
- for ((line, index) <- lines.zipWithIndex)
- echo("%3d %s".format(index + offset, line))
- }
- }
-
- // When you know you are most likely breaking into the middle
- // of a line being typed. This softens the blow.
- protected def echoAndRefresh(msg: String) = {
- echo("\n" + msg)
- in.redrawLine()
- }
- protected def echo(msg: String) = {
- out println msg
- out.flush()
- }
-
- /** Search the history */
- def searchHistory(_cmdline: String) {
- val cmdline = _cmdline.toLowerCase
- val offset = history.index - history.size + 1
-
- for ((line, index) <- history.asStrings.zipWithIndex ; if line.toLowerCase contains cmdline)
- echo("%d %s".format(index + offset, line))
- }
-
- private val currentPrompt = Properties.shellPromptString
-
- /** Prompt to print when awaiting input */
- def prompt = currentPrompt
-
- import LoopCommand.{ cmd, nullary }
-
- /** Standard commands **/
- lazy val standardCommands = List(
- cmd("cp", "<path>", "add a jar or directory to the classpath", addClasspath),
- cmd("help", "[command]", "print this summary or command-specific help", helpCommand),
- historyCommand,
- cmd("h?", "<string>", "search the history", searchHistory),
- cmd("imports", "[name name ...]", "show import history, identifying sources of names", importsCommand),
- cmd("implicits", "[-v]", "show the implicits in scope", intp.implicitsCommand),
- cmd("javap", "<path|class>", "disassemble a file or class name", javapCommand),
- cmd("load", "<path>", "load and interpret a Scala file", loadCommand),
- nullary("paste", "enter paste mode: all input up to ctrl-D compiled together", pasteCommand),
- nullary("power", "enable power user mode", powerCmd),
- nullary("quit", "exit the interpreter", () => Result(keepRunning = false, None)),
- nullary("replay", "reset execution and replay all previous commands", replay),
- nullary("reset", "reset the repl to its initial state, forgetting all session entries", resetCommand),
- shCommand,
- nullary("silent", "disable/enable automatic printing of results", verbosity),
- cmd("type", "[-v] <expr>", "display the type of an expression without evaluating it", typeCommand),
- nullary("warnings", "show the suppressed warnings from the most recent line which had any", warningsCommand)
- )
-
- /** Power user commands */
- lazy val powerCommands: List[LoopCommand] = List(
- cmd("phase", "<phase>", "set the implicit phase for power commands", phaseCommand)
- )
-
- private def importsCommand(line: String): Result = {
- val tokens = words(line)
- val handlers = intp.languageWildcardHandlers ++ intp.importHandlers
-
- handlers.filterNot(_.importedSymbols.isEmpty).zipWithIndex foreach {
- case (handler, idx) =>
- val (types, terms) = handler.importedSymbols partition (_.name.isTypeName)
- val imps = handler.implicitSymbols
- val found = tokens filter (handler importsSymbolNamed _)
- val typeMsg = if (types.isEmpty) "" else types.size + " types"
- val termMsg = if (terms.isEmpty) "" else terms.size + " terms"
- val implicitMsg = if (imps.isEmpty) "" else imps.size + " are implicit"
- val foundMsg = if (found.isEmpty) "" else found.mkString(" // imports: ", ", ", "")
- val statsMsg = List(typeMsg, termMsg, implicitMsg) filterNot (_ == "") mkString ("(", ", ", ")")
-
- intp.reporter.printMessage("%2d) %-30s %s%s".format(
- idx + 1,
- handler.importString,
- statsMsg,
- foundMsg
- ))
- }
- }
-
- private def findToolsJar() = {
- val jdkPath = Directory(jdkHome)
- val jar = jdkPath / "lib" / "tools.jar" toFile
-
- if (jar isFile)
- Some(jar)
- else if (jdkPath.isDirectory)
- jdkPath.deepFiles find (_.name == "tools.jar")
- else None
- }
- private def addToolsJarToLoader() = {
- val cl = findToolsJar() match {
- case Some(tools) => ScalaClassLoader.fromURLs(Seq(tools.toURL), intp.classLoader)
- case _ => intp.classLoader
- }
- if (Javap.isAvailable(cl)) {
- repldbg(":javap available.")
- cl
- }
- else {
- repldbg(":javap unavailable: no tools.jar at " + jdkHome)
- intp.classLoader
- }
- }
-
- protected def newJavap() =
- JavapClass(addToolsJarToLoader(), new IMain.ReplStrippingWriter(intp), Some(intp))
-
- private lazy val javap = substituteAndLog[Javap]("javap", NoJavap)(newJavap())
-
- // Still todo: modules.
- private def typeCommand(line0: String): Result = {
- line0.trim match {
- case "" => ":type [-v] <expression>"
- case s if s startsWith "-v " => intp.typeCommandInternal(s stripPrefix "-v " trim, verbose = true)
- case s => intp.typeCommandInternal(s, verbose = false)
- }
- }
-
- private def warningsCommand(): Result = {
- if (intp.lastWarnings.isEmpty)
- "Can't find any cached warnings."
- else
- intp.lastWarnings foreach { case (pos, msg) => intp.reporter.warning(pos, msg) }
- }
-
- private def javapCommand(line: String): Result = {
- if (javap == null)
- ":javap unavailable, no tools.jar at %s. Set JDK_HOME.".format(jdkHome)
- else if (line == "")
- ":javap [-lcsvp] [path1 path2 ...]"
- else
- javap(words(line)) foreach { res =>
- if (res.isError) return "Failed: " + res.value
- else res.show()
- }
- }
-
- private def pathToPhaseWrapper = intp.originalPath("$r") + ".phased.atCurrent"
-
- private def phaseCommand(name: String): Result = {
- val phased: Phased = power.phased
- import phased.NoPhaseName
-
- if (name == "clear") {
- phased.set(NoPhaseName)
- intp.clearExecutionWrapper()
- "Cleared active phase."
- }
- else if (name == "") phased.get match {
- case NoPhaseName => "Usage: :phase <expr> (e.g. typer, erasure.next, erasure+3)"
- case ph => "Active phase is '%s'. (To clear, :phase clear)".format(phased.get)
- }
- else {
- val what = phased.parse(name)
- if (what.isEmpty || !phased.set(what))
- "'" + name + "' does not appear to represent a valid phase."
- else {
- intp.setExecutionWrapper(pathToPhaseWrapper)
- val activeMessage =
- if (what.toString.length == name.length) "" + what
- else "%s (%s)".format(what, name)
-
- "Active phase is now: " + activeMessage
- }
- }
- }
-
- /** Available commands */
- def commands: List[LoopCommand] = standardCommands ++ (
- if (isReplPower) powerCommands else Nil
- )
-
- val replayQuestionMessage =
- """|That entry seems to have slain the compiler. Shall I replay
- |your session? I can re-run each line except the last one.
- |[y/n]
- """.trim.stripMargin
-
- private val crashRecovery: PartialFunction[Throwable, Boolean] = {
- case ex: Throwable =>
- echo(intp.global.throwableAsString(ex))
-
- ex match {
- case _: NoSuchMethodError | _: NoClassDefFoundError =>
- echo("\nUnrecoverable error.")
- throw ex
- case _ =>
- def fn(): Boolean =
- try in.readYesOrNo(replayQuestionMessage, { echo("\nYou must enter y or n.") ; fn() })
- catch { case _: RuntimeException => false }
-
- if (fn()) replay()
- else echo("\nAbandoning crashed session.")
- }
- true
- }
-
- // return false if repl should exit
- def processLine(line: String): Boolean = {
- import scala.concurrent.duration._
- Await.ready(globalFuture, 60.seconds)
-
- (line ne null) && (command(line) match {
- case Result(false, _) => false
- case Result(_, Some(line)) => addReplay(line) ; true
- case _ => true
- })
- }
-
- private def readOneLine() = {
- out.flush()
- in readLine prompt
- }
-
- /** The main read-eval-print loop for the repl. It calls
- * command() for each line of input, and stops when
- * command() returns false.
- */
- @tailrec final def loop() {
- if ( try processLine(readOneLine()) catch crashRecovery )
- loop()
- }
-
- /** interpret all lines from a specified file */
- def interpretAllFrom(file: File) {
- savingReader {
- savingReplayStack {
- file applyReader { reader =>
- in = SimpleReader(reader, out, interactive = false)
- echo("Loading " + file + "...")
- loop()
- }
- }
- }
- }
-
- /** create a new interpreter and replay the given commands */
- def replay() {
- reset()
- if (replayCommandStack.isEmpty)
- echo("Nothing to replay.")
- else for (cmd <- replayCommands) {
- echo("Replaying: " + cmd) // flush because maybe cmd will have its own output
- command(cmd)
- echo("")
- }
- }
- def resetCommand() {
- echo("Resetting interpreter state.")
- if (replayCommandStack.nonEmpty) {
- echo("Forgetting this session history:\n")
- replayCommands foreach echo
- echo("")
- replayCommandStack = Nil
- }
- if (intp.namedDefinedTerms.nonEmpty)
- echo("Forgetting all expression results and named terms: " + intp.namedDefinedTerms.mkString(", "))
- if (intp.definedTypes.nonEmpty)
- echo("Forgetting defined types: " + intp.definedTypes.mkString(", "))
-
- reset()
- }
- def reset() {
- intp.reset()
- unleashAndSetPhase()
- }
-
- /** fork a shell and run a command */
- lazy val shCommand = new LoopCommand("sh", "run a shell command (result is implicitly => List[String])") {
- override def usage = "<command line>"
- def apply(line: String): Result = line match {
- case "" => showUsage()
- case _ =>
- val toRun = classOf[ProcessResult].getName + "(" + string2codeQuoted(line) + ")"
- intp interpret toRun
- ()
- }
- }
-
- def withFile(filename: String)(action: File => Unit) {
- val f = File(filename)
-
- if (f.exists) action(f)
- else echo("That file does not exist")
- }
-
- def loadCommand(arg: String) = {
- var shouldReplay: Option[String] = None
- withFile(arg)(f => {
- interpretAllFrom(f)
- shouldReplay = Some(":load " + arg)
- })
- Result(keepRunning = true, shouldReplay)
- }
-
- def addClasspath(arg: String): Unit = {
- val f = File(arg).normalize
- if (f.exists) {
- addedClasspath = ClassPath.join(addedClasspath, f.path)
- val totalClasspath = ClassPath.join(settings.classpath.value, addedClasspath)
- echo("Added '%s'. Your new classpath is:\n\"%s\"".format(f.path, totalClasspath))
- replay()
- }
- else echo("The path '" + f + "' doesn't seem to exist.")
- }
-
- def powerCmd(): Result = {
- if (isReplPower) "Already in power mode."
- else enablePowerMode(isDuringInit = false)
- }
- def enablePowerMode(isDuringInit: Boolean) = {
- replProps.power setValue true
- unleashAndSetPhase()
- asyncEcho(isDuringInit, power.banner)
- }
- private def unleashAndSetPhase() {
- if (isReplPower) {
- power.unleash()
- // Set the phase to "typer"
- intp beSilentDuring phaseCommand("typer")
- }
- }
-
- def asyncEcho(async: Boolean, msg: => String) {
- if (async) asyncMessage(msg)
- else echo(msg)
- }
-
- def verbosity() = {
- val old = intp.printResults
- intp.printResults = !old
- echo("Switched " + (if (old) "off" else "on") + " result printing.")
- }
-
- /** Run one command submitted by the user. Two values are returned:
- * (1) whether to keep running, (2) the line to record for replay,
- * if any. */
- def command(line: String): Result = {
- if (line startsWith ":") {
- val cmd = line.tail takeWhile (x => !x.isWhitespace)
- uniqueCommand(cmd) match {
- case Some(lc) => lc(line.tail stripPrefix cmd dropWhile (_.isWhitespace))
- case _ => ambiguousError(cmd)
- }
- }
- else if (intp.global == null) Result(keepRunning = false, None) // Notice failure to create compiler
- else Result(keepRunning = true, interpretStartingWith(line))
- }
-
- private def readWhile(cond: String => Boolean) = {
- Iterator continually in.readLine("") takeWhile (x => x != null && cond(x))
- }
-
- def pasteCommand(): Result = {
- echo("// Entering paste mode (ctrl-D to finish)\n")
- val code = readWhile(_ => true) mkString "\n"
- echo("\n// Exiting paste mode, now interpreting.\n")
- intp interpret code
- ()
- }
-
- private object paste extends Pasted {
- val ContinueString = " | "
- val PromptString = "scala> "
-
- def interpret(line: String): Unit = {
- echo(line.trim)
- intp interpret line
- echo("")
- }
-
- def transcript(start: String) = {
- echo("\n// Detected repl transcript paste: ctrl-D to finish.\n")
- apply(Iterator(start) ++ readWhile(_.trim != PromptString.trim))
- }
- }
- import paste.{ ContinueString, PromptString }
-
- /** Interpret expressions starting with the first line.
- * Read lines until a complete compilation unit is available
- * or until a syntax error has been seen. If a full unit is
- * read, go ahead and interpret it. Return the full string
- * to be recorded for replay, if any.
- */
- def interpretStartingWith(code: String): Option[String] = {
- // signal completion non-completion input has been received
- in.completion.resetVerbosity()
-
- def reallyInterpret = {
- val reallyResult = intp.interpret(code)
- (reallyResult, reallyResult match {
- case IR.Error => None
- case IR.Success => Some(code)
- case IR.Incomplete =>
- if (in.interactive && code.endsWith("\n\n")) {
- echo("You typed two blank lines. Starting a new command.")
- None
- }
- else in.readLine(ContinueString) match {
- case null =>
- // we know compilation is going to fail since we're at EOF and the
- // parser thinks the input is still incomplete, but since this is
- // a file being read non-interactively we want to fail. So we send
- // it straight to the compiler for the nice error message.
- intp.compileString(code)
- None
-
- case line => interpretStartingWith(code + "\n" + line)
- }
- })
- }
-
- /** Here we place ourselves between the user and the interpreter and examine
- * the input they are ostensibly submitting. We intervene in several cases:
- *
- * 1) If the line starts with "scala> " it is assumed to be an interpreter paste.
- * 2) If the line starts with "." (but not ".." or "./") it is treated as an invocation
- * on the previous result.
- * 3) If the Completion object's execute returns Some(_), we inject that value
- * and avoid the interpreter, as it's likely not valid scala code.
- */
- if (code == "") None
- else if (!paste.running && code.trim.startsWith(PromptString)) {
- paste.transcript(code)
- None
- }
- else if (Completion.looksLikeInvocation(code) && intp.mostRecentVar != "") {
- interpretStartingWith(intp.mostRecentVar + code)
- }
- else if (code.trim startsWith "//") {
- // line comment, do nothing
- None
- }
- else
- reallyInterpret._2
- }
-
- // runs :load `file` on any files passed via -i
- def loadFiles(settings: Settings) = settings match {
- case settings: GenericRunnerSettings =>
- for (filename <- settings.loadfiles.value) {
- val cmd = ":load " + filename
- command(cmd)
- addReplay(cmd)
- echo("")
- }
- case _ =>
- }
-
- /** Tries to create a JLineReader, falling back to SimpleReader:
- * unless settings or properties are such that it should start
- * with SimpleReader.
- */
- def chooseReader(settings: Settings): InteractiveReader = {
- if (settings.Xnojline.value || Properties.isEmacsShell)
- SimpleReader()
- else try new JLineReader(
- if (settings.noCompletion.value) NoCompletion
- else new JLineCompletion(intp)
- )
- catch {
- case ex @ (_: Exception | _: NoClassDefFoundError) =>
- echo("Failed to created JLineReader: " + ex + "\nFalling back to SimpleReader.")
- SimpleReader()
- }
- }
-
- private def loopPostInit() {
- in match {
- case x: JLineReader => x.consoleReader.postInit
- case _ =>
- }
- // Bind intp somewhere out of the regular namespace where
- // we can get at it in generated code.
- intp.quietBind(NamedParam[IMain]("$intp", intp)(tagOfIMain, classTag[IMain]))
- // Auto-run code via some setting.
- ( replProps.replAutorunCode.option
- flatMap (f => io.File(f).safeSlurp())
- foreach (intp quietRun _)
- )
- // classloader and power mode setup
- intp.setContextClassLoader()
- if (isReplPower) {
- replProps.power setValue true
- unleashAndSetPhase()
- asyncMessage(power.banner)
- }
- }
- def process(settings: Settings): Boolean = savingContextLoader {
- this.settings = settings
- createInterpreter()
-
- // sets in to some kind of reader depending on environmental cues
- in = in0.fold(chooseReader(settings))(r => SimpleReader(r, out, interactive = true))
- globalFuture = future {
- intp.initializeSynchronous()
- loopPostInit()
- loadFiles(settings)
- !intp.reporter.hasErrors
- }
- printWelcome()
-
- try loop()
- catch AbstractOrMissingHandler()
- finally closeInterpreter()
-
- true
- }
-
- @deprecated("Use `process` instead", "2.9.0")
- def main(settings: Settings): Unit = process(settings) //used by sbt
-}
-
-object ILoop {
- implicit def loopToInterpreter(repl: ILoop): IMain = repl.intp
-
- // Designed primarily for use by test code: take a String with a
- // bunch of code, and prints out a transcript of what it would look
- // like if you'd just typed it into the repl.
- def runForTranscript(code: String, settings: Settings): String = {
- import java.io.{ BufferedReader, StringReader, OutputStreamWriter }
-
- stringFromStream { ostream =>
- Console.withOut(ostream) {
- val output = new JPrintWriter(new OutputStreamWriter(ostream), true) {
- override def write(str: String) = {
- // completely skip continuation lines
- if (str forall (ch => ch.isWhitespace || ch == '|')) ()
- // print a newline on empty scala prompts
- else if ((str contains '\n') && (str.trim == "scala> ")) super.write("\n")
- else super.write(str)
- }
- }
- val input = new BufferedReader(new StringReader(code)) {
- override def readLine(): String = {
- val s = super.readLine()
- // helping out by printing the line being interpreted.
- if (s != null)
- output.println(s)
- s
- }
- }
- val repl = new ILoop(input, output)
- if (settings.classpath.isDefault)
- settings.classpath.value = sys.props("java.class.path")
-
- repl process settings
- }
- }
- }
-
- /** Creates an interpreter loop with default settings and feeds
- * the given code to it as input.
- */
- def run(code: String, sets: Settings = new Settings): String = {
- import java.io.{ BufferedReader, StringReader, OutputStreamWriter }
-
- stringFromStream { ostream =>
- Console.withOut(ostream) {
- val input = new BufferedReader(new StringReader(code))
- val output = new JPrintWriter(new OutputStreamWriter(ostream), true)
- val repl = new ILoop(input, output)
-
- if (sets.classpath.isDefault)
- sets.classpath.value = sys.props("java.class.path")
-
- repl process sets
- }
- }
- }
- def run(lines: List[String]): String = run(lines map (_ + "\n") mkString)
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/IMain.scala b/src/compiler/scala/tools/nsc/interpreter/IMain.scala
deleted file mode 100644
index c54b01dbb0..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/IMain.scala
+++ /dev/null
@@ -1,1121 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Martin Odersky
- */
-
-package scala.tools.nsc
-package interpreter
-
-import Predef.{ println => _, _ }
-import util.stringFromWriter
-import scala.reflect.internal.util._
-import java.net.URL
-import scala.sys.BooleanProp
-import scala.tools.nsc.io.AbstractFile
-import reporters._
-import scala.tools.util.PathResolver
-import scala.tools.nsc.util.ScalaClassLoader
-import ScalaClassLoader.URLClassLoader
-import scala.tools.nsc.util.Exceptional.unwrap
-import scala.collection.{ mutable, immutable }
-import IMain._
-import java.util.concurrent.Future
-import scala.reflect.runtime.{ universe => ru }
-import scala.reflect.{ ClassTag, classTag }
-import scala.tools.reflect.StdRuntimeTags._
-
-/** An interpreter for Scala code.
- *
- * The main public entry points are compile(), interpret(), and bind().
- * The compile() method loads a complete Scala file. The interpret() method
- * executes one line of Scala code at the request of the user. The bind()
- * method binds an object to a variable that can then be used by later
- * interpreted code.
- *
- * The overall approach is based on compiling the requested code and then
- * using a Java classloader and Java reflection to run the code
- * and access its results.
- *
- * In more detail, a single compiler instance is used
- * to accumulate all successfully compiled or interpreted Scala code. To
- * "interpret" a line of code, the compiler generates a fresh object that
- * includes the line of code and which has public member(s) to export
- * all variables defined by that code. To extract the result of an
- * interpreted line to show the user, a second "result object" is created
- * which imports the variables exported by the above object and then
- * exports members called "$eval" and "$print". To accomodate user expressions
- * that read from variables or methods defined in previous statements, "import"
- * statements are used.
- *
- * This interpreter shares the strengths and weaknesses of using the
- * full compiler-to-Java. The main strength is that interpreted code
- * behaves exactly as does compiled code, including running at full speed.
- * The main weakness is that redefining classes and methods is not handled
- * properly, because rebinding at the Java level is technically difficult.
- *
- * @author Moez A. Abdel-Gawad
- * @author Lex Spoon
- */
-class IMain(initialSettings: Settings, protected val out: JPrintWriter) extends Imports {
- imain =>
-
- object replOutput extends ReplOutput(settings.Yreploutdir) { }
-
- @deprecated("Use replOutput.dir instead", "2.11.0")
- def virtualDirectory = replOutput.dir
- // Used in a test case.
- def showDirectory() = replOutput.show(out)
-
- private[nsc] var printResults = true // whether to print result lines
- private[nsc] var totalSilence = false // whether to print anything
- private var _initializeComplete = false // compiler is initialized
- private var _isInitialized: Future[Boolean] = null // set up initialization future
- private var bindExceptions = true // whether to bind the lastException variable
- private var _executionWrapper = "" // code to be wrapped around all lines
-
- /** We're going to go to some trouble to initialize the compiler asynchronously.
- * It's critical that nothing call into it until it's been initialized or we will
- * run into unrecoverable issues, but the perceived repl startup time goes
- * through the roof if we wait for it. So we initialize it with a future and
- * use a lazy val to ensure that any attempt to use the compiler object waits
- * on the future.
- */
- private var _classLoader: AbstractFileClassLoader = null // active classloader
- private val _compiler: Global = newCompiler(settings, reporter) // our private compiler
-
- def compilerClasspath: Seq[URL] = (
- if (isInitializeComplete) global.classPath.asURLs
- else new PathResolver(settings).result.asURLs // the compiler's classpath
- )
- def settings = initialSettings
- // Run the code body with the given boolean settings flipped to true.
- def withoutWarnings[T](body: => T): T = beQuietDuring {
- val saved = settings.nowarn.value
- if (!saved)
- settings.nowarn.value = true
-
- try body
- finally if (!saved) settings.nowarn.value = false
- }
-
- /** construct an interpreter that reports to Console */
- def this(settings: Settings) = this(settings, new NewLinePrintWriter(new ConsoleWriter, true))
- def this() = this(new Settings())
-
- lazy val formatting: Formatting = new Formatting {
- val prompt = Properties.shellPromptString
- }
- lazy val reporter: ReplReporter = new ReplReporter(this)
-
- import formatting._
- import reporter.{ printMessage, withoutTruncating }
-
- // This exists mostly because using the reporter too early leads to deadlock.
- private def echo(msg: String) { Console println msg }
- private def _initSources = List(new BatchSourceFile("<init>", "class $repl_$init { }"))
- private def _initialize() = {
- try {
- // todo. if this crashes, REPL will hang
- new _compiler.Run() compileSources _initSources
- _initializeComplete = true
- true
- }
- catch AbstractOrMissingHandler()
- }
- private def tquoted(s: String) = "\"\"\"" + s + "\"\"\""
- private val logScope = scala.sys.props contains "scala.repl.scope"
- private def scopelog(msg: String) = if (logScope) Console.err.println(msg)
-
- // argument is a thunk to execute after init is done
- def initialize(postInitSignal: => Unit) {
- synchronized {
- if (_isInitialized == null) {
- _isInitialized = io.spawn {
- try _initialize()
- finally postInitSignal
- }
- }
- }
- }
- def initializeSynchronous(): Unit = {
- if (!isInitializeComplete) {
- _initialize()
- assert(global != null, global)
- }
- }
- def isInitializeComplete = _initializeComplete
-
- /** the public, go through the future compiler */
- lazy val global: Global = {
- if (isInitializeComplete) _compiler
- else {
- // If init hasn't been called yet you're on your own.
- if (_isInitialized == null) {
- repldbg("Warning: compiler accessed before init set up. Assuming no postInit code.")
- initialize(())
- }
- // blocks until it is ; false means catastrophic failure
- if (_isInitialized.get()) _compiler
- else null
- }
- }
-
- import global._
- import definitions.{ ObjectClass, termMember, dropNullaryMethod}
-
- lazy val runtimeMirror = ru.runtimeMirror(classLoader)
-
- private def noFatal(body: => Symbol): Symbol = try body catch { case _: FatalError => NoSymbol }
-
- def getClassIfDefined(path: String) = (
- noFatal(runtimeMirror staticClass path)
- orElse noFatal(rootMirror staticClass path)
- )
- def getModuleIfDefined(path: String) = (
- noFatal(runtimeMirror staticModule path)
- orElse noFatal(rootMirror staticModule path)
- )
-
- implicit class ReplTypeOps(tp: Type) {
- def andAlso(fn: Type => Type): Type = if (tp eq NoType) tp else fn(tp)
- }
-
- // TODO: If we try to make naming a lazy val, we run into big time
- // scalac unhappiness with what look like cycles. It has not been easy to
- // reduce, but name resolution clearly takes different paths.
- object naming extends {
- val global: imain.global.type = imain.global
- } with Naming {
- // make sure we don't overwrite their unwisely named res3 etc.
- def freshUserTermName(): TermName = {
- val name = newTermName(freshUserVarName())
- if (replScope containsName name) freshUserTermName()
- else name
- }
- def isInternalTermName(name: Name) = isInternalVarName("" + name)
- }
- import naming._
-
- object deconstruct extends {
- val global: imain.global.type = imain.global
- } with StructuredTypeStrings
-
- lazy val memberHandlers = new {
- val intp: imain.type = imain
- } with MemberHandlers
- import memberHandlers._
-
- /** Temporarily be quiet */
- def beQuietDuring[T](body: => T): T = {
- val saved = printResults
- printResults = false
- try body
- finally printResults = saved
- }
- def beSilentDuring[T](operation: => T): T = {
- val saved = totalSilence
- totalSilence = true
- try operation
- finally totalSilence = saved
- }
-
- def quietRun[T](code: String) = beQuietDuring(interpret(code))
-
- /** takes AnyRef because it may be binding a Throwable or an Exceptional */
- private def withLastExceptionLock[T](body: => T, alt: => T): T = {
- assert(bindExceptions, "withLastExceptionLock called incorrectly.")
- bindExceptions = false
-
- try beQuietDuring(body)
- catch logAndDiscard("withLastExceptionLock", alt)
- finally bindExceptions = true
- }
-
- def executionWrapper = _executionWrapper
- def setExecutionWrapper(code: String) = _executionWrapper = code
- def clearExecutionWrapper() = _executionWrapper = ""
-
- /** interpreter settings */
- lazy val isettings = new ISettings(this)
-
- /** Instantiate a compiler. Overridable. */
- protected def newCompiler(settings: Settings, reporter: Reporter): ReplGlobal = {
- settings.outputDirs setSingleOutput replOutput.dir
- settings.exposeEmptyPackage.value = true
- new Global(settings, reporter) with ReplGlobal { override def toString: String = "<global>" }
- }
-
- /** Parent classloader. Overridable. */
- protected def parentClassLoader: ClassLoader =
- settings.explicitParentLoader.getOrElse( this.getClass.getClassLoader() )
-
- /* A single class loader is used for all commands interpreted by this Interpreter.
- It would also be possible to create a new class loader for each command
- to interpret. The advantages of the current approach are:
-
- - Expressions are only evaluated one time. This is especially
- significant for I/O, e.g. "val x = Console.readLine"
-
- The main disadvantage is:
-
- - Objects, classes, and methods cannot be rebound. Instead, definitions
- shadow the old ones, and old code objects refer to the old
- definitions.
- */
- def resetClassLoader() = {
- repldbg("Setting new classloader: was " + _classLoader)
- _classLoader = null
- ensureClassLoader()
- }
- final def ensureClassLoader() {
- if (_classLoader == null)
- _classLoader = makeClassLoader()
- }
- def classLoader: AbstractFileClassLoader = {
- ensureClassLoader()
- _classLoader
- }
-
- def backticked(s: String): String = (
- (s split '.').toList map {
- case "_" => "_"
- case s if nme.keywords(newTermName(s)) => s"`$s`"
- case s => s
- } mkString "."
- )
-
- abstract class PhaseDependentOps {
- def shift[T](op: => T): T
-
- def path(name: => Name): String = shift(path(symbolOfName(name)))
- def path(sym: Symbol): String = backticked(shift(sym.fullName))
- def sig(sym: Symbol): String = shift(sym.defString)
- }
- object typerOp extends PhaseDependentOps {
- def shift[T](op: => T): T = exitingTyper(op)
- }
- object flatOp extends PhaseDependentOps {
- def shift[T](op: => T): T = exitingFlatten(op)
- }
-
- def originalPath(name: String): String = originalPath(name: TermName)
- def originalPath(name: Name): String = typerOp path name
- def originalPath(sym: Symbol): String = typerOp path sym
- def flatPath(sym: Symbol): String = flatOp shift sym.javaClassName
- def translatePath(path: String) = {
- val sym = if (path endsWith "$") symbolOfTerm(path.init) else symbolOfIdent(path)
- sym match {
- case NoSymbol => None
- case _ => Some(flatPath(sym))
- }
- }
- def translateEnclosingClass(n: String) = {
- def enclosingClass(s: Symbol): Symbol =
- if (s == NoSymbol || s.isClass) s else enclosingClass(s.owner)
- enclosingClass(symbolOfTerm(n)) match {
- case NoSymbol => None
- case c => Some(flatPath(c))
- }
- }
-
- private class TranslatingClassLoader(parent: ClassLoader) extends AbstractFileClassLoader(replOutput.dir, parent) {
- /** Overridden here to try translating a simple name to the generated
- * class name if the original attempt fails. This method is used by
- * getResourceAsStream as well as findClass.
- */
- override protected def findAbstractFile(name: String): AbstractFile =
- super.findAbstractFile(name) match {
- case null => translatePath(name) map (super.findAbstractFile(_)) orNull
- case file => file
- }
- }
- private def makeClassLoader(): AbstractFileClassLoader =
- new TranslatingClassLoader(parentClassLoader match {
- case null => ScalaClassLoader fromURLs compilerClasspath
- case p => new URLClassLoader(compilerClasspath, p)
- })
-
- // Set the current Java "context" class loader to this interpreter's class loader
- def setContextClassLoader() = classLoader.setAsContext()
-
- def allDefinedNames: List[Name] = exitingTyper(replScope.toList.map(_.name).sorted)
- def unqualifiedIds: List[String] = allDefinedNames map (_.decode) sorted
-
- /** Most recent tree handled which wasn't wholly synthetic. */
- private def mostRecentlyHandledTree: Option[Tree] = {
- prevRequests.reverse foreach { req =>
- req.handlers.reverse foreach {
- case x: MemberDefHandler if x.definesValue && !isInternalTermName(x.name) => return Some(x.member)
- case _ => ()
- }
- }
- None
- }
-
- private def updateReplScope(sym: Symbol, isDefined: Boolean) {
- def log(what: String) {
- val mark = if (sym.isType) "t " else "v "
- val name = exitingTyper(sym.nameString)
- val info = cleanTypeAfterTyper(sym)
- val defn = sym defStringSeenAs info
-
- scopelog(f"[$mark$what%6s] $name%-25s $defn%s")
- }
- if (ObjectClass isSubClass sym.owner) return
- // unlink previous
- replScope lookupAll sym.name foreach { sym =>
- log("unlink")
- replScope unlink sym
- }
- val what = if (isDefined) "define" else "import"
- log(what)
- replScope enter sym
- }
-
- def recordRequest(req: Request) {
- if (req == null)
- return
-
- prevRequests += req
-
- // warning about serially defining companions. It'd be easy
- // enough to just redefine them together but that may not always
- // be what people want so I'm waiting until I can do it better.
- exitingTyper {
- req.defines filterNot (s => req.defines contains s.companionSymbol) foreach { newSym =>
- val oldSym = replScope lookup newSym.name.companionName
- if (Seq(oldSym, newSym).permutations exists { case Seq(s1, s2) => s1.isClass && s2.isModule }) {
- replwarn(s"warning: previously defined $oldSym is not a companion to $newSym.")
- replwarn("Companions must be defined together; you may wish to use :paste mode for this.")
- }
- }
- }
- exitingTyper {
- req.imports foreach (sym => updateReplScope(sym, isDefined = false))
- req.defines foreach (sym => updateReplScope(sym, isDefined = true))
- }
- }
-
- private[nsc] def replwarn(msg: => String) {
- if (!settings.nowarnings.value)
- printMessage(msg)
- }
-
- def compileSourcesKeepingRun(sources: SourceFile*) = {
- val run = new Run()
- reporter.reset()
- run compileSources sources.toList
- (!reporter.hasErrors, run)
- }
-
- /** Compile an nsc SourceFile. Returns true if there are
- * no compilation errors, or false otherwise.
- */
- def compileSources(sources: SourceFile*): Boolean =
- compileSourcesKeepingRun(sources: _*)._1
-
- /** Compile a string. Returns true if there are no
- * compilation errors, or false otherwise.
- */
- def compileString(code: String): Boolean =
- compileSources(new BatchSourceFile("<script>", code))
-
- /** Build a request from the user. `trees` is `line` after being parsed.
- */
- private def buildRequest(line: String, trees: List[Tree]): Request = {
- executingRequest = new Request(line, trees)
- executingRequest
- }
-
- private def safePos(t: Tree, alt: Int): Int =
- try t.pos.startOrPoint
- catch { case _: UnsupportedOperationException => alt }
-
- // Given an expression like 10 * 10 * 10 we receive the parent tree positioned
- // at a '*'. So look at each subtree and find the earliest of all positions.
- private def earliestPosition(tree: Tree): Int = {
- var pos = Int.MaxValue
- tree foreach { t =>
- pos = math.min(pos, safePos(t, Int.MaxValue))
- }
- pos
- }
-
- private def requestFromLine(line: String, synthetic: Boolean): Either[IR.Result, Request] = {
- val content = indentCode(line)
- val trees = parse(content) match {
- case None => return Left(IR.Incomplete)
- case Some(Nil) => return Left(IR.Error) // parse error or empty input
- case Some(trees) => trees
- }
- repltrace(
- trees map (t => {
- // [Eugene to Paul] previously it just said `t map ...`
- // because there was an implicit conversion from Tree to a list of Trees
- // however Martin and I have removed the conversion
- // (it was conflicting with the new reflection API),
- // so I had to rewrite this a bit
- val subs = t collect { case sub => sub }
- subs map (t0 =>
- " " + safePos(t0, -1) + ": " + t0.shortClass + "\n"
- ) mkString ""
- }) mkString "\n"
- )
- // If the last tree is a bare expression, pinpoint where it begins using the
- // AST node position and snap the line off there. Rewrite the code embodied
- // by the last tree as a ValDef instead, so we can access the value.
- trees.last match {
- case _:Assign => // we don't want to include assignments
- case _:TermTree | _:Ident | _:Select => // ... but do want other unnamed terms.
- val varName = if (synthetic) freshInternalVarName() else freshUserVarName()
- val rewrittenLine = (
- // In theory this would come out the same without the 1-specific test, but
- // it's a cushion against any more sneaky parse-tree position vs. code mismatches:
- // this way such issues will only arise on multiple-statement repl input lines,
- // which most people don't use.
- if (trees.size == 1) "val " + varName + " =\n" + content
- else {
- // The position of the last tree
- val lastpos0 = earliestPosition(trees.last)
- // Oh boy, the parser throws away parens so "(2+2)" is mispositioned,
- // with increasingly hard to decipher positions as we move on to "() => 5",
- // (x: Int) => x + 1, and more. So I abandon attempts to finesse and just
- // look for semicolons and newlines, which I'm sure is also buggy.
- val (raw1, raw2) = content splitAt lastpos0
- repldbg("[raw] " + raw1 + " <---> " + raw2)
-
- val adjustment = (raw1.reverse takeWhile (ch => (ch != ';') && (ch != '\n'))).size
- val lastpos = lastpos0 - adjustment
-
- // the source code split at the laboriously determined position.
- val (l1, l2) = content splitAt lastpos
- repldbg("[adj] " + l1 + " <---> " + l2)
-
- val prefix = if (l1.trim == "") "" else l1 + ";\n"
- // Note to self: val source needs to have this precise structure so that
- // error messages print the user-submitted part without the "val res0 = " part.
- val combined = prefix + "val " + varName + " =\n" + l2
-
- repldbg(List(
- " line" -> line,
- " content" -> content,
- " was" -> l2,
- "combined" -> combined) map {
- case (label, s) => label + ": '" + s + "'"
- } mkString "\n"
- )
- combined
- }
- )
- // Rewriting "foo ; bar ; 123"
- // to "foo ; bar ; val resXX = 123"
- requestFromLine(rewrittenLine, synthetic) match {
- case Right(req) => return Right(req withOriginalLine line)
- case x => return x
- }
- case _ =>
- }
- Right(buildRequest(line, trees))
- }
-
- // dealias non-public types so we don't see protected aliases like Self
- def dealiasNonPublic(tp: Type) = tp match {
- case TypeRef(_, sym, _) if sym.isAliasType && !sym.isPublic => tp.dealias
- case _ => tp
- }
-
- /**
- * Interpret one line of input. All feedback, including parse errors
- * and evaluation results, are printed via the supplied compiler's
- * reporter. Values defined are available for future interpreted strings.
- *
- * The return value is whether the line was interpreter successfully,
- * e.g. that there were no parse errors.
- */
- def interpret(line: String): IR.Result = interpret(line, synthetic = false)
- def interpretSynthetic(line: String): IR.Result = interpret(line, synthetic = true)
- def interpret(line: String, synthetic: Boolean): IR.Result = {
- def loadAndRunReq(req: Request) = {
- classLoader.setAsContext()
- val (result, succeeded) = req.loadAndRun
-
- /** To our displeasure, ConsoleReporter offers only printMessage,
- * which tacks a newline on the end. Since that breaks all the
- * output checking, we have to take one off to balance.
- */
- if (succeeded) {
- if (printResults && result != "")
- printMessage(result stripSuffix "\n")
- else if (isReplDebug) // show quiet-mode activity
- printMessage(result.trim.lines map ("[quiet] " + _) mkString "\n")
-
- // Book-keeping. Have to record synthetic requests too,
- // as they may have been issued for information, e.g. :type
- recordRequest(req)
- IR.Success
- }
- else {
- // don't truncate stack traces
- withoutTruncating(printMessage(result))
- IR.Error
- }
- }
-
- if (global == null) IR.Error
- else requestFromLine(line, synthetic) match {
- case Left(result) => result
- case Right(req) =>
- // null indicates a disallowed statement type; otherwise compile and
- // fail if false (implying e.g. a type error)
- if (req == null || !req.compile) IR.Error
- else loadAndRunReq(req)
- }
- }
-
- /** Bind a specified name to a specified value. The name may
- * later be used by expressions passed to interpret.
- *
- * @param name the variable name to bind
- * @param boundType the type of the variable, as a string
- * @param value the object value to bind to it
- * @return an indication of whether the binding succeeded
- */
- def bind(name: String, boundType: String, value: Any, modifiers: List[String] = Nil): IR.Result = {
- val bindRep = new ReadEvalPrint()
- bindRep.compile("""
- |object %s {
- | var value: %s = _
- | def set(x: Any) = value = x.asInstanceOf[%s]
- |}
- """.stripMargin.format(bindRep.evalName, boundType, boundType)
- )
- bindRep.callEither("set", value) match {
- case Left(ex) =>
- repldbg("Set failed in bind(%s, %s, %s)".format(name, boundType, value))
- repldbg(util.stackTraceString(ex))
- IR.Error
-
- case Right(_) =>
- val line = "%sval %s = %s.value".format(modifiers map (_ + " ") mkString, name, bindRep.evalPath)
- repldbg("Interpreting: " + line)
- interpret(line)
- }
- }
- def directBind(name: String, boundType: String, value: Any): IR.Result = {
- val result = bind(name, boundType, value)
- if (result == IR.Success)
- directlyBoundNames += newTermName(name)
- result
- }
- def directBind(p: NamedParam): IR.Result = directBind(p.name, p.tpe, p.value)
- def directBind[T: ru.TypeTag : ClassTag](name: String, value: T): IR.Result = directBind((name, value))
-
- def rebind(p: NamedParam): IR.Result = {
- val name = p.name
- val newType = p.tpe
- val tempName = freshInternalVarName()
-
- quietRun("val %s = %s".format(tempName, name))
- quietRun("val %s = %s.asInstanceOf[%s]".format(name, tempName, newType))
- }
- def quietBind(p: NamedParam): IR.Result = beQuietDuring(bind(p))
- def bind(p: NamedParam): IR.Result = bind(p.name, p.tpe, p.value)
- def bind[T: ru.TypeTag : ClassTag](name: String, value: T): IR.Result = bind((name, value))
-
- /** Reset this interpreter, forgetting all user-specified requests. */
- def reset() {
- clearExecutionWrapper()
- resetClassLoader()
- resetAllCreators()
- prevRequests.clear()
- resetReplScope()
- replOutput.dir.clear()
- }
-
- /** This instance is no longer needed, so release any resources
- * it is using. The reporter's output gets flushed.
- */
- def close() {
- reporter.flush()
- }
-
- /** Here is where we:
- *
- * 1) Read some source code, and put it in the "read" object.
- * 2) Evaluate the read object, and put the result in the "eval" object.
- * 3) Create a String for human consumption, and put it in the "print" object.
- *
- * Read! Eval! Print! Some of that not yet centralized here.
- */
- class ReadEvalPrint(lineId: Int) {
- def this() = this(freshLineId())
-
- val packageName = sessionNames.line + lineId
- val readName = sessionNames.read
- val evalName = sessionNames.eval
- val printName = sessionNames.print
- val resultName = sessionNames.result
-
- def bindError(t: Throwable) = {
- if (!bindExceptions) // avoid looping if already binding
- throw t
-
- val unwrapped = unwrap(t)
- withLastExceptionLock[String]({
- directBind[Throwable]("lastException", unwrapped)(tagOfThrowable, classTag[Throwable])
- util.stackTraceString(unwrapped)
- }, util.stackTraceString(unwrapped))
- }
-
- // TODO: split it out into a package object and a regular
- // object and we can do that much less wrapping.
- def packageDecl = "package " + packageName
-
- def pathTo(name: String) = packageName + "." + name
- def packaged(code: String) = packageDecl + "\n\n" + code
-
- def readPath = pathTo(readName)
- def evalPath = pathTo(evalName)
-
- def call(name: String, args: Any*): AnyRef = {
- val m = evalMethod(name)
- repldbg("Invoking: " + m)
- if (args.nonEmpty)
- repldbg(" with args: " + args.mkString(", "))
-
- m.invoke(evalClass, args.map(_.asInstanceOf[AnyRef]): _*)
- }
-
- def callEither(name: String, args: Any*): Either[Throwable, AnyRef] =
- try Right(call(name, args: _*))
- catch { case ex: Throwable => Left(ex) }
-
- class EvalException(msg: String, cause: Throwable) extends RuntimeException(msg, cause) { }
-
- private def evalError(path: String, ex: Throwable) =
- throw new EvalException("Failed to load '" + path + "': " + ex.getMessage, ex)
-
- private def load(path: String): Class[_] = {
- try Class.forName(path, true, classLoader)
- catch { case ex: Throwable => evalError(path, unwrap(ex)) }
- }
-
- lazy val evalClass = load(evalPath)
-
- def compile(source: String): Boolean = compileAndSaveRun("<console>", source)
-
- /** The innermost object inside the wrapper, found by
- * following accessPath into the outer one.
- */
- def resolvePathToSymbol(accessPath: String): Symbol = {
- val readRoot = getModuleIfDefined(readPath) // the outermost wrapper
- (accessPath split '.').foldLeft(readRoot: Symbol) {
- case (sym, "") => sym
- case (sym, name) => exitingTyper(termMember(sym, name))
- }
- }
- /** We get a bunch of repeated warnings for reasons I haven't
- * entirely figured out yet. For now, squash.
- */
- private def updateRecentWarnings(run: Run) {
- def loop(xs: List[(Position, String)]): List[(Position, String)] = xs match {
- case Nil => Nil
- case ((pos, msg)) :: rest =>
- val filtered = rest filter { case (pos0, msg0) =>
- (msg != msg0) || (pos.lineContent.trim != pos0.lineContent.trim) || {
- // same messages and same line content after whitespace removal
- // but we want to let through multiple warnings on the same line
- // from the same run. The untrimmed line will be the same since
- // there's no whitespace indenting blowing it.
- (pos.lineContent == pos0.lineContent)
- }
- }
- ((pos, msg)) :: loop(filtered)
- }
- val warnings = loop(run.allConditionalWarnings flatMap (_.warnings))
- if (warnings.nonEmpty)
- mostRecentWarnings = warnings
- }
- private def evalMethod(name: String) = evalClass.getMethods filter (_.getName == name) match {
- case Array(method) => method
- case xs => sys.error("Internal error: eval object " + evalClass + ", " + xs.mkString("\n", "\n", ""))
- }
- private def compileAndSaveRun(label: String, code: String) = {
- showCodeIfDebugging(code)
- val (success, run) = compileSourcesKeepingRun(new BatchSourceFile(label, packaged(code)))
- updateRecentWarnings(run)
- success
- }
- }
-
- /** One line of code submitted by the user for interpretation */
- class Request(val line: String, val trees: List[Tree]) {
- def defines = defHandlers flatMap (_.definedSymbols)
- def imports = importedSymbols
- def value = Some(handlers.last) filter (h => h.definesValue) map (h => definedSymbols(h.definesTerm.get)) getOrElse NoSymbol
-
- val lineRep = new ReadEvalPrint()
-
- private var _originalLine: String = null
- def withOriginalLine(s: String): this.type = { _originalLine = s ; this }
- def originalLine = if (_originalLine == null) line else _originalLine
-
- /** handlers for each tree in this request */
- val handlers: List[MemberHandler] = trees map (memberHandlers chooseHandler _)
- def defHandlers = handlers collect { case x: MemberDefHandler => x }
-
- /** list of names used by this expression */
- val referencedNames: List[Name] = handlers flatMap (_.referencedNames)
-
- /** def and val names */
- def termNames = handlers flatMap (_.definesTerm)
- def typeNames = handlers flatMap (_.definesType)
- def importedSymbols = handlers flatMap {
- case x: ImportHandler => x.importedSymbols
- case _ => Nil
- }
-
- /** Code to import bound names from previous lines - accessPath is code to
- * append to objectName to access anything bound by request.
- */
- val ComputedImports(importsPreamble, importsTrailer, accessPath) =
- exitingTyper(importsCode(referencedNames.toSet))
-
- /** the line of code to compute */
- def toCompute = line
-
- def fullPath(vname: String) = s"${lineRep.readPath}$accessPath.`$vname`"
-
- /** generate the source code for the object that computes this request */
- private object ObjectSourceCode extends CodeAssembler[MemberHandler] {
- def path = originalPath("$intp")
- def envLines = {
- if (!isReplPower) Nil // power mode only for now
- // $intp is not bound; punt, but include the line.
- else if (path == "$intp") List(
- "def $line = " + tquoted(originalLine),
- "def $trees = Nil"
- )
- else List(
- "def $line = " + tquoted(originalLine),
- "def $trees = Nil"
- )
- }
-
- val preamble = """
- |object %s {
- |%s%s%s
- """.stripMargin.format(lineRep.readName, envLines.map(" " + _ + ";\n").mkString, importsPreamble, indentCode(toCompute))
- val postamble = importsTrailer + "\n}"
- val generate = (m: MemberHandler) => m extraCodeToEvaluate Request.this
- }
-
- private object ResultObjectSourceCode extends CodeAssembler[MemberHandler] {
- /** We only want to generate this code when the result
- * is a value which can be referred to as-is.
- */
- val evalResult = Request.this.value match {
- case NoSymbol => ""
- case sym => "lazy val %s = %s".format(lineRep.resultName, originalPath(sym))
- }
- // first line evaluates object to make sure constructor is run
- // initial "" so later code can uniformly be: + etc
- val preamble = """
- |object %s {
- | %s
- | val %s: String = %s {
- | %s
- | (""
- """.stripMargin.format(
- lineRep.evalName, evalResult, lineRep.printName,
- executionWrapper, lineRep.readName + accessPath
- )
-
- val postamble = """
- | )
- | }
- |}
- """.stripMargin
- val generate = (m: MemberHandler) => m resultExtractionCode Request.this
- }
-
- /** Compile the object file. Returns whether the compilation succeeded.
- * If all goes well, the "types" map is computed. */
- lazy val compile: Boolean = {
- // error counting is wrong, hence interpreter may overlook failure - so we reset
- reporter.reset()
-
- // compile the object containing the user's code
- lineRep.compile(ObjectSourceCode(handlers)) && {
- // extract and remember types
- typeOf
- typesOfDefinedTerms
-
- // Assign symbols to the original trees
- // TODO - just use the new trees.
- defHandlers foreach { dh =>
- val name = dh.member.name
- definedSymbols get name foreach { sym =>
- dh.member setSymbol sym
- repldbg("Set symbol of " + name + " to " + symbolDefString(sym))
- }
- }
-
- // compile the result-extraction object
- withoutWarnings(lineRep compile ResultObjectSourceCode(handlers))
- }
- }
-
- lazy val resultSymbol = lineRep.resolvePathToSymbol(accessPath)
- def applyToResultMember[T](name: Name, f: Symbol => T) = exitingTyper(f(resultSymbol.info.nonPrivateDecl(name)))
-
- /* typeOf lookup with encoding */
- def lookupTypeOf(name: Name) = typeOf.getOrElse(name, typeOf(global.encode(name.toString)))
-
- private def typeMap[T](f: Type => T) =
- mapFrom[Name, Name, T](termNames ++ typeNames)(x => f(cleanMemberDecl(resultSymbol, x)))
-
- /** Types of variables defined by this request. */
- lazy val compilerTypeOf = typeMap[Type](x => x) withDefaultValue NoType
- /** String representations of same. */
- lazy val typeOf = typeMap[String](tp => exitingTyper(tp.toString))
-
- lazy val definedSymbols = (
- termNames.map(x => x -> applyToResultMember(x, x => x)) ++
- typeNames.map(x => x -> compilerTypeOf(x).typeSymbolDirect)
- ).toMap[Name, Symbol] withDefaultValue NoSymbol
-
- lazy val typesOfDefinedTerms = mapFrom[Name, Name, Type](termNames)(x => applyToResultMember(x, _.tpe))
-
- /** load and run the code using reflection */
- def loadAndRun: (String, Boolean) = {
- try { ("" + (lineRep call sessionNames.print), true) }
- catch { case ex: Throwable => (lineRep.bindError(ex), false) }
- }
-
- override def toString = "Request(line=%s, %s trees)".format(line, trees.size)
- }
-
- /** Returns the name of the most recent interpreter result.
- * Mostly this exists so you can conveniently invoke methods on
- * the previous result.
- */
- def mostRecentVar: String =
- if (mostRecentlyHandledTree.isEmpty) ""
- else "" + (mostRecentlyHandledTree.get match {
- case x: ValOrDefDef => x.name
- case Assign(Ident(name), _) => name
- case ModuleDef(_, name, _) => name
- case _ => naming.mostRecentVar
- })
-
- private var mostRecentWarnings: List[(global.Position, String)] = Nil
- def lastWarnings = mostRecentWarnings
-
- private lazy val importToGlobal = global mkImporter ru
- private lazy val importToRuntime = ru mkImporter global
- private lazy val javaMirror = ru.rootMirror match {
- case x: ru.JavaMirror => x
- case _ => null
- }
- private implicit def importFromRu(sym: ru.Symbol): Symbol = importToGlobal importSymbol sym
- private implicit def importToRu(sym: Symbol): ru.Symbol = importToRuntime importSymbol sym
-
- def classOfTerm(id: String): Option[JClass] = symbolOfTerm(id) match {
- case NoSymbol => None
- case sym => Some(javaMirror runtimeClass importToRu(sym).asClass)
- }
-
- def typeOfTerm(id: String): Type = symbolOfTerm(id).tpe
-
- def valueOfTerm(id: String): Option[Any] = exitingTyper {
- def value() = {
- val sym0 = symbolOfTerm(id)
- val sym = (importToRuntime importSymbol sym0).asTerm
- val module = runtimeMirror.reflectModule(sym.owner.companionSymbol.asModule).instance
- val module1 = runtimeMirror.reflect(module)
- val invoker = module1.reflectField(sym)
-
- invoker.get
- }
-
- try Some(value()) catch { case _: Exception => None }
- }
-
- /** It's a bit of a shotgun approach, but for now we will gain in
- * robustness. Try a symbol-producing operation at phase typer, and
- * if that is NoSymbol, try again at phase flatten. I'll be able to
- * lose this and run only from exitingTyper as soon as I figure out
- * exactly where a flat name is sneaking in when calculating imports.
- */
- def tryTwice(op: => Symbol): Symbol = exitingTyper(op) orElse exitingFlatten(op)
-
- def symbolOfIdent(id: String): Symbol = symbolOfType(id) orElse symbolOfTerm(id)
- def symbolOfType(id: String): Symbol = tryTwice(replScope lookup (id: TypeName))
- def symbolOfTerm(id: String): Symbol = tryTwice(replScope lookup (id: TermName))
- def symbolOfName(id: Name): Symbol = replScope lookup id
-
- def runtimeClassAndTypeOfTerm(id: String): Option[(JClass, Type)] = {
- classOfTerm(id) flatMap { clazz =>
- clazz.supers find (!_.isScalaAnonymous) map { nonAnon =>
- (nonAnon, runtimeTypeOfTerm(id))
- }
- }
- }
-
- def runtimeTypeOfTerm(id: String): Type = {
- typeOfTerm(id) andAlso { tpe =>
- val clazz = classOfTerm(id) getOrElse { return NoType }
- val staticSym = tpe.typeSymbol
- val runtimeSym = getClassIfDefined(clazz.getName)
-
- if ((runtimeSym != NoSymbol) && (runtimeSym != staticSym) && (runtimeSym isSubClass staticSym))
- runtimeSym.info
- else NoType
- }
- }
-
- def cleanTypeAfterTyper(sym: => Symbol): Type = {
- exitingTyper(
- dealiasNonPublic(
- dropNullaryMethod(
- sym.tpe_*
- )
- )
- )
- }
- def cleanMemberDecl(owner: Symbol, member: Name): Type =
- cleanTypeAfterTyper(owner.info nonPrivateDecl member)
-
- object exprTyper extends {
- val repl: IMain.this.type = imain
- } with ExprTyper { }
-
- def parse(line: String): Option[List[Tree]] = exprTyper.parse(line)
-
- def symbolOfLine(code: String): Symbol =
- exprTyper.symbolOfLine(code)
-
- def typeOfExpression(expr: String, silent: Boolean = true): Type =
- exprTyper.typeOfExpression(expr, silent)
-
- protected def onlyTerms(xs: List[Name]): List[TermName] = xs collect { case x: TermName => x }
- protected def onlyTypes(xs: List[Name]): List[TypeName] = xs collect { case x: TypeName => x }
-
- def definedTerms = onlyTerms(allDefinedNames) filterNot isInternalTermName
- def definedTypes = onlyTypes(allDefinedNames)
- def definedSymbolList = prevRequestList flatMap (_.defines) filterNot (s => isInternalTermName(s.name))
-
- // Terms with user-given names (i.e. not res0 and not synthetic)
- def namedDefinedTerms = definedTerms filterNot (x => isUserVarName("" + x) || directlyBoundNames(x))
-
- private var _replScope: Scope = _
- private def resetReplScope() {
- _replScope = newScope
- }
- def replScope = {
- if (_replScope eq null)
- _replScope = newScope
-
- _replScope
- }
-
- private var executingRequest: Request = _
- private val prevRequests = mutable.ListBuffer[Request]()
- private val directlyBoundNames = mutable.Set[Name]()
-
- def allHandlers = prevRequestList flatMap (_.handlers)
- def lastRequest = if (prevRequests.isEmpty) null else prevRequests.last
- def prevRequestList = prevRequests.toList
- def importHandlers = allHandlers collect { case x: ImportHandler => x }
-
- def withoutUnwrapping(op: => Unit): Unit = {
- val saved = isettings.unwrapStrings
- isettings.unwrapStrings = false
- try op
- finally isettings.unwrapStrings = saved
- }
-
- def symbolDefString(sym: Symbol) = {
- TypeStrings.quieter(
- exitingTyper(sym.defString),
- sym.owner.name + ".this.",
- sym.owner.fullName + "."
- )
- }
-
- def showCodeIfDebugging(code: String) {
- /** Secret bookcase entrance for repl debuggers: end the line
- * with "// show" and see what's going on.
- */
- def isShow = code.lines exists (_.trim endsWith "// show")
- if (isReplDebug || isShow) {
- beSilentDuring(parse(code)) foreach { ts =>
- ts foreach { t =>
- withoutUnwrapping(echo(asCompactString(t)))
- }
- }
- }
- }
-
- // debugging
- def debugging[T](msg: String)(res: T) = {
- repldbg(msg + " " + res)
- res
- }
-}
-
-/** Utility methods for the Interpreter. */
-object IMain {
- // The two name forms this is catching are the two sides of this assignment:
- //
- // $line3.$read.$iw.$iw.Bippy =
- // $line3.$read$$iw$$iw$Bippy@4a6a00ca
- private def removeLineWrapper(s: String) = s.replaceAll("""\$line\d+[./]\$(read|eval|print)[$.]""", "")
- private def removeIWPackages(s: String) = s.replaceAll("""\$(iw|read|eval|print)[$.]""", "")
- def stripString(s: String) = removeIWPackages(removeLineWrapper(s))
-
- trait CodeAssembler[T] {
- def preamble: String
- def generate: T => String
- def postamble: String
-
- def apply(contributors: List[T]): String = stringFromWriter { code =>
- code println preamble
- contributors map generate foreach (code println _)
- code println postamble
- }
- }
-
- trait StrippingWriter {
- def isStripping: Boolean
- def stripImpl(str: String): String
- def strip(str: String): String = if (isStripping) stripImpl(str) else str
- }
- trait TruncatingWriter {
- def maxStringLength: Int
- def isTruncating: Boolean
- def truncate(str: String): String = {
- if (isTruncating && (maxStringLength != 0 && str.length > maxStringLength))
- (str take maxStringLength - 3) + "..."
- else str
- }
- }
- abstract class StrippingTruncatingWriter(out: JPrintWriter)
- extends JPrintWriter(out)
- with StrippingWriter
- with TruncatingWriter {
- self =>
-
- def clean(str: String): String = truncate(strip(str))
- override def write(str: String) = super.write(clean(str))
- }
- class ReplStrippingWriter(intp: IMain) extends StrippingTruncatingWriter(intp.out) {
- import intp._
- def maxStringLength = isettings.maxPrintString
- def isStripping = isettings.unwrapStrings
- def isTruncating = reporter.truncationOK
-
- def stripImpl(str: String): String = naming.unmangle(str)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ISettings.scala b/src/compiler/scala/tools/nsc/interpreter/ISettings.scala
deleted file mode 100644
index 9541d08db1..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ISettings.scala
+++ /dev/null
@@ -1,54 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Alexander Spoon
- */
-
-package scala.tools.nsc
-package interpreter
-
-/** Settings for the interpreter
- *
- * @version 1.0
- * @author Lex Spoon, 2007/3/24
- **/
-class ISettings(intp: IMain) {
- /** The maximum length of toString to use when printing the result
- * of an evaluation. 0 means no maximum. If a printout requires
- * more than this number of characters, then the printout is
- * truncated.
- */
- var maxPrintString = replProps.maxPrintString.option.getOrElse(800)
-
- /** The maximum number of completion candidates to print for tab
- * completion without requiring confirmation.
- */
- var maxAutoprintCompletion = 250
-
- /** String unwrapping can be disabled if it is causing issues.
- * Setting this to false means you will see Strings like "$iw.$iw.".
- */
- var unwrapStrings = true
-
- def deprecation_=(x: Boolean) = {
- val old = intp.settings.deprecation.value
- intp.settings.deprecation.value = x
- if (!old && x) println("Enabled -deprecation output.")
- else if (old && !x) println("Disabled -deprecation output.")
- }
- def deprecation: Boolean = intp.settings.deprecation.value
-
- def allSettings = Map[String, Any](
- "maxPrintString" -> maxPrintString,
- "maxAutoprintCompletion" -> maxAutoprintCompletion,
- "unwrapStrings" -> unwrapStrings,
- "deprecation" -> deprecation
- )
-
- private def allSettingsString =
- allSettings.toList sortBy (_._1) map { case (k, v) => " " + k + " = " + v + "\n" } mkString
-
- override def toString = """
- | ISettings {
- | %s
- | }""".stripMargin.format(allSettingsString)
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Imports.scala b/src/compiler/scala/tools/nsc/interpreter/Imports.scala
deleted file mode 100644
index ff7bfd432c..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Imports.scala
+++ /dev/null
@@ -1,181 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.collection.{ mutable, immutable }
-
-trait Imports {
- self: IMain =>
-
- import global._
- import definitions.{ ObjectClass, ScalaPackage, JavaLangPackage, PredefModule }
- import memberHandlers._
-
- /** Synthetic import handlers for the language defined imports. */
- private def makeWildcardImportHandler(sym: Symbol): ImportHandler = {
- val hd :: tl = sym.fullName.split('.').toList map newTermName
- val tree = Import(
- tl.foldLeft(Ident(hd): Tree)((x, y) => Select(x, y)),
- ImportSelector.wildList
- )
- tree setSymbol sym
- new ImportHandler(tree)
- }
-
- /** Symbols whose contents are language-defined to be imported. */
- def languageWildcardSyms: List[Symbol] = List(JavaLangPackage, ScalaPackage, PredefModule)
- def languageWildcardHandlers = languageWildcardSyms map makeWildcardImportHandler
-
- def allImportedNames = importHandlers flatMap (_.importedNames)
-
- /** Types which have been wildcard imported, such as:
- * val x = "abc" ; import x._ // type java.lang.String
- * import java.lang.String._ // object java.lang.String
- *
- * Used by tab completion.
- *
- * XXX right now this gets import x._ and import java.lang.String._,
- * but doesn't figure out import String._. There's a lot of ad hoc
- * scope twiddling which should be swept away in favor of digging
- * into the compiler scopes.
- */
- def sessionWildcards: List[Type] = {
- importHandlers filter (_.importsWildcard) map (_.targetType) distinct
- }
-
- def languageSymbols = languageWildcardSyms flatMap membersAtPickler
- def sessionImportedSymbols = importHandlers flatMap (_.importedSymbols)
- def importedSymbols = languageSymbols ++ sessionImportedSymbols
- def importedTermSymbols = importedSymbols collect { case x: TermSymbol => x }
-
- /** Tuples of (source, imported symbols) in the order they were imported.
- */
- def importedSymbolsBySource: List[(Symbol, List[Symbol])] = {
- val lang = languageWildcardSyms map (sym => (sym, membersAtPickler(sym)))
- val session = importHandlers filter (_.targetType != NoType) map { mh =>
- (mh.targetType.typeSymbol, mh.importedSymbols)
- }
-
- lang ++ session
- }
- def implicitSymbolsBySource: List[(Symbol, List[Symbol])] = {
- importedSymbolsBySource map {
- case (k, vs) => (k, vs filter (_.isImplicit))
- } filterNot (_._2.isEmpty)
- }
-
- /** Compute imports that allow definitions from previous
- * requests to be visible in a new request. Returns
- * three pieces of related code:
- *
- * 1. An initial code fragment that should go before
- * the code of the new request.
- *
- * 2. A code fragment that should go after the code
- * of the new request.
- *
- * 3. An access path which can be traversed to access
- * any bindings inside code wrapped by #1 and #2 .
- *
- * The argument is a set of Names that need to be imported.
- *
- * Limitations: This method is not as precise as it could be.
- * (1) It does not process wildcard imports to see what exactly
- * they import.
- * (2) If it imports any names from a request, it imports all
- * of them, which is not really necessary.
- * (3) It imports multiple same-named implicits, but only the
- * last one imported is actually usable.
- */
- case class ComputedImports(prepend: String, append: String, access: String)
- protected def importsCode(wanted: Set[Name]): ComputedImports = {
- /** Narrow down the list of requests from which imports
- * should be taken. Removes requests which cannot contribute
- * useful imports for the specified set of wanted names.
- */
- case class ReqAndHandler(req: Request, handler: MemberHandler) { }
-
- def reqsToUse: List[ReqAndHandler] = {
- /** Loop through a list of MemberHandlers and select which ones to keep.
- * 'wanted' is the set of names that need to be imported.
- */
- def select(reqs: List[ReqAndHandler], wanted: Set[Name]): List[ReqAndHandler] = {
- // Single symbol imports might be implicits! See bug #1752. Rather than
- // try to finesse this, we will mimic all imports for now.
- def keepHandler(handler: MemberHandler) = handler match {
- case _: ImportHandler => true
- case x => x.definesImplicit || (x.definedNames exists wanted)
- }
-
- reqs match {
- case Nil => Nil
- case rh :: rest if !keepHandler(rh.handler) => select(rest, wanted)
- case rh :: rest =>
- import rh.handler._
- val newWanted = wanted ++ referencedNames -- definedNames -- importedNames
- rh :: select(rest, newWanted)
- }
- }
-
- /** Flatten the handlers out and pair each with the original request */
- select(allReqAndHandlers reverseMap { case (r, h) => ReqAndHandler(r, h) }, wanted).reverse
- }
-
- val code, trailingBraces, accessPath = new StringBuilder
- val currentImps = mutable.HashSet[Name]()
-
- // add code for a new object to hold some imports
- def addWrapper() {
- val impname = nme.INTERPRETER_IMPORT_WRAPPER
- code append "object %s {\n".format(impname)
- trailingBraces append "}\n"
- accessPath append ("." + impname)
- currentImps.clear()
- }
- def maybeWrap(names: Name*) = if (names exists currentImps) addWrapper()
- def wrapBeforeAndAfter[T](op: => T): T = {
- addWrapper()
- try op finally addWrapper()
- }
-
- // loop through previous requests, adding imports for each one
- wrapBeforeAndAfter {
- for (ReqAndHandler(req, handler) <- reqsToUse) {
- handler match {
- // If the user entered an import, then just use it; add an import wrapping
- // level if the import might conflict with some other import
- case x: ImportHandler if x.importsWildcard =>
- wrapBeforeAndAfter(code append (x.member + "\n"))
- case x: ImportHandler =>
- maybeWrap(x.importedNames: _*)
- code append (x.member + "\n")
- currentImps ++= x.importedNames
-
- // For other requests, import each defined name.
- // import them explicitly instead of with _, so that
- // ambiguity errors will not be generated. Also, quote
- // the name of the variable, so that we don't need to
- // handle quoting keywords separately.
- case x =>
- for (sym <- x.definedSymbols) {
- maybeWrap(sym.name)
- code append s"import ${x.path}\n"
- currentImps += sym.name
- }
- }
- }
- }
-
- ComputedImports(code.toString, trailingBraces.toString, accessPath.toString)
- }
-
- private def allReqAndHandlers =
- prevRequestList flatMap (req => req.handlers map (req -> _))
-
- private def membersAtPickler(sym: Symbol): List[Symbol] =
- enteringPickler(sym.info.nonPrivateMembers.toList)
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala b/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala
deleted file mode 100644
index 28ddf2939c..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/InteractiveReader.scala
+++ /dev/null
@@ -1,49 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Stepan Koltsov
- */
-
-package scala.tools.nsc
-package interpreter
-
-import java.io.IOException
-import session.History
-import InteractiveReader._
-import Properties.isMac
-
-/** Reads lines from an input stream */
-trait InteractiveReader {
- val interactive: Boolean
-
- def reset(): Unit
- def history: History
- def completion: Completion
- def redrawLine(): Unit
-
- def readYesOrNo(prompt: String, alt: => Boolean): Boolean = readOneKey(prompt) match {
- case 'y' => true
- case 'n' => false
- case _ => alt
- }
-
- protected def readOneLine(prompt: String): String
- protected def readOneKey(prompt: String): Int
-
- def readLine(prompt: String): String =
- // hack necessary for OSX jvm suspension because read calls are not restarted after SIGTSTP
- if (isMac) restartSysCalls(readOneLine(prompt), reset())
- else readOneLine(prompt)
-}
-
-object InteractiveReader {
- val msgEINTR = "Interrupted system call"
- def restartSysCalls[R](body: => R, reset: => Unit): R =
- try body catch {
- case e: IOException if e.getMessage == msgEINTR => reset ; body
- }
-
- def apply(): InteractiveReader = SimpleReader()
- @deprecated("Use `apply` instead.", "2.9.0")
- def createDefault(): InteractiveReader = apply() // used by sbt
-}
-
diff --git a/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala b/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala
deleted file mode 100644
index 19fa562234..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/JLineCompletion.scala
+++ /dev/null
@@ -1,352 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import Completion._
-import scala.collection.mutable.ListBuffer
-import scala.reflect.internal.util.StringOps.longestCommonPrefix
-
-// REPL completor - queries supplied interpreter for valid
-// completions based on current contents of buffer.
-class JLineCompletion(val intp: IMain) extends Completion with CompletionOutput {
- val global: intp.global.type = intp.global
- import global._
- import definitions.{ PredefModule, AnyClass, AnyRefClass, ScalaPackage, JavaLangPackage }
- import rootMirror.{ RootClass, getModuleIfDefined }
- type ExecResult = Any
- import intp.{ debugging }
-
- // verbosity goes up with consecutive tabs
- private var verbosity: Int = 0
- def resetVerbosity() = verbosity = 0
-
- def getSymbol(name: String, isModule: Boolean) = (
- if (isModule) getModuleIfDefined(name)
- else getModuleIfDefined(name)
- )
-
- trait CompilerCompletion {
- def tp: Type
- def effectiveTp = tp match {
- case MethodType(Nil, resType) => resType
- case NullaryMethodType(resType) => resType
- case _ => tp
- }
-
- // for some reason any's members don't show up in subclasses, which
- // we need so 5.<tab> offers asInstanceOf etc.
- private def anyMembers = AnyClass.tpe.nonPrivateMembers
- def anyRefMethodsToShow = Set("isInstanceOf", "asInstanceOf", "toString")
-
- def tos(sym: Symbol): String = sym.decodedName
- def memberNamed(s: String) = exitingTyper(effectiveTp member newTermName(s))
-
- // XXX we'd like to say "filterNot (_.isDeprecated)" but this causes the
- // compiler to crash for reasons not yet known.
- def members = exitingTyper((effectiveTp.nonPrivateMembers.toList ++ anyMembers) filter (_.isPublic))
- def methods = members.toList filter (_.isMethod)
- def packages = members.toList filter (_.isPackage)
- def aliases = members.toList filter (_.isAliasType)
-
- def memberNames = members map tos
- def methodNames = methods map tos
- def packageNames = packages map tos
- def aliasNames = aliases map tos
- }
-
- object NoTypeCompletion extends TypeMemberCompletion(NoType) {
- override def memberNamed(s: String) = NoSymbol
- override def members = Nil
- override def follow(s: String) = None
- override def alternativesFor(id: String) = Nil
- }
-
- object TypeMemberCompletion {
- def apply(tp: Type, runtimeType: Type, param: NamedParam): TypeMemberCompletion = {
- new TypeMemberCompletion(tp) {
- var upgraded = false
- lazy val upgrade = {
- intp rebind param
- intp.reporter.printMessage("\nRebinding stable value %s from %s to %s".format(param.name, tp, param.tpe))
- upgraded = true
- new TypeMemberCompletion(runtimeType)
- }
- override def completions(verbosity: Int) = {
- super.completions(verbosity) ++ (
- if (verbosity == 0) Nil
- else upgrade.completions(verbosity)
- )
- }
- override def follow(s: String) = super.follow(s) orElse {
- if (upgraded) upgrade.follow(s)
- else None
- }
- override def alternativesFor(id: String) = super.alternativesFor(id) ++ (
- if (upgraded) upgrade.alternativesFor(id)
- else Nil
- ) distinct
- }
- }
- def apply(tp: Type): TypeMemberCompletion = {
- if (tp eq NoType) NoTypeCompletion
- else if (tp.typeSymbol.isPackageClass) new PackageCompletion(tp)
- else new TypeMemberCompletion(tp)
- }
- def imported(tp: Type) = new ImportCompletion(tp)
- }
-
- class TypeMemberCompletion(val tp: Type) extends CompletionAware
- with CompilerCompletion {
- def excludeEndsWith: List[String] = Nil
- def excludeStartsWith: List[String] = List("<") // <byname>, <repeated>, etc.
- def excludeNames: List[String] = (anyref.methodNames filterNot anyRefMethodsToShow) :+ "_root_"
-
- def methodSignatureString(sym: Symbol) = {
- IMain stripString exitingTyper(new MethodSymbolOutput(sym).methodString())
- }
-
- def exclude(name: String): Boolean = (
- (name contains "$") ||
- (excludeNames contains name) ||
- (excludeEndsWith exists (name endsWith _)) ||
- (excludeStartsWith exists (name startsWith _))
- )
- def filtered(xs: List[String]) = xs filterNot exclude distinct
-
- def completions(verbosity: Int) =
- debugging(tp + " completions ==> ")(filtered(memberNames))
-
- override def follow(s: String): Option[CompletionAware] =
- debugging(tp + " -> '" + s + "' ==> ")(Some(TypeMemberCompletion(memberNamed(s).tpe)) filterNot (_ eq NoTypeCompletion))
-
- override def alternativesFor(id: String): List[String] =
- debugging(id + " alternatives ==> ") {
- val alts = members filter (x => x.isMethod && tos(x) == id) map methodSignatureString
-
- if (alts.nonEmpty) "" :: alts else Nil
- }
-
- override def toString = "%s (%d members)".format(tp, members.size)
- }
-
- class PackageCompletion(tp: Type) extends TypeMemberCompletion(tp) {
- override def excludeNames = anyref.methodNames
- }
-
- class LiteralCompletion(lit: Literal) extends TypeMemberCompletion(lit.value.tpe) {
- override def completions(verbosity: Int) = verbosity match {
- case 0 => filtered(memberNames)
- case _ => memberNames
- }
- }
-
- class ImportCompletion(tp: Type) extends TypeMemberCompletion(tp) {
- override def completions(verbosity: Int) = verbosity match {
- case 0 => filtered(members filterNot (_.isSetter) map tos)
- case _ => super.completions(verbosity)
- }
- }
-
- // not for completion but for excluding
- object anyref extends TypeMemberCompletion(AnyRefClass.tpe) { }
-
- // the unqualified vals/defs/etc visible in the repl
- object ids extends CompletionAware {
- override def completions(verbosity: Int) = intp.unqualifiedIds ++ List("classOf") //, "_root_")
- // now we use the compiler for everything.
- override def follow(id: String): Option[CompletionAware] = {
- if (!completions(0).contains(id))
- return None
-
- val tpe = intp typeOfExpression id
- if (tpe == NoType)
- return None
-
- def default = Some(TypeMemberCompletion(tpe))
-
- // only rebinding vals in power mode for now.
- if (!isReplPower) default
- else intp runtimeClassAndTypeOfTerm id match {
- case Some((clazz, runtimeType)) =>
- val sym = intp.symbolOfTerm(id)
- if (sym.isStable) {
- val param = new NamedParam.Untyped(id, intp valueOfTerm id getOrElse null)
- Some(TypeMemberCompletion(tpe, runtimeType, param))
- }
- else default
- case _ =>
- default
- }
- }
- override def toString = "<repl ids> (%s)".format(completions(0).size)
- }
-
- // user-issued wildcard imports like "import global._" or "import String._"
- private def imported = intp.sessionWildcards map TypeMemberCompletion.imported
-
- // literal Ints, Strings, etc.
- object literals extends CompletionAware {
- def simpleParse(code: String): Tree = newUnitParser(code).templateStats().last
- def completions(verbosity: Int) = Nil
-
- override def follow(id: String) = simpleParse(id) match {
- case x: Literal => Some(new LiteralCompletion(x))
- case _ => None
- }
- }
-
- // top level packages
- object rootClass extends TypeMemberCompletion(RootClass.tpe) {
- override def completions(verbosity: Int) = super.completions(verbosity) :+ "_root_"
- override def follow(id: String) = id match {
- case "_root_" => Some(this)
- case _ => super.follow(id)
- }
- }
- // members of Predef
- object predef extends TypeMemberCompletion(PredefModule.tpe) {
- override def excludeEndsWith = super.excludeEndsWith ++ List("Wrapper", "ArrayOps")
- override def excludeStartsWith = super.excludeStartsWith ++ List("wrap")
- override def excludeNames = anyref.methodNames
-
- override def exclude(name: String) = super.exclude(name) || (
- (name contains "2")
- )
-
- override def completions(verbosity: Int) = verbosity match {
- case 0 => Nil
- case _ => super.completions(verbosity)
- }
- }
- // members of scala.*
- object scalalang extends PackageCompletion(ScalaPackage.tpe) {
- def arityClasses = List("Product", "Tuple", "Function")
- def skipArity(name: String) = arityClasses exists (x => name != x && (name startsWith x))
- override def exclude(name: String) = super.exclude(name) || (
- skipArity(name)
- )
-
- override def completions(verbosity: Int) = verbosity match {
- case 0 => filtered(packageNames ++ aliasNames)
- case _ => super.completions(verbosity)
- }
- }
- // members of java.lang.*
- object javalang extends PackageCompletion(JavaLangPackage.tpe) {
- override lazy val excludeEndsWith = super.excludeEndsWith ++ List("Exception", "Error")
- override lazy val excludeStartsWith = super.excludeStartsWith ++ List("CharacterData")
-
- override def completions(verbosity: Int) = verbosity match {
- case 0 => filtered(packageNames)
- case _ => super.completions(verbosity)
- }
- }
-
- // the list of completion aware objects which should be consulted
- // for top level unqualified, it's too noisy to let much in.
- lazy val topLevelBase: List[CompletionAware] = List(ids, rootClass, predef, scalalang, javalang, literals)
- def topLevel = topLevelBase ++ imported
- def topLevelThreshold = 50
-
- // the first tier of top level objects (doesn't include file completion)
- def topLevelFor(parsed: Parsed): List[String] = {
- val buf = new ListBuffer[String]
- topLevel foreach { ca =>
- buf ++= (ca completionsFor parsed)
-
- if (buf.size > topLevelThreshold)
- return buf.toList.sorted
- }
- buf.toList
- }
-
- // the most recent result
- def lastResult = Forwarder(() => ids follow intp.mostRecentVar)
-
- def lastResultFor(parsed: Parsed) = {
- /** The logic is a little tortured right now because normally '.' is
- * ignored as a delimiter, but on .<tab> it needs to be propagated.
- */
- val xs = lastResult completionsFor parsed
- if (parsed.isEmpty) xs map ("." + _) else xs
- }
-
- def completer(): ScalaCompleter = new JLineTabCompletion
-
- /** This gets a little bit hairy. It's no small feat delegating everything
- * and also keeping track of exactly where the cursor is and where it's supposed
- * to end up. The alternatives mechanism is a little hacky: if there is an empty
- * string in the list of completions, that means we are expanding a unique
- * completion, so don't update the "last" buffer because it'll be wrong.
- */
- class JLineTabCompletion extends ScalaCompleter {
- // For recording the buffer on the last tab hit
- private var lastBuf: String = ""
- private var lastCursor: Int = -1
-
- // Does this represent two consecutive tabs?
- def isConsecutiveTabs(buf: String, cursor: Int) =
- cursor == lastCursor && buf == lastBuf
-
- // This is jline's entry point for completion.
- override def complete(buf: String, cursor: Int): Candidates = {
- verbosity = if (isConsecutiveTabs(buf, cursor)) verbosity + 1 else 0
- repldbg("\ncomplete(%s, %d) last = (%s, %d), verbosity: %s".format(buf, cursor, lastBuf, lastCursor, verbosity))
-
- // we don't try lower priority completions unless higher ones return no results.
- def tryCompletion(p: Parsed, completionFunction: Parsed => List[String]): Option[Candidates] = {
- val winners = completionFunction(p)
- if (winners.isEmpty)
- return None
- val newCursor =
- if (winners contains "") p.cursor
- else {
- val advance = longestCommonPrefix(winners)
- lastCursor = p.position + advance.length
- lastBuf = (buf take p.position) + advance
- repldbg("tryCompletion(%s, _) lastBuf = %s, lastCursor = %s, p.position = %s".format(
- p, lastBuf, lastCursor, p.position))
- p.position
- }
-
- Some(Candidates(newCursor, winners))
- }
-
- def mkDotted = Parsed.dotted(buf, cursor) withVerbosity verbosity
-
- // a single dot is special cased to completion on the previous result
- def lastResultCompletion =
- if (!looksLikeInvocation(buf)) None
- else tryCompletion(Parsed.dotted(buf drop 1, cursor), lastResultFor)
-
- def tryAll = (
- lastResultCompletion
- orElse tryCompletion(mkDotted, topLevelFor)
- getOrElse Candidates(cursor, Nil)
- )
-
- /**
- * This is the kickoff point for all manner of theoretically
- * possible compiler unhappiness. The fault may be here or
- * elsewhere, but we don't want to crash the repl regardless.
- * The compiler makes it impossible to avoid catching Throwable
- * with its unfortunate tendency to throw java.lang.Errors and
- * AssertionErrors as the hats drop. We take two swings at it
- * because there are some spots which like to throw an assertion
- * once, then work after that. Yeah, what can I say.
- */
- try tryAll
- catch { case ex: Throwable =>
- repldbg("Error: complete(%s, %s) provoked".format(buf, cursor) + ex)
- Candidates(cursor,
- if (isReplDebug) List("<error:" + ex + ">")
- else Nil
- )
- }
- }
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala b/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala
deleted file mode 100644
index 5d41f1bbb4..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/JLineReader.scala
+++ /dev/null
@@ -1,68 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Stepan Koltsov
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.tools.jline.console.ConsoleReader
-import scala.tools.jline.console.completer._
-import session._
-import Completion._
-
-/**
- * Reads from the console using JLine.
- */
-class JLineReader(_completion: => Completion) extends InteractiveReader {
- val interactive = true
- val consoleReader = new JLineConsoleReader()
-
- lazy val completion = _completion
- lazy val history: JLineHistory = JLineHistory()
-
- private def term = consoleReader.getTerminal()
- def reset() = term.reset()
-
- def scalaToJline(tc: ScalaCompleter): Completer = new Completer {
- def complete(_buf: String, cursor: Int, candidates: JList[CharSequence]): Int = {
- val buf = if (_buf == null) "" else _buf
- val Candidates(newCursor, newCandidates) = tc.complete(buf, cursor)
- newCandidates foreach (candidates add _)
- newCursor
- }
- }
-
- class JLineConsoleReader extends ConsoleReader with ConsoleReaderHelper {
- // working around protected/trait/java insufficiencies.
- def goBack(num: Int): Unit = back(num)
- if ((history: History) ne NoHistory)
- this setHistory history
-
- def readOneKey(prompt: String) = {
- this.print(prompt)
- this.flush()
- this.readVirtualKey()
- }
- def eraseLine() = consoleReader.resetPromptLine("", "", 0)
- def redrawLineAndFlush(): Unit = { flush() ; drawLine() ; flush() }
-
- // A hook for running code after the repl is done initializing.
- lazy val postInit: Unit = {
- this setBellEnabled false
-
- if (completion ne NoCompletion) {
- val argCompletor: ArgumentCompleter =
- new ArgumentCompleter(new JLineDelimiter, scalaToJline(completion.completer()))
- argCompletor setStrict false
-
- this addCompleter argCompletor
- this setAutoprintThreshold 400 // max completion candidates without warning
- }
- }
- }
-
- def redrawLine() = consoleReader.redrawLineAndFlush()
- def readOneLine(prompt: String) = consoleReader readLine prompt
- def readOneKey(prompt: String) = consoleReader readOneKey prompt
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Logger.scala b/src/compiler/scala/tools/nsc/interpreter/Logger.scala
deleted file mode 100644
index 7407daf8d0..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Logger.scala
+++ /dev/null
@@ -1,14 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-trait Logger {
- def isInfo: Boolean
- def isDebug: Boolean
- def isTrace: Boolean
- def out: JPrintWriter
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala b/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala
deleted file mode 100644
index 4bba27b714..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/LoopCommands.scala
+++ /dev/null
@@ -1,86 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.collection.{ mutable, immutable }
-import mutable.ListBuffer
-import scala.language.implicitConversions
-
-class ProcessResult(val line: String) {
- import scala.sys.process._
- private val buffer = new ListBuffer[String]
-
- val builder = Process(line)
- val logger = ProcessLogger(buffer += _)
- val exitCode = builder ! logger
- def lines = buffer.toList
-
- override def toString = "`%s` (%d lines, exit %d)".format(line, buffer.size, exitCode)
-}
-
-trait LoopCommands {
- protected def out: JPrintWriter
-
- // So outputs can be suppressed.
- def echoCommandMessage(msg: String): Unit = out println msg
-
- // a single interpreter command
- abstract class LoopCommand(val name: String, val help: String) extends (String => Result) {
- def usage: String = ""
- def usageMsg: String = ":" + name + (
- if (usage == "") "" else " " + usage
- )
- def apply(line: String): Result
-
- // called if no args are given
- def showUsage(): Result = {
- "usage is " + usageMsg
- Result(keepRunning = true, None)
- }
- }
- object LoopCommand {
- def nullary(name: String, help: String, f: () => Result): LoopCommand =
- new NullaryCmd(name, help, _ => f())
-
- def cmd(name: String, usage: String, help: String, f: String => Result): LoopCommand =
- if (usage == "") new NullaryCmd(name, help, f)
- else new LineCmd(name, usage, help, f)
- }
-
- class NullaryCmd(name: String, help: String, f: String => Result) extends LoopCommand(name, help) {
- def apply(line: String): Result = f(line)
- }
-
- class LineCmd(name: String, argWord: String, help: String, f: String => Result) extends LoopCommand(name, help) {
- override def usage = argWord
- def apply(line: String): Result = f(line)
- }
-
- class VarArgsCmd(name: String, argWord: String, help: String, f: List[String] => Result)
- extends LoopCommand(name, help) {
- override def usage = argWord
- def apply(line: String): Result = apply(words(line))
- def apply(args: List[String]) = f(args)
- }
-
- // the result of a single command
- case class Result(keepRunning: Boolean, lineToRecord: Option[String])
-
- object Result {
- // the default result means "keep running, and don't record that line"
- val default = Result(keepRunning = true, None)
-
- // most commands do not want to micromanage the Result, but they might want
- // to print something to the console, so we accomodate Unit and String returns.
- implicit def resultFromUnit(x: Unit): Result = default
- implicit def resultFromString(msg: String): Result = {
- echoCommandMessage(msg)
- default
- }
- }
-}
-
diff --git a/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala b/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala
deleted file mode 100644
index 84a47311e2..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/MemberHandlers.scala
+++ /dev/null
@@ -1,219 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Martin Odersky
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.collection.{ mutable, immutable }
-import scala.reflect.internal.Flags._
-import scala.language.implicitConversions
-
-trait MemberHandlers {
- val intp: IMain
-
- import intp.{ Request, global, naming }
- import global._
- import naming._
-
- private def codegenln(leadingPlus: Boolean, xs: String*): String = codegen(leadingPlus, (xs ++ Array("\n")): _*)
- private def codegenln(xs: String*): String = codegenln(true, xs: _*)
- private def codegen(leadingPlus: Boolean, xs: String*): String = {
- val front = if (leadingPlus) "+ " else ""
- front + (xs map string2codeQuoted mkString " + ")
- }
- private implicit def name2string(name: Name) = name.toString
-
- /** A traverser that finds all mentioned identifiers, i.e. things
- * that need to be imported. It might return extra names.
- */
- private class ImportVarsTraverser extends Traverser {
- val importVars = new mutable.HashSet[Name]()
-
- override def traverse(ast: Tree) = ast match {
- case Ident(name) =>
- // XXX this is obviously inadequate but it's going to require some effort
- // to get right.
- if (name.toString startsWith "x$") ()
- else importVars += name
- case _ => super.traverse(ast)
- }
- }
- private object ImportVarsTraverser {
- def apply(member: Tree) = {
- val ivt = new ImportVarsTraverser()
- ivt traverse member
- ivt.importVars.toList
- }
- }
-
- private def isTermMacro(ddef: DefDef): Boolean = ddef.mods.isMacro
-
- def chooseHandler(member: Tree): MemberHandler = member match {
- case member: DefDef if isTermMacro(member) => new TermMacroHandler(member)
- case member: DefDef => new DefHandler(member)
- case member: ValDef => new ValHandler(member)
- case member: ModuleDef => new ModuleHandler(member)
- case member: ClassDef => new ClassHandler(member)
- case member: TypeDef => new TypeAliasHandler(member)
- case member: Assign => new AssignHandler(member)
- case member: Import => new ImportHandler(member)
- case DocDef(_, documented) => chooseHandler(documented)
- case member => new GenericHandler(member)
- }
-
- sealed abstract class MemberDefHandler(override val member: MemberDef) extends MemberHandler(member) {
- override def name: Name = member.name
- def mods: Modifiers = member.mods
- def keyword = member.keyword
- def prettyName = name.decode
-
- override def definesImplicit = member.mods.isImplicit
- override def definesTerm: Option[TermName] = Some(name.toTermName) filter (_ => name.isTermName)
- override def definesType: Option[TypeName] = Some(name.toTypeName) filter (_ => name.isTypeName)
- override def definedSymbols = if (symbol eq NoSymbol) Nil else List(symbol)
- }
-
- /** Class to handle one member among all the members included
- * in a single interpreter request.
- */
- sealed abstract class MemberHandler(val member: Tree) {
- def name: Name = nme.NO_NAME
- def path = intp.originalPath(symbol)
- def symbol = if (member.symbol eq null) NoSymbol else member.symbol
- def definesImplicit = false
- def definesValue = false
-
- def definesTerm = Option.empty[TermName]
- def definesType = Option.empty[TypeName]
-
- lazy val referencedNames = ImportVarsTraverser(member)
- def importedNames = List[Name]()
- def definedNames = definesTerm.toList ++ definesType.toList
- def definedSymbols = List[Symbol]()
-
- def extraCodeToEvaluate(req: Request): String = ""
- def resultExtractionCode(req: Request): String = ""
-
- private def shortName = this.getClass.toString split '.' last
- override def toString = shortName + referencedNames.mkString(" (refs: ", ", ", ")")
- }
-
- class GenericHandler(member: Tree) extends MemberHandler(member)
-
- class ValHandler(member: ValDef) extends MemberDefHandler(member) {
- val maxStringElements = 1000 // no need to mkString billions of elements
- override def definesValue = true
-
- override def resultExtractionCode(req: Request): String = {
- val isInternal = isUserVarName(name) && req.lookupTypeOf(name) == "Unit"
- if (!mods.isPublic || isInternal) ""
- else {
- // if this is a lazy val we avoid evaluating it here
- val resultString =
- if (mods.isLazy) codegenln(false, "<lazy>")
- else any2stringOf(path, maxStringElements)
-
- val vidString =
- if (replProps.vids) s"""" + " @ " + "%%8x".format(System.identityHashCode($path)) + " """.trim
- else ""
-
- """ + "%s%s: %s = " + %s""".format(string2code(prettyName), vidString, string2code(req typeOf name), resultString)
- }
- }
- }
-
- class DefHandler(member: DefDef) extends MemberDefHandler(member) {
- override def definesValue = flattensToEmpty(member.vparamss) // true if 0-arity
- override def resultExtractionCode(req: Request) =
- if (mods.isPublic) codegenln(name, ": ", req.typeOf(name)) else ""
- }
-
- abstract class MacroHandler(member: DefDef) extends MemberDefHandler(member) {
- override def definesValue = false
- override def definesTerm: Option[TermName] = Some(name.toTermName)
- override def definesType: Option[TypeName] = None
- override def resultExtractionCode(req: Request) = if (mods.isPublic) codegenln(notification(req)) else ""
- def notification(req: Request): String
- }
-
- class TermMacroHandler(member: DefDef) extends MacroHandler(member) {
- def notification(req: Request) = s"defined term macro $name: ${req.typeOf(name)}"
- }
-
- class AssignHandler(member: Assign) extends MemberHandler(member) {
- val Assign(lhs, rhs) = member
- override lazy val name = newTermName(freshInternalVarName())
-
- override def definesTerm = Some(name)
- override def definesValue = true
- override def extraCodeToEvaluate(req: Request) =
- """val %s = %s""".format(name, lhs)
-
- /** Print out lhs instead of the generated varName */
- override def resultExtractionCode(req: Request) = {
- val lhsType = string2code(req lookupTypeOf name)
- val res = string2code(req fullPath name)
- """ + "%s: %s = " + %s + "\n" """.format(string2code(lhs.toString), lhsType, res) + "\n"
- }
- }
-
- class ModuleHandler(module: ModuleDef) extends MemberDefHandler(module) {
- override def definesTerm = Some(name.toTermName)
- override def definesValue = true
-
- override def resultExtractionCode(req: Request) = codegenln("defined object ", name)
- }
-
- class ClassHandler(member: ClassDef) extends MemberDefHandler(member) {
- override def definedSymbols = List(symbol, symbol.companionSymbol) filterNot (_ == NoSymbol)
- override def definesType = Some(name.toTypeName)
- override def definesTerm = Some(name.toTermName) filter (_ => mods.isCase)
-
- override def resultExtractionCode(req: Request) =
- codegenln("defined %s %s".format(keyword, name))
- }
-
- class TypeAliasHandler(member: TypeDef) extends MemberDefHandler(member) {
- private def isAlias = mods.isPublic && treeInfo.isAliasTypeDef(member)
- override def definesType = Some(name.toTypeName) filter (_ => isAlias)
-
- override def resultExtractionCode(req: Request) =
- codegenln("defined type alias ", name) + "\n"
- }
-
- class ImportHandler(imp: Import) extends MemberHandler(imp) {
- val Import(expr, selectors) = imp
- def targetType = intp.global.rootMirror.getModuleIfDefined("" + expr) match {
- case NoSymbol => intp.typeOfExpression("" + expr)
- case sym => sym.thisType
- }
- private def importableTargetMembers = importableMembers(targetType).toList
- // wildcard imports, e.g. import foo._
- private def selectorWild = selectors filter (_.name == nme.USCOREkw)
- // renamed imports, e.g. import foo.{ bar => baz }
- private def selectorRenames = selectors map (_.rename) filterNot (_ == null)
-
- /** Whether this import includes a wildcard import */
- val importsWildcard = selectorWild.nonEmpty
-
- def implicitSymbols = importedSymbols filter (_.isImplicit)
- def importedSymbols = individualSymbols ++ wildcardSymbols
-
- private val selectorNames = selectorRenames filterNot (_ == nme.USCOREkw) flatMap (_.bothNames) toSet
- lazy val individualSymbols: List[Symbol] = exitingTyper(importableTargetMembers filter (m => selectorNames(m.name)))
- lazy val wildcardSymbols: List[Symbol] = exitingTyper(if (importsWildcard) importableTargetMembers else Nil)
-
- /** Complete list of names imported by a wildcard */
- lazy val wildcardNames: List[Name] = wildcardSymbols map (_.name)
- lazy val individualNames: List[Name] = individualSymbols map (_.name)
-
- /** The names imported by this statement */
- override lazy val importedNames: List[Name] = wildcardNames ++ individualNames
- lazy val importsSymbolNamed: Set[String] = importedNames map (_.toString) toSet
-
- def importString = imp.toString
- override def resultExtractionCode(req: Request) = codegenln(importString) + "\n"
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/NamedParam.scala b/src/compiler/scala/tools/nsc/interpreter/NamedParam.scala
deleted file mode 100644
index 627a881cae..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/NamedParam.scala
+++ /dev/null
@@ -1,45 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import NamedParam._
-import scala.language.implicitConversions
-import scala.reflect.runtime.{universe => ru}
-import scala.reflect.{ClassTag, classTag}
-
-trait NamedParamCreator {
- protected def freshName: () => String
-
- def apply[T: ru.TypeTag : ClassTag](name: String, x: T): NamedParam = new Typed[T](name, x)
- def apply[T: ru.TypeTag : ClassTag](x: T): NamedParam = apply(freshName(), x)
- def clazz(name: String, x: Any): NamedParam = new Untyped(name, x)
-
- implicit def tuple[T: ru.TypeTag : ClassTag](pair: (String, T)): NamedParam = apply(pair._1, pair._2)
-}
-
-object NamedParam extends NamedParamCreator {
- class Typed[T: ru.TypeTag : ClassTag](val name: String, val value: T) extends NamedParam {
- val tpe = TypeStrings.fromTag[T]
- }
- class Untyped(val name: String, val value: Any) extends NamedParam {
- val tpe = TypeStrings.fromValue(value)
- }
-
- protected val freshName = {
- var counter = 0
- () => { counter += 1; "p" + counter }
- }
-}
-
-case class NamedParamClass(name: String, tpe: String, value: Any) extends NamedParam { }
-
-trait NamedParam {
- def name: String
- def tpe: String
- def value: Any
- override def toString = name + ": " + tpe
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Naming.scala b/src/compiler/scala/tools/nsc/interpreter/Naming.scala
deleted file mode 100644
index 57f3675ada..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Naming.scala
+++ /dev/null
@@ -1,105 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.util.Properties.lineSeparator
-
-/** This is for name logic which is independent of the compiler (notice there's no Global.)
- * That includes at least generating, metaquoting, mangling, and unmangling.
- */
-trait Naming {
- def unmangle(str: String): String = {
- val ESC = '\u001b'
- val cleaned = removeIWPackages(removeLineWrapper(str))
- // Looking to exclude binary data which hoses the terminal, but
- // let through the subset of it we need, like whitespace and also
- // <ESC> for ansi codes.
- val binaryChars = cleaned count (ch => ch < 32 && !ch.isWhitespace && ch != ESC)
- // Lots of binary chars - translate all supposed whitespace into spaces
- // except supposed line endings, otherwise scrubbed lines run together
- if (binaryChars > 5) // more than one can count while holding a hamburger
- cleaned map {
- case c if lineSeparator contains c => c
- case c if c.isWhitespace => ' '
- case c if c < 32 => '?'
- case c => c
- }
- // Not lots - preserve whitespace and ESC
- else
- cleaned map (ch => if (ch.isWhitespace || ch == ESC) ch else if (ch < 32) '?' else ch)
- }
-
- // The two name forms this is catching are the two sides of this assignment:
- //
- // $line3.$read.$iw.$iw.Bippy =
- // $line3.$read$$iw$$iw$Bippy@4a6a00ca
-
- private def noMeta(s: String) = "\\Q" + s + "\\E"
- private lazy val lineRegex = {
- val sn = sessionNames
- val members = List(sn.read, sn.eval, sn.print) map noMeta mkString ("(?:", "|", ")")
- debugging("lineRegex")(noMeta(sn.line) + """\d+[./]""" + members + """[$.]""")
- }
-
- private def removeLineWrapper(s: String) = s.replaceAll(lineRegex, "")
- private def removeIWPackages(s: String) = s.replaceAll("""\$iw[$.]""", "")
-
- trait SessionNames {
- // All values are configurable by passing e.g. -Dscala.repl.name.read=XXX
- final def propOr(name: String): String = propOr(name, "$" + name)
- final def propOr(name: String, default: String): String =
- sys.props.getOrElse("scala.repl.name." + name, default)
-
- // Prefixes used in repl machinery. Default to $line, $read, etc.
- def line = propOr("line")
- def read = propOr("read")
- def eval = propOr("eval")
- def print = propOr("print")
- def result = propOr("result")
-
- // The prefix for unnamed results: by default res0, res1, etc.
- def res = propOr("res", "res") // INTERPRETER_VAR_PREFIX
- // Internal ones
- def ires = propOr("ires")
- }
- lazy val sessionNames: SessionNames = new SessionNames { }
-
- /** Generates names pre0, pre1, etc. via calls to apply method */
- class NameCreator(pre: String) {
- private var x = -1
- var mostRecent: String = ""
-
- def apply(): String = {
- x += 1
- mostRecent = pre + x
- mostRecent
- }
- def reset(): Unit = x = -1
- def didGenerate(name: String) =
- (name startsWith pre) && ((name drop pre.length) forall (_.isDigit))
- }
-
- private lazy val userVar = new NameCreator(sessionNames.res) // var name, like res0
- private lazy val internalVar = new NameCreator(sessionNames.ires) // internal var name, like $ires0
-
- def isUserVarName(name: String) = userVar didGenerate name
- def isInternalVarName(name: String) = internalVar didGenerate name
-
- val freshLineId = {
- var x = 0
- () => { x += 1 ; x }
- }
- def freshUserVarName() = userVar()
- def freshInternalVarName() = internalVar()
-
- def resetAllCreators() {
- userVar.reset()
- internalVar.reset()
- }
-
- def mostRecentVar = userVar.mostRecent
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Parsed.scala b/src/compiler/scala/tools/nsc/interpreter/Parsed.scala
deleted file mode 100644
index 672a6fd28f..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Parsed.scala
+++ /dev/null
@@ -1,60 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import util.returning
-
-/** One instance of a command buffer.
- */
-class Parsed private (
- val buffer: String,
- val cursor: Int,
- val delimited: Char => Boolean
-) extends Delimited {
- def isEmpty = args.isEmpty
- def isUnqualified = args.size == 1
- def isAtStart = cursor <= 0
-
- private var _verbosity = 0
-
- def verbosity = _verbosity
- def withVerbosity(v: Int): this.type = returning[this.type](this)(_ => _verbosity = v)
-
- def args = toArgs(buffer take cursor).toList
- def bufferHead = args.head
- def headLength = bufferHead.length + 1
- def bufferTail = new Parsed(buffer drop headLength, cursor - headLength, delimited) withVerbosity verbosity
-
- def prev = new Parsed(buffer, cursor - 1, delimited) withVerbosity verbosity
- def currentChar = buffer(cursor)
- def currentArg = args.last
- def position =
- if (isEmpty) 0
- else if (isLastDelimiter) cursor
- else cursor - currentArg.length
-
- def isFirstDelimiter = !isEmpty && isDelimiterChar(buffer.head)
- def isLastDelimiter = !isEmpty && isDelimiterChar(buffer.last)
-
- def isQuoted = false // TODO
- def isEscaped = !isAtStart && isEscapeChar(currentChar) && !isEscapeChar(prev.currentChar)
- def isDelimiter = !isQuoted && !isEscaped && isDelimiterChar(currentChar)
-
- override def toString = "Parsed(%s / %d)".format(buffer, cursor)
-}
-
-object Parsed {
- val DefaultDelimiters = "[]{},`; \t".toSet
-
- private def onull(s: String) = if (s == null) "" else s
-
- def apply(s: String, cursor: Int): Parsed = apply(onull(s), cursor, DefaultDelimiters)
- def apply(s: String, cursor: Int, delimited: Char => Boolean): Parsed =
- new Parsed(onull(s), cursor, delimited)
-
- def dotted(s: String, cursor: Int): Parsed = new Parsed(onull(s), cursor, _ == '.')
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Pasted.scala b/src/compiler/scala/tools/nsc/interpreter/Pasted.scala
deleted file mode 100644
index f5db3d9e3a..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Pasted.scala
+++ /dev/null
@@ -1,101 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-/** If it looks like they're pasting in a scala interpreter
- * transcript, remove all the formatting we inserted so we
- * can make some sense of it.
- *
- * Most of the interesting code in here is due to my goal of
- * "paste idempotence" i.e. the transcript resulting from pasting
- * a transcript should itself be pasteable and should achieve
- * the same result.
- */
-abstract class Pasted {
- def ContinueString: String
- def PromptString: String
- def interpret(line: String): Unit
-
- def matchesPrompt(line: String) = matchesString(line, PromptString)
- def matchesContinue(line: String) = matchesString(line, ContinueString)
- def running = isRunning
-
- private def matchesString(line: String, target: String): Boolean = (
- (line startsWith target) ||
- (line.nonEmpty && " \t".toSet(line.head) && matchesString(line.tail, target))
- )
- private def stripString(line: String, target: String) = line indexOf target match {
- case -1 => line
- case idx => line drop (idx + target.length)
- }
- private var isRunning = false
- private val resReference = """(?<!^)(res\d+)""".r
- private val resCreation = """^\s*(res\d+):.*""".r
- private val resAssign = """^val (res\d+).*""".r
-
- private class PasteAnalyzer(val lines: List[String]) {
- val referenced = lines flatMap (resReference findAllIn _.trim.stripPrefix("res")) toSet
- val cmds = lines reduceLeft append split PromptString filterNot (_.trim == "") toList
-
- /** If it's a prompt or continuation line, strip the formatting bits and
- * assemble the code. Otherwise ship it off to be analyzed for res references
- * and discarded.
- */
- def append(code: String, line: String): String =
- if (matchesPrompt(line)) code + "\n" + line
- else if (matchesContinue(line)) code + "\n" + stripString(line, ContinueString)
- else fixResRefs(code, line)
-
- /** If the line looks like
- * res15: Int
- *
- * and the additional conditions hold that:
- * 1) res15 is referenced from elsewhere in the transcript
- * 2) the preceding repl line is not "val res15 = ..." because that
- * indicates it has already been "val-ified" on a previous paste
- *
- * then we go back in time to the preceding scala> prompt and
- * rewrite the line containing <expr> as
- * val res15 = { <expr> }
- * and the rest as they say is rewritten history.
- *
- * In all other cases, discard the line.
- */
- def fixResRefs(code: String, line: String) = line match {
- case resCreation(resName) if referenced(resName) =>
- code.lastIndexOf(PromptString) match {
- case -1 => code
- case idx =>
- val (str1, str2) = code splitAt (idx + PromptString.length)
- str2 match {
- case resAssign(`resName`) => code
- case _ => "%sval %s = { %s }".format(str1, resName, str2)
- }
- }
- case _ => code
- }
-
- def run() {
- println("// Replaying %d commands from transcript.\n" format cmds.size)
- cmds foreach { cmd =>
- print(PromptString)
- interpret(cmd)
- }
- }
- }
-
- /** Commands start on lines beginning with "scala>" and each successive
- * line which begins with the continuation string is appended to that command.
- * Everything else is discarded. When the end of the transcript is spotted,
- * all the commands are replayed.
- */
- def apply(lines: TraversableOnce[String]) = {
- isRunning = true
- try new PasteAnalyzer(lines.toList) run()
- finally isRunning = false
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Phased.scala b/src/compiler/scala/tools/nsc/interpreter/Phased.scala
deleted file mode 100644
index f625124e70..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Phased.scala
+++ /dev/null
@@ -1,143 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.collection.immutable
-import scala.language.implicitConversions
-
-/** Mix this into an object and use it as a phasing
- * swiss army knife.
- */
-trait Phased {
- val global: Global
- import global._
-
- private var active: PhaseName = NoPhaseName
- private var multi: Seq[PhaseName] = Nil
-
- def get = active
- def set(phase: PhaseName): Boolean = phase match {
- case NoPhaseName => false
- case name => active = name ; true
- }
- def setMulti(phases: Seq[PhaseName]): Boolean = {
- if (phases contains NoPhaseName) false
- else {
- multi = phases
- true
- }
- }
-
- private def parsePhaseChange(str: String): Option[Int] = {
- if (str == "") Some(0)
- else if (str startsWith ".prev") parsePhaseChange(str drop 5) map (_ - 1)
- else if (str startsWith ".next") parsePhaseChange(str drop 5) map (_ + 1)
- else str.head match {
- case '+' | '-' =>
- val (num, rest) = str.tail.span(_.isDigit)
- val diff = if (str.head == '+') num.toInt else -num.toInt
- parsePhaseChange(rest) map (_ + diff)
- case _ =>
- None
- }
- }
-
- /** Takes a string like 4, typer+2, typer.next, etc.
- * and turns it into a PhaseName instance.
- */
- private def parseInternal(str: String): PhaseName = {
- if (str == "") NoPhaseName
- else if (str forall (_.isDigit)) PhaseName(str.toInt)
- else {
- val (name, rest) = str.toLowerCase span (_.isLetter)
- val start = PhaseName(name)
- val change = parsePhaseChange(rest)
-
- if (start.isEmpty || change.isEmpty) NoPhaseName
- else PhaseName(start.id + change.get)
- }
- }
- def parse(str: String): PhaseName =
- try parseInternal(str)
- catch { case _: Exception => NoPhaseName }
-
- def atCurrent[T](body: => T): T = enteringPhase(get)(body)
- def multi[T](body: => T): Seq[T] = multi map (ph => at(ph)(body))
-
- def at[T](ph: PhaseName)(body: => T): T = {
- val saved = get
- set(ph)
- try atCurrent(body)
- finally set(saved)
- }
- def atMulti[T](phs: Seq[PhaseName])(body: => T): Seq[T] = {
- val saved = multi
- setMulti(phs)
- try multi(body)
- finally setMulti(saved)
- }
-
- def atMap[T](phs: Seq[PhaseName])(body: => T): Seq[(PhaseName, T)] =
- phs zip atMulti(phs)(body)
-
- object PhaseName {
- implicit lazy val phaseNameOrdering: Ordering[PhaseName] = Ordering[Int] on (_.id)
-
- lazy val all = List(
- Parser, Namer, Packageobjects, Typer, Superaccessors, Pickler, Refchecks,
- Selectiveanf, Liftcode, Selectivecps, Uncurry, Tailcalls, Specialize,
- Explicitouter, Erasure, Lazyvals, Lambdalift, Constructors, Flatten, Mixin,
- Cleanup, Icode, Inliner, Closelim, Dce, Jvm, Terminal
- )
- lazy val nameMap = all.map(x => x.name -> x).toMap withDefaultValue NoPhaseName
- multi = all
-
- def apply(id: Int): PhaseName = all find (_.id == id) getOrElse NoPhaseName
- implicit def apply(s: String): PhaseName = nameMap(s)
- }
- sealed abstract class PhaseName {
- lazy val id = phase.id
- lazy val name = toString.toLowerCase
- def phase = currentRun.phaseNamed(name)
- def isEmpty = this eq NoPhaseName
- }
-
- case object Parser extends PhaseName
- case object Namer extends PhaseName
- case object Packageobjects extends PhaseName
- case object Typer extends PhaseName
- case object Superaccessors extends PhaseName
- case object Pickler extends PhaseName
- case object Refchecks extends PhaseName
- case object Selectiveanf extends PhaseName
- case object Liftcode extends PhaseName
- case object Selectivecps extends PhaseName
- case object Uncurry extends PhaseName
- case object Tailcalls extends PhaseName
- case object Specialize extends PhaseName
- case object Explicitouter extends PhaseName
- case object Erasure extends PhaseName
- case object Lazyvals extends PhaseName
- case object Lambdalift extends PhaseName
- case object Constructors extends PhaseName
- case object Flatten extends PhaseName
- case object Mixin extends PhaseName
- case object Cleanup extends PhaseName
- case object Icode extends PhaseName
- case object Inliner extends PhaseName
- case object Closelim extends PhaseName
- case object Dce extends PhaseName
- case object Jvm extends PhaseName
- case object Terminal extends PhaseName
- case object NoPhaseName extends PhaseName {
- override lazy val id = -1
- override lazy val name = phase.name
- override def phase = NoPhase
- }
-
- implicit def phaseEnumToPhase(name: PhaseName): Phase = name.phase
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Power.scala b/src/compiler/scala/tools/nsc/interpreter/Power.scala
deleted file mode 100644
index e517a16b32..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Power.scala
+++ /dev/null
@@ -1,326 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.collection.{ mutable, immutable }
-import scala.util.matching.Regex
-import scala.io.Codec
-import java.net.{ URL, MalformedURLException }
-import io.{ Path }
-import scala.language.implicitConversions
-import scala.reflect.runtime.{universe => ru}
-import scala.reflect.{ClassTag, classTag}
-
-/** Collecting some power mode examples.
-
-scala> trait F[@specialized(Int) T] { def f: T = ??? }
-defined trait F
-
-scala> trait G[@specialized(Long, Int) T] extends F[T] { override def f: T = super.f }
-defined trait G
-
-scala> changesAfterEachPhase(intp("G").info.members filter (_.name.toString contains "super")) >
-Gained after 1/parser {
- method super$f
-}
-
-Gained after 12/specialize {
- method super$f$mcJ$sp
- method super$f$mcI$sp
-}
-
-Lost after 18/flatten {
- method super$f$mcJ$sp
- method super$f$mcI$sp
- method super$f
-}
-*/
-
-/** A class for methods to be injected into the intp in power mode.
- */
-class Power[ReplValsImpl <: ReplVals : ru.TypeTag: ClassTag](val intp: IMain, replVals: ReplValsImpl) {
- import intp.{ beQuietDuring, typeOfExpression, interpret, parse }
- import intp.global._
- import definitions.{ compilerTypeFromTag, compilerSymbolFromTag}
-
- abstract class SymSlurper {
- def isKeep(sym: Symbol): Boolean
- def isIgnore(sym: Symbol): Boolean
- def isRecur(sym: Symbol): Boolean
- def isFinished(): Boolean
-
- val keep = mutable.HashSet[Symbol]()
- val seen = mutable.HashSet[Symbol]()
- def processed = keep.size + seen.size
- def discarded = seen.size - keep.size
-
- def members(x: Symbol): List[Symbol] =
- if (x.rawInfo.isComplete) x.info.members.toList
- else Nil
-
- var lastCount = -1
- var pass = 0
- val unseenHistory = new mutable.ListBuffer[Int]
-
- def loop(todo: Set[Symbol]): Set[Symbol] = {
- pass += 1
- val (repeats, unseen) = todo partition seen
- unseenHistory += unseen.size
- if (settings.verbose.value) {
- println("%3d %s accumulated, %s discarded. This pass: %s unseen, %s repeats".format(
- pass, keep.size, discarded, unseen.size, repeats.size))
- }
- if (lastCount == processed || unseen.isEmpty || isFinished())
- return keep.toSet
-
- lastCount = processed
- keep ++= (unseen filter isKeep filterNot isIgnore)
- seen ++= unseen
- loop(unseen filter isRecur flatMap members)
- }
-
- def apply(sym: Symbol): Set[Symbol] = {
- keep.clear()
- seen.clear()
- loop(Set(sym))
- }
- }
-
- class PackageSlurper(packageClass: Symbol) extends SymSlurper {
- /** Looking for dwindling returns */
- def droppedEnough() = unseenHistory.size >= 4 && {
- unseenHistory takeRight 4 sliding 2 forall { it =>
- val List(a, b) = it.toList
- a > b
- }
- }
-
- def isRecur(sym: Symbol) = true
- def isIgnore(sym: Symbol) = sym.isAnonOrRefinementClass || (sym.name.toString contains "$mc")
- def isKeep(sym: Symbol) = sym.hasTransOwner(packageClass)
- def isFinished() = droppedEnough()
- def slurp() = {
- if (packageClass.isPackageClass)
- apply(packageClass)
- else {
- repldbg("Not a package class! " + packageClass)
- Set()
- }
- }
- }
-
- private def customBanner = replProps.powerBanner.option flatMap (f => io.File(f).safeSlurp())
- private def customInit = replProps.powerInitCode.option flatMap (f => io.File(f).safeSlurp())
-
- def banner = customBanner getOrElse """
- |** Power User mode enabled - BEEP WHIR GYVE **
- |** :phase has been set to 'typer'. **
- |** scala.tools.nsc._ has been imported **
- |** global._, definitions._ also imported **
- |** Try :help, :vals, power.<tab> **
- """.stripMargin.trim
-
- private def initImports = List(
- "scala.tools.nsc._",
- "scala.collection.JavaConverters._",
- "intp.global.{ error => _, _ }",
- "definitions.{ getClass => _, _ }",
- "power.rutil._",
- "replImplicits._",
- "treedsl.CODE._"
- )
-
- def init = customInit match {
- case Some(x) => x
- case _ => initImports.mkString("import ", ", ", "")
- }
-
- /** Starts up power mode and runs whatever is in init.
- */
- def unleash(): Unit = beQuietDuring {
- // First we create the ReplVals instance and bind it to $r
- intp.bind("$r", replVals)
- // Then we import everything from $r.
- intp interpret ("import " + intp.originalPath("$r") + "._")
- // And whatever else there is to do.
- init.lines foreach (intp interpret _)
- }
-
- trait LowPriorityInternalInfo {
- implicit def apply[T: ru.TypeTag : ClassTag] : InternalInfo[T] = new InternalInfo[T](None)
- }
- object InternalInfo extends LowPriorityInternalInfo { }
-
- /** Now dealing with the problem of acidentally calling a method on Type
- * when you're holding a Symbol and seeing the Symbol converted to the
- * type of Symbol rather than the type of the thing represented by the
- * symbol, by only implicitly installing one method, "?", and the rest
- * of the conveniences exist on that wrapper.
- */
- trait LowPriorityInternalInfoWrapper { }
- class InternalInfoWrapper[T: ru.TypeTag : ClassTag](value: Option[T] = None) {
- def ? : InternalInfo[T] = new InternalInfo[T](value)
- }
-
- /** Todos...
- * translate tag type arguments into applied types
- * customizable symbol filter (had to hardcode no-spec to reduce noise)
- */
- class InternalInfo[T](value: Option[T] = None)(implicit typeEvidence: ru.TypeTag[T], runtimeClassEvidence: ClassTag[T]) {
- private def isSpecialized(s: Symbol) = s.name.toString contains "$mc"
- private def isImplClass(s: Symbol) = s.name.toString endsWith "$class"
-
- /** Standard noise reduction filter. */
- def excludeMember(s: Symbol) = (
- isSpecialized(s)
- || isImplClass(s)
- || s.isAnonOrRefinementClass
- || s.isAnonymousFunction
- )
- def symbol = compilerSymbolFromTag(tag)
- def tpe = compilerTypeFromTag(tag)
- def members = membersUnabridged filterNot excludeMember
- def membersUnabridged = tpe.members.toList
- def pkg = symbol.enclosingPackage
- def tag = typeEvidence
- def runtimeClass = runtimeClassEvidence.runtimeClass
- def shortClass = runtimeClass.getName split "[$.]" last
- def baseClasses = tpe.baseClasses
-
- override def toString = value match {
- case Some(x) => "%s (%s)".format(x, shortClass)
- case _ => runtimeClass.getName
- }
- }
-
- trait LowPriorityPrettifier {
- implicit object AnyPrettifier extends Prettifier[Any] {
- def show(x: Any): Unit = prettify(x) foreach println
- def prettify(x: Any): TraversableOnce[String] = x match {
- case x: Name => List(x.decode)
- case Tuple2(k, v) => List(prettify(k).toIterator ++ Iterator("->") ++ prettify(v) mkString " ")
- case xs: Array[_] => xs.iterator flatMap prettify
- case xs: TraversableOnce[_] => xs flatMap prettify
- case x => List(Prettifier.stringOf(x))
- }
- }
- }
- object StringPrettifier extends Prettifier[String] {
- def show(x: String) = println(x)
- def prettify(x: String) = List(Prettifier stringOf x)
- }
- object Prettifier extends LowPriorityPrettifier {
- def stringOf(x: Any): String = scala.runtime.ScalaRunTime.stringOf(x)
- def default[T] = new Prettifier[T] {
- def prettify(x: T): TraversableOnce[String] = AnyPrettifier prettify x
- def show(x: T): Unit = AnyPrettifier show x
- }
- }
- trait Prettifier[T] {
- def show(x: T): Unit
- def prettify(x: T): TraversableOnce[String]
-
- def prettify(xs: TraversableOnce[T]): TraversableOnce[String] = xs flatMap (x => prettify(x))
- }
-
- abstract class PrettifierClass[T: Prettifier]() {
- val pretty = implicitly[Prettifier[T]]
- def value: Seq[T]
-
- def pp(f: Seq[T] => Seq[T]): Unit =
- pretty prettify f(value) foreach (StringPrettifier show _)
-
- def freq[U](p: T => U) = (value.toSeq groupBy p mapValues (_.size)).toList sortBy (-_._2) map (_.swap)
-
- def >>(implicit ord: Ordering[T]): Unit = pp(_.sorted)
- def >!(): Unit = pp(_.distinct)
- def >(): Unit = pp(identity)
- }
-
- class MultiPrettifierClass[T: Prettifier](val value: Seq[T]) extends PrettifierClass[T]() { }
- class SinglePrettifierClass[T: Prettifier](single: T) extends PrettifierClass[T]() {
- val value = List(single)
- }
-
- class RichReplString(s: String) {
- // make an url out of the string
- def u: URL = (
- if (s contains ":") new URL(s)
- else if (new JFile(s) exists) new JFile(s).toURI.toURL
- else new URL("http://" + s)
- )
- }
- class RichInputStream(in: InputStream)(implicit codec: Codec) {
- def bytes(): Array[Byte] = io.Streamable.bytes(in)
- def slurp(): String = io.Streamable.slurp(in)
- def <<(): String = slurp()
- }
- class RichReplURL(url: URL)(implicit codec: Codec) {
- def slurp(): String = io.Streamable.slurp(url)
- }
-
- trait Implicits1 {
- // fallback
- implicit def replPrinting[T](x: T)(implicit pretty: Prettifier[T] = Prettifier.default[T]) =
- new SinglePrettifierClass[T](x)
- }
- trait Implicits2 extends Implicits1 {
- class RichSymbol(sym: Symbol) {
- // convenient type application
- def apply(targs: Type*): Type = typeRef(NoPrefix, sym, targs.toList)
- }
- object symbolSubtypeOrdering extends Ordering[Symbol] {
- def compare(s1: Symbol, s2: Symbol) =
- if (s1 eq s2) 0
- else if (s1 isLess s2) -1
- else 1
- }
- implicit lazy val powerSymbolOrdering: Ordering[Symbol] = Ordering[Name] on (_.name)
- implicit lazy val powerTypeOrdering: Ordering[Type] = Ordering[Symbol] on (_.typeSymbol)
-
- implicit def replInternalInfo[T: ru.TypeTag : ClassTag](x: T): InternalInfoWrapper[T] = new InternalInfoWrapper[T](Some(x))
- implicit def replEnhancedStrings(s: String): RichReplString = new RichReplString(s)
- implicit def replMultiPrinting[T: Prettifier](xs: TraversableOnce[T]): MultiPrettifierClass[T] =
- new MultiPrettifierClass[T](xs.toSeq)
- implicit def replPrettifier[T] : Prettifier[T] = Prettifier.default[T]
- implicit def replTypeApplication(sym: Symbol): RichSymbol = new RichSymbol(sym)
-
- implicit def replInputStream(in: InputStream)(implicit codec: Codec) = new RichInputStream(in)
- implicit def replEnhancedURLs(url: URL)(implicit codec: Codec): RichReplURL = new RichReplURL(url)(codec)
- }
-
- trait ReplUtilities {
- def module[T: ru.TypeTag] = ru.typeOf[T].typeSymbol.suchThat(_.isPackage)
- def clazz[T: ru.TypeTag] = ru.typeOf[T].typeSymbol.suchThat(_.isClass)
- def info[T: ru.TypeTag : ClassTag] = InternalInfo[T]
- def ?[T: ru.TypeTag : ClassTag] = InternalInfo[T]
- def sanitize(s: String): String = sanitize(s.getBytes())
- def sanitize(s: Array[Byte]): String = (s map {
- case x if x.toChar.isControl => '?'
- case x => x.toChar
- }).mkString
-
- def strings(s: Seq[Byte]): List[String] = {
- if (s.length == 0) Nil
- else s dropWhile (_.toChar.isControl) span (x => !x.toChar.isControl) match {
- case (next, rest) => next.map(_.toChar).mkString :: strings(rest)
- }
- }
- }
-
- lazy val rutil: ReplUtilities = new ReplUtilities { }
- lazy val phased: Phased = new { val global: intp.global.type = intp.global } with Phased { }
-
- def unit(code: String) = newCompilationUnit(code)
- def trees(code: String) = parse(code) getOrElse Nil
-
- override def toString = s"""
- |** Power mode status **
- |Default phase: ${phased.get}
- |Names: ${intp.unqualifiedIds mkString " "}
- """.stripMargin
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala b/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala
deleted file mode 100644
index 3392ea0b5e..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ReplConfig.scala
+++ /dev/null
@@ -1,49 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.util.control.ControlThrowable
-import util.Exceptional.unwrap
-import util.stackTraceString
-
-trait ReplConfig {
- lazy val replProps = new ReplProps
-
- class TapMaker[T](x: T) {
- def tapDebug(msg: => String): T = tap(x => repldbg(parens(x)))
- def tap[U](f: T => U): T = {
- f(x)
- x
- }
- }
-
- private def parens(x: Any) = "(" + x + ")"
- private def echo(msg: => String) =
- try Console println msg
- catch { case x: AssertionError => Console.println("Assertion error printing debugging output: " + x) }
-
- private[nsc] def repldbg(msg: => String) = if (isReplDebug) echo(msg)
- private[nsc] def repltrace(msg: => String) = if (isReplTrace) echo(msg)
- private[nsc] def replinfo(msg: => String) = if (isReplInfo) echo(msg)
-
- private[nsc] def logAndDiscard[T](label: String, alt: => T): PartialFunction[Throwable, T] = {
- case t: ControlThrowable => throw t
- case t: Throwable =>
- repldbg(label + ": " + unwrap(t))
- repltrace(stackTraceString(unwrap(t)))
- alt
- }
- private[nsc] def substituteAndLog[T](label: String, alt: => T)(body: => T): T = {
- try body
- catch logAndDiscard(label, alt)
- }
-
- def isReplTrace: Boolean = replProps.trace
- def isReplDebug: Boolean = replProps.debug || isReplTrace
- def isReplInfo: Boolean = replProps.info || isReplDebug
- def isReplPower: Boolean = replProps.power
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplDir.scala b/src/compiler/scala/tools/nsc/interpreter/ReplDir.scala
deleted file mode 100644
index 5d386b47b7..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ReplDir.scala
+++ /dev/null
@@ -1,48 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import io.VirtualDirectory
-import settings.MutableSettings
-import scala.reflect.io.{ AbstractFile, PlainDirectory, Directory }
-import scala.collection.generic.Clearable
-
-/** Directory to save .class files to. */
-trait ReplDir extends AbstractFile with Clearable { }
-
-private class ReplVirtualDir() extends VirtualDirectory("(memory)", None) with ReplDir { }
-private class ReplRealDir(dir: Directory) extends PlainDirectory(dir) with ReplDir {
- def clear() = {
- dir.deleteRecursively()
- dir.createDirectory()
- }
-}
-
-class ReplOutput(val dirSetting: MutableSettings#StringSetting) {
- // outdir for generated classfiles - may be in-memory (the default),
- // a generated temporary directory, or a specified outdir.
- val dir: ReplDir = (
- if (dirSetting.isDefault)
- new ReplVirtualDir()
- else if (dirSetting.value == "")
- new ReplRealDir(Directory.makeTemp("repl"))
- else
- new ReplRealDir(Directory(dirSetting.value))
- )
-
- // print the contents hierarchically
- def show(out: JPrintWriter) = {
- def pp(root: AbstractFile, indentLevel: Int) {
- val label = root.name
- val spaces = " " * indentLevel
- out.println(spaces + label)
- if (root.isDirectory)
- root.toList sortBy (_.name) foreach (x => pp(x, indentLevel + 1))
- }
- pp(dir, 0)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplGlobal.scala b/src/compiler/scala/tools/nsc/interpreter/ReplGlobal.scala
deleted file mode 100644
index 0eabd84234..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ReplGlobal.scala
+++ /dev/null
@@ -1,56 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import typechecker.Analyzer
-
-/** A layer on top of Global so I can guarantee some extra
- * functionality for the repl. It doesn't do much yet.
- */
-trait ReplGlobal extends Global {
- // This exists mostly because using the reporter too early leads to deadlock.
- private def echo(msg: String) { Console println msg }
-
- override def abort(msg: String): Nothing = {
- echo("ReplGlobal.abort: " + msg)
- super.abort(msg)
- }
-
- override lazy val analyzer = new {
- val global: ReplGlobal.this.type = ReplGlobal.this
- } with Analyzer {
- override def newTyper(context: Context): Typer = new Typer(context) {
- override def typed(tree: Tree, mode: Mode, pt: Type): Tree = {
- val res = super.typed(tree, mode, pt)
- tree match {
- case Ident(name) if !tree.symbol.hasPackageFlag && !name.toString.startsWith("$") =>
- repldbg("typed %s: %s".format(name, res.tpe))
- case _ =>
- }
- res
- }
- }
- }
-
- object replPhase extends SubComponent {
- val global: ReplGlobal.this.type = ReplGlobal.this
- val phaseName = "repl"
- val runsAfter = List[String]("typer")
- val runsRightAfter = None
- def newPhase(_prev: Phase): StdPhase = new StdPhase(_prev) {
- def apply(unit: CompilationUnit) {
- repldbg("Running replPhase on " + unit.body)
- // newNamer(rootContext(unit)).enterSym(unit.body)
- }
- }
- }
-
- override protected def computePhaseDescriptors: List[SubComponent] = {
- addToPhasesSet(replPhase, "repl")
- super.computePhaseDescriptors
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplProps.scala b/src/compiler/scala/tools/nsc/interpreter/ReplProps.scala
deleted file mode 100644
index 2364918494..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ReplProps.scala
+++ /dev/null
@@ -1,27 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.sys._
-import Prop._
-
-class ReplProps {
- private def bool(name: String) = BooleanProp.keyExists(name)
- private def int(name: String) = IntProp(name)
-
- val info = bool("scala.repl.info")
- val debug = bool("scala.repl.debug")
- val trace = bool("scala.repl.trace")
- val power = bool("scala.repl.power")
-
- val replAutorunCode = Prop[JFile]("scala.repl.autoruncode")
- val powerInitCode = Prop[JFile]("scala.repl.power.initcode")
- val powerBanner = Prop[JFile]("scala.repl.power.banner")
-
- val vids = bool("scala.repl.vids")
- val maxPrintString = int("scala.repl.maxprintstring")
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplReporter.scala b/src/compiler/scala/tools/nsc/interpreter/ReplReporter.scala
deleted file mode 100644
index b20166d070..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ReplReporter.scala
+++ /dev/null
@@ -1,34 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2002-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import reporters._
-import IMain._
-
-/** Like ReplGlobal, a layer for ensuring extra functionality.
- */
-class ReplReporter(intp: IMain) extends ConsoleReporter(intp.settings, Console.in, new ReplStrippingWriter(intp)) {
- def printUntruncatedMessage(msg: String) = withoutTruncating(printMessage(msg))
-
- override def printMessage(msg: String) {
- // Avoiding deadlock if the compiler starts logging before
- // the lazy val is complete.
- if (intp.isInitializeComplete) {
- if (intp.totalSilence) {
- if (isReplTrace)
- super.printMessage("[silent] " + msg)
- }
- else super.printMessage(msg)
- }
- else Console.println("[init] " + msg)
- }
-
- override def displayPrompt() {
- if (intp.totalSilence) ()
- else super.displayPrompt()
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala b/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala
deleted file mode 100644
index 08472bbc64..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ReplStrings.scala
+++ /dev/null
@@ -1,32 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.reflect.internal.Chars
-
-trait ReplStrings {
- /** Convert a string into code that can recreate the string.
- * This requires replacing all special characters by escape
- * codes. It does not add the surrounding " marks. */
- def string2code(str: String): String = {
- val res = new StringBuilder
- for (c <- str) c match {
- case '"' | '\'' | '\\' => res += '\\' ; res += c
- case _ if c.isControl => res ++= Chars.char2uescape(c)
- case _ => res += c
- }
- res.toString
- }
-
- def string2codeQuoted(str: String) =
- "\"" + string2code(str) + "\""
-
- def any2stringOf(x: Any, maxlen: Int) =
- "scala.runtime.ScalaRunTime.replStringOf(%s, %s)".format(x, maxlen)
-
- def words(s: String) = s.trim split "\\s+" filterNot (_ == "") toList
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala b/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala
deleted file mode 100644
index ea100b25f2..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/ReplVals.scala
+++ /dev/null
@@ -1,82 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.language.implicitConversions
-import scala.reflect.api.{Universe => ApiUniverse}
-import scala.reflect.runtime.{universe => ru}
-
-/** A class which the repl utilizes to expose predefined objects.
- * The base implementation is empty; the standard repl implementation
- * is StdReplVals.
- */
-abstract class ReplVals { }
-
-class StdReplVals(final val r: ILoop) extends ReplVals {
- final lazy val repl = r
- final lazy val intp = r.intp
- final lazy val power = r.power
- final lazy val reader = r.in
- final lazy val vals = this
- final lazy val global: intp.global.type = intp.global
- final lazy val isettings = intp.isettings
- final lazy val completion = reader.completion
- final lazy val history = reader.history
- final lazy val phased = power.phased
- final lazy val analyzer = global.analyzer
-
- object treedsl extends { val global: intp.global.type = intp.global } with ast.TreeDSL { }
-
- final lazy val typer = analyzer.newTyper(
- analyzer.rootContext(
- power.unit("").asInstanceOf[analyzer.global.CompilationUnit]
- )
- )
- def lastRequest = intp.lastRequest
-
- class ReplImplicits extends power.Implicits2 {
- import intp.global._
-
- private val tagFn = ReplVals.mkCompilerTypeFromTag[intp.global.type](global)
- implicit def mkCompilerTypeFromTag(sym: Symbol) = tagFn(sym)
- }
-
- final lazy val replImplicits = new ReplImplicits
-
- def typed[T <: analyzer.global.Tree](tree: T): T = typer.typed(tree).asInstanceOf[T]
-}
-
-object ReplVals {
- /** Latest attempt to work around the challenge of foo.global.Type
- * not being seen as the same type as bar.global.Type even though
- * the globals are the same. Dependent method types to the rescue.
- */
- def mkCompilerTypeFromTag[T <: Global](global: T) = {
- import global._
-
- /** We can't use definitions.compilerTypeFromTag directly because we're passing
- * it to map and the compiler refuses to perform eta expansion on a method
- * with a dependent return type. (Can this be relaxed?) To get around this
- * I have this forwarder which widens the type and then cast the result back
- * to the dependent type.
- */
- def compilerTypeFromTag(t: ApiUniverse # WeakTypeTag[_]): Global#Type =
- definitions.compilerTypeFromTag(t)
-
- class AppliedTypeFromTags(sym: Symbol) {
- def apply[M](implicit m1: ru.TypeTag[M]): Type =
- if (sym eq NoSymbol) NoType
- else appliedType(sym, compilerTypeFromTag(m1).asInstanceOf[Type])
-
- def apply[M1, M2](implicit m1: ru.TypeTag[M1], m2: ru.TypeTag[M2]): Type =
- if (sym eq NoSymbol) NoType
- else appliedType(sym, compilerTypeFromTag(m1).asInstanceOf[Type], compilerTypeFromTag(m2).asInstanceOf[Type])
- }
-
- (sym: Symbol) => new AppliedTypeFromTags(sym)
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/Results.scala b/src/compiler/scala/tools/nsc/interpreter/Results.scala
deleted file mode 100644
index e400906a58..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/Results.scala
+++ /dev/null
@@ -1,22 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Martin Odersky
- */
-
-package scala.tools.nsc
-package interpreter
-
-object Results {
- /** A result from the Interpreter interpreting one line of input. */
- abstract sealed class Result
-
- /** The line was interpreted successfully. */
- case object Success extends Result
-
- /** The line was erroneous in some way. */
- case object Error extends Result
-
- /** The input was incomplete. The caller should request more input.
- */
- case object Incomplete extends Result
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/RichClass.scala b/src/compiler/scala/tools/nsc/interpreter/RichClass.scala
deleted file mode 100644
index 36cdf65510..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/RichClass.scala
+++ /dev/null
@@ -1,36 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-
-import scala.reflect.{ ClassTag, classTag }
-
-class RichClass[T](val clazz: Class[T]) {
- def toTag: ClassTag[T] = ClassTag[T](clazz)
-
- // Sadly isAnonymousClass does not return true for scala anonymous
- // classes because our naming scheme is not doing well against the
- // jvm's many assumptions.
- def isScalaAnonymous = (
- try clazz.isAnonymousClass || (clazz.getName contains "$anon$")
- catch { case _: java.lang.InternalError => false } // good ol' "Malformed class name"
- )
-
- def supertags: List[ClassTag[_]] = supers map (_.toTag)
- def superNames: List[String] = supers map (_.getName)
- def interfaces: List[JClass] = supers filter (_.isInterface)
-
- def hasAncestorName(f: String => Boolean) = superNames exists f
- def hasAncestor(f: JClass => Boolean) = supers exists f
-
- def supers: List[JClass] = {
- def loop(x: JClass): List[JClass] = x.getSuperclass match {
- case null => List(x)
- case sc => x :: (x.getInterfaces.toList flatMap loop) ++ loop(sc)
- }
- loop(clazz).distinct
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/SimpleReader.scala b/src/compiler/scala/tools/nsc/interpreter/SimpleReader.scala
deleted file mode 100644
index 2d0917d91f..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/SimpleReader.scala
+++ /dev/null
@@ -1,40 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Stepan Koltsov
- */
-
-package scala.tools.nsc
-package interpreter
-
-import java.io.{ BufferedReader }
-import session.NoHistory
-
-/** Reads using standard JDK API */
-class SimpleReader(
- in: BufferedReader,
- out: JPrintWriter,
- val interactive: Boolean)
-extends InteractiveReader
-{
- val history = NoHistory
- val completion = NoCompletion
-
- def reset() = ()
- def redrawLine() = ()
- def readOneLine(prompt: String): String = {
- if (interactive) {
- out.print(prompt)
- out.flush()
- }
- in.readLine()
- }
- def readOneKey(prompt: String) = sys.error("No char-based input in SimpleReader")
-}
-
-object SimpleReader {
- def defaultIn = Console.in
- def defaultOut = new JPrintWriter(Console.out)
-
- def apply(in: BufferedReader = defaultIn, out: JPrintWriter = defaultOut, interactive: Boolean = true): SimpleReader =
- new SimpleReader(in, out, interactive)
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/package.scala b/src/compiler/scala/tools/nsc/interpreter/package.scala
deleted file mode 100644
index 52a085080b..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/package.scala
+++ /dev/null
@@ -1,157 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-
-import scala.language.implicitConversions
-import scala.reflect.{ classTag, ClassTag }
-import scala.reflect.runtime.{ universe => ru }
-import scala.reflect.{ClassTag, classTag}
-import scala.reflect.api.{Mirror, TypeCreator, Universe => ApiUniverse}
-
-/** The main REPL related classes and values are as follows.
- * In addition to standard compiler classes Global and Settings, there are:
- *
- * History: an interface for session history.
- * Completion: an interface for tab completion.
- * ILoop (formerly InterpreterLoop): The umbrella class for a session.
- * IMain (formerly Interpreter): Handles the evolving state of the session
- * and handles submitting code to the compiler and handling the output.
- * InteractiveReader: how ILoop obtains input.
- * History: an interface for session history.
- * Completion: an interface for tab completion.
- * Power: a repository for more advanced/experimental features.
- *
- * ILoop contains { in: InteractiveReader, intp: IMain, settings: Settings, power: Power }
- * InteractiveReader contains { history: History, completion: Completion }
- * IMain contains { global: Global }
- */
-package object interpreter extends ReplConfig with ReplStrings {
- type JFile = java.io.File
- type JClass = java.lang.Class[_]
- type JList[T] = java.util.List[T]
- type JCollection[T] = java.util.Collection[T]
- type JPrintWriter = java.io.PrintWriter
- type InputStream = java.io.InputStream
- type OutputStream = java.io.OutputStream
-
- val IR = Results
-
- implicit def postfixOps = scala.language.postfixOps // make all postfix ops in this package compile without warning
-
- private[interpreter] implicit def javaCharSeqCollectionToScala(xs: JCollection[_ <: CharSequence]): List[String] = {
- import scala.collection.JavaConverters._
- xs.asScala.toList map ("" + _)
- }
-
- private[nsc] implicit def enrichClass[T](clazz: Class[T]) = new RichClass[T](clazz)
- private[nsc] implicit def enrichAnyRefWithTap[T](x: T) = new TapMaker(x)
- private[nsc] def debugging[T](msg: String)(x: T) = x.tapDebug(msg)
-
- private val ourClassloader = getClass.getClassLoader
-
- def staticTypeTag[T: ClassTag]: ru.TypeTag[T] = ru.TypeTag[T](
- ru.runtimeMirror(ourClassloader),
- new TypeCreator {
- def apply[U <: ApiUniverse with Singleton](m: Mirror[U]): U # Type =
- m.staticClass(classTag[T].runtimeClass.getName).toTypeConstructor.asInstanceOf[U # Type]
- })
-
- /** This class serves to trick the compiler into treating a var
- * (intp, in ILoop) as a stable identifier.
- */
- implicit class IMainOps(val intp: IMain) {
- import intp._
- import global.{ reporter => _, _ }
- import definitions._
-
- protected def echo(msg: String) = {
- Console.out println msg
- Console.out.flush()
- }
-
- def implicitsCommand(line: String): String = {
- def p(x: Any) = intp.reporter.printMessage("" + x)
-
- // If an argument is given, only show a source with that
- // in its name somewhere.
- val args = line split "\\s+"
- val filtered = intp.implicitSymbolsBySource filter {
- case (source, syms) =>
- (args contains "-v") || {
- if (line == "") (source.fullName.toString != "scala.Predef")
- else (args exists (source.name.toString contains _))
- }
- }
-
- if (filtered.isEmpty)
- return "No implicits have been imported other than those in Predef."
-
- filtered foreach {
- case (source, syms) =>
- p("/* " + syms.size + " implicit members imported from " + source.fullName + " */")
-
- // This groups the members by where the symbol is defined
- val byOwner = syms groupBy (_.owner)
- val sortedOwners = byOwner.toList sortBy { case (owner, _) => exitingTyper(source.info.baseClasses indexOf owner) }
-
- sortedOwners foreach {
- case (owner, members) =>
- // Within each owner, we cluster results based on the final result type
- // if there are more than a couple, and sort each cluster based on name.
- // This is really just trying to make the 100 or so implicits imported
- // by default into something readable.
- val memberGroups: List[List[Symbol]] = {
- val groups = members groupBy (_.tpe.finalResultType) toList
- val (big, small) = groups partition (_._2.size > 3)
- val xss = (
- (big sortBy (_._1.toString) map (_._2)) :+
- (small flatMap (_._2))
- )
-
- xss map (xs => xs sortBy (_.name.toString))
- }
-
- val ownerMessage = if (owner == source) " defined in " else " inherited from "
- p(" /* " + members.size + ownerMessage + owner.fullName + " */")
-
- memberGroups foreach { group =>
- group foreach (s => p(" " + intp.symbolDefString(s)))
- p("")
- }
- }
- p("")
- }
- ""
- }
-
- /** TODO -
- * -n normalize
- * -l label with case class parameter names
- * -c complete - leave nothing out
- */
- def typeCommandInternal(expr: String, verbose: Boolean): Unit =
- symbolOfLine(expr) andAlso (echoTypeSignature(_, verbose))
-
- def printAfterTyper(msg: => String) =
- reporter printUntruncatedMessage exitingTyper(msg)
-
- private def replInfo(sym: Symbol) =
- if (sym.isAccessor) dropNullaryMethod(sym.info) else sym.info
-
- def echoTypeStructure(sym: Symbol) =
- printAfterTyper("" + deconstruct.show(replInfo(sym)))
-
- def echoTypeSignature(sym: Symbol, verbose: Boolean) = {
- if (verbose) echo("// Type signature")
- printAfterTyper("" + replInfo(sym))
-
- if (verbose) {
- echo("\n// Internal Type structure")
- echoTypeStructure(sym)
- }
- }
- }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/session/FileBackedHistory.scala b/src/compiler/scala/tools/nsc/interpreter/session/FileBackedHistory.scala
deleted file mode 100644
index dddfb1b8f6..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/session/FileBackedHistory.scala
+++ /dev/null
@@ -1,84 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-package session
-
-import scala.tools.nsc.io._
-import FileBackedHistory._
-
-/** TODO: file locking.
- */
-trait FileBackedHistory extends JLineHistory with JPersistentHistory {
- def maxSize: Int
- protected lazy val historyFile: File = defaultFile
- private var isPersistent = true
-
- locally {
- load()
- }
-
- def withoutSaving[T](op: => T): T = {
- val saved = isPersistent
- isPersistent = false
- try op
- finally isPersistent = saved
- }
- def addLineToFile(item: CharSequence): Unit = {
- if (isPersistent)
- append(item + "\n")
- }
-
- /** Overwrites the history file with the current memory. */
- protected def sync(): Unit = {
- val lines = asStrings map (_ + "\n")
- historyFile.writeAll(lines: _*)
- }
- /** Append one or more lines to the history file. */
- protected def append(lines: String*): Unit = {
- historyFile.appendAll(lines: _*)
- }
-
- def load(): Unit = {
- if (!historyFile.canRead)
- historyFile.createFile()
-
- val lines: IndexedSeq[String] = {
- try historyFile.lines().toIndexedSeq
- catch {
- // It seems that control characters in the history file combined
- // with the default codec can lead to nio spewing exceptions. Rather
- // than abandon hope we'll try to read it as ISO-8859-1
- case _: Exception =>
- try historyFile.lines("ISO-8859-1").toIndexedSeq
- catch { case _: Exception => Vector() }
- }
- }
-
- repldbg("Loading " + lines.size + " into history.")
-
- // avoid writing to the history file
- withoutSaving(lines takeRight maxSize foreach add)
- // truncate the history file if it's too big.
- if (lines.size > maxSize) {
- repldbg("File exceeds maximum size: truncating to " + maxSize + " entries.")
- sync()
- }
- moveToEnd()
- }
-
- def flush(): Unit = ()
- def purge(): Unit = historyFile.truncate()
-}
-
-object FileBackedHistory {
- // val ContinuationChar = '\003'
- // val ContinuationNL: String = Array('\003', '\n').mkString
- import Properties.userHome
-
- def defaultFileName = ".scala_history"
- def defaultFile: File = File(Path(userHome) / defaultFileName)
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/session/History.scala b/src/compiler/scala/tools/nsc/interpreter/session/History.scala
deleted file mode 100644
index 794d41adc7..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/session/History.scala
+++ /dev/null
@@ -1,22 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-package session
-
-/** An implementation-agnostic history interface which makes no
- * reference to the jline classes. Very sparse right now.
- */
-trait History {
- def asStrings: List[String]
- def index: Int
- def size: Int
-}
-object NoHistory extends History {
- def asStrings = Nil
- def index = 0
- def size = 0
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/session/JLineHistory.scala b/src/compiler/scala/tools/nsc/interpreter/session/JLineHistory.scala
deleted file mode 100644
index 18e0ee7c85..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/session/JLineHistory.scala
+++ /dev/null
@@ -1,49 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-package session
-
-/** A straight scalification of the jline interface which mixes
- * in the sparse jline-independent one too.
- */
-trait JLineHistory extends JHistory with History {
- def size: Int
- def isEmpty: Boolean
- def index: Int
- def clear(): Unit
- def get(index: Int): CharSequence
- def add(line: CharSequence): Unit
- def replace(item: CharSequence): Unit
-
- def entries(index: Int): JListIterator[JEntry]
- def entries(): JListIterator[JEntry]
- def iterator: JIterator[JEntry]
-
- def current(): CharSequence
- def previous(): Boolean
- def next(): Boolean
- def moveToFirst(): Boolean
- def moveToLast(): Boolean
- def moveTo(index: Int): Boolean
- def moveToEnd(): Unit
-}
-
-object JLineHistory {
- class JLineFileHistory extends SimpleHistory with FileBackedHistory {
- override def add(item: CharSequence): Unit = {
- if (!isEmpty && last == item)
- repldbg("Ignoring duplicate entry '" + item + "'")
- else {
- super.add(item)
- addLineToFile(item)
- }
- }
- override def toString = "History(size = " + size + ", index = " + index + ")"
- }
-
- def apply(): JLineHistory = try new JLineFileHistory catch { case x: Exception => new SimpleHistory() }
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/session/SimpleHistory.scala b/src/compiler/scala/tools/nsc/interpreter/session/SimpleHistory.scala
deleted file mode 100644
index 89998e438a..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/session/SimpleHistory.scala
+++ /dev/null
@@ -1,58 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-package session
-
-import scala.collection.mutable.{ Buffer, ListBuffer }
-import scala.collection.JavaConverters._
-
-class SimpleHistory extends JLineHistory {
- private var _index: Int = 0
- private val buf: Buffer[String] = new ListBuffer[String]
- private def toEntries(): Seq[JEntry] = buf.zipWithIndex map { case (x, i) => Entry(i, x) }
- private def setTo(num: Int) = { _index = num ; true }
- private def minusOne = { _index -= 1 ; true }
- private def plusOne = { _index += 1 ; true }
- private def lastIndex = size - 1
- private def fail(msg: String): String = {
- repldbg("Internal error in history(size %d, index %d): %s".format(
- size, index, msg)
- )
- ""
- }
-
- case class Entry(index: Int, value: CharSequence) extends JEntry {
- override def toString = value
- }
-
- def maxSize: Int = 2500
- def last = if (isEmpty) fail("last") else buf.last
-
- def size = buf.size
- def index = _index
- def isEmpty = buf.isEmpty
- def clear() = buf.clear()
- def get(idx: Int): CharSequence = buf(idx)
- def add(item: CharSequence): Unit = buf += item
- def replace(item: CharSequence): Unit = {
- buf trimEnd 1
- add(item)
- }
- def entries(idx: Int): JListIterator[JEntry] = toEntries().asJava.listIterator(idx)
- def entries(): JListIterator[JEntry] = toEntries().asJava.listIterator()
- def iterator: JIterator[JEntry] = toEntries().iterator.asJava
-
- def current() = if (index >= 0 && index < buf.size) buf(index) else fail("current()")
- def previous() = (index > 0) && minusOne
- def next() = (index <= lastIndex) && plusOne
- def moveToFirst() = (size > 0) && (index != 0) && setTo(0)
- def moveToLast() = (size > 0) && (index < lastIndex) && setTo(lastIndex)
- def moveTo(idx: Int) = (idx > 0) && (idx <= lastIndex) && setTo(idx)
- def moveToEnd(): Unit = setTo(size)
-
- def asStrings = buf.toList
-}
diff --git a/src/compiler/scala/tools/nsc/interpreter/session/package.scala b/src/compiler/scala/tools/nsc/interpreter/session/package.scala
deleted file mode 100644
index c62cf21151..0000000000
--- a/src/compiler/scala/tools/nsc/interpreter/session/package.scala
+++ /dev/null
@@ -1,23 +0,0 @@
-/* NSC -- new Scala compiler
- * Copyright 2005-2013 LAMP/EPFL
- * @author Paul Phillips
- */
-
-package scala.tools.nsc
-package interpreter
-import scala.language.implicitConversions
-
-/** Files having to do with the state of a repl session:
- * lines of text entered, types and terms defined, etc.
- */
-package object session {
- type JIterator[T] = java.util.Iterator[T]
- type JListIterator[T] = java.util.ListIterator[T]
-
- type JEntry = scala.tools.jline.console.history.History.Entry
- type JHistory = scala.tools.jline.console.history.History
- type JMemoryHistory = scala.tools.jline.console.history.MemoryHistory
- type JPersistentHistory = scala.tools.jline.console.history.PersistentHistory
-
- private[interpreter] implicit def charSequenceFix(x: CharSequence): String = x.toString
-}
diff --git a/src/compiler/scala/tools/nsc/io/Lexer.scala b/src/compiler/scala/tools/nsc/io/Lexer.scala
index b50b01aa27..7c6dbe2e60 100644
--- a/src/compiler/scala/tools/nsc/io/Lexer.scala
+++ b/src/compiler/scala/tools/nsc/io/Lexer.scala
@@ -48,7 +48,7 @@ object Lexer {
/** The '`(`' token */
val LParen = new Delim('(')
- /** The '`(`' token */
+ /** The '`)`' token */
val RParen = new Delim(')')
/** The '`{`' token */
diff --git a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala
index 1d1469f87d..f9b1e57e66 100644
--- a/src/compiler/scala/tools/nsc/javac/JavaScanners.scala
+++ b/src/compiler/scala/tools/nsc/javac/JavaScanners.scala
@@ -10,7 +10,7 @@ import scala.tools.nsc.util.JavaCharArrayReader
import scala.reflect.internal.util._
import scala.reflect.internal.Chars._
import JavaTokens._
-import scala.annotation.switch
+import scala.annotation.{ switch, tailrec }
import scala.language.implicitConversions
// Todo merge these better with Scanners
@@ -235,16 +235,6 @@ trait JavaScanners extends ast.parser.ScannersCommon {
cbuf.setLength(0)
}
- /** 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)
- }
-
private class JavaTokenData0 extends JavaTokenData
/** we need one token lookahead
@@ -587,33 +577,20 @@ trait JavaScanners extends ast.parser.ScannersCommon {
}
}
- private 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 == '*' && forScaladoc)
- 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
+ protected def skipComment(): Boolean = {
+ @tailrec def skipLineComment(): Unit = in.ch match {
+ case CR | LF | SU =>
+ case _ => in.next; skipLineComment()
+ }
+ @tailrec def skipJavaComment(): Unit = in.ch match {
+ case SU => incompleteInputError("unclosed comment")
+ case '*' => in.next; if (in.ch == '/') in.next else skipJavaComment()
+ case _ => in.next; skipJavaComment()
+ }
+ in.ch match {
+ case '/' => in.next ; skipLineComment() ; true
+ case '*' => in.next ; skipJavaComment() ; true
+ case _ => false
}
}
diff --git a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
index 5fa3594128..cc77cbdf52 100644
--- a/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/MutableSettings.scala
@@ -248,11 +248,11 @@ class MutableSettings(val errorFn: String => Unit)
private def checkDir(dir: AbstractFile, name: String, allowJar: Boolean = false): AbstractFile = (
if (dir != null && dir.isDirectory)
dir
-// was: else if (allowJar && dir == null && Path.isJarOrZip(name, false))
else if (allowJar && dir == null && Jar.isJarOrZip(name, examineFile = false))
new PlainFile(Path(name))
else
- throw new FatalError(name + " does not exist or is not a directory")
+// throw new FatalError(name + " does not exist or is not a directory")
+ dir
)
/** Set the single output directory. From now on, all files will
diff --git a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
index 2aee9bd4bc..ee9a3aed2a 100644
--- a/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/ScalaSettings.scala
@@ -38,7 +38,7 @@ trait ScalaSettings extends AbsScalaSettings
protected def futureSettings = List[BooleanSetting]()
/** Enabled under -optimise. */
- protected def optimiseSettings = List[BooleanSetting](inline, inlineHandlers, Xcloselim, Xdce)
+ protected def optimiseSettings = List[BooleanSetting](inline, inlineHandlers, Xcloselim, Xdce, YconstOptimization)
/** Internal use - syntax enhancements. */
private class EnableSettings[T <: BooleanSetting](val s: T) {
@@ -128,6 +128,7 @@ trait ScalaSettings extends AbsScalaSettings
val check = PhasesSetting ("-Ycheck", "Check the tree at the end of")
val Yshow = PhasesSetting ("-Yshow", "(Requires -Xshow-class or -Xshow-object) Show after")
val Xcloselim = BooleanSetting ("-Yclosure-elim", "Perform closure elimination.")
+ val YconstOptimization = BooleanSetting ("-Yconst-opt", "Perform optimization with constant values.")
val Ycompacttrees = BooleanSetting ("-Ycompact-trees", "Use compact tree printer when displaying trees.")
val noCompletion = BooleanSetting ("-Yno-completion", "Disable tab-completion in the REPL.")
val Xdce = BooleanSetting ("-Ydead-code", "Perform dead code elimination.")
@@ -166,7 +167,6 @@ trait ScalaSettings extends AbsScalaSettings
val Yreifycopypaste = BooleanSetting ("-Yreify-copypaste", "Dump the reified trees in copypasteable representation.")
val Yreplsync = BooleanSetting ("-Yrepl-sync", "Do not use asynchronous code for repl startup")
val Yreploutdir = StringSetting ("-Yrepl-outdir", "path", "Write repl-generated classfiles to given output directory (use \"\" to generate a temporary dir)" , "")
- val Ynotnull = BooleanSetting ("-Ynotnull", "Enable (experimental and incomplete) scala.NotNull.")
val YmethodInfer = BooleanSetting ("-Yinfer-argument-types", "Infer types for arguments of overriden methods.")
val etaExpandKeepsStar = BooleanSetting ("-Yeta-expand-keeps-star", "Eta-expand varargs methods to T* rather than Seq[T]. This is a temporary option to ease transition.").
withDeprecationMessage("This flag is scheduled for removal in 2.12. If you have a case where you need this flag then please report a bug.")
@@ -188,7 +188,6 @@ trait ScalaSettings extends AbsScalaSettings
val Ypmatdebug = BooleanSetting("-Ypmat-debug", "Trace all pattern matcher activity.")
val Yposdebug = BooleanSetting("-Ypos-debug", "Trace position validation.")
val Yreifydebug = BooleanSetting("-Yreify-debug", "Trace reification.")
- val Yrepldebug = BooleanSetting("-Yrepl-debug", "Trace all repl activity.") andThen (interpreter.replProps.debug setValue _)
val Ytyperdebug = BooleanSetting("-Ytyper-debug", "Trace all type assignments.")
val Ypatmatdebug = BooleanSetting("-Ypatmat-debug", "Trace pattern matching translation.")
diff --git a/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala b/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala
index 9338d9e5b5..d173aaa848 100644
--- a/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala
+++ b/src/compiler/scala/tools/nsc/settings/StandardScalaSettings.scala
@@ -45,6 +45,7 @@ trait StandardScalaSettings {
val unchecked = BooleanSetting ("-unchecked", "Enable additional warnings where generated code depends on assumptions.")
val uniqid = BooleanSetting ("-uniqid", "Uniquely tag all identifiers in debugging output.")
val usejavacp = BooleanSetting ("-usejavacp", "Utilize the java.class.path in classpath resolution.")
+ val usemanifestcp = BooleanSetting ("-usemanifestcp", "Utilize the manifest in classpath resolution.")
val verbose = BooleanSetting ("-verbose", "Output messages about what the compiler is doing.")
val version = BooleanSetting ("-version", "Print product version and exit.")
}
diff --git a/src/compiler/scala/tools/nsc/settings/Warnings.scala b/src/compiler/scala/tools/nsc/settings/Warnings.scala
index 2649a150ad..791d44153c 100644
--- a/src/compiler/scala/tools/nsc/settings/Warnings.scala
+++ b/src/compiler/scala/tools/nsc/settings/Warnings.scala
@@ -19,7 +19,6 @@ trait Warnings {
// present form, but have the potential to offer useful info.
protected def allWarnings = lintWarnings ++ List(
warnDeadCode,
- warnSelectNullable,
warnValueDiscard,
warnNumericWiden
)
@@ -46,21 +45,20 @@ trait Warnings {
allWarnings foreach (_.value = true)
}
)
+ private lazy val warnSelectNullable = BooleanSetting("-Xcheck-null", "This option is obsolete and does nothing.")
// Individual warnings.
- val warnSelectNullable = BooleanSetting ("-Xcheck-null", "Warn upon selection of nullable reference.")
val warnAdaptedArgs = BooleanSetting ("-Ywarn-adapted-args", "Warn if an argument list is modified to match the receiver.")
val warnDeadCode = BooleanSetting ("-Ywarn-dead-code", "Warn when dead code is identified.")
val warnValueDiscard = BooleanSetting ("-Ywarn-value-discard", "Warn when non-Unit expression results are unused.")
val warnNumericWiden = BooleanSetting ("-Ywarn-numeric-widen", "Warn when numerics are widened.")
val warnNullaryUnit = BooleanSetting ("-Ywarn-nullary-unit", "Warn when nullary methods return Unit.")
val warnInaccessible = BooleanSetting ("-Ywarn-inaccessible", "Warn about inaccessible types in method signatures.")
- val warnNullaryOverride = BooleanSetting ("-Ywarn-nullary-override",
- "Warn when non-nullary overrides nullary, e.g. `def foo()` over `def foo`.")
+ val warnNullaryOverride = BooleanSetting ("-Ywarn-nullary-override", "Warn when non-nullary overrides nullary, e.g. `def foo()` over `def foo`.")
val warnInferAny = BooleanSetting ("-Ywarn-infer-any", "Warn when a type argument is inferred to be `Any`.")
// Backward compatibility.
- @deprecated("Use fatalWarnings", "2.11.0") def Xwarnfatal = fatalWarnings // used by sbt
- @deprecated("Use warnSelectNullable", "2.11.0") def Xchecknull = warnSelectNullable // used by ide
- @deprecated("Use warnDeadCode", "2.11.0") def Ywarndeadcode = warnDeadCode // used by ide
+ @deprecated("Use fatalWarnings", "2.11.0") def Xwarnfatal = fatalWarnings // used by sbt
+ @deprecated("This option is being removed", "2.11.0") def Xchecknull = warnSelectNullable // used by ide
+ @deprecated("Use warnDeadCode", "2.11.0") def Ywarndeadcode = warnDeadCode // used by ide
}
diff --git a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala
index 5b5118a94f..61ac07d18f 100644
--- a/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala
+++ b/src/compiler/scala/tools/nsc/symtab/SymbolLoaders.scala
@@ -30,6 +30,14 @@ abstract class SymbolLoaders {
member
}
+ protected def signalError(root: Symbol, ex: Throwable) {
+ if (settings.debug.value) ex.printStackTrace()
+ globalError(ex.getMessage() match {
+ case null => "i/o error while loading " + root.name
+ case msg => "error while loading " + root.name + ", " + msg
+ })
+ }
+
/** Enter class with given `name` into scope of `root`
* and give them `completer` as type.
*/
@@ -168,18 +176,6 @@ abstract class SymbolLoaders {
}
override def complete(root: Symbol) {
- def signalError(ex: Exception) {
- ok = false
- if (settings.debug.value) ex.printStackTrace()
- val msg = ex.getMessage()
- // 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)
- if (!settings.isScaladoc)
- globalError(
- if (msg eq null) "i/o error while loading " + root.name
- else "error while loading " + root.name + ", " + msg)
- }
try {
val start = currentTime
val currentphase = phase
@@ -189,11 +185,11 @@ abstract class SymbolLoaders {
ok = true
setSource(root)
setSource(root.companionSymbol) // module -> class, class -> module
- } catch {
- case ex: IOException =>
- signalError(ex)
- case ex: MissingRequirementError =>
- signalError(ex)
+ }
+ catch {
+ case ex @ (_: IOException | _: MissingRequirementError) =>
+ ok = false
+ signalError(root, ex)
}
initRoot(root)
if (!root.isPackageClass) initRoot(root.companionSymbol)
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
index 140be0e17b..9b33ae8ba1 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/Pickler.scala
@@ -528,7 +528,7 @@ abstract class Pickler extends SubComponent {
private def writeSymInfo(sym: Symbol) {
writeRef(sym.name)
writeRef(localizedOwner(sym))
- writeLongNat((rawToPickledFlags(sym.flags & PickledFlags)))
+ writeLongNat((rawToPickledFlags(sym.rawflags & PickledFlags)))
if (sym.hasAccessBoundary) writeRef(sym.privateWithin)
writeRef(sym.info)
}
diff --git a/src/compiler/scala/tools/nsc/transform/Constructors.scala b/src/compiler/scala/tools/nsc/transform/Constructors.scala
index a4a6c3ff31..886c790ec0 100644
--- a/src/compiler/scala/tools/nsc/transform/Constructors.scala
+++ b/src/compiler/scala/tools/nsc/transform/Constructors.scala
@@ -34,6 +34,41 @@ abstract class Constructors extends Transform with ast.TreeDSL {
val stats = impl.body // the transformed template body
val localTyper = typer.atOwner(impl, clazz)
+ // Inspect for obvious out-of-order initialization; concrete, eager vals or vars,
+ // declared in this class, for which a reference to the member precedes its definition.
+ def checkableForInit(sym: Symbol) = (
+ (sym ne null)
+ && (sym.isVal || sym.isVar)
+ && !(sym hasFlag LAZY | DEFERRED | SYNTHETIC)
+ )
+ val uninitializedVals = mutable.Set[Symbol](
+ stats collect { case vd: ValDef if checkableForInit(vd.symbol) => vd.symbol.accessedOrSelf }: _*
+ )
+ if (uninitializedVals.nonEmpty)
+ log("Checking constructor for init order issues among: " + uninitializedVals.map(_.name).mkString(", "))
+
+ for (stat <- stats) {
+ // Checking the qualifier symbol is necessary to prevent a selection on
+ // another instance of the same class from potentially appearing to be a forward
+ // reference on the member in the current class.
+ def check(tree: Tree) = {
+ for (t <- tree) t match {
+ case t: RefTree if uninitializedVals(t.symbol.accessedOrSelf) && t.qualifier.symbol == clazz =>
+ unit.warning(t.pos, s"Reference to uninitialized ${t.symbol.accessedOrSelf}")
+ case _ =>
+ }
+ }
+ stat match {
+ case vd: ValDef =>
+ // doing this first allows self-referential vals, which to be a conservative
+ // warner we will do because it's possible though difficult for it to be useful.
+ uninitializedVals -= vd.symbol.accessedOrSelf
+ if (!vd.symbol.isLazy)
+ check(vd.rhs)
+ case _: MemberDef => // skip other member defs
+ case t => check(t) // constructor body statement
+ }
+ }
val specializedFlag: Symbol = clazz.info.decl(nme.SPECIALIZED_INSTANCE)
val shouldGuard = (specializedFlag != NoSymbol) && !clazz.hasFlag(SPECIALIZED)
diff --git a/src/compiler/scala/tools/nsc/transform/Mixin.scala b/src/compiler/scala/tools/nsc/transform/Mixin.scala
index 988e80aa77..f7e3310f88 100644
--- a/src/compiler/scala/tools/nsc/transform/Mixin.scala
+++ b/src/compiler/scala/tools/nsc/transform/Mixin.scala
@@ -1060,7 +1060,7 @@ abstract class Mixin extends InfoTransform with ast.TreeDSL {
else if (needsInitFlag(sym))
mkCheckedAccessor(clazz, accessedRef, fieldOffset(sym), sym.pos, sym)
else
- gen.mkCheckInit(accessedRef)
+ accessedRef
})
}
else if (sym.isModule && !(sym hasFlag LIFTED | BRIDGE)) {
diff --git a/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala b/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
index 580f024b40..0af75a2aad 100644
--- a/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/ContextErrors.scala
@@ -683,7 +683,7 @@ trait ContextErrors {
// same reason as for MacroBodyTypecheckException
case object MacroExpansionException extends Exception with scala.util.control.ControlThrowable
- private def macroExpansionError(expandee: Tree, msg: String, pos: Position = NoPosition) = {
+ protected def macroExpansionError(expandee: Tree, msg: String, pos: Position = NoPosition) = {
def msgForLog = if (msg != null && (msg contains "exception during macro expansion")) msg.split(EOL).drop(1).headOption.getOrElse("?") else msg
macroLogLite("macro expansion has failed: %s".format(msgForLog))
if (msg != null) context.error(pos, msg) // issueTypeError(PosAndMsgTypeError(..)) won't work => swallows positions
@@ -772,15 +772,15 @@ trait ContextErrors {
))
}
- def MacroImplementationNotFoundError(expandee: Tree) = {
- val message =
- "macro implementation not found: " + expandee.symbol.name + " " +
- "(the most common reason for that is that you cannot use macro implementations in the same compilation run that defines them)" +
- (if (forScaladoc) ". When generating scaladocs for multiple projects at once, consider using -Ymacro-no-expand to disable macro expansions altogether."
- else "")
- macroExpansionError(expandee, message)
- }
+ def MacroImplementationNotFoundError(expandee: Tree) =
+ macroExpansionError(expandee, macroImplementationNotFoundMessage(expandee.symbol.name))
}
+
+ /** This file will be the death of me. */
+ protected def macroImplementationNotFoundMessage(name: Name): String = (
+ s"""|macro implementation not found: $name
+ |(the most common reason for that is that you cannot use macro implementations in the same compilation run that defines them)""".stripMargin
+ )
}
trait InferencerContextErrors {
diff --git a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala
index 2331f82a58..5b11adf127 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Implicits.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Implicits.scala
@@ -268,7 +268,7 @@ trait Implicits {
*/
object Function1 {
val Sym = FunctionClass(1)
- def unapply(tp: Type) = tp match {
+ def unapply(tp: Type) = tp baseType Sym match {
case TypeRef(_, Sym, arg1 :: arg2 :: _) => Some((arg1, arg2))
case _ => None
}
@@ -431,10 +431,8 @@ trait Implicits {
val start = if (Statistics.canEnable) Statistics.startTimer(matchesPtNanos) else null
val result = normSubType(tp, pt) || isView && {
pt match {
- case TypeRef(_, Function1.Sym, arg1 :: arg2 :: Nil) =>
- matchesPtView(tp, arg1, arg2, undet)
- case _ =>
- false
+ case Function1(arg1, arg2) => matchesPtView(tp, arg1, arg2, undet)
+ case _ => false
}
}
if (Statistics.canEnable) Statistics.stopTimer(matchesPtNanos, start)
@@ -575,21 +573,21 @@ trait Implicits {
)
def fail(reason: String): SearchResult = failure(itree, reason)
+ def fallback = typed1(itree, EXPRmode, wildPt)
try {
- val itree1 =
- if (isView) {
- val arg1 :: arg2 :: _ = pt.typeArgs
+ val itree1 = if (!isView) fallback else pt match {
+ case Function1(arg1, arg2) =>
typed1(
atPos(itree.pos)(Apply(itree, List(Ident("<argument>") setType approximate(arg1)))),
EXPRmode,
approximate(arg2)
)
- }
- else
- typed1(itree, EXPRmode, wildPt)
-
- if (context.hasErrors)
+ case _ => fallback
+ }
+ if (context.hasErrors) {
+ log("implicit adapt failed: " + context.errBuffer.head.errMsg)
return fail(context.errBuffer.head.errMsg)
+ }
if (Statistics.canEnable) Statistics.incCounter(typedImplicits)
diff --git a/src/compiler/scala/tools/nsc/typechecker/Infer.scala b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
index d4f402b747..9f16f65a6a 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Infer.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Infer.scala
@@ -1694,7 +1694,7 @@ trait Infer extends Checkable {
}
else if (sym.isOverloaded) {
val xs = sym.alternatives
- val tparams = new AsSeenFromMap(pre, xs.head.owner) mapOver xs.head.typeParams
+ val tparams = newAsSeenFromMap(pre, xs.head.owner) mapOver xs.head.typeParams
val bounds = tparams map (_.tpeHK) // see e.g., #1236
val tpe = PolyType(tparams, OverloadedType(AntiPolyType(pre, bounds), xs))
diff --git a/src/compiler/scala/tools/nsc/typechecker/Macros.scala b/src/compiler/scala/tools/nsc/typechecker/Macros.scala
index 1693bdbc8c..91ebd798e1 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Macros.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Macros.scala
@@ -43,8 +43,15 @@ trait Macros extends scala.tools.reflect.FastTrack with Traces {
import definitions._
import treeInfo.{isRepeatedParamType => _, _}
import MacrosStats._
+
def globalSettings = global.settings
+ protected def findMacroClassLoader(): ClassLoader = {
+ val classpath = global.classPath.asURLs
+ macroLogVerbose("macro classloader: initializing from -cp: %s".format(classpath))
+ ScalaClassLoader.fromURLs(classpath, self.getClass.getClassLoader)
+ }
+
/** `MacroImplBinding` and its companion module are responsible for
* serialization/deserialization of macro def -> impl bindings.
*
@@ -474,21 +481,7 @@ trait Macros extends scala.tools.reflect.FastTrack with Traces {
* Loads classes from from -cp (aka the library classpath).
* Is also capable of detecting REPL and reusing its classloader.
*/
- lazy val macroClassloader: ClassLoader = {
- val classpath = global.classPath.asURLs
- macroLogVerbose("macro classloader: initializing from -cp: %s".format(classpath))
- val loader = ScalaClassLoader.fromURLs(classpath, self.getClass.getClassLoader)
-
- // a heuristic to detect the REPL
- if (global.settings.exposeEmptyPackage.value) {
- macroLogVerbose("macro classloader: initializing from a REPL classloader: %s".format(global.classPath.asURLs))
- import scala.tools.nsc.interpreter._
- val virtualDirectory = global.settings.outputDirs.getSingleOutput.get
- new AbstractFileClassLoader(virtualDirectory, loader) {}
- } else {
- loader
- }
- }
+ lazy val macroClassloader: ClassLoader = findMacroClassLoader()
/** Produces a function that can be used to invoke macro implementation for a given macro definition:
* 1) Looks up macro implementation symbol in this universe.
diff --git a/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala b/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala
index 8c686107b4..5999a64b36 100644
--- a/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/MethodSynthesis.scala
@@ -426,7 +426,7 @@ trait MethodSynthesis {
Nil,
Nil,
tpt,
- if (mods.isDeferred) EmptyTree else gen.mkCheckInit(fieldSelection)
+ if (mods.isDeferred) EmptyTree else fieldSelection
) setSymbol derivedSym
}
}
diff --git a/src/compiler/scala/tools/nsc/typechecker/Namers.scala b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
index a1bf3a56c3..d5da4967be 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Namers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Namers.scala
@@ -47,10 +47,11 @@ trait Namers extends MethodSynthesis {
private class NormalNamer(context: Context) extends Namer(context)
def newNamer(context: Context): Namer = new NormalNamer(context)
- def newNamerFor(context: Context, tree: Tree): Namer =
- newNamer(context.makeNewScope(tree, tree.symbol))
+ def newNamerFor(context: Context, tree: Tree): Namer = newNamer(context.makeNewScope(tree, tree.symbol))
abstract class Namer(val context: Context) extends MethodSynth with NamerContextErrors { thisNamer =>
+ // overridden by the presentation compiler
+ def saveDefaultGetter(meth: Symbol, default: Symbol) { }
import NamerErrorGen._
val typer = newTyper(context)
@@ -594,17 +595,6 @@ trait Namers extends MethodSynthesis {
}
}
- def enterIfNotThere(sym: Symbol) {
- val scope = context.scope
- @tailrec def search(e: ScopeEntry) {
- if ((e eq null) || (e.owner ne scope))
- scope enter sym
- else if (e.sym ne sym) // otherwise, aborts since we found sym
- search(e.tail)
- }
- search(scope lookupEntry sym.name)
- }
-
def enterValDef(tree: ValDef) {
if (noEnterGetterSetter(tree))
assignAndEnterFinishedSymbol(tree)
@@ -697,22 +687,9 @@ trait Namers extends MethodSynthesis {
validateCompanionDefs(tree)
}
- // this logic is needed in case typer was interrupted half
- // way through and then comes back to do the tree again. In
- // that case the definitions that were already attributed as
- // well as any default parameters of such methods need to be
- // re-entered in the current scope.
- protected def enterExistingSym(sym: Symbol): Context = {
- if (forInteractive && sym != null && sym.owner.isTerm) {
- enterIfNotThere(sym)
- if (sym.isLazy)
- sym.lazyAccessor andAlso enterIfNotThere
-
- for (defAtt <- sym.attachments.get[DefaultsOfLocalMethodAttachment])
- defAtt.defaultGetters foreach enterIfNotThere
- }
- this.context
- }
+ // Hooks which are overridden in the presentation compiler
+ def enterExistingSym(sym: Symbol): Context = this.context
+ def enterIfNotThere(sym: Symbol) { }
def enterSyntheticSym(tree: Tree): Symbol = {
enterSym(tree)
@@ -828,23 +805,19 @@ trait Namers extends MethodSynthesis {
case _ =>
false
}
-
- val tpe1 = dropIllegalStarTypes(tpe.deconst)
- val tpe2 = tpe1.widen
-
- // This infers Foo.type instead of "object Foo"
- // See Infer#adjustTypeArgs for the polymorphic case.
- if (tpe.typeSymbolDirect.isModuleClass) tpe1
- else if (sym.isVariable || sym.isMethod && !sym.hasAccessorFlag)
- if (tpe2 <:< pt) tpe2 else tpe1
- else if (isHidden(tpe)) tpe2
- // In an attempt to make pattern matches involving method local vals
- // compilable into switches, for a time I had a more generous condition:
- // `if (sym.isFinal || sym.isLocal) tpe else tpe1`
- // This led to issues with expressions like classOf[List[_]] which apparently
- // depend on being deconst-ed here, so this is again the original:
- else if (!sym.isFinal) tpe1
- else tpe
+ val shouldWiden = (
+ !tpe.typeSymbolDirect.isModuleClass // Infer Foo.type instead of "object Foo"
+ && (tpe.widen <:< pt) // Don't widen our way out of conforming to pt
+ && ( sym.isVariable
+ || sym.isMethod && !sym.hasAccessorFlag
+ || isHidden(tpe)
+ )
+ )
+ dropIllegalStarTypes(
+ if (shouldWiden) tpe.widen
+ else if (sym.isFinal) tpe // "final val" allowed to retain constant type
+ else tpe.deconst
+ )
}
/** Computes the type of the body in a ValDef or DefDef, and
* assigns the type to the tpt's node. Returns the type.
@@ -1297,17 +1270,10 @@ trait Namers extends MethodSynthesis {
if (!isConstr)
methOwner.resetFlag(INTERFACE) // there's a concrete member now
val default = parentNamer.enterSyntheticSym(defaultTree)
- if (forInteractive && default.owner.isTerm) {
- // save the default getters as attachments in the method symbol. if compiling the
- // same local block several times (which can happen in interactive mode) we might
- // otherwise not find the default symbol, because the second time it the method
- // symbol will be re-entered in the scope but the default parameter will not.
- meth.attachments.get[DefaultsOfLocalMethodAttachment] match {
- case Some(att) => att.defaultGetters += default
- case None => meth.updateAttachment(new DefaultsOfLocalMethodAttachment(default))
- }
- }
- } else if (baseHasDefault) {
+ if (default.owner.isTerm)
+ saveDefaultGetter(meth, default)
+ }
+ else if (baseHasDefault) {
// the parameter does not have a default itself, but the
// corresponding parameter in the base class does.
sym.setFlag(DEFAULTPARAM)
diff --git a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
index fa141e95e1..ce8e0ed37b 100644
--- a/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/NamesDefaults.scala
@@ -270,22 +270,25 @@ trait NamesDefaults { self: Analyzer =>
*/
def argValDefs(args: List[Tree], paramTypes: List[Type], blockTyper: Typer): List[Option[ValDef]] = {
val context = blockTyper.context
- val symPs = map2(args, paramTypes)((arg, tpe) => arg match {
+ val symPs = map2(args, paramTypes)((arg, paramTpe) => arg match {
case Ident(nme.SELECTOR_DUMMY) =>
None // don't create a local ValDef if the argument is <unapply-selector>
case _ =>
- val byName = isByNameParamType(tpe)
- val repeated = isScalaRepeatedParamType(tpe)
+ val byName = isByNameParamType(paramTpe)
+ val repeated = isScalaRepeatedParamType(paramTpe)
val argTpe = (
if (repeated) arg match {
case Typed(expr, Ident(tpnme.WILDCARD_STAR)) => expr.tpe
case _ => seqType(arg.tpe)
}
- else arg.tpe
- ).widen // have to widen or types inferred from literal defaults will be singletons
+ else
+ // Note stabilizing can lead to a non-conformant argument when existentials are involved, e.g. neg/t3507-old.scala, hence the filter.
+ gen.stableTypeFor(arg).filter(_ <:< paramTpe).getOrElse(arg.tpe)
+ // We have to deconst or types inferred from literal arguments will be Constant(_), e.g. pos/z1730.scala.
+ ).deconst
val s = context.owner.newValue(unit.freshTermName("x$"), arg.pos, newFlags = ARTIFACT) setInfo (
- if (byName) functionType(Nil, argTpe) else argTpe
- )
+ if (byName) functionType(Nil, argTpe) else argTpe
+ )
Some((context.scope.enter(s), byName, repeated))
})
map2(symPs, args) {
@@ -326,11 +329,10 @@ trait NamesDefaults { self: Analyzer =>
// type the application without names; put the arguments in definition-site order
val typedApp = doTypedApply(tree, funOnly, reorderArgs(namelessArgs, argPos), mode, pt)
- if (typedApp.isErrorTyped) tree
- else typedApp match {
+ typedApp match {
// Extract the typed arguments, restore the call-site evaluation order (using
// ValDef's in the block), change the arguments to these local values.
- case Apply(expr, typedArgs) =>
+ case Apply(expr, typedArgs) if !(typedApp :: typedArgs).exists(_.isErrorTyped) => // bail out with erroneous args, see SI-7238
// typedArgs: definition-site order
val formals = formalTypes(expr.tpe.paramTypes, typedArgs.length, removeByName = false, removeRepeated = false)
// valDefs: call-site order
@@ -358,6 +360,7 @@ trait NamesDefaults { self: Analyzer =>
context.namedApplyBlockInfo =
Some((block, NamedApplyInfo(qual, targs, vargss :+ refArgs, blockTyper)))
block
+ case _ => tree
}
}
diff --git a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
index b7221a78ec..b32fc6b977 100644
--- a/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/RefChecks.scala
@@ -1553,6 +1553,8 @@ abstract class RefChecks extends InfoTransform with scala.reflect.internal.trans
val bridges = addVarargBridges(currentOwner)
checkAllOverrides(currentOwner)
checkAnyValSubclass(currentOwner)
+ if (currentOwner.isDerivedValueClass)
+ currentOwner.primaryConstructor makeNotPrivate NoSymbol // SI-6601, must be done *after* pickler!
if (bridges.nonEmpty) deriveTemplate(tree)(_ ::: bridges) else tree
case dc@TypeTreeWithDeferredRefCheck() => abort("adapt should have turned dc: TypeTreeWithDeferredRefCheck into tpt: TypeTree, with tpt.original == dc")
diff --git a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
index 1d28add6e0..e8925ce2d0 100644
--- a/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/SuperAccessors.scala
@@ -186,18 +186,6 @@ abstract class SuperAccessors extends transform.Transform with transform.TypingT
log("Expanded '%s' to '%s' in %s".format(savedName, s.name, sym))
}
}
- if (settings.verbose.value && forScaladoc && !sym.isAnonymousClass) {
- println("========== scaladoc of "+sym+" =============================")
- println(toJavaDoc(expandedDocComment(sym)))
- for (member <- sym.info.members) {
- println(member+":"+sym.thisType.memberInfo(member)+"\n"+
- toJavaDoc(expandedDocComment(member, sym)))
- for ((useCase, comment, pos) <- useCases(member, sym)) {
- println("usecase "+useCase+":"+useCase.info)
- println(toJavaDoc(comment))
- }
- }
- }
super.transform(tree)
}
transformClassDef
diff --git a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala b/src/compiler/scala/tools/nsc/typechecker/TypeStrings.scala
index 3ecd3b9ae4..65a3fedbd2 100644
--- a/src/compiler/scala/tools/nsc/interpreter/TypeStrings.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/TypeStrings.scala
@@ -4,7 +4,7 @@
*/
package scala.tools.nsc
-package interpreter
+package typechecker
import java.lang.{ reflect => r }
import r.TypeVariable
@@ -12,7 +12,6 @@ import scala.reflect.NameTransformer
import NameTransformer._
import scala.reflect.runtime.{universe => ru}
import scala.reflect.{ClassTag, classTag}
-import typechecker.DestructureTypes
/** A more principled system for turning types into strings.
*/
@@ -53,8 +52,7 @@ trait StructuredTypeStrings extends DestructureTypes {
private def shortClass(x: Any) = {
if (settings.debug.value) {
val name = (x.getClass.getName split '.').last
- val isAnon = name.reverse takeWhile (_ != '$') forall (_.isDigit)
- val str = if (isAnon) name else (name split '$').last
+ val str = if (TypeStrings.isAnonClass(x.getClass)) name else (name split '$').last
" // " + str
}
@@ -152,11 +150,11 @@ trait StructuredTypeStrings extends DestructureTypes {
* "definition" is when you want strings like
*/
trait TypeStrings {
+ private type JClass = java.lang.Class[_]
private val ObjectClass = classOf[java.lang.Object]
private val primitives = Set[String]("byte", "char", "short", "int", "long", "float", "double", "boolean", "void")
private val primitiveMap = primitives.toList map { x =>
val key = x match {
- case "void" => "Void"
case "int" => "Integer"
case "char" => "Character"
case s => s.capitalize
@@ -169,6 +167,11 @@ trait TypeStrings {
("java.lang." + key) -> ("scala." + value)
} toMap
+ def isAnonClass(cl: Class[_]) = {
+ val xs = cl.getName.reverse takeWhile (_ != '$')
+ xs.nonEmpty && xs.forall(_.isDigit)
+ }
+
def scalaName(s: String): String = {
if (s endsWith MODULE_SUFFIX_STRING) s.init + ".type"
else if (s == "void") "scala.Unit"
@@ -178,17 +181,16 @@ trait TypeStrings {
// Trying to put humpty dumpty back together again.
def scalaName(clazz: JClass): String = {
val name = clazz.getName
- val isAnon = clazz.isScalaAnonymous
val enclClass = clazz.getEnclosingClass
def enclPre = enclClass.getName + MODULE_SUFFIX_STRING
def enclMatch = name startsWith enclPre
scalaName(
- if (enclClass == null || isAnon || !enclMatch) name
+ if (enclClass == null || isAnonClass(clazz) || !enclMatch) name
else enclClass.getName + "." + (name stripPrefix enclPre)
)
}
- def anyClass(x: Any): JClass = if (x == null) null else x.getClass
+ def anyClass(x: Any): JClass = if (x == null) null else x.getClass
private def brackets(tps: String*): String =
if (tps.isEmpty) ""
diff --git a/src/compiler/scala/tools/nsc/typechecker/Typers.scala b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
index 959c5a0eb8..765916bcdd 100644
--- a/src/compiler/scala/tools/nsc/typechecker/Typers.scala
+++ b/src/compiler/scala/tools/nsc/typechecker/Typers.scala
@@ -86,8 +86,6 @@ trait Typers extends Adaptations with Tags {
// that are turned private by typedBlock
private final val SYNTHETIC_PRIVATE = TRANS_FLAG
- private def isPastTyper = phase.id > currentRun.typerPhase.id
-
// To enable decent error messages when the typer crashes.
// TODO - this only catches trees which go through def typed,
// but there are all kinds of back ways - typedClassDef, etc. etc.
@@ -98,13 +96,18 @@ trait Typers extends Adaptations with Tags {
// - we may virtualize matches (if -Xexperimental and there's a suitable __match in scope)
// - we synthesize PartialFunction implementations for `x => x match {...}` and `match {...}` when the expected type is PartialFunction
// this is disabled by: interactive compilation (we run it for scaladoc due to SI-5933)
- private def newPatternMatching = !forInteractive //&& !forScaladoc && (phase.id < currentRun.uncurryPhase.id)
+ protected def newPatternMatching = true // presently overridden in the presentation compiler
abstract class Typer(context0: Context) extends TyperDiagnostics with Adaptation with Tag with TyperContextErrors {
import context0.unit
import typeDebug.{ ptTree, ptBlock, ptLine }
import TyperErrorGen._
+ /** Overridden to false in scaladoc and/or interactive. */
+ def canAdaptConstantTypeToLiteral = true
+ def canTranslateEmptyListToNil = true
+ def missingSelectErrorTree(tree: Tree, qual: Tree, name: Name): Tree = tree
+
def typedDocDef(docDef: DocDef, mode: Mode, pt: Type): Tree =
typed(docDef.definition, mode, pt)
@@ -1038,7 +1041,7 @@ trait Typers extends Adaptations with Tags {
tree.tpe match {
case atp @ AnnotatedType(_, _, _) if canAdaptAnnotations(tree, this, mode, pt) => // (-1)
adaptAnnotations(tree, this, mode, pt)
- case ct @ ConstantType(value) if mode.inNone(TYPEmode | FUNmode) && (ct <:< pt) && !forScaladoc && !forInteractive => // (0)
+ case ct @ ConstantType(value) if mode.inNone(TYPEmode | FUNmode) && (ct <:< pt) && canAdaptConstantTypeToLiteral => // (0)
val sym = tree.symbol
if (sym != null && sym.isDeprecated) {
val msg = sym.toString + sym.locationString + " is deprecated: " + sym.deprecationMessage.getOrElse("")
@@ -1121,16 +1124,19 @@ trait Typers extends Adaptations with Tags {
else {
if (mode.inExprModeButNot(FUNmode)) {
pt.dealias match {
- case TypeRef(_, sym, _) =>
+ // The <: Any requirement inhibits attempts to adapt continuation types
+ // to non-continuation types.
+ case TypeRef(_, sym, _) if tree.tpe <:< AnyClass.tpe =>
// note: was if (pt.typeSymbol == UnitClass) but this leads to a potentially
// infinite expansion if pt is constant type ()
- if (sym == UnitClass && tree.tpe <:< AnyClass.tpe) { // (12)
+ if (sym == UnitClass) { // (12)
if (settings.warnValueDiscard.value)
context.unit.warning(tree.pos, "discarded non-Unit value")
return typedPos(tree.pos, mode, pt) {
Block(List(tree), Literal(Constant()))
}
- } else if (isNumericValueClass(sym) && isNumericSubType(tree.tpe, pt)) {
+ }
+ else if (isNumericValueClass(sym) && isNumericSubType(tree.tpe, pt)) {
if (settings.warnNumericWiden.value)
context.unit.warning(tree.pos, "implicit numeric widening")
return typedPos(tree.pos, mode, pt) {
@@ -1532,7 +1538,7 @@ trait Typers extends Adaptations with Tags {
atPos(supertpt.pos.focus)(supercall)
} match {
case EmptyTree => MissingTypeArgumentsParentTpeError(supertpt)
- case tpt => supertpt = TypeTree(tpt.tpe) setPos supertpt.pos.focus
+ case tpt => supertpt = TypeTree(tpt.tpe) setPos supertpt.pos // SI-7224: don't .focus positions of the TypeTree of a parent that exists in source
}
}
// this is the place where we tell the typer what argss should be used for the super call
@@ -2433,11 +2439,9 @@ trait Typers extends Adaptations with Tags {
if (pat1.tpe.paramSectionCount > 0)
pat1 setType pat1.tpe.finalResultType
- if (forInteractive) {
- for (bind @ Bind(name, _) <- cdef.pat)
- if (name.toTermName != nme.WILDCARD && bind.symbol != null && bind.symbol != NoSymbol)
- namer.enterIfNotThere(bind.symbol)
- }
+ for (bind @ Bind(name, _) <- cdef.pat)
+ if (name.toTermName != nme.WILDCARD && bind.symbol != null && bind.symbol != NoSymbol)
+ namer.enterIfNotThere(bind.symbol)
val guard1: Tree = if (cdef.guard == EmptyTree) EmptyTree
else typed(cdef.guard, BooleanClass.tpe)
@@ -3262,7 +3266,7 @@ trait Typers extends Adaptations with Tags {
* forced during kind-arity checking, so it is guarded by additional
* tests to ensure we're sufficiently far along.
*/
- if (args.isEmpty && !forInteractive && fun.symbol.isInitialized && ListModule.hasCompleteInfo && (fun.symbol == List_apply))
+ if (args.isEmpty && canTranslateEmptyListToNil && fun.symbol.isInitialized && ListModule.hasCompleteInfo && (fun.symbol == List_apply))
atPos(tree.pos)(gen.mkNil setType restpe)
else
constfold(treeCopy.Apply(tree, fun, args1) setType ifPatternSkipFormals(restpe))
@@ -4183,11 +4187,11 @@ trait Typers extends Adaptations with Tags {
def typedArrayValue(tree: ArrayValue) = {
val elemtpt1 = typedType(tree.elemtpt, mode)
- val elems1 = tree.elems mapConserve (elem => typed(elem, mode, elemtpt1.tpe))
- treeCopy.ArrayValue(tree, elemtpt1, elems1)
- .setType(
- (if (isFullyDefined(pt) && !phase.erasedTypes) pt
- else arrayType(elemtpt1.tpe)).notNull)
+ val elems1 = tree.elems mapConserve (elem => typed(elem, mode, elemtpt1.tpe))
+ // see run/t6126 for an example where `pt` does not suffice (tagged types)
+ val tpe1 = if (isFullyDefined(pt) && !phase.erasedTypes) pt else arrayType(elemtpt1.tpe)
+
+ treeCopy.ArrayValue(tree, elemtpt1, elems1) setType tpe1
}
def typedAssign(lhs: Tree, rhs: Tree): Tree = {
@@ -4490,35 +4494,31 @@ trait Typers extends Adaptations with Tags {
reportError
}
}
- silent(_.typed(fun, mode.forFunMode, funpt),
- if (mode.inExprMode) false else context.ambiguousErrors,
- if (mode.inExprMode) tree else context.tree) match {
+ val silentResult = silent(
+ op = _.typed(fun, mode.forFunMode, funpt),
+ reportAmbiguousErrors = !mode.inExprMode && context.ambiguousErrors,
+ newtree = if (mode.inExprMode) tree else context.tree
+ )
+ silentResult match {
case SilentResultValue(fun1) =>
val fun2 = if (stableApplication) stabilizeFun(fun1, mode, pt) else fun1
if (Statistics.canEnable) Statistics.incCounter(typedApplyCount)
- def isImplicitMethod(tpe: Type) = tpe match {
- case mt: MethodType => mt.isImplicit
- case _ => false
- }
- val useTry = (
- !isPastTyper
- && fun2.isInstanceOf[Select]
- && !isImplicitMethod(fun2.tpe)
- && ((fun2.symbol eq null) || !fun2.symbol.isConstructor)
- && (mode & (EXPRmode | SNDTRYmode)) == EXPRmode
+ val noSecondTry = (
+ isPastTyper
+ || (fun2.symbol ne null) && fun2.symbol.isConstructor
+ || (fun2.tpe match { case mt: MethodType => mt.isImplicit case _ => false })
)
- val res =
- if (useTry) tryTypedApply(fun2, args)
- else doTypedApply(tree, fun2, args, mode, pt)
-
- if (fun2.symbol == Array_apply && !res.isErrorTyped) {
- val checked = gen.mkCheckInit(res)
- // this check is needed to avoid infinite recursion in Duplicators
- // (calling typed1 more than once for the same tree)
- if (checked ne res) typed { atPos(tree.pos)(checked) }
- else res
- } else
- res
+ val isFirstTry = !noSecondTry && (
+ fun2 match {
+ case Select(_, _) => mode inExprModeButNot SNDTRYmode
+ case _ => false
+ }
+ )
+ if (isFirstTry)
+ tryTypedApply(fun2, args)
+ else
+ doTypedApply(tree, fun2, args, mode, pt)
+
case SilentTypeError(err) =>
onError({issue(err); setError(tree)})
}
@@ -4688,11 +4688,7 @@ trait Typers extends Adaptations with Tags {
if (!reallyExists(sym)) {
def handleMissing: Tree = {
- def errorTree = tree match {
- case _ if !forInteractive => tree
- case Select(_, _) => treeCopy.Select(tree, qual, name)
- case SelectFromTypeTree(_, _) => treeCopy.SelectFromTypeTree(tree, qual, name)
- }
+ def errorTree = missingSelectErrorTree(tree, qual, name)
def asTypeSelection = (
if (context.owner.enclosingTopLevelClass.isJavaDefined && name.isTypeName) {
atPos(tree.pos)(gen.convertToSelectFromType(qual, name)) match {
@@ -4738,16 +4734,6 @@ trait Typers extends Adaptations with Tags {
(stabilize(treeAndPre._1, treeAndPre._2, mode, pt), None)
}
- def isPotentialNullDeference() = {
- !isPastTyper &&
- !sym.isConstructor &&
- !(qual.tpe <:< NotNullClass.tpe) && !qual.tpe.isNotNull &&
- !(List(Any_isInstanceOf, Any_asInstanceOf) contains result.symbol) // null.is/as is not a dereference
- }
- // unit is null here sometimes; how are we to know when unit might be null? (See bug #2467.)
- if (settings.warnSelectNullable.value && isPotentialNullDeference && unit != null)
- unit.warning(tree.pos, "potential null pointer dereference: "+tree)
-
result match {
// could checkAccessible (called by makeAccessible) potentially have skipped checking a type application in qual?
case SelectFromTypeTree(qual@TypeTree(), name) if qual.tpe.typeArgs.nonEmpty => // TODO: somehow the new qual is not checked in refchecks
@@ -5255,7 +5241,6 @@ trait Typers extends Adaptations with Tags {
case tree: ApplyDynamic => typedApplyDynamic(tree)
case tree: ReferenceToBoxed => typedReferenceToBoxed(tree)
case tree: TypeTreeWithDeferredRefCheck => tree // TODO: retype the wrapped tree? TTWDRC would have to change to hold the wrapped tree (not a closure)
- case tree: Import => assert(forInteractive, "!forInteractive") ; tree setType tree.symbol.tpe // should not happen in normal circumstances.
case _ => abort(s"unexpected tree: ${tree.getClass}\n$tree")
}
}
diff --git a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala b/src/compiler/scala/tools/nsc/util/AbstractFileClassLoader.scala
index e909cd945d..e4f879560c 100644
--- a/src/compiler/scala/tools/nsc/interpreter/AbstractFileClassLoader.scala
+++ b/src/compiler/scala/tools/nsc/util/AbstractFileClassLoader.scala
@@ -3,9 +3,11 @@
*/
package scala.tools.nsc
-package interpreter
+package util
import scala.tools.nsc.io.AbstractFile
+import java.security.cert.Certificate
+import java.security.{ ProtectionDomain, CodeSource }
import util.ScalaClassLoader
import java.net.{ URL, URLConnection, URLStreamHandler }
import scala.collection.{ mutable, immutable }
@@ -78,12 +80,22 @@ class AbstractFileClassLoader(val root: AbstractFile, parent: ClassLoader)
case null => super.classBytes(name)
case file => file.toByteArray
}
- override def findClass(name: String): JClass = {
+ override def findClass(name: String): Class[_] = {
val bytes = classBytes(name)
if (bytes.length == 0)
throw new ClassNotFoundException(name)
else
- defineClass(name, bytes, 0, bytes.length)
+ defineClass(name, bytes, 0, bytes.length, protectionDomain)
+ }
+
+ lazy val protectionDomain = {
+ val cl = Thread.currentThread().getContextClassLoader()
+ val resource = cl.getResource("scala/runtime/package.class")
+ if (resource == null) null else {
+ val s = resource.getPath
+ val path = s.substring(0, s.lastIndexOf('!'))
+ new ProtectionDomain(new CodeSource(new URL(path), null.asInstanceOf[Array[Certificate]]), null, this, null)
+ }
}
private val packages = mutable.Map[String, Package]()
diff --git a/src/compiler/scala/tools/nsc/util/ClassPath.scala b/src/compiler/scala/tools/nsc/util/ClassPath.scala
index 0104f5a57f..5f13baa107 100644
--- a/src/compiler/scala/tools/nsc/util/ClassPath.scala
+++ b/src/compiler/scala/tools/nsc/util/ClassPath.scala
@@ -13,6 +13,7 @@ import io.{ File, Directory, Path, Jar, AbstractFile }
import scala.reflect.internal.util.StringOps.splitWhere
import Jar.isJarOrZip
import File.pathSeparator
+import scala.collection.convert.WrapAsScala.enumerationAsScalaIterator
import java.net.MalformedURLException
import java.util.regex.PatternSyntaxException
@@ -121,8 +122,13 @@ object ClassPath {
private def classesInPathImpl(path: String, expand: Boolean) =
for (file <- expandPath(path, expand) ; dir <- Option(AbstractFile getDirectory file)) yield
newClassPath(dir)
+
+ def classesInManifest(used: Boolean) =
+ if (used) for (url <- manifests) yield newClassPath(AbstractFile getResources url) else Nil
}
+ def manifests = Thread.currentThread().getContextClassLoader().getResources("META-INF/MANIFEST.MF").filter(_.getProtocol() == "jar").toList
+
class JavaContext extends ClassPathContext[AbstractFile] {
def toBinaryName(rep: AbstractFile) = {
val name = rep.name
@@ -267,7 +273,7 @@ class SourcePath[T](dir: AbstractFile, val context: ClassPathContext[T]) extends
class DirectoryClassPath(val dir: AbstractFile, val context: ClassPathContext[AbstractFile]) extends ClassPath[AbstractFile] {
def name = dir.name
override def origin = dir.underlyingSource map (_.path)
- def asURLs = if (dir.file == null) Nil else List(dir.toURL)
+ def asURLs = if (dir.file == null) List(new URL(name)) else List(dir.toURL)
def asClasspathString = dir.path
val sourcepaths: IndexedSeq[AbstractFile] = IndexedSeq()
diff --git a/src/compiler/scala/tools/nsc/util/ShowPickled.scala b/src/compiler/scala/tools/nsc/util/ShowPickled.scala
index 4bc393bd0b..f91e94471a 100644
--- a/src/compiler/scala/tools/nsc/util/ShowPickled.scala
+++ b/src/compiler/scala/tools/nsc/util/ShowPickled.scala
@@ -13,7 +13,6 @@ import java.lang.Float.intBitsToFloat
import java.lang.Double.longBitsToDouble
import scala.reflect.internal.{Flags, Names}
import scala.reflect.internal.pickling.{ PickleBuffer, PickleFormat }
-import interpreter.ByteCode.scalaSigBytesForPath
object ShowPickled extends Names {
import PickleFormat._
@@ -272,7 +271,6 @@ object ShowPickled extends Names {
}
def fromFile(path: String) = fromBytes(io.File(path).toByteArray())
- def fromName(name: String) = fromBytes(scalaSigBytesForPath(name) getOrElse Array())
def fromBytes(data: => Array[Byte]): Option[PickleBuffer] =
try Some(new PickleBuffer(data, 0, data.length))
catch { case _: Exception => None }
@@ -287,7 +285,7 @@ object ShowPickled extends Names {
def main(args: Array[String]) {
args foreach { arg =>
- (fromFile(arg) orElse fromName(arg)) match {
+ fromFile(arg) match {
case Some(pb) => show(arg + ":", pb)
case _ => Console.println("Cannot read " + arg)
}
diff --git a/src/compiler/scala/tools/reflect/StdTags.scala b/src/compiler/scala/tools/reflect/StdTags.scala
index 5c62819f04..6c1821f8aa 100644
--- a/src/compiler/scala/tools/reflect/StdTags.scala
+++ b/src/compiler/scala/tools/reflect/StdTags.scala
@@ -23,7 +23,7 @@ trait StdTags {
}
})
- private def tagOfStaticClass[T: ClassTag]: u.TypeTag[T] =
+ protected def tagOfStaticClass[T: ClassTag]: u.TypeTag[T] =
u.TypeTag[T](
m,
new TypeCreator {
@@ -34,8 +34,6 @@ trait StdTags {
lazy val tagOfString = tagOfStaticClass[String]
lazy val tagOfFile = tagOfStaticClass[scala.tools.nsc.io.File]
lazy val tagOfDirectory = tagOfStaticClass[scala.tools.nsc.io.Directory]
- lazy val tagOfStdReplVals = tagOfStaticClass[scala.tools.nsc.interpreter.StdReplVals]
- lazy val tagOfIMain = tagOfStaticClass[scala.tools.nsc.interpreter.IMain]
lazy val tagOfThrowable = tagOfStaticClass[java.lang.Throwable]
lazy val tagOfClassLoader = tagOfStaticClass[java.lang.ClassLoader]
lazy val tagOfBigInt = tagOfStaticClass[BigInt]
diff --git a/src/compiler/scala/tools/reflect/ToolBoxFactory.scala b/src/compiler/scala/tools/reflect/ToolBoxFactory.scala
index df9d907377..e6bbe1dbed 100644
--- a/src/compiler/scala/tools/reflect/ToolBoxFactory.scala
+++ b/src/compiler/scala/tools/reflect/ToolBoxFactory.scala
@@ -5,7 +5,7 @@ import scala.tools.nsc.EXPRmode
import scala.tools.nsc.reporters._
import scala.tools.nsc.CompilerCommand
import scala.tools.nsc.io.VirtualDirectory
-import scala.tools.nsc.interpreter.AbstractFileClassLoader
+import scala.tools.nsc.util.AbstractFileClassLoader
import scala.reflect.internal.Flags._
import scala.reflect.internal.util.{BatchSourceFile, NoSourceFile, NoFile}
import java.lang.{Class => jClass}
@@ -283,7 +283,7 @@ abstract class ToolBoxFactory[U <: JavaUniverse](val u: U) { factorySelf =>
val file = new BatchSourceFile("<toolbox>", wrappedCode)
val unit = new CompilationUnit(file)
phase = run.parserPhase
- val parser = new syntaxAnalyzer.UnitParser(unit)
+ val parser = newUnitParser(unit)
val wrappedTree = parser.parse()
throwIfErrors()
val PackageDef(_, List(ModuleDef(_, _, Template(_, _, _ :: parsed)))) = wrappedTree
diff --git a/src/compiler/scala/tools/util/Javap.scala b/src/compiler/scala/tools/util/Javap.scala
index 7e984fd1f7..3cfc1eb2a1 100644
--- a/src/compiler/scala/tools/util/Javap.scala
+++ b/src/compiler/scala/tools/util/Javap.scala
@@ -6,27 +6,14 @@
package scala.tools
package util
-import java.lang.{ ClassLoader => JavaClassLoader, Iterable => JIterable }
import scala.tools.nsc.util.ScalaClassLoader
-import scala.tools.nsc.interpreter.IMain
-import java.io.{ ByteArrayInputStream, CharArrayWriter, FileNotFoundException, InputStream,
- PrintWriter, Writer }
-import java.util.{ Locale }
-import java.util.regex.Pattern
-import javax.tools.{ Diagnostic, DiagnosticCollector, DiagnosticListener,
- ForwardingJavaFileManager, JavaFileManager, JavaFileObject,
- SimpleJavaFileObject, StandardLocation }
-import scala.reflect.io.{ AbstractFile, Directory, File, Path }
-import java.io.{File => JFile}
-import scala.io.Source
-import scala.util.{ Try, Success, Failure }
-import scala.util.Properties.lineSeparator
-import scala.collection.JavaConverters
-import scala.collection.generic.Clearable
-import java.net.URL
-import scala.language.reflectiveCalls
+import java.io.PrintWriter
-import Javap._
+trait JpResult {
+ def isError: Boolean
+ def value: Any
+ def show(): Unit
+}
trait Javap {
def loader: ScalaClassLoader
@@ -43,672 +30,3 @@ object NoJavap extends Javap {
def tryFile(path: String): Option[Array[Byte]] = None
def tryClass(path: String): Array[Byte] = Array()
}
-
-class JavapClass(
- val loader: ScalaClassLoader,
- val printWriter: PrintWriter,
- intp: Option[IMain] = None
-) extends Javap {
- import JavapTool.ToolArgs
- import JavapClass._
-
- lazy val tool = JavapTool()
-
- /** Run the tool. Option args start with "-".
- * The default options are "-protected -verbose".
- * Byte data for filename args is retrieved with findBytes.
- */
- def apply(args: Seq[String]): List[JpResult] = {
- val (options, claases) = args partition (s => (s startsWith "-") && s.length > 1)
- val (flags, upgraded) = upgrade(options)
- import flags.{ app, fun, help, raw }
- val targets = if (fun && !help) FunFinder(loader, intp).funs(claases) else claases
- if (help || claases.isEmpty) List(JpResult(JavapTool.helper(printWriter)))
- else if (targets.isEmpty) List(JpResult("No anonfuns found."))
- else tool(raw, upgraded)(targets map (claas => claas -> bytesFor(claas, app)))
- }
-
- /** Cull our tool options. */
- private def upgrade(options: Seq[String]): (ToolArgs, Seq[String]) = ToolArgs fromArgs options match {
- case (t,s) if s.nonEmpty => (t,s)
- case (t,s) => (t, JavapTool.DefaultOptions)
- }
-
- /** Find bytes. Handle "-", "-app", "Foo#bar" (by ignoring member), "#bar" (by taking "bar"). */
- private def bytesFor(path: String, app: Boolean) = Try {
- def last = intp.get.mostRecentVar // fail if no intp
- def req = if (path == "-") last else {
- val s = path.splitHashMember
- if (s._1.nonEmpty) s._1
- else s._2 getOrElse "#"
- }
- def asAppBody(s: String) = {
- val (cls, fix) = s.splitSuffix
- s"${cls}$$delayedInit$$body${fix}"
- }
- def todo = if (app) asAppBody(req) else req
- val bytes = findBytes(todo)
- if (bytes.isEmpty) throw new FileNotFoundException(s"Could not find class bytes for '${path}'")
- else bytes
- }
-
- def findBytes(path: String): Array[Byte] = tryFile(path) getOrElse tryClass(path)
-
- /** Assume the string is a path and try to find the classfile
- * it represents.
- */
- def tryFile(path: String): Option[Array[Byte]] =
- (Try (File(path.asClassResource)) filter (_.exists) map (_.toByteArray())).toOption
-
- /** Assume the string is a fully qualified class name and try to
- * find the class object it represents.
- * There are other symbols of interest, too:
- * - a definition that is wrapped in an enclosing class
- * - a synthetic that is not in scope but its associated class is
- */
- def tryClass(path: String): Array[Byte] = {
- def load(name: String) = loader classBytes name
- def loadable(name: String) = loader resourceable name
- // if path has an interior dollar, take it as a synthetic
- // if the prefix up to the dollar is a symbol in scope,
- // result is the translated prefix + suffix
- def desynthesize(s: String) = {
- val i = s indexOf '$'
- if (0 until s.length - 1 contains i) {
- val name = s substring (0, i)
- val sufx = s substring i
- val tran = intp flatMap (_ translatePath name)
- def loadableOrNone(strip: Boolean) = {
- def suffix(strip: Boolean)(x: String) =
- (if (strip && (x endsWith "$")) x.init else x) + sufx
- val res = tran map (suffix(strip) _)
- if (res.isDefined && loadable(res.get)) res else None
- }
- // try loading translated+suffix
- val res = loadableOrNone(strip = false)
- // some synthetics lack a dollar, (e.g., suffix = delayedInit$body)
- // so as a hack, if prefix$$suffix fails, also try prefix$suffix
- if (res.isDefined) res else loadableOrNone(strip = true)
- } else None
- }
- val p = path.asClassName // scrub any suffix
- // if repl, translate the name to something replish
- // (for translate, would be nicer to get the sym and ask .isClass,
- // instead of translatePath and then asking did I get a class back)
- val q = if (intp.isEmpty) p else (
- // only simple names get the scope treatment
- Some(p) filter (_ contains '.')
- // take path as a Name in scope
- orElse (intp flatMap (_ translatePath p) filter loadable)
- // take path as a Name in scope and find its enclosing class
- orElse (intp flatMap (_ translateEnclosingClass p) filter loadable)
- // take path as a synthetic derived from some Name in scope
- orElse desynthesize(p)
- // just try it plain
- getOrElse p
- )
- load(q)
- }
-
- /** Base class for javap tool adapters for java 6 and 7. */
- abstract class JavapTool {
- type ByteAry = Array[Byte]
- type Input = Pair[String, Try[ByteAry]]
-
- /** Run the tool. */
- def apply(raw: Boolean, options: Seq[String])(inputs: Seq[Input]): List[JpResult]
-
- // Since the tool is loaded by reflection, check for catastrophic failure.
- protected def failed: Boolean
- implicit protected class Failer[A](a: =>A) {
- def orFailed[B >: A](b: =>B) = if (failed) b else a
- }
- protected def noToolError = new JpError(s"No javap tool available: ${getClass.getName} failed to initialize.")
-
- // output filtering support
- val writer = new CharArrayWriter
- def written = {
- writer.flush()
- val w = writer.toString
- writer.reset()
- w
- }
-
- /** Create a Showable with output massage.
- * @param raw show ugly repl names
- * @param target attempt to filter output to show region of interest
- * @param preamble other messages to output
- */
- def showWithPreamble(raw: Boolean, target: String, preamble: String = ""): Showable = new Showable {
- // ReplStrippingWriter clips and scrubs on write(String)
- // circumvent it by write(mw, 0, mw.length) or wrap it in withoutUnwrapping
- def show() =
- if (raw && intp.isDefined) intp.get withoutUnwrapping { writeLines() }
- else writeLines()
- private def writeLines() {
- // take Foo# as Foo#apply for purposes of filtering. Useful for -fun Foo#;
- // if apply is added here, it's for other than -fun: javap Foo#, perhaps m#?
- val filterOn = target.splitHashMember._2 map { s => if (s.isEmpty) "apply" else s }
- var filtering = false // true if in region matching filter
- // true to output
- def checkFilter(line: String) = if (filterOn.isEmpty) true else {
- // cheap heuristic, todo maybe parse for the java sig.
- // method sigs end in paren semi
- def isAnyMethod = line.endsWith(");")
- def isOurMethod = {
- val lparen = line.lastIndexOf('(')
- val blank = line.lastIndexOf(' ', lparen)
- (blank >= 0 && line.substring(blank+1, lparen) == filterOn.get)
- }
- filtering = if (filtering) {
- // next blank line terminates section
- // for -public, next line is next method, more or less
- line.trim.nonEmpty && !isAnyMethod
- } else {
- isAnyMethod && isOurMethod
- }
- filtering
- }
- for (line <- Source.fromString(preamble + written).getLines(); if checkFilter(line))
- printWriter write line+lineSeparator
- printWriter.flush()
- }
- }
- }
-
- class JavapTool6 extends JavapTool {
- import JavapTool._
- val EnvClass = loader.tryToInitializeClass[FakeEnvironment](Env).orNull
- val PrinterClass = loader.tryToInitializeClass[FakePrinter](Printer).orNull
- override protected def failed = (EnvClass eq null) || (PrinterClass eq null)
-
- val PrinterCtr = PrinterClass.getConstructor(classOf[InputStream], classOf[PrintWriter], EnvClass) orFailed null
- val printWrapper = new PrintWriter(writer)
- def newPrinter(in: InputStream, env: FakeEnvironment): FakePrinter =
- PrinterCtr.newInstance(in, printWrapper, env) orFailed null
- def showable(raw: Boolean, target: String, fp: FakePrinter): Showable = {
- fp.asInstanceOf[{ def print(): Unit }].print() // run tool and flush to buffer
- printWrapper.flush() // just in case
- showWithPreamble(raw, target)
- }
-
- lazy val parser = new JpOptions
- def newEnv(opts: Seq[String]): FakeEnvironment = {
- def result = {
- val env: FakeEnvironment = EnvClass.newInstance()
- parser(opts) foreach { case (name, value) =>
- val field = EnvClass getDeclaredField name
- field setAccessible true
- field.set(env, value.asInstanceOf[AnyRef])
- }
- env
- }
- result orFailed null
- }
-
- override def apply(raw: Boolean, options: Seq[String])(inputs: Seq[Input]): List[JpResult] =
- (inputs map {
- case (claas, Success(ba)) => JpResult(showable(raw, claas, newPrinter(new ByteArrayInputStream(ba), newEnv(options))))
- case (_, Failure(e)) => JpResult(e.toString)
- }).toList orFailed List(noToolError)
- }
-
- class JavapTool7 extends JavapTool {
-
- import JavapTool._
- type Task = {
- def call(): Boolean // true = ok
- //def run(args: Array[String]): Int // all args
- //def handleOptions(args: Array[String]): Unit // options, then run() or call()
- }
- // result of Task.run
- //object TaskResult extends Enumeration {
- // val Ok, Error, CmdErr, SysErr, Abnormal = Value
- //}
- val TaskClaas = loader.tryToInitializeClass[Task](JavapTool.Tool).orNull
- override protected def failed = TaskClaas eq null
-
- val TaskCtor = TaskClaas.getConstructor(
- classOf[Writer],
- classOf[JavaFileManager],
- classOf[DiagnosticListener[_]],
- classOf[JIterable[String]],
- classOf[JIterable[String]]
- ) orFailed null
-
- class JavaReporter extends DiagnosticListener[JavaFileObject] with Clearable {
- import scala.collection.mutable.{ ArrayBuffer, SynchronizedBuffer }
- type D = Diagnostic[_ <: JavaFileObject]
- val diagnostics = new ArrayBuffer[D] with SynchronizedBuffer[D]
- override def report(d: Diagnostic[_ <: JavaFileObject]) {
- diagnostics += d
- }
- override def clear() = diagnostics.clear()
- /** All diagnostic messages.
- * @param locale Locale for diagnostic messages, null by default.
- */
- def messages(implicit locale: Locale = null) = (diagnostics map (_ getMessage locale)).toList
-
- def reportable(raw: Boolean): String = {
- // don't filter this message if raw, since the names are likely to differ
- val container = "Binary file .* contains .*".r
- val m = if (raw) messages
- else messages filter (_ match { case container() => false case _ => true })
- clear()
- if (m.nonEmpty) m mkString ("", lineSeparator, lineSeparator)
- else ""
- }
- }
- val reporter = new JavaReporter
-
- // DisassemblerTool.getStandardFileManager(reporter,locale,charset)
- val defaultFileManager: JavaFileManager =
- (loader.tryToLoadClass[JavaFileManager]("com.sun.tools.javap.JavapFileManager").get getMethod (
- "create",
- classOf[DiagnosticListener[_]],
- classOf[PrintWriter]
- ) invoke (null, reporter, new PrintWriter(System.err, true))).asInstanceOf[JavaFileManager] orFailed null
-
- // manages named arrays of bytes, which might have failed to load
- class JavapFileManager(val managed: Seq[Input])(delegate: JavaFileManager = defaultFileManager)
- extends ForwardingJavaFileManager[JavaFileManager](delegate) {
- import JavaFileObject.Kind
- import Kind._
- import StandardLocation._
- import JavaFileManager.Location
- import java.net.URI
- def uri(name: String): URI = new URI(name) // new URI("jfo:" + name)
-
- def inputNamed(name: String): Try[ByteAry] = (managed find (_._1 == name)).get._2
- def managedFile(name: String, kind: Kind) = kind match {
- case CLASS => fileObjectForInput(name, inputNamed(name), kind)
- case _ => null
- }
- // todo: just wrap it as scala abstractfile and adapt it uniformly
- def fileObjectForInput(name: String, bytes: Try[ByteAry], kind: Kind): JavaFileObject =
- new SimpleJavaFileObject(uri(name), kind) {
- override def openInputStream(): InputStream = new ByteArrayInputStream(bytes.get)
- // if non-null, ClassWriter wrongly requires scheme non-null
- override def toUri: URI = null
- override def getName: String = name
- // suppress
- override def getLastModified: Long = -1L
- }
- override def getJavaFileForInput(location: Location, className: String, kind: Kind): JavaFileObject =
- location match {
- case CLASS_PATH => managedFile(className, kind)
- case _ => null
- }
- override def hasLocation(location: Location): Boolean =
- location match {
- case CLASS_PATH => true
- case _ => false
- }
- }
- def fileManager(inputs: Seq[Input]) = new JavapFileManager(inputs)()
-
- // show tool messages and tool output, with output massage
- def showable(raw: Boolean, target: String): Showable = showWithPreamble(raw, target, reporter.reportable(raw))
-
- // eventually, use the tool interface
- def task(options: Seq[String], claases: Seq[String], inputs: Seq[Input]): Task = {
- //ServiceLoader.load(classOf[javax.tools.DisassemblerTool]).
- //getTask(writer, fileManager, reporter, options.asJava, claases.asJava)
- import JavaConverters.asJavaIterableConverter
- TaskCtor.newInstance(writer, fileManager(inputs), reporter, options.asJava, claases.asJava)
- .orFailed (throw new IllegalStateException)
- }
- // a result per input
- private def applyOne(raw: Boolean, options: Seq[String], claas: String, inputs: Seq[Input]): Try[JpResult] =
- Try {
- task(options, Seq(claas), inputs).call()
- } map {
- case true => JpResult(showable(raw, claas))
- case _ => JpResult(reporter.reportable(raw))
- } recoverWith {
- case e: java.lang.reflect.InvocationTargetException => e.getCause match {
- case t: IllegalArgumentException => Success(JpResult(t.getMessage)) // bad option
- case x => Failure(x)
- }
- } lastly {
- reporter.clear()
- }
- override def apply(raw: Boolean, options: Seq[String])(inputs: Seq[Input]): List[JpResult] = (inputs map {
- case (claas, Success(_)) => applyOne(raw, options, claas, inputs).get
- case (_, Failure(e)) => JpResult(e.toString)
- }).toList orFailed List(noToolError)
- }
-
- object JavapTool {
- // >= 1.7
- val Tool = "com.sun.tools.javap.JavapTask"
-
- // < 1.7
- val Env = "sun.tools.javap.JavapEnvironment"
- val Printer = "sun.tools.javap.JavapPrinter"
- // "documentation"
- type FakeEnvironment = AnyRef
- type FakePrinter = AnyRef
-
- // support JavapEnvironment
- class JpOptions {
- private object Access {
- final val PRIVATE = 0
- final val PROTECTED = 1
- final val PACKAGE = 2
- final val PUBLIC = 3
- }
- private val envActionMap: Map[String, (String, Any)] = {
- val map = Map(
- "-l" -> (("showLineAndLocal", true)),
- "-c" -> (("showDisassembled", true)),
- "-s" -> (("showInternalSigs", true)),
- "-verbose" -> (("showVerbose", true)),
- "-private" -> (("showAccess", Access.PRIVATE)),
- "-package" -> (("showAccess", Access.PACKAGE)),
- "-protected" -> (("showAccess", Access.PROTECTED)),
- "-public" -> (("showAccess", Access.PUBLIC)),
- "-all" -> (("showallAttr", true))
- )
- map ++ List(
- "-v" -> map("-verbose"),
- "-p" -> map("-private")
- )
- }
- def apply(opts: Seq[String]): Seq[(String, Any)] = {
- opts flatMap { opt =>
- envActionMap get opt match {
- case Some(pair) => List(pair)
- case _ =>
- val charOpts = opt.tail.toSeq map ("-" + _)
- if (charOpts forall (envActionMap contains _))
- charOpts map envActionMap
- else Nil
- }
- }
- }
- }
-
- case class ToolArgs(raw: Boolean = false, help: Boolean = false, app: Boolean = false, fun: Boolean = false)
-
- object ToolArgs {
- def fromArgs(args: Seq[String]): (ToolArgs, Seq[String]) = ((ToolArgs(), Seq[String]()) /: (args flatMap massage)) {
- case ((t,others), s) => s match {
- case "-fun" => (t copy (fun=true), others)
- case "-app" => (t copy (app=true), others)
- case "-help" => (t copy (help=true), others)
- case "-raw" => (t copy (raw=true), others)
- case _ => (t, others :+ s)
- }
- }
- }
-
- val helps = List(
- "usage" -> ":javap [opts] [path or class or -]...",
- "-help" -> "Prints this help message",
- "-raw" -> "Don't unmangle REPL names",
- "-app" -> "Show the DelayedInit body of Apps",
- "-fun" -> "Show anonfuns for class or Class#method",
- "-verbose/-v" -> "Stack size, number of locals, method args",
- "-private/-p" -> "Private classes and members",
- "-package" -> "Package-private classes and members",
- "-protected" -> "Protected classes and members",
- "-public" -> "Public classes and members",
- "-l" -> "Line and local variable tables",
- "-c" -> "Disassembled code",
- "-s" -> "Internal type signatures",
- "-sysinfo" -> "System info of class",
- "-constants" -> "Static final constants"
- )
-
- // match prefixes and unpack opts, or -help on failure
- def massage(arg: String): Seq[String] = {
- require(arg startsWith "-")
- // arg matches opt "-foo/-f" if prefix of -foo or exactly -f
- val r = """(-[^/]*)(/(-.))?""".r
- def maybe(opt: String, s: String): Option[String] = opt match {
- // disambiguate by preferring short form
- case r(lf,_,sf) if s == sf => Some(sf)
- case r(lf,_,sf) if lf startsWith s => Some(lf)
- case _ => None
- }
- def candidates(s: String) = (helps map (h => maybe(h._1, s))).flatten
- // one candidate or one single-char candidate
- def uniqueOf(maybes: Seq[String]) = {
- def single(s: String) = s.length == 2
- if (maybes.length == 1) maybes
- else if ((maybes count single) == 1) maybes filter single
- else Nil
- }
- // each optchar must decode to exactly one option
- def unpacked(s: String): Try[Seq[String]] = {
- val ones = (s drop 1) map { c =>
- val maybes = uniqueOf(candidates(s"-$c"))
- if (maybes.length == 1) Some(maybes.head) else None
- }
- Try(ones) filter (_ forall (_.isDefined)) map (_.flatten)
- }
- val res = uniqueOf(candidates(arg))
- if (res.nonEmpty) res
- else (unpacked(arg)
- getOrElse (Seq("-help"))) // or else someone needs help
- }
-
- def helper(pw: PrintWriter) = new Showable {
- def show() = helps foreach (p => pw write "%-12.12s%s%n".format(p._1,p._2))
- }
-
- val DefaultOptions = List("-protected", "-verbose")
-
- def isAvailable = Seq(Env, Tool) exists (cn => hasClass(loader, cn))
-
- private def hasClass(cl: ScalaClassLoader, cn: String) = cl.tryToInitializeClass[AnyRef](cn).isDefined
-
- private def isTaskable(cl: ScalaClassLoader) = hasClass(cl, Tool)
-
- def apply() = if (isTaskable(loader)) new JavapTool7 else new JavapTool6
- }
-}
-
-object JavapClass {
- def apply(
- loader: ScalaClassLoader = ScalaClassLoader.appLoader,
- printWriter: PrintWriter = new PrintWriter(System.out, true),
- intp: Option[IMain] = None
- ) = new JavapClass(loader, printWriter, intp)
-
- // We enjoy flexibility in specifying either a fully-qualified class name com.acme.Widget
- // or a resource path com/acme/Widget.class; but not widget.out
- implicit class MaybeClassLike(val s: String) extends AnyVal {
- /* private[this] final val suffix = ".class" */
- private def suffix = ".class"
- def asClassName = (s stripSuffix suffix).replace('/', '.')
- def asClassResource = if (s endsWith suffix) s else s.replace('.', '/') + suffix
- def splitSuffix: (String, String) = if (s endsWith suffix) (s dropRight suffix.length, suffix) else (s, "")
- def strippingSuffix(f: String => String): String =
- if (s endsWith suffix) f(s dropRight suffix.length) else s
- // e.g. Foo#bar. Foo# yields zero-length member part.
- def splitHashMember: (String, Option[String]) = {
- val i = s lastIndexOf '#'
- if (i < 0) (s, None)
- //else if (i >= s.length - 1) (s.init, None)
- else (s take i, Some(s drop i+1))
- }
- }
- implicit class ClassLoaderOps(val cl: ClassLoader) extends AnyVal {
- private def parentsOf(x: ClassLoader): List[ClassLoader] = if (x == null) Nil else x :: parentsOf(x.getParent)
- def parents: List[ClassLoader] = parentsOf(cl)
- /* all file locations */
- def locations = {
- def alldirs = parents flatMap (_ match {
- case ucl: ScalaClassLoader.URLClassLoader => ucl.classPathURLs
- case jcl: java.net.URLClassLoader => jcl.getURLs
- case _ => Nil
- })
- val dirs = for (d <- alldirs; if d.getProtocol == "file") yield Path(new JFile(d.toURI))
- dirs
- }
- /* only the file location from which the given class is loaded */
- def locate(k: String): Option[Path] = {
- Try {
- val claas = try cl loadClass k catch {
- case _: NoClassDefFoundError => null // let it snow
- }
- // cf ScalaClassLoader.originOfClass
- claas.getProtectionDomain.getCodeSource.getLocation
- } match {
- case Success(null) => None
- case Success(loc) if loc.isFile => Some(Path(new JFile(loc.toURI)))
- case _ => None
- }
- }
- /* would classBytes succeed with a nonempty array */
- def resourceable(className: String): Boolean = cl.getResource(className.asClassResource) != null
- }
- implicit class PathOps(val p: Path) extends AnyVal {
- import scala.tools.nsc.io.Jar
- def isJar = Jar isJarOrZip p
- }
- implicit class URLOps(val url: URL) extends AnyVal {
- def isFile: Boolean = url.getProtocol == "file"
- }
- object FunFinder {
- def apply(loader: ScalaClassLoader, intp: Option[IMain]) = new FunFinder(loader, intp)
- }
- class FunFinder(loader: ScalaClassLoader, intp: Option[IMain]) {
-
- // class k, candidate f without prefix
- def isFunOfClass(k: String, f: String) = {
- val p = (s"${Pattern quote k}\\$$+anonfun").r
- (p findPrefixOf f).nonEmpty
- }
- // class k, candidate f without prefix, method m
- def isFunOfMethod(k: String, m: String, f: String) = {
- val p = (s"${Pattern quote k}\\$$+anonfun\\$$${Pattern quote m}\\$$").r
- (p findPrefixOf f).nonEmpty
- }
- def isFunOfTarget(k: String, m: Option[String], f: String) =
- if (m.isEmpty) isFunOfClass(k, f)
- else isFunOfMethod(k, m.get, f)
- def listFunsInAbsFile(k: String, m: Option[String], d: AbstractFile) = {
- for (f <- d; if !f.isDirectory && isFunOfTarget(k, m, f.name)) yield f.name
- }
- // path prefix p, class k, dir d
- def listFunsInDir(p: String, k: String, m: Option[String])(d: Directory) = {
- val subdir = Path(p)
- for (f <- (d / subdir).toDirectory.list; if f.isFile && isFunOfTarget(k, m, f.name))
- yield f.name
- }
- // path prefix p, class k, jar file f
- def listFunsInJar(p: String, k: String, m: Option[String])(f: File) = {
- import java.util.jar.JarEntry
- import scala.tools.nsc.io.Jar
- def maybe(e: JarEntry) = {
- val (path, name) = {
- val parts = e.getName split "/"
- if (parts.length < 2) ("", e.getName)
- else (parts.init mkString "/", parts.last)
- }
- if (path == p && isFunOfTarget(k, m, name)) Some(name) else None
- }
- (new Jar(f) map maybe).flatten
- }
- def loadable(name: String) = loader resourceable name
- // translated class, optional member, opt member to filter on, whether it is repl output
- def translate(s: String): (String, Option[String], Option[String], Boolean) = {
- val (k0, m0) = s.splitHashMember
- val k = k0.asClassName
- val member = m0 filter (_.nonEmpty) // take Foo# as no member, not ""
- val filter = m0 flatMap { case "" => Some("apply") case _ => None } // take Foo# as filter on apply
- // class is either something replish or available to loader
- // $line.$read$$etc$Foo#member
- ((intp flatMap (_ translatePath k) filter (loadable) map ((_, member, filter, true)))
- // s = "f" and $line.$read$$etc$#f is what we're after,
- // ignoring any #member (except take # as filter on #apply)
- orElse (intp flatMap (_ translateEnclosingClass k) map ((_, Some(k), filter, true)))
- getOrElse (k, member, filter, false))
- }
- /** Find the classnames of anonfuns associated with k,
- * where k may be an available class or a symbol in scope.
- */
- def funsOf(k0: String): Seq[String] = {
- // class is either something replish or available to loader
- val (k, member, filter, isReplish) = translate(k0)
- val splat = k split "\\."
- val name = splat.last
- val prefix = if (splat.length > 1) splat.init mkString "/" else ""
- val pkg = if (splat.length > 1) splat.init mkString "." else ""
- // reconstitute an anonfun with a package
- // if filtered, add the hash back, e.g. pkg.Foo#bar, pkg.Foo$anon$1#apply
- def packaged(s: String) = {
- val p = if (pkg.isEmpty) s else s"$pkg.$s"
- val pm = filter map (p + "#" + _)
- pm getOrElse p
- }
- // is this translated path in (usually virtual) repl outdir? or loadable from filesystem?
- val fs = if (isReplish) {
- def outed(d: AbstractFile, p: Seq[String]): Option[AbstractFile] = {
- if (p.isEmpty) Option(d)
- else Option(d.lookupName(p.head, directory = true)) flatMap (f => outed(f, p.tail))
- }
- outed(intp.get.replOutput.dir, splat.init) map { d =>
- listFunsInAbsFile(name, member, d) map packaged
- }
- } else {
- loader locate k map { w =>
- if (w.isDirectory) listFunsInDir(prefix, name, member)(w.toDirectory) map packaged
- else if (w.isJar) listFunsInJar(prefix, name, member)(w.toFile) map packaged
- else Nil
- }
- }
- fs match {
- case Some(xs) => xs.to[Seq] // maybe empty
- case None => Seq() // nothing found, e.g., junk input
- }
- }
- def funs(ks: Seq[String]) = ks flatMap funsOf _
- }
-}
-
-object Javap {
-
- def isAvailable(cl: ScalaClassLoader = ScalaClassLoader.appLoader) = JavapClass(cl).JavapTool.isAvailable
-
- def apply(path: String): Unit = apply(Seq(path))
- def apply(args: Seq[String]): Unit = JavapClass() apply args foreach (_.show())
-
- trait Showable {
- def show(): Unit
- }
-
- sealed trait JpResult {
- type ResultType
- def isError: Boolean
- def value: ResultType
- def show(): Unit
- // todo
- // def header(): String
- // def fields(): List[String]
- // def methods(): List[String]
- // def signatures(): List[String]
- }
- object JpResult {
- def apply(msg: String) = new JpError(msg)
- def apply(res: Showable) = new JpSuccess(res)
- }
- class JpError(msg: String) extends JpResult {
- type ResultType = String
- def isError = true
- def value = msg
- def show() = println(msg) // makes sense for :javap, less for -Ygen-javap
- }
- class JpSuccess(val value: Showable) extends JpResult {
- type ResultType = AnyRef
- def isError = false
- def show() = value.show() // output to tool's PrintWriter
- }
- implicit class Lastly[A](val t: Try[A]) extends AnyVal {
- private def effect[X](last: =>Unit)(a: X): Try[A] = { last; t }
- def lastly(last: =>Unit): Try[A] = t transform (effect(last) _, effect(last) _)
- }
-}
diff --git a/src/compiler/scala/tools/util/PathResolver.scala b/src/compiler/scala/tools/util/PathResolver.scala
index 9f1d0317be..d8e545e6b1 100644
--- a/src/compiler/scala/tools/util/PathResolver.scala
+++ b/src/compiler/scala/tools/util/PathResolver.scala
@@ -170,6 +170,7 @@ class PathResolver(settings: Settings, context: JavaContext) {
object Calculated {
def scalaHome = Defaults.scalaHome
def useJavaClassPath = settings.usejavacp.value || Defaults.useJavaClassPath
+ def useManifestClassPath= settings.usemanifestcp.value
def javaBootClassPath = cmdLineOrElse("javabootclasspath", Defaults.javaBootClassPath)
def javaExtDirs = cmdLineOrElse("javaextdirs", Defaults.javaExtDirs)
def javaUserClassPath = if (useJavaClassPath) Defaults.javaUserClassPath else ""
@@ -209,6 +210,7 @@ class PathResolver(settings: Settings, context: JavaContext) {
classesInPath(scalaBootClassPath), // 4. The Scala boot class path.
contentsOfDirsInPath(scalaExtDirs), // 5. The Scala extension class path.
classesInExpandedPath(userClassPath), // 6. The Scala application class path.
+ classesInManifest(useManifestClassPath), // 8. The Manifest class path.
sourcesInPath(sourcePath) // 7. The Scala source path.
)